1111#include <linux/irqdomain.h>
1212
1313#include <net/mana/mana.h>
14+ #include <net/mana/hw_channel.h>
1415
1516#include <linux/cpu.h>
1617struct dentry * mana_debugfs_root ;
@@ -70,6 +71,24 @@ static void mana_gd_init_registers(struct pci_dev *pdev)
7071 mana_gd_init_vf_regs (pdev );
7172}
7273
74+ /* Suppress logging when we set timeout to zero */
75+ bool mana_need_log (struct gdma_context * gc , int err )
76+ {
77+ struct hw_channel_context * hwc ;
78+
79+ if (err != - ETIMEDOUT )
80+ return true;
81+
82+ if (!gc )
83+ return true;
84+
85+ hwc = gc -> hwc .driver_data ;
86+ if (hwc && hwc -> hwc_timeout == 0 )
87+ return false;
88+
89+ return true;
90+ }
91+
7392static int mana_gd_query_max_resources (struct pci_dev * pdev )
7493{
7594 struct gdma_context * gc = pci_get_drvdata (pdev );
@@ -280,8 +299,9 @@ static int mana_gd_disable_queue(struct gdma_queue *queue)
280299
281300 err = mana_gd_send_request (gc , sizeof (req ), & req , sizeof (resp ), & resp );
282301 if (err || resp .hdr .status ) {
283- dev_err (gc -> dev , "Failed to disable queue: %d, 0x%x\n" , err ,
284- resp .hdr .status );
302+ if (mana_need_log (gc , err ))
303+ dev_err (gc -> dev , "Failed to disable queue: %d, 0x%x\n" , err ,
304+ resp .hdr .status );
285305 return err ? err : - EPROTO ;
286306 }
287307
@@ -368,25 +388,12 @@ EXPORT_SYMBOL_NS(mana_gd_ring_cq, NET_MANA);
368388
369389#define MANA_SERVICE_PERIOD 10
370390
371- struct mana_serv_work {
372- struct work_struct serv_work ;
373- struct pci_dev * pdev ;
374- };
375-
376- static void mana_serv_func (struct work_struct * w )
391+ static void mana_serv_fpga (struct pci_dev * pdev )
377392{
378- struct mana_serv_work * mns_wk ;
379393 struct pci_bus * bus , * parent ;
380- struct pci_dev * pdev ;
381-
382- mns_wk = container_of (w , struct mana_serv_work , serv_work );
383- pdev = mns_wk -> pdev ;
384394
385395 pci_lock_rescan_remove ();
386396
387- if (!pdev )
388- goto out ;
389-
390397 bus = pdev -> bus ;
391398 if (!bus ) {
392399 dev_err (& pdev -> dev , "MANA service: no bus\n" );
@@ -407,7 +414,74 @@ static void mana_serv_func(struct work_struct *w)
407414
408415out :
409416 pci_unlock_rescan_remove ();
417+ }
418+
419+ static void mana_serv_reset (struct pci_dev * pdev )
420+ {
421+ struct gdma_context * gc = pci_get_drvdata (pdev );
422+ struct hw_channel_context * hwc ;
423+
424+ if (!gc ) {
425+ dev_err (& pdev -> dev , "MANA service: no GC\n" );
426+ return ;
427+ }
428+
429+ hwc = gc -> hwc .driver_data ;
430+ if (!hwc ) {
431+ dev_err (& pdev -> dev , "MANA service: no HWC\n" );
432+ goto out ;
433+ }
434+
435+ /* HWC is not responding in this case, so don't wait */
436+ hwc -> hwc_timeout = 0 ;
437+
438+ dev_info (& pdev -> dev , "MANA reset cycle start\n" );
410439
440+ mana_gd_suspend (pdev , PMSG_SUSPEND );
441+
442+ msleep (MANA_SERVICE_PERIOD * 1000 );
443+
444+ mana_gd_resume (pdev );
445+
446+ dev_info (& pdev -> dev , "MANA reset cycle completed\n" );
447+
448+ out :
449+ gc -> in_service = false;
450+ }
451+
452+ struct mana_serv_work {
453+ struct work_struct serv_work ;
454+ struct pci_dev * pdev ;
455+ enum gdma_eqe_type type ;
456+ };
457+
458+ static void mana_serv_func (struct work_struct * w )
459+ {
460+ struct mana_serv_work * mns_wk ;
461+ struct pci_dev * pdev ;
462+
463+ mns_wk = container_of (w , struct mana_serv_work , serv_work );
464+ pdev = mns_wk -> pdev ;
465+
466+ if (!pdev )
467+ goto out ;
468+
469+ switch (mns_wk -> type ) {
470+ case GDMA_EQE_HWC_FPGA_RECONFIG :
471+ mana_serv_fpga (pdev );
472+ break ;
473+
474+ case GDMA_EQE_HWC_RESET_REQUEST :
475+ mana_serv_reset (pdev );
476+ break ;
477+
478+ default :
479+ dev_err (& pdev -> dev , "MANA service: unknown type %d\n" ,
480+ mns_wk -> type );
481+ break ;
482+ }
483+
484+ out :
411485 pci_dev_put (pdev );
412486 kfree (mns_wk );
413487 module_put (THIS_MODULE );
@@ -464,6 +538,7 @@ static void mana_gd_process_eqe(struct gdma_queue *eq)
464538 break ;
465539
466540 case GDMA_EQE_HWC_FPGA_RECONFIG :
541+ case GDMA_EQE_HWC_RESET_REQUEST :
467542 dev_info (gc -> dev , "Recv MANA service type:%d\n" , type );
468543
469544 if (gc -> in_service ) {
@@ -485,6 +560,7 @@ static void mana_gd_process_eqe(struct gdma_queue *eq)
485560 dev_info (gc -> dev , "Start MANA service type:%d\n" , type );
486561 gc -> in_service = true;
487562 mns_wk -> pdev = to_pci_dev (gc -> dev );
563+ mns_wk -> type = type ;
488564 pci_dev_get (mns_wk -> pdev );
489565 INIT_WORK (& mns_wk -> serv_work , mana_serv_func );
490566 schedule_work (& mns_wk -> serv_work );
@@ -636,7 +712,8 @@ int mana_gd_test_eq(struct gdma_context *gc, struct gdma_queue *eq)
636712
637713 err = mana_gd_send_request (gc , sizeof (req ), & req , sizeof (resp ), & resp );
638714 if (err ) {
639- dev_err (dev , "test_eq failed: %d\n" , err );
715+ if (mana_need_log (gc , err ))
716+ dev_err (dev , "test_eq failed: %d\n" , err );
640717 goto out ;
641718 }
642719
@@ -671,7 +748,7 @@ static void mana_gd_destroy_eq(struct gdma_context *gc, bool flush_evenets,
671748
672749 if (flush_evenets ) {
673750 err = mana_gd_test_eq (gc , queue );
674- if (err )
751+ if (err && mana_need_log ( gc , err ) )
675752 dev_warn (gc -> dev , "Failed to flush EQ: %d\n" , err );
676753 }
677754
@@ -817,8 +894,9 @@ int mana_gd_destroy_dma_region(struct gdma_context *gc, u64 dma_region_handle)
817894
818895 err = mana_gd_send_request (gc , sizeof (req ), & req , sizeof (resp ), & resp );
819896 if (err || resp .hdr .status ) {
820- dev_err (gc -> dev , "Failed to destroy DMA region: %d, 0x%x\n" ,
821- err , resp .hdr .status );
897+ if (mana_need_log (gc , err ))
898+ dev_err (gc -> dev , "Failed to destroy DMA region: %d, 0x%x\n" ,
899+ err , resp .hdr .status );
822900 return - EPROTO ;
823901 }
824902
@@ -1118,8 +1196,9 @@ int mana_gd_deregister_device(struct gdma_dev *gd)
11181196
11191197 err = mana_gd_send_request (gc , sizeof (req ), & req , sizeof (resp ), & resp );
11201198 if (err || resp .hdr .status ) {
1121- dev_err (gc -> dev , "Failed to deregister device: %d, 0x%x\n" ,
1122- err , resp .hdr .status );
1199+ if (mana_need_log (gc , err ))
1200+ dev_err (gc -> dev , "Failed to deregister device: %d, 0x%x\n" ,
1201+ err , resp .hdr .status );
11231202 if (!err )
11241203 err = - EPROTO ;
11251204 }
@@ -1917,7 +1996,7 @@ static void mana_gd_remove(struct pci_dev *pdev)
19171996}
19181997
19191998/* The 'state' parameter is not used. */
1920- static int mana_gd_suspend (struct pci_dev * pdev , pm_message_t state )
1999+ int mana_gd_suspend (struct pci_dev * pdev , pm_message_t state )
19212000{
19222001 struct gdma_context * gc = pci_get_drvdata (pdev );
19232002
@@ -1933,7 +2012,7 @@ static int mana_gd_suspend(struct pci_dev *pdev, pm_message_t state)
19332012 * fail -- if this happens, it's safer to just report an error than try to undo
19342013 * what has been done.
19352014 */
1936- static int mana_gd_resume (struct pci_dev * pdev )
2015+ int mana_gd_resume (struct pci_dev * pdev )
19372016{
19382017 struct gdma_context * gc = pci_get_drvdata (pdev );
19392018 int err ;
0 commit comments