Lines Matching refs:xnfp
408 xnf_gref_get(xnf_t *xnfp) in xnf_gref_get() argument
412 mutex_enter(&xnfp->xnf_gref_lock); in xnf_gref_get()
415 gref = gnttab_claim_grant_reference(&xnfp->xnf_gref_head); in xnf_gref_get()
418 (gnttab_alloc_grant_references(16, &xnfp->xnf_gref_head) == 0)); in xnf_gref_get()
420 mutex_exit(&xnfp->xnf_gref_lock); in xnf_gref_get()
423 xnfp->xnf_stat_gref_failure++; in xnf_gref_get()
425 atomic_inc_64(&xnfp->xnf_stat_gref_outstanding); in xnf_gref_get()
426 if (xnfp->xnf_stat_gref_outstanding > xnfp->xnf_stat_gref_peak) in xnf_gref_get()
427 xnfp->xnf_stat_gref_peak = in xnf_gref_get()
428 xnfp->xnf_stat_gref_outstanding; in xnf_gref_get()
438 xnf_gref_put(xnf_t *xnfp, grant_ref_t gref) in xnf_gref_put() argument
442 mutex_enter(&xnfp->xnf_gref_lock); in xnf_gref_put()
443 gnttab_release_grant_reference(&xnfp->xnf_gref_head, gref); in xnf_gref_put()
444 mutex_exit(&xnfp->xnf_gref_lock); in xnf_gref_put()
446 atomic_dec_64(&xnfp->xnf_stat_gref_outstanding); in xnf_gref_put()
453 xnf_txid_get(xnf_t *xnfp) in xnf_txid_get() argument
457 ASSERT(MUTEX_HELD(&xnfp->xnf_txlock)); in xnf_txid_get()
459 if (xnfp->xnf_tx_pkt_id_head == INVALID_TX_ID) in xnf_txid_get()
462 ASSERT(TX_ID_VALID(xnfp->xnf_tx_pkt_id_head)); in xnf_txid_get()
464 tidp = TX_ID_TO_TXID(xnfp, xnfp->xnf_tx_pkt_id_head); in xnf_txid_get()
465 xnfp->xnf_tx_pkt_id_head = tidp->next; in xnf_txid_get()
477 xnf_txid_put(xnf_t *xnfp, xnf_txid_t *tidp) in xnf_txid_put() argument
479 ASSERT(MUTEX_HELD(&xnfp->xnf_txlock)); in xnf_txid_put()
484 tidp->next = xnfp->xnf_tx_pkt_id_head; in xnf_txid_put()
485 xnfp->xnf_tx_pkt_id_head = tidp->id; in xnf_txid_put()
489 xnf_data_txbuf_free(xnf_t *xnfp, xnf_txbuf_t *txp) in xnf_data_txbuf_free() argument
499 xnf_buf_put(xnfp, txp->tx_bdesc, B_TRUE); in xnf_data_txbuf_free()
509 xnf_gref_put(xnfp, txp->tx_txreq.gref); in xnf_data_txbuf_free()
528 ASSERT(!xnfp->xnf_connected); in xnf_data_txbuf_free()
529 xnf_txid_put(xnfp, TX_ID_TO_TXID(xnfp, txp->tx_txreq.id)); in xnf_data_txbuf_free()
533 kmem_cache_free(xnfp->xnf_tx_buf_cache, txp); in xnf_data_txbuf_free()
537 xnf_data_txbuf_free_chain(xnf_t *xnfp, xnf_txbuf_t *txp) in xnf_data_txbuf_free_chain() argument
553 xnf_data_txbuf_free(xnfp, txp); in xnf_data_txbuf_free_chain()
558 xnf_data_txbuf_alloc(xnf_t *xnfp, int flag) in xnf_data_txbuf_alloc() argument
562 if ((txp = kmem_cache_alloc(xnfp->xnf_tx_buf_cache, flag)) == NULL) { in xnf_data_txbuf_alloc()
588 xnf_tx_slots_get(xnf_t *xnfp, int wanted, boolean_t wait) in xnf_tx_slots_get() argument
593 ASSERT(MUTEX_HELD(&xnfp->xnf_txlock)); in xnf_tx_slots_get()
597 slotsfree = RING_FREE_REQUESTS(&xnfp->xnf_tx_ring); in xnf_tx_slots_get()
600 slotsfree = xnf_tx_clean_ring(xnfp); in xnf_tx_slots_get()
608 cv_broadcast(&xnfp->xnf_cv_tx_slots); in xnf_tx_slots_get()
616 cv_wait(&xnfp->xnf_cv_tx_slots, &xnfp->xnf_txlock); in xnf_tx_slots_get()
619 ASSERT(slotsfree <= RING_SIZE(&(xnfp->xnf_tx_ring))); in xnf_tx_slots_get()
625 xnf_setup_rings(xnf_t *xnfp) in xnf_setup_rings() argument
634 oeid = xvdi_get_oeid(xnfp->xnf_devinfo); in xnf_setup_rings()
635 xsd = xvdi_get_xsd(xnfp->xnf_devinfo); in xnf_setup_rings()
637 if (xnfp->xnf_tx_ring_ref != INVALID_GRANT_REF) in xnf_setup_rings()
638 gnttab_end_foreign_access(xnfp->xnf_tx_ring_ref, 0, 0); in xnf_setup_rings()
641 xnf_btop(pa_to_ma(xnfp->xnf_tx_ring_phys_addr)), 0); in xnf_setup_rings()
647 xnfp->xnf_tx_ring_ref = (grant_ref_t)err; in xnf_setup_rings()
649 if (xnfp->xnf_rx_ring_ref != INVALID_GRANT_REF) in xnf_setup_rings()
650 gnttab_end_foreign_access(xnfp->xnf_rx_ring_ref, 0, 0); in xnf_setup_rings()
653 xnf_btop(pa_to_ma(xnfp->xnf_rx_ring_phys_addr)), 0); in xnf_setup_rings()
659 xnfp->xnf_rx_ring_ref = (grant_ref_t)err; in xnf_setup_rings()
661 mutex_enter(&xnfp->xnf_txlock); in xnf_setup_rings()
667 xnfp->xnf_tx_pkt_id_head = INVALID_TX_ID; /* I.e. emtpy list. */ in xnf_setup_rings()
668 for (i = 0, tidp = &xnfp->xnf_tx_pkt_id[0]; in xnf_setup_rings()
681 xnf_data_txbuf_free_chain(xnfp, txp); in xnf_setup_rings()
688 cv_broadcast(&xnfp->xnf_cv_multicast); in xnf_setup_rings()
707 xnfp->xnf_tx_pkt_id_head = INVALID_TX_ID; /* I.e. emtpy list. */ in xnf_setup_rings()
708 for (i = 0, tidp = &xnfp->xnf_tx_pkt_id[0]; in xnf_setup_rings()
714 xnf_txid_put(xnfp, tidp); in xnf_setup_rings()
718 SHARED_RING_INIT(xnfp->xnf_tx_ring.sring); in xnf_setup_rings()
720 FRONT_RING_INIT(&xnfp->xnf_tx_ring, in xnf_setup_rings()
721 xnfp->xnf_tx_ring.sring, PAGESIZE); in xnf_setup_rings()
723 mutex_exit(&xnfp->xnf_txlock); in xnf_setup_rings()
725 mutex_enter(&xnfp->xnf_rxlock); in xnf_setup_rings()
731 for (i = 0, bdescp = &xnfp->xnf_rx_pkt_info[0]; in xnf_setup_rings()
735 xnf_buf_put(xnfp, *bdescp, B_FALSE); in xnf_setup_rings()
741 SHARED_RING_INIT(xnfp->xnf_rx_ring.sring); in xnf_setup_rings()
743 FRONT_RING_INIT(&xnfp->xnf_rx_ring, in xnf_setup_rings()
744 xnfp->xnf_rx_ring.sring, PAGESIZE); in xnf_setup_rings()
752 bdesc = xnf_buf_get(xnfp, KM_SLEEP, B_FALSE); in xnf_setup_rings()
754 xnf_rxbuf_hang(xnfp, bdesc); in xnf_setup_rings()
758 RING_PUSH_REQUESTS(&xnfp->xnf_rx_ring); in xnf_setup_rings()
760 mutex_exit(&xnfp->xnf_rxlock); in xnf_setup_rings()
765 if (xnfp->xnf_tx_ring_ref != INVALID_GRANT_REF) in xnf_setup_rings()
766 gnttab_end_foreign_access(xnfp->xnf_tx_ring_ref, 0, 0); in xnf_setup_rings()
767 xnfp->xnf_tx_ring_ref = INVALID_GRANT_REF; in xnf_setup_rings()
769 if (xnfp->xnf_rx_ring_ref != INVALID_GRANT_REF) in xnf_setup_rings()
770 gnttab_end_foreign_access(xnfp->xnf_rx_ring_ref, 0, 0); in xnf_setup_rings()
771 xnfp->xnf_rx_ring_ref = INVALID_GRANT_REF; in xnf_setup_rings()
781 xnf_be_connect(xnf_t *xnfp) in xnf_be_connect() argument
789 ASSERT(!xnfp->xnf_connected); in xnf_be_connect()
791 xsd = xvdi_get_xsd(xnfp->xnf_devinfo); in xnf_be_connect()
792 xsname = xvdi_get_xsname(xnfp->xnf_devinfo); in xnf_be_connect()
794 err = xnf_setup_rings(xnfp); in xnf_be_connect()
809 xnfp->xnf_tx_ring_ref); in xnf_be_connect()
816 xnfp->xnf_rx_ring_ref); in xnf_be_connect()
823 xnfp->xnf_evtchn); in xnf_be_connect()
841 if (xnfp->xnf_be_mcast_control) { in xnf_be_connect()
871 err = xvdi_switch_state(xnfp->xnf_devinfo, xbt, XenbusStateConnected); in xnf_be_connect()
895 xnf_read_config(xnf_t *xnfp) in xnf_read_config() argument
899 char *oename = xvdi_get_oename(xnfp->xnf_devinfo); in xnf_read_config()
909 ddi_driver_name(xnfp->xnf_devinfo), in xnf_read_config()
910 ddi_get_instance(xnfp->xnf_devinfo)); in xnf_read_config()
913 if (ether_aton(mac, xnfp->xnf_mac_addr) != ETHERADDRL) { in xnf_read_config()
915 xenbus_dev_error(xvdi_get_xsd(xnfp->xnf_devinfo), ENOENT, in xnf_read_config()
916 "parsing %s/mac", xvdi_get_xsname(xnfp->xnf_devinfo)); in xnf_read_config()
929 xnfp->xnf_be_rx_copy = (be_cap != 0); in xnf_read_config()
940 xnfp->xnf_be_mcast_control = (be_cap != 0) && xnf_multicast_control; in xnf_read_config()
949 dev_err(xnfp->xnf_devinfo, CE_WARN, "error reading " in xnf_read_config()
953 dev_err(xnfp->xnf_devinfo, CE_WARN, "scatter-gather is not " in xnf_read_config()
957 xnfp->xnf_be_tx_sg = (be_cap != 0) && xnf_enable_tx_sg; in xnf_read_config()
959 if (xnfp->xnf_be_tx_sg) { in xnf_read_config()
968 dev_err(xnfp->xnf_devinfo, CE_WARN, "error reading " in xnf_read_config()
972 dev_err(xnfp->xnf_devinfo, CE_WARN, "LSO is not " in xnf_read_config()
976 xnfp->xnf_be_lso = (be_cap != 0) && xnf_enable_lso; in xnf_read_config()
987 xnf_t *xnfp; in xnf_attach() local
993 xnfp = ddi_get_driver_private(devinfo); in xnf_attach()
994 xnfp->xnf_gen++; in xnf_attach()
998 xnfp->xnf_evtchn = xvdi_get_evtchn(devinfo); in xnf_attach()
1000 ec_bind_evtchn_to_handler(xnfp->xnf_evtchn, IPL_VIF, xnf_intr, in xnf_attach()
1001 xnfp); in xnf_attach()
1004 (caddr_t)xnfp); in xnf_attach()
1021 xnfp = kmem_zalloc(sizeof (*xnfp), KM_SLEEP); in xnf_attach()
1023 xnfp->xnf_tx_pkt_id = in xnf_attach()
1026 xnfp->xnf_rx_pkt_info = in xnf_attach()
1030 macp->m_driver = xnfp; in xnf_attach()
1031 xnfp->xnf_devinfo = devinfo; in xnf_attach()
1034 macp->m_src_addr = xnfp->xnf_mac_addr; in xnf_attach()
1037 xnfp->xnf_mtu = ETHERMTU; in xnf_attach()
1038 macp->m_max_sdu = xnfp->xnf_mtu; in xnf_attach()
1040 xnfp->xnf_running = B_FALSE; in xnf_attach()
1041 xnfp->xnf_connected = B_FALSE; in xnf_attach()
1042 xnfp->xnf_be_rx_copy = B_FALSE; in xnf_attach()
1043 xnfp->xnf_be_mcast_control = B_FALSE; in xnf_attach()
1044 xnfp->xnf_need_sched = B_FALSE; in xnf_attach()
1046 xnfp->xnf_rx_head = NULL; in xnf_attach()
1047 xnfp->xnf_rx_tail = NULL; in xnf_attach()
1048 xnfp->xnf_rx_new_buffers_posted = B_FALSE; in xnf_attach()
1059 if (ddi_get_iblock_cookie(devinfo, 0, &xnfp->xnf_icookie) in xnf_attach()
1063 mutex_init(&xnfp->xnf_txlock, in xnf_attach()
1064 NULL, MUTEX_DRIVER, xnfp->xnf_icookie); in xnf_attach()
1065 mutex_init(&xnfp->xnf_rxlock, in xnf_attach()
1066 NULL, MUTEX_DRIVER, xnfp->xnf_icookie); in xnf_attach()
1067 mutex_init(&xnfp->xnf_schedlock, in xnf_attach()
1068 NULL, MUTEX_DRIVER, xnfp->xnf_icookie); in xnf_attach()
1069 mutex_init(&xnfp->xnf_gref_lock, in xnf_attach()
1070 NULL, MUTEX_DRIVER, xnfp->xnf_icookie); in xnf_attach()
1072 cv_init(&xnfp->xnf_cv_state, NULL, CV_DEFAULT, NULL); in xnf_attach()
1073 cv_init(&xnfp->xnf_cv_multicast, NULL, CV_DEFAULT, NULL); in xnf_attach()
1074 cv_init(&xnfp->xnf_cv_tx_slots, NULL, CV_DEFAULT, NULL); in xnf_attach()
1078 xnfp->xnf_buf_cache = kmem_cache_create(cachename, in xnf_attach()
1081 NULL, xnfp, NULL, 0); in xnf_attach()
1082 if (xnfp->xnf_buf_cache == NULL) in xnf_attach()
1087 xnfp->xnf_tx_buf_cache = kmem_cache_create(cachename, in xnf_attach()
1090 NULL, xnfp, NULL, 0); in xnf_attach()
1091 if (xnfp->xnf_tx_buf_cache == NULL) in xnf_attach()
1094 xnfp->xnf_gref_head = INVALID_GRANT_REF; in xnf_attach()
1096 if (xnf_alloc_dma_resources(xnfp) == DDI_FAILURE) { in xnf_attach()
1099 ddi_get_instance(xnfp->xnf_devinfo)); in xnf_attach()
1103 xnfp->xnf_rx_ring.sring->rsp_event = in xnf_attach()
1104 xnfp->xnf_tx_ring.sring->rsp_event = 1; in xnf_attach()
1106 xnfp->xnf_tx_ring_ref = INVALID_GRANT_REF; in xnf_attach()
1107 xnfp->xnf_rx_ring_ref = INVALID_GRANT_REF; in xnf_attach()
1110 ddi_set_driver_private(devinfo, xnfp); in xnf_attach()
1112 if (!xnf_kstat_init(xnfp)) in xnf_attach()
1120 xnfp->xnf_evtchn = xvdi_get_evtchn(devinfo); in xnf_attach()
1122 ec_bind_evtchn_to_handler(xnfp->xnf_evtchn, IPL_VIF, xnf_intr, xnfp); in xnf_attach()
1124 (void) ddi_add_intr(devinfo, 0, NULL, NULL, xnf_intr, (caddr_t)xnfp); in xnf_attach()
1127 err = mac_register(macp, &xnfp->xnf_mh); in xnf_attach()
1152 (void) mac_unregister(xnfp->xnf_mh); in xnf_attach()
1156 ec_unbind_evtchn(xnfp->xnf_evtchn); in xnf_attach()
1159 ddi_remove_intr(devinfo, 0, xnfp->xnf_icookie); in xnf_attach()
1161 xnfp->xnf_evtchn = INVALID_EVTCHN; in xnf_attach()
1162 kstat_delete(xnfp->xnf_kstat_aux); in xnf_attach()
1165 xnf_release_dma_resources(xnfp); in xnf_attach()
1168 kmem_cache_destroy(xnfp->xnf_tx_buf_cache); in xnf_attach()
1171 kmem_cache_destroy(xnfp->xnf_buf_cache); in xnf_attach()
1174 cv_destroy(&xnfp->xnf_cv_tx_slots); in xnf_attach()
1175 cv_destroy(&xnfp->xnf_cv_multicast); in xnf_attach()
1176 cv_destroy(&xnfp->xnf_cv_state); in xnf_attach()
1178 mutex_destroy(&xnfp->xnf_gref_lock); in xnf_attach()
1179 mutex_destroy(&xnfp->xnf_schedlock); in xnf_attach()
1180 mutex_destroy(&xnfp->xnf_rxlock); in xnf_attach()
1181 mutex_destroy(&xnfp->xnf_txlock); in xnf_attach()
1184 kmem_free(xnfp, sizeof (*xnfp)); in xnf_attach()
1195 xnf_t *xnfp; /* Our private device info */ in xnf_detach() local
1197 xnfp = ddi_get_driver_private(devinfo); in xnf_detach()
1202 ec_unbind_evtchn(xnfp->xnf_evtchn); in xnf_detach()
1205 ddi_remove_intr(devinfo, 0, xnfp->xnf_icookie); in xnf_detach()
1210 mutex_enter(&xnfp->xnf_rxlock); in xnf_detach()
1211 mutex_enter(&xnfp->xnf_txlock); in xnf_detach()
1213 xnfp->xnf_evtchn = INVALID_EVTCHN; in xnf_detach()
1214 xnfp->xnf_connected = B_FALSE; in xnf_detach()
1215 mutex_exit(&xnfp->xnf_txlock); in xnf_detach()
1216 mutex_exit(&xnfp->xnf_rxlock); in xnf_detach()
1219 mac_link_update(xnfp->xnf_mh, LINK_STATE_DOWN); in xnf_detach()
1229 if (xnfp->xnf_connected) in xnf_detach()
1235 if (xnfp->xnf_stat_buf_allocated > 0) in xnf_detach()
1238 if (mac_unregister(xnfp->xnf_mh) != 0) in xnf_detach()
1241 kstat_delete(xnfp->xnf_kstat_aux); in xnf_detach()
1244 xnf_stop(xnfp); in xnf_detach()
1250 ec_unbind_evtchn(xnfp->xnf_evtchn); in xnf_detach()
1253 ddi_remove_intr(devinfo, 0, xnfp->xnf_icookie); in xnf_detach()
1257 xnf_release_mblks(xnfp); in xnf_detach()
1260 xnf_release_dma_resources(xnfp); in xnf_detach()
1262 cv_destroy(&xnfp->xnf_cv_tx_slots); in xnf_detach()
1263 cv_destroy(&xnfp->xnf_cv_multicast); in xnf_detach()
1264 cv_destroy(&xnfp->xnf_cv_state); in xnf_detach()
1266 kmem_cache_destroy(xnfp->xnf_tx_buf_cache); in xnf_detach()
1267 kmem_cache_destroy(xnfp->xnf_buf_cache); in xnf_detach()
1269 mutex_destroy(&xnfp->xnf_gref_lock); in xnf_detach()
1270 mutex_destroy(&xnfp->xnf_schedlock); in xnf_detach()
1271 mutex_destroy(&xnfp->xnf_rxlock); in xnf_detach()
1272 mutex_destroy(&xnfp->xnf_txlock); in xnf_detach()
1274 kmem_free(xnfp, sizeof (*xnfp)); in xnf_detach()
1302 xnf_t *xnfp = arg; in xnf_set_multicast() local
1315 if (!xnfp->xnf_be_mcast_control) in xnf_set_multicast()
1318 txp = kmem_cache_alloc(xnfp->xnf_tx_buf_cache, KM_SLEEP); in xnf_set_multicast()
1320 mutex_enter(&xnfp->xnf_txlock); in xnf_set_multicast()
1331 if (!xnfp->xnf_connected) { in xnf_set_multicast()
1332 mutex_exit(&xnfp->xnf_txlock); in xnf_set_multicast()
1344 n_slots = xnf_tx_slots_get(xnfp, 2, B_TRUE); in xnf_set_multicast()
1347 slot = xnfp->xnf_tx_ring.req_prod_pvt; in xnf_set_multicast()
1348 tidp = xnf_txid_get(xnfp); in xnf_set_multicast()
1354 txrp = RING_GET_REQUEST(&xnfp->xnf_tx_ring, slot); in xnf_set_multicast()
1356 RING_GET_REQUEST(&xnfp->xnf_tx_ring, slot + 1); in xnf_set_multicast()
1371 xnfp->xnf_tx_ring.req_prod_pvt = slot + 2; in xnf_set_multicast()
1373 mutex_enter(&xnfp->xnf_schedlock); in xnf_set_multicast()
1374 xnfp->xnf_pending_multicast++; in xnf_set_multicast()
1375 mutex_exit(&xnfp->xnf_schedlock); in xnf_set_multicast()
1378 RING_PUSH_REQUESTS_AND_CHECK_NOTIFY(&xnfp->xnf_tx_ring, in xnf_set_multicast()
1381 ec_notify_via_evtchn(xnfp->xnf_evtchn); in xnf_set_multicast()
1384 cv_wait(&xnfp->xnf_cv_multicast, &xnfp->xnf_txlock); in xnf_set_multicast()
1388 mutex_enter(&xnfp->xnf_schedlock); in xnf_set_multicast()
1389 xnfp->xnf_pending_multicast--; in xnf_set_multicast()
1390 mutex_exit(&xnfp->xnf_schedlock); in xnf_set_multicast()
1394 xnf_txid_put(xnfp, tidp); in xnf_set_multicast()
1396 mutex_exit(&xnfp->xnf_txlock); in xnf_set_multicast()
1398 kmem_cache_free(xnfp->xnf_tx_buf_cache, txp); in xnf_set_multicast()
1424 xnf_tx_clean_ring(xnf_t *xnfp) in xnf_tx_clean_ring() argument
1428 ASSERT(MUTEX_HELD(&xnfp->xnf_txlock)); in xnf_tx_clean_ring()
1431 while (RING_HAS_UNCONSUMED_RESPONSES(&xnfp->xnf_tx_ring)) { in xnf_tx_clean_ring()
1434 cons = xnfp->xnf_tx_ring.rsp_cons; in xnf_tx_clean_ring()
1435 prod = xnfp->xnf_tx_ring.sring->rsp_prod; in xnf_tx_clean_ring()
1447 trp = RING_GET_RESPONSE(&xnfp->xnf_tx_ring, i); in xnf_tx_clean_ring()
1458 tidp = TX_ID_TO_TXID(xnfp, trp->id); in xnf_tx_clean_ring()
1475 xnf_txid_put(xnfp, tidp); in xnf_tx_clean_ring()
1485 xnf_data_txbuf_free_chain(xnfp, txp); in xnf_tx_clean_ring()
1492 cv_broadcast(&xnfp->xnf_cv_multicast); in xnf_tx_clean_ring()
1507 xnfp->xnf_tx_ring.rsp_cons = prod; in xnf_tx_clean_ring()
1512 RING_FINAL_CHECK_FOR_RESPONSES(&xnfp->xnf_tx_ring, work_to_do); in xnf_tx_clean_ring()
1516 return (RING_FREE_REQUESTS(&xnfp->xnf_tx_ring)); in xnf_tx_clean_ring()
1525 xnf_tx_get_lookaside(xnf_t *xnfp, mblk_t *mp, size_t *plen) in xnf_tx_get_lookaside() argument
1530 if ((bd = xnf_buf_get(xnfp, KM_NOSLEEP, B_TRUE)) == NULL) { in xnf_tx_get_lookaside()
1547 xnfp->xnf_stat_tx_lookaside++; in xnf_tx_get_lookaside()
1665 xnf_tx_push_packet(xnf_t *xnfp, xnf_txbuf_t *head) in xnf_tx_push_packet() argument
1672 ASSERT(MUTEX_HELD(&xnfp->xnf_txlock)); in xnf_tx_push_packet()
1673 ASSERT(xnfp->xnf_running); in xnf_tx_push_packet()
1675 slot = xnfp->xnf_tx_ring.req_prod_pvt; in xnf_tx_push_packet()
1684 tidp = xnf_txid_get(xnfp); in xnf_tx_push_packet()
1686 txrp = RING_GET_REQUEST(&xnfp->xnf_tx_ring, slot); in xnf_tx_push_packet()
1705 RING_GET_REQUEST(&xnfp->xnf_tx_ring, slot); in xnf_tx_push_packet()
1720 xnfp->xnf_tx_ring.req_prod_pvt = slot; in xnf_tx_push_packet()
1726 RING_PUSH_REQUESTS_AND_CHECK_NOTIFY(&xnfp->xnf_tx_ring, notify); in xnf_tx_push_packet()
1728 ec_notify_via_evtchn(xnfp->xnf_evtchn); in xnf_tx_push_packet()
1732 xnf_mblk_copy(xnf_t *xnfp, mblk_t *mp) in xnf_mblk_copy() argument
1737 if ((txp = xnf_data_txbuf_alloc(xnfp, KM_NOSLEEP)) == NULL) { in xnf_mblk_copy()
1741 txp->tx_bdesc = xnf_tx_get_lookaside(xnfp, mp, &length); in xnf_mblk_copy()
1743 xnf_data_txbuf_free(xnfp, txp); in xnf_mblk_copy()
1756 xnf_mblk_map(xnf_t *xnfp, mblk_t *mp, int *countp) in xnf_mblk_map() argument
1763 oeid = xvdi_get_oeid(xnfp->xnf_devinfo); in xnf_mblk_map()
1773 if ((txp = xnf_data_txbuf_alloc(xnfp, KM_NOSLEEP)) == NULL) { in xnf_mblk_map()
1796 dev_err(xnfp->xnf_devinfo, CE_WARN, in xnf_mblk_map()
1808 dev_err(xnfp->xnf_devinfo, CE_WARN, in xnf_mblk_map()
1814 if ((txp = xnf_data_txbuf_alloc(xnfp, in xnf_mblk_map()
1825 txp->tx_txreq.gref = xnf_gref_get(xnfp); in xnf_mblk_map()
1827 dev_err(xnfp->xnf_devinfo, CE_WARN, in xnf_mblk_map()
1853 xnf_data_txbuf_free_chain(xnfp, head); in xnf_mblk_map()
1858 xnf_tx_setup_offload(xnf_t *xnfp, xnf_txbuf_t *head, in xnf_tx_setup_offload() argument
1888 xnfp->xnf_stat_tx_cksum_deferred++; in xnf_tx_setup_offload()
1898 xnf_t *xnfp = arg; in xnf_send() local
1909 mutex_enter(&xnfp->xnf_txlock); in xnf_send()
1914 while (!xnfp->xnf_connected) in xnf_send()
1915 cv_wait(&xnfp->xnf_cv_state, &xnfp->xnf_txlock); in xnf_send()
1923 slots_free = xnf_tx_slots_get(xnfp, XEN_MAX_SLOTS_PER_TX, B_FALSE); in xnf_send()
1928 mutex_enter(&xnfp->xnf_schedlock); in xnf_send()
1929 xnfp->xnf_need_sched = B_TRUE; in xnf_send()
1930 mutex_exit(&xnfp->xnf_schedlock); in xnf_send()
1932 xnfp->xnf_stat_tx_defer++; in xnf_send()
1933 mutex_exit(&xnfp->xnf_txlock); in xnf_send()
1972 xnfp->xnf_stat_tx_eth_hdr_split++; in xnf_send()
1977 if (force_copy || (pages > 1 && !xnfp->xnf_be_tx_sg)) { in xnf_send()
1983 head = xnf_mblk_copy(xnfp, mp); in xnf_send()
1985 dev_err(xnfp->xnf_devinfo, CE_WARN, in xnf_send()
1998 dev_err(xnfp->xnf_devinfo, CE_WARN, in xnf_send()
2009 dev_err(xnfp->xnf_devinfo, CE_WARN, in xnf_send()
2016 xnfp->xnf_stat_tx_pullup++; in xnf_send()
2021 head = xnf_mblk_map(xnfp, mp, &slots); in xnf_send()
2025 IMPLY(slots > 1, xnfp->xnf_be_tx_sg); in xnf_send()
2033 xnf_tx_setup_offload(xnfp, head, cksum_flags, lso_flags, mss); in xnf_send()
2043 xnf_tx_push_packet(xnfp, head); in xnf_send()
2044 xnfp->xnf_stat_opackets++; in xnf_send()
2045 xnfp->xnf_stat_obytes += length; in xnf_send()
2047 mutex_exit(&xnfp->xnf_txlock); in xnf_send()
2052 xnfp->xnf_stat_tx_drop++; in xnf_send()
2053 mutex_exit(&xnfp->xnf_txlock); in xnf_send()
2064 xnf_t *xnfp = (xnf_t *)arg; in xnf_intr() local
2068 mutex_enter(&xnfp->xnf_rxlock); in xnf_intr()
2073 if (!xnfp->xnf_connected) { in xnf_intr()
2074 mutex_exit(&xnfp->xnf_rxlock); in xnf_intr()
2075 xnfp->xnf_stat_unclaimed_interrupts++; in xnf_intr()
2086 xnf_rx_collect(xnfp); in xnf_intr()
2091 xnfp->xnf_rx_ring.sring->rsp_event = in xnf_intr()
2092 xnfp->xnf_rx_ring.rsp_cons + 1; in xnf_intr()
2095 } while (RING_HAS_UNCONSUMED_RESPONSES(&xnfp->xnf_rx_ring)); in xnf_intr()
2097 if (xnfp->xnf_rx_new_buffers_posted) { in xnf_intr()
2105 RING_PUSH_REQUESTS_AND_CHECK_NOTIFY(&xnfp->xnf_rx_ring, notify); in xnf_intr()
2107 ec_notify_via_evtchn(xnfp->xnf_evtchn); in xnf_intr()
2108 xnfp->xnf_rx_new_buffers_posted = B_FALSE; in xnf_intr()
2111 mp = xnfp->xnf_rx_head; in xnf_intr()
2112 xnfp->xnf_rx_head = xnfp->xnf_rx_tail = NULL; in xnf_intr()
2114 xnfp->xnf_stat_interrupts++; in xnf_intr()
2115 mutex_exit(&xnfp->xnf_rxlock); in xnf_intr()
2118 mac_rx(xnfp->xnf_mh, NULL, mp); in xnf_intr()
2132 mutex_enter(&xnfp->xnf_schedlock); in xnf_intr()
2133 need_sched = xnfp->xnf_need_sched; in xnf_intr()
2134 clean_ring = need_sched || (xnfp->xnf_pending_multicast > 0); in xnf_intr()
2135 mutex_exit(&xnfp->xnf_schedlock); in xnf_intr()
2140 mutex_enter(&xnfp->xnf_txlock); in xnf_intr()
2141 free_slots = xnf_tx_slots_get(xnfp, 0, B_FALSE); in xnf_intr()
2144 mutex_enter(&xnfp->xnf_schedlock); in xnf_intr()
2145 xnfp->xnf_need_sched = B_FALSE; in xnf_intr()
2146 mutex_exit(&xnfp->xnf_schedlock); in xnf_intr()
2148 mac_tx_update(xnfp->xnf_mh); in xnf_intr()
2150 mutex_exit(&xnfp->xnf_txlock); in xnf_intr()
2162 xnf_t *xnfp = arg; in xnf_start() local
2164 mutex_enter(&xnfp->xnf_rxlock); in xnf_start()
2165 mutex_enter(&xnfp->xnf_txlock); in xnf_start()
2168 xnfp->xnf_running = B_TRUE; in xnf_start()
2170 mutex_exit(&xnfp->xnf_txlock); in xnf_start()
2171 mutex_exit(&xnfp->xnf_rxlock); in xnf_start()
2180 xnf_t *xnfp = arg; in xnf_stop() local
2182 mutex_enter(&xnfp->xnf_rxlock); in xnf_stop()
2183 mutex_enter(&xnfp->xnf_txlock); in xnf_stop()
2185 xnfp->xnf_running = B_FALSE; in xnf_stop()
2187 mutex_exit(&xnfp->xnf_txlock); in xnf_stop()
2188 mutex_exit(&xnfp->xnf_rxlock); in xnf_stop()
2195 xnf_rxbuf_hang(xnf_t *xnfp, xnf_buf_t *bdesc) in xnf_rxbuf_hang() argument
2200 ASSERT(MUTEX_HELD(&xnfp->xnf_rxlock)); in xnf_rxbuf_hang()
2202 reqp = RING_GET_REQUEST(&xnfp->xnf_rx_ring, in xnf_rxbuf_hang()
2203 xnfp->xnf_rx_ring.req_prod_pvt); in xnf_rxbuf_hang()
2204 hang_ix = (RING_IDX) (reqp - RING_GET_REQUEST(&xnfp->xnf_rx_ring, 0)); in xnf_rxbuf_hang()
2205 ASSERT(xnfp->xnf_rx_pkt_info[hang_ix] == NULL); in xnf_rxbuf_hang()
2210 xnfp->xnf_rx_pkt_info[hang_ix] = bdesc; in xnf_rxbuf_hang()
2211 xnfp->xnf_rx_ring.req_prod_pvt++; in xnf_rxbuf_hang()
2213 xnfp->xnf_rx_new_buffers_posted = B_TRUE; in xnf_rxbuf_hang()
2271 xnf_rx_one_packet(xnf_t *xnfp, RING_IDX prod, RING_IDX *consp, mblk_t **mpp) in xnf_rx_one_packet() argument
2282 netif_rx_response_t rsp = *RING_GET_RESPONSE(&xnfp->xnf_rx_ring, cons); in xnf_rx_one_packet()
2295 bdesc = xnfp->xnf_rx_pkt_info[rxidx]; in xnf_rx_one_packet()
2296 xnfp->xnf_rx_pkt_info[rxidx] = NULL; in xnf_rx_one_packet()
2311 dev_err(xnfp->xnf_devinfo, CE_WARN, "rx packet " in xnf_rx_one_packet()
2334 if (!xnfp->xnf_running) { in xnf_rx_one_packet()
2337 xnfp->xnf_stat_errrx++; in xnf_rx_one_packet()
2341 xnfp->xnf_stat_runt++; in xnf_rx_one_packet()
2344 xnfp->xnf_stat_mac_rcv_error++; in xnf_rx_one_packet()
2347 xnfp->xnf_stat_norxbuf++; in xnf_rx_one_packet()
2352 dev_err(xnfp->xnf_devinfo, CE_WARN, in xnf_rx_one_packet()
2356 dev_err(xnfp->xnf_devinfo, CE_WARN, "Rx packet crosses " in xnf_rx_one_packet()
2377 nbuf = xnf_buf_get(xnfp, KM_NOSLEEP, B_FALSE); in xnf_rx_one_packet()
2384 xnfp->xnf_stat_rx_desballoc_fail++; in xnf_rx_one_packet()
2385 xnfp->xnf_stat_norxbuf++; in xnf_rx_one_packet()
2391 xnf_buf_put(xnfp, nbuf, B_FALSE); in xnf_rx_one_packet()
2404 xnf_gref_put(xnfp, bdesc->grant_ref); in xnf_rx_one_packet()
2416 xnfp->xnf_stat_rx_allocb_fail++; in xnf_rx_one_packet()
2417 xnfp->xnf_stat_norxbuf++; in xnf_rx_one_packet()
2437 xnf_rxbuf_hang(xnfp, bdesc); in xnf_rx_one_packet()
2452 rsp = *RING_GET_RESPONSE(&xnfp->xnf_rx_ring, cons); in xnf_rx_one_packet()
2465 dev_err(xnfp->xnf_devinfo, CE_WARN, "rx: need more fragments."); in xnf_rx_one_packet()
2469 dev_err(xnfp->xnf_devinfo, CE_WARN, "rx: need more fragments " in xnf_rx_one_packet()
2481 xnfp->xnf_stat_rx_drop++; in xnf_rx_one_packet()
2497 xnfp->xnf_stat_rx_cksum_no_need++; in xnf_rx_one_packet()
2511 xnf_rx_collect(xnf_t *xnfp) in xnf_rx_collect() argument
2515 ASSERT(MUTEX_HELD(&xnfp->xnf_rxlock)); in xnf_rx_collect()
2517 prod = xnfp->xnf_rx_ring.sring->rsp_prod; in xnf_rx_collect()
2523 while (xnfp->xnf_rx_ring.rsp_cons != prod) { in xnf_rx_collect()
2530 int error = xnf_rx_one_packet(xnfp, prod, in xnf_rx_collect()
2531 &xnfp->xnf_rx_ring.rsp_cons, &mp); in xnf_rx_collect()
2533 xnfp->xnf_stat_ipackets++; in xnf_rx_collect()
2534 xnfp->xnf_stat_rbytes += xmsgsize(mp); in xnf_rx_collect()
2539 if (xnfp->xnf_rx_head == NULL) { in xnf_rx_collect()
2540 ASSERT3P(xnfp->xnf_rx_tail, ==, NULL); in xnf_rx_collect()
2541 xnfp->xnf_rx_head = mp; in xnf_rx_collect()
2543 ASSERT(xnfp->xnf_rx_tail != NULL); in xnf_rx_collect()
2544 xnfp->xnf_rx_tail->b_next = mp; in xnf_rx_collect()
2546 xnfp->xnf_rx_tail = mp; in xnf_rx_collect()
2555 xnf_alloc_dma_resources(xnf_t *xnfp) in xnf_alloc_dma_resources() argument
2557 dev_info_t *devinfo = xnfp->xnf_devinfo; in xnf_alloc_dma_resources()
2571 DDI_DMA_SLEEP, 0, &xnfp->xnf_tx_ring_dma_handle) != DDI_SUCCESS) in xnf_alloc_dma_resources()
2574 if (ddi_dma_mem_alloc(xnfp->xnf_tx_ring_dma_handle, in xnf_alloc_dma_resources()
2577 &xnfp->xnf_tx_ring_dma_acchandle) != DDI_SUCCESS) { in xnf_alloc_dma_resources()
2578 ddi_dma_free_handle(&xnfp->xnf_tx_ring_dma_handle); in xnf_alloc_dma_resources()
2579 xnfp->xnf_tx_ring_dma_handle = NULL; in xnf_alloc_dma_resources()
2583 if ((rc = ddi_dma_addr_bind_handle(xnfp->xnf_tx_ring_dma_handle, NULL, in xnf_alloc_dma_resources()
2586 ddi_dma_mem_free(&xnfp->xnf_tx_ring_dma_acchandle); in xnf_alloc_dma_resources()
2587 ddi_dma_free_handle(&xnfp->xnf_tx_ring_dma_handle); in xnf_alloc_dma_resources()
2588 xnfp->xnf_tx_ring_dma_handle = NULL; in xnf_alloc_dma_resources()
2589 xnfp->xnf_tx_ring_dma_acchandle = NULL; in xnf_alloc_dma_resources()
2601 FRONT_RING_INIT(&xnfp->xnf_tx_ring, (netif_tx_sring_t *)rptr, PAGESIZE); in xnf_alloc_dma_resources()
2602 xnfp->xnf_tx_ring_phys_addr = dma_cookie.dmac_laddress; in xnf_alloc_dma_resources()
2608 DDI_DMA_SLEEP, 0, &xnfp->xnf_rx_ring_dma_handle) != DDI_SUCCESS) in xnf_alloc_dma_resources()
2611 if (ddi_dma_mem_alloc(xnfp->xnf_rx_ring_dma_handle, in xnf_alloc_dma_resources()
2614 &xnfp->xnf_rx_ring_dma_acchandle) != DDI_SUCCESS) { in xnf_alloc_dma_resources()
2615 ddi_dma_free_handle(&xnfp->xnf_rx_ring_dma_handle); in xnf_alloc_dma_resources()
2616 xnfp->xnf_rx_ring_dma_handle = NULL; in xnf_alloc_dma_resources()
2620 if ((rc = ddi_dma_addr_bind_handle(xnfp->xnf_rx_ring_dma_handle, NULL, in xnf_alloc_dma_resources()
2623 ddi_dma_mem_free(&xnfp->xnf_rx_ring_dma_acchandle); in xnf_alloc_dma_resources()
2624 ddi_dma_free_handle(&xnfp->xnf_rx_ring_dma_handle); in xnf_alloc_dma_resources()
2625 xnfp->xnf_rx_ring_dma_handle = NULL; in xnf_alloc_dma_resources()
2626 xnfp->xnf_rx_ring_dma_acchandle = NULL; in xnf_alloc_dma_resources()
2638 FRONT_RING_INIT(&xnfp->xnf_rx_ring, (netif_rx_sring_t *)rptr, PAGESIZE); in xnf_alloc_dma_resources()
2639 xnfp->xnf_rx_ring_phys_addr = dma_cookie.dmac_laddress; in xnf_alloc_dma_resources()
2645 ddi_get_instance(xnfp->xnf_devinfo)); in xnf_alloc_dma_resources()
2647 xnf_release_dma_resources(xnfp); in xnf_alloc_dma_resources()
2655 xnf_release_dma_resources(xnf_t *xnfp) in xnf_release_dma_resources() argument
2663 mutex_enter(&xnfp->xnf_rxlock); in xnf_release_dma_resources()
2667 if ((bp = xnfp->xnf_rx_pkt_info[i]) == NULL) in xnf_release_dma_resources()
2669 xnfp->xnf_rx_pkt_info[i] = NULL; in xnf_release_dma_resources()
2670 xnf_buf_put(xnfp, bp, B_FALSE); in xnf_release_dma_resources()
2672 mutex_exit(&xnfp->xnf_rxlock); in xnf_release_dma_resources()
2675 if (xnfp->xnf_rx_ring_dma_acchandle != NULL) { in xnf_release_dma_resources()
2676 (void) ddi_dma_unbind_handle(xnfp->xnf_rx_ring_dma_handle); in xnf_release_dma_resources()
2677 ddi_dma_mem_free(&xnfp->xnf_rx_ring_dma_acchandle); in xnf_release_dma_resources()
2678 ddi_dma_free_handle(&xnfp->xnf_rx_ring_dma_handle); in xnf_release_dma_resources()
2679 xnfp->xnf_rx_ring_dma_acchandle = NULL; in xnf_release_dma_resources()
2682 if (xnfp->xnf_tx_ring_dma_acchandle != NULL) { in xnf_release_dma_resources()
2683 (void) ddi_dma_unbind_handle(xnfp->xnf_tx_ring_dma_handle); in xnf_release_dma_resources()
2684 ddi_dma_mem_free(&xnfp->xnf_tx_ring_dma_acchandle); in xnf_release_dma_resources()
2685 ddi_dma_free_handle(&xnfp->xnf_tx_ring_dma_handle); in xnf_release_dma_resources()
2686 xnfp->xnf_tx_ring_dma_acchandle = NULL; in xnf_release_dma_resources()
2695 xnf_release_mblks(xnf_t *xnfp) in xnf_release_mblks() argument
2700 for (i = 0, tidp = &xnfp->xnf_tx_pkt_id[0]; in xnf_release_mblks()
2709 xnf_txid_put(xnfp, tidp); in xnf_release_mblks()
2710 kmem_cache_free(xnfp->xnf_tx_buf_cache, txp); in xnf_release_mblks()
2720 xnf_t *xnfp = arg; in xnf_buf_constructor() local
2729 if (ddi_dma_alloc_handle(xnfp->xnf_devinfo, &rx_buf_dma_attr, in xnf_buf_constructor()
2748 bdesc->xnfp = xnfp; in xnf_buf_constructor()
2753 bdesc->gen = xnfp->xnf_gen; in xnf_buf_constructor()
2755 atomic_inc_64(&xnfp->xnf_stat_buf_allocated); in xnf_buf_constructor()
2775 xnf_t *xnfp = arg; in xnf_buf_destructor() local
2781 atomic_dec_64(&xnfp->xnf_stat_buf_allocated); in xnf_buf_destructor()
2785 xnf_buf_get(xnf_t *xnfp, int flags, boolean_t readonly) in xnf_buf_get() argument
2794 gref = xnf_gref_get(xnfp); in xnf_buf_get()
2798 bufp = kmem_cache_alloc(xnfp->xnf_buf_cache, flags); in xnf_buf_get()
2800 xnf_gref_put(xnfp, gref); in xnf_buf_get()
2808 if (bufp->gen != xnfp->xnf_gen) in xnf_buf_get()
2812 xvdi_get_oeid(bufp->xnfp->xnf_devinfo), in xnf_buf_get()
2815 atomic_inc_64(&xnfp->xnf_stat_buf_outstanding); in xnf_buf_get()
2821 xnf_buf_put(xnf_t *xnfp, xnf_buf_t *bufp, boolean_t readonly) in xnf_buf_put() argument
2826 xnf_gref_put(xnfp, bufp->grant_ref); in xnf_buf_put()
2830 kmem_cache_free(xnfp->xnf_buf_cache, bufp); in xnf_buf_put()
2832 atomic_dec_64(&xnfp->xnf_stat_buf_outstanding); in xnf_buf_put()
2842 bdesc->gen = bdesc->xnfp->xnf_gen; in xnf_buf_refresh()
2852 xnf_t *xnfp = bdesc->xnfp; in xnf_buf_recycle() local
2854 xnf_buf_put(xnfp, bdesc, B_TRUE); in xnf_buf_recycle()
2862 xnf_t *xnfp = arg; in xnf_tx_buf_constructor() local
2867 if (ddi_dma_alloc_handle(xnfp->xnf_devinfo, &tx_buf_dma_attr, in xnf_tx_buf_constructor()
2909 xnf_t *xnfp; in xnf_kstat_aux_update() local
2915 xnfp = ksp->ks_private; in xnf_kstat_aux_update()
2922 (knp++)->value.ui64 = xnfp->xnf_stat_tx_cksum_deferred; in xnf_kstat_aux_update()
2923 (knp++)->value.ui64 = xnfp->xnf_stat_rx_cksum_no_need; in xnf_kstat_aux_update()
2925 (knp++)->value.ui64 = xnfp->xnf_stat_interrupts; in xnf_kstat_aux_update()
2926 (knp++)->value.ui64 = xnfp->xnf_stat_unclaimed_interrupts; in xnf_kstat_aux_update()
2927 (knp++)->value.ui64 = xnfp->xnf_stat_tx_pullup; in xnf_kstat_aux_update()
2928 (knp++)->value.ui64 = xnfp->xnf_stat_tx_lookaside; in xnf_kstat_aux_update()
2929 (knp++)->value.ui64 = xnfp->xnf_stat_tx_drop; in xnf_kstat_aux_update()
2930 (knp++)->value.ui64 = xnfp->xnf_stat_tx_eth_hdr_split; in xnf_kstat_aux_update()
2932 (knp++)->value.ui64 = xnfp->xnf_stat_buf_allocated; in xnf_kstat_aux_update()
2933 (knp++)->value.ui64 = xnfp->xnf_stat_buf_outstanding; in xnf_kstat_aux_update()
2934 (knp++)->value.ui64 = xnfp->xnf_stat_gref_outstanding; in xnf_kstat_aux_update()
2935 (knp++)->value.ui64 = xnfp->xnf_stat_gref_failure; in xnf_kstat_aux_update()
2936 (knp++)->value.ui64 = xnfp->xnf_stat_gref_peak; in xnf_kstat_aux_update()
2937 (knp++)->value.ui64 = xnfp->xnf_stat_rx_allocb_fail; in xnf_kstat_aux_update()
2938 (knp++)->value.ui64 = xnfp->xnf_stat_rx_desballoc_fail; in xnf_kstat_aux_update()
2944 xnf_kstat_init(xnf_t *xnfp) in xnf_kstat_init() argument
2954 if ((xnfp->xnf_kstat_aux = kstat_create("xnf", in xnf_kstat_init()
2955 ddi_get_instance(xnfp->xnf_devinfo), in xnf_kstat_init()
2960 xnfp->xnf_kstat_aux->ks_private = xnfp; in xnf_kstat_init()
2961 xnfp->xnf_kstat_aux->ks_update = xnf_kstat_aux_update; in xnf_kstat_init()
2963 knp = xnfp->xnf_kstat_aux->ks_data; in xnf_kstat_init()
2972 kstat_install(xnfp->xnf_kstat_aux); in xnf_kstat_init()
2980 xnf_t *xnfp = arg; in xnf_stat() local
2982 mutex_enter(&xnfp->xnf_rxlock); in xnf_stat()
2983 mutex_enter(&xnfp->xnf_txlock); in xnf_stat()
2987 *val = xnfp->xnf_stat_##r; \ in xnf_stat()
2992 *val = xnfp->xnf_stat_##r; \ in xnf_stat()
3019 mutex_exit(&xnfp->xnf_txlock); in xnf_stat()
3020 mutex_exit(&xnfp->xnf_rxlock); in xnf_stat()
3028 mutex_exit(&xnfp->xnf_txlock); in xnf_stat()
3029 mutex_exit(&xnfp->xnf_rxlock); in xnf_stat()
3035 xnf_change_mtu(xnf_t *xnfp, uint32_t mtu) in xnf_change_mtu() argument
3039 dev_err(xnfp->xnf_devinfo, CE_WARN, "MTU limited to %d " in xnf_change_mtu()
3044 dev_err(xnfp->xnf_devinfo, CE_WARN, "MTU limited to %d " in xnf_change_mtu()
3048 } else if (!xnfp->xnf_be_tx_sg) { in xnf_change_mtu()
3049 dev_err(xnfp->xnf_devinfo, CE_WARN, "MTU limited to %d " in xnf_change_mtu()
3057 int error = mac_maxsdu_update(xnfp->xnf_mh, mtu); in xnf_change_mtu()
3059 xnfp->xnf_mtu = mtu; in xnf_change_mtu()
3069 xnf_t *xnfp = data; in xnf_getprop() local
3074 bcopy(&xnfp->xnf_mtu, prop_val, sizeof (uint32_t)); in xnf_getprop()
3087 xnf_t *xnfp = data; in xnf_setprop() local
3095 error = xnf_change_mtu(xnfp, new_mtu); in xnf_setprop()
3121 xnf_t *xnfp = arg; in xnf_getcapab() local
3154 if (!xnfp->xnf_be_lso) in xnf_getcapab()
3177 xnf_t *xnfp = ddi_get_driver_private(dip); in oe_state_change() local
3180 ASSERT(xnfp != NULL); in oe_state_change()
3193 xnf_read_config(xnfp); in oe_state_change()
3195 if (!xnfp->xnf_be_rx_copy) { in oe_state_change()
3199 (void) xvdi_switch_state(xnfp->xnf_devinfo, in oe_state_change()
3207 xnf_be_connect(xnfp); in oe_state_change()
3212 mac_unicst_update(xnfp->xnf_mh, xnfp->xnf_mac_addr); in oe_state_change()
3219 mac_capab_update(xnfp->xnf_mh); in oe_state_change()
3224 mutex_enter(&xnfp->xnf_rxlock); in oe_state_change()
3225 mutex_enter(&xnfp->xnf_txlock); in oe_state_change()
3227 xnfp->xnf_connected = B_TRUE; in oe_state_change()
3232 cv_broadcast(&xnfp->xnf_cv_state); in oe_state_change()
3234 mutex_exit(&xnfp->xnf_txlock); in oe_state_change()
3235 mutex_exit(&xnfp->xnf_rxlock); in oe_state_change()
3241 ec_notify_via_evtchn(xnfp->xnf_evtchn); in oe_state_change()
3249 (void) xnf_intr((caddr_t)xnfp); in oe_state_change()
3254 mac_link_update(xnfp->xnf_mh, LINK_STATE_UP); in oe_state_change()
3260 mac_multicast_refresh(xnfp->xnf_mh, NULL, xnfp, B_TRUE); in oe_state_change()