Commit 7a09e8d9 authored by Quinn Tran's avatar Quinn Tran Committed by Martin K. Petersen

scsi: qla2xxx: edif: Add doorbell notification for app

Some FC adapters from Marvell offer the ability to encrypt data in flight
(EDIF). This feature requires an application to act as an authenticator.

During runtime, driver and authentication application need to stay in sync
in terms of: Session being down|up, arrival of new authentication
message (AUTH ELS) and SADB update completion.

These events are queued up as doorbell to the authentication
application. Application would read this doorbell on regular basis to stay
up to date. Each SCSI host would have a separate doorbell queue.

The doorbell interface can daisy chain a list of events for each read. Each
event contains an event code + hint to help application steer the next
course of action.

Link: https://lore.kernel.org/r/20210624052606.21613-9-njavali@marvell.comReviewed-by: default avatarHannes Reinecke <hare@suse.de>
Reviewed-by: default avatarHimanshu Madhani <himanshu.madhani@oracle.com>
Co-developed-by: default avatarLarry Wisneski <Larry.Wisneski@marvell.com>
Signed-off-by: default avatarLarry Wisneski <Larry.Wisneski@marvell.com>
Co-developed-by: default avatarDuane Grigsby <duane.grigsby@marvell.com>
Signed-off-by: default avatarDuane Grigsby <duane.grigsby@marvell.com>
Co-developed-by: default avatarRick Hicksted Jr <rhicksted@marvell.com>
Signed-off-by: default avatarRick Hicksted Jr <rhicksted@marvell.com>
Signed-off-by: default avatarQuinn Tran <qutran@marvell.com>
Signed-off-by: default avatarNilesh Javali <njavali@marvell.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 9efea843
...@@ -2435,6 +2435,7 @@ static DEVICE_ATTR(port_speed, 0644, qla2x00_port_speed_show, ...@@ -2435,6 +2435,7 @@ static DEVICE_ATTR(port_speed, 0644, qla2x00_port_speed_show,
qla2x00_port_speed_store); qla2x00_port_speed_store);
static DEVICE_ATTR(port_no, 0444, qla2x00_port_no_show, NULL); static DEVICE_ATTR(port_no, 0444, qla2x00_port_no_show, NULL);
static DEVICE_ATTR(fw_attr, 0444, qla2x00_fw_attr_show, NULL); static DEVICE_ATTR(fw_attr, 0444, qla2x00_fw_attr_show, NULL);
static DEVICE_ATTR_RO(edif_doorbell);
struct device_attribute *qla2x00_host_attrs[] = { struct device_attribute *qla2x00_host_attrs[] = {
...@@ -2480,6 +2481,7 @@ struct device_attribute *qla2x00_host_attrs[] = { ...@@ -2480,6 +2481,7 @@ struct device_attribute *qla2x00_host_attrs[] = {
&dev_attr_port_no, &dev_attr_port_no,
&dev_attr_fw_attr, &dev_attr_fw_attr,
&dev_attr_dport_diagnostics, &dev_attr_dport_diagnostics,
&dev_attr_edif_doorbell,
NULL, /* reserve for qlini_mode */ NULL, /* reserve for qlini_mode */
NULL, /* reserve for ql2xiniexchg */ NULL, /* reserve for ql2xiniexchg */
NULL, /* reserve for ql2xexchoffld */ NULL, /* reserve for ql2xexchoffld */
...@@ -3108,6 +3110,8 @@ qla24xx_vport_delete(struct fc_vport *fc_vport) ...@@ -3108,6 +3110,8 @@ qla24xx_vport_delete(struct fc_vport *fc_vport)
qla_nvme_delete(vha); qla_nvme_delete(vha);
qla_enode_stop(vha); qla_enode_stop(vha);
qla_edb_stop(vha);
vha->flags.delete_progress = 1; vha->flags.delete_progress = 1;
qlt_remove_target(ha, vha); qlt_remove_target(ha, vha);
......
...@@ -2784,10 +2784,13 @@ qla2x00_manage_host_port(struct bsg_job *bsg_job) ...@@ -2784,10 +2784,13 @@ qla2x00_manage_host_port(struct bsg_job *bsg_job)
} }
static int static int
qla2x00_process_vendor_specific(struct bsg_job *bsg_job) qla2x00_process_vendor_specific(struct scsi_qla_host *vha, struct bsg_job *bsg_job)
{ {
struct fc_bsg_request *bsg_request = bsg_job->request; struct fc_bsg_request *bsg_request = bsg_job->request;
ql_dbg(ql_dbg_edif, vha, 0x911b, "%s FC_BSG_HST_VENDOR cmd[0]=0x%x\n",
__func__, bsg_request->rqst_data.h_vendor.vendor_cmd[0]);
switch (bsg_request->rqst_data.h_vendor.vendor_cmd[0]) { switch (bsg_request->rqst_data.h_vendor.vendor_cmd[0]) {
case QL_VND_LOOPBACK: case QL_VND_LOOPBACK:
return qla2x00_process_loopback(bsg_job); return qla2x00_process_loopback(bsg_job);
...@@ -2916,12 +2919,19 @@ qla24xx_bsg_request(struct bsg_job *bsg_job) ...@@ -2916,12 +2919,19 @@ qla24xx_bsg_request(struct bsg_job *bsg_job)
ql_dbg(ql_dbg_user, vha, 0x709f, ql_dbg(ql_dbg_user, vha, 0x709f,
"BSG: ISP abort active/needed -- cmd=%d.\n", "BSG: ISP abort active/needed -- cmd=%d.\n",
bsg_request->msgcode); bsg_request->msgcode);
SET_DID_STATUS(bsg_reply->result, DID_ERROR);
return -EBUSY; return -EBUSY;
} }
if (test_bit(PFLG_DRIVER_REMOVING, &vha->pci_flags)) {
SET_DID_STATUS(bsg_reply->result, DID_ERROR);
return -EIO;
}
skip_chip_chk: skip_chip_chk:
ql_dbg(ql_dbg_user, vha, 0x7000, ql_dbg(ql_dbg_user + ql_dbg_verbose, vha, 0x7000,
"Entered %s msgcode=0x%x.\n", __func__, bsg_request->msgcode); "Entered %s msgcode=0x%x. bsg ptr %px\n",
__func__, bsg_request->msgcode, bsg_job);
switch (bsg_request->msgcode) { switch (bsg_request->msgcode) {
case FC_BSG_RPT_ELS: case FC_BSG_RPT_ELS:
...@@ -2932,7 +2942,7 @@ qla24xx_bsg_request(struct bsg_job *bsg_job) ...@@ -2932,7 +2942,7 @@ qla24xx_bsg_request(struct bsg_job *bsg_job)
ret = qla2x00_process_ct(bsg_job); ret = qla2x00_process_ct(bsg_job);
break; break;
case FC_BSG_HST_VENDOR: case FC_BSG_HST_VENDOR:
ret = qla2x00_process_vendor_specific(bsg_job); ret = qla2x00_process_vendor_specific(vha, bsg_job);
break; break;
case FC_BSG_HST_ADD_RPORT: case FC_BSG_HST_ADD_RPORT:
case FC_BSG_HST_DEL_RPORT: case FC_BSG_HST_DEL_RPORT:
...@@ -2941,6 +2951,10 @@ qla24xx_bsg_request(struct bsg_job *bsg_job) ...@@ -2941,6 +2951,10 @@ qla24xx_bsg_request(struct bsg_job *bsg_job)
ql_log(ql_log_warn, vha, 0x705a, "Unsupported BSG request.\n"); ql_log(ql_log_warn, vha, 0x705a, "Unsupported BSG request.\n");
break; break;
} }
ql_dbg(ql_dbg_user + ql_dbg_verbose, vha, 0x7000,
"%s done with return %x\n", __func__, ret);
return ret; return ret;
} }
...@@ -2955,6 +2969,8 @@ qla24xx_bsg_timeout(struct bsg_job *bsg_job) ...@@ -2955,6 +2969,8 @@ qla24xx_bsg_timeout(struct bsg_job *bsg_job)
unsigned long flags; unsigned long flags;
struct req_que *req; struct req_que *req;
ql_log(ql_log_info, vha, 0x708b, "%s CMD timeout. bsg ptr %p.\n",
__func__, bsg_job);
/* find the bsg job from the active list of commands */ /* find the bsg job from the active list of commands */
spin_lock_irqsave(&ha->hardware_lock, flags); spin_lock_irqsave(&ha->hardware_lock, flags);
for (que = 0; que < ha->max_req_queues; que++) { for (que = 0; que < ha->max_req_queues; que++) {
......
This diff is collapsed.
...@@ -978,11 +978,15 @@ void qla_nvme_unregister_remote_port(struct fc_port *fcport); ...@@ -978,11 +978,15 @@ void qla_nvme_unregister_remote_port(struct fc_port *fcport);
/* qla_edif.c */ /* qla_edif.c */
fc_port_t *qla2x00_find_fcport_by_pid(scsi_qla_host_t *vha, port_id_t *id); fc_port_t *qla2x00_find_fcport_by_pid(scsi_qla_host_t *vha, port_id_t *id);
void qla_edb_eventcreate(scsi_qla_host_t *vha, uint32_t dbtype, uint32_t data, uint32_t data2,
fc_port_t *fcport);
void qla_edb_stop(scsi_qla_host_t *vha); void qla_edb_stop(scsi_qla_host_t *vha);
ssize_t edif_doorbell_show(struct device *dev, struct device_attribute *attr, char *buf);
int32_t qla_edif_app_mgmt(struct bsg_job *bsg_job); int32_t qla_edif_app_mgmt(struct bsg_job *bsg_job);
void qla_enode_init(scsi_qla_host_t *vha); void qla_enode_init(scsi_qla_host_t *vha);
void qla_enode_stop(scsi_qla_host_t *vha); void qla_enode_stop(scsi_qla_host_t *vha);
void qla_edif_flush_sa_ctl_lists(fc_port_t *fcport); void qla_edif_flush_sa_ctl_lists(fc_port_t *fcport);
void qla_edb_init(scsi_qla_host_t *vha);
void qla24xx_sa_update_iocb(srb_t *sp, struct sa_update_28xx *sa_update_iocb); void qla24xx_sa_update_iocb(srb_t *sp, struct sa_update_28xx *sa_update_iocb);
void qla24xx_sa_replace_iocb(srb_t *sp, struct sa_update_28xx *sa_update_iocb); void qla24xx_sa_replace_iocb(srb_t *sp, struct sa_update_28xx *sa_update_iocb);
void qla24xx_auth_els(scsi_qla_host_t *vha, void **pkt, struct rsp_que **rsp); void qla24xx_auth_els(scsi_qla_host_t *vha, void **pkt, struct rsp_que **rsp);
......
...@@ -1473,6 +1473,9 @@ static int qla_chk_secure_login(scsi_qla_host_t *vha, fc_port_t *fcport, ...@@ -1473,6 +1473,9 @@ static int qla_chk_secure_login(scsi_qla_host_t *vha, fc_port_t *fcport,
__func__, __LINE__, fcport->port_name); __func__, __LINE__, fcport->port_name);
fcport->edif.app_started = 1; fcport->edif.app_started = 1;
fcport->edif.app_sess_online = 1; fcport->edif.app_sess_online = 1;
qla_edb_eventcreate(vha, VND_CMD_AUTH_STATE_NEEDED,
fcport->d_id.b24, 0, fcport);
} }
rc = 1; rc = 1;
......
...@@ -3488,6 +3488,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -3488,6 +3488,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
probe_failed: probe_failed:
qla_enode_stop(base_vha); qla_enode_stop(base_vha);
qla_edb_stop(base_vha);
if (base_vha->gnl.l) { if (base_vha->gnl.l) {
dma_free_coherent(&ha->pdev->dev, base_vha->gnl.size, dma_free_coherent(&ha->pdev->dev, base_vha->gnl.size,
base_vha->gnl.l, base_vha->gnl.ldma); base_vha->gnl.l, base_vha->gnl.ldma);
...@@ -3791,6 +3792,7 @@ qla2x00_remove_one(struct pci_dev *pdev) ...@@ -3791,6 +3792,7 @@ qla2x00_remove_one(struct pci_dev *pdev)
base_vha->gnl.l = NULL; base_vha->gnl.l = NULL;
qla_enode_stop(base_vha); qla_enode_stop(base_vha);
qla_edb_stop(base_vha);
vfree(base_vha->scan.l); vfree(base_vha->scan.l);
...@@ -4917,6 +4919,8 @@ struct scsi_qla_host *qla2x00_create_host(struct scsi_host_template *sht, ...@@ -4917,6 +4919,8 @@ struct scsi_qla_host *qla2x00_create_host(struct scsi_host_template *sht,
init_waitqueue_head(&vha->fcport_waitQ); init_waitqueue_head(&vha->fcport_waitQ);
init_waitqueue_head(&vha->vref_waitq); init_waitqueue_head(&vha->vref_waitq);
qla_enode_init(vha); qla_enode_init(vha);
qla_edb_init(vha);
vha->gnl.size = sizeof(struct get_name_list_extended) * vha->gnl.size = sizeof(struct get_name_list_extended) *
(ha->max_loop_id + 1); (ha->max_loop_id + 1);
......
...@@ -585,6 +585,8 @@ static void qla2x00_async_nack_sp_done(srb_t *sp, int res) ...@@ -585,6 +585,8 @@ static void qla2x00_async_nack_sp_done(srb_t *sp, int res)
DSC_LOGIN_AUTH_PEND); DSC_LOGIN_AUTH_PEND);
qla2x00_post_aen_work(vha, FCH_EVT_PORT_ONLINE, qla2x00_post_aen_work(vha, FCH_EVT_PORT_ONLINE,
sp->fcport->d_id.b24); sp->fcport->d_id.b24);
qla_edb_eventcreate(vha, VND_CMD_AUTH_STATE_NEEDED, sp->fcport->d_id.b24,
0, sp->fcport);
} }
break; break;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment