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