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,
        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,
 
        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,
        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];
 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);
 }
 {
        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);
        unsigned int id,lun;
        struct req_msg *req;
        u16 tag;
+
        host = cmd->device->host;
        id = cmd->device->id;
        lun = cmd->device->lun;
                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,
                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;
        /* 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;
        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,
        struct st_hba *hba;
        unsigned long flags;
        unsigned long before;
+
        hba = (struct st_hba *) &cmd->device->host->hostdata[0];
 
        printk(KERN_INFO DRV_NAME
 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;
        }
 
        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);