961 linkdown = 1;
962 break;
963
964 case 0xfd: /* New fabric */
965 default:
966 mask = 0x00000000;
967 linkdown = 1;
968 clear_all = 1;
969 break;
970 }
971
972 aff_d_id = aid->aff_d_id & mask;
973
974
975 /*
976 * If link is down then this is a hard shutdown and flush
977 * If link not down then this is a soft shutdown and flush
978 * (e.g. RSCN)
979 */
980 if (linkdown) {
981 mutex_enter(&EMLXS_PORT_LOCK);
982
983 port->flag &= EMLXS_PORT_LINKDOWN_MASK;
984
985 if (port->ulp_statec != FC_STATE_OFFLINE) {
986 port->ulp_statec = FC_STATE_OFFLINE;
987
988 port->prev_did = port->did;
989 port->did = 0;
990 port->rdid = 0;
991
992 bcopy(&port->fabric_sparam, &port->prev_fabric_sparam,
993 sizeof (SERV_PARM));
994 bzero(&port->fabric_sparam, sizeof (SERV_PARM));
995
996 update = 1;
997 }
998
999 mutex_exit(&EMLXS_PORT_LOCK);
1000
1537 case LA_2GHZ_LINK:
1538 (void) strlcpy(linkspeed, "2Gb", sizeof (linkspeed));
1539 state |= FC_STATE_2GBIT_SPEED;
1540 break;
1541 case LA_4GHZ_LINK:
1542 (void) strlcpy(linkspeed, "4Gb", sizeof (linkspeed));
1543 state |= FC_STATE_4GBIT_SPEED;
1544 break;
1545 case LA_8GHZ_LINK:
1546 (void) strlcpy(linkspeed, "8Gb", sizeof (linkspeed));
1547 state |= FC_STATE_8GBIT_SPEED;
1548 break;
1549 case LA_10GHZ_LINK:
1550 (void) strlcpy(linkspeed, "10Gb", sizeof (linkspeed));
1551 state |= FC_STATE_10GBIT_SPEED;
1552 break;
1553 case LA_16GHZ_LINK:
1554 (void) strlcpy(linkspeed, "16Gb", sizeof (linkspeed));
1555 state |= FC_STATE_16GBIT_SPEED;
1556 break;
1557 default:
1558 (void) snprintf(linkspeed, sizeof (linkspeed), "unknown(0x%x)",
1559 hba->linkspeed);
1560 break;
1561 }
1562
1563 npiv_linkup = 0;
1564 update = 0;
1565
1566 if ((hba->state >= FC_LINK_UP) &&
1567 !(hba->flag & FC_LOOPBACK_MODE) && (vport->ulp_statec != state)) {
1568 update = 1;
1569 vport->ulp_statec = state;
1570
1571 if ((vport->vpi > 0) && !(hba->flag & FC_NPIV_LINKUP)) {
1572 hba->flag |= FC_NPIV_LINKUP;
1573 npiv_linkup = 1;
1574 }
1575 }
1576
1605 EMLXS_MSGF(EMLXS_CONTEXT,
1606 &emlxs_npiv_link_up_msg, "%s%s%s *",
1607 linkspeed, topology, mode);
1608 }
1609 }
1610
1611 /* Check for waiting threads */
1612 if (vport->vpi == 0) {
1613 mutex_enter(&EMLXS_LINKUP_LOCK);
1614 if (hba->linkup_wait_flag == TRUE) {
1615 hba->linkup_wait_flag = FALSE;
1616 cv_broadcast(&EMLXS_LINKUP_CV);
1617 }
1618 mutex_exit(&EMLXS_LINKUP_LOCK);
1619 }
1620
1621 /* Flush any pending ub buffers */
1622 emlxs_ub_flush(vport);
1623 }
1624
1625 return;
1626
1627 } /* emlxs_port_online() */
1628
1629
1630 /* SLI3 */
1631 extern void
1632 emlxs_linkdown(emlxs_hba_t *hba)
1633 {
1634 emlxs_port_t *port = &PPORT;
1635 int i;
1636 uint32_t scope;
1637
1638 mutex_enter(&EMLXS_PORT_LOCK);
1639
1640 if (hba->state > FC_LINK_DOWN) {
1641 HBASTATS.LinkDown++;
1642 EMLXS_STATE_CHANGE_LOCKED(hba, FC_LINK_DOWN);
1643 }
1644
|
961 linkdown = 1;
962 break;
963
964 case 0xfd: /* New fabric */
965 default:
966 mask = 0x00000000;
967 linkdown = 1;
968 clear_all = 1;
969 break;
970 }
971
972 aff_d_id = aid->aff_d_id & mask;
973
974
975 /*
976 * If link is down then this is a hard shutdown and flush
977 * If link not down then this is a soft shutdown and flush
978 * (e.g. RSCN)
979 */
980 if (linkdown) {
981 hba->flag &= ~FC_GPIO_LINK_UP;
982
983 mutex_enter(&EMLXS_PORT_LOCK);
984
985 port->flag &= EMLXS_PORT_LINKDOWN_MASK;
986
987 if (port->ulp_statec != FC_STATE_OFFLINE) {
988 port->ulp_statec = FC_STATE_OFFLINE;
989
990 port->prev_did = port->did;
991 port->did = 0;
992 port->rdid = 0;
993
994 bcopy(&port->fabric_sparam, &port->prev_fabric_sparam,
995 sizeof (SERV_PARM));
996 bzero(&port->fabric_sparam, sizeof (SERV_PARM));
997
998 update = 1;
999 }
1000
1001 mutex_exit(&EMLXS_PORT_LOCK);
1002
1539 case LA_2GHZ_LINK:
1540 (void) strlcpy(linkspeed, "2Gb", sizeof (linkspeed));
1541 state |= FC_STATE_2GBIT_SPEED;
1542 break;
1543 case LA_4GHZ_LINK:
1544 (void) strlcpy(linkspeed, "4Gb", sizeof (linkspeed));
1545 state |= FC_STATE_4GBIT_SPEED;
1546 break;
1547 case LA_8GHZ_LINK:
1548 (void) strlcpy(linkspeed, "8Gb", sizeof (linkspeed));
1549 state |= FC_STATE_8GBIT_SPEED;
1550 break;
1551 case LA_10GHZ_LINK:
1552 (void) strlcpy(linkspeed, "10Gb", sizeof (linkspeed));
1553 state |= FC_STATE_10GBIT_SPEED;
1554 break;
1555 case LA_16GHZ_LINK:
1556 (void) strlcpy(linkspeed, "16Gb", sizeof (linkspeed));
1557 state |= FC_STATE_16GBIT_SPEED;
1558 break;
1559 case LA_32GHZ_LINK:
1560 (void) strlcpy(linkspeed, "32Gb", sizeof (linkspeed));
1561 state |= FC_STATE_32GBIT_SPEED;
1562 break;
1563 default:
1564 (void) snprintf(linkspeed, sizeof (linkspeed), "unknown(0x%x)",
1565 hba->linkspeed);
1566 break;
1567 }
1568
1569 npiv_linkup = 0;
1570 update = 0;
1571
1572 if ((hba->state >= FC_LINK_UP) &&
1573 !(hba->flag & FC_LOOPBACK_MODE) && (vport->ulp_statec != state)) {
1574 update = 1;
1575 vport->ulp_statec = state;
1576
1577 if ((vport->vpi > 0) && !(hba->flag & FC_NPIV_LINKUP)) {
1578 hba->flag |= FC_NPIV_LINKUP;
1579 npiv_linkup = 1;
1580 }
1581 }
1582
1611 EMLXS_MSGF(EMLXS_CONTEXT,
1612 &emlxs_npiv_link_up_msg, "%s%s%s *",
1613 linkspeed, topology, mode);
1614 }
1615 }
1616
1617 /* Check for waiting threads */
1618 if (vport->vpi == 0) {
1619 mutex_enter(&EMLXS_LINKUP_LOCK);
1620 if (hba->linkup_wait_flag == TRUE) {
1621 hba->linkup_wait_flag = FALSE;
1622 cv_broadcast(&EMLXS_LINKUP_CV);
1623 }
1624 mutex_exit(&EMLXS_LINKUP_LOCK);
1625 }
1626
1627 /* Flush any pending ub buffers */
1628 emlxs_ub_flush(vport);
1629 }
1630
1631 hba->flag |= FC_GPIO_LINK_UP;
1632
1633 return;
1634
1635 } /* emlxs_port_online() */
1636
1637
1638 /* SLI3 */
1639 extern void
1640 emlxs_linkdown(emlxs_hba_t *hba)
1641 {
1642 emlxs_port_t *port = &PPORT;
1643 int i;
1644 uint32_t scope;
1645
1646 mutex_enter(&EMLXS_PORT_LOCK);
1647
1648 if (hba->state > FC_LINK_DOWN) {
1649 HBASTATS.LinkDown++;
1650 EMLXS_STATE_CHANGE_LOCKED(hba, FC_LINK_DOWN);
1651 }
1652
|