[PATCH] Char: isicom, augment card_reset

isicom, augment card_reset

- add 0xee to signatures
- change long delays to sleeps
- make one sleep shorter not to wait 3s
- portcount == 16 is also correct

Signed-off-by: Jiri Slaby <jirislaby@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Jiri Slaby 2007-02-10 01:44:52 -08:00 committed by Linus Torvalds
parent 174f130767
commit f0a0ba6d69

View File

@ -1510,7 +1510,7 @@ static int __devinit reset_card(struct pci_dev *pdev,
{ {
struct isi_board *board = pci_get_drvdata(pdev); struct isi_board *board = pci_get_drvdata(pdev);
unsigned long base = board->base; unsigned long base = board->base;
unsigned int portcount = 0; unsigned int sig, portcount = 0;
int retval = 0; int retval = 0;
dev_dbg(&pdev->dev, "ISILoad:Resetting Card%d at 0x%lx\n", card + 1, dev_dbg(&pdev->dev, "ISILoad:Resetting Card%d at 0x%lx\n", card + 1,
@ -1518,27 +1518,35 @@ static int __devinit reset_card(struct pci_dev *pdev,
inw(base + 0x8); inw(base + 0x8);
mdelay(10); msleep(10);
outw(0, base + 0x8); /* Reset */ outw(0, base + 0x8); /* Reset */
msleep(3000); msleep(1000);
*signature = inw(base + 0x4) & 0xff; sig = inw(base + 0x4) & 0xff;
portcount = inw(base + 0x2); if (sig != 0xa5 && sig != 0xbb && sig != 0xcc && sig != 0xdd &&
if (!(inw(base + 0xe) & 0x1) || ((portcount != 0) && sig != 0xee) {
(portcount != 4) && (portcount != 8))) { dev_warn(&pdev->dev, "ISILoad:Card%u reset failure (Possible "
dev_dbg(&pdev->dev, "base+0x2=0x%lx, base+0xe=0x%lx\n", "bad I/O Port Address 0x%lx).\n", card + 1, base);
inw(base + 0x2), inw(base + 0xe)); dev_dbg(&pdev->dev, "Sig=0x%x\n", sig);
dev_err(&pdev->dev, "ISILoad:PCI Card%d reset failure "
"(Possible bad I/O Port Address 0x%lx).\n",
card + 1, base);
retval = -EIO; retval = -EIO;
goto end; goto end;
} }
switch (*signature) { msleep(10);
portcount = inw(base + 0x2);
if (!inw(base + 0xe) & 0x1 || (portcount != 0 && portcount != 4 &&
portcount != 8 && portcount != 16)) {
dev_err(&pdev->dev, "ISILoad:PCI Card%d reset failure.",
card + 1);
retval = -EIO;
goto end;
}
switch (sig) {
case 0xa5: case 0xa5:
case 0xbb: case 0xbb:
case 0xdd: case 0xdd:
@ -1546,16 +1554,13 @@ static int __devinit reset_card(struct pci_dev *pdev,
board->shift_count = 12; board->shift_count = 12;
break; break;
case 0xcc: case 0xcc:
case 0xee:
board->port_count = 16; board->port_count = 16;
board->shift_count = 11; board->shift_count = 11;
break; break;
default:
dev_warn(&pdev->dev, "ISILoad:Card%d reset failure (Possible "
"bad I/O Port Address 0x%lx).\n", card + 1, base);
dev_dbg(&pdev->dev, "Sig=0x%lx\n", signature);
retval = -EIO;
} }
dev_info(&pdev->dev, "-Done\n"); dev_info(&pdev->dev, "-Done\n");
*signature = sig;
end: end:
return retval; return retval;