diff options
Diffstat (limited to 'drivers/net/ethernet/intel/ice')
| -rw-r--r-- | drivers/net/ethernet/intel/ice/ice_common.c | 35 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ice/ice_flex_pipe.c | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ice/ice_sbq_cmd.h | 1 | 
3 files changed, 35 insertions, 3 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  	}; diff --git a/drivers/net/ethernet/intel/ice/ice_flex_pipe.c b/drivers/net/ethernet/intel/ice/ice_flex_pipe.c index 363ae79a3620..013c93b6605e 100644 --- a/drivers/net/ethernet/intel/ice/ice_flex_pipe.c +++ b/drivers/net/ethernet/intel/ice/ice_flex_pipe.c @@ -1479,7 +1479,7 @@ static void ice_init_prof_masks(struct ice_hw *hw, enum ice_block blk)  	per_pf = ICE_PROF_MASK_COUNT / hw->dev_caps.num_funcs;  	hw->blk[blk].masks.count = per_pf; -	hw->blk[blk].masks.first = hw->pf_id * per_pf; +	hw->blk[blk].masks.first = hw->logical_pf_id * per_pf;  	memset(hw->blk[blk].masks.masks, 0, sizeof(hw->blk[blk].masks.masks)); diff --git a/drivers/net/ethernet/intel/ice/ice_sbq_cmd.h b/drivers/net/ethernet/intel/ice/ice_sbq_cmd.h index 183dd5457d6a..21bb861febbf 100644 --- a/drivers/net/ethernet/intel/ice/ice_sbq_cmd.h +++ b/drivers/net/ethernet/intel/ice/ice_sbq_cmd.h @@ -50,6 +50,7 @@ enum ice_sbq_dev_id {  	ice_sbq_dev_phy_0	= 0x02,  	ice_sbq_dev_cgu		= 0x06,  	ice_sbq_dev_phy_0_peer	= 0x0D, +	ice_sbq_dev_cgu_peer	= 0x0F,  };  enum ice_sbq_msg_opcode {  | 
