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} |