Merge branch 'upstream-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6
* 'upstream-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6: (217 commits)
net/ieee80211: fix more crypto-related build breakage
[PATCH] Spidernet: add ethtool -S (show statistics)
[NET] GT96100: Delete bitrotting ethernet driver
[PATCH] mv643xx_eth: restrict to 32-bit PPC_MULTIPLATFORM
[PATCH] Cirrus Logic ep93xx ethernet driver
r8169: the MMIO region of the 8167 stands behin BAR#1
e1000, ixgb: Remove pointless wrappers
[PATCH] Remove powerpc specific parts of 3c509 driver
[PATCH] s2io: Switch to pci_get_device
[PATCH] gt96100: move to pci_get_device API
[PATCH] ehea: bugfix for register access functions
[PATCH] e1000 disable device on PCI error
drivers/net/phy/fixed: #if 0 some incomplete code
drivers/net: const-ify ethtool_ops declarations
[PATCH] ethtool: allow const ethtool_ops
[PATCH] sky2: big endian
[PATCH] sky2: fiber support
[PATCH] sky2: tx pause bug fix
drivers/net: Trim trailing whitespace
[PATCH] ehea: IBM eHEA Ethernet Device Driver
...
Manually resolved conflicts in drivers/net/ixgb/ixgb_main.c and
drivers/net/sky2.c related to CHECKSUM_HW/CHECKSUM_PARTIAL changes by
commit 84fa7933a3
that just happened to be
next to unrelated changes in this update.
This commit is contained in:
@@ -242,12 +242,10 @@ struct e1000_adapter {
|
||||
struct timer_list watchdog_timer;
|
||||
struct timer_list phy_info_timer;
|
||||
struct vlan_group *vlgrp;
|
||||
uint16_t mng_vlan_id;
|
||||
uint16_t mng_vlan_id;
|
||||
uint32_t bd_number;
|
||||
uint32_t rx_buffer_len;
|
||||
uint32_t part_num;
|
||||
uint32_t wol;
|
||||
uint32_t ksp3_port_a;
|
||||
uint32_t smartspeed;
|
||||
uint32_t en_mng_pt;
|
||||
uint16_t link_speed;
|
||||
@@ -342,7 +340,9 @@ struct e1000_adapter {
|
||||
boolean_t tso_force;
|
||||
#endif
|
||||
boolean_t smart_power_down; /* phy smart power down */
|
||||
boolean_t quad_port_a;
|
||||
unsigned long flags;
|
||||
uint32_t eeprom_wol;
|
||||
};
|
||||
|
||||
enum e1000_state_t {
|
||||
|
@@ -183,6 +183,9 @@ e1000_set_settings(struct net_device *netdev, struct ethtool_cmd *ecmd)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
while (test_and_set_bit(__E1000_RESETTING, &adapter->flags))
|
||||
msleep(1);
|
||||
|
||||
if (ecmd->autoneg == AUTONEG_ENABLE) {
|
||||
hw->autoneg = 1;
|
||||
if (hw->media_type == e1000_media_type_fiber)
|
||||
@@ -199,16 +202,20 @@ e1000_set_settings(struct net_device *netdev, struct ethtool_cmd *ecmd)
|
||||
ADVERTISED_TP;
|
||||
ecmd->advertising = hw->autoneg_advertised;
|
||||
} else
|
||||
if (e1000_set_spd_dplx(adapter, ecmd->speed + ecmd->duplex))
|
||||
if (e1000_set_spd_dplx(adapter, ecmd->speed + ecmd->duplex)) {
|
||||
clear_bit(__E1000_RESETTING, &adapter->flags);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* reset the link */
|
||||
|
||||
if (netif_running(adapter->netdev))
|
||||
e1000_reinit_locked(adapter);
|
||||
else
|
||||
if (netif_running(adapter->netdev)) {
|
||||
e1000_down(adapter);
|
||||
e1000_up(adapter);
|
||||
} else
|
||||
e1000_reset(adapter);
|
||||
|
||||
clear_bit(__E1000_RESETTING, &adapter->flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -238,9 +245,13 @@ e1000_set_pauseparam(struct net_device *netdev,
|
||||
{
|
||||
struct e1000_adapter *adapter = netdev_priv(netdev);
|
||||
struct e1000_hw *hw = &adapter->hw;
|
||||
int retval = 0;
|
||||
|
||||
adapter->fc_autoneg = pause->autoneg;
|
||||
|
||||
while (test_and_set_bit(__E1000_RESETTING, &adapter->flags))
|
||||
msleep(1);
|
||||
|
||||
if (pause->rx_pause && pause->tx_pause)
|
||||
hw->fc = e1000_fc_full;
|
||||
else if (pause->rx_pause && !pause->tx_pause)
|
||||
@@ -253,15 +264,17 @@ e1000_set_pauseparam(struct net_device *netdev,
|
||||
hw->original_fc = hw->fc;
|
||||
|
||||
if (adapter->fc_autoneg == AUTONEG_ENABLE) {
|
||||
if (netif_running(adapter->netdev))
|
||||
e1000_reinit_locked(adapter);
|
||||
else
|
||||
if (netif_running(adapter->netdev)) {
|
||||
e1000_down(adapter);
|
||||
e1000_up(adapter);
|
||||
} else
|
||||
e1000_reset(adapter);
|
||||
} else
|
||||
return ((hw->media_type == e1000_media_type_fiber) ?
|
||||
e1000_setup_link(hw) : e1000_force_mac_fc(hw));
|
||||
retval = ((hw->media_type == e1000_media_type_fiber) ?
|
||||
e1000_setup_link(hw) : e1000_force_mac_fc(hw));
|
||||
|
||||
return 0;
|
||||
clear_bit(__E1000_RESETTING, &adapter->flags);
|
||||
return retval;
|
||||
}
|
||||
|
||||
static uint32_t
|
||||
@@ -415,12 +428,12 @@ e1000_get_regs(struct net_device *netdev,
|
||||
regs_buff[23] = regs_buff[18]; /* mdix mode */
|
||||
e1000_write_phy_reg(hw, IGP01E1000_PHY_PAGE_SELECT, 0x0);
|
||||
} else {
|
||||
e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS, &phy_data);
|
||||
e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS, &phy_data);
|
||||
regs_buff[13] = (uint32_t)phy_data; /* cable length */
|
||||
regs_buff[14] = 0; /* Dummy (to align w/ IGP phy reg dump) */
|
||||
regs_buff[15] = 0; /* Dummy (to align w/ IGP phy reg dump) */
|
||||
regs_buff[16] = 0; /* Dummy (to align w/ IGP phy reg dump) */
|
||||
e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_data);
|
||||
e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_data);
|
||||
regs_buff[17] = (uint32_t)phy_data; /* extended 10bt distance */
|
||||
regs_buff[18] = regs_buff[13]; /* cable polarity */
|
||||
regs_buff[19] = 0; /* Dummy (to align w/ IGP phy reg dump) */
|
||||
@@ -696,7 +709,6 @@ e1000_set_ringparam(struct net_device *netdev,
|
||||
}
|
||||
|
||||
clear_bit(__E1000_RESETTING, &adapter->flags);
|
||||
|
||||
return 0;
|
||||
err_setup_tx:
|
||||
e1000_free_all_rx_resources(adapter);
|
||||
@@ -881,21 +893,22 @@ e1000_intr_test(struct e1000_adapter *adapter, uint64_t *data)
|
||||
|
||||
*data = 0;
|
||||
|
||||
/* NOTE: we don't test MSI interrupts here, yet */
|
||||
/* Hook up test interrupt handler just for this test */
|
||||
if (!request_irq(irq, &e1000_test_intr, IRQF_PROBE_SHARED,
|
||||
netdev->name, netdev)) {
|
||||
shared_int = FALSE;
|
||||
} else if (request_irq(irq, &e1000_test_intr, IRQF_SHARED,
|
||||
netdev->name, netdev)){
|
||||
netdev->name, netdev))
|
||||
shared_int = FALSE;
|
||||
else if (request_irq(irq, &e1000_test_intr, IRQF_SHARED,
|
||||
netdev->name, netdev)) {
|
||||
*data = 1;
|
||||
return -1;
|
||||
}
|
||||
DPRINTK(PROBE,INFO, "testing %s interrupt\n",
|
||||
DPRINTK(HW, INFO, "testing %s interrupt\n",
|
||||
(shared_int ? "shared" : "unshared"));
|
||||
|
||||
/* Disable all the interrupts */
|
||||
E1000_WRITE_REG(&adapter->hw, IMC, 0xFFFFFFFF);
|
||||
msec_delay(10);
|
||||
msleep(10);
|
||||
|
||||
/* Test each interrupt */
|
||||
for (; i < 10; i++) {
|
||||
@@ -915,7 +928,7 @@ e1000_intr_test(struct e1000_adapter *adapter, uint64_t *data)
|
||||
adapter->test_icr = 0;
|
||||
E1000_WRITE_REG(&adapter->hw, IMC, mask);
|
||||
E1000_WRITE_REG(&adapter->hw, ICS, mask);
|
||||
msec_delay(10);
|
||||
msleep(10);
|
||||
|
||||
if (adapter->test_icr & mask) {
|
||||
*data = 3;
|
||||
@@ -932,7 +945,7 @@ e1000_intr_test(struct e1000_adapter *adapter, uint64_t *data)
|
||||
adapter->test_icr = 0;
|
||||
E1000_WRITE_REG(&adapter->hw, IMS, mask);
|
||||
E1000_WRITE_REG(&adapter->hw, ICS, mask);
|
||||
msec_delay(10);
|
||||
msleep(10);
|
||||
|
||||
if (!(adapter->test_icr & mask)) {
|
||||
*data = 4;
|
||||
@@ -949,7 +962,7 @@ e1000_intr_test(struct e1000_adapter *adapter, uint64_t *data)
|
||||
adapter->test_icr = 0;
|
||||
E1000_WRITE_REG(&adapter->hw, IMC, ~mask & 0x00007FFF);
|
||||
E1000_WRITE_REG(&adapter->hw, ICS, ~mask & 0x00007FFF);
|
||||
msec_delay(10);
|
||||
msleep(10);
|
||||
|
||||
if (adapter->test_icr) {
|
||||
*data = 5;
|
||||
@@ -960,7 +973,7 @@ e1000_intr_test(struct e1000_adapter *adapter, uint64_t *data)
|
||||
|
||||
/* Disable all the interrupts */
|
||||
E1000_WRITE_REG(&adapter->hw, IMC, 0xFFFFFFFF);
|
||||
msec_delay(10);
|
||||
msleep(10);
|
||||
|
||||
/* Unhook test interrupt handler */
|
||||
free_irq(irq, netdev);
|
||||
@@ -1256,11 +1269,10 @@ e1000_integrated_phy_loopback(struct e1000_adapter *adapter)
|
||||
e1000_write_phy_reg(&adapter->hw, PHY_CTRL, 0x9140);
|
||||
/* autoneg off */
|
||||
e1000_write_phy_reg(&adapter->hw, PHY_CTRL, 0x8140);
|
||||
} else if (adapter->hw.phy_type == e1000_phy_gg82563) {
|
||||
} else if (adapter->hw.phy_type == e1000_phy_gg82563)
|
||||
e1000_write_phy_reg(&adapter->hw,
|
||||
GG82563_PHY_KMRN_MODE_CTRL,
|
||||
0x1CC);
|
||||
}
|
||||
|
||||
ctrl_reg = E1000_READ_REG(&adapter->hw, CTRL);
|
||||
|
||||
@@ -1288,9 +1300,9 @@ e1000_integrated_phy_loopback(struct e1000_adapter *adapter)
|
||||
}
|
||||
|
||||
if (adapter->hw.media_type == e1000_media_type_copper &&
|
||||
adapter->hw.phy_type == e1000_phy_m88) {
|
||||
adapter->hw.phy_type == e1000_phy_m88)
|
||||
ctrl_reg |= E1000_CTRL_ILOS; /* Invert Loss of Signal */
|
||||
} else {
|
||||
else {
|
||||
/* Set the ILOS bit on the fiber Nic is half
|
||||
* duplex link is detected. */
|
||||
stat_reg = E1000_READ_REG(&adapter->hw, STATUS);
|
||||
@@ -1383,7 +1395,7 @@ e1000_setup_loopback_test(struct e1000_adapter *adapter)
|
||||
#define E1000_SERDES_LB_ON 0x410
|
||||
e1000_set_phy_loopback(adapter);
|
||||
E1000_WRITE_REG(hw, SCTL, E1000_SERDES_LB_ON);
|
||||
msec_delay(10);
|
||||
msleep(10);
|
||||
return 0;
|
||||
break;
|
||||
default:
|
||||
@@ -1416,7 +1428,7 @@ e1000_loopback_cleanup(struct e1000_adapter *adapter)
|
||||
hw->media_type == e1000_media_type_internal_serdes) {
|
||||
#define E1000_SERDES_LB_OFF 0x400
|
||||
E1000_WRITE_REG(hw, SCTL, E1000_SERDES_LB_OFF);
|
||||
msec_delay(10);
|
||||
msleep(10);
|
||||
break;
|
||||
}
|
||||
/* Fall Through */
|
||||
@@ -1426,11 +1438,10 @@ e1000_loopback_cleanup(struct e1000_adapter *adapter)
|
||||
case e1000_82546_rev_3:
|
||||
default:
|
||||
hw->autoneg = TRUE;
|
||||
if (hw->phy_type == e1000_phy_gg82563) {
|
||||
if (hw->phy_type == e1000_phy_gg82563)
|
||||
e1000_write_phy_reg(hw,
|
||||
GG82563_PHY_KMRN_MODE_CTRL,
|
||||
0x180);
|
||||
}
|
||||
e1000_read_phy_reg(hw, PHY_CTRL, &phy_reg);
|
||||
if (phy_reg & MII_CR_LOOPBACK) {
|
||||
phy_reg &= ~MII_CR_LOOPBACK;
|
||||
@@ -1497,7 +1508,7 @@ e1000_run_loopback_test(struct e1000_adapter *adapter)
|
||||
if (unlikely(++k == txdr->count)) k = 0;
|
||||
}
|
||||
E1000_WRITE_REG(&adapter->hw, TDT, k);
|
||||
msec_delay(200);
|
||||
msleep(200);
|
||||
time = jiffies; /* set the start time for the receive */
|
||||
good_cnt = 0;
|
||||
do { /* receive the sent packets */
|
||||
@@ -1568,14 +1579,14 @@ e1000_link_test(struct e1000_adapter *adapter, uint64_t *data)
|
||||
e1000_check_for_link(&adapter->hw);
|
||||
if (adapter->hw.serdes_link_down == FALSE)
|
||||
return *data;
|
||||
msec_delay(20);
|
||||
msleep(20);
|
||||
} while (i++ < 3750);
|
||||
|
||||
*data = 1;
|
||||
} else {
|
||||
e1000_check_for_link(&adapter->hw);
|
||||
if (adapter->hw.autoneg) /* if auto_neg is set wait for it */
|
||||
msec_delay(4000);
|
||||
msleep(4000);
|
||||
|
||||
if (!(E1000_READ_REG(&adapter->hw, STATUS) & E1000_STATUS_LU)) {
|
||||
*data = 1;
|
||||
@@ -1590,6 +1601,8 @@ e1000_diag_test_count(struct net_device *netdev)
|
||||
return E1000_TEST_LEN;
|
||||
}
|
||||
|
||||
extern void e1000_power_up_phy(struct e1000_adapter *);
|
||||
|
||||
static void
|
||||
e1000_diag_test(struct net_device *netdev,
|
||||
struct ethtool_test *eth_test, uint64_t *data)
|
||||
@@ -1606,6 +1619,8 @@ e1000_diag_test(struct net_device *netdev,
|
||||
uint8_t forced_speed_duplex = adapter->hw.forced_speed_duplex;
|
||||
uint8_t autoneg = adapter->hw.autoneg;
|
||||
|
||||
DPRINTK(HW, INFO, "offline testing starting\n");
|
||||
|
||||
/* Link test performed before hardware reset so autoneg doesn't
|
||||
* interfere with test result */
|
||||
if (e1000_link_test(adapter, &data[4]))
|
||||
@@ -1629,6 +1644,8 @@ e1000_diag_test(struct net_device *netdev,
|
||||
eth_test->flags |= ETH_TEST_FL_FAILED;
|
||||
|
||||
e1000_reset(adapter);
|
||||
/* make sure the phy is powered up */
|
||||
e1000_power_up_phy(adapter);
|
||||
if (e1000_loopback_test(adapter, &data[3]))
|
||||
eth_test->flags |= ETH_TEST_FL_FAILED;
|
||||
|
||||
@@ -1642,6 +1659,7 @@ e1000_diag_test(struct net_device *netdev,
|
||||
if (if_running)
|
||||
dev_open(netdev);
|
||||
} else {
|
||||
DPRINTK(HW, INFO, "online testing starting\n");
|
||||
/* Online tests */
|
||||
if (e1000_link_test(adapter, &data[4]))
|
||||
eth_test->flags |= ETH_TEST_FL_FAILED;
|
||||
@@ -1657,14 +1675,12 @@ e1000_diag_test(struct net_device *netdev,
|
||||
msleep_interruptible(4 * 1000);
|
||||
}
|
||||
|
||||
static void
|
||||
e1000_get_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
|
||||
static int e1000_wol_exclusion(struct e1000_adapter *adapter, struct ethtool_wolinfo *wol)
|
||||
{
|
||||
struct e1000_adapter *adapter = netdev_priv(netdev);
|
||||
struct e1000_hw *hw = &adapter->hw;
|
||||
int retval = 1; /* fail by default */
|
||||
|
||||
switch (adapter->hw.device_id) {
|
||||
case E1000_DEV_ID_82542:
|
||||
switch (hw->device_id) {
|
||||
case E1000_DEV_ID_82543GC_FIBER:
|
||||
case E1000_DEV_ID_82543GC_COPPER:
|
||||
case E1000_DEV_ID_82544EI_FIBER:
|
||||
@@ -1672,52 +1688,87 @@ e1000_get_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
|
||||
case E1000_DEV_ID_82545EM_FIBER:
|
||||
case E1000_DEV_ID_82545EM_COPPER:
|
||||
case E1000_DEV_ID_82546GB_QUAD_COPPER:
|
||||
case E1000_DEV_ID_82546GB_PCIE:
|
||||
/* these don't support WoL at all */
|
||||
wol->supported = 0;
|
||||
wol->wolopts = 0;
|
||||
break;
|
||||
case E1000_DEV_ID_82546EB_FIBER:
|
||||
case E1000_DEV_ID_82546GB_FIBER:
|
||||
case E1000_DEV_ID_82571EB_FIBER:
|
||||
case E1000_DEV_ID_82571EB_SERDES:
|
||||
case E1000_DEV_ID_82571EB_COPPER:
|
||||
/* Wake events not supported on port B */
|
||||
if (E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1) {
|
||||
wol->supported = 0;
|
||||
break;
|
||||
}
|
||||
/* return success for non excluded adapter ports */
|
||||
retval = 0;
|
||||
break;
|
||||
case E1000_DEV_ID_82571EB_QUAD_COPPER:
|
||||
case E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3:
|
||||
/* quad port adapters only support WoL on port A */
|
||||
if (!adapter->quad_port_a) {
|
||||
wol->supported = 0;
|
||||
break;
|
||||
}
|
||||
/* return success for non excluded adapter ports */
|
||||
retval = 0;
|
||||
break;
|
||||
default:
|
||||
/* dual port cards only support WoL on port A from now on
|
||||
* unless it was enabled in the eeprom for port B
|
||||
* so exclude FUNC_1 ports from having WoL enabled */
|
||||
if (E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1 &&
|
||||
!adapter->eeprom_wol) {
|
||||
wol->supported = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
retval = 0;
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
static void
|
||||
e1000_get_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
|
||||
{
|
||||
struct e1000_adapter *adapter = netdev_priv(netdev);
|
||||
|
||||
wol->supported = WAKE_UCAST | WAKE_MCAST |
|
||||
WAKE_BCAST | WAKE_MAGIC;
|
||||
wol->wolopts = 0;
|
||||
|
||||
/* this function will set ->supported = 0 and return 1 if wol is not
|
||||
* supported by this hardware */
|
||||
if (e1000_wol_exclusion(adapter, wol))
|
||||
return;
|
||||
|
||||
/* apply any specific unsupported masks here */
|
||||
switch (adapter->hw.device_id) {
|
||||
case E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3:
|
||||
/* device id 10B5 port-A supports wol */
|
||||
if (!adapter->ksp3_port_a) {
|
||||
wol->supported = 0;
|
||||
return;
|
||||
}
|
||||
/* KSP3 does not suppport UCAST wake-ups for any interface */
|
||||
wol->supported = WAKE_MCAST | WAKE_BCAST | WAKE_MAGIC;
|
||||
/* KSP3 does not suppport UCAST wake-ups */
|
||||
wol->supported &= ~WAKE_UCAST;
|
||||
|
||||
if (adapter->wol & E1000_WUFC_EX)
|
||||
DPRINTK(DRV, ERR, "Interface does not support "
|
||||
"directed (unicast) frame wake-up packets\n");
|
||||
wol->wolopts = 0;
|
||||
goto do_defaults;
|
||||
|
||||
case E1000_DEV_ID_82546EB_FIBER:
|
||||
case E1000_DEV_ID_82546GB_FIBER:
|
||||
case E1000_DEV_ID_82571EB_FIBER:
|
||||
/* Wake events only supported on port A for dual fiber */
|
||||
if (E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1) {
|
||||
wol->supported = 0;
|
||||
wol->wolopts = 0;
|
||||
return;
|
||||
}
|
||||
/* Fall Through */
|
||||
|
||||
break;
|
||||
default:
|
||||
wol->supported = WAKE_UCAST | WAKE_MCAST |
|
||||
WAKE_BCAST | WAKE_MAGIC;
|
||||
wol->wolopts = 0;
|
||||
|
||||
do_defaults:
|
||||
if (adapter->wol & E1000_WUFC_EX)
|
||||
wol->wolopts |= WAKE_UCAST;
|
||||
if (adapter->wol & E1000_WUFC_MC)
|
||||
wol->wolopts |= WAKE_MCAST;
|
||||
if (adapter->wol & E1000_WUFC_BC)
|
||||
wol->wolopts |= WAKE_BCAST;
|
||||
if (adapter->wol & E1000_WUFC_MAG)
|
||||
wol->wolopts |= WAKE_MAGIC;
|
||||
return;
|
||||
break;
|
||||
}
|
||||
|
||||
if (adapter->wol & E1000_WUFC_EX)
|
||||
wol->wolopts |= WAKE_UCAST;
|
||||
if (adapter->wol & E1000_WUFC_MC)
|
||||
wol->wolopts |= WAKE_MCAST;
|
||||
if (adapter->wol & E1000_WUFC_BC)
|
||||
wol->wolopts |= WAKE_BCAST;
|
||||
if (adapter->wol & E1000_WUFC_MAG)
|
||||
wol->wolopts |= WAKE_MAGIC;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
static int
|
||||
@@ -1726,52 +1777,36 @@ e1000_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
|
||||
struct e1000_adapter *adapter = netdev_priv(netdev);
|
||||
struct e1000_hw *hw = &adapter->hw;
|
||||
|
||||
switch (adapter->hw.device_id) {
|
||||
case E1000_DEV_ID_82542:
|
||||
case E1000_DEV_ID_82543GC_FIBER:
|
||||
case E1000_DEV_ID_82543GC_COPPER:
|
||||
case E1000_DEV_ID_82544EI_FIBER:
|
||||
case E1000_DEV_ID_82546EB_QUAD_COPPER:
|
||||
case E1000_DEV_ID_82546GB_QUAD_COPPER:
|
||||
case E1000_DEV_ID_82545EM_FIBER:
|
||||
case E1000_DEV_ID_82545EM_COPPER:
|
||||
if (wol->wolopts & (WAKE_PHY | WAKE_ARP | WAKE_MAGICSECURE))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (e1000_wol_exclusion(adapter, wol))
|
||||
return wol->wolopts ? -EOPNOTSUPP : 0;
|
||||
|
||||
switch (hw->device_id) {
|
||||
case E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3:
|
||||
/* device id 10B5 port-A supports wol */
|
||||
if (!adapter->ksp3_port_a)
|
||||
return wol->wolopts ? -EOPNOTSUPP : 0;
|
||||
|
||||
if (wol->wolopts & WAKE_UCAST) {
|
||||
DPRINTK(DRV, ERR, "Interface does not support "
|
||||
"directed (unicast) frame wake-up packets\n");
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
case E1000_DEV_ID_82546EB_FIBER:
|
||||
case E1000_DEV_ID_82546GB_FIBER:
|
||||
case E1000_DEV_ID_82571EB_FIBER:
|
||||
/* Wake events only supported on port A for dual fiber */
|
||||
if (E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1)
|
||||
return wol->wolopts ? -EOPNOTSUPP : 0;
|
||||
/* Fall Through */
|
||||
|
||||
break;
|
||||
default:
|
||||
if (wol->wolopts & (WAKE_PHY | WAKE_ARP | WAKE_MAGICSECURE))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
adapter->wol = 0;
|
||||
|
||||
if (wol->wolopts & WAKE_UCAST)
|
||||
adapter->wol |= E1000_WUFC_EX;
|
||||
if (wol->wolopts & WAKE_MCAST)
|
||||
adapter->wol |= E1000_WUFC_MC;
|
||||
if (wol->wolopts & WAKE_BCAST)
|
||||
adapter->wol |= E1000_WUFC_BC;
|
||||
if (wol->wolopts & WAKE_MAGIC)
|
||||
adapter->wol |= E1000_WUFC_MAG;
|
||||
break;
|
||||
}
|
||||
|
||||
/* these settings will always override what we currently have */
|
||||
adapter->wol = 0;
|
||||
|
||||
if (wol->wolopts & WAKE_UCAST)
|
||||
adapter->wol |= E1000_WUFC_EX;
|
||||
if (wol->wolopts & WAKE_MCAST)
|
||||
adapter->wol |= E1000_WUFC_MC;
|
||||
if (wol->wolopts & WAKE_BCAST)
|
||||
adapter->wol |= E1000_WUFC_BC;
|
||||
if (wol->wolopts & WAKE_MAGIC)
|
||||
adapter->wol |= E1000_WUFC_MAG;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1887,7 +1922,7 @@ e1000_get_strings(struct net_device *netdev, uint32_t stringset, uint8_t *data)
|
||||
}
|
||||
}
|
||||
|
||||
static struct ethtool_ops e1000_ethtool_ops = {
|
||||
static const struct ethtool_ops e1000_ethtool_ops = {
|
||||
.get_settings = e1000_get_settings,
|
||||
.set_settings = e1000_set_settings,
|
||||
.get_drvinfo = e1000_get_drvinfo,
|
||||
@@ -1895,8 +1930,8 @@ static struct ethtool_ops e1000_ethtool_ops = {
|
||||
.get_regs = e1000_get_regs,
|
||||
.get_wol = e1000_get_wol,
|
||||
.set_wol = e1000_set_wol,
|
||||
.get_msglevel = e1000_get_msglevel,
|
||||
.set_msglevel = e1000_set_msglevel,
|
||||
.get_msglevel = e1000_get_msglevel,
|
||||
.set_msglevel = e1000_set_msglevel,
|
||||
.nway_reset = e1000_nway_reset,
|
||||
.get_link = ethtool_op_get_link,
|
||||
.get_eeprom_len = e1000_get_eeprom_len,
|
||||
@@ -1904,17 +1939,17 @@ static struct ethtool_ops e1000_ethtool_ops = {
|
||||
.set_eeprom = e1000_set_eeprom,
|
||||
.get_ringparam = e1000_get_ringparam,
|
||||
.set_ringparam = e1000_set_ringparam,
|
||||
.get_pauseparam = e1000_get_pauseparam,
|
||||
.set_pauseparam = e1000_set_pauseparam,
|
||||
.get_rx_csum = e1000_get_rx_csum,
|
||||
.set_rx_csum = e1000_set_rx_csum,
|
||||
.get_tx_csum = e1000_get_tx_csum,
|
||||
.set_tx_csum = e1000_set_tx_csum,
|
||||
.get_sg = ethtool_op_get_sg,
|
||||
.set_sg = ethtool_op_set_sg,
|
||||
.get_pauseparam = e1000_get_pauseparam,
|
||||
.set_pauseparam = e1000_set_pauseparam,
|
||||
.get_rx_csum = e1000_get_rx_csum,
|
||||
.set_rx_csum = e1000_set_rx_csum,
|
||||
.get_tx_csum = e1000_get_tx_csum,
|
||||
.set_tx_csum = e1000_set_tx_csum,
|
||||
.get_sg = ethtool_op_get_sg,
|
||||
.set_sg = ethtool_op_set_sg,
|
||||
#ifdef NETIF_F_TSO
|
||||
.get_tso = ethtool_op_get_tso,
|
||||
.set_tso = e1000_set_tso,
|
||||
.get_tso = ethtool_op_get_tso,
|
||||
.set_tso = e1000_set_tso,
|
||||
#endif
|
||||
.self_test_count = e1000_diag_test_count,
|
||||
.self_test = e1000_diag_test,
|
||||
@@ -1922,7 +1957,7 @@ static struct ethtool_ops e1000_ethtool_ops = {
|
||||
.phys_id = e1000_phys_id,
|
||||
.get_stats_count = e1000_get_stats_count,
|
||||
.get_ethtool_stats = e1000_get_ethtool_stats,
|
||||
.get_perm_addr = ethtool_op_get_perm_addr,
|
||||
.get_perm_addr = ethtool_op_get_perm_addr,
|
||||
};
|
||||
|
||||
void e1000_set_ethtool_ops(struct net_device *netdev)
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -336,9 +336,9 @@ uint32_t e1000_enable_mng_pass_thru(struct e1000_hw *hw);
|
||||
#define E1000_HI_MAX_MNG_DATA_LENGTH 0x6F8 /* Host Interface data length */
|
||||
|
||||
#define E1000_MNG_DHCP_COMMAND_TIMEOUT 10 /* Time in ms to process MNG command */
|
||||
#define E1000_MNG_DHCP_COOKIE_OFFSET 0x6F0 /* Cookie offset */
|
||||
#define E1000_MNG_DHCP_COOKIE_LENGTH 0x10 /* Cookie length */
|
||||
#define E1000_MNG_IAMT_MODE 0x3
|
||||
#define E1000_MNG_DHCP_COOKIE_OFFSET 0x6F0 /* Cookie offset */
|
||||
#define E1000_MNG_DHCP_COOKIE_LENGTH 0x10 /* Cookie length */
|
||||
#define E1000_MNG_IAMT_MODE 0x3
|
||||
#define E1000_MNG_ICH_IAMT_MODE 0x2
|
||||
#define E1000_IAMT_SIGNATURE 0x544D4149 /* Intel(R) Active Management Technology signature */
|
||||
|
||||
@@ -385,7 +385,7 @@ struct e1000_host_mng_dhcp_cookie{
|
||||
#endif
|
||||
|
||||
int32_t e1000_mng_write_dhcp_info(struct e1000_hw *hw, uint8_t *buffer,
|
||||
uint16_t length);
|
||||
uint16_t length);
|
||||
boolean_t e1000_check_mng_mode(struct e1000_hw *hw);
|
||||
boolean_t e1000_enable_tx_pkt_filtering(struct e1000_hw *hw);
|
||||
|
||||
@@ -470,6 +470,7 @@ int32_t e1000_check_phy_reset_block(struct e1000_hw *hw);
|
||||
#define E1000_DEV_ID_82571EB_COPPER 0x105E
|
||||
#define E1000_DEV_ID_82571EB_FIBER 0x105F
|
||||
#define E1000_DEV_ID_82571EB_SERDES 0x1060
|
||||
#define E1000_DEV_ID_82571EB_QUAD_COPPER 0x10A4
|
||||
#define E1000_DEV_ID_82572EI_COPPER 0x107D
|
||||
#define E1000_DEV_ID_82572EI_FIBER 0x107E
|
||||
#define E1000_DEV_ID_82572EI_SERDES 0x107F
|
||||
@@ -523,7 +524,7 @@ int32_t e1000_check_phy_reset_block(struct e1000_hw *hw);
|
||||
|
||||
|
||||
/* 802.1q VLAN Packet Sizes */
|
||||
#define VLAN_TAG_SIZE 4 /* 802.3ac tag (not DMAed) */
|
||||
#define VLAN_TAG_SIZE 4 /* 802.3ac tag (not DMAed) */
|
||||
|
||||
/* Ethertype field values */
|
||||
#define ETHERNET_IEEE_VLAN_TYPE 0x8100 /* 802.3ac packet */
|
||||
@@ -697,6 +698,7 @@ union e1000_rx_desc_packet_split {
|
||||
E1000_RXDEXT_STATERR_CXE | \
|
||||
E1000_RXDEXT_STATERR_RXE)
|
||||
|
||||
|
||||
/* Transmit Descriptor */
|
||||
struct e1000_tx_desc {
|
||||
uint64_t buffer_addr; /* Address of the descriptor's data buffer */
|
||||
@@ -2086,7 +2088,7 @@ struct e1000_hw {
|
||||
#define E1000_MANC_EN_IP_ADDR_FILTER 0x00400000 /* Enable IP address
|
||||
* filtering */
|
||||
#define E1000_MANC_EN_XSUM_FILTER 0x00800000 /* Enable checksum filtering */
|
||||
#define E1000_MANC_BR_EN 0x01000000 /* Enable broadcast filtering */
|
||||
#define E1000_MANC_BR_EN 0x01000000 /* Enable broadcast filtering */
|
||||
#define E1000_MANC_SMB_REQ 0x01000000 /* SMBus Request */
|
||||
#define E1000_MANC_SMB_GNT 0x02000000 /* SMBus Grant */
|
||||
#define E1000_MANC_SMB_CLK_IN 0x04000000 /* SMBus Clock In */
|
||||
@@ -2172,7 +2174,7 @@ struct e1000_host_command_info {
|
||||
|
||||
#define E1000_MDALIGN 4096
|
||||
|
||||
/* PCI-Ex registers */
|
||||
/* PCI-Ex registers*/
|
||||
|
||||
/* PCI-Ex Control Register */
|
||||
#define E1000_GCR_RXD_NO_SNOOP 0x00000001
|
||||
@@ -2224,7 +2226,7 @@ struct e1000_host_command_info {
|
||||
#define EEPROM_EWDS_OPCODE_MICROWIRE 0x10 /* EEPROM erast/write disable */
|
||||
|
||||
/* EEPROM Commands - SPI */
|
||||
#define EEPROM_MAX_RETRY_SPI 5000 /* Max wait of 5ms, for RDY signal */
|
||||
#define EEPROM_MAX_RETRY_SPI 5000 /* Max wait of 5ms, for RDY signal */
|
||||
#define EEPROM_READ_OPCODE_SPI 0x03 /* EEPROM read opcode */
|
||||
#define EEPROM_WRITE_OPCODE_SPI 0x02 /* EEPROM write opcode */
|
||||
#define EEPROM_A8_OPCODE_SPI 0x08 /* opcode bit-3 = address bit-8 */
|
||||
@@ -3082,10 +3084,10 @@ struct e1000_host_command_info {
|
||||
|
||||
/* DSP Distance Register (Page 5, Register 26) */
|
||||
#define GG82563_DSPD_CABLE_LENGTH 0x0007 /* 0 = <50M;
|
||||
1 = 50-80M;
|
||||
2 = 80-110M;
|
||||
3 = 110-140M;
|
||||
4 = >140M */
|
||||
1 = 50-80M;
|
||||
2 = 80-110M;
|
||||
3 = 110-140M;
|
||||
4 = >140M */
|
||||
|
||||
/* Kumeran Mode Control Register (Page 193, Register 16) */
|
||||
#define GG82563_KMCR_PHY_LEDS_EN 0x0020 /* 1=PHY LEDs, 0=Kumeran Inband LEDs */
|
||||
|
@@ -36,7 +36,7 @@ static char e1000_driver_string[] = "Intel(R) PRO/1000 Network Driver";
|
||||
#else
|
||||
#define DRIVERNAPI "-NAPI"
|
||||
#endif
|
||||
#define DRV_VERSION "7.1.9-k4"DRIVERNAPI
|
||||
#define DRV_VERSION "7.2.7-k2"DRIVERNAPI
|
||||
char e1000_driver_version[] = DRV_VERSION;
|
||||
static char e1000_copyright[] = "Copyright (c) 1999-2006 Intel Corporation.";
|
||||
|
||||
@@ -99,6 +99,7 @@ static struct pci_device_id e1000_pci_tbl[] = {
|
||||
INTEL_E1000_ETHERNET_DEVICE(0x1098),
|
||||
INTEL_E1000_ETHERNET_DEVICE(0x1099),
|
||||
INTEL_E1000_ETHERNET_DEVICE(0x109A),
|
||||
INTEL_E1000_ETHERNET_DEVICE(0x10A4),
|
||||
INTEL_E1000_ETHERNET_DEVICE(0x10B5),
|
||||
INTEL_E1000_ETHERNET_DEVICE(0x10B9),
|
||||
INTEL_E1000_ETHERNET_DEVICE(0x10BA),
|
||||
@@ -245,7 +246,7 @@ e1000_init_module(void)
|
||||
|
||||
printk(KERN_INFO "%s\n", e1000_copyright);
|
||||
|
||||
ret = pci_module_init(&e1000_driver);
|
||||
ret = pci_register_driver(&e1000_driver);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -485,7 +486,7 @@ e1000_up(struct e1000_adapter *adapter)
|
||||
*
|
||||
**/
|
||||
|
||||
static void e1000_power_up_phy(struct e1000_adapter *adapter)
|
||||
void e1000_power_up_phy(struct e1000_adapter *adapter)
|
||||
{
|
||||
uint16_t mii_reg = 0;
|
||||
|
||||
@@ -682,9 +683,9 @@ e1000_probe(struct pci_dev *pdev,
|
||||
unsigned long flash_start, flash_len;
|
||||
|
||||
static int cards_found = 0;
|
||||
static int e1000_ksp3_port_a = 0; /* global ksp3 port a indication */
|
||||
static int global_quad_port_a = 0; /* global ksp3 port a indication */
|
||||
int i, err, pci_using_dac;
|
||||
uint16_t eeprom_data;
|
||||
uint16_t eeprom_data = 0;
|
||||
uint16_t eeprom_apme_mask = E1000_EEPROM_APME;
|
||||
if ((err = pci_enable_device(pdev)))
|
||||
return err;
|
||||
@@ -696,21 +697,20 @@ e1000_probe(struct pci_dev *pdev,
|
||||
if ((err = pci_set_dma_mask(pdev, DMA_32BIT_MASK)) &&
|
||||
(err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK))) {
|
||||
E1000_ERR("No usable DMA configuration, aborting\n");
|
||||
return err;
|
||||
goto err_dma;
|
||||
}
|
||||
pci_using_dac = 0;
|
||||
}
|
||||
|
||||
if ((err = pci_request_regions(pdev, e1000_driver_name)))
|
||||
return err;
|
||||
goto err_pci_reg;
|
||||
|
||||
pci_set_master(pdev);
|
||||
|
||||
err = -ENOMEM;
|
||||
netdev = alloc_etherdev(sizeof(struct e1000_adapter));
|
||||
if (!netdev) {
|
||||
err = -ENOMEM;
|
||||
if (!netdev)
|
||||
goto err_alloc_etherdev;
|
||||
}
|
||||
|
||||
SET_MODULE_OWNER(netdev);
|
||||
SET_NETDEV_DEV(netdev, &pdev->dev);
|
||||
@@ -725,11 +725,10 @@ e1000_probe(struct pci_dev *pdev,
|
||||
mmio_start = pci_resource_start(pdev, BAR_0);
|
||||
mmio_len = pci_resource_len(pdev, BAR_0);
|
||||
|
||||
err = -EIO;
|
||||
adapter->hw.hw_addr = ioremap(mmio_start, mmio_len);
|
||||
if (!adapter->hw.hw_addr) {
|
||||
err = -EIO;
|
||||
if (!adapter->hw.hw_addr)
|
||||
goto err_ioremap;
|
||||
}
|
||||
|
||||
for (i = BAR_1; i <= BAR_5; i++) {
|
||||
if (pci_resource_len(pdev, i) == 0)
|
||||
@@ -774,6 +773,7 @@ e1000_probe(struct pci_dev *pdev,
|
||||
if ((err = e1000_sw_init(adapter)))
|
||||
goto err_sw_init;
|
||||
|
||||
err = -EIO;
|
||||
/* Flash BAR mapping must happen after e1000_sw_init
|
||||
* because it depends on mac_type */
|
||||
if ((adapter->hw.mac_type == e1000_ich8lan) &&
|
||||
@@ -781,24 +781,13 @@ e1000_probe(struct pci_dev *pdev,
|
||||
flash_start = pci_resource_start(pdev, 1);
|
||||
flash_len = pci_resource_len(pdev, 1);
|
||||
adapter->hw.flash_address = ioremap(flash_start, flash_len);
|
||||
if (!adapter->hw.flash_address) {
|
||||
err = -EIO;
|
||||
if (!adapter->hw.flash_address)
|
||||
goto err_flashmap;
|
||||
}
|
||||
}
|
||||
|
||||
if ((err = e1000_check_phy_reset_block(&adapter->hw)))
|
||||
if (e1000_check_phy_reset_block(&adapter->hw))
|
||||
DPRINTK(PROBE, INFO, "PHY reset is blocked due to SOL/IDER session.\n");
|
||||
|
||||
/* if ksp3, indicate if it's port a being setup */
|
||||
if (pdev->device == E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3 &&
|
||||
e1000_ksp3_port_a == 0)
|
||||
adapter->ksp3_port_a = 1;
|
||||
e1000_ksp3_port_a++;
|
||||
/* Reset for multiple KP3 adapters */
|
||||
if (e1000_ksp3_port_a == 4)
|
||||
e1000_ksp3_port_a = 0;
|
||||
|
||||
if (adapter->hw.mac_type >= e1000_82543) {
|
||||
netdev->features = NETIF_F_SG |
|
||||
NETIF_F_HW_CSUM |
|
||||
@@ -830,7 +819,7 @@ e1000_probe(struct pci_dev *pdev,
|
||||
|
||||
if (e1000_init_eeprom_params(&adapter->hw)) {
|
||||
E1000_ERR("EEPROM initialization failed\n");
|
||||
return -EIO;
|
||||
goto err_eeprom;
|
||||
}
|
||||
|
||||
/* before reading the EEPROM, reset the controller to
|
||||
@@ -842,7 +831,6 @@ e1000_probe(struct pci_dev *pdev,
|
||||
|
||||
if (e1000_validate_eeprom_checksum(&adapter->hw) < 0) {
|
||||
DPRINTK(PROBE, ERR, "The EEPROM Checksum Is Not Valid\n");
|
||||
err = -EIO;
|
||||
goto err_eeprom;
|
||||
}
|
||||
|
||||
@@ -855,12 +843,9 @@ e1000_probe(struct pci_dev *pdev,
|
||||
|
||||
if (!is_valid_ether_addr(netdev->perm_addr)) {
|
||||
DPRINTK(PROBE, ERR, "Invalid MAC Address\n");
|
||||
err = -EIO;
|
||||
goto err_eeprom;
|
||||
}
|
||||
|
||||
e1000_read_part_num(&adapter->hw, &(adapter->part_num));
|
||||
|
||||
e1000_get_bus_info(&adapter->hw);
|
||||
|
||||
init_timer(&adapter->tx_fifo_stall_timer);
|
||||
@@ -921,7 +906,38 @@ e1000_probe(struct pci_dev *pdev,
|
||||
break;
|
||||
}
|
||||
if (eeprom_data & eeprom_apme_mask)
|
||||
adapter->wol |= E1000_WUFC_MAG;
|
||||
adapter->eeprom_wol |= E1000_WUFC_MAG;
|
||||
|
||||
/* now that we have the eeprom settings, apply the special cases
|
||||
* where the eeprom may be wrong or the board simply won't support
|
||||
* wake on lan on a particular port */
|
||||
switch (pdev->device) {
|
||||
case E1000_DEV_ID_82546GB_PCIE:
|
||||
adapter->eeprom_wol = 0;
|
||||
break;
|
||||
case E1000_DEV_ID_82546EB_FIBER:
|
||||
case E1000_DEV_ID_82546GB_FIBER:
|
||||
case E1000_DEV_ID_82571EB_FIBER:
|
||||
/* Wake events only supported on port A for dual fiber
|
||||
* regardless of eeprom setting */
|
||||
if (E1000_READ_REG(&adapter->hw, STATUS) & E1000_STATUS_FUNC_1)
|
||||
adapter->eeprom_wol = 0;
|
||||
break;
|
||||
case E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3:
|
||||
case E1000_DEV_ID_82571EB_QUAD_COPPER:
|
||||
/* if quad port adapter, disable WoL on all but port A */
|
||||
if (global_quad_port_a != 0)
|
||||
adapter->eeprom_wol = 0;
|
||||
else
|
||||
adapter->quad_port_a = 1;
|
||||
/* Reset for multiple quad port adapters */
|
||||
if (++global_quad_port_a == 4)
|
||||
global_quad_port_a = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
/* initialize the wol settings based on the eeprom settings */
|
||||
adapter->wol = adapter->eeprom_wol;
|
||||
|
||||
/* print bus type/speed/width info */
|
||||
{
|
||||
@@ -964,16 +980,33 @@ e1000_probe(struct pci_dev *pdev,
|
||||
return 0;
|
||||
|
||||
err_register:
|
||||
e1000_release_hw_control(adapter);
|
||||
err_eeprom:
|
||||
if (!e1000_check_phy_reset_block(&adapter->hw))
|
||||
e1000_phy_hw_reset(&adapter->hw);
|
||||
|
||||
if (adapter->hw.flash_address)
|
||||
iounmap(adapter->hw.flash_address);
|
||||
err_flashmap:
|
||||
#ifdef CONFIG_E1000_NAPI
|
||||
for (i = 0; i < adapter->num_rx_queues; i++)
|
||||
dev_put(&adapter->polling_netdev[i]);
|
||||
#endif
|
||||
|
||||
kfree(adapter->tx_ring);
|
||||
kfree(adapter->rx_ring);
|
||||
#ifdef CONFIG_E1000_NAPI
|
||||
kfree(adapter->polling_netdev);
|
||||
#endif
|
||||
err_sw_init:
|
||||
err_eeprom:
|
||||
iounmap(adapter->hw.hw_addr);
|
||||
err_ioremap:
|
||||
free_netdev(netdev);
|
||||
err_alloc_etherdev:
|
||||
pci_release_regions(pdev);
|
||||
err_pci_reg:
|
||||
err_dma:
|
||||
pci_disable_device(pdev);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -1208,7 +1241,7 @@ e1000_open(struct net_device *netdev)
|
||||
|
||||
err = e1000_request_irq(adapter);
|
||||
if (err)
|
||||
goto err_up;
|
||||
goto err_req_irq;
|
||||
|
||||
e1000_power_up_phy(adapter);
|
||||
|
||||
@@ -1229,6 +1262,9 @@ e1000_open(struct net_device *netdev)
|
||||
return E1000_SUCCESS;
|
||||
|
||||
err_up:
|
||||
e1000_power_down_phy(adapter);
|
||||
e1000_free_irq(adapter);
|
||||
err_req_irq:
|
||||
e1000_free_all_rx_resources(adapter);
|
||||
err_setup_rx:
|
||||
e1000_free_all_tx_resources(adapter);
|
||||
@@ -1381,10 +1417,6 @@ setup_tx_desc_die:
|
||||
* (Descriptors) for all queues
|
||||
* @adapter: board private structure
|
||||
*
|
||||
* If this function returns with an error, then it's possible one or
|
||||
* more of the rings is populated (while the rest are not). It is the
|
||||
* callers duty to clean those orphaned rings.
|
||||
*
|
||||
* Return 0 on success, negative on failure
|
||||
**/
|
||||
|
||||
@@ -1398,6 +1430,9 @@ e1000_setup_all_tx_resources(struct e1000_adapter *adapter)
|
||||
if (err) {
|
||||
DPRINTK(PROBE, ERR,
|
||||
"Allocation for Tx Queue %u failed\n", i);
|
||||
for (i-- ; i >= 0; i--)
|
||||
e1000_free_tx_resources(adapter,
|
||||
&adapter->tx_ring[i]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -1499,8 +1534,6 @@ e1000_configure_tx(struct e1000_adapter *adapter)
|
||||
} else if (hw->mac_type == e1000_80003es2lan) {
|
||||
tarc = E1000_READ_REG(hw, TARC0);
|
||||
tarc |= 1;
|
||||
if (hw->media_type == e1000_media_type_internal_serdes)
|
||||
tarc |= (1 << 20);
|
||||
E1000_WRITE_REG(hw, TARC0, tarc);
|
||||
tarc = E1000_READ_REG(hw, TARC1);
|
||||
tarc |= 1;
|
||||
@@ -1639,10 +1672,6 @@ setup_rx_desc_die:
|
||||
* (Descriptors) for all queues
|
||||
* @adapter: board private structure
|
||||
*
|
||||
* If this function returns with an error, then it's possible one or
|
||||
* more of the rings is populated (while the rest are not). It is the
|
||||
* callers duty to clean those orphaned rings.
|
||||
*
|
||||
* Return 0 on success, negative on failure
|
||||
**/
|
||||
|
||||
@@ -1656,6 +1685,9 @@ e1000_setup_all_rx_resources(struct e1000_adapter *adapter)
|
||||
if (err) {
|
||||
DPRINTK(PROBE, ERR,
|
||||
"Allocation for Rx Queue %u failed\n", i);
|
||||
for (i-- ; i >= 0; i--)
|
||||
e1000_free_rx_resources(adapter,
|
||||
&adapter->rx_ring[i]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -2442,10 +2474,9 @@ e1000_watchdog(unsigned long data)
|
||||
* disable receives in the ISR and
|
||||
* reset device here in the watchdog
|
||||
*/
|
||||
if (adapter->hw.mac_type == e1000_80003es2lan) {
|
||||
if (adapter->hw.mac_type == e1000_80003es2lan)
|
||||
/* reset device */
|
||||
schedule_work(&adapter->reset_task);
|
||||
}
|
||||
}
|
||||
|
||||
e1000_smartspeed(adapter);
|
||||
@@ -2545,7 +2576,7 @@ e1000_tso(struct e1000_adapter *adapter, struct e1000_tx_ring *tx_ring,
|
||||
cmd_length = E1000_TXD_CMD_IP;
|
||||
ipcse = skb->h.raw - skb->data - 1;
|
||||
#ifdef NETIF_F_TSO_IPV6
|
||||
} else if (skb->protocol == ntohs(ETH_P_IPV6)) {
|
||||
} else if (skb->protocol == htons(ETH_P_IPV6)) {
|
||||
skb->nh.ipv6h->payload_len = 0;
|
||||
skb->h.th->check =
|
||||
~csum_ipv6_magic(&skb->nh.ipv6h->saddr,
|
||||
@@ -3680,7 +3711,7 @@ e1000_clean_rx_irq(struct e1000_adapter *adapter,
|
||||
E1000_DBG("%s: Receive packet consumed multiple"
|
||||
" buffers\n", netdev->name);
|
||||
/* recycle */
|
||||
buffer_info-> skb = skb;
|
||||
buffer_info->skb = skb;
|
||||
goto next_desc;
|
||||
}
|
||||
|
||||
@@ -3711,7 +3742,6 @@ e1000_clean_rx_irq(struct e1000_adapter *adapter,
|
||||
netdev_alloc_skb(netdev, length + NET_IP_ALIGN);
|
||||
if (new_skb) {
|
||||
skb_reserve(new_skb, NET_IP_ALIGN);
|
||||
new_skb->dev = netdev;
|
||||
memcpy(new_skb->data - NET_IP_ALIGN,
|
||||
skb->data - NET_IP_ALIGN,
|
||||
length + NET_IP_ALIGN);
|
||||
@@ -3978,13 +4008,13 @@ e1000_alloc_rx_buffers(struct e1000_adapter *adapter,
|
||||
buffer_info = &rx_ring->buffer_info[i];
|
||||
|
||||
while (cleaned_count--) {
|
||||
if (!(skb = buffer_info->skb))
|
||||
skb = netdev_alloc_skb(netdev, bufsz);
|
||||
else {
|
||||
skb = buffer_info->skb;
|
||||
if (skb) {
|
||||
skb_trim(skb, 0);
|
||||
goto map_skb;
|
||||
}
|
||||
|
||||
skb = netdev_alloc_skb(netdev, bufsz);
|
||||
if (unlikely(!skb)) {
|
||||
/* Better luck next round */
|
||||
adapter->alloc_rx_buff_failed++;
|
||||
@@ -4009,10 +4039,10 @@ e1000_alloc_rx_buffers(struct e1000_adapter *adapter,
|
||||
dev_kfree_skb(skb);
|
||||
dev_kfree_skb(oldskb);
|
||||
break; /* while !buffer_info->skb */
|
||||
} else {
|
||||
/* Use new allocation */
|
||||
dev_kfree_skb(oldskb);
|
||||
}
|
||||
|
||||
/* Use new allocation */
|
||||
dev_kfree_skb(oldskb);
|
||||
}
|
||||
/* Make buffer alignment 2 beyond a 16 byte boundary
|
||||
* this will result in a 16 byte aligned IP header after
|
||||
@@ -4020,8 +4050,6 @@ e1000_alloc_rx_buffers(struct e1000_adapter *adapter,
|
||||
*/
|
||||
skb_reserve(skb, NET_IP_ALIGN);
|
||||
|
||||
skb->dev = netdev;
|
||||
|
||||
buffer_info->skb = skb;
|
||||
buffer_info->length = adapter->rx_buffer_len;
|
||||
map_skb:
|
||||
@@ -4135,8 +4163,6 @@ e1000_alloc_rx_buffers_ps(struct e1000_adapter *adapter,
|
||||
*/
|
||||
skb_reserve(skb, NET_IP_ALIGN);
|
||||
|
||||
skb->dev = netdev;
|
||||
|
||||
buffer_info->skb = skb;
|
||||
buffer_info->length = adapter->rx_ps_bsize0;
|
||||
buffer_info->dma = pci_map_single(pdev, skb->data,
|
||||
@@ -4628,7 +4654,7 @@ e1000_suspend(struct pci_dev *pdev, pm_message_t state)
|
||||
e1000_set_multi(netdev);
|
||||
|
||||
/* turn on all-multi mode if wake on multicast is enabled */
|
||||
if (adapter->wol & E1000_WUFC_MC) {
|
||||
if (wufc & E1000_WUFC_MC) {
|
||||
rctl = E1000_READ_REG(&adapter->hw, RCTL);
|
||||
rctl |= E1000_RCTL_MPE;
|
||||
E1000_WRITE_REG(&adapter->hw, RCTL, rctl);
|
||||
@@ -4700,11 +4726,14 @@ e1000_resume(struct pci_dev *pdev)
|
||||
{
|
||||
struct net_device *netdev = pci_get_drvdata(pdev);
|
||||
struct e1000_adapter *adapter = netdev_priv(netdev);
|
||||
uint32_t manc, ret_val;
|
||||
uint32_t manc, err;
|
||||
|
||||
pci_set_power_state(pdev, PCI_D0);
|
||||
e1000_pci_restore_state(adapter);
|
||||
ret_val = pci_enable_device(pdev);
|
||||
if ((err = pci_enable_device(pdev))) {
|
||||
printk(KERN_ERR "e1000: Cannot enable PCI device from suspend\n");
|
||||
return err;
|
||||
}
|
||||
pci_set_master(pdev);
|
||||
|
||||
pci_enable_wake(pdev, PCI_D3hot, 0);
|
||||
@@ -4782,6 +4811,7 @@ static pci_ers_result_t e1000_io_error_detected(struct pci_dev *pdev, pci_channe
|
||||
|
||||
if (netif_running(netdev))
|
||||
e1000_down(adapter);
|
||||
pci_disable_device(pdev);
|
||||
|
||||
/* Request a slot slot reset. */
|
||||
return PCI_ERS_RESULT_NEED_RESET;
|
||||
|
@@ -42,25 +42,6 @@
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/sched.h>
|
||||
|
||||
#ifndef msec_delay
|
||||
#define msec_delay(x) do { if(in_interrupt()) { \
|
||||
/* Don't mdelay in interrupt context! */ \
|
||||
BUG(); \
|
||||
} else { \
|
||||
msleep(x); \
|
||||
} } while (0)
|
||||
|
||||
/* Some workarounds require millisecond delays and are run during interrupt
|
||||
* context. Most notably, when establishing link, the phy may need tweaking
|
||||
* but cannot process phy register reads/writes faster than millisecond
|
||||
* intervals...and we establish link due to a "link status change" interrupt.
|
||||
*/
|
||||
#define msec_delay_irq(x) mdelay(x)
|
||||
#endif
|
||||
|
||||
#define PCI_COMMAND_REGISTER PCI_COMMAND
|
||||
#define CMD_MEM_WRT_INVALIDATE PCI_COMMAND_INVALIDATE
|
||||
|
||||
typedef enum {
|
||||
#undef FALSE
|
||||
FALSE = 0,
|
||||
|
@@ -324,7 +324,6 @@ e1000_check_options(struct e1000_adapter *adapter)
|
||||
DPRINTK(PROBE, NOTICE,
|
||||
"Warning: no configuration for board #%i\n", bd);
|
||||
DPRINTK(PROBE, NOTICE, "Using defaults for all values\n");
|
||||
bd = E1000_MAX_NIC;
|
||||
}
|
||||
|
||||
{ /* Transmit Descriptor Count */
|
||||
@@ -342,9 +341,14 @@ e1000_check_options(struct e1000_adapter *adapter)
|
||||
opt.arg.r.max = mac_type < e1000_82544 ?
|
||||
E1000_MAX_TXD : E1000_MAX_82544_TXD;
|
||||
|
||||
tx_ring->count = TxDescriptors[bd];
|
||||
e1000_validate_option(&tx_ring->count, &opt, adapter);
|
||||
E1000_ROUNDUP(tx_ring->count, REQ_TX_DESCRIPTOR_MULTIPLE);
|
||||
if (num_TxDescriptors > bd) {
|
||||
tx_ring->count = TxDescriptors[bd];
|
||||
e1000_validate_option(&tx_ring->count, &opt, adapter);
|
||||
E1000_ROUNDUP(tx_ring->count,
|
||||
REQ_TX_DESCRIPTOR_MULTIPLE);
|
||||
} else {
|
||||
tx_ring->count = opt.def;
|
||||
}
|
||||
for (i = 0; i < adapter->num_tx_queues; i++)
|
||||
tx_ring[i].count = tx_ring->count;
|
||||
}
|
||||
@@ -363,9 +367,14 @@ e1000_check_options(struct e1000_adapter *adapter)
|
||||
opt.arg.r.max = mac_type < e1000_82544 ? E1000_MAX_RXD :
|
||||
E1000_MAX_82544_RXD;
|
||||
|
||||
rx_ring->count = RxDescriptors[bd];
|
||||
e1000_validate_option(&rx_ring->count, &opt, adapter);
|
||||
E1000_ROUNDUP(rx_ring->count, REQ_RX_DESCRIPTOR_MULTIPLE);
|
||||
if (num_RxDescriptors > bd) {
|
||||
rx_ring->count = RxDescriptors[bd];
|
||||
e1000_validate_option(&rx_ring->count, &opt, adapter);
|
||||
E1000_ROUNDUP(rx_ring->count,
|
||||
REQ_RX_DESCRIPTOR_MULTIPLE);
|
||||
} else {
|
||||
rx_ring->count = opt.def;
|
||||
}
|
||||
for (i = 0; i < adapter->num_rx_queues; i++)
|
||||
rx_ring[i].count = rx_ring->count;
|
||||
}
|
||||
@@ -377,9 +386,13 @@ e1000_check_options(struct e1000_adapter *adapter)
|
||||
.def = OPTION_ENABLED
|
||||
};
|
||||
|
||||
int rx_csum = XsumRX[bd];
|
||||
e1000_validate_option(&rx_csum, &opt, adapter);
|
||||
adapter->rx_csum = rx_csum;
|
||||
if (num_XsumRX > bd) {
|
||||
int rx_csum = XsumRX[bd];
|
||||
e1000_validate_option(&rx_csum, &opt, adapter);
|
||||
adapter->rx_csum = rx_csum;
|
||||
} else {
|
||||
adapter->rx_csum = opt.def;
|
||||
}
|
||||
}
|
||||
{ /* Flow Control */
|
||||
|
||||
@@ -399,9 +412,13 @@ e1000_check_options(struct e1000_adapter *adapter)
|
||||
.p = fc_list }}
|
||||
};
|
||||
|
||||
int fc = FlowControl[bd];
|
||||
e1000_validate_option(&fc, &opt, adapter);
|
||||
adapter->hw.fc = adapter->hw.original_fc = fc;
|
||||
if (num_FlowControl > bd) {
|
||||
int fc = FlowControl[bd];
|
||||
e1000_validate_option(&fc, &opt, adapter);
|
||||
adapter->hw.fc = adapter->hw.original_fc = fc;
|
||||
} else {
|
||||
adapter->hw.fc = adapter->hw.original_fc = opt.def;
|
||||
}
|
||||
}
|
||||
{ /* Transmit Interrupt Delay */
|
||||
struct e1000_option opt = {
|
||||
@@ -413,8 +430,13 @@ e1000_check_options(struct e1000_adapter *adapter)
|
||||
.max = MAX_TXDELAY }}
|
||||
};
|
||||
|
||||
adapter->tx_int_delay = TxIntDelay[bd];
|
||||
e1000_validate_option(&adapter->tx_int_delay, &opt, adapter);
|
||||
if (num_TxIntDelay > bd) {
|
||||
adapter->tx_int_delay = TxIntDelay[bd];
|
||||
e1000_validate_option(&adapter->tx_int_delay, &opt,
|
||||
adapter);
|
||||
} else {
|
||||
adapter->tx_int_delay = opt.def;
|
||||
}
|
||||
}
|
||||
{ /* Transmit Absolute Interrupt Delay */
|
||||
struct e1000_option opt = {
|
||||
@@ -426,9 +448,13 @@ e1000_check_options(struct e1000_adapter *adapter)
|
||||
.max = MAX_TXABSDELAY }}
|
||||
};
|
||||
|
||||
adapter->tx_abs_int_delay = TxAbsIntDelay[bd];
|
||||
e1000_validate_option(&adapter->tx_abs_int_delay, &opt,
|
||||
adapter);
|
||||
if (num_TxAbsIntDelay > bd) {
|
||||
adapter->tx_abs_int_delay = TxAbsIntDelay[bd];
|
||||
e1000_validate_option(&adapter->tx_abs_int_delay, &opt,
|
||||
adapter);
|
||||
} else {
|
||||
adapter->tx_abs_int_delay = opt.def;
|
||||
}
|
||||
}
|
||||
{ /* Receive Interrupt Delay */
|
||||
struct e1000_option opt = {
|
||||
@@ -440,8 +466,13 @@ e1000_check_options(struct e1000_adapter *adapter)
|
||||
.max = MAX_RXDELAY }}
|
||||
};
|
||||
|
||||
adapter->rx_int_delay = RxIntDelay[bd];
|
||||
e1000_validate_option(&adapter->rx_int_delay, &opt, adapter);
|
||||
if (num_RxIntDelay > bd) {
|
||||
adapter->rx_int_delay = RxIntDelay[bd];
|
||||
e1000_validate_option(&adapter->rx_int_delay, &opt,
|
||||
adapter);
|
||||
} else {
|
||||
adapter->rx_int_delay = opt.def;
|
||||
}
|
||||
}
|
||||
{ /* Receive Absolute Interrupt Delay */
|
||||
struct e1000_option opt = {
|
||||
@@ -453,9 +484,13 @@ e1000_check_options(struct e1000_adapter *adapter)
|
||||
.max = MAX_RXABSDELAY }}
|
||||
};
|
||||
|
||||
adapter->rx_abs_int_delay = RxAbsIntDelay[bd];
|
||||
e1000_validate_option(&adapter->rx_abs_int_delay, &opt,
|
||||
adapter);
|
||||
if (num_RxAbsIntDelay > bd) {
|
||||
adapter->rx_abs_int_delay = RxAbsIntDelay[bd];
|
||||
e1000_validate_option(&adapter->rx_abs_int_delay, &opt,
|
||||
adapter);
|
||||
} else {
|
||||
adapter->rx_abs_int_delay = opt.def;
|
||||
}
|
||||
}
|
||||
{ /* Interrupt Throttling Rate */
|
||||
struct e1000_option opt = {
|
||||
@@ -467,18 +502,24 @@ e1000_check_options(struct e1000_adapter *adapter)
|
||||
.max = MAX_ITR }}
|
||||
};
|
||||
|
||||
adapter->itr = InterruptThrottleRate[bd];
|
||||
switch (adapter->itr) {
|
||||
case 0:
|
||||
DPRINTK(PROBE, INFO, "%s turned off\n", opt.name);
|
||||
break;
|
||||
case 1:
|
||||
DPRINTK(PROBE, INFO, "%s set to dynamic mode\n",
|
||||
opt.name);
|
||||
break;
|
||||
default:
|
||||
e1000_validate_option(&adapter->itr, &opt, adapter);
|
||||
break;
|
||||
if (num_InterruptThrottleRate > bd) {
|
||||
adapter->itr = InterruptThrottleRate[bd];
|
||||
switch (adapter->itr) {
|
||||
case 0:
|
||||
DPRINTK(PROBE, INFO, "%s turned off\n",
|
||||
opt.name);
|
||||
break;
|
||||
case 1:
|
||||
DPRINTK(PROBE, INFO, "%s set to dynamic mode\n",
|
||||
opt.name);
|
||||
break;
|
||||
default:
|
||||
e1000_validate_option(&adapter->itr, &opt,
|
||||
adapter);
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
adapter->itr = opt.def;
|
||||
}
|
||||
}
|
||||
{ /* Smart Power Down */
|
||||
@@ -489,9 +530,13 @@ e1000_check_options(struct e1000_adapter *adapter)
|
||||
.def = OPTION_DISABLED
|
||||
};
|
||||
|
||||
int spd = SmartPowerDownEnable[bd];
|
||||
e1000_validate_option(&spd, &opt, adapter);
|
||||
adapter->smart_power_down = spd;
|
||||
if (num_SmartPowerDownEnable > bd) {
|
||||
int spd = SmartPowerDownEnable[bd];
|
||||
e1000_validate_option(&spd, &opt, adapter);
|
||||
adapter->smart_power_down = spd;
|
||||
} else {
|
||||
adapter->smart_power_down = opt.def;
|
||||
}
|
||||
}
|
||||
{ /* Kumeran Lock Loss Workaround */
|
||||
struct e1000_option opt = {
|
||||
@@ -501,9 +546,13 @@ e1000_check_options(struct e1000_adapter *adapter)
|
||||
.def = OPTION_ENABLED
|
||||
};
|
||||
|
||||
if (num_KumeranLockLoss > bd) {
|
||||
int kmrn_lock_loss = KumeranLockLoss[bd];
|
||||
e1000_validate_option(&kmrn_lock_loss, &opt, adapter);
|
||||
adapter->hw.kmrn_lock_loss_workaround_disabled = !kmrn_lock_loss;
|
||||
} else {
|
||||
adapter->hw.kmrn_lock_loss_workaround_disabled = !opt.def;
|
||||
}
|
||||
}
|
||||
|
||||
switch (adapter->hw.media_type) {
|
||||
@@ -530,18 +579,17 @@ static void __devinit
|
||||
e1000_check_fiber_options(struct e1000_adapter *adapter)
|
||||
{
|
||||
int bd = adapter->bd_number;
|
||||
bd = bd > E1000_MAX_NIC ? E1000_MAX_NIC : bd;
|
||||
if ((Speed[bd] != OPTION_UNSET)) {
|
||||
if (num_Speed > bd) {
|
||||
DPRINTK(PROBE, INFO, "Speed not valid for fiber adapters, "
|
||||
"parameter ignored\n");
|
||||
}
|
||||
|
||||
if ((Duplex[bd] != OPTION_UNSET)) {
|
||||
if (num_Duplex > bd) {
|
||||
DPRINTK(PROBE, INFO, "Duplex not valid for fiber adapters, "
|
||||
"parameter ignored\n");
|
||||
}
|
||||
|
||||
if ((AutoNeg[bd] != OPTION_UNSET) && (AutoNeg[bd] != 0x20)) {
|
||||
if ((num_AutoNeg > bd) && (AutoNeg[bd] != 0x20)) {
|
||||
DPRINTK(PROBE, INFO, "AutoNeg other than 1000/Full is "
|
||||
"not valid for fiber adapters, "
|
||||
"parameter ignored\n");
|
||||
@@ -560,7 +608,6 @@ e1000_check_copper_options(struct e1000_adapter *adapter)
|
||||
{
|
||||
int speed, dplx, an;
|
||||
int bd = adapter->bd_number;
|
||||
bd = bd > E1000_MAX_NIC ? E1000_MAX_NIC : bd;
|
||||
|
||||
{ /* Speed */
|
||||
struct e1000_opt_list speed_list[] = {{ 0, "" },
|
||||
@@ -577,8 +624,12 @@ e1000_check_copper_options(struct e1000_adapter *adapter)
|
||||
.p = speed_list }}
|
||||
};
|
||||
|
||||
speed = Speed[bd];
|
||||
e1000_validate_option(&speed, &opt, adapter);
|
||||
if (num_Speed > bd) {
|
||||
speed = Speed[bd];
|
||||
e1000_validate_option(&speed, &opt, adapter);
|
||||
} else {
|
||||
speed = opt.def;
|
||||
}
|
||||
}
|
||||
{ /* Duplex */
|
||||
struct e1000_opt_list dplx_list[] = {{ 0, "" },
|
||||
@@ -600,11 +651,15 @@ e1000_check_copper_options(struct e1000_adapter *adapter)
|
||||
"Speed/Duplex/AutoNeg parameter ignored.\n");
|
||||
return;
|
||||
}
|
||||
dplx = Duplex[bd];
|
||||
e1000_validate_option(&dplx, &opt, adapter);
|
||||
if (num_Duplex > bd) {
|
||||
dplx = Duplex[bd];
|
||||
e1000_validate_option(&dplx, &opt, adapter);
|
||||
} else {
|
||||
dplx = opt.def;
|
||||
}
|
||||
}
|
||||
|
||||
if (AutoNeg[bd] != OPTION_UNSET && (speed != 0 || dplx != 0)) {
|
||||
if ((num_AutoNeg > bd) && (speed != 0 || dplx != 0)) {
|
||||
DPRINTK(PROBE, INFO,
|
||||
"AutoNeg specified along with Speed or Duplex, "
|
||||
"parameter ignored\n");
|
||||
@@ -653,15 +708,19 @@ e1000_check_copper_options(struct e1000_adapter *adapter)
|
||||
.p = an_list }}
|
||||
};
|
||||
|
||||
an = AutoNeg[bd];
|
||||
e1000_validate_option(&an, &opt, adapter);
|
||||
if (num_AutoNeg > bd) {
|
||||
an = AutoNeg[bd];
|
||||
e1000_validate_option(&an, &opt, adapter);
|
||||
} else {
|
||||
an = opt.def;
|
||||
}
|
||||
adapter->hw.autoneg_advertised = an;
|
||||
}
|
||||
|
||||
switch (speed + dplx) {
|
||||
case 0:
|
||||
adapter->hw.autoneg = adapter->fc_autoneg = 1;
|
||||
if (Speed[bd] != OPTION_UNSET || Duplex[bd] != OPTION_UNSET)
|
||||
if ((num_Speed > bd) && (speed != 0 || dplx != 0))
|
||||
DPRINTK(PROBE, INFO,
|
||||
"Speed and duplex autonegotiation enabled\n");
|
||||
break;
|
||||
|
Reference in New Issue
Block a user