RDMA/hns: Refactor eq table init for hip08
To make the code more readable, move the part of naming irq and request irq out of eq table init into a separate function. Link: https://lore.kernel.org/r/1562593285-8037-10-git-send-email-oulijun@huawei.com Signed-off-by: Yixian Liu <liuyixian@huawei.com> Signed-off-by: Lijun Ou <oulijun@huawei.com> Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
This commit is contained in:
parent
d7019c0f47
commit
33db6f9484
@ -5735,6 +5735,94 @@ free_cmd_mbox:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int __hns_roce_request_irq(struct hns_roce_dev *hr_dev, int irq_num,
|
||||||
|
int comp_num, int aeq_num, int other_num)
|
||||||
|
{
|
||||||
|
struct hns_roce_eq_table *eq_table = &hr_dev->eq_table;
|
||||||
|
int i, j;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
for (i = 0; i < irq_num; i++) {
|
||||||
|
hr_dev->irq_names[i] = kzalloc(HNS_ROCE_INT_NAME_LEN,
|
||||||
|
GFP_KERNEL);
|
||||||
|
if (!hr_dev->irq_names[i]) {
|
||||||
|
ret = -ENOMEM;
|
||||||
|
goto err_kzalloc_failed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* irq contains: abnormal + AEQ + CEQ*/
|
||||||
|
for (j = 0; j < irq_num; j++)
|
||||||
|
if (j < other_num)
|
||||||
|
snprintf((char *)hr_dev->irq_names[j],
|
||||||
|
HNS_ROCE_INT_NAME_LEN, "hns-abn-%d", j);
|
||||||
|
else if (j < (other_num + aeq_num))
|
||||||
|
snprintf((char *)hr_dev->irq_names[j],
|
||||||
|
HNS_ROCE_INT_NAME_LEN, "hns-aeq-%d",
|
||||||
|
j - other_num);
|
||||||
|
else
|
||||||
|
snprintf((char *)hr_dev->irq_names[j],
|
||||||
|
HNS_ROCE_INT_NAME_LEN, "hns-ceq-%d",
|
||||||
|
j - other_num - aeq_num);
|
||||||
|
|
||||||
|
for (j = 0; j < irq_num; j++) {
|
||||||
|
if (j < other_num)
|
||||||
|
ret = request_irq(hr_dev->irq[j],
|
||||||
|
hns_roce_v2_msix_interrupt_abn,
|
||||||
|
0, hr_dev->irq_names[j], hr_dev);
|
||||||
|
|
||||||
|
else if (j < (other_num + comp_num))
|
||||||
|
ret = request_irq(eq_table->eq[j - other_num].irq,
|
||||||
|
hns_roce_v2_msix_interrupt_eq,
|
||||||
|
0, hr_dev->irq_names[j + aeq_num],
|
||||||
|
&eq_table->eq[j - other_num]);
|
||||||
|
else
|
||||||
|
ret = request_irq(eq_table->eq[j - other_num].irq,
|
||||||
|
hns_roce_v2_msix_interrupt_eq,
|
||||||
|
0, hr_dev->irq_names[j - comp_num],
|
||||||
|
&eq_table->eq[j - other_num]);
|
||||||
|
if (ret) {
|
||||||
|
dev_err(hr_dev->dev, "Request irq error!\n");
|
||||||
|
goto err_request_failed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
err_request_failed:
|
||||||
|
for (j -= 1; j >= 0; j--)
|
||||||
|
if (j < other_num)
|
||||||
|
free_irq(hr_dev->irq[j], hr_dev);
|
||||||
|
else
|
||||||
|
free_irq(eq_table->eq[j - other_num].irq,
|
||||||
|
&eq_table->eq[j - other_num]);
|
||||||
|
|
||||||
|
err_kzalloc_failed:
|
||||||
|
for (i -= 1; i >= 0; i--)
|
||||||
|
kfree(hr_dev->irq_names[i]);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __hns_roce_free_irq(struct hns_roce_dev *hr_dev)
|
||||||
|
{
|
||||||
|
int irq_num;
|
||||||
|
int eq_num;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
eq_num = hr_dev->caps.num_comp_vectors + hr_dev->caps.num_aeq_vectors;
|
||||||
|
irq_num = eq_num + hr_dev->caps.num_other_vectors;
|
||||||
|
|
||||||
|
for (i = 0; i < hr_dev->caps.num_other_vectors; i++)
|
||||||
|
free_irq(hr_dev->irq[i], hr_dev);
|
||||||
|
|
||||||
|
for (i = 0; i < eq_num; i++)
|
||||||
|
free_irq(hr_dev->eq_table.eq[i].irq, &hr_dev->eq_table.eq[i]);
|
||||||
|
|
||||||
|
for (i = 0; i < irq_num; i++)
|
||||||
|
kfree(hr_dev->irq_names[i]);
|
||||||
|
}
|
||||||
|
|
||||||
static int hns_roce_v2_init_eq_table(struct hns_roce_dev *hr_dev)
|
static int hns_roce_v2_init_eq_table(struct hns_roce_dev *hr_dev)
|
||||||
{
|
{
|
||||||
struct hns_roce_eq_table *eq_table = &hr_dev->eq_table;
|
struct hns_roce_eq_table *eq_table = &hr_dev->eq_table;
|
||||||
@ -5746,7 +5834,7 @@ static int hns_roce_v2_init_eq_table(struct hns_roce_dev *hr_dev)
|
|||||||
int other_num;
|
int other_num;
|
||||||
int comp_num;
|
int comp_num;
|
||||||
int aeq_num;
|
int aeq_num;
|
||||||
int i, j, k;
|
int i;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
other_num = hr_dev->caps.num_other_vectors;
|
other_num = hr_dev->caps.num_other_vectors;
|
||||||
@ -5760,27 +5848,18 @@ static int hns_roce_v2_init_eq_table(struct hns_roce_dev *hr_dev)
|
|||||||
if (!eq_table->eq)
|
if (!eq_table->eq)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
for (i = 0; i < irq_num; i++) {
|
|
||||||
hr_dev->irq_names[i] = kzalloc(HNS_ROCE_INT_NAME_LEN,
|
|
||||||
GFP_KERNEL);
|
|
||||||
if (!hr_dev->irq_names[i]) {
|
|
||||||
ret = -ENOMEM;
|
|
||||||
goto err_failed_kzalloc;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* create eq */
|
/* create eq */
|
||||||
for (j = 0; j < eq_num; j++) {
|
for (i = 0; i < eq_num; i++) {
|
||||||
eq = &eq_table->eq[j];
|
eq = &eq_table->eq[i];
|
||||||
eq->hr_dev = hr_dev;
|
eq->hr_dev = hr_dev;
|
||||||
eq->eqn = j;
|
eq->eqn = i;
|
||||||
if (j < comp_num) {
|
if (i < comp_num) {
|
||||||
/* CEQ */
|
/* CEQ */
|
||||||
eq_cmd = HNS_ROCE_CMD_CREATE_CEQC;
|
eq_cmd = HNS_ROCE_CMD_CREATE_CEQC;
|
||||||
eq->type_flag = HNS_ROCE_CEQ;
|
eq->type_flag = HNS_ROCE_CEQ;
|
||||||
eq->entries = hr_dev->caps.ceqe_depth;
|
eq->entries = hr_dev->caps.ceqe_depth;
|
||||||
eq->eqe_size = HNS_ROCE_CEQ_ENTRY_SIZE;
|
eq->eqe_size = HNS_ROCE_CEQ_ENTRY_SIZE;
|
||||||
eq->irq = hr_dev->irq[j + other_num + aeq_num];
|
eq->irq = hr_dev->irq[i + other_num + aeq_num];
|
||||||
eq->eq_max_cnt = HNS_ROCE_CEQ_DEFAULT_BURST_NUM;
|
eq->eq_max_cnt = HNS_ROCE_CEQ_DEFAULT_BURST_NUM;
|
||||||
eq->eq_period = HNS_ROCE_CEQ_DEFAULT_INTERVAL;
|
eq->eq_period = HNS_ROCE_CEQ_DEFAULT_INTERVAL;
|
||||||
} else {
|
} else {
|
||||||
@ -5789,7 +5868,7 @@ static int hns_roce_v2_init_eq_table(struct hns_roce_dev *hr_dev)
|
|||||||
eq->type_flag = HNS_ROCE_AEQ;
|
eq->type_flag = HNS_ROCE_AEQ;
|
||||||
eq->entries = hr_dev->caps.aeqe_depth;
|
eq->entries = hr_dev->caps.aeqe_depth;
|
||||||
eq->eqe_size = HNS_ROCE_AEQ_ENTRY_SIZE;
|
eq->eqe_size = HNS_ROCE_AEQ_ENTRY_SIZE;
|
||||||
eq->irq = hr_dev->irq[j - comp_num + other_num];
|
eq->irq = hr_dev->irq[i - comp_num + other_num];
|
||||||
eq->eq_max_cnt = HNS_ROCE_AEQ_DEFAULT_BURST_NUM;
|
eq->eq_max_cnt = HNS_ROCE_AEQ_DEFAULT_BURST_NUM;
|
||||||
eq->eq_period = HNS_ROCE_AEQ_DEFAULT_INTERVAL;
|
eq->eq_period = HNS_ROCE_AEQ_DEFAULT_INTERVAL;
|
||||||
}
|
}
|
||||||
@ -5804,40 +5883,11 @@ static int hns_roce_v2_init_eq_table(struct hns_roce_dev *hr_dev)
|
|||||||
/* enable irq */
|
/* enable irq */
|
||||||
hns_roce_v2_int_mask_enable(hr_dev, eq_num, EQ_ENABLE);
|
hns_roce_v2_int_mask_enable(hr_dev, eq_num, EQ_ENABLE);
|
||||||
|
|
||||||
/* irq contains: abnormal + AEQ + CEQ*/
|
ret = __hns_roce_request_irq(hr_dev, irq_num, comp_num,
|
||||||
for (k = 0; k < irq_num; k++)
|
aeq_num, other_num);
|
||||||
if (k < other_num)
|
if (ret) {
|
||||||
snprintf((char *)hr_dev->irq_names[k],
|
dev_err(dev, "Request irq failed.\n");
|
||||||
HNS_ROCE_INT_NAME_LEN, "hns-abn-%d", k);
|
goto err_request_irq_fail;
|
||||||
else if (k < (other_num + aeq_num))
|
|
||||||
snprintf((char *)hr_dev->irq_names[k],
|
|
||||||
HNS_ROCE_INT_NAME_LEN, "hns-aeq-%d",
|
|
||||||
k - other_num);
|
|
||||||
else
|
|
||||||
snprintf((char *)hr_dev->irq_names[k],
|
|
||||||
HNS_ROCE_INT_NAME_LEN, "hns-ceq-%d",
|
|
||||||
k - other_num - aeq_num);
|
|
||||||
|
|
||||||
for (k = 0; k < irq_num; k++) {
|
|
||||||
if (k < other_num)
|
|
||||||
ret = request_irq(hr_dev->irq[k],
|
|
||||||
hns_roce_v2_msix_interrupt_abn,
|
|
||||||
0, hr_dev->irq_names[k], hr_dev);
|
|
||||||
|
|
||||||
else if (k < (other_num + comp_num))
|
|
||||||
ret = request_irq(eq_table->eq[k - other_num].irq,
|
|
||||||
hns_roce_v2_msix_interrupt_eq,
|
|
||||||
0, hr_dev->irq_names[k + aeq_num],
|
|
||||||
&eq_table->eq[k - other_num]);
|
|
||||||
else
|
|
||||||
ret = request_irq(eq_table->eq[k - other_num].irq,
|
|
||||||
hns_roce_v2_msix_interrupt_eq,
|
|
||||||
0, hr_dev->irq_names[k - comp_num],
|
|
||||||
&eq_table->eq[k - other_num]);
|
|
||||||
if (ret) {
|
|
||||||
dev_err(dev, "Request irq error!\n");
|
|
||||||
goto err_request_irq_fail;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
hr_dev->irq_workq =
|
hr_dev->irq_workq =
|
||||||
@ -5845,26 +5895,20 @@ static int hns_roce_v2_init_eq_table(struct hns_roce_dev *hr_dev)
|
|||||||
if (!hr_dev->irq_workq) {
|
if (!hr_dev->irq_workq) {
|
||||||
dev_err(dev, "Create irq workqueue failed!\n");
|
dev_err(dev, "Create irq workqueue failed!\n");
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
goto err_request_irq_fail;
|
goto err_create_wq_fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
err_create_wq_fail:
|
||||||
|
__hns_roce_free_irq(hr_dev);
|
||||||
|
|
||||||
err_request_irq_fail:
|
err_request_irq_fail:
|
||||||
for (k -= 1; k >= 0; k--)
|
hns_roce_v2_int_mask_enable(hr_dev, eq_num, EQ_DISABLE);
|
||||||
if (k < other_num)
|
|
||||||
free_irq(hr_dev->irq[k], hr_dev);
|
|
||||||
else
|
|
||||||
free_irq(eq_table->eq[k - other_num].irq,
|
|
||||||
&eq_table->eq[k - other_num]);
|
|
||||||
|
|
||||||
err_create_eq_fail:
|
err_create_eq_fail:
|
||||||
for (j -= 1; j >= 0; j--)
|
|
||||||
hns_roce_v2_free_eq(hr_dev, &eq_table->eq[j]);
|
|
||||||
|
|
||||||
err_failed_kzalloc:
|
|
||||||
for (i -= 1; i >= 0; i--)
|
for (i -= 1; i >= 0; i--)
|
||||||
kfree(hr_dev->irq_names[i]);
|
hns_roce_v2_free_eq(hr_dev, &eq_table->eq[i]);
|
||||||
kfree(eq_table->eq);
|
kfree(eq_table->eq);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@ -5883,20 +5927,14 @@ static void hns_roce_v2_cleanup_eq_table(struct hns_roce_dev *hr_dev)
|
|||||||
/* Disable irq */
|
/* Disable irq */
|
||||||
hns_roce_v2_int_mask_enable(hr_dev, eq_num, EQ_DISABLE);
|
hns_roce_v2_int_mask_enable(hr_dev, eq_num, EQ_DISABLE);
|
||||||
|
|
||||||
for (i = 0; i < hr_dev->caps.num_other_vectors; i++)
|
__hns_roce_free_irq(hr_dev);
|
||||||
free_irq(hr_dev->irq[i], hr_dev);
|
|
||||||
|
|
||||||
for (i = 0; i < eq_num; i++) {
|
for (i = 0; i < eq_num; i++) {
|
||||||
hns_roce_v2_destroy_eqc(hr_dev, i);
|
hns_roce_v2_destroy_eqc(hr_dev, i);
|
||||||
|
|
||||||
free_irq(eq_table->eq[i].irq, &eq_table->eq[i]);
|
|
||||||
|
|
||||||
hns_roce_v2_free_eq(hr_dev, &eq_table->eq[i]);
|
hns_roce_v2_free_eq(hr_dev, &eq_table->eq[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < irq_num; i++)
|
|
||||||
kfree(hr_dev->irq_names[i]);
|
|
||||||
|
|
||||||
kfree(eq_table->eq);
|
kfree(eq_table->eq);
|
||||||
|
|
||||||
flush_workqueue(hr_dev->irq_workq);
|
flush_workqueue(hr_dev->irq_workq);
|
||||||
|
Loading…
Reference in New Issue
Block a user