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_OFFSET (NET_SKB_PAD + NET_IP_ALIGN) | ||||||
| #define BNXT_RX_DMA_OFFSET NET_SKB_PAD | #define BNXT_RX_DMA_OFFSET NET_SKB_PAD | ||||||
| #define BNXT_RX_COPY_THRESH 256 |  | ||||||
| 
 | 
 | ||||||
| #define BNXT_TX_PUSH_THRESH 164 | #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) | 	if (!skb) | ||||||
| 		return NULL; | 		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); | 				bp->rx_dir); | ||||||
| 
 | 
 | ||||||
| 	memcpy(skb->data - NET_IP_ALIGN, data - NET_IP_ALIGN, | 	memcpy(skb->data - NET_IP_ALIGN, data - NET_IP_ALIGN, | ||||||
| 	       len + 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); | 				   bp->rx_dir); | ||||||
| 
 | 
 | ||||||
| 	skb_put(skb, len); | 	skb_put(skb, len); | ||||||
|  | @ -1842,7 +1841,7 @@ static inline struct sk_buff *bnxt_tpa_end(struct bnxt *bp, | ||||||
| 		return NULL; | 		return NULL; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if (len <= bp->rx_copy_thresh) { | 	if (len <= bp->rx_copybreak) { | ||||||
| 		skb = bnxt_copy_skb(bnapi, data_ptr, len, mapping); | 		skb = bnxt_copy_skb(bnapi, data_ptr, len, mapping); | ||||||
| 		if (!skb) { | 		if (!skb) { | ||||||
| 			bnxt_abort_tpa(cpr, idx, agg_bufs); | 			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) | 		if (!xdp_active) | ||||||
| 			skb = bnxt_copy_skb(bnapi, data_ptr, len, dma_addr); | 			skb = bnxt_copy_skb(bnapi, data_ptr, len, dma_addr); | ||||||
| 		else | 		else | ||||||
|  | @ -4608,6 +4607,11 @@ void bnxt_set_tpa_flags(struct bnxt *bp) | ||||||
| 		bp->flags |= BNXT_FLAG_GRO; | 		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
 | /* bp->rx_ring_size, bp->tx_ring_size, dev->mtu, BNXT_FLAG_{G|L}RO flags must
 | ||||||
|  * be set on entry. |  * 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) + | 	rx_space = rx_size + ALIGN(max(NET_SKB_PAD, XDP_PACKET_HEADROOM), 8) + | ||||||
| 		SKB_DATA_ALIGN(sizeof(struct skb_shared_info)); | 		SKB_DATA_ALIGN(sizeof(struct skb_shared_info)); | ||||||
| 
 | 
 | ||||||
| 	bp->rx_copy_thresh = BNXT_RX_COPY_THRESH; |  | ||||||
| 	ring_size = bp->rx_ring_size; | 	ring_size = bp->rx_ring_size; | ||||||
| 	bp->rx_agg_ring_size = 0; | 	bp->rx_agg_ring_size = 0; | ||||||
| 	bp->rx_agg_nr_pages = 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) - | 				  ALIGN(max(NET_SKB_PAD, XDP_PACKET_HEADROOM), 8) - | ||||||
| 				  SKB_DATA_ALIGN(sizeof(struct skb_shared_info)); | 				  SKB_DATA_ALIGN(sizeof(struct skb_shared_info)); | ||||||
| 		} else { | 		} 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 + | 			rx_space = rx_size + NET_SKB_PAD + | ||||||
| 				SKB_DATA_ALIGN(sizeof(struct skb_shared_info)); | 				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->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->enables = cpu_to_le32(VNIC_PLCMODES_CFG_REQ_ENABLES_JUMBO_THRESH_VALID); | ||||||
| 
 |  | ||||||
| 	if (BNXT_RX_PAGE_MODE(bp)) { |  | ||||||
| 	req->jumbo_thresh = cpu_to_le16(bp->rx_buf_use_size); | 	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 | | 		req->flags |= cpu_to_le32(VNIC_PLCMODES_CFG_REQ_FLAGS_HDS_IPV4 | | ||||||
| 					  VNIC_PLCMODES_CFG_REQ_FLAGS_HDS_IPV6); | 					  VNIC_PLCMODES_CFG_REQ_FLAGS_HDS_IPV6); | ||||||
| 		req->enables |= | 		req->enables |= | ||||||
| 			cpu_to_le32(VNIC_PLCMODES_CFG_REQ_ENABLES_HDS_THRESHOLD_VALID); | 			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_copybreak); | ||||||
| 		req->hds_threshold = cpu_to_le16(bp->rx_copy_thresh); |  | ||||||
| 	} | 	} | ||||||
| 	req->vnic_id = cpu_to_le32(vnic->fw_vnic_id); | 	req->vnic_id = cpu_to_le32(vnic->fw_vnic_id); | ||||||
| 	return hwrm_req_send(bp, req); | 	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_init_l2_fltr_tbl(bp); | ||||||
| 	bnxt_set_rx_skb_mode(bp, false); | 	bnxt_set_rx_skb_mode(bp, false); | ||||||
| 	bnxt_set_tpa_flags(bp); | 	bnxt_set_tpa_flags(bp); | ||||||
|  | 	bnxt_init_ring_params(bp); | ||||||
| 	bnxt_set_ring_params(bp); | 	bnxt_set_ring_params(bp); | ||||||
| 	bnxt_rdma_aux_device_init(bp); | 	bnxt_rdma_aux_device_init(bp); | ||||||
| 	rc = bnxt_set_dflt_rings(bp, true); | 	rc = bnxt_set_dflt_rings(bp, true); | ||||||
|  |  | ||||||
|  | @ -34,6 +34,9 @@ | ||||||
| #include <linux/firmware/broadcom/tee_bnxt_fw.h> | #include <linux/firmware/broadcom/tee_bnxt_fw.h> | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | #define BNXT_DEFAULT_RX_COPYBREAK 256 | ||||||
|  | #define BNXT_MAX_RX_COPYBREAK 1024 | ||||||
|  | 
 | ||||||
| extern struct list_head bnxt_block_cb_list; | extern struct list_head bnxt_block_cb_list; | ||||||
| 
 | 
 | ||||||
| struct page_pool; | struct page_pool; | ||||||
|  | @ -2347,7 +2350,7 @@ struct bnxt { | ||||||
| 	enum dma_data_direction	rx_dir; | 	enum dma_data_direction	rx_dir; | ||||||
| 	u32			rx_ring_size; | 	u32			rx_ring_size; | ||||||
| 	u32			rx_agg_ring_size; | 	u32			rx_agg_ring_size; | ||||||
| 	u32			rx_copy_thresh; | 	u32			rx_copybreak; | ||||||
| 	u32			rx_ring_mask; | 	u32			rx_ring_mask; | ||||||
| 	u32			rx_agg_ring_mask; | 	u32			rx_agg_ring_mask; | ||||||
| 	int			rx_nr_pages; | 	int			rx_nr_pages; | ||||||
|  |  | ||||||
|  | @ -4328,6 +4328,45 @@ static int bnxt_get_eee(struct net_device *dev, struct ethtool_keee *edata) | ||||||
| 	return 0; | 	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, | static int bnxt_read_sfp_module_eeprom_info(struct bnxt *bp, u16 i2c_addr, | ||||||
| 					    u16 page_number, u8 bank, | 					    u16 page_number, u8 bank, | ||||||
| 					    u16 start_addr, u16 data_length, | 					    u16 start_addr, u16 data_length, | ||||||
|  | @ -4790,7 +4829,8 @@ static int bnxt_run_loopback(struct bnxt *bp) | ||||||
| 	cpr = &rxr->bnapi->cp_ring; | 	cpr = &rxr->bnapi->cp_ring; | ||||||
| 	if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS) | 	if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS) | ||||||
| 		cpr = rxr->rx_cpr; | 		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); | 	skb = netdev_alloc_skb(bp->dev, pkt_size); | ||||||
| 	if (!skb) | 	if (!skb) | ||||||
| 		return -ENOMEM; | 		return -ENOMEM; | ||||||
|  | @ -5372,6 +5412,8 @@ const struct ethtool_ops bnxt_ethtool_ops = { | ||||||
| 	.get_link_ext_stats	= bnxt_get_link_ext_stats, | 	.get_link_ext_stats	= bnxt_get_link_ext_stats, | ||||||
| 	.get_eee		= bnxt_get_eee, | 	.get_eee		= bnxt_get_eee, | ||||||
| 	.set_eee		= bnxt_set_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_info	= bnxt_get_module_info, | ||||||
| 	.get_module_eeprom	= bnxt_get_module_eeprom, | 	.get_module_eeprom	= bnxt_get_module_eeprom, | ||||||
| 	.get_module_eeprom_by_page = bnxt_get_module_eeprom_by_page, | 	.get_module_eeprom_by_page = bnxt_get_module_eeprom_by_page, | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Taehee Yoo
						Taehee Yoo