sfc: track which BAR is mapped
authorEdward Cree <ecree@solarflare.com>
Mon, 29 Jun 2020 13:35:33 +0000 (14:35 +0100)
committerDavid S. Miller <davem@davemloft.net>
Tue, 30 Jun 2020 00:37:49 +0000 (17:37 -0700)
EF100 needs to map multiple BARs (sequentially, not concurrently) in
 order to read the Function Control Window during probe.

Signed-off-by: Edward Cree <ecree@solarflare.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/sfc/efx.c
drivers/net/ethernet/sfc/efx_common.c
drivers/net/ethernet/sfc/efx_common.h
drivers/net/ethernet/sfc/net_driver.h

index 474cfce..86639b1 100644 (file)
@@ -1074,7 +1074,7 @@ static void efx_pci_remove(struct pci_dev *pci_dev)
 
        efx_pci_remove_main(efx);
 
-       efx_fini_io(efx, efx->type->mem_bar(efx));
+       efx_fini_io(efx);
        netif_dbg(efx, drv, efx->net_dev, "shutdown successful\n");
 
        efx_fini_struct(efx);
@@ -1342,7 +1342,7 @@ static int efx_pci_probe(struct pci_dev *pci_dev,
        return 0;
 
  fail3:
-       efx_fini_io(efx, efx->type->mem_bar(efx));
+       efx_fini_io(efx);
  fail2:
        efx_fini_struct(efx);
  fail1:
index 02459d9..36c0ab5 100644 (file)
@@ -953,6 +953,8 @@ int efx_init_struct(struct efx_nic *efx,
        INIT_WORK(&efx->mac_work, efx_mac_work);
        init_waitqueue_head(&efx->flush_wq);
 
+       efx->mem_bar = UINT_MAX;
+
        rc = efx_init_channels(efx);
        if (rc)
                goto fail;
@@ -996,7 +998,9 @@ int efx_init_io(struct efx_nic *efx, int bar, dma_addr_t dma_mask,
        struct pci_dev *pci_dev = efx->pci_dev;
        int rc;
 
-       netif_dbg(efx, probe, efx->net_dev, "initialising I/O\n");
+       efx->mem_bar = UINT_MAX;
+
+       netif_dbg(efx, probe, efx->net_dev, "initialising I/O bar=%d\n", bar);
 
        rc = pci_enable_device(pci_dev);
        if (rc) {
@@ -1038,21 +1042,21 @@ int efx_init_io(struct efx_nic *efx, int bar, dma_addr_t dma_mask,
        rc = pci_request_region(pci_dev, bar, "sfc");
        if (rc) {
                netif_err(efx, probe, efx->net_dev,
-                         "request for memory BAR failed\n");
+                         "request for memory BAR[%d] failed\n", bar);
                rc = -EIO;
                goto fail3;
        }
-
+       efx->mem_bar = bar;
        efx->membase = ioremap(efx->membase_phys, mem_map_size);
        if (!efx->membase) {
                netif_err(efx, probe, efx->net_dev,
-                         "could not map memory BAR at %llx+%x\n",
+                         "could not map memory BAR[%d] at %llx+%x\n", bar,
                          (unsigned long long)efx->membase_phys, mem_map_size);
                rc = -ENOMEM;
                goto fail4;
        }
        netif_dbg(efx, probe, efx->net_dev,
-                 "memory BAR at %llx+%x (virtual %p)\n",
+                 "memory BAR[%d] at %llx+%x (virtual %p)\n", bar,
                  (unsigned long long)efx->membase_phys, mem_map_size,
                  efx->membase);
 
@@ -1068,7 +1072,7 @@ fail1:
        return rc;
 }
 
-void efx_fini_io(struct efx_nic *efx, int bar)
+void efx_fini_io(struct efx_nic *efx)
 {
        netif_dbg(efx, drv, efx->net_dev, "shutting down I/O\n");
 
@@ -1078,8 +1082,9 @@ void efx_fini_io(struct efx_nic *efx, int bar)
        }
 
        if (efx->membase_phys) {
-               pci_release_region(efx->pci_dev, bar);
+               pci_release_region(efx->pci_dev, efx->mem_bar);
                efx->membase_phys = 0;
+               efx->mem_bar = UINT_MAX;
        }
 
        /* Don't disable bus-mastering if VFs are assigned */
index c522a5b..93a017a 100644 (file)
@@ -13,7 +13,7 @@
 
 int efx_init_io(struct efx_nic *efx, int bar, dma_addr_t dma_mask,
                unsigned int mem_map_size);
-void efx_fini_io(struct efx_nic *efx, int bar);
+void efx_fini_io(struct efx_nic *efx);
 int efx_init_struct(struct efx_nic *efx, struct pci_dev *pci_dev,
                    struct net_device *net_dev);
 void efx_fini_struct(struct efx_nic *efx);
index 7bc4d1c..e0b84b2 100644 (file)
@@ -961,6 +961,7 @@ struct efx_async_filter_insertion {
  * @vpd_sn: Serial number read from VPD
  * @xdp_rxq_info_failed: Have any of the rx queues failed to initialise their
  *      xdp_rxq_info structures?
+ * @mem_bar: The BAR that is mapped into membase.
  * @monitor_work: Hardware monitor workitem
  * @biu_lock: BIU (bus interface unit) lock
  * @last_irq_cpu: Last CPU to handle a possible test interrupt.  This
@@ -1137,6 +1138,8 @@ struct efx_nic {
        char *vpd_sn;
        bool xdp_rxq_info_failed;
 
+       unsigned int mem_bar;
+
        /* The following fields may be written more often */
 
        struct delayed_work monitor_work ____cacheline_aligned_in_smp;