Skip to content

Commit

Permalink
net/hns3: fix link status change from firmware
Browse files Browse the repository at this point in the history
[ upstream commit bac6a06 ]

When the hardware link status changes, the firmware proactively
reports the link status change message, and then driver update
link status. This feature is lack of a switch to control in PF
driver. Otherwise, this feature does not take effect when the
kernel PF driver that supports the feature is not loaded.

Fixes: 109e4dd ("net/hns3: get link state change through mailbox")

Signed-off-by: Huisong Li <lihuisong@huawei.com>
Signed-off-by: Lijun Ou <oulijun@huawei.com>
  • Loading branch information
LiHuiSong1 authored and bluca committed Feb 8, 2021
1 parent c278f28 commit 1c40552
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 0 deletions.
10 changes: 10 additions & 0 deletions drivers/net/hns3/hns3_cmd.h
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,9 @@ enum hns3_opcode_type {
/* Clear hardware state command */
HNS3_OPC_CLEAR_HW_STATE = 0x700B,

/* Firmware stats command */
HNS3_OPC_FIRMWARE_COMPAT_CFG = 0x701A,

/* SFP command */
HNS3_OPC_SFP_GET_SPEED = 0x7104,

Expand Down Expand Up @@ -632,6 +635,13 @@ enum hns3_promisc_type {
HNS3_BROADCAST = 3,
};

#define HNS3_LINK_EVENT_REPORT_EN_B 0
#define HNS3_NCSI_ERROR_REPORT_EN_B 1
struct hns3_firmware_compat_cmd {
uint32_t compat;
uint8_t rsv[20];
};

#define HNS3_MAC_TX_EN_B 6
#define HNS3_MAC_RX_EN_B 7
#define HNS3_MAC_PAD_TX_B 11
Expand Down
31 changes: 31 additions & 0 deletions drivers/net/hns3/hns3_ethdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -3893,6 +3893,26 @@ hns3_buffer_alloc(struct hns3_hw *hw)
return ret;
}

static int
hns3_firmware_compat_config(struct hns3_hw *hw, bool is_init)
{
struct hns3_firmware_compat_cmd *req;
struct hns3_cmd_desc desc;
uint32_t compat = 0;

hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_FIRMWARE_COMPAT_CFG, false);
req = (struct hns3_firmware_compat_cmd *)desc.data;

if (is_init) {
hns3_set_bit(compat, HNS3_LINK_EVENT_REPORT_EN_B, 1);
hns3_set_bit(compat, HNS3_NCSI_ERROR_REPORT_EN_B, 0);
}

req->compat = rte_cpu_to_le_32(compat);

return hns3_cmd_send(hw, &desc, 1);
}

static int
hns3_mac_init(struct hns3_hw *hw)
{
Expand Down Expand Up @@ -4542,6 +4562,15 @@ hns3_init_hardware(struct hns3_adapter *hns)
goto err_mac_init;
}

/*
* Requiring firmware to enable some features, driver can
* still work without it.
*/
ret = hns3_firmware_compat_config(hw, true);
if (ret)
PMD_INIT_LOG(WARNING, "firmware compatible features not "
"supported, ret = %d.", ret);

return 0;

err_mac_init:
Expand Down Expand Up @@ -4676,6 +4705,7 @@ hns3_init_pf(struct rte_eth_dev *eth_dev)
err_enable_intr:
hns3_fdir_filter_uninit(hns);
err_fdir:
(void)hns3_firmware_compat_config(hw, false);
hns3_uninit_umv_space(hw);
err_init_hw:
hns3_tqp_stats_uninit(hw);
Expand Down Expand Up @@ -4709,6 +4739,7 @@ hns3_uninit_pf(struct rte_eth_dev *eth_dev)
(void)hns3_config_gro(hw, false);
hns3_promisc_uninit(hw);
hns3_fdir_filter_uninit(hns);
(void)hns3_firmware_compat_config(hw, false);
hns3_uninit_umv_space(hw);
hns3_tqp_stats_uninit(hw);
hns3_pf_disable_irq0(hw);
Expand Down

0 comments on commit 1c40552

Please sign in to comment.