ice: Allow for delayed LLDP MIB change registration
Add an additional boolean parameter to the ice_init_dcb function. This boolean controls if the LLDP MIB change events are registered for. Also, add a new function defined ice_cfg_lldp_mib_change. The additional function is necessary to be able to register for LLDP MIB change events after calling ice_init_dcb. The net effect of these two changes is to allow a delayed registration for MIB change events so that the driver is not accepting events before it is ready for them. Signed-off-by: Dave Ertman <david.m.ertman@intel.com> Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com> Tested-by: Andrew Bowers <andrewx.bowers@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
This commit is contained in:
committed by
Jeff Kirsher
parent
201beeb715
commit
ea300f41bb
@@ -60,7 +60,7 @@ ice_aq_get_lldp_mib(struct ice_hw *hw, u8 bridge_type, u8 mib_type, void *buf,
|
|||||||
* Enable or Disable posting of an event on ARQ when LLDP MIB
|
* Enable or Disable posting of an event on ARQ when LLDP MIB
|
||||||
* associated with the interface changes (0x0A01)
|
* associated with the interface changes (0x0A01)
|
||||||
*/
|
*/
|
||||||
enum ice_status
|
static enum ice_status
|
||||||
ice_aq_cfg_lldp_mib_change(struct ice_hw *hw, bool ena_update,
|
ice_aq_cfg_lldp_mib_change(struct ice_hw *hw, bool ena_update,
|
||||||
struct ice_sq_cd *cd)
|
struct ice_sq_cd *cd)
|
||||||
{
|
{
|
||||||
@@ -943,10 +943,11 @@ enum ice_status ice_get_dcb_cfg(struct ice_port_info *pi)
|
|||||||
/**
|
/**
|
||||||
* ice_init_dcb
|
* ice_init_dcb
|
||||||
* @hw: pointer to the HW struct
|
* @hw: pointer to the HW struct
|
||||||
|
* @enable_mib_change: enable MIB change event
|
||||||
*
|
*
|
||||||
* Update DCB configuration from the Firmware
|
* Update DCB configuration from the Firmware
|
||||||
*/
|
*/
|
||||||
enum ice_status ice_init_dcb(struct ice_hw *hw)
|
enum ice_status ice_init_dcb(struct ice_hw *hw, bool enable_mib_change)
|
||||||
{
|
{
|
||||||
struct ice_port_info *pi = hw->port_info;
|
struct ice_port_info *pi = hw->port_info;
|
||||||
enum ice_status ret = 0;
|
enum ice_status ret = 0;
|
||||||
@@ -972,9 +973,39 @@ enum ice_status ice_init_dcb(struct ice_hw *hw)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Configure the LLDP MIB change event */
|
/* Configure the LLDP MIB change event */
|
||||||
ret = ice_aq_cfg_lldp_mib_change(hw, true, NULL);
|
if (enable_mib_change) {
|
||||||
|
ret = ice_aq_cfg_lldp_mib_change(hw, true, NULL);
|
||||||
|
if (!ret)
|
||||||
|
pi->is_sw_lldp = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ice_cfg_lldp_mib_change
|
||||||
|
* @hw: pointer to the HW struct
|
||||||
|
* @ena_mib: enable/disable MIB change event
|
||||||
|
*
|
||||||
|
* Configure (disable/enable) MIB
|
||||||
|
*/
|
||||||
|
enum ice_status ice_cfg_lldp_mib_change(struct ice_hw *hw, bool ena_mib)
|
||||||
|
{
|
||||||
|
struct ice_port_info *pi = hw->port_info;
|
||||||
|
enum ice_status ret;
|
||||||
|
|
||||||
|
if (!hw->func_caps.common_cap.dcb)
|
||||||
|
return ICE_ERR_NOT_SUPPORTED;
|
||||||
|
|
||||||
|
/* Get DCBX status */
|
||||||
|
pi->dcbx_status = ice_get_dcbx_status(hw);
|
||||||
|
|
||||||
|
if (pi->dcbx_status == ICE_DCBX_STATUS_DIS)
|
||||||
|
return ICE_ERR_NOT_READY;
|
||||||
|
|
||||||
|
ret = ice_aq_cfg_lldp_mib_change(hw, ena_mib, NULL);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
pi->is_sw_lldp = false;
|
pi->is_sw_lldp = !ena_mib;
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -125,7 +125,7 @@ ice_aq_get_dcb_cfg(struct ice_hw *hw, u8 mib_type, u8 bridgetype,
|
|||||||
struct ice_dcbx_cfg *dcbcfg);
|
struct ice_dcbx_cfg *dcbcfg);
|
||||||
enum ice_status ice_get_dcb_cfg(struct ice_port_info *pi);
|
enum ice_status ice_get_dcb_cfg(struct ice_port_info *pi);
|
||||||
enum ice_status ice_set_dcb_cfg(struct ice_port_info *pi);
|
enum ice_status ice_set_dcb_cfg(struct ice_port_info *pi);
|
||||||
enum ice_status ice_init_dcb(struct ice_hw *hw);
|
enum ice_status ice_init_dcb(struct ice_hw *hw, bool enable_mib_change);
|
||||||
enum ice_status
|
enum ice_status
|
||||||
ice_query_port_ets(struct ice_port_info *pi,
|
ice_query_port_ets(struct ice_port_info *pi,
|
||||||
struct ice_aqc_port_ets_elem *buf, u16 buf_size,
|
struct ice_aqc_port_ets_elem *buf, u16 buf_size,
|
||||||
@@ -139,9 +139,7 @@ ice_aq_start_lldp(struct ice_hw *hw, bool persist, struct ice_sq_cd *cd);
|
|||||||
enum ice_status
|
enum ice_status
|
||||||
ice_aq_start_stop_dcbx(struct ice_hw *hw, bool start_dcbx_agent,
|
ice_aq_start_stop_dcbx(struct ice_hw *hw, bool start_dcbx_agent,
|
||||||
bool *dcbx_agent_status, struct ice_sq_cd *cd);
|
bool *dcbx_agent_status, struct ice_sq_cd *cd);
|
||||||
enum ice_status
|
enum ice_status ice_cfg_lldp_mib_change(struct ice_hw *hw, bool ena_mib);
|
||||||
ice_aq_cfg_lldp_mib_change(struct ice_hw *hw, bool ena_update,
|
|
||||||
struct ice_sq_cd *cd);
|
|
||||||
#else /* CONFIG_DCB */
|
#else /* CONFIG_DCB */
|
||||||
static inline enum ice_status
|
static inline enum ice_status
|
||||||
ice_aq_stop_lldp(struct ice_hw __always_unused *hw,
|
ice_aq_stop_lldp(struct ice_hw __always_unused *hw,
|
||||||
@@ -172,9 +170,8 @@ ice_aq_start_stop_dcbx(struct ice_hw __always_unused *hw,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static inline enum ice_status
|
static inline enum ice_status
|
||||||
ice_aq_cfg_lldp_mib_change(struct ice_hw __always_unused *hw,
|
ice_cfg_lldp_mib_change(struct ice_hw __always_unused *hw,
|
||||||
bool __always_unused ena_update,
|
bool __always_unused ena_mib)
|
||||||
struct ice_sq_cd __always_unused *cd)
|
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -318,7 +318,7 @@ void ice_dcb_rebuild(struct ice_pf *pf)
|
|||||||
goto dcb_error;
|
goto dcb_error;
|
||||||
}
|
}
|
||||||
|
|
||||||
ice_init_dcb(&pf->hw);
|
ice_init_dcb(&pf->hw, true);
|
||||||
if (pf->hw.port_info->dcbx_status == ICE_DCBX_STATUS_DIS)
|
if (pf->hw.port_info->dcbx_status == ICE_DCBX_STATUS_DIS)
|
||||||
pf->hw.port_info->is_sw_lldp = true;
|
pf->hw.port_info->is_sw_lldp = true;
|
||||||
else
|
else
|
||||||
@@ -451,7 +451,7 @@ int ice_init_pf_dcb(struct ice_pf *pf, bool locked)
|
|||||||
|
|
||||||
port_info = hw->port_info;
|
port_info = hw->port_info;
|
||||||
|
|
||||||
err = ice_init_dcb(hw);
|
err = ice_init_dcb(hw, false);
|
||||||
if (err && !port_info->is_sw_lldp) {
|
if (err && !port_info->is_sw_lldp) {
|
||||||
dev_err(&pf->pdev->dev, "Error initializing DCB %d\n", err);
|
dev_err(&pf->pdev->dev, "Error initializing DCB %d\n", err);
|
||||||
goto dcb_init_err;
|
goto dcb_init_err;
|
||||||
|
|||||||
@@ -1206,8 +1206,8 @@ static int ice_set_priv_flags(struct net_device *netdev, u32 flags)
|
|||||||
enum ice_status status;
|
enum ice_status status;
|
||||||
|
|
||||||
/* Disable FW LLDP engine */
|
/* Disable FW LLDP engine */
|
||||||
status = ice_aq_cfg_lldp_mib_change(&pf->hw, false,
|
status = ice_cfg_lldp_mib_change(&pf->hw, false);
|
||||||
NULL);
|
|
||||||
/* If unregistering for LLDP events fails, this is
|
/* If unregistering for LLDP events fails, this is
|
||||||
* not an error state, as there shouldn't be any
|
* not an error state, as there shouldn't be any
|
||||||
* events to respond to.
|
* events to respond to.
|
||||||
@@ -1273,6 +1273,12 @@ static int ice_set_priv_flags(struct net_device *netdev, u32 flags)
|
|||||||
* The FW LLDP engine will now be consuming them.
|
* The FW LLDP engine will now be consuming them.
|
||||||
*/
|
*/
|
||||||
ice_cfg_sw_lldp(vsi, false, false);
|
ice_cfg_sw_lldp(vsi, false, false);
|
||||||
|
|
||||||
|
/* Register for MIB change events */
|
||||||
|
status = ice_cfg_lldp_mib_change(&pf->hw, true);
|
||||||
|
if (status)
|
||||||
|
dev_dbg(&pf->pdev->dev,
|
||||||
|
"Fail to enable MIB change events\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
clear_bit(ICE_FLAG_ETHTOOL_CTXT, pf->flags);
|
clear_bit(ICE_FLAG_ETHTOOL_CTXT, pf->flags);
|
||||||
|
|||||||
@@ -2536,6 +2536,8 @@ ice_probe(struct pci_dev *pdev, const struct pci_device_id __always_unused *ent)
|
|||||||
if (ice_init_pf_dcb(pf, false)) {
|
if (ice_init_pf_dcb(pf, false)) {
|
||||||
clear_bit(ICE_FLAG_DCB_CAPABLE, pf->flags);
|
clear_bit(ICE_FLAG_DCB_CAPABLE, pf->flags);
|
||||||
clear_bit(ICE_FLAG_DCB_ENA, pf->flags);
|
clear_bit(ICE_FLAG_DCB_ENA, pf->flags);
|
||||||
|
} else {
|
||||||
|
ice_cfg_lldp_mib_change(&pf->hw, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user