@@ -351,11 +351,59 @@ void mana_gd_ring_cq(struct gdma_queue *cq, u8 arm_bit)
351351 head , arm_bit );
352352}
353353
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+
354401static void mana_gd_process_eqe (struct gdma_queue * eq )
355402{
356403 u32 head = eq -> head % (eq -> queue_size / GDMA_EQE_SIZE );
357404 struct gdma_context * gc = eq -> gdma_dev -> gdma_context ;
358405 struct gdma_eqe * eq_eqe_ptr = eq -> queue_mem_ptr ;
406+ struct mana_serv_work * mns_wk ;
359407 union gdma_eqe_info eqe_info ;
360408 enum gdma_eqe_type type ;
361409 struct gdma_event event ;
@@ -399,6 +447,33 @@ static void mana_gd_process_eqe(struct gdma_queue *eq)
399447 eq -> eq .callback (eq -> eq .context , eq , & event );
400448 break ;
401449
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+
402477 default :
403478 break ;
404479 }
0 commit comments