Skip to content

Commit 466b0c0

Browse files
321lipengdavem330
authored andcommitted
net: hns3: Add support for misc interrupt
This patch adds initialization and deinitialization for misc interrupt. This interrupt will be used to handle reset message(IRQ). Signed-off-by: qumingguang <[email protected]> Signed-off-by: Lipeng <[email protected]> Signed-off-by: Yunsheng Lin <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 3efb960 commit 466b0c0

File tree

3 files changed

+81
-0
lines changed

3 files changed

+81
-0
lines changed

drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,11 @@ enum hclge_cmd_status {
6363
HCLGE_ERR_CSQ_ERROR = -3,
6464
};
6565

66+
struct hclge_misc_vector {
67+
u8 __iomem *addr;
68+
int vector_irq;
69+
};
70+
6671
struct hclge_cmq {
6772
struct hclge_cmq_ring csq;
6873
struct hclge_cmq_ring crq;

drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2392,11 +2392,71 @@ static void hclge_service_complete(struct hclge_dev *hdev)
23922392
clear_bit(HCLGE_STATE_SERVICE_SCHED, &hdev->state);
23932393
}
23942394

2395+
static void hclge_enable_vector(struct hclge_misc_vector *vector, bool enable)
2396+
{
2397+
writel(enable ? 1 : 0, vector->addr);
2398+
}
2399+
2400+
static irqreturn_t hclge_misc_irq_handle(int irq, void *data)
2401+
{
2402+
struct hclge_dev *hdev = data;
2403+
2404+
hclge_enable_vector(&hdev->misc_vector, false);
2405+
if (!test_and_set_bit(HCLGE_STATE_SERVICE_SCHED, &hdev->state))
2406+
schedule_work(&hdev->service_task);
2407+
2408+
return IRQ_HANDLED;
2409+
}
2410+
2411+
static void hclge_free_vector(struct hclge_dev *hdev, int vector_id)
2412+
{
2413+
hdev->vector_status[vector_id] = HCLGE_INVALID_VPORT;
2414+
hdev->num_msi_left += 1;
2415+
hdev->num_msi_used -= 1;
2416+
}
2417+
2418+
static void hclge_get_misc_vector(struct hclge_dev *hdev)
2419+
{
2420+
struct hclge_misc_vector *vector = &hdev->misc_vector;
2421+
2422+
vector->vector_irq = pci_irq_vector(hdev->pdev, 0);
2423+
2424+
vector->addr = hdev->hw.io_base + HCLGE_MISC_VECTOR_REG_BASE;
2425+
hdev->vector_status[0] = 0;
2426+
2427+
hdev->num_msi_left -= 1;
2428+
hdev->num_msi_used += 1;
2429+
}
2430+
2431+
static int hclge_misc_irq_init(struct hclge_dev *hdev)
2432+
{
2433+
int ret;
2434+
2435+
hclge_get_misc_vector(hdev);
2436+
2437+
ret = devm_request_irq(&hdev->pdev->dev,
2438+
hdev->misc_vector.vector_irq,
2439+
hclge_misc_irq_handle, 0, "hclge_misc", hdev);
2440+
if (ret) {
2441+
hclge_free_vector(hdev, 0);
2442+
dev_err(&hdev->pdev->dev, "request misc irq(%d) fail\n",
2443+
hdev->misc_vector.vector_irq);
2444+
}
2445+
2446+
return ret;
2447+
}
2448+
2449+
static void hclge_misc_irq_service_task(struct hclge_dev *hdev)
2450+
{
2451+
hclge_enable_vector(&hdev->misc_vector, true);
2452+
}
2453+
23952454
static void hclge_service_task(struct work_struct *work)
23962455
{
23972456
struct hclge_dev *hdev =
23982457
container_of(work, struct hclge_dev, service_task);
23992458

2459+
hclge_misc_irq_service_task(hdev);
24002460
hclge_update_speed_duplex(hdev);
24012461
hclge_update_link_status(hdev);
24022462
hclge_update_stats_for_all(hdev);
@@ -4480,6 +4540,14 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
44804540
return ret;
44814541
}
44824542

4543+
ret = hclge_misc_irq_init(hdev);
4544+
if (ret) {
4545+
dev_err(&pdev->dev,
4546+
"Misc IRQ(vector0) init error, ret = %d.\n",
4547+
ret);
4548+
return ret;
4549+
}
4550+
44834551
ret = hclge_alloc_tqps(hdev);
44844552
if (ret) {
44854553
dev_err(&pdev->dev, "Allocate TQPs error, ret = %d.\n", ret);
@@ -4545,6 +4613,9 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
45454613
timer_setup(&hdev->service_timer, hclge_service_timer, 0);
45464614
INIT_WORK(&hdev->service_task, hclge_service_task);
45474615

4616+
/* Enable MISC vector(vector0) */
4617+
hclge_enable_vector(&hdev->misc_vector, true);
4618+
45484619
set_bit(HCLGE_STATE_SERVICE_INITED, &hdev->state);
45494620
set_bit(HCLGE_STATE_DOWN, &hdev->state);
45504621

@@ -4577,6 +4648,9 @@ static void hclge_uninit_ae_dev(struct hnae3_ae_dev *ae_dev)
45774648
if (mac->phydev)
45784649
mdiobus_unregister(mac->mdio_bus);
45794650

4651+
/* Disable MISC vector(vector0) */
4652+
hclge_enable_vector(&hdev->misc_vector, false);
4653+
hclge_free_vector(hdev, 0);
45804654
hclge_destroy_cmd_queue(&hdev->hw);
45814655
hclge_pci_uninit(hdev);
45824656
ae_dev->priv = NULL;

drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
(HCLGE_PF_CFG_BLOCK_SIZE / HCLGE_CFG_RD_LEN_BYTES)
2828

2929
#define HCLGE_VECTOR_REG_BASE 0x20000
30+
#define HCLGE_MISC_VECTOR_REG_BASE 0x20400
3031

3132
#define HCLGE_VECTOR_REG_OFFSET 0x4
3233
#define HCLGE_VECTOR_VF_OFFSET 0x100000
@@ -400,6 +401,7 @@ struct hclge_dev {
400401
struct pci_dev *pdev;
401402
struct hnae3_ae_dev *ae_dev;
402403
struct hclge_hw hw;
404+
struct hclge_misc_vector misc_vector;
403405
struct hclge_hw_stats hw_stats;
404406
unsigned long state;
405407

0 commit comments

Comments
 (0)