[SCSI] stex: Small fixes
Some small fixes, including: - add data direction in req_msg because new firmware version may require this (backward compatible) - change internal timeout value - change judgment of type st_vsc1 - blank line handling, etc. Signed-off-by: Ed Lin <ed.lin@promise.com> Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
This commit is contained in:
		
							parent
							
								
									e8a091b36c
								
							
						
					
					
						commit
						7cfe99a526
					
				| @ -103,7 +103,7 @@ enum { | ||||
| 	MU_REQ_COUNT				= (MU_MAX_REQUEST + 1), | ||||
| 	MU_STATUS_COUNT				= (MU_MAX_REQUEST + 1), | ||||
| 
 | ||||
| 	STEX_CDB_LENGTH				= MAX_COMMAND_SIZE, | ||||
| 	STEX_CDB_LENGTH				= 16, | ||||
| 	REQ_VARIABLE_LEN			= 1024, | ||||
| 	STATUS_VAR_LEN				= 128, | ||||
| 	ST_CAN_QUEUE				= MU_MAX_REQUEST, | ||||
| @ -114,6 +114,9 @@ enum { | ||||
| 	SG_CF_EOT				= 0x80,	/* end of table */ | ||||
| 	SG_CF_64B				= 0x40,	/* 64 bit item */ | ||||
| 	SG_CF_HOST				= 0x20,	/* sg in host memory */ | ||||
| 	MSG_DATA_DIR_ND				= 0, | ||||
| 	MSG_DATA_DIR_IN				= 1, | ||||
| 	MSG_DATA_DIR_OUT			= 2, | ||||
| 
 | ||||
| 	st_shasta				= 0, | ||||
| 	st_vsc					= 1, | ||||
| @ -123,7 +126,7 @@ enum { | ||||
| 
 | ||||
| 	PASSTHRU_REQ_TYPE			= 0x00000001, | ||||
| 	PASSTHRU_REQ_NO_WAKEUP			= 0x00000100, | ||||
| 	ST_INTERNAL_TIMEOUT			= 30, | ||||
| 	ST_INTERNAL_TIMEOUT			= 180, | ||||
| 
 | ||||
| 	ST_TO_CMD				= 0, | ||||
| 	ST_FROM_CMD				= 1, | ||||
| @ -194,7 +197,7 @@ struct req_msg { | ||||
| 	u8 target; | ||||
| 	u8 task_attr; | ||||
| 	u8 task_manage; | ||||
| 	u8 prd_entry; | ||||
| 	u8 data_dir; | ||||
| 	u8 payload_sz;		/* payload size in 4-byte, not used */ | ||||
| 	u8 cdb[STEX_CDB_LENGTH]; | ||||
| 	u8 variable[REQ_VARIABLE_LEN]; | ||||
| @ -318,8 +321,8 @@ MODULE_VERSION(ST_DRIVER_VERSION); | ||||
| static void stex_gettime(__le32 *time) | ||||
| { | ||||
| 	struct timeval tv; | ||||
| 	do_gettimeofday(&tv); | ||||
| 
 | ||||
| 	do_gettimeofday(&tv); | ||||
| 	*time = cpu_to_le32(tv.tv_sec & 0xffffffff); | ||||
| 	*(time + 1) = cpu_to_le32((tv.tv_sec >> 16) >> 16); | ||||
| } | ||||
| @ -340,7 +343,7 @@ static void stex_invalid_field(struct scsi_cmnd *cmd, | ||||
| { | ||||
| 	cmd->result = (DRIVER_SENSE << 24) | SAM_STAT_CHECK_CONDITION; | ||||
| 
 | ||||
| 	/* "Invalid field in cbd" */ | ||||
| 	/* "Invalid field in cdb" */ | ||||
| 	scsi_build_sense_buffer(0, cmd->sense_buffer, ILLEGAL_REQUEST, 0x24, | ||||
| 				0x0); | ||||
| 	done(cmd); | ||||
| @ -469,6 +472,7 @@ stex_queuecommand(struct scsi_cmnd *cmd, void (* done)(struct scsi_cmnd *)) | ||||
| 	unsigned int id,lun; | ||||
| 	struct req_msg *req; | ||||
| 	u16 tag; | ||||
| 
 | ||||
| 	host = cmd->device->host; | ||||
| 	id = cmd->device->id; | ||||
| 	lun = cmd->device->lun; | ||||
| @ -480,6 +484,7 @@ stex_queuecommand(struct scsi_cmnd *cmd, void (* done)(struct scsi_cmnd *)) | ||||
| 		static char ms10_caching_page[12] = | ||||
| 			{ 0, 0x12, 0, 0, 0, 0, 0, 0, 0x8, 0xa, 0x4, 0 }; | ||||
| 		unsigned char page; | ||||
| 
 | ||||
| 		page = cmd->cmnd[2] & 0x3f; | ||||
| 		if (page == 0x8 || page == 0x3f) { | ||||
| 			scsi_sg_copy_from_buffer(cmd, ms10_caching_page, | ||||
| @ -523,6 +528,7 @@ stex_queuecommand(struct scsi_cmnd *cmd, void (* done)(struct scsi_cmnd *)) | ||||
| 		if (cmd->cmnd[1] == PASSTHRU_GET_DRVVER) { | ||||
| 			struct st_drvver ver; | ||||
| 			size_t cp_len = sizeof(ver); | ||||
| 
 | ||||
| 			ver.major = ST_VER_MAJOR; | ||||
| 			ver.minor = ST_VER_MINOR; | ||||
| 			ver.oem = ST_OEM; | ||||
| @ -556,6 +562,13 @@ stex_queuecommand(struct scsi_cmnd *cmd, void (* done)(struct scsi_cmnd *)) | ||||
| 	/* cdb */ | ||||
| 	memcpy(req->cdb, cmd->cmnd, STEX_CDB_LENGTH); | ||||
| 
 | ||||
| 	if (cmd->sc_data_direction == DMA_FROM_DEVICE) | ||||
| 		req->data_dir = MSG_DATA_DIR_IN; | ||||
| 	else if (cmd->sc_data_direction == DMA_TO_DEVICE) | ||||
| 		req->data_dir = MSG_DATA_DIR_OUT; | ||||
| 	else | ||||
| 		req->data_dir = MSG_DATA_DIR_ND; | ||||
| 
 | ||||
| 	hba->ccb[tag].cmd = cmd; | ||||
| 	hba->ccb[tag].sense_bufflen = SCSI_SENSE_BUFFERSIZE; | ||||
| 	hba->ccb[tag].sense_buffer = cmd->sense_buffer; | ||||
| @ -614,6 +627,7 @@ static void stex_copy_data(struct st_ccb *ccb, | ||||
| 	struct status_msg *resp, unsigned int variable) | ||||
| { | ||||
| 	size_t count = variable; | ||||
| 
 | ||||
| 	if (resp->scsi_status != SAM_STAT_GOOD) { | ||||
| 		if (ccb->sense_buffer != NULL) | ||||
| 			memcpy(ccb->sense_buffer, resp->variable, | ||||
| @ -938,6 +952,7 @@ static int stex_reset(struct scsi_cmnd *cmd) | ||||
| 	struct st_hba *hba; | ||||
| 	unsigned long flags; | ||||
| 	unsigned long before; | ||||
| 
 | ||||
| 	hba = (struct st_hba *) &cmd->device->host->hostdata[0]; | ||||
| 
 | ||||
| 	printk(KERN_INFO DRV_NAME | ||||
| @ -1022,6 +1037,7 @@ static struct scsi_host_template driver_template = { | ||||
| static int stex_set_dma_mask(struct pci_dev * pdev) | ||||
| { | ||||
| 	int ret; | ||||
| 
 | ||||
| 	if (!pci_set_dma_mask(pdev, DMA_64BIT_MASK) | ||||
| 		&& !pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK)) | ||||
| 		return 0; | ||||
| @ -1079,7 +1095,7 @@ stex_probe(struct pci_dev *pdev, const struct pci_device_id *id) | ||||
| 	} | ||||
| 
 | ||||
| 	hba->cardtype = (unsigned int) id->driver_data; | ||||
| 	if (hba->cardtype == st_vsc && (pdev->subsystem_device & 0xf) == 0x1) | ||||
| 	if (hba->cardtype == st_vsc && (pdev->subsystem_device & 1)) | ||||
| 		hba->cardtype = st_vsc1; | ||||
| 	hba->dma_size = (hba->cardtype == st_vsc1 || hba->cardtype == st_seq) ? | ||||
| 		(STEX_BUFFER_SIZE + ST_ADDITIONAL_MEM) : (STEX_BUFFER_SIZE); | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user