[SCSI] lpfc: Remove RPI hash from the driver
Table was not providing a lot of value and injected a couple of errors. Removed it and made functionality inline. Signed-off-by: James Smart <James.Smart@emulex.com> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
This commit is contained in:
committed by
James Bottomley
parent
93a20f7445
commit
21568f5387
@@ -267,10 +267,6 @@ struct lpfc_hba {
|
|||||||
struct lpfc_nodelist fc_fcpnodev; /* nodelist entry for no device */
|
struct lpfc_nodelist fc_fcpnodev; /* nodelist entry for no device */
|
||||||
uint32_t nport_event_cnt; /* timestamp for nlplist entry */
|
uint32_t nport_event_cnt; /* timestamp for nlplist entry */
|
||||||
|
|
||||||
#define LPFC_RPI_HASH_SIZE 64
|
|
||||||
#define LPFC_RPI_HASH_FUNC(x) ((x) & (0x3f))
|
|
||||||
/* ptr to active D_ID / RPIs */
|
|
||||||
struct lpfc_nodelist *fc_nlplookup[LPFC_RPI_HASH_SIZE];
|
|
||||||
uint32_t wwnn[2];
|
uint32_t wwnn[2];
|
||||||
uint32_t RandomData[7];
|
uint32_t RandomData[7];
|
||||||
|
|
||||||
|
@@ -62,10 +62,6 @@ void lpfc_disc_timeout(unsigned long);
|
|||||||
void lpfc_scan_timeout(unsigned long);
|
void lpfc_scan_timeout(unsigned long);
|
||||||
|
|
||||||
struct lpfc_nodelist *lpfc_findnode_rpi(struct lpfc_hba * phba, uint16_t rpi);
|
struct lpfc_nodelist *lpfc_findnode_rpi(struct lpfc_hba * phba, uint16_t rpi);
|
||||||
struct lpfc_nodelist *lpfc_findnode_remove_rpi(struct lpfc_hba * phba,
|
|
||||||
uint16_t rpi);
|
|
||||||
void lpfc_addnode_rpi(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp,
|
|
||||||
uint16_t rpi);
|
|
||||||
|
|
||||||
int lpfc_workq_post_event(struct lpfc_hba *, void *, void *, uint32_t);
|
int lpfc_workq_post_event(struct lpfc_hba *, void *, void *, uint32_t);
|
||||||
int lpfc_do_work(void *);
|
int lpfc_do_work(void *);
|
||||||
|
@@ -70,7 +70,6 @@ struct lpfc_nodelist {
|
|||||||
struct timer_list nlp_tmofunc; /* Used for nodev tmo */
|
struct timer_list nlp_tmofunc; /* Used for nodev tmo */
|
||||||
struct fc_rport *rport; /* Corresponding FC transport
|
struct fc_rport *rport; /* Corresponding FC transport
|
||||||
port structure */
|
port structure */
|
||||||
struct lpfc_nodelist *nlp_rpi_hash_next;
|
|
||||||
struct lpfc_hba *nlp_phba;
|
struct lpfc_hba *nlp_phba;
|
||||||
struct lpfc_work_evt nodev_timeout_evt;
|
struct lpfc_work_evt nodev_timeout_evt;
|
||||||
struct lpfc_work_evt els_retry_evt;
|
struct lpfc_work_evt els_retry_evt;
|
||||||
|
@@ -890,10 +890,7 @@ lpfc_mbx_cmpl_fabric_reg_login(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmb)
|
|||||||
|
|
||||||
pmb->context1 = NULL;
|
pmb->context1 = NULL;
|
||||||
|
|
||||||
if (ndlp->nlp_rpi != 0)
|
|
||||||
lpfc_findnode_remove_rpi(phba, ndlp->nlp_rpi);
|
|
||||||
ndlp->nlp_rpi = mb->un.varWords[0];
|
ndlp->nlp_rpi = mb->un.varWords[0];
|
||||||
lpfc_addnode_rpi(phba, ndlp, ndlp->nlp_rpi);
|
|
||||||
ndlp->nlp_type |= NLP_FABRIC;
|
ndlp->nlp_type |= NLP_FABRIC;
|
||||||
ndlp->nlp_state = NLP_STE_UNMAPPED_NODE;
|
ndlp->nlp_state = NLP_STE_UNMAPPED_NODE;
|
||||||
lpfc_nlp_list(phba, ndlp, NLP_UNMAPPED_LIST);
|
lpfc_nlp_list(phba, ndlp, NLP_UNMAPPED_LIST);
|
||||||
@@ -981,10 +978,7 @@ lpfc_mbx_cmpl_ns_reg_login(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmb)
|
|||||||
|
|
||||||
pmb->context1 = NULL;
|
pmb->context1 = NULL;
|
||||||
|
|
||||||
if (ndlp->nlp_rpi != 0)
|
|
||||||
lpfc_findnode_remove_rpi(phba, ndlp->nlp_rpi);
|
|
||||||
ndlp->nlp_rpi = mb->un.varWords[0];
|
ndlp->nlp_rpi = mb->un.varWords[0];
|
||||||
lpfc_addnode_rpi(phba, ndlp, ndlp->nlp_rpi);
|
|
||||||
ndlp->nlp_type |= NLP_FABRIC;
|
ndlp->nlp_type |= NLP_FABRIC;
|
||||||
ndlp->nlp_state = NLP_STE_UNMAPPED_NODE;
|
ndlp->nlp_state = NLP_STE_UNMAPPED_NODE;
|
||||||
lpfc_nlp_list(phba, ndlp, NLP_UNMAPPED_LIST);
|
lpfc_nlp_list(phba, ndlp, NLP_UNMAPPED_LIST);
|
||||||
@@ -1488,7 +1482,6 @@ lpfc_unreg_rpi(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp)
|
|||||||
if (rc == MBX_NOT_FINISHED)
|
if (rc == MBX_NOT_FINISHED)
|
||||||
mempool_free( mbox, phba->mbox_mem_pool);
|
mempool_free( mbox, phba->mbox_mem_pool);
|
||||||
}
|
}
|
||||||
lpfc_findnode_remove_rpi(phba, ndlp->nlp_rpi);
|
|
||||||
lpfc_no_rpi(phba, ndlp);
|
lpfc_no_rpi(phba, ndlp);
|
||||||
ndlp->nlp_rpi = 0;
|
ndlp->nlp_rpi = 0;
|
||||||
return 1;
|
return 1;
|
||||||
@@ -2434,10 +2427,7 @@ lpfc_mbx_cmpl_fdmi_reg_login(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmb)
|
|||||||
|
|
||||||
pmb->context1 = NULL;
|
pmb->context1 = NULL;
|
||||||
|
|
||||||
if (ndlp->nlp_rpi != 0)
|
|
||||||
lpfc_findnode_remove_rpi(phba, ndlp->nlp_rpi);
|
|
||||||
ndlp->nlp_rpi = mb->un.varWords[0];
|
ndlp->nlp_rpi = mb->un.varWords[0];
|
||||||
lpfc_addnode_rpi(phba, ndlp, ndlp->nlp_rpi);
|
|
||||||
ndlp->nlp_type |= NLP_FABRIC;
|
ndlp->nlp_type |= NLP_FABRIC;
|
||||||
ndlp->nlp_state = NLP_STE_UNMAPPED_NODE;
|
ndlp->nlp_state = NLP_STE_UNMAPPED_NODE;
|
||||||
lpfc_nlp_list(phba, ndlp, NLP_UNMAPPED_LIST);
|
lpfc_nlp_list(phba, ndlp, NLP_UNMAPPED_LIST);
|
||||||
@@ -2463,75 +2453,28 @@ lpfc_mbx_cmpl_fdmi_reg_login(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmb)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This routine looks up the ndlp hash
|
* This routine looks up the ndlp lists
|
||||||
* table for the given RPI. If rpi found
|
* for the given RPI. If rpi found
|
||||||
* it return the node list pointer
|
* it return the node list pointer
|
||||||
* else return 0.
|
* else return NULL.
|
||||||
*/
|
*/
|
||||||
struct lpfc_nodelist *
|
struct lpfc_nodelist *
|
||||||
lpfc_findnode_rpi(struct lpfc_hba * phba, uint16_t rpi)
|
lpfc_findnode_rpi(struct lpfc_hba * phba, uint16_t rpi)
|
||||||
{
|
{
|
||||||
struct lpfc_nodelist *ret;
|
struct lpfc_nodelist *ndlp;
|
||||||
|
struct list_head * lists[]={&phba->fc_nlpunmap_list,
|
||||||
|
&phba->fc_nlpmap_list,
|
||||||
|
&phba->fc_plogi_list,
|
||||||
|
&phba->fc_adisc_list,
|
||||||
|
&phba->fc_reglogin_list};
|
||||||
|
int i;
|
||||||
|
|
||||||
ret = phba->fc_nlplookup[LPFC_RPI_HASH_FUNC(rpi)];
|
for (i = 0; i < ARRAY_SIZE(lists); i++ )
|
||||||
while ((ret != 0) && (ret->nlp_rpi != rpi)) {
|
list_for_each_entry(ndlp, lists[i], nlp_listp)
|
||||||
ret = ret->nlp_rpi_hash_next;
|
if (ndlp->nlp_rpi == rpi)
|
||||||
}
|
return (ndlp);
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
return NULL;
|
||||||
* This routine looks up the ndlp hash table for the
|
|
||||||
* given RPI. If rpi found it return the node list
|
|
||||||
* pointer else return 0 after deleting the entry
|
|
||||||
* from hash table.
|
|
||||||
*/
|
|
||||||
struct lpfc_nodelist *
|
|
||||||
lpfc_findnode_remove_rpi(struct lpfc_hba * phba, uint16_t rpi)
|
|
||||||
{
|
|
||||||
struct lpfc_nodelist *ret, *temp;;
|
|
||||||
|
|
||||||
ret = phba->fc_nlplookup[LPFC_RPI_HASH_FUNC(rpi)];
|
|
||||||
if (ret == 0)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
if (ret->nlp_rpi == rpi) {
|
|
||||||
phba->fc_nlplookup[LPFC_RPI_HASH_FUNC(rpi)] =
|
|
||||||
ret->nlp_rpi_hash_next;
|
|
||||||
ret->nlp_rpi_hash_next = NULL;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
while ((ret->nlp_rpi_hash_next != 0) &&
|
|
||||||
(ret->nlp_rpi_hash_next->nlp_rpi != rpi)) {
|
|
||||||
ret = ret->nlp_rpi_hash_next;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ret->nlp_rpi_hash_next != 0) {
|
|
||||||
temp = ret->nlp_rpi_hash_next;
|
|
||||||
ret->nlp_rpi_hash_next = temp->nlp_rpi_hash_next;
|
|
||||||
temp->nlp_rpi_hash_next = NULL;
|
|
||||||
return temp;
|
|
||||||
} else {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This routine adds the node list entry to the
|
|
||||||
* ndlp hash table.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
lpfc_addnode_rpi(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp,
|
|
||||||
uint16_t rpi)
|
|
||||||
{
|
|
||||||
|
|
||||||
uint32_t index;
|
|
||||||
|
|
||||||
index = LPFC_RPI_HASH_FUNC(rpi);
|
|
||||||
ndlp->nlp_rpi_hash_next = phba->fc_nlplookup[index];
|
|
||||||
phba->fc_nlplookup[index] = ndlp;
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@@ -1086,11 +1086,7 @@ lpfc_cmpl_reglogin_reglogin_issue(struct lpfc_hba * phba,
|
|||||||
return (ndlp->nlp_state);
|
return (ndlp->nlp_state);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ndlp->nlp_rpi != 0)
|
|
||||||
lpfc_findnode_remove_rpi(phba, ndlp->nlp_rpi);
|
|
||||||
|
|
||||||
ndlp->nlp_rpi = mb->un.varWords[0];
|
ndlp->nlp_rpi = mb->un.varWords[0];
|
||||||
lpfc_addnode_rpi(phba, ndlp, ndlp->nlp_rpi);
|
|
||||||
|
|
||||||
/* Only if we are not a fabric nport do we issue PRLI */
|
/* Only if we are not a fabric nport do we issue PRLI */
|
||||||
if (!(ndlp->nlp_type & NLP_FABRIC)) {
|
if (!(ndlp->nlp_type & NLP_FABRIC)) {
|
||||||
@@ -1593,12 +1589,7 @@ lpfc_cmpl_reglogin_npr_node(struct lpfc_hba * phba,
|
|||||||
pmb = (LPFC_MBOXQ_t *) arg;
|
pmb = (LPFC_MBOXQ_t *) arg;
|
||||||
mb = &pmb->mb;
|
mb = &pmb->mb;
|
||||||
|
|
||||||
/* save rpi */
|
|
||||||
if (ndlp->nlp_rpi != 0)
|
|
||||||
lpfc_findnode_remove_rpi(phba, ndlp->nlp_rpi);
|
|
||||||
|
|
||||||
ndlp->nlp_rpi = mb->un.varWords[0];
|
ndlp->nlp_rpi = mb->un.varWords[0];
|
||||||
lpfc_addnode_rpi(phba, ndlp, ndlp->nlp_rpi);
|
|
||||||
|
|
||||||
return (ndlp->nlp_state);
|
return (ndlp->nlp_state);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user