diff options
Diffstat (limited to 'drivers/scsi/lpfc')
-rw-r--r-- | drivers/scsi/lpfc/lpfc.h | 4 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_crtn.h | 4 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_disc.h | 1 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_hbadisc.c | 87 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_nportdisc.c | 9 |
5 files changed, 15 insertions, 90 deletions
diff --git a/drivers/scsi/lpfc/lpfc.h b/drivers/scsi/lpfc/lpfc.h index adb95674823f..3062b39fbdb9 100644 --- a/drivers/scsi/lpfc/lpfc.h +++ b/drivers/scsi/lpfc/lpfc.h | |||
@@ -267,10 +267,6 @@ struct lpfc_hba { | |||
267 | struct lpfc_nodelist fc_fcpnodev; /* nodelist entry for no device */ | 267 | struct lpfc_nodelist fc_fcpnodev; /* nodelist entry for no device */ |
268 | uint32_t nport_event_cnt; /* timestamp for nlplist entry */ | 268 | uint32_t nport_event_cnt; /* timestamp for nlplist entry */ |
269 | 269 | ||
270 | #define LPFC_RPI_HASH_SIZE 64 | ||
271 | #define LPFC_RPI_HASH_FUNC(x) ((x) & (0x3f)) | ||
272 | /* ptr to active D_ID / RPIs */ | ||
273 | struct lpfc_nodelist *fc_nlplookup[LPFC_RPI_HASH_SIZE]; | ||
274 | uint32_t wwnn[2]; | 270 | uint32_t wwnn[2]; |
275 | uint32_t RandomData[7]; | 271 | uint32_t RandomData[7]; |
276 | 272 | ||
diff --git a/drivers/scsi/lpfc/lpfc_crtn.h b/drivers/scsi/lpfc/lpfc_crtn.h index bd5135d3eee4..ffc58f9a5a59 100644 --- a/drivers/scsi/lpfc/lpfc_crtn.h +++ b/drivers/scsi/lpfc/lpfc_crtn.h | |||
@@ -62,10 +62,6 @@ void lpfc_disc_timeout(unsigned long); | |||
62 | void lpfc_scan_timeout(unsigned long); | 62 | void lpfc_scan_timeout(unsigned long); |
63 | 63 | ||
64 | struct lpfc_nodelist *lpfc_findnode_rpi(struct lpfc_hba * phba, uint16_t rpi); | 64 | struct lpfc_nodelist *lpfc_findnode_rpi(struct lpfc_hba * phba, uint16_t rpi); |
65 | struct lpfc_nodelist *lpfc_findnode_remove_rpi(struct lpfc_hba * phba, | ||
66 | uint16_t rpi); | ||
67 | void lpfc_addnode_rpi(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, | ||
68 | uint16_t rpi); | ||
69 | 65 | ||
70 | int lpfc_workq_post_event(struct lpfc_hba *, void *, void *, uint32_t); | 66 | int lpfc_workq_post_event(struct lpfc_hba *, void *, void *, uint32_t); |
71 | int lpfc_do_work(void *); | 67 | int lpfc_do_work(void *); |
diff --git a/drivers/scsi/lpfc/lpfc_disc.h b/drivers/scsi/lpfc/lpfc_disc.h index 098b8b45c7f1..084e7628ce17 100644 --- a/drivers/scsi/lpfc/lpfc_disc.h +++ b/drivers/scsi/lpfc/lpfc_disc.h | |||
@@ -70,7 +70,6 @@ struct lpfc_nodelist { | |||
70 | struct timer_list nlp_tmofunc; /* Used for nodev tmo */ | 70 | struct timer_list nlp_tmofunc; /* Used for nodev tmo */ |
71 | struct fc_rport *rport; /* Corresponding FC transport | 71 | struct fc_rport *rport; /* Corresponding FC transport |
72 | port structure */ | 72 | port structure */ |
73 | struct lpfc_nodelist *nlp_rpi_hash_next; | ||
74 | struct lpfc_hba *nlp_phba; | 73 | struct lpfc_hba *nlp_phba; |
75 | struct lpfc_work_evt nodev_timeout_evt; | 74 | struct lpfc_work_evt nodev_timeout_evt; |
76 | struct lpfc_work_evt els_retry_evt; | 75 | struct lpfc_work_evt els_retry_evt; |
diff --git a/drivers/scsi/lpfc/lpfc_hbadisc.c b/drivers/scsi/lpfc/lpfc_hbadisc.c index 6c846ad373bc..cd06d4c471ac 100644 --- a/drivers/scsi/lpfc/lpfc_hbadisc.c +++ b/drivers/scsi/lpfc/lpfc_hbadisc.c | |||
@@ -890,10 +890,7 @@ lpfc_mbx_cmpl_fabric_reg_login(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmb) | |||
890 | 890 | ||
891 | pmb->context1 = NULL; | 891 | pmb->context1 = NULL; |
892 | 892 | ||
893 | if (ndlp->nlp_rpi != 0) | ||
894 | lpfc_findnode_remove_rpi(phba, ndlp->nlp_rpi); | ||
895 | ndlp->nlp_rpi = mb->un.varWords[0]; | 893 | ndlp->nlp_rpi = mb->un.varWords[0]; |
896 | lpfc_addnode_rpi(phba, ndlp, ndlp->nlp_rpi); | ||
897 | ndlp->nlp_type |= NLP_FABRIC; | 894 | ndlp->nlp_type |= NLP_FABRIC; |
898 | ndlp->nlp_state = NLP_STE_UNMAPPED_NODE; | 895 | ndlp->nlp_state = NLP_STE_UNMAPPED_NODE; |
899 | lpfc_nlp_list(phba, ndlp, NLP_UNMAPPED_LIST); | 896 | 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) | |||
981 | 978 | ||
982 | pmb->context1 = NULL; | 979 | pmb->context1 = NULL; |
983 | 980 | ||
984 | if (ndlp->nlp_rpi != 0) | ||
985 | lpfc_findnode_remove_rpi(phba, ndlp->nlp_rpi); | ||
986 | ndlp->nlp_rpi = mb->un.varWords[0]; | 981 | ndlp->nlp_rpi = mb->un.varWords[0]; |
987 | lpfc_addnode_rpi(phba, ndlp, ndlp->nlp_rpi); | ||
988 | ndlp->nlp_type |= NLP_FABRIC; | 982 | ndlp->nlp_type |= NLP_FABRIC; |
989 | ndlp->nlp_state = NLP_STE_UNMAPPED_NODE; | 983 | ndlp->nlp_state = NLP_STE_UNMAPPED_NODE; |
990 | lpfc_nlp_list(phba, ndlp, NLP_UNMAPPED_LIST); | 984 | lpfc_nlp_list(phba, ndlp, NLP_UNMAPPED_LIST); |
@@ -1488,7 +1482,6 @@ lpfc_unreg_rpi(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp) | |||
1488 | if (rc == MBX_NOT_FINISHED) | 1482 | if (rc == MBX_NOT_FINISHED) |
1489 | mempool_free( mbox, phba->mbox_mem_pool); | 1483 | mempool_free( mbox, phba->mbox_mem_pool); |
1490 | } | 1484 | } |
1491 | lpfc_findnode_remove_rpi(phba, ndlp->nlp_rpi); | ||
1492 | lpfc_no_rpi(phba, ndlp); | 1485 | lpfc_no_rpi(phba, ndlp); |
1493 | ndlp->nlp_rpi = 0; | 1486 | ndlp->nlp_rpi = 0; |
1494 | return 1; | 1487 | return 1; |
@@ -2434,10 +2427,7 @@ lpfc_mbx_cmpl_fdmi_reg_login(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmb) | |||
2434 | 2427 | ||
2435 | pmb->context1 = NULL; | 2428 | pmb->context1 = NULL; |
2436 | 2429 | ||
2437 | if (ndlp->nlp_rpi != 0) | ||
2438 | lpfc_findnode_remove_rpi(phba, ndlp->nlp_rpi); | ||
2439 | ndlp->nlp_rpi = mb->un.varWords[0]; | 2430 | ndlp->nlp_rpi = mb->un.varWords[0]; |
2440 | lpfc_addnode_rpi(phba, ndlp, ndlp->nlp_rpi); | ||
2441 | ndlp->nlp_type |= NLP_FABRIC; | 2431 | ndlp->nlp_type |= NLP_FABRIC; |
2442 | ndlp->nlp_state = NLP_STE_UNMAPPED_NODE; | 2432 | ndlp->nlp_state = NLP_STE_UNMAPPED_NODE; |
2443 | lpfc_nlp_list(phba, ndlp, NLP_UNMAPPED_LIST); | 2433 | 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) | |||
2463 | } | 2453 | } |
2464 | 2454 | ||
2465 | /* | 2455 | /* |
2466 | * This routine looks up the ndlp hash | 2456 | * This routine looks up the ndlp lists |
2467 | * table for the given RPI. If rpi found | 2457 | * for the given RPI. If rpi found |
2468 | * it return the node list pointer | 2458 | * it return the node list pointer |
2469 | * else return 0. | 2459 | * else return NULL. |
2470 | */ | 2460 | */ |
2471 | struct lpfc_nodelist * | 2461 | struct lpfc_nodelist * |
2472 | lpfc_findnode_rpi(struct lpfc_hba * phba, uint16_t rpi) | 2462 | lpfc_findnode_rpi(struct lpfc_hba * phba, uint16_t rpi) |
2473 | { | 2463 | { |
2474 | struct lpfc_nodelist *ret; | 2464 | struct lpfc_nodelist *ndlp; |
2475 | 2465 | struct list_head * lists[]={&phba->fc_nlpunmap_list, | |
2476 | ret = phba->fc_nlplookup[LPFC_RPI_HASH_FUNC(rpi)]; | 2466 | &phba->fc_nlpmap_list, |
2477 | while ((ret != 0) && (ret->nlp_rpi != rpi)) { | 2467 | &phba->fc_plogi_list, |
2478 | ret = ret->nlp_rpi_hash_next; | 2468 | &phba->fc_adisc_list, |
2479 | } | 2469 | &phba->fc_reglogin_list}; |
2480 | return ret; | 2470 | int i; |
2481 | } | ||
2482 | |||
2483 | /* | ||
2484 | * This routine looks up the ndlp hash table for the | ||
2485 | * given RPI. If rpi found it return the node list | ||
2486 | * pointer else return 0 after deleting the entry | ||
2487 | * from hash table. | ||
2488 | */ | ||
2489 | struct lpfc_nodelist * | ||
2490 | lpfc_findnode_remove_rpi(struct lpfc_hba * phba, uint16_t rpi) | ||
2491 | { | ||
2492 | struct lpfc_nodelist *ret, *temp;; | ||
2493 | |||
2494 | ret = phba->fc_nlplookup[LPFC_RPI_HASH_FUNC(rpi)]; | ||
2495 | if (ret == 0) | ||
2496 | return NULL; | ||
2497 | |||
2498 | if (ret->nlp_rpi == rpi) { | ||
2499 | phba->fc_nlplookup[LPFC_RPI_HASH_FUNC(rpi)] = | ||
2500 | ret->nlp_rpi_hash_next; | ||
2501 | ret->nlp_rpi_hash_next = NULL; | ||
2502 | return ret; | ||
2503 | } | ||
2504 | |||
2505 | while ((ret->nlp_rpi_hash_next != 0) && | ||
2506 | (ret->nlp_rpi_hash_next->nlp_rpi != rpi)) { | ||
2507 | ret = ret->nlp_rpi_hash_next; | ||
2508 | } | ||
2509 | |||
2510 | if (ret->nlp_rpi_hash_next != 0) { | ||
2511 | temp = ret->nlp_rpi_hash_next; | ||
2512 | ret->nlp_rpi_hash_next = temp->nlp_rpi_hash_next; | ||
2513 | temp->nlp_rpi_hash_next = NULL; | ||
2514 | return temp; | ||
2515 | } else { | ||
2516 | return NULL; | ||
2517 | } | ||
2518 | } | ||
2519 | |||
2520 | /* | ||
2521 | * This routine adds the node list entry to the | ||
2522 | * ndlp hash table. | ||
2523 | */ | ||
2524 | void | ||
2525 | lpfc_addnode_rpi(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, | ||
2526 | uint16_t rpi) | ||
2527 | { | ||
2528 | 2471 | ||
2529 | uint32_t index; | 2472 | for (i = 0; i < ARRAY_SIZE(lists); i++ ) |
2473 | list_for_each_entry(ndlp, lists[i], nlp_listp) | ||
2474 | if (ndlp->nlp_rpi == rpi) | ||
2475 | return (ndlp); | ||
2530 | 2476 | ||
2531 | index = LPFC_RPI_HASH_FUNC(rpi); | 2477 | return NULL; |
2532 | ndlp->nlp_rpi_hash_next = phba->fc_nlplookup[index]; | ||
2533 | phba->fc_nlplookup[index] = ndlp; | ||
2534 | return; | ||
2535 | } | 2478 | } |
2536 | 2479 | ||
2537 | void | 2480 | void |
diff --git a/drivers/scsi/lpfc/lpfc_nportdisc.c b/drivers/scsi/lpfc/lpfc_nportdisc.c index 9b35eaac781d..9a58de876d40 100644 --- a/drivers/scsi/lpfc/lpfc_nportdisc.c +++ b/drivers/scsi/lpfc/lpfc_nportdisc.c | |||
@@ -1086,11 +1086,7 @@ lpfc_cmpl_reglogin_reglogin_issue(struct lpfc_hba * phba, | |||
1086 | return (ndlp->nlp_state); | 1086 | return (ndlp->nlp_state); |
1087 | } | 1087 | } |
1088 | 1088 | ||
1089 | if (ndlp->nlp_rpi != 0) | ||
1090 | lpfc_findnode_remove_rpi(phba, ndlp->nlp_rpi); | ||
1091 | |||
1092 | ndlp->nlp_rpi = mb->un.varWords[0]; | 1089 | ndlp->nlp_rpi = mb->un.varWords[0]; |
1093 | lpfc_addnode_rpi(phba, ndlp, ndlp->nlp_rpi); | ||
1094 | 1090 | ||
1095 | /* Only if we are not a fabric nport do we issue PRLI */ | 1091 | /* Only if we are not a fabric nport do we issue PRLI */ |
1096 | if (!(ndlp->nlp_type & NLP_FABRIC)) { | 1092 | if (!(ndlp->nlp_type & NLP_FABRIC)) { |
@@ -1593,12 +1589,7 @@ lpfc_cmpl_reglogin_npr_node(struct lpfc_hba * phba, | |||
1593 | pmb = (LPFC_MBOXQ_t *) arg; | 1589 | pmb = (LPFC_MBOXQ_t *) arg; |
1594 | mb = &pmb->mb; | 1590 | mb = &pmb->mb; |
1595 | 1591 | ||
1596 | /* save rpi */ | ||
1597 | if (ndlp->nlp_rpi != 0) | ||
1598 | lpfc_findnode_remove_rpi(phba, ndlp->nlp_rpi); | ||
1599 | |||
1600 | ndlp->nlp_rpi = mb->un.varWords[0]; | 1592 | ndlp->nlp_rpi = mb->un.varWords[0]; |
1601 | lpfc_addnode_rpi(phba, ndlp, ndlp->nlp_rpi); | ||
1602 | 1593 | ||
1603 | return (ndlp->nlp_state); | 1594 | return (ndlp->nlp_state); |
1604 | } | 1595 | } |