mirror of
https://github.com/opnsense/src.git
synced 2026-02-12 23:36:07 -05:00
e1000: Add support for Kaby Lake generation i219 (4) and i219 (5) devices
MFC after: 1 week Sponsored by: Intel Corporation
This commit is contained in:
parent
ad9dadc437
commit
295df609df
5 changed files with 47 additions and 43 deletions
|
|
@ -101,7 +101,6 @@ static s32 e1000_validate_nvm_checksum_with_offset(struct e1000_hw *hw,
|
|||
u16 offset);
|
||||
static s32 e1000_validate_nvm_checksum_i350(struct e1000_hw *hw);
|
||||
static s32 e1000_update_nvm_checksum_i350(struct e1000_hw *hw);
|
||||
static void e1000_write_vfta_i350(struct e1000_hw *hw, u32 offset, u32 value);
|
||||
static void e1000_clear_vfta_i350(struct e1000_hw *hw);
|
||||
|
||||
static void e1000_i2c_start(struct e1000_hw *hw);
|
||||
|
|
|
|||
|
|
@ -493,6 +493,7 @@ enum e1000_promisc_type {
|
|||
void e1000_vfta_set_vf(struct e1000_hw *, u16, bool);
|
||||
void e1000_rlpml_set_vf(struct e1000_hw *, u16);
|
||||
s32 e1000_promisc_set_vf(struct e1000_hw *, enum e1000_promisc_type type);
|
||||
void e1000_write_vfta_i350(struct e1000_hw *hw, u32 offset, u32 value);
|
||||
u16 e1000_rxpbs_adjust_82580(u32 data);
|
||||
s32 e1000_read_emi_reg(struct e1000_hw *hw, u16 addr, u16 *data);
|
||||
s32 e1000_set_eee_i350(struct e1000_hw *hw, bool adv1G, bool adv100M);
|
||||
|
|
|
|||
|
|
@ -469,6 +469,8 @@
|
|||
|
||||
#define ETHERNET_FCS_SIZE 4
|
||||
#define MAX_JUMBO_FRAME_SIZE 0x3F00
|
||||
/* The datasheet maximum supported RX size is 9.5KB (9728 bytes) */
|
||||
#define MAX_RX_JUMBO_FRAME_SIZE 0x2600
|
||||
#define E1000_TX_PTR_GAP 0x1F
|
||||
|
||||
/* Extended Configuration Control and Size */
|
||||
|
|
|
|||
|
|
@ -243,8 +243,7 @@ static bool e1000_phy_is_accessible_pchlan(struct e1000_hw *hw)
|
|||
if (ret_val)
|
||||
return FALSE;
|
||||
out:
|
||||
if ((hw->mac.type == e1000_pch_lpt) ||
|
||||
(hw->mac.type == e1000_pch_spt)) {
|
||||
if (hw->mac.type >= e1000_pch_lpt) {
|
||||
/* Only unforce SMBus if ME is not active */
|
||||
if (!(E1000_READ_REG(hw, E1000_FWSM) &
|
||||
E1000_ICH_FWSM_FW_VALID)) {
|
||||
|
|
@ -641,7 +640,7 @@ static s32 e1000_init_nvm_params_ich8lan(struct e1000_hw *hw)
|
|||
|
||||
nvm->type = e1000_nvm_flash_sw;
|
||||
|
||||
if (hw->mac.type == e1000_pch_spt) {
|
||||
if (hw->mac.type >= e1000_pch_spt) {
|
||||
/* in SPT, gfpreg doesn't exist. NVM size is taken from the
|
||||
* STRAP register. This is because in SPT the GbE Flash region
|
||||
* is no longer accessed through the flash registers. Instead,
|
||||
|
|
@ -701,7 +700,7 @@ static s32 e1000_init_nvm_params_ich8lan(struct e1000_hw *hw)
|
|||
/* Function Pointers */
|
||||
nvm->ops.acquire = e1000_acquire_nvm_ich8lan;
|
||||
nvm->ops.release = e1000_release_nvm_ich8lan;
|
||||
if (hw->mac.type == e1000_pch_spt) {
|
||||
if (hw->mac.type >= e1000_pch_spt) {
|
||||
nvm->ops.read = e1000_read_nvm_spt;
|
||||
nvm->ops.update = e1000_update_nvm_checksum_spt;
|
||||
} else {
|
||||
|
|
@ -815,8 +814,7 @@ static s32 e1000_init_mac_params_ich8lan(struct e1000_hw *hw)
|
|||
break;
|
||||
}
|
||||
|
||||
if ((mac->type == e1000_pch_lpt) ||
|
||||
(mac->type == e1000_pch_spt)) {
|
||||
if (mac->type >= e1000_pch_lpt) {
|
||||
mac->rar_entry_count = E1000_PCH_LPT_RAR_ENTRIES;
|
||||
mac->ops.rar_set = e1000_rar_set_pch_lpt;
|
||||
mac->ops.setup_physical_interface = e1000_setup_copper_link_pch_lpt;
|
||||
|
|
@ -1576,9 +1574,7 @@ static s32 e1000_check_for_copper_link_ich8lan(struct e1000_hw *hw)
|
|||
* aggressive resulting in many collisions. To avoid this, increase
|
||||
* the IPG and reduce Rx latency in the PHY.
|
||||
*/
|
||||
if (((hw->mac.type == e1000_pch2lan) ||
|
||||
(hw->mac.type == e1000_pch_lpt) ||
|
||||
(hw->mac.type == e1000_pch_spt)) && link) {
|
||||
if ((hw->mac.type >= e1000_pch2lan) && link) {
|
||||
u16 speed, duplex;
|
||||
|
||||
e1000_get_speed_and_duplex_copper_generic(hw, &speed, &duplex);
|
||||
|
|
@ -1589,7 +1585,7 @@ static s32 e1000_check_for_copper_link_ich8lan(struct e1000_hw *hw)
|
|||
tipg_reg |= 0xFF;
|
||||
/* Reduce Rx latency in analog PHY */
|
||||
emi_val = 0;
|
||||
} else if (hw->mac.type == e1000_pch_spt &&
|
||||
} else if (hw->mac.type >= e1000_pch_spt &&
|
||||
duplex == FULL_DUPLEX && speed != SPEED_1000) {
|
||||
tipg_reg |= 0xC;
|
||||
emi_val = 1;
|
||||
|
|
@ -1611,8 +1607,8 @@ static s32 e1000_check_for_copper_link_ich8lan(struct e1000_hw *hw)
|
|||
emi_addr = I217_RX_CONFIG;
|
||||
ret_val = e1000_write_emi_reg_locked(hw, emi_addr, emi_val);
|
||||
|
||||
if (hw->mac.type == e1000_pch_lpt ||
|
||||
hw->mac.type == e1000_pch_spt) {
|
||||
|
||||
if (hw->mac.type >= e1000_pch_lpt) {
|
||||
u16 phy_reg;
|
||||
|
||||
hw->phy.ops.read_reg_locked(hw, I217_PLL_CLOCK_GATE_REG,
|
||||
|
|
@ -1641,7 +1637,7 @@ static s32 e1000_check_for_copper_link_ich8lan(struct e1000_hw *hw)
|
|||
if (ret_val)
|
||||
return ret_val;
|
||||
|
||||
if (hw->mac.type == e1000_pch_spt) {
|
||||
if (hw->mac.type >= e1000_pch_spt) {
|
||||
u16 data;
|
||||
u16 ptr_gap;
|
||||
|
||||
|
|
@ -1690,8 +1686,7 @@ static s32 e1000_check_for_copper_link_ich8lan(struct e1000_hw *hw)
|
|||
* on power up.
|
||||
* Set the Beacon Duration for I217 to 8 usec
|
||||
*/
|
||||
if ((hw->mac.type == e1000_pch_lpt) ||
|
||||
(hw->mac.type == e1000_pch_spt)) {
|
||||
if (hw->mac.type >= e1000_pch_lpt) {
|
||||
u32 mac_reg;
|
||||
|
||||
mac_reg = E1000_READ_REG(hw, E1000_FEXTNVM4);
|
||||
|
|
@ -1709,8 +1704,7 @@ static s32 e1000_check_for_copper_link_ich8lan(struct e1000_hw *hw)
|
|||
if (ret_val)
|
||||
return ret_val;
|
||||
}
|
||||
if ((hw->mac.type == e1000_pch_lpt) ||
|
||||
(hw->mac.type == e1000_pch_spt)) {
|
||||
if (hw->mac.type >= e1000_pch_lpt) {
|
||||
/* Set platform power management values for
|
||||
* Latency Tolerance Reporting (LTR)
|
||||
* Optimized Buffer Flush/Fill (OBFF)
|
||||
|
|
@ -1723,15 +1717,20 @@ static s32 e1000_check_for_copper_link_ich8lan(struct e1000_hw *hw)
|
|||
/* Clear link partner's EEE ability */
|
||||
hw->dev_spec.ich8lan.eee_lp_ability = 0;
|
||||
|
||||
/* FEXTNVM6 K1-off workaround */
|
||||
if (hw->mac.type == e1000_pch_spt) {
|
||||
u32 pcieanacfg = E1000_READ_REG(hw, E1000_PCIEANACFG);
|
||||
if (hw->mac.type >= e1000_pch_lpt) {
|
||||
u32 fextnvm6 = E1000_READ_REG(hw, E1000_FEXTNVM6);
|
||||
|
||||
if ((pcieanacfg & E1000_FEXTNVM6_K1_OFF_ENABLE) &&
|
||||
(hw->dev_spec.ich8lan.disable_k1_off == FALSE))
|
||||
fextnvm6 |= E1000_FEXTNVM6_K1_OFF_ENABLE;
|
||||
else
|
||||
if (hw->mac.type == e1000_pch_spt) {
|
||||
/* FEXTNVM6 K1-off workaround - for SPT only */
|
||||
u32 pcieanacfg = E1000_READ_REG(hw, E1000_PCIEANACFG);
|
||||
|
||||
if (pcieanacfg & E1000_FEXTNVM6_K1_OFF_ENABLE)
|
||||
fextnvm6 |= E1000_FEXTNVM6_K1_OFF_ENABLE;
|
||||
else
|
||||
fextnvm6 &= ~E1000_FEXTNVM6_K1_OFF_ENABLE;
|
||||
}
|
||||
|
||||
if (hw->dev_spec.ich8lan.disable_k1_off == TRUE)
|
||||
fextnvm6 &= ~E1000_FEXTNVM6_K1_OFF_ENABLE;
|
||||
|
||||
E1000_WRITE_REG(hw, E1000_FEXTNVM6, fextnvm6);
|
||||
|
|
@ -3671,7 +3670,7 @@ static s32 e1000_flash_cycle_init_ich8lan(struct e1000_hw *hw)
|
|||
/* Clear FCERR and DAEL in hw status by writing 1 */
|
||||
hsfsts.hsf_status.flcerr = 1;
|
||||
hsfsts.hsf_status.dael = 1;
|
||||
if (hw->mac.type == e1000_pch_spt)
|
||||
if (hw->mac.type >= e1000_pch_spt)
|
||||
E1000_WRITE_FLASH_REG(hw, ICH_FLASH_HSFSTS,
|
||||
hsfsts.regval & 0xFFFF);
|
||||
else
|
||||
|
|
@ -3691,7 +3690,7 @@ static s32 e1000_flash_cycle_init_ich8lan(struct e1000_hw *hw)
|
|||
* Begin by setting Flash Cycle Done.
|
||||
*/
|
||||
hsfsts.hsf_status.flcdone = 1;
|
||||
if (hw->mac.type == e1000_pch_spt)
|
||||
if (hw->mac.type >= e1000_pch_spt)
|
||||
E1000_WRITE_FLASH_REG(hw, ICH_FLASH_HSFSTS,
|
||||
hsfsts.regval & 0xFFFF);
|
||||
else
|
||||
|
|
@ -3718,7 +3717,7 @@ static s32 e1000_flash_cycle_init_ich8lan(struct e1000_hw *hw)
|
|||
* now set the Flash Cycle Done.
|
||||
*/
|
||||
hsfsts.hsf_status.flcdone = 1;
|
||||
if (hw->mac.type == e1000_pch_spt)
|
||||
if (hw->mac.type >= e1000_pch_spt)
|
||||
E1000_WRITE_FLASH_REG(hw, ICH_FLASH_HSFSTS,
|
||||
hsfsts.regval & 0xFFFF);
|
||||
else
|
||||
|
|
@ -3748,13 +3747,13 @@ static s32 e1000_flash_cycle_ich8lan(struct e1000_hw *hw, u32 timeout)
|
|||
DEBUGFUNC("e1000_flash_cycle_ich8lan");
|
||||
|
||||
/* Start a cycle by writing 1 in Flash Cycle Go in Hw Flash Control */
|
||||
if (hw->mac.type == e1000_pch_spt)
|
||||
if (hw->mac.type >= e1000_pch_spt)
|
||||
hsflctl.regval = E1000_READ_FLASH_REG(hw, ICH_FLASH_HSFSTS)>>16;
|
||||
else
|
||||
hsflctl.regval = E1000_READ_FLASH_REG16(hw, ICH_FLASH_HSFCTL);
|
||||
hsflctl.hsf_ctrl.flcgo = 1;
|
||||
|
||||
if (hw->mac.type == e1000_pch_spt)
|
||||
if (hw->mac.type >= e1000_pch_spt)
|
||||
E1000_WRITE_FLASH_REG(hw, ICH_FLASH_HSFSTS,
|
||||
hsflctl.regval << 16);
|
||||
else
|
||||
|
|
@ -3837,7 +3836,7 @@ static s32 e1000_read_flash_byte_ich8lan(struct e1000_hw *hw, u32 offset,
|
|||
/* In SPT, only 32 bits access is supported,
|
||||
* so this function should not be called.
|
||||
*/
|
||||
if (hw->mac.type == e1000_pch_spt)
|
||||
if (hw->mac.type >= e1000_pch_spt)
|
||||
return -E1000_ERR_NVM;
|
||||
else
|
||||
ret_val = e1000_read_flash_data_ich8lan(hw, offset, 1, &word);
|
||||
|
|
@ -3946,7 +3945,7 @@ static s32 e1000_read_flash_data32_ich8lan(struct e1000_hw *hw, u32 offset,
|
|||
DEBUGFUNC("e1000_read_flash_data_ich8lan");
|
||||
|
||||
if (offset > ICH_FLASH_LINEAR_ADDR_MASK ||
|
||||
hw->mac.type != e1000_pch_spt)
|
||||
hw->mac.type < e1000_pch_spt)
|
||||
return -E1000_ERR_NVM;
|
||||
flash_linear_addr = ((ICH_FLASH_LINEAR_ADDR_MASK & offset) +
|
||||
hw->nvm.flash_base_addr);
|
||||
|
|
@ -4434,7 +4433,7 @@ static s32 e1000_write_flash_data_ich8lan(struct e1000_hw *hw, u32 offset,
|
|||
|
||||
DEBUGFUNC("e1000_write_ich8_data");
|
||||
|
||||
if (hw->mac.type == e1000_pch_spt) {
|
||||
if (hw->mac.type >= e1000_pch_spt) {
|
||||
if (size != 4 || offset > ICH_FLASH_LINEAR_ADDR_MASK)
|
||||
return -E1000_ERR_NVM;
|
||||
} else {
|
||||
|
|
@ -4454,7 +4453,7 @@ static s32 e1000_write_flash_data_ich8lan(struct e1000_hw *hw, u32 offset,
|
|||
/* In SPT, This register is in Lan memory space, not
|
||||
* flash. Therefore, only 32 bit access is supported
|
||||
*/
|
||||
if (hw->mac.type == e1000_pch_spt)
|
||||
if (hw->mac.type >= e1000_pch_spt)
|
||||
hsflctl.regval =
|
||||
E1000_READ_FLASH_REG(hw, ICH_FLASH_HSFSTS)>>16;
|
||||
else
|
||||
|
|
@ -4468,7 +4467,7 @@ static s32 e1000_write_flash_data_ich8lan(struct e1000_hw *hw, u32 offset,
|
|||
* not flash. Therefore, only 32 bit access is
|
||||
* supported
|
||||
*/
|
||||
if (hw->mac.type == e1000_pch_spt)
|
||||
if (hw->mac.type >= e1000_pch_spt)
|
||||
E1000_WRITE_FLASH_REG(hw, ICH_FLASH_HSFSTS,
|
||||
hsflctl.regval << 16);
|
||||
else
|
||||
|
|
@ -4530,7 +4529,7 @@ static s32 e1000_write_flash_data32_ich8lan(struct e1000_hw *hw, u32 offset,
|
|||
|
||||
DEBUGFUNC("e1000_write_flash_data32_ich8lan");
|
||||
|
||||
if (hw->mac.type == e1000_pch_spt) {
|
||||
if (hw->mac.type >= e1000_pch_spt) {
|
||||
if (offset > ICH_FLASH_LINEAR_ADDR_MASK)
|
||||
return -E1000_ERR_NVM;
|
||||
}
|
||||
|
|
@ -4546,7 +4545,7 @@ static s32 e1000_write_flash_data32_ich8lan(struct e1000_hw *hw, u32 offset,
|
|||
/* In SPT, This register is in Lan memory space, not
|
||||
* flash. Therefore, only 32 bit access is supported
|
||||
*/
|
||||
if (hw->mac.type == e1000_pch_spt)
|
||||
if (hw->mac.type >= e1000_pch_spt)
|
||||
hsflctl.regval = E1000_READ_FLASH_REG(hw,
|
||||
ICH_FLASH_HSFSTS)
|
||||
>> 16;
|
||||
|
|
@ -4561,7 +4560,7 @@ static s32 e1000_write_flash_data32_ich8lan(struct e1000_hw *hw, u32 offset,
|
|||
* not flash. Therefore, only 32 bit access is
|
||||
* supported
|
||||
*/
|
||||
if (hw->mac.type == e1000_pch_spt)
|
||||
if (hw->mac.type >= e1000_pch_spt)
|
||||
E1000_WRITE_FLASH_REG(hw, ICH_FLASH_HSFSTS,
|
||||
hsflctl.regval << 16);
|
||||
else
|
||||
|
|
@ -4763,7 +4762,7 @@ static s32 e1000_erase_flash_bank_ich8lan(struct e1000_hw *hw, u32 bank)
|
|||
/* Write a value 11 (block Erase) in Flash
|
||||
* Cycle field in hw flash control
|
||||
*/
|
||||
if (hw->mac.type == e1000_pch_spt)
|
||||
if (hw->mac.type >= e1000_pch_spt)
|
||||
hsflctl.regval =
|
||||
E1000_READ_FLASH_REG(hw,
|
||||
ICH_FLASH_HSFSTS)>>16;
|
||||
|
|
@ -4773,7 +4772,7 @@ static s32 e1000_erase_flash_bank_ich8lan(struct e1000_hw *hw, u32 bank)
|
|||
ICH_FLASH_HSFCTL);
|
||||
|
||||
hsflctl.hsf_ctrl.flcycle = ICH_CYCLE_ERASE;
|
||||
if (hw->mac.type == e1000_pch_spt)
|
||||
if (hw->mac.type >= e1000_pch_spt)
|
||||
E1000_WRITE_FLASH_REG(hw, ICH_FLASH_HSFSTS,
|
||||
hsflctl.regval << 16);
|
||||
else
|
||||
|
|
@ -5211,8 +5210,7 @@ static void e1000_initialize_hw_bits_ich8lan(struct e1000_hw *hw)
|
|||
E1000_WRITE_REG(hw, E1000_RFCTL, reg);
|
||||
|
||||
/* Enable ECC on Lynxpoint */
|
||||
if ((hw->mac.type == e1000_pch_lpt) ||
|
||||
(hw->mac.type == e1000_pch_spt)) {
|
||||
if (hw->mac.type >= e1000_pch_lpt) {
|
||||
reg = E1000_READ_REG(hw, E1000_PBECCSTS);
|
||||
reg |= E1000_PBECCSTS_ECC_ENABLE;
|
||||
E1000_WRITE_REG(hw, E1000_PBECCSTS, reg);
|
||||
|
|
@ -5645,7 +5643,7 @@ void e1000_suspend_workarounds_ich8lan(struct e1000_hw *hw)
|
|||
(device_id == E1000_DEV_ID_PCH_LPTLP_I218_V) ||
|
||||
(device_id == E1000_DEV_ID_PCH_I218_LM3) ||
|
||||
(device_id == E1000_DEV_ID_PCH_I218_V3) ||
|
||||
(hw->mac.type == e1000_pch_spt)) {
|
||||
(hw->mac.type >= e1000_pch_spt)) {
|
||||
u32 fextnvm6 = E1000_READ_REG(hw, E1000_FEXTNVM6);
|
||||
|
||||
E1000_WRITE_REG(hw, E1000_FEXTNVM6,
|
||||
|
|
|
|||
|
|
@ -159,6 +159,10 @@ static pci_vendor_info_t em_vendor_info_array[] =
|
|||
PVID(0x8086, E1000_DEV_ID_PCH_SPT_I219_LM2, "Intel(R) PRO/1000 Network Connection"),
|
||||
PVID(0x8086, E1000_DEV_ID_PCH_SPT_I219_V2, "Intel(R) PRO/1000 Network Connection"),
|
||||
PVID(0x8086, E1000_DEV_ID_PCH_LBG_I219_LM3, "Intel(R) PRO/1000 Network Connection"),
|
||||
PVID(0x8086, E1000_DEV_ID_PCH_SPT_I219_LM4, "Intel(R) PRO/1000 Network Connection"),
|
||||
PVID(0x8086, E1000_DEV_ID_PCH_SPT_I219_V4, "Intel(R) PRO/1000 Network Connection"),
|
||||
PVID(0x8086, E1000_DEV_ID_PCH_SPT_I219_LM5, "Intel(R) PRO/1000 Network Connection"),
|
||||
PVID(0x8086, E1000_DEV_ID_PCH_SPT_I219_V5, "Intel(R) PRO/1000 Network Connection"),
|
||||
/* required last entry */
|
||||
PVID_END
|
||||
};
|
||||
|
|
|
|||
Loading…
Reference in a new issue