[SCSI] stex: use sg buffer copy helper functions
This replaces stex_internal_copy with scsi_sg_copy_to/from_buffer. Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> Acked-by: Ed Lin <ed.lin@promise.com> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com> Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
This commit is contained in:
parent
d4345028d4
commit
31fe47d437
@ -426,49 +426,13 @@ static int stex_map_sg(struct st_hba *hba,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void stex_internal_copy(struct scsi_cmnd *cmd,
|
||||
const void *src, size_t *count, int sg_count, int direction)
|
||||
{
|
||||
size_t lcount;
|
||||
size_t len;
|
||||
void *s, *d, *base = NULL;
|
||||
size_t offset;
|
||||
|
||||
if (*count > scsi_bufflen(cmd))
|
||||
*count = scsi_bufflen(cmd);
|
||||
lcount = *count;
|
||||
while (lcount) {
|
||||
len = lcount;
|
||||
s = (void *)src;
|
||||
|
||||
offset = *count - lcount;
|
||||
s += offset;
|
||||
base = scsi_kmap_atomic_sg(scsi_sglist(cmd),
|
||||
sg_count, &offset, &len);
|
||||
if (!base) {
|
||||
*count -= lcount;
|
||||
return;
|
||||
}
|
||||
d = base + offset;
|
||||
|
||||
if (direction == ST_TO_CMD)
|
||||
memcpy(d, s, len);
|
||||
else
|
||||
memcpy(s, d, len);
|
||||
|
||||
lcount -= len;
|
||||
scsi_kunmap_atomic_sg(base);
|
||||
}
|
||||
}
|
||||
|
||||
static void stex_controller_info(struct st_hba *hba, struct st_ccb *ccb)
|
||||
{
|
||||
struct st_frame *p;
|
||||
size_t count = sizeof(struct st_frame);
|
||||
|
||||
p = hba->copy_buffer;
|
||||
stex_internal_copy(ccb->cmd, p, &count, scsi_sg_count(ccb->cmd),
|
||||
ST_FROM_CMD);
|
||||
count = scsi_sg_copy_to_buffer(ccb->cmd, p, count);
|
||||
memset(p->base, 0, sizeof(u32)*6);
|
||||
*(unsigned long *)(p->base) = pci_resource_start(hba->pdev, 0);
|
||||
p->rom_addr = 0;
|
||||
@ -486,8 +450,7 @@ static void stex_controller_info(struct st_hba *hba, struct st_ccb *ccb)
|
||||
p->subid =
|
||||
hba->pdev->subsystem_vendor << 16 | hba->pdev->subsystem_device;
|
||||
|
||||
stex_internal_copy(ccb->cmd, p, &count, scsi_sg_count(ccb->cmd),
|
||||
ST_TO_CMD);
|
||||
count = scsi_sg_copy_from_buffer(ccb->cmd, p, count);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -554,10 +517,8 @@ stex_queuecommand(struct scsi_cmnd *cmd, void (* done)(struct scsi_cmnd *))
|
||||
unsigned char page;
|
||||
page = cmd->cmnd[2] & 0x3f;
|
||||
if (page == 0x8 || page == 0x3f) {
|
||||
size_t cp_len = sizeof(ms10_caching_page);
|
||||
stex_internal_copy(cmd, ms10_caching_page,
|
||||
&cp_len, scsi_sg_count(cmd),
|
||||
ST_TO_CMD);
|
||||
scsi_sg_copy_from_buffer(cmd, ms10_caching_page,
|
||||
sizeof(ms10_caching_page));
|
||||
cmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8;
|
||||
done(cmd);
|
||||
} else
|
||||
@ -586,10 +547,8 @@ stex_queuecommand(struct scsi_cmnd *cmd, void (* done)(struct scsi_cmnd *))
|
||||
if (id != host->max_id - 1)
|
||||
break;
|
||||
if (lun == 0 && (cmd->cmnd[1] & INQUIRY_EVPD) == 0) {
|
||||
size_t cp_len = sizeof(console_inq_page);
|
||||
stex_internal_copy(cmd, console_inq_page,
|
||||
&cp_len, scsi_sg_count(cmd),
|
||||
ST_TO_CMD);
|
||||
scsi_sg_copy_from_buffer(cmd, (void *)console_inq_page,
|
||||
sizeof(console_inq_page));
|
||||
cmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8;
|
||||
done(cmd);
|
||||
} else
|
||||
@ -606,8 +565,7 @@ stex_queuecommand(struct scsi_cmnd *cmd, void (* done)(struct scsi_cmnd *))
|
||||
ver.signature[0] = PASSTHRU_SIGNATURE;
|
||||
ver.console_id = host->max_id - 1;
|
||||
ver.host_no = hba->host->host_no;
|
||||
stex_internal_copy(cmd, &ver, &cp_len,
|
||||
scsi_sg_count(cmd), ST_TO_CMD);
|
||||
cp_len = scsi_sg_copy_from_buffer(cmd, &ver, cp_len);
|
||||
cmd->result = sizeof(ver) == cp_len ?
|
||||
DID_OK << 16 | COMMAND_COMPLETE << 8 :
|
||||
DID_ERROR << 16 | COMMAND_COMPLETE << 8;
|
||||
@ -700,15 +658,12 @@ static void stex_copy_data(struct st_ccb *ccb,
|
||||
|
||||
if (ccb->cmd == NULL)
|
||||
return;
|
||||
stex_internal_copy(ccb->cmd,
|
||||
resp->variable, &count, scsi_sg_count(ccb->cmd), ST_TO_CMD);
|
||||
count = scsi_sg_copy_from_buffer(ccb->cmd, resp->variable, count);
|
||||
}
|
||||
|
||||
static void stex_ys_commands(struct st_hba *hba,
|
||||
struct st_ccb *ccb, struct status_msg *resp)
|
||||
{
|
||||
size_t count;
|
||||
|
||||
if (ccb->cmd->cmnd[0] == MGT_CMD &&
|
||||
resp->scsi_status != SAM_STAT_CHECK_CONDITION) {
|
||||
scsi_set_resid(ccb->cmd, scsi_bufflen(ccb->cmd) -
|
||||
@ -724,9 +679,8 @@ static void stex_ys_commands(struct st_hba *hba,
|
||||
resp->scsi_status == SAM_STAT_GOOD) {
|
||||
ST_INQ *inq_data;
|
||||
|
||||
count = STEX_EXTRA_SIZE;
|
||||
stex_internal_copy(ccb->cmd, hba->copy_buffer,
|
||||
&count, scsi_sg_count(ccb->cmd), ST_FROM_CMD);
|
||||
scsi_sg_copy_to_buffer(ccb->cmd, hba->copy_buffer,
|
||||
STEX_EXTRA_SIZE);
|
||||
inq_data = (ST_INQ *)hba->copy_buffer;
|
||||
if (inq_data->DeviceTypeQualifier != 0)
|
||||
ccb->srb_status = SRB_STATUS_SELECTION_TIMEOUT;
|
||||
|
Loading…
Reference in New Issue
Block a user