Merge branch 'upstream' of git://lost.foo-projects.org/~ahkok/git/netdev-2.6 into upstream
Conflicts: drivers/net/e1000/e1000_main.c
This commit is contained in:
commit
c0bc8721b8
7 changed files with 2519 additions and 390 deletions
|
@ -68,7 +68,6 @@
|
|||
#ifdef NETIF_F_TSO
|
||||
#include <net/checksum.h>
|
||||
#endif
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/mii.h>
|
||||
#include <linux/ethtool.h>
|
||||
#include <linux/if_vlan.h>
|
||||
|
@ -143,6 +142,7 @@ struct e1000_adapter;
|
|||
|
||||
#define AUTO_ALL_MODES 0
|
||||
#define E1000_EEPROM_82544_APM 0x0004
|
||||
#define E1000_EEPROM_ICH8_APME 0x0004
|
||||
#define E1000_EEPROM_APME 0x0400
|
||||
|
||||
#ifndef E1000_MASTER_SLAVE
|
||||
|
@ -254,7 +254,6 @@ struct e1000_adapter {
|
|||
spinlock_t tx_queue_lock;
|
||||
#endif
|
||||
atomic_t irq_sem;
|
||||
struct work_struct watchdog_task;
|
||||
struct work_struct reset_task;
|
||||
uint8_t fc_autoneg;
|
||||
|
||||
|
@ -339,8 +338,14 @@ struct e1000_adapter {
|
|||
#ifdef NETIF_F_TSO
|
||||
boolean_t tso_force;
|
||||
#endif
|
||||
boolean_t smart_power_down; /* phy smart power down */
|
||||
unsigned long flags;
|
||||
};
|
||||
|
||||
enum e1000_state_t {
|
||||
__E1000_DRIVER_TESTING,
|
||||
__E1000_RESETTING,
|
||||
};
|
||||
|
||||
/* e1000_main.c */
|
||||
extern char e1000_driver_name[];
|
||||
|
@ -348,6 +353,7 @@ extern char e1000_driver_version[];
|
|||
int e1000_up(struct e1000_adapter *adapter);
|
||||
void e1000_down(struct e1000_adapter *adapter);
|
||||
void e1000_reset(struct e1000_adapter *adapter);
|
||||
void e1000_reinit_locked(struct e1000_adapter *adapter);
|
||||
int e1000_setup_all_tx_resources(struct e1000_adapter *adapter);
|
||||
void e1000_free_all_tx_resources(struct e1000_adapter *adapter);
|
||||
int e1000_setup_all_rx_resources(struct e1000_adapter *adapter);
|
||||
|
|
|
@ -109,7 +109,8 @@ e1000_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd)
|
|||
SUPPORTED_1000baseT_Full|
|
||||
SUPPORTED_Autoneg |
|
||||
SUPPORTED_TP);
|
||||
|
||||
if (hw->phy_type == e1000_phy_ife)
|
||||
ecmd->supported &= ~SUPPORTED_1000baseT_Full;
|
||||
ecmd->advertising = ADVERTISED_TP;
|
||||
|
||||
if (hw->autoneg == 1) {
|
||||
|
@ -203,11 +204,9 @@ e1000_set_settings(struct net_device *netdev, struct ethtool_cmd *ecmd)
|
|||
|
||||
/* reset the link */
|
||||
|
||||
if (netif_running(adapter->netdev)) {
|
||||
e1000_down(adapter);
|
||||
e1000_reset(adapter);
|
||||
e1000_up(adapter);
|
||||
} else
|
||||
if (netif_running(adapter->netdev))
|
||||
e1000_reinit_locked(adapter);
|
||||
else
|
||||
e1000_reset(adapter);
|
||||
|
||||
return 0;
|
||||
|
@ -254,10 +253,9 @@ e1000_set_pauseparam(struct net_device *netdev,
|
|||
hw->original_fc = hw->fc;
|
||||
|
||||
if (adapter->fc_autoneg == AUTONEG_ENABLE) {
|
||||
if (netif_running(adapter->netdev)) {
|
||||
e1000_down(adapter);
|
||||
e1000_up(adapter);
|
||||
} else
|
||||
if (netif_running(adapter->netdev))
|
||||
e1000_reinit_locked(adapter);
|
||||
else
|
||||
e1000_reset(adapter);
|
||||
} else
|
||||
return ((hw->media_type == e1000_media_type_fiber) ?
|
||||
|
@ -279,10 +277,9 @@ e1000_set_rx_csum(struct net_device *netdev, uint32_t data)
|
|||
struct e1000_adapter *adapter = netdev_priv(netdev);
|
||||
adapter->rx_csum = data;
|
||||
|
||||
if (netif_running(netdev)) {
|
||||
e1000_down(adapter);
|
||||
e1000_up(adapter);
|
||||
} else
|
||||
if (netif_running(netdev))
|
||||
e1000_reinit_locked(adapter);
|
||||
else
|
||||
e1000_reset(adapter);
|
||||
return 0;
|
||||
}
|
||||
|
@ -577,6 +574,7 @@ e1000_get_drvinfo(struct net_device *netdev,
|
|||
case e1000_82572:
|
||||
case e1000_82573:
|
||||
case e1000_80003es2lan:
|
||||
case e1000_ich8lan:
|
||||
sprintf(firmware_version, "%d.%d-%d",
|
||||
(eeprom_data & 0xF000) >> 12,
|
||||
(eeprom_data & 0x0FF0) >> 4,
|
||||
|
@ -631,6 +629,9 @@ e1000_set_ringparam(struct net_device *netdev,
|
|||
tx_ring_size = sizeof(struct e1000_tx_ring) * adapter->num_tx_queues;
|
||||
rx_ring_size = sizeof(struct e1000_rx_ring) * adapter->num_rx_queues;
|
||||
|
||||
while (test_and_set_bit(__E1000_RESETTING, &adapter->flags))
|
||||
msleep(1);
|
||||
|
||||
if (netif_running(adapter->netdev))
|
||||
e1000_down(adapter);
|
||||
|
||||
|
@ -691,9 +692,11 @@ e1000_set_ringparam(struct net_device *netdev,
|
|||
adapter->rx_ring = rx_new;
|
||||
adapter->tx_ring = tx_new;
|
||||
if ((err = e1000_up(adapter)))
|
||||
return err;
|
||||
goto err_setup;
|
||||
}
|
||||
|
||||
clear_bit(__E1000_RESETTING, &adapter->flags);
|
||||
|
||||
return 0;
|
||||
err_setup_tx:
|
||||
e1000_free_all_rx_resources(adapter);
|
||||
|
@ -701,6 +704,8 @@ e1000_set_ringparam(struct net_device *netdev,
|
|||
adapter->rx_ring = rx_old;
|
||||
adapter->tx_ring = tx_old;
|
||||
e1000_up(adapter);
|
||||
err_setup:
|
||||
clear_bit(__E1000_RESETTING, &adapter->flags);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
@ -754,6 +759,7 @@ e1000_reg_test(struct e1000_adapter *adapter, uint64_t *data)
|
|||
toggle = 0x7FFFF3FF;
|
||||
break;
|
||||
case e1000_82573:
|
||||
case e1000_ich8lan:
|
||||
toggle = 0x7FFFF033;
|
||||
break;
|
||||
default:
|
||||
|
@ -773,11 +779,12 @@ e1000_reg_test(struct e1000_adapter *adapter, uint64_t *data)
|
|||
}
|
||||
/* restore previous status */
|
||||
E1000_WRITE_REG(&adapter->hw, STATUS, before);
|
||||
|
||||
REG_PATTERN_TEST(FCAL, 0xFFFFFFFF, 0xFFFFFFFF);
|
||||
REG_PATTERN_TEST(FCAH, 0x0000FFFF, 0xFFFFFFFF);
|
||||
REG_PATTERN_TEST(FCT, 0x0000FFFF, 0xFFFFFFFF);
|
||||
REG_PATTERN_TEST(VET, 0x0000FFFF, 0xFFFFFFFF);
|
||||
if (adapter->hw.mac_type != e1000_ich8lan) {
|
||||
REG_PATTERN_TEST(FCAL, 0xFFFFFFFF, 0xFFFFFFFF);
|
||||
REG_PATTERN_TEST(FCAH, 0x0000FFFF, 0xFFFFFFFF);
|
||||
REG_PATTERN_TEST(FCT, 0x0000FFFF, 0xFFFFFFFF);
|
||||
REG_PATTERN_TEST(VET, 0x0000FFFF, 0xFFFFFFFF);
|
||||
}
|
||||
REG_PATTERN_TEST(RDTR, 0x0000FFFF, 0xFFFFFFFF);
|
||||
REG_PATTERN_TEST(RDBAH, 0xFFFFFFFF, 0xFFFFFFFF);
|
||||
REG_PATTERN_TEST(RDLEN, 0x000FFF80, 0x000FFFFF);
|
||||
|
@ -790,20 +797,22 @@ e1000_reg_test(struct e1000_adapter *adapter, uint64_t *data)
|
|||
REG_PATTERN_TEST(TDLEN, 0x000FFF80, 0x000FFFFF);
|
||||
|
||||
REG_SET_AND_CHECK(RCTL, 0xFFFFFFFF, 0x00000000);
|
||||
REG_SET_AND_CHECK(RCTL, 0x06DFB3FE, 0x003FFFFB);
|
||||
before = (adapter->hw.mac_type == e1000_ich8lan ?
|
||||
0x06C3B33E : 0x06DFB3FE);
|
||||
REG_SET_AND_CHECK(RCTL, before, 0x003FFFFB);
|
||||
REG_SET_AND_CHECK(TCTL, 0xFFFFFFFF, 0x00000000);
|
||||
|
||||
if (adapter->hw.mac_type >= e1000_82543) {
|
||||
|
||||
REG_SET_AND_CHECK(RCTL, 0x06DFB3FE, 0xFFFFFFFF);
|
||||
REG_SET_AND_CHECK(RCTL, before, 0xFFFFFFFF);
|
||||
REG_PATTERN_TEST(RDBAL, 0xFFFFFFF0, 0xFFFFFFFF);
|
||||
REG_PATTERN_TEST(TXCW, 0xC000FFFF, 0x0000FFFF);
|
||||
if (adapter->hw.mac_type != e1000_ich8lan)
|
||||
REG_PATTERN_TEST(TXCW, 0xC000FFFF, 0x0000FFFF);
|
||||
REG_PATTERN_TEST(TDBAL, 0xFFFFFFF0, 0xFFFFFFFF);
|
||||
REG_PATTERN_TEST(TIDV, 0x0000FFFF, 0x0000FFFF);
|
||||
|
||||
for (i = 0; i < E1000_RAR_ENTRIES; i++) {
|
||||
REG_PATTERN_TEST(RA + ((i << 1) << 2), 0xFFFFFFFF,
|
||||
0xFFFFFFFF);
|
||||
value = (adapter->hw.mac_type == e1000_ich8lan ?
|
||||
E1000_RAR_ENTRIES_ICH8LAN : E1000_RAR_ENTRIES);
|
||||
for (i = 0; i < value; i++) {
|
||||
REG_PATTERN_TEST(RA + (((i << 1) + 1) << 2), 0x8003FFFF,
|
||||
0xFFFFFFFF);
|
||||
}
|
||||
|
@ -817,7 +826,9 @@ e1000_reg_test(struct e1000_adapter *adapter, uint64_t *data)
|
|||
|
||||
}
|
||||
|
||||
for (i = 0; i < E1000_MC_TBL_SIZE; i++)
|
||||
value = (adapter->hw.mac_type == e1000_ich8lan ?
|
||||
E1000_MC_TBL_SIZE_ICH8LAN : E1000_MC_TBL_SIZE);
|
||||
for (i = 0; i < value; i++)
|
||||
REG_PATTERN_TEST(MTA + (i << 2), 0xFFFFFFFF, 0xFFFFFFFF);
|
||||
|
||||
*data = 0;
|
||||
|
@ -889,6 +900,8 @@ e1000_intr_test(struct e1000_adapter *adapter, uint64_t *data)
|
|||
/* Test each interrupt */
|
||||
for (; i < 10; i++) {
|
||||
|
||||
if (adapter->hw.mac_type == e1000_ich8lan && i == 8)
|
||||
continue;
|
||||
/* Interrupt to test */
|
||||
mask = 1 << i;
|
||||
|
||||
|
@ -1246,18 +1259,33 @@ e1000_integrated_phy_loopback(struct e1000_adapter *adapter)
|
|||
} else if (adapter->hw.phy_type == e1000_phy_gg82563) {
|
||||
e1000_write_phy_reg(&adapter->hw,
|
||||
GG82563_PHY_KMRN_MODE_CTRL,
|
||||
0x1CE);
|
||||
0x1CC);
|
||||
}
|
||||
/* force 1000, set loopback */
|
||||
e1000_write_phy_reg(&adapter->hw, PHY_CTRL, 0x4140);
|
||||
|
||||
/* Now set up the MAC to the same speed/duplex as the PHY. */
|
||||
ctrl_reg = E1000_READ_REG(&adapter->hw, CTRL);
|
||||
ctrl_reg &= ~E1000_CTRL_SPD_SEL; /* Clear the speed sel bits */
|
||||
ctrl_reg |= (E1000_CTRL_FRCSPD | /* Set the Force Speed Bit */
|
||||
E1000_CTRL_FRCDPX | /* Set the Force Duplex Bit */
|
||||
E1000_CTRL_SPD_1000 |/* Force Speed to 1000 */
|
||||
E1000_CTRL_FD); /* Force Duplex to FULL */
|
||||
|
||||
if (adapter->hw.phy_type == e1000_phy_ife) {
|
||||
/* force 100, set loopback */
|
||||
e1000_write_phy_reg(&adapter->hw, PHY_CTRL, 0x6100);
|
||||
|
||||
/* Now set up the MAC to the same speed/duplex as the PHY. */
|
||||
ctrl_reg &= ~E1000_CTRL_SPD_SEL; /* Clear the speed sel bits */
|
||||
ctrl_reg |= (E1000_CTRL_FRCSPD | /* Set the Force Speed Bit */
|
||||
E1000_CTRL_FRCDPX | /* Set the Force Duplex Bit */
|
||||
E1000_CTRL_SPD_100 |/* Force Speed to 100 */
|
||||
E1000_CTRL_FD); /* Force Duplex to FULL */
|
||||
} else {
|
||||
/* force 1000, set loopback */
|
||||
e1000_write_phy_reg(&adapter->hw, PHY_CTRL, 0x4140);
|
||||
|
||||
/* Now set up the MAC to the same speed/duplex as the PHY. */
|
||||
ctrl_reg = E1000_READ_REG(&adapter->hw, CTRL);
|
||||
ctrl_reg &= ~E1000_CTRL_SPD_SEL; /* Clear the speed sel bits */
|
||||
ctrl_reg |= (E1000_CTRL_FRCSPD | /* Set the Force Speed Bit */
|
||||
E1000_CTRL_FRCDPX | /* Set the Force Duplex Bit */
|
||||
E1000_CTRL_SPD_1000 |/* Force Speed to 1000 */
|
||||
E1000_CTRL_FD); /* Force Duplex to FULL */
|
||||
}
|
||||
|
||||
if (adapter->hw.media_type == e1000_media_type_copper &&
|
||||
adapter->hw.phy_type == e1000_phy_m88) {
|
||||
|
@ -1317,6 +1345,7 @@ e1000_set_phy_loopback(struct e1000_adapter *adapter)
|
|||
case e1000_82572:
|
||||
case e1000_82573:
|
||||
case e1000_80003es2lan:
|
||||
case e1000_ich8lan:
|
||||
return e1000_integrated_phy_loopback(adapter);
|
||||
break;
|
||||
|
||||
|
@ -1568,6 +1597,7 @@ e1000_diag_test(struct net_device *netdev,
|
|||
struct e1000_adapter *adapter = netdev_priv(netdev);
|
||||
boolean_t if_running = netif_running(netdev);
|
||||
|
||||
set_bit(__E1000_DRIVER_TESTING, &adapter->flags);
|
||||
if (eth_test->flags == ETH_TEST_FL_OFFLINE) {
|
||||
/* Offline tests */
|
||||
|
||||
|
@ -1582,7 +1612,8 @@ e1000_diag_test(struct net_device *netdev,
|
|||
eth_test->flags |= ETH_TEST_FL_FAILED;
|
||||
|
||||
if (if_running)
|
||||
e1000_down(adapter);
|
||||
/* indicate we're in test mode */
|
||||
dev_close(netdev);
|
||||
else
|
||||
e1000_reset(adapter);
|
||||
|
||||
|
@ -1607,8 +1638,9 @@ e1000_diag_test(struct net_device *netdev,
|
|||
adapter->hw.autoneg = autoneg;
|
||||
|
||||
e1000_reset(adapter);
|
||||
clear_bit(__E1000_DRIVER_TESTING, &adapter->flags);
|
||||
if (if_running)
|
||||
e1000_up(adapter);
|
||||
dev_open(netdev);
|
||||
} else {
|
||||
/* Online tests */
|
||||
if (e1000_link_test(adapter, &data[4]))
|
||||
|
@ -1619,6 +1651,8 @@ e1000_diag_test(struct net_device *netdev,
|
|||
data[1] = 0;
|
||||
data[2] = 0;
|
||||
data[3] = 0;
|
||||
|
||||
clear_bit(__E1000_DRIVER_TESTING, &adapter->flags);
|
||||
}
|
||||
msleep_interruptible(4 * 1000);
|
||||
}
|
||||
|
@ -1778,21 +1812,18 @@ e1000_phys_id(struct net_device *netdev, uint32_t data)
|
|||
mod_timer(&adapter->blink_timer, jiffies);
|
||||
msleep_interruptible(data * 1000);
|
||||
del_timer_sync(&adapter->blink_timer);
|
||||
} else if (adapter->hw.mac_type < e1000_82573) {
|
||||
E1000_WRITE_REG(&adapter->hw, LEDCTL,
|
||||
(E1000_LEDCTL_LED2_BLINK_RATE |
|
||||
E1000_LEDCTL_LED0_BLINK | E1000_LEDCTL_LED2_BLINK |
|
||||
(E1000_LEDCTL_MODE_LED_ON << E1000_LEDCTL_LED2_MODE_SHIFT) |
|
||||
(E1000_LEDCTL_MODE_LINK_ACTIVITY << E1000_LEDCTL_LED0_MODE_SHIFT) |
|
||||
(E1000_LEDCTL_MODE_LED_OFF << E1000_LEDCTL_LED1_MODE_SHIFT)));
|
||||
} else if (adapter->hw.phy_type == e1000_phy_ife) {
|
||||
if (!adapter->blink_timer.function) {
|
||||
init_timer(&adapter->blink_timer);
|
||||
adapter->blink_timer.function = e1000_led_blink_callback;
|
||||
adapter->blink_timer.data = (unsigned long) adapter;
|
||||
}
|
||||
mod_timer(&adapter->blink_timer, jiffies);
|
||||
msleep_interruptible(data * 1000);
|
||||
del_timer_sync(&adapter->blink_timer);
|
||||
e1000_write_phy_reg(&(adapter->hw), IFE_PHY_SPECIAL_CONTROL_LED, 0);
|
||||
} else {
|
||||
E1000_WRITE_REG(&adapter->hw, LEDCTL,
|
||||
(E1000_LEDCTL_LED2_BLINK_RATE |
|
||||
E1000_LEDCTL_LED1_BLINK | E1000_LEDCTL_LED2_BLINK |
|
||||
(E1000_LEDCTL_MODE_LED_ON << E1000_LEDCTL_LED2_MODE_SHIFT) |
|
||||
(E1000_LEDCTL_MODE_LINK_ACTIVITY << E1000_LEDCTL_LED1_MODE_SHIFT) |
|
||||
(E1000_LEDCTL_MODE_LED_OFF << E1000_LEDCTL_LED0_MODE_SHIFT)));
|
||||
e1000_blink_led_start(&adapter->hw);
|
||||
msleep_interruptible(data * 1000);
|
||||
}
|
||||
|
||||
|
@ -1807,10 +1838,8 @@ static int
|
|||
e1000_nway_reset(struct net_device *netdev)
|
||||
{
|
||||
struct e1000_adapter *adapter = netdev_priv(netdev);
|
||||
if (netif_running(netdev)) {
|
||||
e1000_down(adapter);
|
||||
e1000_up(adapter);
|
||||
}
|
||||
if (netif_running(netdev))
|
||||
e1000_reinit_locked(adapter);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -62,6 +62,7 @@ typedef enum {
|
|||
e1000_82572,
|
||||
e1000_82573,
|
||||
e1000_80003es2lan,
|
||||
e1000_ich8lan,
|
||||
e1000_num_macs
|
||||
} e1000_mac_type;
|
||||
|
||||
|
@ -70,6 +71,7 @@ typedef enum {
|
|||
e1000_eeprom_spi,
|
||||
e1000_eeprom_microwire,
|
||||
e1000_eeprom_flash,
|
||||
e1000_eeprom_ich8,
|
||||
e1000_eeprom_none, /* No NVM support */
|
||||
e1000_num_eeprom_types
|
||||
} e1000_eeprom_type;
|
||||
|
@ -98,6 +100,11 @@ typedef enum {
|
|||
e1000_fc_default = 0xFF
|
||||
} e1000_fc_type;
|
||||
|
||||
struct e1000_shadow_ram {
|
||||
uint16_t eeprom_word;
|
||||
boolean_t modified;
|
||||
};
|
||||
|
||||
/* PCI bus types */
|
||||
typedef enum {
|
||||
e1000_bus_type_unknown = 0,
|
||||
|
@ -218,6 +225,8 @@ typedef enum {
|
|||
e1000_phy_igp,
|
||||
e1000_phy_igp_2,
|
||||
e1000_phy_gg82563,
|
||||
e1000_phy_igp_3,
|
||||
e1000_phy_ife,
|
||||
e1000_phy_undefined = 0xFF
|
||||
} e1000_phy_type;
|
||||
|
||||
|
@ -313,6 +322,10 @@ int32_t e1000_read_phy_reg(struct e1000_hw *hw, uint32_t reg_addr, uint16_t *phy
|
|||
int32_t e1000_write_phy_reg(struct e1000_hw *hw, uint32_t reg_addr, uint16_t data);
|
||||
int32_t e1000_phy_hw_reset(struct e1000_hw *hw);
|
||||
int32_t e1000_phy_reset(struct e1000_hw *hw);
|
||||
void e1000_phy_powerdown_workaround(struct e1000_hw *hw);
|
||||
int32_t e1000_kumeran_lock_loss_workaround(struct e1000_hw *hw);
|
||||
int32_t e1000_init_lcd_from_nvm_config_region(struct e1000_hw *hw, uint32_t cnf_base_addr, uint32_t cnf_size);
|
||||
int32_t e1000_init_lcd_from_nvm(struct e1000_hw *hw);
|
||||
int32_t e1000_phy_get_info(struct e1000_hw *hw, struct e1000_phy_info *phy_info);
|
||||
int32_t e1000_validate_mdi_setting(struct e1000_hw *hw);
|
||||
int32_t e1000_read_kmrn_reg(struct e1000_hw *hw, uint32_t reg_addr, uint16_t *data);
|
||||
|
@ -331,6 +344,7 @@ uint32_t e1000_enable_mng_pass_thru(struct e1000_hw *hw);
|
|||
#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 */
|
||||
|
||||
#define E1000_MNG_DHCP_COOKIE_STATUS_PARSING_SUPPORT 0x1 /* DHCP parsing enabled */
|
||||
|
@ -388,6 +402,8 @@ int32_t e1000_read_part_num(struct e1000_hw *hw, uint32_t * part_num);
|
|||
int32_t e1000_read_mac_addr(struct e1000_hw * hw);
|
||||
int32_t e1000_swfw_sync_acquire(struct e1000_hw *hw, uint16_t mask);
|
||||
void e1000_swfw_sync_release(struct e1000_hw *hw, uint16_t mask);
|
||||
void e1000_release_software_flag(struct e1000_hw *hw);
|
||||
int32_t e1000_get_software_flag(struct e1000_hw *hw);
|
||||
|
||||
/* Filters (multicast, vlan, receive) */
|
||||
void e1000_mc_addr_list_update(struct e1000_hw *hw, uint8_t * mc_addr_list, uint32_t mc_addr_count, uint32_t pad, uint32_t rar_used_count);
|
||||
|
@ -401,6 +417,7 @@ int32_t e1000_setup_led(struct e1000_hw *hw);
|
|||
int32_t e1000_cleanup_led(struct e1000_hw *hw);
|
||||
int32_t e1000_led_on(struct e1000_hw *hw);
|
||||
int32_t e1000_led_off(struct e1000_hw *hw);
|
||||
int32_t e1000_blink_led_start(struct e1000_hw *hw);
|
||||
|
||||
/* Adaptive IFS Functions */
|
||||
|
||||
|
@ -422,6 +439,29 @@ int32_t e1000_disable_pciex_master(struct e1000_hw *hw);
|
|||
int32_t e1000_get_software_semaphore(struct e1000_hw *hw);
|
||||
void e1000_release_software_semaphore(struct e1000_hw *hw);
|
||||
int32_t e1000_check_phy_reset_block(struct e1000_hw *hw);
|
||||
int32_t e1000_set_pci_ex_no_snoop(struct e1000_hw *hw, uint32_t no_snoop);
|
||||
|
||||
int32_t e1000_read_ich8_byte(struct e1000_hw *hw, uint32_t index,
|
||||
uint8_t *data);
|
||||
int32_t e1000_verify_write_ich8_byte(struct e1000_hw *hw, uint32_t index,
|
||||
uint8_t byte);
|
||||
int32_t e1000_write_ich8_byte(struct e1000_hw *hw, uint32_t index,
|
||||
uint8_t byte);
|
||||
int32_t e1000_read_ich8_word(struct e1000_hw *hw, uint32_t index,
|
||||
uint16_t *data);
|
||||
int32_t e1000_read_ich8_data(struct e1000_hw *hw, uint32_t index,
|
||||
uint32_t size, uint16_t *data);
|
||||
int32_t e1000_read_eeprom_ich8(struct e1000_hw *hw, uint16_t offset,
|
||||
uint16_t words, uint16_t *data);
|
||||
int32_t e1000_write_eeprom_ich8(struct e1000_hw *hw, uint16_t offset,
|
||||
uint16_t words, uint16_t *data);
|
||||
int32_t e1000_erase_ich8_4k_segment(struct e1000_hw *hw, uint32_t segment);
|
||||
|
||||
|
||||
#define E1000_READ_REG_IO(a, reg) \
|
||||
e1000_read_reg_io((a), E1000_##reg)
|
||||
#define E1000_WRITE_REG_IO(a, reg, val) \
|
||||
e1000_write_reg_io((a), E1000_##reg, val)
|
||||
|
||||
/* PCI Device IDs */
|
||||
#define E1000_DEV_ID_82542 0x1000
|
||||
|
@ -446,6 +486,7 @@ int32_t e1000_check_phy_reset_block(struct e1000_hw *hw);
|
|||
#define E1000_DEV_ID_82546EB_QUAD_COPPER 0x101D
|
||||
#define E1000_DEV_ID_82541EI 0x1013
|
||||
#define E1000_DEV_ID_82541EI_MOBILE 0x1018
|
||||
#define E1000_DEV_ID_82541ER_LOM 0x1014
|
||||
#define E1000_DEV_ID_82541ER 0x1078
|
||||
#define E1000_DEV_ID_82547GI 0x1075
|
||||
#define E1000_DEV_ID_82541GI 0x1076
|
||||
|
@ -457,18 +498,28 @@ int32_t e1000_check_phy_reset_block(struct e1000_hw *hw);
|
|||
#define E1000_DEV_ID_82546GB_PCIE 0x108A
|
||||
#define E1000_DEV_ID_82546GB_QUAD_COPPER 0x1099
|
||||
#define E1000_DEV_ID_82547EI 0x1019
|
||||
#define E1000_DEV_ID_82547EI_MOBILE 0x101A
|
||||
#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_82572EI_COPPER 0x107D
|
||||
#define E1000_DEV_ID_82572EI_FIBER 0x107E
|
||||
#define E1000_DEV_ID_82572EI_SERDES 0x107F
|
||||
#define E1000_DEV_ID_82572EI 0x10B9
|
||||
#define E1000_DEV_ID_82573E 0x108B
|
||||
#define E1000_DEV_ID_82573E_IAMT 0x108C
|
||||
#define E1000_DEV_ID_82573L 0x109A
|
||||
#define E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3 0x10B5
|
||||
#define E1000_DEV_ID_80003ES2LAN_COPPER_DPT 0x1096
|
||||
#define E1000_DEV_ID_80003ES2LAN_SERDES_DPT 0x1098
|
||||
#define E1000_DEV_ID_80003ES2LAN_COPPER_SPT 0x10BA
|
||||
#define E1000_DEV_ID_80003ES2LAN_SERDES_SPT 0x10BB
|
||||
|
||||
#define E1000_DEV_ID_ICH8_IGP_M_AMT 0x1049
|
||||
#define E1000_DEV_ID_ICH8_IGP_AMT 0x104A
|
||||
#define E1000_DEV_ID_ICH8_IGP_C 0x104B
|
||||
#define E1000_DEV_ID_ICH8_IFE 0x104C
|
||||
#define E1000_DEV_ID_ICH8_IGP_M 0x104D
|
||||
|
||||
|
||||
#define NODE_ADDRESS_SIZE 6
|
||||
|
@ -539,6 +590,14 @@ int32_t e1000_check_phy_reset_block(struct e1000_hw *hw);
|
|||
E1000_IMS_RXSEQ | \
|
||||
E1000_IMS_LSC)
|
||||
|
||||
/* Additional interrupts need to be handled for e1000_ich8lan:
|
||||
DSW = The FW changed the status of the DISSW bit in FWSM
|
||||
PHYINT = The LAN connected device generates an interrupt
|
||||
EPRST = Manageability reset event */
|
||||
#define IMS_ICH8LAN_ENABLE_MASK (\
|
||||
E1000_IMS_DSW | \
|
||||
E1000_IMS_PHYINT | \
|
||||
E1000_IMS_EPRST)
|
||||
|
||||
/* Number of high/low register pairs in the RAR. The RAR (Receive Address
|
||||
* Registers) holds the directed and multicast addresses that we monitor. We
|
||||
|
@ -546,6 +605,7 @@ int32_t e1000_check_phy_reset_block(struct e1000_hw *hw);
|
|||
* E1000_RAR_ENTRIES - 1 multicast addresses.
|
||||
*/
|
||||
#define E1000_RAR_ENTRIES 15
|
||||
#define E1000_RAR_ENTRIES_ICH8LAN 7
|
||||
|
||||
#define MIN_NUMBER_OF_DESCRIPTORS 8
|
||||
#define MAX_NUMBER_OF_DESCRIPTORS 0xFFF8
|
||||
|
@ -767,6 +827,9 @@ struct e1000_data_desc {
|
|||
#define E1000_MC_TBL_SIZE 128 /* Multicast Filter Table (4096 bits) */
|
||||
#define E1000_VLAN_FILTER_TBL_SIZE 128 /* VLAN Filter Table (4096 bits) */
|
||||
|
||||
#define E1000_NUM_UNICAST_ICH8LAN 7
|
||||
#define E1000_MC_TBL_SIZE_ICH8LAN 32
|
||||
|
||||
|
||||
/* Receive Address Register */
|
||||
struct e1000_rar {
|
||||
|
@ -776,6 +839,7 @@ struct e1000_rar {
|
|||
|
||||
/* Number of entries in the Multicast Table Array (MTA). */
|
||||
#define E1000_NUM_MTA_REGISTERS 128
|
||||
#define E1000_NUM_MTA_REGISTERS_ICH8LAN 32
|
||||
|
||||
/* IPv4 Address Table Entry */
|
||||
struct e1000_ipv4_at_entry {
|
||||
|
@ -786,6 +850,7 @@ struct e1000_ipv4_at_entry {
|
|||
/* Four wakeup IP addresses are supported */
|
||||
#define E1000_WAKEUP_IP_ADDRESS_COUNT_MAX 4
|
||||
#define E1000_IP4AT_SIZE E1000_WAKEUP_IP_ADDRESS_COUNT_MAX
|
||||
#define E1000_IP4AT_SIZE_ICH8LAN 3
|
||||
#define E1000_IP6AT_SIZE 1
|
||||
|
||||
/* IPv6 Address Table Entry */
|
||||
|
@ -844,6 +909,7 @@ struct e1000_ffvt_entry {
|
|||
#define E1000_FLA 0x0001C /* Flash Access - RW */
|
||||
#define E1000_MDIC 0x00020 /* MDI Control - RW */
|
||||
#define E1000_SCTL 0x00024 /* SerDes Control - RW */
|
||||
#define E1000_FEXTNVM 0x00028 /* Future Extended NVM register */
|
||||
#define E1000_FCAL 0x00028 /* Flow Control Address Low - RW */
|
||||
#define E1000_FCAH 0x0002C /* Flow Control Address High -RW */
|
||||
#define E1000_FCT 0x00030 /* Flow Control Type - RW */
|
||||
|
@ -872,6 +938,8 @@ struct e1000_ffvt_entry {
|
|||
#define E1000_LEDCTL 0x00E00 /* LED Control - RW */
|
||||
#define E1000_EXTCNF_CTRL 0x00F00 /* Extended Configuration Control */
|
||||
#define E1000_EXTCNF_SIZE 0x00F08 /* Extended Configuration Size */
|
||||
#define E1000_PHY_CTRL 0x00F10 /* PHY Control Register in CSR */
|
||||
#define FEXTNVM_SW_CONFIG 0x0001
|
||||
#define E1000_PBA 0x01000 /* Packet Buffer Allocation - RW */
|
||||
#define E1000_PBS 0x01008 /* Packet Buffer Size */
|
||||
#define E1000_EEMNGCTL 0x01010 /* MNG EEprom Control */
|
||||
|
@ -899,11 +967,13 @@ struct e1000_ffvt_entry {
|
|||
#define E1000_RDH0 E1000_RDH /* RX Desc Head (0) - RW */
|
||||
#define E1000_RDT0 E1000_RDT /* RX Desc Tail (0) - RW */
|
||||
#define E1000_RDTR0 E1000_RDTR /* RX Delay Timer (0) - RW */
|
||||
#define E1000_RXDCTL 0x02828 /* RX Descriptor Control - RW */
|
||||
#define E1000_RXDCTL 0x02828 /* RX Descriptor Control queue 0 - RW */
|
||||
#define E1000_RXDCTL1 0x02928 /* RX Descriptor Control queue 1 - RW */
|
||||
#define E1000_RADV 0x0282C /* RX Interrupt Absolute Delay Timer - RW */
|
||||
#define E1000_RSRPD 0x02C00 /* RX Small Packet Detect - RW */
|
||||
#define E1000_RAID 0x02C08 /* Receive Ack Interrupt Delay - RW */
|
||||
#define E1000_TXDMAC 0x03000 /* TX DMA Control - RW */
|
||||
#define E1000_KABGTXD 0x03004 /* AFE Band Gap Transmit Ref Data */
|
||||
#define E1000_TDFH 0x03410 /* TX Data FIFO Head - RW */
|
||||
#define E1000_TDFT 0x03418 /* TX Data FIFO Tail - RW */
|
||||
#define E1000_TDFHS 0x03420 /* TX Data FIFO Head Saved - RW */
|
||||
|
@ -1050,6 +1120,7 @@ struct e1000_ffvt_entry {
|
|||
#define E1000_82542_FLA E1000_FLA
|
||||
#define E1000_82542_MDIC E1000_MDIC
|
||||
#define E1000_82542_SCTL E1000_SCTL
|
||||
#define E1000_82542_FEXTNVM E1000_FEXTNVM
|
||||
#define E1000_82542_FCAL E1000_FCAL
|
||||
#define E1000_82542_FCAH E1000_FCAH
|
||||
#define E1000_82542_FCT E1000_FCT
|
||||
|
@ -1073,6 +1144,19 @@ struct e1000_ffvt_entry {
|
|||
#define E1000_82542_RDLEN0 E1000_82542_RDLEN
|
||||
#define E1000_82542_RDH0 E1000_82542_RDH
|
||||
#define E1000_82542_RDT0 E1000_82542_RDT
|
||||
#define E1000_82542_SRRCTL(_n) (0x280C + ((_n) << 8)) /* Split and Replication
|
||||
* RX Control - RW */
|
||||
#define E1000_82542_DCA_RXCTRL(_n) (0x02814 + ((_n) << 8))
|
||||
#define E1000_82542_RDBAH3 0x02B04 /* RX Desc Base High Queue 3 - RW */
|
||||
#define E1000_82542_RDBAL3 0x02B00 /* RX Desc Low Queue 3 - RW */
|
||||
#define E1000_82542_RDLEN3 0x02B08 /* RX Desc Length Queue 3 - RW */
|
||||
#define E1000_82542_RDH3 0x02B10 /* RX Desc Head Queue 3 - RW */
|
||||
#define E1000_82542_RDT3 0x02B18 /* RX Desc Tail Queue 3 - RW */
|
||||
#define E1000_82542_RDBAL2 0x02A00 /* RX Desc Base Low Queue 2 - RW */
|
||||
#define E1000_82542_RDBAH2 0x02A04 /* RX Desc Base High Queue 2 - RW */
|
||||
#define E1000_82542_RDLEN2 0x02A08 /* RX Desc Length Queue 2 - RW */
|
||||
#define E1000_82542_RDH2 0x02A10 /* RX Desc Head Queue 2 - RW */
|
||||
#define E1000_82542_RDT2 0x02A18 /* RX Desc Tail Queue 2 - RW */
|
||||
#define E1000_82542_RDTR1 0x00130
|
||||
#define E1000_82542_RDBAL1 0x00138
|
||||
#define E1000_82542_RDBAH1 0x0013C
|
||||
|
@ -1110,11 +1194,14 @@ struct e1000_ffvt_entry {
|
|||
#define E1000_82542_FLOP E1000_FLOP
|
||||
#define E1000_82542_EXTCNF_CTRL E1000_EXTCNF_CTRL
|
||||
#define E1000_82542_EXTCNF_SIZE E1000_EXTCNF_SIZE
|
||||
#define E1000_82542_PHY_CTRL E1000_PHY_CTRL
|
||||
#define E1000_82542_ERT E1000_ERT
|
||||
#define E1000_82542_RXDCTL E1000_RXDCTL
|
||||
#define E1000_82542_RXDCTL1 E1000_RXDCTL1
|
||||
#define E1000_82542_RADV E1000_RADV
|
||||
#define E1000_82542_RSRPD E1000_RSRPD
|
||||
#define E1000_82542_TXDMAC E1000_TXDMAC
|
||||
#define E1000_82542_KABGTXD E1000_KABGTXD
|
||||
#define E1000_82542_TDFHS E1000_TDFHS
|
||||
#define E1000_82542_TDFTS E1000_TDFTS
|
||||
#define E1000_82542_TDFPC E1000_TDFPC
|
||||
|
@ -1310,13 +1397,16 @@ struct e1000_hw_stats {
|
|||
|
||||
/* Structure containing variables used by the shared code (e1000_hw.c) */
|
||||
struct e1000_hw {
|
||||
uint8_t __iomem *hw_addr;
|
||||
uint8_t *hw_addr;
|
||||
uint8_t *flash_address;
|
||||
e1000_mac_type mac_type;
|
||||
e1000_phy_type phy_type;
|
||||
uint32_t phy_init_script;
|
||||
e1000_media_type media_type;
|
||||
void *back;
|
||||
struct e1000_shadow_ram *eeprom_shadow_ram;
|
||||
uint32_t flash_bank_size;
|
||||
uint32_t flash_base_addr;
|
||||
e1000_fc_type fc;
|
||||
e1000_bus_speed bus_speed;
|
||||
e1000_bus_width bus_width;
|
||||
|
@ -1328,6 +1418,7 @@ struct e1000_hw {
|
|||
uint32_t asf_firmware_present;
|
||||
uint32_t eeprom_semaphore_present;
|
||||
uint32_t swfw_sync_present;
|
||||
uint32_t swfwhw_semaphore_present;
|
||||
unsigned long io_base;
|
||||
uint32_t phy_id;
|
||||
uint32_t phy_revision;
|
||||
|
@ -1387,6 +1478,7 @@ struct e1000_hw {
|
|||
boolean_t in_ifs_mode;
|
||||
boolean_t mng_reg_access_disabled;
|
||||
boolean_t leave_av_bit_off;
|
||||
boolean_t kmrn_lock_loss_workaround_disabled;
|
||||
};
|
||||
|
||||
|
||||
|
@ -1435,6 +1527,7 @@ struct e1000_hw {
|
|||
#define E1000_CTRL_RTE 0x20000000 /* Routing tag enable */
|
||||
#define E1000_CTRL_VME 0x40000000 /* IEEE VLAN mode enable */
|
||||
#define E1000_CTRL_PHY_RST 0x80000000 /* PHY Reset */
|
||||
#define E1000_CTRL_SW2FW_INT 0x02000000 /* Initiate an interrupt to manageability engine */
|
||||
|
||||
/* Device Status */
|
||||
#define E1000_STATUS_FD 0x00000001 /* Full duplex.0=half,1=full */
|
||||
|
@ -1449,6 +1542,8 @@ struct e1000_hw {
|
|||
#define E1000_STATUS_SPEED_10 0x00000000 /* Speed 10Mb/s */
|
||||
#define E1000_STATUS_SPEED_100 0x00000040 /* Speed 100Mb/s */
|
||||
#define E1000_STATUS_SPEED_1000 0x00000080 /* Speed 1000Mb/s */
|
||||
#define E1000_STATUS_LAN_INIT_DONE 0x00000200 /* Lan Init Completion
|
||||
by EEPROM/Flash */
|
||||
#define E1000_STATUS_ASDV 0x00000300 /* Auto speed detect value */
|
||||
#define E1000_STATUS_DOCK_CI 0x00000800 /* Change in Dock/Undock state. Clear on write '0'. */
|
||||
#define E1000_STATUS_GIO_MASTER_ENABLE 0x00080000 /* Status of Master requests. */
|
||||
|
@ -1506,6 +1601,10 @@ struct e1000_hw {
|
|||
#define E1000_STM_OPCODE 0xDB00
|
||||
#define E1000_HICR_FW_RESET 0xC0
|
||||
|
||||
#define E1000_SHADOW_RAM_WORDS 2048
|
||||
#define E1000_ICH8_NVM_SIG_WORD 0x13
|
||||
#define E1000_ICH8_NVM_SIG_MASK 0xC0
|
||||
|
||||
/* EEPROM Read */
|
||||
#define E1000_EERD_START 0x00000001 /* Start Read */
|
||||
#define E1000_EERD_DONE 0x00000010 /* Read Done */
|
||||
|
@ -1551,7 +1650,6 @@ struct e1000_hw {
|
|||
#define E1000_CTRL_EXT_WR_WMARK_320 0x01000000
|
||||
#define E1000_CTRL_EXT_WR_WMARK_384 0x02000000
|
||||
#define E1000_CTRL_EXT_WR_WMARK_448 0x03000000
|
||||
#define E1000_CTRL_EXT_CANC 0x04000000 /* Interrupt delay cancellation */
|
||||
#define E1000_CTRL_EXT_DRV_LOAD 0x10000000 /* Driver loaded bit for FW */
|
||||
#define E1000_CTRL_EXT_IAME 0x08000000 /* Interrupt acknowledge Auto-mask */
|
||||
#define E1000_CTRL_EXT_INT_TIMER_CLR 0x20000000 /* Clear Interrupt timers after IMS clear */
|
||||
|
@ -1591,12 +1689,31 @@ struct e1000_hw {
|
|||
#define E1000_KUMCTRLSTA_FIFO_CTRL_TX_BYPASS 0x00000800
|
||||
|
||||
/* In-Band Control */
|
||||
#define E1000_KUMCTRLSTA_INB_CTRL_LINK_STATUS_TX_TIMEOUT_DEFAULT 0x00000500
|
||||
#define E1000_KUMCTRLSTA_INB_CTRL_DIS_PADDING 0x00000010
|
||||
|
||||
/* Half-Duplex Control */
|
||||
#define E1000_KUMCTRLSTA_HD_CTRL_10_100_DEFAULT 0x00000004
|
||||
#define E1000_KUMCTRLSTA_HD_CTRL_1000_DEFAULT 0x00000000
|
||||
|
||||
#define E1000_KUMCTRLSTA_OFFSET_K0S_CTRL 0x0000001E
|
||||
|
||||
#define E1000_KUMCTRLSTA_DIAG_FELPBK 0x2000
|
||||
#define E1000_KUMCTRLSTA_DIAG_NELPBK 0x1000
|
||||
|
||||
#define E1000_KUMCTRLSTA_K0S_100_EN 0x2000
|
||||
#define E1000_KUMCTRLSTA_K0S_GBE_EN 0x1000
|
||||
#define E1000_KUMCTRLSTA_K0S_ENTRY_LATENCY_MASK 0x0003
|
||||
|
||||
#define E1000_KABGTXD_BGSQLBIAS 0x00050000
|
||||
|
||||
#define E1000_PHY_CTRL_SPD_EN 0x00000001
|
||||
#define E1000_PHY_CTRL_D0A_LPLU 0x00000002
|
||||
#define E1000_PHY_CTRL_NOND0A_LPLU 0x00000004
|
||||
#define E1000_PHY_CTRL_NOND0A_GBE_DISABLE 0x00000008
|
||||
#define E1000_PHY_CTRL_GBE_DISABLE 0x00000040
|
||||
#define E1000_PHY_CTRL_B2B_EN 0x00000080
|
||||
|
||||
/* LED Control */
|
||||
#define E1000_LEDCTL_LED0_MODE_MASK 0x0000000F
|
||||
#define E1000_LEDCTL_LED0_MODE_SHIFT 0
|
||||
|
@ -1666,6 +1783,9 @@ struct e1000_hw {
|
|||
#define E1000_ICR_RXD_FIFO_PAR1 0x01000000 /* queue 1 Rx descriptor FIFO parity error */
|
||||
#define E1000_ICR_TXD_FIFO_PAR1 0x02000000 /* queue 1 Tx descriptor FIFO parity error */
|
||||
#define E1000_ICR_ALL_PARITY 0x03F00000 /* all parity error bits */
|
||||
#define E1000_ICR_DSW 0x00000020 /* FW changed the status of DISSW bit in the FWSM */
|
||||
#define E1000_ICR_PHYINT 0x00001000 /* LAN connected device generates an interrupt */
|
||||
#define E1000_ICR_EPRST 0x00100000 /* ME handware reset occurs */
|
||||
|
||||
/* Interrupt Cause Set */
|
||||
#define E1000_ICS_TXDW E1000_ICR_TXDW /* Transmit desc written back */
|
||||
|
@ -1692,6 +1812,9 @@ struct e1000_hw {
|
|||
#define E1000_ICS_PB_PAR E1000_ICR_PB_PAR /* packet buffer parity error */
|
||||
#define E1000_ICS_RXD_FIFO_PAR1 E1000_ICR_RXD_FIFO_PAR1 /* queue 1 Rx descriptor FIFO parity error */
|
||||
#define E1000_ICS_TXD_FIFO_PAR1 E1000_ICR_TXD_FIFO_PAR1 /* queue 1 Tx descriptor FIFO parity error */
|
||||
#define E1000_ICS_DSW E1000_ICR_DSW
|
||||
#define E1000_ICS_PHYINT E1000_ICR_PHYINT
|
||||
#define E1000_ICS_EPRST E1000_ICR_EPRST
|
||||
|
||||
/* Interrupt Mask Set */
|
||||
#define E1000_IMS_TXDW E1000_ICR_TXDW /* Transmit desc written back */
|
||||
|
@ -1718,6 +1841,9 @@ struct e1000_hw {
|
|||
#define E1000_IMS_PB_PAR E1000_ICR_PB_PAR /* packet buffer parity error */
|
||||
#define E1000_IMS_RXD_FIFO_PAR1 E1000_ICR_RXD_FIFO_PAR1 /* queue 1 Rx descriptor FIFO parity error */
|
||||
#define E1000_IMS_TXD_FIFO_PAR1 E1000_ICR_TXD_FIFO_PAR1 /* queue 1 Tx descriptor FIFO parity error */
|
||||
#define E1000_IMS_DSW E1000_ICR_DSW
|
||||
#define E1000_IMS_PHYINT E1000_ICR_PHYINT
|
||||
#define E1000_IMS_EPRST E1000_ICR_EPRST
|
||||
|
||||
/* Interrupt Mask Clear */
|
||||
#define E1000_IMC_TXDW E1000_ICR_TXDW /* Transmit desc written back */
|
||||
|
@ -1744,6 +1870,9 @@ struct e1000_hw {
|
|||
#define E1000_IMC_PB_PAR E1000_ICR_PB_PAR /* packet buffer parity error */
|
||||
#define E1000_IMC_RXD_FIFO_PAR1 E1000_ICR_RXD_FIFO_PAR1 /* queue 1 Rx descriptor FIFO parity error */
|
||||
#define E1000_IMC_TXD_FIFO_PAR1 E1000_ICR_TXD_FIFO_PAR1 /* queue 1 Tx descriptor FIFO parity error */
|
||||
#define E1000_IMC_DSW E1000_ICR_DSW
|
||||
#define E1000_IMC_PHYINT E1000_ICR_PHYINT
|
||||
#define E1000_IMC_EPRST E1000_ICR_EPRST
|
||||
|
||||
/* Receive Control */
|
||||
#define E1000_RCTL_RST 0x00000001 /* Software reset */
|
||||
|
@ -1918,9 +2047,10 @@ struct e1000_hw {
|
|||
#define E1000_MRQC_RSS_FIELD_MASK 0xFFFF0000
|
||||
#define E1000_MRQC_RSS_FIELD_IPV4_TCP 0x00010000
|
||||
#define E1000_MRQC_RSS_FIELD_IPV4 0x00020000
|
||||
#define E1000_MRQC_RSS_FIELD_IPV6_TCP 0x00040000
|
||||
#define E1000_MRQC_RSS_FIELD_IPV6_TCP_EX 0x00040000
|
||||
#define E1000_MRQC_RSS_FIELD_IPV6_EX 0x00080000
|
||||
#define E1000_MRQC_RSS_FIELD_IPV6 0x00100000
|
||||
#define E1000_MRQC_RSS_FIELD_IPV6_TCP 0x00200000
|
||||
|
||||
/* Definitions for power management and wakeup registers */
|
||||
/* Wake Up Control */
|
||||
|
@ -2010,6 +2140,15 @@ struct e1000_hw {
|
|||
#define E1000_FWSM_MODE_SHIFT 1
|
||||
#define E1000_FWSM_FW_VALID 0x00008000 /* FW established a valid mode */
|
||||
|
||||
#define E1000_FWSM_RSPCIPHY 0x00000040 /* Reset PHY on PCI reset */
|
||||
#define E1000_FWSM_DISSW 0x10000000 /* FW disable SW Write Access */
|
||||
#define E1000_FWSM_SKUSEL_MASK 0x60000000 /* LAN SKU select */
|
||||
#define E1000_FWSM_SKUEL_SHIFT 29
|
||||
#define E1000_FWSM_SKUSEL_EMB 0x0 /* Embedded SKU */
|
||||
#define E1000_FWSM_SKUSEL_CONS 0x1 /* Consumer SKU */
|
||||
#define E1000_FWSM_SKUSEL_PERF_100 0x2 /* Perf & Corp 10/100 SKU */
|
||||
#define E1000_FWSM_SKUSEL_PERF_GBE 0x3 /* Perf & Copr GbE SKU */
|
||||
|
||||
/* FFLT Debug Register */
|
||||
#define E1000_FFLT_DBG_INVC 0x00100000 /* Invalid /C/ code handling */
|
||||
|
||||
|
@ -2082,6 +2221,8 @@ struct e1000_host_command_info {
|
|||
E1000_GCR_TXDSCW_NO_SNOOP | \
|
||||
E1000_GCR_TXDSCR_NO_SNOOP)
|
||||
|
||||
#define PCI_EX_82566_SNOOP_ALL PCI_EX_NO_SNOOP_ALL
|
||||
|
||||
#define E1000_GCR_L1_ACT_WITHOUT_L0S_RX 0x08000000
|
||||
/* Function Active and Power State to MNG */
|
||||
#define E1000_FACTPS_FUNC0_POWER_STATE_MASK 0x00000003
|
||||
|
@ -2140,8 +2281,10 @@ struct e1000_host_command_info {
|
|||
#define EEPROM_PHY_CLASS_WORD 0x0007
|
||||
#define EEPROM_INIT_CONTROL1_REG 0x000A
|
||||
#define EEPROM_INIT_CONTROL2_REG 0x000F
|
||||
#define EEPROM_SWDEF_PINS_CTRL_PORT_1 0x0010
|
||||
#define EEPROM_INIT_CONTROL3_PORT_B 0x0014
|
||||
#define EEPROM_INIT_3GIO_3 0x001A
|
||||
#define EEPROM_SWDEF_PINS_CTRL_PORT_0 0x0020
|
||||
#define EEPROM_INIT_CONTROL3_PORT_A 0x0024
|
||||
#define EEPROM_CFG 0x0012
|
||||
#define EEPROM_FLASH_VERSION 0x0032
|
||||
|
@ -2153,10 +2296,16 @@ struct e1000_host_command_info {
|
|||
/* Word definitions for ID LED Settings */
|
||||
#define ID_LED_RESERVED_0000 0x0000
|
||||
#define ID_LED_RESERVED_FFFF 0xFFFF
|
||||
#define ID_LED_RESERVED_82573 0xF746
|
||||
#define ID_LED_DEFAULT_82573 0x1811
|
||||
#define ID_LED_DEFAULT ((ID_LED_OFF1_ON2 << 12) | \
|
||||
(ID_LED_OFF1_OFF2 << 8) | \
|
||||
(ID_LED_DEF1_DEF2 << 4) | \
|
||||
(ID_LED_DEF1_DEF2))
|
||||
#define ID_LED_DEFAULT_ICH8LAN ((ID_LED_DEF1_DEF2 << 12) | \
|
||||
(ID_LED_DEF1_OFF2 << 8) | \
|
||||
(ID_LED_DEF1_ON2 << 4) | \
|
||||
(ID_LED_DEF1_DEF2))
|
||||
#define ID_LED_DEF1_DEF2 0x1
|
||||
#define ID_LED_DEF1_ON2 0x2
|
||||
#define ID_LED_DEF1_OFF2 0x3
|
||||
|
@ -2191,6 +2340,11 @@ struct e1000_host_command_info {
|
|||
#define EEPROM_WORD0F_ASM_DIR 0x2000
|
||||
#define EEPROM_WORD0F_ANE 0x0800
|
||||
#define EEPROM_WORD0F_SWPDIO_EXT 0x00F0
|
||||
#define EEPROM_WORD0F_LPLU 0x0001
|
||||
|
||||
/* Mask bits for fields in Word 0x10/0x20 of the EEPROM */
|
||||
#define EEPROM_WORD1020_GIGA_DISABLE 0x0010
|
||||
#define EEPROM_WORD1020_GIGA_DISABLE_NON_D0A 0x0008
|
||||
|
||||
/* Mask bits for fields in Word 0x1a of the EEPROM */
|
||||
#define EEPROM_WORD1A_ASPM_MASK 0x000C
|
||||
|
@ -2265,23 +2419,29 @@ struct e1000_host_command_info {
|
|||
#define E1000_EXTCNF_CTRL_D_UD_OWNER 0x00000010
|
||||
#define E1000_EXTCNF_CTRL_MDIO_SW_OWNERSHIP 0x00000020
|
||||
#define E1000_EXTCNF_CTRL_MDIO_HW_OWNERSHIP 0x00000040
|
||||
#define E1000_EXTCNF_CTRL_EXT_CNF_POINTER 0x1FFF0000
|
||||
#define E1000_EXTCNF_CTRL_EXT_CNF_POINTER 0x0FFF0000
|
||||
|
||||
#define E1000_EXTCNF_SIZE_EXT_PHY_LENGTH 0x000000FF
|
||||
#define E1000_EXTCNF_SIZE_EXT_DOCK_LENGTH 0x0000FF00
|
||||
#define E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH 0x00FF0000
|
||||
#define E1000_EXTCNF_CTRL_LCD_WRITE_ENABLE 0x00000001
|
||||
#define E1000_EXTCNF_CTRL_SWFLAG 0x00000020
|
||||
|
||||
/* PBA constants */
|
||||
#define E1000_PBA_8K 0x0008 /* 8KB, default Rx allocation */
|
||||
#define E1000_PBA_12K 0x000C /* 12KB, default Rx allocation */
|
||||
#define E1000_PBA_16K 0x0010 /* 16KB, default TX allocation */
|
||||
#define E1000_PBA_22K 0x0016
|
||||
#define E1000_PBA_24K 0x0018
|
||||
#define E1000_PBA_30K 0x001E
|
||||
#define E1000_PBA_32K 0x0020
|
||||
#define E1000_PBA_34K 0x0022
|
||||
#define E1000_PBA_38K 0x0026
|
||||
#define E1000_PBA_40K 0x0028
|
||||
#define E1000_PBA_48K 0x0030 /* 48KB, default RX allocation */
|
||||
|
||||
#define E1000_PBS_16K E1000_PBA_16K
|
||||
|
||||
/* Flow Control Constants */
|
||||
#define FLOW_CONTROL_ADDRESS_LOW 0x00C28001
|
||||
#define FLOW_CONTROL_ADDRESS_HIGH 0x00000100
|
||||
|
@ -2336,7 +2496,7 @@ struct e1000_host_command_info {
|
|||
/* Number of milliseconds we wait for Eeprom auto read bit done after MAC reset */
|
||||
#define AUTO_READ_DONE_TIMEOUT 10
|
||||
/* Number of milliseconds we wait for PHY configuration done after MAC reset */
|
||||
#define PHY_CFG_TIMEOUT 40
|
||||
#define PHY_CFG_TIMEOUT 100
|
||||
|
||||
#define E1000_TX_BUFFER_SIZE ((uint32_t)1514)
|
||||
|
||||
|
@ -2764,6 +2924,17 @@ struct e1000_host_command_info {
|
|||
#define M88E1000_EPSCR_TX_CLK_25 0x0070 /* 25 MHz TX_CLK */
|
||||
#define M88E1000_EPSCR_TX_CLK_0 0x0000 /* NO TX_CLK */
|
||||
|
||||
/* M88EC018 Rev 2 specific DownShift settings */
|
||||
#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_MASK 0x0E00
|
||||
#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_1X 0x0000
|
||||
#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_2X 0x0200
|
||||
#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_3X 0x0400
|
||||
#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_4X 0x0600
|
||||
#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_5X 0x0800
|
||||
#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_6X 0x0A00
|
||||
#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_7X 0x0C00
|
||||
#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_8X 0x0E00
|
||||
|
||||
/* IGP01E1000 Specific Port Config Register - R/W */
|
||||
#define IGP01E1000_PSCFR_AUTO_MDIX_PAR_DETECT 0x0010
|
||||
#define IGP01E1000_PSCFR_PRE_EN 0x0020
|
||||
|
@ -2990,6 +3161,221 @@ struct e1000_host_command_info {
|
|||
#define L1LXT971A_PHY_ID 0x001378E0
|
||||
#define GG82563_E_PHY_ID 0x01410CA0
|
||||
|
||||
|
||||
/* Bits...
|
||||
* 15-5: page
|
||||
* 4-0: register offset
|
||||
*/
|
||||
#define PHY_PAGE_SHIFT 5
|
||||
#define PHY_REG(page, reg) \
|
||||
(((page) << PHY_PAGE_SHIFT) | ((reg) & MAX_PHY_REG_ADDRESS))
|
||||
|
||||
#define IGP3_PHY_PORT_CTRL \
|
||||
PHY_REG(769, 17) /* Port General Configuration */
|
||||
#define IGP3_PHY_RATE_ADAPT_CTRL \
|
||||
PHY_REG(769, 25) /* Rate Adapter Control Register */
|
||||
|
||||
#define IGP3_KMRN_FIFO_CTRL_STATS \
|
||||
PHY_REG(770, 16) /* KMRN FIFO's control/status register */
|
||||
#define IGP3_KMRN_POWER_MNG_CTRL \
|
||||
PHY_REG(770, 17) /* KMRN Power Management Control Register */
|
||||
#define IGP3_KMRN_INBAND_CTRL \
|
||||
PHY_REG(770, 18) /* KMRN Inband Control Register */
|
||||
#define IGP3_KMRN_DIAG \
|
||||
PHY_REG(770, 19) /* KMRN Diagnostic register */
|
||||
#define IGP3_KMRN_DIAG_PCS_LOCK_LOSS 0x0002 /* RX PCS is not synced */
|
||||
#define IGP3_KMRN_ACK_TIMEOUT \
|
||||
PHY_REG(770, 20) /* KMRN Acknowledge Timeouts register */
|
||||
|
||||
#define IGP3_VR_CTRL \
|
||||
PHY_REG(776, 18) /* Voltage regulator control register */
|
||||
#define IGP3_VR_CTRL_MODE_SHUT 0x0200 /* Enter powerdown, shutdown VRs */
|
||||
|
||||
#define IGP3_CAPABILITY \
|
||||
PHY_REG(776, 19) /* IGP3 Capability Register */
|
||||
|
||||
/* Capabilities for SKU Control */
|
||||
#define IGP3_CAP_INITIATE_TEAM 0x0001 /* Able to initiate a team */
|
||||
#define IGP3_CAP_WFM 0x0002 /* Support WoL and PXE */
|
||||
#define IGP3_CAP_ASF 0x0004 /* Support ASF */
|
||||
#define IGP3_CAP_LPLU 0x0008 /* Support Low Power Link Up */
|
||||
#define IGP3_CAP_DC_AUTO_SPEED 0x0010 /* Support AC/DC Auto Link Speed */
|
||||
#define IGP3_CAP_SPD 0x0020 /* Support Smart Power Down */
|
||||
#define IGP3_CAP_MULT_QUEUE 0x0040 /* Support 2 tx & 2 rx queues */
|
||||
#define IGP3_CAP_RSS 0x0080 /* Support RSS */
|
||||
#define IGP3_CAP_8021PQ 0x0100 /* Support 802.1Q & 802.1p */
|
||||
#define IGP3_CAP_AMT_CB 0x0200 /* Support active manageability and circuit breaker */
|
||||
|
||||
#define IGP3_PPC_JORDAN_EN 0x0001
|
||||
#define IGP3_PPC_JORDAN_GIGA_SPEED 0x0002
|
||||
|
||||
#define IGP3_KMRN_PMC_EE_IDLE_LINK_DIS 0x0001
|
||||
#define IGP3_KMRN_PMC_K0S_ENTRY_LATENCY_MASK 0x001E
|
||||
#define IGP3_KMRN_PMC_K0S_MODE1_EN_GIGA 0x0020
|
||||
#define IGP3_KMRN_PMC_K0S_MODE1_EN_100 0x0040
|
||||
|
||||
#define IGP3E1000_PHY_MISC_CTRL 0x1B /* Misc. Ctrl register */
|
||||
#define IGP3_PHY_MISC_DUPLEX_MANUAL_SET 0x1000 /* Duplex Manual Set */
|
||||
|
||||
#define IGP3_KMRN_EXT_CTRL PHY_REG(770, 18)
|
||||
#define IGP3_KMRN_EC_DIS_INBAND 0x0080
|
||||
|
||||
#define IGP03E1000_E_PHY_ID 0x02A80390
|
||||
#define IFE_E_PHY_ID 0x02A80330 /* 10/100 PHY */
|
||||
#define IFE_PLUS_E_PHY_ID 0x02A80320
|
||||
#define IFE_C_E_PHY_ID 0x02A80310
|
||||
|
||||
#define IFE_PHY_EXTENDED_STATUS_CONTROL 0x10 /* 100BaseTx Extended Status, Control and Address */
|
||||
#define IFE_PHY_SPECIAL_CONTROL 0x11 /* 100BaseTx PHY special control register */
|
||||
#define IFE_PHY_RCV_FALSE_CARRIER 0x13 /* 100BaseTx Receive False Carrier Counter */
|
||||
#define IFE_PHY_RCV_DISCONNECT 0x14 /* 100BaseTx Receive Disconnet Counter */
|
||||
#define IFE_PHY_RCV_ERROT_FRAME 0x15 /* 100BaseTx Receive Error Frame Counter */
|
||||
#define IFE_PHY_RCV_SYMBOL_ERR 0x16 /* Receive Symbol Error Counter */
|
||||
#define IFE_PHY_PREM_EOF_ERR 0x17 /* 100BaseTx Receive Premature End Of Frame Error Counter */
|
||||
#define IFE_PHY_RCV_EOF_ERR 0x18 /* 10BaseT Receive End Of Frame Error Counter */
|
||||
#define IFE_PHY_TX_JABBER_DETECT 0x19 /* 10BaseT Transmit Jabber Detect Counter */
|
||||
#define IFE_PHY_EQUALIZER 0x1A /* PHY Equalizer Control and Status */
|
||||
#define IFE_PHY_SPECIAL_CONTROL_LED 0x1B /* PHY special control and LED configuration */
|
||||
#define IFE_PHY_MDIX_CONTROL 0x1C /* MDI/MDI-X Control register */
|
||||
#define IFE_PHY_HWI_CONTROL 0x1D /* Hardware Integrity Control (HWI) */
|
||||
|
||||
#define IFE_PESC_REDUCED_POWER_DOWN_DISABLE 0x2000 /* Defaut 1 = Disable auto reduced power down */
|
||||
#define IFE_PESC_100BTX_POWER_DOWN 0x0400 /* Indicates the power state of 100BASE-TX */
|
||||
#define IFE_PESC_10BTX_POWER_DOWN 0x0200 /* Indicates the power state of 10BASE-T */
|
||||
#define IFE_PESC_POLARITY_REVERSED 0x0100 /* Indicates 10BASE-T polarity */
|
||||
#define IFE_PESC_PHY_ADDR_MASK 0x007C /* Bit 6:2 for sampled PHY address */
|
||||
#define IFE_PESC_SPEED 0x0002 /* Auto-negotiation speed result 1=100Mbs, 0=10Mbs */
|
||||
#define IFE_PESC_DUPLEX 0x0001 /* Auto-negotiation duplex result 1=Full, 0=Half */
|
||||
#define IFE_PESC_POLARITY_REVERSED_SHIFT 8
|
||||
|
||||
#define IFE_PSC_DISABLE_DYNAMIC_POWER_DOWN 0x0100 /* 1 = Dyanmic Power Down disabled */
|
||||
#define IFE_PSC_FORCE_POLARITY 0x0020 /* 1=Reversed Polarity, 0=Normal */
|
||||
#define IFE_PSC_AUTO_POLARITY_DISABLE 0x0010 /* 1=Auto Polarity Disabled, 0=Enabled */
|
||||
#define IFE_PSC_JABBER_FUNC_DISABLE 0x0001 /* 1=Jabber Disabled, 0=Normal Jabber Operation */
|
||||
#define IFE_PSC_FORCE_POLARITY_SHIFT 5
|
||||
#define IFE_PSC_AUTO_POLARITY_DISABLE_SHIFT 4
|
||||
|
||||
#define IFE_PMC_AUTO_MDIX 0x0080 /* 1=enable MDI/MDI-X feature, default 0=disabled */
|
||||
#define IFE_PMC_FORCE_MDIX 0x0040 /* 1=force MDIX-X, 0=force MDI */
|
||||
#define IFE_PMC_MDIX_STATUS 0x0020 /* 1=MDI-X, 0=MDI */
|
||||
#define IFE_PMC_AUTO_MDIX_COMPLETE 0x0010 /* Resolution algorthm is completed */
|
||||
#define IFE_PMC_MDIX_MODE_SHIFT 6
|
||||
#define IFE_PHC_MDIX_RESET_ALL_MASK 0x0000 /* Disable auto MDI-X */
|
||||
|
||||
#define IFE_PHC_HWI_ENABLE 0x8000 /* Enable the HWI feature */
|
||||
#define IFE_PHC_ABILITY_CHECK 0x4000 /* 1= Test Passed, 0=failed */
|
||||
#define IFE_PHC_TEST_EXEC 0x2000 /* PHY launch test pulses on the wire */
|
||||
#define IFE_PHC_HIGHZ 0x0200 /* 1 = Open Circuit */
|
||||
#define IFE_PHC_LOWZ 0x0400 /* 1 = Short Circuit */
|
||||
#define IFE_PHC_LOW_HIGH_Z_MASK 0x0600 /* Mask for indication type of problem on the line */
|
||||
#define IFE_PHC_DISTANCE_MASK 0x01FF /* Mask for distance to the cable problem, in 80cm granularity */
|
||||
#define IFE_PHC_RESET_ALL_MASK 0x0000 /* Disable HWI */
|
||||
#define IFE_PSCL_PROBE_MODE 0x0020 /* LED Probe mode */
|
||||
#define IFE_PSCL_PROBE_LEDS_OFF 0x0006 /* Force LEDs 0 and 2 off */
|
||||
#define IFE_PSCL_PROBE_LEDS_ON 0x0007 /* Force LEDs 0 and 2 on */
|
||||
|
||||
#define ICH8_FLASH_COMMAND_TIMEOUT 500 /* 500 ms , should be adjusted */
|
||||
#define ICH8_FLASH_CYCLE_REPEAT_COUNT 10 /* 10 cycles , should be adjusted */
|
||||
#define ICH8_FLASH_SEG_SIZE_256 256
|
||||
#define ICH8_FLASH_SEG_SIZE_4K 4096
|
||||
#define ICH8_FLASH_SEG_SIZE_64K 65536
|
||||
|
||||
#define ICH8_CYCLE_READ 0x0
|
||||
#define ICH8_CYCLE_RESERVED 0x1
|
||||
#define ICH8_CYCLE_WRITE 0x2
|
||||
#define ICH8_CYCLE_ERASE 0x3
|
||||
|
||||
#define ICH8_FLASH_GFPREG 0x0000
|
||||
#define ICH8_FLASH_HSFSTS 0x0004
|
||||
#define ICH8_FLASH_HSFCTL 0x0006
|
||||
#define ICH8_FLASH_FADDR 0x0008
|
||||
#define ICH8_FLASH_FDATA0 0x0010
|
||||
#define ICH8_FLASH_FRACC 0x0050
|
||||
#define ICH8_FLASH_FREG0 0x0054
|
||||
#define ICH8_FLASH_FREG1 0x0058
|
||||
#define ICH8_FLASH_FREG2 0x005C
|
||||
#define ICH8_FLASH_FREG3 0x0060
|
||||
#define ICH8_FLASH_FPR0 0x0074
|
||||
#define ICH8_FLASH_FPR1 0x0078
|
||||
#define ICH8_FLASH_SSFSTS 0x0090
|
||||
#define ICH8_FLASH_SSFCTL 0x0092
|
||||
#define ICH8_FLASH_PREOP 0x0094
|
||||
#define ICH8_FLASH_OPTYPE 0x0096
|
||||
#define ICH8_FLASH_OPMENU 0x0098
|
||||
|
||||
#define ICH8_FLASH_REG_MAPSIZE 0x00A0
|
||||
#define ICH8_FLASH_SECTOR_SIZE 4096
|
||||
#define ICH8_GFPREG_BASE_MASK 0x1FFF
|
||||
#define ICH8_FLASH_LINEAR_ADDR_MASK 0x00FFFFFF
|
||||
|
||||
/* ICH8 GbE Flash Hardware Sequencing Flash Status Register bit breakdown */
|
||||
/* Offset 04h HSFSTS */
|
||||
union ich8_hws_flash_status {
|
||||
struct ich8_hsfsts {
|
||||
#ifdef E1000_BIG_ENDIAN
|
||||
uint16_t reserved2 :6;
|
||||
uint16_t fldesvalid :1;
|
||||
uint16_t flockdn :1;
|
||||
uint16_t flcdone :1;
|
||||
uint16_t flcerr :1;
|
||||
uint16_t dael :1;
|
||||
uint16_t berasesz :2;
|
||||
uint16_t flcinprog :1;
|
||||
uint16_t reserved1 :2;
|
||||
#else
|
||||
uint16_t flcdone :1; /* bit 0 Flash Cycle Done */
|
||||
uint16_t flcerr :1; /* bit 1 Flash Cycle Error */
|
||||
uint16_t dael :1; /* bit 2 Direct Access error Log */
|
||||
uint16_t berasesz :2; /* bit 4:3 Block/Sector Erase Size */
|
||||
uint16_t flcinprog :1; /* bit 5 flash SPI cycle in Progress */
|
||||
uint16_t reserved1 :2; /* bit 13:6 Reserved */
|
||||
uint16_t reserved2 :6; /* bit 13:6 Reserved */
|
||||
uint16_t fldesvalid :1; /* bit 14 Flash Descriptor Valid */
|
||||
uint16_t flockdn :1; /* bit 15 Flash Configuration Lock-Down */
|
||||
#endif
|
||||
} hsf_status;
|
||||
uint16_t regval;
|
||||
};
|
||||
|
||||
/* ICH8 GbE Flash Hardware Sequencing Flash control Register bit breakdown */
|
||||
/* Offset 06h FLCTL */
|
||||
union ich8_hws_flash_ctrl {
|
||||
struct ich8_hsflctl {
|
||||
#ifdef E1000_BIG_ENDIAN
|
||||
uint16_t fldbcount :2;
|
||||
uint16_t flockdn :6;
|
||||
uint16_t flcgo :1;
|
||||
uint16_t flcycle :2;
|
||||
uint16_t reserved :5;
|
||||
#else
|
||||
uint16_t flcgo :1; /* 0 Flash Cycle Go */
|
||||
uint16_t flcycle :2; /* 2:1 Flash Cycle */
|
||||
uint16_t reserved :5; /* 7:3 Reserved */
|
||||
uint16_t fldbcount :2; /* 9:8 Flash Data Byte Count */
|
||||
uint16_t flockdn :6; /* 15:10 Reserved */
|
||||
#endif
|
||||
} hsf_ctrl;
|
||||
uint16_t regval;
|
||||
};
|
||||
|
||||
/* ICH8 Flash Region Access Permissions */
|
||||
union ich8_hws_flash_regacc {
|
||||
struct ich8_flracc {
|
||||
#ifdef E1000_BIG_ENDIAN
|
||||
uint32_t gmwag :8;
|
||||
uint32_t gmrag :8;
|
||||
uint32_t grwa :8;
|
||||
uint32_t grra :8;
|
||||
#else
|
||||
uint32_t grra :8; /* 0:7 GbE region Read Access */
|
||||
uint32_t grwa :8; /* 8:15 GbE region Write Access */
|
||||
uint32_t gmrag :8; /* 23:16 GbE Master Read Access Grant */
|
||||
uint32_t gmwag :8; /* 31:24 GbE Master Write Access Grant */
|
||||
#endif
|
||||
} hsf_flregacc;
|
||||
uint16_t regval;
|
||||
};
|
||||
|
||||
/* Miscellaneous PHY bit definitions. */
|
||||
#define PHY_PREAMBLE 0xFFFFFFFF
|
||||
#define PHY_SOF 0x01
|
||||
|
|
|
@ -36,7 +36,7 @@ static char e1000_driver_string[] = "Intel(R) PRO/1000 Network Driver";
|
|||
#else
|
||||
#define DRIVERNAPI "-NAPI"
|
||||
#endif
|
||||
#define DRV_VERSION "7.0.38-k4"DRIVERNAPI
|
||||
#define DRV_VERSION "7.1.9-k2"DRIVERNAPI
|
||||
char e1000_driver_version[] = DRV_VERSION;
|
||||
static char e1000_copyright[] = "Copyright (c) 1999-2006 Intel Corporation.";
|
||||
|
||||
|
@ -73,6 +73,11 @@ static struct pci_device_id e1000_pci_tbl[] = {
|
|||
INTEL_E1000_ETHERNET_DEVICE(0x1026),
|
||||
INTEL_E1000_ETHERNET_DEVICE(0x1027),
|
||||
INTEL_E1000_ETHERNET_DEVICE(0x1028),
|
||||
INTEL_E1000_ETHERNET_DEVICE(0x1049),
|
||||
INTEL_E1000_ETHERNET_DEVICE(0x104A),
|
||||
INTEL_E1000_ETHERNET_DEVICE(0x104B),
|
||||
INTEL_E1000_ETHERNET_DEVICE(0x104C),
|
||||
INTEL_E1000_ETHERNET_DEVICE(0x104D),
|
||||
INTEL_E1000_ETHERNET_DEVICE(0x105E),
|
||||
INTEL_E1000_ETHERNET_DEVICE(0x105F),
|
||||
INTEL_E1000_ETHERNET_DEVICE(0x1060),
|
||||
|
@ -96,6 +101,8 @@ static struct pci_device_id e1000_pci_tbl[] = {
|
|||
INTEL_E1000_ETHERNET_DEVICE(0x109A),
|
||||
INTEL_E1000_ETHERNET_DEVICE(0x10B5),
|
||||
INTEL_E1000_ETHERNET_DEVICE(0x10B9),
|
||||
INTEL_E1000_ETHERNET_DEVICE(0x10BA),
|
||||
INTEL_E1000_ETHERNET_DEVICE(0x10BB),
|
||||
/* required last entry */
|
||||
{0,}
|
||||
};
|
||||
|
@ -133,7 +140,6 @@ static void e1000_clean_rx_ring(struct e1000_adapter *adapter,
|
|||
static void e1000_set_multi(struct net_device *netdev);
|
||||
static void e1000_update_phy_info(unsigned long data);
|
||||
static void e1000_watchdog(unsigned long data);
|
||||
static void e1000_watchdog_task(struct e1000_adapter *adapter);
|
||||
static void e1000_82547_tx_fifo_stall(unsigned long data);
|
||||
static int e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev);
|
||||
static struct net_device_stats * e1000_get_stats(struct net_device *netdev);
|
||||
|
@ -178,8 +184,8 @@ static void e1000_vlan_rx_add_vid(struct net_device *netdev, uint16_t vid);
|
|||
static void e1000_vlan_rx_kill_vid(struct net_device *netdev, uint16_t vid);
|
||||
static void e1000_restore_vlan(struct e1000_adapter *adapter);
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static int e1000_suspend(struct pci_dev *pdev, pm_message_t state);
|
||||
#ifdef CONFIG_PM
|
||||
static int e1000_resume(struct pci_dev *pdev);
|
||||
#endif
|
||||
static void e1000_shutdown(struct pci_dev *pdev);
|
||||
|
@ -206,8 +212,8 @@ static struct pci_driver e1000_driver = {
|
|||
.probe = e1000_probe,
|
||||
.remove = __devexit_p(e1000_remove),
|
||||
/* Power Managment Hooks */
|
||||
#ifdef CONFIG_PM
|
||||
.suspend = e1000_suspend,
|
||||
#ifdef CONFIG_PM
|
||||
.resume = e1000_resume,
|
||||
#endif
|
||||
.shutdown = e1000_shutdown,
|
||||
|
@ -261,6 +267,44 @@ e1000_exit_module(void)
|
|||
|
||||
module_exit(e1000_exit_module);
|
||||
|
||||
static int e1000_request_irq(struct e1000_adapter *adapter)
|
||||
{
|
||||
struct net_device *netdev = adapter->netdev;
|
||||
int flags, err = 0;
|
||||
|
||||
flags = IRQF_SHARED;
|
||||
#ifdef CONFIG_PCI_MSI
|
||||
if (adapter->hw.mac_type > e1000_82547_rev_2) {
|
||||
adapter->have_msi = TRUE;
|
||||
if ((err = pci_enable_msi(adapter->pdev))) {
|
||||
DPRINTK(PROBE, ERR,
|
||||
"Unable to allocate MSI interrupt Error: %d\n", err);
|
||||
adapter->have_msi = FALSE;
|
||||
}
|
||||
}
|
||||
if (adapter->have_msi)
|
||||
flags &= ~SA_SHIRQ;
|
||||
#endif
|
||||
if ((err = request_irq(adapter->pdev->irq, &e1000_intr, flags,
|
||||
netdev->name, netdev)))
|
||||
DPRINTK(PROBE, ERR,
|
||||
"Unable to allocate interrupt Error: %d\n", err);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static void e1000_free_irq(struct e1000_adapter *adapter)
|
||||
{
|
||||
struct net_device *netdev = adapter->netdev;
|
||||
|
||||
free_irq(adapter->pdev->irq, netdev);
|
||||
|
||||
#ifdef CONFIG_PCI_MSI
|
||||
if (adapter->have_msi)
|
||||
pci_disable_msi(adapter->pdev);
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* e1000_irq_disable - Mask off interrupt generation on the NIC
|
||||
* @adapter: board private structure
|
||||
|
@ -329,6 +373,7 @@ e1000_release_hw_control(struct e1000_adapter *adapter)
|
|||
{
|
||||
uint32_t ctrl_ext;
|
||||
uint32_t swsm;
|
||||
uint32_t extcnf;
|
||||
|
||||
/* Let firmware taken over control of h/w */
|
||||
switch (adapter->hw.mac_type) {
|
||||
|
@ -343,6 +388,11 @@ e1000_release_hw_control(struct e1000_adapter *adapter)
|
|||
swsm = E1000_READ_REG(&adapter->hw, SWSM);
|
||||
E1000_WRITE_REG(&adapter->hw, SWSM,
|
||||
swsm & ~E1000_SWSM_DRV_LOAD);
|
||||
case e1000_ich8lan:
|
||||
extcnf = E1000_READ_REG(&adapter->hw, CTRL_EXT);
|
||||
E1000_WRITE_REG(&adapter->hw, CTRL_EXT,
|
||||
extcnf & ~E1000_CTRL_EXT_DRV_LOAD);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -364,6 +414,7 @@ e1000_get_hw_control(struct e1000_adapter *adapter)
|
|||
{
|
||||
uint32_t ctrl_ext;
|
||||
uint32_t swsm;
|
||||
uint32_t extcnf;
|
||||
/* Let firmware know the driver has taken over */
|
||||
switch (adapter->hw.mac_type) {
|
||||
case e1000_82571:
|
||||
|
@ -378,6 +429,11 @@ e1000_get_hw_control(struct e1000_adapter *adapter)
|
|||
E1000_WRITE_REG(&adapter->hw, SWSM,
|
||||
swsm | E1000_SWSM_DRV_LOAD);
|
||||
break;
|
||||
case e1000_ich8lan:
|
||||
extcnf = E1000_READ_REG(&adapter->hw, EXTCNF_CTRL);
|
||||
E1000_WRITE_REG(&adapter->hw, EXTCNF_CTRL,
|
||||
extcnf | E1000_EXTCNF_CTRL_SWFLAG);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -387,18 +443,10 @@ int
|
|||
e1000_up(struct e1000_adapter *adapter)
|
||||
{
|
||||
struct net_device *netdev = adapter->netdev;
|
||||
int i, err;
|
||||
int i;
|
||||
|
||||
/* hardware has been reset, we need to reload some things */
|
||||
|
||||
/* Reset the PHY if it was previously powered down */
|
||||
if (adapter->hw.media_type == e1000_media_type_copper) {
|
||||
uint16_t mii_reg;
|
||||
e1000_read_phy_reg(&adapter->hw, PHY_CTRL, &mii_reg);
|
||||
if (mii_reg & MII_CR_POWER_DOWN)
|
||||
e1000_phy_hw_reset(&adapter->hw);
|
||||
}
|
||||
|
||||
e1000_set_multi(netdev);
|
||||
|
||||
e1000_restore_vlan(adapter);
|
||||
|
@ -415,24 +463,6 @@ e1000_up(struct e1000_adapter *adapter)
|
|||
E1000_DESC_UNUSED(ring));
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PCI_MSI
|
||||
if (adapter->hw.mac_type > e1000_82547_rev_2) {
|
||||
adapter->have_msi = TRUE;
|
||||
if ((err = pci_enable_msi(adapter->pdev))) {
|
||||
DPRINTK(PROBE, ERR,
|
||||
"Unable to allocate MSI interrupt Error: %d\n", err);
|
||||
adapter->have_msi = FALSE;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if ((err = request_irq(adapter->pdev->irq, &e1000_intr,
|
||||
IRQF_SHARED | IRQF_SAMPLE_RANDOM,
|
||||
netdev->name, netdev))) {
|
||||
DPRINTK(PROBE, ERR,
|
||||
"Unable to allocate interrupt Error: %d\n", err);
|
||||
return err;
|
||||
}
|
||||
|
||||
adapter->tx_queue_len = netdev->tx_queue_len;
|
||||
|
||||
mod_timer(&adapter->watchdog_timer, jiffies);
|
||||
|
@ -445,21 +475,60 @@ e1000_up(struct e1000_adapter *adapter)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* e1000_power_up_phy - restore link in case the phy was powered down
|
||||
* @adapter: address of board private structure
|
||||
*
|
||||
* The phy may be powered down to save power and turn off link when the
|
||||
* driver is unloaded and wake on lan is not enabled (among others)
|
||||
* *** this routine MUST be followed by a call to e1000_reset ***
|
||||
*
|
||||
**/
|
||||
|
||||
static void e1000_power_up_phy(struct e1000_adapter *adapter)
|
||||
{
|
||||
uint16_t mii_reg = 0;
|
||||
|
||||
/* Just clear the power down bit to wake the phy back up */
|
||||
if (adapter->hw.media_type == e1000_media_type_copper) {
|
||||
/* according to the manual, the phy will retain its
|
||||
* settings across a power-down/up cycle */
|
||||
e1000_read_phy_reg(&adapter->hw, PHY_CTRL, &mii_reg);
|
||||
mii_reg &= ~MII_CR_POWER_DOWN;
|
||||
e1000_write_phy_reg(&adapter->hw, PHY_CTRL, mii_reg);
|
||||
}
|
||||
}
|
||||
|
||||
static void e1000_power_down_phy(struct e1000_adapter *adapter)
|
||||
{
|
||||
boolean_t mng_mode_enabled = (adapter->hw.mac_type >= e1000_82571) &&
|
||||
e1000_check_mng_mode(&adapter->hw);
|
||||
/* Power down the PHY so no link is implied when interface is down
|
||||
* The PHY cannot be powered down if any of the following is TRUE
|
||||
* (a) WoL is enabled
|
||||
* (b) AMT is active
|
||||
* (c) SoL/IDER session is active */
|
||||
if (!adapter->wol && adapter->hw.mac_type >= e1000_82540 &&
|
||||
adapter->hw.mac_type != e1000_ich8lan &&
|
||||
adapter->hw.media_type == e1000_media_type_copper &&
|
||||
!(E1000_READ_REG(&adapter->hw, MANC) & E1000_MANC_SMBUS_EN) &&
|
||||
!mng_mode_enabled &&
|
||||
!e1000_check_phy_reset_block(&adapter->hw)) {
|
||||
uint16_t mii_reg = 0;
|
||||
e1000_read_phy_reg(&adapter->hw, PHY_CTRL, &mii_reg);
|
||||
mii_reg |= MII_CR_POWER_DOWN;
|
||||
e1000_write_phy_reg(&adapter->hw, PHY_CTRL, mii_reg);
|
||||
mdelay(1);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
e1000_down(struct e1000_adapter *adapter)
|
||||
{
|
||||
struct net_device *netdev = adapter->netdev;
|
||||
boolean_t mng_mode_enabled = (adapter->hw.mac_type >= e1000_82571) &&
|
||||
e1000_check_mng_mode(&adapter->hw);
|
||||
|
||||
e1000_irq_disable(adapter);
|
||||
|
||||
free_irq(adapter->pdev->irq, netdev);
|
||||
#ifdef CONFIG_PCI_MSI
|
||||
if (adapter->hw.mac_type > e1000_82547_rev_2 &&
|
||||
adapter->have_msi == TRUE)
|
||||
pci_disable_msi(adapter->pdev);
|
||||
#endif
|
||||
del_timer_sync(&adapter->tx_fifo_stall_timer);
|
||||
del_timer_sync(&adapter->watchdog_timer);
|
||||
del_timer_sync(&adapter->phy_info_timer);
|
||||
|
@ -476,23 +545,17 @@ e1000_down(struct e1000_adapter *adapter)
|
|||
e1000_reset(adapter);
|
||||
e1000_clean_all_tx_rings(adapter);
|
||||
e1000_clean_all_rx_rings(adapter);
|
||||
}
|
||||
|
||||
/* Power down the PHY so no link is implied when interface is down *
|
||||
* The PHY cannot be powered down if any of the following is TRUE *
|
||||
* (a) WoL is enabled
|
||||
* (b) AMT is active
|
||||
* (c) SoL/IDER session is active */
|
||||
if (!adapter->wol && adapter->hw.mac_type >= e1000_82540 &&
|
||||
adapter->hw.media_type == e1000_media_type_copper &&
|
||||
!(E1000_READ_REG(&adapter->hw, MANC) & E1000_MANC_SMBUS_EN) &&
|
||||
!mng_mode_enabled &&
|
||||
!e1000_check_phy_reset_block(&adapter->hw)) {
|
||||
uint16_t mii_reg;
|
||||
e1000_read_phy_reg(&adapter->hw, PHY_CTRL, &mii_reg);
|
||||
mii_reg |= MII_CR_POWER_DOWN;
|
||||
e1000_write_phy_reg(&adapter->hw, PHY_CTRL, mii_reg);
|
||||
mdelay(1);
|
||||
}
|
||||
void
|
||||
e1000_reinit_locked(struct e1000_adapter *adapter)
|
||||
{
|
||||
WARN_ON(in_interrupt());
|
||||
while (test_and_set_bit(__E1000_RESETTING, &adapter->flags))
|
||||
msleep(1);
|
||||
e1000_down(adapter);
|
||||
e1000_up(adapter);
|
||||
clear_bit(__E1000_RESETTING, &adapter->flags);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -518,6 +581,9 @@ e1000_reset(struct e1000_adapter *adapter)
|
|||
case e1000_82573:
|
||||
pba = E1000_PBA_12K;
|
||||
break;
|
||||
case e1000_ich8lan:
|
||||
pba = E1000_PBA_8K;
|
||||
break;
|
||||
default:
|
||||
pba = E1000_PBA_48K;
|
||||
break;
|
||||
|
@ -542,6 +608,12 @@ e1000_reset(struct e1000_adapter *adapter)
|
|||
/* Set the FC high water mark to 90% of the FIFO size.
|
||||
* Required to clear last 3 LSB */
|
||||
fc_high_water_mark = ((pba * 9216)/10) & 0xFFF8;
|
||||
/* We can't use 90% on small FIFOs because the remainder
|
||||
* would be less than 1 full frame. In this case, we size
|
||||
* it to allow at least a full frame above the high water
|
||||
* mark. */
|
||||
if (pba < E1000_PBA_16K)
|
||||
fc_high_water_mark = (pba * 1024) - 1600;
|
||||
|
||||
adapter->hw.fc_high_water = fc_high_water_mark;
|
||||
adapter->hw.fc_low_water = fc_high_water_mark - 8;
|
||||
|
@ -564,6 +636,23 @@ e1000_reset(struct e1000_adapter *adapter)
|
|||
|
||||
e1000_reset_adaptive(&adapter->hw);
|
||||
e1000_phy_get_info(&adapter->hw, &adapter->phy_info);
|
||||
|
||||
if (!adapter->smart_power_down &&
|
||||
(adapter->hw.mac_type == e1000_82571 ||
|
||||
adapter->hw.mac_type == e1000_82572)) {
|
||||
uint16_t phy_data = 0;
|
||||
/* speed up time to link by disabling smart power down, ignore
|
||||
* the return value of this function because there is nothing
|
||||
* different we would do if it failed */
|
||||
e1000_read_phy_reg(&adapter->hw, IGP02E1000_PHY_POWER_MGMT,
|
||||
&phy_data);
|
||||
phy_data &= ~IGP02E1000_PM_SPD;
|
||||
e1000_write_phy_reg(&adapter->hw, IGP02E1000_PHY_POWER_MGMT,
|
||||
phy_data);
|
||||
}
|
||||
|
||||
if (adapter->hw.mac_type < e1000_ich8lan)
|
||||
/* FIXME: this code is duplicate and wrong for PCI Express */
|
||||
if (adapter->en_mng_pt) {
|
||||
manc = E1000_READ_REG(&adapter->hw, MANC);
|
||||
manc |= (E1000_MANC_ARP_EN | E1000_MANC_EN_MNG2HOST);
|
||||
|
@ -590,6 +679,7 @@ e1000_probe(struct pci_dev *pdev,
|
|||
struct net_device *netdev;
|
||||
struct e1000_adapter *adapter;
|
||||
unsigned long mmio_start, mmio_len;
|
||||
unsigned long flash_start, flash_len;
|
||||
|
||||
static int cards_found = 0;
|
||||
static int e1000_ksp3_port_a = 0; /* global ksp3 port a indication */
|
||||
|
@ -599,10 +689,12 @@ e1000_probe(struct pci_dev *pdev,
|
|||
if ((err = pci_enable_device(pdev)))
|
||||
return err;
|
||||
|
||||
if (!(err = pci_set_dma_mask(pdev, DMA_64BIT_MASK))) {
|
||||
if (!(err = pci_set_dma_mask(pdev, DMA_64BIT_MASK)) &&
|
||||
!(err = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK))) {
|
||||
pci_using_dac = 1;
|
||||
} else {
|
||||
if ((err = pci_set_dma_mask(pdev, DMA_32BIT_MASK))) {
|
||||
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;
|
||||
}
|
||||
|
@ -682,6 +774,19 @@ e1000_probe(struct pci_dev *pdev,
|
|||
if ((err = e1000_sw_init(adapter)))
|
||||
goto err_sw_init;
|
||||
|
||||
/* Flash BAR mapping must happen after e1000_sw_init
|
||||
* because it depends on mac_type */
|
||||
if ((adapter->hw.mac_type == e1000_ich8lan) &&
|
||||
(pci_resource_flags(pdev, 1) & IORESOURCE_MEM)) {
|
||||
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;
|
||||
goto err_flashmap;
|
||||
}
|
||||
}
|
||||
|
||||
if ((err = e1000_check_phy_reset_block(&adapter->hw)))
|
||||
DPRINTK(PROBE, INFO, "PHY reset is blocked due to SOL/IDER session.\n");
|
||||
|
||||
|
@ -700,6 +805,8 @@ e1000_probe(struct pci_dev *pdev,
|
|||
NETIF_F_HW_VLAN_TX |
|
||||
NETIF_F_HW_VLAN_RX |
|
||||
NETIF_F_HW_VLAN_FILTER;
|
||||
if (adapter->hw.mac_type == e1000_ich8lan)
|
||||
netdev->features &= ~NETIF_F_HW_VLAN_FILTER;
|
||||
}
|
||||
|
||||
#ifdef NETIF_F_TSO
|
||||
|
@ -715,11 +822,17 @@ e1000_probe(struct pci_dev *pdev,
|
|||
if (pci_using_dac)
|
||||
netdev->features |= NETIF_F_HIGHDMA;
|
||||
|
||||
/* hard_start_xmit is safe against parallel locking */
|
||||
netdev->features |= NETIF_F_LLTX;
|
||||
|
||||
adapter->en_mng_pt = e1000_enable_mng_pass_thru(&adapter->hw);
|
||||
|
||||
/* initialize eeprom parameters */
|
||||
|
||||
if (e1000_init_eeprom_params(&adapter->hw)) {
|
||||
E1000_ERR("EEPROM initialization failed\n");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
/* before reading the EEPROM, reset the controller to
|
||||
* put the device in a known good starting state */
|
||||
|
||||
|
@ -758,9 +871,6 @@ e1000_probe(struct pci_dev *pdev,
|
|||
adapter->watchdog_timer.function = &e1000_watchdog;
|
||||
adapter->watchdog_timer.data = (unsigned long) adapter;
|
||||
|
||||
INIT_WORK(&adapter->watchdog_task,
|
||||
(void (*)(void *))e1000_watchdog_task, adapter);
|
||||
|
||||
init_timer(&adapter->phy_info_timer);
|
||||
adapter->phy_info_timer.function = &e1000_update_phy_info;
|
||||
adapter->phy_info_timer.data = (unsigned long) adapter;
|
||||
|
@ -790,6 +900,11 @@ e1000_probe(struct pci_dev *pdev,
|
|||
EEPROM_INIT_CONTROL2_REG, 1, &eeprom_data);
|
||||
eeprom_apme_mask = E1000_EEPROM_82544_APM;
|
||||
break;
|
||||
case e1000_ich8lan:
|
||||
e1000_read_eeprom(&adapter->hw,
|
||||
EEPROM_INIT_CONTROL1_REG, 1, &eeprom_data);
|
||||
eeprom_apme_mask = E1000_EEPROM_ICH8_APME;
|
||||
break;
|
||||
case e1000_82546:
|
||||
case e1000_82546_rev_3:
|
||||
case e1000_82571:
|
||||
|
@ -849,6 +964,9 @@ e1000_probe(struct pci_dev *pdev,
|
|||
return 0;
|
||||
|
||||
err_register:
|
||||
if (adapter->hw.flash_address)
|
||||
iounmap(adapter->hw.flash_address);
|
||||
err_flashmap:
|
||||
err_sw_init:
|
||||
err_eeprom:
|
||||
iounmap(adapter->hw.hw_addr);
|
||||
|
@ -882,6 +1000,7 @@ e1000_remove(struct pci_dev *pdev)
|
|||
flush_scheduled_work();
|
||||
|
||||
if (adapter->hw.mac_type >= e1000_82540 &&
|
||||
adapter->hw.mac_type != e1000_ich8lan &&
|
||||
adapter->hw.media_type == e1000_media_type_copper) {
|
||||
manc = E1000_READ_REG(&adapter->hw, MANC);
|
||||
if (manc & E1000_MANC_SMBUS_EN) {
|
||||
|
@ -910,6 +1029,8 @@ e1000_remove(struct pci_dev *pdev)
|
|||
#endif
|
||||
|
||||
iounmap(adapter->hw.hw_addr);
|
||||
if (adapter->hw.flash_address)
|
||||
iounmap(adapter->hw.flash_address);
|
||||
pci_release_regions(pdev);
|
||||
|
||||
free_netdev(netdev);
|
||||
|
@ -960,13 +1081,6 @@ e1000_sw_init(struct e1000_adapter *adapter)
|
|||
return -EIO;
|
||||
}
|
||||
|
||||
/* initialize eeprom parameters */
|
||||
|
||||
if (e1000_init_eeprom_params(hw)) {
|
||||
E1000_ERR("EEPROM initialization failed\n");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
switch (hw->mac_type) {
|
||||
default:
|
||||
break;
|
||||
|
@ -1078,6 +1192,10 @@ e1000_open(struct net_device *netdev)
|
|||
struct e1000_adapter *adapter = netdev_priv(netdev);
|
||||
int err;
|
||||
|
||||
/* disallow open during test */
|
||||
if (test_bit(__E1000_DRIVER_TESTING, &adapter->flags))
|
||||
return -EBUSY;
|
||||
|
||||
/* allocate transmit descriptors */
|
||||
|
||||
if ((err = e1000_setup_all_tx_resources(adapter)))
|
||||
|
@ -1088,6 +1206,12 @@ e1000_open(struct net_device *netdev)
|
|||
if ((err = e1000_setup_all_rx_resources(adapter)))
|
||||
goto err_setup_rx;
|
||||
|
||||
err = e1000_request_irq(adapter);
|
||||
if (err)
|
||||
goto err_up;
|
||||
|
||||
e1000_power_up_phy(adapter);
|
||||
|
||||
if ((err = e1000_up(adapter)))
|
||||
goto err_up;
|
||||
adapter->mng_vlan_id = E1000_MNG_VLAN_NONE;
|
||||
|
@ -1131,7 +1255,10 @@ e1000_close(struct net_device *netdev)
|
|||
{
|
||||
struct e1000_adapter *adapter = netdev_priv(netdev);
|
||||
|
||||
WARN_ON(test_bit(__E1000_RESETTING, &adapter->flags));
|
||||
e1000_down(adapter);
|
||||
e1000_power_down_phy(adapter);
|
||||
e1000_free_irq(adapter);
|
||||
|
||||
e1000_free_all_tx_resources(adapter);
|
||||
e1000_free_all_rx_resources(adapter);
|
||||
|
@ -1189,8 +1316,7 @@ e1000_setup_tx_resources(struct e1000_adapter *adapter,
|
|||
int size;
|
||||
|
||||
size = sizeof(struct e1000_buffer) * txdr->count;
|
||||
|
||||
txdr->buffer_info = vmalloc_node(size, pcibus_to_node(pdev->bus));
|
||||
txdr->buffer_info = vmalloc(size);
|
||||
if (!txdr->buffer_info) {
|
||||
DPRINTK(PROBE, ERR,
|
||||
"Unable to allocate memory for the transmit descriptor ring\n");
|
||||
|
@ -1302,11 +1428,11 @@ e1000_configure_tx(struct e1000_adapter *adapter)
|
|||
tdba = adapter->tx_ring[0].dma;
|
||||
tdlen = adapter->tx_ring[0].count *
|
||||
sizeof(struct e1000_tx_desc);
|
||||
E1000_WRITE_REG(hw, TDBAL, (tdba & 0x00000000ffffffffULL));
|
||||
E1000_WRITE_REG(hw, TDBAH, (tdba >> 32));
|
||||
E1000_WRITE_REG(hw, TDLEN, tdlen);
|
||||
E1000_WRITE_REG(hw, TDH, 0);
|
||||
E1000_WRITE_REG(hw, TDBAH, (tdba >> 32));
|
||||
E1000_WRITE_REG(hw, TDBAL, (tdba & 0x00000000ffffffffULL));
|
||||
E1000_WRITE_REG(hw, TDT, 0);
|
||||
E1000_WRITE_REG(hw, TDH, 0);
|
||||
adapter->tx_ring[0].tdh = E1000_TDH;
|
||||
adapter->tx_ring[0].tdt = E1000_TDT;
|
||||
break;
|
||||
|
@ -1418,7 +1544,7 @@ e1000_setup_rx_resources(struct e1000_adapter *adapter,
|
|||
int size, desc_len;
|
||||
|
||||
size = sizeof(struct e1000_buffer) * rxdr->count;
|
||||
rxdr->buffer_info = vmalloc_node(size, pcibus_to_node(pdev->bus));
|
||||
rxdr->buffer_info = vmalloc(size);
|
||||
if (!rxdr->buffer_info) {
|
||||
DPRINTK(PROBE, ERR,
|
||||
"Unable to allocate memory for the receive descriptor ring\n");
|
||||
|
@ -1560,9 +1686,6 @@ e1000_setup_rctl(struct e1000_adapter *adapter)
|
|||
E1000_RCTL_LBM_NO | E1000_RCTL_RDMTS_HALF |
|
||||
(adapter->hw.mc_filter_type << E1000_RCTL_MO_SHIFT);
|
||||
|
||||
if (adapter->hw.mac_type > e1000_82543)
|
||||
rctl |= E1000_RCTL_SECRC;
|
||||
|
||||
if (adapter->hw.tbi_compatibility_on == 1)
|
||||
rctl |= E1000_RCTL_SBP;
|
||||
else
|
||||
|
@ -1628,7 +1751,7 @@ e1000_setup_rctl(struct e1000_adapter *adapter)
|
|||
rfctl |= E1000_RFCTL_IPV6_DIS;
|
||||
E1000_WRITE_REG(&adapter->hw, RFCTL, rfctl);
|
||||
|
||||
rctl |= E1000_RCTL_DTYP_PS | E1000_RCTL_SECRC;
|
||||
rctl |= E1000_RCTL_DTYP_PS;
|
||||
|
||||
psrctl |= adapter->rx_ps_bsize0 >>
|
||||
E1000_PSRCTL_BSIZE0_SHIFT;
|
||||
|
@ -1712,11 +1835,11 @@ e1000_configure_rx(struct e1000_adapter *adapter)
|
|||
case 1:
|
||||
default:
|
||||
rdba = adapter->rx_ring[0].dma;
|
||||
E1000_WRITE_REG(hw, RDBAL, (rdba & 0x00000000ffffffffULL));
|
||||
E1000_WRITE_REG(hw, RDBAH, (rdba >> 32));
|
||||
E1000_WRITE_REG(hw, RDLEN, rdlen);
|
||||
E1000_WRITE_REG(hw, RDH, 0);
|
||||
E1000_WRITE_REG(hw, RDBAH, (rdba >> 32));
|
||||
E1000_WRITE_REG(hw, RDBAL, (rdba & 0x00000000ffffffffULL));
|
||||
E1000_WRITE_REG(hw, RDT, 0);
|
||||
E1000_WRITE_REG(hw, RDH, 0);
|
||||
adapter->rx_ring[0].rdh = E1000_RDH;
|
||||
adapter->rx_ring[0].rdt = E1000_RDT;
|
||||
break;
|
||||
|
@ -1741,9 +1864,6 @@ e1000_configure_rx(struct e1000_adapter *adapter)
|
|||
E1000_WRITE_REG(hw, RXCSUM, rxcsum);
|
||||
}
|
||||
|
||||
if (hw->mac_type == e1000_82573)
|
||||
E1000_WRITE_REG(hw, ERT, 0x0100);
|
||||
|
||||
/* Enable Receives */
|
||||
E1000_WRITE_REG(hw, RCTL, rctl);
|
||||
}
|
||||
|
@ -2083,6 +2203,12 @@ e1000_set_multi(struct net_device *netdev)
|
|||
uint32_t rctl;
|
||||
uint32_t hash_value;
|
||||
int i, rar_entries = E1000_RAR_ENTRIES;
|
||||
int mta_reg_count = (hw->mac_type == e1000_ich8lan) ?
|
||||
E1000_NUM_MTA_REGISTERS_ICH8LAN :
|
||||
E1000_NUM_MTA_REGISTERS;
|
||||
|
||||
if (adapter->hw.mac_type == e1000_ich8lan)
|
||||
rar_entries = E1000_RAR_ENTRIES_ICH8LAN;
|
||||
|
||||
/* reserve RAR[14] for LAA over-write work-around */
|
||||
if (adapter->hw.mac_type == e1000_82571)
|
||||
|
@ -2121,14 +2247,18 @@ e1000_set_multi(struct net_device *netdev)
|
|||
mc_ptr = mc_ptr->next;
|
||||
} else {
|
||||
E1000_WRITE_REG_ARRAY(hw, RA, i << 1, 0);
|
||||
E1000_WRITE_FLUSH(hw);
|
||||
E1000_WRITE_REG_ARRAY(hw, RA, (i << 1) + 1, 0);
|
||||
E1000_WRITE_FLUSH(hw);
|
||||
}
|
||||
}
|
||||
|
||||
/* clear the old settings from the multicast hash table */
|
||||
|
||||
for (i = 0; i < E1000_NUM_MTA_REGISTERS; i++)
|
||||
for (i = 0; i < mta_reg_count; i++) {
|
||||
E1000_WRITE_REG_ARRAY(hw, MTA, i, 0);
|
||||
E1000_WRITE_FLUSH(hw);
|
||||
}
|
||||
|
||||
/* load any remaining addresses into the hash table */
|
||||
|
||||
|
@ -2201,19 +2331,19 @@ static void
|
|||
e1000_watchdog(unsigned long data)
|
||||
{
|
||||
struct e1000_adapter *adapter = (struct e1000_adapter *) data;
|
||||
|
||||
/* Do the rest outside of interrupt context */
|
||||
schedule_work(&adapter->watchdog_task);
|
||||
}
|
||||
|
||||
static void
|
||||
e1000_watchdog_task(struct e1000_adapter *adapter)
|
||||
{
|
||||
struct net_device *netdev = adapter->netdev;
|
||||
struct e1000_tx_ring *txdr = adapter->tx_ring;
|
||||
uint32_t link, tctl;
|
||||
int32_t ret_val;
|
||||
|
||||
e1000_check_for_link(&adapter->hw);
|
||||
ret_val = e1000_check_for_link(&adapter->hw);
|
||||
if ((ret_val == E1000_ERR_PHY) &&
|
||||
(adapter->hw.phy_type == e1000_phy_igp_3) &&
|
||||
(E1000_READ_REG(&adapter->hw, CTRL) & E1000_PHY_CTRL_GBE_DISABLE)) {
|
||||
/* See e1000_kumeran_lock_loss_workaround() */
|
||||
DPRINTK(LINK, INFO,
|
||||
"Gigabit has been disabled, downgrading speed\n");
|
||||
}
|
||||
if (adapter->hw.mac_type == e1000_82573) {
|
||||
e1000_enable_tx_pkt_filtering(&adapter->hw);
|
||||
if (adapter->mng_vlan_id != adapter->hw.mng_cookie.vlan_id)
|
||||
|
@ -2779,9 +2909,10 @@ e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
|
|||
case e1000_82571:
|
||||
case e1000_82572:
|
||||
case e1000_82573:
|
||||
case e1000_ich8lan:
|
||||
pull_size = min((unsigned int)4, skb->data_len);
|
||||
if (!__pskb_pull_tail(skb, pull_size)) {
|
||||
printk(KERN_ERR
|
||||
DPRINTK(DRV, ERR,
|
||||
"__pskb_pull_tail failed.\n");
|
||||
dev_kfree_skb_any(skb);
|
||||
return NETDEV_TX_OK;
|
||||
|
@ -2919,8 +3050,7 @@ e1000_reset_task(struct net_device *netdev)
|
|||
{
|
||||
struct e1000_adapter *adapter = netdev_priv(netdev);
|
||||
|
||||
e1000_down(adapter);
|
||||
e1000_up(adapter);
|
||||
e1000_reinit_locked(adapter);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -2964,6 +3094,7 @@ e1000_change_mtu(struct net_device *netdev, int new_mtu)
|
|||
/* Adapter-specific max frame size limits. */
|
||||
switch (adapter->hw.mac_type) {
|
||||
case e1000_undefined ... e1000_82542_rev2_1:
|
||||
case e1000_ich8lan:
|
||||
if (max_frame > MAXIMUM_ETHERNET_FRAME_SIZE) {
|
||||
DPRINTK(PROBE, ERR, "Jumbo Frames not supported.\n");
|
||||
return -EINVAL;
|
||||
|
@ -3026,10 +3157,8 @@ e1000_change_mtu(struct net_device *netdev, int new_mtu)
|
|||
|
||||
netdev->mtu = new_mtu;
|
||||
|
||||
if (netif_running(netdev)) {
|
||||
e1000_down(adapter);
|
||||
e1000_up(adapter);
|
||||
}
|
||||
if (netif_running(netdev))
|
||||
e1000_reinit_locked(adapter);
|
||||
|
||||
adapter->hw.max_frame_size = max_frame;
|
||||
|
||||
|
@ -3074,12 +3203,15 @@ e1000_update_stats(struct e1000_adapter *adapter)
|
|||
adapter->stats.bprc += E1000_READ_REG(hw, BPRC);
|
||||
adapter->stats.mprc += E1000_READ_REG(hw, MPRC);
|
||||
adapter->stats.roc += E1000_READ_REG(hw, ROC);
|
||||
|
||||
if (adapter->hw.mac_type != e1000_ich8lan) {
|
||||
adapter->stats.prc64 += E1000_READ_REG(hw, PRC64);
|
||||
adapter->stats.prc127 += E1000_READ_REG(hw, PRC127);
|
||||
adapter->stats.prc255 += E1000_READ_REG(hw, PRC255);
|
||||
adapter->stats.prc511 += E1000_READ_REG(hw, PRC511);
|
||||
adapter->stats.prc1023 += E1000_READ_REG(hw, PRC1023);
|
||||
adapter->stats.prc1522 += E1000_READ_REG(hw, PRC1522);
|
||||
}
|
||||
|
||||
adapter->stats.symerrs += E1000_READ_REG(hw, SYMERRS);
|
||||
adapter->stats.mpc += E1000_READ_REG(hw, MPC);
|
||||
|
@ -3107,12 +3239,16 @@ e1000_update_stats(struct e1000_adapter *adapter)
|
|||
adapter->stats.totl += E1000_READ_REG(hw, TOTL);
|
||||
adapter->stats.toth += E1000_READ_REG(hw, TOTH);
|
||||
adapter->stats.tpr += E1000_READ_REG(hw, TPR);
|
||||
|
||||
if (adapter->hw.mac_type != e1000_ich8lan) {
|
||||
adapter->stats.ptc64 += E1000_READ_REG(hw, PTC64);
|
||||
adapter->stats.ptc127 += E1000_READ_REG(hw, PTC127);
|
||||
adapter->stats.ptc255 += E1000_READ_REG(hw, PTC255);
|
||||
adapter->stats.ptc511 += E1000_READ_REG(hw, PTC511);
|
||||
adapter->stats.ptc1023 += E1000_READ_REG(hw, PTC1023);
|
||||
adapter->stats.ptc1522 += E1000_READ_REG(hw, PTC1522);
|
||||
}
|
||||
|
||||
adapter->stats.mptc += E1000_READ_REG(hw, MPTC);
|
||||
adapter->stats.bptc += E1000_READ_REG(hw, BPTC);
|
||||
|
||||
|
@ -3134,6 +3270,8 @@ e1000_update_stats(struct e1000_adapter *adapter)
|
|||
if (hw->mac_type > e1000_82547_rev_2) {
|
||||
adapter->stats.iac += E1000_READ_REG(hw, IAC);
|
||||
adapter->stats.icrxoc += E1000_READ_REG(hw, ICRXOC);
|
||||
|
||||
if (adapter->hw.mac_type != e1000_ich8lan) {
|
||||
adapter->stats.icrxptc += E1000_READ_REG(hw, ICRXPTC);
|
||||
adapter->stats.icrxatc += E1000_READ_REG(hw, ICRXATC);
|
||||
adapter->stats.ictxptc += E1000_READ_REG(hw, ICTXPTC);
|
||||
|
@ -3141,6 +3279,7 @@ e1000_update_stats(struct e1000_adapter *adapter)
|
|||
adapter->stats.ictxqec += E1000_READ_REG(hw, ICTXQEC);
|
||||
adapter->stats.ictxqmtc += E1000_READ_REG(hw, ICTXQMTC);
|
||||
adapter->stats.icrxdmtc += E1000_READ_REG(hw, ICRXDMTC);
|
||||
}
|
||||
}
|
||||
|
||||
/* Fill out the OS statistics structure */
|
||||
|
@ -3547,7 +3686,8 @@ e1000_clean_rx_irq(struct e1000_adapter *adapter,
|
|||
/* All receives must fit into a single buffer */
|
||||
E1000_DBG("%s: Receive packet consumed multiple"
|
||||
" buffers\n", netdev->name);
|
||||
dev_kfree_skb_irq(skb);
|
||||
/* recycle */
|
||||
buffer_info-> skb = skb;
|
||||
goto next_desc;
|
||||
}
|
||||
|
||||
|
@ -3675,7 +3815,6 @@ e1000_clean_rx_irq_ps(struct e1000_adapter *adapter,
|
|||
buffer_info = &rx_ring->buffer_info[i];
|
||||
|
||||
while (staterr & E1000_RXD_STAT_DD) {
|
||||
buffer_info = &rx_ring->buffer_info[i];
|
||||
ps_page = &rx_ring->ps_page[i];
|
||||
ps_page_dma = &rx_ring->ps_page_dma[i];
|
||||
#ifdef CONFIG_E1000_NAPI
|
||||
|
@ -4180,10 +4319,9 @@ e1000_mii_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
|
|||
return retval;
|
||||
}
|
||||
}
|
||||
if (netif_running(adapter->netdev)) {
|
||||
e1000_down(adapter);
|
||||
e1000_up(adapter);
|
||||
} else
|
||||
if (netif_running(adapter->netdev))
|
||||
e1000_reinit_locked(adapter);
|
||||
else
|
||||
e1000_reset(adapter);
|
||||
break;
|
||||
case M88E1000_PHY_SPEC_CTRL:
|
||||
|
@ -4200,10 +4338,9 @@ e1000_mii_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
|
|||
case PHY_CTRL:
|
||||
if (mii_reg & MII_CR_POWER_DOWN)
|
||||
break;
|
||||
if (netif_running(adapter->netdev)) {
|
||||
e1000_down(adapter);
|
||||
e1000_up(adapter);
|
||||
} else
|
||||
if (netif_running(adapter->netdev))
|
||||
e1000_reinit_locked(adapter);
|
||||
else
|
||||
e1000_reset(adapter);
|
||||
break;
|
||||
}
|
||||
|
@ -4277,18 +4414,21 @@ e1000_vlan_rx_register(struct net_device *netdev, struct vlan_group *grp)
|
|||
ctrl |= E1000_CTRL_VME;
|
||||
E1000_WRITE_REG(&adapter->hw, CTRL, ctrl);
|
||||
|
||||
if (adapter->hw.mac_type != e1000_ich8lan) {
|
||||
/* enable VLAN receive filtering */
|
||||
rctl = E1000_READ_REG(&adapter->hw, RCTL);
|
||||
rctl |= E1000_RCTL_VFE;
|
||||
rctl &= ~E1000_RCTL_CFIEN;
|
||||
E1000_WRITE_REG(&adapter->hw, RCTL, rctl);
|
||||
e1000_update_mng_vlan(adapter);
|
||||
}
|
||||
} else {
|
||||
/* disable VLAN tag insert/strip */
|
||||
ctrl = E1000_READ_REG(&adapter->hw, CTRL);
|
||||
ctrl &= ~E1000_CTRL_VME;
|
||||
E1000_WRITE_REG(&adapter->hw, CTRL, ctrl);
|
||||
|
||||
if (adapter->hw.mac_type != e1000_ich8lan) {
|
||||
/* disable VLAN filtering */
|
||||
rctl = E1000_READ_REG(&adapter->hw, RCTL);
|
||||
rctl &= ~E1000_RCTL_VFE;
|
||||
|
@ -4297,6 +4437,7 @@ e1000_vlan_rx_register(struct net_device *netdev, struct vlan_group *grp)
|
|||
e1000_vlan_rx_kill_vid(netdev, adapter->mng_vlan_id);
|
||||
adapter->mng_vlan_id = E1000_MNG_VLAN_NONE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
e1000_irq_enable(adapter);
|
||||
|
@ -4458,12 +4599,16 @@ e1000_suspend(struct pci_dev *pdev, pm_message_t state)
|
|||
struct e1000_adapter *adapter = netdev_priv(netdev);
|
||||
uint32_t ctrl, ctrl_ext, rctl, manc, status;
|
||||
uint32_t wufc = adapter->wol;
|
||||
#ifdef CONFIG_PM
|
||||
int retval = 0;
|
||||
#endif
|
||||
|
||||
netif_device_detach(netdev);
|
||||
|
||||
if (netif_running(netdev))
|
||||
if (netif_running(netdev)) {
|
||||
WARN_ON(test_bit(__E1000_RESETTING, &adapter->flags));
|
||||
e1000_down(adapter);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
/* Implement our own version of pci_save_state(pdev) because pci-
|
||||
|
@ -4521,7 +4666,9 @@ e1000_suspend(struct pci_dev *pdev, pm_message_t state)
|
|||
pci_enable_wake(pdev, PCI_D3cold, 0);
|
||||
}
|
||||
|
||||
/* FIXME: this code is incorrect for PCI Express */
|
||||
if (adapter->hw.mac_type >= e1000_82540 &&
|
||||
adapter->hw.mac_type != e1000_ich8lan &&
|
||||
adapter->hw.media_type == e1000_media_type_copper) {
|
||||
manc = E1000_READ_REG(&adapter->hw, MANC);
|
||||
if (manc & E1000_MANC_SMBUS_EN) {
|
||||
|
@ -4532,6 +4679,9 @@ e1000_suspend(struct pci_dev *pdev, pm_message_t state)
|
|||
}
|
||||
}
|
||||
|
||||
if (adapter->hw.phy_type == e1000_phy_igp_3)
|
||||
e1000_phy_powerdown_workaround(&adapter->hw);
|
||||
|
||||
/* Release control of h/w to f/w. If f/w is AMT enabled, this
|
||||
* would have already happened in close and is redundant. */
|
||||
e1000_release_hw_control(adapter);
|
||||
|
@ -4567,7 +4717,9 @@ e1000_resume(struct pci_dev *pdev)
|
|||
|
||||
netif_device_attach(netdev);
|
||||
|
||||
/* FIXME: this code is incorrect for PCI Express */
|
||||
if (adapter->hw.mac_type >= e1000_82540 &&
|
||||
adapter->hw.mac_type != e1000_ich8lan &&
|
||||
adapter->hw.media_type == e1000_media_type_copper) {
|
||||
manc = E1000_READ_REG(&adapter->hw, MANC);
|
||||
manc &= ~(E1000_MANC_ARP_EN);
|
||||
|
|
|
@ -127,4 +127,17 @@ typedef enum {
|
|||
|
||||
#define E1000_WRITE_FLUSH(a) E1000_READ_REG(a, STATUS)
|
||||
|
||||
#define E1000_WRITE_ICH8_REG(a, reg, value) ( \
|
||||
writel((value), ((a)->flash_address + reg)))
|
||||
|
||||
#define E1000_READ_ICH8_REG(a, reg) ( \
|
||||
readl((a)->flash_address + reg))
|
||||
|
||||
#define E1000_WRITE_ICH8_REG16(a, reg, value) ( \
|
||||
writew((value), ((a)->flash_address + reg)))
|
||||
|
||||
#define E1000_READ_ICH8_REG16(a, reg) ( \
|
||||
readw((a)->flash_address + reg))
|
||||
|
||||
|
||||
#endif /* _E1000_OSDEP_H_ */
|
||||
|
|
|
@ -45,6 +45,16 @@
|
|||
*/
|
||||
|
||||
#define E1000_PARAM_INIT { [0 ... E1000_MAX_NIC] = OPTION_UNSET }
|
||||
/* Module Parameters are always initialized to -1, so that the driver
|
||||
* can tell the difference between no user specified value or the
|
||||
* user asking for the default value.
|
||||
* The true default values are loaded in when e1000_check_options is called.
|
||||
*
|
||||
* This is a GCC extension to ANSI C.
|
||||
* See the item "Labeled Elements in Initializers" in the section
|
||||
* "Extensions to the C Language Family" of the GCC documentation.
|
||||
*/
|
||||
|
||||
#define E1000_PARAM(X, desc) \
|
||||
static int __devinitdata X[E1000_MAX_NIC+1] = E1000_PARAM_INIT; \
|
||||
static int num_##X = 0; \
|
||||
|
@ -183,6 +193,24 @@ E1000_PARAM(RxAbsIntDelay, "Receive Absolute Interrupt Delay");
|
|||
|
||||
E1000_PARAM(InterruptThrottleRate, "Interrupt Throttling Rate");
|
||||
|
||||
/* Enable Smart Power Down of the PHY
|
||||
*
|
||||
* Valid Range: 0, 1
|
||||
*
|
||||
* Default Value: 0 (disabled)
|
||||
*/
|
||||
|
||||
E1000_PARAM(SmartPowerDownEnable, "Enable PHY smart power down");
|
||||
|
||||
/* Enable Kumeran Lock Loss workaround
|
||||
*
|
||||
* Valid Range: 0, 1
|
||||
*
|
||||
* Default Value: 1 (enabled)
|
||||
*/
|
||||
|
||||
E1000_PARAM(KumeranLockLoss, "Enable Kumeran lock loss workaround");
|
||||
|
||||
#define AUTONEG_ADV_DEFAULT 0x2F
|
||||
#define AUTONEG_ADV_MASK 0x2F
|
||||
#define FLOW_CONTROL_DEFAULT FLOW_CONTROL_FULL
|
||||
|
@ -296,6 +324,7 @@ 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 */
|
||||
|
@ -313,14 +342,9 @@ e1000_check_options(struct e1000_adapter *adapter)
|
|||
opt.arg.r.max = mac_type < e1000_82544 ?
|
||||
E1000_MAX_TXD : E1000_MAX_82544_TXD;
|
||||
|
||||
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;
|
||||
}
|
||||
tx_ring->count = TxDescriptors[bd];
|
||||
e1000_validate_option(&tx_ring->count, &opt, adapter);
|
||||
E1000_ROUNDUP(tx_ring->count, REQ_TX_DESCRIPTOR_MULTIPLE);
|
||||
for (i = 0; i < adapter->num_tx_queues; i++)
|
||||
tx_ring[i].count = tx_ring->count;
|
||||
}
|
||||
|
@ -339,14 +363,9 @@ e1000_check_options(struct e1000_adapter *adapter)
|
|||
opt.arg.r.max = mac_type < e1000_82544 ? E1000_MAX_RXD :
|
||||
E1000_MAX_82544_RXD;
|
||||
|
||||
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;
|
||||
}
|
||||
rx_ring->count = RxDescriptors[bd];
|
||||
e1000_validate_option(&rx_ring->count, &opt, adapter);
|
||||
E1000_ROUNDUP(rx_ring->count, REQ_RX_DESCRIPTOR_MULTIPLE);
|
||||
for (i = 0; i < adapter->num_rx_queues; i++)
|
||||
rx_ring[i].count = rx_ring->count;
|
||||
}
|
||||
|
@ -358,13 +377,9 @@ e1000_check_options(struct e1000_adapter *adapter)
|
|||
.def = OPTION_ENABLED
|
||||
};
|
||||
|
||||
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;
|
||||
}
|
||||
int rx_csum = XsumRX[bd];
|
||||
e1000_validate_option(&rx_csum, &opt, adapter);
|
||||
adapter->rx_csum = rx_csum;
|
||||
}
|
||||
{ /* Flow Control */
|
||||
|
||||
|
@ -384,13 +399,9 @@ e1000_check_options(struct e1000_adapter *adapter)
|
|||
.p = fc_list }}
|
||||
};
|
||||
|
||||
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;
|
||||
}
|
||||
int fc = FlowControl[bd];
|
||||
e1000_validate_option(&fc, &opt, adapter);
|
||||
adapter->hw.fc = adapter->hw.original_fc = fc;
|
||||
}
|
||||
{ /* Transmit Interrupt Delay */
|
||||
struct e1000_option opt = {
|
||||
|
@ -402,13 +413,8 @@ e1000_check_options(struct e1000_adapter *adapter)
|
|||
.max = MAX_TXDELAY }}
|
||||
};
|
||||
|
||||
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;
|
||||
}
|
||||
adapter->tx_int_delay = TxIntDelay[bd];
|
||||
e1000_validate_option(&adapter->tx_int_delay, &opt, adapter);
|
||||
}
|
||||
{ /* Transmit Absolute Interrupt Delay */
|
||||
struct e1000_option opt = {
|
||||
|
@ -420,13 +426,9 @@ e1000_check_options(struct e1000_adapter *adapter)
|
|||
.max = MAX_TXABSDELAY }}
|
||||
};
|
||||
|
||||
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;
|
||||
}
|
||||
adapter->tx_abs_int_delay = TxAbsIntDelay[bd];
|
||||
e1000_validate_option(&adapter->tx_abs_int_delay, &opt,
|
||||
adapter);
|
||||
}
|
||||
{ /* Receive Interrupt Delay */
|
||||
struct e1000_option opt = {
|
||||
|
@ -438,13 +440,8 @@ e1000_check_options(struct e1000_adapter *adapter)
|
|||
.max = MAX_RXDELAY }}
|
||||
};
|
||||
|
||||
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;
|
||||
}
|
||||
adapter->rx_int_delay = RxIntDelay[bd];
|
||||
e1000_validate_option(&adapter->rx_int_delay, &opt, adapter);
|
||||
}
|
||||
{ /* Receive Absolute Interrupt Delay */
|
||||
struct e1000_option opt = {
|
||||
|
@ -456,13 +453,9 @@ e1000_check_options(struct e1000_adapter *adapter)
|
|||
.max = MAX_RXABSDELAY }}
|
||||
};
|
||||
|
||||
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;
|
||||
}
|
||||
adapter->rx_abs_int_delay = RxAbsIntDelay[bd];
|
||||
e1000_validate_option(&adapter->rx_abs_int_delay, &opt,
|
||||
adapter);
|
||||
}
|
||||
{ /* Interrupt Throttling Rate */
|
||||
struct e1000_option opt = {
|
||||
|
@ -474,26 +467,44 @@ e1000_check_options(struct e1000_adapter *adapter)
|
|||
.max = MAX_ITR }}
|
||||
};
|
||||
|
||||
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;
|
||||
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;
|
||||
}
|
||||
}
|
||||
{ /* Smart Power Down */
|
||||
struct e1000_option opt = {
|
||||
.type = enable_option,
|
||||
.name = "PHY Smart Power Down",
|
||||
.err = "defaulting to Disabled",
|
||||
.def = OPTION_DISABLED
|
||||
};
|
||||
|
||||
int spd = SmartPowerDownEnable[bd];
|
||||
e1000_validate_option(&spd, &opt, adapter);
|
||||
adapter->smart_power_down = spd;
|
||||
}
|
||||
{ /* Kumeran Lock Loss Workaround */
|
||||
struct e1000_option opt = {
|
||||
.type = enable_option,
|
||||
.name = "Kumeran Lock Loss Workaround",
|
||||
.err = "defaulting to Enabled",
|
||||
.def = OPTION_ENABLED
|
||||
};
|
||||
|
||||
int kmrn_lock_loss = KumeranLockLoss[bd];
|
||||
e1000_validate_option(&kmrn_lock_loss, &opt, adapter);
|
||||
adapter->hw.kmrn_lock_loss_workaround_disabled = !kmrn_lock_loss;
|
||||
}
|
||||
|
||||
switch (adapter->hw.media_type) {
|
||||
case e1000_media_type_fiber:
|
||||
|
@ -519,17 +530,18 @@ static void __devinit
|
|||
e1000_check_fiber_options(struct e1000_adapter *adapter)
|
||||
{
|
||||
int bd = adapter->bd_number;
|
||||
if (num_Speed > bd) {
|
||||
bd = bd > E1000_MAX_NIC ? E1000_MAX_NIC : bd;
|
||||
if ((Speed[bd] != OPTION_UNSET)) {
|
||||
DPRINTK(PROBE, INFO, "Speed not valid for fiber adapters, "
|
||||
"parameter ignored\n");
|
||||
}
|
||||
|
||||
if (num_Duplex > bd) {
|
||||
if ((Duplex[bd] != OPTION_UNSET)) {
|
||||
DPRINTK(PROBE, INFO, "Duplex not valid for fiber adapters, "
|
||||
"parameter ignored\n");
|
||||
}
|
||||
|
||||
if ((num_AutoNeg > bd) && (AutoNeg[bd] != 0x20)) {
|
||||
if ((AutoNeg[bd] != OPTION_UNSET) && (AutoNeg[bd] != 0x20)) {
|
||||
DPRINTK(PROBE, INFO, "AutoNeg other than 1000/Full is "
|
||||
"not valid for fiber adapters, "
|
||||
"parameter ignored\n");
|
||||
|
@ -548,6 +560,7 @@ 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, "" },
|
||||
|
@ -564,12 +577,8 @@ e1000_check_copper_options(struct e1000_adapter *adapter)
|
|||
.p = speed_list }}
|
||||
};
|
||||
|
||||
if (num_Speed > bd) {
|
||||
speed = Speed[bd];
|
||||
e1000_validate_option(&speed, &opt, adapter);
|
||||
} else {
|
||||
speed = opt.def;
|
||||
}
|
||||
speed = Speed[bd];
|
||||
e1000_validate_option(&speed, &opt, adapter);
|
||||
}
|
||||
{ /* Duplex */
|
||||
struct e1000_opt_list dplx_list[] = {{ 0, "" },
|
||||
|
@ -591,15 +600,11 @@ e1000_check_copper_options(struct e1000_adapter *adapter)
|
|||
"Speed/Duplex/AutoNeg parameter ignored.\n");
|
||||
return;
|
||||
}
|
||||
if (num_Duplex > bd) {
|
||||
dplx = Duplex[bd];
|
||||
e1000_validate_option(&dplx, &opt, adapter);
|
||||
} else {
|
||||
dplx = opt.def;
|
||||
}
|
||||
dplx = Duplex[bd];
|
||||
e1000_validate_option(&dplx, &opt, adapter);
|
||||
}
|
||||
|
||||
if ((num_AutoNeg > bd) && (speed != 0 || dplx != 0)) {
|
||||
if (AutoNeg[bd] != OPTION_UNSET && (speed != 0 || dplx != 0)) {
|
||||
DPRINTK(PROBE, INFO,
|
||||
"AutoNeg specified along with Speed or Duplex, "
|
||||
"parameter ignored\n");
|
||||
|
@ -648,19 +653,15 @@ e1000_check_copper_options(struct e1000_adapter *adapter)
|
|||
.p = an_list }}
|
||||
};
|
||||
|
||||
if (num_AutoNeg > bd) {
|
||||
an = AutoNeg[bd];
|
||||
e1000_validate_option(&an, &opt, adapter);
|
||||
} else {
|
||||
an = opt.def;
|
||||
}
|
||||
an = AutoNeg[bd];
|
||||
e1000_validate_option(&an, &opt, adapter);
|
||||
adapter->hw.autoneg_advertised = an;
|
||||
}
|
||||
|
||||
switch (speed + dplx) {
|
||||
case 0:
|
||||
adapter->hw.autoneg = adapter->fc_autoneg = 1;
|
||||
if ((num_Speed > bd) && (speed != 0 || dplx != 0))
|
||||
if (Speed[bd] != OPTION_UNSET || Duplex[bd] != OPTION_UNSET)
|
||||
DPRINTK(PROBE, INFO,
|
||||
"Speed and duplex autonegotiation enabled\n");
|
||||
break;
|
||||
|
|
Loading…
Reference in a new issue