summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJiri Slaby <jirislaby@gmail.com>2006-09-30 23:27:50 -0700
committerLinus Torvalds <torvalds@g5.osdl.org>2006-10-01 00:39:22 -0700
commite4e040887b8f136d00e253dcf584667d8cd560a6 (patch)
tree70672802a7ace7663f6d785845a30418ee3ff305
parent3f27100872b21e4cc70d07b96eeb3611b30bce63 (diff)
downloadlinux-e4e040887b8f136d00e253dcf584667d8cd560a6.tar.gz
linux-e4e040887b8f136d00e253dcf584667d8cd560a6.tar.bz2
linux-e4e040887b8f136d00e253dcf584667d8cd560a6.zip
[PATCH] isicom: correct firmware loading
- loading of firmware didn't fail when something went wrong (returned 0). - pointer to frame was incremented only by sizeof(frame) excluding its data contents -- bad idea. - tell the card we're ready just after checking is complete, not before. Signed-off-by: Jiri Slaby <jirislaby@gmail.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--drivers/char/isicom.c35
1 files changed, 19 insertions, 16 deletions
diff --git a/drivers/char/isicom.c b/drivers/char/isicom.c
index 913be23e0a24..2e1da632aee1 100644
--- a/drivers/char/isicom.c
+++ b/drivers/char/isicom.c
@@ -1756,9 +1756,12 @@ static int __devinit load_firmware(struct pci_dev *pdev,
if (retval)
goto end;
+ retval = -EIO;
+
for (frame = (struct stframe *)fw->data;
frame < (struct stframe *)(fw->data + fw->size);
- frame++) {
+ frame = (struct stframe *)((u8 *)(frame + 1) +
+ frame->count)) {
if (WaitTillCardIsFree(base))
goto errrelfw;
@@ -1797,23 +1800,12 @@ static int __devinit load_firmware(struct pci_dev *pdev,
}
}
- retval = -EIO;
-
- if (WaitTillCardIsFree(base))
- goto errrelfw;
-
- outw(0xf2, base);
- outw(0x800, base);
- outw(0x0, base);
- outw(0x0, base);
- InterruptTheCard(base);
- outw(0x0, base + 0x4); /* for ISI4608 cards */
-
/* XXX: should we test it by reading it back and comparing with original like
* in load firmware package? */
- for (frame = (struct stframe*)fw->data;
- frame < (struct stframe*)(fw->data + fw->size);
- frame++) {
+ for (frame = (struct stframe *)fw->data;
+ frame < (struct stframe *)(fw->data + fw->size);
+ frame = (struct stframe *)((u8 *)(frame + 1) +
+ frame->count)) {
if (WaitTillCardIsFree(base))
goto errrelfw;
@@ -1863,6 +1855,17 @@ static int __devinit load_firmware(struct pci_dev *pdev,
}
}
+ /* xfer ctrl */
+ if (WaitTillCardIsFree(base))
+ goto errrelfw;
+
+ outw(0xf2, base);
+ outw(0x800, base);
+ outw(0x0, base);
+ outw(0x0, base);
+ InterruptTheCard(base);
+ outw(0x0, base + 0x4); /* for ISI4608 cards */
+
board->status |= FIRMWARE_LOADED;
retval = 0;