mirror of https://gitee.com/openkylin/linux.git
[ARM] ARM SCSI: Don't try to dma_map_sg too many scatterlist entries
An off-by-one bug meant we were always trying to map one too many scatterlist entries. This was mostly harmless prior to the checks going in to consistent_sync(), but now causes the kernel to BUG. Also, powertec.c was missing an assignment to info->ec. Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
parent
6b4df7ee1f
commit
23d046f43a
|
@ -178,10 +178,10 @@ cumanascsi_2_dma_setup(struct Scsi_Host *host, struct scsi_pointer *SCp,
|
||||||
dma_dir = DMA_MODE_READ,
|
dma_dir = DMA_MODE_READ,
|
||||||
alatch_dir = ALATCH_DMA_IN;
|
alatch_dir = ALATCH_DMA_IN;
|
||||||
|
|
||||||
dma_map_sg(dev, info->sg, bufs + 1, map_dir);
|
dma_map_sg(dev, info->sg, bufs, map_dir);
|
||||||
|
|
||||||
disable_dma(dmach);
|
disable_dma(dmach);
|
||||||
set_dma_sg(dmach, info->sg, bufs + 1);
|
set_dma_sg(dmach, info->sg, bufs);
|
||||||
writeb(alatch_dir, info->base + CUMANASCSI2_ALATCH);
|
writeb(alatch_dir, info->base + CUMANASCSI2_ALATCH);
|
||||||
set_dma_mode(dmach, dma_dir);
|
set_dma_mode(dmach, dma_dir);
|
||||||
enable_dma(dmach);
|
enable_dma(dmach);
|
||||||
|
|
|
@ -175,10 +175,10 @@ eesoxscsi_dma_setup(struct Scsi_Host *host, struct scsi_pointer *SCp,
|
||||||
map_dir = DMA_FROM_DEVICE,
|
map_dir = DMA_FROM_DEVICE,
|
||||||
dma_dir = DMA_MODE_READ;
|
dma_dir = DMA_MODE_READ;
|
||||||
|
|
||||||
dma_map_sg(dev, info->sg, bufs + 1, map_dir);
|
dma_map_sg(dev, info->sg, bufs, map_dir);
|
||||||
|
|
||||||
disable_dma(dmach);
|
disable_dma(dmach);
|
||||||
set_dma_sg(dmach, info->sg, bufs + 1);
|
set_dma_sg(dmach, info->sg, bufs);
|
||||||
set_dma_mode(dmach, dma_dir);
|
set_dma_mode(dmach, dma_dir);
|
||||||
enable_dma(dmach);
|
enable_dma(dmach);
|
||||||
return fasdma_real_all;
|
return fasdma_real_all;
|
||||||
|
|
|
@ -148,10 +148,10 @@ powertecscsi_dma_setup(struct Scsi_Host *host, struct scsi_pointer *SCp,
|
||||||
map_dir = DMA_FROM_DEVICE,
|
map_dir = DMA_FROM_DEVICE,
|
||||||
dma_dir = DMA_MODE_READ;
|
dma_dir = DMA_MODE_READ;
|
||||||
|
|
||||||
dma_map_sg(dev, info->sg, bufs + 1, map_dir);
|
dma_map_sg(dev, info->sg, bufs, map_dir);
|
||||||
|
|
||||||
disable_dma(dmach);
|
disable_dma(dmach);
|
||||||
set_dma_sg(dmach, info->sg, bufs + 1);
|
set_dma_sg(dmach, info->sg, bufs);
|
||||||
set_dma_mode(dmach, dma_dir);
|
set_dma_mode(dmach, dma_dir);
|
||||||
enable_dma(dmach);
|
enable_dma(dmach);
|
||||||
return fasdma_real_all;
|
return fasdma_real_all;
|
||||||
|
@ -342,6 +342,7 @@ powertecscsi_probe(struct expansion_card *ec, const struct ecard_id *id)
|
||||||
info->base = base;
|
info->base = base;
|
||||||
powertecscsi_terminator_ctl(host, term[ec->slot_no]);
|
powertecscsi_terminator_ctl(host, term[ec->slot_no]);
|
||||||
|
|
||||||
|
info->ec = ec;
|
||||||
info->info.scsi.io_base = base + POWERTEC_FAS216_OFFSET;
|
info->info.scsi.io_base = base + POWERTEC_FAS216_OFFSET;
|
||||||
info->info.scsi.io_shift = POWERTEC_FAS216_SHIFT;
|
info->info.scsi.io_shift = POWERTEC_FAS216_SHIFT;
|
||||||
info->info.scsi.irq = ec->irq;
|
info->info.scsi.irq = ec->irq;
|
||||||
|
|
Loading…
Reference in New Issue