diff mbox

[arm-devs,v1,04/13] net/cadence_gem: simplify rx buf descriptor walking

Message ID f1d81a88e4d531c00a27b77d9648711429bd1642.1385967754.git.peter.crosthwaite@xilinx.com
State New
Headers show

Commit Message

Peter Crosthwaite Dec. 2, 2013, 7:11 a.m. UTC
There was a replication of the rx descriptor address walking logic.
Reorder the flow control to remove. This refactoring also obsoletes
the local variables packet_desc_addr and last_desc_addr.

Signed-off-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
---

 hw/net/cadence_gem.c | 39 ++++++++++-----------------------------
 1 file changed, 10 insertions(+), 29 deletions(-)

Comments

Peter Maydell Dec. 2, 2013, 12:12 p.m. UTC | #1
On 2 December 2013 07:11, Peter Crosthwaite
<peter.crosthwaite@xilinx.com> wrote:
> There was a replication of the rx descriptor address walking logic.
> Reorder the flow control to remove. This refactoring also obsoletes
> the local variables packet_desc_addr and last_desc_addr.
>
> Signed-off-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
> ---
>
>  hw/net/cadence_gem.c | 39 ++++++++++-----------------------------
>  1 file changed, 10 insertions(+), 29 deletions(-)
>
> diff --git a/hw/net/cadence_gem.c b/hw/net/cadence_gem.c
> index 3f30caf..73ac0d8 100644
> --- a/hw/net/cadence_gem.c
> +++ b/hw/net/cadence_gem.c
> @@ -586,7 +586,6 @@ static int gem_mac_address_filter(GemState *s, const uint8_t *packet)
>  static ssize_t gem_receive(NetClientState *nc, const uint8_t *buf, size_t size)
>  {
>      unsigned    desc[2];
> -    hwaddr packet_desc_addr, last_desc_addr;
>      GemState *s;
>      unsigned   rxbufsize, bytes_to_copy;
>      unsigned   rxbuf_offset;
> @@ -667,17 +666,16 @@ static ssize_t gem_receive(NetClientState *nc, const uint8_t *buf, size_t size)
>
>      DB_PRINT("config bufsize: %d packet size: %ld\n", rxbufsize, size);
>
> -    packet_desc_addr = s->rx_desc_addr;
> -    while (1) {
> -        DB_PRINT("read descriptor 0x%x\n", (unsigned)packet_desc_addr);
> +    while (bytes_to_copy) {
> +        DB_PRINT("read descriptor 0x%x\n", (unsigned)s->rx_desc_addr);

Can we get here with bytes_to_copy == 0 ?  The logic sets size to a minimum
of 64 bytes but we've already set up bytes_to_copy before that.

-- PMM
Peter Crosthwaite Dec. 4, 2013, 3:15 a.m. UTC | #2
On Mon, Dec 2, 2013 at 10:12 PM, Peter Maydell <peter.maydell@linaro.org> wrote:
> On 2 December 2013 07:11, Peter Crosthwaite
> <peter.crosthwaite@xilinx.com> wrote:
>> There was a replication of the rx descriptor address walking logic.
>> Reorder the flow control to remove. This refactoring also obsoletes
>> the local variables packet_desc_addr and last_desc_addr.
>>
>> Signed-off-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
>> ---
>>
>>  hw/net/cadence_gem.c | 39 ++++++++++-----------------------------
>>  1 file changed, 10 insertions(+), 29 deletions(-)
>>
>> diff --git a/hw/net/cadence_gem.c b/hw/net/cadence_gem.c
>> index 3f30caf..73ac0d8 100644
>> --- a/hw/net/cadence_gem.c
>> +++ b/hw/net/cadence_gem.c
>> @@ -586,7 +586,6 @@ static int gem_mac_address_filter(GemState *s, const uint8_t *packet)
>>  static ssize_t gem_receive(NetClientState *nc, const uint8_t *buf, size_t size)
>>  {
>>      unsigned    desc[2];
>> -    hwaddr packet_desc_addr, last_desc_addr;
>>      GemState *s;
>>      unsigned   rxbufsize, bytes_to_copy;
>>      unsigned   rxbuf_offset;
>> @@ -667,17 +666,16 @@ static ssize_t gem_receive(NetClientState *nc, const uint8_t *buf, size_t size)
>>
>>      DB_PRINT("config bufsize: %d packet size: %ld\n", rxbufsize, size);
>>
>> -    packet_desc_addr = s->rx_desc_addr;
>> -    while (1) {
>> -        DB_PRINT("read descriptor 0x%x\n", (unsigned)packet_desc_addr);
>> +    while (bytes_to_copy) {
>> +        DB_PRINT("read descriptor 0x%x\n", (unsigned)s->rx_desc_addr);
>
> Can we get here with bytes_to_copy == 0 ?  The logic sets size to a minimum
> of 64 bytes but we've already set up bytes_to_copy before that.
>

Should we be able to get here? Wouldn't that means you are trying to
recieve a length 0 packet? Could just convert to do loop to receive a
length 0 packet when gem_recieve is called with size = 0.


Regards,
Peter

> -- PMM
>
diff mbox

Patch

diff --git a/hw/net/cadence_gem.c b/hw/net/cadence_gem.c
index 3f30caf..73ac0d8 100644
--- a/hw/net/cadence_gem.c
+++ b/hw/net/cadence_gem.c
@@ -586,7 +586,6 @@  static int gem_mac_address_filter(GemState *s, const uint8_t *packet)
 static ssize_t gem_receive(NetClientState *nc, const uint8_t *buf, size_t size)
 {
     unsigned    desc[2];
-    hwaddr packet_desc_addr, last_desc_addr;
     GemState *s;
     unsigned   rxbufsize, bytes_to_copy;
     unsigned   rxbuf_offset;
@@ -667,17 +666,16 @@  static ssize_t gem_receive(NetClientState *nc, const uint8_t *buf, size_t size)
 
     DB_PRINT("config bufsize: %d packet size: %ld\n", rxbufsize, size);
 
-    packet_desc_addr = s->rx_desc_addr;
-    while (1) {
-        DB_PRINT("read descriptor 0x%x\n", (unsigned)packet_desc_addr);
+    while (bytes_to_copy) {
+        DB_PRINT("read descriptor 0x%x\n", (unsigned)s->rx_desc_addr);
         /* read current descriptor */
-        cpu_physical_memory_read(packet_desc_addr,
+        cpu_physical_memory_read(s->rx_desc_addr,
                                  (uint8_t *)&desc[0], sizeof(desc));
 
         /* Descriptor owned by software ? */
         if (rx_desc_get_ownership(desc) == 1) {
             DB_PRINT("descriptor 0x%x owned by sw.\n",
-                     (unsigned)packet_desc_addr);
+                     (unsigned)s->rx_desc_addr);
             s->regs[GEM_RXSTATUS] |= GEM_RXSTATUS_NOBUF;
             s->regs[GEM_ISR] |= GEM_INT_RXUSED & ~(s->regs[GEM_IMR]);
             /* Handle interrupt consequences */
@@ -693,7 +691,7 @@  static ssize_t gem_receive(NetClientState *nc, const uint8_t *buf, size_t size)
          */
         if (rx_desc_get_buffer(desc) == 0) {
             DB_PRINT("Invalid RX buffer (NULL) for descriptor 0x%x\n",
-                     (unsigned)packet_desc_addr);
+                     (unsigned)s->rx_desc_addr);
         }
 
         /* Copy packet data to emulated DMA buffer */
@@ -713,36 +711,19 @@  static ssize_t gem_receive(NetClientState *nc, const uint8_t *buf, size_t size)
         }
         rx_desc_set_ownership(desc);
         /* Descriptor write-back.  */
-        cpu_physical_memory_write(packet_desc_addr,
+        cpu_physical_memory_write(s->rx_desc_addr,
                                   (uint8_t *)&desc[0], sizeof(desc));
 
-        if (bytes_to_copy == 0) {
-            break;
-        }
-
         /* Next descriptor */
         if (rx_desc_get_wrap(desc)) {
-            packet_desc_addr = s->regs[GEM_RXQBASE];
+            DB_PRINT("wrapping RX descriptor list\n");
+            s->rx_desc_addr = s->regs[GEM_RXQBASE];
         } else {
-            packet_desc_addr += 8;
+            DB_PRINT("incrementing RX descriptor list\n");
+            s->rx_desc_addr += 8;
         }
     }
 
-    DB_PRINT("set length: %ld, EOF on descriptor 0x%x\n", size,
-            (unsigned)packet_desc_addr);
-
-    /* Advance RX packet descriptor Q */
-    last_desc_addr = packet_desc_addr;
-    packet_desc_addr = s->rx_desc_addr;
-    s->rx_desc_addr = last_desc_addr;
-    if (rx_desc_get_wrap(desc)) {
-        s->rx_desc_addr = s->regs[GEM_RXQBASE];
-        DB_PRINT("wrapping RX descriptor list\n");
-    } else {
-        DB_PRINT("incrementing RX descriptor list\n");
-        s->rx_desc_addr += 8;
-    }
-
     /* Count it */
     gem_receive_updatestats(s, buf, size);