|
@@ -379,10 +379,10 @@ lpfc_sli4_rq_put(struct lpfc_queue *hq, struct lpfc_queue *dq,
|
|
|
dq->host_index = ((dq->host_index + 1) % dq->entry_count);
|
|
|
|
|
|
/* Ring The Header Receive Queue Doorbell */
|
|
|
- if (!(hq->host_index % LPFC_RQ_POST_BATCH)) {
|
|
|
+ if (!(hq->host_index % hq->entry_repost)) {
|
|
|
doorbell.word0 = 0;
|
|
|
bf_set(lpfc_rq_doorbell_num_posted, &doorbell,
|
|
|
- LPFC_RQ_POST_BATCH);
|
|
|
+ hq->entry_repost);
|
|
|
bf_set(lpfc_rq_doorbell_id, &doorbell, hq->queue_id);
|
|
|
writel(doorbell.word0, hq->phba->sli4_hba.RQDBregaddr);
|
|
|
}
|
|
@@ -1864,7 +1864,7 @@ lpfc_sli_hbqbuf_init_hbqs(struct lpfc_hba *phba, uint32_t qno)
|
|
|
{
|
|
|
if (phba->sli_rev == LPFC_SLI_REV4)
|
|
|
return lpfc_sli_hbqbuf_fill_hbqs(phba, qno,
|
|
|
- lpfc_hbq_defs[qno]->entry_count);
|
|
|
+ lpfc_hbq_defs[qno]->entry_count);
|
|
|
else
|
|
|
return lpfc_sli_hbqbuf_fill_hbqs(phba, qno,
|
|
|
lpfc_hbq_defs[qno]->init_count);
|
|
@@ -2200,10 +2200,13 @@ lpfc_sli_handle_mb_event(struct lpfc_hba *phba)
|
|
|
/* Unknown mailbox command compl */
|
|
|
lpfc_printf_log(phba, KERN_ERR, LOG_MBOX | LOG_SLI,
|
|
|
"(%d):0323 Unknown Mailbox command "
|
|
|
- "x%x (x%x) Cmpl\n",
|
|
|
+ "x%x (x%x/x%x) Cmpl\n",
|
|
|
pmb->vport ? pmb->vport->vpi : 0,
|
|
|
pmbox->mbxCommand,
|
|
|
- lpfc_sli4_mbox_opcode_get(phba, pmb));
|
|
|
+ lpfc_sli_config_mbox_subsys_get(phba,
|
|
|
+ pmb),
|
|
|
+ lpfc_sli_config_mbox_opcode_get(phba,
|
|
|
+ pmb));
|
|
|
phba->link_state = LPFC_HBA_ERROR;
|
|
|
phba->work_hs = HS_FFER3;
|
|
|
lpfc_handle_eratt(phba);
|
|
@@ -2215,17 +2218,19 @@ lpfc_sli_handle_mb_event(struct lpfc_hba *phba)
|
|
|
if (pmbox->mbxStatus == MBXERR_NO_RESOURCES) {
|
|
|
/* Mbox cmd cmpl error - RETRYing */
|
|
|
lpfc_printf_log(phba, KERN_INFO,
|
|
|
- LOG_MBOX | LOG_SLI,
|
|
|
- "(%d):0305 Mbox cmd cmpl "
|
|
|
- "error - RETRYing Data: x%x "
|
|
|
- "(x%x) x%x x%x x%x\n",
|
|
|
- pmb->vport ? pmb->vport->vpi :0,
|
|
|
- pmbox->mbxCommand,
|
|
|
- lpfc_sli4_mbox_opcode_get(phba,
|
|
|
- pmb),
|
|
|
- pmbox->mbxStatus,
|
|
|
- pmbox->un.varWords[0],
|
|
|
- pmb->vport->port_state);
|
|
|
+ LOG_MBOX | LOG_SLI,
|
|
|
+ "(%d):0305 Mbox cmd cmpl "
|
|
|
+ "error - RETRYing Data: x%x "
|
|
|
+ "(x%x/x%x) x%x x%x x%x\n",
|
|
|
+ pmb->vport ? pmb->vport->vpi : 0,
|
|
|
+ pmbox->mbxCommand,
|
|
|
+ lpfc_sli_config_mbox_subsys_get(phba,
|
|
|
+ pmb),
|
|
|
+ lpfc_sli_config_mbox_opcode_get(phba,
|
|
|
+ pmb),
|
|
|
+ pmbox->mbxStatus,
|
|
|
+ pmbox->un.varWords[0],
|
|
|
+ pmb->vport->port_state);
|
|
|
pmbox->mbxStatus = 0;
|
|
|
pmbox->mbxOwner = OWN_HOST;
|
|
|
rc = lpfc_sli_issue_mbox(phba, pmb, MBX_NOWAIT);
|
|
@@ -2236,11 +2241,12 @@ lpfc_sli_handle_mb_event(struct lpfc_hba *phba)
|
|
|
|
|
|
/* Mailbox cmd <cmd> Cmpl <cmpl> */
|
|
|
lpfc_printf_log(phba, KERN_INFO, LOG_MBOX | LOG_SLI,
|
|
|
- "(%d):0307 Mailbox cmd x%x (x%x) Cmpl x%p "
|
|
|
+ "(%d):0307 Mailbox cmd x%x (x%x/x%x) Cmpl x%p "
|
|
|
"Data: x%x x%x x%x x%x x%x x%x x%x x%x x%x\n",
|
|
|
pmb->vport ? pmb->vport->vpi : 0,
|
|
|
pmbox->mbxCommand,
|
|
|
- lpfc_sli4_mbox_opcode_get(phba, pmb),
|
|
|
+ lpfc_sli_config_mbox_subsys_get(phba, pmb),
|
|
|
+ lpfc_sli_config_mbox_opcode_get(phba, pmb),
|
|
|
pmb->mbox_cmpl,
|
|
|
*((uint32_t *) pmbox),
|
|
|
pmbox->un.varWords[0],
|
|
@@ -4685,6 +4691,175 @@ lpfc_sli4_read_rev(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * lpfc_sli4_retrieve_pport_name - Retrieve SLI4 device physical port name
|
|
|
+ * @phba: pointer to lpfc hba data structure.
|
|
|
+ *
|
|
|
+ * This routine retrieves SLI4 device physical port name this PCI function
|
|
|
+ * is attached to.
|
|
|
+ *
|
|
|
+ * Return codes
|
|
|
+ * 0 - sucessful
|
|
|
+ * otherwise - failed to retrieve physical port name
|
|
|
+ **/
|
|
|
+static int
|
|
|
+lpfc_sli4_retrieve_pport_name(struct lpfc_hba *phba)
|
|
|
+{
|
|
|
+ LPFC_MBOXQ_t *mboxq;
|
|
|
+ struct lpfc_mbx_read_config *rd_config;
|
|
|
+ struct lpfc_mbx_get_cntl_attributes *mbx_cntl_attr;
|
|
|
+ struct lpfc_controller_attribute *cntl_attr;
|
|
|
+ struct lpfc_mbx_get_port_name *get_port_name;
|
|
|
+ void *virtaddr = NULL;
|
|
|
+ uint32_t alloclen, reqlen;
|
|
|
+ uint32_t shdr_status, shdr_add_status;
|
|
|
+ union lpfc_sli4_cfg_shdr *shdr;
|
|
|
+ char cport_name = 0;
|
|
|
+ int rc;
|
|
|
+
|
|
|
+ /* We assume nothing at this point */
|
|
|
+ phba->sli4_hba.lnk_info.lnk_dv = LPFC_LNK_DAT_INVAL;
|
|
|
+ phba->sli4_hba.pport_name_sta = LPFC_SLI4_PPNAME_NON;
|
|
|
+
|
|
|
+ mboxq = (LPFC_MBOXQ_t *)mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
|
|
|
+ if (!mboxq)
|
|
|
+ return -ENOMEM;
|
|
|
+
|
|
|
+ /* obtain link type and link number via READ_CONFIG */
|
|
|
+ lpfc_read_config(phba, mboxq);
|
|
|
+ rc = lpfc_sli_issue_mbox(phba, mboxq, MBX_POLL);
|
|
|
+ if (rc == MBX_SUCCESS) {
|
|
|
+ rd_config = &mboxq->u.mqe.un.rd_config;
|
|
|
+ if (bf_get(lpfc_mbx_rd_conf_lnk_ldv, rd_config)) {
|
|
|
+ phba->sli4_hba.lnk_info.lnk_dv = LPFC_LNK_DAT_VAL;
|
|
|
+ phba->sli4_hba.lnk_info.lnk_tp =
|
|
|
+ bf_get(lpfc_mbx_rd_conf_lnk_type, rd_config);
|
|
|
+ phba->sli4_hba.lnk_info.lnk_no =
|
|
|
+ bf_get(lpfc_mbx_rd_conf_lnk_numb, rd_config);
|
|
|
+ lpfc_printf_log(phba, KERN_INFO, LOG_SLI,
|
|
|
+ "3081 lnk_type:%d, lnk_numb:%d\n",
|
|
|
+ phba->sli4_hba.lnk_info.lnk_tp,
|
|
|
+ phba->sli4_hba.lnk_info.lnk_no);
|
|
|
+ goto retrieve_ppname;
|
|
|
+ } else
|
|
|
+ lpfc_printf_log(phba, KERN_WARNING, LOG_SLI,
|
|
|
+ "3082 Mailbox (x%x) returned ldv:x0\n",
|
|
|
+ bf_get(lpfc_mqe_command,
|
|
|
+ &mboxq->u.mqe));
|
|
|
+ } else
|
|
|
+ lpfc_printf_log(phba, KERN_WARNING, LOG_SLI,
|
|
|
+ "3083 Mailbox (x%x) failed, status:x%x\n",
|
|
|
+ bf_get(lpfc_mqe_command, &mboxq->u.mqe),
|
|
|
+ bf_get(lpfc_mqe_status, &mboxq->u.mqe));
|
|
|
+
|
|
|
+ /* obtain link type and link number via COMMON_GET_CNTL_ATTRIBUTES */
|
|
|
+ reqlen = sizeof(struct lpfc_mbx_get_cntl_attributes);
|
|
|
+ alloclen = lpfc_sli4_config(phba, mboxq, LPFC_MBOX_SUBSYSTEM_COMMON,
|
|
|
+ LPFC_MBOX_OPCODE_GET_CNTL_ATTRIBUTES, reqlen,
|
|
|
+ LPFC_SLI4_MBX_NEMBED);
|
|
|
+ if (alloclen < reqlen) {
|
|
|
+ lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
|
|
|
+ "3084 Allocated DMA memory size (%d) is "
|
|
|
+ "less than the requested DMA memory size "
|
|
|
+ "(%d)\n", alloclen, reqlen);
|
|
|
+ rc = -ENOMEM;
|
|
|
+ goto out_free_mboxq;
|
|
|
+ }
|
|
|
+ rc = lpfc_sli_issue_mbox(phba, mboxq, MBX_POLL);
|
|
|
+ virtaddr = mboxq->sge_array->addr[0];
|
|
|
+ mbx_cntl_attr = (struct lpfc_mbx_get_cntl_attributes *)virtaddr;
|
|
|
+ shdr = &mbx_cntl_attr->cfg_shdr;
|
|
|
+ shdr_status = bf_get(lpfc_mbox_hdr_status, &shdr->response);
|
|
|
+ shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, &shdr->response);
|
|
|
+ if (shdr_status || shdr_add_status || rc) {
|
|
|
+ lpfc_printf_log(phba, KERN_WARNING, LOG_SLI,
|
|
|
+ "3085 Mailbox x%x (x%x/x%x) failed, "
|
|
|
+ "rc:x%x, status:x%x, add_status:x%x\n",
|
|
|
+ bf_get(lpfc_mqe_command, &mboxq->u.mqe),
|
|
|
+ lpfc_sli_config_mbox_subsys_get(phba, mboxq),
|
|
|
+ lpfc_sli_config_mbox_opcode_get(phba, mboxq),
|
|
|
+ rc, shdr_status, shdr_add_status);
|
|
|
+ rc = -ENXIO;
|
|
|
+ goto out_free_mboxq;
|
|
|
+ }
|
|
|
+ cntl_attr = &mbx_cntl_attr->cntl_attr;
|
|
|
+ phba->sli4_hba.lnk_info.lnk_dv = LPFC_LNK_DAT_VAL;
|
|
|
+ phba->sli4_hba.lnk_info.lnk_tp =
|
|
|
+ bf_get(lpfc_cntl_attr_lnk_type, cntl_attr);
|
|
|
+ phba->sli4_hba.lnk_info.lnk_no =
|
|
|
+ bf_get(lpfc_cntl_attr_lnk_numb, cntl_attr);
|
|
|
+ lpfc_printf_log(phba, KERN_INFO, LOG_SLI,
|
|
|
+ "3086 lnk_type:%d, lnk_numb:%d\n",
|
|
|
+ phba->sli4_hba.lnk_info.lnk_tp,
|
|
|
+ phba->sli4_hba.lnk_info.lnk_no);
|
|
|
+
|
|
|
+retrieve_ppname:
|
|
|
+ lpfc_sli4_config(phba, mboxq, LPFC_MBOX_SUBSYSTEM_COMMON,
|
|
|
+ LPFC_MBOX_OPCODE_GET_PORT_NAME,
|
|
|
+ sizeof(struct lpfc_mbx_get_port_name) -
|
|
|
+ sizeof(struct lpfc_sli4_cfg_mhdr),
|
|
|
+ LPFC_SLI4_MBX_EMBED);
|
|
|
+ get_port_name = &mboxq->u.mqe.un.get_port_name;
|
|
|
+ shdr = (union lpfc_sli4_cfg_shdr *)&get_port_name->header.cfg_shdr;
|
|
|
+ bf_set(lpfc_mbox_hdr_version, &shdr->request, LPFC_OPCODE_VERSION_1);
|
|
|
+ bf_set(lpfc_mbx_get_port_name_lnk_type, &get_port_name->u.request,
|
|
|
+ phba->sli4_hba.lnk_info.lnk_tp);
|
|
|
+ rc = lpfc_sli_issue_mbox(phba, mboxq, MBX_POLL);
|
|
|
+ shdr_status = bf_get(lpfc_mbox_hdr_status, &shdr->response);
|
|
|
+ shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, &shdr->response);
|
|
|
+ if (shdr_status || shdr_add_status || rc) {
|
|
|
+ lpfc_printf_log(phba, KERN_WARNING, LOG_SLI,
|
|
|
+ "3087 Mailbox x%x (x%x/x%x) failed: "
|
|
|
+ "rc:x%x, status:x%x, add_status:x%x\n",
|
|
|
+ bf_get(lpfc_mqe_command, &mboxq->u.mqe),
|
|
|
+ lpfc_sli_config_mbox_subsys_get(phba, mboxq),
|
|
|
+ lpfc_sli_config_mbox_opcode_get(phba, mboxq),
|
|
|
+ rc, shdr_status, shdr_add_status);
|
|
|
+ rc = -ENXIO;
|
|
|
+ goto out_free_mboxq;
|
|
|
+ }
|
|
|
+ switch (phba->sli4_hba.lnk_info.lnk_no) {
|
|
|
+ case LPFC_LINK_NUMBER_0:
|
|
|
+ cport_name = bf_get(lpfc_mbx_get_port_name_name0,
|
|
|
+ &get_port_name->u.response);
|
|
|
+ phba->sli4_hba.pport_name_sta = LPFC_SLI4_PPNAME_GET;
|
|
|
+ break;
|
|
|
+ case LPFC_LINK_NUMBER_1:
|
|
|
+ cport_name = bf_get(lpfc_mbx_get_port_name_name1,
|
|
|
+ &get_port_name->u.response);
|
|
|
+ phba->sli4_hba.pport_name_sta = LPFC_SLI4_PPNAME_GET;
|
|
|
+ break;
|
|
|
+ case LPFC_LINK_NUMBER_2:
|
|
|
+ cport_name = bf_get(lpfc_mbx_get_port_name_name2,
|
|
|
+ &get_port_name->u.response);
|
|
|
+ phba->sli4_hba.pport_name_sta = LPFC_SLI4_PPNAME_GET;
|
|
|
+ break;
|
|
|
+ case LPFC_LINK_NUMBER_3:
|
|
|
+ cport_name = bf_get(lpfc_mbx_get_port_name_name3,
|
|
|
+ &get_port_name->u.response);
|
|
|
+ phba->sli4_hba.pport_name_sta = LPFC_SLI4_PPNAME_GET;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (phba->sli4_hba.pport_name_sta == LPFC_SLI4_PPNAME_GET) {
|
|
|
+ phba->Port[0] = cport_name;
|
|
|
+ phba->Port[1] = '\0';
|
|
|
+ lpfc_printf_log(phba, KERN_INFO, LOG_SLI,
|
|
|
+ "3091 SLI get port name: %s\n", phba->Port);
|
|
|
+ }
|
|
|
+
|
|
|
+out_free_mboxq:
|
|
|
+ if (rc != MBX_TIMEOUT) {
|
|
|
+ if (bf_get(lpfc_mqe_command, &mboxq->u.mqe) == MBX_SLI4_CONFIG)
|
|
|
+ lpfc_sli4_mbox_cmd_free(phba, mboxq);
|
|
|
+ else
|
|
|
+ mempool_free(mboxq, phba->mbox_mem_pool);
|
|
|
+ }
|
|
|
+ return rc;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* lpfc_sli4_arm_cqeq_intr - Arm sli-4 device completion and event queues
|
|
|
* @phba: pointer to lpfc hba data structure.
|
|
@@ -4754,7 +4929,7 @@ lpfc_sli4_get_avail_extnt_rsrc(struct lpfc_hba *phba, uint16_t type,
|
|
|
if (!phba->sli4_hba.intr_enable)
|
|
|
rc = lpfc_sli_issue_mbox(phba, mbox, MBX_POLL);
|
|
|
else {
|
|
|
- mbox_tmo = lpfc_mbox_tmo_val(phba, MBX_SLI4_CONFIG);
|
|
|
+ mbox_tmo = lpfc_mbox_tmo_val(phba, mbox);
|
|
|
rc = lpfc_sli_issue_mbox_wait(phba, mbox, mbox_tmo);
|
|
|
}
|
|
|
if (unlikely(rc)) {
|
|
@@ -4911,7 +5086,7 @@ lpfc_sli4_cfg_post_extnts(struct lpfc_hba *phba, uint16_t *extnt_cnt,
|
|
|
if (!phba->sli4_hba.intr_enable)
|
|
|
rc = lpfc_sli_issue_mbox(phba, mbox, MBX_POLL);
|
|
|
else {
|
|
|
- mbox_tmo = lpfc_mbox_tmo_val(phba, MBX_SLI4_CONFIG);
|
|
|
+ mbox_tmo = lpfc_mbox_tmo_val(phba, mbox);
|
|
|
rc = lpfc_sli_issue_mbox_wait(phba, mbox, mbox_tmo);
|
|
|
}
|
|
|
|
|
@@ -5194,7 +5369,7 @@ lpfc_sli4_dealloc_extent(struct lpfc_hba *phba, uint16_t type)
|
|
|
if (!phba->sli4_hba.intr_enable)
|
|
|
rc = lpfc_sli_issue_mbox(phba, mbox, MBX_POLL);
|
|
|
else {
|
|
|
- mbox_tmo = lpfc_mbox_tmo_val(phba, mbox_tmo);
|
|
|
+ mbox_tmo = lpfc_mbox_tmo_val(phba, mbox);
|
|
|
rc = lpfc_sli_issue_mbox_wait(phba, mbox, mbox_tmo);
|
|
|
}
|
|
|
if (unlikely(rc)) {
|
|
@@ -5619,7 +5794,7 @@ lpfc_sli4_get_allocated_extnts(struct lpfc_hba *phba, uint16_t type,
|
|
|
if (!phba->sli4_hba.intr_enable)
|
|
|
rc = lpfc_sli_issue_mbox(phba, mbox, MBX_POLL);
|
|
|
else {
|
|
|
- mbox_tmo = lpfc_mbox_tmo_val(phba, MBX_SLI4_CONFIG);
|
|
|
+ mbox_tmo = lpfc_mbox_tmo_val(phba, mbox);
|
|
|
rc = lpfc_sli_issue_mbox_wait(phba, mbox, mbox_tmo);
|
|
|
}
|
|
|
|
|
@@ -5748,6 +5923,17 @@ lpfc_sli4_hba_setup(struct lpfc_hba *phba)
|
|
|
kfree(vpd);
|
|
|
goto out_free_mbox;
|
|
|
}
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Retrieve sli4 device physical port name, failure of doing it
|
|
|
+ * is considered as non-fatal.
|
|
|
+ */
|
|
|
+ rc = lpfc_sli4_retrieve_pport_name(phba);
|
|
|
+ if (!rc)
|
|
|
+ lpfc_printf_log(phba, KERN_INFO, LOG_MBOX | LOG_SLI,
|
|
|
+ "3080 Successful retrieving SLI4 device "
|
|
|
+ "physical port name: %s.\n", phba->Port);
|
|
|
+
|
|
|
/*
|
|
|
* Evaluate the read rev and vpd data. Populate the driver
|
|
|
* state with the results. If this routine fails, the failure
|
|
@@ -5818,9 +6004,13 @@ lpfc_sli4_hba_setup(struct lpfc_hba *phba)
|
|
|
* then turn off the global config parameters to disable the
|
|
|
* feature in the driver. This is not a fatal error.
|
|
|
*/
|
|
|
- if ((phba->cfg_enable_bg) &&
|
|
|
- !(bf_get(lpfc_mbx_rq_ftr_rsp_dif, &mqe->un.req_ftrs)))
|
|
|
- ftr_rsp++;
|
|
|
+ phba->sli3_options &= ~LPFC_SLI3_BG_ENABLED;
|
|
|
+ if (phba->cfg_enable_bg) {
|
|
|
+ if (bf_get(lpfc_mbx_rq_ftr_rsp_dif, &mqe->un.req_ftrs))
|
|
|
+ phba->sli3_options |= LPFC_SLI3_BG_ENABLED;
|
|
|
+ else
|
|
|
+ ftr_rsp++;
|
|
|
+ }
|
|
|
|
|
|
if (phba->max_vpi && phba->cfg_enable_npiv &&
|
|
|
!(bf_get(lpfc_mbx_rq_ftr_rsp_npiv, &mqe->un.req_ftrs)))
|
|
@@ -5937,12 +6127,20 @@ lpfc_sli4_hba_setup(struct lpfc_hba *phba)
|
|
|
goto out_free_mbox;
|
|
|
}
|
|
|
|
|
|
+ /* Create all the SLI4 queues */
|
|
|
+ rc = lpfc_sli4_queue_create(phba);
|
|
|
+ if (rc) {
|
|
|
+ lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
|
|
|
+ "3089 Failed to allocate queues\n");
|
|
|
+ rc = -ENODEV;
|
|
|
+ goto out_stop_timers;
|
|
|
+ }
|
|
|
/* Set up all the queues to the device */
|
|
|
rc = lpfc_sli4_queue_setup(phba);
|
|
|
if (unlikely(rc)) {
|
|
|
lpfc_printf_log(phba, KERN_ERR, LOG_MBOX | LOG_SLI,
|
|
|
"0381 Error %d during queue setup.\n ", rc);
|
|
|
- goto out_stop_timers;
|
|
|
+ goto out_destroy_queue;
|
|
|
}
|
|
|
|
|
|
/* Arm the CQs and then EQs on device */
|
|
@@ -6015,15 +6213,20 @@ lpfc_sli4_hba_setup(struct lpfc_hba *phba)
|
|
|
spin_lock_irq(&phba->hbalock);
|
|
|
phba->link_state = LPFC_LINK_DOWN;
|
|
|
spin_unlock_irq(&phba->hbalock);
|
|
|
- if (phba->cfg_suppress_link_up == LPFC_INITIALIZE_LINK)
|
|
|
+ if (phba->cfg_suppress_link_up == LPFC_INITIALIZE_LINK) {
|
|
|
rc = phba->lpfc_hba_init_link(phba, MBX_NOWAIT);
|
|
|
+ if (rc)
|
|
|
+ goto out_unset_queue;
|
|
|
+ }
|
|
|
+ mempool_free(mboxq, phba->mbox_mem_pool);
|
|
|
+ return rc;
|
|
|
out_unset_queue:
|
|
|
/* Unset all the queues set up in this routine when error out */
|
|
|
- if (rc)
|
|
|
- lpfc_sli4_queue_unset(phba);
|
|
|
+ lpfc_sli4_queue_unset(phba);
|
|
|
+out_destroy_queue:
|
|
|
+ lpfc_sli4_queue_destroy(phba);
|
|
|
out_stop_timers:
|
|
|
- if (rc)
|
|
|
- lpfc_stop_hba_timers(phba);
|
|
|
+ lpfc_stop_hba_timers(phba);
|
|
|
out_free_mbox:
|
|
|
mempool_free(mboxq, phba->mbox_mem_pool);
|
|
|
return rc;
|
|
@@ -6318,7 +6521,7 @@ lpfc_sli_issue_mbox_s3(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmbox,
|
|
|
}
|
|
|
/* timeout active mbox command */
|
|
|
mod_timer(&psli->mbox_tmo, (jiffies +
|
|
|
- (HZ * lpfc_mbox_tmo_val(phba, mb->mbxCommand))));
|
|
|
+ (HZ * lpfc_mbox_tmo_val(phba, pmbox))));
|
|
|
}
|
|
|
|
|
|
/* Mailbox cmd <cmd> issue */
|
|
@@ -6442,9 +6645,8 @@ lpfc_sli_issue_mbox_s3(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmbox,
|
|
|
drvr_flag);
|
|
|
goto out_not_finished;
|
|
|
}
|
|
|
- timeout = msecs_to_jiffies(lpfc_mbox_tmo_val(phba,
|
|
|
- mb->mbxCommand) *
|
|
|
- 1000) + jiffies;
|
|
|
+ timeout = msecs_to_jiffies(lpfc_mbox_tmo_val(phba, pmbox) *
|
|
|
+ 1000) + jiffies;
|
|
|
i = 0;
|
|
|
/* Wait for command to complete */
|
|
|
while (((word0 & OWN_CHIP) == OWN_CHIP) ||
|
|
@@ -6555,21 +6757,21 @@ static int
|
|
|
lpfc_sli4_async_mbox_block(struct lpfc_hba *phba)
|
|
|
{
|
|
|
struct lpfc_sli *psli = &phba->sli;
|
|
|
- uint8_t actcmd = MBX_HEARTBEAT;
|
|
|
int rc = 0;
|
|
|
- unsigned long timeout;
|
|
|
+ unsigned long timeout = 0;
|
|
|
|
|
|
/* Mark the asynchronous mailbox command posting as blocked */
|
|
|
spin_lock_irq(&phba->hbalock);
|
|
|
psli->sli_flag |= LPFC_SLI_ASYNC_MBX_BLK;
|
|
|
- if (phba->sli.mbox_active)
|
|
|
- actcmd = phba->sli.mbox_active->u.mb.mbxCommand;
|
|
|
- spin_unlock_irq(&phba->hbalock);
|
|
|
/* Determine how long we might wait for the active mailbox
|
|
|
* command to be gracefully completed by firmware.
|
|
|
*/
|
|
|
- timeout = msecs_to_jiffies(lpfc_mbox_tmo_val(phba, actcmd) * 1000) +
|
|
|
- jiffies;
|
|
|
+ if (phba->sli.mbox_active)
|
|
|
+ timeout = msecs_to_jiffies(lpfc_mbox_tmo_val(phba,
|
|
|
+ phba->sli.mbox_active) *
|
|
|
+ 1000) + jiffies;
|
|
|
+ spin_unlock_irq(&phba->hbalock);
|
|
|
+
|
|
|
/* Wait for the outstnading mailbox command to complete */
|
|
|
while (phba->sli.mbox_active) {
|
|
|
/* Check active mailbox complete status every 2ms */
|
|
@@ -6664,11 +6866,12 @@ lpfc_sli4_post_sync_mbox(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq)
|
|
|
if (psli->sli_flag & LPFC_SLI_MBOX_ACTIVE) {
|
|
|
spin_unlock_irqrestore(&phba->hbalock, iflag);
|
|
|
lpfc_printf_log(phba, KERN_ERR, LOG_MBOX | LOG_SLI,
|
|
|
- "(%d):2532 Mailbox command x%x (x%x) "
|
|
|
+ "(%d):2532 Mailbox command x%x (x%x/x%x) "
|
|
|
"cannot issue Data: x%x x%x\n",
|
|
|
mboxq->vport ? mboxq->vport->vpi : 0,
|
|
|
mboxq->u.mb.mbxCommand,
|
|
|
- lpfc_sli4_mbox_opcode_get(phba, mboxq),
|
|
|
+ lpfc_sli_config_mbox_subsys_get(phba, mboxq),
|
|
|
+ lpfc_sli_config_mbox_opcode_get(phba, mboxq),
|
|
|
psli->sli_flag, MBX_POLL);
|
|
|
return MBXERR_ERROR;
|
|
|
}
|
|
@@ -6691,7 +6894,7 @@ lpfc_sli4_post_sync_mbox(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq)
|
|
|
dma_address = &phba->sli4_hba.bmbx.dma_address;
|
|
|
writel(dma_address->addr_hi, phba->sli4_hba.BMBXregaddr);
|
|
|
|
|
|
- timeout = msecs_to_jiffies(lpfc_mbox_tmo_val(phba, mbx_cmnd)
|
|
|
+ timeout = msecs_to_jiffies(lpfc_mbox_tmo_val(phba, mboxq)
|
|
|
* 1000) + jiffies;
|
|
|
do {
|
|
|
bmbx_reg.word0 = readl(phba->sli4_hba.BMBXregaddr);
|
|
@@ -6707,7 +6910,7 @@ lpfc_sli4_post_sync_mbox(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq)
|
|
|
|
|
|
/* Post the low mailbox dma address to the port. */
|
|
|
writel(dma_address->addr_lo, phba->sli4_hba.BMBXregaddr);
|
|
|
- timeout = msecs_to_jiffies(lpfc_mbox_tmo_val(phba, mbx_cmnd)
|
|
|
+ timeout = msecs_to_jiffies(lpfc_mbox_tmo_val(phba, mboxq)
|
|
|
* 1000) + jiffies;
|
|
|
do {
|
|
|
bmbx_reg.word0 = readl(phba->sli4_hba.BMBXregaddr);
|
|
@@ -6746,11 +6949,12 @@ lpfc_sli4_post_sync_mbox(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq)
|
|
|
lpfc_sli4_swap_str(phba, mboxq);
|
|
|
|
|
|
lpfc_printf_log(phba, KERN_INFO, LOG_MBOX | LOG_SLI,
|
|
|
- "(%d):0356 Mailbox cmd x%x (x%x) Status x%x "
|
|
|
+ "(%d):0356 Mailbox cmd x%x (x%x/x%x) Status x%x "
|
|
|
"Data: x%x x%x x%x x%x x%x x%x x%x x%x x%x x%x x%x"
|
|
|
" x%x x%x CQ: x%x x%x x%x x%x\n",
|
|
|
- mboxq->vport ? mboxq->vport->vpi : 0,
|
|
|
- mbx_cmnd, lpfc_sli4_mbox_opcode_get(phba, mboxq),
|
|
|
+ mboxq->vport ? mboxq->vport->vpi : 0, mbx_cmnd,
|
|
|
+ lpfc_sli_config_mbox_subsys_get(phba, mboxq),
|
|
|
+ lpfc_sli_config_mbox_opcode_get(phba, mboxq),
|
|
|
bf_get(lpfc_mqe_status, mb),
|
|
|
mb->un.mb_words[0], mb->un.mb_words[1],
|
|
|
mb->un.mb_words[2], mb->un.mb_words[3],
|
|
@@ -6796,11 +7000,12 @@ lpfc_sli_issue_mbox_s4(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq,
|
|
|
rc = lpfc_mbox_dev_check(phba);
|
|
|
if (unlikely(rc)) {
|
|
|
lpfc_printf_log(phba, KERN_ERR, LOG_MBOX | LOG_SLI,
|
|
|
- "(%d):2544 Mailbox command x%x (x%x) "
|
|
|
+ "(%d):2544 Mailbox command x%x (x%x/x%x) "
|
|
|
"cannot issue Data: x%x x%x\n",
|
|
|
mboxq->vport ? mboxq->vport->vpi : 0,
|
|
|
mboxq->u.mb.mbxCommand,
|
|
|
- lpfc_sli4_mbox_opcode_get(phba, mboxq),
|
|
|
+ lpfc_sli_config_mbox_subsys_get(phba, mboxq),
|
|
|
+ lpfc_sli_config_mbox_opcode_get(phba, mboxq),
|
|
|
psli->sli_flag, flag);
|
|
|
goto out_not_finished;
|
|
|
}
|
|
@@ -6814,20 +7019,25 @@ lpfc_sli_issue_mbox_s4(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq,
|
|
|
if (rc != MBX_SUCCESS)
|
|
|
lpfc_printf_log(phba, KERN_WARNING, LOG_MBOX | LOG_SLI,
|
|
|
"(%d):2541 Mailbox command x%x "
|
|
|
- "(x%x) cannot issue Data: x%x x%x\n",
|
|
|
+ "(x%x/x%x) cannot issue Data: "
|
|
|
+ "x%x x%x\n",
|
|
|
mboxq->vport ? mboxq->vport->vpi : 0,
|
|
|
mboxq->u.mb.mbxCommand,
|
|
|
- lpfc_sli4_mbox_opcode_get(phba, mboxq),
|
|
|
+ lpfc_sli_config_mbox_subsys_get(phba,
|
|
|
+ mboxq),
|
|
|
+ lpfc_sli_config_mbox_opcode_get(phba,
|
|
|
+ mboxq),
|
|
|
psli->sli_flag, flag);
|
|
|
return rc;
|
|
|
} else if (flag == MBX_POLL) {
|
|
|
lpfc_printf_log(phba, KERN_WARNING, LOG_MBOX | LOG_SLI,
|
|
|
"(%d):2542 Try to issue mailbox command "
|
|
|
- "x%x (x%x) synchronously ahead of async"
|
|
|
+ "x%x (x%x/x%x) synchronously ahead of async"
|
|
|
"mailbox command queue: x%x x%x\n",
|
|
|
mboxq->vport ? mboxq->vport->vpi : 0,
|
|
|
mboxq->u.mb.mbxCommand,
|
|
|
- lpfc_sli4_mbox_opcode_get(phba, mboxq),
|
|
|
+ lpfc_sli_config_mbox_subsys_get(phba, mboxq),
|
|
|
+ lpfc_sli_config_mbox_opcode_get(phba, mboxq),
|
|
|
psli->sli_flag, flag);
|
|
|
/* Try to block the asynchronous mailbox posting */
|
|
|
rc = lpfc_sli4_async_mbox_block(phba);
|
|
@@ -6836,16 +7046,18 @@ lpfc_sli_issue_mbox_s4(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq,
|
|
|
rc = lpfc_sli4_post_sync_mbox(phba, mboxq);
|
|
|
if (rc != MBX_SUCCESS)
|
|
|
lpfc_printf_log(phba, KERN_ERR,
|
|
|
- LOG_MBOX | LOG_SLI,
|
|
|
- "(%d):2597 Mailbox command "
|
|
|
- "x%x (x%x) cannot issue "
|
|
|
- "Data: x%x x%x\n",
|
|
|
- mboxq->vport ?
|
|
|
- mboxq->vport->vpi : 0,
|
|
|
- mboxq->u.mb.mbxCommand,
|
|
|
- lpfc_sli4_mbox_opcode_get(phba,
|
|
|
- mboxq),
|
|
|
- psli->sli_flag, flag);
|
|
|
+ LOG_MBOX | LOG_SLI,
|
|
|
+ "(%d):2597 Mailbox command "
|
|
|
+ "x%x (x%x/x%x) cannot issue "
|
|
|
+ "Data: x%x x%x\n",
|
|
|
+ mboxq->vport ?
|
|
|
+ mboxq->vport->vpi : 0,
|
|
|
+ mboxq->u.mb.mbxCommand,
|
|
|
+ lpfc_sli_config_mbox_subsys_get(phba,
|
|
|
+ mboxq),
|
|
|
+ lpfc_sli_config_mbox_opcode_get(phba,
|
|
|
+ mboxq),
|
|
|
+ psli->sli_flag, flag);
|
|
|
/* Unblock the async mailbox posting afterward */
|
|
|
lpfc_sli4_async_mbox_unblock(phba);
|
|
|
}
|
|
@@ -6856,11 +7068,12 @@ lpfc_sli_issue_mbox_s4(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq,
|
|
|
rc = lpfc_mbox_cmd_check(phba, mboxq);
|
|
|
if (rc) {
|
|
|
lpfc_printf_log(phba, KERN_ERR, LOG_MBOX | LOG_SLI,
|
|
|
- "(%d):2543 Mailbox command x%x (x%x) "
|
|
|
+ "(%d):2543 Mailbox command x%x (x%x/x%x) "
|
|
|
"cannot issue Data: x%x x%x\n",
|
|
|
mboxq->vport ? mboxq->vport->vpi : 0,
|
|
|
mboxq->u.mb.mbxCommand,
|
|
|
- lpfc_sli4_mbox_opcode_get(phba, mboxq),
|
|
|
+ lpfc_sli_config_mbox_subsys_get(phba, mboxq),
|
|
|
+ lpfc_sli_config_mbox_opcode_get(phba, mboxq),
|
|
|
psli->sli_flag, flag);
|
|
|
goto out_not_finished;
|
|
|
}
|
|
@@ -6872,10 +7085,11 @@ lpfc_sli_issue_mbox_s4(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq,
|
|
|
spin_unlock_irqrestore(&phba->hbalock, iflags);
|
|
|
lpfc_printf_log(phba, KERN_INFO, LOG_MBOX | LOG_SLI,
|
|
|
"(%d):0354 Mbox cmd issue - Enqueue Data: "
|
|
|
- "x%x (x%x) x%x x%x x%x\n",
|
|
|
+ "x%x (x%x/x%x) x%x x%x x%x\n",
|
|
|
mboxq->vport ? mboxq->vport->vpi : 0xffffff,
|
|
|
bf_get(lpfc_mqe_command, &mboxq->u.mqe),
|
|
|
- lpfc_sli4_mbox_opcode_get(phba, mboxq),
|
|
|
+ lpfc_sli_config_mbox_subsys_get(phba, mboxq),
|
|
|
+ lpfc_sli_config_mbox_opcode_get(phba, mboxq),
|
|
|
phba->pport->port_state,
|
|
|
psli->sli_flag, MBX_NOWAIT);
|
|
|
/* Wake up worker thread to transport mailbox command from head */
|
|
@@ -6952,13 +7166,14 @@ lpfc_sli4_post_async_mbox(struct lpfc_hba *phba)
|
|
|
|
|
|
/* Start timer for the mbox_tmo and log some mailbox post messages */
|
|
|
mod_timer(&psli->mbox_tmo, (jiffies +
|
|
|
- (HZ * lpfc_mbox_tmo_val(phba, mbx_cmnd))));
|
|
|
+ (HZ * lpfc_mbox_tmo_val(phba, mboxq))));
|
|
|
|
|
|
lpfc_printf_log(phba, KERN_INFO, LOG_MBOX | LOG_SLI,
|
|
|
- "(%d):0355 Mailbox cmd x%x (x%x) issue Data: "
|
|
|
+ "(%d):0355 Mailbox cmd x%x (x%x/x%x) issue Data: "
|
|
|
"x%x x%x\n",
|
|
|
mboxq->vport ? mboxq->vport->vpi : 0, mbx_cmnd,
|
|
|
- lpfc_sli4_mbox_opcode_get(phba, mboxq),
|
|
|
+ lpfc_sli_config_mbox_subsys_get(phba, mboxq),
|
|
|
+ lpfc_sli_config_mbox_opcode_get(phba, mboxq),
|
|
|
phba->pport->port_state, psli->sli_flag);
|
|
|
|
|
|
if (mbx_cmnd != MBX_HEARTBEAT) {
|
|
@@ -6982,11 +7197,12 @@ lpfc_sli4_post_async_mbox(struct lpfc_hba *phba)
|
|
|
rc = lpfc_sli4_mq_put(phba->sli4_hba.mbx_wq, mqe);
|
|
|
if (rc != MBX_SUCCESS) {
|
|
|
lpfc_printf_log(phba, KERN_ERR, LOG_MBOX | LOG_SLI,
|
|
|
- "(%d):2533 Mailbox command x%x (x%x) "
|
|
|
+ "(%d):2533 Mailbox command x%x (x%x/x%x) "
|
|
|
"cannot issue Data: x%x x%x\n",
|
|
|
mboxq->vport ? mboxq->vport->vpi : 0,
|
|
|
mboxq->u.mb.mbxCommand,
|
|
|
- lpfc_sli4_mbox_opcode_get(phba, mboxq),
|
|
|
+ lpfc_sli_config_mbox_subsys_get(phba, mboxq),
|
|
|
+ lpfc_sli_config_mbox_opcode_get(phba, mboxq),
|
|
|
psli->sli_flag, MBX_NOWAIT);
|
|
|
goto out_not_finished;
|
|
|
}
|
|
@@ -7322,6 +7538,8 @@ lpfc_sli4_bpl2sgl(struct lpfc_hba *phba, struct lpfc_iocbq *piocbq,
|
|
|
if (inbound == 1)
|
|
|
offset = 0;
|
|
|
bf_set(lpfc_sli4_sge_offset, sgl, offset);
|
|
|
+ bf_set(lpfc_sli4_sge_type, sgl,
|
|
|
+ LPFC_SGE_TYPE_DATA);
|
|
|
offset += bde.tus.f.bdeSize;
|
|
|
}
|
|
|
sgl->word2 = cpu_to_le32(sgl->word2);
|
|
@@ -9359,7 +9577,6 @@ lpfc_sli_issue_mbox_wait(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmboxq,
|
|
|
|
|
|
/* now issue the command */
|
|
|
retval = lpfc_sli_issue_mbox(phba, pmboxq, MBX_NOWAIT);
|
|
|
-
|
|
|
if (retval == MBX_BUSY || retval == MBX_SUCCESS) {
|
|
|
wait_event_interruptible_timeout(done_q,
|
|
|
pmboxq->mbox_flag & LPFC_MBX_WAKE,
|
|
@@ -9403,23 +9620,24 @@ void
|
|
|
lpfc_sli_mbox_sys_shutdown(struct lpfc_hba *phba)
|
|
|
{
|
|
|
struct lpfc_sli *psli = &phba->sli;
|
|
|
- uint8_t actcmd = MBX_HEARTBEAT;
|
|
|
unsigned long timeout;
|
|
|
|
|
|
+ timeout = msecs_to_jiffies(LPFC_MBOX_TMO * 1000) + jiffies;
|
|
|
spin_lock_irq(&phba->hbalock);
|
|
|
psli->sli_flag |= LPFC_SLI_ASYNC_MBX_BLK;
|
|
|
spin_unlock_irq(&phba->hbalock);
|
|
|
|
|
|
if (psli->sli_flag & LPFC_SLI_ACTIVE) {
|
|
|
spin_lock_irq(&phba->hbalock);
|
|
|
- if (phba->sli.mbox_active)
|
|
|
- actcmd = phba->sli.mbox_active->u.mb.mbxCommand;
|
|
|
- spin_unlock_irq(&phba->hbalock);
|
|
|
/* Determine how long we might wait for the active mailbox
|
|
|
* command to be gracefully completed by firmware.
|
|
|
*/
|
|
|
- timeout = msecs_to_jiffies(lpfc_mbox_tmo_val(phba, actcmd) *
|
|
|
- 1000) + jiffies;
|
|
|
+ if (phba->sli.mbox_active)
|
|
|
+ timeout = msecs_to_jiffies(lpfc_mbox_tmo_val(phba,
|
|
|
+ phba->sli.mbox_active) *
|
|
|
+ 1000) + jiffies;
|
|
|
+ spin_unlock_irq(&phba->hbalock);
|
|
|
+
|
|
|
while (phba->sli.mbox_active) {
|
|
|
/* Check active mailbox complete status every 2ms */
|
|
|
msleep(2);
|
|
@@ -10415,12 +10633,17 @@ lpfc_sli4_sp_handle_mbox_event(struct lpfc_hba *phba, struct lpfc_mcqe *mcqe)
|
|
|
/* Move mbox data to caller's mailbox region, do endian swapping */
|
|
|
if (pmb->mbox_cmpl && mbox)
|
|
|
lpfc_sli_pcimem_bcopy(mbox, mqe, sizeof(struct lpfc_mqe));
|
|
|
- /* Set the mailbox status with SLI4 range 0x4000 */
|
|
|
- mcqe_status = bf_get(lpfc_mcqe_status, mcqe);
|
|
|
- if (mcqe_status != MB_CQE_STATUS_SUCCESS)
|
|
|
- bf_set(lpfc_mqe_status, mqe,
|
|
|
- (LPFC_MBX_ERROR_RANGE | mcqe_status));
|
|
|
|
|
|
+ /*
|
|
|
+ * For mcqe errors, conditionally move a modified error code to
|
|
|
+ * the mbox so that the error will not be missed.
|
|
|
+ */
|
|
|
+ mcqe_status = bf_get(lpfc_mcqe_status, mcqe);
|
|
|
+ if (mcqe_status != MB_CQE_STATUS_SUCCESS) {
|
|
|
+ if (bf_get(lpfc_mqe_status, mqe) == MBX_SUCCESS)
|
|
|
+ bf_set(lpfc_mqe_status, mqe,
|
|
|
+ (LPFC_MBX_ERROR_RANGE | mcqe_status));
|
|
|
+ }
|
|
|
if (pmb->mbox_flag & LPFC_MBX_IMED_UNREG) {
|
|
|
pmb->mbox_flag &= ~LPFC_MBX_IMED_UNREG;
|
|
|
lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_MBOX_VPORT,
|
|
@@ -10796,7 +11019,7 @@ lpfc_sli4_sp_handle_eqe(struct lpfc_hba *phba, struct lpfc_eqe *eqe)
|
|
|
case LPFC_MCQ:
|
|
|
while ((cqe = lpfc_sli4_cq_get(cq))) {
|
|
|
workposted |= lpfc_sli4_sp_handle_mcqe(phba, cqe);
|
|
|
- if (!(++ecount % LPFC_GET_QE_REL_INT))
|
|
|
+ if (!(++ecount % cq->entry_repost))
|
|
|
lpfc_sli4_cq_release(cq, LPFC_QUEUE_NOARM);
|
|
|
}
|
|
|
break;
|
|
@@ -10808,7 +11031,7 @@ lpfc_sli4_sp_handle_eqe(struct lpfc_hba *phba, struct lpfc_eqe *eqe)
|
|
|
else
|
|
|
workposted |= lpfc_sli4_sp_handle_cqe(phba, cq,
|
|
|
cqe);
|
|
|
- if (!(++ecount % LPFC_GET_QE_REL_INT))
|
|
|
+ if (!(++ecount % cq->entry_repost))
|
|
|
lpfc_sli4_cq_release(cq, LPFC_QUEUE_NOARM);
|
|
|
}
|
|
|
break;
|
|
@@ -11040,7 +11263,7 @@ lpfc_sli4_fp_handle_eqe(struct lpfc_hba *phba, struct lpfc_eqe *eqe,
|
|
|
/* Process all the entries to the CQ */
|
|
|
while ((cqe = lpfc_sli4_cq_get(cq))) {
|
|
|
workposted |= lpfc_sli4_fp_handle_wcqe(phba, cq, cqe);
|
|
|
- if (!(++ecount % LPFC_GET_QE_REL_INT))
|
|
|
+ if (!(++ecount % cq->entry_repost))
|
|
|
lpfc_sli4_cq_release(cq, LPFC_QUEUE_NOARM);
|
|
|
}
|
|
|
|
|
@@ -11110,6 +11333,8 @@ lpfc_sli4_sp_intr_handler(int irq, void *dev_id)
|
|
|
|
|
|
/* Get to the EQ struct associated with this vector */
|
|
|
speq = phba->sli4_hba.sp_eq;
|
|
|
+ if (unlikely(!speq))
|
|
|
+ return IRQ_NONE;
|
|
|
|
|
|
/* Check device state for handling interrupt */
|
|
|
if (unlikely(lpfc_intr_state_check(phba))) {
|
|
@@ -11127,7 +11352,7 @@ lpfc_sli4_sp_intr_handler(int irq, void *dev_id)
|
|
|
*/
|
|
|
while ((eqe = lpfc_sli4_eq_get(speq))) {
|
|
|
lpfc_sli4_sp_handle_eqe(phba, eqe);
|
|
|
- if (!(++ecount % LPFC_GET_QE_REL_INT))
|
|
|
+ if (!(++ecount % speq->entry_repost))
|
|
|
lpfc_sli4_eq_release(speq, LPFC_QUEUE_NOARM);
|
|
|
}
|
|
|
|
|
@@ -11187,6 +11412,8 @@ lpfc_sli4_fp_intr_handler(int irq, void *dev_id)
|
|
|
|
|
|
if (unlikely(!phba))
|
|
|
return IRQ_NONE;
|
|
|
+ if (unlikely(!phba->sli4_hba.fp_eq))
|
|
|
+ return IRQ_NONE;
|
|
|
|
|
|
/* Get to the EQ struct associated with this vector */
|
|
|
fpeq = phba->sli4_hba.fp_eq[fcp_eqidx];
|
|
@@ -11207,7 +11434,7 @@ lpfc_sli4_fp_intr_handler(int irq, void *dev_id)
|
|
|
*/
|
|
|
while ((eqe = lpfc_sli4_eq_get(fpeq))) {
|
|
|
lpfc_sli4_fp_handle_eqe(phba, eqe, fcp_eqidx);
|
|
|
- if (!(++ecount % LPFC_GET_QE_REL_INT))
|
|
|
+ if (!(++ecount % fpeq->entry_repost))
|
|
|
lpfc_sli4_eq_release(fpeq, LPFC_QUEUE_NOARM);
|
|
|
}
|
|
|
|
|
@@ -11359,6 +11586,15 @@ lpfc_sli4_queue_alloc(struct lpfc_hba *phba, uint32_t entry_size,
|
|
|
}
|
|
|
queue->entry_size = entry_size;
|
|
|
queue->entry_count = entry_count;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * entry_repost is calculated based on the number of entries in the
|
|
|
+ * queue. This works out except for RQs. If buffers are NOT initially
|
|
|
+ * posted for every RQE, entry_repost should be adjusted accordingly.
|
|
|
+ */
|
|
|
+ queue->entry_repost = (entry_count >> 3);
|
|
|
+ if (queue->entry_repost < LPFC_QUEUE_MIN_REPOST)
|
|
|
+ queue->entry_repost = LPFC_QUEUE_MIN_REPOST;
|
|
|
queue->phba = phba;
|
|
|
|
|
|
return queue;
|
|
@@ -11923,6 +12159,31 @@ out:
|
|
|
return status;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * lpfc_rq_adjust_repost - Adjust entry_repost for an RQ
|
|
|
+ * @phba: HBA structure that indicates port to create a queue on.
|
|
|
+ * @rq: The queue structure to use for the receive queue.
|
|
|
+ * @qno: The associated HBQ number
|
|
|
+ *
|
|
|
+ *
|
|
|
+ * For SLI4 we need to adjust the RQ repost value based on
|
|
|
+ * the number of buffers that are initially posted to the RQ.
|
|
|
+ */
|
|
|
+void
|
|
|
+lpfc_rq_adjust_repost(struct lpfc_hba *phba, struct lpfc_queue *rq, int qno)
|
|
|
+{
|
|
|
+ uint32_t cnt;
|
|
|
+
|
|
|
+ cnt = lpfc_hbq_defs[qno]->entry_count;
|
|
|
+
|
|
|
+ /* Recalc repost for RQs based on buffers initially posted */
|
|
|
+ cnt = (cnt >> 3);
|
|
|
+ if (cnt < LPFC_QUEUE_MIN_REPOST)
|
|
|
+ cnt = LPFC_QUEUE_MIN_REPOST;
|
|
|
+
|
|
|
+ rq->entry_repost = cnt;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* lpfc_rq_create - Create a Receive Queue on the HBA
|
|
|
* @phba: HBA structure that indicates port to create a queue on.
|
|
@@ -12489,7 +12750,7 @@ lpfc_sli4_post_sgl(struct lpfc_hba *phba,
|
|
|
if (!phba->sli4_hba.intr_enable)
|
|
|
rc = lpfc_sli_issue_mbox(phba, mbox, MBX_POLL);
|
|
|
else {
|
|
|
- mbox_tmo = lpfc_mbox_tmo_val(phba, MBX_SLI4_CONFIG);
|
|
|
+ mbox_tmo = lpfc_mbox_tmo_val(phba, mbox);
|
|
|
rc = lpfc_sli_issue_mbox_wait(phba, mbox, mbox_tmo);
|
|
|
}
|
|
|
/* The IOCTL status is embedded in the mailbox subheader. */
|
|
@@ -12704,7 +12965,7 @@ lpfc_sli4_post_els_sgl_list(struct lpfc_hba *phba)
|
|
|
if (!phba->sli4_hba.intr_enable)
|
|
|
rc = lpfc_sli_issue_mbox(phba, mbox, MBX_POLL);
|
|
|
else {
|
|
|
- mbox_tmo = lpfc_mbox_tmo_val(phba, MBX_SLI4_CONFIG);
|
|
|
+ mbox_tmo = lpfc_mbox_tmo_val(phba, mbox);
|
|
|
rc = lpfc_sli_issue_mbox_wait(phba, mbox, mbox_tmo);
|
|
|
}
|
|
|
shdr = (union lpfc_sli4_cfg_shdr *) &sgl->cfg_shdr;
|
|
@@ -12867,7 +13128,7 @@ lpfc_sli4_post_els_sgl_list_ext(struct lpfc_hba *phba)
|
|
|
if (!phba->sli4_hba.intr_enable)
|
|
|
rc = lpfc_sli_issue_mbox(phba, mbox, MBX_POLL);
|
|
|
else {
|
|
|
- mbox_tmo = lpfc_mbox_tmo_val(phba, MBX_SLI4_CONFIG);
|
|
|
+ mbox_tmo = lpfc_mbox_tmo_val(phba, mbox);
|
|
|
rc = lpfc_sli_issue_mbox_wait(phba, mbox, mbox_tmo);
|
|
|
}
|
|
|
shdr = (union lpfc_sli4_cfg_shdr *) &sgl->cfg_shdr;
|
|
@@ -12991,7 +13252,7 @@ lpfc_sli4_post_scsi_sgl_block(struct lpfc_hba *phba, struct list_head *sblist,
|
|
|
if (!phba->sli4_hba.intr_enable)
|
|
|
rc = lpfc_sli_issue_mbox(phba, mbox, MBX_POLL);
|
|
|
else {
|
|
|
- mbox_tmo = lpfc_mbox_tmo_val(phba, MBX_SLI4_CONFIG);
|
|
|
+ mbox_tmo = lpfc_mbox_tmo_val(phba, mbox);
|
|
|
rc = lpfc_sli_issue_mbox_wait(phba, mbox, mbox_tmo);
|
|
|
}
|
|
|
shdr = (union lpfc_sli4_cfg_shdr *) &sgl->cfg_shdr;
|
|
@@ -13147,7 +13408,7 @@ lpfc_sli4_post_scsi_sgl_blk_ext(struct lpfc_hba *phba, struct list_head *sblist,
|
|
|
if (!phba->sli4_hba.intr_enable)
|
|
|
rc = lpfc_sli_issue_mbox(phba, mbox, MBX_POLL);
|
|
|
else {
|
|
|
- mbox_tmo = lpfc_mbox_tmo_val(phba, MBX_SLI4_CONFIG);
|
|
|
+ mbox_tmo = lpfc_mbox_tmo_val(phba, mbox);
|
|
|
rc = lpfc_sli_issue_mbox_wait(phba, mbox, mbox_tmo);
|
|
|
}
|
|
|
shdr = (union lpfc_sli4_cfg_shdr *) &sgl->cfg_shdr;
|
|
@@ -13296,7 +13557,8 @@ lpfc_fc_frame_to_vport(struct lpfc_hba *phba, struct fc_frame_header *fc_hdr,
|
|
|
uint32_t did = (fc_hdr->fh_d_id[0] << 16 |
|
|
|
fc_hdr->fh_d_id[1] << 8 |
|
|
|
fc_hdr->fh_d_id[2]);
|
|
|
-
|
|
|
+ if (did == Fabric_DID)
|
|
|
+ return phba->pport;
|
|
|
vports = lpfc_create_vport_work_array(phba);
|
|
|
if (vports != NULL)
|
|
|
for (i = 0; i <= phba->max_vpi && vports[i] != NULL; i++) {
|
|
@@ -14312,7 +14574,7 @@ lpfc_sli4_init_vpi(struct lpfc_vport *vport)
|
|
|
if (!mboxq)
|
|
|
return -ENOMEM;
|
|
|
lpfc_init_vpi(phba, mboxq, vport->vpi);
|
|
|
- mbox_tmo = lpfc_mbox_tmo_val(phba, MBX_INIT_VPI);
|
|
|
+ mbox_tmo = lpfc_mbox_tmo_val(phba, mboxq);
|
|
|
rc = lpfc_sli_issue_mbox_wait(phba, mboxq, mbox_tmo);
|
|
|
if (rc != MBX_SUCCESS) {
|
|
|
lpfc_printf_vlog(vport, KERN_ERR, LOG_SLI,
|
|
@@ -15188,7 +15450,7 @@ lpfc_wr_object(struct lpfc_hba *phba, struct list_head *dmabuf_list,
|
|
|
if (!phba->sli4_hba.intr_enable)
|
|
|
rc = lpfc_sli_issue_mbox(phba, mbox, MBX_POLL);
|
|
|
else {
|
|
|
- mbox_tmo = lpfc_mbox_tmo_val(phba, MBX_SLI4_CONFIG);
|
|
|
+ mbox_tmo = lpfc_mbox_tmo_val(phba, mbox);
|
|
|
rc = lpfc_sli_issue_mbox_wait(phba, mbox, mbox_tmo);
|
|
|
}
|
|
|
/* The IOCTL status is embedded in the mailbox subheader. */
|