From f668acb6d553e316b029cbc4fb7465946e3c1d72 Mon Sep 17 00:00:00 2001 From: Vladislav Bolkhovitin Date: Thu, 30 Nov 2006 16:44:59 +0000 Subject: [PATCH] A bunch of small fixes and cleanups before 0.9.5 git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@37 d57e44dd-8a1f-0410-8b47-8ef2f437770f --- qla2x00t/qla2x00-target/Makefile | 1 - qla2x00t/qla2x00-target/README | 4 --- qla2x00t/qla2x00-target/qla2x00t.c | 51 ++++++++++++++++++------------ qla2x00t/qla2x_tgt_def.h | 4 +-- qla2x00t/qla_attr.c | 5 +-- 5 files changed, 36 insertions(+), 29 deletions(-) diff --git a/qla2x00t/qla2x00-target/Makefile b/qla2x00t/qla2x00-target/Makefile index e6fc55b54..29586ec52 100644 --- a/qla2x00t/qla2x00-target/Makefile +++ b/qla2x00t/qla2x00-target/Makefile @@ -30,7 +30,6 @@ SCST_INC_DIR := $(SUBDIRS)/../../scst/include SCST_DIR := $(shell pwd)/../../scst/src EXTRA_CFLAGS += -I$(SCST_INC_DIR) -DFC_TARGET_SUPPORT -EXTRA_CFLAGS += -DFC_SCST_WWN_AUTH INSTALL_DIR := /lib/modules/$(shell uname -r)/extra diff --git a/qla2x00t/qla2x00-target/README b/qla2x00t/qla2x00-target/README index 67dab42d2..9f71e1e0b 100644 --- a/qla2x00t/qla2x00-target/README +++ b/qla2x00t/qla2x00-target/README @@ -56,10 +56,6 @@ Compilation options There are the following compilation options, that could be commented in/out in Makefile: - - FC_SCST_WWN_AUTH - turns on using remote initiator's WWN as - authentification name for scst_register_session_ex(). If it is off, - LOOP ID used instead of WWN. - - DEBUG_TGT - turns on some debugging code, including some logging. Makes the driver considerably bigger and slower, producing large amount of log data. diff --git a/qla2x00t/qla2x00-target/qla2x00t.c b/qla2x00t/qla2x00-target/qla2x00t.c index 6bfdd49ac..38e26c13e 100644 --- a/qla2x00t/qla2x00-target/qla2x00t.c +++ b/qla2x00t/qla2x00-target/qla2x00t.c @@ -953,7 +953,7 @@ static inline void q2t_free_cmd(struct q2t_cmd *cmd) kmem_cache_free(q2t_cmd_cachep, cmd); } -void q2t_on_free_cmd(struct scst_cmd *scst_cmd) +static void q2t_on_free_cmd(struct scst_cmd *scst_cmd) { struct q2t_cmd *cmd = (struct q2t_cmd *)scst_cmd_get_tgt_priv(scst_cmd); @@ -1148,7 +1148,7 @@ static void q2t_send_busy(scsi_qla_host_t *ha, atio_entry_t *atio) ctio = (ctio_ret_entry_t *)tgt_data.req_pkt(ha); ctio->entry_type = CTIO_RET_TYPE; ctio->entry_count = 1; - ctio->handle = Q2T_BUSY_HANDLE; + ctio->handle = Q2T_BUSY_HANDLE | CTIO_COMPLETION_HANDLE_MARK; ctio->scsi_status = __constant_cpu_to_le16(BUSY << 1); /* Set IDs */ @@ -1263,8 +1263,7 @@ static void q2t_alloc_session_done(struct scst_session *scst_sess, return; } -static char *q2t_make_name(scsi_qla_host_t *ha, int loop_id) -#ifdef FC_SCST_WWN_AUTH +static char *q2t_find_name(scsi_qla_host_t *ha, int loop_id) { int wwn_found = 0; char *wwn_str; @@ -1291,31 +1290,32 @@ static char *q2t_make_name(scsi_qla_host_t *ha, int loop_id) } if (wwn_found == 0) { -#if 0 - PRINT_ERROR("qla2x00tgt(%ld): Unable to find wwn login for " - "loop id %d, using loop id instead", ha->instance, loop_id); - snprintf(wwn_str, 2*WWN_SIZE, "%d", loop_id); -#else - TRACE_DBG("qla2x00tgt(%ld): Unable to find wwn login for " + TRACE_MGMT_DBG("qla2x00tgt(%ld): Unable to find wwn login for " "loop id %d", ha->instance, loop_id); kfree(wwn_str); wwn_str = NULL; -#endif } - out: return wwn_str; } -#else + +static char *q2t_make_name(scsi_qla_host_t *ha, const uint8_t *name) { - char *s; - s = kmalloc(12, GFP_ATOMIC); - if (s != NULL) - snprintf(s, 12, "%d", loop_id); - return s; + char *wwn_str; + + wwn_str = kmalloc(3*WWN_SIZE, GFP_ATOMIC); + if (wwn_str == NULL) { + TRACE(TRACE_OUT_OF_MEM, "%s", "Allocation of wwn_str failed"); + goto out; + } + sprintf(wwn_str, "%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x", + name[1], name[0], name[3], name[2], name[5], name[4], + name[7], name[6]); + +out: + return wwn_str; } -#endif /* ha->hardware_lock supposed to be held on entry */ static int q2t_send_cmd_to_scst(scsi_qla_host_t *ha, atio_entry_t *atio) @@ -1378,11 +1378,18 @@ static int q2t_send_cmd_to_scst(scsi_qla_host_t *ha, atio_entry_t *atio) /* register session (remote initiator) */ { - char *name = q2t_make_name(ha, loop_id); + char *name; + if (IS_QLA2200(ha)) + name = q2t_find_name(ha, loop_id); + else { + name = q2t_make_name(ha, + atio->initiator_port_name); + } if (name == NULL) { res = -ESRCH; goto out_free_sess; } + sess->scst_sess = scst_register_session( tgt->scst_tgt, 1, name, sess, q2t_alloc_session_done); @@ -1744,7 +1751,11 @@ static void q2t_response_pkt(scsi_qla_host_t *ha, sts_entry_t *pkt) rc = q2t_send_cmd_to_scst(ha, atio); if (unlikely(rc != 0)) { if (rc == -ESRCH) { +#if 1 /* With TERM EXCHANGE some FC cards refuse to boot */ + q2t_send_busy(ha, atio); +#else q2t_send_term_exchange(ha, NULL, atio, 1); +#endif } else { PRINT_INFO("qla2x00tgt(%ld): Unable to " "send the command to SCSI target " diff --git a/qla2x00t/qla2x_tgt_def.h b/qla2x00t/qla2x_tgt_def.h index de54310a3..c0594955f 100644 --- a/qla2x00t/qla2x_tgt_def.h +++ b/qla2x00t/qla2x_tgt_def.h @@ -236,8 +236,8 @@ typedef struct uint8_t cdb[MAX_CMDSZ]; uint32_t data_length; uint16_t lun; - uint8_t initiator_port_name[WWN_SIZE]; /* on qla23xx */ - uint16_t reserved_32[6]; + uint8_t initiator_port_name[WWN_SIZE]; /* on qla23xx */ + uint8_t reserved2[12]; uint16_t ox_id; }atio_entry_t; #endif diff --git a/qla2x00t/qla_attr.c b/qla2x00t/qla_attr.c index 11ea68c79..3c0759335 100644 --- a/qla2x00t/qla_attr.c +++ b/qla2x00t/qla_attr.c @@ -7,6 +7,7 @@ #include "qla_def.h" #include +#include #include #ifdef FC_TARGET_SUPPORT @@ -61,17 +62,17 @@ qla2x00_store_tgt_enabled(struct class_device *cdev, if ((ha->flags.enable_target_mode) || force) { qla_target.tgt_host_action(ha, DISABLE_TARGET_MODE); } + msleep_interruptible(3*1000); break; case '1' : if ((ha->flags.enable_target_mode == 0) || force) { qla_target.tgt_host_action(ha, ENABLE_TARGET_MODE); } + msleep_interruptible(3*1000); break; default: -#if defined(QL_DEBUG_LEVEL_9) || defined(QL_DEBUG_LEVEL_11) printk("%s: Requested action not understood: %s\n", __func__, buffer); -#endif break; }