mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-30 10:49:28 +00:00
[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
1 changed files with 22 additions and 6 deletions
|
@ -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 {
|
||||||
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 {
|
||||||
|
|
||||||
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 {
|
||||||
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);
|
||||||
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,
|
||||||
{
|
{
|
||||||
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 *))
|
||||||
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 *))
|
||||||
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 *))
|
||||||
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 *))
|
||||||
/* 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,
|
||||||
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)
|
||||||
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 = {
|
||||||
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)
|
||||||
}
|
}
|
||||||
|
|
||||||
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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue