diff --git a/drivers/net/ethernet/hisilicon/hns3/hns-customer/hns3_enet_it.c b/drivers/net/ethernet/hisilicon/hns3/hns-customer/hns3_enet_it.c index 4191eda0f932964fa3a19bc4ab9b1710c48eca5c..dbd527f10b23653c2d6476791cc50d8a83f0b755 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns-customer/hns3_enet_it.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns-customer/hns3_enet_it.c @@ -17,7 +17,7 @@ extern const char hns3_copyright[]; #ifdef CONFIG_IT_VALIDATION -#define HNAE_DRIVER_VERSION "1.8.15.1" +#define HNAE_DRIVER_VERSION "1.9.16.0" extern struct net_device_ops hns3_nic_netdev_ops; extern const struct hnae3_client_ops client_ops; diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_cae/hns3_nictool.c b/drivers/net/ethernet/hisilicon/hns3/hns3_cae/hns3_nictool.c index 166ae9e43b6ab855fee71e8533ffe0357a74d8c2..2111c6a92fa622fa8307a1f2c3ea4fdf9628d967 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3_cae/hns3_nictool.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3_cae/hns3_nictool.c @@ -60,7 +60,7 @@ #define HCLGE_OPC_DCQCN_TEMPLATE_CFG 0x7014 #define HCLGE_OPC_DCQCN_GET_MSG_CNT 0x7017 -#define HNAE_DRIVER_VERSION "1.8.15.2" +#define HNAE_DRIVER_VERSION "1.9.16.0" #define MAX_MSG_OUT_SIZE (1024U * 2048U) #define MAX_MSG_IN_SIZE (1024U * 2048U) diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_cae/hns3_priv_dcb.c b/drivers/net/ethernet/hisilicon/hns3/hns3_cae/hns3_priv_dcb.c index 6d964be04fad94dcfc92ece9eb1fe40955013505..066853a68e93bad64cb9683dc3021f6cad076c8e 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3_cae/hns3_priv_dcb.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3_cae/hns3_priv_dcb.c @@ -13,28 +13,26 @@ #include "hclge_tm.h" #include "hclge_cmd.h" #include "hns3_priv_dcb.h" +#define FUNKY_BUF_ERR -1 +#define MAX_DEV_LISTED 20 -struct nictool_dcb_info dcb_all_info[20]; -u8 curr_dev_index; -u8 max_index; +struct nictool_dcb_info dcb_all_info[MAX_DEV_LISTED]; -static void check_and_set_curr_dev(struct hns3_nic_priv *net_priv) +static int check_and_set_curr_dev(struct hns3_nic_priv *net_priv) { - int flag = false; int i; - for (i = 0; i < max_index; i++) { - if (dcb_all_info[i].net_priv != net_priv) - continue; - flag = true; - curr_dev_index = i; - } - - if (!flag) { - max_index++; - curr_dev_index = max_index - 1; - dcb_all_info[curr_dev_index].net_priv = net_priv; + for (i = 0; i < MAX_DEV_LISTED; i++) { + if (!dcb_all_info[i].net_priv) { + dcb_all_info[i].net_priv = net_priv; + break; + } else if (dcb_all_info[i].net_priv == net_priv) { + break; + } } + if (i == MAX_DEV_LISTED) + return FUNKY_BUF_ERR; + return i; } int hns3_test_dcb_cfg(struct hns3_nic_priv *net_priv, @@ -42,6 +40,7 @@ int hns3_test_dcb_cfg(struct hns3_nic_priv *net_priv, { struct nictool_dcb_cfg_param *out_info; struct nictool_dcb_cfg_param *in_info; + int curr_dev_idx; bool check; check = !buf_in || in_size < sizeof(struct nictool_dcb_cfg_param); @@ -52,7 +51,11 @@ int hns3_test_dcb_cfg(struct hns3_nic_priv *net_priv, in_info = (struct nictool_dcb_cfg_param *)buf_in; out_info = (struct nictool_dcb_cfg_param *)buf_out; - check_and_set_curr_dev(net_priv); + curr_dev_idx = check_and_set_curr_dev(net_priv); + if (curr_dev_idx < 0) { + pr_err("Exceed MAX_DEV_LISTED: %d\n", MAX_DEV_LISTED); + return -1; + } if (in_info->is_read) { check = !buf_out || out_size < sizeof(struct nictool_dcb_cfg_param); @@ -62,10 +65,10 @@ int hns3_test_dcb_cfg(struct hns3_nic_priv *net_priv, return -EFAULT; } out_info->dcb_en = - dcb_all_info[curr_dev_index].dcb_cfg_info.dcb_en; + dcb_all_info[curr_dev_idx].dcb_cfg_info.dcb_en; } else { if (in_info->cfg_flag & NICTOOL_DCB_DCB_CFG_FLAG) - dcb_all_info[curr_dev_index].dcb_cfg_info.dcb_en = + dcb_all_info[curr_dev_idx].dcb_cfg_info.dcb_en = in_info->dcb_en; } @@ -73,7 +76,7 @@ int hns3_test_dcb_cfg(struct hns3_nic_priv *net_priv, } static int hns3_test_cfg_pfc_en(u8 is_read, struct hclge_dev *hdev, - struct nictool_pfc_cfg_param *info) + struct nictool_pfc_cfg_param *info, int dev_idx) { struct hclge_desc desc; int ret; @@ -93,13 +96,13 @@ static int hns3_test_cfg_pfc_en(u8 is_read, struct hclge_dev *hdev, desc.data[0] = (desc.data[0] & (~0x3)) | (info->pfc_en << 0) | (info->pfc_en << 1); - dcb_all_info[curr_dev_index].pfc_cfg_info.pfc_en = + dcb_all_info[dev_idx].pfc_cfg_info.pfc_en = info->pfc_en; } if (info->cfg_flag & NICTOOL_PFC_PRIEN_CFG_FLAG) { desc.data[0] = (desc.data[0] & (~0xff00)) | (info->prien << 8); - dcb_all_info[curr_dev_index].pfc_cfg_info.prien = + dcb_all_info[dev_idx].pfc_cfg_info.prien = info->prien; } ret = hclge_cmd_send(&hdev->hw, &desc, 1); @@ -160,6 +163,7 @@ int hns3_test_dcb_pfc_cfg(struct hns3_nic_priv *net_priv, struct hclge_vport *vport; struct hnae3_handle *h; struct hclge_dev *hdev; + int curr_dev_idx; bool check; int ret; @@ -169,7 +173,11 @@ int hns3_test_dcb_pfc_cfg(struct hns3_nic_priv *net_priv, return -EFAULT; } - check_and_set_curr_dev(net_priv); + curr_dev_idx = check_and_set_curr_dev(net_priv); + if (curr_dev_idx < 0) { + pr_err("Exceed MAX_DEV_LISTED: %d\n", MAX_DEV_LISTED); + return -1; + } h = net_priv->ae_handle; vport = hclge_get_vport(h); ndev = h->netdev; @@ -178,7 +186,7 @@ int hns3_test_dcb_pfc_cfg(struct hns3_nic_priv *net_priv, out_info = (struct nictool_pfc_cfg_param *)buf_out; if (!in_info->is_read && - !dcb_all_info[curr_dev_index].dcb_cfg_info.dcb_en) { + !dcb_all_info[curr_dev_idx].dcb_cfg_info.dcb_en) { pr_err("please enable dcb cfg first!\n"); return -1; } @@ -196,7 +204,8 @@ int hns3_test_dcb_pfc_cfg(struct hns3_nic_priv *net_priv, __func__); return -EFAULT; } - ret = hns3_test_cfg_pfc_en(in_info->is_read, hdev, out_info); + ret = hns3_test_cfg_pfc_en(in_info->is_read, hdev, + out_info, curr_dev_idx); if (ret) return ret; ret = hns3_test_cfg_pause_param(hdev, out_info, true); @@ -207,7 +216,7 @@ int hns3_test_dcb_pfc_cfg(struct hns3_nic_priv *net_priv, if (in_info->cfg_flag & NICTOOL_PFC_PRIEN_CFG_FLAG) { pfc.pfc_en = in_info->prien; - dcb_all_info[curr_dev_index].pfc_cfg_info.prien = + dcb_all_info[curr_dev_idx].pfc_cfg_info.prien = in_info->prien; if (ndev->dcbnl_ops->ieee_setpfc) { rtnl_lock(); @@ -230,7 +239,7 @@ int hns3_test_dcb_pfc_cfg(struct hns3_nic_priv *net_priv, } static void hns3_test_disable_ets_cfg(struct hclge_dev *hdev, - struct ieee_ets *ets) + struct ieee_ets *ets, int dev_idx) { u8 percent = 0; int i; @@ -238,31 +247,32 @@ static void hns3_test_disable_ets_cfg(struct hclge_dev *hdev, for (i = 0; i < NICTOOL_ETS_MAC_TC_NUM; i++) { ets->prio_tc[i] = hdev->tm_info.prio_tc[i]; ets->tc_tsa[i] = IEEE_8021QAZ_TSA_ETS; - dcb_all_info[curr_dev_index].ets_cfg_info.schedule[i] = 0; + dcb_all_info[dev_idx].ets_cfg_info.schedule[i] = 0; } for (i = 0; i < hdev->tm_info.num_tc; i++) { ets->tc_tx_bw[i] = 100 / hdev->tm_info.num_tc; - dcb_all_info[curr_dev_index].ets_cfg_info.bw[i] = + dcb_all_info[dev_idx].ets_cfg_info.bw[i] = ets->tc_tx_bw[i]; percent += ets->tc_tx_bw[i]; } if (percent != 100) { ets->tc_tx_bw[i - 1] += (100 - percent); - dcb_all_info[curr_dev_index].ets_cfg_info.bw[i - 1] = + dcb_all_info[dev_idx].ets_cfg_info.bw[i - 1] = ets->tc_tx_bw[i - 1]; } } static void hns3_test_enable_ets_cfg(struct hclge_dev *hdev, struct ieee_ets *ets, - struct nictool_ets_cfg_param *info) + struct nictool_ets_cfg_param *info, + int dev_idx) { int i; if (info->cfg_flag & NICTOOL_ETS_UP2TC_CFG_FLAG) { for (i = 0; i < NICTOOL_ETS_MAC_TC_NUM; i++) { ets->prio_tc[i] = info->up2tc[i]; - dcb_all_info[curr_dev_index].ets_cfg_info.up2tc[i] = + dcb_all_info[dev_idx].ets_cfg_info.up2tc[i] = info->up2tc[i]; } } else { @@ -273,7 +283,7 @@ static void hns3_test_enable_ets_cfg(struct hclge_dev *hdev, if (info->cfg_flag & NICTOOL_ETS_BANDWIDTH_CFG_FLAG) { for (i = 0; i < NICTOOL_ETS_MAC_TC_NUM; i++) { ets->tc_tx_bw[i] = info->bw[i]; - dcb_all_info[curr_dev_index].ets_cfg_info.bw[i] = + dcb_all_info[dev_idx].ets_cfg_info.bw[i] = info->bw[i]; } } else { @@ -285,7 +295,7 @@ static void hns3_test_enable_ets_cfg(struct hclge_dev *hdev, for (i = 0; i < NICTOOL_ETS_MAC_TC_NUM; i++) { ets->tc_tsa[i] = info->schedule[i] ? IEEE_8021QAZ_TSA_STRICT : IEEE_8021QAZ_TSA_ETS; - dcb_all_info[curr_dev_index].ets_cfg_info.schedule[i] = + dcb_all_info[dev_idx].ets_cfg_info.schedule[i] = info->schedule[i]; } } else { @@ -306,6 +316,7 @@ int hns3_test_dcb_ets_cfg(struct hns3_nic_priv *net_priv, struct hclge_dev *hdev; struct hclge_desc desc; struct hnae3_handle *h; + int curr_dev_idx; bool check; int ret; int i; @@ -317,7 +328,11 @@ int hns3_test_dcb_ets_cfg(struct hns3_nic_priv *net_priv, return -EFAULT; } - check_and_set_curr_dev(net_priv); + curr_dev_idx = check_and_set_curr_dev(net_priv); + if (curr_dev_idx < 0) { + pr_err("Exceed MAX_DEV_LISTED: %d\n", MAX_DEV_LISTED); + return -1; + } h = net_priv->ae_handle; vport = hclge_get_vport(h); ndev = h->netdev; @@ -326,7 +341,7 @@ int hns3_test_dcb_ets_cfg(struct hns3_nic_priv *net_priv, out_info = (struct nictool_ets_cfg_param *)buf_out; if (!in_info->is_read && - !dcb_all_info[curr_dev_index].dcb_cfg_info.dcb_en) { + !dcb_all_info[curr_dev_idx].dcb_cfg_info.dcb_en) { pr_err("please enable dcb cfg first!\n"); return -1; } @@ -345,31 +360,32 @@ int hns3_test_dcb_ets_cfg(struct hns3_nic_priv *net_priv, return ret; } out_info->ets_en = - dcb_all_info[curr_dev_index].ets_cfg_info.ets_en; + dcb_all_info[curr_dev_idx].ets_cfg_info.ets_en; for (i = 0; i < NICTOOL_ETS_MAC_TC_NUM; i++) { out_info->up2tc[i] = (desc.data[0] & (0xf << (4 * i))) >> (4 * i); - dcb_all_info[curr_dev_index].ets_cfg_info.up2tc[i] = + dcb_all_info[curr_dev_idx].ets_cfg_info.up2tc[i] = out_info->up2tc[i]; out_info->bw[i] = hdev->tm_info.pg_info[0].tc_dwrr[i]; - dcb_all_info[curr_dev_index].ets_cfg_info.bw[i] = + dcb_all_info[curr_dev_idx].ets_cfg_info.bw[i] = hdev->tm_info.pg_info[0].tc_dwrr[i]; out_info->schedule[i] = !hdev->tm_info.tc_info[i].tc_sch_mode; - dcb_all_info[curr_dev_index].ets_cfg_info.schedule[i] = + dcb_all_info[curr_dev_idx].ets_cfg_info.schedule[i] = !hdev->tm_info.tc_info[i].tc_sch_mode; } } else { struct ieee_ets ets = {0}; if (in_info->cfg_flag & NICTOOL_ETS_EN_CFG_FLAG) - dcb_all_info[curr_dev_index].ets_cfg_info.ets_en = + dcb_all_info[curr_dev_idx].ets_cfg_info.ets_en = in_info->ets_en; - if (!dcb_all_info[curr_dev_index].ets_cfg_info.ets_en) - hns3_test_disable_ets_cfg(hdev, &ets); + if (!dcb_all_info[curr_dev_idx].ets_cfg_info.ets_en) + hns3_test_disable_ets_cfg(hdev, &ets, curr_dev_idx); else - hns3_test_enable_ets_cfg(hdev, &ets, in_info); + hns3_test_enable_ets_cfg(hdev, &ets, in_info, + curr_dev_idx); if (ndev->dcbnl_ops->ieee_setets) { rtnl_lock(); @@ -382,7 +398,7 @@ int hns3_test_dcb_ets_cfg(struct hns3_nic_priv *net_priv, out_info->cfg_flag = in_info->cfg_flag; out_info->is_read = in_info->is_read; out_info->ets_en = - dcb_all_info[curr_dev_index].ets_cfg_info.ets_en; + dcb_all_info[curr_dev_idx].ets_cfg_info.ets_en; } return 0;