Skip to content

Commit

Permalink
MFC r361805: em(4): Add support for Comet Lake Mobile Platform
Browse files Browse the repository at this point in the history
This change introduces Comet Lake Mobile Platform support in the e1000
driver along with shared code patches described below.

  - Cast return value of e1000_ltr2ns() to higher type to avoid overflow
  - Remove useless statement of assigning act_offset
  - Add initialization of identification LED
  - Fix flow control setup after connected standby:
    After connected standby the driver blocks resets during
    "AdapterStart" and skips flow control setup. This change adds
    condition in e1000_setup_link_ich8lan() to always setup flow control
    and to setup physical interface only when there is no need to block
    resets.

Sponsored by:	Intel Corporation
  • Loading branch information
ricera committed Jun 12, 2020
1 parent f64feac commit cb0be6f
Show file tree
Hide file tree
Showing 5 changed files with 30 additions and 18 deletions.
7 changes: 6 additions & 1 deletion sys/dev/e1000/e1000_api.c
Expand Up @@ -309,6 +309,8 @@ s32 e1000_set_mac_type(struct e1000_hw *hw)
case E1000_DEV_ID_PCH_SPT_I219_V4:
case E1000_DEV_ID_PCH_SPT_I219_LM5:
case E1000_DEV_ID_PCH_SPT_I219_V5:
case E1000_DEV_ID_PCH_CMP_I219_LM12:
case E1000_DEV_ID_PCH_CMP_I219_V12:
mac->type = e1000_pch_spt;
break;
case E1000_DEV_ID_PCH_CNP_I219_LM6:
Expand All @@ -319,7 +321,10 @@ s32 e1000_set_mac_type(struct e1000_hw *hw)
case E1000_DEV_ID_PCH_ICP_I219_V8:
case E1000_DEV_ID_PCH_ICP_I219_LM9:
case E1000_DEV_ID_PCH_ICP_I219_V9:
case E1000_DEV_ID_PCH_ICP_I219_V10:
case E1000_DEV_ID_PCH_CMP_I219_LM10:
case E1000_DEV_ID_PCH_CMP_I219_V10:
case E1000_DEV_ID_PCH_CMP_I219_LM11:
case E1000_DEV_ID_PCH_CMP_I219_V11:
mac->type = e1000_pch_cnp;
break;
case E1000_DEV_ID_82575EB_COPPER:
Expand Down
7 changes: 6 additions & 1 deletion sys/dev/e1000/e1000_hw.h
Expand Up @@ -155,7 +155,12 @@ struct e1000_hw;
#define E1000_DEV_ID_PCH_ICP_I219_V8 0x15E0
#define E1000_DEV_ID_PCH_ICP_I219_LM9 0x15E1
#define E1000_DEV_ID_PCH_ICP_I219_V9 0x15E2
#define E1000_DEV_ID_PCH_ICP_I219_V10 0x0D4F
#define E1000_DEV_ID_PCH_CMP_I219_LM10 0x0D4E
#define E1000_DEV_ID_PCH_CMP_I219_V10 0x0D4F
#define E1000_DEV_ID_PCH_CMP_I219_LM11 0x0D4C
#define E1000_DEV_ID_PCH_CMP_I219_V11 0x0D4D
#define E1000_DEV_ID_PCH_CMP_I219_LM12 0x0D53
#define E1000_DEV_ID_PCH_CMP_I219_V12 0x0D55
#define E1000_DEV_ID_82576 0x10C9
#define E1000_DEV_ID_82576_FIBER 0x10E6
#define E1000_DEV_ID_82576_SERDES 0x10E7
Expand Down
5 changes: 5 additions & 0 deletions sys/dev/e1000/e1000_i210.c
Expand Up @@ -774,6 +774,7 @@ static s32 e1000_get_cfg_done_i210(struct e1000_hw *hw)
**/
s32 e1000_init_hw_i210(struct e1000_hw *hw)
{
struct e1000_mac_info *mac = &hw->mac;
s32 ret_val;

DEBUGFUNC("e1000_init_hw_i210");
Expand All @@ -784,6 +785,10 @@ s32 e1000_init_hw_i210(struct e1000_hw *hw)
return ret_val;
}
hw->phy.ops.get_cfg_done = e1000_get_cfg_done_i210;

/* Initialize identification LED */
mac->ops.id_led_init(hw);

ret_val = e1000_init_hw_82575(hw);
return ret_val;
}
22 changes: 7 additions & 15 deletions sys/dev/e1000/e1000_ich8lan.c
Expand Up @@ -1091,7 +1091,7 @@ static u64 e1000_ltr2ns(u16 ltr)
value = ltr & E1000_LTRV_VALUE_MASK;
scale = (ltr & E1000_LTRV_SCALE_MASK) >> E1000_LTRV_SCALE_SHIFT;

return value * (1 << (scale * E1000_LTRV_SCALE_FACTOR));
return value * (1ULL << (scale * E1000_LTRV_SCALE_FACTOR));
}

/**
Expand Down Expand Up @@ -4161,13 +4161,6 @@ static s32 e1000_update_nvm_checksum_spt(struct e1000_hw *hw)
if (ret_val)
goto release;

/* And invalidate the previously valid segment by setting
* its signature word (0x13) high_byte to 0b. This can be
* done without an erase because flash erase sets all bits
* to 1's. We can write 1's to 0's without an erase
*/
act_offset = (old_bank_offset + E1000_ICH_NVM_SIG_WORD) * 2 + 1;

/* offset in words but we read dword*/
act_offset = old_bank_offset + E1000_ICH_NVM_SIG_WORD - 1;
ret_val = e1000_read_flash_dword_ich8lan(hw, act_offset, &dword);
Expand Down Expand Up @@ -5235,9 +5228,6 @@ static s32 e1000_setup_link_ich8lan(struct e1000_hw *hw)

DEBUGFUNC("e1000_setup_link_ich8lan");

if (hw->phy.ops.check_reset_block(hw))
return E1000_SUCCESS;

/* ICH parts do not have a word in the NVM to determine
* the default flow control setting, so we explicitly
* set it to full.
Expand All @@ -5253,10 +5243,12 @@ static s32 e1000_setup_link_ich8lan(struct e1000_hw *hw)
DEBUGOUT1("After fix-ups FlowControl is now = %x\n",
hw->fc.current_mode);

/* Continue to configure the copper link. */
ret_val = hw->mac.ops.setup_physical_interface(hw);
if (ret_val)
return ret_val;
if (!hw->phy.ops.check_reset_block(hw)) {
/* Continue to configure the copper link. */
ret_val = hw->mac.ops.setup_physical_interface(hw);
if (ret_val)
return ret_val;
}

E1000_WRITE_REG(hw, E1000_FCTTV, hw->fc.pause_time);
if ((hw->phy.type == e1000_phy_82578) ||
Expand Down
7 changes: 6 additions & 1 deletion sys/dev/e1000/if_em.c
Expand Up @@ -174,7 +174,12 @@ static pci_vendor_info_t em_vendor_info_array[] =
PVID(0x8086, E1000_DEV_ID_PCH_ICP_I219_V8, "Intel(R) PRO/1000 Network Connection"),
PVID(0x8086, E1000_DEV_ID_PCH_ICP_I219_LM9, "Intel(R) PRO/1000 Network Connection"),
PVID(0x8086, E1000_DEV_ID_PCH_ICP_I219_V9, "Intel(R) PRO/1000 Network Connection"),
PVID(0x8086, E1000_DEV_ID_PCH_ICP_I219_V10, "Intel(R) PRO/1000 Network Connection"),
PVID(0x8086, E1000_DEV_ID_PCH_CMP_I219_LM10, "Intel(R) PRO/1000 Network Connection"),
PVID(0x8086, E1000_DEV_ID_PCH_CMP_I219_V10, "Intel(R) PRO/1000 Network Connection"),
PVID(0x8086, E1000_DEV_ID_PCH_CMP_I219_LM11, "Intel(R) PRO/1000 Network Connection"),
PVID(0x8086, E1000_DEV_ID_PCH_CMP_I219_V11, "Intel(R) PRO/1000 Network Connection"),
PVID(0x8086, E1000_DEV_ID_PCH_CMP_I219_LM12, "Intel(R) PRO/1000 Network Connection"),
PVID(0x8086, E1000_DEV_ID_PCH_CMP_I219_V12, "Intel(R) PRO/1000 Network Connection"),
/* required last entry */
PVID_END
};
Expand Down

0 comments on commit cb0be6f

Please sign in to comment.