Skip to content

Commit

Permalink
[SCSI] libsas: abstract STP task status into a function
Browse files Browse the repository at this point in the history
Break out the frame processor for STP tasks from aic94xx so they can
be shared by other SAS HBA's

Original patch from Jeff Garzik <[email protected]>

Signed-off-by: James Bottomley <[email protected]>
  • Loading branch information
James Bottomley authored and James Bottomley committed Jan 25, 2008
1 parent 1292500 commit 366ca51
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 19 deletions.
20 changes: 2 additions & 18 deletions drivers/scsi/aic94xx/aic94xx_task.c
Original file line number Diff line number Diff line change
Expand Up @@ -192,24 +192,8 @@ static void asd_get_response_tasklet(struct asd_ascb *ascb,
r + 16 + sizeof(struct ssp_frame_hdr);

ts->residual = le32_to_cpu(*(__le32 *)r);
ts->resp = SAS_TASK_COMPLETE;
if (iu->datapres == 0)
ts->stat = iu->status;
else if (iu->datapres == 1)
ts->stat = iu->resp_data[3];
else if (iu->datapres == 2) {
ts->stat = SAM_CHECK_COND;
ts->buf_valid_size = min((u32) SAS_STATUS_BUF_SIZE,
be32_to_cpu(iu->sense_data_len));
memcpy(ts->buf, iu->sense_data, ts->buf_valid_size);
if (iu->status != SAM_CHECK_COND) {
ASD_DPRINTK("device %llx sent sense data, but "
"stat(0x%x) is not CHECK_CONDITION"
"\n",
SAS_ADDR(task->dev->sas_addr),
iu->status);
}
}

sas_ssp_task_response(&asd_ha->pcidev->dev, task, iu);
} else {
struct ata_task_resp *resp = (void *) &ts->buf[0];

Expand Down
3 changes: 2 additions & 1 deletion drivers/scsi/libsas/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ libsas-y += sas_init.o \
sas_dump.o \
sas_discover.o \
sas_expander.o \
sas_scsi_host.o
sas_scsi_host.o \
sas_task.o
libsas-$(CONFIG_SCSI_SAS_ATA) += sas_ata.o
libsas-$(CONFIG_SCSI_SAS_HOST_SMP) += sas_host_smp.o
36 changes: 36 additions & 0 deletions drivers/scsi/libsas/sas_task.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
#include <linux/kernel.h>
#include <scsi/sas.h>
#include <scsi/libsas.h>

/* fill task_status_struct based on SSP response frame */
void sas_ssp_task_response(struct device *dev, struct sas_task *task,
struct ssp_response_iu *iu)
{
struct task_status_struct *tstat = &task->task_status;

tstat->resp = SAS_TASK_COMPLETE;

if (iu->datapres == 0)
tstat->stat = iu->status;
else if (iu->datapres == 1)
tstat->stat = iu->resp_data[3];
else if (iu->datapres == 2) {
tstat->stat = SAM_CHECK_COND;
tstat->buf_valid_size =
min_t(int, SAS_STATUS_BUF_SIZE,
be32_to_cpu(iu->sense_data_len));
memcpy(tstat->buf, iu->sense_data, tstat->buf_valid_size);

if (iu->status != SAM_CHECK_COND)
dev_printk(KERN_WARNING, dev,
"dev %llx sent sense data, but "
"stat(%x) is not CHECK CONDITION\n",
SAS_ADDR(task->dev->sas_addr),
iu->status);
}
else
/* when datapres contains corrupt/unknown value... */
tstat->stat = SAM_CHECK_COND;
}
EXPORT_SYMBOL_GPL(sas_ssp_task_response);

4 changes: 4 additions & 0 deletions include/scsi/libsas.h
Original file line number Diff line number Diff line change
Expand Up @@ -672,4 +672,8 @@ extern int sas_ioctl(struct scsi_device *sdev, int cmd, void __user *arg);

extern int sas_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy,
struct request *req);

extern void sas_ssp_task_response(struct device *dev, struct sas_task *task,
struct ssp_response_iu *iu);

#endif /* _SASLIB_H_ */

0 comments on commit 366ca51

Please sign in to comment.