[PATCH 09/11] qla2xxx: Add Dual mode support in the driver

2016-12-23 Thread Himanshu Madhani
From: Quinn Tran 

Add switch to allow both Initiator Mode & Target
mode to operate at the same time.

Signed-off-by: Quinn Tran 
Signed-off-by: Himanshu Madhani 
---
 drivers/scsi/qla2xxx/qla_def.h |   1 +
 drivers/scsi/qla2xxx/qla_init.c|   3 +-
 drivers/scsi/qla2xxx/qla_isr.c |  19 ++-
 drivers/scsi/qla2xxx/qla_target.c  | 113 +++--
 drivers/scsi/qla2xxx/qla_target.h  |   6 +-
 drivers/scsi/qla2xxx/tcm_qla2xxx.c |   2 +-
 6 files changed, 124 insertions(+), 20 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
index 2d3bc22..ce3b946 100644
--- a/drivers/scsi/qla2xxx/qla_def.h
+++ b/drivers/scsi/qla2xxx/qla_def.h
@@ -3312,6 +3312,7 @@ struct qla_hw_data {
 #define FLOGI_SP_SUPPORTBIT_13
 
uint8_t port_no;/* Physical port of adapter */
+   uint8_t exch_starvation;
 
/* Timeout timers. */
uint8_t loop_down_abort_time;/* port down timer */
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index e0ca193..9da537c 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -3997,7 +3997,8 @@ static void qla2xxx_nvram_wwn_from_ofw(scsi_qla_host_t 
*vha, nvram_t *nv)
 * Process any ATIO queue entries that came in
 * while we weren't online.
 */
-   if (qla_tgt_mode_enabled(vha)) {
+   if (qla_tgt_mode_enabled(vha) ||
+   qla_dual_mode_enabled(vha)) {
if (IS_QLA27XX(ha) || IS_QLA83XX(ha)) {
spin_lock_irqsave(&ha->tgt.atio_lock,
flags);
diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c
index 36cc19f..2d47728 100644
--- a/drivers/scsi/qla2xxx/qla_isr.c
+++ b/drivers/scsi/qla2xxx/qla_isr.c
@@ -1028,7 +1028,8 @@ static void qla_irq_affinity_notify(struct 
irq_affinity_notify *,
 
qla2x00_mark_all_devices_lost(vha, 1);
 
-   if (vha->vp_idx == 0 && !qla_ini_mode_enabled(vha))
+   if (vha->vp_idx == 0 &&
+   (qla_tgt_mode_enabled(vha) || 
qla_dual_mode_enabled(vha)))
set_bit(SCR_PENDING, &vha->dpc_flags);
 
set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
@@ -1643,6 +1644,7 @@ static void qla_irq_affinity_notify(struct 
irq_affinity_notify *,
fcport->d_id.b.area, fcport->d_id.b.al_pa,
le32_to_cpu(logio->io_parameter[0]));
 
+   vha->hw->exch_starvation = 0;
data[0] = MBS_COMMAND_COMPLETE;
if (sp->type != SRB_LOGIN_CMD)
goto logio_done;
@@ -1678,6 +1680,21 @@ static void qla_irq_affinity_notify(struct 
irq_affinity_notify *,
case LSC_SCODE_NPORT_USED:
data[0] = MBS_LOOP_ID_USED;
break;
+   case LSC_SCODE_NOXCB:
+   vha->hw->exch_starvation++;
+   if (vha->hw->exch_starvation > 5) {
+   ql_log(ql_log_warn, vha, 0x,
+   "Exchange starvation. Reseting RISC\n");
+
+   vha->hw->exch_starvation = 0;
+
+   if (IS_P3P_TYPE(vha->hw))
+   set_bit(FCOE_CTX_RESET_NEEDED, &vha->dpc_flags);
+   else
+   set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
+   qla2xxx_wake_dpc(vha);
+   }
+   /* drop through */
default:
data[0] = MBS_COMMAND_ERROR;
break;
diff --git a/drivers/scsi/qla2xxx/qla_target.c 
b/drivers/scsi/qla2xxx/qla_target.c
index b697ba5..0fc6da5 100644
--- a/drivers/scsi/qla2xxx/qla_target.c
+++ b/drivers/scsi/qla2xxx/qla_target.c
@@ -55,8 +55,17 @@
"disabled on enabling target mode and then on disabling target mode "
"enabled back; "
"\"disabled\" - initiator mode will never be enabled; "
+   "\"dual\" - Initiator Modes will be enabled. Target Mode can be 
activated "
+   "when ready "
"\"enabled\" (default) - initiator mode will always stay enabled.");
 
+static int ql_dm_tgt_ex_pct = 50;
+module_param(ql_dm_tgt_ex_pct, int, S_IRUGO|S_IWUSR);
+MODULE_PARM_DESC(ql_dm_tgt_ex_pct,
+   "For Dual Mode (qlini_mode=dual), this parameter determines "
+   "the percentage of exchanges/cmds FW will allocate resources "
+   "for Target mode.");
+
 int ql2x_ini_mode = QLA2XXX_INI_MODE_EXCLUSIVE;
 
 static int temp_sam_status = SAM_STAT_BUSY;
@@ -1302,7 +1311,8 @@ int qlt_stop_phase1(struct qla_tgt *tgt)
wait_event(tgt->waitQ, test_tgt_sess_count(tgt));
 
/* Big hammer */
-   if (!ha->flags.host_shutting_down && qla_tgt_mode_enabled(vha))
+   if (!ha->flags.h

Re: [PATCH 09/11] qla2xxx: Add Dual mode support in the driver

2017-01-11 Thread Bart Van Assche
On 12/23/2016 08:23 PM, Himanshu Madhani wrote:
> -#define QLA_TGT_MODE_ENABLED() (ql2x_ini_mode != QLA2XXX_INI_MODE_ENABLED)
> +#define QLA_TGT_MODE_ENABLED() \
> + ((ql2x_ini_mode != QLA2XXX_INI_MODE_ENABLED) || \
> +  (ql2x_ini_mode == QLA2XXX_INI_MODE_DUAL))

Hello Himanshu and Quinn,

Is this change needed? It looks redundant to me. For all possible
ql2x_ini_mode values both the old and the new expression will yield the
same value.

Anyway, dual mode is a welcome improvement!

Bart.
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 09/11] qla2xxx: Add Dual mode support in the driver

2017-01-13 Thread Madhani, Himanshu


On 1/11/17, 11:51 AM, "Bart Van Assche"  wrote:

>On 12/23/2016 08:23 PM, Himanshu Madhani wrote:
>> -#define QLA_TGT_MODE_ENABLED() (ql2x_ini_mode != QLA2XXX_INI_MODE_ENABLED)
>> +#define QLA_TGT_MODE_ENABLED() \
>> +((ql2x_ini_mode != QLA2XXX_INI_MODE_ENABLED) || \
>> + (ql2x_ini_mode == QLA2XXX_INI_MODE_DUAL))
>
>Hello Himanshu and Quinn,
>
>Is this change needed? It looks redundant to me. For all possible
>ql2x_ini_mode values both the old and the new expression will yield the
>same value.

Agree. This is redundant. I’ll remove it.

>
>Anyway, dual mode is a welcome improvement!
>
>Bart.