mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-23 17:30:02 +00:00
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: Ondrej Zary <linux@rainbow-software.org> Reviewed-by: Hannes Reinicke <hare@suse.de> Acked-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
e7d6d14032
commit
197fb8d857
1 changed files with 25 additions and 21 deletions
|
@ -41,7 +41,7 @@
|
|||
|
||||
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)
|
||||
|
@ -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 short int m;
|
||||
|
@ -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);
|
||||
|
||||
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) {
|
||||
|
@ -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]);
|
||||
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]);
|
||||
|
@ -1262,7 +1257,7 @@ static void is870(struct atp_unit *dev, unsigned char c)
|
|||
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);
|
||||
|
@ -1298,9 +1293,8 @@ static void is870(struct atp_unit *dev, unsigned char c)
|
|||
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;
|
||||
}
|
||||
|
@ -1807,7 +1801,7 @@ static int atp870u_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
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;
|
||||
|
@ -1953,10 +1947,10 @@ static int atp870u_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
|
||||
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;
|
||||
|
@ -2038,7 +2032,7 @@ static int atp870u_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
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)
|
||||
|
@ -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 short int m;
|
||||
|
@ -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 };
|
||||
|
||||
for (i = 0; i < 16; i++) {
|
||||
if (!wide_chip && (i > 7))
|
||||
break;
|
||||
m = 1;
|
||||
m = m << i;
|
||||
if ((m & dev->active_id[c]) != 0) {
|
||||
|
@ -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]);
|
||||
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]);
|
||||
|
@ -2351,7 +2347,9 @@ static void is885(struct atp_unit *dev, unsigned char c, unsigned char lvdmode)
|
|||
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:
|
||||
|
@ -2385,11 +2383,17 @@ static void is885(struct atp_unit *dev, unsigned char c, unsigned char lvdmode)
|
|||
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;
|
||||
|
|
Loading…
Reference in a new issue