[PATCH u-boot 2/2] drivers/net/aspeednic: Fix unreliable networking

OpenBMC Patches openbmc-patches at stwcx.xyz
Thu Dec 17 10:20:34 AEDT 2015


From: Cyril Bur <cyril.bur at au1.ibm.com>

Hardware must be told to move data from its RX FIFO to system memory where
the driver can then consume it.  There are two mechanisms for this, a 'do
this automatically' register which can be set on device init or simply a
'copy data now' polling style which is what this patch does.

Both options were investigated and as the entire network stack of u-boot is
polling and we're only polling when we expect to receive a message it make
sense to continue this down to the hardware level as well, doing the
automatic copy actually causes more noise and unnecessary work.

It should be noted that the NIC was largely functional before this patch.
It appears that the reason it was working was that the hardware would quite
happily DMA into the receive ring as long as there was was spare space.
During heavy loads or on busy networks the receiving ring can fill up which
causes the hardware to stop (and never resume) its DMA activities unless
explicitly told to.

Signed-off-by: Cyril Bur <cyril.bur at au1.ibm.com>
---
 drivers/net/aspeednic.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/drivers/net/aspeednic.c b/drivers/net/aspeednic.c
index e7b0b95..d70c7ab 100644
--- a/drivers/net/aspeednic.c
+++ b/drivers/net/aspeednic.c
@@ -1334,6 +1334,12 @@ static int aspeednic_recv(struct eth_device* dev)
        * to the adapter.
        */
       rx_ring[rx_new].status &= cpu_to_le32(0x7FFFFFFF);
+
+      /*
+       * Ask the hardware for any other packets now that we have a known
+       * spare slot
+       */
+      OUTL(dev, POLL_DEMAND, RXPD_REG);
 //      rx_ring[rx_new].status = cpu_to_le32(RXPKT_RDY);
     }
 
@@ -1342,6 +1348,12 @@ static int aspeednic_recv(struct eth_device* dev)
     rx_new = (rx_new + 1) % rxRingSize;
   }
 
+  /*
+   * Ask the hardware for more packets so that they'll be DMAed by the time
+   * we return to this loop
+   */
+  OUTL(dev, POLL_DEMAND, RXPD_REG);
+
   return length;
 }
 
-- 
2.6.3




More information about the openbmc mailing list