Skip to content

Commit

Permalink
[PATCH] isicom: correct firmware loading
Browse files Browse the repository at this point in the history
- 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>
  • Loading branch information
Jiri Slaby authored and Linus Torvalds committed Oct 1, 2006
1 parent 3f27100 commit e4e0408
Showing 1 changed file with 19 additions and 16 deletions.
35 changes: 19 additions & 16 deletions drivers/char/isicom.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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;

Expand Down

0 comments on commit e4e0408

Please sign in to comment.