@@ -235,10 +235,8 @@ nfp_net_pf_map_rtsym(struct nfp_pf *pf, const char *name, const char *sym_fmt,
235
235
nfp_cppcore_pcie_unit (pf -> cpp ));
236
236
237
237
sym = nfp_rtsym_lookup (pf -> rtbl , pf_symbol );
238
- if (!sym ) {
239
- nfp_err (pf -> cpp , "Failed to find PF symbol %s\n" , pf_symbol );
238
+ if (!sym )
240
239
return (u8 __iomem * )ERR_PTR (- ENOENT );
241
- }
242
240
243
241
if (sym -> size < min_size ) {
244
242
nfp_err (pf -> cpp , "PF symbol %s too small\n" , pf_symbol );
@@ -486,6 +484,7 @@ nfp_net_pf_app_init(struct nfp_pf *pf, u8 __iomem *qc_bar, unsigned int stride)
486
484
NFP_PF_CSR_SLICE_SIZE ,
487
485
& pf -> ctrl_vnic_bar );
488
486
if (IS_ERR (ctrl_bar )) {
487
+ nfp_err (pf -> cpp , "Failed to find data vNIC memory symbol\n" );
489
488
err = PTR_ERR (ctrl_bar );
490
489
goto err_free ;
491
490
}
@@ -570,18 +569,89 @@ static void nfp_net_pf_app_stop(struct nfp_pf *pf)
570
569
nfp_net_pf_app_stop_ctrl (pf );
571
570
}
572
571
572
+ static void nfp_net_pci_unmap_mem (struct nfp_pf * pf )
573
+ {
574
+ if (pf -> vf_cfg_bar )
575
+ nfp_cpp_area_release_free (pf -> vf_cfg_bar );
576
+ if (pf -> mac_stats_bar )
577
+ nfp_cpp_area_release_free (pf -> mac_stats_bar );
578
+ nfp_cpp_area_release_free (pf -> qc_area );
579
+ nfp_cpp_area_release_free (pf -> data_vnic_bar );
580
+ }
581
+
582
+ static int nfp_net_pci_map_mem (struct nfp_pf * pf )
583
+ {
584
+ u32 ctrl_bar_sz ;
585
+ u8 __iomem * mem ;
586
+ int err ;
587
+
588
+ ctrl_bar_sz = pf -> max_data_vnics * NFP_PF_CSR_SLICE_SIZE ;
589
+ mem = nfp_net_pf_map_rtsym (pf , "net.ctrl" , "_pf%d_net_bar0" ,
590
+ ctrl_bar_sz , & pf -> data_vnic_bar );
591
+ if (IS_ERR (mem )) {
592
+ nfp_err (pf -> cpp , "Failed to find data vNIC memory symbol\n" );
593
+ err = PTR_ERR (mem );
594
+ if (!pf -> fw_loaded && err == - ENOENT )
595
+ err = - EPROBE_DEFER ;
596
+ return err ;
597
+ }
598
+
599
+ pf -> mac_stats_mem = nfp_net_pf_map_rtsym (pf , "net.macstats" ,
600
+ "_mac_stats" ,
601
+ NFP_MAC_STATS_SIZE *
602
+ (pf -> eth_tbl -> max_index + 1 ),
603
+ & pf -> mac_stats_bar );
604
+ if (IS_ERR (pf -> mac_stats_mem )) {
605
+ if (PTR_ERR (pf -> mac_stats_mem ) != - ENOENT ) {
606
+ err = PTR_ERR (pf -> mac_stats_mem );
607
+ goto err_unmap_ctrl ;
608
+ }
609
+ pf -> mac_stats_mem = NULL ;
610
+ }
611
+
612
+ pf -> vf_cfg_mem = nfp_net_pf_map_rtsym (pf , "net.vfcfg" ,
613
+ "_pf%d_net_vf_bar" ,
614
+ NFP_NET_CFG_BAR_SZ *
615
+ pf -> limit_vfs , & pf -> vf_cfg_bar );
616
+ if (IS_ERR (pf -> vf_cfg_mem )) {
617
+ if (PTR_ERR (pf -> vf_cfg_mem ) != - ENOENT ) {
618
+ err = PTR_ERR (pf -> vf_cfg_mem );
619
+ goto err_unmap_mac_stats ;
620
+ }
621
+ pf -> vf_cfg_mem = NULL ;
622
+ }
623
+
624
+ mem = nfp_net_map_area (pf -> cpp , "net.qc" , 0 , 0 ,
625
+ NFP_PCIE_QUEUE (0 ), NFP_QCP_QUEUE_AREA_SZ ,
626
+ & pf -> qc_area );
627
+ if (IS_ERR (mem )) {
628
+ nfp_err (pf -> cpp , "Failed to map Queue Controller area.\n" );
629
+ err = PTR_ERR (mem );
630
+ goto err_unmap_vf_cfg ;
631
+ }
632
+
633
+ return 0 ;
634
+
635
+ err_unmap_vf_cfg :
636
+ if (pf -> vf_cfg_bar )
637
+ nfp_cpp_area_release_free (pf -> vf_cfg_bar );
638
+ err_unmap_mac_stats :
639
+ if (pf -> mac_stats_bar )
640
+ nfp_cpp_area_release_free (pf -> mac_stats_bar );
641
+ err_unmap_ctrl :
642
+ nfp_cpp_area_release_free (pf -> data_vnic_bar );
643
+ return err ;
644
+ }
645
+
573
646
static void nfp_net_pci_remove_finish (struct nfp_pf * pf )
574
647
{
575
648
nfp_net_pf_app_stop (pf );
576
649
/* stop app first, to avoid double free of ctrl vNIC's ddir */
577
650
nfp_net_debugfs_dir_clean (& pf -> ddir );
578
651
579
652
nfp_net_pf_free_irqs (pf );
580
-
581
653
nfp_net_pf_app_clean (pf );
582
-
583
- nfp_cpp_area_release_free (pf -> qc_area );
584
- nfp_cpp_area_release_free (pf -> data_vnic_bar );
654
+ nfp_net_pci_unmap_mem (pf );
585
655
}
586
656
587
657
static int
@@ -706,7 +776,6 @@ int nfp_net_pci_probe(struct nfp_pf *pf)
706
776
{
707
777
struct nfp_net_fw_version fw_ver ;
708
778
u8 __iomem * ctrl_bar , * qc_bar ;
709
- u32 ctrl_bar_sz ;
710
779
int stride ;
711
780
int err ;
712
781
@@ -725,22 +794,23 @@ int nfp_net_pci_probe(struct nfp_pf *pf)
725
794
goto err_unlock ;
726
795
}
727
796
728
- ctrl_bar_sz = pf -> max_data_vnics * NFP_PF_CSR_SLICE_SIZE ;
729
- ctrl_bar = nfp_net_pf_map_rtsym (pf , "net.ctrl" , "_pf%d_net_bar0" ,
730
- ctrl_bar_sz , & pf -> data_vnic_bar );
731
- if (IS_ERR (ctrl_bar )) {
732
- err = PTR_ERR (ctrl_bar );
733
- if (!pf -> fw_loaded && err == - ENOENT )
734
- err = - EPROBE_DEFER ;
797
+ err = nfp_net_pci_map_mem (pf );
798
+ if (err )
735
799
goto err_unlock ;
800
+
801
+ ctrl_bar = nfp_cpp_area_iomem (pf -> data_vnic_bar );
802
+ qc_bar = nfp_cpp_area_iomem (pf -> qc_area );
803
+ if (!ctrl_bar || !qc_bar ) {
804
+ err = - EIO ;
805
+ goto err_unmap ;
736
806
}
737
807
738
808
nfp_net_get_fw_version (& fw_ver , ctrl_bar );
739
809
if (fw_ver .resv || fw_ver .class != NFP_NET_CFG_VERSION_CLASS_GENERIC ) {
740
810
nfp_err (pf -> cpp , "Unknown Firmware ABI %d.%d.%d.%d\n" ,
741
811
fw_ver .resv , fw_ver .class , fw_ver .major , fw_ver .minor );
742
812
err = - EINVAL ;
743
- goto err_ctrl_unmap ;
813
+ goto err_unmap ;
744
814
}
745
815
746
816
/* Determine stride */
@@ -757,23 +827,13 @@ int nfp_net_pci_probe(struct nfp_pf *pf)
757
827
fw_ver .resv , fw_ver .class ,
758
828
fw_ver .major , fw_ver .minor );
759
829
err = - EINVAL ;
760
- goto err_ctrl_unmap ;
830
+ goto err_unmap ;
761
831
}
762
832
}
763
833
764
- /* Map queues */
765
- qc_bar = nfp_net_map_area (pf -> cpp , "net.qc" , 0 , 0 ,
766
- NFP_PCIE_QUEUE (0 ), NFP_QCP_QUEUE_AREA_SZ ,
767
- & pf -> qc_area );
768
- if (IS_ERR (qc_bar )) {
769
- nfp_err (pf -> cpp , "Failed to map Queue Controller area.\n" );
770
- err = PTR_ERR (qc_bar );
771
- goto err_ctrl_unmap ;
772
- }
773
-
774
834
err = nfp_net_pf_app_init (pf , qc_bar , stride );
775
835
if (err )
776
- goto err_unmap_qc ;
836
+ goto err_unmap ;
777
837
778
838
pf -> ddir = nfp_net_debugfs_device_add (pf -> pdev );
779
839
@@ -807,10 +867,8 @@ int nfp_net_pci_probe(struct nfp_pf *pf)
807
867
err_clean_ddir :
808
868
nfp_net_debugfs_dir_clean (& pf -> ddir );
809
869
nfp_net_pf_app_clean (pf );
810
- err_unmap_qc :
811
- nfp_cpp_area_release_free (pf -> qc_area );
812
- err_ctrl_unmap :
813
- nfp_cpp_area_release_free (pf -> data_vnic_bar );
870
+ err_unmap :
871
+ nfp_net_pci_unmap_mem (pf );
814
872
err_unlock :
815
873
mutex_unlock (& pf -> lock );
816
874
cancel_work_sync (& pf -> port_refresh_work );
0 commit comments