Commit 04300d24 authored by Ben Hutchings's avatar Ben Hutchings Committed by David S. Miller

sfc: Clean up board identification

Remove kluge for development boards with unspecified board type.

Remove assumption of contiguous board type code assignments.
Signed-off-by: default avatarBen Hutchings <bhutchings@solarflare.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 06d5e193
/**************************************************************************** /****************************************************************************
* Driver for Solarflare Solarstorm network controllers and boards * Driver for Solarflare Solarstorm network controllers and boards
* Copyright 2007 Solarflare Communications Inc. * Copyright 2007-2008 Solarflare Communications Inc.
* *
* This program is free software; you can redistribute it and/or modify it * This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 as published * under the terms of the GNU General Public License version 2 as published
...@@ -231,70 +231,38 @@ static int sfe4002_init(struct efx_nic *efx) ...@@ -231,70 +231,38 @@ static int sfe4002_init(struct efx_nic *efx)
/* This will get expanded as board-specific details get moved out of the /* This will get expanded as board-specific details get moved out of the
* PHY drivers. */ * PHY drivers. */
struct efx_board_data { struct efx_board_data {
enum efx_board_type type;
const char *ref_model; const char *ref_model;
const char *gen_type; const char *gen_type;
int (*init) (struct efx_nic *nic); int (*init) (struct efx_nic *nic);
}; };
static int dummy_init(struct efx_nic *nic)
{
return 0;
}
static struct efx_board_data board_data[] = { static struct efx_board_data board_data[] = {
[EFX_BOARD_INVALID] = { EFX_BOARD_SFE4001, "SFE4001", "10GBASE-T adapter", sfe4001_init },
{NULL, NULL, dummy_init}, { EFX_BOARD_SFE4002, "SFE4002", "XFP adapter", sfe4002_init },
[EFX_BOARD_SFE4001] =
{"SFE4001", "10GBASE-T adapter", sfe4001_init},
[EFX_BOARD_SFE4002] =
{"SFE4002", "XFP adapter", sfe4002_init},
}; };
int efx_set_board_info(struct efx_nic *efx, u16 revision_info) void efx_set_board_info(struct efx_nic *efx, u16 revision_info)
{ {
int rc = 0; struct efx_board_data *data = NULL;
struct efx_board_data *data; int i;
if (BOARD_TYPE(revision_info) >= EFX_BOARD_MAX) { efx->board_info.type = BOARD_TYPE(revision_info);
EFX_ERR(efx, "squashing unknown board type %d\n", efx->board_info.major = BOARD_MAJOR(revision_info);
BOARD_TYPE(revision_info)); efx->board_info.minor = BOARD_MINOR(revision_info);
revision_info = 0;
}
if (BOARD_TYPE(revision_info) == 0) {
efx->board_info.major = 0;
efx->board_info.minor = 0;
/* For early boards that don't have revision info. there is
* only 1 board for each PHY type, so we can work it out, with
* the exception of the PHY-less boards. */
switch (efx->phy_type) {
case PHY_TYPE_10XPRESS:
efx->board_info.type = EFX_BOARD_SFE4001;
break;
case PHY_TYPE_XFP:
efx->board_info.type = EFX_BOARD_SFE4002;
break;
default:
efx->board_info.type = 0;
break;
}
} else {
efx->board_info.type = BOARD_TYPE(revision_info);
efx->board_info.major = BOARD_MAJOR(revision_info);
efx->board_info.minor = BOARD_MINOR(revision_info);
}
data = &board_data[efx->board_info.type]; for (i = 0; i < ARRAY_SIZE(board_data); i++)
if (board_data[i].type == efx->board_info.type)
data = &board_data[i];
/* Report the board model number or generic type for recognisable if (data) {
* boards. */
if (efx->board_info.type != 0)
EFX_INFO(efx, "board is %s rev %c%d\n", EFX_INFO(efx, "board is %s rev %c%d\n",
(efx->pci_dev->subsystem_vendor == EFX_VENDID_SFC) (efx->pci_dev->subsystem_vendor == EFX_VENDID_SFC)
? data->ref_model : data->gen_type, ? data->ref_model : data->gen_type,
'A' + efx->board_info.major, efx->board_info.minor); 'A' + efx->board_info.major, efx->board_info.minor);
efx->board_info.init = data->init;
efx->board_info.init = data->init; } else {
EFX_ERR(efx, "unknown board type %d\n", efx->board_info.type);
return rc; }
} }
/**************************************************************************** /****************************************************************************
* Driver for Solarflare Solarstorm network controllers and boards * Driver for Solarflare Solarstorm network controllers and boards
* Copyright 2007 Solarflare Communications Inc. * Copyright 2007-2008 Solarflare Communications Inc.
* *
* This program is free software; you can redistribute it and/or modify it * This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 as published * under the terms of the GNU General Public License version 2 as published
...@@ -12,14 +12,11 @@ ...@@ -12,14 +12,11 @@
/* Board IDs (must fit in 8 bits) */ /* Board IDs (must fit in 8 bits) */
enum efx_board_type { enum efx_board_type {
EFX_BOARD_INVALID = 0,
EFX_BOARD_SFE4001 = 1, /* SFE4001 (10GBASE-T) */ EFX_BOARD_SFE4001 = 1, /* SFE4001 (10GBASE-T) */
EFX_BOARD_SFE4002 = 2, EFX_BOARD_SFE4002 = 2,
/* Insert new types before here */
EFX_BOARD_MAX
}; };
extern int efx_set_board_info(struct efx_nic *efx, u16 revision_info); extern void efx_set_board_info(struct efx_nic *efx, u16 revision_info);
extern int sfe4001_init(struct efx_nic *efx); extern int sfe4001_init(struct efx_nic *efx);
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment