ice: Support link events, reset and rebuild
Link events are posted to a PF's admin receive queue (ARQ). This patch adds the ability to detect and process link events. This patch also adds the ability to process resets. The driver can process the following resets: 1) EMP Reset (EMPR) 2) Global Reset (GLOBR) 3) Core Reset (CORER) 4) Physical Function Reset (PFR) EMPR is the largest level of reset that the driver can handle. An EMPR resets the manageability block and also the data path, including PHY and link for all the PFs. The affected PFs are notified of this event through a miscellaneous interrupt. GLOBR is a subset of EMPR. It does everything EMPR does except that it doesn't reset the manageability block. CORER is a subset of GLOBR. It does everything GLOBR does but doesn't reset PHY and link. PFR is a subset of CORER and affects only the given physical function. In other words, PFR can be thought of as a CORER for a single PF. Since only the issuing PF is affected, a PFR doesn't result in the miscellaneous interrupt being triggered. All the resets have the following in common: 1) Tx/Rx is halted and all queues are stopped. 2) All the VSIs and filters programmed for the PF are lost and have to be reprogrammed. 3) Control queue interfaces are reset and have to be reprogrammed. In the rebuild flow, control queues are reinitialized, VSIs are reallocated and filters are restored. Signed-off-by: Anirudh Venkataramanan <anirudh.venkataramanan@intel.com> Tested-by: Tony Brelinski <tonyx.brelinski@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
This commit is contained in:

committed by
Jeff Kirsher

父節點
5513b920a4
當前提交
0b28b702e7
@@ -78,6 +78,11 @@ extern const char ice_drv_ver[];
|
||||
#define ICE_RX_DESC(R, i) (&(((union ice_32b_rx_flex_desc *)((R)->desc))[i]))
|
||||
#define ICE_TX_CTX_DESC(R, i) (&(((struct ice_tx_ctx_desc *)((R)->desc))[i]))
|
||||
|
||||
/* Macro for each VSI in a PF */
|
||||
#define ice_for_each_vsi(pf, i) \
|
||||
for ((i) = 0; (i) < (pf)->num_alloc_vsi; (i)++)
|
||||
|
||||
/* Macros for each tx/rx ring in a VSI */
|
||||
#define ice_for_each_txq(vsi, i) \
|
||||
for ((i) = 0; (i) < (vsi)->num_txq; (i)++)
|
||||
|
||||
@@ -109,7 +114,16 @@ struct ice_sw {
|
||||
|
||||
enum ice_state {
|
||||
__ICE_DOWN,
|
||||
__ICE_NEEDS_RESTART,
|
||||
__ICE_RESET_RECOVERY_PENDING, /* set by driver when reset starts */
|
||||
__ICE_PFR_REQ, /* set by driver and peers */
|
||||
__ICE_CORER_REQ, /* set by driver and peers */
|
||||
__ICE_GLOBR_REQ, /* set by driver and peers */
|
||||
__ICE_CORER_RECV, /* set by OICR handler */
|
||||
__ICE_GLOBR_RECV, /* set by OICR handler */
|
||||
__ICE_EMPR_RECV, /* set by OICR handler */
|
||||
__ICE_SUSPENDED, /* set on module remove path */
|
||||
__ICE_RESET_FAILED, /* set by reset/rebuild */
|
||||
__ICE_ADMINQ_EVENT_PENDING,
|
||||
__ICE_CFG_BUSY,
|
||||
__ICE_SERVICE_SCHED,
|
||||
@@ -226,6 +240,11 @@ struct ice_pf {
|
||||
u16 q_left_rx; /* remaining num rx queues left unclaimed */
|
||||
u16 next_vsi; /* Next free slot in pf->vsi[] - 0-based! */
|
||||
u16 num_alloc_vsi;
|
||||
u16 corer_count; /* Core reset count */
|
||||
u16 globr_count; /* Global reset count */
|
||||
u16 empr_count; /* EMP reset count */
|
||||
u16 pfr_count; /* PF reset count */
|
||||
|
||||
struct ice_hw_port_stats stats;
|
||||
struct ice_hw_port_stats stats_prev;
|
||||
struct ice_hw hw;
|
||||
|
Reference in New Issue
Block a user