@@ -2392,11 +2392,71 @@ static void hclge_service_complete(struct hclge_dev *hdev)
2392
2392
clear_bit (HCLGE_STATE_SERVICE_SCHED , & hdev -> state );
2393
2393
}
2394
2394
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
+
2395
2454
static void hclge_service_task (struct work_struct * work )
2396
2455
{
2397
2456
struct hclge_dev * hdev =
2398
2457
container_of (work , struct hclge_dev , service_task );
2399
2458
2459
+ hclge_misc_irq_service_task (hdev );
2400
2460
hclge_update_speed_duplex (hdev );
2401
2461
hclge_update_link_status (hdev );
2402
2462
hclge_update_stats_for_all (hdev );
@@ -4480,6 +4540,14 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
4480
4540
return ret ;
4481
4541
}
4482
4542
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
+
4483
4551
ret = hclge_alloc_tqps (hdev );
4484
4552
if (ret ) {
4485
4553
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)
4545
4613
timer_setup (& hdev -> service_timer , hclge_service_timer , 0 );
4546
4614
INIT_WORK (& hdev -> service_task , hclge_service_task );
4547
4615
4616
+ /* Enable MISC vector(vector0) */
4617
+ hclge_enable_vector (& hdev -> misc_vector , true);
4618
+
4548
4619
set_bit (HCLGE_STATE_SERVICE_INITED , & hdev -> state );
4549
4620
set_bit (HCLGE_STATE_DOWN , & hdev -> state );
4550
4621
@@ -4577,6 +4648,9 @@ static void hclge_uninit_ae_dev(struct hnae3_ae_dev *ae_dev)
4577
4648
if (mac -> phydev )
4578
4649
mdiobus_unregister (mac -> mdio_bus );
4579
4650
4651
+ /* Disable MISC vector(vector0) */
4652
+ hclge_enable_vector (& hdev -> misc_vector , false);
4653
+ hclge_free_vector (hdev , 0 );
4580
4654
hclge_destroy_cmd_queue (& hdev -> hw );
4581
4655
hclge_pci_uninit (hdev );
4582
4656
ae_dev -> priv = NULL ;
0 commit comments