Commit f0a0ba6d authored by Jiri Slaby's avatar Jiri Slaby Committed by Linus Torvalds

[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: default avatarJiri Slaby <jirislaby@gmail.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 174f1307
...@@ -1510,7 +1510,7 @@ static int __devinit reset_card(struct pci_dev *pdev, ...@@ -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, ...@@ -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;
if (sig != 0xa5 && sig != 0xbb && sig != 0xcc && sig != 0xdd &&
sig != 0xee) {
dev_warn(&pdev->dev, "ISILoad:Card%u reset failure (Possible "
"bad I/O Port Address 0x%lx).\n", card + 1, base);
dev_dbg(&pdev->dev, "Sig=0x%x\n", sig);
retval = -EIO;
goto end;
}
msleep(10);
portcount = inw(base + 0x2); portcount = inw(base + 0x2);
if (!(inw(base + 0xe) & 0x1) || ((portcount != 0) && if (!inw(base + 0xe) & 0x1 || (portcount != 0 && portcount != 4 &&
(portcount != 4) && (portcount != 8))) { portcount != 8 && portcount != 16)) {
dev_dbg(&pdev->dev, "base+0x2=0x%lx, base+0xe=0x%lx\n", dev_err(&pdev->dev, "ISILoad:PCI Card%d reset failure.",
inw(base + 0x2), inw(base + 0xe)); card + 1);
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) { 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, ...@@ -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;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment