Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'hns3-fixes'

Guangbin Huang says:

====================
net: hns3: add some fixes for -net

This series adds some fixes for the HNS3 ethernet driver.
====================

Signed-off-by: David S. Miller <davem@davemloft.net>

+90 -65
+1
drivers/net/ethernet/hisilicon/hns3/hnae3.h
··· 568 568 u32 *auto_neg, u32 *rx_en, u32 *tx_en); 569 569 int (*set_pauseparam)(struct hnae3_handle *handle, 570 570 u32 auto_neg, u32 rx_en, u32 tx_en); 571 + int (*restore_pauseparam)(struct hnae3_handle *handle); 571 572 572 573 int (*set_autoneg)(struct hnae3_handle *handle, bool enable); 573 574 int (*get_autoneg)(struct hnae3_handle *handle);
+8 -8
drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c
··· 137 137 .name = "uc", 138 138 .cmd = HNAE3_DBG_CMD_MAC_UC, 139 139 .dentry = HNS3_DBG_DENTRY_MAC, 140 - .buf_len = HNS3_DBG_READ_LEN, 140 + .buf_len = HNS3_DBG_READ_LEN_128KB, 141 141 .init = hns3_dbg_common_file_init, 142 142 }, 143 143 { ··· 256 256 .name = "tqp", 257 257 .cmd = HNAE3_DBG_CMD_REG_TQP, 258 258 .dentry = HNS3_DBG_DENTRY_REG, 259 - .buf_len = HNS3_DBG_READ_LEN, 259 + .buf_len = HNS3_DBG_READ_LEN_128KB, 260 260 .init = hns3_dbg_common_file_init, 261 261 }, 262 262 { ··· 298 298 .name = "fd_tcam", 299 299 .cmd = HNAE3_DBG_CMD_FD_TCAM, 300 300 .dentry = HNS3_DBG_DENTRY_FD, 301 - .buf_len = HNS3_DBG_READ_LEN, 301 + .buf_len = HNS3_DBG_READ_LEN_1MB, 302 302 .init = hns3_dbg_common_file_init, 303 303 }, 304 304 { ··· 462 462 { "TAIL", 2 }, 463 463 { "HEAD", 2 }, 464 464 { "FBDNUM", 2 }, 465 - { "PKTNUM", 2 }, 465 + { "PKTNUM", 5 }, 466 466 { "COPYBREAK", 2 }, 467 467 { "RING_EN", 2 }, 468 468 { "RX_RING_EN", 2 }, ··· 565 565 { "HEAD", 2 }, 566 566 { "FBDNUM", 2 }, 567 567 { "OFFSET", 2 }, 568 - { "PKTNUM", 2 }, 568 + { "PKTNUM", 5 }, 569 569 { "RING_EN", 2 }, 570 570 { "TX_RING_EN", 2 }, 571 571 { "BASE_ADDR", 10 }, ··· 790 790 } 791 791 792 792 static const struct hns3_dbg_item tx_bd_info_items[] = { 793 - { "BD_IDX", 5 }, 794 - { "ADDRESS", 2 }, 793 + { "BD_IDX", 2 }, 794 + { "ADDRESS", 13 }, 795 795 { "VLAN_TAG", 2 }, 796 796 { "SIZE", 2 }, 797 797 { "T_CS_VLAN_TSO", 2 }, 798 798 { "OT_VLAN_TAG", 3 }, 799 - { "TV", 2 }, 799 + { "TV", 5 }, 800 800 { "OLT_VLAN_LEN", 2 }, 801 801 { "PAYLEN_OL4CS", 2 }, 802 802 { "BD_FE_SC_VLD", 2 },
+24 -9
drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
··· 824 824 return 0; 825 825 } 826 826 827 + static int hns3_set_phy_link_ksettings(struct net_device *netdev, 828 + const struct ethtool_link_ksettings *cmd) 829 + { 830 + struct hnae3_handle *handle = hns3_get_handle(netdev); 831 + const struct hnae3_ae_ops *ops = handle->ae_algo->ops; 832 + int ret; 833 + 834 + if (cmd->base.speed == SPEED_1000 && 835 + cmd->base.autoneg == AUTONEG_DISABLE) 836 + return -EINVAL; 837 + 838 + if (cmd->base.autoneg == AUTONEG_DISABLE && ops->restore_pauseparam) { 839 + ret = ops->restore_pauseparam(handle); 840 + if (ret) 841 + return ret; 842 + } 843 + 844 + return phy_ethtool_ksettings_set(netdev->phydev, cmd); 845 + } 846 + 827 847 static int hns3_set_link_ksettings(struct net_device *netdev, 828 848 const struct ethtool_link_ksettings *cmd) 829 849 { ··· 862 842 cmd->base.autoneg, cmd->base.speed, cmd->base.duplex); 863 843 864 844 /* Only support ksettings_set for netdev with phy attached for now */ 865 - if (netdev->phydev) { 866 - if (cmd->base.speed == SPEED_1000 && 867 - cmd->base.autoneg == AUTONEG_DISABLE) 868 - return -EINVAL; 869 - 870 - return phy_ethtool_ksettings_set(netdev->phydev, cmd); 871 - } else if (test_bit(HNAE3_DEV_SUPPORT_PHY_IMP_B, ae_dev->caps) && 872 - ops->set_phy_link_ksettings) { 845 + if (netdev->phydev) 846 + return hns3_set_phy_link_ksettings(netdev, cmd); 847 + else if (test_bit(HNAE3_DEV_SUPPORT_PHY_IMP_B, ae_dev->caps) && 848 + ops->set_phy_link_ksettings) 873 849 return ops->set_phy_link_ksettings(handle, cmd); 874 - } 875 850 876 851 if (ae_dev->dev_version < HNAE3_DEVICE_VERSION_V2) 877 852 return -EOPNOTSUPP;
+14 -16
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_debugfs.c
··· 391 391 static int hclge_dbg_dump_dcb_qset(struct hclge_dev *hdev, char *buf, int len, 392 392 int *pos) 393 393 { 394 - struct hclge_dbg_bitmap_cmd *bitmap; 394 + struct hclge_dbg_bitmap_cmd req; 395 395 struct hclge_desc desc; 396 396 u16 qset_id, qset_num; 397 397 int ret; ··· 408 408 if (ret) 409 409 return ret; 410 410 411 - bitmap = (struct hclge_dbg_bitmap_cmd *)&desc.data[1]; 411 + req.bitmap = (u8)le32_to_cpu(desc.data[1]); 412 412 413 413 *pos += scnprintf(buf + *pos, len - *pos, 414 414 "%04u %#x %#x %#x %#x\n", 415 - qset_id, bitmap->bit0, bitmap->bit1, 416 - bitmap->bit2, bitmap->bit3); 415 + qset_id, req.bit0, req.bit1, req.bit2, 416 + req.bit3); 417 417 } 418 418 419 419 return 0; ··· 422 422 static int hclge_dbg_dump_dcb_pri(struct hclge_dev *hdev, char *buf, int len, 423 423 int *pos) 424 424 { 425 - struct hclge_dbg_bitmap_cmd *bitmap; 425 + struct hclge_dbg_bitmap_cmd req; 426 426 struct hclge_desc desc; 427 427 u8 pri_id, pri_num; 428 428 int ret; ··· 439 439 if (ret) 440 440 return ret; 441 441 442 - bitmap = (struct hclge_dbg_bitmap_cmd *)&desc.data[1]; 442 + req.bitmap = (u8)le32_to_cpu(desc.data[1]); 443 443 444 444 *pos += scnprintf(buf + *pos, len - *pos, 445 445 "%03u %#x %#x %#x\n", 446 - pri_id, bitmap->bit0, bitmap->bit1, 447 - bitmap->bit2); 446 + pri_id, req.bit0, req.bit1, req.bit2); 448 447 } 449 448 450 449 return 0; ··· 452 453 static int hclge_dbg_dump_dcb_pg(struct hclge_dev *hdev, char *buf, int len, 453 454 int *pos) 454 455 { 455 - struct hclge_dbg_bitmap_cmd *bitmap; 456 + struct hclge_dbg_bitmap_cmd req; 456 457 struct hclge_desc desc; 457 458 u8 pg_id; 458 459 int ret; ··· 465 466 if (ret) 466 467 return ret; 467 468 468 - bitmap = (struct hclge_dbg_bitmap_cmd *)&desc.data[1]; 469 + req.bitmap = (u8)le32_to_cpu(desc.data[1]); 469 470 470 471 *pos += scnprintf(buf + *pos, len - *pos, 471 472 "%03u %#x %#x %#x\n", 472 - pg_id, bitmap->bit0, bitmap->bit1, 473 - bitmap->bit2); 473 + pg_id, req.bit0, req.bit1, req.bit2); 474 474 } 475 475 476 476 return 0; ··· 509 511 static int hclge_dbg_dump_dcb_port(struct hclge_dev *hdev, char *buf, int len, 510 512 int *pos) 511 513 { 512 - struct hclge_dbg_bitmap_cmd *bitmap; 514 + struct hclge_dbg_bitmap_cmd req; 513 515 struct hclge_desc desc; 514 516 u8 port_id = 0; 515 517 int ret; ··· 519 521 if (ret) 520 522 return ret; 521 523 522 - bitmap = (struct hclge_dbg_bitmap_cmd *)&desc.data[1]; 524 + req.bitmap = (u8)le32_to_cpu(desc.data[1]); 523 525 524 526 *pos += scnprintf(buf + *pos, len - *pos, "port_mask: %#x\n", 525 - bitmap->bit0); 527 + req.bit0); 526 528 *pos += scnprintf(buf + *pos, len - *pos, "port_shaping_pass: %#x\n", 527 - bitmap->bit1); 529 + req.bit1); 528 530 529 531 return 0; 530 532 }
+36 -29
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
··· 2847 2847 { 2848 2848 if (!test_bit(HCLGE_STATE_REMOVING, &hdev->state) && 2849 2849 !test_and_set_bit(HCLGE_STATE_MBX_SERVICE_SCHED, &hdev->state)) 2850 - mod_delayed_work_on(cpumask_first(&hdev->affinity_mask), 2851 - hclge_wq, &hdev->service_task, 0); 2850 + mod_delayed_work(hclge_wq, &hdev->service_task, 0); 2852 2851 } 2853 2852 2854 2853 static void hclge_reset_task_schedule(struct hclge_dev *hdev) 2855 2854 { 2856 2855 if (!test_bit(HCLGE_STATE_REMOVING, &hdev->state) && 2856 + test_bit(HCLGE_STATE_SERVICE_INITED, &hdev->state) && 2857 2857 !test_and_set_bit(HCLGE_STATE_RST_SERVICE_SCHED, &hdev->state)) 2858 - mod_delayed_work_on(cpumask_first(&hdev->affinity_mask), 2859 - hclge_wq, &hdev->service_task, 0); 2858 + mod_delayed_work(hclge_wq, &hdev->service_task, 0); 2860 2859 } 2861 2860 2862 2861 static void hclge_errhand_task_schedule(struct hclge_dev *hdev) 2863 2862 { 2864 2863 if (!test_bit(HCLGE_STATE_REMOVING, &hdev->state) && 2865 2864 !test_and_set_bit(HCLGE_STATE_ERR_SERVICE_SCHED, &hdev->state)) 2866 - mod_delayed_work_on(cpumask_first(&hdev->affinity_mask), 2867 - hclge_wq, &hdev->service_task, 0); 2865 + mod_delayed_work(hclge_wq, &hdev->service_task, 0); 2868 2866 } 2869 2867 2870 2868 void hclge_task_schedule(struct hclge_dev *hdev, unsigned long delay_time) 2871 2869 { 2872 2870 if (!test_bit(HCLGE_STATE_REMOVING, &hdev->state) && 2873 2871 !test_bit(HCLGE_STATE_RST_FAIL, &hdev->state)) 2874 - mod_delayed_work_on(cpumask_first(&hdev->affinity_mask), 2875 - hclge_wq, &hdev->service_task, 2876 - delay_time); 2872 + mod_delayed_work(hclge_wq, &hdev->service_task, delay_time); 2877 2873 } 2878 2874 2879 2875 static int hclge_get_mac_link_status(struct hclge_dev *hdev, int *link_status) ··· 3487 3491 hdev->num_msi_used += 1; 3488 3492 } 3489 3493 3490 - static void hclge_irq_affinity_notify(struct irq_affinity_notify *notify, 3491 - const cpumask_t *mask) 3492 - { 3493 - struct hclge_dev *hdev = container_of(notify, struct hclge_dev, 3494 - affinity_notify); 3495 - 3496 - cpumask_copy(&hdev->affinity_mask, mask); 3497 - } 3498 - 3499 - static void hclge_irq_affinity_release(struct kref *ref) 3500 - { 3501 - } 3502 - 3503 3494 static void hclge_misc_affinity_setup(struct hclge_dev *hdev) 3504 3495 { 3505 3496 irq_set_affinity_hint(hdev->misc_vector.vector_irq, 3506 3497 &hdev->affinity_mask); 3507 - 3508 - hdev->affinity_notify.notify = hclge_irq_affinity_notify; 3509 - hdev->affinity_notify.release = hclge_irq_affinity_release; 3510 - irq_set_affinity_notifier(hdev->misc_vector.vector_irq, 3511 - &hdev->affinity_notify); 3512 3498 } 3513 3499 3514 3500 static void hclge_misc_affinity_teardown(struct hclge_dev *hdev) 3515 3501 { 3516 - irq_set_affinity_notifier(hdev->misc_vector.vector_irq, NULL); 3517 3502 irq_set_affinity_hint(hdev->misc_vector.vector_irq, NULL); 3518 3503 } 3519 3504 ··· 10998 11021 return -EOPNOTSUPP; 10999 11022 } 11000 11023 11024 + static int hclge_restore_pauseparam(struct hnae3_handle *handle) 11025 + { 11026 + struct hclge_vport *vport = hclge_get_vport(handle); 11027 + struct hclge_dev *hdev = vport->back; 11028 + u32 auto_neg, rx_pause, tx_pause; 11029 + int ret; 11030 + 11031 + hclge_get_pauseparam(handle, &auto_neg, &rx_pause, &tx_pause); 11032 + /* when autoneg is disabled, the pause setting of phy has no effect 11033 + * unless the link goes down. 11034 + */ 11035 + ret = phy_suspend(hdev->hw.mac.phydev); 11036 + if (ret) 11037 + return ret; 11038 + 11039 + phy_set_asym_pause(hdev->hw.mac.phydev, rx_pause, tx_pause); 11040 + 11041 + ret = phy_resume(hdev->hw.mac.phydev); 11042 + if (ret) 11043 + return ret; 11044 + 11045 + ret = hclge_mac_pause_setup_hw(hdev); 11046 + if (ret) 11047 + dev_err(&hdev->pdev->dev, 11048 + "restore pauseparam error, ret = %d.\n", ret); 11049 + 11050 + return ret; 11051 + } 11052 + 11001 11053 static void hclge_get_ksettings_an_result(struct hnae3_handle *handle, 11002 11054 u8 *auto_neg, u32 *speed, u8 *duplex) 11003 11055 { ··· 12990 12984 .halt_autoneg = hclge_halt_autoneg, 12991 12985 .get_pauseparam = hclge_get_pauseparam, 12992 12986 .set_pauseparam = hclge_set_pauseparam, 12987 + .restore_pauseparam = hclge_restore_pauseparam, 12993 12988 .set_mtu = hclge_set_mtu, 12994 12989 .reset_queue = hclge_reset_tqp, 12995 12990 .get_stats = hclge_get_stats, ··· 13059 13052 { 13060 13053 pr_info("%s is initializing\n", HCLGE_NAME); 13061 13054 13062 - hclge_wq = alloc_workqueue("%s", 0, 0, HCLGE_NAME); 13055 + hclge_wq = alloc_workqueue("%s", WQ_UNBOUND, 0, HCLGE_NAME); 13063 13056 if (!hclge_wq) { 13064 13057 pr_err("%s: failed to create workqueue\n", HCLGE_NAME); 13065 13058 return -ENOMEM;
-1
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
··· 944 944 945 945 /* affinity mask and notify for misc interrupt */ 946 946 cpumask_t affinity_mask; 947 - struct irq_affinity_notify affinity_notify; 948 947 struct hclge_ptp *ptp; 949 948 struct devlink *devlink; 950 949 };
+1 -1
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c
··· 1435 1435 return 0; 1436 1436 } 1437 1437 1438 - static int hclge_mac_pause_setup_hw(struct hclge_dev *hdev) 1438 + int hclge_mac_pause_setup_hw(struct hclge_dev *hdev) 1439 1439 { 1440 1440 bool tx_en, rx_en; 1441 1441
+1
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.h
··· 244 244 int hclge_tm_get_pri_shaper(struct hclge_dev *hdev, u8 pri_id, 245 245 enum hclge_opcode_type cmd, 246 246 struct hclge_tm_shaper_para *para); 247 + int hclge_mac_pause_setup_hw(struct hclge_dev *hdev); 247 248 int hclge_tm_get_q_to_qs_map(struct hclge_dev *hdev, u16 q_id, u16 *qset_id); 248 249 int hclge_tm_get_q_to_tc(struct hclge_dev *hdev, u16 q_id, u8 *tc_id); 249 250 int hclge_tm_get_pg_to_pri_map(struct hclge_dev *hdev, u8 pg_id,
+4 -1
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
··· 2232 2232 void hclgevf_reset_task_schedule(struct hclgevf_dev *hdev) 2233 2233 { 2234 2234 if (!test_bit(HCLGEVF_STATE_REMOVING, &hdev->state) && 2235 + test_bit(HCLGEVF_STATE_SERVICE_INITED, &hdev->state) && 2235 2236 !test_and_set_bit(HCLGEVF_STATE_RST_SERVICE_SCHED, 2236 2237 &hdev->state)) 2237 2238 mod_delayed_work(hclgevf_wq, &hdev->service_task, 0); ··· 3450 3449 3451 3450 hclgevf_init_rxd_adv_layout(hdev); 3452 3451 3452 + set_bit(HCLGEVF_STATE_SERVICE_INITED, &hdev->state); 3453 + 3453 3454 hdev->last_reset_time = jiffies; 3454 3455 dev_info(&hdev->pdev->dev, "finished initializing %s driver\n", 3455 3456 HCLGEVF_DRIVER_NAME); ··· 3902 3899 { 3903 3900 pr_info("%s is initializing\n", HCLGEVF_NAME); 3904 3901 3905 - hclgevf_wq = alloc_workqueue("%s", 0, 0, HCLGEVF_NAME); 3902 + hclgevf_wq = alloc_workqueue("%s", WQ_UNBOUND, 0, HCLGEVF_NAME); 3906 3903 if (!hclgevf_wq) { 3907 3904 pr_err("%s: failed to create workqueue\n", HCLGEVF_NAME); 3908 3905 return -ENOMEM;
+1
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.h
··· 146 146 HCLGEVF_STATE_REMOVING, 147 147 HCLGEVF_STATE_NIC_REGISTERED, 148 148 HCLGEVF_STATE_ROCE_REGISTERED, 149 + HCLGEVF_STATE_SERVICE_INITED, 149 150 /* task states */ 150 151 HCLGEVF_STATE_RST_SERVICE_SCHED, 151 152 HCLGEVF_STATE_RST_HANDLING,