forked from mirrors/linux
		
	bnxt_en: add support for rx-copybreak ethtool command
The bnxt_en driver supports rx-copybreak, but it couldn't be set by userspace. Only the default value(256) has worked. This patch makes the bnxt_en driver support following command. `ethtool --set-tunable <devname> rx-copybreak <value> ` and `ethtool --get-tunable <devname> rx-copybreak`. By this patch, hds_threshol is set to the rx-copybreak value. But it will be set by `ethtool -G eth0 hds-thresh N` in the next patch. Reviewed-by: Jakub Kicinski <kuba@kernel.org> Reviewed-by: Brett Creeley <brett.creeley@amd.com> Tested-by: Stanislav Fomichev <sdf@fomichev.me> Tested-by: Andy Gospodarek <gospo@broadcom.com> Signed-off-by: Taehee Yoo <ap420073@gmail.com> Reviewed-by: Michael Chan <michael.chan@broadcom.com> Link: https://patch.msgid.link/20250114142852.3364986-7-ap420073@gmail.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
		
							parent
							
								
									2d46e481a9
								
							
						
					
					
						commit
						152f4da05a
					
				
					 3 changed files with 63 additions and 14 deletions
				
			
		|  | @ -81,7 +81,6 @@ MODULE_DESCRIPTION("Broadcom NetXtreme network driver"); | |||
| 
 | ||||
| #define BNXT_RX_OFFSET (NET_SKB_PAD + NET_IP_ALIGN) | ||||
| #define BNXT_RX_DMA_OFFSET NET_SKB_PAD | ||||
| #define BNXT_RX_COPY_THRESH 256 | ||||
| 
 | ||||
| #define BNXT_TX_PUSH_THRESH 164 | ||||
| 
 | ||||
|  | @ -1343,13 +1342,13 @@ static struct sk_buff *bnxt_copy_data(struct bnxt_napi *bnapi, u8 *data, | |||
| 	if (!skb) | ||||
| 		return NULL; | ||||
| 
 | ||||
| 	dma_sync_single_for_cpu(&pdev->dev, mapping, bp->rx_copy_thresh, | ||||
| 	dma_sync_single_for_cpu(&pdev->dev, mapping, bp->rx_copybreak, | ||||
| 				bp->rx_dir); | ||||
| 
 | ||||
| 	memcpy(skb->data - NET_IP_ALIGN, data - NET_IP_ALIGN, | ||||
| 	       len + NET_IP_ALIGN); | ||||
| 
 | ||||
| 	dma_sync_single_for_device(&pdev->dev, mapping, bp->rx_copy_thresh, | ||||
| 	dma_sync_single_for_device(&pdev->dev, mapping, bp->rx_copybreak, | ||||
| 				   bp->rx_dir); | ||||
| 
 | ||||
| 	skb_put(skb, len); | ||||
|  | @ -1842,7 +1841,7 @@ static inline struct sk_buff *bnxt_tpa_end(struct bnxt *bp, | |||
| 		return NULL; | ||||
| 	} | ||||
| 
 | ||||
| 	if (len <= bp->rx_copy_thresh) { | ||||
| 	if (len <= bp->rx_copybreak) { | ||||
| 		skb = bnxt_copy_skb(bnapi, data_ptr, len, mapping); | ||||
| 		if (!skb) { | ||||
| 			bnxt_abort_tpa(cpr, idx, agg_bufs); | ||||
|  | @ -2176,7 +2175,7 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_cp_ring_info *cpr, | |||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if (len <= bp->rx_copy_thresh) { | ||||
| 	if (len <= bp->rx_copybreak) { | ||||
| 		if (!xdp_active) | ||||
| 			skb = bnxt_copy_skb(bnapi, data_ptr, len, dma_addr); | ||||
| 		else | ||||
|  | @ -4608,6 +4607,11 @@ void bnxt_set_tpa_flags(struct bnxt *bp) | |||
| 		bp->flags |= BNXT_FLAG_GRO; | ||||
| } | ||||
| 
 | ||||
| static void bnxt_init_ring_params(struct bnxt *bp) | ||||
| { | ||||
| 	bp->rx_copybreak = BNXT_DEFAULT_RX_COPYBREAK; | ||||
| } | ||||
| 
 | ||||
| /* bp->rx_ring_size, bp->tx_ring_size, dev->mtu, BNXT_FLAG_{G|L}RO flags must
 | ||||
|  * be set on entry. | ||||
|  */ | ||||
|  | @ -4622,7 +4626,6 @@ void bnxt_set_ring_params(struct bnxt *bp) | |||
| 	rx_space = rx_size + ALIGN(max(NET_SKB_PAD, XDP_PACKET_HEADROOM), 8) + | ||||
| 		SKB_DATA_ALIGN(sizeof(struct skb_shared_info)); | ||||
| 
 | ||||
| 	bp->rx_copy_thresh = BNXT_RX_COPY_THRESH; | ||||
| 	ring_size = bp->rx_ring_size; | ||||
| 	bp->rx_agg_ring_size = 0; | ||||
| 	bp->rx_agg_nr_pages = 0; | ||||
|  | @ -4667,7 +4670,9 @@ void bnxt_set_ring_params(struct bnxt *bp) | |||
| 				  ALIGN(max(NET_SKB_PAD, XDP_PACKET_HEADROOM), 8) - | ||||
| 				  SKB_DATA_ALIGN(sizeof(struct skb_shared_info)); | ||||
| 		} else { | ||||
| 			rx_size = SKB_DATA_ALIGN(BNXT_RX_COPY_THRESH + NET_IP_ALIGN); | ||||
| 			rx_size = SKB_DATA_ALIGN(max(BNXT_DEFAULT_RX_COPYBREAK, | ||||
| 						     bp->rx_copybreak) + | ||||
| 						 NET_IP_ALIGN); | ||||
| 			rx_space = rx_size + NET_SKB_PAD + | ||||
| 				SKB_DATA_ALIGN(sizeof(struct skb_shared_info)); | ||||
| 		} | ||||
|  | @ -6573,16 +6578,14 @@ static int bnxt_hwrm_vnic_set_hds(struct bnxt *bp, struct bnxt_vnic_info *vnic) | |||
| 
 | ||||
| 	req->flags = cpu_to_le32(VNIC_PLCMODES_CFG_REQ_FLAGS_JUMBO_PLACEMENT); | ||||
| 	req->enables = cpu_to_le32(VNIC_PLCMODES_CFG_REQ_ENABLES_JUMBO_THRESH_VALID); | ||||
| 	req->jumbo_thresh = cpu_to_le16(bp->rx_buf_use_size); | ||||
| 
 | ||||
| 	if (BNXT_RX_PAGE_MODE(bp)) { | ||||
| 		req->jumbo_thresh = cpu_to_le16(bp->rx_buf_use_size); | ||||
| 	} else { | ||||
| 	if (!BNXT_RX_PAGE_MODE(bp) && (bp->flags & BNXT_FLAG_AGG_RINGS)) { | ||||
| 		req->flags |= cpu_to_le32(VNIC_PLCMODES_CFG_REQ_FLAGS_HDS_IPV4 | | ||||
| 					  VNIC_PLCMODES_CFG_REQ_FLAGS_HDS_IPV6); | ||||
| 		req->enables |= | ||||
| 			cpu_to_le32(VNIC_PLCMODES_CFG_REQ_ENABLES_HDS_THRESHOLD_VALID); | ||||
| 		req->jumbo_thresh = cpu_to_le16(bp->rx_copy_thresh); | ||||
| 		req->hds_threshold = cpu_to_le16(bp->rx_copy_thresh); | ||||
| 		req->hds_threshold = cpu_to_le16(bp->rx_copybreak); | ||||
| 	} | ||||
| 	req->vnic_id = cpu_to_le32(vnic->fw_vnic_id); | ||||
| 	return hwrm_req_send(bp, req); | ||||
|  | @ -16261,6 +16264,7 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 	bnxt_init_l2_fltr_tbl(bp); | ||||
| 	bnxt_set_rx_skb_mode(bp, false); | ||||
| 	bnxt_set_tpa_flags(bp); | ||||
| 	bnxt_init_ring_params(bp); | ||||
| 	bnxt_set_ring_params(bp); | ||||
| 	bnxt_rdma_aux_device_init(bp); | ||||
| 	rc = bnxt_set_dflt_rings(bp, true); | ||||
|  |  | |||
|  | @ -34,6 +34,9 @@ | |||
| #include <linux/firmware/broadcom/tee_bnxt_fw.h> | ||||
| #endif | ||||
| 
 | ||||
| #define BNXT_DEFAULT_RX_COPYBREAK 256 | ||||
| #define BNXT_MAX_RX_COPYBREAK 1024 | ||||
| 
 | ||||
| extern struct list_head bnxt_block_cb_list; | ||||
| 
 | ||||
| struct page_pool; | ||||
|  | @ -2347,7 +2350,7 @@ struct bnxt { | |||
| 	enum dma_data_direction	rx_dir; | ||||
| 	u32			rx_ring_size; | ||||
| 	u32			rx_agg_ring_size; | ||||
| 	u32			rx_copy_thresh; | ||||
| 	u32			rx_copybreak; | ||||
| 	u32			rx_ring_mask; | ||||
| 	u32			rx_agg_ring_mask; | ||||
| 	int			rx_nr_pages; | ||||
|  |  | |||
|  | @ -4328,6 +4328,45 @@ static int bnxt_get_eee(struct net_device *dev, struct ethtool_keee *edata) | |||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int bnxt_set_tunable(struct net_device *dev, | ||||
| 			    const struct ethtool_tunable *tuna, | ||||
| 			    const void *data) | ||||
| { | ||||
| 	struct bnxt *bp = netdev_priv(dev); | ||||
| 	u32 rx_copybreak; | ||||
| 
 | ||||
| 	switch (tuna->id) { | ||||
| 	case ETHTOOL_RX_COPYBREAK: | ||||
| 		rx_copybreak = *(u32 *)data; | ||||
| 		if (rx_copybreak > BNXT_MAX_RX_COPYBREAK) | ||||
| 			return -ERANGE; | ||||
| 		if (rx_copybreak != bp->rx_copybreak) { | ||||
| 			if (netif_running(dev)) | ||||
| 				return -EBUSY; | ||||
| 			bp->rx_copybreak = rx_copybreak; | ||||
| 		} | ||||
| 		return 0; | ||||
| 	default: | ||||
| 		return -EOPNOTSUPP; | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| static int bnxt_get_tunable(struct net_device *dev, | ||||
| 			    const struct ethtool_tunable *tuna, void *data) | ||||
| { | ||||
| 	struct bnxt *bp = netdev_priv(dev); | ||||
| 
 | ||||
| 	switch (tuna->id) { | ||||
| 	case ETHTOOL_RX_COPYBREAK: | ||||
| 		*(u32 *)data = bp->rx_copybreak; | ||||
| 		break; | ||||
| 	default: | ||||
| 		return -EOPNOTSUPP; | ||||
| 	} | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int bnxt_read_sfp_module_eeprom_info(struct bnxt *bp, u16 i2c_addr, | ||||
| 					    u16 page_number, u8 bank, | ||||
| 					    u16 start_addr, u16 data_length, | ||||
|  | @ -4790,7 +4829,8 @@ static int bnxt_run_loopback(struct bnxt *bp) | |||
| 	cpr = &rxr->bnapi->cp_ring; | ||||
| 	if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS) | ||||
| 		cpr = rxr->rx_cpr; | ||||
| 	pkt_size = min(bp->dev->mtu + ETH_HLEN, bp->rx_copy_thresh); | ||||
| 	pkt_size = min(bp->dev->mtu + ETH_HLEN, max(BNXT_DEFAULT_RX_COPYBREAK, | ||||
| 						    bp->rx_copybreak)); | ||||
| 	skb = netdev_alloc_skb(bp->dev, pkt_size); | ||||
| 	if (!skb) | ||||
| 		return -ENOMEM; | ||||
|  | @ -5372,6 +5412,8 @@ const struct ethtool_ops bnxt_ethtool_ops = { | |||
| 	.get_link_ext_stats	= bnxt_get_link_ext_stats, | ||||
| 	.get_eee		= bnxt_get_eee, | ||||
| 	.set_eee		= bnxt_set_eee, | ||||
| 	.get_tunable		= bnxt_get_tunable, | ||||
| 	.set_tunable		= bnxt_set_tunable, | ||||
| 	.get_module_info	= bnxt_get_module_info, | ||||
| 	.get_module_eeprom	= bnxt_get_module_eeprom, | ||||
| 	.get_module_eeprom_by_page = bnxt_get_module_eeprom_by_page, | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Taehee Yoo
						Taehee Yoo