diff options
| author | James Bottomley <James.Bottomley@HansenPartnership.com> | 2008-01-18 10:47:01 -0600 | 
|---|---|---|
| committer | James Bottomley <James.Bottomley@HansenPartnership.com> | 2008-01-25 11:47:23 -0600 | 
| commit | 366ca51f30de1cbb5b356c70b7bb22051c558e41 (patch) | |
| tree | c28a9d3b64a5b3e3c8bd29c57003ee524e9e1e63 | |
| parent | 1292500b159c00a8fece072b004f154e6fda9f48 (diff) | |
| download | olio-linux-3.10-366ca51f30de1cbb5b356c70b7bb22051c558e41.tar.xz olio-linux-3.10-366ca51f30de1cbb5b356c70b7bb22051c558e41.zip  | |
[SCSI] libsas: abstract STP task status into a function
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 <jeff@garzik.org>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
| -rw-r--r-- | drivers/scsi/aic94xx/aic94xx_task.c | 20 | ||||
| -rw-r--r-- | drivers/scsi/libsas/Makefile | 3 | ||||
| -rw-r--r-- | drivers/scsi/libsas/sas_task.c | 36 | ||||
| -rw-r--r-- | include/scsi/libsas.h | 4 | 
4 files changed, 44 insertions, 19 deletions
diff --git a/drivers/scsi/aic94xx/aic94xx_task.c b/drivers/scsi/aic94xx/aic94xx_task.c index 663fdef38c5..965d4bb999d 100644 --- a/drivers/scsi/aic94xx/aic94xx_task.c +++ b/drivers/scsi/aic94xx/aic94xx_task.c @@ -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]; diff --git a/drivers/scsi/libsas/Makefile b/drivers/scsi/libsas/Makefile index 60d6e93dd94..1ad1323c60f 100644 --- a/drivers/scsi/libsas/Makefile +++ b/drivers/scsi/libsas/Makefile @@ -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
\ No newline at end of file diff --git a/drivers/scsi/libsas/sas_task.c b/drivers/scsi/libsas/sas_task.c new file mode 100644 index 00000000000..594524d5bfa --- /dev/null +++ b/drivers/scsi/libsas/sas_task.c @@ -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); + diff --git a/include/scsi/libsas.h b/include/scsi/libsas.h index a075f130303..3ffd6b582a9 100644 --- a/include/scsi/libsas.h +++ b/include/scsi/libsas.h @@ -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_ */  |