Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7054a606 authored by James Smart's avatar James Smart Committed by James Bottomley
Browse files

[SCSI] lpfc 8.1.12 : Round 2 of Miscellaneous fixes



Round 2 of Miscellaneous fixes:
 - Ensure we don't prematurely re-enable IRQs in lpfc_sli_abort_fcp_cmpl().
 - Prevent freeing of iocb after IOCB_TIMEDOUT error.
 - Added code to cleanup REG_LOGIN mailbox command when a LOGO is received.
 - Fix offline window where more work can sneak in after clearing work_ha
 - Use target reset instead of LU reset in bus_device_reset_handler
 - Fixed system hangs due to leaked host_lock.
 - Fixed NULL pointer dereference during I/O with LIP.
 - Fixed false iocb timeout.
 - Fixed name server query response handling.
 - Change rport dev_loss_tmo value when user change lpfc HBA's dev_loss_tmo.
 - Fixed a memory leak in lpfc_sli_wake_mbox_wait.
 - Fixed check for dropped frames.
 - Removed hba queue depth calculation based on device PCI IDs
 - Change min cr_count value specified in comment to agree with setting

Signed-off-by: default avatarJames Smart <James.Smart@emulex.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@SteelEye.com>
parent de0c5b32
Loading
Loading
Loading
Loading
+0 −4
Original line number Diff line number Diff line
@@ -27,10 +27,6 @@ struct lpfc_sli2_slim;
					   requests */
#define LPFC_MAX_NS_RETRY	3	/* Number of retry attempts to contact
					   the NameServer  before giving up. */
#define LPFC_DFT_HBA_Q_DEPTH	2048	/* max cmds per hba */
#define LPFC_LC_HBA_Q_DEPTH	1024	/* max cmds per low cost hba */
#define LPFC_LP101_HBA_Q_DEPTH	128	/* max cmds per low cost hba */

#define LPFC_CMD_PER_LUN	3	/* max outstanding cmds per lun */
#define LPFC_SG_SEG_CNT		64	/* sg element count per scsi cmnd */
#define LPFC_IOCB_LIST_CNT	2250	/* list of IOCBs for fast-path usage. */
+16 −19
Original line number Diff line number Diff line
@@ -828,6 +828,18 @@ lpfc_nodev_tmo_init(struct lpfc_hba *phba, int val)
	return -EINVAL;
}

static void
lpfc_update_rport_devloss_tmo(struct lpfc_hba *phba)
{
	struct lpfc_nodelist  *ndlp;

	spin_lock_irq(phba->host->host_lock);
	list_for_each_entry(ndlp, &phba->fc_nodes, nlp_listp)
		if (ndlp->rport)
			ndlp->rport->dev_loss_tmo = phba->cfg_devloss_tmo;
	spin_unlock_irq(phba->host->host_lock);
}

static int
lpfc_nodev_tmo_set(struct lpfc_hba *phba, int val)
{
@@ -843,6 +855,7 @@ lpfc_nodev_tmo_set(struct lpfc_hba *phba, int val)
	if (val >= LPFC_MIN_DEVLOSS_TMO && val <= LPFC_MAX_DEVLOSS_TMO) {
		phba->cfg_nodev_tmo = val;
		phba->cfg_devloss_tmo = val;
		lpfc_update_rport_devloss_tmo(phba);
		return 0;
	}

@@ -878,6 +891,7 @@ lpfc_devloss_tmo_set(struct lpfc_hba *phba, int val)
		phba->cfg_nodev_tmo = val;
		phba->cfg_devloss_tmo = val;
		phba->dev_loss_tmo_changed = 1;
		lpfc_update_rport_devloss_tmo(phba);
		return 0;
	}

@@ -997,7 +1011,7 @@ LPFC_ATTR_R(ack0, 0, 0, 1, "Enable ACK0 support");
/*
# lpfc_cr_delay & lpfc_cr_count: Default values for I/O colaesing
# cr_delay (msec) or cr_count outstanding commands. cr_delay can take
# value [0,63]. cr_count can take value [0,255]. Default value of cr_delay
# value [0,63]. cr_count can take value [1,255]. Default value of cr_delay
# is 0. Default value of cr_count is 1. The cr_count feature is disabled if
# cr_delay is set to 0.
*/
@@ -1955,24 +1969,7 @@ lpfc_get_cfgparam(struct lpfc_hba *phba)
			sizeof(struct fcp_rsp) +
			(phba->cfg_sg_seg_cnt * sizeof(struct ulp_bde64));

	switch (phba->pcidev->device) {
	case PCI_DEVICE_ID_LP101:
	case PCI_DEVICE_ID_BSMB:
	case PCI_DEVICE_ID_ZSMB:
		phba->cfg_hba_queue_depth = LPFC_LP101_HBA_Q_DEPTH;
		break;
	case PCI_DEVICE_ID_RFLY:
	case PCI_DEVICE_ID_PFLY:
	case PCI_DEVICE_ID_BMID:
	case PCI_DEVICE_ID_ZMID:
	case PCI_DEVICE_ID_TFLY:
		phba->cfg_hba_queue_depth = LPFC_LC_HBA_Q_DEPTH;
		break;
	default:
		phba->cfg_hba_queue_depth = LPFC_DFT_HBA_Q_DEPTH;
	}

	if (phba->cfg_hba_queue_depth > lpfc_hba_queue_depth)
	lpfc_hba_queue_depth_init(phba, lpfc_hba_queue_depth);

	return;
+3 −3
Original line number Diff line number Diff line
@@ -334,22 +334,22 @@ lpfc_ns_rsp(struct lpfc_hba * phba, struct lpfc_dmabuf * mp, uint32_t Size)

	lpfc_set_disctmo(phba);

	Cnt = Size  > FCELSSIZE ? FCELSSIZE : Size;

	list_add_tail(&head, &mp->list);
	list_for_each_entry_safe(mp, next_mp, &head, list) {
		mlast = mp;

		Cnt = Size  > FCELSSIZE ? FCELSSIZE : Size;

		Size -= Cnt;

		if (!ctptr) {
			Cnt = FCELSSIZE;
			ctptr = (uint32_t *) mlast->virt;
		} else
			Cnt -= 16;	/* subtract length of CT header */

		/* Loop through entire NameServer list of DIDs */
		while (Cnt) {
		while (Cnt >= sizeof (uint32_t)) {

			/* Get next DID from NameServer List */
			CTentry = *ctptr++;
+8 −4
Original line number Diff line number Diff line
@@ -3214,7 +3214,7 @@ lpfc_els_timeout_handler(struct lpfc_hba *phba)
	IOCB_t *cmd = NULL;
	struct lpfc_dmabuf *pcmd;
	uint32_t *elscmd;
	uint32_t els_command;
	uint32_t els_command=0;
	uint32_t timeout;
	uint32_t remote_ID;

@@ -3233,12 +3233,16 @@ lpfc_els_timeout_handler(struct lpfc_hba *phba)
	list_for_each_entry_safe(piocb, tmp_iocb, &pring->txcmplq, list) {
		cmd = &piocb->iocb;

		if (piocb->iocb_flag & LPFC_IO_LIBDFC) {
		if ((piocb->iocb_flag & LPFC_IO_LIBDFC) ||
			(piocb->iocb.ulpCommand == CMD_ABORT_XRI_CN) ||
			(piocb->iocb.ulpCommand == CMD_CLOSE_XRI_CN)) {
			continue;
		}
		pcmd = (struct lpfc_dmabuf *) piocb->context2;
		if (pcmd) {
			elscmd = (uint32_t *) (pcmd->virt);
			els_command = *elscmd;
		}

		if ((els_command == ELS_CMD_FARP)
		    || (els_command == ELS_CMD_FARPR)) {
+2 −2
Original line number Diff line number Diff line
@@ -1375,8 +1375,6 @@ lpfc_offline(struct lpfc_hba * phba)

	/* stop all timers associated with this hba */
	lpfc_stop_timer(phba);
	phba->work_hba_events = 0;
	phba->work_ha = 0;

	lpfc_printf_log(phba,
		       KERN_WARNING,
@@ -1389,6 +1387,8 @@ lpfc_offline(struct lpfc_hba * phba)
	lpfc_sli_hba_down(phba);
	lpfc_cleanup(phba);
	spin_lock_irqsave(phba->host->host_lock, iflag);
	phba->work_hba_events = 0;
	phba->work_ha = 0;
	phba->fc_flag |= FC_OFFLINE_MODE;
	spin_unlock_irqrestore(phba->host->host_lock, iflag);
}
Loading