Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e4e04088 authored by Jiri Slaby's avatar Jiri Slaby Committed by Linus Torvalds
Browse files

[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: default avatarJiri Slaby <jirislaby@gmail.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 3f271008
Loading
Loading
Loading
Loading
+19 −16
Original line number Diff line number Diff line
@@ -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++) {
			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;