diff options
Diffstat (limited to 'drivers/scsi/lpfc/lpfc_hbadisc.c')
-rw-r--r-- | drivers/scsi/lpfc/lpfc_hbadisc.c | 186 |
1 files changed, 77 insertions, 109 deletions
diff --git a/drivers/scsi/lpfc/lpfc_hbadisc.c b/drivers/scsi/lpfc/lpfc_hbadisc.c index b2f1552f1848..d586c3d3b0d0 100644 --- a/drivers/scsi/lpfc/lpfc_hbadisc.c +++ b/drivers/scsi/lpfc/lpfc_hbadisc.c | |||
@@ -56,28 +56,63 @@ static uint8_t lpfcAlpaArray[] = { | |||
56 | 56 | ||
57 | static void lpfc_disc_timeout_handler(struct lpfc_hba *); | 57 | static void lpfc_disc_timeout_handler(struct lpfc_hba *); |
58 | 58 | ||
59 | static void | 59 | void |
60 | lpfc_process_nodev_timeout(struct lpfc_hba *phba, struct lpfc_nodelist *ndlp) | 60 | lpfc_terminate_rport_io(struct fc_rport *rport) |
61 | { | 61 | { |
62 | uint8_t *name = (uint8_t *)&ndlp->nlp_portname; | 62 | struct lpfc_rport_data *rdata; |
63 | int warn_on = 0; | 63 | struct lpfc_nodelist * ndlp; |
64 | struct lpfc_hba *phba; | ||
64 | 65 | ||
65 | spin_lock_irq(phba->host->host_lock); | 66 | rdata = rport->dd_data; |
66 | if (!(ndlp->nlp_flag & NLP_NODEV_TMO)) { | 67 | ndlp = rdata->pnode; |
67 | spin_unlock_irq(phba->host->host_lock); | 68 | |
69 | if (!ndlp) { | ||
70 | if (rport->roles & FC_RPORT_ROLE_FCP_TARGET) | ||
71 | printk(KERN_ERR "Cannot find remote node" | ||
72 | " to terminate I/O Data x%x\n", | ||
73 | rport->port_id); | ||
68 | return; | 74 | return; |
69 | } | 75 | } |
70 | 76 | ||
71 | /* | 77 | phba = ndlp->nlp_phba; |
72 | * If a discovery event readded nodev_timer after timer | 78 | |
73 | * firing and before processing the timer, cancel the | ||
74 | * nlp_tmofunc. | ||
75 | */ | ||
76 | spin_unlock_irq(phba->host->host_lock); | ||
77 | del_timer_sync(&ndlp->nlp_tmofunc); | ||
78 | spin_lock_irq(phba->host->host_lock); | 79 | spin_lock_irq(phba->host->host_lock); |
80 | if (ndlp->nlp_sid != NLP_NO_SID) { | ||
81 | lpfc_sli_abort_iocb(phba, &phba->sli.ring[phba->sli.fcp_ring], | ||
82 | ndlp->nlp_sid, 0, 0, LPFC_CTX_TGT); | ||
83 | } | ||
84 | spin_unlock_irq(phba->host->host_lock); | ||
79 | 85 | ||
80 | ndlp->nlp_flag &= ~NLP_NODEV_TMO; | 86 | return; |
87 | } | ||
88 | |||
89 | /* | ||
90 | * This function will be called when dev_loss_tmo fire. | ||
91 | */ | ||
92 | void | ||
93 | lpfc_dev_loss_tmo_callbk(struct fc_rport *rport) | ||
94 | { | ||
95 | struct lpfc_rport_data *rdata; | ||
96 | struct lpfc_nodelist * ndlp; | ||
97 | uint8_t *name; | ||
98 | int warn_on = 0; | ||
99 | struct lpfc_hba *phba; | ||
100 | |||
101 | rdata = rport->dd_data; | ||
102 | ndlp = rdata->pnode; | ||
103 | |||
104 | if (!ndlp) { | ||
105 | if (rport->roles & FC_RPORT_ROLE_FCP_TARGET) | ||
106 | printk(KERN_ERR "Cannot find remote node" | ||
107 | " for rport in dev_loss_tmo_callbk x%x\n", | ||
108 | rport->port_id); | ||
109 | return; | ||
110 | } | ||
111 | |||
112 | name = (uint8_t *)&ndlp->nlp_portname; | ||
113 | phba = ndlp->nlp_phba; | ||
114 | |||
115 | spin_lock_irq(phba->host->host_lock); | ||
81 | 116 | ||
82 | if (ndlp->nlp_sid != NLP_NO_SID) { | 117 | if (ndlp->nlp_sid != NLP_NO_SID) { |
83 | warn_on = 1; | 118 | warn_on = 1; |
@@ -85,11 +120,14 @@ lpfc_process_nodev_timeout(struct lpfc_hba *phba, struct lpfc_nodelist *ndlp) | |||
85 | lpfc_sli_abort_iocb(phba, &phba->sli.ring[phba->sli.fcp_ring], | 120 | lpfc_sli_abort_iocb(phba, &phba->sli.ring[phba->sli.fcp_ring], |
86 | ndlp->nlp_sid, 0, 0, LPFC_CTX_TGT); | 121 | ndlp->nlp_sid, 0, 0, LPFC_CTX_TGT); |
87 | } | 122 | } |
123 | if (phba->fc_flag & FC_UNLOADING) | ||
124 | warn_on = 0; | ||
125 | |||
88 | spin_unlock_irq(phba->host->host_lock); | 126 | spin_unlock_irq(phba->host->host_lock); |
89 | 127 | ||
90 | if (warn_on) { | 128 | if (warn_on) { |
91 | lpfc_printf_log(phba, KERN_ERR, LOG_DISCOVERY, | 129 | lpfc_printf_log(phba, KERN_ERR, LOG_DISCOVERY, |
92 | "%d:0203 Nodev timeout on " | 130 | "%d:0203 Devloss timeout on " |
93 | "WWPN %x:%x:%x:%x:%x:%x:%x:%x " | 131 | "WWPN %x:%x:%x:%x:%x:%x:%x:%x " |
94 | "NPort x%x Data: x%x x%x x%x\n", | 132 | "NPort x%x Data: x%x x%x x%x\n", |
95 | phba->brd_no, | 133 | phba->brd_no, |
@@ -99,7 +137,7 @@ lpfc_process_nodev_timeout(struct lpfc_hba *phba, struct lpfc_nodelist *ndlp) | |||
99 | ndlp->nlp_state, ndlp->nlp_rpi); | 137 | ndlp->nlp_state, ndlp->nlp_rpi); |
100 | } else { | 138 | } else { |
101 | lpfc_printf_log(phba, KERN_INFO, LOG_DISCOVERY, | 139 | lpfc_printf_log(phba, KERN_INFO, LOG_DISCOVERY, |
102 | "%d:0204 Nodev timeout on " | 140 | "%d:0204 Devloss timeout on " |
103 | "WWPN %x:%x:%x:%x:%x:%x:%x:%x " | 141 | "WWPN %x:%x:%x:%x:%x:%x:%x:%x " |
104 | "NPort x%x Data: x%x x%x x%x\n", | 142 | "NPort x%x Data: x%x x%x x%x\n", |
105 | phba->brd_no, | 143 | phba->brd_no, |
@@ -109,7 +147,12 @@ lpfc_process_nodev_timeout(struct lpfc_hba *phba, struct lpfc_nodelist *ndlp) | |||
109 | ndlp->nlp_state, ndlp->nlp_rpi); | 147 | ndlp->nlp_state, ndlp->nlp_rpi); |
110 | } | 148 | } |
111 | 149 | ||
112 | lpfc_disc_state_machine(phba, ndlp, NULL, NLP_EVT_DEVICE_RM); | 150 | ndlp->rport = NULL; |
151 | rdata->pnode = NULL; | ||
152 | |||
153 | if (!(phba->fc_flag & FC_UNLOADING)) | ||
154 | lpfc_disc_state_machine(phba, ndlp, NULL, NLP_EVT_DEVICE_RM); | ||
155 | |||
113 | return; | 156 | return; |
114 | } | 157 | } |
115 | 158 | ||
@@ -127,11 +170,6 @@ lpfc_work_list_done(struct lpfc_hba * phba) | |||
127 | spin_unlock_irq(phba->host->host_lock); | 170 | spin_unlock_irq(phba->host->host_lock); |
128 | free_evt = 1; | 171 | free_evt = 1; |
129 | switch (evtp->evt) { | 172 | switch (evtp->evt) { |
130 | case LPFC_EVT_NODEV_TMO: | ||
131 | ndlp = (struct lpfc_nodelist *)(evtp->evt_arg1); | ||
132 | lpfc_process_nodev_timeout(phba, ndlp); | ||
133 | free_evt = 0; | ||
134 | break; | ||
135 | case LPFC_EVT_ELS_RETRY: | 173 | case LPFC_EVT_ELS_RETRY: |
136 | ndlp = (struct lpfc_nodelist *)(evtp->evt_arg1); | 174 | ndlp = (struct lpfc_nodelist *)(evtp->evt_arg1); |
137 | lpfc_els_retry_delay_handler(ndlp); | 175 | lpfc_els_retry_delay_handler(ndlp); |
@@ -340,6 +378,9 @@ lpfc_linkdown(struct lpfc_hba * phba) | |||
340 | spin_unlock_irq(phba->host->host_lock); | 378 | spin_unlock_irq(phba->host->host_lock); |
341 | } | 379 | } |
342 | 380 | ||
381 | fc_host_post_event(phba->host, fc_get_event_number(), | ||
382 | FCH_EVT_LINKDOWN, 0); | ||
383 | |||
343 | /* Clean up any firmware default rpi's */ | 384 | /* Clean up any firmware default rpi's */ |
344 | if ((mb = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL))) { | 385 | if ((mb = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL))) { |
345 | lpfc_unreg_did(phba, 0xffffffff, mb); | 386 | lpfc_unreg_did(phba, 0xffffffff, mb); |
@@ -374,16 +415,6 @@ lpfc_linkdown(struct lpfc_hba * phba) | |||
374 | rc = lpfc_disc_state_machine(phba, ndlp, NULL, | 415 | rc = lpfc_disc_state_machine(phba, ndlp, NULL, |
375 | NLP_EVT_DEVICE_RECOVERY); | 416 | NLP_EVT_DEVICE_RECOVERY); |
376 | 417 | ||
377 | /* Check config parameter use-adisc or FCP-2 */ | ||
378 | if ((rc != NLP_STE_FREED_NODE) && | ||
379 | (phba->cfg_use_adisc == 0) && | ||
380 | !(ndlp->nlp_fcp_info & NLP_FCP_2_DEVICE)) { | ||
381 | /* We know we will have to relogin, so | ||
382 | * unreglogin the rpi right now to fail | ||
383 | * any outstanding I/Os quickly. | ||
384 | */ | ||
385 | lpfc_unreg_rpi(phba, ndlp); | ||
386 | } | ||
387 | } | 418 | } |
388 | } | 419 | } |
389 | 420 | ||
@@ -427,6 +458,9 @@ lpfc_linkup(struct lpfc_hba * phba) | |||
427 | struct list_head *listp, *node_list[7]; | 458 | struct list_head *listp, *node_list[7]; |
428 | int i; | 459 | int i; |
429 | 460 | ||
461 | fc_host_post_event(phba->host, fc_get_event_number(), | ||
462 | FCH_EVT_LINKUP, 0); | ||
463 | |||
430 | spin_lock_irq(phba->host->host_lock); | 464 | spin_lock_irq(phba->host->host_lock); |
431 | phba->hba_state = LPFC_LINK_UP; | 465 | phba->hba_state = LPFC_LINK_UP; |
432 | phba->fc_flag &= ~(FC_PT2PT | FC_PT2PT_PLOGI | FC_ABORT_DISCOVERY | | 466 | phba->fc_flag &= ~(FC_PT2PT | FC_PT2PT_PLOGI | FC_ABORT_DISCOVERY | |
@@ -638,6 +672,8 @@ lpfc_mbx_cmpl_read_sparam(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmb) | |||
638 | 672 | ||
639 | memcpy((uint8_t *) & phba->fc_sparam, (uint8_t *) mp->virt, | 673 | memcpy((uint8_t *) & phba->fc_sparam, (uint8_t *) mp->virt, |
640 | sizeof (struct serv_parm)); | 674 | sizeof (struct serv_parm)); |
675 | if (phba->cfg_soft_wwpn) | ||
676 | u64_to_wwn(phba->cfg_soft_wwpn, phba->fc_sparam.portName.u.wwn); | ||
641 | memcpy((uint8_t *) & phba->fc_nodename, | 677 | memcpy((uint8_t *) & phba->fc_nodename, |
642 | (uint8_t *) & phba->fc_sparam.nodeName, | 678 | (uint8_t *) & phba->fc_sparam.nodeName, |
643 | sizeof (struct lpfc_name)); | 679 | sizeof (struct lpfc_name)); |
@@ -1098,8 +1134,11 @@ lpfc_unregister_remote_port(struct lpfc_hba * phba, | |||
1098 | struct fc_rport *rport = ndlp->rport; | 1134 | struct fc_rport *rport = ndlp->rport; |
1099 | struct lpfc_rport_data *rdata = rport->dd_data; | 1135 | struct lpfc_rport_data *rdata = rport->dd_data; |
1100 | 1136 | ||
1101 | ndlp->rport = NULL; | 1137 | if (rport->scsi_target_id == -1) { |
1102 | rdata->pnode = NULL; | 1138 | ndlp->rport = NULL; |
1139 | rdata->pnode = NULL; | ||
1140 | } | ||
1141 | |||
1103 | fc_remote_port_delete(rport); | 1142 | fc_remote_port_delete(rport); |
1104 | 1143 | ||
1105 | return; | 1144 | return; |
@@ -1227,17 +1266,6 @@ lpfc_nlp_list(struct lpfc_hba * phba, struct lpfc_nodelist * nlp, int list) | |||
1227 | list_add_tail(&nlp->nlp_listp, &phba->fc_nlpunmap_list); | 1266 | list_add_tail(&nlp->nlp_listp, &phba->fc_nlpunmap_list); |
1228 | phba->fc_unmap_cnt++; | 1267 | phba->fc_unmap_cnt++; |
1229 | phba->nport_event_cnt++; | 1268 | phba->nport_event_cnt++; |
1230 | /* stop nodev tmo if running */ | ||
1231 | if (nlp->nlp_flag & NLP_NODEV_TMO) { | ||
1232 | nlp->nlp_flag &= ~NLP_NODEV_TMO; | ||
1233 | spin_unlock_irq(phba->host->host_lock); | ||
1234 | del_timer_sync(&nlp->nlp_tmofunc); | ||
1235 | spin_lock_irq(phba->host->host_lock); | ||
1236 | if (!list_empty(&nlp->nodev_timeout_evt.evt_listp)) | ||
1237 | list_del_init(&nlp->nodev_timeout_evt. | ||
1238 | evt_listp); | ||
1239 | |||
1240 | } | ||
1241 | nlp->nlp_flag &= ~NLP_NODEV_REMOVE; | 1269 | nlp->nlp_flag &= ~NLP_NODEV_REMOVE; |
1242 | nlp->nlp_type |= NLP_FC_NODE; | 1270 | nlp->nlp_type |= NLP_FC_NODE; |
1243 | break; | 1271 | break; |
@@ -1248,17 +1276,6 @@ lpfc_nlp_list(struct lpfc_hba * phba, struct lpfc_nodelist * nlp, int list) | |||
1248 | list_add_tail(&nlp->nlp_listp, &phba->fc_nlpmap_list); | 1276 | list_add_tail(&nlp->nlp_listp, &phba->fc_nlpmap_list); |
1249 | phba->fc_map_cnt++; | 1277 | phba->fc_map_cnt++; |
1250 | phba->nport_event_cnt++; | 1278 | phba->nport_event_cnt++; |
1251 | /* stop nodev tmo if running */ | ||
1252 | if (nlp->nlp_flag & NLP_NODEV_TMO) { | ||
1253 | nlp->nlp_flag &= ~NLP_NODEV_TMO; | ||
1254 | spin_unlock_irq(phba->host->host_lock); | ||
1255 | del_timer_sync(&nlp->nlp_tmofunc); | ||
1256 | spin_lock_irq(phba->host->host_lock); | ||
1257 | if (!list_empty(&nlp->nodev_timeout_evt.evt_listp)) | ||
1258 | list_del_init(&nlp->nodev_timeout_evt. | ||
1259 | evt_listp); | ||
1260 | |||
1261 | } | ||
1262 | nlp->nlp_flag &= ~NLP_NODEV_REMOVE; | 1279 | nlp->nlp_flag &= ~NLP_NODEV_REMOVE; |
1263 | break; | 1280 | break; |
1264 | case NLP_NPR_LIST: | 1281 | case NLP_NPR_LIST: |
@@ -1267,11 +1284,6 @@ lpfc_nlp_list(struct lpfc_hba * phba, struct lpfc_nodelist * nlp, int list) | |||
1267 | list_add_tail(&nlp->nlp_listp, &phba->fc_npr_list); | 1284 | list_add_tail(&nlp->nlp_listp, &phba->fc_npr_list); |
1268 | phba->fc_npr_cnt++; | 1285 | phba->fc_npr_cnt++; |
1269 | 1286 | ||
1270 | if (!(nlp->nlp_flag & NLP_NODEV_TMO)) | ||
1271 | mod_timer(&nlp->nlp_tmofunc, | ||
1272 | jiffies + HZ * phba->cfg_nodev_tmo); | ||
1273 | |||
1274 | nlp->nlp_flag |= NLP_NODEV_TMO; | ||
1275 | nlp->nlp_flag &= ~NLP_RCV_PLOGI; | 1287 | nlp->nlp_flag &= ~NLP_RCV_PLOGI; |
1276 | break; | 1288 | break; |
1277 | case NLP_JUST_DQ: | 1289 | case NLP_JUST_DQ: |
@@ -1301,7 +1313,8 @@ lpfc_nlp_list(struct lpfc_hba * phba, struct lpfc_nodelist * nlp, int list) | |||
1301 | * already. If we have, and it's a scsi entity, be | 1313 | * already. If we have, and it's a scsi entity, be |
1302 | * sure to unblock any attached scsi devices | 1314 | * sure to unblock any attached scsi devices |
1303 | */ | 1315 | */ |
1304 | if (!nlp->rport) | 1316 | if ((!nlp->rport) || (nlp->rport->port_state == |
1317 | FC_PORTSTATE_BLOCKED)) | ||
1305 | lpfc_register_remote_port(phba, nlp); | 1318 | lpfc_register_remote_port(phba, nlp); |
1306 | 1319 | ||
1307 | /* | 1320 | /* |
@@ -1575,15 +1588,12 @@ lpfc_freenode(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp) | |||
1575 | 1588 | ||
1576 | lpfc_els_abort(phba,ndlp,0); | 1589 | lpfc_els_abort(phba,ndlp,0); |
1577 | spin_lock_irq(phba->host->host_lock); | 1590 | spin_lock_irq(phba->host->host_lock); |
1578 | ndlp->nlp_flag &= ~(NLP_NODEV_TMO|NLP_DELAY_TMO); | 1591 | ndlp->nlp_flag &= ~NLP_DELAY_TMO; |
1579 | spin_unlock_irq(phba->host->host_lock); | 1592 | spin_unlock_irq(phba->host->host_lock); |
1580 | del_timer_sync(&ndlp->nlp_tmofunc); | ||
1581 | 1593 | ||
1582 | ndlp->nlp_last_elscmd = 0; | 1594 | ndlp->nlp_last_elscmd = 0; |
1583 | del_timer_sync(&ndlp->nlp_delayfunc); | 1595 | del_timer_sync(&ndlp->nlp_delayfunc); |
1584 | 1596 | ||
1585 | if (!list_empty(&ndlp->nodev_timeout_evt.evt_listp)) | ||
1586 | list_del_init(&ndlp->nodev_timeout_evt.evt_listp); | ||
1587 | if (!list_empty(&ndlp->els_retry_evt.evt_listp)) | 1597 | if (!list_empty(&ndlp->els_retry_evt.evt_listp)) |
1588 | list_del_init(&ndlp->els_retry_evt.evt_listp); | 1598 | list_del_init(&ndlp->els_retry_evt.evt_listp); |
1589 | 1599 | ||
@@ -1600,16 +1610,6 @@ lpfc_freenode(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp) | |||
1600 | int | 1610 | int |
1601 | lpfc_nlp_remove(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp) | 1611 | lpfc_nlp_remove(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp) |
1602 | { | 1612 | { |
1603 | if (ndlp->nlp_flag & NLP_NODEV_TMO) { | ||
1604 | spin_lock_irq(phba->host->host_lock); | ||
1605 | ndlp->nlp_flag &= ~NLP_NODEV_TMO; | ||
1606 | spin_unlock_irq(phba->host->host_lock); | ||
1607 | del_timer_sync(&ndlp->nlp_tmofunc); | ||
1608 | if (!list_empty(&ndlp->nodev_timeout_evt.evt_listp)) | ||
1609 | list_del_init(&ndlp->nodev_timeout_evt.evt_listp); | ||
1610 | |||
1611 | } | ||
1612 | |||
1613 | 1613 | ||
1614 | if (ndlp->nlp_flag & NLP_DELAY_TMO) { | 1614 | if (ndlp->nlp_flag & NLP_DELAY_TMO) { |
1615 | lpfc_cancel_retry_delay_tmo(phba, ndlp); | 1615 | lpfc_cancel_retry_delay_tmo(phba, ndlp); |
@@ -2424,34 +2424,6 @@ lpfc_disc_timeout_handler(struct lpfc_hba *phba) | |||
2424 | return; | 2424 | return; |
2425 | } | 2425 | } |
2426 | 2426 | ||
2427 | static void | ||
2428 | lpfc_nodev_timeout(unsigned long ptr) | ||
2429 | { | ||
2430 | struct lpfc_hba *phba; | ||
2431 | struct lpfc_nodelist *ndlp; | ||
2432 | unsigned long iflag; | ||
2433 | struct lpfc_work_evt *evtp; | ||
2434 | |||
2435 | ndlp = (struct lpfc_nodelist *)ptr; | ||
2436 | phba = ndlp->nlp_phba; | ||
2437 | evtp = &ndlp->nodev_timeout_evt; | ||
2438 | spin_lock_irqsave(phba->host->host_lock, iflag); | ||
2439 | |||
2440 | if (!list_empty(&evtp->evt_listp)) { | ||
2441 | spin_unlock_irqrestore(phba->host->host_lock, iflag); | ||
2442 | return; | ||
2443 | } | ||
2444 | evtp->evt_arg1 = ndlp; | ||
2445 | evtp->evt = LPFC_EVT_NODEV_TMO; | ||
2446 | list_add_tail(&evtp->evt_listp, &phba->work_list); | ||
2447 | if (phba->work_wait) | ||
2448 | wake_up(phba->work_wait); | ||
2449 | |||
2450 | spin_unlock_irqrestore(phba->host->host_lock, iflag); | ||
2451 | return; | ||
2452 | } | ||
2453 | |||
2454 | |||
2455 | /* | 2427 | /* |
2456 | * This routine handles processing a NameServer REG_LOGIN mailbox | 2428 | * This routine handles processing a NameServer REG_LOGIN mailbox |
2457 | * command upon completion. It is setup in the LPFC_MBOXQ | 2429 | * command upon completion. It is setup in the LPFC_MBOXQ |
@@ -2575,11 +2547,7 @@ lpfc_nlp_init(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, | |||
2575 | uint32_t did) | 2547 | uint32_t did) |
2576 | { | 2548 | { |
2577 | memset(ndlp, 0, sizeof (struct lpfc_nodelist)); | 2549 | memset(ndlp, 0, sizeof (struct lpfc_nodelist)); |
2578 | INIT_LIST_HEAD(&ndlp->nodev_timeout_evt.evt_listp); | ||
2579 | INIT_LIST_HEAD(&ndlp->els_retry_evt.evt_listp); | 2550 | INIT_LIST_HEAD(&ndlp->els_retry_evt.evt_listp); |
2580 | init_timer(&ndlp->nlp_tmofunc); | ||
2581 | ndlp->nlp_tmofunc.function = lpfc_nodev_timeout; | ||
2582 | ndlp->nlp_tmofunc.data = (unsigned long)ndlp; | ||
2583 | init_timer(&ndlp->nlp_delayfunc); | 2551 | init_timer(&ndlp->nlp_delayfunc); |
2584 | ndlp->nlp_delayfunc.function = lpfc_els_retry_delay; | 2552 | ndlp->nlp_delayfunc.function = lpfc_els_retry_delay; |
2585 | ndlp->nlp_delayfunc.data = (unsigned long)ndlp; | 2553 | ndlp->nlp_delayfunc.data = (unsigned long)ndlp; |