sfc: Log the part number on probe
During probe of each port, read and log the part number from VPD. Remove the Falcon-specific board name lookup. Initial version by Stuart Hodgson <smhodgson@solarflare.com>. Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
This commit is contained in:
parent
58f7e57d11
commit
460eeaa03c
3 changed files with 53 additions and 17 deletions
|
@ -2497,6 +2497,57 @@ static void efx_pci_remove(struct pci_dev *pci_dev)
|
||||||
free_netdev(efx->net_dev);
|
free_netdev(efx->net_dev);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* NIC VPD information
|
||||||
|
* Called during probe to display the part number of the
|
||||||
|
* installed NIC. VPD is potentially very large but this should
|
||||||
|
* always appear within the first 512 bytes.
|
||||||
|
*/
|
||||||
|
#define SFC_VPD_LEN 512
|
||||||
|
static void efx_print_product_vpd(struct efx_nic *efx)
|
||||||
|
{
|
||||||
|
struct pci_dev *dev = efx->pci_dev;
|
||||||
|
char vpd_data[SFC_VPD_LEN];
|
||||||
|
ssize_t vpd_size;
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
/* Get the vpd data from the device */
|
||||||
|
vpd_size = pci_read_vpd(dev, 0, sizeof(vpd_data), vpd_data);
|
||||||
|
if (vpd_size <= 0) {
|
||||||
|
netif_err(efx, drv, efx->net_dev, "Unable to read VPD\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get the Read only section */
|
||||||
|
i = pci_vpd_find_tag(vpd_data, 0, vpd_size, PCI_VPD_LRDT_RO_DATA);
|
||||||
|
if (i < 0) {
|
||||||
|
netif_err(efx, drv, efx->net_dev, "VPD Read-only not found\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
j = pci_vpd_lrdt_size(&vpd_data[i]);
|
||||||
|
i += PCI_VPD_LRDT_TAG_SIZE;
|
||||||
|
if (i + j > vpd_size)
|
||||||
|
j = vpd_size - i;
|
||||||
|
|
||||||
|
/* Get the Part number */
|
||||||
|
i = pci_vpd_find_info_keyword(vpd_data, i, j, "PN");
|
||||||
|
if (i < 0) {
|
||||||
|
netif_err(efx, drv, efx->net_dev, "Part number not found\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
j = pci_vpd_info_field_size(&vpd_data[i]);
|
||||||
|
i += PCI_VPD_INFO_FLD_HDR_SIZE;
|
||||||
|
if (i + j > vpd_size) {
|
||||||
|
netif_err(efx, drv, efx->net_dev, "Incomplete part number\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
netif_info(efx, drv, efx->net_dev,
|
||||||
|
"Part Number : %.*s\n", j, &vpd_data[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Main body of NIC initialisation
|
/* Main body of NIC initialisation
|
||||||
* This is called at module load (or hotplug insertion, theoretically).
|
* This is called at module load (or hotplug insertion, theoretically).
|
||||||
*/
|
*/
|
||||||
|
@ -2586,6 +2637,8 @@ static int __devinit efx_pci_probe(struct pci_dev *pci_dev,
|
||||||
netif_info(efx, probe, efx->net_dev,
|
netif_info(efx, probe, efx->net_dev,
|
||||||
"Solarflare NIC detected\n");
|
"Solarflare NIC detected\n");
|
||||||
|
|
||||||
|
efx_print_product_vpd(efx);
|
||||||
|
|
||||||
/* Set up basic I/O (BAR mappings etc) */
|
/* Set up basic I/O (BAR mappings etc) */
|
||||||
rc = efx_init_io(efx);
|
rc = efx_init_io(efx);
|
||||||
if (rc)
|
if (rc)
|
||||||
|
|
|
@ -709,8 +709,6 @@ static int sfe4003_init(struct efx_nic *efx)
|
||||||
static const struct falcon_board_type board_types[] = {
|
static const struct falcon_board_type board_types[] = {
|
||||||
{
|
{
|
||||||
.id = FALCON_BOARD_SFE4001,
|
.id = FALCON_BOARD_SFE4001,
|
||||||
.ref_model = "SFE4001",
|
|
||||||
.gen_type = "10GBASE-T adapter",
|
|
||||||
.init = sfe4001_init,
|
.init = sfe4001_init,
|
||||||
.init_phy = efx_port_dummy_op_void,
|
.init_phy = efx_port_dummy_op_void,
|
||||||
.fini = sfe4001_fini,
|
.fini = sfe4001_fini,
|
||||||
|
@ -719,8 +717,6 @@ static const struct falcon_board_type board_types[] = {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.id = FALCON_BOARD_SFE4002,
|
.id = FALCON_BOARD_SFE4002,
|
||||||
.ref_model = "SFE4002",
|
|
||||||
.gen_type = "XFP adapter",
|
|
||||||
.init = sfe4002_init,
|
.init = sfe4002_init,
|
||||||
.init_phy = sfe4002_init_phy,
|
.init_phy = sfe4002_init_phy,
|
||||||
.fini = efx_fini_lm87,
|
.fini = efx_fini_lm87,
|
||||||
|
@ -729,8 +725,6 @@ static const struct falcon_board_type board_types[] = {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.id = FALCON_BOARD_SFE4003,
|
.id = FALCON_BOARD_SFE4003,
|
||||||
.ref_model = "SFE4003",
|
|
||||||
.gen_type = "10GBASE-CX4 adapter",
|
|
||||||
.init = sfe4003_init,
|
.init = sfe4003_init,
|
||||||
.init_phy = sfe4003_init_phy,
|
.init_phy = sfe4003_init_phy,
|
||||||
.fini = efx_fini_lm87,
|
.fini = efx_fini_lm87,
|
||||||
|
@ -739,8 +733,6 @@ static const struct falcon_board_type board_types[] = {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.id = FALCON_BOARD_SFN4112F,
|
.id = FALCON_BOARD_SFN4112F,
|
||||||
.ref_model = "SFN4112F",
|
|
||||||
.gen_type = "SFP+ adapter",
|
|
||||||
.init = sfn4112f_init,
|
.init = sfn4112f_init,
|
||||||
.init_phy = sfn4112f_init_phy,
|
.init_phy = sfn4112f_init_phy,
|
||||||
.fini = efx_fini_lm87,
|
.fini = efx_fini_lm87,
|
||||||
|
@ -763,11 +755,6 @@ int falcon_probe_board(struct efx_nic *efx, u16 revision_info)
|
||||||
board->type = &board_types[i];
|
board->type = &board_types[i];
|
||||||
|
|
||||||
if (board->type) {
|
if (board->type) {
|
||||||
netif_info(efx, probe, efx->net_dev, "board is %s rev %c%d\n",
|
|
||||||
(efx->pci_dev->subsystem_vendor ==
|
|
||||||
PCI_VENDOR_ID_SOLARFLARE)
|
|
||||||
? board->type->ref_model : board->type->gen_type,
|
|
||||||
'A' + board->major, board->minor);
|
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
netif_err(efx, probe, efx->net_dev, "unknown board type %d\n",
|
netif_err(efx, probe, efx->net_dev, "unknown board type %d\n",
|
||||||
|
|
|
@ -69,8 +69,6 @@ enum {
|
||||||
/**
|
/**
|
||||||
* struct falcon_board_type - board operations and type information
|
* struct falcon_board_type - board operations and type information
|
||||||
* @id: Board type id, as found in NVRAM
|
* @id: Board type id, as found in NVRAM
|
||||||
* @ref_model: Model number of Solarflare reference design
|
|
||||||
* @gen_type: Generic board type description
|
|
||||||
* @init: Allocate resources and initialise peripheral hardware
|
* @init: Allocate resources and initialise peripheral hardware
|
||||||
* @init_phy: Do board-specific PHY initialisation
|
* @init_phy: Do board-specific PHY initialisation
|
||||||
* @fini: Shut down hardware and free resources
|
* @fini: Shut down hardware and free resources
|
||||||
|
@ -79,8 +77,6 @@ enum {
|
||||||
*/
|
*/
|
||||||
struct falcon_board_type {
|
struct falcon_board_type {
|
||||||
u8 id;
|
u8 id;
|
||||||
const char *ref_model;
|
|
||||||
const char *gen_type;
|
|
||||||
int (*init) (struct efx_nic *nic);
|
int (*init) (struct efx_nic *nic);
|
||||||
void (*init_phy) (struct efx_nic *efx);
|
void (*init_phy) (struct efx_nic *efx);
|
||||||
void (*fini) (struct efx_nic *nic);
|
void (*fini) (struct efx_nic *nic);
|
||||||
|
|
Loading…
Reference in a new issue