mirror of
https://github.com/torvalds/linux.git
synced 2026-05-23 06:31:58 +02:00
Merge branch '100GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/next-queue
Tony Nguyen says: ==================== ice: implement SRIOV VF Active-Active LAG Dave Ertman says: Implement support for SRIOV VFs over an Active-Active link aggregate. The same restrictions apply as are in place for the support of Active-Backup bonds. - the two interfaces must be on the same NIC - the FW LLDP engine needs to be disabled - the DDP package that supports VF LAG must be loaded on device - the two interfaces must have the same QoS config - only the first interface added to the bond will have VF support - the interface with VFs must be in switchdev mode With the additional requirement of - the version of the FW on the NIC needs to have VF Active/Active support The balancing of traffic between the two interfaces is done on a queue basis. Taking the queues allocated to all of the VFs as a whole, one half of them will be distributed to each interface. When a link goes down, then the queues allocated to the down interface will migrate to the active port. When the down port comes back up, then the same queues as were originally assigned there will be moved back. Patch 1 cleans up void pointer casts Patch 2 utilizes bool over u8 when appropriate Patch 3 adds a driver prefix to a LAG define Patch 4 pre-move a function to reduce delta in implementation patch Patch 5 cleanup variable initialization in declaration block Patch 6 cleanup capability parsing for LAG feature Patch 7 is the implementation of the new functionality * '100GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/next-queue: ice: Implement support for SRIOV VFs across Active/Active bonds ice: cleanup capabilities evaluation ice: Cleanup variable initialization in LAG code ice: move LAG function in code to prepare for Active-Active ice: Add driver specific prefix to LAG defines ice: replace u8 elements with bool where appropriate ice: Remove casts on void pointers in LAG code ==================== Link: https://patch.msgid.link/20250814230855.128068-1-anthony.l.nguyen@intel.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
bab3ce4045
|
|
@ -203,6 +203,7 @@ enum ice_feature {
|
|||
ICE_F_GCS,
|
||||
ICE_F_ROCE_LAG,
|
||||
ICE_F_SRIOV_LAG,
|
||||
ICE_F_SRIOV_AA_LAG,
|
||||
ICE_F_MBX_LIMIT,
|
||||
ICE_F_MAX
|
||||
};
|
||||
|
|
|
|||
|
|
@ -2060,6 +2060,10 @@ struct ice_aqc_cfg_txqs {
|
|||
#define ICE_AQC_Q_CFG_SRC_PRT_M 0x7
|
||||
#define ICE_AQC_Q_CFG_DST_PRT_S 3
|
||||
#define ICE_AQC_Q_CFG_DST_PRT_M (0x7 << ICE_AQC_Q_CFG_DST_PRT_S)
|
||||
#define ICE_AQC_Q_CFG_MODE_M GENMASK(7, 6)
|
||||
#define ICE_AQC_Q_CFG_MODE_SAME_PF 0x0
|
||||
#define ICE_AQC_Q_CFG_MODE_GIVE_OWN 0x1
|
||||
#define ICE_AQC_Q_CFG_MODE_KEEP_OWN 0x2
|
||||
u8 time_out;
|
||||
#define ICE_AQC_Q_CFG_TIMEOUT_S 2
|
||||
#define ICE_AQC_Q_CFG_TIMEOUT_M (0x1F << ICE_AQC_Q_CFG_TIMEOUT_S)
|
||||
|
|
|
|||
|
|
@ -2418,12 +2418,15 @@ ice_parse_common_caps(struct ice_hw *hw, struct ice_hw_common_caps *caps,
|
|||
caps->reset_restrict_support);
|
||||
break;
|
||||
case LIBIE_AQC_CAPS_FW_LAG_SUPPORT:
|
||||
caps->roce_lag = !!(number & LIBIE_AQC_BIT_ROCEV2_LAG);
|
||||
caps->roce_lag = number & LIBIE_AQC_BIT_ROCEV2_LAG;
|
||||
ice_debug(hw, ICE_DBG_INIT, "%s: roce_lag = %u\n",
|
||||
prefix, caps->roce_lag);
|
||||
caps->sriov_lag = !!(number & LIBIE_AQC_BIT_SRIOV_LAG);
|
||||
caps->sriov_lag = number & LIBIE_AQC_BIT_SRIOV_LAG;
|
||||
ice_debug(hw, ICE_DBG_INIT, "%s: sriov_lag = %u\n",
|
||||
prefix, caps->sriov_lag);
|
||||
caps->sriov_aa_lag = number & LIBIE_AQC_BIT_SRIOV_AA_LAG;
|
||||
ice_debug(hw, ICE_DBG_INIT, "%s: sriov_aa_lag = %u\n",
|
||||
prefix, caps->sriov_aa_lag);
|
||||
break;
|
||||
case LIBIE_AQC_CAPS_TX_SCHED_TOPO_COMP_MODE:
|
||||
caps->tx_sched_topo_comp_mode_en = (number == 1);
|
||||
|
|
@ -4712,24 +4715,24 @@ ice_aq_dis_lan_txq(struct ice_hw *hw, u8 num_qgrps,
|
|||
}
|
||||
|
||||
/**
|
||||
* ice_aq_cfg_lan_txq
|
||||
* ice_aq_cfg_lan_txq - send AQ command 0x0C32 to FW
|
||||
* @hw: pointer to the hardware structure
|
||||
* @buf: buffer for command
|
||||
* @buf_size: size of buffer in bytes
|
||||
* @num_qs: number of queues being configured
|
||||
* @oldport: origination lport
|
||||
* @newport: destination lport
|
||||
* @mode: cmd_type for move to use
|
||||
* @cd: pointer to command details structure or NULL
|
||||
*
|
||||
* Move/Configure LAN Tx queue (0x0C32)
|
||||
*
|
||||
* There is a better AQ command to use for moving nodes, so only coding
|
||||
* this one for configuring the node.
|
||||
* Return: Zero on success, associated error code on failure.
|
||||
*/
|
||||
int
|
||||
ice_aq_cfg_lan_txq(struct ice_hw *hw, struct ice_aqc_cfg_txqs_buf *buf,
|
||||
u16 buf_size, u16 num_qs, u8 oldport, u8 newport,
|
||||
struct ice_sq_cd *cd)
|
||||
u8 mode, struct ice_sq_cd *cd)
|
||||
{
|
||||
struct ice_aqc_cfg_txqs *cmd;
|
||||
struct libie_aq_desc desc;
|
||||
|
|
@ -4742,10 +4745,12 @@ ice_aq_cfg_lan_txq(struct ice_hw *hw, struct ice_aqc_cfg_txqs_buf *buf,
|
|||
if (!buf)
|
||||
return -EINVAL;
|
||||
|
||||
cmd->cmd_type = ICE_AQC_Q_CFG_TC_CHNG;
|
||||
cmd->cmd_type = mode;
|
||||
cmd->num_qs = num_qs;
|
||||
cmd->port_num_chng = (oldport & ICE_AQC_Q_CFG_SRC_PRT_M);
|
||||
cmd->port_num_chng |= FIELD_PREP(ICE_AQC_Q_CFG_DST_PRT_M, newport);
|
||||
cmd->port_num_chng |= FIELD_PREP(ICE_AQC_Q_CFG_MODE_M,
|
||||
ICE_AQC_Q_CFG_MODE_KEEP_OWN);
|
||||
cmd->time_out = FIELD_PREP(ICE_AQC_Q_CFG_TIMEOUT_M, 5);
|
||||
cmd->blocked_cgds = 0;
|
||||
|
||||
|
|
|
|||
|
|
@ -270,7 +270,7 @@ ice_ena_vsi_txq(struct ice_port_info *pi, u16 vsi_handle, u8 tc, u16 q_handle,
|
|||
int
|
||||
ice_aq_cfg_lan_txq(struct ice_hw *hw, struct ice_aqc_cfg_txqs_buf *buf,
|
||||
u16 buf_size, u16 num_qs, u8 oldport, u8 newport,
|
||||
struct ice_sq_cd *cd);
|
||||
u8 mode, struct ice_sq_cd *cd);
|
||||
int ice_replay_vsi(struct ice_hw *hw, u16 vsi_handle);
|
||||
void ice_replay_post(struct ice_hw *hw);
|
||||
struct ice_q_ctx *
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -14,7 +14,11 @@ enum ice_lag_role {
|
|||
ICE_LAG_UNSET
|
||||
};
|
||||
|
||||
#define ICE_LAG_INVALID_PORT 0xFF
|
||||
#define ICE_LAG_INVALID_PORT 0xFF
|
||||
#define ICE_LAGP_IDX 0
|
||||
#define ICE_LAGS_IDX 1
|
||||
#define ICE_LAGP_M 0x1
|
||||
#define ICE_LAGS_M 0x2
|
||||
|
||||
#define ICE_LAG_RESET_RETRIES 5
|
||||
#define ICE_SW_DEFAULT_PROFILE 0
|
||||
|
|
@ -41,12 +45,26 @@ struct ice_lag {
|
|||
u8 active_port; /* lport value for the current active port */
|
||||
u8 bonded:1; /* currently bonded */
|
||||
u8 primary:1; /* this is primary */
|
||||
u8 bond_aa:1; /* is this bond active-active */
|
||||
u8 need_fltr_cfg:1; /* fltrs for A/A bond still need to be make */
|
||||
u8 port_bitmap:2; /* bitmap of active ports */
|
||||
u8 bond_lport_pri; /* lport values for primary PF */
|
||||
u8 bond_lport_sec; /* lport values for secondary PF */
|
||||
|
||||
/* q_home keeps track of which interface the q is currently on */
|
||||
u8 q_home[ICE_MAX_SRIOV_VFS][ICE_MAX_RSS_QS_PER_VF];
|
||||
|
||||
/* placeholder VSI for hanging VF queues from on secondary interface */
|
||||
struct ice_vsi *sec_vf[ICE_MAX_SRIOV_VFS];
|
||||
|
||||
u16 pf_recipe;
|
||||
u16 lport_recipe;
|
||||
u16 act_act_recipe;
|
||||
u16 pf_rx_rule_id;
|
||||
u16 pf_tx_rule_id;
|
||||
u16 cp_rule_idx;
|
||||
u16 lport_rule_idx;
|
||||
u16 act_act_rule_idx;
|
||||
u8 role;
|
||||
};
|
||||
|
||||
|
|
@ -65,6 +83,7 @@ struct ice_lag_work {
|
|||
};
|
||||
|
||||
void ice_lag_move_new_vf_nodes(struct ice_vf *vf);
|
||||
void ice_lag_aa_failover(struct ice_lag *lag, u8 dest, struct ice_pf *e_pf);
|
||||
int ice_init_lag(struct ice_pf *pf);
|
||||
void ice_deinit_lag(struct ice_pf *pf);
|
||||
void ice_lag_rebuild(struct ice_pf *pf);
|
||||
|
|
|
|||
|
|
@ -293,8 +293,10 @@ struct ice_hw_common_caps {
|
|||
u8 dcb;
|
||||
u8 ieee_1588;
|
||||
u8 rdma;
|
||||
u8 roce_lag;
|
||||
u8 sriov_lag;
|
||||
|
||||
bool roce_lag;
|
||||
bool sriov_lag;
|
||||
bool sriov_aa_lag;
|
||||
|
||||
bool nvm_update_pending_nvm;
|
||||
bool nvm_update_pending_orom;
|
||||
|
|
|
|||
|
|
@ -192,8 +192,9 @@ LIBIE_CHECK_STRUCT_LEN(16, libie_aqc_list_caps);
|
|||
#define LIBIE_AQC_CAPS_TX_SCHED_TOPO_COMP_MODE 0x0085
|
||||
#define LIBIE_AQC_CAPS_NAC_TOPOLOGY 0x0087
|
||||
#define LIBIE_AQC_CAPS_FW_LAG_SUPPORT 0x0092
|
||||
#define LIBIE_AQC_BIT_ROCEV2_LAG 0x01
|
||||
#define LIBIE_AQC_BIT_SRIOV_LAG 0x02
|
||||
#define LIBIE_AQC_BIT_ROCEV2_LAG BIT(0)
|
||||
#define LIBIE_AQC_BIT_SRIOV_LAG BIT(1)
|
||||
#define LIBIE_AQC_BIT_SRIOV_AA_LAG BIT(2)
|
||||
#define LIBIE_AQC_CAPS_FLEX10 0x00F1
|
||||
#define LIBIE_AQC_CAPS_CEM 0x00F2
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user