aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/myri10ge
diff options
context:
space:
mode:
authorDavid Woodhouse <dwmw2@infradead.org>2008-05-23 19:00:07 -0400
committerDavid Woodhouse <David.Woodhouse@intel.com>2008-07-10 09:26:04 -0400
commitb0d31d6b28c7ca2ed78ce16ec649c0aac383a3fe (patch)
treef36544d409c95b0bf3fb7292f4a8f00c134d87eb /drivers/net/myri10ge
parent9ad46a6ac5422882d9f9a7f0d77ca0766f56bb6e (diff)
myri10ge: treat firmware data as const
... which means allocating our own buffer for reading it back. Signed-off-by: David Woodhouse <dwmw2@infradead.org>
Diffstat (limited to 'drivers/net/myri10ge')
-rw-r--r--drivers/net/myri10ge/myri10ge.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/drivers/net/myri10ge/myri10ge.c b/drivers/net/myri10ge/myri10ge.c
index e0d76c75aea0..823bb6d35334 100644
--- a/drivers/net/myri10ge/myri10ge.c
+++ b/drivers/net/myri10ge/myri10ge.c
@@ -529,6 +529,7 @@ static int myri10ge_load_hotplug_firmware(struct myri10ge_priv *mgp, u32 * size)
529 unsigned crc, reread_crc; 529 unsigned crc, reread_crc;
530 const struct firmware *fw; 530 const struct firmware *fw;
531 struct device *dev = &mgp->pdev->dev; 531 struct device *dev = &mgp->pdev->dev;
532 unsigned char *fw_readback;
532 struct mcp_gen_header *hdr; 533 struct mcp_gen_header *hdr;
533 size_t hdr_offset; 534 size_t hdr_offset;
534 int status; 535 int status;
@@ -571,9 +572,15 @@ static int myri10ge_load_hotplug_firmware(struct myri10ge_priv *mgp, u32 * size)
571 mb(); 572 mb();
572 readb(mgp->sram); 573 readb(mgp->sram);
573 } 574 }
575 fw_readback = vmalloc(fw->size);
576 if (!fw_readback) {
577 status = -ENOMEM;
578 goto abort_with_fw;
579 }
574 /* corruption checking is good for parity recovery and buggy chipset */ 580 /* corruption checking is good for parity recovery and buggy chipset */
575 memcpy_fromio(fw->data, mgp->sram + MYRI10GE_FW_OFFSET, fw->size); 581 memcpy_fromio(fw_readback, mgp->sram + MYRI10GE_FW_OFFSET, fw->size);
576 reread_crc = crc32(~0, fw->data, fw->size); 582 reread_crc = crc32(~0, fw_readback, fw->size);
583 vfree(fw_readback);
577 if (crc != reread_crc) { 584 if (crc != reread_crc) {
578 dev_err(dev, "CRC failed(fw-len=%u), got 0x%x (expect 0x%x)\n", 585 dev_err(dev, "CRC failed(fw-len=%u), got 0x%x (expect 0x%x)\n",
579 (unsigned)fw->size, reread_crc, crc); 586 (unsigned)fw->size, reread_crc, crc);