From: Sebastian Herbszt <herbszt@gmx.de>
To: James Smart <james.smart@avagotech.com>
Cc: linux-scsi@vger.kernel.org, Sebastian Herbszt <herbszt@gmx.de>
Subject: Re: [PATCH v2 06/15] lpfc: Add support for RDP ELS command.
Date: Sun, 24 May 2015 14:23:03 +0200 [thread overview]
Message-ID: <20150524142303.00000bd6@localhost> (raw)
In-Reply-To: <555e1c09.H9g0xgyFF0UX5XNd%james.smart@avagotech.com>
James Smart wrote:
>
> Add support for RDP ELS command.
>
> Signed-off-by: Dick Kennedy <dick.kennedy@avagotech.com>
> Signed-off-by: James Smart <james.smart@avagotech.com>
> ---
> drivers/scsi/lpfc/lpfc.h | 1 +
> drivers/scsi/lpfc/lpfc_crtn.h | 2 +
> drivers/scsi/lpfc/lpfc_els.c | 420 ++++++++++++++++++++++++++++++++++++++++++
> drivers/scsi/lpfc/lpfc_hw.h | 169 +++++++++++++++++
> drivers/scsi/lpfc/lpfc_hw4.h | 201 ++++++++++++++++++++
> drivers/scsi/lpfc/lpfc_mbox.c | 152 +++++++++++++++
> drivers/scsi/lpfc/lpfc_sli4.h | 10 +
> 7 files changed, 955 insertions(+)
snip
> diff --git a/drivers/scsi/lpfc/lpfc_els.c b/drivers/scsi/lpfc/lpfc_els.c
> index 3975276..724b61c 100644
> --- a/drivers/scsi/lpfc/lpfc_els.c
> +++ b/drivers/scsi/lpfc/lpfc_els.c
> @@ -4615,6 +4615,422 @@ lpfc_els_disc_plogi(struct lpfc_vport *vport)
> return sentplogi;
> }
>
> +void
> +lpfc_rdp_res_link_service(struct fc_rdp_link_service_desc *desc,
> + uint32_t word0)
> +{
> +
> + desc->tag = cpu_to_be32(RDP_LINK_SERVICE_DESC_TAG);
> + desc->payload.els_req = word0;
> + desc->length = cpu_to_be32(sizeof(desc->payload));
> +}
> +
> +void
> +lpfc_rdp_res_sfp_desc(struct fc_rdp_sfp_desc *desc,
> + uint8_t *page_a0, uint8_t *page_a2)
> +{
> + uint16_t wavelength;
> + uint16_t temperature;
> + uint16_t rx_power;
> + uint16_t tx_bias;
> + uint16_t tx_power;
> + uint16_t vcc;
> + uint16_t flag = 0;
> + struct sff_trasnceiver_codes_byte4 *trasn_code_byte4;
> + struct sff_trasnceiver_codes_byte5 *trasn_code_byte5;
> +
> + desc->tag = cpu_to_be32(RDP_SFP_DESC_TAG);
> +
> + trasn_code_byte4 = (struct sff_trasnceiver_codes_byte4 *)
> + &page_a0[SSF_TRANSCEIVER_CODE_B4];
> + trasn_code_byte5 = (struct sff_trasnceiver_codes_byte5 *)
> + &page_a0[SSF_TRANSCEIVER_CODE_B5];
> +
> + if ((trasn_code_byte4->fc_sw_laser) ||
> + (trasn_code_byte5->fc_sw_laser_sl) ||
> + (trasn_code_byte5->fc_sw_laser_sn)) { /* check if its short WL */
> + flag |= (SFP_FLAG_PT_SWLASER << SFP_FLAG_PT_SHIFT);
> + } else if (trasn_code_byte4->fc_lw_laser) {
> + wavelength = (page_a0[SSF_WAVELENGTH_B1] << 8) |
> + page_a0[SSF_WAVELENGTH_B0];
> + if (wavelength == SFP_WAVELENGTH_LC1310)
> + flag |= SFP_FLAG_PT_LWLASER_LC1310 << SFP_FLAG_PT_SHIFT;
> + if (wavelength == SFP_WAVELENGTH_LL1550)
> + flag |= SFP_FLAG_PT_LWLASER_LL1550 << SFP_FLAG_PT_SHIFT;
> + }
> + /* check if its SFP+ */
> + flag |= ((page_a0[SSF_IDENTIFIER] == SFF_PG0_IDENT_SFP) ?
> + SFP_FLAG_CT_SFP_PLUS : SFP_FLAG_CT_UNKNOWN)
> + << SFP_FLAG_CT_SHIFT;
> +
> + /* check if its OPTICAL */
> + flag |= ((page_a0[SSF_CONNECTOR] == SFF_PG0_CONNECTOR_LC) ?
> + SFP_FLAG_IS_OPTICAL_PORT : 0)
> + << SFP_FLAG_IS_OPTICAL_SHIFT;
> +
> + temperature = (page_a2[SFF_TEMPERATURE_B1] << 8 |
> + page_a2[SFF_TEMPERATURE_B0]);
> + vcc = (page_a2[SFF_VCC_B1] << 8 |
> + page_a2[SFF_VCC_B0]);
> + tx_power = (page_a2[SFF_TXPOWER_B1] << 8 |
> + page_a2[SFF_TXPOWER_B0]);
> + tx_bias = (page_a2[SFF_TX_BIAS_CURRENT_B1] << 8 |
> + page_a2[SFF_TX_BIAS_CURRENT_B0]);
> + rx_power = (page_a2[SFF_RXPOWER_B1] << 8 |
> + page_a2[SFF_RXPOWER_B0]);
> + desc->sfp_info.temperature = cpu_to_be16(temperature);
> + desc->sfp_info.rx_power = cpu_to_be16(rx_power);
> + desc->sfp_info.tx_bias = cpu_to_be16(tx_bias);
> + desc->sfp_info.tx_power = cpu_to_be16(tx_power);
> + desc->sfp_info.vcc = cpu_to_be16(vcc);
> +
> + desc->sfp_info.flags = cpu_to_be16(flag);
> + desc->length = cpu_to_be32(sizeof(desc->sfp_info));
> +}
> +
> +void
> +lpfc_rdp_res_link_error(struct fc_rdp_link_error_status_desc *desc,
> + READ_LNK_VAR *stat)
> +{
> + uint32_t type;
> +
> + desc->tag = cpu_to_be32(RDP_LINK_ERROR_STATUS_DESC_TAG);
> +
> + type = VN_PT_PHY_PF_PORT << VN_PT_PHY_SHIFT;
> +
> + desc->info.port_type = cpu_to_be32(type);
> +
> + desc->info.link_status.link_failure_cnt =
> + cpu_to_be32(stat->linkFailureCnt);
> + desc->info.link_status.loss_of_synch_cnt =
> + cpu_to_be32(stat->lossSyncCnt);
> + desc->info.link_status.loss_of_signal_cnt =
> + cpu_to_be32(stat->lossSignalCnt);
> + desc->info.link_status.primitive_seq_proto_err =
> + cpu_to_be32(stat->primSeqErrCnt);
> + desc->info.link_status.invalid_trans_word =
> + cpu_to_be32(stat->invalidXmitWord);
> + desc->info.link_status.invalid_crc_cnt = cpu_to_be32(stat->crcCnt);
> +
> + desc->length = cpu_to_be32(sizeof(desc->info));
> +}
> +
> +void
> +lpfc_rdp_res_speed(struct fc_rdp_port_speed_desc *desc, struct lpfc_hba *phba)
> +{
> + uint16_t rdp_cap = 0;
> + uint16_t rdp_speed;
> +
> + desc->tag = cpu_to_be32(RDP_PORT_SPEED_DESC_TAG);
> +
> + switch (phba->sli4_hba.link_state.speed) {
> + case LPFC_FC_LA_SPEED_1G:
> + rdp_speed = RDP_PS_1GB;
> + break;
> + case LPFC_FC_LA_SPEED_2G:
> + rdp_speed = RDP_PS_2GB;
> + break;
> + case LPFC_FC_LA_SPEED_4G:
> + rdp_speed = RDP_PS_4GB;
> + break;
> + case LPFC_FC_LA_SPEED_8G:
> + rdp_speed = RDP_PS_8GB;
> + break;
> + case LPFC_FC_LA_SPEED_10G:
> + rdp_speed = RDP_PS_10GB;
> + break;
> + case LPFC_FC_LA_SPEED_16G:
> + rdp_speed = RDP_PS_16GB;
> + break;
> + case LPFC_FC_LA_SPEED_32G:
> + rdp_speed = RDP_PS_32GB;
> + break;
> + default:
> + rdp_speed = RDP_PS_UNKNOWN;
> + break;
> + }
> +
> + desc->info.port_speed.speed = cpu_to_be16(rdp_speed);
> +
> + if (phba->lmt & LMT_16Gb)
> + rdp_cap |= RDP_PS_16GB;
> + if (phba->lmt & LMT_10Gb)
> + rdp_cap |= RDP_PS_10GB;
> + if (phba->lmt & LMT_8Gb)
> + rdp_cap |= RDP_PS_8GB;
> + if (phba->lmt & LMT_4Gb)
> + rdp_cap |= RDP_PS_4GB;
> + if (phba->lmt & LMT_2Gb)
> + rdp_cap |= RDP_PS_2GB;
> + if (phba->lmt & LMT_1Gb)
> + rdp_cap |= RDP_PS_1GB;
> +
> + if (rdp_cap == 0)
> + rdp_cap = RDP_CAP_UNKNOWN;
> +
> + desc->info.port_speed.capabilities = cpu_to_be16(rdp_cap);
> + desc->length = cpu_to_be32(sizeof(desc->info));
> +}
> +
> +void
> +lpfc_rdp_res_diag_port_names(struct fc_rdp_port_name_desc *desc,
> + struct lpfc_hba *phba)
> +{
> +
> + desc->tag = cpu_to_be32(RDP_PORT_NAMES_DESC_TAG);
> +
> + memcpy(desc->port_names.wwnn, phba->wwnn,
> + sizeof(desc->port_names.wwnn));
> +
> + memcpy(desc->port_names.wwpn, &phba->wwpn,
> + sizeof(desc->port_names.wwpn));
> +
> + desc->length = cpu_to_be32(sizeof(desc->port_names));
> +}
> +
> +void
> +lpfc_rdp_res_attach_port_names(struct fc_rdp_port_name_desc *desc,
> + struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)
> +{
> +
> + desc->tag = cpu_to_be32(RDP_PORT_NAMES_DESC_TAG);
> + if (vport->fc_flag & FC_FABRIC) {
> + memcpy(desc->port_names.wwnn, &vport->fabric_nodename,
> + sizeof(desc->port_names.wwnn));
> +
> + memcpy(desc->port_names.wwpn, &vport->fabric_portname,
> + sizeof(desc->port_names.wwpn));
> + } else { /* Point to Point */
> + memcpy(desc->port_names.wwnn, &ndlp->nlp_nodename,
> + sizeof(desc->port_names.wwnn));
> +
> + memcpy(desc->port_names.wwnn, &ndlp->nlp_portname,
> + sizeof(desc->port_names.wwpn));
> + }
> +
> + desc->length = cpu_to_be32(sizeof(desc->port_names));
> +}
> +
> +void
> +lpfc_els_rdp_cmpl(struct lpfc_hba *phba, struct lpfc_rdp_context *rdp_context,
> + int status)
> +{
> + struct lpfc_nodelist *ndlp = rdp_context->ndlp;
> + struct lpfc_vport *vport = ndlp->vport;
> + struct lpfc_iocbq *elsiocb;
> + IOCB_t *icmd;
> + uint8_t *pcmd;
> + struct ls_rjt *stat;
> + struct fc_rdp_res_frame *rdp_res;
> + uint32_t cmdsize;
> + int rc;
> +
> + if (status != SUCCESS)
> + goto error;
> + cmdsize = sizeof(struct fc_rdp_res_frame);
> +
> + elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize,
> + lpfc_max_els_tries, rdp_context->ndlp,
> + rdp_context->ndlp->nlp_DID, ELS_CMD_ACC);
> + lpfc_nlp_put(ndlp);
> + if (!elsiocb)
> + goto free_rdp_context;
> +
> + icmd = &elsiocb->iocb;
> + icmd->ulpContext = rdp_context->rx_id;
> + icmd->unsli3.rcvsli3.ox_id = rdp_context->ox_id;
> +
> + lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
> + "2171 Xmit RDP response tag x%x xri x%x, "
> + "did x%x, nlp_flag x%x, nlp_state x%x, rpi x%x",
> + elsiocb->iotag, elsiocb->iocb.ulpContext,
> + ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state,
> + ndlp->nlp_rpi);
checkpatch suggests to not split this user-visible string
> + rdp_res = (struct fc_rdp_res_frame *)
> + (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
> + pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
> + memset(pcmd, 0, sizeof(struct fc_rdp_res_frame));
> + *((uint32_t *) (pcmd)) = ELS_CMD_ACC;
> +
> + /* For RDP payload */
> + lpfc_rdp_res_link_service(&rdp_res->link_service_desc, ELS_CMD_RDP);
> +
> + lpfc_rdp_res_sfp_desc(&rdp_res->sfp_desc,
> + rdp_context->page_a0, rdp_context->page_a2);
> + lpfc_rdp_res_speed(&rdp_res->portspeed_desc, phba);
> + lpfc_rdp_res_link_error(&rdp_res->link_error_desc,
> + &rdp_context->link_stat);
> + lpfc_rdp_res_diag_port_names(&rdp_res->diag_port_names_desc, phba);
> + lpfc_rdp_res_attach_port_names(&rdp_res->attached_port_names_desc,
> + vport, ndlp);
> + rdp_res->length = cpu_to_be32(RDP_DESC_PAYLOAD_SIZE);
> +
> + elsiocb->iocb_cmpl = lpfc_cmpl_els_rsp;
> +
> + phba->fc_stat.elsXmitACC++;
> + rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
> + if (rc == IOCB_ERROR)
> + lpfc_els_free_iocb(phba, elsiocb);
> +
> + kfree(rdp_context);
> +
> + return;
> +error:
> + cmdsize = 2 * sizeof(uint32_t);
> + elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, lpfc_max_els_tries,
> + ndlp, ndlp->nlp_DID, ELS_CMD_LS_RJT);
> + lpfc_nlp_put(ndlp);
> + if (!elsiocb)
> + goto free_rdp_context;
> +
> + icmd = &elsiocb->iocb;
> + icmd->ulpContext = rdp_context->rx_id;
> + icmd->unsli3.rcvsli3.ox_id = rdp_context->ox_id;
> + pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
> +
> + *((uint32_t *) (pcmd)) = ELS_CMD_LS_RJT;
> + stat = (struct ls_rjt *)(pcmd + sizeof(uint32_t));
> + stat->un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC;
> +
> + phba->fc_stat.elsXmitLSRJT++;
> + elsiocb->iocb_cmpl = lpfc_cmpl_els_rsp;
> + rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
> +
> + if (rc == IOCB_ERROR)
> + lpfc_els_free_iocb(phba, elsiocb);
> +free_rdp_context:
> + kfree(rdp_context);
> +}
> +
> +int
> +lpfc_get_rdp_info(struct lpfc_hba *phba, struct lpfc_rdp_context *rdp_context)
> +{
> + LPFC_MBOXQ_t *mbox = NULL;
> + int rc;
> +
> + mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
> + if (!mbox) {
> + lpfc_printf_log(phba, KERN_WARNING, LOG_MBOX | LOG_ELS,
> + "7105 failed to allocate mailbox memory");
> + return 1;
> + }
> +
> + if (lpfc_sli4_dump_page_a0(phba, mbox))
> + goto prep_mbox_fail;
> + mbox->vport = rdp_context->ndlp->vport;
> + mbox->mbox_cmpl = lpfc_mbx_cmpl_rdp_page_a0;
> + mbox->context2 = (struct lpfc_rdp_context *) rdp_context;
> + rc = lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT);
> + if (rc == MBX_NOT_FINISHED)
> + goto issue_mbox_fail;
> +
> + return 0;
> +
> +prep_mbox_fail:
> +issue_mbox_fail:
> + mempool_free(mbox, phba->mbox_mem_pool);
> + return 1;
> +}
> +
> +/*
> + * lpfc_els_rcv_rdp - Process an unsolicited RDP ELS.
> + * @vport: pointer to a host virtual N_Port data structure.
> + * @cmdiocb: pointer to lpfc command iocb data structure.
> + * @ndlp: pointer to a node-list data structure.
> + *
> + * This routine processes an unsolicited RDP(Read Diagnostic Parameters)
> + * IOCB. First, the payload of the unsolicited RDP is checked.
> + * Then it will (1) send MBX_DUMP_MEMORY, Embedded DMP_LMSD sub command TYPE-3
> + * for Page A0, (2) send MBX_DUMP_MEMORY, DMP_LMSD for Page A2,
> + * (3) send MBX_READ_LNK_STAT to get link stat, (4) Call lpfc_els_rdp_cmpl
> + * gather all data and send RDP response.
> + *
> + * Return code
> + * 0 - Sent the acc response
> + * 1 - Sent the reject response.
> + */
> +static int
> +lpfc_els_rcv_rdp(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
> + struct lpfc_nodelist *ndlp)
> +{
> + struct lpfc_hba *phba = vport->phba;
> + struct lpfc_dmabuf *pcmd;
> + uint8_t rjt_err, rjt_expl = LSEXP_NOTHING_MORE;
> + struct fc_rdp_req_frame *rdp_req;
> + struct lpfc_rdp_context *rdp_context;
> + IOCB_t *cmd = NULL;
> + struct ls_rjt stat;
> +
> + if (phba->sli_rev < LPFC_SLI_REV4 ||
> + (bf_get(lpfc_sli_intf_if_type,
> + &phba->sli4_hba.sli_intf) !=
> + LPFC_SLI_INTF_IF_TYPE_2)) {
> + rjt_err = LSRJT_UNABLE_TPC;
> + rjt_expl = LSEXP_REQ_UNSUPPORTED;
> + goto error;
> + }
> +
> + if (phba->sli_rev < LPFC_SLI_REV4 || (phba->hba_flag & HBA_FCOE_MODE)) {
> + rjt_err = LSRJT_UNABLE_TPC;
> + rjt_expl = LSEXP_REQ_UNSUPPORTED;
> + goto error;
> + }
> +
> + pcmd = (struct lpfc_dmabuf *) cmdiocb->context2;
> + rdp_req = (struct fc_rdp_req_frame *) pcmd->virt;
> +
> +
> + lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
> + "2422 ELS RDP Request "
> + "dec len %d tag x%x port_id %d len %d\n",
> + be32_to_cpu(rdp_req->rdp_des_length),
> + be32_to_cpu(rdp_req->nport_id_desc.tag),
> + be32_to_cpu(rdp_req->nport_id_desc.nport_id),
> + be32_to_cpu(rdp_req->nport_id_desc.length));
same here
> +
> + if (sizeof(struct fc_rdp_nport_desc) !=
> + be32_to_cpu(rdp_req->rdp_des_length))
> + goto rjt_logerr;
> + if (RDP_N_PORT_DESC_TAG != be32_to_cpu(rdp_req->nport_id_desc.tag))
> + goto rjt_logerr;
> + if (RDP_NPORT_ID_SIZE !=
> + be32_to_cpu(rdp_req->nport_id_desc.length))
> + goto rjt_logerr;
> + rdp_context = kmalloc(sizeof(struct lpfc_rdp_context), GFP_KERNEL);
> + if (!rdp_context) {
> + rjt_err = LSRJT_UNABLE_TPC;
> + goto error;
> + }
> +
> + memset(rdp_context, 0, sizeof(struct lpfc_rdp_context));
> + cmd = &cmdiocb->iocb;
> + rdp_context->ndlp = lpfc_nlp_get(ndlp);
> + rdp_context->ox_id = cmd->unsli3.rcvsli3.ox_id;
> + rdp_context->rx_id = cmd->ulpContext;
> + rdp_context->cmpl = lpfc_els_rdp_cmpl;
> + if (lpfc_get_rdp_info(phba, rdp_context)) {
> + lpfc_printf_vlog(ndlp->vport, KERN_WARNING, LOG_ELS,
> + "2423 Unable to send mailbox");
> + kfree(rdp_context);
> + rjt_err = LSRJT_UNABLE_TPC;
> + lpfc_nlp_put(ndlp);
> + goto error;
> + }
> +
> + return 0;
> +
> +rjt_logerr:
> + rjt_err = LSRJT_LOGICAL_ERR;
> +
> +error:
> + memset(&stat, 0, sizeof(stat));
> + stat.un.b.lsRjtRsnCode = rjt_err;
> + stat.un.b.lsRjtRsnCodeExp = rjt_expl;
> + lpfc_els_rsp_reject(vport, stat.un.lsRjtError, cmdiocb, ndlp, NULL);
> + return 1;
> +}
> +
> +
> static void
> lpfc_els_lcb_rsp(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
> {
> @@ -7052,6 +7468,10 @@ lpfc_els_unsol_buffer(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
> phba->fc_stat.elsRcvLCB++;
> lpfc_els_rcv_lcb(vport, elsiocb, ndlp);
> break;
> + case ELS_CMD_RDP:
> + phba->fc_stat.elsRcvRDP++;
> + lpfc_els_rcv_rdp(vport, elsiocb, ndlp);
> + break;
> case ELS_CMD_RSCN:
> phba->fc_stat.elsRcvRSCN++;
> lpfc_els_rcv_rscn(vport, elsiocb, ndlp);
> diff --git a/drivers/scsi/lpfc/lpfc_hw.h b/drivers/scsi/lpfc/lpfc_hw.h
> index 6ad0a6f..892c525 100644
> --- a/drivers/scsi/lpfc/lpfc_hw.h
> +++ b/drivers/scsi/lpfc/lpfc_hw.h
> @@ -543,6 +543,7 @@ struct fc_vft_header {
> #define ELS_CMD_TEST 0x11000000
> #define ELS_CMD_RRQ 0x12000000
> #define ELS_CMD_REC 0x13000000
> +#define ELS_CMD_RDP 0x18000000
> #define ELS_CMD_PRLI 0x20100014
> #define ELS_CMD_PRLO 0x21100014
> #define ELS_CMD_PRLO_ACC 0x02100014
> @@ -581,6 +582,7 @@ struct fc_vft_header {
> #define ELS_CMD_TEST 0x11
> #define ELS_CMD_RRQ 0x12
> #define ELS_CMD_REC 0x13
> +#define ELS_CMD_RDP 0x18
surrounding lines use just spaces
> #define ELS_CMD_PRLI 0x14001020
> #define ELS_CMD_PRLO 0x14001021
> #define ELS_CMD_PRLO_ACC 0x14001002
> @@ -1042,6 +1044,168 @@ struct fc_lcb_res_frame {
> uint16_t lcb_duration; /* LCB Payload Word 2, bit 15:0 */
> };
>
> +/*
> + * Read Diagnostic Parameters (RDP) ELS frame.
> + */
> +#define SFF_PG0_IDENT_SFP 0x3
> +
> +#define SFP_FLAG_PT_OPTICAL 0x0
> +#define SFP_FLAG_PT_SWLASER 0x01
> +#define SFP_FLAG_PT_LWLASER_LC1310 0x02
> +#define SFP_FLAG_PT_LWLASER_LL1550 0x03
> +#define SFP_FLAG_PT_MASK 0x0F
> +#define SFP_FLAG_PT_SHIFT 0
> +
> +#define SFP_FLAG_IS_OPTICAL_PORT 0x01
> +#define SFP_FLAG_IS_OPTICAL_MASK 0x010
> +#define SFP_FLAG_IS_OPTICAL_SHIFT 4
> +
> +#define SFP_FLAG_IS_DESC_VALID 0x01
> +#define SFP_FLAG_IS_DESC_VALID_MASK 0x020
> +#define SFP_FLAG_IS_DESC_VALID_SHIFT 5
> +
> +#define SFP_FLAG_CT_UNKNOWN 0x0
> +#define SFP_FLAG_CT_SFP_PLUS 0x01
> +#define SFP_FLAG_CT_MASK 0x3C
> +#define SFP_FLAG_CT_SHIFT 6
> +
> +struct fc_rdp_port_name_info {
> + uint8_t wwnn[8];
> + uint8_t wwpn[8];
> +};
No padding here
> +
> +
> +/*
> + * Link Error Status Block Structure (FC-FS-3) for RDP
> + * This similar to RPS ELS
> + */
> +struct fc_link_status {
> + uint32_t link_failure_cnt;
> + uint32_t loss_of_synch_cnt;
> + uint32_t loss_of_signal_cnt;
> + uint32_t primitive_seq_proto_err;
> + uint32_t invalid_trans_word;
> + uint32_t invalid_crc_cnt;
> +
> +};
but here and below. There might be a gain from consistent style.
> +
> +#define RDP_PORT_NAMES_DESC_TAG 0x00010003
> +struct fc_rdp_port_name_desc {
> + uint32_t tag; /* 0001 0003h */
> + uint32_t length; /* set to size of payload struct */
> + struct fc_rdp_port_name_info port_names;
Additional space here
> +};
> +
> +
> +struct fc_rdp_link_error_status_payload_info {
> + struct fc_link_status link_status; /* 24 bytes */
> + uint32_t port_type; /* bits 31-30 only */
> +};
and here
> +
> +#define RDP_LINK_ERROR_STATUS_DESC_TAG 0x00010002
> +struct fc_rdp_link_error_status_desc {
> + uint32_t tag; /* 0001 0002h */
> + uint32_t length; /* set to size of payload struct */
> + struct fc_rdp_link_error_status_payload_info info;
> +};
> +
> +#define VN_PT_PHY_UNKNOWN 0x00
> +#define VN_PT_PHY_PF_PORT 0x01
> +#define VN_PT_PHY_ETH_MAC 0x10
> +#define VN_PT_PHY_SHIFT 30
here
> +
> +#define RDP_PS_1GB 0x8000
> +#define RDP_PS_2GB 0x4000
> +#define RDP_PS_4GB 0x2000
> +#define RDP_PS_10GB 0x1000
> +#define RDP_PS_8GB 0x0800
> +#define RDP_PS_16GB 0x0400
> +#define RDP_PS_32GB 0x0200
> +
> +#define RDP_CAP_UNKNOWN 0x0001
> +#define RDP_PS_UNKNOWN 0x0002
> +#define RDP_PS_NOT_ESTABLISHED 0x0001
> +
> +struct fc_rdp_port_speed {
> + uint16_t capabilities;
> + uint16_t speed;
> +};
> +
> +struct fc_rdp_port_speed_info {
> + struct fc_rdp_port_speed port_speed;
> +};
here
> +
> +#define RDP_PORT_SPEED_DESC_TAG 0x00010001
> +struct fc_rdp_port_speed_desc {
> + uint32_t tag; /* 00010001h */
> + uint32_t length; /* set to size of payload struct */
> + struct fc_rdp_port_speed_info info;
> +};
> +
> +#define RDP_NPORT_ID_SIZE 4
> +#define RDP_N_PORT_DESC_TAG 0x00000003
> +struct fc_rdp_nport_desc {
> + uint32_t tag; /* 0000 0003h, big endian */
> + uint32_t length; /* size of RDP_N_PORT_ID struct */
> + uint32_t nport_id : 12;
> + uint32_t reserved : 8;
> +};
> +
> +
> +struct fc_rdp_link_service_info {
> + uint32_t els_req; /* Request payload word 0 value.*/
> +};
> +
> +#define RDP_LINK_SERVICE_DESC_TAG 0x00000001
> +struct fc_rdp_link_service_desc {
> + uint32_t tag; /* Descriptor tag 1 */
> + uint32_t length; /* set to size of payload struct. */
> + struct fc_rdp_link_service_info payload;
> + /* must be ELS req Word 0(0x18) */
> +};
here
> +
> +struct fc_rdp_sfp_info {
> + uint16_t temperature;
> + uint16_t vcc;
> + uint16_t tx_bias;
> + uint16_t tx_power;
> + uint16_t rx_power;
> + uint16_t flags;
> +};
> +
> +#define RDP_SFP_DESC_TAG 0x00010000
> +struct fc_rdp_sfp_desc {
> + uint32_t tag;
> + uint32_t length; /* set to size of sfp_info struct */
> + struct fc_rdp_sfp_info sfp_info;
> +};
> +
> +struct fc_rdp_req_frame {
> + uint32_t rdp_command; /* ELS command opcode (0x18)*/
> + uint32_t rdp_des_length; /* RDP Payload Word 1 */
> + struct fc_rdp_nport_desc nport_id_desc; /* RDP Payload Word 2 - 4 */
> +};
> +
> +
> +struct fc_rdp_res_frame {
> + uint32_t reply_sequence; /* FC word0 LS_ACC or LS_RJT */
> + uint32_t length; /* FC Word 1 */
> + struct fc_rdp_link_service_desc link_service_desc; /* Word 2 -4 */
> + struct fc_rdp_sfp_desc sfp_desc; /* Word 5 -9 */
> + struct fc_rdp_port_speed_desc portspeed_desc; /* Word 10-12 */
> + struct fc_rdp_link_error_status_desc link_error_desc; /* Word 13-21 */
> + struct fc_rdp_port_name_desc diag_port_names_desc; /* Word 22-27 */
> + struct fc_rdp_port_name_desc attached_port_names_desc;/* Word 28-33 */
> +};
> +
> +
> +#define RDP_DESC_PAYLOAD_SIZE (sizeof(struct fc_rdp_link_service_desc) \
> + + sizeof(struct fc_rdp_sfp_desc) \
> + + sizeof(struct fc_rdp_port_speed_desc) \
> + + sizeof(struct fc_rdp_link_error_status_desc) \
> + + (sizeof(struct fc_rdp_port_name_desc) * 2))
> +
> +
> /******** FDMI ********/
>
> /* lpfc_sli_ct_request defines the CT_IU preamble for FDMI commands */
> @@ -1619,6 +1783,11 @@ typedef struct { /* FireFly BIU registers */
> #define TEMPERATURE_OFFSET 0xB0 /* Slim offset for critical temperature event */
>
> /*
> + * return code Fail
> + */
> +#define FAILURE 1
> +
> +/*
> * Begin Structure Definitions for Mailbox Commands
> */
>
> diff --git a/drivers/scsi/lpfc/lpfc_hw4.h b/drivers/scsi/lpfc/lpfc_hw4.h
> index 9f2bfcc..7cc7bec 100644
> --- a/drivers/scsi/lpfc/lpfc_hw4.h
> +++ b/drivers/scsi/lpfc/lpfc_hw4.h
> @@ -2455,6 +2455,205 @@ struct lpfc_mbx_supp_pages {
> #define LPFC_SLI4_PARAMETERS 2
> };
>
> +struct lpfc_mbx_memory_dump_type3 {
> + uint32_t word1;
> +#define lpfc_mbx_memory_dump_type3_type_SHIFT 0
> +#define lpfc_mbx_memory_dump_type3_type_MASK 0x0000000f
> +#define lpfc_mbx_memory_dump_type3_type_WORD word1
> +#define lpfc_mbx_memory_dump_type3_link_SHIFT 24
> +#define lpfc_mbx_memory_dump_type3_link_MASK 0x000000ff
> +#define lpfc_mbx_memory_dump_type3_link_WORD word1
> + uint32_t word2;
> +#define lpfc_mbx_memory_dump_type3_page_no_SHIFT 0
> +#define lpfc_mbx_memory_dump_type3_page_no_MASK 0x0000ffff
> +#define lpfc_mbx_memory_dump_type3_page_no_WORD word2
> +#define lpfc_mbx_memory_dump_type3_offset_SHIFT 16
> +#define lpfc_mbx_memory_dump_type3_offset_MASK 0x0000ffff
> +#define lpfc_mbx_memory_dump_type3_offset_WORD word2
> + uint32_t word3;
> +#define lpfc_mbx_memory_dump_type3_length_SHIFT 0
> +#define lpfc_mbx_memory_dump_type3_length_MASK 0x00ffffff
> +#define lpfc_mbx_memory_dump_type3_length_WORD word3
> + uint32_t addr_lo;
> + uint32_t addr_hi;
> + uint32_t return_len;
> +};
> +
> +#define DMP_PAGE_A0 0xa0
> +#define DMP_PAGE_A2 0xa2
> +#define DMP_SFF_PAGE_A0_SIZE 256
> +#define DMP_SFF_PAGE_A2_SIZE 256
> +
> +#define SFP_WAVELENGTH_LC1310 1310
> +#define SFP_WAVELENGTH_LL1550 1550
> +
> +
> +/*
> + * * SFF-8472 TABLE 3.4
> + * */
broken comment
> +#define SFF_PG0_CONNECTOR_UNKNOWN 0x00 /* Unknown */
> +#define SFF_PG0_CONNECTOR_SC 0x01 /* SC */
> +#define SFF_PG0_CONNECTOR_FC_COPPER1 0x02 /* FC style 1 copper connector */
> +#define SFF_PG0_CONNECTOR_FC_COPPER2 0x03 /* FC style 2 copper connector */
> +#define SFF_PG0_CONNECTOR_BNC 0x04 /* BNC / TNC */
> +#define SFF_PG0_CONNECTOR__FC_COAX 0x05 /* FC coaxial headers */
> +#define SFF_PG0_CONNECTOR_FIBERJACK 0x06 /* FiberJack */
> +#define SFF_PG0_CONNECTOR_LC 0x07 /* LC */
> +#define SFF_PG0_CONNECTOR_MT 0x08 /* MT - RJ */
> +#define SFF_PG0_CONNECTOR_MU 0x09 /* MU */
> +#define SFF_PG0_CONNECTOR_SF 0x0A /* SG */
> +#define SFF_PG0_CONNECTOR_OPTICAL_PIGTAIL 0x0B /* Optical pigtail */
> +#define SFF_PG0_CONNECTOR_OPTICAL_PARALLEL 0x0C /* MPO Parallel Optic */
> +#define SFF_PG0_CONNECTOR_HSSDC_II 0x20 /* HSSDC II */
> +#define SFF_PG0_CONNECTOR_COPPER_PIGTAIL 0x21 /* Copper pigtail */
> +#define SFF_PG0_CONNECTOR_RJ45 0x22 /* RJ45 */
> +
> +/* SFF-8472 Table 3.1 Diagnostics: Data Fields Address/Page A0 */
> +
> +#define SSF_IDENTIFIER 0
> +#define SSF_EXT_IDENTIFIER 1
> +#define SSF_CONNECTOR 2
> +#define SSF_TRANSCEIVER_CODE_B0 3
> +#define SSF_TRANSCEIVER_CODE_B1 4
> +#define SSF_TRANSCEIVER_CODE_B2 5
> +#define SSF_TRANSCEIVER_CODE_B3 6
> +#define SSF_TRANSCEIVER_CODE_B4 7
> +#define SSF_TRANSCEIVER_CODE_B5 8
> +#define SSF_TRANSCEIVER_CODE_B6 9
> +#define SSF_TRANSCEIVER_CODE_B7 10
> +#define SSF_ENCODING 11
> +#define SSF_BR_NOMINAL 12
> +#define SSF_RATE_IDENTIFIER 13
> +#define SSF_LENGTH_9UM_KM 14
> +#define SSF_LENGTH_9UM 15
> +#define SSF_LENGTH_50UM_OM2 16
> +#define SSF_LENGTH_62UM_OM1 17
> +#define SFF_LENGTH_COPPER 18
> +#define SSF_LENGTH_50UM_OM3 19
> +#define SSF_VENDOR_NAME 20
> +#define SSF_VENDOR_OUI 36
> +#define SSF_VENDOR_PN 40
> +#define SSF_VENDOR_REV 56
> +#define SSF_WAVELENGTH_B1 60
> +#define SSF_WAVELENGTH_B0 61
> +#define SSF_CC_BASE 63
> +#define SSF_OPTIONS_B1 64
> +#define SSF_OPTIONS_B0 65
> +#define SSF_BR_MAX 66
> +#define SSF_BR_MIN 67
> +#define SSF_VENDOR_SN 68
> +#define SSF_DATE_CODE 84
> +#define SSF_MONITORING_TYPEDIAGNOSTIC 92
> +#define SSF_ENHANCED_OPTIONS 93
> +#define SFF_8472_COMPLIANCE 94
> +#define SSF_CC_EXT 95
> +#define SSF_A0_VENDOR_SPECIFIC 96
> +
> +/* SFF-8472 Table 3.1a Diagnostics: Data Fields Address/Page A2 */
> +
> +#define SSF_AW_THRESHOLDS 0
> +#define SSF_EXT_CAL_CONSTANTS 56
> +#define SSF_CC_DMI 95
> +#define SFF_TEMPERATURE_B1 96
> +#define SFF_TEMPERATURE_B0 97
> +#define SFF_VCC_B1 98
> +#define SFF_VCC_B0 99
> +#define SFF_TX_BIAS_CURRENT_B1 100
> +#define SFF_TX_BIAS_CURRENT_B0 101
> +#define SFF_TXPOWER_B1 102
> +#define SFF_TXPOWER_B0 103
> +#define SFF_RXPOWER_B1 104
> +#define SFF_RXPOWER_B0 105
> +#define SSF_STATUS_CONTROL 110
> +#define SSF_ALARM_FLAGS_B1 112
> +#define SSF_ALARM_FLAGS_B0 113
> +#define SSF_WARNING_FLAGS_B1 116
> +#define SSF_WARNING_FLAGS_B0 117
> +#define SSF_EXT_TATUS_CONTROL_B1 118
> +#define SSF_EXT_TATUS_CONTROL_B0 119
> +#define SSF_A2_VENDOR_SPECIFIC 120
> +#define SSF_USER_EEPROM 128
> +#define SSF_VENDOR_CONTROL 148
> +
> +
> +/*
> + * Tranceiver codes Fibre Channel SFF-8472
> + * Table 3.5.
> + */
> +
> +struct sff_trasnceiver_codes_byte0 {
> + uint8_t inifiband:4;
> + uint8_t teng_ethernet:4;
> +};
> +
> +struct sff_trasnceiver_codes_byte1 {
> + uint8_t sonet:6;
> + uint8_t escon:2;
> +};
> +
> +struct sff_trasnceiver_codes_byte2 {
> + uint8_t soNet:8;
> +};
> +
> +struct sff_trasnceiver_codes_byte3 {
> + uint8_t ethernet:8;
> +};
> +
> +struct sff_trasnceiver_codes_byte4 {
> + uint8_t fc_el_lo:1;
> + uint8_t fc_lw_laser:1;
> + uint8_t fc_sw_laser:1;
> + uint8_t fc_md_distance:1;
> + uint8_t fc_lg_distance:1;
> + uint8_t fc_int_distance:1;
> + uint8_t fc_short_distance:1;
> + uint8_t fc_vld_distance:1;
> +};
> +
> +struct sff_trasnceiver_codes_byte5 {
> + uint8_t reserved1:1;
> + uint8_t reserved2:1;
> + uint8_t fc_sfp_active:1; /* Active cable */
> + uint8_t fc_sfp_passive:1; /* Passive cable */
> + uint8_t fc_lw_laser:1; /* Longwave laser */
> + uint8_t fc_sw_laser_sl:1;
> + uint8_t fc_sw_laser_sn:1;
> + uint8_t fc_el_hi:1; /* Electrical enclosure high bit */
> +};
> +
> +struct sff_trasnceiver_codes_byte6 {
> + uint8_t fc_tm_sm:1; /* Single Mode */
> + uint8_t reserved:1;
> + uint8_t fc_tm_m6:1; /* Multimode, 62.5um (M6) */
> + uint8_t fc_tm_tv:1; /* Video Coax (TV) */
> + uint8_t fc_tm_mi:1; /* Miniature Coax (MI) */
> + uint8_t fc_tm_tp:1; /* Twisted Pair (TP) */
> + uint8_t fc_tm_tw:1; /* Twin Axial Pair */
> +};
> +
> +struct sff_trasnceiver_codes_byte7 {
> + uint8_t fc_sp_100MB:1; /* 100 MB/sec */
> + uint8_t reserve:1;
> + uint8_t fc_sp_200mb:1; /* 200 MB/sec */
> + uint8_t fc_sp_3200MB:1; /* 3200 MB/sec */
> + uint8_t fc_sp_400MB:1; /* 400 MB/sec */
> + uint8_t fc_sp_1600MB:1; /* 1600 MB/sec */
> + uint8_t fc_sp_800MB:1; /* 800 MB/sec */
> + uint8_t fc_sp_1200MB:1; /* 1200 MB/sec */
> +};
> +
> +/* User writable non-volatile memory, SFF-8472 Table 3.20 */
> +struct user_eeprom {
> + uint8_t vendor_name[16];
> + uint8_t vendor_oui[3];
> + uint8_t vendor_pn[816];
> + uint8_t vendor_rev[4];
> + uint8_t vendor_sn[16];
> + uint8_t datecode[6];
> + uint8_t lot_code[2];
> + uint8_t reserved191[57];
> +};
> +
> struct lpfc_mbx_pc_sli4_params {
> uint32_t word1;
> #define qs_SHIFT 0
> @@ -3054,6 +3253,7 @@ struct lpfc_mqe {
> struct lpfc_mbx_get_prof_cfg get_prof_cfg;
> struct lpfc_mbx_wr_object wr_object;
> struct lpfc_mbx_get_port_name get_port_name;
> + struct lpfc_mbx_memory_dump_type3 mem_dump_type3;
> struct lpfc_mbx_nop nop;
> } un;
> };
> @@ -3199,6 +3399,7 @@ struct lpfc_acqe_fc_la {
> #define LPFC_FC_LA_SPEED_8G 0x8
> #define LPFC_FC_LA_SPEED_10G 0xA
> #define LPFC_FC_LA_SPEED_16G 0x10
> +#define LPFC_FC_LA_SPEED_32G 0x20
surrounding lines use tabs
> #define lpfc_acqe_fc_la_topology_SHIFT 16
> #define lpfc_acqe_fc_la_topology_MASK 0x000000FF
> #define lpfc_acqe_fc_la_topology_WORD word0
Sebastian
prev parent reply other threads:[~2015-05-24 12:23 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-05-21 17:55 [PATCH v2 06/15] lpfc: Add support for RDP ELS command James Smart
2015-05-24 12:23 ` Sebastian Herbszt [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20150524142303.00000bd6@localhost \
--to=herbszt@gmx.de \
--cc=james.smart@avagotech.com \
--cc=linux-scsi@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.