emlxs_els.c (e2ca2865) emlxs_els.c (a9800beb)
1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE

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

15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21
22/*
1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE

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

15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21
22/*
23 * Copyright 2009 Emulex. All rights reserved.
23 * Copyright 2011 Emulex. All rights reserved.
24 * Use is subject to license terms.
25 */
26
27
28#include <emlxs.h>
29
30/* Required for EMLXS_CONTEXT in EMLXS_MSGF calls */
31EMLXS_MSG_DEF(EMLXS_ELS_C);
32
33static void emlxs_handle_sol_flogi(emlxs_port_t *port, emlxs_buf_t *sbp);
24 * Use is subject to license terms.
25 */
26
27
28#include <emlxs.h>
29
30/* Required for EMLXS_CONTEXT in EMLXS_MSGF calls */
31EMLXS_MSG_DEF(EMLXS_ELS_C);
32
33static void emlxs_handle_sol_flogi(emlxs_port_t *port, emlxs_buf_t *sbp);
34static void emlxs_handle_sol_fdisk(emlxs_port_t *port, emlxs_buf_t *sbp);
34static void emlxs_handle_sol_fdisc(emlxs_port_t *port, emlxs_buf_t *sbp);
35static void emlxs_handle_sol_plogi(emlxs_port_t *port, emlxs_buf_t *sbp);
36static void emlxs_handle_sol_adisc(emlxs_port_t *port, emlxs_buf_t *sbp);
37static void emlxs_handle_sol_logo(emlxs_port_t *port, emlxs_buf_t *sbp);
38static void emlxs_handle_sol_prli(emlxs_port_t *port, emlxs_buf_t *sbp);
39
40static void emlxs_handle_unsol_rscn(emlxs_port_t *port, CHANNEL *cp,
41 IOCBQ *iocbq, MATCHMAP *mp, uint32_t size);
42static void emlxs_handle_unsol_flogi(emlxs_port_t *port, CHANNEL *cp,

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

50static void emlxs_handle_unsol_prli(emlxs_port_t *port, CHANNEL *cp,
51 IOCBQ *iocbq, MATCHMAP *mp, uint32_t size);
52static void emlxs_handle_unsol_prlo(emlxs_port_t *port, CHANNEL *cp,
53 IOCBQ *iocbq, MATCHMAP *mp, uint32_t size);
54static void emlxs_handle_unsol_auth(emlxs_port_t *port, CHANNEL *cp,
55 IOCBQ *iocbq, MATCHMAP *mp, uint32_t size);
56static void emlxs_handle_unsol_gen_cmd(emlxs_port_t *port, CHANNEL *cp,
57 IOCBQ *iocbq, MATCHMAP *mp, uint32_t size);
35static void emlxs_handle_sol_plogi(emlxs_port_t *port, emlxs_buf_t *sbp);
36static void emlxs_handle_sol_adisc(emlxs_port_t *port, emlxs_buf_t *sbp);
37static void emlxs_handle_sol_logo(emlxs_port_t *port, emlxs_buf_t *sbp);
38static void emlxs_handle_sol_prli(emlxs_port_t *port, emlxs_buf_t *sbp);
39
40static void emlxs_handle_unsol_rscn(emlxs_port_t *port, CHANNEL *cp,
41 IOCBQ *iocbq, MATCHMAP *mp, uint32_t size);
42static void emlxs_handle_unsol_flogi(emlxs_port_t *port, CHANNEL *cp,

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

50static void emlxs_handle_unsol_prli(emlxs_port_t *port, CHANNEL *cp,
51 IOCBQ *iocbq, MATCHMAP *mp, uint32_t size);
52static void emlxs_handle_unsol_prlo(emlxs_port_t *port, CHANNEL *cp,
53 IOCBQ *iocbq, MATCHMAP *mp, uint32_t size);
54static void emlxs_handle_unsol_auth(emlxs_port_t *port, CHANNEL *cp,
55 IOCBQ *iocbq, MATCHMAP *mp, uint32_t size);
56static void emlxs_handle_unsol_gen_cmd(emlxs_port_t *port, CHANNEL *cp,
57 IOCBQ *iocbq, MATCHMAP *mp, uint32_t size);
58static void emlxs_handle_unsol_echo_cmd(emlxs_port_t *port, CHANNEL *cp,
59 IOCBQ *iocbq, MATCHMAP *mp, uint32_t size);
60static void emlxs_handle_unsol_rtv_cmd(emlxs_port_t *port, CHANNEL *cp,
61 IOCBQ *iocbq, MATCHMAP *mp, uint32_t size);
62static void emlxs_handle_unsol_rls_cmd(emlxs_port_t *port, CHANNEL *cp,
63 IOCBQ *iocbq, MATCHMAP *mp, uint32_t size);
58static void emlxs_handle_acc(emlxs_port_t *port, emlxs_buf_t *sbp,
59 IOCBQ *iocbq, uint32_t flag);
60static void emlxs_handle_reject(emlxs_port_t *port, emlxs_buf_t *sbp,
61 IOCBQ *iocbq, uint32_t flag);
64static void emlxs_handle_acc(emlxs_port_t *port, emlxs_buf_t *sbp,
65 IOCBQ *iocbq, uint32_t flag);
66static void emlxs_handle_reject(emlxs_port_t *port, emlxs_buf_t *sbp,
67 IOCBQ *iocbq, uint32_t flag);
68
69#if (EMLXS_MODREV < EMLXS_MODREV4)
62static void emlxs_send_rsnn(emlxs_port_t *port);
63
70static void emlxs_send_rsnn(emlxs_port_t *port);
71
72#endif /* < EMLXS_MODREV4 */
64
65
66
67/* Routine Declaration - Local */
68/* End Routine Declaration - Local */
69
70/*
71 * emlxs_els_handle_event

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

177 * ULP patch - ULP expects
178 * resp_resid = 0 on success
179 */
180 pkt->pkt_resp_resid = 0;
181 }
182
183 switch (command) {
184 case ELS_CMD_FDISC: /* Fabric login */
73
74
75
76/* Routine Declaration - Local */
77/* End Routine Declaration - Local */
78
79/*
80 * emlxs_els_handle_event

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

186 * ULP patch - ULP expects
187 * resp_resid = 0 on success
188 */
189 pkt->pkt_resp_resid = 0;
190 }
191
192 switch (command) {
193 case ELS_CMD_FDISC: /* Fabric login */
185 emlxs_handle_sol_fdisk(port, sbp);
194 emlxs_handle_sol_fdisc(port, sbp);
186
187 break;
188
189 case ELS_CMD_FLOGI: /* Fabric login */
190 emlxs_handle_sol_flogi(port, sbp);
191
192 break;
193

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

314 emlxs_dhc_state(port, ndlp,
315 NODE_STATE_NOCHANGE,
316 pkt->pkt_reason,
317 pkt->pkt_expln);
318 }
319#endif /* DHCHAP_SUPPORT */
320 }
321
195
196 break;
197
198 case ELS_CMD_FLOGI: /* Fabric login */
199 emlxs_handle_sol_flogi(port, sbp);
200
201 break;
202

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

323 emlxs_dhc_state(port, ndlp,
324 NODE_STATE_NOCHANGE,
325 pkt->pkt_reason,
326 pkt->pkt_expln);
327 }
328#endif /* DHCHAP_SUPPORT */
329 }
330
331 if (hba->sli_mode == EMLXS_HBA_SLI4_MODE) {
332 (void) emlxs_vpi_logi_failed_notify(
333 sbp->port);
334 }
335
322 break;
323
324 default:
325 break;
326 }
327
328 emlxs_pkt_complete(sbp, iocb->ULPSTATUS,
329 iocb->un.grsp.perr.statLocalError, 1);
336 break;
337
338 default:
339 break;
340 }
341
342 emlxs_pkt_complete(sbp, iocb->ULPSTATUS,
343 iocb->un.grsp.perr.statLocalError, 1);
330
331 }
332
344 }
345
333
334 break;
335
336 default:
337
338 HBASTATS.ElsStray++;
339
340 EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_invalid_els_msg,
341 "Invalid iocb: cmd=0x%x", iocb->ULPCOMMAND);

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

352
353
354extern int
355emlxs_els_handle_unsol_req(emlxs_port_t *port, CHANNEL *cp, IOCBQ *iocbq,
356 MATCHMAP *mp, uint32_t size)
357{
358 emlxs_hba_t *hba = HBA;
359 uint32_t cmd_code;
346 break;
347
348 default:
349
350 HBASTATS.ElsStray++;
351
352 EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_invalid_els_msg,
353 "Invalid iocb: cmd=0x%x", iocb->ULPCOMMAND);

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

364
365
366extern int
367emlxs_els_handle_unsol_req(emlxs_port_t *port, CHANNEL *cp, IOCBQ *iocbq,
368 MATCHMAP *mp, uint32_t size)
369{
370 emlxs_hba_t *hba = HBA;
371 uint32_t cmd_code;
372 IOCB *iocb;
360
361 HBASTATS.ElsCmdReceived++;
362
373
374 HBASTATS.ElsCmdReceived++;
375
376 iocb = &iocbq->iocb;
363 cmd_code = *((uint32_t *)mp->virt) & ELS_CMD_MASK;
364
365 if (!(port->flag & EMLXS_PORT_BOUND)) {
366 EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_unsol_els_msg,
367 "%s: sid=%x. Port not bound: Rejecting.",
368 emlxs_elscmd_xlate(cmd_code),
369 iocbq->iocb.un.elsreq.remoteID);
370

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

410 emlxs_handle_unsol_adisc(port, cp, iocbq, mp, size);
411 break;
412
413 case ELS_CMD_AUTH:
414 HBASTATS.ElsAuthReceived++;
415 emlxs_handle_unsol_auth(port, cp, iocbq, mp, size);
416 break;
417
377 cmd_code = *((uint32_t *)mp->virt) & ELS_CMD_MASK;
378
379 if (!(port->flag & EMLXS_PORT_BOUND)) {
380 EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_unsol_els_msg,
381 "%s: sid=%x. Port not bound: Rejecting.",
382 emlxs_elscmd_xlate(cmd_code),
383 iocbq->iocb.un.elsreq.remoteID);
384

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

424 emlxs_handle_unsol_adisc(port, cp, iocbq, mp, size);
425 break;
426
427 case ELS_CMD_AUTH:
428 HBASTATS.ElsAuthReceived++;
429 emlxs_handle_unsol_auth(port, cp, iocbq, mp, size);
430 break;
431
432 case ELS_CMD_TEST:
433 HBASTATS.ElsTestReceived++;
434 EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_unsol_els_msg,
435 "%s: sid=%x. Dropping.",
436 emlxs_elscmd_xlate(cmd_code),
437 iocbq->iocb.un.elsreq.remoteID);
438
439 /* drop it */
440 emlxs_close_els_exchange(hba, port, iocb->ULPCONTEXT);
441 break;
442
443 case ELS_CMD_ESTC:
444 HBASTATS.ElsEstcReceived++;
445 EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_unsol_els_msg,
446 "%s: sid=%x. Dropping.",
447 emlxs_elscmd_xlate(cmd_code),
448 iocbq->iocb.un.elsreq.remoteID);
449
450 /* drop it */
451 emlxs_close_els_exchange(hba, port, iocb->ULPCONTEXT);
452 break;
453
454 case ELS_CMD_FARPR:
455 HBASTATS.ElsFarprReceived++;
456
457 EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_unsol_els_msg,
458 "%s: sid=%x. Dropping.",
459 emlxs_elscmd_xlate(cmd_code),
460 iocbq->iocb.un.elsreq.remoteID);
461
462 /* drop it */
463 emlxs_close_els_exchange(hba, port, iocb->ULPCONTEXT);
464 break;
465
466 case ELS_CMD_ECHO:
467 HBASTATS.ElsEchoReceived++;
468 emlxs_handle_unsol_echo_cmd(port, cp, iocbq, mp, size);
469 break;
470
471 case ELS_CMD_RLS:
472 HBASTATS.ElsRlsReceived++;
473 emlxs_handle_unsol_rls_cmd(port, cp, iocbq, mp, size);
474 break;
475
476 case ELS_CMD_RTV:
477 HBASTATS.ElsRtvReceived++;
478 emlxs_handle_unsol_rtv_cmd(port, cp, iocbq, mp, size);
479 break;
480
481 case ELS_CMD_ABTX:
482 case ELS_CMD_RCS:
483 case ELS_CMD_RES:
484 case ELS_CMD_RSS:
485 case ELS_CMD_RSI:
486 case ELS_CMD_ESTS:
487 case ELS_CMD_RRQ:
488 case ELS_CMD_REC:
489 HBASTATS.ElsGenReceived++;
490
491 EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_unsol_els_msg,
492 "%s: sid=%x. Rejecting.",
493 emlxs_elscmd_xlate(cmd_code),
494 iocbq->iocb.un.elsreq.remoteID);
495
496 (void) emlxs_els_reply(port, iocbq, ELS_CMD_LS_RJT, cmd_code,
497 LSRJT_CMD_UNSUPPORTED, LSEXP_NOTHING_MORE);
498 break;
499
418 default:
419 HBASTATS.ElsGenReceived++;
420 emlxs_handle_unsol_gen_cmd(port, cp, iocbq, mp, size);
421 break;
422 }
423
424 return (0);
425

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

436 fc_packet_t *pkt;
437 MAILBOXQ *mbox;
438 uint32_t did;
439 IOCBQ *iocbq;
440 IOCB *iocb;
441 char buffer[64];
442 uint32_t i;
443 int rc;
500 default:
501 HBASTATS.ElsGenReceived++;
502 emlxs_handle_unsol_gen_cmd(port, cp, iocbq, mp, size);
503 break;
504 }
505
506 return (0);
507

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

518 fc_packet_t *pkt;
519 MAILBOXQ *mbox;
520 uint32_t did;
521 IOCBQ *iocbq;
522 IOCB *iocb;
523 char buffer[64];
524 uint32_t i;
525 int rc;
526 uint16_t altBbCredit;
444
445 pkt = PRIV2PKT(sbp);
446 sp = (SERV_PARM *)((caddr_t)pkt->pkt_resp + sizeof (uint32_t));
447 did = LE_SWAP24_LO(pkt->pkt_cmd_fhdr.d_id);
448 iocbq = &sbp->iocbq;
449 iocb = &iocbq->iocb;
450
527
528 pkt = PRIV2PKT(sbp);
529 sp = (SERV_PARM *)((caddr_t)pkt->pkt_resp + sizeof (uint32_t));
530 did = LE_SWAP24_LO(pkt->pkt_cmd_fhdr.d_id);
531 iocbq = &sbp->iocbq;
532 iocb = &iocbq->iocb;
533
451 if (sp->cmn.fPort) {
452 mutex_enter(&EMLXS_PORT_LOCK);
534 mutex_enter(&EMLXS_PORT_LOCK);
453
535
536 /* Save the fabric service parameters and did */
537 port->did = iocb->un.elsreq.myID;
538 bcopy((void *)sp, (void *)&port->fabric_sparam, sizeof (SERV_PARM));
539
540 if (sp->cmn.fPort) {
454 hba->flag |= FC_FABRIC_ATTACHED;
455 hba->flag &= ~FC_PT_TO_PT;
456
541 hba->flag |= FC_FABRIC_ATTACHED;
542 hba->flag &= ~FC_PT_TO_PT;
543
457 /* Save our new port ID */
458 port->did = iocb->un.elsreq.myID;
459 pkt->pkt_resp_fhdr.s_id = LE_SWAP24_LO(FABRIC_DID);
460 pkt->pkt_resp_fhdr.d_id = LE_SWAP24_LO(port->did);
461
462 /* Save E_D_TOV ticks in nanoseconds */
463 if (sp->cmn.edtovResolution) {
464 hba->fc_edtov =
465 (LE_SWAP32(sp->cmn.e_d_tov) + 999999) / 1000000;
466 } else {
467 hba->fc_edtov = LE_SWAP32(sp->cmn.e_d_tov);
468 }
469
470 /* Save R_A_TOV ticks */
471 hba->fc_ratov =
472 (LE_SWAP32(sp->cmn.w2.r_a_tov) + 999) / 1000;
473
544 pkt->pkt_resp_fhdr.s_id = LE_SWAP24_LO(FABRIC_DID);
545 pkt->pkt_resp_fhdr.d_id = LE_SWAP24_LO(port->did);
546
547 /* Save E_D_TOV ticks in nanoseconds */
548 if (sp->cmn.edtovResolution) {
549 hba->fc_edtov =
550 (LE_SWAP32(sp->cmn.e_d_tov) + 999999) / 1000000;
551 } else {
552 hba->fc_edtov = LE_SWAP32(sp->cmn.e_d_tov);
553 }
554
555 /* Save R_A_TOV ticks */
556 hba->fc_ratov =
557 (LE_SWAP32(sp->cmn.w2.r_a_tov) + 999) / 1000;
558
474 if (hba->topology != TOPOLOGY_LOOP) {
475 /*
476 * If we are a N-port connected to a Fabric,
477 * fixup sparam's so logins to devices on remote
478 * loops work.
479 */
480 hba->sparam.cmn.altBbCredit = 1;
559 /*
560 * If we are a N-port connected to a Fabric,
561 * fixup sparam's so logins to devices on remote
562 * loops work.
563 */
564 altBbCredit = (hba->topology != TOPOLOGY_LOOP)? 1:0;
565 hba->sparam.cmn.altBbCredit = altBbCredit;
481
566
482 /* Set this bit in all the port sparam copies */
483 for (i = 0; i < MAX_VPORTS; i++) {
484 vport = &VPORT(i);
567 /* Set this bit in all the port sparam copies */
568 for (i = 0; i < MAX_VPORTS; i++) {
569 vport = &VPORT(i);
485
570
486 if (!(vport->flag & EMLXS_PORT_BOUND)) {
487 continue;
488 }
489
490 vport->sparam.cmn.altBbCredit = 1;
571 if (!(vport->flag & EMLXS_PORT_BOUND)) {
572 continue;
491 }
573 }
574
575 vport->sparam.cmn.altBbCredit = altBbCredit;
492 }
493
494 if (sp->cmn.rspMultipleNPort) {
495 hba->flag |= FC_NPIV_SUPPORTED;
496
497 if (cfg[CFG_NPIV_DELAY].current) {
498 /*
499 * PATCH: for NPIV support on

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

529 }
530#endif /* DHCHAP_SUPPORT */
531
532 mutex_exit(&EMLXS_PORT_LOCK);
533
534 EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_els_completion_msg,
535 "FLOGI: did=%x sid=%x %s", did, port->did, buffer);
536
576 }
577
578 if (sp->cmn.rspMultipleNPort) {
579 hba->flag |= FC_NPIV_SUPPORTED;
580
581 if (cfg[CFG_NPIV_DELAY].current) {
582 /*
583 * PATCH: for NPIV support on

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

613 }
614#endif /* DHCHAP_SUPPORT */
615
616 mutex_exit(&EMLXS_PORT_LOCK);
617
618 EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_els_completion_msg,
619 "FLOGI: did=%x sid=%x %s", did, port->did, buffer);
620
537 /* Update our service parms */
621 if (hba->sli_mode == EMLXS_HBA_SLI4_MODE) {
622 /* Deferred completion */
623 (void) emlxs_vpi_logi_cmpl_notify(sbp->port, sbp);
624 return;
625 }
626
538 if (!(mbox = (MAILBOXQ *)emlxs_mem_get(hba,
539 MEM_MBOX, 1))) {
540 emlxs_pkt_complete(sbp, IOSTAT_LOCAL_REJECT,
541 IOERR_NO_RESOURCES, 1);
542 return;
627 if (!(mbox = (MAILBOXQ *)emlxs_mem_get(hba,
628 MEM_MBOX, 1))) {
629 emlxs_pkt_complete(sbp, IOSTAT_LOCAL_REJECT,
630 IOERR_NO_RESOURCES, 1);
631 return;
543
544 }
545
632 }
633
546 /* For SLI4 we replace CONFIG_LINK and REG_LOGIN of */
547 /* Fabric with a REG_VFI mailbox command. */
548 if (hba->sli_mode == EMLXS_HBA_SLI4_MODE) {
549 emlxs_port_t *vpip = sbp->port;
550 VFIobj_t *vfip;
551 FCFIobj_t *fcfp;
552 uint32_t regvfi;
553
554 vfip = vpip->VFIp;
555 fcfp = vfip->FCFIp;
556 regvfi = vfip->state & RESOURCE_VFI_REG;
557
558 /* Save the FCF service parameters */
559 bcopy((void *)sp, (void *)&fcfp->fcf_sparam,
560 sizeof (SERV_PARM));
561
562 if (emlxs_mb_check_sparm(hba, sp)) {
563 EMLXS_MSGF(EMLXS_CONTEXT,
564 &emlxs_node_create_failed_msg,
565 "Invalid Fabric parameters. did=%06x",
566 port->did);
567 (void) emlxs_mem_put(hba, MEM_MBOX,
568 (uint8_t *)mbox);
569 emlxs_pkt_complete(sbp, IOSTAT_LOCAL_REJECT,
570 IOERR_NO_RESOURCES, 1);
571 return;
572 }
573
574 if (!regvfi) {
575 if (emlxs_mb_reg_vfi(hba, mbox, vfip, vpip) ==
576 0) {
577 EMLXS_MSGF(EMLXS_CONTEXT,
578 &emlxs_sli_detail_msg,
579 "Cannot REG_VFI for FCF: sid=%x",
580 port->did);
581
582 (void) emlxs_mem_put(hba, MEM_MBOX,
583 (uint8_t *)mbox);
584 emlxs_pkt_complete(sbp,
585 IOSTAT_LOCAL_REJECT,
586 IOERR_NO_RESOURCES, 1);
587 return;
588 }
589 mbox->sbp = (uint8_t *)sbp;
590
591 rc = EMLXS_SLI_ISSUE_MBOX_CMD(hba, mbox,
592 MBX_NOWAIT, 0);
593 if ((rc != MBX_BUSY) && (rc != MBX_SUCCESS)) {
594 EMLXS_MSGF(EMLXS_CONTEXT,
595 &emlxs_sli_detail_msg,
596 "Cannot REG_VFI for FCF: sid=%x",
597 port->did);
598
599 (void) emlxs_mem_put(hba, MEM_MBOX,
600 (uint8_t *)mbox);
601 emlxs_pkt_complete(sbp,
602 IOSTAT_LOCAL_REJECT,
603 IOERR_NO_RESOURCES, 1);
604 return;
605 }
606 /* Preset the state for the REG_VFI cmpl */
607 emlxs_set_pkt_state(sbp, IOSTAT_SUCCESS, 0, 1);
608
609 /* Deferred completion of this pkt until */
610 /* REG_VFI is complete */
611 return;
612 }
613 /* VFI is already Registered */
614
615 (void) emlxs_mem_put(hba, MEM_MBOX, (uint8_t *)mbox);
616 emlxs_pkt_complete(sbp, IOSTAT_SUCCESS, 0, 1);
617
618 EMLXS_STATE_CHANGE_LOCKED(hba, FC_READY);
619 if (regvfi) {
620 /*
621 * If NPIV Fabric support has just been
622 * established on the physical port, then
623 * notify the vports of the link up.
624 */
625 if ((hba->flag & FC_NPIV_ENABLED) &&
626 (hba->flag & FC_NPIV_SUPPORTED)) {
627 /* Skip the physical port */
628 for (i = 1; i < MAX_VPORTS; i++) {
629 vport = &VPORT(i);
630
631 if (!(vport->flag &
632 EMLXS_PORT_BOUND) ||
633 !(vport->flag &
634 EMLXS_PORT_ENABLE)) {
635 continue;
636 }
637
638 emlxs_port_online(vport);
639 }
640 }
641 }
642 return;
643 }
644
645 /* Save the fabric service parameters */
646 bcopy((void *)sp, (void *)&port->fabric_sparam,
647 sizeof (SERV_PARM));
648
634 /* Update our service parms */
649 emlxs_mb_config_link(hba, mbox);
650
651 rc = EMLXS_SLI_ISSUE_MBOX_CMD(hba, mbox, MBX_NOWAIT, 0);
652 if ((rc != MBX_BUSY) && (rc != MBX_SUCCESS)) {
635 emlxs_mb_config_link(hba, mbox);
636
637 rc = EMLXS_SLI_ISSUE_MBOX_CMD(hba, mbox, MBX_NOWAIT, 0);
638 if ((rc != MBX_BUSY) && (rc != MBX_SUCCESS)) {
653 (void) emlxs_mem_put(hba, MEM_MBOX, (uint8_t *)mbox);
639 emlxs_mem_put(hba, MEM_MBOX, (void *)mbox);
654 }
655
656 /* Preset the state for the reg_did */
657 emlxs_set_pkt_state(sbp, IOSTAT_SUCCESS, 0, 1);
658
659 if (emlxs_mb_reg_did(port, FABRIC_DID, &port->fabric_sparam,
660 sbp, NULL, NULL) == 0) {
661 /* Deferred completion of this pkt until */
662 /* login is complete */
663 return;
664 }
665
666 emlxs_pkt_complete(sbp, IOSTAT_LOCAL_REJECT,
667 IOERR_NO_RESOURCES, 1);
668
669 } else { /* No switch */
670
640 }
641
642 /* Preset the state for the reg_did */
643 emlxs_set_pkt_state(sbp, IOSTAT_SUCCESS, 0, 1);
644
645 if (emlxs_mb_reg_did(port, FABRIC_DID, &port->fabric_sparam,
646 sbp, NULL, NULL) == 0) {
647 /* Deferred completion of this pkt until */
648 /* login is complete */
649 return;
650 }
651
652 emlxs_pkt_complete(sbp, IOSTAT_LOCAL_REJECT,
653 IOERR_NO_RESOURCES, 1);
654
655 } else { /* No switch */
656
671 mutex_enter(&EMLXS_PORT_LOCK);
672
673 hba->flag &= ~FC_FABRIC_ATTACHED;
674 hba->flag |= FC_PT_TO_PT;
675
676 /* Save E_D_TOV ticks in nanoseconds */
677 if (sp->cmn.edtovResolution) {
678 hba->fc_edtov =
679 (LE_SWAP32(sp->cmn.e_d_tov) + 999999) / 1000000;
680 } else {

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

702 }
703
704 return;
705
706} /* emlxs_handle_sol_flogi() */
707
708
709static void
657 hba->flag &= ~FC_FABRIC_ATTACHED;
658 hba->flag |= FC_PT_TO_PT;
659
660 /* Save E_D_TOV ticks in nanoseconds */
661 if (sp->cmn.edtovResolution) {
662 hba->fc_edtov =
663 (LE_SWAP32(sp->cmn.e_d_tov) + 999999) / 1000000;
664 } else {

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

686 }
687
688 return;
689
690} /* emlxs_handle_sol_flogi() */
691
692
693static void
710emlxs_handle_sol_fdisk(emlxs_port_t *port, emlxs_buf_t *sbp)
694emlxs_handle_sol_fdisc(emlxs_port_t *port, emlxs_buf_t *sbp)
711{
712 emlxs_hba_t *hba = HBA;
713 emlxs_config_t *cfg = &CFG;
714 SERV_PARM *sp;
715 fc_packet_t *pkt;
716 MAILBOXQ *mbox;
717 uint32_t did;
718 IOCBQ *iocbq;

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

723 pkt = PRIV2PKT(sbp);
724 sp = (SERV_PARM *)((caddr_t)pkt->pkt_resp + sizeof (uint32_t));
725 did = LE_SWAP24_LO(pkt->pkt_cmd_fhdr.d_id);
726 iocbq = &sbp->iocbq;
727 iocb = &iocbq->iocb;
728
729 mutex_enter(&EMLXS_PORT_LOCK);
730
695{
696 emlxs_hba_t *hba = HBA;
697 emlxs_config_t *cfg = &CFG;
698 SERV_PARM *sp;
699 fc_packet_t *pkt;
700 MAILBOXQ *mbox;
701 uint32_t did;
702 IOCBQ *iocbq;

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

707 pkt = PRIV2PKT(sbp);
708 sp = (SERV_PARM *)((caddr_t)pkt->pkt_resp + sizeof (uint32_t));
709 did = LE_SWAP24_LO(pkt->pkt_cmd_fhdr.d_id);
710 iocbq = &sbp->iocbq;
711 iocb = &iocbq->iocb;
712
713 mutex_enter(&EMLXS_PORT_LOCK);
714
731 /* Save our new port ID */
715 /* Save the fabric service parameters and did */
732 port->did = iocb->un.elsreq.myID;
716 port->did = iocb->un.elsreq.myID;
733 pkt->pkt_resp_fhdr.d_id = LE_SWAP24_LO(port->did);
734
735 /* Save the fabric service parameters */
736 bcopy((void *)sp, (void *)&port->fabric_sparam, sizeof (SERV_PARM));
737
717 bcopy((void *)sp, (void *)&port->fabric_sparam, sizeof (SERV_PARM));
718
719 pkt->pkt_resp_fhdr.d_id = LE_SWAP24_LO(port->did);
720
738 mutex_exit(&EMLXS_PORT_LOCK);
739
740 buffer[0] = 0;
741
742#ifdef DHCHAP_SUPPORT
743 if (!sp->cmn.fcsp_support) {
744 (void) strcat(buffer, "fcsp:Unsupported");
745 } else if (cfg[CFG_AUTH_ENABLE].current && cfg[CFG_AUTH_NPIV].current) {
746 (void) strcat(buffer, "fcsp:Supported");
747 } else {
748 (void) strcat(buffer, "fcsp:Disabled");
749 }
750#endif /* DHCHAP_SUPPORT */
751
752 EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_els_completion_msg,
721 mutex_exit(&EMLXS_PORT_LOCK);
722
723 buffer[0] = 0;
724
725#ifdef DHCHAP_SUPPORT
726 if (!sp->cmn.fcsp_support) {
727 (void) strcat(buffer, "fcsp:Unsupported");
728 } else if (cfg[CFG_AUTH_ENABLE].current && cfg[CFG_AUTH_NPIV].current) {
729 (void) strcat(buffer, "fcsp:Supported");
730 } else {
731 (void) strcat(buffer, "fcsp:Disabled");
732 }
733#endif /* DHCHAP_SUPPORT */
734
735 EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_els_completion_msg,
753 "FDISK: did=%x sid=%x %s", did, port->did, buffer);
736 "FDISC: did=%x sid=%x %s", did, port->did, buffer);
754
755 if (hba->sli_mode == EMLXS_HBA_SLI4_MODE) {
737
738 if (hba->sli_mode == EMLXS_HBA_SLI4_MODE) {
756 emlxs_port_t *pport = &PPORT;
757
758 port->VFIp = pport->VFIp;
759
760 if (emlxs_mb_check_sparm(hba, sp)) {
761 EMLXS_MSGF(EMLXS_CONTEXT,
762 &emlxs_node_create_failed_msg,
763 "Invalid Fabric parameters. did=%06x",
764 port->did);
765 emlxs_pkt_complete(sbp, IOSTAT_LOCAL_REJECT,
766 IOERR_NO_RESOURCES, 1);
767 return;
768 }
769
770 /* Preset the state for the REG_VFI cmpl */
771 emlxs_set_pkt_state(sbp, IOSTAT_SUCCESS, 0, 1);
772
773 if (port->flag & EMLXS_PORT_REG_VPI_CMPL) {
774 emlxs_pkt_complete(sbp, -1, 0, 1);
775 } else {
776 /* Deferred completion of this pkt until */
777 /* REG_VPI is complete */
778 (void) emlxs_mb_reg_vpi(port, sbp);
779 }
780
739 (void) emlxs_vpi_logi_cmpl_notify(sbp->port, sbp);
781 return;
782 }
783
784 /* Update our service parms */
785 if ((mbox = (MAILBOXQ *)emlxs_mem_get(hba, MEM_MBOX, 1))) {
786 emlxs_mb_config_link(hba, mbox);
787
788 rc = EMLXS_SLI_ISSUE_MBOX_CMD(hba, mbox,
789 MBX_NOWAIT, 0);
790 if ((rc != MBX_BUSY) && (rc != MBX_SUCCESS)) {
740 return;
741 }
742
743 /* Update our service parms */
744 if ((mbox = (MAILBOXQ *)emlxs_mem_get(hba, MEM_MBOX, 1))) {
745 emlxs_mb_config_link(hba, mbox);
746
747 rc = EMLXS_SLI_ISSUE_MBOX_CMD(hba, mbox,
748 MBX_NOWAIT, 0);
749 if ((rc != MBX_BUSY) && (rc != MBX_SUCCESS)) {
791 (void) emlxs_mem_put(hba, MEM_MBOX, (uint8_t *)mbox);
750 emlxs_mem_put(hba, MEM_MBOX, (void *)mbox);
792 }
793 }
794
795 /* Preset the state for the reg_did */
796 emlxs_set_pkt_state(sbp, IOSTAT_SUCCESS, 0, 1);
797
798 if (emlxs_mb_reg_did(port, FABRIC_DID, &port->fabric_sparam, sbp,
799 NULL, NULL) == 0) {
800 /*
801 * Deferred completion of this pkt until login is complete
802 */
803
804 return;
805 }
806
807 emlxs_pkt_complete(sbp, IOSTAT_LOCAL_REJECT, IOERR_NO_RESOURCES, 1);
808
809 return;
810
751 }
752 }
753
754 /* Preset the state for the reg_did */
755 emlxs_set_pkt_state(sbp, IOSTAT_SUCCESS, 0, 1);
756
757 if (emlxs_mb_reg_did(port, FABRIC_DID, &port->fabric_sparam, sbp,
758 NULL, NULL) == 0) {
759 /*
760 * Deferred completion of this pkt until login is complete
761 */
762
763 return;
764 }
765
766 emlxs_pkt_complete(sbp, IOSTAT_LOCAL_REJECT, IOERR_NO_RESOURCES, 1);
767
768 return;
769
811} /* emlxs_handle_sol_fdisk() */
770} /* emlxs_handle_sol_fdisc() */
812
813
814static void
815emlxs_handle_sol_plogi(emlxs_port_t *port, emlxs_buf_t *sbp)
816{
817 emlxs_hba_t *hba = HBA;
818 emlxs_config_t *cfg = &CFG;
819 SERV_PARM *sp;

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

874
875static void
876emlxs_handle_sol_adisc(emlxs_port_t *port, emlxs_buf_t *sbp)
877{
878 emlxs_hba_t *hba = HBA;
879 fc_packet_t *pkt;
880 uint32_t did;
881 NODELIST *ndlp;
771
772
773static void
774emlxs_handle_sol_plogi(emlxs_port_t *port, emlxs_buf_t *sbp)
775{
776 emlxs_hba_t *hba = HBA;
777 emlxs_config_t *cfg = &CFG;
778 SERV_PARM *sp;

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

833
834static void
835emlxs_handle_sol_adisc(emlxs_port_t *port, emlxs_buf_t *sbp)
836{
837 emlxs_hba_t *hba = HBA;
838 fc_packet_t *pkt;
839 uint32_t did;
840 NODELIST *ndlp;
882 RPIobj_t *rp;
883
884 pkt = PRIV2PKT(sbp);
885 did = LE_SWAP24_LO(pkt->pkt_cmd_fhdr.d_id);
886
887 EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_els_completion_msg, "ADISC: did=%x",
888 did);
889
890 ndlp = emlxs_node_find_did(port, did);
891
892 if (ndlp && ndlp->nlp_active) {
893 /* Open the node again */
894 emlxs_node_open(port, ndlp, hba->channel_fcp);
895 emlxs_node_open(port, ndlp, hba->channel_ip);
896
897 if (hba->sli_mode == EMLXS_HBA_SLI4_MODE) {
841
842 pkt = PRIV2PKT(sbp);
843 did = LE_SWAP24_LO(pkt->pkt_cmd_fhdr.d_id);
844
845 EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_els_completion_msg, "ADISC: did=%x",
846 did);
847
848 ndlp = emlxs_node_find_did(port, did);
849
850 if (ndlp && ndlp->nlp_active) {
851 /* Open the node again */
852 emlxs_node_open(port, ndlp, hba->channel_fcp);
853 emlxs_node_open(port, ndlp, hba->channel_ip);
854
855 if (hba->sli_mode == EMLXS_HBA_SLI4_MODE) {
898 rp = emlxs_sli4_find_rpi(hba, ndlp->nlp_Rpi);
899 if (rp && (rp->state & RESOURCE_RPI_PAUSED)) {
900 (void) emlxs_mb_resume_rpi(hba, sbp,
901 ndlp->nlp_Rpi);
902 rp->state &= ~RESOURCE_RPI_PAUSED;
856
857 emlxs_set_pkt_state(sbp, IOSTAT_SUCCESS, 0, 1);
858
859 if (emlxs_rpi_resume_notify(port,
860 ndlp->rpip, sbp) == 0) {
903 /*
904 * Delay ADISC cmpl to ULP till
905 * after RESUME_RPI
906 */
907 return;
908 }
909 }
910 }

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

932 did = LE_SWAP24_LO(pkt->pkt_cmd_fhdr.d_id);
933
934 ndlp = emlxs_node_find_did(port, did);
935
936 if (ndlp && ndlp->nlp_active) {
937 /* Check for FCP support */
938 if ((npr->acceptRspCode == PRLI_REQ_EXECUTED) &&
939 (npr->prliType == PRLI_FCP_TYPE)) {
861 /*
862 * Delay ADISC cmpl to ULP till
863 * after RESUME_RPI
864 */
865 return;
866 }
867 }
868 }

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

890 did = LE_SWAP24_LO(pkt->pkt_cmd_fhdr.d_id);
891
892 ndlp = emlxs_node_find_did(port, did);
893
894 if (ndlp && ndlp->nlp_active) {
895 /* Check for FCP support */
896 if ((npr->acceptRspCode == PRLI_REQ_EXECUTED) &&
897 (npr->prliType == PRLI_FCP_TYPE)) {
898 /* Clear FCP2 support if no ADISC support requested */
899 if (cfg[CFG_ADISC_SUPPORT].current == 0) {
900 npr->ConfmComplAllowed = 0;
901 npr->TaskRetryIdReq = 0;
902 npr->Retry = 0;
903 }
904
940 /* Check for target */
941 if (npr->targetFunc) {
942 ndlp->nlp_fcp_info |= NLP_FCP_TGT_DEVICE;
943 } else {
944 ndlp->nlp_fcp_info &= ~NLP_FCP_TGT_DEVICE;
945 }
946
947 /* Check for initiator */

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

1311 EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_unsol_els_msg,
1312 "PLOGI rcvd: sid=%x. Restricted. Rejecting.",
1313 sid);
1314
1315 (void) emlxs_els_reply(port, iocbq, ELS_CMD_LS_RJT,
1316 ELS_CMD_PLOGI, LSRJT_UNABLE_TPC,
1317 LSEXP_NOTHING_MORE);
1318
905 /* Check for target */
906 if (npr->targetFunc) {
907 ndlp->nlp_fcp_info |= NLP_FCP_TGT_DEVICE;
908 } else {
909 ndlp->nlp_fcp_info &= ~NLP_FCP_TGT_DEVICE;
910 }
911
912 /* Check for initiator */

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

1276 EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_unsol_els_msg,
1277 "PLOGI rcvd: sid=%x. Restricted. Rejecting.",
1278 sid);
1279
1280 (void) emlxs_els_reply(port, iocbq, ELS_CMD_LS_RJT,
1281 ELS_CMD_PLOGI, LSRJT_UNABLE_TPC,
1282 LSEXP_NOTHING_MORE);
1283
1319 /*
1320 * We still need to do reg_did and unreg_did
1321 * to free up rpi
1322 */
1323 (void) emlxs_mb_reg_did(port, sid, sp, NULL, NULL,
1324 (IOCBQ *)1);
1284 /* Clear temporary RPI in firmware */
1285 if (hba->sli_mode == EMLXS_HBA_SLI3_MODE) {
1286 (void) emlxs_mb_reg_did(port, sid, sp,
1287 NULL, NULL, (IOCBQ *)1);
1288 }
1325
1326 return (1);
1327 }
1328 }
1329
1330#ifdef DHCHAP_SUPPORT
1331 if (emlxs_dhc_verify_login(port, sid, sp)) {
1332 EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_unsol_els_msg,

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

1372 /* Update our service parms */
1373 if ((mbox = (MAILBOXQ *)emlxs_mem_get(hba,
1374 MEM_MBOX, 1))) {
1375 emlxs_mb_config_link(hba, mbox);
1376
1377 rc = EMLXS_SLI_ISSUE_MBOX_CMD(hba, mbox,
1378 MBX_NOWAIT, 0);
1379 if ((rc != MBX_BUSY) && (rc != MBX_SUCCESS)) {
1289
1290 return (1);
1291 }
1292 }
1293
1294#ifdef DHCHAP_SUPPORT
1295 if (emlxs_dhc_verify_login(port, sid, sp)) {
1296 EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_unsol_els_msg,

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

1336 /* Update our service parms */
1337 if ((mbox = (MAILBOXQ *)emlxs_mem_get(hba,
1338 MEM_MBOX, 1))) {
1339 emlxs_mb_config_link(hba, mbox);
1340
1341 rc = EMLXS_SLI_ISSUE_MBOX_CMD(hba, mbox,
1342 MBX_NOWAIT, 0);
1343 if ((rc != MBX_BUSY) && (rc != MBX_SUCCESS)) {
1380 (void) emlxs_mem_put(hba, MEM_MBOX,
1381 (uint8_t *)mbox);
1344 emlxs_mem_put(hba, MEM_MBOX, (void *)mbox);
1382 }
1383
1384 }
1385 }
1386
1387 return (0);
1388
1389} /* emlxs_process_unsol_plogi() */

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

1485 emlxs_hba_t *hba = HBA;
1486 emlxs_config_t *cfg = &CFG;
1487 IOCB *iocb;
1488 uint32_t sid;
1489 NODELIST *ndlp;
1490 PRLI *npr;
1491 fc_unsol_buf_t *ubp;
1492 emlxs_ub_priv_t *ub_priv;
1345 }
1346
1347 }
1348 }
1349
1350 return (0);
1351
1352} /* emlxs_process_unsol_plogi() */

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

1448 emlxs_hba_t *hba = HBA;
1449 emlxs_config_t *cfg = &CFG;
1450 IOCB *iocb;
1451 uint32_t sid;
1452 NODELIST *ndlp;
1453 PRLI *npr;
1454 fc_unsol_buf_t *ubp;
1455 emlxs_ub_priv_t *ub_priv;
1456 uint32_t task_retry_id;
1493
1494 iocb = &iocbq->iocb;
1495 sid = iocb->un.elsreq.remoteID;
1496 ndlp = emlxs_node_find_did(port, sid);
1497
1498 if (!ndlp || !ndlp->nlp_active) {
1499 EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_unsol_els_msg,
1500 "PRLI: sid=%x: Node not found. Rejecting.", sid);

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

1506 goto drop_it;
1507 }
1508
1509 /* If node exists then save FCP2 support */
1510 npr = (PRLI *)((caddr_t)mp->virt + sizeof (uint32_t));
1511
1512 /* Check for FCP2 support */
1513 if ((npr->prliType == PRLI_FCP_TYPE) && npr->targetFunc) {
1457
1458 iocb = &iocbq->iocb;
1459 sid = iocb->un.elsreq.remoteID;
1460 ndlp = emlxs_node_find_did(port, sid);
1461
1462 if (!ndlp || !ndlp->nlp_active) {
1463 EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_unsol_els_msg,
1464 "PRLI: sid=%x: Node not found. Rejecting.", sid);

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

1470 goto drop_it;
1471 }
1472
1473 /* If node exists then save FCP2 support */
1474 npr = (PRLI *)((caddr_t)mp->virt + sizeof (uint32_t));
1475
1476 /* Check for FCP2 support */
1477 if ((npr->prliType == PRLI_FCP_TYPE) && npr->targetFunc) {
1478 /* Clear FCP2 support if no ADISC support is requested */
1479 if (cfg[CFG_ADISC_SUPPORT].current == 0) {
1480 npr->ConfmComplAllowed = 0;
1481 npr->TaskRetryIdReq = 0;
1482 npr->Retry = 0;
1483 }
1484
1514 /* Check for target */
1515 if (npr->targetFunc) {
1516 ndlp->nlp_fcp_info |= NLP_FCP_TGT_DEVICE;
1517 } else {
1518 ndlp->nlp_fcp_info &= ~NLP_FCP_TGT_DEVICE;
1519 }
1520
1521 /* Check for initiator */
1522 if (npr->initiatorFunc) {
1523 ndlp->nlp_fcp_info |= NLP_FCP_INI_DEVICE;
1524 } else {
1525 ndlp->nlp_fcp_info &= ~NLP_FCP_INI_DEVICE;
1526 }
1527
1485 /* Check for target */
1486 if (npr->targetFunc) {
1487 ndlp->nlp_fcp_info |= NLP_FCP_TGT_DEVICE;
1488 } else {
1489 ndlp->nlp_fcp_info &= ~NLP_FCP_TGT_DEVICE;
1490 }
1491
1492 /* Check for initiator */
1493 if (npr->initiatorFunc) {
1494 ndlp->nlp_fcp_info |= NLP_FCP_INI_DEVICE;
1495 } else {
1496 ndlp->nlp_fcp_info &= ~NLP_FCP_INI_DEVICE;
1497 }
1498
1499 /* If TRI support is not required then force */
1500 /* the task_retry_id value to one */
1501 if (cfg[CFG_TRI_REQUIRED].current == 0) {
1502 task_retry_id = 1;
1503 } else {
1504 task_retry_id = npr->TaskRetryIdReq;
1505 }
1506
1528 /* Check for FCP2 target support */
1507 /* Check for FCP2 target support */
1529 if (npr->targetFunc && npr->Retry) {
1508 /* Retry and TaskRetryId bits are both required here */
1509 if (npr->targetFunc && npr->Retry && task_retry_id) {
1530 ndlp->nlp_fcp_info |= NLP_FCP_2_DEVICE;
1531 } else {
1532 ndlp->nlp_fcp_info &= ~NLP_FCP_2_DEVICE;
1533 }
1534 }
1535
1536#ifdef ULP_PATCH3
1537 if (cfg[CFG_ENABLE_PATCH].current & ULP_PATCH3) {

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

1937 "LOGO: sid=%x buffer=%p token=%x.", sid, ubp,
1938 ub_priv->token);
1939 }
1940
1941#if (EMLXS_MODREVX == EMLXS_MODREV2X)
1942 emlxs_swap_els_ub(ubp);
1943#endif /* EMLXS_MODREV2X */
1944
1510 ndlp->nlp_fcp_info |= NLP_FCP_2_DEVICE;
1511 } else {
1512 ndlp->nlp_fcp_info &= ~NLP_FCP_2_DEVICE;
1513 }
1514 }
1515
1516#ifdef ULP_PATCH3
1517 if (cfg[CFG_ENABLE_PATCH].current & ULP_PATCH3) {

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

1917 "LOGO: sid=%x buffer=%p token=%x.", sid, ubp,
1918 ub_priv->token);
1919 }
1920
1921#if (EMLXS_MODREVX == EMLXS_MODREV2X)
1922 emlxs_swap_els_ub(ubp);
1923#endif /* EMLXS_MODREV2X */
1924
1945 /* Clear the RPI */
1925 /* Unregister the node */
1946 if ((sid & FABRIC_DID_MASK) == FABRIC_DID_MASK) {
1926 if ((sid & FABRIC_DID_MASK) == FABRIC_DID_MASK) {
1947 if (emlxs_mb_unreg_did(port, sid, NULL, ubp, NULL) == 0) {
1948 /*
1949 * Deferred completion of this ubp
1950 * until unreg login is complete
1951 */
1952
1953 return;
1927 if (ndlp) {
1928 if (emlxs_mb_unreg_node(port, ndlp, NULL,
1929 ubp, NULL) == 0) {
1930 /*
1931 * Deferred completion of this ubp
1932 * until unreg login is complete
1933 */
1934 return;
1935 }
1954 }
1955 }
1956
1957 emlxs_ub_callback(port, ubp);
1958
1959drop_it:
1960
1961 return;

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

2022
2023drop_it:
2024
2025 return;
2026
2027} /* emlxs_handle_unsol_gen_cmd() */
2028
2029
1936 }
1937 }
1938
1939 emlxs_ub_callback(port, ubp);
1940
1941drop_it:
1942
1943 return;

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

2004
2005drop_it:
2006
2007 return;
2008
2009} /* emlxs_handle_unsol_gen_cmd() */
2010
2011
2012/* ARGSUSED */
2013static void
2014emlxs_handle_unsol_echo_cmd(emlxs_port_t *port, CHANNEL *cp, IOCBQ *iocbq,
2015 MATCHMAP *mp, uint32_t size)
2016{
2017 emlxs_hba_t *hba = HBA;
2018 uint8_t *bp;
2019 IOCB *iocb;
2020 uint32_t *lp;
2021 uint32_t sid;
2022 fc_packet_t *pkt;
2023 uint32_t cmd;
2024
2025 iocb = &iocbq->iocb;
2026 sid = iocb->un.elsreq.remoteID;
2027
2028 bp = mp->virt;
2029 lp = (uint32_t *)bp;
2030 cmd = *lp & ELS_CMD_MASK;
2031
2032 if (!(pkt = emlxs_pkt_alloc(port,
2033 size, 0, 0, KM_NOSLEEP))) {
2034 EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_unsol_els_msg,
2035 "ECHO: sid=%x. Unable to allocate pkt. Rejecting.",
2036 sid);
2037
2038 (void) emlxs_els_reply(port, iocbq, ELS_CMD_LS_RJT,
2039 ELS_CMD_ECHO, LSRJT_UNABLE_TPC, LSEXP_NOTHING_MORE);
2040 return;
2041 }
2042
2043 EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_unsol_els_msg,
2044 "ECHO: sid=%x. Accepting.",
2045 sid);
2046
2047 /* Common initialization */
2048 pkt->pkt_tran_type = FC_PKT_OUTBOUND;
2049 pkt->pkt_timeout = (2 * hba->fc_ratov);
2050
2051 if ((uint32_t)iocb->ULPCLASS == CLASS2) {
2052 pkt->pkt_tran_flags &= ~FC_TRAN_CLASS3;
2053 pkt->pkt_tran_flags |= FC_TRAN_CLASS2;
2054 }
2055
2056 /* Build the fc header */
2057 pkt->pkt_cmd_fhdr.d_id =
2058 LE_SWAP24_LO(iocb->un.elsreq.remoteID);
2059 pkt->pkt_cmd_fhdr.r_ctl =
2060 R_CTL_EXTENDED_SVC | R_CTL_SOLICITED_CONTROL;
2061 pkt->pkt_cmd_fhdr.s_id = LE_SWAP24_LO(iocb->un.elsreq.myID);
2062 pkt->pkt_cmd_fhdr.type = FC_TYPE_EXTENDED_LS;
2063 pkt->pkt_cmd_fhdr.f_ctl =
2064 F_CTL_XCHG_CONTEXT | F_CTL_LAST_SEQ | F_CTL_END_SEQ;
2065 pkt->pkt_cmd_fhdr.seq_id = 0;
2066 pkt->pkt_cmd_fhdr.df_ctl = 0;
2067 pkt->pkt_cmd_fhdr.seq_cnt = 0;
2068 pkt->pkt_cmd_fhdr.ox_id = (cmd >> ELS_CMD_SHIFT) & 0xff;
2069 pkt->pkt_cmd_fhdr.rx_id = iocb->ULPCONTEXT;
2070 pkt->pkt_cmd_fhdr.ro = 0;
2071
2072 /* Build the response */
2073 *lp = ELS_CMD_ACC;
2074 bcopy(lp, pkt->pkt_cmd, size);
2075
2076 if (emlxs_pkt_send(pkt, 1) != FC_SUCCESS) {
2077 /* Free the pkt */
2078 emlxs_pkt_free(pkt);
2079 emlxs_abort_els_exchange(hba, port, iocb->ULPCONTEXT);
2080 }
2081
2082 return;
2083
2084} /* emlxs_handle_unsol_echo_cmd() */
2085
2086
2087/* ARGSUSED */
2088static void
2089emlxs_handle_unsol_rtv_cmd(emlxs_port_t *port, CHANNEL *cp, IOCBQ *iocbq,
2090 MATCHMAP *mp, uint32_t size)
2091{
2092 emlxs_hba_t *hba = HBA;
2093 uint8_t *bp;
2094 IOCB *iocb;
2095 uint32_t *lp;
2096 uint32_t sid;
2097 fc_packet_t *pkt;
2098 uint32_t cmd;
2099 SERV_PARM *sp;
2100
2101 iocb = &iocbq->iocb;
2102 sid = iocb->un.elsreq.remoteID;
2103
2104 bp = mp->virt;
2105 lp = (uint32_t *)bp;
2106 cmd = *lp & ELS_CMD_MASK;
2107
2108 if (!(pkt = emlxs_pkt_alloc(port,
2109 (4 * sizeof (uint32_t)), 0, 0, KM_NOSLEEP))) {
2110 EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_unsol_els_msg,
2111 "RTV: sid=%x. Unable to allocate pkt. Rejecting.",
2112 sid);
2113
2114 (void) emlxs_els_reply(port, iocbq, ELS_CMD_LS_RJT,
2115 ELS_CMD_RTV, LSRJT_UNABLE_TPC, LSEXP_NOTHING_MORE);
2116 return;
2117 }
2118
2119 EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_unsol_els_msg,
2120 "RTV: sid=%x. Accepting.",
2121 emlxs_elscmd_xlate(cmd),
2122 sid);
2123
2124 /* Common initialization */
2125 pkt->pkt_tran_type = FC_PKT_OUTBOUND;
2126 pkt->pkt_timeout = (2 * hba->fc_ratov);
2127
2128 if ((uint32_t)iocb->ULPCLASS == CLASS2) {
2129 pkt->pkt_tran_flags &= ~FC_TRAN_CLASS3;
2130 pkt->pkt_tran_flags |= FC_TRAN_CLASS2;
2131 }
2132
2133 /* Build the fc header */
2134 pkt->pkt_cmd_fhdr.d_id =
2135 LE_SWAP24_LO(iocb->un.elsreq.remoteID);
2136 pkt->pkt_cmd_fhdr.r_ctl =
2137 R_CTL_EXTENDED_SVC | R_CTL_SOLICITED_CONTROL;
2138 pkt->pkt_cmd_fhdr.s_id = LE_SWAP24_LO(iocb->un.elsreq.myID);
2139 pkt->pkt_cmd_fhdr.type = FC_TYPE_EXTENDED_LS;
2140 pkt->pkt_cmd_fhdr.f_ctl =
2141 F_CTL_XCHG_CONTEXT | F_CTL_LAST_SEQ | F_CTL_END_SEQ;
2142 pkt->pkt_cmd_fhdr.seq_id = 0;
2143 pkt->pkt_cmd_fhdr.df_ctl = 0;
2144 pkt->pkt_cmd_fhdr.seq_cnt = 0;
2145 pkt->pkt_cmd_fhdr.ox_id = (cmd >> ELS_CMD_SHIFT) & 0xff;
2146 pkt->pkt_cmd_fhdr.rx_id = iocb->ULPCONTEXT;
2147 pkt->pkt_cmd_fhdr.ro = 0;
2148
2149 /* Build the response */
2150 sp = (SERV_PARM *)&port->sparam;
2151 lp = (uint32_t *)pkt->pkt_cmd;
2152 lp[0] = ELS_CMD_ACC;
2153 lp[1] = LE_SWAP32(sp->cmn.w2.r_a_tov);
2154 lp[2] = LE_SWAP32(sp->cmn.e_d_tov);
2155 lp[3] = LE_SWAP32(sp->cmn.edtovResolution << 26);
2156
2157 if (emlxs_pkt_send(pkt, 1) != FC_SUCCESS) {
2158 /* Free the pkt */
2159 emlxs_pkt_free(pkt);
2160 emlxs_abort_els_exchange(hba, port, iocb->ULPCONTEXT);
2161 }
2162
2163 return;
2164
2165} /* emlxs_handle_unsol_rtv_cmd() */
2166
2167
2168/* ARGSUSED */
2169static void
2170emlxs_rls_rsp_thread(emlxs_hba_t *hba, void *arg1, void *arg2)
2171{
2172 emlxs_port_t *port = (emlxs_port_t *)arg1;
2173 fc_packet_t *pkt = (fc_packet_t *)arg2;
2174 MAILBOXQ *mbq = NULL;
2175 MAILBOX *mb;
2176 la_els_rls_acc_t *rls;
2177 uint32_t rval;
2178
2179 EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_unsol_els_msg,
2180 "RLS: sid=%x. Accepting.",
2181 LE_SWAP24_LO(pkt->pkt_cmd_fhdr.d_id));
2182
2183 if (!(mbq = (MAILBOXQ *)emlxs_mem_get(hba, MEM_MBOX, 1))) {
2184 goto dropit;
2185 }
2186 mb = (MAILBOX *)mbq;
2187
2188 /* Read current link status */
2189 emlxs_mb_read_lnk_stat(hba, mbq);
2190 rval = EMLXS_SLI_ISSUE_MBOX_CMD(hba, mbq, MBX_WAIT, 0);
2191
2192 if (rval != MBX_SUCCESS) {
2193 goto dropit;
2194 }
2195
2196 /* Build the response */
2197 rls = (la_els_rls_acc_t *)pkt->pkt_cmd;
2198 rls->ls_code.ls_code = 0x02;
2199 rls->rls_link_params.rls_link_fail =
2200 mb->un.varRdLnk.linkFailureCnt;
2201 rls->rls_link_params.rls_sync_loss =
2202 mb->un.varRdLnk.lossSyncCnt;
2203 rls->rls_link_params.rls_sig_loss =
2204 mb->un.varRdLnk.lossSignalCnt;
2205 rls->rls_link_params.rls_prim_seq_err =
2206 mb->un.varRdLnk.primSeqErrCnt;
2207 rls->rls_link_params.rls_invalid_word =
2208 mb->un.varRdLnk.invalidXmitWord;
2209 rls->rls_link_params.rls_invalid_crc =
2210 mb->un.varRdLnk.crcCnt;
2211
2212 LE_SWAP32_BUFFER((uint8_t *)rls, sizeof (la_els_rls_acc_t));
2213
2214 emlxs_mem_put(hba, MEM_MBOX, (void *)mbq);
2215 mbq = NULL;
2216
2217 if ((rval = emlxs_pkt_send(pkt, 1)) != FC_SUCCESS) {
2218 goto dropit;
2219 }
2220
2221 return;
2222
2223dropit:
2224
2225 emlxs_abort_els_exchange(hba, port, pkt->pkt_cmd_fhdr.rx_id);
2226
2227 emlxs_pkt_free(pkt);
2228
2229 if (mbq) {
2230 emlxs_mem_put(hba, MEM_MBOX, (void *)mbq);
2231 }
2232
2233 return;
2234
2235} /* emlxs_rls_rsp_thread() */
2236
2237
2238/* ARGSUSED */
2239static void
2240emlxs_handle_unsol_rls_cmd(emlxs_port_t *port, CHANNEL *cp, IOCBQ *iocbq,
2241 MATCHMAP *mp, uint32_t size)
2242{
2243 emlxs_hba_t *hba = HBA;
2244 uint8_t *bp;
2245 IOCB *iocb;
2246 uint32_t *lp;
2247 uint32_t sid;
2248 fc_packet_t *pkt;
2249 uint32_t cmd;
2250
2251 iocb = &iocbq->iocb;
2252 sid = iocb->un.elsreq.remoteID;
2253
2254 bp = mp->virt;
2255 lp = (uint32_t *)bp;
2256 cmd = *lp++ & ELS_CMD_MASK;
2257
2258 if (!(pkt = emlxs_pkt_alloc(port,
2259 sizeof (la_els_rls_acc_t), 0, 0, KM_NOSLEEP))) {
2260 EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_unsol_els_msg,
2261 "RLS: sid=%x. Unable to allocate pkt. Rejecting.",
2262 sid);
2263
2264 (void) emlxs_els_reply(port, iocbq, ELS_CMD_LS_RJT,
2265 ELS_CMD_RLS, LSRJT_UNABLE_TPC, LSEXP_NOTHING_MORE);
2266 return;
2267 }
2268
2269 EMLXS_MSGF(EMLXS_CONTEXT, &emlxs_unsol_els_msg,
2270 "RLS: sid=%x. Scheduling response.",
2271 sid);
2272
2273 /* Common initialization */
2274 pkt->pkt_tran_type = FC_PKT_OUTBOUND;
2275 pkt->pkt_timeout = (2 * hba->fc_ratov);
2276
2277 if ((uint32_t)iocb->ULPCLASS == CLASS2) {
2278 pkt->pkt_tran_flags &= ~FC_TRAN_CLASS3;
2279 pkt->pkt_tran_flags |= FC_TRAN_CLASS2;
2280 }
2281
2282 /* Build the fc header */
2283 pkt->pkt_cmd_fhdr.d_id =
2284 LE_SWAP24_LO(iocb->un.elsreq.remoteID);
2285 pkt->pkt_cmd_fhdr.r_ctl =
2286 R_CTL_EXTENDED_SVC | R_CTL_SOLICITED_CONTROL;
2287 pkt->pkt_cmd_fhdr.s_id = LE_SWAP24_LO(iocb->un.elsreq.myID);
2288 pkt->pkt_cmd_fhdr.type = FC_TYPE_EXTENDED_LS;
2289 pkt->pkt_cmd_fhdr.f_ctl =
2290 F_CTL_XCHG_CONTEXT | F_CTL_LAST_SEQ | F_CTL_END_SEQ;
2291 pkt->pkt_cmd_fhdr.seq_id = 0;
2292 pkt->pkt_cmd_fhdr.df_ctl = 0;
2293 pkt->pkt_cmd_fhdr.seq_cnt = 0;
2294 pkt->pkt_cmd_fhdr.ox_id = (cmd >> ELS_CMD_SHIFT) & 0xff;
2295 pkt->pkt_cmd_fhdr.rx_id = iocb->ULPCONTEXT;
2296 pkt->pkt_cmd_fhdr.ro = 0;
2297
2298 /* We must spawn a separate thread to send the */
2299 /* read link status mailbox command becasue we are */
2300 /* normally in a hardware interrupt context here. */
2301 emlxs_thread_spawn(hba, emlxs_rls_rsp_thread,
2302 (void *)port, (void *)pkt);
2303
2304 return;
2305
2306} /* emlxs_handle_unsol_rls_cmd() */
2307
2308
2030/* This handles the reply completions to unsolicited cmds */
2031/* ARGSUSED */
2032static void
2033emlxs_handle_acc(emlxs_port_t *port, emlxs_buf_t *sbp, IOCBQ *iocbq,
2034 uint32_t flag)
2035{
2036 emlxs_hba_t *hba = HBA;
2037 fc_packet_t *pkt;

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

2150extern int32_t
2151emlxs_els_reply(emlxs_port_t *port, IOCBQ *iocbq, uint32_t type,
2152 uint32_t type2, uint32_t reason, uint32_t explain)
2153{
2154 emlxs_hba_t *hba = HBA;
2155 emlxs_config_t *cfg = &CFG;
2156 fc_packet_t *pkt;
2157 ELS_PKT *els;
2309/* This handles the reply completions to unsolicited cmds */
2310/* ARGSUSED */
2311static void
2312emlxs_handle_acc(emlxs_port_t *port, emlxs_buf_t *sbp, IOCBQ *iocbq,
2313 uint32_t flag)
2314{
2315 emlxs_hba_t *hba = HBA;
2316 fc_packet_t *pkt;

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

2429extern int32_t
2430emlxs_els_reply(emlxs_port_t *port, IOCBQ *iocbq, uint32_t type,
2431 uint32_t type2, uint32_t reason, uint32_t explain)
2432{
2433 emlxs_hba_t *hba = HBA;
2434 emlxs_config_t *cfg = &CFG;
2435 fc_packet_t *pkt;
2436 ELS_PKT *els;
2158 uint32_t rval;
2159 IOCB *iocb;
2160
2161 iocb = &iocbq->iocb;
2162
2163 switch (type) {
2164 case ELS_CMD_ACC: /* Accept Response */
2165
2166 /* Allocate the pkt */
2167 switch (type2) {
2168 case ELS_CMD_FLOGI:
2437 IOCB *iocb;
2438
2439 iocb = &iocbq->iocb;
2440
2441 switch (type) {
2442 case ELS_CMD_ACC: /* Accept Response */
2443
2444 /* Allocate the pkt */
2445 switch (type2) {
2446 case ELS_CMD_FLOGI:
2169 if (!(pkt = emlxs_pkt_alloc(port,
2447 pkt = emlxs_pkt_alloc(port,
2170 sizeof (uint32_t) + sizeof (SERV_PARM), 0,
2448 sizeof (uint32_t) + sizeof (SERV_PARM), 0,
2171 0, KM_NOSLEEP))) {
2172 return (1);
2173 }
2449 0, KM_NOSLEEP);
2174 break;
2175
2176 case ELS_CMD_ADISC:
2450 break;
2451
2452 case ELS_CMD_ADISC:
2177 if (!(pkt = emlxs_pkt_alloc(port,
2453 pkt = emlxs_pkt_alloc(port,
2178 sizeof (uint32_t) + sizeof (ADISC), 0, 0,
2454 sizeof (uint32_t) + sizeof (ADISC), 0, 0,
2179 KM_NOSLEEP))) {
2180 return (1);
2181 }
2455 KM_NOSLEEP);
2182 break;
2183
2184 case ELS_CMD_PRLI:
2456 break;
2457
2458 case ELS_CMD_PRLI:
2185 if (!(pkt = emlxs_pkt_alloc(port,
2459 pkt = emlxs_pkt_alloc(port,
2186 sizeof (uint32_t) + sizeof (PRLI), 0, 0,
2460 sizeof (uint32_t) + sizeof (PRLI), 0, 0,
2187 KM_NOSLEEP))) {
2188 return (1);
2189 }
2461 KM_NOSLEEP);
2190 break;
2191
2192 case ELS_CMD_PRLO:
2462 break;
2463
2464 case ELS_CMD_PRLO:
2193 if (!(pkt = emlxs_pkt_alloc(port,
2465 pkt = emlxs_pkt_alloc(port,
2194 sizeof (uint32_t) + sizeof (PRLO), 0, 0,
2466 sizeof (uint32_t) + sizeof (PRLO), 0, 0,
2195 KM_NOSLEEP))) {
2196 return (1);
2197 }
2467 KM_NOSLEEP);
2198 break;
2199
2200 case ELS_CMD_AUTH:
2201 default:
2468 break;
2469
2470 case ELS_CMD_AUTH:
2471 default:
2472 pkt = emlxs_pkt_alloc(port, sizeof (uint32_t),
2473 0, 0, KM_NOSLEEP);
2474 }
2202
2475
2203 if (!(pkt = emlxs_pkt_alloc(port, sizeof (uint32_t),
2204 0, 0, KM_NOSLEEP))) {
2205 return (1);
2206 }
2476 if (!pkt) {
2477 goto dropit;
2207 }
2208
2209 /* Common initialization */
2210 pkt->pkt_tran_type = FC_PKT_OUTBOUND;
2211 pkt->pkt_timeout = (2 * hba->fc_ratov);
2212
2213 if ((uint32_t)iocb->ULPCLASS == CLASS2) {
2214 pkt->pkt_tran_flags &= ~FC_TRAN_CLASS3;

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

2270 }
2271
2272 if (port->tgt_mode) {
2273 els->un.prli.targetFunc = 1;
2274 }
2275
2276 els->un.prli.readXferRdyDis = 1;
2277
2478 }
2479
2480 /* Common initialization */
2481 pkt->pkt_tran_type = FC_PKT_OUTBOUND;
2482 pkt->pkt_timeout = (2 * hba->fc_ratov);
2483
2484 if ((uint32_t)iocb->ULPCLASS == CLASS2) {
2485 pkt->pkt_tran_flags &= ~FC_TRAN_CLASS3;

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

2541 }
2542
2543 if (port->tgt_mode) {
2544 els->un.prli.targetFunc = 1;
2545 }
2546
2547 els->un.prli.readXferRdyDis = 1;
2548
2278 if (hba->vpd.feaLevelHigh >= 0x02) {
2549 if ((hba->vpd.feaLevelHigh >= 0x02) &&
2550 (cfg[CFG_ADISC_SUPPORT].current != 0)) {
2279 els->un.prli.ConfmComplAllowed = 1;
2280 els->un.prli.Retry = 1;
2281 els->un.prli.TaskRetryIdReq = 1;
2282 } else {
2283 els->un.prli.ConfmComplAllowed = 0;
2284 els->un.prli.Retry = 0;
2285 els->un.prli.TaskRetryIdReq = 0;
2286 }

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

2301
2302 } /* switch(type2) */
2303 break;
2304
2305 case ELS_CMD_LS_RJT: /* reject response */
2306
2307 if (!(pkt = emlxs_pkt_alloc(port,
2308 sizeof (uint32_t) + sizeof (LS_RJT), 0, 0, KM_NOSLEEP))) {
2551 els->un.prli.ConfmComplAllowed = 1;
2552 els->un.prli.Retry = 1;
2553 els->un.prli.TaskRetryIdReq = 1;
2554 } else {
2555 els->un.prli.ConfmComplAllowed = 0;
2556 els->un.prli.Retry = 0;
2557 els->un.prli.TaskRetryIdReq = 0;
2558 }

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

2573
2574 } /* switch(type2) */
2575 break;
2576
2577 case ELS_CMD_LS_RJT: /* reject response */
2578
2579 if (!(pkt = emlxs_pkt_alloc(port,
2580 sizeof (uint32_t) + sizeof (LS_RJT), 0, 0, KM_NOSLEEP))) {
2309 return (1);
2581 goto dropit;
2310 }
2311
2312 pkt->pkt_tran_type = FC_PKT_OUTBOUND;
2313 pkt->pkt_timeout = (2 * hba->fc_ratov);
2314
2315 if ((uint32_t)iocb->ULPCLASS == CLASS2) {
2316 pkt->pkt_tran_flags &= ~FC_TRAN_CLASS3;
2317 pkt->pkt_tran_flags |= FC_TRAN_CLASS2;

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

2345 els->un.lsRjt.un.b.lsRjtRsvd0 = 0;
2346 els->un.lsRjt.un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC;
2347 els->un.lsRjt.un.b.lsRjtRsnCodeExp = LSEXP_NOTHING_MORE;
2348 els->un.lsRjt.un.b.vendorUnique = 0x01;
2349
2350 break;
2351 }
2352
2582 }
2583
2584 pkt->pkt_tran_type = FC_PKT_OUTBOUND;
2585 pkt->pkt_timeout = (2 * hba->fc_ratov);
2586
2587 if ((uint32_t)iocb->ULPCLASS == CLASS2) {
2588 pkt->pkt_tran_flags &= ~FC_TRAN_CLASS3;
2589 pkt->pkt_tran_flags |= FC_TRAN_CLASS2;

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

2617 els->un.lsRjt.un.b.lsRjtRsvd0 = 0;
2618 els->un.lsRjt.un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC;
2619 els->un.lsRjt.un.b.lsRjtRsnCodeExp = LSEXP_NOTHING_MORE;
2620 els->un.lsRjt.un.b.vendorUnique = 0x01;
2621
2622 break;
2623 }
2624
2353 if ((rval = emlxs_pkt_send(pkt, 1)) != FC_SUCCESS) {
2625 if (emlxs_pkt_send(pkt, 1) != FC_SUCCESS) {
2354 /* Free the pkt */
2355 emlxs_pkt_free(pkt);
2626 /* Free the pkt */
2627 emlxs_pkt_free(pkt);
2628 goto dropit;
2356 }
2357
2629 }
2630
2358 return (rval);
2631 return (0);
2359
2632
2633dropit:
2634
2635 emlxs_abort_els_exchange(hba, port, iocb->ULPCONTEXT);
2636 return (1);
2637
2360} /* emlxs_els_reply() */
2361
2362
2363#ifdef ULP_PATCH6
2364
2365extern uint32_t
2366emlxs_generate_rscn(emlxs_port_t *port, uint32_t d_id)
2367{

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

2947 emlxs_abort_ct_exchange(hba, port, iocb->ULPCONTEXT);
2948 }
2949
2950 return (0);
2951
2952} /* emlxs_ct_handle_unsol_req() */
2953
2954
2638} /* emlxs_els_reply() */
2639
2640
2641#ifdef ULP_PATCH6
2642
2643extern uint32_t
2644emlxs_generate_rscn(emlxs_port_t *port, uint32_t d_id)
2645{

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

3225 emlxs_abort_ct_exchange(hba, port, iocb->ULPCONTEXT);
3226 }
3227
3228 return (0);
3229
3230} /* emlxs_ct_handle_unsol_req() */
3231
3232
3233#if (EMLXS_MODREV < EMLXS_MODREV4)
2955static void
2956emlxs_send_rsnn(emlxs_port_t *port)
2957{
2958 emlxs_hba_t *hba = HBA;
2959 fc_packet_t *pkt;
2960 SLI_CT_REQUEST *ct;
2961
2962 if (!(pkt = emlxs_pkt_alloc(port, sizeof (SLI_CT_REQUEST),

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

3005 if (emlxs_pkt_send(pkt, 0) != FC_SUCCESS) {
3006 /* Free the pkt */
3007 emlxs_pkt_free(pkt);
3008 }
3009
3010 return;
3011
3012} /* emlxs_send_rsnn() */
3234static void
3235emlxs_send_rsnn(emlxs_port_t *port)
3236{
3237 emlxs_hba_t *hba = HBA;
3238 fc_packet_t *pkt;
3239 SLI_CT_REQUEST *ct;
3240
3241 if (!(pkt = emlxs_pkt_alloc(port, sizeof (SLI_CT_REQUEST),

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

3284 if (emlxs_pkt_send(pkt, 0) != FC_SUCCESS) {
3285 /* Free the pkt */
3286 emlxs_pkt_free(pkt);
3287 }
3288
3289 return;
3290
3291} /* emlxs_send_rsnn() */
3292#endif /* < EMLXS_MODREV4 */
3013
3014
3293
3294
3295
3015extern uint32_t
3016emlxs_ub_send_login_acc(emlxs_port_t *port, fc_unsol_buf_t *ubp)
3017{
3018 emlxs_hba_t *hba = HBA;
3019 fc_packet_t *pkt;
3020 ELS_PKT *els;
3021 uint32_t rval;
3022 emlxs_ub_priv_t *ub_priv;

--- 101 unchanged lines hidden ---
3296extern uint32_t
3297emlxs_ub_send_login_acc(emlxs_port_t *port, fc_unsol_buf_t *ubp)
3298{
3299 emlxs_hba_t *hba = HBA;
3300 fc_packet_t *pkt;
3301 ELS_PKT *els;
3302 uint32_t rval;
3303 emlxs_ub_priv_t *ub_priv;

--- 101 unchanged lines hidden ---