Commit 87783721 authored by Hao Chen's avatar Hao Chen Committed by David S. Miller

net: hns3: fix ethtool tx copybreak buf size indicating not aligned issue

When use ethtoool set tx copybreak buf size to a large value
which causes order exceeding 10 or memory is not enough,
it causes allocating tx copybreak buffer failed and print
"the active tx spare buf is 0, not enabled tx spare buffer",
however, use --get-tunable parameter query tx copybreak buf
size and it indicates setting value not 0.

So, it's necessary to change the print value from setting
value to 0.

Set kinfo.tx_spare_buf_size to 0 when set tx copybreak buf size failed.

Fixes: e445f08a ("net: hns3: add support to set/get tx copybreak buf size via ethtool for hns3 driver")
Signed-off-by: default avatarHao Chen <chenhao288@hisilicon.com>
Signed-off-by: default avatarGuangbin Huang <huangguangbin2@huawei.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b50d3b46
...@@ -1028,13 +1028,12 @@ static bool hns3_can_use_tx_sgl(struct hns3_enet_ring *ring, ...@@ -1028,13 +1028,12 @@ static bool hns3_can_use_tx_sgl(struct hns3_enet_ring *ring,
static void hns3_init_tx_spare_buffer(struct hns3_enet_ring *ring) static void hns3_init_tx_spare_buffer(struct hns3_enet_ring *ring)
{ {
u32 alloc_size = ring->tqp->handle->kinfo.tx_spare_buf_size;
struct hns3_tx_spare *tx_spare; struct hns3_tx_spare *tx_spare;
struct page *page; struct page *page;
u32 alloc_size;
dma_addr_t dma; dma_addr_t dma;
int order; int order;
alloc_size = ring->tqp->handle->kinfo.tx_spare_buf_size;
if (!alloc_size) if (!alloc_size)
return; return;
...@@ -1044,30 +1043,35 @@ static void hns3_init_tx_spare_buffer(struct hns3_enet_ring *ring) ...@@ -1044,30 +1043,35 @@ static void hns3_init_tx_spare_buffer(struct hns3_enet_ring *ring)
if (!tx_spare) { if (!tx_spare) {
/* The driver still work without the tx spare buffer */ /* The driver still work without the tx spare buffer */
dev_warn(ring_to_dev(ring), "failed to allocate hns3_tx_spare\n"); dev_warn(ring_to_dev(ring), "failed to allocate hns3_tx_spare\n");
return; goto devm_kzalloc_error;
} }
page = alloc_pages_node(dev_to_node(ring_to_dev(ring)), page = alloc_pages_node(dev_to_node(ring_to_dev(ring)),
GFP_KERNEL, order); GFP_KERNEL, order);
if (!page) { if (!page) {
dev_warn(ring_to_dev(ring), "failed to allocate tx spare pages\n"); dev_warn(ring_to_dev(ring), "failed to allocate tx spare pages\n");
devm_kfree(ring_to_dev(ring), tx_spare); goto alloc_pages_error;
return;
} }
dma = dma_map_page(ring_to_dev(ring), page, 0, dma = dma_map_page(ring_to_dev(ring), page, 0,
PAGE_SIZE << order, DMA_TO_DEVICE); PAGE_SIZE << order, DMA_TO_DEVICE);
if (dma_mapping_error(ring_to_dev(ring), dma)) { if (dma_mapping_error(ring_to_dev(ring), dma)) {
dev_warn(ring_to_dev(ring), "failed to map pages for tx spare\n"); dev_warn(ring_to_dev(ring), "failed to map pages for tx spare\n");
put_page(page); goto dma_mapping_error;
devm_kfree(ring_to_dev(ring), tx_spare);
return;
} }
tx_spare->dma = dma; tx_spare->dma = dma;
tx_spare->buf = page_address(page); tx_spare->buf = page_address(page);
tx_spare->len = PAGE_SIZE << order; tx_spare->len = PAGE_SIZE << order;
ring->tx_spare = tx_spare; ring->tx_spare = tx_spare;
return;
dma_mapping_error:
put_page(page);
alloc_pages_error:
devm_kfree(ring_to_dev(ring), tx_spare);
devm_kzalloc_error:
ring->tqp->handle->kinfo.tx_spare_buf_size = 0;
} }
/* Use hns3_tx_spare_space() to make sure there is enough buffer /* Use hns3_tx_spare_space() to make sure there is enough buffer
......
...@@ -1818,7 +1818,8 @@ static int hns3_set_tunable(struct net_device *netdev, ...@@ -1818,7 +1818,8 @@ static int hns3_set_tunable(struct net_device *netdev,
old_tx_spare_buf_size = h->kinfo.tx_spare_buf_size; old_tx_spare_buf_size = h->kinfo.tx_spare_buf_size;
new_tx_spare_buf_size = *(u32 *)data; new_tx_spare_buf_size = *(u32 *)data;
ret = hns3_set_tx_spare_buf_size(netdev, new_tx_spare_buf_size); ret = hns3_set_tx_spare_buf_size(netdev, new_tx_spare_buf_size);
if (ret) { if (ret ||
(!priv->ring->tx_spare && new_tx_spare_buf_size != 0)) {
int ret1; int ret1;
netdev_warn(netdev, netdev_warn(netdev,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment