Commit 7cfe99a5 authored by Ed Lin - PTU's avatar Ed Lin - PTU Committed by James Bottomley

[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: default avatarEd Lin <ed.lin@promise.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@HansenPartnership.com>
parent e8a091b3
...@@ -103,7 +103,7 @@ enum { ...@@ -103,7 +103,7 @@ enum {
MU_REQ_COUNT = (MU_MAX_REQUEST + 1), MU_REQ_COUNT = (MU_MAX_REQUEST + 1),
MU_STATUS_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, REQ_VARIABLE_LEN = 1024,
STATUS_VAR_LEN = 128, STATUS_VAR_LEN = 128,
ST_CAN_QUEUE = MU_MAX_REQUEST, ST_CAN_QUEUE = MU_MAX_REQUEST,
...@@ -114,6 +114,9 @@ enum { ...@@ -114,6 +114,9 @@ enum {
SG_CF_EOT = 0x80, /* end of table */ SG_CF_EOT = 0x80, /* end of table */
SG_CF_64B = 0x40, /* 64 bit item */ SG_CF_64B = 0x40, /* 64 bit item */
SG_CF_HOST = 0x20, /* sg in host memory */ 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_shasta = 0,
st_vsc = 1, st_vsc = 1,
...@@ -123,7 +126,7 @@ enum { ...@@ -123,7 +126,7 @@ enum {
PASSTHRU_REQ_TYPE = 0x00000001, PASSTHRU_REQ_TYPE = 0x00000001,
PASSTHRU_REQ_NO_WAKEUP = 0x00000100, PASSTHRU_REQ_NO_WAKEUP = 0x00000100,
ST_INTERNAL_TIMEOUT = 30, ST_INTERNAL_TIMEOUT = 180,
ST_TO_CMD = 0, ST_TO_CMD = 0,
ST_FROM_CMD = 1, ST_FROM_CMD = 1,
...@@ -194,7 +197,7 @@ struct req_msg { ...@@ -194,7 +197,7 @@ struct req_msg {
u8 target; u8 target;
u8 task_attr; u8 task_attr;
u8 task_manage; u8 task_manage;
u8 prd_entry; u8 data_dir;
u8 payload_sz; /* payload size in 4-byte, not used */ u8 payload_sz; /* payload size in 4-byte, not used */
u8 cdb[STEX_CDB_LENGTH]; u8 cdb[STEX_CDB_LENGTH];
u8 variable[REQ_VARIABLE_LEN]; u8 variable[REQ_VARIABLE_LEN];
...@@ -318,8 +321,8 @@ MODULE_VERSION(ST_DRIVER_VERSION); ...@@ -318,8 +321,8 @@ MODULE_VERSION(ST_DRIVER_VERSION);
static void stex_gettime(__le32 *time) static void stex_gettime(__le32 *time)
{ {
struct timeval tv; struct timeval tv;
do_gettimeofday(&tv);
do_gettimeofday(&tv);
*time = cpu_to_le32(tv.tv_sec & 0xffffffff); *time = cpu_to_le32(tv.tv_sec & 0xffffffff);
*(time + 1) = cpu_to_le32((tv.tv_sec >> 16) >> 16); *(time + 1) = cpu_to_le32((tv.tv_sec >> 16) >> 16);
} }
...@@ -340,7 +343,7 @@ static void stex_invalid_field(struct scsi_cmnd *cmd, ...@@ -340,7 +343,7 @@ static void stex_invalid_field(struct scsi_cmnd *cmd,
{ {
cmd->result = (DRIVER_SENSE << 24) | SAM_STAT_CHECK_CONDITION; 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, scsi_build_sense_buffer(0, cmd->sense_buffer, ILLEGAL_REQUEST, 0x24,
0x0); 0x0);
done(cmd); done(cmd);
...@@ -469,6 +472,7 @@ stex_queuecommand(struct scsi_cmnd *cmd, void (* done)(struct scsi_cmnd *)) ...@@ -469,6 +472,7 @@ stex_queuecommand(struct scsi_cmnd *cmd, void (* done)(struct scsi_cmnd *))
unsigned int id,lun; unsigned int id,lun;
struct req_msg *req; struct req_msg *req;
u16 tag; u16 tag;
host = cmd->device->host; host = cmd->device->host;
id = cmd->device->id; id = cmd->device->id;
lun = cmd->device->lun; lun = cmd->device->lun;
...@@ -480,6 +484,7 @@ stex_queuecommand(struct scsi_cmnd *cmd, void (* done)(struct scsi_cmnd *)) ...@@ -480,6 +484,7 @@ stex_queuecommand(struct scsi_cmnd *cmd, void (* done)(struct scsi_cmnd *))
static char ms10_caching_page[12] = static char ms10_caching_page[12] =
{ 0, 0x12, 0, 0, 0, 0, 0, 0, 0x8, 0xa, 0x4, 0 }; { 0, 0x12, 0, 0, 0, 0, 0, 0, 0x8, 0xa, 0x4, 0 };
unsigned char page; unsigned char page;
page = cmd->cmnd[2] & 0x3f; page = cmd->cmnd[2] & 0x3f;
if (page == 0x8 || page == 0x3f) { if (page == 0x8 || page == 0x3f) {
scsi_sg_copy_from_buffer(cmd, ms10_caching_page, scsi_sg_copy_from_buffer(cmd, ms10_caching_page,
...@@ -523,6 +528,7 @@ stex_queuecommand(struct scsi_cmnd *cmd, void (* done)(struct scsi_cmnd *)) ...@@ -523,6 +528,7 @@ stex_queuecommand(struct scsi_cmnd *cmd, void (* done)(struct scsi_cmnd *))
if (cmd->cmnd[1] == PASSTHRU_GET_DRVVER) { if (cmd->cmnd[1] == PASSTHRU_GET_DRVVER) {
struct st_drvver ver; struct st_drvver ver;
size_t cp_len = sizeof(ver); size_t cp_len = sizeof(ver);
ver.major = ST_VER_MAJOR; ver.major = ST_VER_MAJOR;
ver.minor = ST_VER_MINOR; ver.minor = ST_VER_MINOR;
ver.oem = ST_OEM; ver.oem = ST_OEM;
...@@ -556,6 +562,13 @@ stex_queuecommand(struct scsi_cmnd *cmd, void (* done)(struct scsi_cmnd *)) ...@@ -556,6 +562,13 @@ stex_queuecommand(struct scsi_cmnd *cmd, void (* done)(struct scsi_cmnd *))
/* cdb */ /* cdb */
memcpy(req->cdb, cmd->cmnd, STEX_CDB_LENGTH); 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].cmd = cmd;
hba->ccb[tag].sense_bufflen = SCSI_SENSE_BUFFERSIZE; hba->ccb[tag].sense_bufflen = SCSI_SENSE_BUFFERSIZE;
hba->ccb[tag].sense_buffer = cmd->sense_buffer; hba->ccb[tag].sense_buffer = cmd->sense_buffer;
...@@ -614,6 +627,7 @@ static void stex_copy_data(struct st_ccb *ccb, ...@@ -614,6 +627,7 @@ static void stex_copy_data(struct st_ccb *ccb,
struct status_msg *resp, unsigned int variable) struct status_msg *resp, unsigned int variable)
{ {
size_t count = variable; size_t count = variable;
if (resp->scsi_status != SAM_STAT_GOOD) { if (resp->scsi_status != SAM_STAT_GOOD) {
if (ccb->sense_buffer != NULL) if (ccb->sense_buffer != NULL)
memcpy(ccb->sense_buffer, resp->variable, memcpy(ccb->sense_buffer, resp->variable,
...@@ -938,6 +952,7 @@ static int stex_reset(struct scsi_cmnd *cmd) ...@@ -938,6 +952,7 @@ static int stex_reset(struct scsi_cmnd *cmd)
struct st_hba *hba; struct st_hba *hba;
unsigned long flags; unsigned long flags;
unsigned long before; unsigned long before;
hba = (struct st_hba *) &cmd->device->host->hostdata[0]; hba = (struct st_hba *) &cmd->device->host->hostdata[0];
printk(KERN_INFO DRV_NAME printk(KERN_INFO DRV_NAME
...@@ -1022,6 +1037,7 @@ static struct scsi_host_template driver_template = { ...@@ -1022,6 +1037,7 @@ static struct scsi_host_template driver_template = {
static int stex_set_dma_mask(struct pci_dev * pdev) static int stex_set_dma_mask(struct pci_dev * pdev)
{ {
int ret; int ret;
if (!pci_set_dma_mask(pdev, DMA_64BIT_MASK) if (!pci_set_dma_mask(pdev, DMA_64BIT_MASK)
&& !pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK)) && !pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK))
return 0; return 0;
...@@ -1079,7 +1095,7 @@ stex_probe(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -1079,7 +1095,7 @@ stex_probe(struct pci_dev *pdev, const struct pci_device_id *id)
} }
hba->cardtype = (unsigned int) id->driver_data; 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->cardtype = st_vsc1;
hba->dma_size = (hba->cardtype == st_vsc1 || hba->cardtype == st_seq) ? hba->dma_size = (hba->cardtype == st_vsc1 || hba->cardtype == st_seq) ?
(STEX_BUFFER_SIZE + ST_ADDITIONAL_MEM) : (STEX_BUFFER_SIZE); (STEX_BUFFER_SIZE + ST_ADDITIONAL_MEM) : (STEX_BUFFER_SIZE);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment