Long CDBs handling fixed

git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@2638 d57e44dd-8a1f-0410-8b47-8ef2f437770f
This commit is contained in:
Vladislav Bolkhovitin
2010-11-09 13:14:09 +00:00
parent c631f51530
commit e8f65b0336
3 changed files with 23 additions and 18 deletions
+2
View File
@@ -12,6 +12,8 @@ Summary of changes between versions 2.0.0 and 2.1.0
- Local sessions management made more robust
- Long CDBs handling fixed
- Other minor fixes and cleanups
+14 -16
View File
@@ -30,6 +30,7 @@
#include <linux/pci.h>
#include <linux/delay.h>
#include <linux/list.h>
#include <asm/unaligned.h>
#ifdef INSIDE_KERNEL_TREE
#include <scst/scst.h>
@@ -2915,7 +2916,8 @@ static void q24_send_term_exchange(scsi_qla_host_t *ha, struct q2t_cmd *cmd,
ctio->ox_id = swab16(atio->fcp_hdr.ox_id);
/* Most likely, it isn't needed */
ctio->residual = atio->fcp_cmnd.data_length;
ctio->residual = get_unaligned((uint32_t *)
&atio->fcp_cmnd.add_cdb[atio->fcp_cmnd.add_cdb_len]);
if (ctio->residual != 0)
ctio->scsi_status |= SS_RESIDUAL_UNDER;
@@ -3410,7 +3412,8 @@ static int q24_do_send_cmd_to_scst(struct q2t_cmd *cmd)
cmd->scst_cmd = scst_rx_cmd(sess->scst_sess,
(uint8_t *)&atio->fcp_cmnd.lun, sizeof(atio->fcp_cmnd.lun),
atio->fcp_cmnd.cdb, Q2T_MAX_CDB_LEN, SCST_ATOMIC);
atio->fcp_cmnd.cdb, sizeof(atio->fcp_cmnd.cdb) +
atio->fcp_cmnd.add_cdb_len, SCST_ATOMIC);
if (cmd->scst_cmd == NULL) {
PRINT_ERROR("%s", "qla2x00t: scst_rx_cmd() failed");
@@ -3431,7 +3434,8 @@ static int q24_do_send_cmd_to_scst(struct q2t_cmd *cmd)
else
dir = SCST_DATA_NONE;
scst_cmd_set_expected(cmd->scst_cmd, dir,
be32_to_cpu(atio->fcp_cmnd.data_length));
be32_to_cpu(get_unaligned((uint32_t *)
&atio->fcp_cmnd.add_cdb[atio->fcp_cmnd.add_cdb_len])));
switch (atio->fcp_cmnd.task_attr) {
case ATIO_SIMPLE_QUEUE:
@@ -4618,7 +4622,8 @@ static void q24_send_busy(scsi_qla_host_t *ha, atio7_entry_t *atio,
*/
ctio->ox_id = swab16(atio->fcp_hdr.ox_id);
ctio->scsi_status = cpu_to_le16(status);
ctio->residual = atio->fcp_cmnd.data_length;
ctio->residual = get_unaligned((uint32_t *)
&atio->fcp_cmnd.add_cdb[atio->fcp_cmnd.add_cdb_len]);
if (ctio->residual != 0)
ctio->scsi_status |= SS_RESIDUAL_UNDER;
@@ -4657,19 +4662,12 @@ static void q24_atio_pkt(scsi_qla_host_t *ha, atio7_entry_t *atio)
switch (atio->entry_type) {
case ATIO_TYPE7:
if (unlikely(atio->entry_count > 1) ||
unlikely(atio->fcp_cmnd.add_cdb_len != 0)) {
PRINT_ERROR("qla2x00t(%ld): Multi entry ATIO7 IOCBs "
"(%d), ie with CDBs>16 bytes (%d), are not "
"supported", ha->instance, atio->entry_count,
atio->fcp_cmnd.add_cdb_len);
break;
}
TRACE_DBG("ATIO_TYPE7 instance %ld, lun %Lx, read/write %d/%d, "
"data_length %04x, s_id %x:%x:%x", ha->instance,
atio->fcp_cmnd.lun, atio->fcp_cmnd.rddata,
atio->fcp_cmnd.wrdata,
be32_to_cpu(atio->fcp_cmnd.data_length),
"add_cdb_len %d, data_length %04x, s_id %x:%x:%x",
ha->instance, atio->fcp_cmnd.lun, atio->fcp_cmnd.rddata,
atio->fcp_cmnd.wrdata, atio->fcp_cmnd.add_cdb_len,
be32_to_cpu(get_unaligned((uint32_t *)
&atio->fcp_cmnd.add_cdb[atio->fcp_cmnd.add_cdb_len])),
atio->fcp_hdr.s_id[0], atio->fcp_hdr.s_id[1],
atio->fcp_hdr.s_id[2]);
TRACE_BUFFER("Incoming ATIO7 packet data", atio,
+7 -2
View File
@@ -428,8 +428,13 @@ typedef struct {
uint8_t rddata:1;
uint8_t add_cdb_len:6;
uint8_t cdb[16];
/* Valid only if add_cdb_len=0, otherwise this is additional CDB data */
uint32_t data_length;
/*
* add_cdb is optional and can absent from fcp_cmnd_t. Size 4 only to
* make sizeof(fcp_cmnd_t) be as expected by BUILD_BUG_ON() in
* q2t_init().
*/
uint8_t add_cdb[4];
/* uint32_t data_length; */
} __attribute__((packed)) fcp_cmnd_t;
/*