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>
This commit is contained in:
commit
36747c96ed
|
@ -2445,12 +2445,12 @@ static void hclge_handle_over_8bd_err(struct hclge_dev *hdev,
|
|||
return;
|
||||
}
|
||||
|
||||
dev_err(dev, "PPU_PF_ABNORMAL_INT_ST over_8bd_no_fe found, vf_id(%u), queue_id(%u)\n",
|
||||
dev_err(dev, "PPU_PF_ABNORMAL_INT_ST over_8bd_no_fe found, vport(%u), queue_id(%u)\n",
|
||||
vf_id, q_id);
|
||||
|
||||
if (vf_id) {
|
||||
if (vf_id >= hdev->num_alloc_vport) {
|
||||
dev_err(dev, "invalid vf id(%u)\n", vf_id);
|
||||
dev_err(dev, "invalid vport(%u)\n", vf_id);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -2463,8 +2463,8 @@ static void hclge_handle_over_8bd_err(struct hclge_dev *hdev,
|
|||
|
||||
ret = hclge_inform_reset_assert_to_vf(&hdev->vport[vf_id]);
|
||||
if (ret)
|
||||
dev_err(dev, "inform reset to vf(%u) failed %d!\n",
|
||||
hdev->vport->vport_id, ret);
|
||||
dev_err(dev, "inform reset to vport(%u) failed %d!\n",
|
||||
vf_id, ret);
|
||||
} else {
|
||||
set_bit(HNAE3_FUNC_RESET, reset_requests);
|
||||
}
|
||||
|
|
|
@ -3661,7 +3661,8 @@ static int hclge_set_all_vf_rst(struct hclge_dev *hdev, bool reset)
|
|||
if (ret) {
|
||||
dev_err(&hdev->pdev->dev,
|
||||
"set vf(%u) rst failed %d!\n",
|
||||
vport->vport_id, ret);
|
||||
vport->vport_id - HCLGE_VF_VPORT_START_NUM,
|
||||
ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -3676,7 +3677,8 @@ static int hclge_set_all_vf_rst(struct hclge_dev *hdev, bool reset)
|
|||
if (ret)
|
||||
dev_warn(&hdev->pdev->dev,
|
||||
"inform reset to vf(%u) failed %d!\n",
|
||||
vport->vport_id, ret);
|
||||
vport->vport_id - HCLGE_VF_VPORT_START_NUM,
|
||||
ret);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -4741,6 +4743,24 @@ static int hclge_get_rss(struct hnae3_handle *handle, u32 *indir,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int hclge_parse_rss_hfunc(struct hclge_vport *vport, const u8 hfunc,
|
||||
u8 *hash_algo)
|
||||
{
|
||||
switch (hfunc) {
|
||||
case ETH_RSS_HASH_TOP:
|
||||
*hash_algo = HCLGE_RSS_HASH_ALGO_TOEPLITZ;
|
||||
return 0;
|
||||
case ETH_RSS_HASH_XOR:
|
||||
*hash_algo = HCLGE_RSS_HASH_ALGO_SIMPLE;
|
||||
return 0;
|
||||
case ETH_RSS_HASH_NO_CHANGE:
|
||||
*hash_algo = vport->rss_algo;
|
||||
return 0;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
static int hclge_set_rss(struct hnae3_handle *handle, const u32 *indir,
|
||||
const u8 *key, const u8 hfunc)
|
||||
{
|
||||
|
@ -4750,30 +4770,27 @@ static int hclge_set_rss(struct hnae3_handle *handle, const u32 *indir,
|
|||
u8 hash_algo;
|
||||
int ret, i;
|
||||
|
||||
ret = hclge_parse_rss_hfunc(vport, hfunc, &hash_algo);
|
||||
if (ret) {
|
||||
dev_err(&hdev->pdev->dev, "invalid hfunc type %u\n", hfunc);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Set the RSS Hash Key if specififed by the user */
|
||||
if (key) {
|
||||
switch (hfunc) {
|
||||
case ETH_RSS_HASH_TOP:
|
||||
hash_algo = HCLGE_RSS_HASH_ALGO_TOEPLITZ;
|
||||
break;
|
||||
case ETH_RSS_HASH_XOR:
|
||||
hash_algo = HCLGE_RSS_HASH_ALGO_SIMPLE;
|
||||
break;
|
||||
case ETH_RSS_HASH_NO_CHANGE:
|
||||
hash_algo = vport->rss_algo;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ret = hclge_set_rss_algo_key(hdev, hash_algo, key);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Update the shadow RSS key with user specified qids */
|
||||
memcpy(vport->rss_hash_key, key, HCLGE_RSS_KEY_SIZE);
|
||||
vport->rss_algo = hash_algo;
|
||||
} else {
|
||||
ret = hclge_set_rss_algo_key(hdev, hash_algo,
|
||||
vport->rss_hash_key);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
vport->rss_algo = hash_algo;
|
||||
|
||||
/* Update the shadow RSS table with user specified qids */
|
||||
for (i = 0; i < ae_dev->dev_specs.rss_ind_tbl_size; i++)
|
||||
|
@ -6627,10 +6644,13 @@ static int hclge_fd_parse_ring_cookie(struct hclge_dev *hdev, u64 ring_cookie,
|
|||
u8 vf = ethtool_get_flow_spec_ring_vf(ring_cookie);
|
||||
u16 tqps;
|
||||
|
||||
/* To keep consistent with user's configuration, minus 1 when
|
||||
* printing 'vf', because vf id from ethtool is added 1 for vf.
|
||||
*/
|
||||
if (vf > hdev->num_req_vfs) {
|
||||
dev_err(&hdev->pdev->dev,
|
||||
"Error: vf id (%u) > max vf num (%u)\n",
|
||||
vf, hdev->num_req_vfs);
|
||||
"Error: vf id (%u) should be less than %u\n",
|
||||
vf - 1, hdev->num_req_vfs);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
@ -9797,6 +9817,9 @@ static int hclge_set_vlan_filter_hw(struct hclge_dev *hdev, __be16 proto,
|
|||
if (is_kill && !vlan_id)
|
||||
return 0;
|
||||
|
||||
if (vlan_id >= VLAN_N_VID)
|
||||
return -EINVAL;
|
||||
|
||||
ret = hclge_set_vf_vlan_common(hdev, vport_id, is_kill, vlan_id);
|
||||
if (ret) {
|
||||
dev_err(&hdev->pdev->dev,
|
||||
|
@ -10703,7 +10726,8 @@ static int hclge_reset_tqp_cmd_send(struct hclge_dev *hdev, u16 queue_id,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int hclge_get_reset_status(struct hclge_dev *hdev, u16 queue_id)
|
||||
static int hclge_get_reset_status(struct hclge_dev *hdev, u16 queue_id,
|
||||
u8 *reset_status)
|
||||
{
|
||||
struct hclge_reset_tqp_queue_cmd *req;
|
||||
struct hclge_desc desc;
|
||||
|
@ -10721,7 +10745,9 @@ static int hclge_get_reset_status(struct hclge_dev *hdev, u16 queue_id)
|
|||
return ret;
|
||||
}
|
||||
|
||||
return hnae3_get_bit(req->ready_to_reset, HCLGE_TQP_RESET_B);
|
||||
*reset_status = hnae3_get_bit(req->ready_to_reset, HCLGE_TQP_RESET_B);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
u16 hclge_covert_handle_qid_global(struct hnae3_handle *handle, u16 queue_id)
|
||||
|
@ -10740,7 +10766,7 @@ static int hclge_reset_tqp_cmd(struct hnae3_handle *handle)
|
|||
struct hclge_vport *vport = hclge_get_vport(handle);
|
||||
struct hclge_dev *hdev = vport->back;
|
||||
u16 reset_try_times = 0;
|
||||
int reset_status;
|
||||
u8 reset_status;
|
||||
u16 queue_gid;
|
||||
int ret;
|
||||
u16 i;
|
||||
|
@ -10756,7 +10782,11 @@ static int hclge_reset_tqp_cmd(struct hnae3_handle *handle)
|
|||
}
|
||||
|
||||
while (reset_try_times++ < HCLGE_TQP_RESET_TRY_TIMES) {
|
||||
reset_status = hclge_get_reset_status(hdev, queue_gid);
|
||||
ret = hclge_get_reset_status(hdev, queue_gid,
|
||||
&reset_status);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (reset_status)
|
||||
break;
|
||||
|
||||
|
@ -11449,11 +11479,11 @@ static void hclge_clear_resetting_state(struct hclge_dev *hdev)
|
|||
struct hclge_vport *vport = &hdev->vport[i];
|
||||
int ret;
|
||||
|
||||
/* Send cmd to clear VF's FUNC_RST_ING */
|
||||
/* Send cmd to clear vport's FUNC_RST_ING */
|
||||
ret = hclge_set_vf_rst(hdev, vport->vport_id, false);
|
||||
if (ret)
|
||||
dev_warn(&hdev->pdev->dev,
|
||||
"clear vf(%u) rst failed %d!\n",
|
||||
"clear vport(%u) rst failed %d!\n",
|
||||
vport->vport_id, ret);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -566,7 +566,7 @@ static int hclge_reset_vf(struct hclge_vport *vport)
|
|||
struct hclge_dev *hdev = vport->back;
|
||||
|
||||
dev_warn(&hdev->pdev->dev, "PF received VF reset request from VF %u!",
|
||||
vport->vport_id);
|
||||
vport->vport_id - HCLGE_VF_VPORT_START_NUM);
|
||||
|
||||
return hclge_func_reset_cmd(hdev, vport->vport_id);
|
||||
}
|
||||
|
@ -590,9 +590,17 @@ static void hclge_get_queue_id_in_pf(struct hclge_vport *vport,
|
|||
struct hclge_mbx_vf_to_pf_cmd *mbx_req,
|
||||
struct hclge_respond_to_vf_msg *resp_msg)
|
||||
{
|
||||
struct hnae3_handle *handle = &vport->nic;
|
||||
struct hclge_dev *hdev = vport->back;
|
||||
u16 queue_id, qid_in_pf;
|
||||
|
||||
memcpy(&queue_id, mbx_req->msg.data, sizeof(queue_id));
|
||||
if (queue_id >= handle->kinfo.num_tqps) {
|
||||
dev_err(&hdev->pdev->dev, "Invalid queue id(%u) from VF %u\n",
|
||||
queue_id, mbx_req->mbx_src_vfid);
|
||||
return;
|
||||
}
|
||||
|
||||
qid_in_pf = hclge_covert_handle_qid_global(&vport->nic, queue_id);
|
||||
memcpy(resp_msg->data, &qid_in_pf, sizeof(qid_in_pf));
|
||||
resp_msg->len = sizeof(qid_in_pf);
|
||||
|
|
|
@ -581,7 +581,7 @@ int hclge_tm_qs_shaper_cfg(struct hclge_vport *vport, int max_tx_rate)
|
|||
ret = hclge_cmd_send(&hdev->hw, &desc, 1);
|
||||
if (ret) {
|
||||
dev_err(&hdev->pdev->dev,
|
||||
"vf%u, qs%u failed to set tx_rate:%d, ret=%d\n",
|
||||
"vport%u, qs%u failed to set tx_rate:%d, ret=%d\n",
|
||||
vport->vport_id, shap_cfg_cmd->qs_id,
|
||||
max_tx_rate, ret);
|
||||
return ret;
|
||||
|
|
|
@ -816,40 +816,56 @@ static int hclgevf_get_rss(struct hnae3_handle *handle, u32 *indir, u8 *key,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int hclgevf_parse_rss_hfunc(struct hclgevf_dev *hdev, const u8 hfunc,
|
||||
u8 *hash_algo)
|
||||
{
|
||||
switch (hfunc) {
|
||||
case ETH_RSS_HASH_TOP:
|
||||
*hash_algo = HCLGEVF_RSS_HASH_ALGO_TOEPLITZ;
|
||||
return 0;
|
||||
case ETH_RSS_HASH_XOR:
|
||||
*hash_algo = HCLGEVF_RSS_HASH_ALGO_SIMPLE;
|
||||
return 0;
|
||||
case ETH_RSS_HASH_NO_CHANGE:
|
||||
*hash_algo = hdev->rss_cfg.hash_algo;
|
||||
return 0;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
static int hclgevf_set_rss(struct hnae3_handle *handle, const u32 *indir,
|
||||
const u8 *key, const u8 hfunc)
|
||||
{
|
||||
struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);
|
||||
struct hclgevf_rss_cfg *rss_cfg = &hdev->rss_cfg;
|
||||
u8 hash_algo;
|
||||
int ret, i;
|
||||
|
||||
if (hdev->ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2) {
|
||||
ret = hclgevf_parse_rss_hfunc(hdev, hfunc, &hash_algo);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Set the RSS Hash Key if specififed by the user */
|
||||
if (key) {
|
||||
switch (hfunc) {
|
||||
case ETH_RSS_HASH_TOP:
|
||||
rss_cfg->hash_algo =
|
||||
HCLGEVF_RSS_HASH_ALGO_TOEPLITZ;
|
||||
break;
|
||||
case ETH_RSS_HASH_XOR:
|
||||
rss_cfg->hash_algo =
|
||||
HCLGEVF_RSS_HASH_ALGO_SIMPLE;
|
||||
break;
|
||||
case ETH_RSS_HASH_NO_CHANGE:
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ret = hclgevf_set_rss_algo_key(hdev, rss_cfg->hash_algo,
|
||||
key);
|
||||
if (ret)
|
||||
ret = hclgevf_set_rss_algo_key(hdev, hash_algo, key);
|
||||
if (ret) {
|
||||
dev_err(&hdev->pdev->dev,
|
||||
"invalid hfunc type %u\n", hfunc);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Update the shadow RSS key with user specified qids */
|
||||
memcpy(rss_cfg->rss_hash_key, key,
|
||||
HCLGEVF_RSS_KEY_SIZE);
|
||||
} else {
|
||||
ret = hclgevf_set_rss_algo_key(hdev, hash_algo,
|
||||
rss_cfg->rss_hash_key);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
rss_cfg->hash_algo = hash_algo;
|
||||
}
|
||||
|
||||
/* update the shadow RSS table with user specified qids */
|
||||
|
|
Loading…
Reference in New Issue