diff options
Diffstat (limited to 'meta/recipes-devtools/qemu/qemu/smc91c111_fix1.patch')
-rw-r--r-- | meta/recipes-devtools/qemu/qemu/smc91c111_fix1.patch | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/meta/recipes-devtools/qemu/qemu/smc91c111_fix1.patch b/meta/recipes-devtools/qemu/qemu/smc91c111_fix1.patch new file mode 100644 index 0000000000..bd1223a446 --- /dev/null +++ b/meta/recipes-devtools/qemu/qemu/smc91c111_fix1.patch | |||
@@ -0,0 +1,85 @@ | |||
1 | From: Peter Crosthwaite <crosthwaitepeter@gmail.com> | ||
2 | Subject: [RFT PATCH v1 1/3] net: smc91c111: guard flush_queued_packets() on | ||
3 | can_rx() | ||
4 | Date: Thu, 10 Sep 2015 21:23:43 -0700 | ||
5 | |||
6 | Check that the core can once again receive packets before asking the | ||
7 | net layer to do a flush. This will make it more convenient to flush | ||
8 | packets when adding new conditions to can_receive. | ||
9 | |||
10 | Add missing if braces while moving the can_receive() core code. | ||
11 | |||
12 | Signed-off-by: Peter Crosthwaite <crosthwaite.peter@gmail.com> | ||
13 | |||
14 | Upstream-Status: Submitted | ||
15 | |||
16 | --- | ||
17 | |||
18 | hw/net/smc91c111.c | 30 ++++++++++++++++++++++-------- | ||
19 | 1 file changed, 22 insertions(+), 8 deletions(-) | ||
20 | |||
21 | Index: qemu-2.4.0/hw/net/smc91c111.c | ||
22 | =================================================================== | ||
23 | --- qemu-2.4.0.orig/hw/net/smc91c111.c | ||
24 | +++ qemu-2.4.0/hw/net/smc91c111.c | ||
25 | @@ -124,6 +124,24 @@ static void smc91c111_update(smc91c111_s | ||
26 | qemu_set_irq(s->irq, level); | ||
27 | } | ||
28 | |||
29 | +static int smc91c111_can_receive(smc91c111_state *s) | ||
30 | +{ | ||
31 | + if ((s->rcr & RCR_RXEN) == 0 || (s->rcr & RCR_SOFT_RST)) { | ||
32 | + return 1; | ||
33 | + } | ||
34 | + if (s->allocated == (1 << NUM_PACKETS) - 1) { | ||
35 | + return 0; | ||
36 | + } | ||
37 | + return 1; | ||
38 | +} | ||
39 | + | ||
40 | +static inline void smc91c111_flush_queued_packets(smc91c111_state *s) | ||
41 | +{ | ||
42 | + if (smc91c111_can_receive(s)) { | ||
43 | + qemu_flush_queued_packets(qemu_get_queue(s->nic)); | ||
44 | + } | ||
45 | +} | ||
46 | + | ||
47 | /* Try to allocate a packet. Returns 0x80 on failure. */ | ||
48 | static int smc91c111_allocate_packet(smc91c111_state *s) | ||
49 | { | ||
50 | @@ -185,7 +203,7 @@ static void smc91c111_release_packet(smc | ||
51 | s->allocated &= ~(1 << packet); | ||
52 | if (s->tx_alloc == 0x80) | ||
53 | smc91c111_tx_alloc(s); | ||
54 | - qemu_flush_queued_packets(qemu_get_queue(s->nic)); | ||
55 | + smc91c111_flush_queued_packets(s); | ||
56 | } | ||
57 | |||
58 | /* Flush the TX FIFO. */ | ||
59 | @@ -636,15 +654,11 @@ static uint32_t smc91c111_readl(void *op | ||
60 | return val; | ||
61 | } | ||
62 | |||
63 | -static int smc91c111_can_receive(NetClientState *nc) | ||
64 | +static int smc91c111_can_receive_nc(NetClientState *nc) | ||
65 | { | ||
66 | smc91c111_state *s = qemu_get_nic_opaque(nc); | ||
67 | |||
68 | - if ((s->rcr & RCR_RXEN) == 0 || (s->rcr & RCR_SOFT_RST)) | ||
69 | - return 1; | ||
70 | - if (s->allocated == (1 << NUM_PACKETS) - 1) | ||
71 | - return 0; | ||
72 | - return 1; | ||
73 | + return smc91c111_can_receive(s); | ||
74 | } | ||
75 | |||
76 | static ssize_t smc91c111_receive(NetClientState *nc, const uint8_t *buf, size_t size) | ||
77 | @@ -739,7 +753,7 @@ static const MemoryRegionOps smc91c111_m | ||
78 | static NetClientInfo net_smc91c111_info = { | ||
79 | .type = NET_CLIENT_OPTIONS_KIND_NIC, | ||
80 | .size = sizeof(NICState), | ||
81 | - .can_receive = smc91c111_can_receive, | ||
82 | + .can_receive = smc91c111_can_receive_nc, | ||
83 | .receive = smc91c111_receive, | ||
84 | }; | ||
85 | |||