Lines Matching defs:ldcp

61 int vgen_create_rx_dring(vgen_ldc_t *ldcp);
62 void vgen_destroy_rx_dring(vgen_ldc_t *ldcp);
63 int vgen_map_tx_dring(vgen_ldc_t *ldcp, void *pkt);
64 void vgen_unmap_tx_dring(vgen_ldc_t *ldcp);
65 int vgen_map_data(vgen_ldc_t *ldcp, void *pkt);
68 mblk_t *vgen_poll_rcv_shm(vgen_ldc_t *ldcp, int bytes_to_pickup);
69 int vgen_send_dringack_shm(vgen_ldc_t *ldcp, vio_msg_tag_t *tagp,
73 static int vgen_handle_dringdata_info_shm(vgen_ldc_t *ldcp, vio_msg_tag_t *tp);
74 static int vgen_handle_dringdata_ack_shm(vgen_ldc_t *ldcp, vio_msg_tag_t *tagp);
75 static int vgen_handle_dringdata_nack_shm(vgen_ldc_t *ldcp, vio_msg_tag_t *tp);
76 static int vgen_intr_rcv_shm(vgen_ldc_t *ldcp);
77 static int vgen_receive_packet(vgen_ldc_t *ldcp, mblk_t **bp, uint_t *size);
78 static int vgen_send_dringdata_shm(vgen_ldc_t *ldcp, uint32_t start,
80 static int vgen_sendmsg_shm(vgen_ldc_t *ldcp, caddr_t msg, size_t msglen);
83 extern int vgen_handle_evt_read(vgen_ldc_t *ldcp, vgen_caller_t caller);
84 extern int vgen_handle_evt_reset(vgen_ldc_t *ldcp, vgen_caller_t caller);
104 vgen_ldc_t *ldcp, const char *fmt, ...);
105 extern boolean_t vgen_inject_error(vgen_ldc_t *ldcp, int error);
114 vgen_create_rx_dring(vgen_ldc_t *ldcp)
126 vgen_t *vgenp = LDC_TO_VGEN(ldcp);
129 ldcp->num_rxds = vnet_num_descriptors;
130 ldcp->num_rbufs = VGEN_RXDRING_NRBUFS;
133 rv = ldc_mem_dring_create(ldcp->num_rxds, rxdsize,
134 &ldcp->rx_dring_handle);
136 DWARN(vgenp, ldcp, "ldc_mem_dring_create() failed\n");
141 rv = ldc_mem_dring_info(ldcp->rx_dring_handle, &minfo);
143 DWARN(vgenp, ldcp, "ldc_mem_dring_info() failed\n");
146 ldcp->rxdp = (vnet_rx_dringdata_desc_t *)(minfo.vaddr);
147 bzero(ldcp->rxdp, sizeof (*rxdp) * (ldcp->num_rxds));
154 rxdp_to_vmp = kmem_zalloc(ldcp->num_rxds * sizeof (uintptr_t),
156 ldcp->rxdp_to_vmp = rxdp_to_vmp;
178 ldcp->rx_data_sz = data_sz * ldcp->num_rbufs;
179 ldcp->rx_dblk_sz = data_sz;
180 datap = kmem_zalloc(ldcp->rx_data_sz, KM_SLEEP);
181 ldcp->rx_datap = datap;
184 rv = ldc_mem_alloc_handle(ldcp->ldc_handle, &ldcp->rx_data_handle);
186 ldcp->rx_data_handle = 0;
191 ldcp->rx_data_cookie = kmem_zalloc(VNET_DATA_AREA_COOKIES *
198 rv = ldc_mem_bind_handle(ldcp->rx_data_handle, (caddr_t)datap,
199 ldcp->rx_data_sz, LDC_DIRECT_MAP, LDC_MEM_W,
200 ldcp->rx_data_cookie, &ncookies);
207 ldcp->rx_data_ncookies = ncookies;
210 rv = ldc_mem_nextcookie(ldcp->rx_data_handle,
211 &(ldcp->rx_data_cookie[j]));
213 DERR(vgenp, ldcp, "ldc_mem_nextcookie "
228 rv = vio_create_mblks(ldcp->num_rbufs, data_sz, (uint8_t *)datap,
229 &ldcp->rx_vmp);
234 for (i = 0; i < ldcp->num_rxds; i++) {
235 rxdp = &(ldcp->rxdp[i]);
237 vmp = vio_allocb(ldcp->rx_vmp);
248 rv = ldc_mem_dring_bind(ldcp->ldc_handle, ldcp->rx_dring_handle,
250 &ldcp->rx_dring_cookie, &ncookies);
252 DWARN(vgenp, ldcp, "ldc_mem_dring_bind failed "
257 ldcp->rx_dring_ncookies = ncookies;
260 ldcp->next_rxseq = VNET_ISS;
261 ldcp->next_rxi = 0;
266 vgen_destroy_rx_dring(ldcp);
274 vgen_destroy_rx_dring(vgen_ldc_t *ldcp)
276 vgen_t *vgenp = LDC_TO_VGEN(ldcp);
279 if (ldcp->rx_dring_ncookies != 0) {
280 (void) ldc_mem_dring_unbind(ldcp->rx_dring_handle);
281 ldcp->rx_dring_ncookies = 0;
285 if (ldcp->rx_vmp != NULL) {
286 vio_clobber_pool(ldcp->rx_vmp);
287 if (vio_destroy_mblks(ldcp->rx_vmp) != 0) {
297 vgen_destroy_rxpools, ldcp->rx_vmp, DDI_SLEEP);
299 ldcp->rx_vmp = NULL;
303 if (ldcp->rx_data_cookie != NULL) {
304 kmem_free(ldcp->rx_data_cookie, VNET_DATA_AREA_COOKIES *
306 ldcp->rx_data_cookie = NULL;
310 if (ldcp->rx_data_ncookies != 0) {
311 (void) ldc_mem_unbind_handle(ldcp->rx_data_handle);
312 ldcp->rx_data_ncookies = 0;
316 if (ldcp->rx_data_handle != 0) {
317 (void) ldc_mem_free_handle(ldcp->rx_data_handle);
318 ldcp->rx_data_handle = 0;
322 if (ldcp->rx_datap != NULL) {
324 kmem_free(ldcp->rx_datap, ldcp->rx_data_sz);
325 ldcp->rx_datap = NULL;
326 ldcp->rx_data_sz = 0;
330 if (ldcp->rx_dring_handle != 0) {
331 (void) ldc_mem_dring_destroy(ldcp->rx_dring_handle);
332 ldcp->rx_dring_handle = 0;
333 ldcp->rxdp = NULL;
336 if (ldcp->rxdp_to_vmp != NULL) {
337 kmem_free(ldcp->rxdp_to_vmp,
338 ldcp->num_rxds * sizeof (uintptr_t));
339 ldcp->rxdp_to_vmp = NULL;
343 ldcp->next_rxi = 0;
344 ldcp->next_rxseq = VNET_ISS;
352 vgen_map_tx_dring(vgen_ldc_t *ldcp, void *pkt)
381 rv = ldc_mem_dring_map(ldcp->ldc_handle, &dcookie, ncookies, num_desc,
382 desc_size, LDC_DIRECT_MAP, &(ldcp->tx_dring_handle));
390 rv = ldc_mem_dring_info(ldcp->tx_dring_handle, &minfo);
398 ldcp->mtxdp = (vnet_rx_dringdata_desc_t *)(minfo.vaddr);
399 bcopy(&dcookie, &(ldcp->tx_dring_cookie), sizeof (dcookie));
400 ldcp->tx_dring_ncookies = ncookies;
401 ldcp->num_txds = num_desc;
404 ldcp->next_txi = ldcp->cur_txi = ldcp->resched_peer_txi = 0;
405 ldcp->next_txseq = VNET_ISS - 1;
406 ldcp->resched_peer = B_TRUE;
407 ldcp->dring_mtype = minfo.mtype;
408 ldcp->dringdata_msgid = 0;
411 bcopy(&dcookie, &(ldcp->peer_hparams.dring_cookie),
413 ldcp->peer_hparams.num_desc = num_desc;
414 ldcp->peer_hparams.desc_size = desc_size;
415 ldcp->peer_hparams.dring_ncookies = ncookies;
418 ldcp->peer_hparams.dring_ident = (uint64_t)ldcp->mtxdp;
421 msg->dring_ident = (uint64_t)ldcp->mtxdp;
445 txdp = &ldcp->mtxdp[i];
453 if (ldcp->tx_dring_handle != 0) {
454 (void) ldc_mem_dring_unmap(ldcp->tx_dring_handle);
455 ldcp->tx_dring_handle = 0;
464 vgen_unmap_tx_dring(vgen_ldc_t *ldcp)
467 if (ldcp->tx_datap != NULL) {
468 (void) ldc_mem_unmap(ldcp->tx_data_handle);
469 ldcp->tx_datap = NULL;
473 if (ldcp->tx_data_handle != 0) {
474 (void) ldc_mem_free_handle(ldcp->tx_data_handle);
475 ldcp->tx_data_handle = 0;
479 if (ldcp->tx_data_cookie != NULL) {
480 kmem_free(ldcp->tx_data_cookie, ldcp->tx_data_ncookies *
482 ldcp->tx_data_cookie = NULL;
483 ldcp->tx_data_ncookies = 0;
487 if (ldcp->tx_dring_handle != 0) {
488 (void) ldc_mem_dring_unmap(ldcp->tx_dring_handle);
489 ldcp->tx_dring_handle = 0;
493 bzero(&ldcp->tx_dring_cookie, sizeof (ldcp->tx_dring_cookie));
494 ldcp->mtxdp = NULL;
495 ldcp->next_txi = ldcp->cur_txi = ldcp->resched_peer_txi = 0;
496 ldcp->num_txds = 0;
497 ldcp->next_txseq = VNET_ISS - 1;
498 ldcp->resched_peer = B_TRUE;
505 vgen_map_data(vgen_ldc_t *ldcp, void *pkt)
511 vgen_t *vgenp = LDC_TO_VGEN(ldcp);
524 ldcp->tx_data_ncookies = emsg->data_ncookies;
527 ldcp->tx_data_sz = emsg->data_area_size;
530 rv = ldc_mem_alloc_handle(ldcp->ldc_handle, &ldcp->tx_data_handle);
532 DWARN(vgenp, ldcp, "ldc_mem_alloc_handle() failed: %d\n", rv);
537 rv = ldc_mem_map(ldcp->tx_data_handle, emsg->data_cookie,
539 (caddr_t *)&ldcp->tx_datap, NULL);
541 DWARN(vgenp, ldcp, "ldc_mem_map() failed: %d\n", rv);
546 rv = ldc_mem_info(ldcp->tx_data_handle, &minfo);
548 DWARN(vgenp, ldcp, "ldc_mem_info() failed: %d\n", rv);
553 DWARN(vgenp, ldcp, "mtype(%d) is not direct map\n",
559 ldcp->tx_data_cookie = kmem_zalloc(emsg->data_ncookies *
563 bcopy(emsg->data_cookie, ldcp->tx_data_cookie,
591 vgen_ldc_t *ldcp = (vgen_ldc_t *)arg;
592 vgen_t *vgenp = LDC_TO_VGEN(ldcp);
593 vgen_stats_t *statsp = &ldcp->stats;
594 vgen_hparams_t *lp = &ldcp->local_hparams;
599 if (ldcp->ldc_status != LDC_UP) {
600 DBG2(vgenp, ldcp, "status(%d), dropping packet\n",
601 ldcp->ldc_status);
605 if (ldcp->hphase != VH_DONE) {
606 DWARN(vgenp, ldcp, "hphase(%x), dropping packet\n",
607 ldcp->hphase);
613 DWARN(vgenp, ldcp, "invalid size(%d)\n", size);
640 DERR(vgenp, ldcp, "data access fault occured\n");
642 if (mutex_owned(&ldcp->txlock)) {
643 mutex_exit(&ldcp->txlock);
645 if (mutex_owned(&ldcp->wrlock)) {
646 mutex_exit(&ldcp->wrlock);
654 mutex_enter(&ldcp->txlock);
655 txi = next_txi = ldcp->next_txi;
656 INCR_TXI(next_txi, ldcp);
657 txdp = &(ldcp->mtxdp[txi]);
659 if (ldcp->tx_blocked == B_FALSE) {
660 ldcp->tx_blocked_lbolt = ddi_get_lbolt();
661 ldcp->tx_blocked = B_TRUE;
664 mutex_exit(&ldcp->txlock);
671 if (ldcp->tx_blocked == B_TRUE) {
672 ldcp->tx_blocked = B_FALSE;
677 ldcp->next_txi = next_txi;
678 mutex_exit(&ldcp->txlock);
682 ldcp->portp->vcb.vio_net_tx_update;
684 vtx_update(ldcp->portp->vhp);
694 dst = (caddr_t)ldcp->tx_datap + buf_offset;
712 mutex_enter(&ldcp->wrlock);
720 if (ldcp->resched_peer == B_TRUE && ldcp->resched_peer_txi == txi) {
722 ldcp->resched_peer = B_FALSE;
733 mutex_exit(&ldcp->wrlock);
744 rv = vgen_send_dringdata_shm(ldcp, (uint32_t)txi, -1);
747 DWARN(vgenp, ldcp, "failed sending dringdata msg "
749 mutex_enter(&ldcp->wrlock);
751 ldcp->resched_peer = B_TRUE;
752 mutex_exit(&ldcp->wrlock);
758 (void) vgen_handle_evt_reset(ldcp, VGEN_OTHER);
770 vgen_ldc_t *ldcp = (vgen_ldc_t *)arg1;
772 vgen_t *vgenp = LDC_TO_VGEN(ldcp);
783 mutex_exit(&ldcp->cblock);
784 mutex_enter(&ldcp->rxlock);
785 rv = vgen_handle_dringdata_info_shm(ldcp, tagp);
786 mutex_exit(&ldcp->rxlock);
787 mutex_enter(&ldcp->cblock);
789 DWARN(vgenp, ldcp, "handle_data_info failed(%d)\n", rv);
794 rv = vgen_handle_dringdata_ack_shm(ldcp, tagp);
796 DWARN(vgenp, ldcp, "handle_data_ack failed(%d)\n", rv);
801 rv = vgen_handle_dringdata_nack_shm(ldcp, tagp);
803 DWARN(vgenp, ldcp, "handle_data_nack failed(%d)\n", rv);
812 vgen_handle_dringdata_info_shm(vgen_ldc_t *ldcp, vio_msg_tag_t *tagp)
818 vgen_t *vgenp = LDC_TO_VGEN(ldcp);
819 vgen_stats_t *statsp = &ldcp->stats;
824 DBG1(vgenp, ldcp, "INFO: start(%d), end(%d)\n",
827 if (!(CHECK_RXI(start, ldcp)) ||
828 ((end != -1) && !(CHECK_RXI(end, ldcp)))) {
829 DWARN(vgenp, ldcp, "Invalid Rx start(%d) or end(%d)\n",
836 if (dringmsg->dring_ident != ldcp->peer_hparams.dring_ident) {
837 DWARN(vgenp, ldcp, "Invalid dring ident 0x%x\n",
849 if (ldcp->polling_on == B_TRUE) {
856 rv = vgen_intr_rcv_shm(ldcp);
858 DWARN(vgenp, ldcp, "vgen_intr_rcv_shm() failed\n");
868 vgen_intr_rcv_shm(vgen_ldc_t *ldcp)
879 vio_net_rx_cb_t vrx_cb = ldcp->portp->vcb.vio_net_rx_cb;
881 ASSERT(MUTEX_HELD(&ldcp->rxlock));
884 rv = vgen_receive_packet(ldcp, &mp, &mblk_sz);
890 DTRACE_PROBE1(vgen_intr_nopkts, vgen_ldc_t *, ldcp);
916 DTRACE_PROBE2(vgen_intr_pkts, vgen_ldc_t *, ldcp,
918 mutex_exit(&ldcp->rxlock);
919 vrx_cb(ldcp->portp->vhp, bp);
920 mutex_enter(&ldcp->rxlock);
929 } while (total_count < ldcp->num_rxds);
932 DTRACE_PROBE2(vgen_intr_pkts, vgen_ldc_t *, ldcp, int, count);
933 mutex_exit(&ldcp->rxlock);
934 vrx_cb(ldcp->portp->vhp, bp);
935 mutex_enter(&ldcp->rxlock);
938 if (ldcp->polling_on == B_FALSE) {
944 end_ix = ldcp->next_rxi;
945 DECR_RXI(end_ix, ldcp);
946 msg.dring_ident = ldcp->peer_hparams.dring_ident;
947 rv = vgen_send_dringack_shm(ldcp, (vio_msg_tag_t *)&msg,
961 vgen_poll_rcv_shm(vgen_ldc_t *ldcp, int bytes_to_pickup)
971 mutex_enter(&ldcp->rxlock);
973 if (ldcp->hphase != VH_DONE) {
975 mutex_exit(&ldcp->rxlock);
980 rv = vgen_receive_packet(ldcp, &mp, &mblk_sz);
986 DTRACE_PROBE1(vgen_poll_nopkts, vgen_ldc_t *, ldcp);
1021 if (ldcp->rx_pktdata == vgen_handle_pkt_data &&
1022 ldcp->rx_pri_head != NULL) {
1023 ldcp->rx_pri_tail->b_next = bp;
1024 bp = ldcp->rx_pri_head;
1025 ldcp->rx_pri_head = ldcp->rx_pri_tail = NULL;
1028 mutex_exit(&ldcp->rxlock);
1030 DTRACE_PROBE2(vgen_poll_pkts, vgen_ldc_t *, ldcp, int, count);
1031 DTRACE_PROBE2(vgen_poll_bytes, vgen_ldc_t *, ldcp, uint_t, sz);
1049 vgen_receive_packet(vgen_ldc_t *ldcp, mblk_t **bp, uint_t *size)
1060 vgen_stats_t *statsp = &ldcp->stats;
1061 vgen_hparams_t *lp = &ldcp->local_hparams;
1063 rxi = ldcp->next_rxi;
1064 rxdp = &(ldcp->rxdp[rxi]);
1065 vmp = ldcp->rxdp_to_vmp[rxi];
1071 DTRACE_PROBE1(vgen_noready_rxds, vgen_ldc_t *, ldcp);
1100 new_vmp = vio_allocb(ldcp->rx_vmp);
1132 ldcp->rxdp_to_vmp[rxi] = new_vmp;
1157 INCR_RXI(rxi, ldcp);
1160 ldcp->next_rxi = rxi;
1169 vgen_handle_dringdata_ack_shm(vgen_ldc_t *ldcp, vio_msg_tag_t *tagp)
1179 vgen_t *vgenp = LDC_TO_VGEN(ldcp);
1184 statsp = &ldcp->stats;
1191 DBG2(vgenp, ldcp, "ACK: start(%d), end(%d)\n", start, end);
1198 if (((start != VNET_START_IDX_UNSPEC) && !(CHECK_TXI(start, ldcp))) ||
1199 !(CHECK_TXI(end, ldcp))) {
1201 DWARN(vgenp, ldcp, "Invalid Tx ack start(%d) or end(%d)\n",
1207 if (dringmsg->dring_ident != ldcp->local_hparams.dring_ident) {
1209 DWARN(vgenp, ldcp, "Invalid dring ident 0x%x\n",
1219 mutex_enter(&ldcp->txlock);
1220 if (ldcp->tx_blocked == B_TRUE) {
1222 ldcp->portp->vcb.vio_net_tx_update;
1224 ldcp->tx_blocked = B_FALSE;
1225 vtx_update(ldcp->portp->vhp);
1227 mutex_exit(&ldcp->txlock);
1252 if (mutex_owned(&ldcp->wrlock)) {
1253 mutex_exit(&ldcp->wrlock);
1263 mutex_enter(&ldcp->wrlock);
1267 INCR_TXI(txi, ldcp);
1268 txdp = &ldcp->mtxdp[txi];
1283 ldcp->resched_peer = B_TRUE;
1284 ldcp->resched_peer_txi = txi;
1285 mutex_exit(&ldcp->wrlock);
1293 ldcp->resched_peer = B_FALSE;
1294 mutex_exit(&ldcp->wrlock);
1295 rv = vgen_send_dringdata_shm(ldcp, txi, -1);
1297 mutex_enter(&ldcp->wrlock);
1298 ldcp->resched_peer = B_TRUE;
1299 mutex_exit(&ldcp->wrlock);
1306 vgen_handle_dringdata_nack_shm(vgen_ldc_t *ldcp, vio_msg_tag_t *tagp)
1314 vgen_t *vgenp = LDC_TO_VGEN(ldcp);
1317 DBG1(vgenp, ldcp, "enter\n");
1325 DWARN(vgenp, ldcp, "NACK: start(%d), end(%d)\n", start, end);
1332 if (((start != VNET_START_IDX_UNSPEC) && !(CHECK_TXI(start, ldcp))) ||
1333 !(CHECK_TXI(end, ldcp))) {
1335 DWARN(vgenp, ldcp, "Invalid Tx nack start(%d) or end(%d)\n",
1341 if (dringmsg->dring_ident != ldcp->local_hparams.dring_ident) {
1343 DWARN(vgenp, ldcp, "Invalid dring ident 0x%x\n",
1358 mutex_exit(&ldcp->txlock);
1363 mutex_enter(&ldcp->txlock);
1365 txdp = &(ldcp->mtxdp[txi]);
1368 INCR_TXI(txi, ldcp);
1376 mutex_exit(&ldcp->txlock);
1385 vgen_send_dringdata_shm(vgen_ldc_t *ldcp, uint32_t start, int32_t end)
1387 vgen_t *vgenp = LDC_TO_VGEN(ldcp);
1390 vgen_stats_t *statsp = &ldcp->stats;
1394 if (vgen_inject_error(ldcp, VGEN_ERR_TXTIMEOUT)) {
1403 tagp->vio_sid = ldcp->local_sid;
1405 msgp->dring_ident = ldcp->local_hparams.dring_ident;
1408 msgp->seq_num = atomic_inc_32_nv(&ldcp->dringdata_msgid);
1410 rv = vgen_sendmsg_shm(ldcp, (caddr_t)tagp, sizeof (dringmsg));
1412 DWARN(vgenp, ldcp, "vgen_sendmsg_shm() failed\n");
1418 DBG2(vgenp, ldcp, "DRING_DATA_SENT \n");
1427 vgen_send_dringack_shm(vgen_ldc_t *ldcp, vio_msg_tag_t *tagp, uint32_t start,
1431 vgen_t *vgenp = LDC_TO_VGEN(ldcp);
1433 vgen_stats_t *statsp = &ldcp->stats;
1438 tagp->vio_sid = ldcp->local_sid;
1442 msgp->seq_num = atomic_inc_32_nv(&ldcp->dringdata_msgid);
1444 rv = vgen_sendmsg_shm(ldcp, (caddr_t)tagp, sizeof (*msgp));
1446 DWARN(vgenp, ldcp, "vgen_sendmsg_shm() failed\n");
1461 vgen_sendmsg_shm(vgen_ldc_t *ldcp, caddr_t msg, size_t msglen)
1466 vgen_t *vgenp = LDC_TO_VGEN(ldcp);
1474 rv = ldc_write(ldcp->ldc_handle, (caddr_t)msg, &len);
1480 DWARN(vgenp, ldcp, "ldc_write failed: rv(%d) msglen(%d)\n",
1486 DWARN(vgenp, ldcp, "ldc_write failed: rv(%d) msglen (%d)\n",