Skip to content

Commit

Permalink
qlge: Add support for device ID 8000.
Browse files Browse the repository at this point in the history
This device has more firmware support for link management, setting
TX and RX maximum frame sizes.

Signed-off-by: Ron Mercer <ron.mercer@qlogic.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Ron Mercer authored and David S. Miller committed Mar 3, 2009
1 parent ca0413b commit cdca8d0
Show file tree
Hide file tree
Showing 2 changed files with 100 additions and 1 deletion.
37 changes: 36 additions & 1 deletion drivers/net/qlge/qlge.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@

#define QLGE_VENDOR_ID 0x1077
#define QLGE_DEVICE_ID_8012 0x8012

#define QLGE_DEVICE_ID_8000 0x8000
#define MAX_CPUS 8
#define MAX_TX_RINGS MAX_CPUS
#define MAX_RX_RINGS ((MAX_CPUS * 2) + 1)
Expand Down Expand Up @@ -808,8 +808,42 @@ struct flash_params_8012 {
__le16 res;
};

/* 8000 device's flash is a different structure
* at a different offset in flash.
*/
#define FUNC0_FLASH_OFFSET 0x140200
#define FUNC1_FLASH_OFFSET 0x140600

/* Flash related data structures. */
struct flash_params_8000 {
u8 dev_id_str[4]; /* "8000" */
__le16 ver;
__le16 size;
__le16 csum;
__le16 reserved0;
__le16 total_size;
__le16 entry_count;
u8 data_type0;
u8 data_size0;
u8 mac_addr[6];
u8 data_type1;
u8 data_size1;
u8 mac_addr1[6];
u8 data_type2;
u8 data_size2;
__le16 vlan_id;
u8 data_type3;
u8 data_size3;
__le16 last;
u8 reserved1[464];
__le16 subsys_ven_id;
__le16 subsys_dev_id;
u8 reserved2[4];
};

union flash_params {
struct flash_params_8012 flash_params_8012;
struct flash_params_8000 flash_params_8000;
};

/*
Expand Down Expand Up @@ -1535,6 +1569,7 @@ void ql_queue_asic_error(struct ql_adapter *qdev);
u32 ql_enable_completion_interrupt(struct ql_adapter *qdev, u32 intr);
void ql_set_ethtool_ops(struct net_device *ndev);
int ql_read_xgmac_reg64(struct ql_adapter *qdev, u32 reg, u64 *data);
int ql_mb_get_fw_state(struct ql_adapter *qdev);

#if 1
#define QL_ALL_DUMP
Expand Down
64 changes: 64 additions & 0 deletions drivers/net/qlge/qlge_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ MODULE_PARM_DESC(irq_type, "0 = MSI-X, 1 = MSI, 2 = Legacy.");

static struct pci_device_id qlge_pci_tbl[] __devinitdata = {
{PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, QLGE_DEVICE_ID_8012)},
{PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, QLGE_DEVICE_ID_8000)},
/* required last entry */
{0,}
};
Expand Down Expand Up @@ -669,6 +670,57 @@ static int ql_read_flash_word(struct ql_adapter *qdev, int offset, __le32 *data)
return status;
}

static int ql_get_8000_flash_params(struct ql_adapter *qdev)
{
u32 i, size;
int status;
__le32 *p = (__le32 *)&qdev->flash;
u32 offset;

/* Get flash offset for function and adjust
* for dword access.
*/
if (!qdev->func)
offset = FUNC0_FLASH_OFFSET / sizeof(u32);
else
offset = FUNC1_FLASH_OFFSET / sizeof(u32);

if (ql_sem_spinlock(qdev, SEM_FLASH_MASK))
return -ETIMEDOUT;

size = sizeof(struct flash_params_8000) / sizeof(u32);
for (i = 0; i < size; i++, p++) {
status = ql_read_flash_word(qdev, i+offset, p);
if (status) {
QPRINTK(qdev, IFUP, ERR, "Error reading flash.\n");
goto exit;
}
}

status = ql_validate_flash(qdev,
sizeof(struct flash_params_8000) / sizeof(u16),
"8000");
if (status) {
QPRINTK(qdev, IFUP, ERR, "Invalid flash.\n");
status = -EINVAL;
goto exit;
}

if (!is_valid_ether_addr(qdev->flash.flash_params_8000.mac_addr)) {
QPRINTK(qdev, IFUP, ERR, "Invalid MAC address.\n");
status = -EINVAL;
goto exit;
}

memcpy(qdev->ndev->dev_addr,
qdev->flash.flash_params_8000.mac_addr,
qdev->ndev->addr_len);

exit:
ql_sem_unlock(qdev, SEM_FLASH_MASK);
return status;
}

static int ql_get_8012_flash_params(struct ql_adapter *qdev)
{
int i;
Expand Down Expand Up @@ -783,6 +835,11 @@ int ql_read_xgmac_reg64(struct ql_adapter *qdev, u32 reg, u64 *data)
return status;
}

static int ql_8000_port_initialize(struct ql_adapter *qdev)
{
return ql_mb_get_fw_state(qdev);
}

/* Take the MAC Core out of reset.
* Enable statistics counting.
* Take the transmitter/receiver out of reset.
Expand Down Expand Up @@ -3557,6 +3614,11 @@ static struct nic_operations qla8012_nic_ops = {
.port_initialize = ql_8012_port_initialize,
};

static struct nic_operations qla8000_nic_ops = {
.get_flash = ql_get_8000_flash_params,
.port_initialize = ql_8000_port_initialize,
};


static void ql_get_board_info(struct ql_adapter *qdev)
{
Expand All @@ -3579,6 +3641,8 @@ static void ql_get_board_info(struct ql_adapter *qdev)
qdev->device_id = qdev->pdev->device;
if (qdev->device_id == QLGE_DEVICE_ID_8012)
qdev->nic_ops = &qla8012_nic_ops;
else if (qdev->device_id == QLGE_DEVICE_ID_8000)
qdev->nic_ops = &qla8000_nic_ops;
}

static void ql_release_all(struct pci_dev *pdev)
Expand Down

0 comments on commit cdca8d0

Please sign in to comment.