Lines Matching defs:ldcp
59 int vgen_create_tx_dring(vgen_ldc_t *ldcp);
60 void vgen_destroy_tx_dring(vgen_ldc_t *ldcp);
61 int vgen_map_rx_dring(vgen_ldc_t *ldcp, void *pkt);
62 void vgen_unmap_rx_dring(vgen_ldc_t *ldcp);
65 void vgen_stop_msg_thread(vgen_ldc_t *ldcp);
67 mblk_t *vgen_poll_rcv(vgen_ldc_t *ldcp, int bytes_to_pickup);
68 int vgen_check_datamsg_seq(vgen_ldc_t *ldcp, vio_msg_tag_t *tagp);
69 int vgen_sendmsg(vgen_ldc_t *ldcp, caddr_t msg, size_t msglen,
73 static int vgen_init_multipools(vgen_ldc_t *ldcp);
74 static int vgen_handle_dringdata_info(vgen_ldc_t *ldcp, vio_msg_tag_t *tagp);
75 static int vgen_process_dringdata(vgen_ldc_t *ldcp, vio_msg_tag_t *tagp);
76 static int vgen_handle_dringdata_ack(vgen_ldc_t *ldcp, vio_msg_tag_t *tagp);
77 static int vgen_handle_dringdata_nack(vgen_ldc_t *ldcp, vio_msg_tag_t *tagp);
78 static void vgen_rx(vgen_ldc_t *ldcp, mblk_t *bp, mblk_t *bpt);
79 static int vgen_send_dringdata(vgen_ldc_t *ldcp, uint32_t start, int32_t end);
80 static int vgen_send_dringack(vgen_ldc_t *ldcp, vio_msg_tag_t *tagp,
82 static void vgen_reclaim(vgen_ldc_t *ldcp);
83 static void vgen_reclaim_dring(vgen_ldc_t *ldcp);
86 extern int vgen_handle_evt_read(vgen_ldc_t *ldcp, vgen_caller_t caller);
87 extern int vgen_handle_evt_reset(vgen_ldc_t *ldcp, vgen_caller_t caller);
116 vgen_ldc_t *ldcp, const char *fmt, ...);
117 extern boolean_t vgen_inject_error(vgen_ldc_t *ldcp, int error);
126 vgen_create_tx_dring(vgen_ldc_t *ldcp)
140 vgen_t *vgenp = LDC_TO_VGEN(ldcp);
142 ldcp->num_txds = vnet_num_descriptors;
147 tbufp = kmem_zalloc(ldcp->num_txds * tbufsize, KM_NOSLEEP);
151 ldcp->tbufp = tbufp;
152 ldcp->tbufendp = &((ldcp->tbufp)[ldcp->num_txds]);
155 rv = ldc_mem_dring_create(ldcp->num_txds, txdsize,
156 &ldcp->tx_dring_handle);
158 DWARN(vgenp, ldcp, "ldc_mem_dring_create() failed\n");
163 rv = ldc_mem_dring_info(ldcp->tx_dring_handle, &minfo);
165 DWARN(vgenp, ldcp, "ldc_mem_dring_info() failed\n");
168 ldcp->txdp = (vnet_public_desc_t *)(minfo.vaddr);
192 ldcp->tx_data_sz = (data_sz * ldcp->num_txds) + VNET_8K;
193 datap = kmem_zalloc(ldcp->tx_data_sz, KM_SLEEP);
194 ldcp->tx_datap = datap;
206 for (i = 0; i < ldcp->num_txds; i++) {
208 tbufp = &(ldcp->tbufp[i]);
209 rv = ldc_mem_alloc_handle(ldcp->ldc_handle,
250 txdp = &(ldcp->txdp[i]);
262 rv = ldc_mem_dring_bind(ldcp->ldc_handle, ldcp->tx_dring_handle,
264 &ldcp->tx_dring_cookie, &ncookies);
266 DWARN(vgenp, ldcp, "ldc_mem_dring_bind failed "
271 ldcp->tx_dring_ncookies = ncookies;
274 ldcp->next_tbufp = ldcp->tbufp;
275 ldcp->cur_tbufp = ldcp->tbufp;
278 ldcp->next_txseq = VNET_ISS;
279 ldcp->next_txi = 0;
281 ldcp->resched_peer = B_TRUE;
282 ldcp->resched_peer_txi = 0;
287 vgen_destroy_tx_dring(ldcp);
295 vgen_destroy_tx_dring(vgen_ldc_t *ldcp)
299 vgen_private_desc_t *tbufp = ldcp->tbufp;
302 if (ldcp->tx_dring_ncookies != 0) {
303 (void) ldc_mem_dring_unbind(ldcp->tx_dring_handle);
304 ldcp->tx_dring_ncookies = 0;
308 if (ldcp->tbufp != NULL) {
310 for (i = 0; i < ldcp->num_txds; i++) {
312 tbufp = &(ldcp->tbufp[i]);
326 if (ldcp->tx_datap != NULL) {
327 kmem_free(ldcp->tx_datap, ldcp->tx_data_sz);
328 ldcp->tx_datap = NULL;
329 ldcp->tx_data_sz = 0;
333 if (ldcp->tx_dring_handle != 0) {
334 (void) ldc_mem_dring_destroy(ldcp->tx_dring_handle);
335 ldcp->tx_dring_handle = 0;
336 ldcp->txdp = NULL;
340 if (ldcp->tbufp != NULL) {
341 kmem_free(ldcp->tbufp, ldcp->num_txds * tbufsize);
342 ldcp->tbufp = ldcp->tbufendp = NULL;
351 vgen_map_rx_dring(vgen_ldc_t *ldcp, void *pkt)
360 vgen_t *vgenp = LDC_TO_VGEN(ldcp);
376 rv = ldc_mem_dring_map(ldcp->ldc_handle, &dcookie, ncookies, num_desc,
377 desc_size, LDC_DIRECT_MAP, &(ldcp->rx_dring_handle));
385 rv = ldc_mem_dring_info(ldcp->rx_dring_handle, &minfo);
393 ldcp->mrxdp = (vnet_public_desc_t *)(minfo.vaddr);
394 bcopy(&dcookie, &(ldcp->rx_dring_cookie), sizeof (dcookie));
395 ldcp->rx_dring_ncookies = ncookies;
396 ldcp->num_rxds = num_desc;
399 ldcp->next_rxi = 0;
400 ldcp->next_rxseq = VNET_ISS;
401 ldcp->dring_mtype = minfo.mtype;
404 bcopy(&dcookie, &(ldcp->peer_hparams.dring_cookie),
406 ldcp->peer_hparams.num_desc = num_desc;
407 ldcp->peer_hparams.desc_size = desc_size;
408 ldcp->peer_hparams.dring_ncookies = ncookies;
411 ldcp->peer_hparams.dring_ident = (uint64_t)ldcp->txdp;
414 msg->dring_ident = (uint64_t)ldcp->txdp;
417 rv = vgen_init_multipools(ldcp);
424 DWARN(vgenp, ldcp,
427 vgenp->instance, ldcp->ldc_id);
433 if (ldcp->rx_dring_handle != 0) {
434 (void) ldc_mem_dring_unmap(ldcp->rx_dring_handle);
435 ldcp->rx_dring_handle = 0;
444 vgen_unmap_rx_dring(vgen_ldc_t *ldcp)
446 vgen_t *vgenp = LDC_TO_VGEN(ldcp);
450 vio_destroy_multipools(&ldcp->vmp, &vmp);
465 if (ldcp->rx_dring_handle != 0) {
466 (void) ldc_mem_dring_unmap(ldcp->rx_dring_handle);
467 ldcp->rx_dring_handle = 0;
471 bzero(&ldcp->rx_dring_cookie, sizeof (ldcp->rx_dring_cookie));
472 ldcp->mrxdp = NULL;
473 ldcp->next_rxi = 0;
474 ldcp->num_rxds = 0;
475 ldcp->next_rxseq = VNET_ISS;
480 vgen_init_multipools(vgen_ldc_t *ldcp)
483 vgen_t *vgenp = LDC_TO_VGEN(ldcp);
510 ldcp->max_rxpool_size = sz3;
511 status = vio_init_multipools(&ldcp->vmp,
517 ldcp->max_rxpool_size = sz4;
518 status = vio_init_multipools(&ldcp->vmp,
538 ldcp->max_rxpool_size = sz3;
540 status = vio_init_multipools(&ldcp->vmp, VGEN_NUM_VMPOOLS,
555 ldcp->max_rxpool_size = sz4;
557 status = vio_init_multipools(&ldcp->vmp, VGEN_NUM_VMPOOLS + 1,
568 ldcp->max_rxpool_size = sz4;
570 status = vio_init_multipools(&ldcp->vmp, VGEN_NUM_VMPOOLS + 1,
589 vgen_ldc_t *ldcp = (vgen_ldc_t *)arg;
605 vgen_t *vgenp = LDC_TO_VGEN(ldcp);
606 vgen_hparams_t *lp = &ldcp->local_hparams;
608 statsp = &ldcp->stats;
611 DBG1(vgenp, ldcp, "enter\n");
613 if (ldcp->ldc_status != LDC_UP) {
614 DWARN(vgenp, ldcp, "status(%d), dropping packet\n",
615 ldcp->ldc_status);
620 if (ldcp->hphase != VH_DONE) {
621 DWARN(vgenp, ldcp, "hphase(%x), dropping packet\n",
622 ldcp->hphase);
627 DWARN(vgenp, ldcp, "invalid size(%d)\n", size);
637 mutex_enter(&ldcp->txlock);
641 tbufp = ldcp->next_tbufp;
642 ntbufp = NEXTTBUF(ldcp, tbufp);
643 if (ntbufp == ldcp->cur_tbufp) { /* out of tbufs/txds */
645 mutex_enter(&ldcp->tclock);
647 vgen_reclaim_dring(ldcp);
648 ldcp->reclaim_lbolt = ddi_get_lbolt();
650 if (ntbufp == ldcp->cur_tbufp) {
652 ldcp->tx_blocked_lbolt = ddi_get_lbolt();
653 ldcp->tx_blocked = B_TRUE;
654 mutex_exit(&ldcp->tclock);
657 mutex_exit(&ldcp->txlock);
661 mutex_exit(&ldcp->tclock);
664 ldcp->next_tbufp = ntbufp;
665 INCR_TXI(ldcp->next_txi, ldcp);
669 mutex_exit(&ldcp->txlock);
689 mutex_enter(&ldcp->wrlock);
697 mutex_exit(&ldcp->wrlock);
711 if (ldcp->resched_peer) {
713 rtbufp = &ldcp->tbufp[ldcp->resched_peer_txi];
717 rv = vgen_send_dringdata(ldcp,
718 (uint32_t)ldcp->resched_peer_txi, -1);
721 DWARN(vgenp, ldcp,
726 ldcp->resched_peer = B_FALSE;
733 mutex_exit(&ldcp->wrlock);
737 (void) vgen_handle_evt_reset(ldcp, VGEN_OTHER);
740 DBG1(vgenp, ldcp, "exit\n");
745 vgen_poll_rcv(vgen_ldc_t *ldcp, int bytes_to_pickup)
754 mutex_enter(&ldcp->pollq_lock);
756 bp = ldcp->pollq_headp;
783 mp = ldcp->pollq_headp;
786 ldcp->pollq_headp = bp;
789 if (ldcp->pollq_headp == NULL) {
790 ldcp->pollq_tailp = NULL;
804 if (ldcp->rx_pktdata == vgen_handle_pkt_data &&
805 ldcp->rx_pri_head != NULL) {
806 ldcp->rx_pri_tail->b_next = mp;
807 mp = ldcp->rx_pri_head;
808 ldcp->rx_pri_head = ldcp->rx_pri_tail = NULL;
811 mutex_exit(&ldcp->pollq_lock);
822 vgen_ldc_t *ldcp = (vgen_ldc_t *)arg1;
824 vgen_t *vgenp = LDC_TO_VGEN(ldcp);
827 DBG1(vgenp, ldcp, "enter\n");
836 mutex_exit(&ldcp->cblock);
837 mutex_enter(&ldcp->rxlock);
838 rv = vgen_handle_dringdata_info(ldcp, tagp);
839 mutex_exit(&ldcp->rxlock);
840 mutex_enter(&ldcp->cblock);
844 rv = vgen_handle_dringdata_ack(ldcp, tagp);
848 rv = vgen_handle_dringdata_nack(ldcp, tagp);
851 DBG1(vgenp, ldcp, "exit rv(%d)\n", rv);
856 vgen_handle_dringdata_info(vgen_ldc_t *ldcp, vio_msg_tag_t *tagp)
862 vgen_t *vgenp = LDC_TO_VGEN(ldcp);
863 vgen_stats_t *statsp = &ldcp->stats;
869 DBG1(vgenp, ldcp, "enter\n");
881 DBG1(vgenp, ldcp, "INFO: start(%d), end(%d)\n",
885 if (!(CHECK_RXI(start, ldcp)) || ((end != -1) &&
886 !(CHECK_RXI(end, ldcp)))) {
887 DWARN(vgenp, ldcp, "Invalid Rx start(%d) or end(%d)\n",
894 if (dringmsg->dring_ident != ldcp->peer_hparams.dring_ident) {
895 DWARN(vgenp, ldcp, "Invalid dring ident 0x%x\n",
901 if (vgen_inject_error(ldcp, VGEN_ERR_RXLOST)) {
913 if (ldcp->next_rxi != start) {
914 DWARN(vgenp, ldcp, "next_rxi(%d) != start(%d)\n",
915 ldcp->next_rxi, start);
918 if (start >= ldcp->next_rxi) {
919 n = start - ldcp->next_rxi;
921 n = ldcp->num_rxds - (ldcp->next_rxi - start);
926 tagp->vio_sid = ldcp->local_sid;
928 dringmsg->start_idx = ldcp->next_rxi;
930 DECR_RXI(rxi, ldcp);
933 rv = vgen_sendmsg(ldcp, (caddr_t)tagp,
936 DWARN(vgenp, ldcp,
946 ldcp->next_rxi = start;
952 rv = vgen_process_dringdata(ldcp, tagp);
954 DBG1(vgenp, ldcp, "exit rv(%d)\n", rv);
959 vgen_process_dringdata(vgen_ldc_t *ldcp, vio_msg_tag_t *tagp)
984 vgen_t *vgenp = LDC_TO_VGEN(ldcp);
985 vgen_hparams_t *lp = &ldcp->local_hparams;
987 DBG1(vgenp, ldcp, "enter\n");
989 statsp = &ldcp->stats;
1004 DECR_RXI(ack_end, ldcp);
1009 rv = vnet_dring_entry_copy(&(ldcp->mrxdp[rxi]), &rxd,
1010 ldcp->dring_mtype, ldcp->rx_dring_handle, rxi, rxi);
1012 DWARN(vgenp, ldcp, "ldc_mem_dring_acquire() failed"
1027 vgen_rx(ldcp, bp, bpt);
1065 if (nbytes > ldcp->max_rxpool_size) {
1070 vmp = vio_multipool_allocb(&ldcp->vmp, nbytes);
1101 rv = vnet_dring_entry_set_dstate(&(ldcp->mrxdp[rxi]),
1102 ldcp->dring_mtype, ldcp->rx_dring_handle, rxi, rxi,
1105 DWARN(vgenp, ldcp,
1119 rv = vgen_send_dringack(ldcp, tagp,
1133 rv = ldc_mem_copy(ldcp->ldc_handle,
1139 DWARN(vgenp, ldcp, "ldc_mem_copy err rv(%d)\n", rv);
1147 rv = vnet_dring_entry_set_dstate(&(ldcp->mrxdp[rxi]),
1148 ldcp->dring_mtype, ldcp->rx_dring_handle, rxi, rxi,
1151 DWARN(vgenp, ldcp,
1167 rv = vgen_send_dringack(ldcp, tagp,
1179 DWARN(vgenp, ldcp,
1217 vgen_rx(ldcp, bp, bpt);
1227 INCR_RXI(next_rxi, ldcp);
1257 rv = vgen_send_dringack(ldcp, tagp, ack_start, ack_end,
1264 ldcp->next_rxi = next_rxi;
1270 vgen_rx(ldcp, bp, bpt);
1273 DBG1(vgenp, ldcp, "exit rv(%d)\n", rv);
1279 vgen_handle_dringdata_ack(vgen_ldc_t *ldcp, vio_msg_tag_t *tagp)
1290 vgen_t *vgenp = LDC_TO_VGEN(ldcp);
1293 DBG1(vgenp, ldcp, "enter\n");
1296 statsp = &ldcp->stats;
1304 DBG2(vgenp, ldcp, "ACK: start(%d), end(%d)\n", start, end);
1307 if (!(CHECK_TXI(start, ldcp)) || !(CHECK_TXI(end, ldcp))) {
1309 DWARN(vgenp, ldcp, "Invalid Tx ack start(%d) or end(%d)\n",
1314 if (dringmsg->dring_ident != ldcp->local_hparams.dring_ident) {
1316 DWARN(vgenp, ldcp, "Invalid dring ident 0x%x\n",
1323 vgen_reclaim(ldcp);
1336 mutex_enter(&ldcp->wrlock);
1337 mutex_enter(&ldcp->tclock);
1352 INCR_TXI(txi, ldcp);
1353 tbufp = &ldcp->tbufp[txi];
1366 txi = ldcp->cur_tbufp - ldcp->tbufp;
1367 tbufp = &ldcp->tbufp[txi];
1384 rv = vgen_send_dringdata(ldcp, txi, -1);
1386 ldcp->resched_peer = B_TRUE;
1387 ldcp->resched_peer_txi = txi;
1388 mutex_exit(&ldcp->tclock);
1389 mutex_exit(&ldcp->wrlock);
1398 ldcp->resched_peer = B_TRUE;
1399 ldcp->resched_peer_txi = ldcp->cur_tbufp - ldcp->tbufp;
1402 mutex_exit(&ldcp->tclock);
1403 mutex_exit(&ldcp->wrlock);
1404 DBG1(vgenp, ldcp, "exit rv(%d)\n", rv);
1409 vgen_handle_dringdata_nack(vgen_ldc_t *ldcp, vio_msg_tag_t *tagp)
1417 vgen_t *vgenp = LDC_TO_VGEN(ldcp);
1420 DBG1(vgenp, ldcp, "enter\n");
1430 DWARN(vgenp, ldcp, "NACK: start(%d), end(%d)\n", start, end);
1433 if (!(CHECK_TXI(start, ldcp)) || !(CHECK_TXI(end, ldcp))) {
1435 DWARN(vgenp, ldcp, "Invalid Tx nack start(%d) or end(%d)\n",
1440 if (dringmsg->dring_ident != ldcp->local_hparams.dring_ident) {
1442 DWARN(vgenp, ldcp, "Invalid dring ident 0x%x\n",
1446 mutex_enter(&ldcp->txlock);
1447 mutex_enter(&ldcp->tclock);
1449 if (ldcp->next_tbufp == ldcp->cur_tbufp) {
1451 mutex_exit(&ldcp->tclock);
1452 mutex_exit(&ldcp->txlock);
1458 txdp = &(ldcp->txdp[txi]);
1462 INCR_TXI(txi, ldcp);
1464 mutex_exit(&ldcp->tclock);
1465 mutex_exit(&ldcp->txlock);
1466 DBG1(vgenp, ldcp, "exit rv(%d)\n", rv);
1474 vgen_rx(vgen_ldc_t *ldcp, mblk_t *bp, mblk_t *bpt)
1476 vio_net_rx_cb_t vrx_cb = ldcp->portp->vcb.vio_net_rx_cb;
1477 vgen_t *vgenp = LDC_TO_VGEN(ldcp);
1479 if (ldcp->msg_thread != NULL) {
1480 ASSERT(MUTEX_HELD(&ldcp->rxlock));
1482 ASSERT(MUTEX_HELD(&ldcp->cblock));
1485 mutex_enter(&ldcp->pollq_lock);
1487 if (ldcp->polling_on == B_TRUE) {
1492 if (ldcp->pollq_headp == NULL) {
1493 ldcp->pollq_headp = bp;
1494 ldcp->pollq_tailp = bpt;
1496 ldcp->pollq_tailp->b_next = bp;
1497 ldcp->pollq_tailp = bpt;
1500 mutex_exit(&ldcp->pollq_lock);
1508 if (ldcp->pollq_headp != NULL) {
1509 DBG2(vgenp, ldcp, "vgen_rx(%lx), pending pollq_headp\n",
1510 (uintptr_t)ldcp);
1511 ldcp->pollq_tailp->b_next = bp;
1512 bp = ldcp->pollq_headp;
1513 ldcp->pollq_headp = ldcp->pollq_tailp = NULL;
1516 mutex_exit(&ldcp->pollq_lock);
1518 if (ldcp->msg_thread != NULL) {
1519 mutex_exit(&ldcp->rxlock);
1521 mutex_exit(&ldcp->cblock);
1525 vrx_cb(ldcp->portp->vhp, bp);
1527 if (ldcp->msg_thread != NULL) {
1528 mutex_enter(&ldcp->rxlock);
1530 mutex_enter(&ldcp->cblock);
1535 vgen_reclaim(vgen_ldc_t *ldcp)
1537 mutex_enter(&ldcp->tclock);
1538 vgen_reclaim_dring(ldcp);
1539 ldcp->reclaim_lbolt = ddi_get_lbolt();
1540 mutex_exit(&ldcp->tclock);
1548 vgen_reclaim_dring(vgen_ldc_t *ldcp)
1555 tbufp = ldcp->cur_tbufp;
1560 (tbufp != ldcp->next_tbufp)) {
1565 tbufp = NEXTTBUF(ldcp, tbufp);
1571 ldcp->cur_tbufp = tbufp;
1576 if ((ldcp->tx_blocked) && (count > 0)) {
1578 ldcp->portp->vcb.vio_net_tx_update;
1580 ldcp->tx_blocked = B_FALSE;
1581 vtx_update(ldcp->portp->vhp);
1589 vgen_send_dringdata(vgen_ldc_t *ldcp, uint32_t start, int32_t end)
1591 vgen_t *vgenp = LDC_TO_VGEN(ldcp);
1594 vgen_stats_t *statsp = &ldcp->stats;
1598 if (vgen_inject_error(ldcp, VGEN_ERR_TXTIMEOUT)) {
1607 tagp->vio_sid = ldcp->local_sid;
1609 msgp->dring_ident = ldcp->local_hparams.dring_ident;
1613 rv = vgen_sendmsg(ldcp, (caddr_t)tagp, sizeof (dringmsg), B_TRUE);
1615 DWARN(vgenp, ldcp, "vgen_sendmsg failed\n");
1621 DBG2(vgenp, ldcp, "DRING_DATA_SENT \n");
1630 vgen_send_dringack(vgen_ldc_t *ldcp, vio_msg_tag_t *tagp, uint32_t start,
1634 vgen_t *vgenp = LDC_TO_VGEN(ldcp);
1636 vgen_stats_t *statsp = &ldcp->stats;
1641 tagp->vio_sid = ldcp->local_sid;
1646 rv = vgen_sendmsg(ldcp, (caddr_t)tagp, sizeof (*msgp), B_FALSE);
1648 DWARN(vgenp, ldcp, "vgen_sendmsg() failed\n");
1663 vgen_sendmsg(vgen_ldc_t *ldcp, caddr_t msg, size_t msglen,
1669 vgen_t *vgenp = LDC_TO_VGEN(ldcp);
1680 mutex_enter(&ldcp->wrlock);
1686 dmsg->seq_num = ldcp->next_txseq;
1690 rmsg->seq_num = ldcp->next_txseq;
1697 rv = ldc_write(ldcp->ldc_handle, (caddr_t)msg, &len);
1703 ldcp->next_txseq++;
1707 mutex_exit(&ldcp->wrlock);
1711 DWARN(vgenp, ldcp, "ldc_write failed: rv(%d)\n",
1717 DWARN(vgenp, ldcp, "ldc_write failed: rv(%d) msglen (%d)\n",
1726 vgen_check_datamsg_seq(vgen_ldc_t *ldcp, vio_msg_tag_t *tagp)
1731 vgen_t *vgenp = LDC_TO_VGEN(ldcp);
1743 if (seq_num != ldcp->next_rxseq) {
1746 DWARN(vgenp, ldcp,
1748 ldcp->next_rxseq, seq_num);
1753 ldcp->next_rxseq++;
1766 vgen_ldc_t *ldcp = (vgen_ldc_t *)arg;
1767 vgen_t *vgenp = LDC_TO_VGEN(ldcp);
1770 DBG1(vgenp, ldcp, "enter\n");
1771 CALLB_CPR_INIT(&cprinfo, &ldcp->msg_thr_lock, callb_generic_cpr,
1773 mutex_enter(&ldcp->msg_thr_lock);
1774 while (!(ldcp->msg_thr_flags & VGEN_WTHR_STOP)) {
1781 while (!(ldcp->msg_thr_flags &
1783 cv_wait(&ldcp->msg_thr_cv, &ldcp->msg_thr_lock);
1785 CALLB_CPR_SAFE_END(&cprinfo, &ldcp->msg_thr_lock)
1790 if (ldcp->msg_thr_flags & VGEN_WTHR_STOP) {
1791 DBG2(vgenp, ldcp, "stopped\n");
1794 ldcp->msg_thr_flags &= ~VGEN_WTHR_DATARCVD;
1795 ldcp->msg_thr_flags |= VGEN_WTHR_PROCESSING;
1796 mutex_exit(&ldcp->msg_thr_lock);
1797 DBG2(vgenp, ldcp, "calling vgen_handle_evt_read\n");
1798 rv = vgen_handle_evt_read(ldcp, VGEN_MSG_THR);
1799 mutex_enter(&ldcp->msg_thr_lock);
1800 ldcp->msg_thr_flags &= ~VGEN_WTHR_PROCESSING;
1808 ldcp->msg_thr_flags |= VGEN_WTHR_STOP;
1817 ldcp->msg_thr_flags &= ~VGEN_WTHR_STOP;
1818 ldcp->msg_thread = NULL;
1822 DBG1(vgenp, ldcp, "exit\n");
1827 vgen_stop_msg_thread(vgen_ldc_t *ldcp)
1830 vgen_t *vgenp = LDC_TO_VGEN(ldcp);
1832 DBG1(vgenp, ldcp, "enter\n");
1837 mutex_enter(&ldcp->msg_thr_lock);
1838 if (ldcp->msg_thread != NULL) {
1839 tid = ldcp->msg_thread->t_did;
1840 ldcp->msg_thr_flags |= VGEN_WTHR_STOP;
1841 cv_signal(&ldcp->msg_thr_cv);
1843 mutex_exit(&ldcp->msg_thr_lock);
1848 DBG1(vgenp, ldcp, "exit\n");