static struct scsi_host_template atp870u_template;
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 inline void atp_writeb_base(struct atp_unit *atp, u8 reg, u8 val)
}
}
-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 short int m;
atp_writeb_io(dev, c, 0x3a, atp_readb_io(dev, c, 0x3a) | 0x10);
for (i = 0; i < 16; i++) {
- if ((dev->chip_ver != 4) && (i > 7)) {
+ if (!wide_chip && (i > 7))
break;
- }
m = 1;
m = m << i;
if ((m & dev->active_id[c]) != 0) {
printk(KERN_INFO " ID: %2d Host Adapter\n", dev->host_id[c]);
continue;
}
- if (dev->chip_ver == 4) {
- atp_writeb_io(dev, c, 0x1b, 0x01);
- } else {
- atp_writeb_io(dev, c, 0x1b, 0x00);
- }
+ atp_writeb_io(dev, c, 0x1b, wide_chip ? 0x01 : 0x00);
atp_writeb_io(dev, c, 1, 0x08);
atp_writeb_io(dev, c, 2, 0x7f);
atp_writeb_io(dev, c, 3, satn[0]);
while (atp_readb_io(dev, c, 0x17) != 0x8e)
cpu_relax();
- if (dev->chip_ver == 4)
+ if (wide_chip)
atp_writeb_io(dev, c, 0x1b, 0x00);
atp_writeb_io(dev, c, 0x18, 0x08);
dev->id[c][i].devtype = mbuf[0];
rmb = mbuf[1];
n = mbuf[7];
- if (dev->chip_ver != 4) {
+ if (!wide_chip)
goto not_wide;
- }
if ((mbuf[7] & 0x60) == 0) {
goto not_wide;
}
outb(0x20, base_io + 0x51);
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);
shpnt->max_id = 16;
shpnt->this_id = host_id;
tscam_885();
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);
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);
k = inb(base_io + 0x28) & 0xcf;
k |= 0xc0;
outb(0x20, base_io + 0x11);
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 + 0x3b) | 0x20), base_io + 0x3b);
if (atpdev->chip_ver == 4)
-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 short int m;
static unsigned char u3[9] = { 0x80, 1, 6, 4, 0x09, 00, 0x0e, 0x01, 0x02 };
for (i = 0; i < 16; i++) {
+ if (!wide_chip && (i > 7))
+ break;
m = 1;
m = m << i;
if ((m & dev->active_id[c]) != 0) {
printk(KERN_INFO " ID: %2d Host Adapter\n", dev->host_id[c]);
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, 2, 0x7f);
atp_writeb_io(dev, c, 3, satn[0]);
while (atp_readb_io(dev, c, 0x17) != 0x8e)
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);
j = 0;
rd_inq_data:
dev->id[c][i].devtype = mbuf[0];
rmb = mbuf[1];
n = mbuf[7];
+ if (!wide_chip)
+ goto not_wide;
if ((mbuf[7] & 0x60) == 0) {
goto not_wide;
}
- if ((i < 8) && ((dev->global_map[c] & 0x20) == 0)) {
- goto not_wide;
+ if (dev->dev_id == ATP885_DEVID || dev->dev_id == ATP880_DEVID1 || dev->dev_id == ATP880_DEVID2) {
+ 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) {
goto chg_wide;