[PATCH 2/2] drivers/net/aspeednic: Fix unreliable networking
Cyril Bur
cyril.bur at au1.ibm.com
Tue Dec 8 16:38:05 AEDT 2015
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..9dae927 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