myri10ge - Write the firmware in 256-bytes chunks
Subsystems (2)
A message that is not in the archive (sent off-list or not yet received): [email protected]
PATCH 1/2 myri10ge - Write the firmware in 256-bytes chunks
When writing the firmware to the NIC, the FIFO is 256-bytes long, so we use 256-bytes chunks and a read to wait until the previous write is done.
Signed-off-by Brice Goglin <[email protected]>
--- drivers/net/myri10ge/myri10ge.c | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-)
drivers/net/myri10ge/myri10ge.c +7 -12
@@ -448,6 +448,7 @@struct mcp_gen_header *hdr;size_t hdr_offset;int status; +unsigned i;if ((status =request_firmware (&fw, mgp->fw_name, dev)) <0 ) { dev_err(dev, "Unable to load %s firmware image via hotplug\n",
@@ -479,18 +480,12 @@ goto abort_with_fw; crc =crc32 (~0 , fw->data, fw->size); -if (mgp->tx.boundary ==2048 ) { -/* Avoid PCI burst on chipset with unaligned completions. */ -int i; -__iomem u32 *ptr = (__iomem u32 *) (mgp->sram + -MYRI10GE_FW_OFFSET ); -for (i =0 ; i < fw->size /4 ; i++) { -__raw_writel (((u32 *) fw->data)[i], ptr + i); -wmb (); - } - }else { -myri10ge_pio_copy (mgp->sram +MYRI10GE_FW_OFFSET , fw->data, - fw->size); +for (i =0 ; i < fw->size; i +=256 ) { +myri10ge_pio_copy (mgp->sram +MYRI10GE_FW_OFFSET + i, + fw->data + i, +min (256U , (unsigned )(fw->size - i))); +mb (); +readb (mgp->sram); }/* corruption checking is good for parity recovery and buggy chipset */ memcpy_fromio (fw->data, mgp->sram +MYRI10GE_FW_OFFSET , fw->size);
applied 1-2
PATCH 2/2 myri10ge - Fix spurious invokations of the watchdog reset handler
In reply to a message not in the archiveFix spurious invocations of the watchdog reset handler.
Signed-off-by Brice Goglin <[email protected]>
--- drivers/net/myri10ge/myri10ge.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/net/myri10ge/myri10ge.c +4 -1
@@ -177,6 +177,7 @@struct work_struct watchdog_work;struct timer_list watchdog_timer;int watchdog_tx_done; +int watchdog_tx_req;int watchdog_resets;int tx_linearized;int pause;
@@ -2536,7 +2537,8 @@ mgp = (struct myri10ge_priv *)arg;if (mgp->tx.req != mgp->tx.done && - mgp->tx.done == mgp->watchdog_tx_done) + mgp->tx.done == mgp->watchdog_tx_done && + mgp->watchdog_tx_req != mgp->watchdog_tx_done)/* nic seems like it might be stuck.. */ schedule_work (&mgp->watchdog_work);else
@@ -2545,6 +2547,7 @@ jiffies + myri10ge_watchdog_timeout * HZ); mgp->watchdog_tx_done = mgp->tx.done; + mgp->watchdog_tx_req = mgp->tx.req; }static int myri10ge_probe (struct pci_dev *pdev,const struct pci_device_id *ent)