Lines Matching refs:ldcp

61 void vsw_destroy_rx_dring(vsw_ldc_t *ldcp);
62 dring_info_t *vsw_map_tx_dring(vsw_ldc_t *ldcp, void *pkt);
63 void vsw_unmap_tx_dring(vsw_ldc_t *ldcp);
66 void vsw_stop_rcv_thread(vsw_ldc_t *ldcp);
71 static int vsw_setup_rx_dring(vsw_ldc_t *ldcp, dring_info_t *dp);
72 static void vsw_process_dringdata_info_shm(vsw_ldc_t *ldcp,
74 static void vsw_process_dringdata_ack_shm(vsw_ldc_t *ldcp,
76 static void vsw_ldc_rcv_shm(vsw_ldc_t *ldcp);
77 static int vsw_receive_packet(vsw_ldc_t *ldcp, mblk_t **bp);
78 static int vsw_send_msg_shm(vsw_ldc_t *ldcp, void *msgp, int size,
84 extern dring_info_t *vsw_map_dring_cmn(vsw_ldc_t *ldcp,
97 #define VSW_SWITCH_FRAMES(vswp, ldcp, bp, bpt, count, total_count) \
99 DTRACE_PROBE2(vsw_rx_pkts, vsw_ldc_t *, (ldcp), int, (count)); \
101 (ldcp)->ldc_port, NULL); \
107 vsw_create_rx_dring_info(vsw_ldc_t *ldcp)
113 vsw_t *vswp = ldcp->ldc_vswp;
121 if ((dp = vsw_create_rx_dring(ldcp)) == NULL)
130 mp->tag.vio_sid = ldcp->local_session;
170 vsw_create_rx_dring(vsw_ldc_t *ldcp)
172 vsw_t *vswp = ldcp->ldc_vswp;
178 ldcp->lane_out.dringp = dp;
184 "failed", ldcp->ldc_id);
193 ldcp->ldc_id);
215 if (vsw_setup_rx_dring(ldcp, dp)) {
224 if ((ldc_mem_dring_bind(ldcp->ldc_handle, dp->dring_handle,
228 "%lld", ldcp->ldc_id);
239 vsw_destroy_rx_dring(ldcp);
248 vsw_setup_rx_dring(vsw_ldc_t *ldcp, dring_info_t *dp)
257 vsw_t *vswp = ldcp->ldc_vswp;
291 rv = ldc_mem_alloc_handle(ldcp->ldc_handle, &dp->data_handle);
309 "(rv %d)", name, ldcp->ldc_id, rv);
365 vsw_destroy_rx_dring(vsw_ldc_t *ldcp)
367 vsw_t *vswp = ldcp->ldc_vswp;
368 lane_t *lp = &ldcp->lane_out;
441 vsw_map_tx_dring(vsw_ldc_t *ldcp, void *pkt)
450 dp = vsw_map_dring_cmn(ldcp, dring_pkt);
460 ldcp->dringdata_msgid = 0;
461 ldcp->lane_in.dringp = dp;
505 vsw_unmap_tx_dring(vsw_ldc_t *ldcp)
507 lane_t *lp = &ldcp->lane_in;
549 vsw_ldc_t *ldcp = (vsw_ldc_t *)arg;
550 vsw_t *vswp = ldcp->ldc_vswp;
552 D1(vswp, "%s(%lld):enter\n", __func__, ldcp->ldc_id);
553 CALLB_CPR_INIT(&cprinfo, &ldcp->rcv_thr_lock, callb_generic_cpr,
555 mutex_enter(&ldcp->rcv_thr_lock);
556 while (!(ldcp->rcv_thr_flags & VSW_WTHR_STOP)) {
563 while (!(ldcp->rcv_thr_flags &
565 cv_wait(&ldcp->rcv_thr_cv, &ldcp->rcv_thr_lock);
567 CALLB_CPR_SAFE_END(&cprinfo, &ldcp->rcv_thr_lock)
572 if (ldcp->rcv_thr_flags & VSW_WTHR_STOP) {
574 __func__, ldcp->ldc_id);
577 ldcp->rcv_thr_flags &= ~VSW_WTHR_DATARCVD;
578 mutex_exit(&ldcp->rcv_thr_lock);
580 __func__, ldcp->ldc_id);
581 vsw_ldc_rcv_shm(ldcp);
582 mutex_enter(&ldcp->rcv_thr_lock);
589 ldcp->rcv_thr_flags &= ~VSW_WTHR_STOP;
590 ldcp->rcv_thread = NULL;
592 D1(vswp, "%s(%lld):exit\n", __func__, ldcp->ldc_id);
601 vsw_ldc_rcv_shm(vsw_ldc_t *ldcp)
613 vsw_t *vswp = ldcp->ldc_vswp;
614 lane_t *lp = &ldcp->lane_out;
619 rv = vsw_receive_packet(ldcp, &mp);
632 vsw_ldc_t *, ldcp);
638 VSW_SWITCH_FRAMES(vswp, ldcp, bp, bpt, count,
667 VSW_SWITCH_FRAMES(vswp, ldcp, bp, bpt, count,
677 DTRACE_PROBE2(vsw_rx_total_count, vsw_ldc_t *, ldcp,
680 VSW_SWITCH_FRAMES(vswp, ldcp, bp, bpt, count,
690 msgp->dring_ident = ldcp->lane_in.dringp->ident;
691 msgp->tag.vio_sid = ldcp->local_session;
696 (void) vsw_send_msg_shm(ldcp, (void *)msgp,
699 ldcp->ldc_stats.dring_data_acks_sent++;
700 ldcp->ldc_stats.dring_stopped_acks_sent++;
715 vsw_receive_packet(vsw_ldc_t *ldcp, mblk_t **bp)
726 vgen_stats_t *statsp = &ldcp->ldc_stats;
727 dring_info_t *dp = ldcp->lane_out.dringp;
747 (rxdp->nbytes > ldcp->lane_in.mtu) ||
829 vsw_stop_rcv_thread(vsw_ldc_t *ldcp)
832 vsw_t *vswp = ldcp->ldc_vswp;
834 D1(vswp, "%s(%lld):enter\n", __func__, ldcp->ldc_id);
839 mutex_enter(&ldcp->rcv_thr_lock);
840 if (ldcp->rcv_thread != NULL) {
841 tid = ldcp->rcv_thread->t_did;
842 ldcp->rcv_thr_flags |= VSW_WTHR_STOP;
843 cv_signal(&ldcp->rcv_thr_cv);
845 mutex_exit(&ldcp->rcv_thr_lock);
850 D1(vswp, "%s(%lld):exit\n", __func__, ldcp->ldc_id);
854 vsw_dringsend_shm(vsw_ldc_t *ldcp, mblk_t *mp)
873 vgen_stats_t *statsp = &ldcp->ldc_stats;
874 lane_t *lane_in = &ldcp->lane_in;
875 lane_t *lane_out = &ldcp->lane_out;
877 vsw_t *vswp = ldcp->ldc_vswp;
880 (ldcp->ldc_status != LDC_UP) || (ldcp->ldc_handle == NULL)) {
882 "packet\n", __func__, ldcp->ldc_id, ldcp->ldc_status,
890 " channel %d", __func__, ldcp->ldc_id, ldcp->ldc_id);
905 ldcp->ldc_id, size);
935 __func__, ldcp->ldc_id);
1026 msgp->tag.vio_sid = ldcp->local_session;
1031 rv = vsw_send_msg_shm(ldcp, (void *)msgp, sizeof (*msgp),
1036 __func__, ldcp->ldc_id);
1047 vsw_process_conn_evt(ldcp, VSW_CONN_RESET);
1055 vsw_ldc_t *ldcp = arg;
1056 vsw_t *vswp = ldcp->ldc_vswp;
1061 D2(vswp, "%s(%lld): VIO_SUBTYPE_INFO", __func__, ldcp->ldc_id);
1062 vsw_process_dringdata_info_shm(ldcp, dring_pkt);
1066 D2(vswp, "%s(%lld): VIO_SUBTYPE_ACK", __func__, ldcp->ldc_id);
1067 vsw_process_dringdata_ack_shm(ldcp, dring_pkt);
1072 __func__, ldcp->ldc_id);
1077 vsw_process_conn_evt(ldcp, VSW_CONN_RESTART);
1082 ldcp->ldc_id, dring_pkt->tag.vio_subtype);
1087 vsw_process_dringdata_info_shm(vsw_ldc_t *ldcp, vio_dring_msg_t *msg)
1089 dring_info_t *dp = ldcp->lane_in.dringp;
1090 vsw_t *vswp = ldcp->ldc_vswp;
1091 vgen_stats_t *statsp = &ldcp->ldc_stats;
1096 __func__, ldcp->ldc_id, msg->dring_ident);
1105 ASSERT(MUTEX_HELD(&ldcp->ldc_cblock));
1106 mutex_exit(&ldcp->ldc_cblock);
1107 mutex_enter(&ldcp->rcv_thr_lock);
1108 if (!(ldcp->rcv_thr_flags & VSW_WTHR_DATARCVD)) {
1109 ldcp->rcv_thr_flags |= VSW_WTHR_DATARCVD;
1110 cv_signal(&ldcp->rcv_thr_cv);
1112 mutex_exit(&ldcp->rcv_thr_lock);
1113 mutex_enter(&ldcp->ldc_cblock);
1117 vsw_process_dringdata_ack_shm(vsw_ldc_t *ldcp, vio_dring_msg_t *msg)
1128 vsw_t *vswp = ldcp->ldc_vswp;
1129 vgen_stats_t *statsp = &ldcp->ldc_stats;
1131 dp = ldcp->lane_in.dringp;
1145 __func__, ldcp->ldc_id, start, end);
1150 if (msg->dring_ident != ldcp->lane_out.dringp->ident) {
1153 __func__, ldcp->ldc_id, msg->dring_ident);
1225 msg->tag.vio_sid = ldcp->local_session;
1226 msg->dring_ident = ldcp->lane_out.dringp->ident;
1229 rv = vsw_send_msg_shm(ldcp, (void *)msg,
1239 vsw_process_conn_evt(ldcp, VSW_CONN_RESET);
1247 vsw_send_msg_shm(vsw_ldc_t *ldcp, void *msgp, int size, boolean_t handle_reset)
1252 vsw_t *vswp = ldcp->ldc_vswp;
1256 ldcp->ldc_id, size);
1258 dmsg->seq_num = atomic_inc_32_nv(&ldcp->dringdata_msgid);
1262 rv = ldc_write(ldcp->ldc_handle, (caddr_t)msgp, &msglen);
1268 ldcp->ldc_id, rv, size, msglen);
1269 ldcp->ldc_stats.oerrors++;
1278 DWARN(vswp, "%s (%lld) channel reset", __func__, ldcp->ldc_id);
1281 vsw_process_conn_evt(ldcp, VSW_CONN_RESET);