mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-12 08:00:09 +00:00
[SCSI] simscsi: convert to use the data buffer accessors
- remove the unnecessary map_single path. - convert to use the new accessors for the sg lists and the parameters. Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> Acked-by: Tony Luck <tony.luck@intel.com> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
This commit is contained in:
parent
147e505e23
commit
fd3adb2ae8
@ -121,49 +121,23 @@ simscsi_biosparam (struct scsi_device *sdev, struct block_device *n,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
simscsi_readwrite (struct scsi_cmnd *sc, int mode, unsigned long offset, unsigned long len)
|
|
||||||
{
|
|
||||||
struct disk_stat stat;
|
|
||||||
struct disk_req req;
|
|
||||||
|
|
||||||
req.addr = __pa(sc->request_buffer);
|
|
||||||
req.len = len; /* # of bytes to transfer */
|
|
||||||
|
|
||||||
if (sc->request_bufflen < req.len)
|
|
||||||
return;
|
|
||||||
|
|
||||||
stat.fd = desc[sc->device->id];
|
|
||||||
if (DBG)
|
|
||||||
printk("simscsi_%s @ %lx (off %lx)\n",
|
|
||||||
mode == SSC_READ ? "read":"write", req.addr, offset);
|
|
||||||
ia64_ssc(stat.fd, 1, __pa(&req), offset, mode);
|
|
||||||
ia64_ssc(__pa(&stat), 0, 0, 0, SSC_WAIT_COMPLETION);
|
|
||||||
|
|
||||||
if (stat.count == req.len) {
|
|
||||||
sc->result = GOOD;
|
|
||||||
} else {
|
|
||||||
sc->result = DID_ERROR << 16;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
simscsi_sg_readwrite (struct scsi_cmnd *sc, int mode, unsigned long offset)
|
simscsi_sg_readwrite (struct scsi_cmnd *sc, int mode, unsigned long offset)
|
||||||
{
|
{
|
||||||
int list_len = sc->use_sg;
|
int i;
|
||||||
struct scatterlist *sl = (struct scatterlist *)sc->request_buffer;
|
struct scatterlist *sl;
|
||||||
struct disk_stat stat;
|
struct disk_stat stat;
|
||||||
struct disk_req req;
|
struct disk_req req;
|
||||||
|
|
||||||
stat.fd = desc[sc->device->id];
|
stat.fd = desc[sc->device->id];
|
||||||
|
|
||||||
while (list_len) {
|
scsi_for_each_sg(sc, sl, scsi_sg_count(sc), i) {
|
||||||
req.addr = __pa(page_address(sl->page) + sl->offset);
|
req.addr = __pa(page_address(sl->page) + sl->offset);
|
||||||
req.len = sl->length;
|
req.len = sl->length;
|
||||||
if (DBG)
|
if (DBG)
|
||||||
printk("simscsi_sg_%s @ %lx (off %lx) use_sg=%d len=%d\n",
|
printk("simscsi_sg_%s @ %lx (off %lx) use_sg=%d len=%d\n",
|
||||||
mode == SSC_READ ? "read":"write", req.addr, offset,
|
mode == SSC_READ ? "read":"write", req.addr, offset,
|
||||||
list_len, sl->length);
|
scsi_sg_count(sc) - i, sl->length);
|
||||||
ia64_ssc(stat.fd, 1, __pa(&req), offset, mode);
|
ia64_ssc(stat.fd, 1, __pa(&req), offset, mode);
|
||||||
ia64_ssc(__pa(&stat), 0, 0, 0, SSC_WAIT_COMPLETION);
|
ia64_ssc(__pa(&stat), 0, 0, 0, SSC_WAIT_COMPLETION);
|
||||||
|
|
||||||
@ -173,8 +147,6 @@ simscsi_sg_readwrite (struct scsi_cmnd *sc, int mode, unsigned long offset)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
offset += sl->length;
|
offset += sl->length;
|
||||||
sl++;
|
|
||||||
list_len--;
|
|
||||||
}
|
}
|
||||||
sc->result = GOOD;
|
sc->result = GOOD;
|
||||||
}
|
}
|
||||||
@ -190,10 +162,7 @@ simscsi_readwrite6 (struct scsi_cmnd *sc, int mode)
|
|||||||
unsigned long offset;
|
unsigned long offset;
|
||||||
|
|
||||||
offset = (((sc->cmnd[1] & 0x1f) << 16) | (sc->cmnd[2] << 8) | sc->cmnd[3])*512;
|
offset = (((sc->cmnd[1] & 0x1f) << 16) | (sc->cmnd[2] << 8) | sc->cmnd[3])*512;
|
||||||
if (sc->use_sg > 0)
|
simscsi_sg_readwrite(sc, mode, offset);
|
||||||
simscsi_sg_readwrite(sc, mode, offset);
|
|
||||||
else
|
|
||||||
simscsi_readwrite(sc, mode, offset, sc->cmnd[4]*512);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static size_t
|
static size_t
|
||||||
@ -230,26 +199,21 @@ simscsi_readwrite10 (struct scsi_cmnd *sc, int mode)
|
|||||||
| ((unsigned long)sc->cmnd[3] << 16)
|
| ((unsigned long)sc->cmnd[3] << 16)
|
||||||
| ((unsigned long)sc->cmnd[4] << 8)
|
| ((unsigned long)sc->cmnd[4] << 8)
|
||||||
| ((unsigned long)sc->cmnd[5] << 0))*512UL;
|
| ((unsigned long)sc->cmnd[5] << 0))*512UL;
|
||||||
if (sc->use_sg > 0)
|
simscsi_sg_readwrite(sc, mode, offset);
|
||||||
simscsi_sg_readwrite(sc, mode, offset);
|
|
||||||
else
|
|
||||||
simscsi_readwrite(sc, mode, offset, ((sc->cmnd[7] << 8) | sc->cmnd[8])*512);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void simscsi_fillresult(struct scsi_cmnd *sc, char *buf, unsigned len)
|
static void simscsi_fillresult(struct scsi_cmnd *sc, char *buf, unsigned len)
|
||||||
{
|
{
|
||||||
|
|
||||||
int scatterlen = sc->use_sg;
|
int i;
|
||||||
|
unsigned thislen;
|
||||||
struct scatterlist *slp;
|
struct scatterlist *slp;
|
||||||
|
|
||||||
if (scatterlen == 0)
|
scsi_for_each_sg(sc, slp, scsi_sg_count(sc), i) {
|
||||||
memcpy(sc->request_buffer, buf, len);
|
if (!len)
|
||||||
else for (slp = (struct scatterlist *)sc->request_buffer;
|
break;
|
||||||
scatterlen-- > 0 && len > 0; slp++) {
|
thislen = min(len, slp->length);
|
||||||
unsigned thislen = min(len, slp->length);
|
|
||||||
|
|
||||||
memcpy(page_address(slp->page) + slp->offset, buf, thislen);
|
memcpy(page_address(slp->page) + slp->offset, buf, thislen);
|
||||||
slp++;
|
|
||||||
len -= thislen;
|
len -= thislen;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -275,7 +239,7 @@ simscsi_queuecommand (struct scsi_cmnd *sc, void (*done)(struct scsi_cmnd *))
|
|||||||
if (target_id <= 15 && sc->device->lun == 0) {
|
if (target_id <= 15 && sc->device->lun == 0) {
|
||||||
switch (sc->cmnd[0]) {
|
switch (sc->cmnd[0]) {
|
||||||
case INQUIRY:
|
case INQUIRY:
|
||||||
if (sc->request_bufflen < 35) {
|
if (scsi_bufflen(sc) < 35) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
sprintf (fname, "%s%c", simscsi_root, 'a' + target_id);
|
sprintf (fname, "%s%c", simscsi_root, 'a' + target_id);
|
||||||
@ -328,7 +292,7 @@ simscsi_queuecommand (struct scsi_cmnd *sc, void (*done)(struct scsi_cmnd *))
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case READ_CAPACITY:
|
case READ_CAPACITY:
|
||||||
if (desc[target_id] < 0 || sc->request_bufflen < 8) {
|
if (desc[target_id] < 0 || scsi_bufflen(sc) < 8) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
buf = localbuf;
|
buf = localbuf;
|
||||||
@ -350,7 +314,7 @@ simscsi_queuecommand (struct scsi_cmnd *sc, void (*done)(struct scsi_cmnd *))
|
|||||||
case MODE_SENSE:
|
case MODE_SENSE:
|
||||||
case MODE_SENSE_10:
|
case MODE_SENSE_10:
|
||||||
/* sd.c uses this to determine whether disk does write-caching. */
|
/* sd.c uses this to determine whether disk does write-caching. */
|
||||||
simscsi_fillresult(sc, (char *)empty_zero_page, sc->request_bufflen);
|
simscsi_fillresult(sc, (char *)empty_zero_page, scsi_bufflen(sc));
|
||||||
sc->result = GOOD;
|
sc->result = GOOD;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user