Skip to content

Commit

Permalink
sfc: Get port number from CS_PORT_NUM, not PCI function number
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Ben Hutchings authored and David S. Miller committed Jun 3, 2010
1 parent fbc2e7d commit d42a8f4
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 1 deletion.
4 changes: 3 additions & 1 deletion drivers/net/sfc/net_driver.h
Original file line number Diff line number Diff line change
Expand Up @@ -645,6 +645,7 @@ union efx_multicast_hash {
* struct efx_nic - an Efx NIC
* @name: Device name (net device name or bus id before net device registered)
* @pci_dev: The PCI device
* @port_num: Index of this host port within the controller
* @type: Controller type attributes
* @legacy_irq: IRQ number
* @workqueue: Workqueue for port reconfigures and the HW monitor.
Expand Down Expand Up @@ -728,6 +729,7 @@ union efx_multicast_hash {
struct efx_nic {
char name[IFNAMSIZ];
struct pci_dev *pci_dev;
unsigned port_num;
const struct efx_nic_type *type;
int legacy_irq;
struct workqueue_struct *workqueue;
Expand Down Expand Up @@ -830,7 +832,7 @@ static inline const char *efx_dev_name(struct efx_nic *efx)

static inline unsigned int efx_port_num(struct efx_nic *efx)
{
return PCI_FUNC(efx->pci_dev->devfn);
return efx->port_num;
}

/**
Expand Down
4 changes: 4 additions & 0 deletions drivers/net/sfc/siena.c
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,7 @@ static int siena_probe_nic(struct efx_nic *efx)
{
struct siena_nic_data *nic_data;
bool already_attached = 0;
efx_oword_t reg;
int rc;

/* Allocate storage for hardware specific data */
Expand All @@ -220,6 +221,9 @@ static int siena_probe_nic(struct efx_nic *efx)
goto fail1;
}

efx_reado(efx, &reg, FR_AZ_CS_DEBUG);
efx->port_num = EFX_OWORD_FIELD(reg, FRF_CZ_CS_PORT_NUM) - 1;

efx_mcdi_init(efx);

/* Recover from a failed assertion before probing */
Expand Down

0 comments on commit d42a8f4

Please sign in to comment.