|
@@ -40,6 +40,8 @@ tested on both gig copper and gig fiber boards
|
|
* Copyright (C) Linux Networx.
|
|
* Copyright (C) Linux Networx.
|
|
* Massive upgrade to work with the new intel gigabit NICs.
|
|
* Massive upgrade to work with the new intel gigabit NICs.
|
|
* <ebiederman at lnxi dot com>
|
|
* <ebiederman at lnxi dot com>
|
|
|
|
+ *
|
|
|
|
+ * Copyright 2011 Freescale Semiconductor, Inc.
|
|
*/
|
|
*/
|
|
|
|
|
|
#include "e1000.h"
|
|
#include "e1000.h"
|
|
@@ -100,6 +102,7 @@ static struct pci_device_id supported[] = {
|
|
{PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82573E},
|
|
{PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82573E},
|
|
{PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82573E_IAMT},
|
|
{PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82573E_IAMT},
|
|
{PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82573L},
|
|
{PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82573L},
|
|
|
|
+ {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82574L},
|
|
{PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82546GB_QUAD_COPPER_KSP3},
|
|
{PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82546GB_QUAD_COPPER_KSP3},
|
|
{PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_80003ES2LAN_COPPER_DPT},
|
|
{PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_80003ES2LAN_COPPER_DPT},
|
|
{PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_80003ES2LAN_SERDES_DPT},
|
|
{PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_80003ES2LAN_SERDES_DPT},
|
|
@@ -331,7 +334,7 @@ static boolean_t e1000_is_onboard_nvm_eeprom(struct e1000_hw *hw)
|
|
if (hw->mac_type == e1000_ich8lan)
|
|
if (hw->mac_type == e1000_ich8lan)
|
|
return FALSE;
|
|
return FALSE;
|
|
|
|
|
|
- if (hw->mac_type == e1000_82573) {
|
|
|
|
|
|
+ if (hw->mac_type == e1000_82573 || hw->mac_type == e1000_82574) {
|
|
eecd = E1000_READ_REG(hw, EECD);
|
|
eecd = E1000_READ_REG(hw, EECD);
|
|
|
|
|
|
/* Isolate bits 15 & 16 */
|
|
/* Isolate bits 15 & 16 */
|
|
@@ -364,7 +367,7 @@ e1000_acquire_eeprom(struct e1000_hw *hw)
|
|
return -E1000_ERR_SWFW_SYNC;
|
|
return -E1000_ERR_SWFW_SYNC;
|
|
eecd = E1000_READ_REG(hw, EECD);
|
|
eecd = E1000_READ_REG(hw, EECD);
|
|
|
|
|
|
- if (hw->mac_type != e1000_82573) {
|
|
|
|
|
|
+ if (hw->mac_type != e1000_82573 || hw->mac_type != e1000_82574) {
|
|
/* Request EEPROM Access */
|
|
/* Request EEPROM Access */
|
|
if (hw->mac_type > e1000_82544) {
|
|
if (hw->mac_type > e1000_82544) {
|
|
eecd |= E1000_EECD_REQ;
|
|
eecd |= E1000_EECD_REQ;
|
|
@@ -498,6 +501,7 @@ static int32_t e1000_init_eeprom_params(struct e1000_hw *hw)
|
|
eeprom->use_eewr = FALSE;
|
|
eeprom->use_eewr = FALSE;
|
|
break;
|
|
break;
|
|
case e1000_82573:
|
|
case e1000_82573:
|
|
|
|
+ case e1000_82574:
|
|
eeprom->type = e1000_eeprom_spi;
|
|
eeprom->type = e1000_eeprom_spi;
|
|
eeprom->opcode_bits = 8;
|
|
eeprom->opcode_bits = 8;
|
|
eeprom->delay_usec = 1;
|
|
eeprom->delay_usec = 1;
|
|
@@ -1317,6 +1321,9 @@ e1000_set_mac_type(struct e1000_hw *hw)
|
|
case E1000_DEV_ID_82573L:
|
|
case E1000_DEV_ID_82573L:
|
|
hw->mac_type = e1000_82573;
|
|
hw->mac_type = e1000_82573;
|
|
break;
|
|
break;
|
|
|
|
+ case E1000_DEV_ID_82574L:
|
|
|
|
+ hw->mac_type = e1000_82574;
|
|
|
|
+ break;
|
|
case E1000_DEV_ID_80003ES2LAN_COPPER_SPT:
|
|
case E1000_DEV_ID_80003ES2LAN_COPPER_SPT:
|
|
case E1000_DEV_ID_80003ES2LAN_SERDES_SPT:
|
|
case E1000_DEV_ID_80003ES2LAN_SERDES_SPT:
|
|
case E1000_DEV_ID_80003ES2LAN_COPPER_DPT:
|
|
case E1000_DEV_ID_80003ES2LAN_COPPER_DPT:
|
|
@@ -1487,6 +1494,7 @@ e1000_initialize_hardware_bits(struct e1000_hw *hw)
|
|
E1000_WRITE_REG(hw, TARC1, reg_tarc1);
|
|
E1000_WRITE_REG(hw, TARC1, reg_tarc1);
|
|
break;
|
|
break;
|
|
case e1000_82573:
|
|
case e1000_82573:
|
|
|
|
+ case e1000_82574:
|
|
reg_ctrl_ext = E1000_READ_REG(hw, CTRL_EXT);
|
|
reg_ctrl_ext = E1000_READ_REG(hw, CTRL_EXT);
|
|
reg_ctrl_ext &= ~(1 << 23);
|
|
reg_ctrl_ext &= ~(1 << 23);
|
|
reg_ctrl_ext |= (1 << 22);
|
|
reg_ctrl_ext |= (1 << 22);
|
|
@@ -1728,12 +1736,11 @@ e1000_init_hw(struct eth_device *nic)
|
|
| E1000_TXDCTL_FULL_TX_DESC_WB;
|
|
| E1000_TXDCTL_FULL_TX_DESC_WB;
|
|
E1000_WRITE_REG(hw, TXDCTL1, ctrl);
|
|
E1000_WRITE_REG(hw, TXDCTL1, ctrl);
|
|
break;
|
|
break;
|
|
- }
|
|
|
|
-
|
|
|
|
- if (hw->mac_type == e1000_82573) {
|
|
|
|
- uint32_t gcr = E1000_READ_REG(hw, GCR);
|
|
|
|
- gcr |= E1000_GCR_L1_ACT_WITHOUT_L0S_RX;
|
|
|
|
- E1000_WRITE_REG(hw, GCR, gcr);
|
|
|
|
|
|
+ case e1000_82573:
|
|
|
|
+ case e1000_82574:
|
|
|
|
+ reg_data = E1000_READ_REG(hw, GCR);
|
|
|
|
+ reg_data |= E1000_GCR_L1_ACT_WITHOUT_L0S_RX;
|
|
|
|
+ E1000_WRITE_REG(hw, GCR, reg_data);
|
|
}
|
|
}
|
|
|
|
|
|
#if 0
|
|
#if 0
|
|
@@ -1812,6 +1819,7 @@ e1000_setup_link(struct eth_device *nic)
|
|
switch (hw->mac_type) {
|
|
switch (hw->mac_type) {
|
|
case e1000_ich8lan:
|
|
case e1000_ich8lan:
|
|
case e1000_82573:
|
|
case e1000_82573:
|
|
|
|
+ case e1000_82574:
|
|
hw->fc = e1000_fc_full;
|
|
hw->fc = e1000_fc_full;
|
|
break;
|
|
break;
|
|
default:
|
|
default:
|
|
@@ -4560,6 +4568,9 @@ static int e1000_set_phy_type (struct e1000_hw *hw)
|
|
hw->phy_type = e1000_phy_gg82563;
|
|
hw->phy_type = e1000_phy_gg82563;
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
+ case BME1000_E_PHY_ID:
|
|
|
|
+ hw->phy_type = e1000_phy_bm;
|
|
|
|
+ break;
|
|
/* Fall Through */
|
|
/* Fall Through */
|
|
default:
|
|
default:
|
|
/* Should never have loaded on this device */
|
|
/* Should never have loaded on this device */
|
|
@@ -4646,6 +4657,10 @@ e1000_detect_gig_phy(struct e1000_hw *hw)
|
|
if (hw->phy_id == M88E1111_I_PHY_ID)
|
|
if (hw->phy_id == M88E1111_I_PHY_ID)
|
|
match = TRUE;
|
|
match = TRUE;
|
|
break;
|
|
break;
|
|
|
|
+ case e1000_82574:
|
|
|
|
+ if (hw->phy_id == BME1000_E_PHY_ID)
|
|
|
|
+ match = TRUE;
|
|
|
|
+ break;
|
|
case e1000_80003es2lan:
|
|
case e1000_80003es2lan:
|
|
if (hw->phy_id == GG82563_E_PHY_ID)
|
|
if (hw->phy_id == GG82563_E_PHY_ID)
|
|
match = TRUE;
|
|
match = TRUE;
|
|
@@ -4710,6 +4725,7 @@ e1000_set_media_type(struct e1000_hw *hw)
|
|
break;
|
|
break;
|
|
case e1000_ich8lan:
|
|
case e1000_ich8lan:
|
|
case e1000_82573:
|
|
case e1000_82573:
|
|
|
|
+ case e1000_82574:
|
|
/* The STATUS_TBIMODE bit is reserved or reused
|
|
/* The STATUS_TBIMODE bit is reserved or reused
|
|
* for the this device.
|
|
* for the this device.
|
|
*/
|
|
*/
|
|
@@ -5125,6 +5141,7 @@ void e1000_get_bus_type(struct e1000_hw *hw)
|
|
case e1000_82571:
|
|
case e1000_82571:
|
|
case e1000_82572:
|
|
case e1000_82572:
|
|
case e1000_82573:
|
|
case e1000_82573:
|
|
|
|
+ case e1000_82574:
|
|
case e1000_80003es2lan:
|
|
case e1000_80003es2lan:
|
|
hw->bus_type = e1000_bus_type_pci_express;
|
|
hw->bus_type = e1000_bus_type_pci_express;
|
|
break;
|
|
break;
|