Commit 393ceeb9 authored by Paolo Abeni's avatar Paolo Abeni

Merge branch 'there-are-some-bugfix-for-the-hns3-ethernet-driver'

Jijie Shao says:

====================
There are some bugfix for the HNS3 ethernet driver
====================

Link: https://lore.kernel.org/r/20240507134224.2646246-1-shaojijie@huawei.comSigned-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parents 2ddc0dd7 35d92abf
...@@ -897,7 +897,7 @@ struct hnae3_handle { ...@@ -897,7 +897,7 @@ struct hnae3_handle {
struct hnae3_roce_private_info rinfo; struct hnae3_roce_private_info rinfo;
}; };
u32 numa_node_mask; /* for multi-chip support */ nodemask_t numa_node_mask; /* for multi-chip support */
enum hnae3_port_base_vlan_state port_base_vlan_state; enum hnae3_port_base_vlan_state port_base_vlan_state;
......
...@@ -1537,6 +1537,9 @@ static int hclge_configure(struct hclge_dev *hdev) ...@@ -1537,6 +1537,9 @@ static int hclge_configure(struct hclge_dev *hdev)
cfg.default_speed, ret); cfg.default_speed, ret);
return ret; return ret;
} }
hdev->hw.mac.req_speed = hdev->hw.mac.speed;
hdev->hw.mac.req_autoneg = AUTONEG_ENABLE;
hdev->hw.mac.req_duplex = DUPLEX_FULL;
hclge_parse_link_mode(hdev, cfg.speed_ability); hclge_parse_link_mode(hdev, cfg.speed_ability);
...@@ -1766,7 +1769,8 @@ static int hclge_vport_setup(struct hclge_vport *vport, u16 num_tqps) ...@@ -1766,7 +1769,8 @@ static int hclge_vport_setup(struct hclge_vport *vport, u16 num_tqps)
nic->pdev = hdev->pdev; nic->pdev = hdev->pdev;
nic->ae_algo = &ae_algo; nic->ae_algo = &ae_algo;
nic->numa_node_mask = hdev->numa_node_mask; bitmap_copy(nic->numa_node_mask.bits, hdev->numa_node_mask.bits,
MAX_NUMNODES);
nic->kinfo.io_base = hdev->hw.hw.io_base; nic->kinfo.io_base = hdev->hw.hw.io_base;
ret = hclge_knic_setup(vport, num_tqps, ret = hclge_knic_setup(vport, num_tqps,
...@@ -2458,7 +2462,8 @@ static int hclge_init_roce_base_info(struct hclge_vport *vport) ...@@ -2458,7 +2462,8 @@ static int hclge_init_roce_base_info(struct hclge_vport *vport)
roce->pdev = nic->pdev; roce->pdev = nic->pdev;
roce->ae_algo = nic->ae_algo; roce->ae_algo = nic->ae_algo;
roce->numa_node_mask = nic->numa_node_mask; bitmap_copy(roce->numa_node_mask.bits, nic->numa_node_mask.bits,
MAX_NUMNODES);
return 0; return 0;
} }
...@@ -3342,9 +3347,9 @@ hclge_set_phy_link_ksettings(struct hnae3_handle *handle, ...@@ -3342,9 +3347,9 @@ hclge_set_phy_link_ksettings(struct hnae3_handle *handle,
return ret; return ret;
} }
hdev->hw.mac.autoneg = cmd->base.autoneg; hdev->hw.mac.req_autoneg = cmd->base.autoneg;
hdev->hw.mac.speed = cmd->base.speed; hdev->hw.mac.req_speed = cmd->base.speed;
hdev->hw.mac.duplex = cmd->base.duplex; hdev->hw.mac.req_duplex = cmd->base.duplex;
linkmode_copy(hdev->hw.mac.advertising, cmd->link_modes.advertising); linkmode_copy(hdev->hw.mac.advertising, cmd->link_modes.advertising);
return 0; return 0;
...@@ -3377,9 +3382,9 @@ static int hclge_tp_port_init(struct hclge_dev *hdev) ...@@ -3377,9 +3382,9 @@ static int hclge_tp_port_init(struct hclge_dev *hdev)
if (!hnae3_dev_phy_imp_supported(hdev)) if (!hnae3_dev_phy_imp_supported(hdev))
return 0; return 0;
cmd.base.autoneg = hdev->hw.mac.autoneg; cmd.base.autoneg = hdev->hw.mac.req_autoneg;
cmd.base.speed = hdev->hw.mac.speed; cmd.base.speed = hdev->hw.mac.req_speed;
cmd.base.duplex = hdev->hw.mac.duplex; cmd.base.duplex = hdev->hw.mac.req_duplex;
linkmode_copy(cmd.link_modes.advertising, hdev->hw.mac.advertising); linkmode_copy(cmd.link_modes.advertising, hdev->hw.mac.advertising);
return hclge_set_phy_link_ksettings(&hdev->vport->nic, &cmd); return hclge_set_phy_link_ksettings(&hdev->vport->nic, &cmd);
...@@ -7952,8 +7957,7 @@ static void hclge_set_timer_task(struct hnae3_handle *handle, bool enable) ...@@ -7952,8 +7957,7 @@ static void hclge_set_timer_task(struct hnae3_handle *handle, bool enable)
/* Set the DOWN flag here to disable link updating */ /* Set the DOWN flag here to disable link updating */
set_bit(HCLGE_STATE_DOWN, &hdev->state); set_bit(HCLGE_STATE_DOWN, &hdev->state);
/* flush memory to make sure DOWN is seen by service task */ smp_mb__after_atomic(); /* flush memory to make sure DOWN is seen by service task */
smp_mb__before_atomic();
hclge_flush_link_update(hdev); hclge_flush_link_update(hdev);
} }
} }
...@@ -9906,6 +9910,7 @@ static int hclge_set_vlan_protocol_type(struct hclge_dev *hdev) ...@@ -9906,6 +9910,7 @@ static int hclge_set_vlan_protocol_type(struct hclge_dev *hdev)
static int hclge_init_vlan_filter(struct hclge_dev *hdev) static int hclge_init_vlan_filter(struct hclge_dev *hdev)
{ {
struct hclge_vport *vport; struct hclge_vport *vport;
bool enable = true;
int ret; int ret;
int i; int i;
...@@ -9925,8 +9930,12 @@ static int hclge_init_vlan_filter(struct hclge_dev *hdev) ...@@ -9925,8 +9930,12 @@ static int hclge_init_vlan_filter(struct hclge_dev *hdev)
vport->cur_vlan_fltr_en = true; vport->cur_vlan_fltr_en = true;
} }
if (test_bit(HNAE3_DEV_SUPPORT_VLAN_FLTR_MDF_B, hdev->ae_dev->caps) &&
!test_bit(HNAE3_DEV_SUPPORT_PORT_VLAN_BYPASS_B, hdev->ae_dev->caps))
enable = false;
return hclge_set_vlan_filter_ctrl(hdev, HCLGE_FILTER_TYPE_PORT, return hclge_set_vlan_filter_ctrl(hdev, HCLGE_FILTER_TYPE_PORT,
HCLGE_FILTER_FE_INGRESS, true, 0); HCLGE_FILTER_FE_INGRESS, enable, 0);
} }
static int hclge_init_vlan_type(struct hclge_dev *hdev) static int hclge_init_vlan_type(struct hclge_dev *hdev)
...@@ -11622,16 +11631,10 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev) ...@@ -11622,16 +11631,10 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
if (ret) if (ret)
goto out; goto out;
ret = hclge_devlink_init(hdev);
if (ret)
goto err_pci_uninit;
devl_lock(hdev->devlink);
/* Firmware command queue initialize */ /* Firmware command queue initialize */
ret = hclge_comm_cmd_queue_init(hdev->pdev, &hdev->hw.hw); ret = hclge_comm_cmd_queue_init(hdev->pdev, &hdev->hw.hw);
if (ret) if (ret)
goto err_devlink_uninit; goto err_pci_uninit;
/* Firmware command initialize */ /* Firmware command initialize */
ret = hclge_comm_cmd_init(hdev->ae_dev, &hdev->hw.hw, &hdev->fw_version, ret = hclge_comm_cmd_init(hdev->ae_dev, &hdev->hw.hw, &hdev->fw_version,
...@@ -11759,7 +11762,7 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev) ...@@ -11759,7 +11762,7 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
ret = hclge_update_port_info(hdev); ret = hclge_update_port_info(hdev);
if (ret) if (ret)
goto err_mdiobus_unreg; goto err_ptp_uninit;
INIT_KFIFO(hdev->mac_tnl_log); INIT_KFIFO(hdev->mac_tnl_log);
...@@ -11799,6 +11802,10 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev) ...@@ -11799,6 +11802,10 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
dev_warn(&pdev->dev, dev_warn(&pdev->dev,
"failed to wake on lan init, ret = %d\n", ret); "failed to wake on lan init, ret = %d\n", ret);
ret = hclge_devlink_init(hdev);
if (ret)
goto err_ptp_uninit;
hclge_state_init(hdev); hclge_state_init(hdev);
hdev->last_reset_time = jiffies; hdev->last_reset_time = jiffies;
...@@ -11806,10 +11813,10 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev) ...@@ -11806,10 +11813,10 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
HCLGE_DRIVER_NAME); HCLGE_DRIVER_NAME);
hclge_task_schedule(hdev, round_jiffies_relative(HZ)); hclge_task_schedule(hdev, round_jiffies_relative(HZ));
devl_unlock(hdev->devlink);
return 0; return 0;
err_ptp_uninit:
hclge_ptp_uninit(hdev);
err_mdiobus_unreg: err_mdiobus_unreg:
if (hdev->hw.mac.phydev) if (hdev->hw.mac.phydev)
mdiobus_unregister(hdev->hw.mac.mdio_bus); mdiobus_unregister(hdev->hw.mac.mdio_bus);
...@@ -11819,9 +11826,6 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev) ...@@ -11819,9 +11826,6 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
pci_free_irq_vectors(pdev); pci_free_irq_vectors(pdev);
err_cmd_uninit: err_cmd_uninit:
hclge_comm_cmd_uninit(hdev->ae_dev, &hdev->hw.hw); hclge_comm_cmd_uninit(hdev->ae_dev, &hdev->hw.hw);
err_devlink_uninit:
devl_unlock(hdev->devlink);
hclge_devlink_uninit(hdev);
err_pci_uninit: err_pci_uninit:
pcim_iounmap(pdev, hdev->hw.hw.io_base); pcim_iounmap(pdev, hdev->hw.hw.io_base);
pci_release_regions(pdev); pci_release_regions(pdev);
......
...@@ -279,11 +279,14 @@ struct hclge_mac { ...@@ -279,11 +279,14 @@ struct hclge_mac {
u8 media_type; /* port media type, e.g. fibre/copper/backplane */ u8 media_type; /* port media type, e.g. fibre/copper/backplane */
u8 mac_addr[ETH_ALEN]; u8 mac_addr[ETH_ALEN];
u8 autoneg; u8 autoneg;
u8 req_autoneg;
u8 duplex; u8 duplex;
u8 req_duplex;
u8 support_autoneg; u8 support_autoneg;
u8 speed_type; /* 0: sfp speed, 1: active speed */ u8 speed_type; /* 0: sfp speed, 1: active speed */
u8 lane_num; u8 lane_num;
u32 speed; u32 speed;
u32 req_speed;
u32 max_speed; u32 max_speed;
u32 speed_ability; /* speed ability supported by current media */ u32 speed_ability; /* speed ability supported by current media */
u32 module_type; /* sub media type, e.g. kr/cr/sr/lr */ u32 module_type; /* sub media type, e.g. kr/cr/sr/lr */
...@@ -891,7 +894,7 @@ struct hclge_dev { ...@@ -891,7 +894,7 @@ struct hclge_dev {
u16 fdir_pf_filter_count; /* Num of guaranteed filters for this PF */ u16 fdir_pf_filter_count; /* Num of guaranteed filters for this PF */
u16 num_alloc_vport; /* Num vports this driver supports */ u16 num_alloc_vport; /* Num vports this driver supports */
u32 numa_node_mask; nodemask_t numa_node_mask;
u16 rx_buf_len; u16 rx_buf_len;
u16 num_tx_desc; /* desc num of per tx queue */ u16 num_tx_desc; /* desc num of per tx queue */
u16 num_rx_desc; /* desc num of per rx queue */ u16 num_rx_desc; /* desc num of per rx queue */
......
...@@ -1077,12 +1077,13 @@ static void hclge_mbx_request_handling(struct hclge_mbx_ops_param *param) ...@@ -1077,12 +1077,13 @@ static void hclge_mbx_request_handling(struct hclge_mbx_ops_param *param)
hdev = param->vport->back; hdev = param->vport->back;
cmd_func = hclge_mbx_ops_list[param->req->msg.code]; cmd_func = hclge_mbx_ops_list[param->req->msg.code];
if (cmd_func) if (!cmd_func) {
ret = cmd_func(param);
else
dev_err(&hdev->pdev->dev, dev_err(&hdev->pdev->dev,
"un-supported mailbox message, code = %u\n", "un-supported mailbox message, code = %u\n",
param->req->msg.code); param->req->msg.code);
return;
}
ret = cmd_func(param);
/* PF driver should not reply IMP */ /* PF driver should not reply IMP */
if (hnae3_get_bit(param->req->mbx_need_resp, HCLGE_MBX_NEED_RESP_B) && if (hnae3_get_bit(param->req->mbx_need_resp, HCLGE_MBX_NEED_RESP_B) &&
......
...@@ -412,7 +412,8 @@ static int hclgevf_set_handle_info(struct hclgevf_dev *hdev) ...@@ -412,7 +412,8 @@ static int hclgevf_set_handle_info(struct hclgevf_dev *hdev)
nic->ae_algo = &ae_algovf; nic->ae_algo = &ae_algovf;
nic->pdev = hdev->pdev; nic->pdev = hdev->pdev;
nic->numa_node_mask = hdev->numa_node_mask; bitmap_copy(nic->numa_node_mask.bits, hdev->numa_node_mask.bits,
MAX_NUMNODES);
nic->flags |= HNAE3_SUPPORT_VF; nic->flags |= HNAE3_SUPPORT_VF;
nic->kinfo.io_base = hdev->hw.hw.io_base; nic->kinfo.io_base = hdev->hw.hw.io_base;
...@@ -2082,8 +2083,8 @@ static int hclgevf_init_roce_base_info(struct hclgevf_dev *hdev) ...@@ -2082,8 +2083,8 @@ static int hclgevf_init_roce_base_info(struct hclgevf_dev *hdev)
roce->pdev = nic->pdev; roce->pdev = nic->pdev;
roce->ae_algo = nic->ae_algo; roce->ae_algo = nic->ae_algo;
roce->numa_node_mask = nic->numa_node_mask; bitmap_copy(roce->numa_node_mask.bits, nic->numa_node_mask.bits,
MAX_NUMNODES);
return 0; return 0;
} }
...@@ -2180,8 +2181,7 @@ static void hclgevf_set_timer_task(struct hnae3_handle *handle, bool enable) ...@@ -2180,8 +2181,7 @@ static void hclgevf_set_timer_task(struct hnae3_handle *handle, bool enable)
} else { } else {
set_bit(HCLGEVF_STATE_DOWN, &hdev->state); set_bit(HCLGEVF_STATE_DOWN, &hdev->state);
/* flush memory to make sure DOWN is seen by service task */ smp_mb__after_atomic(); /* flush memory to make sure DOWN is seen by service task */
smp_mb__before_atomic();
hclgevf_flush_link_update(hdev); hclgevf_flush_link_update(hdev);
} }
} }
...@@ -2845,10 +2845,6 @@ static int hclgevf_init_hdev(struct hclgevf_dev *hdev) ...@@ -2845,10 +2845,6 @@ static int hclgevf_init_hdev(struct hclgevf_dev *hdev)
if (ret) if (ret)
return ret; return ret;
ret = hclgevf_devlink_init(hdev);
if (ret)
goto err_devlink_init;
ret = hclge_comm_cmd_queue_init(hdev->pdev, &hdev->hw.hw); ret = hclge_comm_cmd_queue_init(hdev->pdev, &hdev->hw.hw);
if (ret) if (ret)
goto err_cmd_queue_init; goto err_cmd_queue_init;
...@@ -2941,6 +2937,10 @@ static int hclgevf_init_hdev(struct hclgevf_dev *hdev) ...@@ -2941,6 +2937,10 @@ static int hclgevf_init_hdev(struct hclgevf_dev *hdev)
hclgevf_init_rxd_adv_layout(hdev); hclgevf_init_rxd_adv_layout(hdev);
ret = hclgevf_devlink_init(hdev);
if (ret)
goto err_config;
set_bit(HCLGEVF_STATE_SERVICE_INITED, &hdev->state); set_bit(HCLGEVF_STATE_SERVICE_INITED, &hdev->state);
hdev->last_reset_time = jiffies; hdev->last_reset_time = jiffies;
...@@ -2960,8 +2960,6 @@ static int hclgevf_init_hdev(struct hclgevf_dev *hdev) ...@@ -2960,8 +2960,6 @@ static int hclgevf_init_hdev(struct hclgevf_dev *hdev)
err_cmd_init: err_cmd_init:
hclge_comm_cmd_uninit(hdev->ae_dev, &hdev->hw.hw); hclge_comm_cmd_uninit(hdev->ae_dev, &hdev->hw.hw);
err_cmd_queue_init: err_cmd_queue_init:
hclgevf_devlink_uninit(hdev);
err_devlink_init:
hclgevf_pci_uninit(hdev); hclgevf_pci_uninit(hdev);
clear_bit(HCLGEVF_STATE_IRQ_INITED, &hdev->state); clear_bit(HCLGEVF_STATE_IRQ_INITED, &hdev->state);
return ret; return ret;
......
...@@ -236,7 +236,7 @@ struct hclgevf_dev { ...@@ -236,7 +236,7 @@ struct hclgevf_dev {
u16 rss_size_max; /* HW defined max RSS task queue */ u16 rss_size_max; /* HW defined max RSS task queue */
u16 num_alloc_vport; /* num vports this driver supports */ u16 num_alloc_vport; /* num vports this driver supports */
u32 numa_node_mask; nodemask_t numa_node_mask;
u16 rx_buf_len; u16 rx_buf_len;
u16 num_tx_desc; /* desc num of per tx queue */ u16 num_tx_desc; /* desc num of per tx queue */
u16 num_rx_desc; /* desc num of per rx queue */ u16 num_rx_desc; /* desc num of per rx queue */
......
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