summaryrefslogtreecommitdiffstats
path: root/src/drivers
diff options
context:
space:
mode:
authorMichael Brown2017-04-16 22:26:13 +0200
committerMichael Brown2017-04-16 22:37:41 +0200
commit2d79b20f2a3eba199012de3bd11f8aef0a5b9dbf (patch)
tree322b89450dbb6ae37acc42f595c27bcc90508e3d /src/drivers
parent[intel] Show original CTRL and STATUS values in debugging output (diff)
downloadipxe-2d79b20f2a3eba199012de3bd11f8aef0a5b9dbf.tar.gz
ipxe-2d79b20f2a3eba199012de3bd11f8aef0a5b9dbf.tar.xz
ipxe-2d79b20f2a3eba199012de3bd11f8aef0a5b9dbf.zip
[intel] Do not enable ASDE on i350 backplane NIC
On most Intel NICs, Auto-Speed Detection Enable (ASDE) can be used to automatically detect the correct link speed by sampling the link using the internal PHY. This feature is automatically inhibited when not appropriate for the physical link (e.g. when using internal SerDes mode on the 8254x). On the i350 datasheet ASDE is a reserved bit, but the relevant auto-speed detection hardware appears still to be present. However, enabling ASDE on the i350 1000BASE-KX backplane NIC seems to cause an immediate link failure. It is possible that the auto-speed detection hardware is still present, is not connected to a physical link, and is not inhibited from being applied in this mode. Work around this problem by adding an INTEL_NO_ASDE flag bit (analogous to INTEL_NO_PHY_RST), and applying this for the i350 backplane NIC. 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.h2
2 files changed, 6 insertions, 2 deletions
diff --git a/src/drivers/net/intel.c b/src/drivers/net/intel.c
index 548bf90a..1bca87bc 100644
--- a/src/drivers/net/intel.c
+++ b/src/drivers/net/intel.c
@@ -295,7 +295,9 @@ static int intel_reset ( struct intel_nic *intel ) {
mdelay ( INTEL_RESET_DELAY_MS );
/* Set a sensible default configuration */
- ctrl |= ( INTEL_CTRL_SLU | INTEL_CTRL_ASDE );
+ if ( ! ( intel->flags & INTEL_NO_ASDE ) )
+ ctrl |= INTEL_CTRL_ASDE;
+ ctrl |= INTEL_CTRL_SLU;
ctrl &= ~( INTEL_CTRL_LRST | INTEL_CTRL_FRCSPD | INTEL_CTRL_FRCDPLX );
writel ( ctrl, intel->regs + INTEL_CTRL );
mdelay ( INTEL_RESET_DELAY_MS );
@@ -1110,7 +1112,7 @@ static struct pci_device_id intel_nics[] = {
PCI_ROM ( 0x8086, 0x1518, "82576ns", "82576NS SerDes", 0 ),
PCI_ROM ( 0x8086, 0x1521, "i350", "I350", 0 ),
PCI_ROM ( 0x8086, 0x1522, "i350-f", "I350 Fiber", 0 ),
- PCI_ROM ( 0x8086, 0x1523, "i350-b", "I350 Backplane", 0 ),
+ PCI_ROM ( 0x8086, 0x1523, "i350-b", "I350 Backplane", INTEL_NO_ASDE ),
PCI_ROM ( 0x8086, 0x1524, "i350-2", "I350", 0 ),
PCI_ROM ( 0x8086, 0x1525, "82567v-4", "82567V-4", 0 ),
PCI_ROM ( 0x8086, 0x1526, "82576-5", "82576", 0 ),
diff --git a/src/drivers/net/intel.h b/src/drivers/net/intel.h
index 630eaf84..14877687 100644
--- a/src/drivers/net/intel.h
+++ b/src/drivers/net/intel.h
@@ -306,6 +306,8 @@ enum intel_flags {
INTEL_VMWARE = 0x0002,
/** PHY reset is broken */
INTEL_NO_PHY_RST = 0x0004,
+ /** ASDE is broken */
+ INTEL_NO_ASDE = 0x0008,
};
/**