diff options
Diffstat (limited to 'drivers/net/ethernet/intel/ice/ice_base.c')
| -rw-r--r-- | drivers/net/ethernet/intel/ice/ice_base.c | 72 | 
1 files changed, 53 insertions, 19 deletions
| diff --git a/drivers/net/ethernet/intel/ice/ice_base.c b/drivers/net/ethernet/intel/ice/ice_base.c index 3124a3bf519a..5985a7e5ca8a 100644 --- a/drivers/net/ethernet/intel/ice/ice_base.c +++ b/drivers/net/ethernet/intel/ice/ice_base.c @@ -113,6 +113,9 @@ static int ice_vsi_alloc_q_vector(struct ice_vsi *vsi, u16 v_idx)  	q_vector->v_idx = v_idx;  	q_vector->tx.itr_setting = ICE_DFLT_TX_ITR;  	q_vector->rx.itr_setting = ICE_DFLT_RX_ITR; +	q_vector->tx.itr_mode = ITR_DYNAMIC; +	q_vector->rx.itr_mode = ITR_DYNAMIC; +  	if (vsi->type == ICE_VSI_VF)  		goto out;  	/* only set affinity_mask if the CPU is online */ @@ -215,6 +218,26 @@ static u16 ice_calc_q_handle(struct ice_vsi *vsi, struct ice_ring *ring, u8 tc)  }  /** + * ice_cfg_xps_tx_ring - Configure XPS for a Tx ring + * @ring: The Tx ring to configure + * + * This enables/disables XPS for a given Tx descriptor ring + * based on the TCs enabled for the VSI that ring belongs to. + */ +static void ice_cfg_xps_tx_ring(struct ice_ring *ring) +{ +	if (!ring->q_vector || !ring->netdev) +		return; + +	/* We only initialize XPS once, so as not to overwrite user settings */ +	if (test_and_set_bit(ICE_TX_XPS_INIT_DONE, ring->xps_state)) +		return; + +	netif_set_xps_queue(ring->netdev, &ring->q_vector->affinity_mask, +			    ring->q_index); +} + +/**   * ice_setup_tx_ctx - setup a struct ice_tlan_ctx instance   * @ring: The Tx ring to configure   * @tlan_ctx: Pointer to the Tx LAN queue context structure to be initialized @@ -275,6 +298,22 @@ ice_setup_tx_ctx(struct ice_ring *ring, struct ice_tlan_ctx *tlan_ctx, u16 pf_q)  }  /** + * ice_rx_offset - Return expected offset into page to access data + * @rx_ring: Ring we are requesting offset of + * + * Returns the offset value for ring into the data buffer. + */ +static unsigned int ice_rx_offset(struct ice_ring *rx_ring) +{ +	if (ice_ring_uses_build_skb(rx_ring)) +		return ICE_SKB_PAD; +	else if (ice_is_xdp_ena_vsi(rx_ring->vsi)) +		return XDP_PACKET_HEADROOM; + +	return 0; +} + +/**   * ice_setup_rx_ctx - Configure a receive ring context   * @ring: The Rx ring to configure   * @@ -413,11 +452,15 @@ int ice_setup_rx_ctx(struct ice_ring *ring)  	else  		ice_set_ring_build_skb_ena(ring); +	ring->rx_offset = ice_rx_offset(ring); +  	/* init queue specific tail register */  	ring->tail = hw->hw_addr + QRX_TAIL(pf_q);  	writel(0, ring->tail);  	if (ring->xsk_pool) { +		bool ok; +  		if (!xsk_buff_can_alloc(ring->xsk_pool, num_bufs)) {  			dev_warn(dev, "XSK buffer pool does not provide enough addresses to fill %d buffers on Rx ring %d\n",  				 num_bufs, ring->q_index); @@ -426,8 +469,8 @@ int ice_setup_rx_ctx(struct ice_ring *ring)  			return 0;  		} -		err = ice_alloc_rx_bufs_zc(ring, num_bufs); -		if (err) +		ok = ice_alloc_rx_bufs_zc(ring, num_bufs); +		if (!ok)  			dev_info(dev, "Failed to allocate some buffers on XSK buffer pool enabled Rx ring %d (pf_q %d)\n",  				 ring->q_index, pf_q);  		return 0; @@ -644,6 +687,9 @@ ice_vsi_cfg_txq(struct ice_vsi *vsi, struct ice_ring *ring,  	u16 pf_q;  	u8 tc; +	/* Configure XPS */ +	ice_cfg_xps_tx_ring(ring); +  	pf_q = ring->reg_idx;  	ice_setup_tx_ctx(ring, &tlan_ctx, pf_q);  	/* copy context contents into the qg_buf */ @@ -697,25 +743,13 @@ void ice_cfg_itr(struct ice_hw *hw, struct ice_q_vector *q_vector)  {  	ice_cfg_itr_gran(hw); -	if (q_vector->num_ring_rx) { -		struct ice_ring_container *rc = &q_vector->rx; +	if (q_vector->num_ring_rx) +		ice_write_itr(&q_vector->rx, q_vector->rx.itr_setting); -		rc->target_itr = ITR_TO_REG(rc->itr_setting); -		rc->next_update = jiffies + 1; -		rc->current_itr = rc->target_itr; -		wr32(hw, GLINT_ITR(rc->itr_idx, q_vector->reg_idx), -		     ITR_REG_ALIGN(rc->current_itr) >> ICE_ITR_GRAN_S); -	} - -	if (q_vector->num_ring_tx) { -		struct ice_ring_container *rc = &q_vector->tx; +	if (q_vector->num_ring_tx) +		ice_write_itr(&q_vector->tx, q_vector->tx.itr_setting); -		rc->target_itr = ITR_TO_REG(rc->itr_setting); -		rc->next_update = jiffies + 1; -		rc->current_itr = rc->target_itr; -		wr32(hw, GLINT_ITR(rc->itr_idx, q_vector->reg_idx), -		     ITR_REG_ALIGN(rc->current_itr) >> ICE_ITR_GRAN_S); -	} +	ice_write_intrl(q_vector, q_vector->intrl);  }  /** | 
