Bugzilla – Attachment 48308 Details for
Bug 113234
SCSI driver atp870u: fatal I/O ERRORS
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
IDP Log In
|
Forgot Password
[patch]
Remove the huge diff from 2.6.12
acard-downgrade (text/plain), 99.34 KB, created by
Jens Axboe
on 2005-08-31 12:41:05 UTC
(
hide
)
Description:
Remove the huge diff from 2.6.12
Filename:
MIME Type:
Creator:
Jens Axboe
Created:
2005-08-31 12:41:05 UTC
Size:
99.34 KB
patch
obsolete
>--- linux-2.6.13/drivers/scsi/atp870u.c~ 2005-08-31 14:38:59.000000000 +0200 >+++ linux-2.6.13/drivers/scsi/atp870u.c 2005-08-31 14:39:07.000000000 +0200 >@@ -1,4 +1,4 @@ >-/* >+/* > * Copyright (C) 1997 Wu Ching Chen > * 2.1.x update (C) 1998 Krzysztof G. Baranowski > * 2.5.x update (C) 2002 Red Hat <alan@redhat.com> >@@ -13,9 +13,8 @@ > * fix disconnect bug 2000/12/21 > * support atp880 chip lvd u160 2001/05/15 > * fix prd table bug 2001/09/12 (7.1) >- * >- * atp885 support add by ACARD Hao Ping Lian 2005/01/05 > */ >+ > #include <linux/module.h> > #include <linux/init.h> > #include <linux/interrupt.h> >@@ -39,54 +38,39 @@ > #include "atp870u.h" > > 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 int wkport,unsigned char c); >-static void tscam_885(void); >+static void send_s870(struct Scsi_Host *host); > >-static irqreturn_t atp870u_intr_handle(int irq, void *dev_id, struct pt_regs *regs) >+ >+static irqreturn_t atp870u_intr_handle(int irq, void *dev_id, >+ struct pt_regs *regs) > { > unsigned long flags; > unsigned short int tmpcip, id; >- unsigned char i, j, c, target_id, lun,cmdp; >+ unsigned char i, j, target_id, lun; > unsigned char *prd; >- struct scsi_cmnd *workreq; >- unsigned int workport, tmport, tmport1; >- unsigned long adrcnt, k; >-#ifdef ED_DBGP >- unsigned long l; >-#endif >+ struct scsi_cmnd *workrequ; >+ unsigned int workportu, tmport; >+ unsigned long adrcntu, k; > int errstus; > struct Scsi_Host *host = dev_id; > struct atp_unit *dev = (struct atp_unit *)&host->hostdata; > >- for (c = 0; c < 2; c++) { >- tmport = dev->ioport[c] + 0x1f; >+ dev->in_int = 1; >+ workportu = dev->ioport; >+ tmport = workportu; >+ >+ if (dev->working != 0) { >+ tmport += 0x1f; > j = inb(tmport); >- if ((j & 0x80) != 0) >- { >- goto ch_sel; >- } >- dev->in_int[c] = 0; >- } >- return IRQ_NONE; >-ch_sel: >-#ifdef ED_DBGP >- printk("atp870u_intr_handle enter\n"); >-#endif >- dev->in_int[c] = 1; >- cmdp = inb(dev->ioport[c] + 0x10); >- workport = dev->ioport[c]; >- if (dev->working[c] != 0) { >- if (dev->dev_id == ATP885_DEVID) { >- tmport1 = workport + 0x16; >- if ((inb(tmport1) & 0x80) == 0) >- outb((inb(tmport1) | 0x80), tmport1); >- } >- tmpcip = dev->pciport[c]; >- if ((inb(tmpcip) & 0x08) != 0) >- { >+ if ((j & 0x80) == 0) { >+ dev->in_int = 0; >+ return IRQ_NONE; >+ } >+ >+ tmpcip = dev->pciport; >+ if ((inb(tmpcip) & 0x08) != 0) { > tmpcip += 0x2; >- for (k=0; k < 1000; k++) { >+ for (k = 0; k < 1000; k++) { > if ((inb(tmpcip) & 0x08) == 0) { > goto stop_dma; > } >@@ -96,24 +80,18 @@ > } > } > stop_dma: >- tmpcip = dev->pciport[c]; >+ tmpcip = dev->pciport; > outb(0x00, tmpcip); > tmport -= 0x08; >- >+ > i = inb(tmport); >- >- if (dev->dev_id == ATP885_DEVID) { >- tmpcip += 2; >- outb(0x06, tmpcip); >- tmpcip -= 2; >- } > > tmport -= 0x02; > target_id = inb(tmport); > tmport += 0x02; > > /* >- * Remap wide devices onto id numbers >+ * Remap wide devices onto id numbers > */ > > if ((target_id & 0x40) != 0) { >@@ -123,460 +101,332 @@ > } > > if ((j & 0x40) != 0) { >- if (dev->last_cmd[c] == 0xff) { >- dev->last_cmd[c] = target_id; >- } >- dev->last_cmd[c] |= 0x40; >- } >- if (dev->dev_id == ATP885_DEVID) >- dev->r1f[c][target_id] |= j; >-#ifdef ED_DBGP >- printk("atp870u_intr_handle status = %x\n",i); >-#endif >- if (i == 0x85) { >- if ((dev->last_cmd[c] & 0xf0) != 0x40) { >- dev->last_cmd[c] = 0xff; >- } >- if (dev->dev_id == ATP885_DEVID) { >- tmport -= 0x05; >- adrcnt = 0; >- ((unsigned char *) &adrcnt)[2] = inb(tmport++); >- ((unsigned char *) &adrcnt)[1] = inb(tmport++); >- ((unsigned char *) &adrcnt)[0] = inb(tmport); >- if (dev->id[c][target_id].last_len != adrcnt) >- { >- k = dev->id[c][target_id].last_len; >- k -= adrcnt; >- dev->id[c][target_id].tran_len = k; >- dev->id[c][target_id].last_len = adrcnt; >- } >-#ifdef ED_DBGP >- printk("tmport = %x dev->id[c][target_id].last_len = %d dev->id[c][target_id].tran_len = %d\n",tmport,dev->id[c][target_id].last_len,dev->id[c][target_id].tran_len); >-#endif >+ if (dev->last_cmd == 0xff) { >+ dev->last_cmd = target_id; > } >+ dev->last_cmd |= 0x40; >+ } > >+ if (i == 0x85) { >+ if ((dev->last_cmd & 0xf0) != 0x40) { >+ dev->last_cmd = 0xff; >+ } > /* > * Flip wide >- */ >- if (dev->wide_id[c] != 0) { >- tmport = workport + 0x1b; >+ */ >+ if (dev->wide_idu != 0) { >+ tmport = workportu + 0x1b; > outb(0x01, tmport); > while ((inb(tmport) & 0x01) != 0x01) { > outb(0x01, tmport); > } >- } >+ } > /* >- * Issue more commands >+ * Issue more commands > */ >- spin_lock_irqsave(dev->host->host_lock, flags); >- if (((dev->quhd[c] != dev->quend[c]) || (dev->last_cmd[c] != 0xff)) && >- (dev->in_snd[c] == 0)) { >-#ifdef ED_DBGP >- printk("Call sent_s870\n"); >-#endif >- send_s870(dev,c); >+ spin_lock_irqsave(dev->host->host_lock, flags); >+ if (((dev->quhdu != dev->quendu) || (dev->last_cmd != 0xff)) && (dev->in_snd == 0)) { >+ send_s870(host); > } > spin_unlock_irqrestore(dev->host->host_lock, flags); > /* >- * Done >+ * Done > */ >- dev->in_int[c] = 0; >-#ifdef ED_DBGP >- printk("Status 0x85 return\n"); >-#endif >- goto handled; >+ dev->in_int = 0; >+ goto out; > } > > if (i == 0x40) { >- dev->last_cmd[c] |= 0x40; >- dev->in_int[c] = 0; >- goto handled; >+ dev->last_cmd |= 0x40; >+ dev->in_int = 0; >+ goto out; > } > > if (i == 0x21) { >- if ((dev->last_cmd[c] & 0xf0) != 0x40) { >- dev->last_cmd[c] = 0xff; >+ if ((dev->last_cmd & 0xf0) != 0x40) { >+ dev->last_cmd = 0xff; > } > tmport -= 0x05; >- adrcnt = 0; >- ((unsigned char *) &adrcnt)[2] = inb(tmport++); >- ((unsigned char *) &adrcnt)[1] = inb(tmport++); >- ((unsigned char *) &adrcnt)[0] = inb(tmport); >- k = dev->id[c][target_id].last_len; >- k -= adrcnt; >- dev->id[c][target_id].tran_len = k; >- dev->id[c][target_id].last_len = adrcnt; >+ adrcntu = 0; >+ ((unsigned char *) &adrcntu)[2] = inb(tmport++); >+ ((unsigned char *) &adrcntu)[1] = inb(tmport++); >+ ((unsigned char *) &adrcntu)[0] = inb(tmport); >+ k = dev->id[target_id].last_lenu; >+ k -= adrcntu; >+ dev->id[target_id].tran_lenu = k; >+ dev->id[target_id].last_lenu = adrcntu; > tmport -= 0x04; > outb(0x41, tmport); > tmport += 0x08; > outb(0x08, tmport); >- dev->in_int[c] = 0; >- goto handled; >- } >- >- if (dev->dev_id == ATP885_DEVID) { >- if ((i == 0x4c) || (i == 0x4d) || (i == 0x8c) || (i == 0x8d)) { >- if ((i == 0x4c) || (i == 0x8c)) >- i=0x48; >- else >- i=0x49; >- } >- >+ dev->in_int = 0; >+ goto out; > } > if ((i == 0x80) || (i == 0x8f)) { >-#ifdef ED_DBGP >- printk(KERN_DEBUG "Device reselect\n"); >-#endif > lun = 0; > tmport -= 0x07; >- if (cmdp == 0x44 || i==0x80) { >+ j = inb(tmport); >+ if (j == 0x44 || i == 0x80) { > tmport += 0x0d; > lun = inb(tmport) & 0x07; > } else { >- if ((dev->last_cmd[c] & 0xf0) != 0x40) { >- dev->last_cmd[c] = 0xff; >+ if ((dev->last_cmd & 0xf0) != 0x40) { >+ dev->last_cmd = 0xff; > } >- if (cmdp == 0x41) { >-#ifdef ED_DBGP >- printk("cmdp = 0x41\n"); >-#endif >+ if (j == 0x41) { > tmport += 0x02; >- adrcnt = 0; >- ((unsigned char *) &adrcnt)[2] = inb(tmport++); >- ((unsigned char *) &adrcnt)[1] = inb(tmport++); >- ((unsigned char *) &adrcnt)[0] = inb(tmport); >- k = dev->id[c][target_id].last_len; >- k -= adrcnt; >- dev->id[c][target_id].tran_len = k; >- dev->id[c][target_id].last_len = adrcnt; >+ adrcntu = 0; >+ ((unsigned char *) &adrcntu)[2] = inb(tmport++); >+ ((unsigned char *) &adrcntu)[1] = inb(tmport++); >+ ((unsigned char *) &adrcntu)[0] = inb(tmport); >+ k = dev->id[target_id].last_lenu; >+ k -= adrcntu; >+ dev->id[target_id].tran_lenu = k; >+ dev->id[target_id].last_lenu = adrcntu; > tmport += 0x04; > outb(0x08, tmport); >- dev->in_int[c] = 0; >- goto handled; >+ dev->in_int = 0; >+ goto out; > } else { >-#ifdef ED_DBGP >- printk("cmdp != 0x41\n"); >-#endif > outb(0x46, tmport); >- dev->id[c][target_id].dirct = 0x00; >+ dev->id[target_id].dirctu = 0x00; > tmport += 0x02; > outb(0x00, tmport++); > outb(0x00, tmport++); > outb(0x00, tmport++); > tmport += 0x03; > outb(0x08, tmport); >- dev->in_int[c] = 0; >- goto handled; >+ dev->in_int = 0; >+ goto out; > } > } >- if (dev->last_cmd[c] != 0xff) { >- dev->last_cmd[c] |= 0x40; >- } >- if (dev->dev_id == ATP885_DEVID) { >- j = inb(dev->baseport + 0x29) & 0xfe; >- outb(j, dev->baseport + 0x29); >- tmport = workport + 0x16; >- } else { >- tmport = workport + 0x10; >- outb(0x45, tmport); >- tmport += 0x06; >+ if (dev->last_cmd != 0xff) { >+ dev->last_cmd |= 0x40; > } >- >+ tmport = workportu + 0x10; >+ outb(0x45, tmport); >+ tmport += 0x06; > target_id = inb(tmport); > /* >- * Remap wide identifiers >+ * Remap wide identifiers > */ > if ((target_id & 0x10) != 0) { > target_id = (target_id & 0x07) | 0x08; > } else { > target_id &= 0x07; > } >- if (dev->dev_id == ATP885_DEVID) { >- tmport = workport + 0x10; >- outb(0x45, tmport); >- } >- workreq = dev->id[c][target_id].curr_req; >-#ifdef ED_DBGP >- printk(KERN_DEBUG "Channel = %d ID = %d LUN = %d CDB",c,workreq->device->id,workreq->device->lun); >- for(l=0;l<workreq->cmd_len;l++) >- { >- printk(KERN_DEBUG " %x",workreq->cmnd[l]); >- } >-#endif >- >- tmport = workport + 0x0f; >+ workrequ = dev->id[target_id].curr_req; >+ tmport = workportu + 0x0f; > outb(lun, tmport); > tmport += 0x02; >- outb(dev->id[c][target_id].devsp, tmport++); >- adrcnt = dev->id[c][target_id].tran_len; >- k = dev->id[c][target_id].last_len; >- >+ outb(dev->id[target_id].devspu, tmport++); >+ adrcntu = dev->id[target_id].tran_lenu; >+ k = dev->id[target_id].last_lenu; > outb(((unsigned char *) &k)[2], tmport++); > outb(((unsigned char *) &k)[1], tmport++); > outb(((unsigned char *) &k)[0], tmport++); >-#ifdef ED_DBGP >- printk("k %x, k[0] 0x%x k[1] 0x%x k[2] 0x%x\n", k, inb(tmport-1), inb(tmport-2), inb(tmport-3)); >-#endif > /* Remap wide */ > j = target_id; > if (target_id > 7) { > j = (j & 0x07) | 0x40; > } > /* Add direction */ >- j |= dev->id[c][target_id].dirct; >+ j |= dev->id[target_id].dirctu; > outb(j, tmport++); >- outb(0x80,tmport); >- >- /* enable 32 bit fifo transfer */ >- if (dev->dev_id == ATP885_DEVID) { >- tmpcip = dev->pciport[c] + 1; >- i=inb(tmpcip) & 0xf3; >- //j=workreq->cmnd[0]; >- if ((workreq->cmnd[0] == 0x08) || (workreq->cmnd[0] == 0x28) || (workreq->cmnd[0] == 0x0a) || (workreq->cmnd[0] == 0x2a)) { >- i |= 0x0c; >+ outb(0x80, tmport); >+ >+ /* enable 32 bit fifo transfer */ >+ if (dev->deviceid != 0x8081) { >+ tmport = workportu + 0x3a; >+ if ((dev->ata_cdbu[0] == 0x08) || (dev->ata_cdbu[0] == 0x28) || (dev->ata_cdbu[0] == 0x0a) || (dev->ata_cdbu[0] == 0x2a)) { >+ outb((unsigned char) ((inb(tmport) & 0xf3) | 0x08), tmport); >+ } else { >+ outb((unsigned char) (inb(tmport) & 0xf3), tmport); > } >- outb(i,tmpcip); >- } else if ((dev->dev_id == ATP880_DEVID1) || >- (dev->dev_id == ATP880_DEVID2) ) { >- tmport = workport - 0x05; >- if ((workreq->cmnd[0] == 0x08) || (workreq->cmnd[0] == 0x28) || (workreq->cmnd[0] == 0x0a) || (workreq->cmnd[0] == 0x2a)) { >+ } else { >+ tmport = workportu - 0x05; >+ if ((dev->ata_cdbu[0] == 0x08) || (dev->ata_cdbu[0] == 0x28) || (dev->ata_cdbu[0] == 0x0a) || (dev->ata_cdbu[0] == 0x2a)) { > outb((unsigned char) ((inb(tmport) & 0x3f) | 0xc0), tmport); > } else { > outb((unsigned char) (inb(tmport) & 0x3f), tmport); > } >- } else { >- tmport = workport + 0x3a; >- if ((workreq->cmnd[0] == 0x08) || (workreq->cmnd[0] == 0x28) || (workreq->cmnd[0] == 0x0a) || (workreq->cmnd[0] == 0x2a)) { >- outb((unsigned char) ((inb(tmport) & 0xf3) | 0x08), tmport); >- } else { >- outb((unsigned char) (inb(tmport) & 0xf3), tmport); >- } >- } >- tmport = workport + 0x1b; >+ } >+ >+ tmport = workportu + 0x1b; > j = 0; > id = 1; > id = id << target_id; > /* >- * Is this a wide device >+ * Is this a wide device > */ >- if ((id & dev->wide_id[c]) != 0) { >+ if ((id & dev->wide_idu) != 0) { > j |= 0x01; > } > outb(j, tmport); > while ((inb(tmport) & 0x01) != j) { >- outb(j,tmport); >+ outb(j, tmport); > } >- if (dev->id[c][target_id].last_len == 0) { >- tmport = workport + 0x18; >+ >+ if (dev->id[target_id].last_lenu == 0) { >+ tmport = workportu + 0x18; > outb(0x08, tmport); >- dev->in_int[c] = 0; >-#ifdef ED_DBGP >- printk("dev->id[c][target_id].last_len = 0\n"); >-#endif >- goto handled; >- } >-#ifdef ED_DBGP >- printk("target_id = %d adrcnt = %d\n",target_id,adrcnt); >-#endif >- prd = dev->id[c][target_id].prd_pos; >- while (adrcnt != 0) { >- id = ((unsigned short int *)prd)[2]; >+ dev->in_int = 0; >+ goto out; >+ } >+ prd = dev->id[target_id].prd_posu; >+ while (adrcntu != 0) { >+ id = ((unsigned short int *) (prd))[2]; > if (id == 0) { > k = 0x10000; > } else { > k = id; > } >- if (k > adrcnt) { >- ((unsigned short int *)prd)[2] = (unsigned short int) >- (k - adrcnt); >- ((unsigned long *)prd)[0] += adrcnt; >- adrcnt = 0; >- dev->id[c][target_id].prd_pos = prd; >+ if (k > adrcntu) { >+ ((unsigned short int *) (prd))[2] = (unsigned short int) >+ (k - adrcntu); >+ ((unsigned long *) (prd))[0] += adrcntu; >+ adrcntu = 0; >+ dev->id[target_id].prd_posu = prd; > } else { >- adrcnt -= k; >- dev->id[c][target_id].prdaddr += 0x08; >+ adrcntu -= k; >+ dev->id[target_id].prdaddru += 0x08; > prd += 0x08; >- if (adrcnt == 0) { >- dev->id[c][target_id].prd_pos = prd; >+ if (adrcntu == 0) { >+ dev->id[target_id].prd_posu = prd; > } >- } >- } >- tmpcip = dev->pciport[c] + 0x04; >- outl(dev->id[c][target_id].prdaddr, tmpcip); >-#ifdef ED_DBGP >- printk("dev->id[%d][%d].prdaddr 0x%8x\n", c, target_id, dev->id[c][target_id].prdaddr); >-#endif >- if (dev->dev_id == ATP885_DEVID) { >- tmpcip -= 0x04; >- } else { >- tmpcip -= 0x02; >- outb(0x06, tmpcip); >- outb(0x00, tmpcip); >- tmpcip -= 0x02; >+ } > } >- tmport = workport + 0x18; >+ tmpcip = dev->pciport + 0x04; >+ outl(dev->id[target_id].prdaddru, tmpcip); >+ tmpcip -= 0x02; >+ outb(0x06, tmpcip); >+ outb(0x00, tmpcip); >+ tmpcip -= 0x02; >+ tmport = workportu + 0x18; > /* >- * Check transfer direction >+ * Check transfer direction > */ >- if (dev->id[c][target_id].dirct != 0) { >+ if (dev->id[target_id].dirctu != 0) { > outb(0x08, tmport); > outb(0x01, tmpcip); >- dev->in_int[c] = 0; >-#ifdef ED_DBGP >- printk("status 0x80 return dirct != 0\n"); >-#endif >- goto handled; >+ dev->in_int = 0; >+ goto out; > } > outb(0x08, tmport); > outb(0x09, tmpcip); >- dev->in_int[c] = 0; >-#ifdef ED_DBGP >- printk("status 0x80 return dirct = 0\n"); >-#endif >- goto handled; >+ dev->in_int = 0; >+ goto out; > } > > /* >- * Current scsi request on this target >+ * Current scsi request on this target > */ > >- workreq = dev->id[c][target_id].curr_req; >+ workrequ = dev->id[target_id].curr_req; > > if (i == 0x42) { >- if ((dev->last_cmd[c] & 0xf0) != 0x40) >- { >- dev->last_cmd[c] = 0xff; >+ if ((dev->last_cmd & 0xf0) != 0x40) { >+ dev->last_cmd = 0xff; > } > errstus = 0x02; >- workreq->result = errstus; >+ workrequ->result = errstus; > goto go_42; > } > if (i == 0x16) { >- if ((dev->last_cmd[c] & 0xf0) != 0x40) { >- dev->last_cmd[c] = 0xff; >+ if ((dev->last_cmd & 0xf0) != 0x40) { >+ dev->last_cmd = 0xff; > } > errstus = 0; > tmport -= 0x08; > errstus = inb(tmport); >- if (((dev->r1f[c][target_id] & 0x10) != 0)&&(dev->dev_id==ATP885_DEVID)) { >- printk(KERN_WARNING "AEC67162 CRC ERROR !\n"); >- errstus = 0x02; >- } >- workreq->result = errstus; >+ workrequ->result = errstus; > go_42: >- if (dev->dev_id == ATP885_DEVID) { >- j = inb(dev->baseport + 0x29) | 0x01; >- outb(j, dev->baseport + 0x29); >- } > /* >- * Complete the command >+ * Complete the command > */ >- if (workreq->use_sg) { >+ >+ if (workrequ->use_sg) { > pci_unmap_sg(dev->pdev, >- (struct scatterlist *)workreq->buffer, >- workreq->use_sg, >- workreq->sc_data_direction); >- } else if (workreq->request_bufflen && >- workreq->sc_data_direction != DMA_NONE) { >+ (struct scatterlist *)workrequ->buffer, >+ workrequ->use_sg, >+ workrequ->sc_data_direction); >+ } else if (workrequ->request_bufflen && >+ workrequ->sc_data_direction != DMA_NONE) { > pci_unmap_single(dev->pdev, >- workreq->SCp.dma_handle, >- workreq->request_bufflen, >- workreq->sc_data_direction); >- } >+ workrequ->SCp.dma_handle, >+ workrequ->request_bufflen, >+ workrequ->sc_data_direction); >+ } > spin_lock_irqsave(dev->host->host_lock, flags); >- (*workreq->scsi_done) (workreq); >-#ifdef ED_DBGP >- printk("workreq->scsi_done\n"); >-#endif >+ (*workrequ->scsi_done) (workrequ); >+ > /* >- * Clear it off the queue >+ * Clear it off the queue > */ >- dev->id[c][target_id].curr_req = NULL; >- dev->working[c]--; >+ dev->id[target_id].curr_req = NULL; >+ dev->working--; > spin_unlock_irqrestore(dev->host->host_lock, flags); > /* > * Take it back wide > */ >- if (dev->wide_id[c] != 0) { >- tmport = workport + 0x1b; >+ if (dev->wide_idu != 0) { >+ tmport = workportu + 0x1b; > outb(0x01, tmport); > while ((inb(tmport) & 0x01) != 0x01) { > outb(0x01, tmport); >- } >- } >+ } >+ } > /* >- * If there is stuff to send and nothing going then send it >+ * If there is stuff to send and nothing going then send it > */ > spin_lock_irqsave(dev->host->host_lock, flags); >- if (((dev->last_cmd[c] != 0xff) || (dev->quhd[c] != dev->quend[c])) && >- (dev->in_snd[c] == 0)) { >-#ifdef ED_DBGP >- printk("Call sent_s870(scsi_done)\n"); >-#endif >- send_s870(dev,c); >+ if (((dev->last_cmd != 0xff) || (dev->quhdu != dev->quendu)) && (dev->in_snd == 0)) { >+ send_s870(host); > } > spin_unlock_irqrestore(dev->host->host_lock, flags); >- dev->in_int[c] = 0; >- goto handled; >+ dev->in_int = 0; >+ goto out; > } >- if ((dev->last_cmd[c] & 0xf0) != 0x40) { >- dev->last_cmd[c] = 0xff; >+ if ((dev->last_cmd & 0xf0) != 0x40) { >+ dev->last_cmd = 0xff; > } > if (i == 0x4f) { > i = 0x89; > } > i &= 0x0f; > if (i == 0x09) { >- tmpcip += 4; >- outl(dev->id[c][target_id].prdaddr, tmpcip); >+ tmpcip = tmpcip + 4; >+ outl(dev->id[target_id].prdaddru, tmpcip); > tmpcip = tmpcip - 2; > outb(0x06, tmpcip); > outb(0x00, tmpcip); > tmpcip = tmpcip - 2; >- tmport = workport + 0x10; >+ tmport = workportu + 0x10; > outb(0x41, tmport); >- if (dev->dev_id == ATP885_DEVID) { >- tmport += 2; >- k = dev->id[c][target_id].last_len; >- outb((unsigned char) (((unsigned char *) (&k))[2]), tmport++); >- outb((unsigned char) (((unsigned char *) (&k))[1]), tmport++); >- outb((unsigned char) (((unsigned char *) (&k))[0]), tmport); >- dev->id[c][target_id].dirct = 0x00; >- tmport += 0x04; >- } else { >- dev->id[c][target_id].dirct = 0x00; >- tmport += 0x08; >- } >+ dev->id[target_id].dirctu = 0x00; >+ tmport += 0x08; > outb(0x08, tmport); > outb(0x09, tmpcip); >- dev->in_int[c] = 0; >- goto handled; >+ dev->in_int = 0; >+ goto out; > } > if (i == 0x08) { >- tmpcip += 4; >- outl(dev->id[c][target_id].prdaddr, tmpcip); >+ tmpcip = tmpcip + 4; >+ outl(dev->id[target_id].prdaddru, tmpcip); > tmpcip = tmpcip - 2; > outb(0x06, tmpcip); > outb(0x00, tmpcip); > tmpcip = tmpcip - 2; >- tmport = workport + 0x10; >+ tmport = workportu + 0x10; > outb(0x41, tmport); >- if (dev->dev_id == ATP885_DEVID) { >- tmport += 2; >- k = dev->id[c][target_id].last_len; >- outb((unsigned char) (((unsigned char *) (&k))[2]), tmport++); >- outb((unsigned char) (((unsigned char *) (&k))[1]), tmport++); >- outb((unsigned char) (((unsigned char *) (&k))[0]), tmport++); >- } else { >- tmport += 5; >- } >+ tmport += 0x05; > outb((unsigned char) (inb(tmport) | 0x20), tmport); >- dev->id[c][target_id].dirct = 0x20; >+ dev->id[target_id].dirctu = 0x20; > tmport += 0x03; > outb(0x08, tmport); > outb(0x01, tmpcip); >- dev->in_int[c] = 0; >- goto handled; >+ dev->in_int = 0; >+ goto out; > } > tmport -= 0x07; > if (i == 0x0a) { >@@ -584,29 +434,25 @@ > } else { > outb(0x46, tmport); > } >- dev->id[c][target_id].dirct = 0x00; >+ dev->id[target_id].dirctu = 0x00; > tmport += 0x02; > outb(0x00, tmport++); > outb(0x00, tmport++); > outb(0x00, tmport++); > tmport += 0x03; > outb(0x08, tmport); >- dev->in_int[c] = 0; >- goto handled; >+ dev->in_int = 0; >+ goto out; > } else { >-// tmport = workport + 0x17; >-// inb(tmport); >-// dev->working[c] = 0; >- dev->in_int[c] = 0; >- goto handled; >+// tmport = workportu + 0x17; >+// inb(tmport); >+// dev->working = 0; >+ dev->in_int = 0; > } >- >-handled: >-#ifdef ED_DBGP >- printk("atp870u_intr_handle exit\n"); >-#endif >+out: > return IRQ_HANDLED; > } >+ > /** > * atp870u_queuecommand - Queue SCSI command > * @req_p: request block >@@ -614,31 +460,24 @@ > * > * Queue a command to the ATP queue. Called with the host lock held. > */ >-static int atp870u_queuecommand(struct scsi_cmnd * req_p, >- void (*done) (struct scsi_cmnd *)) >+ >+static int atp870u_queuecommand(struct scsi_cmnd *req_p, >+ void (*done) (struct scsi_cmnd *)) > { >- unsigned char c; >- unsigned int tmport,m; >- struct atp_unit *dev; >+ unsigned short int m; >+ unsigned int tmport; > struct Scsi_Host *host; >+ struct atp_unit *dev; > >- c = req_p->device->channel; >- req_p->sense_buffer[0]=0; >- req_p->resid = 0; >- if (req_p->device->channel > 1) { >+ if (req_p->device->channel != 0) { > req_p->result = 0x00040000; > done(req_p); >-#ifdef ED_DBGP >- printk("atp870u_queuecommand : req_p->device->channel > 1\n"); >-#endif > return 0; >- } >+ }; > > host = req_p->device->host; > dev = (struct atp_unit *)&host->hostdata; >- >- >- >+ > m = 1; > m = m << req_p->device->id; > >@@ -646,60 +485,44 @@ > * Fake a timeout for missing targets > */ > >- if ((m & dev->active_id[c]) == 0) { >+ if ((m & dev->active_idu) == 0) { > req_p->result = 0x00040000; > done(req_p); > return 0; > } >- > if (done) { > req_p->scsi_done = done; > } else { >-#ifdef ED_DBGP >- printk( "atp870u_queuecommand: done can't be NULL\n"); >-#endif >+ printk(KERN_WARNING "atp870u_queuecommand: done can't be NULL\n"); > req_p->result = 0; > done(req_p); > return 0; > } >- > /* >- * Count new command >+ * Count new command > */ >- dev->quend[c]++; >- if (dev->quend[c] >= qcnt) { >- dev->quend[c] = 0; >+ >+ dev->quendu++; >+ if (dev->quendu >= qcnt) { >+ dev->quendu = 0; > } >- > /* >- * Check queue state >+ * Check queue state > */ >- if (dev->quhd[c] == dev->quend[c]) { >- if (dev->quend[c] == 0) { >- dev->quend[c] = qcnt; >- } >-#ifdef ED_DBGP >- printk("atp870u_queuecommand : dev->quhd[c] == dev->quend[c]\n"); >-#endif >- dev->quend[c]--; >+ if (dev->quhdu == dev->quendu) { >+ if (dev->quendu == 0) { >+ dev->quendu = qcnt; >+ } >+ dev->quendu--; > req_p->result = 0x00020000; >- done(req_p); >+ done(req_p); > return 0; > } >- dev->quereq[c][dev->quend[c]] = req_p; >- tmport = dev->ioport[c] + 0x1c; >-#ifdef ED_DBGP >- printk("dev->ioport[c] = %x inb(tmport) = %x dev->in_int[%d] = %d dev->in_snd[%d] = %d\n",dev->ioport[c],inb(tmport),c,dev->in_int[c],c,dev->in_snd[c]); >-#endif >- if ((inb(tmport) == 0) && (dev->in_int[c] == 0) && (dev->in_snd[c] == 0)) { >-#ifdef ED_DBGP >- printk("Call sent_s870(atp870u_queuecommand)\n"); >-#endif >- send_s870(dev,c); >- } >-#ifdef ED_DBGP >- printk("atp870u_queuecommand : exit\n"); >-#endif >+ dev->querequ[dev->quendu] = req_p; >+ tmport = dev->ioport + 0x1c; >+ if ((inb(tmport) == 0) && (dev->in_int == 0) && (dev->in_snd == 0)) { >+ send_s870(host); >+ } > return 0; > } > >@@ -712,242 +535,194 @@ > * > * Caller holds the host lock. > */ >-static void send_s870(struct atp_unit *dev,unsigned char c) >+ >+static void send_s870(struct Scsi_Host *host) > { > unsigned int tmport; >- struct scsi_cmnd *workreq; >- unsigned int i;//,k; >- unsigned char j, target_id; >+ struct scsi_cmnd *workrequ; >+ unsigned int i; >+ unsigned char j, target_id; > unsigned char *prd; > unsigned short int tmpcip, w; >- unsigned long l, bttl = 0; >- unsigned int workport; >+ unsigned long l; >+ dma_addr_t bttl; >+ unsigned int workportu; > struct scatterlist *sgpnt; >- unsigned long sg_count; >+ struct atp_unit *dev = (struct atp_unit *)&host->hostdata; >+ int sg_count; > >- if (dev->in_snd[c] != 0) { >-#ifdef ED_DBGP >- printk("cmnd in_snd\n"); >-#endif >+ if (dev->in_snd != 0) { >+ return; >+ } >+ dev->in_snd = 1; >+ if ((dev->last_cmd != 0xff) && ((dev->last_cmd & 0x40) != 0)) { >+ dev->last_cmd &= 0x0f; >+ workrequ = dev->id[dev->last_cmd].curr_req; >+ if (workrequ != NULL) { /* check NULL pointer */ >+ goto cmd_subp; >+ } >+ dev->last_cmd = 0xff; >+ if (dev->quhdu == dev->quendu) { >+ dev->in_snd = 0; >+ return; >+ } >+ } >+ if ((dev->last_cmd != 0xff) && (dev->working != 0)) { >+ dev->in_snd = 0; > return; > } >-#ifdef ED_DBGP >- printk("Sent_s870 enter\n"); >-#endif >- dev->in_snd[c] = 1; >- if ((dev->last_cmd[c] != 0xff) && ((dev->last_cmd[c] & 0x40) != 0)) { >- dev->last_cmd[c] &= 0x0f; >- workreq = dev->id[c][dev->last_cmd[c]].curr_req; >- if (workreq != NULL) { /* check NULL pointer */ >- goto cmd_subp; >- } >- dev->last_cmd[c] = 0xff; >- if (dev->quhd[c] == dev->quend[c]) { >- dev->in_snd[c] = 0; >- return ; >- } >- } >- if ((dev->last_cmd[c] != 0xff) && (dev->working[c] != 0)) { >- dev->in_snd[c] = 0; >- return ; >- } >- dev->working[c]++; >- j = dev->quhd[c]; >- dev->quhd[c]++; >- if (dev->quhd[c] >= qcnt) { >- dev->quhd[c] = 0; >- } >- workreq = dev->quereq[c][dev->quhd[c]]; >- if (dev->id[c][workreq->device->id].curr_req == 0) { >- dev->id[c][workreq->device->id].curr_req = workreq; >- dev->last_cmd[c] = workreq->device->id; >+ dev->working++; >+ j = dev->quhdu; >+ dev->quhdu++; >+ if (dev->quhdu >= qcnt) { >+ dev->quhdu = 0; >+ } >+ workrequ = dev->querequ[dev->quhdu]; >+ if (dev->id[workrequ->device->id].curr_req == 0) { >+ dev->id[workrequ->device->id].curr_req = workrequ; >+ dev->last_cmd = workrequ->device->id; > goto cmd_subp; >- } >- dev->quhd[c] = j; >- dev->working[c]--; >- dev->in_snd[c] = 0; >+ } >+ dev->quhdu = j; >+ dev->working--; >+ dev->in_snd = 0; > return; > cmd_subp: >- workport = dev->ioport[c]; >- tmport = workport + 0x1f; >+ workportu = dev->ioport; >+ tmport = workportu + 0x1f; > if ((inb(tmport) & 0xb0) != 0) { > goto abortsnd; > } >- tmport = workport + 0x1c; >+ tmport = workportu + 0x1c; > if (inb(tmport) == 0) { > goto oktosend; > } > abortsnd: >-#ifdef ED_DBGP >- printk("Abort to Send\n"); >-#endif >- dev->last_cmd[c] |= 0x40; >- dev->in_snd[c] = 0; >+ dev->last_cmd |= 0x40; >+ dev->in_snd = 0; > return; > oktosend: >-#ifdef ED_DBGP >- printk("OK to Send\n"); >- printk("CDB"); >- for(i=0;i<workreq->cmd_len;i++) { >- printk(" %x",workreq->cmnd[i]); >- } >- printk("\nChannel = %d ID = %d LUN = %d\n",c,workreq->device->id,workreq->device->lun); >-#endif >- if (dev->dev_id == ATP885_DEVID) { >- j = inb(dev->baseport + 0x29) & 0xfe; >- outb(j, dev->baseport + 0x29); >- dev->r1f[c][workreq->device->id] = 0; >- } >- >- if (workreq->cmnd[0] == READ_CAPACITY) { >- if (workreq->request_bufflen > 8) { >- workreq->request_bufflen = 0x08; >+ memcpy(&dev->ata_cdbu[0], &workrequ->cmnd[0], workrequ->cmd_len); >+ if (dev->ata_cdbu[0] == READ_CAPACITY) { >+ if (workrequ->request_bufflen > 8) { >+ workrequ->request_bufflen = 0x08; > } > } >- if (workreq->cmnd[0] == 0x00) { >- workreq->request_bufflen = 0; >+ if (dev->ata_cdbu[0] == 0x00) { >+ workrequ->request_bufflen = 0; > } > >- tmport = workport + 0x1b; >+ tmport = workportu + 0x1b; > j = 0; >- target_id = workreq->device->id; >+ target_id = workrequ->device->id; > > /* >- * Wide ? >+ * Wide ? > */ > w = 1; > w = w << target_id; >- if ((w & dev->wide_id[c]) != 0) { >+ if ((w & dev->wide_idu) != 0) { > j |= 0x01; > } > outb(j, tmport); > while ((inb(tmport) & 0x01) != j) { >- outb(j,tmport); >-#ifdef ED_DBGP >- printk("send_s870 while loop 1\n"); >-#endif >+ outb(j, tmport); > } >+ > /* >- * Write the command >+ * Write the command > */ > >- tmport = workport; >- outb(workreq->cmd_len, tmport++); >+ tmport = workportu; >+ outb(workrequ->cmd_len, tmport++); > outb(0x2c, tmport++); >- if (dev->dev_id == ATP885_DEVID) { >- outb(0x7f, tmport++); >- } else { >- outb(0xcf, tmport++); >- } >- for (i = 0; i < workreq->cmd_len; i++) { >- outb(workreq->cmnd[i], tmport++); >+ outb(0xcf, tmport++); >+ for (i = 0; i < workrequ->cmd_len; i++) { >+ outb(dev->ata_cdbu[i], tmport++); > } >- tmport = workport + 0x0f; >- outb(workreq->device->lun, tmport); >+ tmport = workportu + 0x0f; >+ outb(workrequ->device->lun, tmport); > tmport += 0x02; > /* >- * Write the target >+ * Write the target > */ >- outb(dev->id[c][target_id].devsp, tmport++); >-#ifdef ED_DBGP >- printk("dev->id[%d][%d].devsp = %2x\n",c,target_id,dev->id[c][target_id].devsp); >-#endif >+ outb(dev->id[target_id].devspu, tmport++); >+ > /* >- * Figure out the transfer size >+ * Figure out the transfer size > */ >- if (workreq->use_sg) { >-#ifdef ED_DBGP >- printk("Using SGL\n"); >-#endif >+ if (workrequ->use_sg) { > l = 0; >- >- sgpnt = (struct scatterlist *) workreq->request_buffer; >- sg_count = pci_map_sg(dev->pdev, sgpnt, workreq->use_sg, >- workreq->sc_data_direction); >- >- for (i = 0; i < workreq->use_sg; i++) { >- if (sgpnt[i].length == 0 || workreq->use_sg > ATP870U_SCATTER) { >+ sgpnt = (struct scatterlist *) workrequ->request_buffer; >+ sg_count = pci_map_sg(dev->pdev, sgpnt, workrequ->use_sg, >+ workrequ->sc_data_direction); >+ for (i = 0; i < workrequ->use_sg; i++) { >+ if (sgpnt[i].length == 0 || workrequ->use_sg > ATP870U_SCATTER) { > panic("Foooooooood fight!"); > } > l += sgpnt[i].length; > } >-#ifdef ED_DBGP >- printk( "send_s870: workreq->use_sg %d, sg_count %d l %8ld\n", workreq->use_sg, sg_count, l); >-#endif >- } else if(workreq->request_bufflen && workreq->sc_data_direction != PCI_DMA_NONE) { >-#ifdef ED_DBGP >- printk("Not using SGL\n"); >-#endif >- workreq->SCp.dma_handle = pci_map_single(dev->pdev, workreq->request_buffer, >- workreq->request_bufflen, >- workreq->sc_data_direction); >- l = workreq->request_bufflen; >-#ifdef ED_DBGP >- printk( "send_s870: workreq->use_sg %d, l %8ld\n", workreq->use_sg, l); >-#endif >- } else l = 0; >+ } else if(workrequ->request_bufflen && workrequ->sc_data_direction != PCI_DMA_NONE) { >+ workrequ->SCp.dma_handle = pci_map_single(dev->pdev, >+ workrequ->request_buffer, >+ workrequ->request_bufflen, >+ workrequ->sc_data_direction); >+ l = workrequ->request_bufflen; >+ } >+ else l = 0; > /* >- * Write transfer size >+ * Write transfer size > */ > outb((unsigned char) (((unsigned char *) (&l))[2]), tmport++); > outb((unsigned char) (((unsigned char *) (&l))[1]), tmport++); > outb((unsigned char) (((unsigned char *) (&l))[0]), tmport++); >- j = target_id; >- dev->id[c][j].last_len = l; >- dev->id[c][j].tran_len = 0; >-#ifdef ED_DBGP >- printk("dev->id[%2d][%2d].last_len = %d\n",c,j,dev->id[c][j].last_len); >-#endif >+ j = target_id; >+ dev->id[j].last_lenu = l; >+ dev->id[j].tran_lenu = 0; > /* >- * Flip the wide bits >+ * Flip the wide bits > */ > if ((j & 0x08) != 0) { > j = (j & 0x07) | 0x40; > } > /* >- * Check transfer direction >+ * Check transfer direction > */ >- if (workreq->sc_data_direction == DMA_TO_DEVICE) { >+ if (workrequ->sc_data_direction == DMA_TO_DEVICE) { > outb((unsigned char) (j | 0x20), tmport++); > } else { > outb(j, tmport++); > } > outb((unsigned char) (inb(tmport) | 0x80), tmport); > outb(0x80, tmport); >- tmport = workport + 0x1c; >- dev->id[c][target_id].dirct = 0; >+ tmport = workportu + 0x1c; >+ dev->id[target_id].dirctu = 0; > if (l == 0) { > if (inb(tmport) == 0) { >- tmport = workport + 0x18; >-#ifdef ED_DBGP >- printk("change SCSI_CMD_REG 0x08\n"); >-#endif >+ tmport = workportu + 0x18; > outb(0x08, tmport); > } else { >- dev->last_cmd[c] |= 0x40; >+ dev->last_cmd |= 0x40; > } >- dev->in_snd[c] = 0; >+ dev->in_snd = 0; > return; > } >- tmpcip = dev->pciport[c]; >- prd = dev->id[c][target_id].prd_table; >- dev->id[c][target_id].prd_pos = prd; >+ tmpcip = dev->pciport; >+ prd = dev->id[target_id].prd_tableu; >+ dev->id[target_id].prd_posu = prd; > > /* >- * Now write the request list. Either as scatter/gather or as >- * a linear chain. >+ * Now write the request list. Either as scatter/gather or as >+ * a linear chain. > */ > >- if (workreq->use_sg) { >- sgpnt = (struct scatterlist *) workreq->request_buffer; >+ if (workrequ->use_sg) { >+ sgpnt = (struct scatterlist *) workrequ->request_buffer; > i = 0; >- for (j = 0; j < workreq->use_sg; j++) { >+ for (j = 0; j < workrequ->use_sg; j++) { > bttl = sg_dma_address(&sgpnt[j]); >- l=sg_dma_len(&sgpnt[j]); >-#ifdef ED_DBGP >- printk("1. bttl %x, l %x\n",bttl, l); >-#endif >- while (l > 0x10000) { >+ l = sg_dma_len(&sgpnt[j]); >+ while (l > 0x10000) { > (((u16 *) (prd))[i + 3]) = 0x0000; > (((u16 *) (prd))[i + 2]) = 0x0000; > (((u32 *) (prd))[i >> 1]) = cpu_to_le32(bttl); >@@ -958,105 +733,73 @@ > (((u32 *) (prd))[i >> 1]) = cpu_to_le32(bttl); > (((u16 *) (prd))[i + 2]) = cpu_to_le16(l); > (((u16 *) (prd))[i + 3]) = 0; >- i += 0x04; >+ i += 0x04; > } >- (((u16 *) (prd))[i - 1]) = cpu_to_le16(0x8000); >-#ifdef ED_DBGP >- printk("prd %4x %4x %4x %4x\n",(((unsigned short int *)prd)[0]),(((unsigned short int *)prd)[1]),(((unsigned short int *)prd)[2]),(((unsigned short int *)prd)[3])); >- printk("2. bttl %x, l %x\n",bttl, l); >-#endif >+ (((u16 *) (prd))[i - 1]) = cpu_to_le16(0x8000); > } else { > /* >- * For a linear request write a chain of blocks >- */ >- bttl = workreq->SCp.dma_handle; >- l = workreq->request_bufflen; >+ * For a linear request write a chain of blocks >+ */ >+ bttl = workrequ->SCp.dma_handle; >+ l = workrequ->request_bufflen; > i = 0; >-#ifdef ED_DBGP >- printk("3. bttl %x, l %x\n",bttl, l); >-#endif > while (l > 0x10000) { >- (((u16 *) (prd))[i + 3]) = 0x0000; >- (((u16 *) (prd))[i + 2]) = 0x0000; >- (((u32 *) (prd))[i >> 1]) = cpu_to_le32(bttl); >- l -= 0x10000; >- bttl += 0x10000; >- i += 0x04; >- } >- (((u16 *) (prd))[i + 3]) = cpu_to_le16(0x8000); >- (((u16 *) (prd))[i + 2]) = cpu_to_le16(l); >- (((u32 *) (prd))[i >> 1]) = cpu_to_le32(bttl); >-#ifdef ED_DBGP >- printk("prd %4x %4x %4x %4x\n",(((unsigned short int *)prd)[0]),(((unsigned short int *)prd)[1]),(((unsigned short int *)prd)[2]),(((unsigned short int *)prd)[3])); >- printk("4. bttl %x, l %x\n",bttl, l); >-#endif >- >- } >- tmpcip += 4; >-#ifdef ED_DBGP >- printk("send_s870: prdaddr_2 0x%8x tmpcip %x target_id %d\n", dev->id[c][target_id].prdaddr,tmpcip,target_id); >-#endif >- outl(dev->id[c][target_id].prdaddr, tmpcip); >+ (((u16 *) (prd))[i + 3]) = 0x0000; >+ (((u16 *) (prd))[i + 2]) = 0x0000; >+ (((u32 *) (prd))[i >> 1]) = cpu_to_le32(bttl); >+ l -= 0x10000; >+ bttl += 0x10000; >+ i += 0x04; >+ } >+ (((u16 *) (prd))[i + 3]) = cpu_to_le16(0x8000); >+ (((u16 *) (prd))[i + 2]) = cpu_to_le16(l); >+ (((u32 *) (prd))[i >> 1]) = cpu_to_le32(bttl); >+ } >+ tmpcip = tmpcip + 4; >+ dev->id[target_id].prdaddru = dev->id[target_id].prd_phys; >+ outl(dev->id[target_id].prd_phys, tmpcip); > tmpcip = tmpcip - 2; > outb(0x06, tmpcip); > outb(0x00, tmpcip); >- if (dev->dev_id == ATP885_DEVID) { >- tmpcip--; >- j=inb(tmpcip) & 0xf3; >- if ((workreq->cmnd[0] == 0x08) || (workreq->cmnd[0] == 0x28) || >- (workreq->cmnd[0] == 0x0a) || (workreq->cmnd[0] == 0x2a)) { >- j |= 0x0c; >- } >- outb(j,tmpcip); >- tmpcip--; >- } else if ((dev->dev_id == ATP880_DEVID1) || >- (dev->dev_id == ATP880_DEVID2)) { >- tmpcip =tmpcip -2; >- tmport = workport - 0x05; >- if ((workreq->cmnd[0] == 0x08) || (workreq->cmnd[0] == 0x28) || (workreq->cmnd[0] == 0x0a) || (workreq->cmnd[0] == 0x2a)) { >- outb((unsigned char) ((inb(tmport) & 0x3f) | 0xc0), tmport); >- } else { >- outb((unsigned char) (inb(tmport) & 0x3f), tmport); >- } >- } else { >- tmpcip =tmpcip -2; >- tmport = workport + 0x3a; >- if ((workreq->cmnd[0] == 0x08) || (workreq->cmnd[0] == 0x28) || (workreq->cmnd[0] == 0x0a) || (workreq->cmnd[0] == 0x2a)) { >+ tmpcip = tmpcip - 2; >+ >+ if (dev->deviceid != 0x8081) { >+ tmport = workportu + 0x3a; >+ if ((dev->ata_cdbu[0] == 0x08) || (dev->ata_cdbu[0] == 0x28) || (dev->ata_cdbu[0] == 0x0a) || (dev->ata_cdbu[0] == 0x2a)) { > outb((inb(tmport) & 0xf3) | 0x08, tmport); > } else { > outb(inb(tmport) & 0xf3, tmport); >- } >- } >- tmport = workport + 0x1c; >+ } >+ } else { >+ tmport = workportu - 0x05; >+ if ((dev->ata_cdbu[0] == 0x08) || (dev->ata_cdbu[0] == 0x28) || (dev->ata_cdbu[0] == 0x0a) || (dev->ata_cdbu[0] == 0x2a)) { >+ outb((unsigned char) ((inb(tmport) & 0x3f) | 0xc0), tmport); >+ } else { >+ outb((unsigned char) (inb(tmport) & 0x3f), tmport); >+ } >+ } >+ tmport = workportu + 0x1c; > >- if(workreq->sc_data_direction == DMA_TO_DEVICE) { >- dev->id[c][target_id].dirct = 0x20; >+ if (workrequ->sc_data_direction == DMA_TO_DEVICE) { >+ dev->id[target_id].dirctu = 0x20; > if (inb(tmport) == 0) { >- tmport = workport + 0x18; >+ tmport = workportu + 0x18; > outb(0x08, tmport); > outb(0x01, tmpcip); >-#ifdef ED_DBGP >- printk( "start DMA(to target)\n"); >-#endif > } else { >- dev->last_cmd[c] |= 0x40; >+ dev->last_cmd |= 0x40; > } >- dev->in_snd[c] = 0; >+ dev->in_snd = 0; > return; > } >- if (inb(tmport) == 0) { >- tmport = workport + 0x18; >+ if (inb(tmport) == 0) { >+ tmport = workportu + 0x18; > outb(0x08, tmport); > outb(0x09, tmpcip); >-#ifdef ED_DBGP >- printk( "start DMA(to host)\n"); >-#endif > } else { >- dev->last_cmd[c] |= 0x40; >+ dev->last_cmd |= 0x40; > } >- dev->in_snd[c] = 0; >- return; >- >+ dev->in_snd = 0; > } > > static unsigned char fun_scam(struct atp_unit *dev, unsigned short int *val) >@@ -1065,7 +808,7 @@ > unsigned short int i, k; > unsigned char j; > >- tmport = dev->ioport[0] + 0x1c; >+ tmport = dev->ioport + 0x1c; > outw(*val, tmport); > FUN_D7: > for (i = 0; i < 10; i++) { /* stable >= bus settle delay(400 ns) */ >@@ -1120,24 +863,24 @@ > } > */ > >- tmport = dev->ioport[0] + 1; >+ tmport = dev->ioport + 1; > outb(0x08, tmport++); > outb(0x7f, tmport); >- tmport = dev->ioport[0] + 0x11; >+ tmport = dev->ioport + 0x11; > outb(0x20, tmport); > > if ((dev->scam_on & 0x40) == 0) { > return; > } > m = 1; >- m <<= dev->host_id[0]; >+ m <<= dev->host_idu; > j = 16; >- if (dev->chip_ver < 4) { >+ if (dev->chip_veru < 4) { > m |= 0xff00; > j = 8; > } > assignid_map = m; >- tmport = dev->ioport[0] + 0x02; >+ tmport = dev->ioport + 0x02; > outb(0x02, tmport++); /* 2*2=4ms,3EH 2/32*3E=3.9ms */ > outb(0, tmport++); > outb(0, tmport++); >@@ -1152,7 +895,7 @@ > if ((m & assignid_map) != 0) { > continue; > } >- tmport = dev->ioport[0] + 0x0f; >+ tmport = dev->ioport + 0x0f; > outb(0, tmport++); > tmport += 0x02; > outb(0, tmport++); >@@ -1164,41 +907,40 @@ > k = i; > } > outb(k, tmport++); >- tmport = dev->ioport[0] + 0x1b; >- if (dev->chip_ver == 4) { >+ tmport = dev->ioport + 0x1b; >+ if (dev->chip_veru == 4) { > outb(0x01, tmport); > } else { > outb(0x00, tmport); > } > wait_rdyok: >- tmport = dev->ioport[0] + 0x18; >+ tmport = dev->ioport + 0x18; > outb(0x09, tmport); > tmport += 0x07; > >- while ((inb(tmport) & 0x80) == 0x00) >- cpu_relax(); >+ while ((inb(tmport) & 0x80) == 0x00); > tmport -= 0x08; > k = inb(tmport); > if (k != 0x16) { > if ((k == 0x85) || (k == 0x42)) { > continue; > } >- tmport = dev->ioport[0] + 0x10; >+ tmport = dev->ioport + 0x10; > outb(0x41, tmport); > goto wait_rdyok; > } > assignid_map |= m; > > } >- tmport = dev->ioport[0] + 0x02; >+ tmport = dev->ioport + 0x02; > outb(0x7f, tmport); >- tmport = dev->ioport[0] + 0x1b; >+ tmport = dev->ioport + 0x1b; > outb(0x02, tmport); > > outb(0, 0x80); > > val = 0x0080; /* bsy */ >- tmport = dev->ioport[0] + 0x1c; >+ tmport = dev->ioport + 0x1c; > outw(val, tmport); > val |= 0x0040; /* sel */ > outw(val, tmport); >@@ -1242,13 +984,12 @@ > if ((inb(tmport) & 0x80) == 0x00) { /* bsy ? */ > outw(0, tmport--); > outb(0, tmport); >- tmport = dev->ioport[0] + 0x15; >+ tmport = dev->ioport + 0x15; > outb(0, tmport); > tmport += 0x03; > outb(0x09, tmport); > tmport += 0x07; >- while ((inb(tmport) & 0x80) == 0) >- cpu_relax(); >+ while ((inb(tmport) & 0x80) == 0); > tmport -= 0x08; > inb(tmport); > return; >@@ -1344,7 +1085,7 @@ > > } > >-static void is870(struct atp_unit *dev, unsigned int wkport) >+static void is870(struct Scsi_Host *host, unsigned int wkport) > { > unsigned int tmport; > unsigned char i, j, k, rmb, n; >@@ -1356,25 +1097,26 @@ > static unsigned char synu[6] = { 0x80, 1, 3, 1, 0x0c, 0x0e }; > static unsigned char synw[6] = { 0x80, 1, 3, 1, 0x0c, 0x07 }; > static unsigned char wide[6] = { 0x80, 1, 2, 3, 1, 0 }; >- >+ struct atp_unit *dev = (struct atp_unit *)&host->hostdata; >+ > tmport = wkport + 0x3a; > outb((unsigned char) (inb(tmport) | 0x10), tmport); > > for (i = 0; i < 16; i++) { >- if ((dev->chip_ver != 4) && (i > 7)) { >+ if ((dev->chip_veru != 4) && (i > 7)) { > break; > } > m = 1; > m = m << i; >- if ((m & dev->active_id[0]) != 0) { >+ if ((m & dev->active_idu) != 0) { > continue; > } >- if (i == dev->host_id[0]) { >- printk(KERN_INFO " ID: %2d Host Adapter\n", dev->host_id[0]); >+ if (i == dev->host_idu) { >+ printk(KERN_INFO " ID: %2d Host Adapter\n", dev->host_idu); > continue; > } > tmport = wkport + 0x1b; >- if (dev->chip_ver == 4) { >+ if (dev->chip_veru == 4) { > outb(0x01, tmport); > } else { > outb(0x00, tmport); >@@ -1391,7 +1133,7 @@ > tmport += 0x06; > outb(0, tmport); > tmport += 0x02; >- outb(dev->id[0][i].devsp, tmport++); >+ outb(dev->id[i].devspu, tmport++); > outb(0, tmport++); > outb(satn[6], tmport++); > outb(satn[7], tmport++); >@@ -1404,17 +1146,13 @@ > outb(satn[8], tmport); > tmport += 0x07; > >- while ((inb(tmport) & 0x80) == 0x00) >- cpu_relax(); >- >+ while ((inb(tmport) & 0x80) == 0x00); > tmport -= 0x08; >- if (inb(tmport) != 0x11 && inb(tmport) != 0x8e) >+ if ((inb(tmport) != 0x11) && (inb(tmport) != 0x8e)) { > continue; >- >- while (inb(tmport) != 0x8e) >- cpu_relax(); >- >- dev->active_id[0] |= m; >+ } >+ while (inb(tmport) != 0x8e); >+ dev->active_idu |= m; > > tmport = wkport + 0x10; > outb(0x30, tmport); >@@ -1425,8 +1163,7 @@ > tmport = wkport + 0x18; > outb(0x08, tmport); > tmport += 0x07; >- while ((inb(tmport) & 0x80) == 0x00) >- cpu_relax(); >+ while ((inb(tmport) & 0x80) == 0x00); > tmport -= 0x08; > j = inb(tmport); > if (j != 0x16) { >@@ -1445,28 +1182,23 @@ > tmport += 0x07; > outb(0, tmport); > tmport += 0x02; >- outb(dev->id[0][i].devsp, tmport++); >+ outb(dev->id[i].devspu, tmport++); > outb(0, tmport++); > outb(inqd[6], tmport++); > outb(inqd[7], tmport++); > tmport += 0x03; > outb(inqd[8], tmport); > tmport += 0x07; >- >- while ((inb(tmport) & 0x80) == 0x00) >- cpu_relax(); >- >+ while ((inb(tmport) & 0x80) == 0x00); > tmport -= 0x08; >- if (inb(tmport) != 0x11 && inb(tmport) != 0x8e) >+ if ((inb(tmport) != 0x11) && (inb(tmport) != 0x8e)) { > continue; >- >- while (inb(tmport) != 0x8e) >- cpu_relax(); >- >+ } >+ while (inb(tmport) != 0x8e); > tmport = wkport + 0x1b; >- if (dev->chip_ver == 4) >+ if (dev->chip_veru == 4) { > outb(0x00, tmport); >- >+ } > tmport = wkport + 0x18; > outb(0x08, tmport); > tmport += 0x07; >@@ -1496,10 +1228,7 @@ > tmport += 0x03; > outb(0x08, tmport); > tmport += 0x07; >- >- while ((inb(tmport) & 0x80) == 0x00) >- cpu_relax(); >- >+ while ((inb(tmport) & 0x80) == 0x00); > tmport -= 0x08; > if (inb(tmport) != 0x16) { > goto sel_ok; >@@ -1507,16 +1236,16 @@ > inq_ok: > mbuf[36] = 0; > printk(KERN_INFO " ID: %2d %s\n", i, &mbuf[8]); >- dev->id[0][i].devtype = mbuf[0]; >+ dev->id[i].devtypeu = mbuf[0]; > rmb = mbuf[1]; > n = mbuf[7]; >- if (dev->chip_ver != 4) { >+ if (dev->chip_veru != 4) { > goto not_wide; > } > if ((mbuf[7] & 0x60) == 0) { > goto not_wide; > } >- if ((dev->global_map[0] & 0x20) == 0) { >+ if ((dev->global_map & 0x20) == 0) { > goto not_wide; > } > tmport = wkport + 0x1b; >@@ -1531,7 +1260,7 @@ > tmport += 0x06; > outb(0, tmport); > tmport += 0x02; >- outb(dev->id[0][i].devsp, tmport++); >+ outb(dev->id[i].devspu, tmport++); > outb(0, tmport++); > outb(satn[6], tmport++); > outb(satn[7], tmport++); >@@ -1539,16 +1268,12 @@ > outb(satn[8], tmport); > tmport += 0x07; > >- while ((inb(tmport) & 0x80) == 0x00) >- cpu_relax(); >- >+ while ((inb(tmport) & 0x80) == 0x00); > tmport -= 0x08; >- if (inb(tmport) != 0x11 && inb(tmport) != 0x8e) >+ if ((inb(tmport) != 0x11) && (inb(tmport) != 0x8e)) { > continue; >- >- while (inb(tmport) != 0x8e) >- cpu_relax(); >- >+ } >+ while (inb(tmport) != 0x8e); > try_wide: > j = 0; > tmport = wkport + 0x14; >@@ -1565,10 +1290,7 @@ > } > } > tmport -= 0x08; >- >- while ((inb(tmport) & 0x80) == 0x00) >- cpu_relax(); >- >+ while ((inb(tmport) & 0x80) == 0x00); > j = inb(tmport) & 0x0f; > if (j == 0x0f) { > goto widep_in; >@@ -1641,10 +1363,7 @@ > tmport += 0x04; > outb(0x08, tmport); > tmport += 0x07; >- >- while ((inb(tmport) & 0x80) == 0x00) >- cpu_relax(); >- >+ while ((inb(tmport) & 0x80) == 0x00); > tmport -= 0x08; > j = inb(tmport); > if (j != 0x16) { >@@ -1667,16 +1386,16 @@ > } > m = 1; > m = m << i; >- dev->wide_id[0] |= m; >+ dev->wide_idu |= m; > not_wide: >- if ((dev->id[0][i].devtype == 0x00) || (dev->id[0][i].devtype == 0x07) || ((dev->id[0][i].devtype == 0x05) && ((n & 0x10) != 0))) { >+ if ((dev->id[i].devtypeu == 0x00) || (dev->id[i].devtypeu == 0x07) || ((dev->id[i].devtypeu == 0x05) && ((n & 0x10) != 0))) { > goto set_sync; > } > continue; > set_sync: > tmport = wkport + 0x1b; > j = 0; >- if ((m & dev->wide_id[0]) != 0) { >+ if ((m & dev->wide_idu) != 0) { > j |= 0x01; > } > outb(j, tmport); >@@ -1690,7 +1409,7 @@ > tmport += 0x06; > outb(0, tmport); > tmport += 0x02; >- outb(dev->id[0][i].devsp, tmport++); >+ outb(dev->id[i].devspu, tmport++); > outb(0, tmport++); > outb(satn[6], tmport++); > outb(satn[7], tmport++); >@@ -1698,16 +1417,12 @@ > outb(satn[8], tmport); > tmport += 0x07; > >- while ((inb(tmport) & 0x80) == 0x00) >- cpu_relax(); >- >+ while ((inb(tmport) & 0x80) == 0x00); > tmport -= 0x08; >- if (inb(tmport) != 0x11 && inb(tmport) != 0x8e) >+ if ((inb(tmport) != 0x11) && (inb(tmport) != 0x8e)) { > continue; >- >- while (inb(tmport) != 0x8e) >- cpu_relax(); >- >+ } >+ while (inb(tmport) != 0x8e); > try_sync: > j = 0; > tmport = wkport + 0x14; >@@ -1719,10 +1434,10 @@ > while ((inb(tmport) & 0x80) == 0) { > if ((inb(tmport) & 0x01) != 0) { > tmport -= 0x06; >- if ((m & dev->wide_id[0]) != 0) { >+ if ((m & dev->wide_idu) != 0) { > outb(synw[j++], tmport); > } else { >- if ((m & dev->ultra_map[0]) != 0) { >+ if ((m & dev->ultra_map) != 0) { > outb(synu[j++], tmport); > } else { > outb(synn[j++], tmport); >@@ -1732,10 +1447,7 @@ > } > } > tmport -= 0x08; >- >- while ((inb(tmport) & 0x80) == 0x00) >- cpu_relax(); >- >+ while ((inb(tmport) & 0x80) == 0x00); > j = inb(tmport) & 0x0f; > if (j == 0x0f) { > goto phase_ins; >@@ -1793,10 +1505,7 @@ > goto phase_ins1; > } > tmport -= 0x08; >- >- while ((inb(tmport) & 0x80) == 0x00) >- cpu_relax(); >- >+ while ((inb(tmport) & 0x80) == 0x00); > j = inb(tmport); > if (j == 0x85) { > goto tar_dcons; >@@ -1821,10 +1530,7 @@ > tmport += 0x04; > outb(0x08, tmport); > tmport += 0x07; >- >- while ((inb(tmport) & 0x80) == 0x00) >- cpu_relax(); >- >+ while ((inb(tmport) & 0x80) == 0x00); > tmport -= 0x08; > j = inb(tmport); > if (j != 0x16) { >@@ -1845,7 +1551,7 @@ > if (mbuf[4] > 0x0c) { > mbuf[4] = 0x0c; > } >- dev->id[0][i].devsp = mbuf[4]; >+ dev->id[i].devspu = mbuf[4]; > if ((mbuf[3] < 0x0d) && (rmb == 0)) { > j = 0xa0; > goto set_syn_ok; >@@ -1864,13 +1570,13 @@ > } > j = 0x60; > set_syn_ok: >- dev->id[0][i].devsp = (dev->id[0][i].devsp & 0x0f) | j; >+ dev->id[i].devspu = (dev->id[i].devspu & 0x0f) | j; > } > tmport = wkport + 0x3a; > outb((unsigned char) (inb(tmport) & 0xef), tmport); > } > >-static void is880(struct atp_unit *dev, unsigned int wkport) >+static void is880(struct Scsi_Host *host, unsigned int wkport) > { > unsigned int tmport; > unsigned char i, j, k, rmb, n, lvdmode; >@@ -1884,17 +1590,18 @@ > unsigned char synuw[6] = { 0x80, 1, 3, 1, 0x0a, 0x0e }; > static unsigned char wide[6] = { 0x80, 1, 2, 3, 1, 0 }; > static unsigned char u3[9] = { 0x80, 1, 6, 4, 0x09, 00, 0x0e, 0x01, 0x02 }; >+ struct atp_unit *dev = (struct atp_unit *)&host->hostdata; > > lvdmode = inb(wkport + 0x3f) & 0x40; > > for (i = 0; i < 16; i++) { > m = 1; > m = m << i; >- if ((m & dev->active_id[0]) != 0) { >+ if ((m & dev->active_idu) != 0) { > continue; > } >- if (i == dev->host_id[0]) { >- printk(KERN_INFO " ID: %2d Host Adapter\n", dev->host_id[0]); >+ if (i == dev->host_idu) { >+ printk(KERN_INFO " ID: %2d Host Adapter\n", dev->host_idu); > continue; > } > tmport = wkport + 0x5b; >@@ -1911,7 +1618,7 @@ > tmport += 0x06; > outb(0, tmport); > tmport += 0x02; >- outb(dev->id[0][i].devsp, tmport++); >+ outb(dev->id[i].devspu, tmport++); > outb(0, tmport++); > outb(satn[6], tmport++); > outb(satn[7], tmport++); >@@ -1924,17 +1631,13 @@ > outb(satn[8], tmport); > tmport += 0x07; > >- while ((inb(tmport) & 0x80) == 0x00) >- cpu_relax(); >- >+ while ((inb(tmport) & 0x80) == 0x00); > tmport -= 0x08; >- if (inb(tmport) != 0x11 && inb(tmport) != 0x8e) >+ if ((inb(tmport) != 0x11) && (inb(tmport) != 0x8e)) { > continue; >- >- while (inb(tmport) != 0x8e) >- cpu_relax(); >- >- dev->active_id[0] |= m; >+ } >+ while (inb(tmport) != 0x8e); >+ dev->active_idu |= m; > > tmport = wkport + 0x50; > outb(0x30, tmport); >@@ -1945,10 +1648,7 @@ > tmport = wkport + 0x58; > outb(0x08, tmport); > tmport += 0x07; >- >- while ((inb(tmport) & 0x80) == 0x00) >- cpu_relax(); >- >+ while ((inb(tmport) & 0x80) == 0x00); > tmport -= 0x08; > j = inb(tmport); > if (j != 0x16) { >@@ -1967,24 +1667,19 @@ > tmport += 0x07; > outb(0, tmport); > tmport += 0x02; >- outb(dev->id[0][i].devsp, tmport++); >+ outb(dev->id[i].devspu, tmport++); > outb(0, tmport++); > outb(inqd[6], tmport++); > outb(inqd[7], tmport++); > tmport += 0x03; > outb(inqd[8], tmport); > tmport += 0x07; >- >- while ((inb(tmport) & 0x80) == 0x00) >- cpu_relax(); >- >+ while ((inb(tmport) & 0x80) == 0x00); > tmport -= 0x08; >- if (inb(tmport) != 0x11 && inb(tmport) != 0x8e) >+ if ((inb(tmport) != 0x11) && (inb(tmport) != 0x8e)) { > continue; >- >- while (inb(tmport) != 0x8e) >- cpu_relax(); >- >+ } >+ while (inb(tmport) != 0x8e); > tmport = wkport + 0x5b; > outb(0x00, tmport); > tmport = wkport + 0x58; >@@ -2016,29 +1711,27 @@ > tmport += 0x03; > outb(0x08, tmport); > tmport += 0x07; >- while ((inb(tmport) & 0x80) == 0x00) >- cpu_relax(); >- >+ while ((inb(tmport) & 0x80) == 0x00); > tmport -= 0x08; >- if (inb(tmport) != 0x16) >+ if (inb(tmport) != 0x16) { > goto sel_ok; >- >+ } > inq_ok: > mbuf[36] = 0; > printk(KERN_INFO " ID: %2d %s\n", i, &mbuf[8]); >- dev->id[0][i].devtype = mbuf[0]; >+ dev->id[i].devtypeu = mbuf[0]; > rmb = mbuf[1]; > n = mbuf[7]; > if ((mbuf[7] & 0x60) == 0) { > goto not_wide; > } >- if ((i < 8) && ((dev->global_map[0] & 0x20) == 0)) { >+ if ((i < 8) && ((dev->global_map & 0x20) == 0)) { > goto not_wide; > } > if (lvdmode == 0) { > goto chg_wide; > } >- if (dev->sp[0][i] != 0x04) // force u2 >+ if (dev->sp[i] != 0x04) // force u2 > { > goto chg_wide; > } >@@ -2055,7 +1748,7 @@ > tmport += 0x06; > outb(0, tmport); > tmport += 0x02; >- outb(dev->id[0][i].devsp, tmport++); >+ outb(dev->id[i].devspu, tmport++); > outb(0, tmport++); > outb(satn[6], tmport++); > outb(satn[7], tmport++); >@@ -2063,17 +1756,12 @@ > outb(satn[8], tmport); > tmport += 0x07; > >- while ((inb(tmport) & 0x80) == 0x00) >- cpu_relax(); >- >+ while ((inb(tmport) & 0x80) == 0x00); > tmport -= 0x08; >- >- if (inb(tmport) != 0x11 && inb(tmport) != 0x8e) >+ if ((inb(tmport) != 0x11) && (inb(tmport) != 0x8e)) { > continue; >- >- while (inb(tmport) != 0x8e) >- cpu_relax(); >- >+ } >+ while (inb(tmport) != 0x8e); > try_u3: > j = 0; > tmport = wkport + 0x54; >@@ -2090,10 +1778,7 @@ > } > } > tmport -= 0x08; >- >- while ((inb(tmport) & 0x80) == 0x00) >- cpu_relax(); >- >+ while ((inb(tmport) & 0x80) == 0x00); > j = inb(tmport) & 0x0f; > if (j == 0x0f) { > goto u3p_in; >@@ -2166,10 +1851,7 @@ > tmport += 0x04; > outb(0x08, tmport); > tmport += 0x07; >- >- while ((inb(tmport) & 0x80) == 0x00) >- cpu_relax(); >- >+ while ((inb(tmport) & 0x80) == 0x00); > tmport -= 0x08; > j = inb(tmport); > if (j != 0x16) { >@@ -2190,8 +1872,8 @@ > if (mbuf[3] == 0x09) { > m = 1; > m = m << i; >- dev->wide_id[0] |= m; >- dev->id[0][i].devsp = 0xce; >+ dev->wide_idu |= m; >+ dev->id[i].devspu = 0xce; > continue; > } > chg_wide: >@@ -2207,7 +1889,7 @@ > tmport += 0x06; > outb(0, tmport); > tmport += 0x02; >- outb(dev->id[0][i].devsp, tmport++); >+ outb(dev->id[i].devspu, tmport++); > outb(0, tmport++); > outb(satn[6], tmport++); > outb(satn[7], tmport++); >@@ -2215,16 +1897,12 @@ > outb(satn[8], tmport); > tmport += 0x07; > >- while ((inb(tmport) & 0x80) == 0x00) >- cpu_relax(); >- >+ while ((inb(tmport) & 0x80) == 0x00); > tmport -= 0x08; >- if (inb(tmport) != 0x11 && inb(tmport) != 0x8e) >+ if ((inb(tmport) != 0x11) && (inb(tmport) != 0x8e)) { > continue; >- >- while (inb(tmport) != 0x8e) >- cpu_relax(); >- >+ } >+ while (inb(tmport) != 0x8e); > try_wide: > j = 0; > tmport = wkport + 0x54; >@@ -2241,9 +1919,7 @@ > } > } > tmport -= 0x08; >- while ((inb(tmport) & 0x80) == 0x00) >- cpu_relax(); >- >+ while ((inb(tmport) & 0x80) == 0x00); > j = inb(tmport) & 0x0f; > if (j == 0x0f) { > goto widep_in; >@@ -2316,10 +1992,7 @@ > tmport += 0x04; > outb(0x08, tmport); > tmport += 0x07; >- >- while ((inb(tmport) & 0x80) == 0x00) >- cpu_relax(); >- >+ while ((inb(tmport) & 0x80) == 0x00); > tmport -= 0x08; > j = inb(tmport); > if (j != 0x16) { >@@ -2342,29 +2015,29 @@ > } > m = 1; > m = m << i; >- dev->wide_id[0] |= m; >+ dev->wide_idu |= m; > not_wide: >- if ((dev->id[0][i].devtype == 0x00) || (dev->id[0][i].devtype == 0x07) || ((dev->id[0][i].devtype == 0x05) && ((n & 0x10) != 0))) { >+ if ((dev->id[i].devtypeu == 0x00) || (dev->id[i].devtypeu == 0x07) || ((dev->id[i].devtypeu == 0x05) && ((n & 0x10) != 0))) { > m = 1; > m = m << i; >- if ((dev->async[0] & m) != 0) { >+ if ((dev->async & m) != 0) { > goto set_sync; > } > } > continue; > set_sync: >- if (dev->sp[0][i] == 0x02) { >+ if (dev->sp[i] == 0x02) { > synu[4] = 0x0c; > synuw[4] = 0x0c; > } else { >- if (dev->sp[0][i] >= 0x03) { >+ if (dev->sp[i] >= 0x03) { > synu[4] = 0x0a; > synuw[4] = 0x0a; > } > } > tmport = wkport + 0x5b; > j = 0; >- if ((m & dev->wide_id[0]) != 0) { >+ if ((m & dev->wide_idu) != 0) { > j |= 0x01; > } > outb(j, tmport); >@@ -2378,7 +2051,7 @@ > tmport += 0x06; > outb(0, tmport); > tmport += 0x02; >- outb(dev->id[0][i].devsp, tmport++); >+ outb(dev->id[i].devspu, tmport++); > outb(0, tmport++); > outb(satn[6], tmport++); > outb(satn[7], tmport++); >@@ -2386,16 +2059,12 @@ > outb(satn[8], tmport); > tmport += 0x07; > >- while ((inb(tmport) & 0x80) == 0x00) >- cpu_relax(); >- >+ while ((inb(tmport) & 0x80) == 0x00); > tmport -= 0x08; > if ((inb(tmport) != 0x11) && (inb(tmport) != 0x8e)) { > continue; > } >- while (inb(tmport) != 0x8e) >- cpu_relax(); >- >+ while (inb(tmport) != 0x8e); > try_sync: > j = 0; > tmport = wkport + 0x54; >@@ -2407,14 +2076,14 @@ > while ((inb(tmport) & 0x80) == 0) { > if ((inb(tmport) & 0x01) != 0) { > tmport -= 0x06; >- if ((m & dev->wide_id[0]) != 0) { >- if ((m & dev->ultra_map[0]) != 0) { >+ if ((m & dev->wide_idu) != 0) { >+ if ((m & dev->ultra_map) != 0) { > outb(synuw[j++], tmport); > } else { > outb(synw[j++], tmport); > } > } else { >- if ((m & dev->ultra_map[0]) != 0) { >+ if ((m & dev->ultra_map) != 0) { > outb(synu[j++], tmport); > } else { > outb(synn[j++], tmport); >@@ -2424,10 +2093,7 @@ > } > } > tmport -= 0x08; >- >- while ((inb(tmport) & 0x80) == 0x00) >- cpu_relax(); >- >+ while ((inb(tmport) & 0x80) == 0x00); > j = inb(tmport) & 0x0f; > if (j == 0x0f) { > goto phase_ins; >@@ -2485,10 +2151,7 @@ > goto phase_ins1; > } > tmport -= 0x08; >- >- while ((inb(tmport) & 0x80) == 0x00) >- cpu_relax(); >- >+ while ((inb(tmport) & 0x80) == 0x00); > j = inb(tmport); > if (j == 0x85) { > goto tar_dcons; >@@ -2513,10 +2176,7 @@ > tmport += 0x04; > outb(0x08, tmport); > tmport += 0x07; >- >- while ((inb(tmport) & 0x80) == 0x00) >- cpu_relax(); >- >+ while ((inb(tmport) & 0x80) == 0x00); > tmport -= 0x08; > j = inb(tmport); > if (j != 0x16) { >@@ -2537,7 +2197,7 @@ > if (mbuf[4] > 0x0e) { > mbuf[4] = 0x0e; > } >- dev->id[0][i].devsp = mbuf[4]; >+ dev->id[i].devspu = mbuf[4]; > if (mbuf[3] < 0x0c) { > j = 0xb0; > goto set_syn_ok; >@@ -2560,537 +2220,343 @@ > } > j = 0x60; > set_syn_ok: >- dev->id[0][i].devsp = (dev->id[0][i].devsp & 0x0f) | j; >+ dev->id[i].devspu = (dev->id[i].devspu & 0x0f) | j; > } > } > > static void atp870u_free_tables(struct Scsi_Host *host) > { > struct atp_unit *atp_dev = (struct atp_unit *)&host->hostdata; >- int j, k; >- for (j=0; j < 2; j++) { >- for (k = 0; k < 16; k++) { >- if (!atp_dev->id[j][k].prd_table) >- continue; >- pci_free_consistent(atp_dev->pdev, 1024, atp_dev->id[j][k].prd_table, atp_dev->id[j][k].prdaddr); >- atp_dev->id[j][k].prd_table = NULL; >- } >+ int k; >+ >+ for (k = 0; k < 16; k++) { >+ if (!atp_dev->id[k].prd_tableu) >+ continue; >+ pci_free_consistent(atp_dev->pdev, 1024, atp_dev->id[k].prd_tableu, >+ atp_dev->id[k].prd_phys); >+ atp_dev->id[k].prd_tableu = NULL; > } > } > > static int atp870u_init_tables(struct Scsi_Host *host) > { >- struct atp_unit *atp_dev = (struct atp_unit *)&host->hostdata; >- int c,k; >- for(c=0;c < 2;c++) { >- for(k=0;k<16;k++) { >- atp_dev->id[c][k].prd_table = pci_alloc_consistent(atp_dev->pdev, 1024, &(atp_dev->id[c][k].prdaddr)); >- if (!atp_dev->id[c][k].prd_table) { >- printk("atp870u_init_tables fail\n"); >- atp870u_free_tables(host); >- return -ENOMEM; >- } >- atp_dev->id[c][k].devsp=0x20; >- atp_dev->id[c][k].devtype = 0x7f; >- atp_dev->id[c][k].curr_req = NULL; >- } >- >- atp_dev->active_id[c] = 0; >- atp_dev->wide_id[c] = 0; >- atp_dev->host_id[c] = 0x07; >- atp_dev->quhd[c] = 0; >- atp_dev->quend[c] = 0; >- atp_dev->last_cmd[c] = 0xff; >- atp_dev->in_snd[c] = 0; >- atp_dev->in_int[c] = 0; >- >- for (k = 0; k < qcnt; k++) { >- atp_dev->quereq[c][k] = NULL; >- } >- for (k = 0; k < 16; k++) { >- atp_dev->id[c][k].curr_req = NULL; >- atp_dev->sp[c][k] = 0x04; >- } >+ struct atp_unit *dev = (struct atp_unit *)&host->hostdata; >+ int k, i; >+ >+ for (i = k = 0; k < 16; k++) { >+ dev->id[k].prd_tableu = pci_alloc_consistent(dev->pdev, 1024, &dev->id[k].prd_phys); >+ if (!dev->id[k].prd_tableu) { >+ atp870u_free_tables(host); >+ return -ENOMEM; >+ } >+ dev->id[k].devspu = 0x20; >+ dev->id[k].devtypeu = 0; >+ dev->id[k].curr_req = NULL; >+ } >+ dev->active_idu = 0; >+ dev->wide_idu = 0; >+ dev->host_idu = 0x07; >+ dev->quhdu = 0; >+ dev->quendu = 0; >+ dev->chip_veru = 0; >+ dev->last_cmd = 0xff; >+ dev->in_snd = 0; >+ dev->in_int = 0; >+ for (k = 0; k < qcnt; k++) { >+ dev->querequ[k] = NULL; >+ } >+ for (k = 0; k < 16; k++) { >+ dev->id[k].curr_req = NULL; >+ dev->sp[k] = 0x04; > } > return 0; > } > > /* return non-zero on detection */ >-static int atp870u_probe(struct pci_dev *pdev, const struct pci_device_id *ent) >+static int atp870u_probe(struct pci_dev *dev, const struct pci_device_id *ent) > { >- unsigned char k, m, c; >+ unsigned char k, m; > unsigned long flags; >- unsigned int base_io, tmport, error,n; >+ unsigned int base_io, error, tmport; > unsigned char host_id; >- struct Scsi_Host *shpnt = NULL; >+ unsigned short n; >+ struct Scsi_Host *shpnt; > struct atp_unit atp_dev, *p; >- unsigned char setupdata[2][16]; >- int count = 0; >- >- if (pci_enable_device(pdev)) >- return -EIO; >+ static int count; > >- if (!pci_set_dma_mask(pdev, 0xFFFFFFFFUL)) { >- printk(KERN_INFO "atp870u: use 32bit DMA mask.\n"); >- } else { >- printk(KERN_ERR "atp870u: DMA mask required but not available.\n"); >- return -EIO; >- } >+ if (pci_enable_device(dev)) >+ return -EIO; > >+ if (pci_set_dma_mask(dev, 0xFFFFFFFFUL)) { >+ printk(KERN_ERR "atp870u: 32bit DMA mask required but not available.\n"); >+ return -EIO; >+ } >+ > memset(&atp_dev, 0, sizeof atp_dev); >+ > /* > * It's probably easier to weed out some revisions like > * this than via the PCI device table > */ > if (ent->device == PCI_DEVICE_ID_ARTOP_AEC7610) { >- error = pci_read_config_byte(pdev, PCI_CLASS_REVISION, &atp_dev.chip_ver); >- if (atp_dev.chip_ver < 2) >+ error = pci_read_config_byte(dev, PCI_CLASS_REVISION, &atp_dev.chip_veru); >+ if (atp_dev.chip_veru < 2) > return -EIO; > } > > switch (ent->device) { >+ case 0x8081: > case PCI_DEVICE_ID_ARTOP_AEC7612UW: > case PCI_DEVICE_ID_ARTOP_AEC7612SUW: >- case ATP880_DEVID1: >- case ATP880_DEVID2: >- case ATP885_DEVID: >- atp_dev.chip_ver = 0x04; >+ atp_dev.chip_veru = 0x04; > default: > break; > } >- base_io = pci_resource_start(pdev, 0); >- base_io &= 0xfffffff8; >- >- if ((ent->device == ATP880_DEVID1)||(ent->device == ATP880_DEVID2)) { >- error = pci_read_config_byte(pdev, PCI_CLASS_REVISION, &atp_dev.chip_ver); >- pci_write_config_byte(pdev, PCI_LATENCY_TIMER, 0x80);//JCC082803 >- >- host_id = inb(base_io + 0x39); >- host_id >>= 0x04; > >- printk(KERN_INFO " ACARD AEC-67160 PCI Ultra3 LVD Host Adapter: %d" >- " IO:%x, IRQ:%d.\n", count, base_io, pdev->irq); >- atp_dev.ioport[0] = base_io + 0x40; >- atp_dev.pciport[0] = base_io + 0x28; >- atp_dev.dev_id = ent->device; >- atp_dev.host_id[0] = host_id; >+ base_io = pci_resource_start(dev, 0); > >+ if (ent->device != 0x8081) { >+ error = pci_read_config_byte(dev, 0x49, &host_id); >+ base_io &= 0xfffffff8; >+ >+ printk(KERN_INFO " ACARD AEC-671X PCI Ultra/W SCSI-3 Host Adapter: %d " >+ "IO:%x, IRQ:%d.\n", count, base_io, dev->irq); >+ >+ atp_dev.unit = count; >+ atp_dev.ioport = base_io; >+ atp_dev.pciport = base_io + 0x20; >+ atp_dev.deviceid = ent->device; >+ host_id &= 0x07; >+ atp_dev.host_idu = host_id; > tmport = base_io + 0x22; > atp_dev.scam_on = inb(tmport); >- tmport += 0x13; >- atp_dev.global_map[0] = inb(tmport); >- tmport += 0x07; >- atp_dev.ultra_map[0] = inw(tmport); >+ tmport += 0x0b; >+ atp_dev.global_map = inb(tmport++); >+ atp_dev.ultra_map = inw(tmport); > >- n = 0x3f09; >-next_fblk_880: >- if (n >= 0x4000) >- goto flash_ok_880; >+ if (atp_dev.ultra_map == 0) { >+ atp_dev.scam_on = 0x00; >+ atp_dev.global_map = 0x20; >+ atp_dev.ultra_map = 0xffff; >+ } > >- m = 0; >- outw(n, base_io + 0x34); >- n += 0x0002; >- if (inb(base_io + 0x30) == 0xff) >- goto flash_ok_880; >- >- atp_dev.sp[0][m++] = inb(base_io + 0x30); >- atp_dev.sp[0][m++] = inb(base_io + 0x31); >- atp_dev.sp[0][m++] = inb(base_io + 0x32); >- atp_dev.sp[0][m++] = inb(base_io + 0x33); >- outw(n, base_io + 0x34); >- n += 0x0002; >- atp_dev.sp[0][m++] = inb(base_io + 0x30); >- atp_dev.sp[0][m++] = inb(base_io + 0x31); >- atp_dev.sp[0][m++] = inb(base_io + 0x32); >- atp_dev.sp[0][m++] = inb(base_io + 0x33); >- outw(n, base_io + 0x34); >- n += 0x0002; >- atp_dev.sp[0][m++] = inb(base_io + 0x30); >- atp_dev.sp[0][m++] = inb(base_io + 0x31); >- atp_dev.sp[0][m++] = inb(base_io + 0x32); >- atp_dev.sp[0][m++] = inb(base_io + 0x33); >- outw(n, base_io + 0x34); >- n += 0x0002; >- atp_dev.sp[0][m++] = inb(base_io + 0x30); >- atp_dev.sp[0][m++] = inb(base_io + 0x31); >- atp_dev.sp[0][m++] = inb(base_io + 0x32); >- atp_dev.sp[0][m++] = inb(base_io + 0x33); >- n += 0x0018; >- goto next_fblk_880; >-flash_ok_880: >- outw(0, base_io + 0x34); >- atp_dev.ultra_map[0] = 0; >- atp_dev.async[0] = 0; >- for (k = 0; k < 16; k++) { >- n = 1; >- n = n << k; >- if (atp_dev.sp[0][k] > 1) { >- atp_dev.ultra_map[0] |= n; >- } else { >- if (atp_dev.sp[0][k] == 0) >- atp_dev.async[0] |= n; >- } >- } >- atp_dev.async[0] = ~(atp_dev.async[0]); >- outb(atp_dev.global_map[0], base_io + 0x35); >- >- shpnt = scsi_host_alloc(&atp870u_template, sizeof(struct atp_unit)); >- if (!shpnt) >- return -ENOMEM; >+ shpnt = scsi_host_alloc(&atp870u_template, sizeof(struct atp_unit)); >+ if (!shpnt) >+ return -ENOMEM; > > p = (struct atp_unit *)&shpnt->hostdata; >- >+ > atp_dev.host = shpnt; >- atp_dev.pdev = pdev; >- pci_set_drvdata(pdev, p); >+ atp_dev.pdev = dev; >+ pci_set_drvdata(dev, p); > memcpy(p, &atp_dev, sizeof atp_dev); >- if (atp870u_init_tables(shpnt) < 0) { >- printk(KERN_ERR "Unable to allocate tables for Acard controller\n"); >+ if (atp870u_init_tables(shpnt) < 0) > goto unregister; >- } > >- if (request_irq(pdev->irq, atp870u_intr_handle, SA_SHIRQ, "atp880i", shpnt)) { >- printk(KERN_ERR "Unable to allocate IRQ%d for Acard controller.\n", pdev->irq); >+ if (request_irq(dev->irq, atp870u_intr_handle, SA_SHIRQ, "atp870u", shpnt)) { >+ printk(KERN_ERR "Unable to allocate IRQ%d for Acard controller.\n", dev->irq); > goto free_tables; > } > > spin_lock_irqsave(shpnt->host_lock, flags); >- tmport = base_io + 0x38; >- k = inb(tmport) & 0x80; >+ if (atp_dev.chip_veru > 0x07) { /* check if atp876 chip then enable terminator */ >+ tmport = base_io + 0x3e; >+ outb(0x00, tmport); >+ } >+ >+ tmport = base_io + 0x3a; >+ k = (inb(tmport) & 0xf3) | 0x10; > outb(k, tmport); >- tmport += 0x03; >- outb(0x20, tmport); >+ outb((k & 0xdf), tmport); > mdelay(32); >- outb(0, tmport); >+ outb(k, tmport); > mdelay(32); >- tmport = base_io + 0x5b; >- inb(tmport); >- tmport -= 0x04; >- inb(tmport); >- tmport = base_io + 0x40; >+ tmport = base_io; > outb((host_id | 0x08), tmport); > tmport += 0x18; > outb(0, tmport); > tmport += 0x07; > while ((inb(tmport) & 0x80) == 0) > mdelay(1); >- tmport -= 0x08; >- inb(tmport); >- tmport = base_io + 0x41; >- outb(8, tmport++); >- outb(0x7f, tmport); >- tmport = base_io + 0x51; >- outb(0x20, tmport); >- >- tscam(shpnt); >- is880(p, base_io); >- tmport = base_io + 0x38; >- outb(0xb0, tmport); >- shpnt->max_id = 16; >- shpnt->this_id = host_id; >- shpnt->unique_id = base_io; >- shpnt->io_port = base_io; >- shpnt->n_io_port = 0x60; /* Number of bytes of I/O space used */ >- shpnt->irq = pdev->irq; >- } else if (ent->device == ATP885_DEVID) { >- printk(KERN_INFO " ACARD AEC-67162 PCI Ultra3 LVD Host Adapter: IO:%x, IRQ:%d.\n" >- , base_io, pdev->irq); >- >- atp_dev.pdev = pdev; >- atp_dev.dev_id = ent->device; >- atp_dev.baseport = base_io; >- atp_dev.ioport[0] = base_io + 0x80; >- atp_dev.ioport[1] = base_io + 0xc0; >- atp_dev.pciport[0] = base_io + 0x40; >- atp_dev.pciport[1] = base_io + 0x50; >- >- shpnt = scsi_host_alloc(&atp870u_template, sizeof(struct atp_unit)); >- if (!shpnt) >- return -ENOMEM; >- >- p = (struct atp_unit *)&shpnt->hostdata; >- >- atp_dev.host = shpnt; >- atp_dev.pdev = pdev; >- pci_set_drvdata(pdev, p); >- memcpy(p, &atp_dev, sizeof(struct atp_unit)); >- if (atp870u_init_tables(shpnt) < 0) >- goto unregister; >- >-#ifdef ED_DBGP >- printk("request_irq() shpnt %p hostdata %p\n", shpnt, p); >-#endif >- if (request_irq(pdev->irq, atp870u_intr_handle, SA_SHIRQ, "atp870u", shpnt)) { >- printk(KERN_ERR "Unable to allocate IRQ for Acard controller.\n"); >- goto free_tables; >- } >- >- spin_lock_irqsave(shpnt->host_lock, flags); >- >- c=inb(base_io + 0x29); >- outb((c | 0x04),base_io + 0x29); >- >- n=0x1f80; >-next_fblk_885: >- if (n >= 0x2000) { >- goto flash_ok_885; >- } >- outw(n,base_io + 0x3c); >- if (inl(base_io + 0x38) == 0xffffffff) { >- goto flash_ok_885; >- } >- for (m=0; m < 2; m++) { >- p->global_map[m]= 0; >- for (k=0; k < 4; k++) { >- outw(n++,base_io + 0x3c); >- ((unsigned long *)&setupdata[m][0])[k]=inl(base_io + 0x38); >- } >- for (k=0; k < 4; k++) { >- outw(n++,base_io + 0x3c); >- ((unsigned long *)&p->sp[m][0])[k]=inl(base_io + 0x38); >- } >- n += 8; >- } >- goto next_fblk_885; >-flash_ok_885: >-#ifdef ED_DBGP >- printk( "Flash Read OK\n"); >-#endif >- c=inb(base_io + 0x29); >- outb((c & 0xfb),base_io + 0x29); >- for (c=0;c < 2;c++) { >- p->ultra_map[c]=0; >- p->async[c] = 0; >- for (k=0; k < 16; k++) { >- n=1; >- n = n << k; >- if (p->sp[c][k] > 1) { >- p->ultra_map[c] |= n; >- } else { >- if (p->sp[c][k] == 0) { >- p->async[c] |= n; >- } >- } >- } >- p->async[c] = ~(p->async[c]); >- >- if (p->global_map[c] == 0) { >- k=setupdata[c][1]; >- if ((k & 0x40) != 0) >- p->global_map[c] |= 0x20; >- k &= 0x07; >- p->global_map[c] |= k; >- if ((setupdata[c][2] & 0x04) != 0) >- p->global_map[c] |= 0x08; >- p->host_id[c] = setupdata[c][0] & 0x07; >- } >- } >- >- k = inb(base_io + 0x28) & 0x8f; >- k |= 0x10; >- outb(k, base_io + 0x28); >- outb(0x80, base_io + 0x41); >- outb(0x80, base_io + 0x51); >- mdelay(100); >- outb(0, base_io + 0x41); >- outb(0, base_io + 0x51); >- mdelay(1000); >- inb(base_io + 0x9b); >- inb(base_io + 0x97); >- inb(base_io + 0xdb); >- inb(base_io + 0xd7); >- tmport = base_io + 0x80; >- k=p->host_id[0]; >- if (k > 7) >- k = (k & 0x07) | 0x40; >- k |= 0x08; >- outb(k, tmport); >- tmport += 0x18; >- outb(0, tmport); >- tmport += 0x07; >- >- while ((inb(tmport) & 0x80) == 0) >- cpu_relax(); >- >- tmport -= 0x08; >- inb(tmport); >- tmport = base_io + 0x81; >- outb(8, tmport++); >- outb(0x7f, tmport); >- tmport = base_io + 0x91; >- outb(0x20, tmport); >- >- tmport = base_io + 0xc0; >- k=p->host_id[1]; >- if (k > 7) >- k = (k & 0x07) | 0x40; >- k |= 0x08; >- outb(k, tmport); >- tmport += 0x18; >- outb(0, tmport); >- tmport += 0x07; >- >- while ((inb(tmport) & 0x80) == 0) >- cpu_relax(); > > tmport -= 0x08; > inb(tmport); >- tmport = base_io + 0xc1; >+ tmport = base_io + 1; > outb(8, tmport++); > outb(0x7f, tmport); >- tmport = base_io + 0xd1; >+ tmport = base_io + 0x11; > outb(0x20, tmport); > >- tscam_885(); >- printk(KERN_INFO " Scanning Channel A SCSI Device ...\n"); >- is885(p, base_io + 0x80, 0); >- printk(KERN_INFO " Scanning Channel B SCSI Device ...\n"); >- is885(p, base_io + 0xc0, 1); >- >- k = inb(base_io + 0x28) & 0xcf; >- k |= 0xc0; >- outb(k, base_io + 0x28); >- k = inb(base_io + 0x1f) | 0x80; >- outb(k, base_io + 0x1f); >- k = inb(base_io + 0x29) | 0x01; >- outb(k, base_io + 0x29); >-#ifdef ED_DBGP >- //printk("atp885: atp_host[0] 0x%p\n", atp_host[0]); >-#endif >- shpnt->max_id = 16; >- shpnt->max_lun = (p->global_map[0] & 0x07) + 1; >- shpnt->max_channel = 1; >- shpnt->this_id = p->host_id[0]; >- shpnt->unique_id = base_io; >- shpnt->io_port = base_io; >- shpnt->n_io_port = 0xff; /* Number of bytes of I/O space used */ >- shpnt->irq = pdev->irq; >- >+ tscam(shpnt); >+ is870(shpnt, base_io); >+ tmport = base_io + 0x3a; >+ outb((inb(tmport) & 0xef), tmport); >+ tmport++; >+ outb((inb(tmport) | 0x20), tmport); > } else { >- error = pci_read_config_byte(pdev, 0x49, &host_id); >+ base_io &= 0xfffffff8; >+ host_id = inb(base_io + 0x39); >+ host_id >>= 0x04; > >- printk(KERN_INFO " ACARD AEC-671X PCI Ultra/W SCSI-2/3 Host Adapter: %d " >- "IO:%x, IRQ:%d.\n", count, base_io, pdev->irq); >+ printk(KERN_INFO " ACARD AEC-67160 PCI Ultra3 LVD Host Adapter: %d" >+ " IO:%x, IRQ:%d.\n", count, base_io, dev->irq); >+ atp_dev.ioport = base_io + 0x40; >+ atp_dev.pciport = base_io + 0x28; >+ atp_dev.deviceid = ent->device; >+ atp_dev.host_idu = host_id; > >- atp_dev.ioport[0] = base_io; >- atp_dev.pciport[0] = base_io + 0x20; >- atp_dev.dev_id = ent->device; >- host_id &= 0x07; >- atp_dev.host_id[0] = host_id; > tmport = base_io + 0x22; > atp_dev.scam_on = inb(tmport); >- tmport += 0x0b; >- atp_dev.global_map[0] = inb(tmport++); >- atp_dev.ultra_map[0] = inw(tmport); >+ tmport += 0x13; >+ atp_dev.global_map = inb(tmport); >+ tmport += 0x07; >+ atp_dev.ultra_map = inw(tmport); > >- if (atp_dev.ultra_map[0] == 0) { >- atp_dev.scam_on = 0x00; >- atp_dev.global_map[0] = 0x20; >- atp_dev.ultra_map[0] = 0xffff; >- } >+ n = 0x3f09; >+next_fblk: >+ if (n >= 0x4000) >+ goto flash_ok; >+ >+ m = 0; >+ outw(n, base_io + 0x34); >+ n += 0x0002; >+ if (inb(base_io + 0x30) == 0xff) >+ goto flash_ok; > >+ atp_dev.sp[m++] = inb(base_io + 0x30); >+ atp_dev.sp[m++] = inb(base_io + 0x31); >+ atp_dev.sp[m++] = inb(base_io + 0x32); >+ atp_dev.sp[m++] = inb(base_io + 0x33); >+ outw(n, base_io + 0x34); >+ n += 0x0002; >+ atp_dev.sp[m++] = inb(base_io + 0x30); >+ atp_dev.sp[m++] = inb(base_io + 0x31); >+ atp_dev.sp[m++] = inb(base_io + 0x32); >+ atp_dev.sp[m++] = inb(base_io + 0x33); >+ outw(n, base_io + 0x34); >+ n += 0x0002; >+ atp_dev.sp[m++] = inb(base_io + 0x30); >+ atp_dev.sp[m++] = inb(base_io + 0x31); >+ atp_dev.sp[m++] = inb(base_io + 0x32); >+ atp_dev.sp[m++] = inb(base_io + 0x33); >+ outw(n, base_io + 0x34); >+ n += 0x0002; >+ atp_dev.sp[m++] = inb(base_io + 0x30); >+ atp_dev.sp[m++] = inb(base_io + 0x31); >+ atp_dev.sp[m++] = inb(base_io + 0x32); >+ atp_dev.sp[m++] = inb(base_io + 0x33); >+ n += 0x0018; >+ goto next_fblk; >+flash_ok: >+ outw(0, base_io + 0x34); >+ atp_dev.ultra_map = 0; >+ atp_dev.async = 0; >+ for (k = 0; k < 16; k++) { >+ n = 1; >+ n = n << k; >+ if (atp_dev.sp[k] > 1) { >+ atp_dev.ultra_map |= n; >+ } else { >+ if (atp_dev.sp[k] == 0) >+ atp_dev.async |= n; >+ } >+ } >+ atp_dev.async = ~(atp_dev.async); >+ outb(atp_dev.global_map, base_io + 0x35); >+ > shpnt = scsi_host_alloc(&atp870u_template, sizeof(struct atp_unit)); > if (!shpnt) > return -ENOMEM; > > p = (struct atp_unit *)&shpnt->hostdata; >- >+ > atp_dev.host = shpnt; >- atp_dev.pdev = pdev; >- pci_set_drvdata(pdev, p); >+ atp_dev.pdev = dev; >+ pci_set_drvdata(dev, p); > memcpy(p, &atp_dev, sizeof atp_dev); >- if (atp870u_init_tables(shpnt) < 0) >+ if (atp870u_init_tables(shpnt) < 0) { >+ printk(KERN_ERR "Unable to allocate tables for Acard controller\n"); > goto unregister; >+ } > >- if (request_irq(pdev->irq, atp870u_intr_handle, SA_SHIRQ, "atp870i", shpnt)) { >- printk(KERN_ERR "Unable to allocate IRQ%d for Acard controller.\n", pdev->irq); >+ if (request_irq(dev->irq, atp870u_intr_handle, SA_SHIRQ, "atp870u", shpnt)) { >+ printk(KERN_ERR "Unable to allocate IRQ%d for Acard controller.\n", dev->irq); > goto free_tables; > } > > spin_lock_irqsave(shpnt->host_lock, flags); >- if (atp_dev.chip_ver > 0x07) { /* check if atp876 chip then enable terminator */ >- tmport = base_io + 0x3e; >- outb(0x00, tmport); >- } >- >- tmport = base_io + 0x3a; >- k = (inb(tmport) & 0xf3) | 0x10; >+ tmport = base_io + 0x38; >+ k = inb(tmport) & 0x80; > outb(k, tmport); >- outb((k & 0xdf), tmport); >+ tmport += 0x03; >+ outb(0x20, tmport); > mdelay(32); >- outb(k, tmport); >+ outb(0, tmport); > mdelay(32); >- tmport = base_io; >+ tmport = base_io + 0x5b; >+ inb(tmport); >+ tmport -= 0x04; >+ inb(tmport); >+ tmport = base_io + 0x40; > outb((host_id | 0x08), tmport); > tmport += 0x18; > outb(0, tmport); > tmport += 0x07; > while ((inb(tmport) & 0x80) == 0) > mdelay(1); >- > tmport -= 0x08; > inb(tmport); >- tmport = base_io + 1; >+ tmport = base_io + 0x41; > outb(8, tmport++); > outb(0x7f, tmport); >- tmport = base_io + 0x11; >+ tmport = base_io + 0x51; > outb(0x20, tmport); > > tscam(shpnt); >- is870(p, base_io); >- tmport = base_io + 0x3a; >- outb((inb(tmport) & 0xef), tmport); >- tmport++; >- outb((inb(tmport) | 0x20), tmport); >- if (atp_dev.chip_ver == 4) >- shpnt->max_id = 16; >- else >- shpnt->max_id = 7; >- shpnt->this_id = host_id; >- shpnt->unique_id = base_io; >- shpnt->io_port = base_io; >+ is880(shpnt, base_io); >+ tmport = base_io + 0x38; >+ outb(0xb0, tmport); >+ } >+ >+ if (p->chip_veru == 4) >+ shpnt->max_id = 16; >+ >+ shpnt->this_id = host_id; >+ shpnt->unique_id = base_io; >+ shpnt->io_port = base_io; >+ if (ent->device == 0x8081) { >+ shpnt->n_io_port = 0x60; /* Number of bytes of I/O space used */ >+ } else { > shpnt->n_io_port = 0x40; /* Number of bytes of I/O space used */ >- shpnt->irq = pdev->irq; >- } >- spin_unlock_irqrestore(shpnt->host_lock, flags); >- if(ent->device==ATP885_DEVID) { >- if(!request_region(base_io, 0xff, "atp870u")) /* Register the IO ports that we use */ >- goto request_io_fail; >- } else if((ent->device==ATP880_DEVID1)||(ent->device==ATP880_DEVID2)) { >- if(!request_region(base_io, 0x60, "atp870u")) /* Register the IO ports that we use */ >- goto request_io_fail; >- } else { >- if(!request_region(base_io, 0x40, "atp870u")) /* Register the IO ports that we use */ >- goto request_io_fail; >- } >- count++; >- if (scsi_add_host(shpnt, &pdev->dev)) >- goto scsi_add_fail; >- scsi_scan_host(shpnt); >-#ifdef ED_DBGP >- printk("atp870u_prob : exit\n"); >-#endif >- return 0; >+ } >+ shpnt->irq = dev->irq; >+ spin_unlock_irqrestore(shpnt->host_lock, flags); >+ if (ent->device == 0x8081) { >+ if (!request_region(base_io, 0x60, "atp870u")) >+ goto request_io_fail; >+ } else { >+ if (!request_region(base_io, 0x40, "atp870u")) >+ goto request_io_fail; >+ } > >+ count++; >+ if (scsi_add_host(shpnt, &dev->dev)) >+ goto scsi_add_fail; >+ scsi_scan_host(shpnt); >+ return 0; >+ > scsi_add_fail: >- printk("atp870u_prob:scsi_add_fail\n"); >- if(ent->device==ATP885_DEVID) { >- release_region(base_io, 0xff); >- } else if((ent->device==ATP880_DEVID1)||(ent->device==ATP880_DEVID2)) { >+ if (ent->device == 0x8081) > release_region(base_io, 0x60); >- } else { >+ else > release_region(base_io, 0x40); >- } > request_io_fail: >- printk("atp870u_prob:request_io_fail\n"); >- free_irq(pdev->irq, shpnt); >+ free_irq(dev->irq, shpnt); > free_tables: >- printk("atp870u_prob:free_table\n"); > atp870u_free_tables(shpnt); > unregister: >- printk("atp870u_prob:unregister\n"); > scsi_host_put(shpnt); >- return -1; >+ return -1; > } > > /* The abort command does not leave the device in a clean state where >@@ -3099,40 +2565,40 @@ > > static int atp870u_abort(struct scsi_cmnd * SCpnt) > { >- unsigned char j, k, c; >+ unsigned char j, k; > struct scsi_cmnd *workrequ; > unsigned int tmport; >- struct atp_unit *dev; >- struct Scsi_Host *host; >- host = SCpnt->device->host; >+ struct atp_unit *dev = (struct atp_unit *)&SCpnt->device->host->hostdata; > >- dev = (struct atp_unit *)&host->hostdata; >- c=SCpnt->device->channel; >- printk(" atp870u: abort Channel = %x \n", c); >- printk("working=%x last_cmd=%x ", dev->working[c], dev->last_cmd[c]); >- printk(" quhdu=%x quendu=%x ", dev->quhd[c], dev->quend[c]); >- tmport = dev->ioport[c]; >- for (j = 0; j < 0x18; j++) { >+ printk(KERN_DEBUG "working=%x last_cmd=%x ", dev->working, dev->last_cmd); >+ printk(" quhdu=%x quendu=%x ", dev->quhdu, dev->quendu); >+ tmport = dev->ioport; >+ for (j = 0; j < 0x17; j++) { > printk(" r%2x=%2x", j, inb(tmport++)); > } >- tmport += 0x04; >+ tmport += 0x05; > printk(" r1c=%2x", inb(tmport)); > tmport += 0x03; >- printk(" r1f=%2x in_snd=%2x ", inb(tmport), dev->in_snd[c]); >- tmport= dev->pciport[c]; >- printk(" d00=%2x", inb(tmport)); >+ printk(" r1f=%2x in_snd=%2x ", inb(tmport), dev->in_snd); >+ tmport = dev->pciport; >+ printk(" r20=%2x", inb(tmport)); > tmport += 0x02; >- printk(" d02=%2x", inb(tmport)); >- for(j=0;j<16;j++) { >- if (dev->id[c][j].curr_req != NULL) { >- workrequ = dev->id[c][j].curr_req; >- printk("\n que cdb= "); >- for (k=0; k < workrequ->cmd_len; k++) { >- printk(" %2x ",workrequ->cmnd[k]); >+ printk(" r22=%2x", inb(tmport)); >+ tmport = dev->ioport + 0x3a; >+ printk(" r3a=%2x \n", inb(tmport)); >+ tmport = dev->ioport + 0x3b; >+ printk(" r3b=%2x \n", inb(tmport)); >+ for (j = 0; j < 16; j++) { >+ if (dev->id[j].curr_req != NULL) { >+ workrequ = dev->id[j].curr_req; >+ printk("\n que cdb= "); >+ for (k = 0; k < workrequ->cmd_len; k++) { >+ printk(" %2x ", workrequ->cmnd[k]); >+ } >+ printk(" last_lenu= %lx ", dev->id[j].last_lenu); > } >- printk(" last_lenu= %x ",(unsigned int)dev->id[c][j].last_len); >- } > } >+ /* Sort of - the thing handles itself */ > return SUCCESS; > } > >@@ -3170,7 +2636,7 @@ > size += sprintf(BLS, " IRQ: %d\n", HBAptr->irq); > len += size; > pos = begin + len; >- >+ > *start = buffer + (offset - begin); /* Start of wanted data */ > len -= (offset - begin); /* Start slop */ > if (len > length) { >@@ -3179,15 +2645,15 @@ > return (len); > } > >- >-static int atp870u_biosparam(struct scsi_device *disk, struct block_device *dev, >- sector_t capacity, int *ip) >+static int atp870u_biosparam(struct scsi_device *sdev, >+ struct block_device *dev, sector_t capacity, int *ip) > { > int heads, sectors, cylinders; > > heads = 64; > sectors = 32; > cylinders = (unsigned long)capacity / (heads * sectors); >+ > if (cylinders > 1024) { > heads = 255; > sectors = 63; >@@ -3200,46 +2666,39 @@ > return 0; > } > >-static void atp870u_remove (struct pci_dev *pdev) >-{ >- struct atp_unit *devext = pci_get_drvdata(pdev); >- struct Scsi_Host *pshost = devext->host; >- >- >+static void atp870u_remove(struct pci_dev *pdev) >+{ >+ struct atp_unit *atp_dev = pci_get_drvdata(pdev); >+ struct Scsi_Host *pshost = atp_dev->host; >+ > scsi_remove_host(pshost); >- printk(KERN_INFO "free_irq : %d\n",pshost->irq); > free_irq(pshost->irq, pshost); > release_region(pshost->io_port, pshost->n_io_port); >- printk(KERN_INFO "atp870u_free_tables : %p\n",pshost); > atp870u_free_tables(pshost); >- printk(KERN_INFO "scsi_host_put : %p\n",pshost); > scsi_host_put(pshost); >- printk(KERN_INFO "pci_set_drvdata : %p\n",pdev); >- pci_set_drvdata(pdev, NULL); >+ pci_set_drvdata(pdev, NULL); > } >+ > MODULE_LICENSE("GPL"); > > static struct scsi_host_template atp870u_template = { >- .module = THIS_MODULE, >- .name = "atp870u" /* name */, >- .proc_name = "atp870u", >- .proc_info = atp870u_proc_info, >- .info = atp870u_info /* info */, >- .queuecommand = atp870u_queuecommand /* queuecommand */, >- .eh_abort_handler = atp870u_abort /* abort */, >- .bios_param = atp870u_biosparam /* biosparm */, >- .can_queue = qcnt /* can_queue */, >- .this_id = 7 /* SCSI ID */, >- .sg_tablesize = ATP870U_SCATTER /*SG_ALL*/ /*SG_NONE*/, >- .cmd_per_lun = ATP870U_CMDLUN /* commands per lun */, >- .use_clustering = ENABLE_CLUSTERING, >- .max_sectors = ATP870U_MAX_SECTORS, >+ .module = THIS_MODULE, >+ .name = "atp870u", >+ .proc_name = "atp870u", >+ .proc_info = atp870u_proc_info, >+ .info = atp870u_info, >+ .queuecommand = atp870u_queuecommand, >+ .eh_abort_handler = atp870u_abort, >+ .bios_param = atp870u_biosparam, >+ .can_queue = qcnt, >+ .this_id = 7, >+ .sg_tablesize = ATP870U_SCATTER, >+ .cmd_per_lun = ATP870U_CMDLUN, >+ .use_clustering = ENABLE_CLUSTERING, > }; > > static struct pci_device_id atp870u_id_table[] = { >- { PCI_DEVICE(PCI_VENDOR_ID_ARTOP, ATP885_DEVID) }, >- { PCI_DEVICE(PCI_VENDOR_ID_ARTOP, ATP880_DEVID1) }, >- { PCI_DEVICE(PCI_VENDOR_ID_ARTOP, ATP880_DEVID2) }, >+ { PCI_DEVICE(PCI_VENDOR_ID_ARTOP, 0x8081) }, > { PCI_DEVICE(PCI_VENDOR_ID_ARTOP, PCI_DEVICE_ID_ARTOP_AEC7610) }, > { PCI_DEVICE(PCI_VENDOR_ID_ARTOP, PCI_DEVICE_ID_ARTOP_AEC7612UW) }, > { PCI_DEVICE(PCI_VENDOR_ID_ARTOP, PCI_DEVICE_ID_ARTOP_AEC7612U) }, >@@ -3252,7 +2711,7 @@ > > MODULE_DEVICE_TABLE(pci, atp870u_id_table); > >-static struct pci_driver atp870u_driver = { >+static struct pci_driver atp870u_driver = { > .id_table = atp870u_id_table, > .name = "atp870u", > .probe = atp870u_probe, >@@ -3261,710 +2720,14 @@ > > static int __init atp870u_init(void) > { >-#ifdef ED_DBGP >- printk("atp870u_init: Entry\n"); >-#endif >- return pci_register_driver(&atp870u_driver); >+ return pci_module_init(&atp870u_driver); > } > > static void __exit atp870u_exit(void) > { >-#ifdef ED_DBGP >- printk("atp870u_exit: Entry\n"); >-#endif > pci_unregister_driver(&atp870u_driver); > } > >-static void tscam_885(void) >-{ >- unsigned char i; >- >- for (i = 0; i < 0x2; i++) { >- mdelay(300); >- } >- return; >-} >- >- >- >-static void is885(struct atp_unit *dev, unsigned int wkport,unsigned char c) >-{ >- unsigned int tmport; >- unsigned char i, j, k, rmb, n, lvdmode; >- unsigned short int m; >- static unsigned char mbuf[512]; >- static unsigned char satn[9] = {0, 0, 0, 0, 0, 0, 0, 6, 6}; >- static unsigned char inqd[9] = {0x12, 0, 0, 0, 0x24, 0, 0, 0x24, 6}; >- static unsigned char synn[6] = {0x80, 1, 3, 1, 0x19, 0x0e}; >- unsigned char synu[6] = {0x80, 1, 3, 1, 0x0a, 0x0e}; >- static unsigned char synw[6] = {0x80, 1, 3, 1, 0x19, 0x0e}; >- unsigned char synuw[6] = {0x80, 1, 3, 1, 0x0a, 0x0e}; >- static unsigned char wide[6] = {0x80, 1, 2, 3, 1, 0}; >- static unsigned char u3[9] = { 0x80,1,6,4,0x09,00,0x0e,0x01,0x02 }; >- >- lvdmode=inb(wkport + 0x1b) >> 7; >- >- for (i = 0; i < 16; i++) { >- m = 1; >- m = m << i; >- if ((m & dev->active_id[c]) != 0) { >- continue; >- } >- if (i == dev->host_id[c]) { >- printk(KERN_INFO " ID: %2d Host Adapter\n", dev->host_id[c]); >- continue; >- } >- tmport = wkport + 0x1b; >- outb(0x01, tmport); >- tmport = wkport + 0x01; >- outb(0x08, tmport++); >- outb(0x7f, tmport++); >- outb(satn[0], tmport++); >- outb(satn[1], tmport++); >- outb(satn[2], tmport++); >- outb(satn[3], tmport++); >- outb(satn[4], tmport++); >- outb(satn[5], tmport++); >- tmport += 0x06; >- outb(0, tmport); >- tmport += 0x02; >- outb(dev->id[c][i].devsp, tmport++); >- >- outb(0, tmport++); >- outb(satn[6], tmport++); >- outb(satn[7], tmport++); >- j = i; >- if ((j & 0x08) != 0) { >- j = (j & 0x07) | 0x40; >- } >- outb(j, tmport); >- tmport += 0x03; >- outb(satn[8], tmport); >- tmport += 0x07; >- >- while ((inb(tmport) & 0x80) == 0x00) >- cpu_relax(); >- tmport -= 0x08; >- if ((inb(tmport) != 0x11) && (inb(tmport) != 0x8e)) { >- continue; >- } >- while (inb(tmport) != 0x8e) >- cpu_relax(); >- dev->active_id[c] |= m; >- >- tmport = wkport + 0x10; >- outb(0x30, tmport); >- tmport = wkport + 0x14; >- outb(0x00, tmport); >- >-phase_cmd: >- tmport = wkport + 0x18; >- outb(0x08, tmport); >- tmport += 0x07; >- while ((inb(tmport) & 0x80) == 0x00) >- cpu_relax(); >- tmport -= 0x08; >- j = inb(tmport); >- if (j != 0x16) { >- tmport = wkport + 0x10; >- outb(0x41, tmport); >- goto phase_cmd; >- } >-sel_ok: >- tmport = wkport + 0x03; >- outb(inqd[0], tmport++); >- outb(inqd[1], tmport++); >- outb(inqd[2], tmport++); >- outb(inqd[3], tmport++); >- outb(inqd[4], tmport++); >- outb(inqd[5], tmport); >- tmport += 0x07; >- outb(0, tmport); >- tmport += 0x02; >- outb(dev->id[c][i].devsp, tmport++); >- outb(0, tmport++); >- outb(inqd[6], tmport++); >- outb(inqd[7], tmport++); >- tmport += 0x03; >- outb(inqd[8], tmport); >- tmport += 0x07; >- while ((inb(tmport) & 0x80) == 0x00) >- cpu_relax(); >- tmport -= 0x08; >- if ((inb(tmport) != 0x11) && (inb(tmport) != 0x8e)) { >- continue; >- } >- while (inb(tmport) != 0x8e) >- cpu_relax(); >- tmport = wkport + 0x1b; >- outb(0x00, tmport); >- tmport = wkport + 0x18; >- outb(0x08, tmport); >- tmport += 0x07; >- j = 0; >-rd_inq_data: >- k = inb(tmport); >- if ((k & 0x01) != 0) { >- tmport -= 0x06; >- mbuf[j++] = inb(tmport); >- tmport += 0x06; >- goto rd_inq_data; >- } >- if ((k & 0x80) == 0) { >- goto rd_inq_data; >- } >- tmport -= 0x08; >- j = inb(tmport); >- if (j == 0x16) { >- goto inq_ok; >- } >- tmport = wkport + 0x10; >- outb(0x46, tmport); >- tmport += 0x02; >- outb(0, tmport++); >- outb(0, tmport++); >- outb(0, tmport++); >- tmport += 0x03; >- outb(0x08, tmport); >- tmport += 0x07; >- while ((inb(tmport) & 0x80) == 0x00) >- cpu_relax(); >- tmport -= 0x08; >- if (inb(tmport) != 0x16) { >- goto sel_ok; >- } >-inq_ok: >- mbuf[36] = 0; >- printk( KERN_INFO" ID: %2d %s\n", i, &mbuf[8]); >- dev->id[c][i].devtype = mbuf[0]; >- rmb = mbuf[1]; >- n = mbuf[7]; >- if ((mbuf[7] & 0x60) == 0) { >- goto not_wide; >- } >- if ((i < 8) && ((dev->global_map[c] & 0x20) == 0)) { >- goto not_wide; >- } >- if (lvdmode == 0) { >- goto chg_wide; >- } >- if (dev->sp[c][i] != 0x04) { // force u2 >- goto chg_wide; >- } >- >- tmport = wkport + 0x1b; >- outb(0x01, tmport); >- tmport = wkport + 0x03; >- outb(satn[0], tmport++); >- outb(satn[1], tmport++); >- outb(satn[2], tmport++); >- outb(satn[3], tmport++); >- outb(satn[4], tmport++); >- outb(satn[5], tmport++); >- tmport += 0x06; >- outb(0, tmport); >- tmport += 0x02; >- outb(dev->id[c][i].devsp, tmport++); >- outb(0, tmport++); >- outb(satn[6], tmport++); >- outb(satn[7], tmport++); >- tmport += 0x03; >- outb(satn[8], tmport); >- tmport += 0x07; >- >- while ((inb(tmport) & 0x80) == 0x00) >- cpu_relax(); >- tmport -= 0x08; >- if ((inb(tmport) != 0x11) && (inb(tmport) != 0x8e)) { >- continue; >- } >- while (inb(tmport) != 0x8e) >- cpu_relax(); >-try_u3: >- j = 0; >- tmport = wkport + 0x14; >- outb(0x09, tmport); >- tmport += 0x04; >- outb(0x20, tmport); >- tmport += 0x07; >- >- while ((inb(tmport) & 0x80) == 0) { >- if ((inb(tmport) & 0x01) != 0) { >- tmport -= 0x06; >- outb(u3[j++], tmport); >- tmport += 0x06; >- } >- cpu_relax(); >- } >- tmport -= 0x08; >- while ((inb(tmport) & 0x80) == 0x00) >- cpu_relax(); >- j = inb(tmport) & 0x0f; >- if (j == 0x0f) { >- goto u3p_in; >- } >- if (j == 0x0a) { >- goto u3p_cmd; >- } >- if (j == 0x0e) { >- goto try_u3; >- } >- continue; >-u3p_out: >- tmport = wkport + 0x18; >- outb(0x20, tmport); >- tmport += 0x07; >- while ((inb(tmport) & 0x80) == 0) { >- if ((inb(tmport) & 0x01) != 0) { >- tmport -= 0x06; >- outb(0, tmport); >- tmport += 0x06; >- } >- cpu_relax(); >- } >- tmport -= 0x08; >- j = inb(tmport) & 0x0f; >- if (j == 0x0f) { >- goto u3p_in; >- } >- if (j == 0x0a) { >- goto u3p_cmd; >- } >- if (j == 0x0e) { >- goto u3p_out; >- } >- continue; >-u3p_in: >- tmport = wkport + 0x14; >- outb(0x09, tmport); >- tmport += 0x04; >- outb(0x20, tmport); >- tmport += 0x07; >- k = 0; >-u3p_in1: >- j = inb(tmport); >- if ((j & 0x01) != 0) { >- tmport -= 0x06; >- mbuf[k++] = inb(tmport); >- tmport += 0x06; >- goto u3p_in1; >- } >- if ((j & 0x80) == 0x00) { >- goto u3p_in1; >- } >- tmport -= 0x08; >- j = inb(tmport) & 0x0f; >- if (j == 0x0f) { >- goto u3p_in; >- } >- if (j == 0x0a) { >- goto u3p_cmd; >- } >- if (j == 0x0e) { >- goto u3p_out; >- } >- continue; >-u3p_cmd: >- tmport = wkport + 0x10; >- outb(0x30, tmport); >- tmport = wkport + 0x14; >- outb(0x00, tmport); >- tmport += 0x04; >- outb(0x08, tmport); >- tmport += 0x07; >- while ((inb(tmport) & 0x80) == 0x00); >- tmport -= 0x08; >- j = inb(tmport); >- if (j != 0x16) { >- if (j == 0x4e) { >- goto u3p_out; >- } >- continue; >- } >- if (mbuf[0] != 0x01) { >- goto chg_wide; >- } >- if (mbuf[1] != 0x06) { >- goto chg_wide; >- } >- if (mbuf[2] != 0x04) { >- goto chg_wide; >- } >- if (mbuf[3] == 0x09) { >- m = 1; >- m = m << i; >- dev->wide_id[c] |= m; >- dev->id[c][i].devsp = 0xce; >-#ifdef ED_DBGP >- printk("dev->id[%2d][%2d].devsp = %2x\n",c,i,dev->id[c][i].devsp); >-#endif >- continue; >- } >-chg_wide: >- tmport = wkport + 0x1b; >- outb(0x01, tmport); >- tmport = wkport + 0x03; >- outb(satn[0], tmport++); >- outb(satn[1], tmport++); >- outb(satn[2], tmport++); >- outb(satn[3], tmport++); >- outb(satn[4], tmport++); >- outb(satn[5], tmport++); >- tmport += 0x06; >- outb(0, tmport); >- tmport += 0x02; >- outb(dev->id[c][i].devsp, tmport++); >- outb(0, tmport++); >- outb(satn[6], tmport++); >- outb(satn[7], tmport++); >- tmport += 0x03; >- outb(satn[8], tmport); >- tmport += 0x07; >- >- while ((inb(tmport) & 0x80) == 0x00) >- cpu_relax(); >- tmport -= 0x08; >- if ((inb(tmport) != 0x11) && (inb(tmport) != 0x8e)) { >- continue; >- } >- while (inb(tmport) != 0x8e) >- cpu_relax(); >-try_wide: >- j = 0; >- tmport = wkport + 0x14; >- outb(0x05, tmport); >- tmport += 0x04; >- outb(0x20, tmport); >- tmport += 0x07; >- >- while ((inb(tmport) & 0x80) == 0) { >- if ((inb(tmport) & 0x01) != 0) { >- tmport -= 0x06; >- outb(wide[j++], tmport); >- tmport += 0x06; >- } >- cpu_relax(); >- } >- tmport -= 0x08; >- while ((inb(tmport) & 0x80) == 0x00) >- cpu_relax(); >- j = inb(tmport) & 0x0f; >- if (j == 0x0f) { >- goto widep_in; >- } >- if (j == 0x0a) { >- goto widep_cmd; >- } >- if (j == 0x0e) { >- goto try_wide; >- } >- continue; >-widep_out: >- tmport = wkport + 0x18; >- outb(0x20, tmport); >- tmport += 0x07; >- while ((inb(tmport) & 0x80) == 0) { >- if ((inb(tmport) & 0x01) != 0) { >- tmport -= 0x06; >- outb(0, tmport); >- tmport += 0x06; >- } >- cpu_relax(); >- } >- tmport -= 0x08; >- j = inb(tmport) & 0x0f; >- if (j == 0x0f) { >- goto widep_in; >- } >- if (j == 0x0a) { >- goto widep_cmd; >- } >- if (j == 0x0e) { >- goto widep_out; >- } >- continue; >-widep_in: >- tmport = wkport + 0x14; >- outb(0xff, tmport); >- tmport += 0x04; >- outb(0x20, tmport); >- tmport += 0x07; >- k = 0; >-widep_in1: >- j = inb(tmport); >- if ((j & 0x01) != 0) { >- tmport -= 0x06; >- mbuf[k++] = inb(tmport); >- tmport += 0x06; >- goto widep_in1; >- } >- if ((j & 0x80) == 0x00) { >- goto widep_in1; >- } >- tmport -= 0x08; >- j = inb(tmport) & 0x0f; >- if (j == 0x0f) { >- goto widep_in; >- } >- if (j == 0x0a) { >- goto widep_cmd; >- } >- if (j == 0x0e) { >- goto widep_out; >- } >- continue; >-widep_cmd: >- tmport = wkport + 0x10; >- outb(0x30, tmport); >- tmport = wkport + 0x14; >- outb(0x00, tmport); >- tmport += 0x04; >- outb(0x08, tmport); >- tmport += 0x07; >- while ((inb(tmport) & 0x80) == 0x00) >- cpu_relax(); >- tmport -= 0x08; >- j = inb(tmport); >- if (j != 0x16) { >- if (j == 0x4e) { >- goto widep_out; >- } >- continue; >- } >- if (mbuf[0] != 0x01) { >- goto not_wide; >- } >- if (mbuf[1] != 0x02) { >- goto not_wide; >- } >- if (mbuf[2] != 0x03) { >- goto not_wide; >- } >- if (mbuf[3] != 0x01) { >- goto not_wide; >- } >- m = 1; >- m = m << i; >- dev->wide_id[c] |= m; >-not_wide: >- if ((dev->id[c][i].devtype == 0x00) || (dev->id[c][i].devtype == 0x07) || >- ((dev->id[c][i].devtype == 0x05) && ((n & 0x10) != 0))) { >- m = 1; >- m = m << i; >- if ((dev->async[c] & m) != 0) { >- goto set_sync; >- } >- } >- continue; >-set_sync: >- if (dev->sp[c][i] == 0x02) { >- synu[4]=0x0c; >- synuw[4]=0x0c; >- } else { >- if (dev->sp[c][i] >= 0x03) { >- synu[4]=0x0a; >- synuw[4]=0x0a; >- } >- } >- tmport = wkport + 0x1b; >- j = 0; >- if ((m & dev->wide_id[c]) != 0) { >- j |= 0x01; >- } >- outb(j, tmport); >- tmport = wkport + 0x03; >- outb(satn[0], tmport++); >- outb(satn[1], tmport++); >- outb(satn[2], tmport++); >- outb(satn[3], tmport++); >- outb(satn[4], tmport++); >- outb(satn[5], tmport++); >- tmport += 0x06; >- outb(0, tmport); >- tmport += 0x02; >- outb(dev->id[c][i].devsp, tmport++); >- outb(0, tmport++); >- outb(satn[6], tmport++); >- outb(satn[7], tmport++); >- tmport += 0x03; >- outb(satn[8], tmport); >- tmport += 0x07; >- >- while ((inb(tmport) & 0x80) == 0x00) >- cpu_relax(); >- tmport -= 0x08; >- if ((inb(tmport) != 0x11) && (inb(tmport) != 0x8e)) { >- continue; >- } >- while (inb(tmport) != 0x8e) >- cpu_relax(); >-try_sync: >- j = 0; >- tmport = wkport + 0x14; >- outb(0x06, tmport); >- tmport += 0x04; >- outb(0x20, tmport); >- tmport += 0x07; >- >- while ((inb(tmport) & 0x80) == 0) { >- if ((inb(tmport) & 0x01) != 0) { >- tmport -= 0x06; >- if ((m & dev->wide_id[c]) != 0) { >- if ((m & dev->ultra_map[c]) != 0) { >- outb(synuw[j++], tmport); >- } else { >- outb(synw[j++], tmport); >- } >- } else { >- if ((m & dev->ultra_map[c]) != 0) { >- outb(synu[j++], tmport); >- } else { >- outb(synn[j++], tmport); >- } >- } >- tmport += 0x06; >- } >- } >- tmport -= 0x08; >- while ((inb(tmport) & 0x80) == 0x00) >- cpu_relax(); >- j = inb(tmport) & 0x0f; >- if (j == 0x0f) { >- goto phase_ins; >- } >- if (j == 0x0a) { >- goto phase_cmds; >- } >- if (j == 0x0e) { >- goto try_sync; >- } >- continue; >-phase_outs: >- tmport = wkport + 0x18; >- outb(0x20, tmport); >- tmport += 0x07; >- while ((inb(tmport) & 0x80) == 0x00) { >- if ((inb(tmport) & 0x01) != 0x00) { >- tmport -= 0x06; >- outb(0x00, tmport); >- tmport += 0x06; >- } >- cpu_relax(); >- } >- tmport -= 0x08; >- j = inb(tmport); >- if (j == 0x85) { >- goto tar_dcons; >- } >- j &= 0x0f; >- if (j == 0x0f) { >- goto phase_ins; >- } >- if (j == 0x0a) { >- goto phase_cmds; >- } >- if (j == 0x0e) { >- goto phase_outs; >- } >- continue; >-phase_ins: >- tmport = wkport + 0x14; >- outb(0x06, tmport); >- tmport += 0x04; >- outb(0x20, tmport); >- tmport += 0x07; >- k = 0; >-phase_ins1: >- j = inb(tmport); >- if ((j & 0x01) != 0x00) { >- tmport -= 0x06; >- mbuf[k++] = inb(tmport); >- tmport += 0x06; >- goto phase_ins1; >- } >- if ((j & 0x80) == 0x00) { >- goto phase_ins1; >- } >- tmport -= 0x08; >- while ((inb(tmport) & 0x80) == 0x00); >- j = inb(tmport); >- if (j == 0x85) { >- goto tar_dcons; >- } >- j &= 0x0f; >- if (j == 0x0f) { >- goto phase_ins; >- } >- if (j == 0x0a) { >- goto phase_cmds; >- } >- if (j == 0x0e) { >- goto phase_outs; >- } >- continue; >-phase_cmds: >- tmport = wkport + 0x10; >- outb(0x30, tmport); >-tar_dcons: >- tmport = wkport + 0x14; >- outb(0x00, tmport); >- tmport += 0x04; >- outb(0x08, tmport); >- tmport += 0x07; >- while ((inb(tmport) & 0x80) == 0x00) >- cpu_relax(); >- tmport -= 0x08; >- j = inb(tmport); >- if (j != 0x16) { >- continue; >- } >- if (mbuf[0] != 0x01) { >- continue; >- } >- if (mbuf[1] != 0x03) { >- continue; >- } >- if (mbuf[4] == 0x00) { >- continue; >- } >- if (mbuf[3] > 0x64) { >- continue; >- } >- if (mbuf[4] > 0x0e) { >- mbuf[4] = 0x0e; >- } >- dev->id[c][i].devsp = mbuf[4]; >- if (mbuf[3] < 0x0c){ >- j = 0xb0; >- goto set_syn_ok; >- } >- if ((mbuf[3] < 0x0d) && (rmb == 0)) { >- j = 0xa0; >- goto set_syn_ok; >- } >- if (mbuf[3] < 0x1a) { >- j = 0x20; >- goto set_syn_ok; >- } >- if (mbuf[3] < 0x33) { >- j = 0x40; >- goto set_syn_ok; >- } >- if (mbuf[3] < 0x4c) { >- j = 0x50; >- goto set_syn_ok; >- } >- j = 0x60; >- set_syn_ok: >- dev->id[c][i].devsp = (dev->id[c][i].devsp & 0x0f) | j; >-#ifdef ED_DBGP >- printk("dev->id[%2d][%2d].devsp = %2x\n",c,i,dev->id[c][i].devsp); >-#endif >- } >- tmport = wkport + 0x16; >- outb(0x80, tmport); >-} >- > module_init(atp870u_init); > module_exit(atp870u_exit); > >--- linux-2.6.13/drivers/scsi/atp870u.h~ 2005-08-31 14:39:03.000000000 +0200 >+++ linux-2.6.13/drivers/scsi/atp870u.h 2005-08-31 14:39:07.000000000 +0200 >@@ -2,64 +2,50 @@ > #define _ATP870U_H > > #include <linux/types.h> >-#include <linux/kdev_t.h> > > /* I/O Port */ > >-#define MAX_CDB 12 >-#define MAX_SENSE 14 >-#define qcnt 32 >-#define ATP870U_SCATTER 128 >-#define ATP870U_CMDLUN 1 >- >-#define MAX_ADAPTER 8 >-#define MAX_SCSI_ID 16 >-#define ATP870U_MAX_SECTORS 128 >- >-#define ATP885_DEVID 0x808A >-#define ATP880_DEVID1 0x8080 >-#define ATP880_DEVID2 0x8081 >- >-//#define ED_DBGP >- >-struct atp_unit >-{ >- unsigned long baseport; >- unsigned long ioport[2]; >- unsigned long pciport[2]; >- unsigned long irq; >- unsigned char last_cmd[2]; >- unsigned char in_snd[2]; >- unsigned char in_int[2]; >- unsigned char quhd[2]; >- unsigned char quend[2]; >- unsigned char global_map[2]; >- unsigned char chip_ver; >+#define MAX_CDB 12 >+#define MAX_SENSE 14 >+#define qcnt 32 >+#define ATP870U_SCATTER 128 >+#define ATP870U_CMDLUN 1 >+ >+struct atp_unit { >+ unsigned long ioport; >+ unsigned long pciport; >+ unsigned char last_cmd; >+ unsigned char in_snd; >+ unsigned char in_int; >+ unsigned char quhdu; >+ unsigned char quendu; > unsigned char scam_on; >- unsigned char host_id[2]; >- unsigned int working[2]; >- unsigned short wide_id[2]; >- unsigned short active_id[2]; >- unsigned short ultra_map[2]; >- unsigned short async[2]; >- unsigned short dev_id; >- unsigned char sp[2][16]; >- unsigned char r1f[2][16]; >- struct scsi_cmnd *quereq[2][qcnt]; >- struct atp_id >- { >- unsigned char dirct; >- unsigned char devsp; >- unsigned char devtype; >- unsigned long tran_len; >- unsigned long last_len; >- unsigned char *prd_pos; >- unsigned char *prd_table; >- dma_addr_t prdaddr; >+ unsigned char global_map; >+ unsigned char chip_veru; >+ unsigned char host_idu; >+ volatile int working; >+ unsigned short wide_idu; >+ unsigned short active_idu; >+ unsigned short ultra_map; >+ unsigned short async; >+ unsigned short deviceid; >+ unsigned char ata_cdbu[16]; >+ unsigned char sp[16]; >+ struct scsi_cmnd *querequ[qcnt]; >+ struct atp_id { >+ unsigned char dirctu; >+ unsigned char devspu; >+ unsigned char devtypeu; >+ unsigned long prdaddru; >+ unsigned long tran_lenu; >+ unsigned long last_lenu; >+ unsigned char *prd_posu; >+ unsigned char *prd_tableu; >+ dma_addr_t prd_phys; > struct scsi_cmnd *curr_req; >- } id[2][16]; >- struct Scsi_Host *host; >- struct pci_dev *pdev; >+ } id[16]; >+ struct Scsi_Host *host; >+ struct pci_dev *pdev; > unsigned int unit; > }; >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
Actions:
View
|
Diff
Attachments on
bug 113234
:
47722
|
47723
| 48308 |
48328