aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/sfc/falcon.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/sfc/falcon.c')
-rw-r--r--drivers/net/sfc/falcon.c64
1 files changed, 24 insertions, 40 deletions
diff --git a/drivers/net/sfc/falcon.c b/drivers/net/sfc/falcon.c
index 2e4c71114630..63e6734d8341 100644
--- a/drivers/net/sfc/falcon.c
+++ b/drivers/net/sfc/falcon.c
@@ -2806,40 +2806,6 @@ u32 efx_nic_fpga_ver(struct efx_nic *efx)
2806 return EFX_OWORD_FIELD(altera_build, FRF_AZ_ALTERA_BUILD_VER); 2806 return EFX_OWORD_FIELD(altera_build, FRF_AZ_ALTERA_BUILD_VER);
2807} 2807}
2808 2808
2809/* Probe the NIC variant (revision, ASIC vs FPGA, function count, port
2810 * count, port speed). Set workaround and feature flags accordingly.
2811 */
2812static int falcon_probe_nic_variant(struct efx_nic *efx)
2813{
2814 efx_oword_t nic_stat;
2815
2816 if (efx_nic_fpga_ver(efx) != 0) {
2817 EFX_ERR(efx, "Falcon FPGA not supported\n");
2818 return -ENODEV;
2819 }
2820
2821 efx_reado(efx, &nic_stat, FR_AB_NIC_STAT);
2822
2823 if (efx_nic_rev(efx) <= EFX_REV_FALCON_A1) {
2824 u8 pci_rev = efx->pci_dev->revision;
2825
2826 if ((pci_rev == 0xff) || (pci_rev == 0)) {
2827 EFX_ERR(efx, "Falcon rev A0 not supported\n");
2828 return -ENODEV;
2829 }
2830 if (EFX_OWORD_FIELD(nic_stat, FRF_AB_STRAP_10G) == 0) {
2831 EFX_ERR(efx, "Falcon rev A1 1G not supported\n");
2832 return -ENODEV;
2833 }
2834 if (EFX_OWORD_FIELD(nic_stat, FRF_AA_STRAP_PCIE) == 0) {
2835 EFX_ERR(efx, "Falcon rev A1 PCI-X not supported\n");
2836 return -ENODEV;
2837 }
2838 }
2839
2840 return 0;
2841}
2842
2843/* Probe all SPI devices on the NIC */ 2809/* Probe all SPI devices on the NIC */
2844static void falcon_probe_spi_devices(struct efx_nic *efx) 2810static void falcon_probe_spi_devices(struct efx_nic *efx)
2845{ 2811{
@@ -2891,15 +2857,33 @@ static int falcon_probe_nic(struct efx_nic *efx)
2891 return -ENOMEM; 2857 return -ENOMEM;
2892 efx->nic_data = nic_data; 2858 efx->nic_data = nic_data;
2893 2859
2894 /* Determine number of ports etc. */ 2860 rc = -ENODEV;
2895 rc = falcon_probe_nic_variant(efx); 2861
2896 if (rc) 2862 if (efx_nic_fpga_ver(efx) != 0) {
2863 EFX_ERR(efx, "Falcon FPGA not supported\n");
2897 goto fail1; 2864 goto fail1;
2865 }
2866
2867 if (efx_nic_rev(efx) <= EFX_REV_FALCON_A1) {
2868 efx_oword_t nic_stat;
2869 struct pci_dev *dev;
2870 u8 pci_rev = efx->pci_dev->revision;
2898 2871
2899 /* Probe secondary function if expected */ 2872 if ((pci_rev == 0xff) || (pci_rev == 0)) {
2900 if (efx_nic_is_dual_func(efx)) { 2873 EFX_ERR(efx, "Falcon rev A0 not supported\n");
2901 struct pci_dev *dev = pci_dev_get(efx->pci_dev); 2874 goto fail1;
2875 }
2876 efx_reado(efx, &nic_stat, FR_AB_NIC_STAT);
2877 if (EFX_OWORD_FIELD(nic_stat, FRF_AB_STRAP_10G) == 0) {
2878 EFX_ERR(efx, "Falcon rev A1 1G not supported\n");
2879 goto fail1;
2880 }
2881 if (EFX_OWORD_FIELD(nic_stat, FRF_AA_STRAP_PCIE) == 0) {
2882 EFX_ERR(efx, "Falcon rev A1 PCI-X not supported\n");
2883 goto fail1;
2884 }
2902 2885
2886 dev = pci_dev_get(efx->pci_dev);
2903 while ((dev = pci_get_device(EFX_VENDID_SFC, FALCON_A_S_DEVID, 2887 while ((dev = pci_get_device(EFX_VENDID_SFC, FALCON_A_S_DEVID,
2904 dev))) { 2888 dev))) {
2905 if (dev->bus == efx->pci_dev->bus && 2889 if (dev->bus == efx->pci_dev->bus &&