Commit 2fbe4526 authored by Bruce Allan's avatar Bruce Allan Committed by Jeff Kirsher

e1000e: initial support for i217

i217 is the next-generation LOM that will be available on systems with the
Lynx Point Platform Controller Hub (PCH) chipset from Intel.  This patch
provides the initial support for the device.
Signed-off-by: default avatarBruce Allan <bruce.w.allan@intel.com>
Tested-by: default avatarJeff Pieper <jeffrey.e.pieper@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent d02c70a8
...@@ -74,7 +74,9 @@ ...@@ -74,7 +74,9 @@
#define E1000_WUS_BC E1000_WUFC_BC #define E1000_WUS_BC E1000_WUFC_BC
/* Extended Device Control */ /* Extended Device Control */
#define E1000_CTRL_EXT_LPCD 0x00000004 /* LCD Power Cycle Done */
#define E1000_CTRL_EXT_SDP3_DATA 0x00000080 /* Value of SW Definable Pin 3 */ #define E1000_CTRL_EXT_SDP3_DATA 0x00000080 /* Value of SW Definable Pin 3 */
#define E1000_CTRL_EXT_FORCE_SMBUS 0x00000004 /* Force SMBus mode*/
#define E1000_CTRL_EXT_EE_RST 0x00002000 /* Reinitialize from EEPROM */ #define E1000_CTRL_EXT_EE_RST 0x00002000 /* Reinitialize from EEPROM */
#define E1000_CTRL_EXT_SPD_BYPS 0x00008000 /* Speed Select Bypass */ #define E1000_CTRL_EXT_SPD_BYPS 0x00008000 /* Speed Select Bypass */
#define E1000_CTRL_EXT_RO_DIS 0x00020000 /* Relaxed Ordering disable */ #define E1000_CTRL_EXT_RO_DIS 0x00020000 /* Relaxed Ordering disable */
...@@ -573,6 +575,7 @@ ...@@ -573,6 +575,7 @@
#define NWAY_AR_ASM_DIR 0x0800 /* Asymmetric Pause Direction bit */ #define NWAY_AR_ASM_DIR 0x0800 /* Asymmetric Pause Direction bit */
/* Link Partner Ability Register (Base Page) */ /* Link Partner Ability Register (Base Page) */
#define NWAY_LPAR_100TX_FD_CAPS 0x0100 /* LP 100TX Full Dplx Capable */
#define NWAY_LPAR_PAUSE 0x0400 /* LP Pause operation desired */ #define NWAY_LPAR_PAUSE 0x0400 /* LP Pause operation desired */
#define NWAY_LPAR_ASM_DIR 0x0800 /* LP Asymmetric Pause Direction bit */ #define NWAY_LPAR_ASM_DIR 0x0800 /* LP Asymmetric Pause Direction bit */
...@@ -739,6 +742,7 @@ ...@@ -739,6 +742,7 @@
#define I82577_E_PHY_ID 0x01540050 #define I82577_E_PHY_ID 0x01540050
#define I82578_E_PHY_ID 0x004DD040 #define I82578_E_PHY_ID 0x004DD040
#define I82579_E_PHY_ID 0x01540090 #define I82579_E_PHY_ID 0x01540090
#define I217_E_PHY_ID 0x015400A0
/* M88E1000 Specific Registers */ /* M88E1000 Specific Registers */
#define M88E1000_PHY_SPEC_CTRL 0x10 /* PHY Specific Control Register */ #define M88E1000_PHY_SPEC_CTRL 0x10 /* PHY Specific Control Register */
...@@ -850,4 +854,8 @@ ...@@ -850,4 +854,8 @@
/* SerDes Control */ /* SerDes Control */
#define E1000_GEN_POLL_TIMEOUT 640 #define E1000_GEN_POLL_TIMEOUT 640
/* FW Semaphore */
#define E1000_FWSM_WLOCK_MAC_MASK 0x0380
#define E1000_FWSM_WLOCK_MAC_SHIFT 7
#endif /* _E1000_DEFINES_H_ */ #endif /* _E1000_DEFINES_H_ */
...@@ -206,6 +206,7 @@ enum e1000_boards { ...@@ -206,6 +206,7 @@ enum e1000_boards {
board_ich10lan, board_ich10lan,
board_pchlan, board_pchlan,
board_pch2lan, board_pch2lan,
board_pch_lpt,
}; };
struct e1000_ps_page { struct e1000_ps_page {
...@@ -528,6 +529,7 @@ extern const struct e1000_info e1000_ich9_info; ...@@ -528,6 +529,7 @@ extern const struct e1000_info e1000_ich9_info;
extern const struct e1000_info e1000_ich10_info; extern const struct e1000_info e1000_ich10_info;
extern const struct e1000_info e1000_pch_info; extern const struct e1000_info e1000_pch_info;
extern const struct e1000_info e1000_pch2_info; extern const struct e1000_info e1000_pch2_info;
extern const struct e1000_info e1000_pch_lpt_info;
extern const struct e1000_info e1000_es2_info; extern const struct e1000_info e1000_es2_info;
extern s32 e1000_read_pba_string_generic(struct e1000_hw *hw, u8 *pba_num, extern s32 e1000_read_pba_string_generic(struct e1000_hw *hw, u8 *pba_num,
......
...@@ -773,6 +773,7 @@ static int e1000_reg_test(struct e1000_adapter *adapter, u64 *data) ...@@ -773,6 +773,7 @@ static int e1000_reg_test(struct e1000_adapter *adapter, u64 *data)
u32 i; u32 i;
u32 toggle; u32 toggle;
u32 mask; u32 mask;
u32 wlock_mac = 0;
/* /*
* The status register is Read Only, so a write should fail. * The status register is Read Only, so a write should fail.
...@@ -838,19 +839,31 @@ static int e1000_reg_test(struct e1000_adapter *adapter, u64 *data) ...@@ -838,19 +839,31 @@ static int e1000_reg_test(struct e1000_adapter *adapter, u64 *data)
case e1000_ich10lan: case e1000_ich10lan:
case e1000_pchlan: case e1000_pchlan:
case e1000_pch2lan: case e1000_pch2lan:
case e1000_pch_lpt:
mask |= (1 << 18); mask |= (1 << 18);
break; break;
default: default:
break; break;
} }
for (i = 0; i < mac->rar_entry_count; i++)
if (mac->type == e1000_pch_lpt)
wlock_mac = (er32(FWSM) & E1000_FWSM_WLOCK_MAC_MASK) >>
E1000_FWSM_WLOCK_MAC_SHIFT;
for (i = 0; i < mac->rar_entry_count; i++) {
/* Cannot test write-protected SHRAL[n] registers */
if ((wlock_mac == 1) || (wlock_mac && (i > wlock_mac)))
continue;
REG_PATTERN_TEST_ARRAY(E1000_RA, ((i << 1) + 1), REG_PATTERN_TEST_ARRAY(E1000_RA, ((i << 1) + 1),
mask, 0xFFFFFFFF); mask, 0xFFFFFFFF);
}
for (i = 0; i < mac->mta_reg_count; i++) for (i = 0; i < mac->mta_reg_count; i++)
REG_PATTERN_TEST_ARRAY(E1000_MTA, i, 0xFFFFFFFF, 0xFFFFFFFF); REG_PATTERN_TEST_ARRAY(E1000_MTA, i, 0xFFFFFFFF, 0xFFFFFFFF);
*data = 0; *data = 0;
return 0; return 0;
} }
......
...@@ -200,6 +200,10 @@ enum e1e_registers { ...@@ -200,6 +200,10 @@ enum e1e_registers {
#define E1000_RA (E1000_RAL(0)) #define E1000_RA (E1000_RAL(0))
E1000_RAH_BASE = 0x05404, /* Receive Address High - RW */ E1000_RAH_BASE = 0x05404, /* Receive Address High - RW */
#define E1000_RAH(_n) (E1000_RAH_BASE + ((_n) * 8)) #define E1000_RAH(_n) (E1000_RAH_BASE + ((_n) * 8))
E1000_SHRAL_PCH_LPT_BASE = 0x05408,
#define E1000_SHRAL_PCH_LPT(_n) (E1000_SHRAL_PCH_LPT_BASE + ((_n) * 8))
E1000_SHRAH_PCH_LTP_BASE = 0x0540C,
#define E1000_SHRAH_PCH_LPT(_n) (E1000_SHRAH_PCH_LTP_BASE + ((_n) * 8))
E1000_SHRAL_BASE = 0x05438, /* Shared Receive Address Low - RW */ E1000_SHRAL_BASE = 0x05438, /* Shared Receive Address Low - RW */
#define E1000_SHRAL(_n) (E1000_SHRAL_BASE + ((_n) * 8)) #define E1000_SHRAL(_n) (E1000_SHRAL_BASE + ((_n) * 8))
E1000_SHRAH_BASE = 0x0543C, /* Shared Receive Address High - RW */ E1000_SHRAH_BASE = 0x0543C, /* Shared Receive Address High - RW */
...@@ -406,6 +410,8 @@ enum e1e_registers { ...@@ -406,6 +410,8 @@ enum e1e_registers {
#define E1000_DEV_ID_PCH_D_HV_DC 0x10F0 #define E1000_DEV_ID_PCH_D_HV_DC 0x10F0
#define E1000_DEV_ID_PCH2_LV_LM 0x1502 #define E1000_DEV_ID_PCH2_LV_LM 0x1502
#define E1000_DEV_ID_PCH2_LV_V 0x1503 #define E1000_DEV_ID_PCH2_LV_V 0x1503
#define E1000_DEV_ID_PCH_LPT_I217_LM 0x153A
#define E1000_DEV_ID_PCH_LPT_I217_V 0x153B
#define E1000_REVISION_4 4 #define E1000_REVISION_4 4
...@@ -426,6 +432,7 @@ enum e1000_mac_type { ...@@ -426,6 +432,7 @@ enum e1000_mac_type {
e1000_ich10lan, e1000_ich10lan,
e1000_pchlan, e1000_pchlan,
e1000_pch2lan, e1000_pch2lan,
e1000_pch_lpt,
}; };
enum e1000_media_type { enum e1000_media_type {
...@@ -463,6 +470,7 @@ enum e1000_phy_type { ...@@ -463,6 +470,7 @@ enum e1000_phy_type {
e1000_phy_82578, e1000_phy_82578,
e1000_phy_82577, e1000_phy_82577,
e1000_phy_82579, e1000_phy_82579,
e1000_phy_i217,
}; };
enum e1000_bus_width { enum e1000_bus_width {
...@@ -971,6 +979,7 @@ struct e1000_dev_spec_ich8lan { ...@@ -971,6 +979,7 @@ struct e1000_dev_spec_ich8lan {
struct e1000_shadow_ram shadow_ram[E1000_ICH8_SHADOW_RAM_WORDS]; struct e1000_shadow_ram shadow_ram[E1000_ICH8_SHADOW_RAM_WORDS];
bool nvm_k1_enabled; bool nvm_k1_enabled;
bool eee_disable; bool eee_disable;
u16 eee_lp_ability;
}; };
struct e1000_hw { struct e1000_hw {
......
This diff is collapsed.
...@@ -79,6 +79,7 @@ static const struct e1000_info *e1000_info_tbl[] = { ...@@ -79,6 +79,7 @@ static const struct e1000_info *e1000_info_tbl[] = {
[board_ich10lan] = &e1000_ich10_info, [board_ich10lan] = &e1000_ich10_info,
[board_pchlan] = &e1000_pch_info, [board_pchlan] = &e1000_pch_info,
[board_pch2lan] = &e1000_pch2_info, [board_pch2lan] = &e1000_pch2_info,
[board_pch_lpt] = &e1000_pch_lpt_info,
}; };
struct e1000_reg_info { struct e1000_reg_info {
...@@ -2863,8 +2864,8 @@ static void e1000_setup_rctl(struct e1000_adapter *adapter) ...@@ -2863,8 +2864,8 @@ static void e1000_setup_rctl(struct e1000_adapter *adapter)
u32 rctl, rfctl; u32 rctl, rfctl;
u32 pages = 0; u32 pages = 0;
/* Workaround Si errata on 82579 - configure jumbo frame flow */ /* Workaround Si errata on PCHx - configure jumbo frame flow */
if (hw->mac.type == e1000_pch2lan) { if (hw->mac.type >= e1000_pch2lan) {
s32 ret_val; s32 ret_val;
if (adapter->netdev->mtu > ETH_DATA_LEN) if (adapter->netdev->mtu > ETH_DATA_LEN)
...@@ -3487,6 +3488,7 @@ void e1000e_reset(struct e1000_adapter *adapter) ...@@ -3487,6 +3488,7 @@ void e1000e_reset(struct e1000_adapter *adapter)
fc->refresh_time = 0x1000; fc->refresh_time = 0x1000;
break; break;
case e1000_pch2lan: case e1000_pch2lan:
case e1000_pch_lpt:
fc->high_water = 0x05C20; fc->high_water = 0x05C20;
fc->low_water = 0x05048; fc->low_water = 0x05048;
fc->pause_time = 0x0650; fc->pause_time = 0x0650;
...@@ -5264,11 +5266,11 @@ static int e1000_change_mtu(struct net_device *netdev, int new_mtu) ...@@ -5264,11 +5266,11 @@ static int e1000_change_mtu(struct net_device *netdev, int new_mtu)
return -EINVAL; return -EINVAL;
} }
/* Jumbo frame workaround on 82579 requires CRC be stripped */ /* Jumbo frame workaround on 82579 and newer requires CRC be stripped */
if ((adapter->hw.mac.type == e1000_pch2lan) && if ((adapter->hw.mac.type >= e1000_pch2lan) &&
!(adapter->flags2 & FLAG2_CRC_STRIPPING) && !(adapter->flags2 & FLAG2_CRC_STRIPPING) &&
(new_mtu > ETH_DATA_LEN)) { (new_mtu > ETH_DATA_LEN)) {
e_err("Jumbo Frames not supported on 82579 when CRC stripping is disabled.\n"); e_err("Jumbo Frames not supported on this device when CRC stripping is disabled.\n");
return -EINVAL; return -EINVAL;
} }
...@@ -5665,7 +5667,7 @@ static int __e1000_resume(struct pci_dev *pdev) ...@@ -5665,7 +5667,7 @@ static int __e1000_resume(struct pci_dev *pdev)
return err; return err;
} }
if (hw->mac.type == e1000_pch2lan) if (hw->mac.type >= e1000_pch2lan)
e1000_resume_workarounds_pchlan(&adapter->hw); e1000_resume_workarounds_pchlan(&adapter->hw);
e1000e_power_up_phy(adapter); e1000e_power_up_phy(adapter);
...@@ -6564,6 +6566,9 @@ static DEFINE_PCI_DEVICE_TABLE(e1000_pci_tbl) = { ...@@ -6564,6 +6566,9 @@ static DEFINE_PCI_DEVICE_TABLE(e1000_pci_tbl) = {
{ PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH2_LV_LM), board_pch2lan }, { PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH2_LV_LM), board_pch2lan },
{ PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH2_LV_V), board_pch2lan }, { PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH2_LV_V), board_pch2lan },
{ PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_LPT_I217_LM), board_pch_lpt },
{ PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_LPT_I217_V), board_pch_lpt },
{ 0, 0, 0, 0, 0, 0, 0 } /* terminate list */ { 0, 0, 0, 0, 0, 0, 0 } /* terminate list */
}; };
MODULE_DEVICE_TABLE(pci, e1000_pci_tbl); MODULE_DEVICE_TABLE(pci, e1000_pci_tbl);
......
...@@ -2335,6 +2335,9 @@ enum e1000_phy_type e1000e_get_phy_type_from_id(u32 phy_id) ...@@ -2335,6 +2335,9 @@ enum e1000_phy_type e1000e_get_phy_type_from_id(u32 phy_id)
case I82579_E_PHY_ID: case I82579_E_PHY_ID:
phy_type = e1000_phy_82579; phy_type = e1000_phy_82579;
break; break;
case I217_E_PHY_ID:
phy_type = e1000_phy_i217;
break;
default: default:
phy_type = e1000_phy_unknown; phy_type = e1000_phy_unknown;
break; break;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment