diff options
| -rw-r--r-- | meta/recipes-devtools/qemu/qemu/smc91c111_fix1.patch | 85 | ||||
| -rw-r--r-- | meta/recipes-devtools/qemu/qemu/smc91c111_fix2.patch | 46 | ||||
| -rw-r--r-- | meta/recipes-devtools/qemu/qemu/smc91c111_fix3.patch | 33 | ||||
| -rw-r--r-- | meta/recipes-devtools/qemu/qemu_2.4.0.bb | 4 |
4 files changed, 167 insertions, 1 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 | |||
diff --git a/meta/recipes-devtools/qemu/qemu/smc91c111_fix2.patch b/meta/recipes-devtools/qemu/qemu/smc91c111_fix2.patch new file mode 100644 index 0000000000..018aed5f80 --- /dev/null +++ b/meta/recipes-devtools/qemu/qemu/smc91c111_fix2.patch | |||
| @@ -0,0 +1,46 @@ | |||
| 1 | From: Peter Crosthwaite <crosthwaitepeter@gmail.com> | ||
| 2 | X-Google-Original-From: Peter Crosthwaite <crosthwaite.peter@gmail.com> | ||
| 3 | To: qemu-devel@nongnu.org | ||
| 4 | Cc: peter.maydell@linaro.org, richard.purdie@linuxfoundation.org | ||
| 5 | Subject: [RFT PATCH v1 2/3] net: smc91c111: gate can_receive() on rx FIFO | ||
| 6 | having a slot | ||
| 7 | Date: Thu, 10 Sep 2015 21:23:57 -0700 | ||
| 8 | |||
| 9 | Return false from can_receive() when the FIFO doesn't have a free RX | ||
| 10 | slot. This fixes a bug in the current code where the allocated buffer | ||
| 11 | is freed before the fifo pop, triggering a premature flush of queued RX | ||
| 12 | packets. It also will handle a corner case, where the guest manually | ||
| 13 | frees the allocated buffer before popping the rx FIFO (hence it is not | ||
| 14 | enough to just delay the flush_queued_packets()). | ||
| 15 | |||
| 16 | Reported-by: Richard Purdie <richard.purdie@linuxfoundation.org> | ||
| 17 | Signed-off-by: Peter Crosthwaite <crosthwaite.peter@gmail.com> | ||
| 18 | |||
| 19 | Upstream-Status: Submitted | ||
| 20 | --- | ||
| 21 | |||
| 22 | hw/net/smc91c111.c | 4 +++- | ||
| 23 | 1 file changed, 3 insertions(+), 1 deletion(-) | ||
| 24 | |||
| 25 | Index: qemu-2.4.0/hw/net/smc91c111.c | ||
| 26 | =================================================================== | ||
| 27 | --- qemu-2.4.0.orig/hw/net/smc91c111.c | ||
| 28 | +++ qemu-2.4.0/hw/net/smc91c111.c | ||
| 29 | @@ -129,7 +129,8 @@ static int smc91c111_can_receive(smc91c1 | ||
| 30 | if ((s->rcr & RCR_RXEN) == 0 || (s->rcr & RCR_SOFT_RST)) { | ||
| 31 | return 1; | ||
| 32 | } | ||
| 33 | - if (s->allocated == (1 << NUM_PACKETS) - 1) { | ||
| 34 | + if (s->allocated == (1 << NUM_PACKETS) - 1 || | ||
| 35 | + s->rx_fifo_len == NUM_PACKETS) { | ||
| 36 | return 0; | ||
| 37 | } | ||
| 38 | return 1; | ||
| 39 | @@ -182,6 +183,7 @@ static void smc91c111_pop_rx_fifo(smc91c | ||
| 40 | } else { | ||
| 41 | s->int_level &= ~INT_RCV; | ||
| 42 | } | ||
| 43 | + smc91c111_flush_queued_packets(s); | ||
| 44 | smc91c111_update(s); | ||
| 45 | } | ||
| 46 | |||
diff --git a/meta/recipes-devtools/qemu/qemu/smc91c111_fix3.patch b/meta/recipes-devtools/qemu/qemu/smc91c111_fix3.patch new file mode 100644 index 0000000000..9e865f7f09 --- /dev/null +++ b/meta/recipes-devtools/qemu/qemu/smc91c111_fix3.patch | |||
| @@ -0,0 +1,33 @@ | |||
| 1 | From: Peter Crosthwaite <crosthwaitepeter@gmail.com> | ||
| 2 | To: qemu-devel@nongnu.org | ||
| 3 | Cc: peter.maydell@linaro.org, richard.purdie@linuxfoundation.org | ||
| 4 | Subject: [RFT PATCH v1 3/3] net: smc91c111: flush packets on RCR register | ||
| 5 | changes | ||
| 6 | Date: Thu, 10 Sep 2015 21:24:12 -0700 | ||
| 7 | |||
| 8 | The SOFT_RST or RXEN in the control register can be used as a condition | ||
| 9 | to unblock the net layer via can_receive(). So check for possible | ||
| 10 | flushes on RCR changes. This will drop all pending packets on soft | ||
| 11 | reset or disable which is the functional intent of the can_receive() | ||
| 12 | logic. | ||
| 13 | |||
| 14 | Signed-off-by: Peter Crosthwaite <crosthwaite.peter@gmail.com> | ||
| 15 | |||
| 16 | Upstream-Status: Submitted | ||
| 17 | --- | ||
| 18 | |||
| 19 | hw/net/smc91c111.c | 1 + | ||
| 20 | 1 file changed, 1 insertion(+) | ||
| 21 | |||
| 22 | Index: qemu-2.4.0/hw/net/smc91c111.c | ||
| 23 | =================================================================== | ||
| 24 | --- qemu-2.4.0.orig/hw/net/smc91c111.c | ||
| 25 | +++ qemu-2.4.0/hw/net/smc91c111.c | ||
| 26 | @@ -331,6 +331,7 @@ static void smc91c111_writeb(void *opaqu | ||
| 27 | if (s->rcr & RCR_SOFT_RST) { | ||
| 28 | smc91c111_reset(DEVICE(s)); | ||
| 29 | } | ||
| 30 | + smc91c111_flush_queued_packets(s); | ||
| 31 | return; | ||
| 32 | case 10: case 11: /* RPCR */ | ||
| 33 | /* Ignored */ | ||
diff --git a/meta/recipes-devtools/qemu/qemu_2.4.0.bb b/meta/recipes-devtools/qemu/qemu_2.4.0.bb index d545b60f64..59b1788007 100644 --- a/meta/recipes-devtools/qemu/qemu_2.4.0.bb +++ b/meta/recipes-devtools/qemu/qemu_2.4.0.bb | |||
| @@ -6,7 +6,9 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=441c28d2cf86e15a37fa47e15a72fbac \ | |||
| 6 | SRC_URI += "file://configure-fix-Darwin-target-detection.patch \ | 6 | SRC_URI += "file://configure-fix-Darwin-target-detection.patch \ |
| 7 | file://qemu-enlarge-env-entry-size.patch \ | 7 | file://qemu-enlarge-env-entry-size.patch \ |
| 8 | file://Qemu-Arm-versatilepb-Add-memory-size-checking.patch \ | 8 | file://Qemu-Arm-versatilepb-Add-memory-size-checking.patch \ |
| 9 | file://smc91c111_fix.patch \ | 9 | file://smc91c111_fix1.patch \ |
| 10 | file://smc91c111_fix2.patch \ | ||
| 11 | file://smc91c111_fix3.patch \ | ||
| 10 | " | 12 | " |
| 11 | SRC_URI_prepend = "http://wiki.qemu-project.org/download/${BP}.tar.bz2" | 13 | SRC_URI_prepend = "http://wiki.qemu-project.org/download/${BP}.tar.bz2" |
| 12 | SRC_URI[md5sum] = "186ee8194140a484a455f8e3c74589f4" | 14 | SRC_URI[md5sum] = "186ee8194140a484a455f8e3c74589f4" |
