Commit 197fb8d8 authored by Ondrej Zary's avatar Ondrej Zary Committed by Martin K. Petersen

atp870u: Add wide_chip parameter to is870() and is885()

Don't check chip_ver in is870() but add wide_chip parameter for that.
Then add the non-wide support to is885().
Signed-off-by: default avatarOndrej Zary <linux@rainbow-software.org>
Reviewed-by: default avatarHannes Reinicke <hare@suse.de>
Acked-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent e7d6d140
...@@ -41,7 +41,7 @@ ...@@ -41,7 +41,7 @@
static struct scsi_host_template atp870u_template; static struct scsi_host_template atp870u_template;
static void send_s870(struct atp_unit *dev,unsigned char c); static void send_s870(struct atp_unit *dev,unsigned char c);
static void is885(struct atp_unit *dev, unsigned char c, unsigned char lvdmode); static void is885(struct atp_unit *dev, unsigned char c, bool wide_chip, unsigned char lvdmode);
static void tscam_885(void); static void tscam_885(void);
static inline void atp_writeb_base(struct atp_unit *atp, u8 reg, u8 val) static inline void atp_writeb_base(struct atp_unit *atp, u8 reg, u8 val)
...@@ -1162,7 +1162,7 @@ static void tscam(struct Scsi_Host *host) ...@@ -1162,7 +1162,7 @@ static void tscam(struct Scsi_Host *host)
} }
} }
static void is870(struct atp_unit *dev, unsigned char c) static void is870(struct atp_unit *dev, unsigned char c, bool wide_chip)
{ {
unsigned char i, j, k, rmb, n; unsigned char i, j, k, rmb, n;
unsigned short int m; unsigned short int m;
...@@ -1177,9 +1177,8 @@ static void is870(struct atp_unit *dev, unsigned char c) ...@@ -1177,9 +1177,8 @@ static void is870(struct atp_unit *dev, unsigned char c)
atp_writeb_io(dev, c, 0x3a, atp_readb_io(dev, c, 0x3a) | 0x10); atp_writeb_io(dev, c, 0x3a, atp_readb_io(dev, c, 0x3a) | 0x10);
for (i = 0; i < 16; i++) { for (i = 0; i < 16; i++) {
if ((dev->chip_ver != 4) && (i > 7)) { if (!wide_chip && (i > 7))
break; break;
}
m = 1; m = 1;
m = m << i; m = m << i;
if ((m & dev->active_id[c]) != 0) { if ((m & dev->active_id[c]) != 0) {
...@@ -1189,11 +1188,7 @@ static void is870(struct atp_unit *dev, unsigned char c) ...@@ -1189,11 +1188,7 @@ static void is870(struct atp_unit *dev, unsigned char c)
printk(KERN_INFO " ID: %2d Host Adapter\n", dev->host_id[c]); printk(KERN_INFO " ID: %2d Host Adapter\n", dev->host_id[c]);
continue; continue;
} }
if (dev->chip_ver == 4) { atp_writeb_io(dev, c, 0x1b, wide_chip ? 0x01 : 0x00);
atp_writeb_io(dev, c, 0x1b, 0x01);
} else {
atp_writeb_io(dev, c, 0x1b, 0x00);
}
atp_writeb_io(dev, c, 1, 0x08); atp_writeb_io(dev, c, 1, 0x08);
atp_writeb_io(dev, c, 2, 0x7f); atp_writeb_io(dev, c, 2, 0x7f);
atp_writeb_io(dev, c, 3, satn[0]); atp_writeb_io(dev, c, 3, satn[0]);
...@@ -1262,7 +1257,7 @@ sel_ok: ...@@ -1262,7 +1257,7 @@ sel_ok:
while (atp_readb_io(dev, c, 0x17) != 0x8e) while (atp_readb_io(dev, c, 0x17) != 0x8e)
cpu_relax(); cpu_relax();
if (dev->chip_ver == 4) if (wide_chip)
atp_writeb_io(dev, c, 0x1b, 0x00); atp_writeb_io(dev, c, 0x1b, 0x00);
atp_writeb_io(dev, c, 0x18, 0x08); atp_writeb_io(dev, c, 0x18, 0x08);
...@@ -1298,9 +1293,8 @@ inq_ok: ...@@ -1298,9 +1293,8 @@ inq_ok:
dev->id[c][i].devtype = mbuf[0]; dev->id[c][i].devtype = mbuf[0];
rmb = mbuf[1]; rmb = mbuf[1];
n = mbuf[7]; n = mbuf[7];
if (dev->chip_ver != 4) { if (!wide_chip)
goto not_wide; goto not_wide;
}
if ((mbuf[7] & 0x60) == 0) { if ((mbuf[7] & 0x60) == 0) {
goto not_wide; goto not_wide;
} }
...@@ -1807,7 +1801,7 @@ flash_ok_880: ...@@ -1807,7 +1801,7 @@ flash_ok_880:
outb(0x20, base_io + 0x51); outb(0x20, base_io + 0x51);
tscam(shpnt); tscam(shpnt);
is885(p, 0, atp_readb_base(p, 0x3f) & 0x40); is885(p, 0, true, atp_readb_base(p, 0x3f) & 0x40);
outb(0xb0, base_io + 0x38); outb(0xb0, base_io + 0x38);
shpnt->max_id = 16; shpnt->max_id = 16;
shpnt->this_id = host_id; shpnt->this_id = host_id;
...@@ -1953,10 +1947,10 @@ flash_ok_885: ...@@ -1953,10 +1947,10 @@ flash_ok_885:
tscam_885(); tscam_885();
printk(KERN_INFO " Scanning Channel A SCSI Device ...\n"); printk(KERN_INFO " Scanning Channel A SCSI Device ...\n");
is885(p, 0, atp_readb_io(p, 0, 0x1b) >> 7); is885(p, 0, true, atp_readb_io(p, 0, 0x1b) >> 7);
atp_writeb_io(p, 0, 0x16, 0x80); atp_writeb_io(p, 0, 0x16, 0x80);
printk(KERN_INFO " Scanning Channel B SCSI Device ...\n"); printk(KERN_INFO " Scanning Channel B SCSI Device ...\n");
is885(p, 1, atp_readb_io(p, 1, 0x1b) >> 7); is885(p, 1, true, atp_readb_io(p, 1, 0x1b) >> 7);
atp_writeb_io(p, 1, 0x16, 0x80); atp_writeb_io(p, 1, 0x16, 0x80);
k = inb(base_io + 0x28) & 0xcf; k = inb(base_io + 0x28) & 0xcf;
k |= 0xc0; k |= 0xc0;
...@@ -2038,7 +2032,7 @@ flash_ok_885: ...@@ -2038,7 +2032,7 @@ flash_ok_885:
outb(0x20, base_io + 0x11); outb(0x20, base_io + 0x11);
tscam(shpnt); tscam(shpnt);
is870(p, 0); is870(p, 0, p->chip_ver == 4);
outb((inb(base_io + 0x3a) & 0xef), base_io + 0x3a); outb((inb(base_io + 0x3a) & 0xef), base_io + 0x3a);
outb((inb(base_io + 0x3b) | 0x20), base_io + 0x3b); outb((inb(base_io + 0x3b) | 0x20), base_io + 0x3b);
if (atpdev->chip_ver == 4) if (atpdev->chip_ver == 4)
...@@ -2258,7 +2252,7 @@ static void tscam_885(void) ...@@ -2258,7 +2252,7 @@ static void tscam_885(void)
static void is885(struct atp_unit *dev, unsigned char c, unsigned char lvdmode) static void is885(struct atp_unit *dev, unsigned char c, bool wide_chip, unsigned char lvdmode)
{ {
unsigned char i, j, k, rmb, n; unsigned char i, j, k, rmb, n;
unsigned short int m; unsigned short int m;
...@@ -2273,6 +2267,8 @@ static void is885(struct atp_unit *dev, unsigned char c, unsigned char lvdmode) ...@@ -2273,6 +2267,8 @@ static void is885(struct atp_unit *dev, unsigned char c, unsigned char lvdmode)
static unsigned char u3[9] = { 0x80, 1, 6, 4, 0x09, 00, 0x0e, 0x01, 0x02 }; static unsigned char u3[9] = { 0x80, 1, 6, 4, 0x09, 00, 0x0e, 0x01, 0x02 };
for (i = 0; i < 16; i++) { for (i = 0; i < 16; i++) {
if (!wide_chip && (i > 7))
break;
m = 1; m = 1;
m = m << i; m = m << i;
if ((m & dev->active_id[c]) != 0) { if ((m & dev->active_id[c]) != 0) {
...@@ -2282,7 +2278,7 @@ static void is885(struct atp_unit *dev, unsigned char c, unsigned char lvdmode) ...@@ -2282,7 +2278,7 @@ static void is885(struct atp_unit *dev, unsigned char c, unsigned char lvdmode)
printk(KERN_INFO " ID: %2d Host Adapter\n", dev->host_id[c]); printk(KERN_INFO " ID: %2d Host Adapter\n", dev->host_id[c]);
continue; continue;
} }
atp_writeb_io(dev, c, 0x1b, 0x01); atp_writeb_io(dev, c, 0x1b, wide_chip ? 0x01 : 0x00);
atp_writeb_io(dev, c, 1, 0x08); atp_writeb_io(dev, c, 1, 0x08);
atp_writeb_io(dev, c, 2, 0x7f); atp_writeb_io(dev, c, 2, 0x7f);
atp_writeb_io(dev, c, 3, satn[0]); atp_writeb_io(dev, c, 3, satn[0]);
...@@ -2351,7 +2347,9 @@ sel_ok: ...@@ -2351,7 +2347,9 @@ sel_ok:
while (atp_readb_io(dev, c, 0x17) != 0x8e) while (atp_readb_io(dev, c, 0x17) != 0x8e)
cpu_relax(); cpu_relax();
atp_writeb_io(dev, c, 0x1b, 0x00); if (wide_chip)
atp_writeb_io(dev, c, 0x1b, 0x00);
atp_writeb_io(dev, c, 0x18, 0x08); atp_writeb_io(dev, c, 0x18, 0x08);
j = 0; j = 0;
rd_inq_data: rd_inq_data:
...@@ -2385,11 +2383,17 @@ inq_ok: ...@@ -2385,11 +2383,17 @@ inq_ok:
dev->id[c][i].devtype = mbuf[0]; dev->id[c][i].devtype = mbuf[0];
rmb = mbuf[1]; rmb = mbuf[1];
n = mbuf[7]; n = mbuf[7];
if (!wide_chip)
goto not_wide;
if ((mbuf[7] & 0x60) == 0) { if ((mbuf[7] & 0x60) == 0) {
goto not_wide; goto not_wide;
} }
if ((i < 8) && ((dev->global_map[c] & 0x20) == 0)) { if (dev->dev_id == ATP885_DEVID || dev->dev_id == ATP880_DEVID1 || dev->dev_id == ATP880_DEVID2) {
goto not_wide; if ((i < 8) && ((dev->global_map[c] & 0x20) == 0))
goto not_wide;
} else { /* result of is870() merge - is this a bug? */
if ((dev->global_map[c] & 0x20) == 0)
goto not_wide;
} }
if (lvdmode == 0) { if (lvdmode == 0) {
goto chg_wide; goto chg_wide;
......
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