lpfc_els.c (2e0fef85e098f6794956b8b80b111179fbb4cbb7) lpfc_els.c (ed957684294618602b48f1950b0c9bbcb036583f)
1/*******************************************************************
2 * This file is part of the Emulex Linux Device Driver for *
3 * Fibre Channel Host Bus Adapters. *
4 * Copyright (C) 2004-2007 Emulex. All rights reserved. *
5 * EMULEX and SLI are trademarks of Emulex. *
6 * www.emulex.com *
7 * Portions Copyright (C) 2004-2005 Christoph Hellwig *
8 * *

--- 31 unchanged lines hidden (view full) ---

40 struct lpfc_iocbq *);
41static int lpfc_max_els_tries = 3;
42
43static int
44lpfc_els_chk_latt(struct lpfc_vport *vport)
45{
46 struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
47 struct lpfc_hba *phba = vport->phba;
1/*******************************************************************
2 * This file is part of the Emulex Linux Device Driver for *
3 * Fibre Channel Host Bus Adapters. *
4 * Copyright (C) 2004-2007 Emulex. All rights reserved. *
5 * EMULEX and SLI are trademarks of Emulex. *
6 * www.emulex.com *
7 * Portions Copyright (C) 2004-2005 Christoph Hellwig *
8 * *

--- 31 unchanged lines hidden (view full) ---

40 struct lpfc_iocbq *);
41static int lpfc_max_els_tries = 3;
42
43static int
44lpfc_els_chk_latt(struct lpfc_vport *vport)
45{
46 struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
47 struct lpfc_hba *phba = vport->phba;
48 LPFC_MBOXQ_t *mbox;
49 uint32_t ha_copy;
48 uint32_t ha_copy;
50 int rc;
51
52 if (vport->port_state >= LPFC_VPORT_READY ||
53 phba->link_state == LPFC_LINK_DOWN)
54 return 0;
55
56 /* Read the HBA Host Attention Register */
57 ha_copy = readl(phba->HAregaddr);
58

--- 12 unchanged lines hidden (view full) ---

71 * will cleanup any left over in-progress discovery
72 * events.
73 */
74 spin_lock_irq(shost->host_lock);
75 vport->fc_flag |= FC_ABORT_DISCOVERY;
76 spin_unlock_irq(shost->host_lock);
77
78 if (phba->link_state != LPFC_CLEAR_LA) {
49
50 if (vport->port_state >= LPFC_VPORT_READY ||
51 phba->link_state == LPFC_LINK_DOWN)
52 return 0;
53
54 /* Read the HBA Host Attention Register */
55 ha_copy = readl(phba->HAregaddr);
56

--- 12 unchanged lines hidden (view full) ---

69 * will cleanup any left over in-progress discovery
70 * events.
71 */
72 spin_lock_irq(shost->host_lock);
73 vport->fc_flag |= FC_ABORT_DISCOVERY;
74 spin_unlock_irq(shost->host_lock);
75
76 if (phba->link_state != LPFC_CLEAR_LA) {
79 if ((mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL))) {
80 phba->link_state = LPFC_CLEAR_LA;
81 lpfc_clear_la(phba, mbox);
82 mbox->mbox_cmpl = lpfc_mbx_cmpl_clear_la;
83 mbox->vport = vport;
84 printk(KERN_ERR "%s (%d): do clear_la\n",
85 __FUNCTION__, __LINE__);
86 rc = lpfc_sli_issue_mbox(phba, mbox,
87 (MBX_NOWAIT | MBX_STOP_IOCB));
88 if (rc == MBX_NOT_FINISHED) {
89 mempool_free(mbox, phba->mbox_mem_pool);
90 phba->link_state = LPFC_HBA_ERROR;
91 }
92 }
77 lpfc_issue_clear_la(phba, vport);
93 }
94
95 return 1;
96
97}
98
99static struct lpfc_iocbq *
100lpfc_prep_els_iocb(struct lpfc_vport *vport, uint8_t expectRsp,

--- 47 unchanged lines hidden (view full) ---

148 INIT_LIST_HEAD(&prsp->list);
149 } else {
150 prsp = NULL;
151 }
152
153 /* Allocate buffer for Buffer ptr list */
154 pbuflist = kmalloc(sizeof (struct lpfc_dmabuf), GFP_KERNEL);
155 if (pbuflist)
78 }
79
80 return 1;
81
82}
83
84static struct lpfc_iocbq *
85lpfc_prep_els_iocb(struct lpfc_vport *vport, uint8_t expectRsp,

--- 47 unchanged lines hidden (view full) ---

133 INIT_LIST_HEAD(&prsp->list);
134 } else {
135 prsp = NULL;
136 }
137
138 /* Allocate buffer for Buffer ptr list */
139 pbuflist = kmalloc(sizeof (struct lpfc_dmabuf), GFP_KERNEL);
140 if (pbuflist)
156 pbuflist->virt = lpfc_mbuf_alloc(phba, MEM_PRI,
157 &pbuflist->phys);
141 pbuflist->virt = lpfc_mbuf_alloc(phba, MEM_PRI,
142 &pbuflist->phys);
158 if (pbuflist == 0 || pbuflist->virt == 0) {
159 lpfc_sli_release_iocbq(phba, elsiocb);
160 lpfc_mbuf_free(phba, pcmd->virt, pcmd->phys);
161 lpfc_mbuf_free(phba, prsp->virt, prsp->phys);
162 kfree(pcmd);
163 kfree(prsp);
164 kfree(pbuflist);
165 return NULL;

--- 118 unchanged lines hidden (view full) ---

284
285 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
286 if (!mbox)
287 goto fail;
288
289 vport->port_state = LPFC_FABRIC_CFG_LINK;
290 lpfc_config_link(phba, mbox);
291 mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
143 if (pbuflist == 0 || pbuflist->virt == 0) {
144 lpfc_sli_release_iocbq(phba, elsiocb);
145 lpfc_mbuf_free(phba, pcmd->virt, pcmd->phys);
146 lpfc_mbuf_free(phba, prsp->virt, prsp->phys);
147 kfree(pcmd);
148 kfree(prsp);
149 kfree(pbuflist);
150 return NULL;

--- 118 unchanged lines hidden (view full) ---

269
270 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
271 if (!mbox)
272 goto fail;
273
274 vport->port_state = LPFC_FABRIC_CFG_LINK;
275 lpfc_config_link(phba, mbox);
276 mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
277 mbox->vport = vport;
292
293 rc = lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT | MBX_STOP_IOCB);
294 if (rc == MBX_NOT_FINISHED)
295 goto fail_free_mbox;
296
297 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
298 if (!mbox)
299 goto fail;

--- 59 unchanged lines hidden (view full) ---

359
360 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
361 if (!mbox)
362 goto fail;
363
364 lpfc_config_link(phba, mbox);
365
366 mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
278
279 rc = lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT | MBX_STOP_IOCB);
280 if (rc == MBX_NOT_FINISHED)
281 goto fail_free_mbox;
282
283 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
284 if (!mbox)
285 goto fail;

--- 59 unchanged lines hidden (view full) ---

345
346 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
347 if (!mbox)
348 goto fail;
349
350 lpfc_config_link(phba, mbox);
351
352 mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
353 mbox->vport = vport;
367 rc = lpfc_sli_issue_mbox(phba, mbox,
368 MBX_NOWAIT | MBX_STOP_IOCB);
369 if (rc == MBX_NOT_FINISHED) {
370 mempool_free(mbox, phba->mbox_mem_pool);
371 goto fail;
372 }
373 lpfc_nlp_put(ndlp);
374

--- 334 unchanged lines hidden (view full) ---

709 struct lpfc_dmabuf *prsp;
710 int disc, rc, did, type;
711
712 /* we pass cmdiocb to state machine which needs rspiocb as well */
713 cmdiocb->context_un.rsp_iocb = rspiocb;
714
715 irsp = &rspiocb->iocb;
716 ndlp = lpfc_findnode_did(vport, irsp->un.elsreq64.remoteID);
354 rc = lpfc_sli_issue_mbox(phba, mbox,
355 MBX_NOWAIT | MBX_STOP_IOCB);
356 if (rc == MBX_NOT_FINISHED) {
357 mempool_free(mbox, phba->mbox_mem_pool);
358 goto fail;
359 }
360 lpfc_nlp_put(ndlp);
361

--- 334 unchanged lines hidden (view full) ---

696 struct lpfc_dmabuf *prsp;
697 int disc, rc, did, type;
698
699 /* we pass cmdiocb to state machine which needs rspiocb as well */
700 cmdiocb->context_un.rsp_iocb = rspiocb;
701
702 irsp = &rspiocb->iocb;
703 ndlp = lpfc_findnode_did(vport, irsp->un.elsreq64.remoteID);
717 if (!ndlp)
704
705 if (!ndlp) {
718 goto out;
706 goto out;
707 }
719
720 /* Since ndlp can be freed in the disc state machine, note if this node
721 * is being used during discovery.
722 */
723 spin_lock_irq(shost->host_lock);
724 disc = (ndlp->nlp_flag & NLP_NPR_2B_DISC);
725 ndlp->nlp_flag &= ~NLP_NPR_2B_DISC;
726 spin_unlock_irq(shost->host_lock);

--- 378 unchanged lines hidden (view full) ---

1105 lpfc_more_adisc(vport);
1106
1107 /* Check to see if we are done with ADISC authentication */
1108 if (vport->num_disc_nodes == 0) {
1109 lpfc_can_disctmo(vport);
1110 /* If we get here, there is nothing left to wait for */
1111 if (vport->port_state < LPFC_VPORT_READY &&
1112 phba->link_state != LPFC_CLEAR_LA) {
708
709 /* Since ndlp can be freed in the disc state machine, note if this node
710 * is being used during discovery.
711 */
712 spin_lock_irq(shost->host_lock);
713 disc = (ndlp->nlp_flag & NLP_NPR_2B_DISC);
714 ndlp->nlp_flag &= ~NLP_NPR_2B_DISC;
715 spin_unlock_irq(shost->host_lock);

--- 378 unchanged lines hidden (view full) ---

1094 lpfc_more_adisc(vport);
1095
1096 /* Check to see if we are done with ADISC authentication */
1097 if (vport->num_disc_nodes == 0) {
1098 lpfc_can_disctmo(vport);
1099 /* If we get here, there is nothing left to wait for */
1100 if (vport->port_state < LPFC_VPORT_READY &&
1101 phba->link_state != LPFC_CLEAR_LA) {
1113 if (vport->port_type == LPFC_PHYSICAL_PORT) {
1102 if (vport->port_type == LPFC_PHYSICAL_PORT)
1114 lpfc_issue_clear_la(phba, vport);
1103 lpfc_issue_clear_la(phba, vport);
1115 }
1116 } else {
1117 lpfc_rscn_disc(vport);
1118 }
1119 }
1120 }
1121out:
1122 lpfc_els_free_iocb(phba, cmdiocb);
1123 return;

--- 291 unchanged lines hidden (view full) ---

1415 lpfc_nlp_put(ndlp);
1416 lpfc_els_free_iocb(phba, elsiocb);
1417 return 1;
1418 }
1419 lpfc_nlp_put(ndlp);
1420 return 0;
1421}
1422
1104 } else {
1105 lpfc_rscn_disc(vport);
1106 }
1107 }
1108 }
1109out:
1110 lpfc_els_free_iocb(phba, cmdiocb);
1111 return;

--- 291 unchanged lines hidden (view full) ---

1403 lpfc_nlp_put(ndlp);
1404 lpfc_els_free_iocb(phba, elsiocb);
1405 return 1;
1406 }
1407 lpfc_nlp_put(ndlp);
1408 return 0;
1409}
1410
1411static void
1412lpfc_end_rscn(struct lpfc_vport *vport)
1413{
1414 struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
1415
1416 if (vport->fc_flag & FC_RSCN_MODE) {
1417 /*
1418 * Check to see if more RSCNs came in while we were
1419 * processing this one.
1420 */
1421 if (vport->fc_rscn_id_cnt ||
1422 (vport->fc_flag & FC_RSCN_DISCOVERY) != 0)
1423 lpfc_els_handle_rscn(vport);
1424 else {
1425 spin_lock_irq(shost->host_lock);
1426 vport->fc_flag &= ~FC_RSCN_MODE;
1427 spin_unlock_irq(shost->host_lock);
1428 }
1429 }
1430}
1431
1423void
1424lpfc_cancel_retry_delay_tmo(struct lpfc_vport *vport, struct lpfc_nodelist *nlp)
1425{
1426 struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
1427
1428 spin_lock_irq(shost->host_lock);
1429 nlp->nlp_flag &= ~NLP_DELAY_TMO;
1430 spin_unlock_irq(shost->host_lock);

--- 13 unchanged lines hidden (view full) ---

1444 */
1445 lpfc_more_plogi(vport);
1446
1447 if (vport->num_disc_nodes == 0) {
1448 spin_lock_irq(shost->host_lock);
1449 vport->fc_flag &= ~FC_NDISC_ACTIVE;
1450 spin_unlock_irq(shost->host_lock);
1451 lpfc_can_disctmo(vport);
1432void
1433lpfc_cancel_retry_delay_tmo(struct lpfc_vport *vport, struct lpfc_nodelist *nlp)
1434{
1435 struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
1436
1437 spin_lock_irq(shost->host_lock);
1438 nlp->nlp_flag &= ~NLP_DELAY_TMO;
1439 spin_unlock_irq(shost->host_lock);

--- 13 unchanged lines hidden (view full) ---

1453 */
1454 lpfc_more_plogi(vport);
1455
1456 if (vport->num_disc_nodes == 0) {
1457 spin_lock_irq(shost->host_lock);
1458 vport->fc_flag &= ~FC_NDISC_ACTIVE;
1459 spin_unlock_irq(shost->host_lock);
1460 lpfc_can_disctmo(vport);
1452 if (vport->fc_flag & FC_RSCN_MODE) {
1453 /*
1454 * Check to see if more RSCNs
1455 * came in while we were
1456 * processing this one.
1457 */
1458 if (!vport->fc_rscn_id_cnt &&
1459 !(vport->fc_flag &
1460 FC_RSCN_DISCOVERY)) {
1461 spin_lock_irq(shost->host_lock);
1462 vport->fc_flag &= ~FC_RSCN_MODE;
1463 spin_unlock_irq(
1464 shost->host_lock);
1465 }
1466 else {
1467 lpfc_els_handle_rscn(vport);
1468 }
1469 }
1461 lpfc_end_rscn(vport);
1470 }
1471 }
1472 }
1473 return;
1474}
1475
1476void
1477lpfc_els_retry_delay(unsigned long ptr)

--- 206 unchanged lines hidden (view full) ---

1684 if (did == FDMI_DID)
1685 retry = 1;
1686
1687 if ((++cmdiocb->retry) >= maxretry) {
1688 phba->fc_stat.elsRetryExceeded++;
1689 retry = 0;
1690 }
1691
1462 }
1463 }
1464 }
1465 return;
1466}
1467
1468void
1469lpfc_els_retry_delay(unsigned long ptr)

--- 206 unchanged lines hidden (view full) ---

1676 if (did == FDMI_DID)
1677 retry = 1;
1678
1679 if ((++cmdiocb->retry) >= maxretry) {
1680 phba->fc_stat.elsRetryExceeded++;
1681 retry = 0;
1682 }
1683
1684 if ((vport->load_flag & FC_UNLOADING) != 0)
1685 retry = 0;
1686
1692 if (retry) {
1693
1694 /* Retry ELS command <elsCmd> to remote NPORT <did> */
1695 lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
1696 "%d:0107 Retry ELS command x%x to remote "
1697 "NPORT x%x Data: x%x x%x\n",
1698 phba->brd_no,
1699 cmd, did, cmdiocb->retry, delay);

--- 436 unchanged lines hidden (view full) ---

2136 uint16_t cmdsize;
2137 int rc;
2138
2139 psli = &phba->sli;
2140 pring = &psli->ring[LPFC_ELS_RING]; /* ELS ring */
2141
2142 cmdsize = sizeof (uint32_t) + sizeof (PRLI);
2143 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, ndlp,
1687 if (retry) {
1688
1689 /* Retry ELS command <elsCmd> to remote NPORT <did> */
1690 lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
1691 "%d:0107 Retry ELS command x%x to remote "
1692 "NPORT x%x Data: x%x x%x\n",
1693 phba->brd_no,
1694 cmd, did, cmdiocb->retry, delay);

--- 436 unchanged lines hidden (view full) ---

2131 uint16_t cmdsize;
2132 int rc;
2133
2134 psli = &phba->sli;
2135 pring = &psli->ring[LPFC_ELS_RING]; /* ELS ring */
2136
2137 cmdsize = sizeof (uint32_t) + sizeof (PRLI);
2138 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, ndlp,
2144 ndlp->nlp_DID,
2145 (ELS_CMD_ACC |
2146 (ELS_CMD_PRLI & ~ELS_RSP_MASK)));
2139 ndlp->nlp_DID, (ELS_CMD_ACC | (ELS_CMD_PRLI & ~ELS_RSP_MASK)));
2147 if (!elsiocb)
2148 return 1;
2149
2150 icmd = &elsiocb->iocb;
2151 oldcmd = &oldiocb->iocb;
2152 icmd->ulpContext = oldcmd->ulpContext; /* Xri */
2153
2154 /* Xmit PRLI ACC response tag <ulpIoTag> */

--- 201 unchanged lines hidden (view full) ---

2356{
2357 struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
2358 struct lpfc_hba *phba = vport->phba;
2359 struct lpfc_dmabuf *mp;
2360 int i;
2361
2362 for (i = 0; i < vport->fc_rscn_id_cnt; i++) {
2363 mp = vport->fc_rscn_id_list[i];
2140 if (!elsiocb)
2141 return 1;
2142
2143 icmd = &elsiocb->iocb;
2144 oldcmd = &oldiocb->iocb;
2145 icmd->ulpContext = oldcmd->ulpContext; /* Xri */
2146
2147 /* Xmit PRLI ACC response tag <ulpIoTag> */

--- 201 unchanged lines hidden (view full) ---

2349{
2350 struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
2351 struct lpfc_hba *phba = vport->phba;
2352 struct lpfc_dmabuf *mp;
2353 int i;
2354
2355 for (i = 0; i < vport->fc_rscn_id_cnt; i++) {
2356 mp = vport->fc_rscn_id_list[i];
2364 lpfc_mbuf_free(phba, mp->virt, mp->phys);
2365 kfree(mp);
2357 if (phba->sli3_options & LPFC_SLI3_HBQ_ENABLED)
2358 lpfc_sli_hbqbuf_free(phba, mp->virt, mp->phys);
2359 else {
2360 lpfc_mbuf_free(phba, mp->virt, mp->phys);
2361 kfree(mp);
2362 }
2366 vport->fc_rscn_id_list[i] = NULL;
2367 }
2368 spin_lock_irq(shost->host_lock);
2369 vport->fc_rscn_id_cnt = 0;
2370 vport->fc_flag &= ~(FC_RSCN_MODE | FC_RSCN_DISCOVERY);
2371 spin_unlock_irq(shost->host_lock);
2372 lpfc_can_disctmo(vport);
2373 return 0;

--- 107 unchanged lines hidden (view full) ---

2481 lp = (uint32_t *) pcmd->virt;
2482
2483 cmd = *lp++;
2484 payload_len = be32_to_cpu(cmd) & 0xffff; /* payload length */
2485 payload_len -= sizeof (uint32_t); /* take off word 0 */
2486 cmd &= ELS_CMD_MASK;
2487
2488 /* RSCN received */
2363 vport->fc_rscn_id_list[i] = NULL;
2364 }
2365 spin_lock_irq(shost->host_lock);
2366 vport->fc_rscn_id_cnt = 0;
2367 vport->fc_flag &= ~(FC_RSCN_MODE | FC_RSCN_DISCOVERY);
2368 spin_unlock_irq(shost->host_lock);
2369 lpfc_can_disctmo(vport);
2370 return 0;

--- 107 unchanged lines hidden (view full) ---

2478 lp = (uint32_t *) pcmd->virt;
2479
2480 cmd = *lp++;
2481 payload_len = be32_to_cpu(cmd) & 0xffff; /* payload length */
2482 payload_len -= sizeof (uint32_t); /* take off word 0 */
2483 cmd &= ELS_CMD_MASK;
2484
2485 /* RSCN received */
2489 lpfc_printf_log(phba,
2490 KERN_INFO,
2491 LOG_DISCOVERY,
2486 lpfc_printf_log(phba, KERN_INFO, LOG_DISCOVERY,
2492 "%d:0214 RSCN received Data: x%x x%x x%x x%x\n",
2493 phba->brd_no, vport->fc_flag, payload_len, *lp,
2494 vport->fc_rscn_id_cnt);
2495
2496 for (i = 0; i < payload_len/sizeof(uint32_t); i++)
2497 fc_host_post_event(shost, fc_get_event_number(),
2498 FCH_EVT_RSCN, lp[i]);
2499

--- 76 unchanged lines hidden (view full) ---

2576{
2577 struct lpfc_nodelist *ndlp;
2578 struct lpfc_hba *phba = vport->phba;
2579
2580 /* Start timer for RSCN processing */
2581 lpfc_set_disctmo(vport);
2582
2583 /* RSCN processed */
2487 "%d:0214 RSCN received Data: x%x x%x x%x x%x\n",
2488 phba->brd_no, vport->fc_flag, payload_len, *lp,
2489 vport->fc_rscn_id_cnt);
2490
2491 for (i = 0; i < payload_len/sizeof(uint32_t); i++)
2492 fc_host_post_event(shost, fc_get_event_number(),
2493 FCH_EVT_RSCN, lp[i]);
2494

--- 76 unchanged lines hidden (view full) ---

2571{
2572 struct lpfc_nodelist *ndlp;
2573 struct lpfc_hba *phba = vport->phba;
2574
2575 /* Start timer for RSCN processing */
2576 lpfc_set_disctmo(vport);
2577
2578 /* RSCN processed */
2584 lpfc_printf_log(phba,
2585 KERN_INFO,
2586 LOG_DISCOVERY,
2579 lpfc_printf_log(phba, KERN_INFO, LOG_DISCOVERY,
2587 "%d:0215 RSCN processed Data: x%x x%x x%x x%x\n",
2588 phba->brd_no,
2589 vport->fc_flag, 0, vport->fc_rscn_id_cnt,
2590 vport->port_state);
2591
2592 /* To process RSCN, first compare RSCN data with NameServer */
2593 vport->fc_ns_retry = 0;
2594 ndlp = lpfc_findnode_did(vport, NameServer_DID);

--- 83 unchanged lines hidden (view full) ---

2678 return 1;
2679
2680 lpfc_linkdown(phba);
2681 lpfc_init_link(phba, mbox,
2682 phba->cfg_topology,
2683 phba->cfg_link_speed);
2684 mbox->mb.un.varInitLnk.lipsr_AL_PA = 0;
2685 mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
2580 "%d:0215 RSCN processed Data: x%x x%x x%x x%x\n",
2581 phba->brd_no,
2582 vport->fc_flag, 0, vport->fc_rscn_id_cnt,
2583 vport->port_state);
2584
2585 /* To process RSCN, first compare RSCN data with NameServer */
2586 vport->fc_ns_retry = 0;
2587 ndlp = lpfc_findnode_did(vport, NameServer_DID);

--- 83 unchanged lines hidden (view full) ---

2671 return 1;
2672
2673 lpfc_linkdown(phba);
2674 lpfc_init_link(phba, mbox,
2675 phba->cfg_topology,
2676 phba->cfg_link_speed);
2677 mbox->mb.un.varInitLnk.lipsr_AL_PA = 0;
2678 mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
2679 mbox->vport = vport;
2686 rc = lpfc_sli_issue_mbox
2687 (phba, mbox, (MBX_NOWAIT | MBX_STOP_IOCB));
2688 lpfc_set_loopback_flag(phba);
2689 if (rc == MBX_NOT_FINISHED) {
2690 mempool_free(mbox, phba->mbox_mem_pool);
2691 }
2692 return 1;
2693 } else if (rc > 0) { /* greater than */

--- 138 unchanged lines hidden (view full) ---

2832 "%d:0118 Xmit ELS RPS ACC response tag x%x xri x%x, "
2833 "did x%x, nlp_flag x%x, nlp_state x%x, rpi x%x\n",
2834 phba->brd_no, elsiocb->iotag,
2835 elsiocb->iocb.ulpContext, ndlp->nlp_DID,
2836 ndlp->nlp_flag, ndlp->nlp_state, ndlp->nlp_rpi);
2837
2838 elsiocb->iocb_cmpl = lpfc_cmpl_els_acc;
2839 phba->fc_stat.elsXmitACC++;
2680 rc = lpfc_sli_issue_mbox
2681 (phba, mbox, (MBX_NOWAIT | MBX_STOP_IOCB));
2682 lpfc_set_loopback_flag(phba);
2683 if (rc == MBX_NOT_FINISHED) {
2684 mempool_free(mbox, phba->mbox_mem_pool);
2685 }
2686 return 1;
2687 } else if (rc > 0) { /* greater than */

--- 138 unchanged lines hidden (view full) ---

2826 "%d:0118 Xmit ELS RPS ACC response tag x%x xri x%x, "
2827 "did x%x, nlp_flag x%x, nlp_state x%x, rpi x%x\n",
2828 phba->brd_no, elsiocb->iotag,
2829 elsiocb->iocb.ulpContext, ndlp->nlp_DID,
2830 ndlp->nlp_flag, ndlp->nlp_state, ndlp->nlp_rpi);
2831
2832 elsiocb->iocb_cmpl = lpfc_cmpl_els_acc;
2833 phba->fc_stat.elsXmitACC++;
2840
2841 if (lpfc_sli_issue_iocb(phba, pring, elsiocb, 0) == IOCB_ERROR) {
2834 if (lpfc_sli_issue_iocb(phba, pring, elsiocb, 0) == IOCB_ERROR)
2842 lpfc_els_free_iocb(phba, elsiocb);
2835 lpfc_els_free_iocb(phba, elsiocb);
2843 }
2844 return;
2845}
2846
2847static int
2848lpfc_els_rcv_rps(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
2849 struct lpfc_nodelist *ndlp)
2850{
2851 struct lpfc_hba *phba = vport->phba;

--- 158 unchanged lines hidden (view full) ---

3010 did = icmd->un.elsreq64.remoteID;
3011 pcmd = (struct lpfc_dmabuf *) cmdiocb->context2;
3012 lp = (uint32_t *) pcmd->virt;
3013
3014 cmd = *lp++;
3015 fp = (FARP *) lp;
3016
3017 /* FARP-REQ received from DID <did> */
2836 return;
2837}
2838
2839static int
2840lpfc_els_rcv_rps(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
2841 struct lpfc_nodelist *ndlp)
2842{
2843 struct lpfc_hba *phba = vport->phba;

--- 158 unchanged lines hidden (view full) ---

3002 did = icmd->un.elsreq64.remoteID;
3003 pcmd = (struct lpfc_dmabuf *) cmdiocb->context2;
3004 lp = (uint32_t *) pcmd->virt;
3005
3006 cmd = *lp++;
3007 fp = (FARP *) lp;
3008
3009 /* FARP-REQ received from DID <did> */
3018 lpfc_printf_log(phba,
3019 KERN_INFO,
3020 LOG_ELS,
3010 lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
3021 "%d:0601 FARP-REQ received from DID x%x\n",
3022 phba->brd_no, did);
3023
3024 /* We will only support match on WWPN or WWNN */
3025 if (fp->Mflags & ~(FARP_MATCH_NODE | FARP_MATCH_PORT)) {
3026 return 0;
3027 }
3028

--- 43 unchanged lines hidden (view full) ---

3072
3073 icmd = &cmdiocb->iocb;
3074 did = icmd->un.elsreq64.remoteID;
3075 pcmd = (struct lpfc_dmabuf *) cmdiocb->context2;
3076 lp = (uint32_t *) pcmd->virt;
3077
3078 cmd = *lp++;
3079 /* FARP-RSP received from DID <did> */
3011 "%d:0601 FARP-REQ received from DID x%x\n",
3012 phba->brd_no, did);
3013
3014 /* We will only support match on WWPN or WWNN */
3015 if (fp->Mflags & ~(FARP_MATCH_NODE | FARP_MATCH_PORT)) {
3016 return 0;
3017 }
3018

--- 43 unchanged lines hidden (view full) ---

3062
3063 icmd = &cmdiocb->iocb;
3064 did = icmd->un.elsreq64.remoteID;
3065 pcmd = (struct lpfc_dmabuf *) cmdiocb->context2;
3066 lp = (uint32_t *) pcmd->virt;
3067
3068 cmd = *lp++;
3069 /* FARP-RSP received from DID <did> */
3080 lpfc_printf_log(phba,
3081 KERN_INFO,
3082 LOG_ELS,
3070 lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
3083 "%d:0600 FARP-RSP received from DID x%x\n",
3084 phba->brd_no, did);
3071 "%d:0600 FARP-RSP received from DID x%x\n",
3072 phba->brd_no, did);
3085
3086 /* ACCEPT the Farp resp request */
3087 lpfc_els_rsp_acc(vport, ELS_CMD_ACC, cmdiocb, ndlp, NULL, 0);
3088
3089 return 0;
3090}
3091
3092static int
3093lpfc_els_rcv_fan(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
3094 struct lpfc_nodelist *fan_ndlp)
3095{
3096 struct lpfc_dmabuf *pcmd;
3097 uint32_t *lp;
3098 IOCB_t *icmd;
3099 uint32_t cmd, did;
3100 FAN *fp;
3101 struct lpfc_nodelist *ndlp, *next_ndlp;
3102 struct lpfc_hba *phba = vport->phba;
3103
3104 /* FAN received */
3073 /* ACCEPT the Farp resp request */
3074 lpfc_els_rsp_acc(vport, ELS_CMD_ACC, cmdiocb, ndlp, NULL, 0);
3075
3076 return 0;
3077}
3078
3079static int
3080lpfc_els_rcv_fan(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
3081 struct lpfc_nodelist *fan_ndlp)
3082{
3083 struct lpfc_dmabuf *pcmd;
3084 uint32_t *lp;
3085 IOCB_t *icmd;
3086 uint32_t cmd, did;
3087 FAN *fp;
3088 struct lpfc_nodelist *ndlp, *next_ndlp;
3089 struct lpfc_hba *phba = vport->phba;
3090
3091 /* FAN received */
3105 lpfc_printf_log(phba, KERN_INFO, LOG_ELS, "%d:0265 FAN received\n",
3106 phba->brd_no);
3092 lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
3093 "%d:0265 FAN received\n",
3094 phba->brd_no);
3107
3108 icmd = &cmdiocb->iocb;
3109 did = icmd->un.elsreq64.remoteID;
3110 pcmd = (struct lpfc_dmabuf *)cmdiocb->context2;
3111 lp = (uint32_t *)pcmd->virt;
3112
3113 cmd = *lp++;
3114 fp = (FAN *)lp;

--- 212 unchanged lines hidden (view full) ---

3327 cmd->un.ulpWord[4] = IOERR_SLI_ABORTED;
3328 (piocb->iocb_cmpl) (phba, piocb, piocb);
3329 }
3330 }
3331
3332 return;
3333}
3334
3095
3096 icmd = &cmdiocb->iocb;
3097 did = icmd->un.elsreq64.remoteID;
3098 pcmd = (struct lpfc_dmabuf *)cmdiocb->context2;
3099 lp = (uint32_t *)pcmd->virt;
3100
3101 cmd = *lp++;
3102 fp = (FAN *)lp;

--- 212 unchanged lines hidden (view full) ---

3315 cmd->un.ulpWord[4] = IOERR_SLI_ABORTED;
3316 (piocb->iocb_cmpl) (phba, piocb, piocb);
3317 }
3318 }
3319
3320 return;
3321}
3322
3335void
3336lpfc_els_unsol_event(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
3337 struct lpfc_iocbq *elsiocb)
3323static void
3324lpfc_els_unsol_buffer(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
3325 struct lpfc_vport *vport, struct lpfc_dmabuf *mp,
3326 struct lpfc_iocbq *elsiocb)
3338{
3327{
3339 struct lpfc_sli *psli;
3340 struct lpfc_nodelist *ndlp;
3328 struct lpfc_nodelist *ndlp;
3341 struct lpfc_dmabuf *mp = NULL;
3342 uint32_t *lp;
3343 IOCB_t *icmd;
3344 struct ls_rjt stat;
3329 struct ls_rjt stat;
3330 uint32_t *lp;
3345 uint32_t cmd, did, newnode, rjt_err = 0;
3331 uint32_t cmd, did, newnode, rjt_err = 0;
3346 uint32_t drop_cmd = 0; /* by default do NOT drop received cmd */
3347 struct lpfc_vport *vport = NULL;
3332 IOCB_t *icmd = &elsiocb->iocb;
3348
3333
3349 psli = &phba->sli;
3350 icmd = &elsiocb->iocb;
3351
3352 if ((icmd->ulpStatus == IOSTAT_LOCAL_REJECT) &&
3353 ((icmd->un.ulpWord[4] & 0xff) == IOERR_RCV_BUFFER_WAITING)) {
3354 phba->fc_stat.NoRcvBuf++;
3355 /* Not enough posted buffers; Try posting more buffers */
3356 lpfc_post_buffer(phba, pring, 0, 1);
3357 return;
3358 }
3359
3360 /* If there are no BDEs associated with this IOCB,
3361 * there is nothing to do.
3362 */
3363 if (icmd->ulpBdeCount == 0)
3364 return;
3365
3366 /* type of ELS cmd is first 32bit word in packet */
3367 mp = lpfc_sli_ringpostbuf_get(phba, pring,
3368 getPaddr(icmd->un.cont64[0].addrHigh,
3369 icmd->un.cont64[0].addrLow));
3370 if (mp == 0) {
3371 drop_cmd = 1;
3334 if (!vport || !mp)
3372 goto dropit;
3335 goto dropit;
3373 }
3374
3336
3375 vport = phba->pport;
3376
3377 newnode = 0;
3378 lp = (uint32_t *) mp->virt;
3379 cmd = *lp++;
3337 newnode = 0;
3338 lp = (uint32_t *) mp->virt;
3339 cmd = *lp++;
3380 lpfc_post_buffer(phba, &psli->ring[LPFC_ELS_RING], 1, 1);
3340 if ((phba->sli3_options & LPFC_SLI3_HBQ_ENABLED) == 0)
3341 lpfc_post_buffer(phba, pring, 1, 1);
3381
3342
3382 if (icmd->ulpStatus) {
3383 lpfc_mbuf_free(phba, mp->virt, mp->phys);
3384 kfree(mp);
3385 drop_cmd = 1;
3343 if (icmd->ulpStatus)
3386 goto dropit;
3344 goto dropit;
3387 }
3388
3389 /* Check to see if link went down during discovery */
3345
3346 /* Check to see if link went down during discovery */
3390 if (lpfc_els_chk_latt(vport)) {
3391 lpfc_mbuf_free(phba, mp->virt, mp->phys);
3392 kfree(mp);
3393 drop_cmd = 1;
3347 if (lpfc_els_chk_latt(vport))
3394 goto dropit;
3348 goto dropit;
3395 }
3396
3397 did = icmd->un.rcvels.remoteID;
3398 ndlp = lpfc_findnode_did(vport, did);
3399 if (!ndlp) {
3400 /* Cannot find existing Fabric ndlp, so allocate a new one */
3401 ndlp = mempool_alloc(phba->nlp_mem_pool, GFP_KERNEL);
3349
3350 did = icmd->un.rcvels.remoteID;
3351 ndlp = lpfc_findnode_did(vport, did);
3352 if (!ndlp) {
3353 /* Cannot find existing Fabric ndlp, so allocate a new one */
3354 ndlp = mempool_alloc(phba->nlp_mem_pool, GFP_KERNEL);
3402 if (!ndlp) {
3403 lpfc_mbuf_free(phba, mp->virt, mp->phys);
3404 kfree(mp);
3405 drop_cmd = 1;
3355 if (!ndlp)
3406 goto dropit;
3356 goto dropit;
3407 }
3408
3409 lpfc_nlp_init(vport, ndlp, did);
3410 newnode = 1;
3411 if ((did & Fabric_DID_MASK) == Fabric_DID_MASK) {
3412 ndlp->nlp_type |= NLP_FABRIC;
3413 }
3414 lpfc_nlp_set_state(vport, ndlp, NLP_STE_UNUSED_NODE);
3415 }

--- 7 unchanged lines hidden (view full) ---

3423
3424 if ((cmd & ELS_CMD_MASK) == ELS_CMD_RSCN) {
3425 cmd &= ELS_CMD_MASK;
3426 }
3427 /* ELS command <elsCmd> received from NPORT <did> */
3428 lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
3429 "%d:0112 ELS command x%x received from NPORT x%x "
3430 "Data: x%x\n", phba->brd_no, cmd, did,
3357
3358 lpfc_nlp_init(vport, ndlp, did);
3359 newnode = 1;
3360 if ((did & Fabric_DID_MASK) == Fabric_DID_MASK) {
3361 ndlp->nlp_type |= NLP_FABRIC;
3362 }
3363 lpfc_nlp_set_state(vport, ndlp, NLP_STE_UNUSED_NODE);
3364 }

--- 7 unchanged lines hidden (view full) ---

3372
3373 if ((cmd & ELS_CMD_MASK) == ELS_CMD_RSCN) {
3374 cmd &= ELS_CMD_MASK;
3375 }
3376 /* ELS command <elsCmd> received from NPORT <did> */
3377 lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
3378 "%d:0112 ELS command x%x received from NPORT x%x "
3379 "Data: x%x\n", phba->brd_no, cmd, did,
3431 vport->port_state);
3380 vport->port_state);
3432
3433 switch (cmd) {
3434 case ELS_CMD_PLOGI:
3435 phba->fc_stat.elsRcvPLOGI++;
3436 if (vport->port_state < LPFC_DISC_AUTH) {
3437 rjt_err = 1;
3438 break;
3439 }

--- 92 unchanged lines hidden (view full) ---

3532 lpfc_drop_node(vport, ndlp);
3533 break;
3534 default:
3535 /* Unsupported ELS command, reject */
3536 rjt_err = 1;
3537
3538 /* Unknown ELS command <elsCmd> received from NPORT <did> */
3539 lpfc_printf_log(phba, KERN_ERR, LOG_ELS,
3381
3382 switch (cmd) {
3383 case ELS_CMD_PLOGI:
3384 phba->fc_stat.elsRcvPLOGI++;
3385 if (vport->port_state < LPFC_DISC_AUTH) {
3386 rjt_err = 1;
3387 break;
3388 }

--- 92 unchanged lines hidden (view full) ---

3481 lpfc_drop_node(vport, ndlp);
3482 break;
3483 default:
3484 /* Unsupported ELS command, reject */
3485 rjt_err = 1;
3486
3487 /* Unknown ELS command <elsCmd> received from NPORT <did> */
3488 lpfc_printf_log(phba, KERN_ERR, LOG_ELS,
3540 "%d:0115 Unknown ELS command x%x received from "
3541 "NPORT x%x\n", phba->brd_no, cmd, did);
3489 "%d:0115 Unknown ELS command x%x "
3490 "received from NPORT x%x\n",
3491 phba->brd_no, cmd, did);
3542 if (newnode)
3543 lpfc_drop_node(vport, ndlp);
3544 break;
3545 }
3546
3547 /* check if need to LS_RJT received ELS cmd */
3548 if (rjt_err) {
3549 stat.un.b.lsRjtRsvd0 = 0;
3550 stat.un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC;
3551 stat.un.b.lsRjtRsnCodeExp = LSEXP_NOTHING_MORE;
3552 stat.un.b.vendorUnique = 0;
3553 lpfc_els_rsp_reject(vport, stat.un.lsRjtError, elsiocb, ndlp);
3554 }
3555
3492 if (newnode)
3493 lpfc_drop_node(vport, ndlp);
3494 break;
3495 }
3496
3497 /* check if need to LS_RJT received ELS cmd */
3498 if (rjt_err) {
3499 stat.un.b.lsRjtRsvd0 = 0;
3500 stat.un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC;
3501 stat.un.b.lsRjtRsnCodeExp = LSEXP_NOTHING_MORE;
3502 stat.un.b.vendorUnique = 0;
3503 lpfc_els_rsp_reject(vport, stat.un.lsRjtError, elsiocb, ndlp);
3504 }
3505
3506 return;
3507
3508dropit:
3509 lpfc_printf_log(phba, KERN_ERR, LOG_ELS,
3510 "%d:0111 Dropping received ELS cmd "
3511 "Data: x%x x%x x%x\n",
3512 phba->brd_no,
3513 icmd->ulpStatus, icmd->un.ulpWord[4],
3514 icmd->ulpTimeout);
3515 phba->fc_stat.elsRcvDrop++;
3516}
3517
3518
3519void
3520lpfc_els_unsol_event(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
3521 struct lpfc_iocbq *elsiocb)
3522{
3523 struct lpfc_vport *vport = phba->pport;
3524 struct lpfc_dmabuf *mp = NULL;
3525 IOCB_t *icmd = &elsiocb->iocb;
3526 struct hbq_dmabuf *sp = NULL;
3527 dma_addr_t paddr;
3528
3529 if ((icmd->ulpStatus == IOSTAT_LOCAL_REJECT) &&
3530 ((icmd->un.ulpWord[4] & 0xff) == IOERR_RCV_BUFFER_WAITING)) {
3531 phba->fc_stat.NoRcvBuf++;
3532 /* Not enough posted buffers; Try posting more buffers */
3533 if (phba->sli3_options & LPFC_SLI3_HBQ_ENABLED)
3534 lpfc_sli_hbqbuf_fill_hbq(phba);
3535 else
3536 lpfc_post_buffer(phba, pring, 0, 1);
3537 return;
3538 }
3539
3540 /* If there are no BDEs associated with this IOCB,
3541 * there is nothing to do.
3542 */
3543 if (icmd->ulpBdeCount == 0)
3544 return;
3545
3546 /* type of ELS cmd is first 32bit word in packet */
3547 if (phba->sli3_options & LPFC_SLI3_HBQ_ENABLED) {
3548 paddr = getPaddr(icmd->un.cont64[0].addrHigh,
3549 icmd->un.cont64[0].addrLow);
3550 sp = lpfc_sli_hbqbuf_find(phba, icmd->un.ulpWord[3]);
3551 if (sp)
3552 phba->hbq_buff_count--;
3553 mp = sp ? &sp->dbuf : NULL;
3554 } else {
3555 paddr = getPaddr(icmd->un.cont64[0].addrHigh,
3556 icmd->un.cont64[0].addrLow);
3557 mp = lpfc_sli_ringpostbuf_get(phba, pring, paddr);
3558 }
3559
3560 lpfc_els_unsol_buffer(phba, pring, vport, mp, elsiocb);
3561
3556 lpfc_nlp_put(elsiocb->context1);
3557 elsiocb->context1 = NULL;
3558 if (elsiocb->context2) {
3562 lpfc_nlp_put(elsiocb->context1);
3563 elsiocb->context1 = NULL;
3564 if (elsiocb->context2) {
3559 lpfc_mbuf_free(phba, mp->virt, mp->phys);
3560 kfree(mp);
3565 if (phba->sli3_options & LPFC_SLI3_HBQ_ENABLED)
3566 lpfc_sli_free_hbq(phba, sp);
3567 else {
3568 lpfc_mbuf_free(phba, mp->virt, mp->phys);
3569 kfree(mp);
3570 }
3561 }
3571 }
3562dropit:
3563 /* check if need to drop received ELS cmd */
3564 if (drop_cmd == 1) {
3565 lpfc_printf_log(phba, KERN_ERR, LOG_ELS,
3566 "%d:0111 Dropping received ELS cmd "
3567 "Data: x%x x%x x%x\n", phba->brd_no,
3568 icmd->ulpStatus, icmd->un.ulpWord[4],
3569 icmd->ulpTimeout);
3570 phba->fc_stat.elsRcvDrop++;
3572
3573 /* RCV_ELS64_CX provide for 2 BDEs - process 2nd if included */
3574 if ((phba->sli3_options & LPFC_SLI3_HBQ_ENABLED) != 0 &&
3575 icmd->ulpBdeCount == 2) {
3576 sp = lpfc_sli_hbqbuf_find(phba, icmd->un.ulpWord[15]);
3577 if (sp)
3578 phba->hbq_buff_count--;
3579 mp = sp ? &sp->dbuf : NULL;
3580 lpfc_els_unsol_buffer(phba, pring, vport, mp, elsiocb);
3581 /* free mp if we are done with it */
3582 if (elsiocb->context2) {
3583 if (phba->sli3_options & LPFC_SLI3_HBQ_ENABLED)
3584 lpfc_sli_free_hbq(phba, sp);
3585 else {
3586 lpfc_mbuf_free(phba, mp->virt, mp->phys);
3587 kfree(mp);
3588 }
3589 }
3571 }
3572}
3590 }
3591}