88#include <linux/version.h>
99
1010#include <net/mana/mana.h>
11+ #include <net/mana/hw_channel.h>
1112
1213struct dentry * mana_debugfs_root ;
1314
@@ -63,6 +64,24 @@ static void mana_gd_init_registers(struct pci_dev *pdev)
6364 mana_gd_init_vf_regs (pdev );
6465}
6566
67+ /* Suppress logging when we set timeout to zero */
68+ bool mana_need_log (struct gdma_context * gc , int err )
69+ {
70+ struct hw_channel_context * hwc ;
71+
72+ if (err != - ETIMEDOUT )
73+ return true;
74+
75+ if (!gc )
76+ return true;
77+
78+ hwc = gc -> hwc .driver_data ;
79+ if (hwc && hwc -> hwc_timeout == 0 )
80+ return false;
81+
82+ return true;
83+ }
84+
6685static int mana_gd_query_max_resources (struct pci_dev * pdev )
6786{
6887 struct gdma_context * gc = pci_get_drvdata (pdev );
@@ -266,8 +285,9 @@ static int mana_gd_disable_queue(struct gdma_queue *queue)
266285
267286 err = mana_gd_send_request (gc , sizeof (req ), & req , sizeof (resp ), & resp );
268287 if (err || resp .hdr .status ) {
269- dev_err (gc -> dev , "Failed to disable queue: %d, 0x%x\n" , err ,
270- resp .hdr .status );
288+ if (mana_need_log (gc , err ))
289+ dev_err (gc -> dev , "Failed to disable queue: %d, 0x%x\n" , err ,
290+ resp .hdr .status );
271291 return err ? err : - EPROTO ;
272292 }
273293
@@ -352,25 +372,12 @@ void mana_gd_ring_cq(struct gdma_queue *cq, u8 arm_bit)
352372
353373#define MANA_SERVICE_PERIOD 10
354374
355- struct mana_serv_work {
356- struct work_struct serv_work ;
357- struct pci_dev * pdev ;
358- };
359-
360- static void mana_serv_func (struct work_struct * w )
375+ static void mana_serv_fpga (struct pci_dev * pdev )
361376{
362- struct mana_serv_work * mns_wk ;
363377 struct pci_bus * bus , * parent ;
364- struct pci_dev * pdev ;
365-
366- mns_wk = container_of (w , struct mana_serv_work , serv_work );
367- pdev = mns_wk -> pdev ;
368378
369379 pci_lock_rescan_remove ();
370380
371- if (!pdev )
372- goto out ;
373-
374381 bus = pdev -> bus ;
375382 if (!bus ) {
376383 dev_err (& pdev -> dev , "MANA service: no bus\n" );
@@ -391,7 +398,74 @@ static void mana_serv_func(struct work_struct *w)
391398
392399out :
393400 pci_unlock_rescan_remove ();
401+ }
402+
403+ static void mana_serv_reset (struct pci_dev * pdev )
404+ {
405+ struct gdma_context * gc = pci_get_drvdata (pdev );
406+ struct hw_channel_context * hwc ;
407+
408+ if (!gc ) {
409+ dev_err (& pdev -> dev , "MANA service: no GC\n" );
410+ return ;
411+ }
412+
413+ hwc = gc -> hwc .driver_data ;
414+ if (!hwc ) {
415+ dev_err (& pdev -> dev , "MANA service: no HWC\n" );
416+ goto out ;
417+ }
418+
419+ /* HWC is not responding in this case, so don't wait */
420+ hwc -> hwc_timeout = 0 ;
421+
422+ dev_info (& pdev -> dev , "MANA reset cycle start\n" );
394423
424+ mana_gd_suspend (pdev , PMSG_SUSPEND );
425+
426+ msleep (MANA_SERVICE_PERIOD * 1000 );
427+
428+ mana_gd_resume (pdev );
429+
430+ dev_info (& pdev -> dev , "MANA reset cycle completed\n" );
431+
432+ out :
433+ gc -> in_service = false;
434+ }
435+
436+ struct mana_serv_work {
437+ struct work_struct serv_work ;
438+ struct pci_dev * pdev ;
439+ enum gdma_eqe_type type ;
440+ };
441+
442+ static void mana_serv_func (struct work_struct * w )
443+ {
444+ struct mana_serv_work * mns_wk ;
445+ struct pci_dev * pdev ;
446+
447+ mns_wk = container_of (w , struct mana_serv_work , serv_work );
448+ pdev = mns_wk -> pdev ;
449+
450+ if (!pdev )
451+ goto out ;
452+
453+ switch (mns_wk -> type ) {
454+ case GDMA_EQE_HWC_FPGA_RECONFIG :
455+ mana_serv_fpga (pdev );
456+ break ;
457+
458+ case GDMA_EQE_HWC_RESET_REQUEST :
459+ mana_serv_reset (pdev );
460+ break ;
461+
462+ default :
463+ dev_err (& pdev -> dev , "MANA service: unknown type %d\n" ,
464+ mns_wk -> type );
465+ break ;
466+ }
467+
468+ out :
395469 pci_dev_put (pdev );
396470 kfree (mns_wk );
397471 module_put (THIS_MODULE );
@@ -447,6 +521,7 @@ static void mana_gd_process_eqe(struct gdma_queue *eq)
447521 break ;
448522
449523 case GDMA_EQE_HWC_FPGA_RECONFIG :
524+ case GDMA_EQE_HWC_RESET_REQUEST :
450525 dev_info (gc -> dev , "Recv MANA service type:%d\n" , type );
451526
452527 if (gc -> in_service ) {
@@ -468,6 +543,7 @@ static void mana_gd_process_eqe(struct gdma_queue *eq)
468543 dev_info (gc -> dev , "Start MANA service type:%d\n" , type );
469544 gc -> in_service = true;
470545 mns_wk -> pdev = to_pci_dev (gc -> dev );
546+ mns_wk -> type = type ;
471547 pci_dev_get (mns_wk -> pdev );
472548 INIT_WORK (& mns_wk -> serv_work , mana_serv_func );
473549 schedule_work (& mns_wk -> serv_work );
@@ -614,7 +690,8 @@ int mana_gd_test_eq(struct gdma_context *gc, struct gdma_queue *eq)
614690
615691 err = mana_gd_send_request (gc , sizeof (req ), & req , sizeof (resp ), & resp );
616692 if (err ) {
617- dev_err (dev , "test_eq failed: %d\n" , err );
693+ if (mana_need_log (gc , err ))
694+ dev_err (dev , "test_eq failed: %d\n" , err );
618695 goto out ;
619696 }
620697
@@ -649,7 +726,7 @@ static void mana_gd_destroy_eq(struct gdma_context *gc, bool flush_evenets,
649726
650727 if (flush_evenets ) {
651728 err = mana_gd_test_eq (gc , queue );
652- if (err )
729+ if (err && mana_need_log ( gc , err ) )
653730 dev_warn (gc -> dev , "Failed to flush EQ: %d\n" , err );
654731 }
655732
@@ -795,8 +872,9 @@ int mana_gd_destroy_dma_region(struct gdma_context *gc, u64 dma_region_handle)
795872
796873 err = mana_gd_send_request (gc , sizeof (req ), & req , sizeof (resp ), & resp );
797874 if (err || resp .hdr .status ) {
798- dev_err (gc -> dev , "Failed to destroy DMA region: %d, 0x%x\n" ,
799- err , resp .hdr .status );
875+ if (mana_need_log (gc , err ))
876+ dev_err (gc -> dev , "Failed to destroy DMA region: %d, 0x%x\n" ,
877+ err , resp .hdr .status );
800878 return - EPROTO ;
801879 }
802880
@@ -1095,8 +1173,9 @@ int mana_gd_deregister_device(struct gdma_dev *gd)
10951173
10961174 err = mana_gd_send_request (gc , sizeof (req ), & req , sizeof (resp ), & resp );
10971175 if (err || resp .hdr .status ) {
1098- dev_err (gc -> dev , "Failed to deregister device: %d, 0x%x\n" ,
1099- err , resp .hdr .status );
1176+ if (mana_need_log (gc , err ))
1177+ dev_err (gc -> dev , "Failed to deregister device: %d, 0x%x\n" ,
1178+ err , resp .hdr .status );
11001179 if (!err )
11011180 err = - EPROTO ;
11021181 }
@@ -1696,7 +1775,7 @@ static void mana_gd_remove(struct pci_dev *pdev)
16961775}
16971776
16981777/* The 'state' parameter is not used. */
1699- static int mana_gd_suspend (struct pci_dev * pdev , pm_message_t state )
1778+ int mana_gd_suspend (struct pci_dev * pdev , pm_message_t state )
17001779{
17011780 struct gdma_context * gc = pci_get_drvdata (pdev );
17021781
@@ -1711,7 +1790,7 @@ static int mana_gd_suspend(struct pci_dev *pdev, pm_message_t state)
17111790 * fail -- if this happens, it's safer to just report an error than try to undo
17121791 * what has been done.
17131792 */
1714- static int mana_gd_resume (struct pci_dev * pdev )
1793+ int mana_gd_resume (struct pci_dev * pdev )
17151794{
17161795 struct gdma_context * gc = pci_get_drvdata (pdev );
17171796 int err ;
0 commit comments