sfc: Bind the sfc driver to any available VF's
authorShradha Shah <sshah@solarflare.com>
Wed, 6 May 2015 00:00:07 +0000 (01:00 +0100)
committerDavid S. Miller <davem@davemloft.net>
Sat, 9 May 2015 20:16:48 +0000 (16:16 -0400)
Add the device ID of the VF to the PCI device ID table.

Added a boolean flag is_vf in efx_nic_type to differentiate
between a VF and PF at probe time. This flag is useful in later
patches while setting MAC address specially in the
PCI-passthrough case.

Signed-off-by: Shradha Shah <sshah@solarflare.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/sfc/ef10.c
drivers/net/ethernet/sfc/efx.c
drivers/net/ethernet/sfc/falcon.c
drivers/net/ethernet/sfc/mcdi.c
drivers/net/ethernet/sfc/net_driver.h
drivers/net/ethernet/sfc/siena.c

index 7a67202fb1cb7c85fea55843b0ae3c00964d99a8..882117a43c3a05d7686f13dc783bcb48f8626973 100644 (file)
@@ -3810,6 +3810,7 @@ static int efx_ef10_ptp_set_ts_config(struct efx_nic *efx,
 }
 
 const struct efx_nic_type efx_hunt_a0_vf_nic_type = {
+       .is_vf = true,
        .mem_bar = EFX_MEM_VF_BAR,
        .mem_map_size = efx_ef10_mem_map_size,
        .probe = efx_ef10_probe_vf,
@@ -3907,6 +3908,7 @@ const struct efx_nic_type efx_hunt_a0_vf_nic_type = {
 };
 
 const struct efx_nic_type efx_hunt_a0_nic_type = {
+       .is_vf = false,
        .mem_bar = EFX_MEM_BAR,
        .mem_map_size = efx_ef10_mem_map_size,
        .probe = efx_ef10_probe_pf,
index 706b936ad52d16f9070524f7dda8236d301cda59..0f127a01b5e86d98d19064da6da9a4aaaaa77b05 100644 (file)
@@ -1454,6 +1454,7 @@ static int efx_probe_interrupts(struct efx_nic *efx)
        }
 #endif
        efx->rss_spread = efx->n_rx_channels;
+
        return 0;
 }
 
@@ -2676,6 +2677,8 @@ static const struct pci_device_id efx_pci_table[] = {
         .driver_data = (unsigned long) &siena_a0_nic_type},
        {PCI_DEVICE(PCI_VENDOR_ID_SOLARFLARE, 0x0903),  /* SFC9120 PF */
         .driver_data = (unsigned long) &efx_hunt_a0_nic_type},
+       {PCI_DEVICE(PCI_VENDOR_ID_SOLARFLARE, 0x1903),  /* SFC9120 VF */
+        .driver_data = (unsigned long) &efx_hunt_a0_vf_nic_type},
        {PCI_DEVICE(PCI_VENDOR_ID_SOLARFLARE, 0x0923),  /* SFC9140 PF */
         .driver_data = (unsigned long) &efx_hunt_a0_nic_type},
        {0}                     /* end of list */
@@ -3031,7 +3034,8 @@ static int efx_pci_probe(struct pci_dev *pci_dev,
        netif_info(efx, probe, efx->net_dev,
                   "Solarflare NIC detected\n");
 
-       efx_probe_vpd_strings(efx);
+       if (!efx->type->is_vf)
+               efx_probe_vpd_strings(efx);
 
        /* Set up basic I/O (BAR mappings etc) */
        rc = efx_init_io(efx);
index 3bb1da854b6075cc248f6eca36b781c2cccfa010..80e69af21642620df7607cbd0b2b882032a7abfd 100644 (file)
@@ -2700,6 +2700,7 @@ static int falcon_set_wol(struct efx_nic *efx, u32 type)
  */
 
 const struct efx_nic_type falcon_a1_nic_type = {
+       .is_vf = false,
        .mem_bar = EFX_MEM_BAR,
        .mem_map_size = falcon_a1_mem_map_size,
        .probe = falcon_probe_nic,
@@ -2797,6 +2798,7 @@ const struct efx_nic_type falcon_a1_nic_type = {
 };
 
 const struct efx_nic_type falcon_b0_nic_type = {
+       .is_vf = false,
        .mem_bar = EFX_MEM_BAR,
        .mem_map_size = falcon_b0_mem_map_size,
        .probe = falcon_probe_nic,
index 1ffe289313f16f8e00438ca636fd4a65ca421a55..b44ee31f1a7a765087898be2ff002e6de87ec722 100644 (file)
@@ -1186,16 +1186,6 @@ static int efx_mcdi_drv_attach(struct efx_nic *efx, bool driver_operating,
         * and are completely trusted by firmware.  Abort probing
         * if that's not true for this function.
         */
-       if (driver_operating &&
-           (efx->mcdi->fn_flags &
-            (1 << MC_CMD_DRV_ATTACH_EXT_OUT_FLAG_LINKCTRL |
-             1 << MC_CMD_DRV_ATTACH_EXT_OUT_FLAG_TRUSTED)) !=
-           (1 << MC_CMD_DRV_ATTACH_EXT_OUT_FLAG_LINKCTRL |
-            1 << MC_CMD_DRV_ATTACH_EXT_OUT_FLAG_TRUSTED)) {
-               netif_err(efx, probe, efx->net_dev,
-                         "This driver version only supports one function per port\n");
-               return -ENODEV;
-       }
 
        if (was_attached != NULL)
                *was_attached = MCDI_DWORD(outbuf, DRV_ATTACH_OUT_OLD_STATE);
index 9498a427887df718a18f3c4bea7cf18651e66075..031a3385ad4b647bae2336cc89366cc423077ca8 100644 (file)
@@ -1224,6 +1224,7 @@ struct efx_mtd_partition {
  * @hwtstamp_filters: Mask of hardware timestamp filter types supported
  */
 struct efx_nic_type {
+       bool is_vf;
        unsigned int mem_bar;
        unsigned int (*mem_map_size)(struct efx_nic *efx);
        int (*probe)(struct efx_nic *efx);
index a36ed1b603ed5993e3f04742c8b7ac68bafeb778..8b4130abad669d1dc7d251739d99a48ae45c7b8e 100644 (file)
@@ -917,6 +917,7 @@ fail:
  */
 
 const struct efx_nic_type siena_a0_nic_type = {
+       .is_vf = false,
        .mem_bar = EFX_MEM_BAR,
        .mem_map_size = siena_mem_map_size,
        .probe = siena_probe_nic,