Lines Matching refs:ldcp

122 static int vgen_ldc_reset(vgen_ldc_t *ldcp, vgen_caller_t caller);
123 static void vgen_ldc_up(vgen_ldc_t *ldcp);
125 static void vgen_ldc_detach(vgen_ldc_t *ldcp);
128 static int vgen_ldc_init(vgen_ldc_t *ldcp);
129 static void vgen_ldc_uninit(vgen_ldc_t *ldcp);
130 static uint64_t vgen_ldc_stat(vgen_ldc_t *ldcp, uint_t stat);
140 static int vgen_create_dring(vgen_ldc_t *ldcp);
141 static void vgen_destroy_dring(vgen_ldc_t *ldcp);
142 static int vgen_map_dring(vgen_ldc_t *ldcp, void *pkt);
143 static void vgen_unmap_dring(vgen_ldc_t *ldcp);
144 static int vgen_mapin_avail(vgen_ldc_t *ldcp);
147 static int vgen_handshake(vgen_ldc_t *ldcp);
148 static int vgen_handshake_done(vgen_ldc_t *ldcp);
149 static vgen_ldc_t *vh_nextphase(vgen_ldc_t *ldcp);
150 static int vgen_handshake_phase2(vgen_ldc_t *ldcp);
151 static int vgen_handshake_phase3(vgen_ldc_t *ldcp);
152 static void vgen_setup_handshake_params(vgen_ldc_t *ldcp);
153 static int vgen_send_version_negotiate(vgen_ldc_t *ldcp);
154 static int vgen_send_attr_info(vgen_ldc_t *ldcp);
155 static int vgen_send_rx_dring_reg(vgen_ldc_t *ldcp);
156 static int vgen_send_tx_dring_reg(vgen_ldc_t *ldcp);
157 static void vgen_init_dring_reg_msg(vgen_ldc_t *ldcp, vio_dring_reg_msg_t *msg,
159 static int vgen_send_rdx_info(vgen_ldc_t *ldcp);
160 static int vgen_send_dringdata(vgen_ldc_t *ldcp, uint32_t start, int32_t end);
161 static int vgen_send_mcast_info(vgen_ldc_t *ldcp);
162 static int vgen_handle_version_negotiate(vgen_ldc_t *ldcp,
164 static int vgen_handle_attr_msg(vgen_ldc_t *ldcp, vio_msg_tag_t *tagp);
165 static int vgen_handle_attr_info(vgen_ldc_t *ldcp, vnet_attr_msg_t *msg);
166 static int vgen_handle_attr_ack(vgen_ldc_t *ldcp, vnet_attr_msg_t *msg);
167 static int vgen_handle_dring_reg(vgen_ldc_t *ldcp, vio_msg_tag_t *tagp);
168 static int vgen_handle_dring_reg_info(vgen_ldc_t *ldcp, vio_msg_tag_t *tagp);
169 static int vgen_handle_dring_reg_ack(vgen_ldc_t *ldcp, vio_msg_tag_t *tagp);
170 static int vgen_handle_rdx_info(vgen_ldc_t *ldcp, vio_msg_tag_t *tagp);
171 static int vgen_handle_mcast_info(vgen_ldc_t *ldcp, vio_msg_tag_t *tagp);
172 static int vgen_handle_ctrlmsg(vgen_ldc_t *ldcp, vio_msg_tag_t *tagp);
174 static int vgen_handle_datamsg(vgen_ldc_t *ldcp, vio_msg_tag_t *tagp,
176 static void vgen_handle_errmsg(vgen_ldc_t *ldcp, vio_msg_tag_t *tagp);
177 static int vgen_dds_rx(vgen_ldc_t *ldcp, vio_msg_tag_t *tagp);
178 static void vgen_handle_evt_up(vgen_ldc_t *ldcp);
179 static int vgen_process_reset(vgen_ldc_t *ldcp, int flags);
180 static int vgen_check_sid(vgen_ldc_t *ldcp, vio_msg_tag_t *tagp);
182 static void vgen_set_vnet_proto_ops(vgen_ldc_t *ldcp);
183 static void vgen_reset_vnet_proto_ops(vgen_ldc_t *ldcp);
203 int vgen_handle_evt_read(vgen_ldc_t *ldcp, vgen_caller_t caller);
204 int vgen_handle_evt_reset(vgen_ldc_t *ldcp, vgen_caller_t caller);
213 extern int vgen_sendmsg(vgen_ldc_t *ldcp, caddr_t msg, size_t msglen,
215 extern void vgen_stop_msg_thread(vgen_ldc_t *ldcp);
216 extern int vgen_create_tx_dring(vgen_ldc_t *ldcp);
217 extern void vgen_destroy_tx_dring(vgen_ldc_t *ldcp);
218 extern int vgen_map_rx_dring(vgen_ldc_t *ldcp, void *pkt);
219 extern void vgen_unmap_rx_dring(vgen_ldc_t *ldcp);
220 extern int vgen_create_rx_dring(vgen_ldc_t *ldcp);
221 extern void vgen_destroy_rx_dring(vgen_ldc_t *ldcp);
222 extern int vgen_map_tx_dring(vgen_ldc_t *ldcp, void *pkt);
223 extern void vgen_unmap_tx_dring(vgen_ldc_t *ldcp);
224 extern int vgen_map_data(vgen_ldc_t *ldcp, void *pkt);
230 extern int vgen_send_dringack_shm(vgen_ldc_t *ldcp, vio_msg_tag_t *tagp,
232 extern mblk_t *vgen_poll_rcv_shm(vgen_ldc_t *ldcp, int bytes_to_pickup);
233 extern mblk_t *vgen_poll_rcv(vgen_ldc_t *ldcp, int bytes_to_pickup);
234 extern int vgen_check_datamsg_seq(vgen_ldc_t *ldcp, vio_msg_tag_t *tagp);
238 #define LDC_LOCK(ldcp) \ argument
239 mutex_enter(&((ldcp)->cblock));\
240 mutex_enter(&((ldcp)->rxlock));\
241 mutex_enter(&((ldcp)->wrlock));\
242 mutex_enter(&((ldcp)->txlock));\
243 mutex_enter(&((ldcp)->tclock));
244 #define LDC_UNLOCK(ldcp) \ argument
245 mutex_exit(&((ldcp)->tclock));\
246 mutex_exit(&((ldcp)->txlock));\
247 mutex_exit(&((ldcp)->wrlock));\
248 mutex_exit(&((ldcp)->rxlock));\
249 mutex_exit(&((ldcp)->cblock));
251 #define VGEN_VER_EQ(ldcp, major, minor) \ argument
252 ((ldcp)->local_hparams.ver_major == (major) && \
253 (ldcp)->local_hparams.ver_minor == (minor))
255 #define VGEN_VER_LT(ldcp, major, minor) \ argument
256 (((ldcp)->local_hparams.ver_major < (major)) || \
257 ((ldcp)->local_hparams.ver_major == (major) && \
258 (ldcp)->local_hparams.ver_minor < (minor)))
260 #define VGEN_VER_GTEQ(ldcp, major, minor) \ argument
261 (((ldcp)->local_hparams.ver_major > (major)) || \
262 ((ldcp)->local_hparams.ver_major == (major) && \
263 (ldcp)->local_hparams.ver_minor >= (minor)))
455 vgen_ldc_t *ldcp, const char *fmt, ...);
465 vgen_inject_error(vgen_ldc_t *ldcp, int error) in vgen_inject_error() argument
467 if ((vgendbg_ldcid == ldcp->ldc_id) && in vgen_inject_error()
781 vgen_ldc_t *ldcp; in vgen_portsend() local
834 ldcp = portp->ldcp; in vgen_portsend()
835 status = ldcp->tx(ldcp, mp); in vgen_portsend()
854 vgen_ldc_t *ldcp = (vgen_ldc_t *)arg; in vgen_ldcsend() local
857 vgen_t *vgenp = LDC_TO_VGEN(ldcp); in vgen_ldcsend()
872 vgen_ldcsend_pkt(ldcp, mp); in vgen_ldcsend()
878 if (ldcp->tx_dringdata == NULL) { in vgen_ldcsend()
883 status = ldcp->tx_dringdata(ldcp, mp); in vgen_ldcsend()
896 vgen_ldc_t *ldcp = (vgen_ldc_t *)arg; in vgen_ldcsend_pkt() local
906 vgen_t *vgenp = LDC_TO_VGEN(ldcp); in vgen_ldcsend_pkt()
907 vgen_stats_t *statsp = &ldcp->stats; in vgen_ldcsend_pkt()
910 if (ldcp->ldc_status != LDC_UP) { in vgen_ldcsend_pkt()
912 DWARN(vgenp, ldcp, "status(%d), dropping packet\n", in vgen_ldcsend_pkt()
913 ldcp->ldc_status); in vgen_ldcsend_pkt()
917 if (ldcp->hphase != VH_DONE) { in vgen_ldcsend_pkt()
919 DWARN(vgenp, ldcp, "hphase(%x), dropping packet\n", in vgen_ldcsend_pkt()
920 ldcp->hphase); in vgen_ldcsend_pkt()
927 if (size > (size_t)(ldcp->msglen - VIO_PKT_DATA_HDRSIZE)) { in vgen_ldcsend_pkt()
929 DWARN(vgenp, ldcp, "invalid size(%d)\n", size); in vgen_ldcsend_pkt()
940 DWARN(vgenp, ldcp, "vio_allocb failed\n"); in vgen_ldcsend_pkt()
961 pkt->tag.vio_sid = ldcp->local_sid; in vgen_ldcsend_pkt()
965 rv = vgen_sendmsg(ldcp, (caddr_t)pkt, nbytes, B_FALSE); in vgen_ldcsend_pkt()
968 DWARN(vgenp, ldcp, "Error sending priority frame\n"); in vgen_ldcsend_pkt()
970 (void) vgen_handle_evt_reset(ldcp, VGEN_OTHER); in vgen_ldcsend_pkt()
997 vgen_ldc_t *ldcp; in vgen_multicst() local
1013 ldcp = portp->ldcp; in vgen_multicst()
1014 if (ldcp == NULL) { in vgen_multicst()
1018 mutex_enter(&ldcp->cblock); in vgen_multicst()
1020 if (ldcp->hphase == VH_DONE) { in vgen_multicst()
1030 tagp->vio_sid = ldcp->local_sid; in vgen_multicst()
1034 if (vgen_sendmsg(ldcp, (caddr_t)tagp, sizeof (mcastmsg), in vgen_multicst()
1036 DWARN(vgenp, ldcp, "vgen_sendmsg failed\n"); in vgen_multicst()
1094 mutex_exit(&ldcp->cblock); in vgen_multicst()
1183 vgen_ldc_detach(portp->ldcp); in vgen_port_detach()
1270 (void) vgen_ldc_init(portp->ldcp); in vgen_port_init()
1276 vgen_ldc_uninit(portp->ldcp); in vgen_port_uninit()
2450 return (vgen_ldc_stat(portp->ldcp, stat)); in vgen_port_stat()
2458 vgen_ldc_t *ldcp; in vgen_ldc_attach() local
2471 ldcp = kmem_zalloc(sizeof (vgen_ldc_t), KM_NOSLEEP); in vgen_ldc_attach()
2472 if (ldcp == NULL) { in vgen_ldc_attach()
2475 ldcp->ldc_id = ldc_id; in vgen_ldc_attach()
2476 ldcp->portp = portp; in vgen_ldc_attach()
2480 mutex_init(&ldcp->txlock, NULL, MUTEX_DRIVER, NULL); in vgen_ldc_attach()
2481 mutex_init(&ldcp->cblock, NULL, MUTEX_DRIVER, NULL); in vgen_ldc_attach()
2482 mutex_init(&ldcp->tclock, NULL, MUTEX_DRIVER, NULL); in vgen_ldc_attach()
2483 mutex_init(&ldcp->wrlock, NULL, MUTEX_DRIVER, NULL); in vgen_ldc_attach()
2484 mutex_init(&ldcp->rxlock, NULL, MUTEX_DRIVER, NULL); in vgen_ldc_attach()
2485 mutex_init(&ldcp->pollq_lock, NULL, MUTEX_DRIVER, NULL); in vgen_ldc_attach()
2486 mutex_init(&ldcp->msg_thr_lock, NULL, MUTEX_DRIVER, NULL); in vgen_ldc_attach()
2487 cv_init(&ldcp->msg_thr_cv, NULL, CV_DRIVER, NULL); in vgen_ldc_attach()
2495 status = ldc_init(ldc_id, &attr, &ldcp->ldc_handle); in vgen_ldc_attach()
2497 DWARN(vgenp, ldcp, "ldc_init failed,rv (%d)\n", status); in vgen_ldc_attach()
2502 status = ldc_reg_callback(ldcp->ldc_handle, vgen_ldc_cb, (caddr_t)ldcp); in vgen_ldc_attach()
2504 DWARN(vgenp, ldcp, "ldc_reg_callback failed, rv (%d)\n", in vgen_ldc_attach()
2512 ldcp->msglen = VIO_PKT_DATA_HDRSIZE + vgenp->max_frame_size; in vgen_ldc_attach()
2513 ldcp->ldcmsg = kmem_alloc(ldcp->msglen, KM_SLEEP); in vgen_ldc_attach()
2516 (void) ldc_status(ldcp->ldc_handle, &istatus); in vgen_ldc_attach()
2518 ldcp->ldc_status = istatus; in vgen_ldc_attach()
2522 (void) sprintf(kname, "vnetldc0x%lx", ldcp->ldc_id); in vgen_ldc_attach()
2523 ldcp->ksp = vgen_setup_kstats("vnet", instance, kname, &ldcp->stats); in vgen_ldc_attach()
2524 if (ldcp->ksp == NULL) { in vgen_ldc_attach()
2529 bcopy(vgen_versions, ldcp->vgen_versions, sizeof (ldcp->vgen_versions)); in vgen_ldc_attach()
2530 vgen_reset_vnet_proto_ops(ldcp); in vgen_ldc_attach()
2533 portp->ldcp = ldcp; in vgen_ldc_attach()
2535 ldcp->link_state = LINK_STATE_UNKNOWN; in vgen_ldc_attach()
2537 ldcp->link_down_forced = B_FALSE; in vgen_ldc_attach()
2539 ldcp->flags |= CHANNEL_ATTACHED; in vgen_ldc_attach()
2544 (void) ldc_unreg_callback(ldcp->ldc_handle); in vgen_ldc_attach()
2545 kmem_free(ldcp->ldcmsg, ldcp->msglen); in vgen_ldc_attach()
2549 (void) ldc_fini(ldcp->ldc_handle); in vgen_ldc_attach()
2552 mutex_destroy(&ldcp->tclock); in vgen_ldc_attach()
2553 mutex_destroy(&ldcp->txlock); in vgen_ldc_attach()
2554 mutex_destroy(&ldcp->cblock); in vgen_ldc_attach()
2555 mutex_destroy(&ldcp->wrlock); in vgen_ldc_attach()
2556 mutex_destroy(&ldcp->rxlock); in vgen_ldc_attach()
2557 mutex_destroy(&ldcp->pollq_lock); in vgen_ldc_attach()
2560 KMEM_FREE(ldcp); in vgen_ldc_attach()
2567 vgen_ldc_detach(vgen_ldc_t *ldcp) in vgen_ldc_detach() argument
2572 ASSERT(ldcp != NULL); in vgen_ldc_detach()
2574 portp = ldcp->portp; in vgen_ldc_detach()
2577 if (ldcp->ldc_status != LDC_INIT) { in vgen_ldc_detach()
2578 DWARN(vgenp, ldcp, "ldc_status is not INIT\n"); in vgen_ldc_detach()
2581 if (ldcp->flags & CHANNEL_ATTACHED) { in vgen_ldc_detach()
2582 ldcp->flags &= ~(CHANNEL_ATTACHED); in vgen_ldc_detach()
2584 (void) ldc_unreg_callback(ldcp->ldc_handle); in vgen_ldc_detach()
2585 (void) ldc_fini(ldcp->ldc_handle); in vgen_ldc_detach()
2587 kmem_free(ldcp->ldcmsg, ldcp->msglen); in vgen_ldc_detach()
2588 vgen_destroy_kstats(ldcp->ksp); in vgen_ldc_detach()
2589 ldcp->ksp = NULL; in vgen_ldc_detach()
2590 mutex_destroy(&ldcp->tclock); in vgen_ldc_detach()
2591 mutex_destroy(&ldcp->txlock); in vgen_ldc_detach()
2592 mutex_destroy(&ldcp->cblock); in vgen_ldc_detach()
2593 mutex_destroy(&ldcp->wrlock); in vgen_ldc_detach()
2594 mutex_destroy(&ldcp->rxlock); in vgen_ldc_detach()
2595 mutex_destroy(&ldcp->pollq_lock); in vgen_ldc_detach()
2596 mutex_destroy(&ldcp->msg_thr_lock); in vgen_ldc_detach()
2597 cv_destroy(&ldcp->msg_thr_cv); in vgen_ldc_detach()
2599 KMEM_FREE(ldcp); in vgen_ldc_detach()
2605 vgen_ldc_init(vgen_ldc_t *ldcp) in vgen_ldc_init() argument
2607 vgen_t *vgenp = LDC_TO_VGEN(ldcp); in vgen_ldc_init()
2616 DBG1(vgenp, ldcp, "enter\n"); in vgen_ldc_init()
2617 LDC_LOCK(ldcp); in vgen_ldc_init()
2619 rv = ldc_open(ldcp->ldc_handle); in vgen_ldc_init()
2621 DWARN(vgenp, ldcp, "ldc_open failed: rv(%d)\n", rv); in vgen_ldc_init()
2626 (void) ldc_status(ldcp->ldc_handle, &istatus); in vgen_ldc_init()
2628 DWARN(vgenp, ldcp, "status(%d) is not OPEN/READY\n", istatus); in vgen_ldc_init()
2631 ldcp->ldc_status = istatus; in vgen_ldc_init()
2633 rv = ldc_set_cb_mode(ldcp->ldc_handle, LDC_CB_ENABLE); in vgen_ldc_init()
2635 DWARN(vgenp, ldcp, "ldc_set_cb_mode failed: rv(%d)\n", rv); in vgen_ldc_init()
2641 vgen_ldc_up(ldcp); in vgen_ldc_init()
2643 (void) ldc_status(ldcp->ldc_handle, &istatus); in vgen_ldc_init()
2645 DWARN(vgenp, ldcp, "status(%d) is UP\n", istatus); in vgen_ldc_init()
2648 ldcp->ldc_status = istatus; in vgen_ldc_init()
2650 ldcp->hphase = VH_PHASE0; in vgen_ldc_init()
2651 ldcp->hstate = 0; in vgen_ldc_init()
2652 ldcp->flags |= CHANNEL_STARTED; in vgen_ldc_init()
2654 vgen_setup_handshake_params(ldcp); in vgen_ldc_init()
2658 vgen_t *vgenp = LDC_TO_VGEN(ldcp); in vgen_ldc_init()
2659 if (ldcp->portp != vgenp->vsw_portp) { in vgen_ldc_init()
2664 &ldcp->portp->use_vsw_port, B_FALSE); in vgen_ldc_init()
2668 ldcp->local_sid = ddi_get_lbolt(); in vgen_ldc_init()
2671 ldcp->peer_sid = 0; in vgen_ldc_init()
2673 mutex_exit(&ldcp->tclock); in vgen_ldc_init()
2674 mutex_exit(&ldcp->txlock); in vgen_ldc_init()
2675 mutex_exit(&ldcp->wrlock); in vgen_ldc_init()
2676 mutex_exit(&ldcp->rxlock); in vgen_ldc_init()
2677 rv = vgen_handshake(vh_nextphase(ldcp)); in vgen_ldc_init()
2678 mutex_exit(&ldcp->cblock); in vgen_ldc_init()
2682 (void) vgen_process_reset(ldcp, flag); in vgen_ldc_init()
2685 LDC_UNLOCK(ldcp); in vgen_ldc_init()
2692 (void) ldc_set_cb_mode(ldcp->ldc_handle, LDC_CB_DISABLE); in vgen_ldc_init()
2695 (void) ldc_close(ldcp->ldc_handle); in vgen_ldc_init()
2697 LDC_UNLOCK(ldcp); in vgen_ldc_init()
2698 DBG1(vgenp, ldcp, "exit\n"); in vgen_ldc_init()
2704 vgen_ldc_uninit(vgen_ldc_t *ldcp) in vgen_ldc_uninit() argument
2706 vgen_t *vgenp = LDC_TO_VGEN(ldcp); in vgen_ldc_uninit()
2708 DBG1(vgenp, ldcp, "enter\n"); in vgen_ldc_uninit()
2710 LDC_LOCK(ldcp); in vgen_ldc_uninit()
2712 if ((ldcp->flags & CHANNEL_STARTED) == 0) { in vgen_ldc_uninit()
2713 LDC_UNLOCK(ldcp); in vgen_ldc_uninit()
2714 DWARN(vgenp, ldcp, "CHANNEL_STARTED flag is not set\n"); in vgen_ldc_uninit()
2718 LDC_UNLOCK(ldcp); in vgen_ldc_uninit()
2720 while (atomic_cas_uint(&ldcp->reset_in_progress, 0, 1) != 0) { in vgen_ldc_uninit()
2724 (void) vgen_process_reset(ldcp, VGEN_FLAG_UNINIT); in vgen_ldc_uninit()
2726 DBG1(vgenp, ldcp, "exit\n"); in vgen_ldc_uninit()
2733 vgen_create_dring(vgen_ldc_t *ldcp) in vgen_create_dring() argument
2735 vgen_hparams_t *lp = &ldcp->local_hparams; in vgen_create_dring()
2739 rv = vgen_create_rx_dring(ldcp); in vgen_create_dring()
2741 rv = vgen_create_tx_dring(ldcp); in vgen_create_dring()
2751 vgen_destroy_dring(vgen_ldc_t *ldcp) in vgen_destroy_dring() argument
2753 vgen_hparams_t *lp = &ldcp->local_hparams; in vgen_destroy_dring()
2756 vgen_destroy_rx_dring(ldcp); in vgen_destroy_dring()
2758 vgen_destroy_tx_dring(ldcp); in vgen_destroy_dring()
2766 vgen_map_dring(vgen_ldc_t *ldcp, void *pkt) in vgen_map_dring() argument
2769 vgen_hparams_t *lp = &ldcp->local_hparams; in vgen_map_dring()
2776 rv = vgen_map_tx_dring(ldcp, pkt); in vgen_map_dring()
2783 rv = vgen_map_rx_dring(ldcp, pkt); in vgen_map_dring()
2793 vgen_unmap_dring(vgen_ldc_t *ldcp) in vgen_unmap_dring() argument
2795 vgen_hparams_t *lp = &ldcp->local_hparams; in vgen_unmap_dring()
2798 vgen_unmap_tx_dring(ldcp); in vgen_unmap_dring()
2800 vgen_unmap_rx_dring(ldcp); in vgen_unmap_dring()
2821 vgen_ldc_stat(vgen_ldc_t *ldcp, uint_t stat) in vgen_ldc_stat() argument
2827 statsp = &ldcp->stats; in vgen_ldc_stat()
2939 vgen_handle_evt_up(vgen_ldc_t *ldcp) in vgen_handle_evt_up() argument
2941 vgen_t *vgenp = LDC_TO_VGEN(ldcp); in vgen_handle_evt_up()
2943 DBG1(vgenp, ldcp, "enter\n"); in vgen_handle_evt_up()
2945 ASSERT(MUTEX_HELD(&ldcp->cblock)); in vgen_handle_evt_up()
2947 if (ldcp->portp != vgenp->vsw_portp) { in vgen_handle_evt_up()
2951 (void) atomic_swap_32(&ldcp->portp->use_vsw_port, B_FALSE); in vgen_handle_evt_up()
2955 ldcp->local_sid = ddi_get_lbolt(); in vgen_handle_evt_up()
2958 ldcp->peer_sid = 0; in vgen_handle_evt_up()
2961 (void) vgen_handshake(vh_nextphase(ldcp)); in vgen_handle_evt_up()
2963 DBG1(vgenp, ldcp, "exit\n"); in vgen_handle_evt_up()
2971 vgen_handle_evt_reset(vgen_ldc_t *ldcp, vgen_caller_t caller) in vgen_handle_evt_reset() argument
2974 ASSERT(MUTEX_HELD(&ldcp->cblock)); in vgen_handle_evt_reset()
2978 if (atomic_cas_uint(&ldcp->reset_in_progress, 0, 1) != 0) { in vgen_handle_evt_reset()
2984 mutex_exit(&ldcp->cblock); in vgen_handle_evt_reset()
2987 (void) vgen_process_reset(ldcp, VGEN_FLAG_EVT_RESET); in vgen_handle_evt_reset()
2990 mutex_enter(&ldcp->cblock); in vgen_handle_evt_reset()
3001 vgen_ldc_t *ldcp; in vgen_ldc_cb()
3007 ldcp = (vgen_ldc_t *)arg; in vgen_ldc_cb()
3008 vgenp = LDC_TO_VGEN(ldcp); in vgen_ldc_cb()
3009 statsp = &ldcp->stats; in vgen_ldc_cb()
3011 DBG1(vgenp, ldcp, "enter\n"); in vgen_ldc_cb()
3013 mutex_enter(&ldcp->cblock); in vgen_ldc_cb()
3015 if ((ldcp->ldc_status == LDC_INIT) || (ldcp->ldc_handle == NULL)) { in vgen_ldc_cb()
3016 DWARN(vgenp, ldcp, "status(%d) is LDC_INIT\n", in vgen_ldc_cb()
3017 ldcp->ldc_status); in vgen_ldc_cb()
3018 mutex_exit(&ldcp->cblock); in vgen_ldc_cb()
3028 if (ldc_status(ldcp->ldc_handle, &istatus) != 0) { in vgen_ldc_cb()
3029 DWARN(vgenp, ldcp, "ldc_status err\n"); in vgen_ldc_cb()
3034 ldcp->ldc_status = istatus; in vgen_ldc_cb()
3035 if (ldcp->ldc_status != LDC_UP) { in vgen_ldc_cb()
3036 DWARN(vgenp, ldcp, "LDC_EVT_UP received " in vgen_ldc_cb()
3038 ldcp->ldc_status); in vgen_ldc_cb()
3042 DWARN(vgenp, ldcp, "event(%lx) UP, status(%d)\n", in vgen_ldc_cb()
3043 event, ldcp->ldc_status); in vgen_ldc_cb()
3045 vgen_handle_evt_up(ldcp); in vgen_ldc_cb()
3052 if (ldc_status(ldcp->ldc_handle, &istatus) != 0) { in vgen_ldc_cb()
3053 DWARN(vgenp, ldcp, "ldc_status error\n"); in vgen_ldc_cb()
3058 ldcp->ldc_status = istatus; in vgen_ldc_cb()
3059 DWARN(vgenp, ldcp, "event(%lx) RESET/DOWN, status(%d)\n", in vgen_ldc_cb()
3060 event, ldcp->ldc_status); in vgen_ldc_cb()
3062 (void) vgen_handle_evt_reset(ldcp, VGEN_LDC_CB); in vgen_ldc_cb()
3069 DWARN(vgenp, ldcp, in vgen_ldc_cb()
3076 DBG2(vgenp, ldcp, "event(%lx) READ, status(%d)\n", in vgen_ldc_cb()
3077 event, ldcp->ldc_status); in vgen_ldc_cb()
3081 if (ldcp->msg_thread != NULL) { in vgen_ldc_cb()
3087 mutex_exit(&ldcp->cblock); in vgen_ldc_cb()
3088 mutex_enter(&ldcp->msg_thr_lock); in vgen_ldc_cb()
3089 if (!(ldcp->msg_thr_flags & VGEN_WTHR_DATARCVD)) { in vgen_ldc_cb()
3090 ldcp->msg_thr_flags |= VGEN_WTHR_DATARCVD; in vgen_ldc_cb()
3091 cv_signal(&ldcp->msg_thr_cv); in vgen_ldc_cb()
3093 mutex_exit(&ldcp->msg_thr_lock); in vgen_ldc_cb()
3094 mutex_enter(&ldcp->cblock); in vgen_ldc_cb()
3096 (void) vgen_handle_evt_read(ldcp, VGEN_LDC_CB); in vgen_ldc_cb()
3101 mutex_exit(&ldcp->cblock); in vgen_ldc_cb()
3102 DBG1(vgenp, ldcp, "exit\n"); in vgen_ldc_cb()
3107 vgen_handle_evt_read(vgen_ldc_t *ldcp, vgen_caller_t caller) in vgen_handle_evt_read() argument
3112 vgen_t *vgenp = LDC_TO_VGEN(ldcp); in vgen_handle_evt_read()
3117 DBG1(vgenp, ldcp, "enter\n"); in vgen_handle_evt_read()
3120 ASSERT(MUTEX_HELD(&ldcp->cblock)); in vgen_handle_evt_read()
3122 mutex_enter(&ldcp->cblock); in vgen_handle_evt_read()
3127 ldcmsg = ldcp->ldcmsg; in vgen_handle_evt_read()
3131 msglen = ldcp->msglen; in vgen_handle_evt_read()
3132 rv = ldc_read(ldcp->ldc_handle, (caddr_t)ldcmsg, &msglen); in vgen_handle_evt_read()
3135 DWARN(vgenp, ldcp, "ldc_read() failed " in vgen_handle_evt_read()
3142 DBG2(vgenp, ldcp, "ldc_read NODATA"); in vgen_handle_evt_read()
3145 DBG2(vgenp, ldcp, "ldc_read msglen(%d)", msglen); in vgen_handle_evt_read()
3149 if (ldcp->peer_sid) { in vgen_handle_evt_read()
3155 if (vgen_inject_error(ldcp, VGEN_ERR_HSID)) { in vgen_handle_evt_read()
3161 rv = vgen_check_sid(ldcp, tagp); in vgen_handle_evt_read()
3167 DWARN(vgenp, ldcp, "vgen_check_sid() failed\n"); in vgen_handle_evt_read()
3174 rv = vgen_handle_ctrlmsg(ldcp, tagp); in vgen_handle_evt_read()
3176 DWARN(vgenp, ldcp, "vgen_handle_ctrlmsg()" in vgen_handle_evt_read()
3182 rv = vgen_handle_datamsg(ldcp, tagp, msglen); in vgen_handle_evt_read()
3184 DWARN(vgenp, ldcp, "vgen_handle_datamsg()" in vgen_handle_evt_read()
3190 vgen_handle_errmsg(ldcp, tagp); in vgen_handle_evt_read()
3194 DWARN(vgenp, ldcp, "Unknown VIO_TYPE(%x)\n", in vgen_handle_evt_read()
3210 rv = ldc_chkq(ldcp->ldc_handle, &has_data); in vgen_handle_evt_read()
3212 DTRACE_PROBE1(vgen_chkq, vgen_ldc_t *, ldcp); in vgen_handle_evt_read()
3225 if (ldc_status(ldcp->ldc_handle, &istatus) != 0) { in vgen_handle_evt_read()
3226 DWARN(vgenp, ldcp, "ldc_status err\n"); in vgen_handle_evt_read()
3228 ldcp->ldc_status = istatus; in vgen_handle_evt_read()
3230 (void) vgen_handle_evt_reset(ldcp, caller); in vgen_handle_evt_read()
3232 DWARN(vgenp, ldcp, "Calling vgen_ldc_reset()...\n"); in vgen_handle_evt_read()
3233 (void) vgen_ldc_reset(ldcp, caller); in vgen_handle_evt_read()
3238 mutex_exit(&ldcp->cblock); in vgen_handle_evt_read()
3241 DBG1(vgenp, ldcp, "exit\n"); in vgen_handle_evt_read()
3249 vh_nextphase(vgen_ldc_t *ldcp) in vh_nextphase() argument
3251 if (ldcp->hphase == VH_PHASE4) { in vh_nextphase()
3252 ldcp->hphase = VH_DONE; in vh_nextphase()
3254 ldcp->hphase++; in vh_nextphase()
3256 return (ldcp); in vh_nextphase()
3261 vgen_send_version_negotiate(vgen_ldc_t *ldcp) in vgen_send_version_negotiate() argument
3263 vgen_t *vgenp = LDC_TO_VGEN(ldcp); in vgen_send_version_negotiate()
3273 tagp->vio_sid = ldcp->local_sid; in vgen_send_version_negotiate()
3276 vermsg.ver_major = ldcp->local_hparams.ver_major; in vgen_send_version_negotiate()
3277 vermsg.ver_minor = ldcp->local_hparams.ver_minor; in vgen_send_version_negotiate()
3278 vermsg.dev_class = ldcp->local_hparams.dev_class; in vgen_send_version_negotiate()
3280 rv = vgen_sendmsg(ldcp, (caddr_t)tagp, sizeof (vermsg), B_FALSE); in vgen_send_version_negotiate()
3282 DWARN(vgenp, ldcp, "vgen_sendmsg failed\n"); in vgen_send_version_negotiate()
3286 ldcp->hstate |= VER_INFO_SENT; in vgen_send_version_negotiate()
3287 DBG2(vgenp, ldcp, "VER_INFO_SENT ver(%d,%d)\n", in vgen_send_version_negotiate()
3295 vgen_send_attr_info(vgen_ldc_t *ldcp) in vgen_send_attr_info() argument
3297 vgen_t *vgenp = LDC_TO_VGEN(ldcp); in vgen_send_attr_info()
3307 tagp->vio_sid = ldcp->local_sid; in vgen_send_attr_info()
3310 attrmsg.mtu = ldcp->local_hparams.mtu; in vgen_send_attr_info()
3311 attrmsg.addr = ldcp->local_hparams.addr; in vgen_send_attr_info()
3312 attrmsg.addr_type = ldcp->local_hparams.addr_type; in vgen_send_attr_info()
3313 attrmsg.xfer_mode = ldcp->local_hparams.xfer_mode; in vgen_send_attr_info()
3314 attrmsg.ack_freq = ldcp->local_hparams.ack_freq; in vgen_send_attr_info()
3315 attrmsg.physlink_update = ldcp->local_hparams.physlink_update; in vgen_send_attr_info()
3316 attrmsg.options = ldcp->local_hparams.dring_mode; in vgen_send_attr_info()
3318 rv = vgen_sendmsg(ldcp, (caddr_t)tagp, sizeof (attrmsg), B_FALSE); in vgen_send_attr_info()
3320 DWARN(vgenp, ldcp, "vgen_sendmsg failed\n"); in vgen_send_attr_info()
3324 ldcp->hstate |= ATTR_INFO_SENT; in vgen_send_attr_info()
3325 DBG2(vgenp, ldcp, "ATTR_INFO_SENT\n"); in vgen_send_attr_info()
3335 vgen_send_rx_dring_reg(vgen_ldc_t *ldcp) in vgen_send_rx_dring_reg() argument
3337 vgen_t *vgenp = LDC_TO_VGEN(ldcp); in vgen_send_rx_dring_reg()
3344 msgsize = VNET_DRING_REG_EXT_MSG_SIZE(ldcp->rx_data_ncookies); in vgen_send_rx_dring_reg()
3348 vgen_init_dring_reg_msg(ldcp, msg, VIO_RX_DRING_DATA); in vgen_send_rx_dring_reg()
3359 emsg->data_ncookies = ldcp->rx_data_ncookies; in vgen_send_rx_dring_reg()
3362 emsg->data_area_size = ldcp->rx_data_sz; in vgen_send_rx_dring_reg()
3365 bcopy(ldcp->rx_data_cookie, (ldc_mem_cookie_t *)emsg->data_cookie, in vgen_send_rx_dring_reg()
3366 sizeof (ldc_mem_cookie_t) * ldcp->rx_data_ncookies); in vgen_send_rx_dring_reg()
3368 rv = vgen_sendmsg(ldcp, (caddr_t)msg, msgsize, B_FALSE); in vgen_send_rx_dring_reg()
3370 DWARN(vgenp, ldcp, "vgen_sendmsg failed\n"); in vgen_send_rx_dring_reg()
3375 ldcp->hstate |= DRING_INFO_SENT; in vgen_send_rx_dring_reg()
3376 DBG2(vgenp, ldcp, "DRING_INFO_SENT \n"); in vgen_send_rx_dring_reg()
3387 vgen_send_tx_dring_reg(vgen_ldc_t *ldcp) in vgen_send_tx_dring_reg() argument
3389 vgen_t *vgenp = LDC_TO_VGEN(ldcp); in vgen_send_tx_dring_reg()
3398 vgen_init_dring_reg_msg(ldcp, &msg, VIO_TX_DRING); in vgen_send_tx_dring_reg()
3400 rv = vgen_sendmsg(ldcp, (caddr_t)&msg, sizeof (msg), B_FALSE); in vgen_send_tx_dring_reg()
3402 DWARN(vgenp, ldcp, "vgen_sendmsg failed\n"); in vgen_send_tx_dring_reg()
3406 ldcp->hstate |= DRING_INFO_SENT; in vgen_send_tx_dring_reg()
3407 DBG2(vgenp, ldcp, "DRING_INFO_SENT \n"); in vgen_send_tx_dring_reg()
3413 vgen_send_rdx_info(vgen_ldc_t *ldcp) in vgen_send_rdx_info() argument
3415 vgen_t *vgenp = LDC_TO_VGEN(ldcp); in vgen_send_rdx_info()
3425 tagp->vio_sid = ldcp->local_sid; in vgen_send_rdx_info()
3427 rv = vgen_sendmsg(ldcp, (caddr_t)tagp, sizeof (rdxmsg), B_FALSE); in vgen_send_rdx_info()
3429 DWARN(vgenp, ldcp, "vgen_sendmsg failed\n"); in vgen_send_rdx_info()
3433 ldcp->hstate |= RDX_INFO_SENT; in vgen_send_rdx_info()
3434 DBG2(vgenp, ldcp, "RDX_INFO_SENT\n"); in vgen_send_rdx_info()
3441 vgen_send_mcast_info(vgen_ldc_t *ldcp) in vgen_send_mcast_info() argument
3456 vgenp = LDC_TO_VGEN(ldcp); in vgen_send_mcast_info()
3465 tagp->vio_sid = ldcp->local_sid; in vgen_send_mcast_info()
3475 rv = vgen_sendmsg(ldcp, (caddr_t)tagp, sizeof (*msgp), in vgen_send_mcast_info()
3478 DWARN(vgenp, ldcp, "vgen_sendmsg err(%d)\n", rv); in vgen_send_mcast_info()
3494 vgen_dds_rx(vgen_ldc_t *ldcp, vio_msg_tag_t *tagp) in vgen_dds_rx() argument
3497 vgen_t *vgenp = LDC_TO_VGEN(ldcp); in vgen_dds_rx()
3500 DWARN(vgenp, ldcp, "Unknown DDS class, dropping"); in vgen_dds_rx()
3516 vgen_ldc_t *ldcp; in vgen_dds_tx() local
3520 ldcp = vgenp->vsw_portp->ldcp; in vgen_dds_tx()
3521 if ((ldcp == NULL) || (ldcp->hphase != VH_DONE)) { in vgen_dds_tx()
3525 dmsg->tag.vio_sid = ldcp->local_sid; in vgen_dds_tx()
3526 rv = vgen_sendmsg(ldcp, (caddr_t)dmsg, sizeof (vio_dds_msg_t), B_FALSE); in vgen_dds_tx()
3541 vgen_handshake_phase2(vgen_ldc_t *ldcp) in vgen_handshake_phase2() argument
3546 if (vgen_inject_error(ldcp, VGEN_ERR_HSTATE)) { in vgen_handshake_phase2()
3549 rv = vgen_send_rdx_info(ldcp); in vgen_handshake_phase2()
3552 if (vgen_inject_error(ldcp, VGEN_ERR_HTIMEOUT)) { in vgen_handshake_phase2()
3558 rv = vgen_send_attr_info(ldcp); in vgen_handshake_phase2()
3567 vgen_handshake_phase3(vgen_ldc_t *ldcp) in vgen_handshake_phase3() argument
3570 vgen_hparams_t *lp = &ldcp->local_hparams; in vgen_handshake_phase3()
3571 vgen_t *vgenp = LDC_TO_VGEN(ldcp); in vgen_handshake_phase3()
3572 vgen_stats_t *statsp = &ldcp->stats; in vgen_handshake_phase3()
3578 ldcp->rx_dringdata = vgen_handle_dringdata_shm; in vgen_handshake_phase3()
3579 ldcp->tx_dringdata = vgen_dringsend_shm; in vgen_handshake_phase3()
3588 ldcp->tx = ldcp->tx_dringdata; in vgen_handshake_phase3()
3591 ldcp->msg_thread = thread_create(NULL, in vgen_handshake_phase3()
3592 2 * DEFAULTSTKSZ, vgen_ldc_msg_worker, ldcp, 0, in vgen_handshake_phase3()
3596 rv = vgen_create_dring(ldcp); in vgen_handshake_phase3()
3603 bcopy(&(ldcp->rx_dring_cookie), in vgen_handshake_phase3()
3604 &(ldcp->local_hparams.dring_cookie), in vgen_handshake_phase3()
3606 ldcp->local_hparams.dring_ncookies = ldcp->rx_dring_ncookies; in vgen_handshake_phase3()
3607 ldcp->local_hparams.num_desc = ldcp->num_rxds; in vgen_handshake_phase3()
3608 ldcp->local_hparams.desc_size = in vgen_handshake_phase3()
3610 rv = vgen_send_rx_dring_reg(ldcp); in vgen_handshake_phase3()
3612 bcopy(&(ldcp->tx_dring_cookie), in vgen_handshake_phase3()
3613 &(ldcp->local_hparams.dring_cookie), in vgen_handshake_phase3()
3615 ldcp->local_hparams.dring_ncookies = ldcp->tx_dring_ncookies; in vgen_handshake_phase3()
3616 ldcp->local_hparams.num_desc = ldcp->num_txds; in vgen_handshake_phase3()
3617 ldcp->local_hparams.desc_size = sizeof (vnet_public_desc_t); in vgen_handshake_phase3()
3618 rv = vgen_send_tx_dring_reg(ldcp); in vgen_handshake_phase3()
3632 vgen_set_vnet_proto_ops(vgen_ldc_t *ldcp) in vgen_set_vnet_proto_ops() argument
3634 vgen_hparams_t *lp = &ldcp->local_hparams; in vgen_set_vnet_proto_ops()
3635 vgen_t *vgenp = LDC_TO_VGEN(ldcp); in vgen_set_vnet_proto_ops()
3657 if (VGEN_VER_GTEQ(ldcp, 1, 6)) { /* Ver >= 1.6 */ in vgen_set_vnet_proto_ops()
3661 if (vgen_mapin_avail(ldcp) == B_TRUE) { in vgen_set_vnet_proto_ops()
3670 if (VGEN_VER_GTEQ(ldcp, 1, 5)) { in vgen_set_vnet_proto_ops()
3671 vgen_port_t *portp = ldcp->portp; in vgen_set_vnet_proto_ops()
3686 if (VGEN_VER_GTEQ(ldcp, 1, 4)) { in vgen_set_vnet_proto_ops()
3692 } else if (VGEN_VER_EQ(ldcp, 1, 3)) { in vgen_set_vnet_proto_ops()
3699 vgen_port_t *portp = ldcp->portp; in vgen_set_vnet_proto_ops()
3715 if (VGEN_VER_GTEQ(ldcp, 1, 2)) { /* Versions >= 1.2 */ in vgen_set_vnet_proto_ops()
3723 ldcp->tx_dringdata = vgen_dringsend; in vgen_set_vnet_proto_ops()
3724 ldcp->rx_dringdata = vgen_handle_dringdata; in vgen_set_vnet_proto_ops()
3731 ldcp->tx = vgen_ldcsend; in vgen_set_vnet_proto_ops()
3732 ldcp->rx_pktdata = vgen_handle_pkt_data; in vgen_set_vnet_proto_ops()
3738 ldcp->tx = ldcp->tx_dringdata; in vgen_set_vnet_proto_ops()
3739 ldcp->rx_pktdata = vgen_handle_pkt_data_nop; in vgen_set_vnet_proto_ops()
3745 vgen_reset_vnet_proto_ops(ldcp); in vgen_set_vnet_proto_ops()
3753 vgen_reset_vnet_proto_ops(vgen_ldc_t *ldcp) in vgen_reset_vnet_proto_ops() argument
3755 vgen_hparams_t *lp = &ldcp->local_hparams; in vgen_reset_vnet_proto_ops()
3757 ldcp->tx = ldcp->tx_dringdata = vgen_dringsend; in vgen_reset_vnet_proto_ops()
3758 ldcp->rx_dringdata = vgen_handle_dringdata; in vgen_reset_vnet_proto_ops()
3759 ldcp->rx_pktdata = vgen_handle_pkt_data_nop; in vgen_reset_vnet_proto_ops()
3768 vgen_ldc_t *ldcp = portp->ldcp; in vgen_vlan_unaware_port_reset() local
3773 mutex_enter(&ldcp->cblock); in vgen_vlan_unaware_port_reset()
3779 if (ldcp->hphase == VH_DONE && VGEN_VER_LT(ldcp, 1, 3) && in vgen_vlan_unaware_port_reset()
3783 mutex_exit(&ldcp->cblock); in vgen_vlan_unaware_port_reset()
3786 (void) vgen_ldc_reset(ldcp, VGEN_OTHER); in vgen_vlan_unaware_port_reset()
3793 (void) vgen_ldc_reset(portp->ldcp, VGEN_OTHER); in vgen_port_reset()
3825 vgen_setup_handshake_params(vgen_ldc_t *ldcp) in vgen_setup_handshake_params() argument
3827 vgen_t *vgenp = LDC_TO_VGEN(ldcp); in vgen_setup_handshake_params()
3832 bzero(&(ldcp->local_hparams), sizeof (ldcp->local_hparams)); in vgen_setup_handshake_params()
3835 ldcp->local_hparams.ver_major = in vgen_setup_handshake_params()
3836 ldcp->vgen_versions[0].ver_major; in vgen_setup_handshake_params()
3837 ldcp->local_hparams.ver_minor = in vgen_setup_handshake_params()
3838 ldcp->vgen_versions[0].ver_minor; in vgen_setup_handshake_params()
3839 ldcp->local_hparams.dev_class = VDEV_NETWORK; in vgen_setup_handshake_params()
3842 ldcp->local_hparams.mtu = vgenp->max_frame_size; in vgen_setup_handshake_params()
3843 ldcp->local_hparams.addr = in vgen_setup_handshake_params()
3845 ldcp->local_hparams.addr_type = ADDR_TYPE_MAC; in vgen_setup_handshake_params()
3846 ldcp->local_hparams.xfer_mode = VIO_DRING_MODE_V1_0; in vgen_setup_handshake_params()
3847 ldcp->local_hparams.ack_freq = 0; /* don't need acks */ in vgen_setup_handshake_params()
3848 ldcp->local_hparams.physlink_update = PHYSLINK_UPDATE_NONE; in vgen_setup_handshake_params()
3851 vgen_reset_vnet_proto_ops(ldcp); in vgen_setup_handshake_params()
3852 ldcp->local_hparams.dring_ident = 0; in vgen_setup_handshake_params()
3853 ldcp->local_hparams.dring_ready = B_FALSE; in vgen_setup_handshake_params()
3856 bzero(&(ldcp->peer_hparams), sizeof (ldcp->peer_hparams)); in vgen_setup_handshake_params()
3857 ldcp->peer_hparams.dring_ready = B_FALSE; in vgen_setup_handshake_params()
3883 vgen_process_reset(vgen_ldc_t *ldcp, int flags) in vgen_process_reset() argument
3885 vgen_t *vgenp = LDC_TO_VGEN(ldcp); in vgen_process_reset()
3886 vgen_port_t *portp = ldcp->portp; in vgen_process_reset()
3887 vgen_hparams_t *lp = &ldcp->local_hparams; in vgen_process_reset()
3911 mutex_enter(&ldcp->cblock); in vgen_process_reset()
3914 ldcp->hstate = 0; in vgen_process_reset()
3915 ldcp->hphase = VH_PHASE0; in vgen_process_reset()
3917 DWARN(vgenp, ldcp, "Doing Channel Reset...\n"); in vgen_process_reset()
3918 (void) ldc_down(ldcp->ldc_handle); in vgen_process_reset()
3919 (void) ldc_status(ldcp->ldc_handle, &istatus); in vgen_process_reset()
3920 DWARN(vgenp, ldcp, "Reset Done, ldc_status(%d)\n", istatus); in vgen_process_reset()
3921 ldcp->ldc_status = istatus; in vgen_process_reset()
3925 rv = ldc_set_cb_mode(ldcp->ldc_handle, LDC_CB_DISABLE); in vgen_process_reset()
3927 DWARN(vgenp, ldcp, "ldc_set_cb_mode failed\n"); in vgen_process_reset()
3933 DWARN(vgenp, ldcp, "ldc status(%d)\n", ldcp->ldc_status); in vgen_process_reset()
3940 if (ldcp->link_state != LINK_STATE_DOWN) { in vgen_process_reset()
3941 ldcp->link_state = LINK_STATE_DOWN; in vgen_process_reset()
3957 if (ldcp->htid != 0) { in vgen_process_reset()
3958 htid = ldcp->htid; in vgen_process_reset()
3959 ldcp->htid = 0; in vgen_process_reset()
3962 if (ldcp->wd_tid != 0) { in vgen_process_reset()
3963 wd_tid = ldcp->wd_tid; in vgen_process_reset()
3964 ldcp->wd_tid = 0; in vgen_process_reset()
3967 mutex_exit(&ldcp->cblock); in vgen_process_reset()
3971 vgen_link_update(vgenp, ldcp->link_state); in vgen_process_reset()
3993 if (lp->dring_mode == VIO_TX_DRING && curthread != ldcp->msg_thread) { in vgen_process_reset()
3994 vgen_stop_msg_thread(ldcp); in vgen_process_reset()
3998 LDC_LOCK(ldcp); in vgen_process_reset()
4001 vgen_destroy_dring(ldcp); in vgen_process_reset()
4004 vgen_unmap_dring(ldcp); in vgen_process_reset()
4013 vgen_setup_handshake_params(ldcp); in vgen_process_reset()
4016 vgen_ldc_up(ldcp); in vgen_process_reset()
4018 if (ldc_status(ldcp->ldc_handle, &istatus) != 0) { in vgen_process_reset()
4019 DWARN(vgenp, ldcp, "ldc_status err\n"); in vgen_process_reset()
4021 ldcp->ldc_status = istatus; in vgen_process_reset()
4025 if (ldcp->ldc_status == LDC_UP) { in vgen_process_reset()
4036 ldcp->local_sid = ddi_get_lbolt(); in vgen_process_reset()
4039 ldcp->peer_sid = 0; in vgen_process_reset()
4049 mutex_exit(&ldcp->tclock); in vgen_process_reset()
4050 mutex_exit(&ldcp->txlock); in vgen_process_reset()
4051 mutex_exit(&ldcp->wrlock); in vgen_process_reset()
4052 mutex_exit(&ldcp->rxlock); in vgen_process_reset()
4053 rv = vgen_handshake(vh_nextphase(ldcp)); in vgen_process_reset()
4054 mutex_exit(&ldcp->cblock); in vgen_process_reset()
4070 LDC_UNLOCK(ldcp); in vgen_process_reset()
4076 while ((rv = ldc_close(ldcp->ldc_handle)) == EAGAIN) { in vgen_process_reset()
4085 vgenp->instance, rv, ldcp->ldc_id); in vgen_process_reset()
4088 ldcp->ldc_reset_count = 0; in vgen_process_reset()
4089 ldcp->ldc_status = LDC_INIT; in vgen_process_reset()
4090 ldcp->flags &= ~(CHANNEL_STARTED); in vgen_process_reset()
4092 LDC_UNLOCK(ldcp); in vgen_process_reset()
4096 ldcp->reset_in_progress = 0; in vgen_process_reset()
4105 vgen_handshake(vgen_ldc_t *ldcp) in vgen_handshake() argument
4107 uint32_t hphase = ldcp->hphase; in vgen_handshake()
4108 vgen_t *vgenp = LDC_TO_VGEN(ldcp); in vgen_handshake()
4122 ASSERT(ldcp->htid == 0); in vgen_handshake()
4123 ldcp->htid = timeout(vgen_hwatchdog, (caddr_t)ldcp, in vgen_handshake()
4127 rv = vgen_send_version_negotiate(ldcp); in vgen_handshake()
4131 rv = vgen_handshake_phase2(ldcp); in vgen_handshake()
4135 rv = vgen_handshake_phase3(ldcp); in vgen_handshake()
4139 rv = vgen_send_rdx_info(ldcp); in vgen_handshake()
4144 ldcp->ldc_reset_count = 0; in vgen_handshake()
4146 DBG1(vgenp, ldcp, "Handshake Done\n"); in vgen_handshake()
4153 ldcp->link_state = LINK_STATE_UP; in vgen_handshake()
4155 if (ldcp->portp == vgenp->vsw_portp) { in vgen_handshake()
4160 rv = vgen_send_mcast_info(ldcp); in vgen_handshake()
4178 mutex_exit(&ldcp->cblock); in vgen_handshake()
4179 vgen_link_update(vgenp, ldcp->link_state); in vgen_handshake()
4180 mutex_enter(&ldcp->cblock); in vgen_handshake()
4184 if (ldcp->htid != 0) { in vgen_handshake()
4185 htid = ldcp->htid; in vgen_handshake()
4186 ldcp->htid = 0; in vgen_handshake()
4188 mutex_exit(&ldcp->cblock); in vgen_handshake()
4190 mutex_enter(&ldcp->cblock); in vgen_handshake()
4198 mutex_enter(&ldcp->tclock); in vgen_handshake()
4199 if (ldcp->tx_blocked) { in vgen_handshake()
4201 ldcp->portp->vcb.vio_net_tx_update; in vgen_handshake()
4203 ldcp->tx_blocked = B_FALSE; in vgen_handshake()
4204 vtx_update(ldcp->portp->vhp); in vgen_handshake()
4206 mutex_exit(&ldcp->tclock); in vgen_handshake()
4209 ldcp->wd_tid = timeout(vgen_tx_watchdog, (caddr_t)ldcp, in vgen_handshake()
4226 vgen_handshake_done(vgen_ldc_t *ldcp) in vgen_handshake_done() argument
4228 vgen_t *vgenp = LDC_TO_VGEN(ldcp); in vgen_handshake_done()
4229 uint32_t hphase = ldcp->hphase; in vgen_handshake_done()
4239 status = ((ldcp->hstate & VER_NEGOTIATED) == in vgen_handshake_done()
4248 status = ((ldcp->hstate & ATTR_INFO_EXCHANGED) == in vgen_handshake_done()
4257 status = ((ldcp->hstate & DRING_INFO_EXCHANGED) == in vgen_handshake_done()
4263 status = ((ldcp->hstate & RDX_EXCHANGED) == in vgen_handshake_done()
4274 DBG2(vgenp, ldcp, "PHASE(%d)\n", hphase); in vgen_handshake_done()
4306 vgen_handle_version_negotiate(vgen_ldc_t *ldcp, vio_msg_tag_t *tagp) in vgen_handle_version_negotiate() argument
4313 vgen_ver_t *versions = ldcp->vgen_versions; in vgen_handle_version_negotiate()
4316 vgenp = LDC_TO_VGEN(ldcp); in vgen_handle_version_negotiate()
4317 DBG1(vgenp, ldcp, "enter\n"); in vgen_handle_version_negotiate()
4322 if (ldcp->peer_sid == 0) { in vgen_handle_version_negotiate()
4323 DBG2(vgenp, ldcp, "Caching peer_sid(%x)\n", in vgen_handle_version_negotiate()
4325 ldcp->peer_sid = tagp->vio_sid; in vgen_handle_version_negotiate()
4328 if (ldcp->hphase != VH_PHASE1) { in vgen_handle_version_negotiate()
4337 ldcp->hstate |= VER_INFO_RCVD; in vgen_handle_version_negotiate()
4340 ldcp->peer_hparams.ver_major = vermsg->ver_major; in vgen_handle_version_negotiate()
4341 ldcp->peer_hparams.ver_minor = vermsg->ver_minor; in vgen_handle_version_negotiate()
4342 ldcp->peer_hparams.dev_class = vermsg->dev_class; in vgen_handle_version_negotiate()
4348 DWARN(vgenp, ldcp, "Version Negotiation Failed\n"); in vgen_handle_version_negotiate()
4351 tagp->vio_sid = ldcp->local_sid; in vgen_handle_version_negotiate()
4353 rv = vgen_sendmsg(ldcp, (caddr_t)tagp, in vgen_handle_version_negotiate()
4361 DBG2(vgenp, ldcp, "VER_INFO_RCVD, ver(%d,%d)\n", in vgen_handle_version_negotiate()
4391 ldcp->peer_hparams.ver_minor = in vgen_handle_version_negotiate()
4411 tagp->vio_sid = ldcp->local_sid; in vgen_handle_version_negotiate()
4414 rv = vgen_sendmsg(ldcp, (caddr_t)tagp, sizeof (*vermsg), in vgen_handle_version_negotiate()
4421 ldcp->hstate |= VER_ACK_SENT; in vgen_handle_version_negotiate()
4422 DBG2(vgenp, ldcp, "VER_ACK_SENT, ver(%d,%d) \n", in vgen_handle_version_negotiate()
4426 DWARN(vgenp, ldcp, "Negotiation Failed\n"); in vgen_handle_version_negotiate()
4429 if (vgen_handshake_done(ldcp) == VGEN_SUCCESS) { in vgen_handle_version_negotiate()
4434 ASSERT((ldcp->local_hparams.ver_major == in vgen_handle_version_negotiate()
4435 ldcp->peer_hparams.ver_major) && in vgen_handle_version_negotiate()
4436 (ldcp->local_hparams.ver_minor == in vgen_handle_version_negotiate()
4437 ldcp->peer_hparams.ver_minor)); in vgen_handle_version_negotiate()
4439 vgen_set_vnet_proto_ops(ldcp); in vgen_handle_version_negotiate()
4442 rv = vgen_handshake(vh_nextphase(ldcp)); in vgen_handle_version_negotiate()
4452 if (ldcp->hphase != VH_PHASE1) { in vgen_handle_version_negotiate()
4454 DWARN(vgenp, ldcp, "Invalid Phase(%u)\n", ldcp->hphase); in vgen_handle_version_negotiate()
4459 ldcp->local_hparams.ver_major = vermsg->ver_major; in vgen_handle_version_negotiate()
4460 ldcp->local_hparams.ver_minor = vermsg->ver_minor; in vgen_handle_version_negotiate()
4461 ldcp->hstate |= VER_ACK_RCVD; in vgen_handle_version_negotiate()
4463 DBG2(vgenp, ldcp, "VER_ACK_RCVD, ver(%d,%d) \n", in vgen_handle_version_negotiate()
4466 if (vgen_handshake_done(ldcp) == VGEN_SUCCESS) { in vgen_handle_version_negotiate()
4471 ASSERT((ldcp->local_hparams.ver_major == in vgen_handle_version_negotiate()
4472 ldcp->peer_hparams.ver_major) && in vgen_handle_version_negotiate()
4473 (ldcp->local_hparams.ver_minor == in vgen_handle_version_negotiate()
4474 ldcp->peer_hparams.ver_minor)); in vgen_handle_version_negotiate()
4476 vgen_set_vnet_proto_ops(ldcp); in vgen_handle_version_negotiate()
4479 rv = vgen_handshake(vh_nextphase(ldcp)); in vgen_handle_version_negotiate()
4488 if (ldcp->hphase != VH_PHASE1) { in vgen_handle_version_negotiate()
4490 DWARN(vgenp, ldcp, "VER_NACK_RCVD Invalid " in vgen_handle_version_negotiate()
4491 "Phase(%u)\n", ldcp->hphase); in vgen_handle_version_negotiate()
4495 DBG2(vgenp, ldcp, "VER_NACK_RCVD next ver(%d,%d)\n", in vgen_handle_version_negotiate()
4503 DWARN(vgenp, ldcp, "Version Negotiation Failed\n"); in vgen_handle_version_negotiate()
4514 ldcp->local_hparams.ver_major = in vgen_handle_version_negotiate()
4516 ldcp->local_hparams.ver_minor = in vgen_handle_version_negotiate()
4524 ldcp->local_hparams.ver_major = in vgen_handle_version_negotiate()
4527 ldcp->local_hparams.ver_minor = in vgen_handle_version_negotiate()
4539 DWARN(vgenp, ldcp, in vgen_handle_version_negotiate()
4546 rv = vgen_send_version_negotiate(ldcp); in vgen_handle_version_negotiate()
4554 DBG1(vgenp, ldcp, "exit\n"); in vgen_handle_version_negotiate()
4559 vgen_handle_attr_info(vgen_ldc_t *ldcp, vnet_attr_msg_t *msg) in vgen_handle_attr_info() argument
4561 vgen_t *vgenp = LDC_TO_VGEN(ldcp); in vgen_handle_attr_info()
4562 vgen_hparams_t *lp = &ldcp->local_hparams; in vgen_handle_attr_info()
4563 vgen_hparams_t *rp = &ldcp->peer_hparams; in vgen_handle_attr_info()
4567 ldcp->hstate |= ATTR_INFO_RCVD; in vgen_handle_attr_info()
4589 if (VGEN_VER_GTEQ(ldcp, 1, 6)) { in vgen_handle_attr_info()
4600 vgen_mapin_avail(ldcp) == B_TRUE) { in vgen_handle_attr_info()
4627 if (ldcp->hstate & ATTR_ACK_RCVD) { in vgen_handle_attr_info()
4648 if (VGEN_VER_GTEQ(ldcp, 1, 4)) { in vgen_handle_attr_info()
4667 if (ldcp->hstate & ATTR_ACK_RCVD) { in vgen_handle_attr_info()
4695 vgen_handle_attr_ack(vgen_ldc_t *ldcp, vnet_attr_msg_t *msg) in vgen_handle_attr_ack() argument
4697 vgen_t *vgenp = LDC_TO_VGEN(ldcp); in vgen_handle_attr_ack()
4698 vgen_hparams_t *lp = &ldcp->local_hparams; in vgen_handle_attr_ack()
4703 if (VGEN_VER_GTEQ(ldcp, 1, 6)) { in vgen_handle_attr_ack()
4710 if (ldcp->hstate & ATTR_ACK_SENT) { in vgen_handle_attr_ack()
4749 if (VGEN_VER_GTEQ(ldcp, 1, 5) && in vgen_handle_attr_ack()
4750 ldcp->portp == vgenp->vsw_portp) { in vgen_handle_attr_ack()
4770 if (VGEN_VER_GTEQ(ldcp, 1, 4)) { in vgen_handle_attr_ack()
4783 if (ldcp->hstate & ATTR_ACK_SENT) { in vgen_handle_attr_ack()
4812 vgen_handle_attr_msg(vgen_ldc_t *ldcp, vio_msg_tag_t *tagp) in vgen_handle_attr_msg() argument
4814 vgen_t *vgenp = LDC_TO_VGEN(ldcp); in vgen_handle_attr_msg()
4818 DBG1(vgenp, ldcp, "enter\n"); in vgen_handle_attr_msg()
4819 if (ldcp->hphase != VH_PHASE2) { in vgen_handle_attr_msg()
4820 DWARN(vgenp, ldcp, "Rcvd ATTR_INFO subtype(%d)," in vgen_handle_attr_msg()
4822 tagp->vio_subtype, ldcp->hphase); in vgen_handle_attr_msg()
4828 rv = vgen_handle_attr_info(ldcp, msg); in vgen_handle_attr_msg()
4834 tagp->vio_sid = ldcp->local_sid; in vgen_handle_attr_msg()
4837 rv = vgen_sendmsg(ldcp, (caddr_t)tagp, sizeof (*msg), in vgen_handle_attr_msg()
4844 DWARN(vgenp, ldcp, "ATTR_NACK_SENT"); in vgen_handle_attr_msg()
4848 ldcp->hstate |= ATTR_ACK_SENT; in vgen_handle_attr_msg()
4849 DBG2(vgenp, ldcp, "ATTR_ACK_SENT \n"); in vgen_handle_attr_msg()
4850 if (vgen_handshake_done(ldcp) == VGEN_SUCCESS) { in vgen_handle_attr_msg()
4851 rv = vgen_handshake(vh_nextphase(ldcp)); in vgen_handle_attr_msg()
4861 rv = vgen_handle_attr_ack(ldcp, msg); in vgen_handle_attr_msg()
4866 ldcp->hstate |= ATTR_ACK_RCVD; in vgen_handle_attr_msg()
4867 DBG2(vgenp, ldcp, "ATTR_ACK_RCVD \n"); in vgen_handle_attr_msg()
4869 if (vgen_handshake_done(ldcp) == VGEN_SUCCESS) { in vgen_handle_attr_msg()
4870 rv = vgen_handshake(vh_nextphase(ldcp)); in vgen_handle_attr_msg()
4879 DBG2(vgenp, ldcp, "ATTR_NACK_RCVD \n"); in vgen_handle_attr_msg()
4882 DBG1(vgenp, ldcp, "exit\n"); in vgen_handle_attr_msg()
4887 vgen_handle_dring_reg_info(vgen_ldc_t *ldcp, vio_msg_tag_t *tagp) in vgen_handle_dring_reg_info() argument
4890 vgen_t *vgenp = LDC_TO_VGEN(ldcp); in vgen_handle_dring_reg_info()
4891 vgen_hparams_t *lp = &ldcp->local_hparams; in vgen_handle_dring_reg_info()
4893 DBG2(vgenp, ldcp, "DRING_INFO_RCVD"); in vgen_handle_dring_reg_info()
4894 ldcp->hstate |= DRING_INFO_RCVD; in vgen_handle_dring_reg_info()
4896 if (VGEN_VER_GTEQ(ldcp, 1, 6) && in vgen_handle_dring_reg_info()
4904 DWARN(vgenp, ldcp, in vgen_handle_dring_reg_info()
4913 rv = vgen_map_dring(ldcp, (void *)tagp); in vgen_handle_dring_reg_info()
4922 rv = vgen_map_data(ldcp, (void *)tagp); in vgen_handle_dring_reg_info()
4924 vgen_unmap_dring(ldcp); in vgen_handle_dring_reg_info()
4929 if (ldcp->peer_hparams.dring_ready == B_FALSE) { in vgen_handle_dring_reg_info()
4930 ldcp->peer_hparams.dring_ready = B_TRUE; in vgen_handle_dring_reg_info()
4937 vgen_handle_dring_reg_ack(vgen_ldc_t *ldcp, vio_msg_tag_t *tagp) in vgen_handle_dring_reg_ack() argument
4939 vgen_t *vgenp = LDC_TO_VGEN(ldcp); in vgen_handle_dring_reg_ack()
4940 vgen_hparams_t *lp = &ldcp->local_hparams; in vgen_handle_dring_reg_ack()
4942 DBG2(vgenp, ldcp, "DRING_ACK_RCVD"); in vgen_handle_dring_reg_ack()
4943 ldcp->hstate |= DRING_ACK_RCVD; in vgen_handle_dring_reg_ack()
4963 vgen_handle_dring_reg(vgen_ldc_t *ldcp, vio_msg_tag_t *tagp) in vgen_handle_dring_reg() argument
4965 vgen_t *vgenp = LDC_TO_VGEN(ldcp); in vgen_handle_dring_reg()
4968 vgen_hparams_t *lp = &ldcp->local_hparams; in vgen_handle_dring_reg()
4970 DBG1(vgenp, ldcp, "enter\n"); in vgen_handle_dring_reg()
4971 if (ldcp->hphase < VH_PHASE2) { in vgen_handle_dring_reg()
4973 DWARN(vgenp, ldcp, in vgen_handle_dring_reg()
4975 tagp->vio_subtype, ldcp->hphase); in vgen_handle_dring_reg()
4982 rv = vgen_handle_dring_reg_info(ldcp, tagp); in vgen_handle_dring_reg()
4989 tagp->vio_sid = ldcp->local_sid; in vgen_handle_dring_reg()
4993 VNET_DRING_REG_EXT_MSG_SIZE(ldcp->tx_data_ncookies); in vgen_handle_dring_reg()
4999 rv = vgen_sendmsg(ldcp, (caddr_t)tagp, msgsize, in vgen_handle_dring_reg()
5006 DWARN(vgenp, ldcp, "DRING_NACK_SENT"); in vgen_handle_dring_reg()
5010 ldcp->hstate |= DRING_ACK_SENT; in vgen_handle_dring_reg()
5011 DBG2(vgenp, ldcp, "DRING_ACK_SENT"); in vgen_handle_dring_reg()
5013 if (vgen_handshake_done(ldcp) == VGEN_SUCCESS) { in vgen_handle_dring_reg()
5014 rv = vgen_handshake(vh_nextphase(ldcp)); in vgen_handle_dring_reg()
5023 rv = vgen_handle_dring_reg_ack(ldcp, tagp); in vgen_handle_dring_reg()
5028 if (vgen_handshake_done(ldcp) == VGEN_SUCCESS) { in vgen_handle_dring_reg()
5029 rv = vgen_handshake(vh_nextphase(ldcp)); in vgen_handle_dring_reg()
5039 DWARN(vgenp, ldcp, "DRING_NACK_RCVD"); in vgen_handle_dring_reg()
5042 DBG1(vgenp, ldcp, "exit\n"); in vgen_handle_dring_reg()
5051 vgen_handle_rdx_info(vgen_ldc_t *ldcp, vio_msg_tag_t *tagp) in vgen_handle_rdx_info() argument
5054 vgen_t *vgenp = LDC_TO_VGEN(ldcp); in vgen_handle_rdx_info()
5056 DBG1(vgenp, ldcp, "enter\n"); in vgen_handle_rdx_info()
5057 if (ldcp->hphase != VH_PHASE4) { in vgen_handle_rdx_info()
5058 DWARN(vgenp, ldcp, in vgen_handle_rdx_info()
5060 tagp->vio_subtype, ldcp->hphase); in vgen_handle_rdx_info()
5066 DBG2(vgenp, ldcp, "RDX_INFO_RCVD \n"); in vgen_handle_rdx_info()
5067 ldcp->hstate |= RDX_INFO_RCVD; in vgen_handle_rdx_info()
5070 tagp->vio_sid = ldcp->local_sid; in vgen_handle_rdx_info()
5072 rv = vgen_sendmsg(ldcp, (caddr_t)tagp, sizeof (vio_rdx_msg_t), in vgen_handle_rdx_info()
5078 ldcp->hstate |= RDX_ACK_SENT; in vgen_handle_rdx_info()
5079 DBG2(vgenp, ldcp, "RDX_ACK_SENT \n"); in vgen_handle_rdx_info()
5081 if (vgen_handshake_done(ldcp) == VGEN_SUCCESS) { in vgen_handle_rdx_info()
5082 rv = vgen_handshake(vh_nextphase(ldcp)); in vgen_handle_rdx_info()
5092 ldcp->hstate |= RDX_ACK_RCVD; in vgen_handle_rdx_info()
5094 DBG2(vgenp, ldcp, "RDX_ACK_RCVD \n"); in vgen_handle_rdx_info()
5096 if (vgen_handshake_done(ldcp) == VGEN_SUCCESS) { in vgen_handle_rdx_info()
5097 rv = vgen_handshake(vh_nextphase(ldcp)); in vgen_handle_rdx_info()
5106 DBG2(vgenp, ldcp, "RDX_NACK_RCVD \n"); in vgen_handle_rdx_info()
5109 DBG1(vgenp, ldcp, "exit\n"); in vgen_handle_rdx_info()
5115 vgen_handle_mcast_info(vgen_ldc_t *ldcp, vio_msg_tag_t *tagp) in vgen_handle_mcast_info() argument
5117 vgen_t *vgenp = LDC_TO_VGEN(ldcp); in vgen_handle_mcast_info()
5123 DBG1(vgenp, ldcp, "enter\n"); in vgen_handle_mcast_info()
5129 DWARN(vgenp, ldcp, "rcvd SET_MCAST_INFO \n"); in vgen_handle_mcast_info()
5135 DBG1(vgenp, ldcp, "rcvd SET_MCAST_ACK \n"); in vgen_handle_mcast_info()
5140 DWARN(vgenp, ldcp, "rcvd SET_MCAST_NACK \n"); in vgen_handle_mcast_info()
5167 DBG1(vgenp, ldcp, "exit\n"); in vgen_handle_mcast_info()
5179 vgen_handle_physlink_info(vgen_ldc_t *ldcp, vio_msg_tag_t *tagp) in vgen_handle_physlink_info() argument
5181 vgen_t *vgenp = LDC_TO_VGEN(ldcp); in vgen_handle_physlink_info()
5186 if (ldcp->portp != vgenp->vsw_portp) { in vgen_handle_physlink_info()
5216 mutex_exit(&ldcp->cblock); in vgen_handle_physlink_info()
5221 mutex_enter(&ldcp->cblock); in vgen_handle_physlink_info()
5225 tagp->vio_sid = ldcp->local_sid; in vgen_handle_physlink_info()
5228 rv = vgen_sendmsg(ldcp, (caddr_t)tagp, in vgen_handle_physlink_info()
5238 DWARN(vgenp, ldcp, "rcvd PHYSLINK_ACK \n"); in vgen_handle_physlink_info()
5244 DWARN(vgenp, ldcp, "rcvd PHYSLINK_NACK \n"); in vgen_handle_physlink_info()
5248 DBG1(vgenp, ldcp, "exit\n"); in vgen_handle_physlink_info()
5255 vgen_handle_ctrlmsg(vgen_ldc_t *ldcp, vio_msg_tag_t *tagp) in vgen_handle_ctrlmsg() argument
5258 vgen_t *vgenp = LDC_TO_VGEN(ldcp); in vgen_handle_ctrlmsg()
5260 DBG1(vgenp, ldcp, "enter\n"); in vgen_handle_ctrlmsg()
5264 rv = vgen_handle_version_negotiate(ldcp, tagp); in vgen_handle_ctrlmsg()
5268 rv = vgen_handle_attr_msg(ldcp, tagp); in vgen_handle_ctrlmsg()
5272 rv = vgen_handle_dring_reg(ldcp, tagp); in vgen_handle_ctrlmsg()
5276 rv = vgen_handle_rdx_info(ldcp, tagp); in vgen_handle_ctrlmsg()
5280 rv = vgen_handle_mcast_info(ldcp, tagp); in vgen_handle_ctrlmsg()
5290 if (ldcp->reset_in_progress == 1) { in vgen_handle_ctrlmsg()
5293 rv = vgen_dds_rx(ldcp, tagp); in vgen_handle_ctrlmsg()
5297 rv = vgen_handle_physlink_info(ldcp, tagp); in vgen_handle_ctrlmsg()
5301 DBG1(vgenp, ldcp, "exit rv(%d)\n", rv); in vgen_handle_ctrlmsg()
5307 vgen_handle_errmsg(vgen_ldc_t *ldcp, vio_msg_tag_t *tagp) in vgen_handle_errmsg() argument
5309 _NOTE(ARGUNUSED(ldcp, tagp)) in vgen_handle_errmsg()
5321 vgen_ldc_t *ldcp = (vgen_ldc_t *)arg1; in vgen_handle_pkt_data() local
5327 vgen_t *vgenp = LDC_TO_VGEN(ldcp); in vgen_handle_pkt_data()
5328 vgen_stats_t *statsp = &ldcp->stats; in vgen_handle_pkt_data()
5329 vgen_hparams_t *lp = &ldcp->local_hparams; in vgen_handle_pkt_data()
5332 ASSERT(MUTEX_HELD(&ldcp->cblock)); in vgen_handle_pkt_data()
5334 mutex_exit(&ldcp->cblock); in vgen_handle_pkt_data()
5339 mutex_enter(&ldcp->cblock); in vgen_handle_pkt_data()
5343 vmp = vio_multipool_allocb(&ldcp->vmp, size); in vgen_handle_pkt_data()
5348 DWARN(vgenp, ldcp, "allocb failure, " in vgen_handle_pkt_data()
5350 mutex_enter(&ldcp->cblock); in vgen_handle_pkt_data()
5374 mutex_enter(&ldcp->rxlock); in vgen_handle_pkt_data()
5376 mutex_enter(&ldcp->pollq_lock); in vgen_handle_pkt_data()
5379 if (ldcp->polling_on == B_TRUE) { in vgen_handle_pkt_data()
5380 if (ldcp->rx_pri_tail != NULL) { in vgen_handle_pkt_data()
5381 ldcp->rx_pri_tail->b_next = mp; in vgen_handle_pkt_data()
5383 ldcp->rx_pri_head = ldcp->rx_pri_tail = mp; in vgen_handle_pkt_data()
5386 vrx_cb = ldcp->portp->vcb.vio_net_rx_cb; in vgen_handle_pkt_data()
5390 mutex_exit(&ldcp->rxlock); in vgen_handle_pkt_data()
5392 mutex_exit(&ldcp->pollq_lock); in vgen_handle_pkt_data()
5396 vrx_cb(ldcp->portp->vhp, mp); in vgen_handle_pkt_data()
5399 mutex_enter(&ldcp->cblock); in vgen_handle_pkt_data()
5413 vgen_handle_datamsg(vgen_ldc_t *ldcp, vio_msg_tag_t *tagp, uint32_t msglen) in vgen_handle_datamsg() argument
5416 vgen_t *vgenp = LDC_TO_VGEN(ldcp); in vgen_handle_datamsg()
5417 vgen_hparams_t *lp = &ldcp->local_hparams; in vgen_handle_datamsg()
5419 DBG1(vgenp, ldcp, "enter\n"); in vgen_handle_datamsg()
5421 if (ldcp->hphase != VH_DONE) { in vgen_handle_datamsg()
5430 rv = vgen_check_datamsg_seq(ldcp, tagp); in vgen_handle_datamsg()
5438 rv = ldcp->rx_dringdata((void *)ldcp, (void *)tagp); in vgen_handle_datamsg()
5442 ldcp->rx_pktdata((void *)ldcp, (void *)tagp, msglen); in vgen_handle_datamsg()
5448 DBG1(vgenp, ldcp, "exit rv(%d)\n", rv); in vgen_handle_datamsg()
5454 vgen_ldc_reset(vgen_ldc_t *ldcp, vgen_caller_t caller) in vgen_ldc_reset() argument
5459 ASSERT(MUTEX_HELD(&ldcp->cblock)); in vgen_ldc_reset()
5463 if (atomic_cas_uint(&ldcp->reset_in_progress, 0, 1) != 0) { in vgen_ldc_reset()
5469 mutex_exit(&ldcp->cblock); in vgen_ldc_reset()
5472 rv = vgen_process_reset(ldcp, VGEN_FLAG_NEED_LDCRESET); in vgen_ldc_reset()
5475 mutex_enter(&ldcp->cblock); in vgen_ldc_reset()
5482 vgen_ldc_up(vgen_ldc_t *ldcp) in vgen_ldc_up() argument
5486 vgen_t *vgenp = LDC_TO_VGEN(ldcp); in vgen_ldc_up()
5488 ASSERT(MUTEX_HELD(&ldcp->cblock)); in vgen_ldc_up()
5494 if (ldcp->ldc_reset_count == vgen_ldc_max_resets) { in vgen_ldc_up()
5497 vgenp->instance, vgen_ldc_max_resets, ldcp->ldc_id); in vgen_ldc_up()
5500 ldcp->ldc_reset_count++; in vgen_ldc_up()
5503 rv = ldc_up(ldcp->ldc_handle); in vgen_ldc_up()
5512 DWARN(vgenp, ldcp, "ldc_up err rv(%d)\n", rv); in vgen_ldc_up()
5522 vgen_ldc_t *ldcp = portp->ldcp; in vgen_enable_intr() local
5523 vgen_hparams_t *lp = &ldcp->local_hparams; in vgen_enable_intr()
5526 mutex_enter(&ldcp->rxlock); in vgen_enable_intr()
5528 ldcp->polling_on = B_FALSE; in vgen_enable_intr()
5534 end_ix = ldcp->next_rxi; in vgen_enable_intr()
5535 DECR_RXI(end_ix, ldcp); in vgen_enable_intr()
5536 msg.dring_ident = ldcp->peer_hparams.dring_ident; in vgen_enable_intr()
5537 (void) vgen_send_dringack_shm(ldcp, (vio_msg_tag_t *)&msg, in vgen_enable_intr()
5540 mutex_exit(&ldcp->rxlock); in vgen_enable_intr()
5542 mutex_enter(&ldcp->pollq_lock); in vgen_enable_intr()
5543 ldcp->polling_on = B_FALSE; in vgen_enable_intr()
5544 mutex_exit(&ldcp->pollq_lock); in vgen_enable_intr()
5554 vgen_ldc_t *ldcp = portp->ldcp; in vgen_disable_intr() local
5555 vgen_hparams_t *lp = &ldcp->local_hparams; in vgen_disable_intr()
5558 mutex_enter(&ldcp->rxlock); in vgen_disable_intr()
5559 ldcp->polling_on = B_TRUE; in vgen_disable_intr()
5560 mutex_exit(&ldcp->rxlock); in vgen_disable_intr()
5562 mutex_enter(&ldcp->pollq_lock); in vgen_disable_intr()
5563 ldcp->polling_on = B_TRUE; in vgen_disable_intr()
5564 mutex_exit(&ldcp->pollq_lock); in vgen_disable_intr()
5574 vgen_ldc_t *ldcp = portp->ldcp; in vgen_rx_poll() local
5575 vgen_hparams_t *lp = &ldcp->local_hparams; in vgen_rx_poll()
5579 mp = vgen_poll_rcv_shm(ldcp, bytes_to_pickup); in vgen_rx_poll()
5581 mp = vgen_poll_rcv(ldcp, bytes_to_pickup); in vgen_rx_poll()
5591 vgen_ldc_t *ldcp; in vgen_tx_watchdog() local
5597 ldcp = (vgen_ldc_t *)arg; in vgen_tx_watchdog()
5598 vgenp = LDC_TO_VGEN(ldcp); in vgen_tx_watchdog()
5600 tx_blocked = ldcp->tx_blocked; in vgen_tx_watchdog()
5601 tx_blocked_lbolt = ldcp->tx_blocked_lbolt; in vgen_tx_watchdog()
5612 DWARN(vgenp, ldcp, "transmit timeout lbolt(%lx), " in vgen_tx_watchdog()
5617 if (vgen_inject_error(ldcp, VGEN_ERR_TXTIMEOUT)) { in vgen_tx_watchdog()
5629 mutex_enter(&ldcp->cblock); in vgen_tx_watchdog()
5630 if (ldcp->wd_tid == 0) { in vgen_tx_watchdog()
5632 mutex_exit(&ldcp->cblock); in vgen_tx_watchdog()
5635 ldcp->wd_tid = 0; in vgen_tx_watchdog()
5636 mutex_exit(&ldcp->cblock); in vgen_tx_watchdog()
5641 rv = vgen_ldc_reset(ldcp, VGEN_OTHER); in vgen_tx_watchdog()
5648 if (ldcp->tx_blocked) { in vgen_tx_watchdog()
5650 ldcp->portp->vcb.vio_net_tx_update; in vgen_tx_watchdog()
5652 ldcp->tx_blocked = B_FALSE; in vgen_tx_watchdog()
5653 vtx_update(ldcp->portp->vhp); in vgen_tx_watchdog()
5669 mutex_enter(&ldcp->cblock); in vgen_tx_watchdog()
5670 if (ldcp->wd_tid == 0) { in vgen_tx_watchdog()
5672 mutex_exit(&ldcp->cblock); in vgen_tx_watchdog()
5675 ldcp->wd_tid = timeout(vgen_tx_watchdog, (caddr_t)ldcp, in vgen_tx_watchdog()
5677 mutex_exit(&ldcp->cblock); in vgen_tx_watchdog()
5684 vgen_ldc_t *ldcp = (vgen_ldc_t *)arg; in vgen_hwatchdog() local
5685 vgen_t *vgenp = LDC_TO_VGEN(ldcp); in vgen_hwatchdog()
5687 DWARN(vgenp, ldcp, "handshake timeout phase(%x) state(%x)\n", in vgen_hwatchdog()
5688 ldcp->hphase, ldcp->hstate); in vgen_hwatchdog()
5690 mutex_enter(&ldcp->cblock); in vgen_hwatchdog()
5691 if (ldcp->htid == 0) { in vgen_hwatchdog()
5693 mutex_exit(&ldcp->cblock); in vgen_hwatchdog()
5696 ldcp->htid = 0; in vgen_hwatchdog()
5697 mutex_exit(&ldcp->cblock); in vgen_hwatchdog()
5703 (void) vgen_ldc_reset(ldcp, VGEN_OTHER); in vgen_hwatchdog()
5708 vgen_check_sid(vgen_ldc_t *ldcp, vio_msg_tag_t *tagp) in vgen_check_sid() argument
5710 vgen_t *vgenp = LDC_TO_VGEN(ldcp); in vgen_check_sid()
5712 if (tagp->vio_sid != ldcp->peer_sid) { in vgen_check_sid()
5713 DWARN(vgenp, ldcp, "sid mismatch: expected(%x), rcvd(%x)\n", in vgen_check_sid()
5714 ldcp->peer_sid, tagp->vio_sid); in vgen_check_sid()
5726 vgen_init_dring_reg_msg(vgen_ldc_t *ldcp, vio_dring_reg_msg_t *msg, in vgen_init_dring_reg_msg() argument
5735 tagp->vio_sid = ldcp->local_sid; in vgen_init_dring_reg_msg()
5738 bcopy(&(ldcp->local_hparams.dring_cookie), &(msg->cookie[0]), in vgen_init_dring_reg_msg()
5740 msg->ncookies = ldcp->local_hparams.dring_ncookies; in vgen_init_dring_reg_msg()
5741 msg->num_descriptors = ldcp->local_hparams.num_desc; in vgen_init_dring_reg_msg()
5742 msg->descriptor_size = ldcp->local_hparams.desc_size; in vgen_init_dring_reg_msg()
5755 vgen_mapin_avail(vgen_ldc_t *ldcp) in vgen_mapin_avail() argument
5761 vgen_t *vgenp = LDC_TO_VGEN(ldcp); in vgen_mapin_avail()
5763 rv = ldc_info(ldcp->ldc_handle, &info); in vgen_mapin_avail()
5785 vgen_ldc_t *ldcp, const char *fmt, ...) in vgen_debug_printf() argument
5796 if (ldcp != NULL) { in vgen_debug_printf()
5797 (void) sprintf(bufp, "ldc(%ld):", ldcp->ldc_id); in vgen_debug_printf()
5807 if ((ldcp == NULL) ||(vgendbg_ldcid == -1) || in vgen_debug_printf()
5808 (vgendbg_ldcid == ldcp->ldc_id)) { in vgen_debug_printf()
5874 vgen_ldc_t *ldcp = portp->ldcp; in vgen_force_link_state() local
5877 mutex_enter(&ldcp->cblock); in vgen_force_link_state()
5882 (void) ldc_down(ldcp->ldc_handle); in vgen_force_link_state()
5883 ldcp->link_down_forced = B_TRUE; in vgen_force_link_state()
5887 vgen_ldc_up(ldcp); in vgen_force_link_state()
5888 ldcp->link_down_forced = B_FALSE; in vgen_force_link_state()
5890 if (ldc_status(ldcp->ldc_handle, &istatus) != 0) { in vgen_force_link_state()
5891 DWARN(vgenp, ldcp, "ldc_status err\n"); in vgen_force_link_state()
5893 ldcp->ldc_status = istatus; in vgen_force_link_state()
5897 if (ldcp->ldc_status == LDC_UP) { in vgen_force_link_state()
5898 vgen_handle_evt_up(ldcp); in vgen_force_link_state()
5904 mutex_exit(&ldcp->cblock); in vgen_force_link_state()