Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 134705
b: refs/heads/master
c: b0c2aad
h: refs/heads/master
i:
  134703: fa5858c
v: v3
  • Loading branch information
Ron Mercer authored and David S. Miller committed Feb 27, 2009
1 parent 0bf6efa commit 27bb33c
Show file tree
Hide file tree
Showing 3 changed files with 79 additions and 20 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 125844eaff0e9600c92a753995564fd93c807f3c
refs/heads/master: b0c2aadfa4d2194615ba8f5630be7ae686b9ed01
17 changes: 14 additions & 3 deletions trunk/drivers/net/qlge/qlge.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
} while (0)

#define QLGE_VENDOR_ID 0x1077
#define QLGE_DEVICE_ID 0x8012
#define QLGE_DEVICE_ID_8012 0x8012

#define MAX_CPUS 8
#define MAX_TX_RINGS MAX_CPUS
Expand Down Expand Up @@ -798,7 +798,7 @@ struct mbox_params {
int out_count;
};

struct flash_params {
struct flash_params_8012 {
u8 dev_id_str[4];
__le16 size;
__le16 csum;
Expand All @@ -808,6 +808,9 @@ struct flash_params {
__le16 res;
};

union flash_params {
struct flash_params_8012 flash_params_8012;
};

/*
* doorbell space for the rx ring context
Expand Down Expand Up @@ -1367,6 +1370,12 @@ enum {
CFG_DEFAULT_MAX_FRAME_SIZE = 0x00002580,
};

struct nic_operations {

int (*get_flash) (struct ql_adapter *);
int (*port_initialize) (struct ql_adapter *);
};

/*
* The main Adapter structure definition.
* This structure has all fields relevant to the hardware.
Expand Down Expand Up @@ -1444,14 +1453,16 @@ struct ql_adapter {
u32 port_init;
u32 link_status;

struct flash_params flash;
union flash_params flash;

struct net_device_stats stats;
struct workqueue_struct *q_workqueue;
struct workqueue_struct *workqueue;
struct delayed_work asic_reset_work;
struct delayed_work mpi_reset_work;
struct delayed_work mpi_work;
struct nic_operations *nic_ops;
u16 device_id;
};

/*
Expand Down
80 changes: 64 additions & 16 deletions trunk/drivers/net/qlge/qlge_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ module_param(irq_type, int, MSIX_IRQ);
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)},
{PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, QLGE_DEVICE_ID_8012)},
/* required last entry */
{0,}
};
Expand Down Expand Up @@ -623,6 +623,28 @@ static void ql_enable_all_completion_interrupts(struct ql_adapter *qdev)

}

static int ql_validate_flash(struct ql_adapter *qdev, u32 size, const char *str)
{
int status, i;
u16 csum = 0;
__le16 *flash = (__le16 *)&qdev->flash;

status = strncmp((char *)&qdev->flash, str, 4);
if (status) {
QPRINTK(qdev, IFUP, ERR, "Invalid flash signature.\n");
return status;
}

for (i = 0; i < size; i++)
csum += le16_to_cpu(*flash++);

if (csum)
QPRINTK(qdev, IFUP, ERR,
"Invalid flash checksum, csum = 0x%.04x.\n", csum);

return csum;
}

static int ql_read_flash_word(struct ql_adapter *qdev, int offset, __le32 *data)
{
int status = 0;
Expand All @@ -647,30 +669,50 @@ static int ql_read_flash_word(struct ql_adapter *qdev, int offset, __le32 *data)
return status;
}

static int ql_get_flash_params(struct ql_adapter *qdev)
static int ql_get_8012_flash_params(struct ql_adapter *qdev)
{
int i;
int status;
__le32 *p = (__le32 *)&qdev->flash;
u32 offset = 0;
u32 size = sizeof(struct flash_params_8012) / sizeof(u32);

/* Second function's parameters follow the first
* function's.
*/
if (qdev->func)
offset = sizeof(qdev->flash) / sizeof(u32);
offset = size;

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

for (i = 0; i < sizeof(qdev->flash) / sizeof(u32); i++, p++) {
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_8012) / sizeof(u16),
"8012");
if (status) {
QPRINTK(qdev, IFUP, ERR, "Invalid flash.\n");
status = -EINVAL;
goto exit;
}

if (!is_valid_ether_addr(qdev->flash.flash_params_8012.mac_addr)) {
status = -EINVAL;
goto exit;
}

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

exit:
ql_sem_unlock(qdev, SEM_FLASH_MASK);
return status;
Expand Down Expand Up @@ -747,7 +789,7 @@ int ql_read_xgmac_reg64(struct ql_adapter *qdev, u32 reg, u64 *data)
* This functionality may be done in the MPI firmware at a
* later date.
*/
static int ql_port_initialize(struct ql_adapter *qdev)
static int ql_8012_port_initialize(struct ql_adapter *qdev)
{
int status = 0;
u32 data;
Expand Down Expand Up @@ -2994,11 +3036,12 @@ static int ql_adapter_initialize(struct ql_adapter *qdev)
}
}

status = ql_port_initialize(qdev);
if (status) {
QPRINTK(qdev, IFUP, ERR, "Failed to start port.\n");
return status;
}
/* Initialize the port and set the max framesize. */
status = qdev->nic_ops->port_initialize(qdev);
if (status) {
QPRINTK(qdev, IFUP, ERR, "Failed to start port.\n");
return status;
}

/* Set up the MAC address and frame routing filter. */
status = ql_cam_route_initialize(qdev);
Expand Down Expand Up @@ -3509,6 +3552,12 @@ static void ql_asic_reset_work(struct work_struct *work)
ql_cycle_adapter(qdev);
}

static struct nic_operations qla8012_nic_ops = {
.get_flash = ql_get_8012_flash_params,
.port_initialize = ql_8012_port_initialize,
};


static void ql_get_board_info(struct ql_adapter *qdev)
{
qdev->func =
Expand All @@ -3527,6 +3576,9 @@ static void ql_get_board_info(struct ql_adapter *qdev)
qdev->mailbox_out = PROC_ADDR_MPI_RISC | PROC_ADDR_FUNC0_MBO;
}
qdev->chip_rev_id = ql_read32(qdev, REV_ID);
qdev->device_id = qdev->pdev->device;
if (qdev->device_id == QLGE_DEVICE_ID_8012)
qdev->nic_ops = &qla8012_nic_ops;
}

static void ql_release_all(struct pci_dev *pdev)
Expand Down Expand Up @@ -3619,24 +3671,20 @@ static int __devinit ql_init_device(struct pci_dev *pdev,
goto err_out;
}

ql_get_board_info(qdev);
qdev->ndev = ndev;
qdev->pdev = pdev;
ql_get_board_info(qdev);
qdev->msg_enable = netif_msg_init(debug, default_msg);
spin_lock_init(&qdev->hw_lock);
spin_lock_init(&qdev->stats_lock);

/* make sure the EEPROM is good */
err = ql_get_flash_params(qdev);
err = qdev->nic_ops->get_flash(qdev);
if (err) {
dev_err(&pdev->dev, "Invalid FLASH.\n");
goto err_out;
}

if (!is_valid_ether_addr(qdev->flash.mac_addr))
goto err_out;

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

/* Set up the default ring sizes. */
Expand Down

0 comments on commit 27bb33c

Please sign in to comment.