aboutsummaryrefslogtreecommitdiff
path: root/src/drivers
diff options
context:
space:
mode:
authorMichael Brown <mcb30@ipxe.org>2012-07-10 10:52:56 +0100
committerMichael Brown <mcb30@ipxe.org>2012-07-10 11:21:22 +0100
commit9f0b2d25a8e889899711b81213e91d042c58002f (patch)
treee4e97becaeccf60bd34b14896a590f0ef4330469 /src/drivers
parent8391ff3ee00583071def824231539004cc07fecb (diff)
downloadipxe-9f0b2d25a8e889899711b81213e91d042c58002f.zip
ipxe-9f0b2d25a8e889899711b81213e91d042c58002f.tar.gz
ipxe-9f0b2d25a8e889899711b81213e91d042c58002f.tar.bz2
[intel] Explicitly enable descriptor queues
On i350 the datasheet contradicts itself in stating that the default value of RXDCTL.ENABLE for queue zero is both set (according to the "Receive Initialization" section) and unset (according to the "Receive Descriptor Control - RXDCTL" section). Empirical evidence suggests that the default value is unset. Explicitly enable both transmit and receive queues to avoid any ambiguity. Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/drivers')
-rw-r--r--src/drivers/net/intel.c6
-rw-r--r--src/drivers/net/intel.h4
2 files changed, 10 insertions, 0 deletions
diff --git a/src/drivers/net/intel.c b/src/drivers/net/intel.c
index 8153e09..1fdce1c 100644
--- a/src/drivers/net/intel.c
+++ b/src/drivers/net/intel.c
@@ -363,6 +363,7 @@ static void intel_check_link ( struct net_device *netdev ) {
static int intel_create_ring ( struct intel_nic *intel,
struct intel_ring *ring ) {
physaddr_t address;
+ uint32_t dctl;
/* Allocate descriptor ring. Align ring on its own size to
* prevent any possible page-crossing errors due to hardware
@@ -393,6 +394,11 @@ static int intel_create_ring ( struct intel_nic *intel,
writel ( 0, ( intel->regs + ring->reg + INTEL_xDH ) );
writel ( 0, ( intel->regs + ring->reg + INTEL_xDT ) );
+ /* Enable ring */
+ dctl = readl ( intel->regs + ring->reg + INTEL_xDCTL );
+ dctl |= INTEL_xDCTL_ENABLE;
+ writel ( dctl, intel->regs + ring->reg + INTEL_xDCTL );
+
DBGC ( intel, "INTEL %p ring %05x is at [%08llx,%08llx)\n",
intel, ring->reg, ( ( unsigned long long ) address ),
( ( unsigned long long ) address + ring->len ) );
diff --git a/src/drivers/net/intel.h b/src/drivers/net/intel.h
index 6f941d1..b38a713 100644
--- a/src/drivers/net/intel.h
+++ b/src/drivers/net/intel.h
@@ -170,6 +170,10 @@ enum intel_descriptor_status {
/** Receive/Transmit Descriptor Tail (offset) */
#define INTEL_xDT 0x18
+/** Receive/Transmit Descriptor Control (offset) */
+#define INTEL_xDCTL 0x28
+#define INTEL_xDCTL_ENABLE 0x02000000UL /**< Queue enable */
+
/** Receive Descriptor Head */
#define INTEL_RDH ( INTEL_RD + INTEL_xDH )