summaryrefslogtreecommitdiffstats
path: root/meta/recipes-devtools/qemu/qemu/smc91c111_fix1.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta/recipes-devtools/qemu/qemu/smc91c111_fix1.patch')
-rw-r--r--meta/recipes-devtools/qemu/qemu/smc91c111_fix1.patch85
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 @@
1From: Peter Crosthwaite <crosthwaitepeter@gmail.com>
2Subject: [RFT PATCH v1 1/3] net: smc91c111: guard flush_queued_packets() on
3 can_rx()
4Date: Thu, 10 Sep 2015 21:23:43 -0700
5
6Check that the core can once again receive packets before asking the
7net layer to do a flush. This will make it more convenient to flush
8packets when adding new conditions to can_receive.
9
10Add missing if braces while moving the can_receive() core code.
11
12Signed-off-by: Peter Crosthwaite <crosthwaite.peter@gmail.com>
13
14Upstream-Status: Submitted
15
16---
17
18 hw/net/smc91c111.c | 30 ++++++++++++++++++++++--------
19 1 file changed, 22 insertions(+), 8 deletions(-)
20
21Index: 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