Commit 0d3e6631 authored by Yunsheng Lin's avatar Yunsheng Lin Committed by David S. Miller

net: hns3: refactor the get/put_vector function

There is a get_vector function, which allocate the vectors
for a client, but there is not a put_vector to free the
vector.

This patch introduces the put_vector function in order to
fix the coalesce configuration lost problem during reset
process.
Signed-off-by: default avatarYunsheng Lin <linyunsheng@huawei.com>
Signed-off-by: default avatarPeng Li <lipeng321@huawei.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent ec777890
...@@ -265,6 +265,8 @@ struct hnae3_ae_dev { ...@@ -265,6 +265,8 @@ struct hnae3_ae_dev {
* Get tc size of handle * Get tc size of handle
* get_vector() * get_vector()
* Get vector number and vector information * Get vector number and vector information
* put_vector()
* Put the vector in hdev
* map_ring_to_vector() * map_ring_to_vector()
* Map rings to vector * Map rings to vector
* unmap_ring_from_vector() * unmap_ring_from_vector()
...@@ -375,6 +377,7 @@ struct hnae3_ae_ops { ...@@ -375,6 +377,7 @@ struct hnae3_ae_ops {
int (*get_vector)(struct hnae3_handle *handle, u16 vector_num, int (*get_vector)(struct hnae3_handle *handle, u16 vector_num,
struct hnae3_vector_info *vector_info); struct hnae3_vector_info *vector_info);
int (*put_vector)(struct hnae3_handle *handle, int vector_num);
int (*map_ring_to_vector)(struct hnae3_handle *handle, int (*map_ring_to_vector)(struct hnae3_handle *handle,
int vector_num, int vector_num,
struct hnae3_ring_chain_node *vr_chain); struct hnae3_ring_chain_node *vr_chain);
......
...@@ -2721,6 +2721,10 @@ static int hns3_nic_uninit_vector_data(struct hns3_nic_priv *priv) ...@@ -2721,6 +2721,10 @@ static int hns3_nic_uninit_vector_data(struct hns3_nic_priv *priv)
if (ret) if (ret)
return ret; return ret;
ret = h->ae_algo->ops->put_vector(h, tqp_vector->vector_irq);
if (ret)
return ret;
hns3_free_vector_ring_chain(tqp_vector, &vector_ring_chain); hns3_free_vector_ring_chain(tqp_vector, &vector_ring_chain);
if (priv->tqp_vector[i].irq_init_flag == HNS3_VECTOR_INITED) { if (priv->tqp_vector[i].irq_init_flag == HNS3_VECTOR_INITED) {
......
...@@ -2969,6 +2969,24 @@ static int hclge_get_vector_index(struct hclge_dev *hdev, int vector) ...@@ -2969,6 +2969,24 @@ static int hclge_get_vector_index(struct hclge_dev *hdev, int vector)
return -EINVAL; return -EINVAL;
} }
static int hclge_put_vector(struct hnae3_handle *handle, int vector)
{
struct hclge_vport *vport = hclge_get_vport(handle);
struct hclge_dev *hdev = vport->back;
int vector_id;
vector_id = hclge_get_vector_index(hdev, vector);
if (vector_id < 0) {
dev_err(&hdev->pdev->dev,
"Get vector index fail. vector_id =%d\n", vector_id);
return vector_id;
}
hclge_free_vector(hdev, vector_id);
return 0;
}
static u32 hclge_get_rss_key_size(struct hnae3_handle *handle) static u32 hclge_get_rss_key_size(struct hnae3_handle *handle)
{ {
return HCLGE_RSS_KEY_SIZE; return HCLGE_RSS_KEY_SIZE;
...@@ -3523,18 +3541,13 @@ static int hclge_unmap_ring_frm_vector(struct hnae3_handle *handle, ...@@ -3523,18 +3541,13 @@ static int hclge_unmap_ring_frm_vector(struct hnae3_handle *handle,
} }
ret = hclge_bind_ring_with_vector(vport, vector_id, false, ring_chain); ret = hclge_bind_ring_with_vector(vport, vector_id, false, ring_chain);
if (ret) { if (ret)
dev_err(&handle->pdev->dev, dev_err(&handle->pdev->dev,
"Unmap ring from vector fail. vectorid=%d, ret =%d\n", "Unmap ring from vector fail. vectorid=%d, ret =%d\n",
vector_id, vector_id,
ret); ret);
return ret;
}
/* Free this MSIX or MSI vector */
hclge_free_vector(hdev, vector_id);
return 0; return ret;
} }
int hclge_cmd_set_promisc_mode(struct hclge_dev *hdev, int hclge_cmd_set_promisc_mode(struct hclge_dev *hdev,
...@@ -5994,6 +6007,7 @@ static const struct hnae3_ae_ops hclge_ops = { ...@@ -5994,6 +6007,7 @@ static const struct hnae3_ae_ops hclge_ops = {
.map_ring_to_vector = hclge_map_ring_to_vector, .map_ring_to_vector = hclge_map_ring_to_vector,
.unmap_ring_from_vector = hclge_unmap_ring_frm_vector, .unmap_ring_from_vector = hclge_unmap_ring_frm_vector,
.get_vector = hclge_get_vector, .get_vector = hclge_get_vector,
.put_vector = hclge_put_vector,
.set_promisc_mode = hclge_set_promisc_mode, .set_promisc_mode = hclge_set_promisc_mode,
.set_loopback = hclge_set_loopback, .set_loopback = hclge_set_loopback,
.start = hclge_ae_start, .start = hclge_ae_start,
......
...@@ -627,13 +627,18 @@ static int hclgevf_unmap_ring_from_vector( ...@@ -627,13 +627,18 @@ static int hclgevf_unmap_ring_from_vector(
} }
ret = hclgevf_bind_ring_to_vector(handle, false, vector, ring_chain); ret = hclgevf_bind_ring_to_vector(handle, false, vector, ring_chain);
if (ret) { if (ret)
dev_err(&handle->pdev->dev, dev_err(&handle->pdev->dev,
"Unmap ring from vector fail. vector=%d, ret =%d\n", "Unmap ring from vector fail. vector=%d, ret =%d\n",
vector_id, vector_id,
ret); ret);
return ret;
} return ret;
}
static int hclgevf_put_vector(struct hnae3_handle *handle, int vector)
{
struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);
hclgevf_free_vector(hdev, vector); hclgevf_free_vector(hdev, vector);
...@@ -1466,6 +1471,7 @@ static const struct hnae3_ae_ops hclgevf_ops = { ...@@ -1466,6 +1471,7 @@ static const struct hnae3_ae_ops hclgevf_ops = {
.map_ring_to_vector = hclgevf_map_ring_to_vector, .map_ring_to_vector = hclgevf_map_ring_to_vector,
.unmap_ring_from_vector = hclgevf_unmap_ring_from_vector, .unmap_ring_from_vector = hclgevf_unmap_ring_from_vector,
.get_vector = hclgevf_get_vector, .get_vector = hclgevf_get_vector,
.put_vector = hclgevf_put_vector,
.reset_queue = hclgevf_reset_tqp, .reset_queue = hclgevf_reset_tqp,
.set_promisc_mode = hclgevf_set_promisc_mode, .set_promisc_mode = hclgevf_set_promisc_mode,
.get_mac_addr = hclgevf_get_mac_addr, .get_mac_addr = hclgevf_get_mac_addr,
......
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