[SCSI] lpfc 8.3.28: Add support for ABTS failure handling
Add support for ABTS failure handling: - Add asynchronous ABTS notification event feature to driver (CR 124578) - Change driver message 3092 and 3116 to KERN_WARNING (CR 124768) - Alter the SCR ELS command to use the temporary RPI and the Destination DID for SLI4-FC (CR 126070) Signed-off-by: Alex Iannicelli <alex.iannicelli@emulex.com> Signed-off-by: James Smart <james.smart@emulex.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
This commit is contained in:

committed by
James Bottomley

parent
ff78d8f97c
commit
cb69f7decc
@@ -5352,6 +5352,73 @@ lpfc_findnode_wwpn(struct lpfc_vport *vport, struct lpfc_name *wwpn)
|
||||
return ndlp;
|
||||
}
|
||||
|
||||
/*
|
||||
* This routine looks up the ndlp lists for the given RPI. If the rpi
|
||||
* is found, the routine returns the node element list pointer else
|
||||
* return NULL.
|
||||
*/
|
||||
struct lpfc_nodelist *
|
||||
lpfc_findnode_rpi(struct lpfc_vport *vport, uint16_t rpi)
|
||||
{
|
||||
struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
|
||||
struct lpfc_nodelist *ndlp;
|
||||
|
||||
spin_lock_irq(shost->host_lock);
|
||||
ndlp = __lpfc_findnode_rpi(vport, rpi);
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
return ndlp;
|
||||
}
|
||||
|
||||
/**
|
||||
* lpfc_find_vport_by_vpid - Find a vport on a HBA through vport identifier
|
||||
* @phba: pointer to lpfc hba data structure.
|
||||
* @vpi: the physical host virtual N_Port identifier.
|
||||
*
|
||||
* This routine finds a vport on a HBA (referred by @phba) through a
|
||||
* @vpi. The function walks the HBA's vport list and returns the address
|
||||
* of the vport with the matching @vpi.
|
||||
*
|
||||
* Return code
|
||||
* NULL - No vport with the matching @vpi found
|
||||
* Otherwise - Address to the vport with the matching @vpi.
|
||||
**/
|
||||
struct lpfc_vport *
|
||||
lpfc_find_vport_by_vpid(struct lpfc_hba *phba, uint16_t vpi)
|
||||
{
|
||||
struct lpfc_vport *vport;
|
||||
unsigned long flags;
|
||||
int i = 0;
|
||||
|
||||
/* The physical ports are always vpi 0 - translate is unnecessary. */
|
||||
if (vpi > 0) {
|
||||
/*
|
||||
* Translate the physical vpi to the logical vpi. The
|
||||
* vport stores the logical vpi.
|
||||
*/
|
||||
for (i = 0; i < phba->max_vpi; i++) {
|
||||
if (vpi == phba->vpi_ids[i])
|
||||
break;
|
||||
}
|
||||
|
||||
if (i >= phba->max_vpi) {
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_ELS,
|
||||
"2936 Could not find Vport mapped "
|
||||
"to vpi %d\n", vpi);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&phba->hbalock, flags);
|
||||
list_for_each_entry(vport, &phba->port_list, listentry) {
|
||||
if (vport->vpi == i) {
|
||||
spin_unlock_irqrestore(&phba->hbalock, flags);
|
||||
return vport;
|
||||
}
|
||||
}
|
||||
spin_unlock_irqrestore(&phba->hbalock, flags);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void
|
||||
lpfc_nlp_init(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||
uint32_t did)
|
||||
|
Reference in New Issue
Block a user