@@ -351,11 +351,59 @@ void mana_gd_ring_cq(struct gdma_queue *cq, u8 arm_bit)
351
351
head , arm_bit );
352
352
}
353
353
354
+ #define MANA_SERVICE_PERIOD 10
355
+
356
+ struct mana_serv_work {
357
+ struct work_struct serv_work ;
358
+ struct pci_dev * pdev ;
359
+ };
360
+
361
+ static void mana_serv_func (struct work_struct * w )
362
+ {
363
+ struct mana_serv_work * mns_wk ;
364
+ struct pci_bus * bus , * parent ;
365
+ struct pci_dev * pdev ;
366
+
367
+ mns_wk = container_of (w , struct mana_serv_work , serv_work );
368
+ pdev = mns_wk -> pdev ;
369
+
370
+ pci_lock_rescan_remove ();
371
+
372
+ if (!pdev )
373
+ goto out ;
374
+
375
+ bus = pdev -> bus ;
376
+ if (!bus ) {
377
+ dev_err (& pdev -> dev , "MANA service: no bus\n" );
378
+ goto out ;
379
+ }
380
+
381
+ parent = bus -> parent ;
382
+ if (!parent ) {
383
+ dev_err (& pdev -> dev , "MANA service: no parent bus\n" );
384
+ goto out ;
385
+ }
386
+
387
+ pci_stop_and_remove_bus_device (bus -> self );
388
+
389
+ msleep (MANA_SERVICE_PERIOD * 1000 );
390
+
391
+ pci_rescan_bus (parent );
392
+
393
+ out :
394
+ pci_unlock_rescan_remove ();
395
+
396
+ pci_dev_put (pdev );
397
+ kfree (mns_wk );
398
+ module_put (THIS_MODULE );
399
+ }
400
+
354
401
static void mana_gd_process_eqe (struct gdma_queue * eq )
355
402
{
356
403
u32 head = eq -> head % (eq -> queue_size / GDMA_EQE_SIZE );
357
404
struct gdma_context * gc = eq -> gdma_dev -> gdma_context ;
358
405
struct gdma_eqe * eq_eqe_ptr = eq -> queue_mem_ptr ;
406
+ struct mana_serv_work * mns_wk ;
359
407
union gdma_eqe_info eqe_info ;
360
408
enum gdma_eqe_type type ;
361
409
struct gdma_event event ;
@@ -399,6 +447,33 @@ static void mana_gd_process_eqe(struct gdma_queue *eq)
399
447
eq -> eq .callback (eq -> eq .context , eq , & event );
400
448
break ;
401
449
450
+ case GDMA_EQE_HWC_FPGA_RECONFIG :
451
+ dev_info (gc -> dev , "Recv MANA service type:%d\n" , type );
452
+
453
+ if (gc -> in_service ) {
454
+ dev_info (gc -> dev , "Already in service\n" );
455
+ break ;
456
+ }
457
+
458
+ if (!try_module_get (THIS_MODULE )) {
459
+ dev_info (gc -> dev , "Module is unloading\n" );
460
+ break ;
461
+ }
462
+
463
+ mns_wk = kzalloc (sizeof (* mns_wk ), GFP_ATOMIC );
464
+ if (!mns_wk ) {
465
+ module_put (THIS_MODULE );
466
+ break ;
467
+ }
468
+
469
+ dev_info (gc -> dev , "Start MANA service type:%d\n" , type );
470
+ gc -> in_service = true;
471
+ mns_wk -> pdev = to_pci_dev (gc -> dev );
472
+ pci_dev_get (mns_wk -> pdev );
473
+ INIT_WORK (& mns_wk -> serv_work , mana_serv_func );
474
+ schedule_work (& mns_wk -> serv_work );
475
+ break ;
476
+
402
477
default :
403
478
break ;
404
479
}
0 commit comments