forked from Minki/linux
Merge branch 'e1000-7.0.38-k4' of git://lost.foo-projects.org/~ahkok/git/netdev-2.6 into upstream
This commit is contained in:
commit
bdad69b23c
@ -1,7 +1,7 @@
|
|||||||
################################################################################
|
################################################################################
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
# Copyright(c) 1999 - 2003 Intel Corporation. All rights reserved.
|
# Copyright(c) 1999 - 2006 Intel Corporation. All rights reserved.
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify it
|
# This program is free software; you can redistribute it and/or modify it
|
||||||
# under the terms of the GNU General Public License as published by the Free
|
# under the terms of the GNU General Public License as published by the Free
|
||||||
|
@ -865,15 +865,15 @@ static int
|
|||||||
e1000_intr_test(struct e1000_adapter *adapter, uint64_t *data)
|
e1000_intr_test(struct e1000_adapter *adapter, uint64_t *data)
|
||||||
{
|
{
|
||||||
struct net_device *netdev = adapter->netdev;
|
struct net_device *netdev = adapter->netdev;
|
||||||
uint32_t mask, i=0, shared_int = TRUE;
|
uint32_t mask, i=0, shared_int = TRUE;
|
||||||
uint32_t irq = adapter->pdev->irq;
|
uint32_t irq = adapter->pdev->irq;
|
||||||
|
|
||||||
*data = 0;
|
*data = 0;
|
||||||
|
|
||||||
/* Hook up test interrupt handler just for this test */
|
/* Hook up test interrupt handler just for this test */
|
||||||
if (!request_irq(irq, &e1000_test_intr, 0, netdev->name, netdev)) {
|
if (!request_irq(irq, &e1000_test_intr, 0, netdev->name, netdev)) {
|
||||||
shared_int = FALSE;
|
shared_int = FALSE;
|
||||||
} else if (request_irq(irq, &e1000_test_intr, SA_SHIRQ,
|
} else if (request_irq(irq, &e1000_test_intr, SA_SHIRQ,
|
||||||
netdev->name, netdev)){
|
netdev->name, netdev)){
|
||||||
*data = 1;
|
*data = 1;
|
||||||
return -1;
|
return -1;
|
||||||
@ -889,22 +889,22 @@ e1000_intr_test(struct e1000_adapter *adapter, uint64_t *data)
|
|||||||
/* Interrupt to test */
|
/* Interrupt to test */
|
||||||
mask = 1 << i;
|
mask = 1 << i;
|
||||||
|
|
||||||
if (!shared_int) {
|
if (!shared_int) {
|
||||||
/* Disable the interrupt to be reported in
|
/* Disable the interrupt to be reported in
|
||||||
* the cause register and then force the same
|
* the cause register and then force the same
|
||||||
* interrupt and see if one gets posted. If
|
* interrupt and see if one gets posted. If
|
||||||
* an interrupt was posted to the bus, the
|
* an interrupt was posted to the bus, the
|
||||||
* test failed.
|
* test failed.
|
||||||
*/
|
*/
|
||||||
adapter->test_icr = 0;
|
adapter->test_icr = 0;
|
||||||
E1000_WRITE_REG(&adapter->hw, IMC, mask);
|
E1000_WRITE_REG(&adapter->hw, IMC, mask);
|
||||||
E1000_WRITE_REG(&adapter->hw, ICS, mask);
|
E1000_WRITE_REG(&adapter->hw, ICS, mask);
|
||||||
msec_delay(10);
|
msec_delay(10);
|
||||||
|
|
||||||
if (adapter->test_icr & mask) {
|
if (adapter->test_icr & mask) {
|
||||||
*data = 3;
|
*data = 3;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Enable the interrupt to be reported in
|
/* Enable the interrupt to be reported in
|
||||||
@ -923,7 +923,7 @@ e1000_intr_test(struct e1000_adapter *adapter, uint64_t *data)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!shared_int) {
|
if (!shared_int) {
|
||||||
/* Disable the other interrupts to be reported in
|
/* Disable the other interrupts to be reported in
|
||||||
* the cause register and then force the other
|
* the cause register and then force the other
|
||||||
* interrupts and see if any get posted. If
|
* interrupts and see if any get posted. If
|
||||||
|
@ -765,7 +765,7 @@ e1000_init_hw(struct e1000_hw *hw)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (hw->mac_type == e1000_82573) {
|
if (hw->mac_type == e1000_82573) {
|
||||||
e1000_enable_tx_pkt_filtering(hw);
|
e1000_enable_tx_pkt_filtering(hw);
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (hw->mac_type) {
|
switch (hw->mac_type) {
|
||||||
@ -861,7 +861,7 @@ e1000_adjust_serdes_amplitude(struct e1000_hw *hw)
|
|||||||
|
|
||||||
if(eeprom_data != EEPROM_RESERVED_WORD) {
|
if(eeprom_data != EEPROM_RESERVED_WORD) {
|
||||||
/* Adjust SERDES output amplitude only. */
|
/* Adjust SERDES output amplitude only. */
|
||||||
eeprom_data &= EEPROM_SERDES_AMPLITUDE_MASK;
|
eeprom_data &= EEPROM_SERDES_AMPLITUDE_MASK;
|
||||||
ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_EXT_CTRL, eeprom_data);
|
ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_EXT_CTRL, eeprom_data);
|
||||||
if(ret_val)
|
if(ret_val)
|
||||||
return ret_val;
|
return ret_val;
|
||||||
@ -1228,7 +1228,7 @@ e1000_copper_link_igp_setup(struct e1000_hw *hw)
|
|||||||
|
|
||||||
if (hw->phy_reset_disable)
|
if (hw->phy_reset_disable)
|
||||||
return E1000_SUCCESS;
|
return E1000_SUCCESS;
|
||||||
|
|
||||||
ret_val = e1000_phy_reset(hw);
|
ret_val = e1000_phy_reset(hw);
|
||||||
if (ret_val) {
|
if (ret_val) {
|
||||||
DEBUGOUT("Error Resetting the PHY\n");
|
DEBUGOUT("Error Resetting the PHY\n");
|
||||||
@ -1370,7 +1370,7 @@ e1000_copper_link_ggp_setup(struct e1000_hw *hw)
|
|||||||
DEBUGFUNC("e1000_copper_link_ggp_setup");
|
DEBUGFUNC("e1000_copper_link_ggp_setup");
|
||||||
|
|
||||||
if(!hw->phy_reset_disable) {
|
if(!hw->phy_reset_disable) {
|
||||||
|
|
||||||
/* Enable CRS on TX for half-duplex operation. */
|
/* Enable CRS on TX for half-duplex operation. */
|
||||||
ret_val = e1000_read_phy_reg(hw, GG82563_PHY_MAC_SPEC_CTRL,
|
ret_val = e1000_read_phy_reg(hw, GG82563_PHY_MAC_SPEC_CTRL,
|
||||||
&phy_data);
|
&phy_data);
|
||||||
@ -1519,7 +1519,7 @@ e1000_copper_link_mgp_setup(struct e1000_hw *hw)
|
|||||||
|
|
||||||
if(hw->phy_reset_disable)
|
if(hw->phy_reset_disable)
|
||||||
return E1000_SUCCESS;
|
return E1000_SUCCESS;
|
||||||
|
|
||||||
/* Enable CRS on TX. This must be set for half-duplex operation. */
|
/* Enable CRS on TX. This must be set for half-duplex operation. */
|
||||||
ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_data);
|
ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_data);
|
||||||
if(ret_val)
|
if(ret_val)
|
||||||
@ -1665,7 +1665,7 @@ e1000_copper_link_autoneg(struct e1000_hw *hw)
|
|||||||
* collision distance in the Transmit Control Register.
|
* collision distance in the Transmit Control Register.
|
||||||
* 2) Set up flow control on the MAC to that established with
|
* 2) Set up flow control on the MAC to that established with
|
||||||
* the link partner.
|
* the link partner.
|
||||||
* 3) Config DSP to improve Gigabit link quality for some PHY revisions.
|
* 3) Config DSP to improve Gigabit link quality for some PHY revisions.
|
||||||
*
|
*
|
||||||
* hw - Struct containing variables accessed by shared code
|
* hw - Struct containing variables accessed by shared code
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
@ -1674,7 +1674,7 @@ e1000_copper_link_postconfig(struct e1000_hw *hw)
|
|||||||
{
|
{
|
||||||
int32_t ret_val;
|
int32_t ret_val;
|
||||||
DEBUGFUNC("e1000_copper_link_postconfig");
|
DEBUGFUNC("e1000_copper_link_postconfig");
|
||||||
|
|
||||||
if(hw->mac_type >= e1000_82544) {
|
if(hw->mac_type >= e1000_82544) {
|
||||||
e1000_config_collision_dist(hw);
|
e1000_config_collision_dist(hw);
|
||||||
} else {
|
} else {
|
||||||
@ -1698,7 +1698,7 @@ e1000_copper_link_postconfig(struct e1000_hw *hw)
|
|||||||
return ret_val;
|
return ret_val;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return E1000_SUCCESS;
|
return E1000_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1754,11 +1754,11 @@ e1000_setup_copper_link(struct e1000_hw *hw)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(hw->autoneg) {
|
if(hw->autoneg) {
|
||||||
/* Setup autoneg and flow control advertisement
|
/* Setup autoneg and flow control advertisement
|
||||||
* and perform autonegotiation */
|
* and perform autonegotiation */
|
||||||
ret_val = e1000_copper_link_autoneg(hw);
|
ret_val = e1000_copper_link_autoneg(hw);
|
||||||
if(ret_val)
|
if(ret_val)
|
||||||
return ret_val;
|
return ret_val;
|
||||||
} else {
|
} else {
|
||||||
/* PHY will be set to 10H, 10F, 100H,or 100F
|
/* PHY will be set to 10H, 10F, 100H,or 100F
|
||||||
* depending on value from forced_speed_duplex. */
|
* depending on value from forced_speed_duplex. */
|
||||||
@ -1786,7 +1786,7 @@ e1000_setup_copper_link(struct e1000_hw *hw)
|
|||||||
ret_val = e1000_copper_link_postconfig(hw);
|
ret_val = e1000_copper_link_postconfig(hw);
|
||||||
if(ret_val)
|
if(ret_val)
|
||||||
return ret_val;
|
return ret_val;
|
||||||
|
|
||||||
DEBUGOUT("Valid link established!!!\n");
|
DEBUGOUT("Valid link established!!!\n");
|
||||||
return E1000_SUCCESS;
|
return E1000_SUCCESS;
|
||||||
}
|
}
|
||||||
@ -1984,7 +1984,7 @@ e1000_phy_setup_autoneg(struct e1000_hw *hw)
|
|||||||
|
|
||||||
DEBUGOUT1("Auto-Neg Advertising %x\n", mii_autoneg_adv_reg);
|
DEBUGOUT1("Auto-Neg Advertising %x\n", mii_autoneg_adv_reg);
|
||||||
|
|
||||||
ret_val = e1000_write_phy_reg(hw, PHY_1000T_CTRL, mii_1000t_ctrl_reg);
|
ret_val = e1000_write_phy_reg(hw, PHY_1000T_CTRL, mii_1000t_ctrl_reg);
|
||||||
if(ret_val)
|
if(ret_val)
|
||||||
return ret_val;
|
return ret_val;
|
||||||
|
|
||||||
@ -2273,7 +2273,7 @@ e1000_config_mac_to_phy(struct e1000_hw *hw)
|
|||||||
|
|
||||||
DEBUGFUNC("e1000_config_mac_to_phy");
|
DEBUGFUNC("e1000_config_mac_to_phy");
|
||||||
|
|
||||||
/* 82544 or newer MAC, Auto Speed Detection takes care of
|
/* 82544 or newer MAC, Auto Speed Detection takes care of
|
||||||
* MAC speed/duplex configuration.*/
|
* MAC speed/duplex configuration.*/
|
||||||
if (hw->mac_type >= e1000_82544)
|
if (hw->mac_type >= e1000_82544)
|
||||||
return E1000_SUCCESS;
|
return E1000_SUCCESS;
|
||||||
@ -2292,9 +2292,9 @@ e1000_config_mac_to_phy(struct e1000_hw *hw)
|
|||||||
if(ret_val)
|
if(ret_val)
|
||||||
return ret_val;
|
return ret_val;
|
||||||
|
|
||||||
if(phy_data & M88E1000_PSSR_DPLX)
|
if(phy_data & M88E1000_PSSR_DPLX)
|
||||||
ctrl |= E1000_CTRL_FD;
|
ctrl |= E1000_CTRL_FD;
|
||||||
else
|
else
|
||||||
ctrl &= ~E1000_CTRL_FD;
|
ctrl &= ~E1000_CTRL_FD;
|
||||||
|
|
||||||
e1000_config_collision_dist(hw);
|
e1000_config_collision_dist(hw);
|
||||||
@ -2493,10 +2493,10 @@ e1000_config_fc_after_link_up(struct e1000_hw *hw)
|
|||||||
*/
|
*/
|
||||||
if(hw->original_fc == e1000_fc_full) {
|
if(hw->original_fc == e1000_fc_full) {
|
||||||
hw->fc = e1000_fc_full;
|
hw->fc = e1000_fc_full;
|
||||||
DEBUGOUT("Flow Control = FULL.\r\n");
|
DEBUGOUT("Flow Control = FULL.\n");
|
||||||
} else {
|
} else {
|
||||||
hw->fc = e1000_fc_rx_pause;
|
hw->fc = e1000_fc_rx_pause;
|
||||||
DEBUGOUT("Flow Control = RX PAUSE frames only.\r\n");
|
DEBUGOUT("Flow Control = RX PAUSE frames only.\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* For receiving PAUSE frames ONLY.
|
/* For receiving PAUSE frames ONLY.
|
||||||
@ -2512,7 +2512,7 @@ e1000_config_fc_after_link_up(struct e1000_hw *hw)
|
|||||||
(mii_nway_lp_ability_reg & NWAY_LPAR_PAUSE) &&
|
(mii_nway_lp_ability_reg & NWAY_LPAR_PAUSE) &&
|
||||||
(mii_nway_lp_ability_reg & NWAY_LPAR_ASM_DIR)) {
|
(mii_nway_lp_ability_reg & NWAY_LPAR_ASM_DIR)) {
|
||||||
hw->fc = e1000_fc_tx_pause;
|
hw->fc = e1000_fc_tx_pause;
|
||||||
DEBUGOUT("Flow Control = TX PAUSE frames only.\r\n");
|
DEBUGOUT("Flow Control = TX PAUSE frames only.\n");
|
||||||
}
|
}
|
||||||
/* For transmitting PAUSE frames ONLY.
|
/* For transmitting PAUSE frames ONLY.
|
||||||
*
|
*
|
||||||
@ -2527,7 +2527,7 @@ e1000_config_fc_after_link_up(struct e1000_hw *hw)
|
|||||||
!(mii_nway_lp_ability_reg & NWAY_LPAR_PAUSE) &&
|
!(mii_nway_lp_ability_reg & NWAY_LPAR_PAUSE) &&
|
||||||
(mii_nway_lp_ability_reg & NWAY_LPAR_ASM_DIR)) {
|
(mii_nway_lp_ability_reg & NWAY_LPAR_ASM_DIR)) {
|
||||||
hw->fc = e1000_fc_rx_pause;
|
hw->fc = e1000_fc_rx_pause;
|
||||||
DEBUGOUT("Flow Control = RX PAUSE frames only.\r\n");
|
DEBUGOUT("Flow Control = RX PAUSE frames only.\n");
|
||||||
}
|
}
|
||||||
/* Per the IEEE spec, at this point flow control should be
|
/* Per the IEEE spec, at this point flow control should be
|
||||||
* disabled. However, we want to consider that we could
|
* disabled. However, we want to consider that we could
|
||||||
@ -2553,10 +2553,10 @@ e1000_config_fc_after_link_up(struct e1000_hw *hw)
|
|||||||
hw->original_fc == e1000_fc_tx_pause) ||
|
hw->original_fc == e1000_fc_tx_pause) ||
|
||||||
hw->fc_strict_ieee) {
|
hw->fc_strict_ieee) {
|
||||||
hw->fc = e1000_fc_none;
|
hw->fc = e1000_fc_none;
|
||||||
DEBUGOUT("Flow Control = NONE.\r\n");
|
DEBUGOUT("Flow Control = NONE.\n");
|
||||||
} else {
|
} else {
|
||||||
hw->fc = e1000_fc_rx_pause;
|
hw->fc = e1000_fc_rx_pause;
|
||||||
DEBUGOUT("Flow Control = RX PAUSE frames only.\r\n");
|
DEBUGOUT("Flow Control = RX PAUSE frames only.\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Now we need to do one last check... If we auto-
|
/* Now we need to do one last check... If we auto-
|
||||||
@ -2581,7 +2581,7 @@ e1000_config_fc_after_link_up(struct e1000_hw *hw)
|
|||||||
return ret_val;
|
return ret_val;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
DEBUGOUT("Copper PHY and Auto Neg has not completed.\r\n");
|
DEBUGOUT("Copper PHY and Auto Neg has not completed.\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return E1000_SUCCESS;
|
return E1000_SUCCESS;
|
||||||
@ -2764,7 +2764,7 @@ e1000_check_for_link(struct e1000_hw *hw)
|
|||||||
hw->autoneg_failed = 1;
|
hw->autoneg_failed = 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
DEBUGOUT("NOT RXing /C/, disable AutoNeg and force link.\r\n");
|
DEBUGOUT("NOT RXing /C/, disable AutoNeg and force link.\n");
|
||||||
|
|
||||||
/* Disable auto-negotiation in the TXCW register */
|
/* Disable auto-negotiation in the TXCW register */
|
||||||
E1000_WRITE_REG(hw, TXCW, (hw->txcw & ~E1000_TXCW_ANE));
|
E1000_WRITE_REG(hw, TXCW, (hw->txcw & ~E1000_TXCW_ANE));
|
||||||
@ -2789,7 +2789,7 @@ e1000_check_for_link(struct e1000_hw *hw)
|
|||||||
else if(((hw->media_type == e1000_media_type_fiber) ||
|
else if(((hw->media_type == e1000_media_type_fiber) ||
|
||||||
(hw->media_type == e1000_media_type_internal_serdes)) &&
|
(hw->media_type == e1000_media_type_internal_serdes)) &&
|
||||||
(ctrl & E1000_CTRL_SLU) && (rxcw & E1000_RXCW_C)) {
|
(ctrl & E1000_CTRL_SLU) && (rxcw & E1000_RXCW_C)) {
|
||||||
DEBUGOUT("RXing /C/, enable AutoNeg and stop forcing link.\r\n");
|
DEBUGOUT("RXing /C/, enable AutoNeg and stop forcing link.\n");
|
||||||
E1000_WRITE_REG(hw, TXCW, hw->txcw);
|
E1000_WRITE_REG(hw, TXCW, hw->txcw);
|
||||||
E1000_WRITE_REG(hw, CTRL, (ctrl & ~E1000_CTRL_SLU));
|
E1000_WRITE_REG(hw, CTRL, (ctrl & ~E1000_CTRL_SLU));
|
||||||
|
|
||||||
@ -2852,13 +2852,13 @@ e1000_get_speed_and_duplex(struct e1000_hw *hw,
|
|||||||
|
|
||||||
if(status & E1000_STATUS_FD) {
|
if(status & E1000_STATUS_FD) {
|
||||||
*duplex = FULL_DUPLEX;
|
*duplex = FULL_DUPLEX;
|
||||||
DEBUGOUT("Full Duplex\r\n");
|
DEBUGOUT("Full Duplex\n");
|
||||||
} else {
|
} else {
|
||||||
*duplex = HALF_DUPLEX;
|
*duplex = HALF_DUPLEX;
|
||||||
DEBUGOUT(" Half Duplex\r\n");
|
DEBUGOUT(" Half Duplex\n");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
DEBUGOUT("1000 Mbs, Full Duplex\r\n");
|
DEBUGOUT("1000 Mbs, Full Duplex\n");
|
||||||
*speed = SPEED_1000;
|
*speed = SPEED_1000;
|
||||||
*duplex = FULL_DUPLEX;
|
*duplex = FULL_DUPLEX;
|
||||||
}
|
}
|
||||||
@ -2884,7 +2884,7 @@ e1000_get_speed_and_duplex(struct e1000_hw *hw,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((hw->mac_type == e1000_80003es2lan) &&
|
if ((hw->mac_type == e1000_80003es2lan) &&
|
||||||
(hw->media_type == e1000_media_type_copper)) {
|
(hw->media_type == e1000_media_type_copper)) {
|
||||||
if (*speed == SPEED_1000)
|
if (*speed == SPEED_1000)
|
||||||
ret_val = e1000_configure_kmrn_for_1000(hw);
|
ret_val = e1000_configure_kmrn_for_1000(hw);
|
||||||
@ -3160,7 +3160,7 @@ e1000_read_phy_reg(struct e1000_hw *hw,
|
|||||||
if (e1000_swfw_sync_acquire(hw, swfw))
|
if (e1000_swfw_sync_acquire(hw, swfw))
|
||||||
return -E1000_ERR_SWFW_SYNC;
|
return -E1000_ERR_SWFW_SYNC;
|
||||||
|
|
||||||
if((hw->phy_type == e1000_phy_igp ||
|
if((hw->phy_type == e1000_phy_igp ||
|
||||||
hw->phy_type == e1000_phy_igp_2) &&
|
hw->phy_type == e1000_phy_igp_2) &&
|
||||||
(reg_addr > MAX_PHY_MULTI_PAGE_REG)) {
|
(reg_addr > MAX_PHY_MULTI_PAGE_REG)) {
|
||||||
ret_val = e1000_write_phy_reg_ex(hw, IGP01E1000_PHY_PAGE_SELECT,
|
ret_val = e1000_write_phy_reg_ex(hw, IGP01E1000_PHY_PAGE_SELECT,
|
||||||
@ -3299,7 +3299,7 @@ e1000_write_phy_reg(struct e1000_hw *hw,
|
|||||||
if (e1000_swfw_sync_acquire(hw, swfw))
|
if (e1000_swfw_sync_acquire(hw, swfw))
|
||||||
return -E1000_ERR_SWFW_SYNC;
|
return -E1000_ERR_SWFW_SYNC;
|
||||||
|
|
||||||
if((hw->phy_type == e1000_phy_igp ||
|
if((hw->phy_type == e1000_phy_igp ||
|
||||||
hw->phy_type == e1000_phy_igp_2) &&
|
hw->phy_type == e1000_phy_igp_2) &&
|
||||||
(reg_addr > MAX_PHY_MULTI_PAGE_REG)) {
|
(reg_addr > MAX_PHY_MULTI_PAGE_REG)) {
|
||||||
ret_val = e1000_write_phy_reg_ex(hw, IGP01E1000_PHY_PAGE_SELECT,
|
ret_val = e1000_write_phy_reg_ex(hw, IGP01E1000_PHY_PAGE_SELECT,
|
||||||
@ -3497,22 +3497,22 @@ e1000_phy_hw_reset(struct e1000_hw *hw)
|
|||||||
}
|
}
|
||||||
/* Read the device control register and assert the E1000_CTRL_PHY_RST
|
/* Read the device control register and assert the E1000_CTRL_PHY_RST
|
||||||
* bit. Then, take it out of reset.
|
* bit. Then, take it out of reset.
|
||||||
* For pre-e1000_82571 hardware, we delay for 10ms between the assert
|
* For pre-e1000_82571 hardware, we delay for 10ms between the assert
|
||||||
* and deassert. For e1000_82571 hardware and later, we instead delay
|
* and deassert. For e1000_82571 hardware and later, we instead delay
|
||||||
* for 50us between and 10ms after the deassertion.
|
* for 50us between and 10ms after the deassertion.
|
||||||
*/
|
*/
|
||||||
ctrl = E1000_READ_REG(hw, CTRL);
|
ctrl = E1000_READ_REG(hw, CTRL);
|
||||||
E1000_WRITE_REG(hw, CTRL, ctrl | E1000_CTRL_PHY_RST);
|
E1000_WRITE_REG(hw, CTRL, ctrl | E1000_CTRL_PHY_RST);
|
||||||
E1000_WRITE_FLUSH(hw);
|
E1000_WRITE_FLUSH(hw);
|
||||||
|
|
||||||
if (hw->mac_type < e1000_82571)
|
if (hw->mac_type < e1000_82571)
|
||||||
msec_delay(10);
|
msec_delay(10);
|
||||||
else
|
else
|
||||||
udelay(100);
|
udelay(100);
|
||||||
|
|
||||||
E1000_WRITE_REG(hw, CTRL, ctrl);
|
E1000_WRITE_REG(hw, CTRL, ctrl);
|
||||||
E1000_WRITE_FLUSH(hw);
|
E1000_WRITE_FLUSH(hw);
|
||||||
|
|
||||||
if (hw->mac_type >= e1000_82571)
|
if (hw->mac_type >= e1000_82571)
|
||||||
msec_delay(10);
|
msec_delay(10);
|
||||||
e1000_swfw_sync_release(hw, swfw);
|
e1000_swfw_sync_release(hw, swfw);
|
||||||
@ -3816,7 +3816,7 @@ e1000_phy_m88_get_info(struct e1000_hw *hw,
|
|||||||
/* Check polarity status */
|
/* Check polarity status */
|
||||||
ret_val = e1000_check_polarity(hw, &polarity);
|
ret_val = e1000_check_polarity(hw, &polarity);
|
||||||
if(ret_val)
|
if(ret_val)
|
||||||
return ret_val;
|
return ret_val;
|
||||||
phy_info->cable_polarity = polarity;
|
phy_info->cable_polarity = polarity;
|
||||||
|
|
||||||
ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS, &phy_data);
|
ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS, &phy_data);
|
||||||
@ -4541,14 +4541,14 @@ e1000_read_eeprom_eerd(struct e1000_hw *hw,
|
|||||||
|
|
||||||
E1000_WRITE_REG(hw, EERD, eerd);
|
E1000_WRITE_REG(hw, EERD, eerd);
|
||||||
error = e1000_poll_eerd_eewr_done(hw, E1000_EEPROM_POLL_READ);
|
error = e1000_poll_eerd_eewr_done(hw, E1000_EEPROM_POLL_READ);
|
||||||
|
|
||||||
if(error) {
|
if(error) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
data[i] = (E1000_READ_REG(hw, EERD) >> E1000_EEPROM_RW_REG_DATA);
|
data[i] = (E1000_READ_REG(hw, EERD) >> E1000_EEPROM_RW_REG_DATA);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4574,24 +4574,24 @@ e1000_write_eeprom_eewr(struct e1000_hw *hw,
|
|||||||
return -E1000_ERR_SWFW_SYNC;
|
return -E1000_ERR_SWFW_SYNC;
|
||||||
|
|
||||||
for (i = 0; i < words; i++) {
|
for (i = 0; i < words; i++) {
|
||||||
register_value = (data[i] << E1000_EEPROM_RW_REG_DATA) |
|
register_value = (data[i] << E1000_EEPROM_RW_REG_DATA) |
|
||||||
((offset+i) << E1000_EEPROM_RW_ADDR_SHIFT) |
|
((offset+i) << E1000_EEPROM_RW_ADDR_SHIFT) |
|
||||||
E1000_EEPROM_RW_REG_START;
|
E1000_EEPROM_RW_REG_START;
|
||||||
|
|
||||||
error = e1000_poll_eerd_eewr_done(hw, E1000_EEPROM_POLL_WRITE);
|
error = e1000_poll_eerd_eewr_done(hw, E1000_EEPROM_POLL_WRITE);
|
||||||
if(error) {
|
if(error) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
E1000_WRITE_REG(hw, EEWR, register_value);
|
E1000_WRITE_REG(hw, EEWR, register_value);
|
||||||
|
|
||||||
error = e1000_poll_eerd_eewr_done(hw, E1000_EEPROM_POLL_WRITE);
|
error = e1000_poll_eerd_eewr_done(hw, E1000_EEPROM_POLL_WRITE);
|
||||||
|
|
||||||
if(error) {
|
if(error) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
e1000_swfw_sync_release(hw, E1000_SWFW_EEP_SM);
|
e1000_swfw_sync_release(hw, E1000_SWFW_EEP_SM);
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
@ -4611,7 +4611,7 @@ e1000_poll_eerd_eewr_done(struct e1000_hw *hw, int eerd)
|
|||||||
for(i = 0; i < attempts; i++) {
|
for(i = 0; i < attempts; i++) {
|
||||||
if(eerd == E1000_EEPROM_POLL_READ)
|
if(eerd == E1000_EEPROM_POLL_READ)
|
||||||
reg = E1000_READ_REG(hw, EERD);
|
reg = E1000_READ_REG(hw, EERD);
|
||||||
else
|
else
|
||||||
reg = E1000_READ_REG(hw, EEWR);
|
reg = E1000_READ_REG(hw, EEWR);
|
||||||
|
|
||||||
if(reg & E1000_EEPROM_RW_REG_DONE) {
|
if(reg & E1000_EEPROM_RW_REG_DONE) {
|
||||||
@ -5136,7 +5136,7 @@ e1000_mc_addr_list_update(struct e1000_hw *hw,
|
|||||||
uint32_t i;
|
uint32_t i;
|
||||||
uint32_t num_rar_entry;
|
uint32_t num_rar_entry;
|
||||||
uint32_t num_mta_entry;
|
uint32_t num_mta_entry;
|
||||||
|
|
||||||
DEBUGFUNC("e1000_mc_addr_list_update");
|
DEBUGFUNC("e1000_mc_addr_list_update");
|
||||||
|
|
||||||
/* Set the new number of MC addresses that we are being requested to use. */
|
/* Set the new number of MC addresses that we are being requested to use. */
|
||||||
@ -6241,7 +6241,7 @@ e1000_check_polarity(struct e1000_hw *hw,
|
|||||||
* 1 - Downshift ocured.
|
* 1 - Downshift ocured.
|
||||||
*
|
*
|
||||||
* returns: - E1000_ERR_XXX
|
* returns: - E1000_ERR_XXX
|
||||||
* E1000_SUCCESS
|
* E1000_SUCCESS
|
||||||
*
|
*
|
||||||
* For phy's older then IGP, this function reads the Downshift bit in the Phy
|
* For phy's older then IGP, this function reads the Downshift bit in the Phy
|
||||||
* Specific Status register. For IGP phy's, it reads the Downgrade bit in the
|
* Specific Status register. For IGP phy's, it reads the Downgrade bit in the
|
||||||
@ -6256,7 +6256,7 @@ e1000_check_downshift(struct e1000_hw *hw)
|
|||||||
|
|
||||||
DEBUGFUNC("e1000_check_downshift");
|
DEBUGFUNC("e1000_check_downshift");
|
||||||
|
|
||||||
if(hw->phy_type == e1000_phy_igp ||
|
if(hw->phy_type == e1000_phy_igp ||
|
||||||
hw->phy_type == e1000_phy_igp_2) {
|
hw->phy_type == e1000_phy_igp_2) {
|
||||||
ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_LINK_HEALTH,
|
ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_LINK_HEALTH,
|
||||||
&phy_data);
|
&phy_data);
|
||||||
@ -6685,8 +6685,8 @@ e1000_set_d0_lplu_state(struct e1000_hw *hw,
|
|||||||
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
phy_data |= IGP02E1000_PM_D0_LPLU;
|
phy_data |= IGP02E1000_PM_D0_LPLU;
|
||||||
ret_val = e1000_write_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT, phy_data);
|
ret_val = e1000_write_phy_reg(hw, IGP02E1000_PHY_POWER_MGMT, phy_data);
|
||||||
if (ret_val)
|
if (ret_val)
|
||||||
return ret_val;
|
return ret_val;
|
||||||
@ -6778,7 +6778,7 @@ int32_t
|
|||||||
e1000_host_if_read_cookie(struct e1000_hw * hw, uint8_t *buffer)
|
e1000_host_if_read_cookie(struct e1000_hw * hw, uint8_t *buffer)
|
||||||
{
|
{
|
||||||
uint8_t i;
|
uint8_t i;
|
||||||
uint32_t offset = E1000_MNG_DHCP_COOKIE_OFFSET;
|
uint32_t offset = E1000_MNG_DHCP_COOKIE_OFFSET;
|
||||||
uint8_t length = E1000_MNG_DHCP_COOKIE_LENGTH;
|
uint8_t length = E1000_MNG_DHCP_COOKIE_LENGTH;
|
||||||
|
|
||||||
length = (length >> 2);
|
length = (length >> 2);
|
||||||
@ -6797,7 +6797,7 @@ e1000_host_if_read_cookie(struct e1000_hw * hw, uint8_t *buffer)
|
|||||||
* and also checks whether the previous command is completed.
|
* and also checks whether the previous command is completed.
|
||||||
* It busy waits in case of previous command is not completed.
|
* It busy waits in case of previous command is not completed.
|
||||||
*
|
*
|
||||||
* returns: - E1000_ERR_HOST_INTERFACE_COMMAND in case if is not ready or
|
* returns: - E1000_ERR_HOST_INTERFACE_COMMAND in case if is not ready or
|
||||||
* timeout
|
* timeout
|
||||||
* - E1000_SUCCESS for success.
|
* - E1000_SUCCESS for success.
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
@ -6821,7 +6821,7 @@ e1000_mng_enable_host_if(struct e1000_hw * hw)
|
|||||||
msec_delay_irq(1);
|
msec_delay_irq(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i == E1000_MNG_DHCP_COMMAND_TIMEOUT) {
|
if (i == E1000_MNG_DHCP_COMMAND_TIMEOUT) {
|
||||||
DEBUGOUT("Previous command timeout failed .\n");
|
DEBUGOUT("Previous command timeout failed .\n");
|
||||||
return -E1000_ERR_HOST_INTERFACE_COMMAND;
|
return -E1000_ERR_HOST_INTERFACE_COMMAND;
|
||||||
}
|
}
|
||||||
|
@ -375,7 +375,7 @@ struct e1000_host_mng_dhcp_cookie{
|
|||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int32_t e1000_mng_write_dhcp_info(struct e1000_hw *hw, uint8_t *buffer,
|
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_check_mng_mode(struct e1000_hw *hw);
|
||||||
boolean_t e1000_enable_tx_pkt_filtering(struct e1000_hw *hw);
|
boolean_t e1000_enable_tx_pkt_filtering(struct e1000_hw *hw);
|
||||||
@ -1802,7 +1802,7 @@ struct e1000_hw {
|
|||||||
* value2 = [0..64512], default=4096
|
* value2 = [0..64512], default=4096
|
||||||
* value3 = [0..64512], default=0
|
* value3 = [0..64512], default=0
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define E1000_PSRCTL_BSIZE0_MASK 0x0000007F
|
#define E1000_PSRCTL_BSIZE0_MASK 0x0000007F
|
||||||
#define E1000_PSRCTL_BSIZE1_MASK 0x00003F00
|
#define E1000_PSRCTL_BSIZE1_MASK 0x00003F00
|
||||||
#define E1000_PSRCTL_BSIZE2_MASK 0x003F0000
|
#define E1000_PSRCTL_BSIZE2_MASK 0x003F0000
|
||||||
|
@ -29,45 +29,6 @@
|
|||||||
|
|
||||||
#include "e1000.h"
|
#include "e1000.h"
|
||||||
|
|
||||||
/* Change Log
|
|
||||||
* 7.0.33 3-Feb-2006
|
|
||||||
* o Added another fix for the pass false carrier bit
|
|
||||||
* 7.0.32 24-Jan-2006
|
|
||||||
* o Need to rebuild with noew version number for the pass false carrier
|
|
||||||
* fix in e1000_hw.c
|
|
||||||
* 7.0.30 18-Jan-2006
|
|
||||||
* o fixup for tso workaround to disable it for pci-x
|
|
||||||
* o fix mem leak on 82542
|
|
||||||
* o fixes for 10 Mb/s connections and incorrect stats
|
|
||||||
* 7.0.28 01/06/2006
|
|
||||||
* o hardware workaround to only set "speed mode" bit for 1G link.
|
|
||||||
* 7.0.26 12/23/2005
|
|
||||||
* o wake on lan support modified for device ID 10B5
|
|
||||||
* o fix dhcp + vlan issue not making it to the iAMT firmware
|
|
||||||
* 7.0.24 12/9/2005
|
|
||||||
* o New hardware support for the Gigabit NIC embedded in the south bridge
|
|
||||||
* o Fixes to the recycling logic (skb->tail) from IBM LTC
|
|
||||||
* 6.3.9 12/16/2005
|
|
||||||
* o incorporate fix for recycled skbs from IBM LTC
|
|
||||||
* 6.3.7 11/18/2005
|
|
||||||
* o Honor eeprom setting for enabling/disabling Wake On Lan
|
|
||||||
* 6.3.5 11/17/2005
|
|
||||||
* o Fix memory leak in rx ring handling for PCI Express adapters
|
|
||||||
* 6.3.4 11/8/05
|
|
||||||
* o Patch from Jesper Juhl to remove redundant NULL checks for kfree
|
|
||||||
* 6.3.2 9/20/05
|
|
||||||
* o Render logic that sets/resets DRV_LOAD as inline functions to
|
|
||||||
* avoid code replication. If f/w is AMT then set DRV_LOAD only when
|
|
||||||
* network interface is open.
|
|
||||||
* o Handle DRV_LOAD set/reset in cases where AMT uses VLANs.
|
|
||||||
* o Adjust PBA partioning for Jumbo frames using MTU size and not
|
|
||||||
* rx_buffer_len
|
|
||||||
* 6.3.1 9/19/05
|
|
||||||
* o Use adapter->tx_timeout_factor in Tx Hung Detect logic
|
|
||||||
* (e1000_clean_tx_irq)
|
|
||||||
* o Support for 8086:10B5 device (Quad Port)
|
|
||||||
*/
|
|
||||||
|
|
||||||
char e1000_driver_name[] = "e1000";
|
char e1000_driver_name[] = "e1000";
|
||||||
static char e1000_driver_string[] = "Intel(R) PRO/1000 Network Driver";
|
static char e1000_driver_string[] = "Intel(R) PRO/1000 Network Driver";
|
||||||
#ifndef CONFIG_E1000_NAPI
|
#ifndef CONFIG_E1000_NAPI
|
||||||
@ -75,7 +36,7 @@ static char e1000_driver_string[] = "Intel(R) PRO/1000 Network Driver";
|
|||||||
#else
|
#else
|
||||||
#define DRIVERNAPI "-NAPI"
|
#define DRIVERNAPI "-NAPI"
|
||||||
#endif
|
#endif
|
||||||
#define DRV_VERSION "7.0.38-k2"DRIVERNAPI
|
#define DRV_VERSION "7.0.38-k4"DRIVERNAPI
|
||||||
char e1000_driver_version[] = DRV_VERSION;
|
char e1000_driver_version[] = DRV_VERSION;
|
||||||
static char e1000_copyright[] = "Copyright (c) 1999-2006 Intel Corporation.";
|
static char e1000_copyright[] = "Copyright (c) 1999-2006 Intel Corporation.";
|
||||||
|
|
||||||
@ -221,6 +182,7 @@ static void e1000_restore_vlan(struct e1000_adapter *adapter);
|
|||||||
static int e1000_suspend(struct pci_dev *pdev, pm_message_t state);
|
static int e1000_suspend(struct pci_dev *pdev, pm_message_t state);
|
||||||
static int e1000_resume(struct pci_dev *pdev);
|
static int e1000_resume(struct pci_dev *pdev);
|
||||||
#endif
|
#endif
|
||||||
|
static void e1000_shutdown(struct pci_dev *pdev);
|
||||||
|
|
||||||
#ifdef CONFIG_NET_POLL_CONTROLLER
|
#ifdef CONFIG_NET_POLL_CONTROLLER
|
||||||
/* for netdump / net console */
|
/* for netdump / net console */
|
||||||
@ -236,8 +198,9 @@ static struct pci_driver e1000_driver = {
|
|||||||
/* Power Managment Hooks */
|
/* Power Managment Hooks */
|
||||||
#ifdef CONFIG_PM
|
#ifdef CONFIG_PM
|
||||||
.suspend = e1000_suspend,
|
.suspend = e1000_suspend,
|
||||||
.resume = e1000_resume
|
.resume = e1000_resume,
|
||||||
#endif
|
#endif
|
||||||
|
.shutdown = e1000_shutdown
|
||||||
};
|
};
|
||||||
|
|
||||||
MODULE_AUTHOR("Intel Corporation, <linux.nics@intel.com>");
|
MODULE_AUTHOR("Intel Corporation, <linux.nics@intel.com>");
|
||||||
@ -347,7 +310,7 @@ e1000_update_mng_vlan(struct e1000_adapter *adapter)
|
|||||||
* For ASF and Pass Through versions of f/w this means that the
|
* For ASF and Pass Through versions of f/w this means that the
|
||||||
* driver is no longer loaded. For AMT version (only with 82573) i
|
* driver is no longer loaded. For AMT version (only with 82573) i
|
||||||
* of the f/w this means that the netowrk i/f is closed.
|
* of the f/w this means that the netowrk i/f is closed.
|
||||||
*
|
*
|
||||||
**/
|
**/
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -379,10 +342,10 @@ e1000_release_hw_control(struct e1000_adapter *adapter)
|
|||||||
* @adapter: address of board private structure
|
* @adapter: address of board private structure
|
||||||
*
|
*
|
||||||
* e1000_get_hw_control sets {CTRL_EXT|FWSM}:DRV_LOAD bit.
|
* e1000_get_hw_control sets {CTRL_EXT|FWSM}:DRV_LOAD bit.
|
||||||
* For ASF and Pass Through versions of f/w this means that
|
* For ASF and Pass Through versions of f/w this means that
|
||||||
* the driver is loaded. For AMT version (only with 82573)
|
* the driver is loaded. For AMT version (only with 82573)
|
||||||
* of the f/w this means that the netowrk i/f is open.
|
* of the f/w this means that the netowrk i/f is open.
|
||||||
*
|
*
|
||||||
**/
|
**/
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -712,8 +675,8 @@ e1000_probe(struct pci_dev *pdev,
|
|||||||
DPRINTK(PROBE, INFO, "PHY reset is blocked due to SOL/IDER session.\n");
|
DPRINTK(PROBE, INFO, "PHY reset is blocked due to SOL/IDER session.\n");
|
||||||
|
|
||||||
/* if ksp3, indicate if it's port a being setup */
|
/* if ksp3, indicate if it's port a being setup */
|
||||||
if (pdev->device == E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3 &&
|
if (pdev->device == E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3 &&
|
||||||
e1000_ksp3_port_a == 0)
|
e1000_ksp3_port_a == 0)
|
||||||
adapter->ksp3_port_a = 1;
|
adapter->ksp3_port_a = 1;
|
||||||
e1000_ksp3_port_a++;
|
e1000_ksp3_port_a++;
|
||||||
/* Reset for multiple KP3 adapters */
|
/* Reset for multiple KP3 adapters */
|
||||||
@ -741,9 +704,9 @@ e1000_probe(struct pci_dev *pdev,
|
|||||||
if (pci_using_dac)
|
if (pci_using_dac)
|
||||||
netdev->features |= NETIF_F_HIGHDMA;
|
netdev->features |= NETIF_F_HIGHDMA;
|
||||||
|
|
||||||
/* hard_start_xmit is safe against parallel locking */
|
/* hard_start_xmit is safe against parallel locking */
|
||||||
netdev->features |= NETIF_F_LLTX;
|
netdev->features |= NETIF_F_LLTX;
|
||||||
|
|
||||||
adapter->en_mng_pt = e1000_enable_mng_pass_thru(&adapter->hw);
|
adapter->en_mng_pt = e1000_enable_mng_pass_thru(&adapter->hw);
|
||||||
|
|
||||||
/* before reading the EEPROM, reset the controller to
|
/* before reading the EEPROM, reset the controller to
|
||||||
@ -2771,7 +2734,7 @@ e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
|
|||||||
unsigned int nr_frags = 0;
|
unsigned int nr_frags = 0;
|
||||||
unsigned int mss = 0;
|
unsigned int mss = 0;
|
||||||
int count = 0;
|
int count = 0;
|
||||||
int tso;
|
int tso;
|
||||||
unsigned int f;
|
unsigned int f;
|
||||||
len -= skb->data_len;
|
len -= skb->data_len;
|
||||||
|
|
||||||
@ -2784,7 +2747,7 @@ e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
|
|||||||
|
|
||||||
#ifdef NETIF_F_TSO
|
#ifdef NETIF_F_TSO
|
||||||
mss = skb_shinfo(skb)->tso_size;
|
mss = skb_shinfo(skb)->tso_size;
|
||||||
/* The controller does a simple calculation to
|
/* The controller does a simple calculation to
|
||||||
* make sure there is enough room in the FIFO before
|
* make sure there is enough room in the FIFO before
|
||||||
* initiating the DMA for each buffer. The calc is:
|
* initiating the DMA for each buffer. The calc is:
|
||||||
* 4 = ceil(buffer len/mss). To make sure we don't
|
* 4 = ceil(buffer len/mss). To make sure we don't
|
||||||
@ -2807,7 +2770,7 @@ e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
|
|||||||
case e1000_82573:
|
case e1000_82573:
|
||||||
pull_size = min((unsigned int)4, skb->data_len);
|
pull_size = min((unsigned int)4, skb->data_len);
|
||||||
if (!__pskb_pull_tail(skb, pull_size)) {
|
if (!__pskb_pull_tail(skb, pull_size)) {
|
||||||
printk(KERN_ERR
|
printk(KERN_ERR
|
||||||
"__pskb_pull_tail failed.\n");
|
"__pskb_pull_tail failed.\n");
|
||||||
dev_kfree_skb_any(skb);
|
dev_kfree_skb_any(skb);
|
||||||
return NETDEV_TX_OK;
|
return NETDEV_TX_OK;
|
||||||
@ -3753,7 +3716,7 @@ e1000_clean_rx_irq_ps(struct e1000_adapter *adapter,
|
|||||||
* throughput, so unsplit small packets and save the alloc/put*/
|
* throughput, so unsplit small packets and save the alloc/put*/
|
||||||
if (l1 && ((length + l1) <= adapter->rx_ps_bsize0)) {
|
if (l1 && ((length + l1) <= adapter->rx_ps_bsize0)) {
|
||||||
u8 *vaddr;
|
u8 *vaddr;
|
||||||
/* there is no documentation about how to call
|
/* there is no documentation about how to call
|
||||||
* kmap_atomic, so we can't hold the mapping
|
* kmap_atomic, so we can't hold the mapping
|
||||||
* very long */
|
* very long */
|
||||||
pci_dma_sync_single_for_cpu(pdev,
|
pci_dma_sync_single_for_cpu(pdev,
|
||||||
@ -4605,6 +4568,12 @@ e1000_resume(struct pci_dev *pdev)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static void e1000_shutdown(struct pci_dev *pdev)
|
||||||
|
{
|
||||||
|
e1000_suspend(pdev, PMSG_SUSPEND);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_NET_POLL_CONTROLLER
|
#ifdef CONFIG_NET_POLL_CONTROLLER
|
||||||
/*
|
/*
|
||||||
* Polling 'interrupt' - used by things like netconsole to send skbs
|
* Polling 'interrupt' - used by things like netconsole to send skbs
|
||||||
|
Loading…
Reference in New Issue
Block a user