forked from mirrors/linux
		
	ice: Add ice_get_link_status_datalen
The Get Link Status data length can vary with different versions of ice_aqc_get_link_status_data. Add ice_get_link_status_datalen() to return datalen for the specific ice_aqc_get_link_status_data version. Add new link partner fields to ice_aqc_get_link_status_data; PHY type, FEC, and flow control. Reviewed-by: Jesse Brandeburg <jesse.brandeburg@intel.com> Co-developed-by: Pawel Chmielewski <pawel.chmielewski@intel.com> Signed-off-by: Pawel Chmielewski <pawel.chmielewski@intel.com> Reviewed-by: Simon Horman <horms@kernel.org> Signed-off-by: Paul Greenwalt <paul.greenwalt@intel.com> Tested-by: Tony Brelinski <tony.brelinski@intel.com> Signed-off-by: Jacob Keller <jacob.e.keller@intel.com> Link: https://lore.kernel.org/r/20231025214157.1222758-4-jacob.e.keller@intel.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
		
							parent
							
								
									24407a01e5
								
							
						
					
					
						commit
						2777d24ec6
					
				
					 2 changed files with 53 additions and 6 deletions
				
			
		| 
						 | 
					@ -1329,10 +1329,39 @@ struct ice_aqc_get_link_status_data {
 | 
				
			||||||
#define ICE_AQ_LINK_SPEED_100GB		BIT(10)
 | 
					#define ICE_AQ_LINK_SPEED_100GB		BIT(10)
 | 
				
			||||||
#define ICE_AQ_LINK_SPEED_200GB		BIT(11)
 | 
					#define ICE_AQ_LINK_SPEED_200GB		BIT(11)
 | 
				
			||||||
#define ICE_AQ_LINK_SPEED_UNKNOWN	BIT(15)
 | 
					#define ICE_AQ_LINK_SPEED_UNKNOWN	BIT(15)
 | 
				
			||||||
	__le32 reserved3; /* Aligns next field to 8-byte boundary */
 | 
						/* Aligns next field to 8-byte boundary */
 | 
				
			||||||
	__le64 phy_type_low; /* Use values from ICE_PHY_TYPE_LOW_* */
 | 
						__le16 reserved3;
 | 
				
			||||||
	__le64 phy_type_high; /* Use values from ICE_PHY_TYPE_HIGH_* */
 | 
						u8 ext_fec_status;
 | 
				
			||||||
};
 | 
						/* RS 272 FEC enabled */
 | 
				
			||||||
 | 
					#define ICE_AQ_LINK_RS_272_FEC_EN      BIT(0)
 | 
				
			||||||
 | 
						u8 reserved4;
 | 
				
			||||||
 | 
						/* Use values from ICE_PHY_TYPE_LOW_* */
 | 
				
			||||||
 | 
						__le64 phy_type_low;
 | 
				
			||||||
 | 
						/* Use values from ICE_PHY_TYPE_HIGH_* */
 | 
				
			||||||
 | 
						__le64 phy_type_high;
 | 
				
			||||||
 | 
					#define ICE_AQC_LS_DATA_SIZE_V1 \
 | 
				
			||||||
 | 
						offsetofend(struct ice_aqc_get_link_status_data, phy_type_high)
 | 
				
			||||||
 | 
						/* Get link status v2 link partner data */
 | 
				
			||||||
 | 
						__le64 lp_phy_type_low;
 | 
				
			||||||
 | 
						__le64 lp_phy_type_high;
 | 
				
			||||||
 | 
						u8 lp_fec_adv;
 | 
				
			||||||
 | 
					#define ICE_AQ_LINK_LP_10G_KR_FEC_CAP  BIT(0)
 | 
				
			||||||
 | 
					#define ICE_AQ_LINK_LP_25G_KR_FEC_CAP  BIT(1)
 | 
				
			||||||
 | 
					#define ICE_AQ_LINK_LP_RS_528_FEC_CAP  BIT(2)
 | 
				
			||||||
 | 
					#define ICE_AQ_LINK_LP_50G_KR_272_FEC_CAP BIT(3)
 | 
				
			||||||
 | 
					#define ICE_AQ_LINK_LP_100G_KR_272_FEC_CAP BIT(4)
 | 
				
			||||||
 | 
					#define ICE_AQ_LINK_LP_200G_KR_272_FEC_CAP BIT(5)
 | 
				
			||||||
 | 
						u8 lp_fec_req;
 | 
				
			||||||
 | 
					#define ICE_AQ_LINK_LP_10G_KR_FEC_REQ  BIT(0)
 | 
				
			||||||
 | 
					#define ICE_AQ_LINK_LP_25G_KR_FEC_REQ  BIT(1)
 | 
				
			||||||
 | 
					#define ICE_AQ_LINK_LP_RS_528_FEC_REQ  BIT(2)
 | 
				
			||||||
 | 
					#define ICE_AQ_LINK_LP_KR_272_FEC_REQ  BIT(3)
 | 
				
			||||||
 | 
						u8 lp_flowcontrol;
 | 
				
			||||||
 | 
					#define ICE_AQ_LINK_LP_PAUSE_ADV       BIT(0)
 | 
				
			||||||
 | 
					#define ICE_AQ_LINK_LP_ASM_DIR_ADV     BIT(1)
 | 
				
			||||||
 | 
					#define ICE_AQC_LS_DATA_SIZE_V2 \
 | 
				
			||||||
 | 
						offsetofend(struct ice_aqc_get_link_status_data, lp_flowcontrol)
 | 
				
			||||||
 | 
					} __packed;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Set event mask command (direct 0x0613) */
 | 
					/* Set event mask command (direct 0x0613) */
 | 
				
			||||||
struct ice_aqc_set_event_mask {
 | 
					struct ice_aqc_set_event_mask {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -651,6 +651,24 @@ static enum ice_media_type ice_get_media_type(struct ice_port_info *pi)
 | 
				
			||||||
	return ICE_MEDIA_UNKNOWN;
 | 
						return ICE_MEDIA_UNKNOWN;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * ice_get_link_status_datalen
 | 
				
			||||||
 | 
					 * @hw: pointer to the HW struct
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Returns datalength for the Get Link Status AQ command, which is bigger for
 | 
				
			||||||
 | 
					 * newer adapter families handled by ice driver.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static u16 ice_get_link_status_datalen(struct ice_hw *hw)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						switch (hw->mac_type) {
 | 
				
			||||||
 | 
						case ICE_MAC_E830:
 | 
				
			||||||
 | 
							return ICE_AQC_LS_DATA_SIZE_V2;
 | 
				
			||||||
 | 
						case ICE_MAC_E810:
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							return ICE_AQC_LS_DATA_SIZE_V1;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * ice_aq_get_link_info
 | 
					 * ice_aq_get_link_info
 | 
				
			||||||
 * @pi: port information structure
 | 
					 * @pi: port information structure
 | 
				
			||||||
| 
						 | 
					@ -689,8 +707,8 @@ ice_aq_get_link_info(struct ice_port_info *pi, bool ena_lse,
 | 
				
			||||||
	resp->cmd_flags = cpu_to_le16(cmd_flags);
 | 
						resp->cmd_flags = cpu_to_le16(cmd_flags);
 | 
				
			||||||
	resp->lport_num = pi->lport;
 | 
						resp->lport_num = pi->lport;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	status = ice_aq_send_cmd(hw, &desc, &link_data, sizeof(link_data), cd);
 | 
						status = ice_aq_send_cmd(hw, &desc, &link_data,
 | 
				
			||||||
 | 
									 ice_get_link_status_datalen(hw), cd);
 | 
				
			||||||
	if (status)
 | 
						if (status)
 | 
				
			||||||
		return status;
 | 
							return status;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue