Lines Matching refs:ldcp

76 static	void vsw_ldc_detach(vsw_ldc_t *ldcp);
77 static int vsw_ldc_init(vsw_ldc_t *ldcp);
78 static void vsw_ldc_uninit(vsw_ldc_t *ldcp);
79 static void vsw_ldc_drain(vsw_ldc_t *ldcp);
106 static void vsw_set_vnet_proto_ops(vsw_ldc_t *ldcp);
107 static void vsw_reset_vnet_proto_ops(vsw_ldc_t *ldcp);
127 static void vsw_process_evt_read(vsw_ldc_t *ldcp);
128 static void vsw_ldc_rcv(vsw_ldc_t *ldcp);
132 static void vsw_ldcsend_pkt(vsw_ldc_t *ldcp, mblk_t *mp);
133 static int vsw_ldcsend(vsw_ldc_t *ldcp, mblk_t *mp, uint32_t retries);
142 static void vsw_send_physlink_msg(vsw_ldc_t *ldcp, link_state_t plink_state);
146 static dring_info_t *vsw_map_dring(vsw_ldc_t *ldcp, void *pkt);
147 static void vsw_unmap_dring(vsw_ldc_t *ldcp);
148 static void vsw_destroy_dring(vsw_ldc_t *ldcp);
150 static int vsw_map_data(vsw_ldc_t *ldcp, dring_info_t *dp, void *pkt);
152 dring_info_t *vsw_map_dring_cmn(vsw_ldc_t *ldcp,
154 static int vsw_mapin_avail(vsw_ldc_t *ldcp);
157 static void vsw_stop_tx_thread(vsw_ldc_t *ldcp);
193 extern void vsw_hio_start(vsw_t *vswp, vsw_ldc_t *ldcp);
194 extern void vsw_hio_stop(vsw_t *vswp, vsw_ldc_t *ldcp);
195 extern void vsw_process_dds_msg(vsw_t *vswp, vsw_ldc_t *ldcp, void *msg);
201 extern void vsw_stop_msg_thread(vsw_ldc_t *ldcp);
208 extern int vsw_setup_tx_dring(vsw_ldc_t *ldcp, dring_info_t *dp);
209 extern void vsw_destroy_tx_dring(vsw_ldc_t *ldcp);
210 extern dring_info_t *vsw_map_rx_dring(vsw_ldc_t *ldcp, void *pkt);
211 extern void vsw_unmap_rx_dring(vsw_ldc_t *ldcp);
215 extern void vsw_destroy_rx_dring(vsw_ldc_t *ldcp);
216 extern dring_info_t *vsw_map_tx_dring(vsw_ldc_t *ldcp, void *pkt);
217 extern void vsw_unmap_tx_dring(vsw_ldc_t *ldcp);
219 extern void vsw_stop_rcv_thread(vsw_ldc_t *ldcp);
240 #define LDC_ENTER_LOCK(ldcp) \
241 mutex_enter(&((ldcp)->ldc_cblock));\
242 mutex_enter(&((ldcp)->ldc_rxlock));\
243 mutex_enter(&((ldcp)->ldc_txlock));
244 #define LDC_EXIT_LOCK(ldcp) \
245 mutex_exit(&((ldcp)->ldc_txlock));\
246 mutex_exit(&((ldcp)->ldc_rxlock));\
247 mutex_exit(&((ldcp)->ldc_cblock));
249 #define VSW_VER_EQ(ldcp, major, minor) \
250 ((ldcp)->lane_out.ver_major == (major) && \
251 (ldcp)->lane_out.ver_minor == (minor))
253 #define VSW_VER_LT(ldcp, major, minor) \
254 (((ldcp)->lane_out.ver_major < (major)) || \
255 ((ldcp)->lane_out.ver_major == (major) && \
256 (ldcp)->lane_out.ver_minor < (minor)))
258 #define VSW_VER_GTEQ(ldcp, major, minor) \
259 (((ldcp)->lane_out.ver_major > (major)) || \
260 ((ldcp)->lane_out.ver_major == (major) && \
261 (ldcp)->lane_out.ver_minor >= (minor)))
263 #define VSW_VER_LTEQ(ldcp, major, minor) \
264 (((ldcp)->lane_out.ver_major < (major)) || \
265 ((ldcp)->lane_out.ver_major == (major) && \
266 (ldcp)->lane_out.ver_minor <= (minor)))
396 (void) vsw_ldc_init(port->ldcp);
521 vsw_ldc_uninit(port->ldcp);
532 vsw_ldc_drain(port->ldcp);
534 vsw_ldc_detach(port->ldcp);
566 vsw_ldc_t *ldcp = NULL;
580 ldcp = kmem_zalloc(sizeof (vsw_ldc_t), KM_NOSLEEP);
581 if (ldcp == NULL) {
585 ldcp->ldc_id = ldc_id;
587 mutex_init(&ldcp->ldc_txlock, NULL, MUTEX_DRIVER, NULL);
588 mutex_init(&ldcp->ldc_rxlock, NULL, MUTEX_DRIVER, NULL);
589 mutex_init(&ldcp->ldc_cblock, NULL, MUTEX_DRIVER, NULL);
590 ldcp->msg_thr_flags = 0;
591 mutex_init(&ldcp->msg_thr_lock, NULL, MUTEX_DRIVER, NULL);
592 cv_init(&ldcp->msg_thr_cv, NULL, CV_DRIVER, NULL);
593 ldcp->rcv_thr_flags = 0;
594 mutex_init(&ldcp->rcv_thr_lock, NULL, MUTEX_DRIVER, NULL);
595 cv_init(&ldcp->rcv_thr_cv, NULL, CV_DRIVER, NULL);
596 mutex_init(&ldcp->drain_cv_lock, NULL, MUTEX_DRIVER, NULL);
597 cv_init(&ldcp->drain_cv, NULL, CV_DRIVER, NULL);
600 ldcp->local_session = (uint64_t)ddi_get_lbolt();
601 ldcp->peer_session = 0;
602 ldcp->session_status = 0;
603 ldcp->hss_id = 1; /* Initial handshake session id */
604 ldcp->hphase = VSW_MILESTONE0;
609 vsw_set_lane_attr(vswp, &ldcp->lane_out);
615 status = ldc_init(ldc_id, &attr, &ldcp->ldc_handle);
623 ldcp->tx_thr_flags = 0;
624 ldcp->tx_mhead = ldcp->tx_mtail = NULL;
626 mutex_init(&ldcp->tx_thr_lock, NULL, MUTEX_DRIVER, NULL);
627 cv_init(&ldcp->tx_thr_cv, NULL, CV_DRIVER, NULL);
628 ldcp->tx_thread = thread_create(NULL, 2 * DEFAULTSTKSZ,
629 vsw_ldc_tx_worker, ldcp, 0, &p0, TS_RUN, maxclsyspri);
632 if (ldcp->tx_thread == NULL) {
639 status = ldc_reg_callback(ldcp->ldc_handle, vsw_ldc_cb, (caddr_t)ldcp);
643 (void) ldc_fini(ldcp->ldc_handle);
650 ldcp->msglen = VIO_PKT_DATA_HDRSIZE + vswp->max_frame_size;
651 ldcp->ldcmsg = kmem_alloc(ldcp->msglen, KM_SLEEP);
655 mutex_init(&ldcp->status_lock, NULL, MUTEX_DRIVER, NULL);
657 if (ldc_status(ldcp->ldc_handle, &istatus) != 0) {
659 mutex_destroy(&ldcp->status_lock);
663 ldcp->ldc_status = istatus;
664 ldcp->ldc_port = port;
665 ldcp->ldc_vswp = vswp;
667 vsw_reset_vnet_proto_ops(ldcp);
669 (void) sprintf(kname, "%sldc0x%lx", DRV_NAME, ldcp->ldc_id);
670 ldcp->ksp = vgen_setup_kstats(DRV_NAME, vswp->instance,
671 kname, &ldcp->ldc_stats);
672 if (ldcp->ksp == NULL) {
678 port->ldcp = ldcp;
686 (void) ldc_unreg_callback(ldcp->ldc_handle);
687 kmem_free(ldcp->ldcmsg, ldcp->msglen);
691 if (ldcp->tx_thread != NULL) {
692 vsw_stop_tx_thread(ldcp);
694 mutex_destroy(&ldcp->tx_thr_lock);
695 cv_destroy(&ldcp->tx_thr_cv);
697 if (ldcp->ksp != NULL) {
698 vgen_destroy_kstats(ldcp->ksp);
700 mutex_destroy(&ldcp->msg_thr_lock);
701 mutex_destroy(&ldcp->rcv_thr_lock);
702 mutex_destroy(&ldcp->ldc_txlock);
703 mutex_destroy(&ldcp->ldc_rxlock);
704 mutex_destroy(&ldcp->ldc_cblock);
705 mutex_destroy(&ldcp->drain_cv_lock);
706 cv_destroy(&ldcp->msg_thr_cv);
707 cv_destroy(&ldcp->rcv_thr_cv);
708 cv_destroy(&ldcp->drain_cv);
710 kmem_free(ldcp, sizeof (vsw_ldc_t));
720 vsw_ldc_detach(vsw_ldc_t *ldcp)
723 vsw_t *vswp = ldcp->ldc_port->p_vswp;
726 D2(vswp, "%s: detaching channel %lld", __func__, ldcp->ldc_id);
729 if (ldcp->rcv_thread != NULL) {
730 vsw_stop_rcv_thread(ldcp);
731 } else if (ldcp->msg_thread != NULL) {
732 vsw_stop_msg_thread(ldcp);
734 kmem_free(ldcp->ldcmsg, ldcp->msglen);
737 if (ldcp->tx_thread != NULL) {
738 vsw_stop_tx_thread(ldcp);
739 mutex_destroy(&ldcp->tx_thr_lock);
740 cv_destroy(&ldcp->tx_thr_cv);
741 if (ldcp->tx_mhead != NULL) {
742 freemsgchain(ldcp->tx_mhead);
743 ldcp->tx_mhead = ldcp->tx_mtail = NULL;
744 ldcp->tx_cnt = 0;
749 vgen_destroy_kstats(ldcp->ksp);
755 vsw_free_lane_resources(ldcp, INBOUND);
756 vsw_free_lane_resources(ldcp, OUTBOUND);
761 while ((rv = ldc_close(ldcp->ldc_handle)) == EAGAIN) {
770 vswp->instance, rv, ldcp->ldc_id);
773 (void) ldc_fini(ldcp->ldc_handle);
775 ldcp->ldc_status = LDC_INIT;
776 ldcp->ldc_handle = NULL;
777 ldcp->ldc_vswp = NULL;
779 mutex_destroy(&ldcp->msg_thr_lock);
780 mutex_destroy(&ldcp->rcv_thr_lock);
781 mutex_destroy(&ldcp->ldc_txlock);
782 mutex_destroy(&ldcp->ldc_rxlock);
783 mutex_destroy(&ldcp->ldc_cblock);
784 mutex_destroy(&ldcp->drain_cv_lock);
785 mutex_destroy(&ldcp->status_lock);
786 cv_destroy(&ldcp->msg_thr_cv);
787 cv_destroy(&ldcp->rcv_thr_cv);
788 cv_destroy(&ldcp->drain_cv);
790 kmem_free(ldcp, sizeof (vsw_ldc_t));
801 vsw_ldc_init(vsw_ldc_t *ldcp)
803 vsw_t *vswp = ldcp->ldc_vswp;
809 LDC_ENTER_LOCK(ldcp);
812 ldcp->next_ident = 1;
814 rv = ldc_open(ldcp->ldc_handle);
817 __func__, ldcp->ldc_id, rv);
818 LDC_EXIT_LOCK(ldcp);
822 if (ldc_status(ldcp->ldc_handle, &istatus) != 0) {
824 LDC_EXIT_LOCK(ldcp);
829 __func__, ldcp->ldc_id, istatus);
830 LDC_EXIT_LOCK(ldcp);
834 mutex_enter(&ldcp->status_lock);
835 ldcp->ldc_status = istatus;
836 mutex_exit(&ldcp->status_lock);
838 rv = ldc_up(ldcp->ldc_handle);
845 ldcp->ldc_id, rv);
846 LDC_EXIT_LOCK(ldcp);
855 mutex_enter(&ldcp->status_lock);
856 if (ldc_status(ldcp->ldc_handle, &ldcp->ldc_status) != 0) {
858 mutex_exit(&ldcp->status_lock);
859 LDC_EXIT_LOCK(ldcp);
864 if (ldcp->ldc_status == LDC_UP) {
866 ldcp->ldc_id, istatus);
867 mutex_exit(&ldcp->status_lock);
868 LDC_EXIT_LOCK(ldcp);
870 vsw_process_conn_evt(ldcp, VSW_CONN_UP);
874 mutex_exit(&ldcp->status_lock);
875 LDC_EXIT_LOCK(ldcp);
883 vsw_ldc_uninit(vsw_ldc_t *ldcp)
885 vsw_t *vswp = ldcp->ldc_vswp;
888 D1(vswp, "vsw_ldc_uninit: enter: id(%lx)\n", ldcp->ldc_id);
890 LDC_ENTER_LOCK(ldcp);
892 rv = ldc_set_cb_mode(ldcp->ldc_handle, LDC_CB_DISABLE);
895 "interrupts (rv = %d)\n", ldcp->ldc_id, rv);
898 mutex_enter(&ldcp->status_lock);
899 ldcp->ldc_status = LDC_INIT;
900 mutex_exit(&ldcp->status_lock);
902 LDC_EXIT_LOCK(ldcp);
904 D1(vswp, "vsw_ldc_uninit: exit: id(%lx)", ldcp->ldc_id);
943 vsw_ldc_drain(vsw_ldc_t *ldcp)
945 vsw_t *vswp = ldcp->ldc_port->p_vswp;
955 mutex_enter(&ldcp->drain_cv_lock);
958 ldcp->drain_state = VSW_LDC_DRAINING;
960 if ((ldc_unreg_callback(ldcp->ldc_handle)) == 0) {
962 ldcp->ldc_id);
963 mutex_exit(&ldcp->drain_cv_lock);
976 while (ldc_unreg_callback(ldcp->ldc_handle) == EWOULDBLOCK) {
977 (void) cv_timedwait(&ldcp->drain_cv,
978 &ldcp->drain_cv_lock, ddi_get_lbolt() + hz);
981 mutex_exit(&ldcp->drain_cv_lock);
983 "timeout", __func__, ldcp->ldc_id);
1072 vsw_ldc_t *ldcp = portp->ldcp;
1074 mutex_enter(&ldcp->ldc_cblock);
1080 if (ldcp->hphase == VSW_MILESTONE4 && VSW_VER_LT(ldcp, 1, 3) &&
1082 vsw_process_conn_evt(ldcp, VSW_CONN_RESTART);
1085 mutex_exit(&ldcp->ldc_cblock);
1091 vsw_ldc_t *ldcp = portp->ldcp;
1093 mutex_enter(&ldcp->ldc_cblock);
1100 if ((ldcp->hphase == VSW_MILESTONE4) &&
1103 (void) ldc_down(ldcp->ldc_handle);
1105 vsw_process_conn_evt(ldcp, VSW_CONN_RESTART);
1109 mutex_exit(&ldcp->ldc_cblock);
1115 vsw_ldc_t *ldcp = portp->ldcp;
1117 mutex_enter(&ldcp->ldc_cblock);
1122 vsw_process_conn_evt(ldcp, VSW_CONN_RESTART);
1124 mutex_exit(&ldcp->ldc_cblock);
1144 vsw_send_physlink_msg(vsw_ldc_t *ldcp, link_state_t plink_state)
1159 msgp->tag.vio_sid = ldcp->local_session;
1162 (void) vsw_send_msg(ldcp, msgp, sizeof (msg), B_TRUE);
1168 vsw_ldc_t *ldcp;
1172 ldcp = portp->ldcp;
1174 mutex_enter(&ldcp->ldc_cblock);
1181 if (ldcp->hphase == VSW_MILESTONE4 && ldcp->pls_negotiated == B_TRUE) {
1182 vsw_send_physlink_msg(ldcp, vswp->phys_link_state);
1185 mutex_exit(&ldcp->ldc_cblock);
1240 vsw_ldc_t *ldcp = (vsw_ldc_t *)arg;
1241 vsw_t *vswp = ldcp->ldc_vswp;
1243 D1(vswp, "%s: enter: ldcid (%lld)\n", __func__, ldcp->ldc_id);
1245 mutex_enter(&ldcp->ldc_cblock);
1246 ldcp->ldc_stats.callbacks++;
1248 mutex_enter(&ldcp->status_lock);
1249 if ((ldcp->ldc_status == LDC_INIT) || (ldcp->ldc_handle == NULL)) {
1250 mutex_exit(&ldcp->status_lock);
1251 mutex_exit(&ldcp->ldc_cblock);
1254 mutex_exit(&ldcp->status_lock);
1261 __func__, ldcp->ldc_id, event, ldcp->ldc_status);
1263 vsw_process_conn_evt(ldcp, VSW_CONN_UP);
1273 __func__, ldcp->ldc_id, event);
1275 vsw_process_evt_read(ldcp);
1284 __func__, ldcp->ldc_id, event, ldcp->ldc_status);
1286 vsw_process_conn_evt(ldcp, VSW_CONN_RESET);
1296 __func__, ldcp->ldc_id, event, ldcp->ldc_status);
1300 mutex_exit(&ldcp->ldc_cblock);
1306 mutex_enter(&ldcp->drain_cv_lock);
1307 if (ldcp->drain_state == VSW_LDC_DRAINING)
1308 cv_signal(&ldcp->drain_cv);
1309 mutex_exit(&ldcp->drain_cv_lock);
1318 vsw_ldc_reinit(vsw_ldc_t *ldcp)
1320 vsw_t *vswp = ldcp->ldc_vswp;
1325 port = ldcp->ldc_port;
1328 ldcp->lane_in.lstate, ldcp->lane_out.lstate);
1330 vsw_free_lane_resources(ldcp, INBOUND);
1331 vsw_free_lane_resources(ldcp, OUTBOUND);
1333 ldcp->lane_in.lstate = 0;
1334 ldcp->lane_out.lstate = 0;
1343 ldcp->peer_session = 0;
1344 ldcp->session_status = 0;
1345 ldcp->hcnt = 0;
1346 ldcp->hphase = VSW_MILESTONE0;
1348 vsw_reset_vnet_proto_ops(ldcp);
1357 vsw_process_conn_evt(vsw_ldc_t *ldcp, uint16_t evt)
1359 vsw_t *vswp = ldcp->ldc_vswp;
1377 (ldstub((uint8_t *)&ldcp->reset_active)))
1398 mutex_enter(&ldcp->status_lock);
1400 if ((ldcp->ldc_status == LDC_UP) || (ldcp->reset_active != 0)) {
1401 mutex_exit(&ldcp->status_lock);
1405 mutex_exit(&ldcp->status_lock);
1413 (void) atomic_inc_32(&ldcp->hss_id);
1424 conn->ldcp = ldcp;
1445 ldcp->reset_active = 0;
1455 vsw_ldc_t *ldcp = NULL;
1461 ldcp = conn->ldcp;
1463 vswp = ldcp->ldc_vswp;
1464 portp = ldcp->ldc_port;
1471 if (ldcp->rcv_thread != NULL) {
1472 vsw_stop_rcv_thread(ldcp);
1473 } else if (ldcp->msg_thread != NULL) {
1474 vsw_stop_msg_thread(ldcp);
1477 mutex_enter(&ldcp->status_lock);
1478 if (ldc_status(ldcp->ldc_handle, &curr_status) != 0) {
1480 "channel %ld", vswp->instance, ldcp->ldc_id);
1481 mutex_exit(&ldcp->status_lock);
1491 (void) ldc_down(ldcp->ldc_handle);
1494 vsw_hio_stop(vswp, ldcp);
1500 vsw_ldc_reinit(ldcp);
1507 (void) ldc_up(ldcp->ldc_handle);
1513 if (ldc_status(ldcp->ldc_handle, &curr_status) != 0) {
1515 "channel %ld", vswp->instance, ldcp->ldc_id);
1516 mutex_exit(&ldcp->status_lock);
1520 ldcp->ldc_status = curr_status;
1524 if (ldcp->hcnt++ > vsw_num_handshakes) {
1527 vswp->instance, ldcp->hcnt, ldcp->ldc_id);
1528 mutex_exit(&ldcp->status_lock);
1533 (ddi_taskq_dispatch(vswp->taskq_p, vsw_send_ver, ldcp,
1542 if (ldcp->hcnt > 0)
1543 ldcp->hcnt--;
1556 ldcp->reset_active = 0;
1558 mutex_exit(&ldcp->status_lock);
1568 vsw_check_flag(vsw_ldc_t *ldcp, int dir, uint64_t flag)
1570 vsw_t *vswp = ldcp->ldc_vswp;
1575 state = ldcp->lane_in.lstate;
1577 state = ldcp->lane_out.lstate;
1579 phase = ldcp->hphase;
1585 " when in state %d\n", ldcp->ldc_id, phase);
1586 vsw_process_conn_evt(ldcp, VSW_CONN_RESTART);
1595 "VER_NACK when in state %d\n", ldcp->ldc_id, phase);
1596 vsw_process_conn_evt(ldcp, VSW_CONN_RESTART);
1605 " when in state %d\n", ldcp->ldc_id, phase);
1606 vsw_process_conn_evt(ldcp, VSW_CONN_RESTART);
1616 ldcp->ldc_id, phase);
1617 vsw_process_conn_evt(ldcp, VSW_CONN_RESTART);
1626 " when in state %d\n", ldcp->ldc_id, phase);
1627 vsw_process_conn_evt(ldcp, VSW_CONN_RESTART);
1637 ldcp->ldc_id, phase);
1638 vsw_process_conn_evt(ldcp, VSW_CONN_RESTART);
1647 " when in state %d\n", ldcp->ldc_id, phase);
1648 vsw_process_conn_evt(ldcp, VSW_CONN_RESTART);
1657 "RDX_NACK when in state %d\n", ldcp->ldc_id, phase);
1658 vsw_process_conn_evt(ldcp, VSW_CONN_RESTART);
1667 " when in state %d\n", ldcp->ldc_id, phase);
1668 vsw_process_conn_evt(ldcp, VSW_CONN_RESTART);
1675 ldcp->ldc_id, flag);
1680 ldcp->lane_in.lstate = state;
1682 ldcp->lane_out.lstate = state;
1684 D1(vswp, "vsw_check_flag (chan %lld): exit", ldcp->ldc_id);
1690 vsw_next_milestone(vsw_ldc_t *ldcp)
1692 vsw_t *vswp = ldcp->ldc_vswp;
1693 vsw_port_t *portp = ldcp->ldc_port;
1694 lane_t *lane_out = &ldcp->lane_out;
1695 lane_t *lane_in = &ldcp->lane_in;
1698 ldcp->ldc_id, ldcp->hphase);
1703 switch (ldcp->hphase) {
1712 "with peer", __func__, ldcp->ldc_id);
1713 vsw_process_conn_evt(ldcp, VSW_CONN_UP);
1724 __func__, ldcp->ldc_id);
1726 vsw_set_vnet_proto_ops(ldcp);
1732 ldcp->hphase = VSW_MILESTONE1;
1733 vsw_send_attr(ldcp);
1748 ldcp->hphase = VSW_MILESTONE2;
1756 if ((VSW_VER_GTEQ(ldcp, 1, 2) &&
1758 (VSW_VER_LT(ldcp, 1, 2) &&
1760 vsw_send_dring_info(ldcp);
1781 if ((VSW_VER_GTEQ(ldcp, 1, 2) &&
1783 (VSW_VER_LT(ldcp, 1, 2) &&
1791 __func__, ldcp->ldc_id);
1793 ldcp->hphase = VSW_MILESTONE3;
1794 vsw_send_rdx(ldcp);
1811 __func__, ldcp->ldc_id);
1820 ldcp->hphase = VSW_MILESTONE4;
1821 ldcp->hcnt = 0;
1826 vsw_hio_start(vswp, ldcp);
1829 if (ldcp->pls_negotiated == B_TRUE) {
1836 vsw_send_physlink_msg(ldcp,
1849 ldcp->ldc_id);
1854 ldcp->ldc_id, ldcp->hphase);
1857 D1(vswp, "%s (chan %lld): exit (phase %ld)", __func__, ldcp->ldc_id,
1858 ldcp->hphase);
1923 vsw_set_vnet_proto_ops(vsw_ldc_t *ldcp)
1925 vsw_t *vswp = ldcp->ldc_vswp;
1926 lane_t *lp = &ldcp->lane_out;
1947 if (VSW_VER_GTEQ(ldcp, 1, 6)) {
1953 if (vsw_mapin_avail(ldcp) == B_TRUE) {
1965 if (VSW_VER_GTEQ(ldcp, 1, 4)) {
1971 } else if (VSW_VER_EQ(ldcp, 1, 3)) {
1978 vsw_port_t *portp = ldcp->ldc_port;
1996 if (VSW_VER_GTEQ(ldcp, 1, 2)) {
2004 ldcp->tx = vsw_ldctx_pri;
2005 ldcp->rx_pktdata = vsw_process_pkt_data;
2012 ldcp->tx = vsw_ldctx;
2013 ldcp->rx_pktdata = vsw_process_pkt_data_nop;
2022 vsw_reset_vnet_proto_ops(ldcp);
2030 vsw_reset_vnet_proto_ops(vsw_ldc_t *ldcp)
2032 lane_t *lp = &ldcp->lane_out;
2034 ldcp->tx = vsw_ldctx;
2035 ldcp->rx_pktdata = vsw_process_pkt_data_nop;
2042 vsw_process_evt_read(vsw_ldc_t *ldcp)
2044 if (ldcp->msg_thread != NULL) {
2049 mutex_exit(&ldcp->ldc_cblock);
2050 mutex_enter(&ldcp->msg_thr_lock);
2051 if (!(ldcp->msg_thr_flags & VSW_WTHR_DATARCVD)) {
2052 ldcp->msg_thr_flags |= VSW_WTHR_DATARCVD;
2053 cv_signal(&ldcp->msg_thr_cv);
2055 mutex_exit(&ldcp->msg_thr_lock);
2056 mutex_enter(&ldcp->ldc_cblock);
2067 vsw_process_pkt(ldcp);
2077 vsw_ldc_t *ldcp = (vsw_ldc_t *)arg;
2078 vsw_t *vswp = ldcp->ldc_vswp;
2085 D1(vswp, "%s enter: ldcid (%lld)\n", __func__, ldcp->ldc_id);
2087 ASSERT(MUTEX_HELD(&ldcp->ldc_cblock));
2089 ldcmsg = ldcp->ldcmsg;
2094 msglen = ldcp->msglen;
2095 rv = ldc_read(ldcp->ldc_handle, (caddr_t)ldcmsg, &msglen);
2099 __func__, ldcp->ldc_id, rv, msglen);
2104 vsw_process_conn_evt(ldcp, VSW_CONN_RESET);
2110 ldcp->ldc_id);
2115 ldcp->ldc_id, msglen);
2125 vsw_dispatch_ctrl_task(ldcp, ldcmsg, tagp, msglen);
2128 vsw_process_data_pkt(ldcp, ldcmsg, tagp, msglen);
2131 vsw_process_err_pkt(ldcp, ldcmsg, tagp);
2135 "id(%lx)\n", tagp->vio_msgtype, ldcp->ldc_id);
2140 D1(vswp, "%s exit: ldcid (%lld)\n", __func__, ldcp->ldc_id);
2147 vsw_dispatch_ctrl_task(vsw_ldc_t *ldcp, void *cpkt, vio_msg_tag_t *tagp,
2151 vsw_port_t *port = ldcp->ldc_port;
2164 if (vsw_check_flag(ldcp, INBOUND, VSW_RDX_ACK_RECV))
2167 ldcp->lane_in.lstate |= VSW_RDX_ACK_RECV;
2170 ldcp->ldc_id, ldcp->lane_in.lstate, ldcp->hphase);
2171 vsw_next_milestone(ldcp);
2179 vsw_process_conn_evt(ldcp, VSW_CONN_RESTART);
2183 ctaskp->ldcp = ldcp;
2185 ctaskp->hss_id = ldcp->hss_id;
2199 vsw_process_conn_evt(ldcp, VSW_CONN_RESTART);
2212 ldcp->ldc_id);
2223 vsw_ldc_t *ldcp = ctaskp->ldcp;
2224 vsw_t *vswp = ldcp->ldc_vswp;
2228 D1(vswp, "%s(%lld): enter", __func__, ldcp->ldc_id);
2234 if (ctaskp->hss_id < ldcp->hss_id) {
2242 if (ldcp->session_status & VSW_PEER_SESSION) {
2243 if (ldcp->peer_session != tag.vio_sid) {
2245 __func__, ldcp->ldc_id, tag.vio_sid);
2247 vsw_process_conn_evt(ldcp, VSW_CONN_RESTART);
2258 vsw_process_ctrl_ver_pkt(ldcp, &ctaskp->pktp);
2261 vsw_process_ctrl_dring_reg_pkt(ldcp, &ctaskp->pktp);
2264 vsw_process_ctrl_dring_unreg_pkt(ldcp, &ctaskp->pktp);
2267 vsw_process_ctrl_attr_pkt(ldcp, &ctaskp->pktp);
2270 vsw_process_ctrl_mcst_pkt(ldcp, &ctaskp->pktp);
2273 vsw_process_ctrl_rdx_pkt(ldcp, &ctaskp->pktp);
2276 vsw_process_dds_msg(vswp, ldcp, &ctaskp->pktp);
2280 vsw_process_physlink_msg(ldcp, &ctaskp->pktp);
2287 D1(vswp, "%s(%lld): exit", __func__, ldcp->ldc_id);
2305 vsw_process_ctrl_ver_pkt(vsw_ldc_t *ldcp, void *pkt)
2308 vsw_t *vswp = ldcp->ldc_vswp;
2310 D1(vswp, "%s(%lld): enter", __func__, ldcp->ldc_id);
2328 if ((ldcp->session_status & VSW_PEER_SESSION) &&
2329 (ldcp->peer_session != ver_pkt->tag.vio_sid)) {
2331 "from %llx to %llx", __func__, ldcp->ldc_id,
2332 ldcp->peer_session, ver_pkt->tag.vio_sid);
2335 ldcp->peer_session = ver_pkt->tag.vio_sid;
2336 ldcp->session_status |= VSW_PEER_SESSION;
2339 if (vsw_check_flag(ldcp, INBOUND, VSW_VER_INFO_RECV))
2351 ver_pkt->tag.vio_sid = ldcp->local_session;
2356 (void) vsw_send_msg(ldcp, (void *)ver_pkt,
2359 ldcp->lane_in.lstate |= VSW_VER_NACK_SENT;
2360 vsw_next_milestone(ldcp);
2363 ldcp->dev_class = ver_pkt->dev_class;
2379 ldcp->lane_in.ver_major = ver_pkt->ver_major;
2380 ldcp->lane_in.ver_minor = ver_pkt->ver_minor;
2384 ldcp->lane_in.lstate |= VSW_VER_ACK_SENT;
2400 vsw_send_ver(ldcp);
2413 ldcp->lane_in.ver_major = ver_pkt->ver_major;
2414 ldcp->lane_in.ver_minor = ver_pkt->ver_minor;
2418 ldcp->lane_in.lstate |= VSW_VER_NACK_SENT;
2422 ver_pkt->tag.vio_sid = ldcp->local_session;
2423 (void) vsw_send_msg(ldcp, (void *)ver_pkt,
2426 vsw_next_milestone(ldcp);
2432 if (vsw_check_flag(ldcp, OUTBOUND, VSW_VER_ACK_RECV))
2436 ldcp->lane_out.ver_major = ver_pkt->ver_major;
2437 ldcp->lane_out.ver_minor = ver_pkt->ver_minor;
2439 ldcp->lane_out.lstate |= VSW_VER_ACK_RECV;
2440 vsw_next_milestone(ldcp);
2447 if (vsw_check_flag(ldcp, OUTBOUND, VSW_VER_NACK_RECV))
2459 ldcp->lane_out.lstate |= VSW_VER_NACK_RECV;
2460 vsw_next_milestone(ldcp);
2474 ldcp->lane_out.lstate |= VSW_VER_NACK_RECV;
2475 vsw_next_milestone(ldcp);
2478 ldcp->lane_out.ver_major = ver_pkt->ver_major;
2479 ldcp->lane_out.ver_minor = ver_pkt->ver_minor;
2484 ldcp->lane_out.lstate |= VSW_VER_INFO_SENT;
2485 ver_pkt->tag.vio_sid = ldcp->local_session;
2490 (void) vsw_send_msg(ldcp, (void *)ver_pkt,
2493 vsw_next_milestone(ldcp);
2503 D1(vswp, "%s(%lld): exit\n", __func__, ldcp->ldc_id);
2507 vsw_process_attr_info(vsw_ldc_t *ldcp, vnet_attr_msg_t *msg)
2509 vsw_t *vswp = ldcp->ldc_vswp;
2510 vsw_port_t *port = ldcp->ldc_port;
2513 lane_t *lane_out = &ldcp->lane_out;
2514 lane_t *lane_in = &ldcp->lane_in;
2521 if (vsw_check_flag(ldcp, INBOUND, VSW_ATTR_INFO_RECV)) {
2555 if ((VSW_VER_GTEQ(ldcp, 1, 2) &&
2557 (VSW_VER_LT(ldcp, 1, 2) &&
2569 if (VSW_VER_GTEQ(ldcp, 1, 6)) {
2580 vsw_mapin_avail(ldcp) == B_TRUE) {
2628 if (VSW_VER_GTEQ(ldcp, 1, 4)) {
2690 if (VSW_VER_GTEQ(ldcp, 1, 5)) { /* Protocol ver >= 1.5 */
2701 ldcp->pls_negotiated = B_TRUE;
2706 ldcp->pls_negotiated = B_FALSE;
2712 ldcp->pls_negotiated = B_FALSE;
2721 ldcp->pls_negotiated = B_FALSE;
2737 if ((VSW_VER_GTEQ(ldcp, 1, 2) &&
2739 (VSW_VER_LT(ldcp, 1, 2) &&
2745 vsw_create_privring(ldcp);
2754 if (VSW_VER_GTEQ(ldcp, 1, 3) &&
2767 vsw_process_attr_ack(vsw_ldc_t *ldcp, vnet_attr_msg_t *msg)
2769 vsw_t *vswp = ldcp->ldc_vswp;
2770 lane_t *lane_out = &ldcp->lane_out;
2771 lane_t *lane_in = &ldcp->lane_in;
2775 if (vsw_check_flag(ldcp, OUTBOUND, VSW_ATTR_ACK_RECV)) {
2782 if (VSW_VER_GTEQ(ldcp, 1, 6)) {
2828 if (VSW_VER_GTEQ(ldcp, 1, 4)) {
2881 vsw_process_ctrl_attr_pkt(vsw_ldc_t *ldcp, void *pkt)
2884 vsw_t *vswp = ldcp->ldc_vswp;
2885 lane_t *lane_out = &ldcp->lane_out;
2886 lane_t *lane_in = &ldcp->lane_in;
2889 D1(vswp, "%s(%lld) enter", __func__, ldcp->ldc_id);
2900 rv = vsw_process_attr_info(ldcp, attr_pkt);
2902 vsw_free_lane_resources(ldcp, INBOUND);
2904 ldcp->lane_in.lstate |= VSW_ATTR_NACK_SENT;
2909 attr_pkt->tag.vio_sid = ldcp->local_session;
2911 (void) vsw_send_msg(ldcp, (void *)attr_pkt,
2913 vsw_next_milestone(ldcp);
2918 rv = vsw_process_attr_ack(ldcp, attr_pkt);
2923 vsw_next_milestone(ldcp);
2929 if (vsw_check_flag(ldcp, OUTBOUND, VSW_ATTR_NACK_RECV))
2933 vsw_next_milestone(ldcp);
2941 D1(vswp, "%s(%lld) exit", __func__, ldcp->ldc_id);
2945 vsw_process_dring_reg_info(vsw_ldc_t *ldcp, vio_msg_tag_t *tagp)
2948 vsw_t *vswp = ldcp->ldc_vswp;
2949 lane_t *lp = &ldcp->lane_out;
2954 rv = vsw_check_flag(ldcp, INBOUND, VSW_DRING_INFO_RECV);
2959 if (VSW_VER_GTEQ(ldcp, 1, 6) &&
2968 "negotiated mode (%d)\n", __func__, ldcp->ldc_id,
2976 dp = vsw_map_dring(ldcp, (void *)tagp);
2985 rv = vsw_map_data(ldcp, dp, (void *)tagp);
2987 vsw_unmap_dring(ldcp);
2996 vsw_process_dring_reg_ack(vsw_ldc_t *ldcp, vio_msg_tag_t *tagp)
2998 vsw_t *vswp = ldcp->ldc_vswp;
3003 if (vsw_check_flag(ldcp, OUTBOUND, VSW_DRING_ACK_RECV)) {
3007 dp = ldcp->lane_out.dringp;
3028 vsw_process_ctrl_dring_reg_pkt(vsw_ldc_t *ldcp, void *pkt)
3034 vsw_t *vswp = ldcp->ldc_vswp;
3035 lane_t *lane_out = &ldcp->lane_out;
3036 lane_t *lane_in = &ldcp->lane_in;
3038 D1(vswp, "%s(%lld) enter", __func__, ldcp->ldc_id);
3042 rv = vsw_process_dring_reg_info(ldcp, tagp);
3044 vsw_free_lane_resources(ldcp, INBOUND);
3051 tagp->vio_sid = ldcp->local_session;
3060 (void) vsw_send_msg(ldcp, (void *)tagp, msgsize, B_TRUE);
3061 vsw_next_milestone(ldcp);
3065 rv = vsw_process_dring_reg_ack(ldcp, tagp);
3070 vsw_next_milestone(ldcp);
3076 if (vsw_check_flag(ldcp, OUTBOUND, VSW_DRING_NACK_RECV))
3080 vsw_next_milestone(ldcp);
3088 D1(vswp, "%s(%lld) exit", __func__, ldcp->ldc_id);
3098 vsw_process_ctrl_dring_unreg_pkt(vsw_ldc_t *ldcp, void *pkt)
3100 vsw_t *vswp = ldcp->ldc_vswp;
3109 D1(vswp, "%s(%lld): enter", __func__, ldcp->ldc_id);
3135 vsw_process_conn_evt(ldcp, VSW_CONN_RESTART);
3137 D1(vswp, "%s(%lld): exit", __func__, ldcp->ldc_id);
3140 #define SND_MCST_NACK(ldcp, pkt) \
3142 pkt->tag.vio_sid = ldcp->local_session; \
3143 (void) vsw_send_msg(ldcp, (void *)pkt, \
3173 vsw_process_ctrl_mcst_pkt(vsw_ldc_t *ldcp, void *pkt)
3176 vsw_port_t *port = ldcp->ldc_port;
3177 vsw_t *vswp = ldcp->ldc_vswp;
3180 D1(vswp, "%s(%lld): enter", __func__, ldcp->ldc_id);
3197 if (vsw_check_flag(ldcp, INBOUND, VSW_MCST_INFO_RECV))
3209 SND_MCST_NACK(ldcp, mcst_pkt);
3219 SND_MCST_NACK(ldcp, mcst_pkt);
3224 mcst_pkt->tag.vio_sid = ldcp->local_session;
3228 (void) vsw_send_msg(ldcp, (void *)mcst_pkt,
3241 if (vsw_check_flag(ldcp, OUTBOUND, VSW_MCST_ACK_RECV))
3254 if (vsw_check_flag(ldcp, OUTBOUND, VSW_MCST_NACK_RECV))
3265 D1(vswp, "%s(%lld): exit", __func__, ldcp->ldc_id);
3269 vsw_process_ctrl_rdx_pkt(vsw_ldc_t *ldcp, void *pkt)
3272 vsw_t *vswp = ldcp->ldc_vswp;
3280 D1(vswp, "%s(%lld) enter", __func__, ldcp->ldc_id);
3286 if (vsw_check_flag(ldcp, OUTBOUND, VSW_RDX_INFO_RECV))
3289 rdx_pkt->tag.vio_sid = ldcp->local_session;
3294 ldcp->lane_out.lstate |= VSW_RDX_ACK_SENT;
3296 (void) vsw_send_msg(ldcp, (void *)rdx_pkt,
3299 vsw_next_milestone(ldcp);
3307 vsw_process_conn_evt(ldcp, VSW_CONN_RESTART);
3313 if (vsw_check_flag(ldcp, INBOUND, VSW_RDX_NACK_RECV))
3316 ldcp->lane_in.lstate |= VSW_RDX_NACK_RECV;
3317 vsw_next_milestone(ldcp);
3325 D1(vswp, "%s(%lld): exit", __func__, ldcp->ldc_id);
3329 vsw_process_physlink_msg(vsw_ldc_t *ldcp, void *pkt)
3332 vsw_t *vswp = ldcp->ldc_vswp;
3336 D1(vswp, "%s(%lld) enter", __func__, ldcp->ldc_id);
3360 D1(vswp, "%s(%lld): exit", __func__, ldcp->ldc_id);
3364 vsw_process_data_pkt(vsw_ldc_t *ldcp, void *dpkt, vio_msg_tag_t *tagp,
3368 vsw_t *vswp = ldcp->ldc_vswp;
3369 lane_t *lp = &ldcp->lane_out;
3372 D1(vswp, "%s(%lld): enter", __func__, ldcp->ldc_id);
3375 if (ldcp->session_status & VSW_PEER_SESSION) {
3376 if (ldcp->peer_session != tagp->vio_sid) {
3378 __func__, ldcp->ldc_id, tagp->vio_sid);
3379 vsw_process_conn_evt(ldcp, VSW_CONN_RESTART);
3388 if (ldcp->hphase != VSW_MILESTONE4) {
3390 "hphase %d (%x: %x)", __func__, ldcp->hphase,
3391 ldcp->lane_in.lstate, ldcp->lane_out.lstate);
3392 DUMP_FLAGS(ldcp->lane_in.lstate);
3393 DUMP_FLAGS(ldcp->lane_out.lstate);
3394 vsw_process_conn_evt(ldcp, VSW_CONN_RESTART);
3407 mutex_exit(&ldcp->ldc_cblock);
3408 mutex_enter(&ldcp->ldc_rxlock);
3416 ldcp->rx_dringdata(ldcp, dpkt);
3418 ldcp->rx_pktdata(ldcp, dpkt, msglen);
3420 vsw_process_data_ibnd_pkt(ldcp, dpkt);
3427 mutex_exit(&ldcp->ldc_rxlock);
3428 mutex_enter(&ldcp->ldc_cblock);
3431 D1(vswp, "%s(%lld): exit", __func__, ldcp->ldc_id);
3452 vsw_ldc_t *ldcp = (vsw_ldc_t *)arg1;
3457 vsw_t *vswp = ldcp->ldc_vswp;
3458 vgen_stats_t *statsp = &ldcp->ldc_stats;
3459 lane_t *lp = &ldcp->lane_out;
3465 ldcp->ldc_id, size);
3469 vmp = vio_multipool_allocb(&ldcp->vmp, size + VLAN_TAGSZ);
3476 ldcp->ldc_id);
3501 (void) vsw_vlan_frame_pretag(ldcp->ldc_port, VSW_VNETPORT, mp);
3504 vswp->vsw_switch_frame(vswp, mp, VSW_VNETPORT, ldcp->ldc_port, NULL);
3512 vsw_process_data_ibnd_pkt(vsw_ldc_t *ldcp, void *pkt)
3517 vsw_t *vswp = ldcp->ldc_vswp;
3527 D1(vswp, "%s(%lld): enter", __func__, ldcp->ldc_id);
3535 if (vsw_check_flag(ldcp, INBOUND, VSW_DRING_INFO_RECV))
3546 ": datalen 0x%lx", __func__, ldcp->ldc_id, datalen);
3565 __func__, ldcp->ldc_id);
3566 ldcp->ldc_stats.rx_allocb_fail++;
3573 rv = ldc_mem_copy(ldcp->ldc_handle, (caddr_t)mp->b_rptr,
3579 "%d cookie(s)", __func__, ldcp->ldc_id, ncookies);
3581 ldcp->ldc_stats.ierrors++;
3586 __func__, ldcp->ldc_id, nbytes, ncookies);
3590 ldcp->ldc_stats.ipackets++;
3591 ldcp->ldc_stats.rbytes += datalen;
3597 ibnd_desc->hdr.tag.vio_sid = ldcp->local_session;
3598 (void) vsw_send_msg(ldcp, (void *)ibnd_desc,
3604 (void) vsw_vlan_frame_pretag(ldcp->ldc_port, VSW_VNETPORT, mp);
3608 ldcp->ldc_port, NULL);
3624 if ((dp = ldcp->lane_out.dringp) == NULL) {
3661 ldcp->ldc_id, idx, priv_addr->dstate);
3668 ldcp->ldc_id, idx);
3699 if ((dp = ldcp->lane_out.dringp) == NULL) {
3719 ldcp->ldc_id, ibnd_desc->hdr.tag.vio_subtype);
3722 D1(vswp, "%s(%lld) exit", __func__, ldcp->ldc_id);
3726 vsw_process_err_pkt(vsw_ldc_t *ldcp, void *epkt, vio_msg_tag_t *tagp)
3730 vsw_t *vswp = ldcp->ldc_vswp;
3733 D1(vswp, "%s (%lld): enter\n", __func__, ldcp->ldc_id);
3741 D1(vswp, "%s (%lld): exit\n", __func__, ldcp->ldc_id);
3750 vsw_ldc_t *ldcp = port->ldcp;
3755 status = ldcp->tx(ldcp, mp, mpt, count);
3843 vsw_ldc_t *ldcp = (vsw_ldc_t *)arg;
3851 vsw_t *vswp = ldcp->ldc_vswp;
3868 vsw_ldcsend_pkt(ldcp, smp);
3878 return (vsw_ldctx(ldcp, nmp, nmpt, count));
3887 vsw_ldc_t *ldcp = (vsw_ldc_t *)arg;
3895 if (ldcp->tx_thread != NULL) {
3897 mutex_enter(&ldcp->tx_thr_lock);
3899 if ((ldcp->tx_cnt + count) >= vsw_max_tx_qcount) {
3905 ldcp->ldc_stats.tx_qfull += count;
3906 mutex_exit(&ldcp->tx_thr_lock);
3910 if (ldcp->tx_mhead == NULL) {
3911 ldcp->tx_mhead = mp;
3912 ldcp->tx_mtail = mpt;
3913 cv_signal(&ldcp->tx_thr_cv);
3915 ldcp->tx_mtail->b_next = mp;
3916 ldcp->tx_mtail = mpt;
3918 ldcp->tx_cnt += count;
3919 mutex_exit(&ldcp->tx_thr_lock);
3924 (void) vsw_ldcsend(ldcp, mp, 1);
3940 vsw_ldcsend_pkt(vsw_ldc_t *ldcp, mblk_t *mp)
3951 vsw_t *vswp = ldcp->ldc_vswp;
3952 vgen_stats_t *statsp = &ldcp->ldc_stats;
3954 if ((!(ldcp->lane_out.lstate & VSW_LANE_ACTIVE)) ||
3955 (ldcp->ldc_status != LDC_UP) || (ldcp->ldc_handle == NULL)) {
3958 "packet\n", __func__, ldcp->ldc_id, ldcp->ldc_status,
3959 ldcp->lane_out.lstate);
3966 if (size > (size_t)(ldcp->msglen - VIO_PKT_DATA_HDRSIZE)) {
3969 ldcp->ldc_id, size);
4001 pkt->tag.vio_sid = ldcp->local_session;
4005 rv = vsw_send_msg(ldcp, (void *)pkt, nbytes, B_TRUE);
4009 ldcp->ldc_id);
4032 vsw_ldcsend(vsw_ldc_t *ldcp, mblk_t *mp, uint32_t retries)
4037 vsw_port_t *port = ldcp->ldc_port;
4039 lane_t *lp = &ldcp->lane_out;
4049 status = (*port->transmit)(ldcp, mp);
4059 ldcp->ldc_stats.oerrors++;
4070 if (((dp = ldcp->lane_out.dringp) != NULL) &&
4071 ((VSW_VER_GTEQ(ldcp, 1, 2) &&
4072 (ldcp->lane_out.xfer_mode & VIO_DRING_MODE_V1_2)) ||
4073 ((VSW_VER_LT(ldcp, 1, 2) &&
4074 (ldcp->lane_out.xfer_mode == VIO_DRING_MODE_V1_0))))) {
4105 vsw_descrsend(vsw_ldc_t *ldcp, mblk_t *mp)
4107 vsw_t *vswp = ldcp->ldc_vswp;
4117 lane_t *lp = &ldcp->lane_out;
4119 D1(vswp, "%s(%lld): enter", __func__, ldcp->ldc_id);
4123 if ((!(ldcp->lane_out.lstate & VSW_LANE_ACTIVE)) ||
4124 (ldcp->ldc_status != LDC_UP) || (ldcp->ldc_handle == NULL)) {
4126 __func__, ldcp->ldc_id, ldcp->ldc_status,
4127 ldcp->lane_out.lstate);
4128 ldcp->ldc_stats.oerrors++;
4136 if ((dp = ldcp->lane_out.dringp) == NULL) {
4138 __func__, ldcp->ldc_id);
4140 ldcp->ldc_id, ldcp->ldc_status, ldcp->lane_out.lstate);
4141 ldcp->ldc_stats.oerrors++;
4148 ldcp->ldc_id, size);
4149 ldcp->ldc_stats.oerrors++;
4159 "at 0x%llx", __func__, ldcp->ldc_id, dp);
4168 "%ld addr 0x%x\n", __func__, ldcp->ldc_id, idx, priv_desc);
4186 ibnd_msg.hdr.tag.vio_sid = ldcp->local_session;
4202 ldcp->ldc_stats.opackets++;
4203 ldcp->ldc_stats.obytes += size;
4205 (void) vsw_send_msg(ldcp, (void *)&ibnd_msg,
4210 D1(vswp, "%s(%lld): exit", __func__, ldcp->ldc_id);
4217 vsw_ldc_t *ldcp = (vsw_ldc_t *)arg;
4218 vsw_t *vswp = ldcp->ldc_vswp;
4219 lane_t *lp = &ldcp->lane_out;
4227 ver_msg.tag.vio_sid = ldcp->local_session;
4234 lane_t *lpi = &ldcp->lane_in;
4246 (void) vsw_send_msg(ldcp, &ver_msg, sizeof (vio_ver_msg_t), B_TRUE);
4248 D1(vswp, "%s (%d): exit", __func__, ldcp->ldc_id);
4252 vsw_send_attr(vsw_ldc_t *ldcp)
4254 vsw_t *vswp = ldcp->ldc_vswp;
4255 lane_t *lp = &ldcp->lane_out;
4258 D1(vswp, "%s (%ld) enter", __func__, ldcp->ldc_id);
4266 attr_msg.tag.vio_sid = ldcp->local_session;
4279 ldcp->lane_out.lstate |= VSW_ATTR_INFO_SENT;
4283 (void) vsw_send_msg(ldcp, &attr_msg, sizeof (vnet_attr_msg_t), B_TRUE);
4285 D1(vswp, "%s (%ld) exit", __func__, ldcp->ldc_id);
4289 vsw_send_dring_info(vsw_ldc_t *ldcp)
4293 vsw_t *vswp = ldcp->ldc_vswp;
4294 vsw_port_t *port = ldcp->ldc_port;
4295 lane_t *lp = &ldcp->lane_out;
4296 vgen_stats_t *statsp = &ldcp->ldc_stats;
4298 D1(vswp, "%s: (%ld) enter", __func__, ldcp->ldc_id);
4308 msg = (void *) vsw_create_rx_dring_info(ldcp);
4314 ldcp->rcv_thread = thread_create(NULL, 2 * DEFAULTSTKSZ,
4315 vsw_ldc_rcv_worker, ldcp, 0, &p0, TS_RUN, maxclsyspri);
4316 ldcp->rx_dringdata = vsw_process_dringdata_shm;
4318 msg = (void *) vsw_create_tx_dring_info(ldcp);
4323 ldcp->msg_thread = thread_create(NULL, 2 * DEFAULTSTKSZ,
4324 vsw_ldc_msg_worker, ldcp, 0, &p0, TS_RUN, maxclsyspri);
4325 ldcp->rx_dringdata = vsw_process_dringdata;
4330 (void) vsw_send_msg(ldcp, msg, msgsize, B_TRUE);
4333 D1(vswp, "%s: (%ld) exit", __func__, ldcp->ldc_id);
4337 vsw_send_rdx(vsw_ldc_t *ldcp)
4339 vsw_t *vswp = ldcp->ldc_vswp;
4342 D1(vswp, "%s (%ld) enter", __func__, ldcp->ldc_id);
4347 rdx_msg.tag.vio_sid = ldcp->local_session;
4349 ldcp->lane_in.lstate |= VSW_RDX_INFO_SENT;
4353 (void) vsw_send_msg(ldcp, &rdx_msg, sizeof (vio_rdx_msg_t), B_TRUE);
4355 D1(vswp, "%s (%ld) exit", __func__, ldcp->ldc_id);
4421 vsw_create_privring(vsw_ldc_t *ldcp)
4424 vsw_t *vswp = ldcp->ldc_vswp;
4426 D1(vswp, "%s(%lld): enter", __func__, ldcp->ldc_id);
4431 ldcp->lane_out.dringp = dp;
4439 if (vsw_setup_tx_dring(ldcp, dp)) {
4441 vsw_destroy_tx_dring(ldcp);
4449 D1(vswp, "%s(%lld): exit", __func__, ldcp->ldc_id);
4477 vsw_map_dring(vsw_ldc_t *ldcp, void *pkt)
4480 lane_t *lp = &ldcp->lane_out;
4487 dp = vsw_map_tx_dring(ldcp, pkt);
4493 dp = vsw_map_rx_dring(ldcp, pkt);
4502 vsw_map_dring_cmn(vsw_ldc_t *ldcp, vio_dring_reg_msg_t *dring_pkt)
4507 vsw_t *vswp = ldcp->ldc_vswp;
4516 __func__, ldcp->ldc_id);
4534 rv = ldc_mem_dring_map(ldcp->ldc_handle, &dp->dring_cookie[0],
4557 dp->ident = ldcp->next_ident;
4558 ldcp->next_ident++;
4580 vsw_unmap_dring(vsw_ldc_t *ldcp)
4582 lane_t *lane_out = &ldcp->lane_out;
4585 vsw_unmap_tx_dring(ldcp);
4587 vsw_unmap_rx_dring(ldcp);
4596 vsw_map_data(vsw_ldc_t *ldcp, dring_info_t *dp, void *pkt)
4602 vsw_t *vswp = ldcp->ldc_vswp;
4621 rv = ldc_mem_alloc_handle(ldcp->ldc_handle, &dp->data_handle);
4625 __func__, ldcp->ldc_id, rv);
4636 __func__, ldcp->ldc_id, rv);
4645 __func__, ldcp->ldc_id, rv);
4651 __func__, ldcp->ldc_id, minfo.mtype);
4670 vsw_free_lane_resources(vsw_ldc_t *ldcp, uint64_t dir)
4674 D1(ldcp->ldc_vswp, "%s (%lld): enter", __func__, ldcp->ldc_id);
4677 D2(ldcp->ldc_vswp, "%s: freeing INBOUND lane"
4678 " of channel %lld", __func__, ldcp->ldc_id);
4679 lp = &ldcp->lane_in;
4681 D2(ldcp->ldc_vswp, "%s: freeing OUTBOUND lane"
4682 " of channel %lld", __func__, ldcp->ldc_id);
4683 lp = &ldcp->lane_out;
4691 vsw_unmap_dring(ldcp);
4694 vsw_destroy_dring(ldcp);
4697 D1(ldcp->ldc_vswp, "%s (%lld): exit", __func__, ldcp->ldc_id);
4704 vsw_destroy_dring(vsw_ldc_t *ldcp)
4706 lane_t *lp = &ldcp->lane_out;
4709 vsw_destroy_rx_dring(ldcp);
4711 vsw_destroy_tx_dring(ldcp);
4724 vsw_ldc_t *ldcp = (vsw_ldc_t *)arg;
4725 vsw_t *vswp = ldcp->ldc_vswp;
4729 D1(vswp, "%s(%lld):enter\n", __func__, ldcp->ldc_id);
4730 CALLB_CPR_INIT(&cprinfo, &ldcp->tx_thr_lock, callb_generic_cpr,
4732 mutex_enter(&ldcp->tx_thr_lock);
4733 while (!(ldcp->tx_thr_flags & VSW_WTHR_STOP)) {
4740 while (!(ldcp->tx_thr_flags & VSW_WTHR_STOP) &&
4741 (ldcp->tx_mhead == NULL)) {
4742 cv_wait(&ldcp->tx_thr_cv, &ldcp->tx_thr_lock);
4744 CALLB_CPR_SAFE_END(&cprinfo, &ldcp->tx_thr_lock)
4749 if (ldcp->tx_thr_flags & VSW_WTHR_STOP) {
4751 __func__, ldcp->ldc_id);
4754 mp = ldcp->tx_mhead;
4755 ldcp->tx_mhead = ldcp->tx_mtail = NULL;
4756 ldcp->tx_cnt = 0;
4757 mutex_exit(&ldcp->tx_thr_lock);
4759 __func__, ldcp->ldc_id);
4763 (void) vsw_ldcsend(ldcp, mp, vsw_ldc_tx_retries);
4766 mutex_enter(&ldcp->tx_thr_lock);
4773 ldcp->tx_thr_flags &= ~VSW_WTHR_STOP;
4774 ldcp->tx_thread = NULL;
4776 D1(vswp, "%s(%lld):exit\n", __func__, ldcp->ldc_id);
4782 vsw_stop_tx_thread(vsw_ldc_t *ldcp)
4785 vsw_t *vswp = ldcp->ldc_vswp;
4787 D1(vswp, "%s(%lld):enter\n", __func__, ldcp->ldc_id);
4792 mutex_enter(&ldcp->tx_thr_lock);
4793 if (ldcp->tx_thread != NULL) {
4794 tid = ldcp->tx_thread->t_did;
4795 ldcp->tx_thr_flags |= VSW_WTHR_STOP;
4796 cv_signal(&ldcp->tx_thr_cv);
4798 mutex_exit(&ldcp->tx_thr_lock);
4804 D1(vswp, "%s(%lld):exit\n", __func__, ldcp->ldc_id);
4808 vsw_mapin_avail(vsw_ldc_t *ldcp)
4814 vsw_t *vswp = ldcp->ldc_vswp;
4816 rv = ldc_info(ldcp->ldc_handle, &info);
4840 vsw_ldc_t *ldcp;
4854 ldcp = port->ldcp;
4857 ldcp->ldc_id, ldcp->dev_class,
4858 ldcp->ldc_status, ldcp->hphase);
4860 "psession %lu\n", ldcp->ldc_id,
4861 ldcp->local_session, ldcp->peer_session);
4864 display_lane(&ldcp->lane_in);
4866 display_lane(&ldcp->lane_out);