aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/sfc
diff options
context:
space:
mode:
authorBen Hutchings <bhutchings@solarflare.com>2010-06-01 07:32:43 -0400
committerDavid S. Miller <davem@davemloft.net>2010-06-03 06:27:56 -0400
commitd42a8f464ba14467e5d45dc0eb8f789c82bd0679 (patch)
tree5c5b597786a8fa05f38cccb856171f0f8abee031 /drivers/net/sfc
parentfbc2e7d9cf49e0bf89b9e91fd60a06851a855c5d (diff)
sfc: Get port number from CS_PORT_NUM, not PCI function number
A single shared memory region used to communicate with firmware is mapped into both PCI PFs of the SFC9020 and SFL9021. Drivers must be able to identify which port they are addressing in order to use the correct sub-region. Currently we use the PCI function number, but the PCI address may be virtualised. Use the CS_PORT_NUM register field defined for just this purpose. Signed-off-by: Ben Hutchings <bhutchings@solarflare.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/sfc')
-rw-r--r--drivers/net/sfc/net_driver.h4
-rw-r--r--drivers/net/sfc/siena.c4
2 files changed, 7 insertions, 1 deletions
diff --git a/drivers/net/sfc/net_driver.h b/drivers/net/sfc/net_driver.h
index 2e6fd89f2a72..5fffd9abffde 100644
--- a/drivers/net/sfc/net_driver.h
+++ b/drivers/net/sfc/net_driver.h
@@ -645,6 +645,7 @@ union efx_multicast_hash {
645 * struct efx_nic - an Efx NIC 645 * struct efx_nic - an Efx NIC
646 * @name: Device name (net device name or bus id before net device registered) 646 * @name: Device name (net device name or bus id before net device registered)
647 * @pci_dev: The PCI device 647 * @pci_dev: The PCI device
648 * @port_num: Index of this host port within the controller
648 * @type: Controller type attributes 649 * @type: Controller type attributes
649 * @legacy_irq: IRQ number 650 * @legacy_irq: IRQ number
650 * @workqueue: Workqueue for port reconfigures and the HW monitor. 651 * @workqueue: Workqueue for port reconfigures and the HW monitor.
@@ -728,6 +729,7 @@ union efx_multicast_hash {
728struct efx_nic { 729struct efx_nic {
729 char name[IFNAMSIZ]; 730 char name[IFNAMSIZ];
730 struct pci_dev *pci_dev; 731 struct pci_dev *pci_dev;
732 unsigned port_num;
731 const struct efx_nic_type *type; 733 const struct efx_nic_type *type;
732 int legacy_irq; 734 int legacy_irq;
733 struct workqueue_struct *workqueue; 735 struct workqueue_struct *workqueue;
@@ -830,7 +832,7 @@ static inline const char *efx_dev_name(struct efx_nic *efx)
830 832
831static inline unsigned int efx_port_num(struct efx_nic *efx) 833static inline unsigned int efx_port_num(struct efx_nic *efx)
832{ 834{
833 return PCI_FUNC(efx->pci_dev->devfn); 835 return efx->port_num;
834} 836}
835 837
836/** 838/**
diff --git a/drivers/net/sfc/siena.c b/drivers/net/sfc/siena.c
index 727b4228e081..7ecd255a7cc0 100644
--- a/drivers/net/sfc/siena.c
+++ b/drivers/net/sfc/siena.c
@@ -206,6 +206,7 @@ static int siena_probe_nic(struct efx_nic *efx)
206{ 206{
207 struct siena_nic_data *nic_data; 207 struct siena_nic_data *nic_data;
208 bool already_attached = 0; 208 bool already_attached = 0;
209 efx_oword_t reg;
209 int rc; 210 int rc;
210 211
211 /* Allocate storage for hardware specific data */ 212 /* Allocate storage for hardware specific data */
@@ -220,6 +221,9 @@ static int siena_probe_nic(struct efx_nic *efx)
220 goto fail1; 221 goto fail1;
221 } 222 }
222 223
224 efx_reado(efx, &reg, FR_AZ_CS_DEBUG);
225 efx->port_num = EFX_OWORD_FIELD(reg, FRF_CZ_CS_PORT_NUM) - 1;
226
223 efx_mcdi_init(efx); 227 efx_mcdi_init(efx);
224 228
225 /* Recover from a failed assertion before probing */ 229 /* Recover from a failed assertion before probing */