mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2025-04-19 23:17:48 +07:00
scsi: qla2xxx: Dual FCP-NVMe target port support
Some storage arrays advertise FCP LUNs and NVMe namespaces behind the same WWN. The driver now offers a user option by way of NVRAM parameter to allow users to choose, on a per port basis, the kind of FC-4 type they would like to prioritize for login. Link: https://lore.kernel.org/r/20190912180918.6436-9-hmadhani@marvell.com Signed-off-by: Michael Hernandez <mhernandez@marvell.com> Signed-off-by: Himanshu Madhani <hmadhani@marvell.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
a3a8d13f62
commit
84ed362ac4
@ -2277,7 +2277,7 @@ typedef struct {
|
|||||||
uint8_t fabric_port_name[WWN_SIZE];
|
uint8_t fabric_port_name[WWN_SIZE];
|
||||||
uint16_t fp_speed;
|
uint16_t fp_speed;
|
||||||
uint8_t fc4_type;
|
uint8_t fc4_type;
|
||||||
uint8_t fc4f_nvme; /* nvme fc4 feature bits */
|
uint8_t fc4_features;
|
||||||
} sw_info_t;
|
} sw_info_t;
|
||||||
|
|
||||||
/* FCP-4 types */
|
/* FCP-4 types */
|
||||||
@ -2445,7 +2445,7 @@ typedef struct fc_port {
|
|||||||
u32 supported_classes;
|
u32 supported_classes;
|
||||||
|
|
||||||
uint8_t fc4_type;
|
uint8_t fc4_type;
|
||||||
uint8_t fc4f_nvme;
|
uint8_t fc4_features;
|
||||||
uint8_t scan_state;
|
uint8_t scan_state;
|
||||||
|
|
||||||
unsigned long last_queue_full;
|
unsigned long last_queue_full;
|
||||||
@ -2476,6 +2476,9 @@ typedef struct fc_port {
|
|||||||
u16 n2n_chip_reset;
|
u16 n2n_chip_reset;
|
||||||
} fc_port_t;
|
} fc_port_t;
|
||||||
|
|
||||||
|
#define FC4_PRIORITY_NVME 0
|
||||||
|
#define FC4_PRIORITY_FCP 1
|
||||||
|
|
||||||
#define QLA_FCPORT_SCAN 1
|
#define QLA_FCPORT_SCAN 1
|
||||||
#define QLA_FCPORT_FOUND 2
|
#define QLA_FCPORT_FOUND 2
|
||||||
|
|
||||||
@ -4291,6 +4294,8 @@ struct qla_hw_data {
|
|||||||
atomic_t nvme_active_aen_cnt;
|
atomic_t nvme_active_aen_cnt;
|
||||||
uint16_t nvme_last_rptd_aen; /* Last recorded aen count */
|
uint16_t nvme_last_rptd_aen; /* Last recorded aen count */
|
||||||
|
|
||||||
|
uint8_t fc4_type_priority;
|
||||||
|
|
||||||
atomic_t zio_threshold;
|
atomic_t zio_threshold;
|
||||||
uint16_t last_zio_threshold;
|
uint16_t last_zio_threshold;
|
||||||
|
|
||||||
@ -4816,6 +4821,23 @@ struct sff_8247_a0 {
|
|||||||
ha->current_topology == ISP_CFG_N || \
|
ha->current_topology == ISP_CFG_N || \
|
||||||
!ha->current_topology)
|
!ha->current_topology)
|
||||||
|
|
||||||
|
#define NVME_TYPE(fcport) \
|
||||||
|
(fcport->fc4_type & FS_FC4TYPE_NVME) \
|
||||||
|
|
||||||
|
#define FCP_TYPE(fcport) \
|
||||||
|
(fcport->fc4_type & FS_FC4TYPE_FCP) \
|
||||||
|
|
||||||
|
#define NVME_ONLY_TARGET(fcport) \
|
||||||
|
(NVME_TYPE(fcport) && !FCP_TYPE(fcport)) \
|
||||||
|
|
||||||
|
#define NVME_FCP_TARGET(fcport) \
|
||||||
|
(FCP_TYPE(fcport) && NVME_TYPE(fcport)) \
|
||||||
|
|
||||||
|
#define NVME_TARGET(ha, fcport) \
|
||||||
|
((NVME_FCP_TARGET(fcport) && \
|
||||||
|
(ha->fc4_type_priority == FC4_PRIORITY_NVME)) || \
|
||||||
|
NVME_ONLY_TARGET(fcport)) \
|
||||||
|
|
||||||
#include "qla_target.h"
|
#include "qla_target.h"
|
||||||
#include "qla_gbl.h"
|
#include "qla_gbl.h"
|
||||||
#include "qla_dbg.h"
|
#include "qla_dbg.h"
|
||||||
|
@ -2101,4 +2101,6 @@ struct qla_fcp_prio_cfg {
|
|||||||
#define FA_FLASH_LAYOUT_ADDR_83 (0x3F1000/4)
|
#define FA_FLASH_LAYOUT_ADDR_83 (0x3F1000/4)
|
||||||
#define FA_FLASH_LAYOUT_ADDR_28 (0x11000/4)
|
#define FA_FLASH_LAYOUT_ADDR_28 (0x11000/4)
|
||||||
|
|
||||||
|
#define NVRAM_DUAL_FCP_NVME_FLAG_OFFSET 0x196
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -248,7 +248,7 @@ qla2x00_ga_nxt(scsi_qla_host_t *vha, fc_port_t *fcport)
|
|||||||
WWN_SIZE);
|
WWN_SIZE);
|
||||||
|
|
||||||
fcport->fc4_type = (ct_rsp->rsp.ga_nxt.fc4_types[2] & BIT_0) ?
|
fcport->fc4_type = (ct_rsp->rsp.ga_nxt.fc4_types[2] & BIT_0) ?
|
||||||
FC4_TYPE_FCP_SCSI : FC4_TYPE_OTHER;
|
FS_FC4TYPE_FCP : FC4_TYPE_OTHER;
|
||||||
|
|
||||||
if (ct_rsp->rsp.ga_nxt.port_type != NS_N_PORT_TYPE &&
|
if (ct_rsp->rsp.ga_nxt.port_type != NS_N_PORT_TYPE &&
|
||||||
ct_rsp->rsp.ga_nxt.port_type != NS_NL_PORT_TYPE)
|
ct_rsp->rsp.ga_nxt.port_type != NS_NL_PORT_TYPE)
|
||||||
@ -2887,7 +2887,7 @@ qla2x00_gff_id(scsi_qla_host_t *vha, sw_info_t *list)
|
|||||||
struct ct_sns_req *ct_req;
|
struct ct_sns_req *ct_req;
|
||||||
struct ct_sns_rsp *ct_rsp;
|
struct ct_sns_rsp *ct_rsp;
|
||||||
struct qla_hw_data *ha = vha->hw;
|
struct qla_hw_data *ha = vha->hw;
|
||||||
uint8_t fcp_scsi_features = 0;
|
uint8_t fcp_scsi_features = 0, nvme_features = 0;
|
||||||
struct ct_arg arg;
|
struct ct_arg arg;
|
||||||
|
|
||||||
for (i = 0; i < ha->max_fibre_devices; i++) {
|
for (i = 0; i < ha->max_fibre_devices; i++) {
|
||||||
@ -2933,14 +2933,19 @@ qla2x00_gff_id(scsi_qla_host_t *vha, sw_info_t *list)
|
|||||||
ct_rsp->rsp.gff_id.fc4_features[GFF_FCP_SCSI_OFFSET];
|
ct_rsp->rsp.gff_id.fc4_features[GFF_FCP_SCSI_OFFSET];
|
||||||
fcp_scsi_features &= 0x0f;
|
fcp_scsi_features &= 0x0f;
|
||||||
|
|
||||||
if (fcp_scsi_features)
|
if (fcp_scsi_features) {
|
||||||
list[i].fc4_type = FC4_TYPE_FCP_SCSI;
|
list[i].fc4_type = FS_FC4TYPE_FCP;
|
||||||
else
|
list[i].fc4_features = fcp_scsi_features;
|
||||||
list[i].fc4_type = FC4_TYPE_OTHER;
|
}
|
||||||
|
|
||||||
list[i].fc4f_nvme =
|
nvme_features =
|
||||||
ct_rsp->rsp.gff_id.fc4_features[GFF_NVME_OFFSET];
|
ct_rsp->rsp.gff_id.fc4_features[GFF_NVME_OFFSET];
|
||||||
list[i].fc4f_nvme &= 0xf;
|
nvme_features &= 0xf;
|
||||||
|
|
||||||
|
if (nvme_features) {
|
||||||
|
list[i].fc4_type |= FS_FC4TYPE_NVME;
|
||||||
|
list[i].fc4_features = nvme_features;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Last device exit. */
|
/* Last device exit. */
|
||||||
@ -3435,6 +3440,8 @@ void qla24xx_async_gffid_sp_done(srb_t *sp, int res)
|
|||||||
fc_port_t *fcport = sp->fcport;
|
fc_port_t *fcport = sp->fcport;
|
||||||
struct ct_sns_rsp *ct_rsp;
|
struct ct_sns_rsp *ct_rsp;
|
||||||
struct event_arg ea;
|
struct event_arg ea;
|
||||||
|
uint8_t fc4_scsi_feat;
|
||||||
|
uint8_t fc4_nvme_feat;
|
||||||
|
|
||||||
ql_dbg(ql_dbg_disc, vha, 0x2133,
|
ql_dbg(ql_dbg_disc, vha, 0x2133,
|
||||||
"Async done-%s res %x ID %x. %8phC\n",
|
"Async done-%s res %x ID %x. %8phC\n",
|
||||||
@ -3442,24 +3449,25 @@ void qla24xx_async_gffid_sp_done(srb_t *sp, int res)
|
|||||||
|
|
||||||
fcport->flags &= ~FCF_ASYNC_SENT;
|
fcport->flags &= ~FCF_ASYNC_SENT;
|
||||||
ct_rsp = &fcport->ct_desc.ct_sns->p.rsp;
|
ct_rsp = &fcport->ct_desc.ct_sns->p.rsp;
|
||||||
|
fc4_scsi_feat = ct_rsp->rsp.gff_id.fc4_features[GFF_FCP_SCSI_OFFSET];
|
||||||
|
fc4_nvme_feat = ct_rsp->rsp.gff_id.fc4_features[GFF_NVME_OFFSET];
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* FC-GS-7, 5.2.3.12 FC-4 Features - format
|
* FC-GS-7, 5.2.3.12 FC-4 Features - format
|
||||||
* The format of the FC-4 Features object, as defined by the FC-4,
|
* The format of the FC-4 Features object, as defined by the FC-4,
|
||||||
* Shall be an array of 4-bit values, one for each type code value
|
* Shall be an array of 4-bit values, one for each type code value
|
||||||
*/
|
*/
|
||||||
if (!res) {
|
if (!res) {
|
||||||
if (ct_rsp->rsp.gff_id.fc4_features[GFF_FCP_SCSI_OFFSET] & 0xf) {
|
if (fc4_scsi_feat & 0xf) {
|
||||||
/* w1 b00:03 */
|
/* w1 b00:03 */
|
||||||
fcport->fc4_type =
|
fcport->fc4_type = FS_FC4TYPE_FCP;
|
||||||
ct_rsp->rsp.gff_id.fc4_features[GFF_FCP_SCSI_OFFSET];
|
fcport->fc4_features = fc4_scsi_feat & 0xf;
|
||||||
fcport->fc4_type &= 0xf;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ct_rsp->rsp.gff_id.fc4_features[GFF_NVME_OFFSET] & 0xf) {
|
if (fc4_nvme_feat & 0xf) {
|
||||||
/* w5 [00:03]/28h */
|
/* w5 [00:03]/28h */
|
||||||
fcport->fc4f_nvme =
|
fcport->fc4_type |= FS_FC4TYPE_NVME;
|
||||||
ct_rsp->rsp.gff_id.fc4_features[GFF_NVME_OFFSET];
|
fcport->fc4_features = fc4_nvme_feat & 0xf;
|
||||||
fcport->fc4f_nvme &= 0xf;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -328,7 +328,7 @@ qla2x00_async_login(struct scsi_qla_host *vha, fc_port_t *fcport,
|
|||||||
else
|
else
|
||||||
lio->u.logio.flags |= SRB_LOGIN_COND_PLOGI;
|
lio->u.logio.flags |= SRB_LOGIN_COND_PLOGI;
|
||||||
|
|
||||||
if (fcport->fc4f_nvme)
|
if (NVME_TARGET(vha->hw, fcport))
|
||||||
lio->u.logio.flags |= SRB_LOGIN_SKIP_PRLI;
|
lio->u.logio.flags |= SRB_LOGIN_SKIP_PRLI;
|
||||||
|
|
||||||
ql_dbg(ql_dbg_disc, vha, 0x2072,
|
ql_dbg(ql_dbg_disc, vha, 0x2072,
|
||||||
@ -726,19 +726,17 @@ static void qla24xx_handle_gnl_done_event(scsi_qla_host_t *vha,
|
|||||||
|
|
||||||
loop_id = le16_to_cpu(e->nport_handle);
|
loop_id = le16_to_cpu(e->nport_handle);
|
||||||
loop_id = (loop_id & 0x7fff);
|
loop_id = (loop_id & 0x7fff);
|
||||||
if (fcport->fc4f_nvme)
|
if (NVME_TARGET(vha->hw, fcport))
|
||||||
current_login_state = e->current_login_state >> 4;
|
current_login_state = e->current_login_state >> 4;
|
||||||
else
|
else
|
||||||
current_login_state = e->current_login_state & 0xf;
|
current_login_state = e->current_login_state & 0xf;
|
||||||
|
|
||||||
|
|
||||||
ql_dbg(ql_dbg_disc, vha, 0x20e2,
|
ql_dbg(ql_dbg_disc, vha, 0x20e2,
|
||||||
"%s found %8phC CLS [%x|%x] nvme %d ID[%02x%02x%02x|%02x%02x%02x] lid[%d|%d]\n",
|
"%s found %8phC CLS [%x|%x] fc4_type %d ID[%06x|%06x] lid[%d|%d]\n",
|
||||||
__func__, fcport->port_name,
|
__func__, fcport->port_name,
|
||||||
e->current_login_state, fcport->fw_login_state,
|
e->current_login_state, fcport->fw_login_state,
|
||||||
fcport->fc4f_nvme, id.b.domain, id.b.area, id.b.al_pa,
|
fcport->fc4_type, id.b24, fcport->d_id.b24,
|
||||||
fcport->d_id.b.domain, fcport->d_id.b.area,
|
loop_id, fcport->loop_id);
|
||||||
fcport->d_id.b.al_pa, loop_id, fcport->loop_id);
|
|
||||||
|
|
||||||
switch (fcport->disc_state) {
|
switch (fcport->disc_state) {
|
||||||
case DSC_DELETE_PEND:
|
case DSC_DELETE_PEND:
|
||||||
@ -1225,13 +1223,13 @@ qla24xx_async_prli(struct scsi_qla_host *vha, fc_port_t *fcport)
|
|||||||
sp->done = qla2x00_async_prli_sp_done;
|
sp->done = qla2x00_async_prli_sp_done;
|
||||||
lio->u.logio.flags = 0;
|
lio->u.logio.flags = 0;
|
||||||
|
|
||||||
if (fcport->fc4f_nvme)
|
if (NVME_TARGET(vha->hw, fcport))
|
||||||
lio->u.logio.flags |= SRB_LOGIN_NVME_PRLI;
|
lio->u.logio.flags |= SRB_LOGIN_NVME_PRLI;
|
||||||
|
|
||||||
ql_dbg(ql_dbg_disc, vha, 0x211b,
|
ql_dbg(ql_dbg_disc, vha, 0x211b,
|
||||||
"Async-prli - %8phC hdl=%x, loopid=%x portid=%06x retries=%d %s.\n",
|
"Async-prli - %8phC hdl=%x, loopid=%x portid=%06x retries=%d %s.\n",
|
||||||
fcport->port_name, sp->handle, fcport->loop_id, fcport->d_id.b24,
|
fcport->port_name, sp->handle, fcport->loop_id, fcport->d_id.b24,
|
||||||
fcport->login_retry, fcport->fc4f_nvme ? "nvme" : "fc");
|
fcport->login_retry, NVME_TARGET(vha->hw, fcport) ? "nvme" : "fc");
|
||||||
|
|
||||||
rval = qla2x00_start_sp(sp);
|
rval = qla2x00_start_sp(sp);
|
||||||
if (rval != QLA_SUCCESS) {
|
if (rval != QLA_SUCCESS) {
|
||||||
@ -1382,14 +1380,14 @@ void qla24xx_handle_gpdb_event(scsi_qla_host_t *vha, struct event_arg *ea)
|
|||||||
fcport->flags &= ~FCF_ASYNC_SENT;
|
fcport->flags &= ~FCF_ASYNC_SENT;
|
||||||
|
|
||||||
ql_dbg(ql_dbg_disc, vha, 0x20d2,
|
ql_dbg(ql_dbg_disc, vha, 0x20d2,
|
||||||
"%s %8phC DS %d LS %d nvme %x rc %d\n", __func__, fcport->port_name,
|
"%s %8phC DS %d LS %d fc4_type %x rc %d\n", __func__,
|
||||||
fcport->disc_state, pd->current_login_state, fcport->fc4f_nvme,
|
fcport->port_name, fcport->disc_state, pd->current_login_state,
|
||||||
ea->rc);
|
fcport->fc4_type, ea->rc);
|
||||||
|
|
||||||
if (fcport->disc_state == DSC_DELETE_PEND)
|
if (fcport->disc_state == DSC_DELETE_PEND)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (fcport->fc4f_nvme)
|
if (NVME_TARGET(vha->hw, fcport))
|
||||||
ls = pd->current_login_state >> 4;
|
ls = pd->current_login_state >> 4;
|
||||||
else
|
else
|
||||||
ls = pd->current_login_state & 0xf;
|
ls = pd->current_login_state & 0xf;
|
||||||
@ -1578,7 +1576,8 @@ int qla24xx_fcport_handle_login(struct scsi_qla_host *vha, fc_port_t *fcport)
|
|||||||
ql_dbg(ql_dbg_disc, vha, 0x2118,
|
ql_dbg(ql_dbg_disc, vha, 0x2118,
|
||||||
"%s %d %8phC post %s PRLI\n",
|
"%s %d %8phC post %s PRLI\n",
|
||||||
__func__, __LINE__, fcport->port_name,
|
__func__, __LINE__, fcport->port_name,
|
||||||
fcport->fc4f_nvme ? "NVME" : "FC");
|
NVME_TARGET(vha->hw, fcport) ? "NVME" :
|
||||||
|
"FC");
|
||||||
qla24xx_post_prli_work(vha, fcport);
|
qla24xx_post_prli_work(vha, fcport);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -1860,13 +1859,22 @@ qla24xx_handle_prli_done_event(struct scsi_qla_host *vha, struct event_arg *ea)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ea->fcport->fc4f_nvme) {
|
/*
|
||||||
|
* Retry PRLI with other FC-4 type if failure occurred on dual
|
||||||
|
* FCP/NVMe port
|
||||||
|
*/
|
||||||
|
if (NVME_FCP_TARGET(ea->fcport)) {
|
||||||
|
if (vha->hw->fc4_type_priority == FC4_PRIORITY_NVME)
|
||||||
|
ea->fcport->fc4_type &= ~FS_FC4TYPE_NVME;
|
||||||
|
else
|
||||||
|
ea->fcport->fc4_type &= ~FS_FC4TYPE_FCP;
|
||||||
ql_dbg(ql_dbg_disc, vha, 0x2118,
|
ql_dbg(ql_dbg_disc, vha, 0x2118,
|
||||||
"%s %d %8phC post fc4 prli\n",
|
"%s %d %8phC post %s prli\n",
|
||||||
__func__, __LINE__, ea->fcport->port_name);
|
__func__, __LINE__, ea->fcport->port_name,
|
||||||
ea->fcport->fc4f_nvme = 0;
|
(ea->fcport->fc4_type & FS_FC4TYPE_NVME) ?
|
||||||
|
"NVMe" : "FCP");
|
||||||
qla24xx_post_prli_work(vha, ea->fcport);
|
qla24xx_post_prli_work(vha, ea->fcport);
|
||||||
return;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* at this point both PRLI NVME & PRLI FCP failed */
|
/* at this point both PRLI NVME & PRLI FCP failed */
|
||||||
@ -1952,7 +1960,7 @@ qla24xx_handle_plogi_done_event(struct scsi_qla_host *vha, struct event_arg *ea)
|
|||||||
* force a relogin attempt via implicit LOGO, PLOGI, and PRLI
|
* force a relogin attempt via implicit LOGO, PLOGI, and PRLI
|
||||||
* requests.
|
* requests.
|
||||||
*/
|
*/
|
||||||
if (ea->fcport->fc4f_nvme) {
|
if (NVME_TARGET(vha->hw, ea->fcport)) {
|
||||||
ql_dbg(ql_dbg_disc, vha, 0x2117,
|
ql_dbg(ql_dbg_disc, vha, 0x2117,
|
||||||
"%s %d %8phC post prli\n",
|
"%s %d %8phC post prli\n",
|
||||||
__func__, __LINE__, ea->fcport->port_name);
|
__func__, __LINE__, ea->fcport->port_name);
|
||||||
@ -5382,7 +5390,7 @@ qla2x00_update_fcport(scsi_qla_host_t *vha, fc_port_t *fcport)
|
|||||||
|
|
||||||
qla2x00_iidma_fcport(vha, fcport);
|
qla2x00_iidma_fcport(vha, fcport);
|
||||||
|
|
||||||
if (fcport->fc4f_nvme) {
|
if (NVME_TARGET(vha->hw, fcport)) {
|
||||||
qla_nvme_register_remote(vha, fcport);
|
qla_nvme_register_remote(vha, fcport);
|
||||||
fcport->disc_state = DSC_LOGIN_COMPLETE;
|
fcport->disc_state = DSC_LOGIN_COMPLETE;
|
||||||
qla2x00_set_fcport_state(fcport, FCS_ONLINE);
|
qla2x00_set_fcport_state(fcport, FCS_ONLINE);
|
||||||
@ -5710,11 +5718,8 @@ qla2x00_find_all_fabric_devs(scsi_qla_host_t *vha)
|
|||||||
new_fcport->fc4_type = swl[swl_idx].fc4_type;
|
new_fcport->fc4_type = swl[swl_idx].fc4_type;
|
||||||
|
|
||||||
new_fcport->nvme_flag = 0;
|
new_fcport->nvme_flag = 0;
|
||||||
new_fcport->fc4f_nvme = 0;
|
|
||||||
if (vha->flags.nvme_enabled &&
|
if (vha->flags.nvme_enabled &&
|
||||||
swl[swl_idx].fc4f_nvme) {
|
swl[swl_idx].fc4_type & FS_FC4TYPE_NVME) {
|
||||||
new_fcport->fc4f_nvme =
|
|
||||||
swl[swl_idx].fc4f_nvme;
|
|
||||||
ql_log(ql_log_info, vha, 0x2131,
|
ql_log(ql_log_info, vha, 0x2131,
|
||||||
"FOUND: NVME port %8phC as FC Type 28h\n",
|
"FOUND: NVME port %8phC as FC Type 28h\n",
|
||||||
new_fcport->port_name);
|
new_fcport->port_name);
|
||||||
@ -5770,7 +5775,7 @@ qla2x00_find_all_fabric_devs(scsi_qla_host_t *vha)
|
|||||||
|
|
||||||
/* Bypass ports whose FCP-4 type is not FCP_SCSI */
|
/* Bypass ports whose FCP-4 type is not FCP_SCSI */
|
||||||
if (ql2xgffidenable &&
|
if (ql2xgffidenable &&
|
||||||
(new_fcport->fc4_type != FC4_TYPE_FCP_SCSI &&
|
(!(new_fcport->fc4_type & FS_FC4TYPE_FCP) &&
|
||||||
new_fcport->fc4_type != FC4_TYPE_UNKNOWN))
|
new_fcport->fc4_type != FC4_TYPE_UNKNOWN))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@ -5839,7 +5844,7 @@ qla2x00_find_all_fabric_devs(scsi_qla_host_t *vha)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fcport->fc4f_nvme) {
|
if (NVME_TARGET(vha->hw, fcport)) {
|
||||||
if (fcport->disc_state == DSC_DELETE_PEND) {
|
if (fcport->disc_state == DSC_DELETE_PEND) {
|
||||||
fcport->disc_state = DSC_GNL;
|
fcport->disc_state = DSC_GNL;
|
||||||
vha->fcport_count--;
|
vha->fcport_count--;
|
||||||
@ -8514,6 +8519,11 @@ qla81xx_nvram_config(scsi_qla_host_t *vha)
|
|||||||
/* N2N: driver will initiate Login instead of FW */
|
/* N2N: driver will initiate Login instead of FW */
|
||||||
icb->firmware_options_3 |= BIT_8;
|
icb->firmware_options_3 |= BIT_8;
|
||||||
|
|
||||||
|
/* Determine NVMe/FCP priority for target ports */
|
||||||
|
ha->fc4_type_priority = qla2xxx_get_fc4_priority(vha);
|
||||||
|
ql_log(ql_log_info, vha, 0xffff, "FC4 priority set to %s\n",
|
||||||
|
ha->fc4_type_priority & BIT_0 ? "FCP" : "NVMe");
|
||||||
|
|
||||||
if (rval) {
|
if (rval) {
|
||||||
ql_log(ql_log_warn, vha, 0x0076,
|
ql_log(ql_log_warn, vha, 0x0076,
|
||||||
"NVRAM configuration failed.\n");
|
"NVRAM configuration failed.\n");
|
||||||
|
@ -307,3 +307,15 @@ qla_83xx_start_iocbs(struct qla_qpair *qpair)
|
|||||||
|
|
||||||
WRT_REG_DWORD(req->req_q_in, req->ring_index);
|
WRT_REG_DWORD(req->req_q_in, req->ring_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
qla2xxx_get_fc4_priority(struct scsi_qla_host *vha)
|
||||||
|
{
|
||||||
|
uint32_t data;
|
||||||
|
|
||||||
|
data =
|
||||||
|
((uint8_t *)vha->hw->nvram)[NVRAM_DUAL_FCP_NVME_FLAG_OFFSET];
|
||||||
|
|
||||||
|
|
||||||
|
return ((data >> 6) & BIT_0);
|
||||||
|
}
|
||||||
|
@ -1931,7 +1931,7 @@ qla2x00_get_port_database(scsi_qla_host_t *vha, fc_port_t *fcport, uint8_t opt)
|
|||||||
pd24 = (struct port_database_24xx *) pd;
|
pd24 = (struct port_database_24xx *) pd;
|
||||||
|
|
||||||
/* Check for logged in state. */
|
/* Check for logged in state. */
|
||||||
if (fcport->fc4f_nvme) {
|
if (NVME_TARGET(ha, fcport)) {
|
||||||
current_login_state = pd24->current_login_state >> 4;
|
current_login_state = pd24->current_login_state >> 4;
|
||||||
last_login_state = pd24->last_login_state >> 4;
|
last_login_state = pd24->last_login_state >> 4;
|
||||||
} else {
|
} else {
|
||||||
@ -3898,8 +3898,9 @@ qla24xx_report_id_acquisition(scsi_qla_host_t *vha,
|
|||||||
fcport->scan_state = QLA_FCPORT_FOUND;
|
fcport->scan_state = QLA_FCPORT_FOUND;
|
||||||
fcport->n2n_flag = 1;
|
fcport->n2n_flag = 1;
|
||||||
fcport->keep_nport_handle = 1;
|
fcport->keep_nport_handle = 1;
|
||||||
|
fcport->fc4_type = FS_FC4TYPE_FCP;
|
||||||
if (vha->flags.nvme_enabled)
|
if (vha->flags.nvme_enabled)
|
||||||
fcport->fc4f_nvme = 1;
|
fcport->fc4_type |= FS_FC4TYPE_NVME;
|
||||||
|
|
||||||
switch (fcport->disc_state) {
|
switch (fcport->disc_state) {
|
||||||
case DSC_DELETED:
|
case DSC_DELETED:
|
||||||
@ -6361,7 +6362,7 @@ int __qla24xx_parse_gpdb(struct scsi_qla_host *vha, fc_port_t *fcport,
|
|||||||
uint64_t zero = 0;
|
uint64_t zero = 0;
|
||||||
u8 current_login_state, last_login_state;
|
u8 current_login_state, last_login_state;
|
||||||
|
|
||||||
if (fcport->fc4f_nvme) {
|
if (NVME_TARGET(vha->hw, fcport)) {
|
||||||
current_login_state = pd->current_login_state >> 4;
|
current_login_state = pd->current_login_state >> 4;
|
||||||
last_login_state = pd->last_login_state >> 4;
|
last_login_state = pd->last_login_state >> 4;
|
||||||
} else {
|
} else {
|
||||||
@ -6396,8 +6397,8 @@ int __qla24xx_parse_gpdb(struct scsi_qla_host *vha, fc_port_t *fcport,
|
|||||||
fcport->d_id.b.al_pa = pd->port_id[2];
|
fcport->d_id.b.al_pa = pd->port_id[2];
|
||||||
fcport->d_id.b.rsvd_1 = 0;
|
fcport->d_id.b.rsvd_1 = 0;
|
||||||
|
|
||||||
if (fcport->fc4f_nvme) {
|
if (NVME_TARGET(vha->hw, fcport)) {
|
||||||
fcport->port_type = 0;
|
fcport->port_type = FCT_NVME;
|
||||||
if ((pd->prli_svc_param_word_3[0] & BIT_5) == 0)
|
if ((pd->prli_svc_param_word_3[0] & BIT_5) == 0)
|
||||||
fcport->port_type |= FCT_NVME_INITIATOR;
|
fcport->port_type |= FCT_NVME_INITIATOR;
|
||||||
if ((pd->prli_svc_param_word_3[0] & BIT_4) == 0)
|
if ((pd->prli_svc_param_word_3[0] & BIT_4) == 0)
|
||||||
|
@ -5032,19 +5032,17 @@ void qla24xx_create_new_sess(struct scsi_qla_host *vha, struct qla_work_evt *e)
|
|||||||
fcport->d_id = e->u.new_sess.id;
|
fcport->d_id = e->u.new_sess.id;
|
||||||
fcport->flags |= FCF_FABRIC_DEVICE;
|
fcport->flags |= FCF_FABRIC_DEVICE;
|
||||||
fcport->fw_login_state = DSC_LS_PLOGI_PEND;
|
fcport->fw_login_state = DSC_LS_PLOGI_PEND;
|
||||||
if (e->u.new_sess.fc4_type == FS_FC4TYPE_FCP)
|
|
||||||
fcport->fc4_type = FC4_TYPE_FCP_SCSI;
|
|
||||||
|
|
||||||
if (e->u.new_sess.fc4_type == FS_FC4TYPE_NVME) {
|
|
||||||
fcport->fc4_type = FC4_TYPE_OTHER;
|
|
||||||
fcport->fc4f_nvme = FC4_TYPE_NVME;
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy(fcport->port_name, e->u.new_sess.port_name,
|
memcpy(fcport->port_name, e->u.new_sess.port_name,
|
||||||
WWN_SIZE);
|
WWN_SIZE);
|
||||||
|
|
||||||
if (e->u.new_sess.fc4_type & FS_FCP_IS_N2N)
|
fcport->fc4_type = e->u.new_sess.fc4_type;
|
||||||
|
if (e->u.new_sess.fc4_type & FS_FCP_IS_N2N) {
|
||||||
|
fcport->fc4_type = FS_FC4TYPE_FCP;
|
||||||
fcport->n2n_flag = 1;
|
fcport->n2n_flag = 1;
|
||||||
|
if (vha->flags.nvme_enabled)
|
||||||
|
fcport->fc4_type |= FS_FC4TYPE_NVME;
|
||||||
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
ql_dbg(ql_dbg_disc, vha, 0xffff,
|
ql_dbg(ql_dbg_disc, vha, 0xffff,
|
||||||
@ -5148,7 +5146,8 @@ void qla24xx_create_new_sess(struct scsi_qla_host *vha, struct qla_work_evt *e)
|
|||||||
fcport->flags &= ~FCF_FABRIC_DEVICE;
|
fcport->flags &= ~FCF_FABRIC_DEVICE;
|
||||||
fcport->keep_nport_handle = 1;
|
fcport->keep_nport_handle = 1;
|
||||||
if (vha->flags.nvme_enabled) {
|
if (vha->flags.nvme_enabled) {
|
||||||
fcport->fc4f_nvme = 1;
|
fcport->fc4_type =
|
||||||
|
(FS_FC4TYPE_NVME | FS_FC4TYPE_FCP);
|
||||||
fcport->n2n_flag = 1;
|
fcport->n2n_flag = 1;
|
||||||
}
|
}
|
||||||
fcport->fw_login_state = 0;
|
fcport->fw_login_state = 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user