diff options
Diffstat (limited to 'drivers/net/ethernet/intel/ice/ice_common.c')
| -rw-r--r-- | drivers/net/ethernet/intel/ice/ice_common.c | 35 | 
1 files changed, 33 insertions, 2 deletions
diff --git a/drivers/net/ethernet/intel/ice/ice_common.c b/drivers/net/ethernet/intel/ice/ice_common.c index 2250426ec91b..2532b6f82e97 100644 --- a/drivers/net/ethernet/intel/ice/ice_common.c +++ b/drivers/net/ethernet/intel/ice/ice_common.c @@ -4382,6 +4382,15 @@ int ice_get_phy_lane_number(struct ice_hw *hw)  	unsigned int lane;  	int err; +	/* E82X does not have sequential IDs, lane number is PF ID. +	 * For E825 device, the exception is the variant with external +	 * PHY (0x579F), in which there is also 1:1 pf_id -> lane_number +	 * mapping. +	 */ +	if (hw->mac_type == ICE_MAC_GENERIC || +	    hw->device_id == ICE_DEV_ID_E825C_SGMII) +		return hw->pf_id; +  	options = kcalloc(ICE_AQC_PORT_OPT_MAX, sizeof(*options), GFP_KERNEL);  	if (!options)  		return -ENOMEM; @@ -6497,6 +6506,28 @@ u32 ice_get_link_speed(u16 index)  }  /** + * ice_get_dest_cgu - get destination CGU dev for given HW + * @hw: pointer to the HW struct + * + * Get CGU client id for CGU register read/write operations. + * + * Return: CGU device id to use in SBQ transactions. + */ +static enum ice_sbq_dev_id ice_get_dest_cgu(struct ice_hw *hw) +{ +	/* On dual complex E825 only complex 0 has functional CGU powering all +	 * the PHYs. +	 * SBQ destination device cgu points to CGU on a current complex and to +	 * access primary CGU from the secondary complex, the driver should use +	 * cgu_peer as a destination device. +	 */ +	if (hw->mac_type == ICE_MAC_GENERIC_3K_E825 && ice_is_dual(hw) && +	    !ice_is_primary(hw)) +		return ice_sbq_dev_cgu_peer; +	return ice_sbq_dev_cgu; +} + +/**   * ice_read_cgu_reg - Read a CGU register   * @hw: Pointer to the HW struct   * @addr: Register address to read @@ -6510,8 +6541,8 @@ u32 ice_get_link_speed(u16 index)  int ice_read_cgu_reg(struct ice_hw *hw, u32 addr, u32 *val)  {  	struct ice_sbq_msg_input cgu_msg = { +		.dest_dev = ice_get_dest_cgu(hw),  		.opcode = ice_sbq_msg_rd, -		.dest_dev = ice_sbq_dev_cgu,  		.msg_addr_low = addr  	};  	int err; @@ -6542,8 +6573,8 @@ int ice_read_cgu_reg(struct ice_hw *hw, u32 addr, u32 *val)  int ice_write_cgu_reg(struct ice_hw *hw, u32 addr, u32 val)  {  	struct ice_sbq_msg_input cgu_msg = { +		.dest_dev = ice_get_dest_cgu(hw),  		.opcode = ice_sbq_msg_wr, -		.dest_dev = ice_sbq_dev_cgu,  		.msg_addr_low = addr,  		.data = val  	};  | 
