Skip to content

Commit d80a309

Browse files
author
Paolo Abeni
committed
Merge branch 'there-are-some-bugfix-for-the-hns3-ethernet-driver'
Jijie Shao says: ==================== There are some bugfix for the HNS3 ethernet driver ChangeLog: v2 -> v3: - Rewrite the commit logs of net: hns3: add sync command to sync io-pgtable' to add more verbose explanation, suggested Paolo. - Add fixes tag for hardware issue, suggested Paolo and Simon Horman. v2: https://lore.kernel.org/all/[email protected]/ v1 -> v2: - Pass IRQF_NO_AUTOEN to request_irq(), suggested by Jakub. - Rewrite the commit logs of 'net: hns3: default enable tx bounce buffer when smmu enabled' and 'net: hns3: add sync command to sync io-pgtable'. v1: https://lore.kernel.org/all/[email protected]/ ==================== Link: https://patch.msgid.link/[email protected] Signed-off-by: Paolo Abeni <[email protected]>
2 parents 637f414 + 2cf2461 commit d80a309

File tree

9 files changed

+178
-26
lines changed

9 files changed

+178
-26
lines changed

drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1293,8 +1293,10 @@ static ssize_t hns3_dbg_read(struct file *filp, char __user *buffer,
12931293

12941294
/* save the buffer addr until the last read operation */
12951295
*save_buf = read_buf;
1296+
}
12961297

1297-
/* get data ready for the first time to read */
1298+
/* get data ready for the first time to read */
1299+
if (!*ppos) {
12981300
ret = hns3_dbg_read_cmd(dbg_data, hns3_dbg_cmd[index].cmd,
12991301
read_buf, hns3_dbg_cmd[index].buf_len);
13001302
if (ret)

drivers/net/ethernet/hisilicon/hns3/hns3_enet.c

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include <linux/irq.h>
1212
#include <linux/ip.h>
1313
#include <linux/ipv6.h>
14+
#include <linux/iommu.h>
1415
#include <linux/module.h>
1516
#include <linux/pci.h>
1617
#include <linux/skbuff.h>
@@ -380,6 +381,24 @@ static const struct hns3_rx_ptype hns3_rx_ptype_tbl[] = {
380381
#define HNS3_INVALID_PTYPE \
381382
ARRAY_SIZE(hns3_rx_ptype_tbl)
382383

384+
static void hns3_dma_map_sync(struct device *dev, unsigned long iova)
385+
{
386+
struct iommu_domain *domain = iommu_get_domain_for_dev(dev);
387+
struct iommu_iotlb_gather iotlb_gather;
388+
size_t granule;
389+
390+
if (!domain || !iommu_is_dma_domain(domain))
391+
return;
392+
393+
granule = 1 << __ffs(domain->pgsize_bitmap);
394+
iova = ALIGN_DOWN(iova, granule);
395+
iotlb_gather.start = iova;
396+
iotlb_gather.end = iova + granule - 1;
397+
iotlb_gather.pgsize = granule;
398+
399+
iommu_iotlb_sync(domain, &iotlb_gather);
400+
}
401+
383402
static irqreturn_t hns3_irq_handle(int irq, void *vector)
384403
{
385404
struct hns3_enet_tqp_vector *tqp_vector = vector;
@@ -1032,6 +1051,8 @@ static bool hns3_can_use_tx_sgl(struct hns3_enet_ring *ring,
10321051
static void hns3_init_tx_spare_buffer(struct hns3_enet_ring *ring)
10331052
{
10341053
u32 alloc_size = ring->tqp->handle->kinfo.tx_spare_buf_size;
1054+
struct net_device *netdev = ring_to_netdev(ring);
1055+
struct hns3_nic_priv *priv = netdev_priv(netdev);
10351056
struct hns3_tx_spare *tx_spare;
10361057
struct page *page;
10371058
dma_addr_t dma;
@@ -1073,6 +1094,7 @@ static void hns3_init_tx_spare_buffer(struct hns3_enet_ring *ring)
10731094
tx_spare->buf = page_address(page);
10741095
tx_spare->len = PAGE_SIZE << order;
10751096
ring->tx_spare = tx_spare;
1097+
ring->tx_copybreak = priv->tx_copybreak;
10761098
return;
10771099

10781100
dma_mapping_error:
@@ -1724,7 +1746,9 @@ static int hns3_map_and_fill_desc(struct hns3_enet_ring *ring, void *priv,
17241746
unsigned int type)
17251747
{
17261748
struct hns3_desc_cb *desc_cb = &ring->desc_cb[ring->next_to_use];
1749+
struct hnae3_handle *handle = ring->tqp->handle;
17271750
struct device *dev = ring_to_dev(ring);
1751+
struct hnae3_ae_dev *ae_dev;
17281752
unsigned int size;
17291753
dma_addr_t dma;
17301754

@@ -1756,6 +1780,13 @@ static int hns3_map_and_fill_desc(struct hns3_enet_ring *ring, void *priv,
17561780
return -ENOMEM;
17571781
}
17581782

1783+
/* Add a SYNC command to sync io-pgtale to avoid errors in pgtable
1784+
* prefetch
1785+
*/
1786+
ae_dev = hns3_get_ae_dev(handle);
1787+
if (ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V3)
1788+
hns3_dma_map_sync(dev, dma);
1789+
17591790
desc_cb->priv = priv;
17601791
desc_cb->length = size;
17611792
desc_cb->dma = dma;
@@ -2452,7 +2483,6 @@ static int hns3_nic_set_features(struct net_device *netdev,
24522483
return ret;
24532484
}
24542485

2455-
netdev->features = features;
24562486
return 0;
24572487
}
24582488

@@ -4868,6 +4898,30 @@ static void hns3_nic_dealloc_vector_data(struct hns3_nic_priv *priv)
48684898
devm_kfree(&pdev->dev, priv->tqp_vector);
48694899
}
48704900

4901+
static void hns3_update_tx_spare_buf_config(struct hns3_nic_priv *priv)
4902+
{
4903+
#define HNS3_MIN_SPARE_BUF_SIZE (2 * 1024 * 1024)
4904+
#define HNS3_MAX_PACKET_SIZE (64 * 1024)
4905+
4906+
struct iommu_domain *domain = iommu_get_domain_for_dev(priv->dev);
4907+
struct hnae3_ae_dev *ae_dev = hns3_get_ae_dev(priv->ae_handle);
4908+
struct hnae3_handle *handle = priv->ae_handle;
4909+
4910+
if (ae_dev->dev_version < HNAE3_DEVICE_VERSION_V3)
4911+
return;
4912+
4913+
if (!(domain && iommu_is_dma_domain(domain)))
4914+
return;
4915+
4916+
priv->min_tx_copybreak = HNS3_MAX_PACKET_SIZE;
4917+
priv->min_tx_spare_buf_size = HNS3_MIN_SPARE_BUF_SIZE;
4918+
4919+
if (priv->tx_copybreak < priv->min_tx_copybreak)
4920+
priv->tx_copybreak = priv->min_tx_copybreak;
4921+
if (handle->kinfo.tx_spare_buf_size < priv->min_tx_spare_buf_size)
4922+
handle->kinfo.tx_spare_buf_size = priv->min_tx_spare_buf_size;
4923+
}
4924+
48714925
static void hns3_ring_get_cfg(struct hnae3_queue *q, struct hns3_nic_priv *priv,
48724926
unsigned int ring_type)
48734927
{
@@ -5101,6 +5155,7 @@ int hns3_init_all_ring(struct hns3_nic_priv *priv)
51015155
int i, j;
51025156
int ret;
51035157

5158+
hns3_update_tx_spare_buf_config(priv);
51045159
for (i = 0; i < ring_num; i++) {
51055160
ret = hns3_alloc_ring_memory(&priv->ring[i]);
51065161
if (ret) {
@@ -5305,6 +5360,8 @@ static int hns3_client_init(struct hnae3_handle *handle)
53055360
priv->ae_handle = handle;
53065361
priv->tx_timeout_count = 0;
53075362
priv->max_non_tso_bd_num = ae_dev->dev_specs.max_non_tso_bd_num;
5363+
priv->min_tx_copybreak = 0;
5364+
priv->min_tx_spare_buf_size = 0;
53085365
set_bit(HNS3_NIC_STATE_DOWN, &priv->state);
53095366

53105367
handle->msg_enable = netif_msg_init(debug, DEFAULT_MSG_LEVEL);

drivers/net/ethernet/hisilicon/hns3/hns3_enet.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -596,6 +596,8 @@ struct hns3_nic_priv {
596596
struct hns3_enet_coalesce rx_coal;
597597
u32 tx_copybreak;
598598
u32 rx_copybreak;
599+
u32 min_tx_copybreak;
600+
u32 min_tx_spare_buf_size;
599601
};
600602

601603
union l3_hdr_info {

drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1933,6 +1933,31 @@ static int hns3_set_tx_spare_buf_size(struct net_device *netdev,
19331933
return ret;
19341934
}
19351935

1936+
static int hns3_check_tx_copybreak(struct net_device *netdev, u32 copybreak)
1937+
{
1938+
struct hns3_nic_priv *priv = netdev_priv(netdev);
1939+
1940+
if (copybreak < priv->min_tx_copybreak) {
1941+
netdev_err(netdev, "tx copybreak %u should be no less than %u!\n",
1942+
copybreak, priv->min_tx_copybreak);
1943+
return -EINVAL;
1944+
}
1945+
return 0;
1946+
}
1947+
1948+
static int hns3_check_tx_spare_buf_size(struct net_device *netdev, u32 buf_size)
1949+
{
1950+
struct hns3_nic_priv *priv = netdev_priv(netdev);
1951+
1952+
if (buf_size < priv->min_tx_spare_buf_size) {
1953+
netdev_err(netdev,
1954+
"tx spare buf size %u should be no less than %u!\n",
1955+
buf_size, priv->min_tx_spare_buf_size);
1956+
return -EINVAL;
1957+
}
1958+
return 0;
1959+
}
1960+
19361961
static int hns3_set_tunable(struct net_device *netdev,
19371962
const struct ethtool_tunable *tuna,
19381963
const void *data)
@@ -1949,6 +1974,10 @@ static int hns3_set_tunable(struct net_device *netdev,
19491974

19501975
switch (tuna->id) {
19511976
case ETHTOOL_TX_COPYBREAK:
1977+
ret = hns3_check_tx_copybreak(netdev, *(u32 *)data);
1978+
if (ret)
1979+
return ret;
1980+
19521981
priv->tx_copybreak = *(u32 *)data;
19531982

19541983
for (i = 0; i < h->kinfo.num_tqps; i++)
@@ -1963,6 +1992,10 @@ static int hns3_set_tunable(struct net_device *netdev,
19631992

19641993
break;
19651994
case ETHTOOL_TX_COPYBREAK_BUF_SIZE:
1995+
ret = hns3_check_tx_spare_buf_size(netdev, *(u32 *)data);
1996+
if (ret)
1997+
return ret;
1998+
19661999
old_tx_spare_buf_size = h->kinfo.tx_spare_buf_size;
19672000
new_tx_spare_buf_size = *(u32 *)data;
19682001
netdev_info(netdev, "request to set tx spare buf size from %u to %u\n",

drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c

Lines changed: 36 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include <linux/etherdevice.h>
77
#include <linux/init.h>
88
#include <linux/interrupt.h>
9+
#include <linux/irq.h>
910
#include <linux/kernel.h>
1011
#include <linux/module.h>
1112
#include <linux/netdevice.h>
@@ -3584,6 +3585,17 @@ static int hclge_set_vf_link_state(struct hnae3_handle *handle, int vf,
35843585
return ret;
35853586
}
35863587

3588+
static void hclge_set_reset_pending(struct hclge_dev *hdev,
3589+
enum hnae3_reset_type reset_type)
3590+
{
3591+
/* When an incorrect reset type is executed, the get_reset_level
3592+
* function generates the HNAE3_NONE_RESET flag. As a result, this
3593+
* type do not need to pending.
3594+
*/
3595+
if (reset_type != HNAE3_NONE_RESET)
3596+
set_bit(reset_type, &hdev->reset_pending);
3597+
}
3598+
35873599
static u32 hclge_check_event_cause(struct hclge_dev *hdev, u32 *clearval)
35883600
{
35893601
u32 cmdq_src_reg, msix_src_reg, hw_err_src_reg;
@@ -3604,7 +3616,7 @@ static u32 hclge_check_event_cause(struct hclge_dev *hdev, u32 *clearval)
36043616
*/
36053617
if (BIT(HCLGE_VECTOR0_IMPRESET_INT_B) & msix_src_reg) {
36063618
dev_info(&hdev->pdev->dev, "IMP reset interrupt\n");
3607-
set_bit(HNAE3_IMP_RESET, &hdev->reset_pending);
3619+
hclge_set_reset_pending(hdev, HNAE3_IMP_RESET);
36083620
set_bit(HCLGE_COMM_STATE_CMD_DISABLE, &hdev->hw.hw.comm_state);
36093621
*clearval = BIT(HCLGE_VECTOR0_IMPRESET_INT_B);
36103622
hdev->rst_stats.imp_rst_cnt++;
@@ -3614,7 +3626,7 @@ static u32 hclge_check_event_cause(struct hclge_dev *hdev, u32 *clearval)
36143626
if (BIT(HCLGE_VECTOR0_GLOBALRESET_INT_B) & msix_src_reg) {
36153627
dev_info(&hdev->pdev->dev, "global reset interrupt\n");
36163628
set_bit(HCLGE_COMM_STATE_CMD_DISABLE, &hdev->hw.hw.comm_state);
3617-
set_bit(HNAE3_GLOBAL_RESET, &hdev->reset_pending);
3629+
hclge_set_reset_pending(hdev, HNAE3_GLOBAL_RESET);
36183630
*clearval = BIT(HCLGE_VECTOR0_GLOBALRESET_INT_B);
36193631
hdev->rst_stats.global_rst_cnt++;
36203632
return HCLGE_VECTOR0_EVENT_RST;
@@ -3769,7 +3781,7 @@ static int hclge_misc_irq_init(struct hclge_dev *hdev)
37693781
snprintf(hdev->misc_vector.name, HNAE3_INT_NAME_LEN, "%s-misc-%s",
37703782
HCLGE_NAME, pci_name(hdev->pdev));
37713783
ret = request_irq(hdev->misc_vector.vector_irq, hclge_misc_irq_handle,
3772-
0, hdev->misc_vector.name, hdev);
3784+
IRQ_NOAUTOEN, hdev->misc_vector.name, hdev);
37733785
if (ret) {
37743786
hclge_free_vector(hdev, 0);
37753787
dev_err(&hdev->pdev->dev, "request misc irq(%d) fail\n",
@@ -4062,7 +4074,7 @@ static void hclge_do_reset(struct hclge_dev *hdev)
40624074
case HNAE3_FUNC_RESET:
40634075
dev_info(&pdev->dev, "PF reset requested\n");
40644076
/* schedule again to check later */
4065-
set_bit(HNAE3_FUNC_RESET, &hdev->reset_pending);
4077+
hclge_set_reset_pending(hdev, HNAE3_FUNC_RESET);
40664078
hclge_reset_task_schedule(hdev);
40674079
break;
40684080
default:
@@ -4096,6 +4108,8 @@ static enum hnae3_reset_type hclge_get_reset_level(struct hnae3_ae_dev *ae_dev,
40964108
clear_bit(HNAE3_FLR_RESET, addr);
40974109
}
40984110

4111+
clear_bit(HNAE3_NONE_RESET, addr);
4112+
40994113
if (hdev->reset_type != HNAE3_NONE_RESET &&
41004114
rst_level < hdev->reset_type)
41014115
return HNAE3_NONE_RESET;
@@ -4237,7 +4251,7 @@ static bool hclge_reset_err_handle(struct hclge_dev *hdev)
42374251
return false;
42384252
} else if (hdev->rst_stats.reset_fail_cnt < MAX_RESET_FAIL_CNT) {
42394253
hdev->rst_stats.reset_fail_cnt++;
4240-
set_bit(hdev->reset_type, &hdev->reset_pending);
4254+
hclge_set_reset_pending(hdev, hdev->reset_type);
42414255
dev_info(&hdev->pdev->dev,
42424256
"re-schedule reset task(%u)\n",
42434257
hdev->rst_stats.reset_fail_cnt);
@@ -4480,8 +4494,20 @@ static void hclge_reset_event(struct pci_dev *pdev, struct hnae3_handle *handle)
44804494
static void hclge_set_def_reset_request(struct hnae3_ae_dev *ae_dev,
44814495
enum hnae3_reset_type rst_type)
44824496
{
4497+
#define HCLGE_SUPPORT_RESET_TYPE \
4498+
(BIT(HNAE3_FLR_RESET) | BIT(HNAE3_FUNC_RESET) | \
4499+
BIT(HNAE3_GLOBAL_RESET) | BIT(HNAE3_IMP_RESET))
4500+
44834501
struct hclge_dev *hdev = ae_dev->priv;
44844502

4503+
if (!(BIT(rst_type) & HCLGE_SUPPORT_RESET_TYPE)) {
4504+
/* To prevent reset triggered by hclge_reset_event */
4505+
set_bit(HNAE3_NONE_RESET, &hdev->default_reset_request);
4506+
dev_warn(&hdev->pdev->dev, "unsupported reset type %d\n",
4507+
rst_type);
4508+
return;
4509+
}
4510+
44854511
set_bit(rst_type, &hdev->default_reset_request);
44864512
}
44874513

@@ -11891,9 +11917,6 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
1189111917

1189211918
hclge_init_rxd_adv_layout(hdev);
1189311919

11894-
/* Enable MISC vector(vector0) */
11895-
hclge_enable_vector(&hdev->misc_vector, true);
11896-
1189711920
ret = hclge_init_wol(hdev);
1189811921
if (ret)
1189911922
dev_warn(&pdev->dev,
@@ -11906,6 +11929,10 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
1190611929
hclge_state_init(hdev);
1190711930
hdev->last_reset_time = jiffies;
1190811931

11932+
/* Enable MISC vector(vector0) */
11933+
enable_irq(hdev->misc_vector.vector_irq);
11934+
hclge_enable_vector(&hdev->misc_vector, true);
11935+
1190911936
dev_info(&hdev->pdev->dev, "%s driver initialization finished.\n",
1191011937
HCLGE_DRIVER_NAME);
1191111938

@@ -12311,7 +12338,7 @@ static void hclge_uninit_ae_dev(struct hnae3_ae_dev *ae_dev)
1231112338

1231212339
/* Disable MISC vector(vector0) */
1231312340
hclge_enable_vector(&hdev->misc_vector, false);
12314-
synchronize_irq(hdev->misc_vector.vector_irq);
12341+
disable_irq(hdev->misc_vector.vector_irq);
1231512342

1231612343
/* Disable all hw interrupts */
1231712344
hclge_config_mac_tnl_int(hdev, false);

drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_ptp.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@ bool hclge_ptp_set_tx_info(struct hnae3_handle *handle, struct sk_buff *skb)
5858
struct hclge_dev *hdev = vport->back;
5959
struct hclge_ptp *ptp = hdev->ptp;
6060

61+
if (!ptp)
62+
return false;
63+
6164
if (!test_bit(HCLGE_PTP_FLAG_TX_EN, &ptp->flags) ||
6265
test_and_set_bit(HCLGE_STATE_PTP_TX_HANDLING, &hdev->state)) {
6366
ptp->tx_skipped++;

drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_regs.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -510,9 +510,9 @@ static int hclge_get_dfx_reg(struct hclge_dev *hdev, void *data)
510510
static int hclge_fetch_pf_reg(struct hclge_dev *hdev, void *data,
511511
struct hnae3_knic_private_info *kinfo)
512512
{
513-
#define HCLGE_RING_REG_OFFSET 0x200
514513
#define HCLGE_RING_INT_REG_OFFSET 0x4
515514

515+
struct hnae3_queue *tqp;
516516
int i, j, reg_num;
517517
int data_num_sum;
518518
u32 *reg = data;
@@ -533,10 +533,11 @@ static int hclge_fetch_pf_reg(struct hclge_dev *hdev, void *data,
533533
reg_num = ARRAY_SIZE(ring_reg_addr_list);
534534
for (j = 0; j < kinfo->num_tqps; j++) {
535535
reg += hclge_reg_get_tlv(HCLGE_REG_TAG_RING, reg_num, reg);
536+
tqp = kinfo->tqp[j];
536537
for (i = 0; i < reg_num; i++)
537-
*reg++ = hclge_read_dev(&hdev->hw,
538-
ring_reg_addr_list[i] +
539-
HCLGE_RING_REG_OFFSET * j);
538+
*reg++ = readl_relaxed(tqp->io_base -
539+
HCLGE_TQP_REG_OFFSET +
540+
ring_reg_addr_list[i]);
540541
}
541542
data_num_sum += (reg_num + HCLGE_REG_TLV_SPACE) * kinfo->num_tqps;
542543

0 commit comments

Comments
 (0)