i40e/base: save link module type
Add a module_types variable to the link_info struct to save the module information from get_phy_capabilities. This information can be used to determine which speeds the module supports. Also add a new function update_link_info which updates the module_types parameter and then calls get_link_info. This function should be called in place of get_link_info so that the module_types variable stays up-to-date with the rest of the link information. Also rework the function get_link_status to allow caller to get all return values in the call chain bubbled back to the source, which keeps information about failures from being lost. Signed-off-by: Jingjing Wu <jingjing.wu@intel.com> Acked-by: Helin Zhang <helin.zhang@intel.com> Tested-by: Huilong Xu <huilongx.xu@intel.com>
This commit is contained in:
parent
b08c3b0d84
commit
842ea19963
@ -1547,14 +1547,14 @@ enum i40e_status_code i40e_set_fc(struct i40e_hw *hw, u8 *aq_failures,
|
||||
*aq_failures |= I40E_SET_FC_AQ_FAIL_SET;
|
||||
}
|
||||
/* Update the link info */
|
||||
status = i40e_aq_get_link_info(hw, true, NULL, NULL);
|
||||
status = i40e_update_link_info(hw);
|
||||
if (status) {
|
||||
/* Wait a little bit (on 40G cards it sometimes takes a really
|
||||
* long time for link to come back from the atomic reset)
|
||||
* and try once more
|
||||
*/
|
||||
i40e_msec_delay(1000);
|
||||
status = i40e_aq_get_link_info(hw, true, NULL, NULL);
|
||||
status = i40e_update_link_info(hw);
|
||||
}
|
||||
if (status)
|
||||
*aq_failures |= I40E_SET_FC_AQ_FAIL_UPDATE;
|
||||
@ -1743,7 +1743,6 @@ aq_get_link_info_exit:
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* i40e_aq_set_phy_int_mask
|
||||
* @hw: pointer to the hw struct
|
||||
@ -2286,27 +2285,52 @@ enum i40e_status_code i40e_aq_send_driver_version(struct i40e_hw *hw,
|
||||
/**
|
||||
* i40e_get_link_status - get status of the HW network link
|
||||
* @hw: pointer to the hw struct
|
||||
* @link_up: pointer to bool (true/false = linkup/linkdown)
|
||||
*
|
||||
* Returns true if link is up, false if link is down.
|
||||
* Variable link_up true if link is up, false if link is down.
|
||||
* The variable link_up is invalid if returned value of status != I40E_SUCCESS
|
||||
*
|
||||
* Side effect: LinkStatusEvent reporting becomes enabled
|
||||
**/
|
||||
bool i40e_get_link_status(struct i40e_hw *hw)
|
||||
enum i40e_status_code i40e_get_link_status(struct i40e_hw *hw, bool *link_up)
|
||||
{
|
||||
enum i40e_status_code status = I40E_SUCCESS;
|
||||
bool link_status = false;
|
||||
|
||||
if (hw->phy.get_link_info) {
|
||||
status = i40e_aq_get_link_info(hw, true, NULL, NULL);
|
||||
status = i40e_update_link_info(hw);
|
||||
|
||||
if (status != I40E_SUCCESS)
|
||||
goto i40e_get_link_status_exit;
|
||||
i40e_debug(hw, I40E_DEBUG_LINK, "get link failed: status %d\n",
|
||||
status);
|
||||
}
|
||||
|
||||
link_status = hw->phy.link_info.link_info & I40E_AQ_LINK_UP;
|
||||
*link_up = hw->phy.link_info.link_info & I40E_AQ_LINK_UP;
|
||||
|
||||
i40e_get_link_status_exit:
|
||||
return link_status;
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* i40e_updatelink_status - update status of the HW network link
|
||||
* @hw: pointer to the hw struct
|
||||
**/
|
||||
enum i40e_status_code i40e_update_link_info(struct i40e_hw *hw)
|
||||
{
|
||||
struct i40e_aq_get_phy_abilities_resp abilities;
|
||||
enum i40e_status_code status = I40E_SUCCESS;
|
||||
|
||||
status = i40e_aq_get_link_info(hw, true, NULL, NULL);
|
||||
if (status)
|
||||
return status;
|
||||
|
||||
status = i40e_aq_get_phy_capabilities(hw, false, false, &abilities,
|
||||
NULL);
|
||||
if (status)
|
||||
return status;
|
||||
|
||||
memcpy(hw->phy.link_info.module_type, &abilities.module_type,
|
||||
sizeof(hw->phy.link_info.module_type));
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -381,7 +381,8 @@ enum i40e_status_code i40e_init_shared_code(struct i40e_hw *hw);
|
||||
enum i40e_status_code i40e_pf_reset(struct i40e_hw *hw);
|
||||
void i40e_clear_hw(struct i40e_hw *hw);
|
||||
void i40e_clear_pxe_mode(struct i40e_hw *hw);
|
||||
bool i40e_get_link_status(struct i40e_hw *hw);
|
||||
enum i40e_status_code i40e_get_link_status(struct i40e_hw *hw, bool *link_up);
|
||||
enum i40e_status_code i40e_update_link_info(struct i40e_hw *hw);
|
||||
enum i40e_status_code i40e_get_mac_addr(struct i40e_hw *hw, u8 *mac_addr);
|
||||
enum i40e_status_code i40e_read_bw_from_alt_ram(struct i40e_hw *hw,
|
||||
u32 *max_bw, u32 *min_bw, bool *min_valid, bool *max_valid);
|
||||
|
@ -237,6 +237,24 @@ struct i40e_link_status {
|
||||
bool crc_enable;
|
||||
u8 pacing;
|
||||
u8 requested_speeds;
|
||||
u8 module_type[3];
|
||||
/* 1st byte: module identifier */
|
||||
#define I40E_MODULE_TYPE_SFP 0x03
|
||||
#define I40E_MODULE_TYPE_QSFP 0x0D
|
||||
/* 2nd byte: ethernet compliance codes for 10/40G */
|
||||
#define I40E_MODULE_TYPE_40G_ACTIVE 0x01
|
||||
#define I40E_MODULE_TYPE_40G_LR4 0x02
|
||||
#define I40E_MODULE_TYPE_40G_SR4 0x04
|
||||
#define I40E_MODULE_TYPE_40G_CR4 0x08
|
||||
#define I40E_MODULE_TYPE_10G_BASE_SR 0x10
|
||||
#define I40E_MODULE_TYPE_10G_BASE_LR 0x20
|
||||
#define I40E_MODULE_TYPE_10G_BASE_LRM 0x40
|
||||
#define I40E_MODULE_TYPE_10G_BASE_ER 0x80
|
||||
/* 3rd byte: ethernet compliance codes for 1G */
|
||||
#define I40E_MODULE_TYPE_1000BASE_SX 0x01
|
||||
#define I40E_MODULE_TYPE_1000BASE_LX 0x02
|
||||
#define I40E_MODULE_TYPE_1000BASE_CX 0x04
|
||||
#define I40E_MODULE_TYPE_1000BASE_T 0x08
|
||||
};
|
||||
|
||||
struct i40e_phy_info {
|
||||
|
Loading…
x
Reference in New Issue
Block a user