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>
This commit is contained in:
parent
d188ceeb3d
commit
dd8f61d7ff
|
@ -649,6 +649,7 @@ union efx_multicast_hash {
|
||||||
* struct efx_nic - an Efx NIC
|
* struct efx_nic - an Efx NIC
|
||||||
* @name: Device name (net device name or bus id before net device registered)
|
* @name: Device name (net device name or bus id before net device registered)
|
||||||
* @pci_dev: The PCI device
|
* @pci_dev: The PCI device
|
||||||
|
* @port_num: Index of this host port within the controller
|
||||||
* @type: Controller type attributes
|
* @type: Controller type attributes
|
||||||
* @legacy_irq: IRQ number
|
* @legacy_irq: IRQ number
|
||||||
* @workqueue: Workqueue for port reconfigures and the HW monitor.
|
* @workqueue: Workqueue for port reconfigures and the HW monitor.
|
||||||
|
@ -732,6 +733,7 @@ union efx_multicast_hash {
|
||||||
struct efx_nic {
|
struct efx_nic {
|
||||||
char name[IFNAMSIZ];
|
char name[IFNAMSIZ];
|
||||||
struct pci_dev *pci_dev;
|
struct pci_dev *pci_dev;
|
||||||
|
unsigned port_num;
|
||||||
const struct efx_nic_type *type;
|
const struct efx_nic_type *type;
|
||||||
int legacy_irq;
|
int legacy_irq;
|
||||||
struct workqueue_struct *workqueue;
|
struct workqueue_struct *workqueue;
|
||||||
|
@ -834,7 +836,7 @@ static inline const char *efx_dev_name(struct efx_nic *efx)
|
||||||
|
|
||||||
static inline unsigned int efx_port_num(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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -206,6 +206,7 @@ static int siena_probe_nic(struct efx_nic *efx)
|
||||||
{
|
{
|
||||||
struct siena_nic_data *nic_data;
|
struct siena_nic_data *nic_data;
|
||||||
bool already_attached = 0;
|
bool already_attached = 0;
|
||||||
|
efx_oword_t reg;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
/* Allocate storage for hardware specific data */
|
/* Allocate storage for hardware specific data */
|
||||||
|
@ -220,6 +221,9 @@ static int siena_probe_nic(struct efx_nic *efx)
|
||||||
goto fail1;
|
goto fail1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
efx_reado(efx, ®, FR_AZ_CS_DEBUG);
|
||||||
|
efx->port_num = EFX_OWORD_FIELD(reg, FRF_CZ_CS_PORT_NUM) - 1;
|
||||||
|
|
||||||
efx_mcdi_init(efx);
|
efx_mcdi_init(efx);
|
||||||
|
|
||||||
/* Recover from a failed assertion before probing */
|
/* Recover from a failed assertion before probing */
|
||||||
|
|
Loading…
Reference in New Issue