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