Commit 75baf696 authored by James Smart's avatar James Smart Committed by James Bottomley

[SCSI] lpfc 8.3.14: PCI fixes and enhancements

- Allow enabling MSI-X intterupts with fewer vectors than requested
  by looking at the return value from pci_enable_msix.
- Implemented driver PCI AER error handling routines for supporting
  AER error recovering on SLI4 devices.
- Remove redundant SLI_ACTIVE checks
Signed-off-by: default avatarAlex Iannicelli <alex.iannicelli@emulex.com>
Signed-off-by: default avatarJames Smart <james.smart@emulex.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@suse.de>
parent c20c4267
...@@ -864,7 +864,6 @@ lpfc_get_hba_info(struct lpfc_hba *phba, ...@@ -864,7 +864,6 @@ lpfc_get_hba_info(struct lpfc_hba *phba,
uint32_t *mrpi, uint32_t *arpi, uint32_t *mrpi, uint32_t *arpi,
uint32_t *mvpi, uint32_t *avpi) uint32_t *mvpi, uint32_t *avpi)
{ {
struct lpfc_sli *psli = &phba->sli;
struct lpfc_mbx_read_config *rd_config; struct lpfc_mbx_read_config *rd_config;
LPFC_MBOXQ_t *pmboxq; LPFC_MBOXQ_t *pmboxq;
MAILBOX_t *pmb; MAILBOX_t *pmb;
...@@ -893,8 +892,7 @@ lpfc_get_hba_info(struct lpfc_hba *phba, ...@@ -893,8 +892,7 @@ lpfc_get_hba_info(struct lpfc_hba *phba,
pmb->mbxOwner = OWN_HOST; pmb->mbxOwner = OWN_HOST;
pmboxq->context1 = NULL; pmboxq->context1 = NULL;
if ((phba->pport->fc_flag & FC_OFFLINE_MODE) || if (phba->pport->fc_flag & FC_OFFLINE_MODE)
(!(psli->sli_flag & LPFC_SLI_ACTIVE)))
rc = MBX_NOT_FINISHED; rc = MBX_NOT_FINISHED;
else else
rc = lpfc_sli_issue_mbox_wait(phba, pmboxq, phba->fc_ratov * 2); rc = lpfc_sli_issue_mbox_wait(phba, pmboxq, phba->fc_ratov * 2);
...@@ -2943,9 +2941,6 @@ lpfc_aer_support_store(struct device *dev, struct device_attribute *attr, ...@@ -2943,9 +2941,6 @@ lpfc_aer_support_store(struct device *dev, struct device_attribute *attr,
struct lpfc_hba *phba = vport->phba; struct lpfc_hba *phba = vport->phba;
int val = 0, rc = -EINVAL; int val = 0, rc = -EINVAL;
/* AER not supported on OC devices yet */
if (phba->pci_dev_grp == LPFC_PCI_DEV_OC)
return -EPERM;
if (!isdigit(buf[0])) if (!isdigit(buf[0]))
return -EINVAL; return -EINVAL;
if (sscanf(buf, "%i", &val) != 1) if (sscanf(buf, "%i", &val) != 1)
...@@ -3018,12 +3013,6 @@ lpfc_param_show(aer_support) ...@@ -3018,12 +3013,6 @@ lpfc_param_show(aer_support)
static int static int
lpfc_aer_support_init(struct lpfc_hba *phba, int val) lpfc_aer_support_init(struct lpfc_hba *phba, int val)
{ {
/* AER not supported on OC devices yet */
if (phba->pci_dev_grp == LPFC_PCI_DEV_OC) {
phba->cfg_aer_support = 0;
return -EPERM;
}
if (val == 0 || val == 1) { if (val == 0 || val == 1) {
phba->cfg_aer_support = val; phba->cfg_aer_support = val;
return 0; return 0;
...@@ -3068,9 +3057,6 @@ lpfc_aer_cleanup_state(struct device *dev, struct device_attribute *attr, ...@@ -3068,9 +3057,6 @@ lpfc_aer_cleanup_state(struct device *dev, struct device_attribute *attr,
struct lpfc_hba *phba = vport->phba; struct lpfc_hba *phba = vport->phba;
int val, rc = -1; int val, rc = -1;
/* AER not supported on OC devices yet */
if (phba->pci_dev_grp == LPFC_PCI_DEV_OC)
return -EPERM;
if (!isdigit(buf[0])) if (!isdigit(buf[0]))
return -EINVAL; return -EINVAL;
if (sscanf(buf, "%i", &val) != 1) if (sscanf(buf, "%i", &val) != 1)
...@@ -4099,8 +4085,7 @@ lpfc_get_stats(struct Scsi_Host *shost) ...@@ -4099,8 +4085,7 @@ lpfc_get_stats(struct Scsi_Host *shost)
pmboxq->context1 = NULL; pmboxq->context1 = NULL;
pmboxq->vport = vport; pmboxq->vport = vport;
if ((vport->fc_flag & FC_OFFLINE_MODE) || if (vport->fc_flag & FC_OFFLINE_MODE)
(!(psli->sli_flag & LPFC_SLI_ACTIVE)))
rc = lpfc_sli_issue_mbox(phba, pmboxq, MBX_POLL); rc = lpfc_sli_issue_mbox(phba, pmboxq, MBX_POLL);
else else
rc = lpfc_sli_issue_mbox_wait(phba, pmboxq, phba->fc_ratov * 2); rc = lpfc_sli_issue_mbox_wait(phba, pmboxq, phba->fc_ratov * 2);
...@@ -4124,8 +4109,7 @@ lpfc_get_stats(struct Scsi_Host *shost) ...@@ -4124,8 +4109,7 @@ lpfc_get_stats(struct Scsi_Host *shost)
pmboxq->context1 = NULL; pmboxq->context1 = NULL;
pmboxq->vport = vport; pmboxq->vport = vport;
if ((vport->fc_flag & FC_OFFLINE_MODE) || if (vport->fc_flag & FC_OFFLINE_MODE)
(!(psli->sli_flag & LPFC_SLI_ACTIVE)))
rc = lpfc_sli_issue_mbox(phba, pmboxq, MBX_POLL); rc = lpfc_sli_issue_mbox(phba, pmboxq, MBX_POLL);
else else
rc = lpfc_sli_issue_mbox_wait(phba, pmboxq, phba->fc_ratov * 2); rc = lpfc_sli_issue_mbox_wait(phba, pmboxq, phba->fc_ratov * 2);
......
This diff is collapsed.
...@@ -2295,15 +2295,21 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pIocbIn, ...@@ -2295,15 +2295,21 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pIocbIn,
struct lpfc_vport *vport = pIocbIn->vport; struct lpfc_vport *vport = pIocbIn->vport;
struct lpfc_rport_data *rdata = lpfc_cmd->rdata; struct lpfc_rport_data *rdata = lpfc_cmd->rdata;
struct lpfc_nodelist *pnode = rdata->pnode; struct lpfc_nodelist *pnode = rdata->pnode;
struct scsi_cmnd *cmd = lpfc_cmd->pCmd; struct scsi_cmnd *cmd;
int result; int result;
struct scsi_device *tmp_sdev; struct scsi_device *tmp_sdev;
int depth; int depth;
unsigned long flags; unsigned long flags;
struct lpfc_fast_path_event *fast_path_evt; struct lpfc_fast_path_event *fast_path_evt;
struct Scsi_Host *shost = cmd->device->host; struct Scsi_Host *shost;
uint32_t queue_depth, scsi_id; uint32_t queue_depth, scsi_id;
/* Sanity check on return of outstanding command */
if (!(lpfc_cmd->pCmd))
return;
cmd = lpfc_cmd->pCmd;
shost = cmd->device->host;
lpfc_cmd->result = pIocbOut->iocb.un.ulpWord[4]; lpfc_cmd->result = pIocbOut->iocb.un.ulpWord[4];
lpfc_cmd->status = pIocbOut->iocb.ulpStatus; lpfc_cmd->status = pIocbOut->iocb.ulpStatus;
/* pick up SLI4 exhange busy status from HBA */ /* pick up SLI4 exhange busy status from HBA */
......
...@@ -3593,13 +3593,16 @@ static int ...@@ -3593,13 +3593,16 @@ static int
lpfc_sli_brdrestart_s4(struct lpfc_hba *phba) lpfc_sli_brdrestart_s4(struct lpfc_hba *phba)
{ {
struct lpfc_sli *psli = &phba->sli; struct lpfc_sli *psli = &phba->sli;
uint32_t hba_aer_enabled;
/* Restart HBA */ /* Restart HBA */
lpfc_printf_log(phba, KERN_INFO, LOG_SLI, lpfc_printf_log(phba, KERN_INFO, LOG_SLI,
"0296 Restart HBA Data: x%x x%x\n", "0296 Restart HBA Data: x%x x%x\n",
phba->pport->port_state, psli->sli_flag); phba->pport->port_state, psli->sli_flag);
/* Take PCIe device Advanced Error Reporting (AER) state */
hba_aer_enabled = phba->hba_flag & HBA_AER_ENABLED;
lpfc_sli4_brdreset(phba); lpfc_sli4_brdreset(phba);
spin_lock_irq(&phba->hbalock); spin_lock_irq(&phba->hbalock);
...@@ -3611,6 +3614,10 @@ lpfc_sli_brdrestart_s4(struct lpfc_hba *phba) ...@@ -3611,6 +3614,10 @@ lpfc_sli_brdrestart_s4(struct lpfc_hba *phba)
memset(&psli->lnk_stat_offsets, 0, sizeof(psli->lnk_stat_offsets)); memset(&psli->lnk_stat_offsets, 0, sizeof(psli->lnk_stat_offsets));
psli->stats_start = get_seconds(); psli->stats_start = get_seconds();
/* Reset HBA AER if it was enabled, note hba_flag was reset above */
if (hba_aer_enabled)
pci_disable_pcie_error_reporting(phba->pcidev);
lpfc_hba_down_post(phba); lpfc_hba_down_post(phba);
return 0; return 0;
...@@ -4554,6 +4561,24 @@ lpfc_sli4_hba_setup(struct lpfc_hba *phba) ...@@ -4554,6 +4561,24 @@ lpfc_sli4_hba_setup(struct lpfc_hba *phba)
/* Start error attention (ERATT) polling timer */ /* Start error attention (ERATT) polling timer */
mod_timer(&phba->eratt_poll, jiffies + HZ * LPFC_ERATT_POLL_INTERVAL); mod_timer(&phba->eratt_poll, jiffies + HZ * LPFC_ERATT_POLL_INTERVAL);
/* Enable PCIe device Advanced Error Reporting (AER) if configured */
if (phba->cfg_aer_support == 1 && !(phba->hba_flag & HBA_AER_ENABLED)) {
rc = pci_enable_pcie_error_reporting(phba->pcidev);
if (!rc) {
lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
"2829 This device supports "
"Advanced Error Reporting (AER)\n");
spin_lock_irq(&phba->hbalock);
phba->hba_flag |= HBA_AER_ENABLED;
spin_unlock_irq(&phba->hbalock);
} else {
lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
"2830 This device does not support "
"Advanced Error Reporting (AER)\n");
phba->cfg_aer_support = 0;
}
}
/* /*
* The port is ready, set the host's link state to LINK_DOWN * The port is ready, set the host's link state to LINK_DOWN
* in preparation for link interrupts. * in preparation for link interrupts.
...@@ -9089,9 +9114,10 @@ lpfc_sli4_sp_handle_eqe(struct lpfc_hba *phba, struct lpfc_eqe *eqe) ...@@ -9089,9 +9114,10 @@ lpfc_sli4_sp_handle_eqe(struct lpfc_hba *phba, struct lpfc_eqe *eqe)
} }
} }
if (unlikely(!cq)) { if (unlikely(!cq)) {
if (phba->sli.sli_flag & LPFC_SLI_ACTIVE)
lpfc_printf_log(phba, KERN_ERR, LOG_SLI, lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
"0365 Slow-path CQ identifier (%d) does " "0365 Slow-path CQ identifier "
"not exist\n", cqid); "(%d) does not exist\n", cqid);
return; return;
} }
...@@ -9321,9 +9347,10 @@ lpfc_sli4_fp_handle_eqe(struct lpfc_hba *phba, struct lpfc_eqe *eqe, ...@@ -9321,9 +9347,10 @@ lpfc_sli4_fp_handle_eqe(struct lpfc_hba *phba, struct lpfc_eqe *eqe,
cq = phba->sli4_hba.fcp_cq[fcp_cqidx]; cq = phba->sli4_hba.fcp_cq[fcp_cqidx];
if (unlikely(!cq)) { if (unlikely(!cq)) {
if (phba->sli.sli_flag & LPFC_SLI_ACTIVE)
lpfc_printf_log(phba, KERN_ERR, LOG_SLI, lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
"0367 Fast-path completion queue does not " "0367 Fast-path completion queue "
"exist\n"); "does not exist\n");
return; return;
} }
......
...@@ -382,6 +382,7 @@ struct lpfc_sli4_hba { ...@@ -382,6 +382,7 @@ struct lpfc_sli4_hba {
struct lpfc_pc_sli4_params pc_sli4_params; struct lpfc_pc_sli4_params pc_sli4_params;
struct msix_entry *msix_entries; struct msix_entry *msix_entries;
uint32_t cfg_eqn; uint32_t cfg_eqn;
uint32_t msix_vec_nr;
struct lpfc_fcp_eq_hdl *fcp_eq_hdl; /* FCP per-WQ handle */ struct lpfc_fcp_eq_hdl *fcp_eq_hdl; /* FCP per-WQ handle */
/* Pointers to the constructed SLI4 queues */ /* Pointers to the constructed SLI4 queues */
struct lpfc_queue **fp_eq; /* Fast-path event queue */ struct lpfc_queue **fp_eq; /* Fast-path event queue */
......
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