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

Commit eb5329f4 authored by Prakash, Sathya's avatar Prakash, Sathya Committed by James Bottomley
Browse files

[SCSI] mpt fusion: Link speed change display support



When there is state change in FC links, a message is displayed with
old and new link speed.

signed-off-by: default avatarSathya Prakash <sathya.prakash@lsi.com>
Acked-by: default avatarEric Moore <Eric.Moore@lsi.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@SteelEye.com>
parent 56af97ae
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -698,6 +698,8 @@ typedef struct _MPT_ADAPTER

	struct work_struct	 fc_setup_reset_work;
	struct list_head	 fc_rports;
	struct work_struct	 fc_lsc_work;
	u8			 fc_link_speed[2];
	spinlock_t		 fc_rescan_work_lock;
	struct work_struct	 fc_rescan_work;
	char			 fc_rescan_work_q_name[KOBJ_NAME_LEN];
+66 −0
Original line number Diff line number Diff line
@@ -674,6 +674,50 @@ mptfc_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))
	return mptscsih_qcmd(SCpnt,done);
}

/*
 *	mptfc_display_port_link_speed - displaying link speed
 *	@ioc: Pointer to MPT_ADAPTER structure
 *	@portnum: IOC Port number
 *	@pp0dest: port page0 data payload
 *
 */
static void
mptfc_display_port_link_speed(MPT_ADAPTER *ioc, int portnum, FCPortPage0_t *pp0dest)
{
	u8	old_speed, new_speed, state;
	char	*old, *new;

	if (portnum >= 2)
		return;

	old_speed = ioc->fc_link_speed[portnum];
	new_speed = pp0dest->CurrentSpeed;
	state = pp0dest->PortState;

	if (state != MPI_FCPORTPAGE0_PORTSTATE_OFFLINE &&
	    new_speed != MPI_FCPORTPAGE0_CURRENT_SPEED_UKNOWN) {

		old = old_speed == MPI_FCPORTPAGE0_CURRENT_SPEED_1GBIT ? "1 Gbps" :
		       old_speed == MPI_FCPORTPAGE0_CURRENT_SPEED_2GBIT ? "2 Gbps" :
			old_speed == MPI_FCPORTPAGE0_CURRENT_SPEED_4GBIT ? "4 Gbps" :
			 "Unknown";
		new = new_speed == MPI_FCPORTPAGE0_CURRENT_SPEED_1GBIT ? "1 Gbps" :
		       new_speed == MPI_FCPORTPAGE0_CURRENT_SPEED_2GBIT ? "2 Gbps" :
			new_speed == MPI_FCPORTPAGE0_CURRENT_SPEED_4GBIT ? "4 Gbps" :
			 "Unknown";
		if (old_speed == 0)
			printk(MYIOC_s_NOTE_FMT
				"FC Link Established, Speed = %s\n",
				ioc->name, new);
		else if (old_speed != new_speed)
			printk(MYIOC_s_WARN_FMT
				"FC Link Speed Change, Old Speed = %s, New Speed = %s\n",
				ioc->name, old, new);

		ioc->fc_link_speed[portnum] = new_speed;
	}
}

/*
 *	mptfc_GetFcPortPage0 - Fetch FCPort config Page0.
 *	@ioc: Pointer to MPT_ADAPTER structure
@@ -773,6 +817,7 @@ mptfc_GetFcPortPage0(MPT_ADAPTER *ioc, int portnum)
							" complete.\n",
						ioc->name);
			}
			mptfc_display_port_link_speed(ioc, portnum, pp0dest);
		}

		pci_free_consistent(ioc->pcidev, data_sz, (u8 *) ppage0_alloc, page0_dma);
@@ -1022,6 +1067,18 @@ mptfc_init_host_attr(MPT_ADAPTER *ioc,int portnum)

}

static void
mptfc_link_status_change(struct work_struct *work)
{
	MPT_ADAPTER             *ioc =
		container_of(work, MPT_ADAPTER, fc_rescan_work);
	int ii;

	for (ii=0; ii < ioc->facts.NumberOfPorts; ii++)
		(void) mptfc_GetFcPortPage0(ioc, ii);

}

static void
mptfc_setup_reset(struct work_struct *work)
{
@@ -1163,6 +1220,7 @@ mptfc_probe(struct pci_dev *pdev, const struct pci_device_id *id)
	spin_lock_init(&ioc->fc_rescan_work_lock);
	INIT_WORK(&ioc->fc_rescan_work, mptfc_rescan_devices);
	INIT_WORK(&ioc->fc_setup_reset_work, mptfc_setup_reset);
	INIT_WORK(&ioc->fc_lsc_work, mptfc_link_status_change);

	spin_lock_irqsave(&ioc->FreeQlock, flags);

@@ -1337,6 +1395,14 @@ mptfc_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply)
		}
		spin_unlock_irqrestore(&ioc->fc_rescan_work_lock, flags);
		break;
	case MPI_EVENT_LINK_STATUS_CHANGE:
		spin_lock_irqsave(&ioc->fc_rescan_work_lock, flags);
		if (ioc->fc_rescan_work_q) {
			queue_work(ioc->fc_rescan_work_q,
				   &ioc->fc_lsc_work);
		}
		spin_unlock_irqrestore(&ioc->fc_rescan_work_lock, flags);
		break;
	default:
		rc = mptscsih_event_process(ioc,pEvReply);
		break;