diff options
Diffstat (limited to 'drivers/net/myri10ge')
-rw-r--r-- | drivers/net/myri10ge/myri10ge.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/drivers/net/myri10ge/myri10ge.c b/drivers/net/myri10ge/myri10ge.c index 9a68d2ea5f3..b3981ed972b 100644 --- a/drivers/net/myri10ge/myri10ge.c +++ b/drivers/net/myri10ge/myri10ge.c | |||
@@ -556,6 +556,7 @@ static int myri10ge_load_hotplug_firmware(struct myri10ge_priv *mgp, u32 * size) | |||
556 | unsigned crc, reread_crc; | 556 | unsigned crc, reread_crc; |
557 | const struct firmware *fw; | 557 | const struct firmware *fw; |
558 | struct device *dev = &mgp->pdev->dev; | 558 | struct device *dev = &mgp->pdev->dev; |
559 | unsigned char *fw_readback; | ||
559 | struct mcp_gen_header *hdr; | 560 | struct mcp_gen_header *hdr; |
560 | size_t hdr_offset; | 561 | size_t hdr_offset; |
561 | int status; | 562 | int status; |
@@ -598,9 +599,15 @@ static int myri10ge_load_hotplug_firmware(struct myri10ge_priv *mgp, u32 * size) | |||
598 | mb(); | 599 | mb(); |
599 | readb(mgp->sram); | 600 | readb(mgp->sram); |
600 | } | 601 | } |
602 | fw_readback = vmalloc(fw->size); | ||
603 | if (!fw_readback) { | ||
604 | status = -ENOMEM; | ||
605 | goto abort_with_fw; | ||
606 | } | ||
601 | /* corruption checking is good for parity recovery and buggy chipset */ | 607 | /* corruption checking is good for parity recovery and buggy chipset */ |
602 | memcpy_fromio(fw->data, mgp->sram + MYRI10GE_FW_OFFSET, fw->size); | 608 | memcpy_fromio(fw_readback, mgp->sram + MYRI10GE_FW_OFFSET, fw->size); |
603 | reread_crc = crc32(~0, fw->data, fw->size); | 609 | reread_crc = crc32(~0, fw_readback, fw->size); |
610 | vfree(fw_readback); | ||
604 | if (crc != reread_crc) { | 611 | if (crc != reread_crc) { |
605 | dev_err(dev, "CRC failed(fw-len=%u), got 0x%x (expect 0x%x)\n", | 612 | dev_err(dev, "CRC failed(fw-len=%u), got 0x%x (expect 0x%x)\n", |
606 | (unsigned)fw->size, reread_crc, crc); | 613 | (unsigned)fw->size, reread_crc, crc); |