]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[intel] Refill receive ring only after enabling receiver
authorMichael Brown <mcb30@ipxe.org>
Tue, 10 Jul 2012 08:32:58 +0000 (09:32 +0100)
committerMichael Brown <mcb30@ipxe.org>
Tue, 10 Jul 2012 08:32:58 +0000 (09:32 +0100)
On 82576 (and probably others), the datasheet states that "the tail
register of the queue (RDT[n]) should not be bumped until the queue is
enabled".  There is some confusion over exactly what constitutes
"enabled": the initialisation blurb says that we should "poll the
RXDCTL register until the ENABLE bit is set", while the description
for the RXDCTL register says that the ENABLE bit is set by default
(for queue zero).  Empirical evidence suggests that the ENABLE bit
reads as set immediately after writing to RCTL.EN, and so polling is
not necessary.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/drivers/net/intel.c

index 3eb1a377960758229de3c9199d5e869e6899da99..8153e0953d523fcc607b0328e88c2770e3b36657 100644 (file)
@@ -491,9 +491,6 @@ static int intel_open ( struct net_device *netdev ) {
        if ( ( rc = intel_create_ring ( intel, &intel->rx ) ) != 0 )
                goto err_create_rx;
 
-       /* Fill receive ring */
-       intel_refill_rx ( intel );
-
        /* Program MAC address */
        memset ( &mac, 0, sizeof ( mac ) );
        memcpy ( mac.raw, netdev->ll_addr, sizeof ( mac.raw ) );
@@ -515,6 +512,9 @@ static int intel_open ( struct net_device *netdev ) {
                  INTEL_RCTL_BAM | INTEL_RCTL_BSIZE_2048 | INTEL_RCTL_SECRC );
        writel ( rctl, intel->regs + INTEL_RCTL );
 
+       /* Fill receive ring */
+       intel_refill_rx ( intel );
+
        /* Update link state */
        intel_check_link ( netdev );