|
@@ -271,20 +271,8 @@ static irqreturn_t aha1740_intr_handle(int irq, void *dev_id)
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
sgptr = (struct aha1740_sg *) SCtmp->host_scribble;
|
|
sgptr = (struct aha1740_sg *) SCtmp->host_scribble;
|
|
- if (SCtmp->use_sg) {
|
|
|
|
- /* We used scatter-gather.
|
|
|
|
- Do the unmapping dance. */
|
|
|
|
- dma_unmap_sg (&edev->dev,
|
|
|
|
- (struct scatterlist *) SCtmp->request_buffer,
|
|
|
|
- SCtmp->use_sg,
|
|
|
|
- SCtmp->sc_data_direction);
|
|
|
|
- } else {
|
|
|
|
- dma_unmap_single (&edev->dev,
|
|
|
|
- sgptr->buf_dma_addr,
|
|
|
|
- SCtmp->request_bufflen,
|
|
|
|
- DMA_BIDIRECTIONAL);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
|
|
+ scsi_dma_unmap(SCtmp);
|
|
|
|
+
|
|
/* Free the sg block */
|
|
/* Free the sg block */
|
|
dma_free_coherent (&edev->dev,
|
|
dma_free_coherent (&edev->dev,
|
|
sizeof (struct aha1740_sg),
|
|
sizeof (struct aha1740_sg),
|
|
@@ -349,11 +337,9 @@ static int aha1740_queuecommand(Scsi_Cmnd * SCpnt, void (*done)(Scsi_Cmnd *))
|
|
unchar target = scmd_id(SCpnt);
|
|
unchar target = scmd_id(SCpnt);
|
|
struct aha1740_hostdata *host = HOSTDATA(SCpnt->device->host);
|
|
struct aha1740_hostdata *host = HOSTDATA(SCpnt->device->host);
|
|
unsigned long flags;
|
|
unsigned long flags;
|
|
- void *buff = SCpnt->request_buffer;
|
|
|
|
- int bufflen = SCpnt->request_bufflen;
|
|
|
|
dma_addr_t sg_dma;
|
|
dma_addr_t sg_dma;
|
|
struct aha1740_sg *sgptr;
|
|
struct aha1740_sg *sgptr;
|
|
- int ecbno;
|
|
|
|
|
|
+ int ecbno, nseg;
|
|
DEB(int i);
|
|
DEB(int i);
|
|
|
|
|
|
if(*cmd == REQUEST_SENSE) {
|
|
if(*cmd == REQUEST_SENSE) {
|
|
@@ -423,24 +409,23 @@ static int aha1740_queuecommand(Scsi_Cmnd * SCpnt, void (*done)(Scsi_Cmnd *))
|
|
}
|
|
}
|
|
sgptr = (struct aha1740_sg *) SCpnt->host_scribble;
|
|
sgptr = (struct aha1740_sg *) SCpnt->host_scribble;
|
|
sgptr->sg_dma_addr = sg_dma;
|
|
sgptr->sg_dma_addr = sg_dma;
|
|
-
|
|
|
|
- if (SCpnt->use_sg) {
|
|
|
|
- struct scatterlist * sgpnt;
|
|
|
|
|
|
+
|
|
|
|
+ nseg = scsi_dma_map(SCpnt);
|
|
|
|
+ BUG_ON(nseg < 0);
|
|
|
|
+ if (nseg) {
|
|
|
|
+ struct scatterlist *sg;
|
|
struct aha1740_chain * cptr;
|
|
struct aha1740_chain * cptr;
|
|
- int i, count;
|
|
|
|
|
|
+ int i;
|
|
DEB(unsigned char * ptr);
|
|
DEB(unsigned char * ptr);
|
|
|
|
|
|
host->ecb[ecbno].sg = 1; /* SCSI Initiator Command
|
|
host->ecb[ecbno].sg = 1; /* SCSI Initiator Command
|
|
* w/scatter-gather*/
|
|
* w/scatter-gather*/
|
|
- sgpnt = (struct scatterlist *) SCpnt->request_buffer;
|
|
|
|
cptr = sgptr->sg_chain;
|
|
cptr = sgptr->sg_chain;
|
|
- count = dma_map_sg (&host->edev->dev, sgpnt, SCpnt->use_sg,
|
|
|
|
- SCpnt->sc_data_direction);
|
|
|
|
- for(i=0; i < count; i++) {
|
|
|
|
- cptr[i].datalen = sg_dma_len (sgpnt + i);
|
|
|
|
- cptr[i].dataptr = sg_dma_address (sgpnt + i);
|
|
|
|
|
|
+ scsi_for_each_sg(SCpnt, sg, nseg, i) {
|
|
|
|
+ cptr[i].datalen = sg_dma_len (sg);
|
|
|
|
+ cptr[i].dataptr = sg_dma_address (sg);
|
|
}
|
|
}
|
|
- host->ecb[ecbno].datalen = count*sizeof(struct aha1740_chain);
|
|
|
|
|
|
+ host->ecb[ecbno].datalen = nseg * sizeof(struct aha1740_chain);
|
|
host->ecb[ecbno].dataptr = sg_dma;
|
|
host->ecb[ecbno].dataptr = sg_dma;
|
|
#ifdef DEBUG
|
|
#ifdef DEBUG
|
|
printk("cptr %x: ",cptr);
|
|
printk("cptr %x: ",cptr);
|
|
@@ -448,11 +433,8 @@ static int aha1740_queuecommand(Scsi_Cmnd * SCpnt, void (*done)(Scsi_Cmnd *))
|
|
for(i=0;i<24;i++) printk("%02x ", ptr[i]);
|
|
for(i=0;i<24;i++) printk("%02x ", ptr[i]);
|
|
#endif
|
|
#endif
|
|
} else {
|
|
} else {
|
|
- host->ecb[ecbno].datalen = bufflen;
|
|
|
|
- sgptr->buf_dma_addr = dma_map_single (&host->edev->dev,
|
|
|
|
- buff, bufflen,
|
|
|
|
- DMA_BIDIRECTIONAL);
|
|
|
|
- host->ecb[ecbno].dataptr = sgptr->buf_dma_addr;
|
|
|
|
|
|
+ host->ecb[ecbno].datalen = 0;
|
|
|
|
+ host->ecb[ecbno].dataptr = 0;
|
|
}
|
|
}
|
|
host->ecb[ecbno].lun = SCpnt->device->lun;
|
|
host->ecb[ecbno].lun = SCpnt->device->lun;
|
|
host->ecb[ecbno].ses = 1; /* Suppress underrun errors */
|
|
host->ecb[ecbno].ses = 1; /* Suppress underrun errors */
|