Lines Matching defs:xnfp

352 gref_get(xnf_t *xnfp)
356 mutex_enter(&xnfp->xnf_gref_lock);
359 gref = gnttab_claim_grant_reference(&xnfp->xnf_gref_head);
362 (gnttab_alloc_grant_references(16, &xnfp->xnf_gref_head) == 0));
364 mutex_exit(&xnfp->xnf_gref_lock);
367 xnfp->xnf_stat_gref_failure++;
369 atomic_inc_64(&xnfp->xnf_stat_gref_outstanding);
370 if (xnfp->xnf_stat_gref_outstanding > xnfp->xnf_stat_gref_peak)
371 xnfp->xnf_stat_gref_peak =
372 xnfp->xnf_stat_gref_outstanding;
382 gref_put(xnf_t *xnfp, grant_ref_t gref)
386 mutex_enter(&xnfp->xnf_gref_lock);
387 gnttab_release_grant_reference(&xnfp->xnf_gref_head, gref);
388 mutex_exit(&xnfp->xnf_gref_lock);
390 atomic_dec_64(&xnfp->xnf_stat_gref_outstanding);
397 txid_get(xnf_t *xnfp)
401 ASSERT(MUTEX_HELD(&xnfp->xnf_txlock));
403 if (xnfp->xnf_tx_pkt_id_head == INVALID_TX_ID)
406 ASSERT(TX_ID_VALID(xnfp->xnf_tx_pkt_id_head));
408 tidp = TX_ID_TO_TXID(xnfp, xnfp->xnf_tx_pkt_id_head);
409 xnfp->xnf_tx_pkt_id_head = tidp->next;
421 txid_put(xnf_t *xnfp, xnf_txid_t *tidp)
423 ASSERT(MUTEX_HELD(&xnfp->xnf_txlock));
428 tidp->next = xnfp->xnf_tx_pkt_id_head;
429 xnfp->xnf_tx_pkt_id_head = tidp->id;
440 tx_slots_get(xnf_t *xnfp, int wanted, boolean_t wait)
445 ASSERT(MUTEX_HELD(&xnfp->xnf_txlock));
449 slotsfree = RING_FREE_REQUESTS(&xnfp->xnf_tx_ring);
452 slotsfree = xnf_tx_clean_ring(xnfp);
460 cv_broadcast(&xnfp->xnf_cv_tx_slots);
468 cv_wait(&xnfp->xnf_cv_tx_slots, &xnfp->xnf_txlock);
471 ASSERT(slotsfree <= RING_SIZE(&(xnfp->xnf_tx_ring)));
477 xnf_setup_rings(xnf_t *xnfp)
486 oeid = xvdi_get_oeid(xnfp->xnf_devinfo);
487 xsd = xvdi_get_xsd(xnfp->xnf_devinfo);
489 if (xnfp->xnf_tx_ring_ref != INVALID_GRANT_REF)
490 gnttab_end_foreign_access(xnfp->xnf_tx_ring_ref, 0, 0);
493 xnf_btop(pa_to_ma(xnfp->xnf_tx_ring_phys_addr)), 0);
499 xnfp->xnf_tx_ring_ref = (grant_ref_t)err;
501 if (xnfp->xnf_rx_ring_ref != INVALID_GRANT_REF)
502 gnttab_end_foreign_access(xnfp->xnf_rx_ring_ref, 0, 0);
505 xnf_btop(pa_to_ma(xnfp->xnf_rx_ring_phys_addr)), 0);
511 xnfp->xnf_rx_ring_ref = (grant_ref_t)err;
513 mutex_enter(&xnfp->xnf_txlock);
519 xnfp->xnf_tx_pkt_id_head = INVALID_TX_ID; /* I.e. emtpy list. */
520 for (i = 0, tidp = &xnfp->xnf_tx_pkt_id[0];
530 txid_put(xnfp, tidp);
545 gref_put(xnfp, txp->tx_txreq.gref);
549 xnf_buf_put(xnfp, txp->tx_bdesc, B_TRUE);
553 txid_put(xnfp, tidp);
554 kmem_cache_free(xnfp->xnf_tx_buf_cache, txp);
561 cv_broadcast(&xnfp->xnf_cv_multicast);
579 SHARED_RING_INIT(xnfp->xnf_tx_ring.sring);
581 FRONT_RING_INIT(&xnfp->xnf_tx_ring,
582 xnfp->xnf_tx_ring.sring, PAGESIZE);
584 mutex_exit(&xnfp->xnf_txlock);
586 mutex_enter(&xnfp->xnf_rxlock);
592 for (i = 0, bdescp = &xnfp->xnf_rx_pkt_info[0];
596 xnf_buf_put(xnfp, *bdescp, B_FALSE);
602 SHARED_RING_INIT(xnfp->xnf_rx_ring.sring);
604 FRONT_RING_INIT(&xnfp->xnf_rx_ring,
605 xnfp->xnf_rx_ring.sring, PAGESIZE);
613 bdesc = xnf_buf_get(xnfp, KM_SLEEP, B_FALSE);
615 xnf_rxbuf_hang(xnfp, bdesc);
619 RING_PUSH_REQUESTS(&xnfp->xnf_rx_ring);
621 mutex_exit(&xnfp->xnf_rxlock);
626 if (xnfp->xnf_tx_ring_ref != INVALID_GRANT_REF)
627 gnttab_end_foreign_access(xnfp->xnf_tx_ring_ref, 0, 0);
628 xnfp->xnf_tx_ring_ref = INVALID_GRANT_REF;
630 if (xnfp->xnf_rx_ring_ref != INVALID_GRANT_REF)
631 gnttab_end_foreign_access(xnfp->xnf_rx_ring_ref, 0, 0);
632 xnfp->xnf_rx_ring_ref = INVALID_GRANT_REF;
642 xnf_be_connect(xnf_t *xnfp)
650 ASSERT(!xnfp->xnf_connected);
652 xsd = xvdi_get_xsd(xnfp->xnf_devinfo);
653 xsname = xvdi_get_xsname(xnfp->xnf_devinfo);
655 err = xnf_setup_rings(xnfp);
670 xnfp->xnf_tx_ring_ref);
677 xnfp->xnf_rx_ring_ref);
684 xnfp->xnf_evtchn);
702 if (xnfp->xnf_be_mcast_control) {
711 err = xvdi_switch_state(xnfp->xnf_devinfo, xbt, XenbusStateConnected);
735 xnf_read_config(xnf_t *xnfp)
739 char *oename = xvdi_get_oename(xnfp->xnf_devinfo);
749 ddi_driver_name(xnfp->xnf_devinfo),
750 ddi_get_instance(xnfp->xnf_devinfo));
753 if (ether_aton(mac, xnfp->xnf_mac_addr) != ETHERADDRL) {
755 xenbus_dev_error(xvdi_get_xsd(xnfp->xnf_devinfo), ENOENT,
756 "parsing %s/mac", xvdi_get_xsname(xnfp->xnf_devinfo));
769 xnfp->xnf_be_rx_copy = (be_cap != 0);
780 xnfp->xnf_be_mcast_control = (be_cap != 0) && xnf_multicast_control;
790 xnf_t *xnfp;
802 xnfp = ddi_get_driver_private(devinfo);
803 xnfp->xnf_gen++;
807 xnfp->xnf_evtchn = xvdi_get_evtchn(devinfo);
809 ec_bind_evtchn_to_handler(xnfp->xnf_evtchn, IPL_VIF, xnf_intr,
810 xnfp);
813 (caddr_t)xnfp);
830 xnfp = kmem_zalloc(sizeof (*xnfp), KM_SLEEP);
833 macp->m_driver = xnfp;
834 xnfp->xnf_devinfo = devinfo;
837 macp->m_src_addr = xnfp->xnf_mac_addr;
842 xnfp->xnf_running = B_FALSE;
843 xnfp->xnf_connected = B_FALSE;
844 xnfp->xnf_be_rx_copy = B_FALSE;
845 xnfp->xnf_be_mcast_control = B_FALSE;
846 xnfp->xnf_need_sched = B_FALSE;
848 xnfp->xnf_rx_head = NULL;
849 xnfp->xnf_rx_tail = NULL;
850 xnfp->xnf_rx_new_buffers_posted = B_FALSE;
864 if (ddi_get_iblock_cookie(devinfo, 0, &xnfp->xnf_icookie)
868 mutex_init(&xnfp->xnf_txlock,
869 NULL, MUTEX_DRIVER, xnfp->xnf_icookie);
870 mutex_init(&xnfp->xnf_rxlock,
871 NULL, MUTEX_DRIVER, xnfp->xnf_icookie);
872 mutex_init(&xnfp->xnf_schedlock,
873 NULL, MUTEX_DRIVER, xnfp->xnf_icookie);
874 mutex_init(&xnfp->xnf_gref_lock,
875 NULL, MUTEX_DRIVER, xnfp->xnf_icookie);
877 cv_init(&xnfp->xnf_cv_state, NULL, CV_DEFAULT, NULL);
878 cv_init(&xnfp->xnf_cv_multicast, NULL, CV_DEFAULT, NULL);
879 cv_init(&xnfp->xnf_cv_tx_slots, NULL, CV_DEFAULT, NULL);
883 xnfp->xnf_buf_cache = kmem_cache_create(cachename,
886 NULL, xnfp, NULL, 0);
887 if (xnfp->xnf_buf_cache == NULL)
892 xnfp->xnf_tx_buf_cache = kmem_cache_create(cachename,
895 NULL, xnfp, NULL, 0);
896 if (xnfp->xnf_tx_buf_cache == NULL)
899 xnfp->xnf_gref_head = INVALID_GRANT_REF;
901 if (xnf_alloc_dma_resources(xnfp) == DDI_FAILURE) {
904 ddi_get_instance(xnfp->xnf_devinfo));
908 xnfp->xnf_rx_ring.sring->rsp_event =
909 xnfp->xnf_tx_ring.sring->rsp_event = 1;
911 xnfp->xnf_tx_ring_ref = INVALID_GRANT_REF;
912 xnfp->xnf_rx_ring_ref = INVALID_GRANT_REF;
915 ddi_set_driver_private(devinfo, xnfp);
917 if (!xnf_kstat_init(xnfp))
925 xnfp->xnf_evtchn = xvdi_get_evtchn(devinfo);
927 ec_bind_evtchn_to_handler(xnfp->xnf_evtchn, IPL_VIF, xnf_intr, xnfp);
929 (void) ddi_add_intr(devinfo, 0, NULL, NULL, xnf_intr, (caddr_t)xnfp);
932 err = mac_register(macp, &xnfp->xnf_mh);
956 xnf_debug_instance = xnfp;
962 (void) mac_unregister(xnfp->xnf_mh);
966 ec_unbind_evtchn(xnfp->xnf_evtchn);
969 ddi_remove_intr(devinfo, 0, xnfp->xnf_icookie);
971 xnfp->xnf_evtchn = INVALID_EVTCHN;
972 kstat_delete(xnfp->xnf_kstat_aux);
975 xnf_release_dma_resources(xnfp);
978 kmem_cache_destroy(xnfp->xnf_tx_buf_cache);
981 kmem_cache_destroy(xnfp->xnf_buf_cache);
984 cv_destroy(&xnfp->xnf_cv_tx_slots);
985 cv_destroy(&xnfp->xnf_cv_multicast);
986 cv_destroy(&xnfp->xnf_cv_state);
988 mutex_destroy(&xnfp->xnf_gref_lock);
989 mutex_destroy(&xnfp->xnf_schedlock);
990 mutex_destroy(&xnfp->xnf_rxlock);
991 mutex_destroy(&xnfp->xnf_txlock);
994 kmem_free(xnfp, sizeof (*xnfp));
1005 xnf_t *xnfp; /* Our private device info */
1012 xnfp = ddi_get_driver_private(devinfo);
1017 ec_unbind_evtchn(xnfp->xnf_evtchn);
1020 ddi_remove_intr(devinfo, 0, xnfp->xnf_icookie);
1025 mutex_enter(&xnfp->xnf_rxlock);
1026 mutex_enter(&xnfp->xnf_txlock);
1028 xnfp->xnf_evtchn = INVALID_EVTCHN;
1029 xnfp->xnf_connected = B_FALSE;
1030 mutex_exit(&xnfp->xnf_txlock);
1031 mutex_exit(&xnfp->xnf_rxlock);
1034 mac_link_update(xnfp->xnf_mh, LINK_STATE_DOWN);
1044 if (xnfp->xnf_connected)
1050 if (xnfp->xnf_stat_buf_allocated > 0)
1053 if (mac_unregister(xnfp->xnf_mh) != 0)
1056 kstat_delete(xnfp->xnf_kstat_aux);
1059 xnf_stop(xnfp);
1065 ec_unbind_evtchn(xnfp->xnf_evtchn);
1068 ddi_remove_intr(devinfo, 0, xnfp->xnf_icookie);
1072 xnf_release_mblks(xnfp);
1075 xnf_release_dma_resources(xnfp);
1077 cv_destroy(&xnfp->xnf_cv_tx_slots);
1078 cv_destroy(&xnfp->xnf_cv_multicast);
1079 cv_destroy(&xnfp->xnf_cv_state);
1081 kmem_cache_destroy(xnfp->xnf_tx_buf_cache);
1082 kmem_cache_destroy(xnfp->xnf_buf_cache);
1084 mutex_destroy(&xnfp->xnf_gref_lock);
1085 mutex_destroy(&xnfp->xnf_schedlock);
1086 mutex_destroy(&xnfp->xnf_rxlock);
1087 mutex_destroy(&xnfp->xnf_txlock);
1089 kmem_free(xnfp, sizeof (*xnfp));
1117 xnf_t *xnfp = arg;
1130 if (!xnfp->xnf_be_mcast_control)
1133 txp = kmem_cache_alloc(xnfp->xnf_tx_buf_cache, KM_SLEEP);
1135 mutex_enter(&xnfp->xnf_txlock);
1146 if (!xnfp->xnf_connected) {
1147 mutex_exit(&xnfp->xnf_txlock);
1159 n_slots = tx_slots_get(xnfp, 2, B_TRUE);
1162 slot = xnfp->xnf_tx_ring.req_prod_pvt;
1163 tidp = txid_get(xnfp);
1169 txrp = RING_GET_REQUEST(&xnfp->xnf_tx_ring, slot);
1171 RING_GET_REQUEST(&xnfp->xnf_tx_ring, slot + 1);
1186 xnfp->xnf_tx_ring.req_prod_pvt = slot + 2;
1188 mutex_enter(&xnfp->xnf_schedlock);
1189 xnfp->xnf_pending_multicast++;
1190 mutex_exit(&xnfp->xnf_schedlock);
1193 RING_PUSH_REQUESTS_AND_CHECK_NOTIFY(&xnfp->xnf_tx_ring,
1196 ec_notify_via_evtchn(xnfp->xnf_evtchn);
1199 cv_wait(&xnfp->xnf_cv_multicast,
1200 &xnfp->xnf_txlock);
1204 mutex_enter(&xnfp->xnf_schedlock);
1205 xnfp->xnf_pending_multicast--;
1206 mutex_exit(&xnfp->xnf_schedlock);
1210 txid_put(xnfp, tidp);
1212 mutex_exit(&xnfp->xnf_txlock);
1214 kmem_cache_free(xnfp->xnf_tx_buf_cache, txp);
1240 xnf_tx_clean_ring(xnf_t *xnfp)
1244 ASSERT(MUTEX_HELD(&xnfp->xnf_txlock));
1247 while (RING_HAS_UNCONSUMED_RESPONSES(&xnfp->xnf_tx_ring)) {
1250 cons = xnfp->xnf_tx_ring.rsp_cons;
1251 prod = xnfp->xnf_tx_ring.sring->rsp_prod;
1263 trp = RING_GET_RESPONSE(&xnfp->xnf_tx_ring, i);
1266 tidp = TX_ID_TO_TXID(xnfp, trp->id);
1286 gref_put(xnfp, txp->tx_txreq.gref);
1290 xnf_buf_put(xnfp, txp->tx_bdesc,
1295 txid_put(xnfp, tidp);
1296 kmem_cache_free(xnfp->xnf_tx_buf_cache, txp);
1303 cv_broadcast(&xnfp->xnf_cv_multicast);
1321 xnfp->xnf_tx_ring.rsp_cons = prod;
1326 RING_FINAL_CHECK_FOR_RESPONSES(&xnfp->xnf_tx_ring, work_to_do);
1330 return (RING_FREE_REQUESTS(&xnfp->xnf_tx_ring));
1339 xnf_tx_pullup(xnf_t *xnfp, mblk_t *mp)
1344 bd = xnf_buf_get(xnfp, KM_SLEEP, B_TRUE);
1360 xnfp->xnf_stat_tx_pullup++;
1441 tx_push_packets(xnf_t *xnfp, xnf_txbuf_t *txp)
1447 mutex_enter(&xnfp->xnf_txlock);
1449 ASSERT(xnfp->xnf_running);
1454 while (!xnfp->xnf_connected)
1455 cv_wait(&xnfp->xnf_cv_state, &xnfp->xnf_txlock);
1457 slots_free = tx_slots_get(xnfp, 1, B_FALSE);
1460 slot = xnfp->xnf_tx_ring.req_prod_pvt;
1466 tidp = txid_get(xnfp);
1469 txrp = RING_GET_REQUEST(&xnfp->xnf_tx_ring, slot);
1477 xnfp->xnf_stat_opackets++;
1478 xnfp->xnf_stat_obytes += txp->tx_txreq.size;
1486 xnfp->xnf_tx_ring.req_prod_pvt = slot;
1492 RING_PUSH_REQUESTS_AND_CHECK_NOTIFY(&xnfp->xnf_tx_ring,
1495 ec_notify_via_evtchn(xnfp->xnf_evtchn);
1497 mutex_exit(&xnfp->xnf_txlock);
1508 xnf_t *xnfp = arg;
1514 oeid = xvdi_get_oeid(xnfp->xnf_devinfo);
1539 xnfp->xnf_stat_tx_pagebndry++;
1553 ddi_get_instance(xnfp->xnf_devinfo), length);
1558 txp = kmem_cache_alloc(xnfp->xnf_tx_buf_cache, KM_SLEEP);
1567 txp->tx_bdesc = xnf_tx_pullup(xnfp, mp);
1569 kmem_cache_free(xnfp->xnf_tx_buf_cache, txp);
1595 ddi_get_instance(xnfp->xnf_devinfo),
1598 kmem_cache_free(xnfp->xnf_tx_buf_cache, txp);
1607 txp->tx_txreq.gref = gref_get(xnfp);
1611 kmem_cache_free(xnfp->xnf_tx_buf_cache, txp);
1637 xnfp->xnf_stat_tx_cksum_deferred++;
1687 head = tx_push_packets(xnfp, head);
1708 gref_put(xnfp, loop->tx_txreq.gref);
1712 xnf_buf_put(xnfp, loop->tx_bdesc, B_TRUE);
1720 kmem_cache_free(xnfp->xnf_tx_buf_cache, loop);
1743 mutex_enter(&xnfp->xnf_schedlock);
1744 xnfp->xnf_need_sched = B_TRUE;
1745 mutex_exit(&xnfp->xnf_schedlock);
1747 xnfp->xnf_stat_tx_defer++;
1760 xnf_t *xnfp = (xnf_t *)arg;
1764 mutex_enter(&xnfp->xnf_rxlock);
1769 if (!xnfp->xnf_connected) {
1770 mutex_exit(&xnfp->xnf_rxlock);
1771 xnfp->xnf_stat_unclaimed_interrupts++;
1782 xnf_rx_collect(xnfp);
1787 xnfp->xnf_rx_ring.sring->rsp_event =
1788 xnfp->xnf_rx_ring.rsp_cons + 1;
1791 } while (RING_HAS_UNCONSUMED_RESPONSES(&xnfp->xnf_rx_ring));
1793 if (xnfp->xnf_rx_new_buffers_posted) {
1801 RING_PUSH_REQUESTS_AND_CHECK_NOTIFY(&xnfp->xnf_rx_ring, notify);
1803 ec_notify_via_evtchn(xnfp->xnf_evtchn);
1804 xnfp->xnf_rx_new_buffers_posted = B_FALSE;
1807 mp = xnfp->xnf_rx_head;
1808 xnfp->xnf_rx_head = xnfp->xnf_rx_tail = NULL;
1810 xnfp->xnf_stat_interrupts++;
1811 mutex_exit(&xnfp->xnf_rxlock);
1814 mac_rx(xnfp->xnf_mh, NULL, mp);
1828 mutex_enter(&xnfp->xnf_schedlock);
1829 need_sched = xnfp->xnf_need_sched;
1830 clean_ring = need_sched || (xnfp->xnf_pending_multicast > 0);
1831 mutex_exit(&xnfp->xnf_schedlock);
1836 mutex_enter(&xnfp->xnf_txlock);
1837 free_slots = tx_slots_get(xnfp, 0, B_FALSE);
1840 mutex_enter(&xnfp->xnf_schedlock);
1841 xnfp->xnf_need_sched = B_FALSE;
1842 mutex_exit(&xnfp->xnf_schedlock);
1844 mac_tx_update(xnfp->xnf_mh);
1846 mutex_exit(&xnfp->xnf_txlock);
1858 xnf_t *xnfp = arg;
1863 ddi_get_instance(xnfp->xnf_devinfo), (void *)xnfp);
1866 mutex_enter(&xnfp->xnf_rxlock);
1867 mutex_enter(&xnfp->xnf_txlock);
1870 xnfp->xnf_running = B_TRUE;
1872 mutex_exit(&xnfp->xnf_txlock);
1873 mutex_exit(&xnfp->xnf_rxlock);
1882 xnf_t *xnfp = arg;
1887 ddi_get_instance(xnfp->xnf_devinfo), (void *)xnfp);
1890 mutex_enter(&xnfp->xnf_rxlock);
1891 mutex_enter(&xnfp->xnf_txlock);
1893 xnfp->xnf_running = B_FALSE;
1895 mutex_exit(&xnfp->xnf_txlock);
1896 mutex_exit(&xnfp->xnf_rxlock);
1903 xnf_rxbuf_hang(xnf_t *xnfp, xnf_buf_t *bdesc)
1908 ASSERT(MUTEX_HELD(&xnfp->xnf_rxlock));
1910 reqp = RING_GET_REQUEST(&xnfp->xnf_rx_ring,
1911 xnfp->xnf_rx_ring.req_prod_pvt);
1912 hang_ix = (RING_IDX) (reqp - RING_GET_REQUEST(&xnfp->xnf_rx_ring, 0));
1913 ASSERT(xnfp->xnf_rx_pkt_info[hang_ix] == NULL);
1918 xnfp->xnf_rx_pkt_info[hang_ix] = bdesc;
1919 xnfp->xnf_rx_ring.req_prod_pvt++;
1921 xnfp->xnf_rx_new_buffers_posted = B_TRUE;
1925 * Collect packets from the RX ring, storing them in `xnfp' for later
1929 xnf_rx_collect(xnf_t *xnfp)
1933 ASSERT(MUTEX_HELD(&xnfp->xnf_rxlock));
1946 while (RING_HAS_UNCONSUMED_RESPONSES(&xnfp->xnf_rx_ring)) {
1956 rxpkt = RING_GET_RESPONSE(&xnfp->xnf_rx_ring,
1957 xnfp->xnf_rx_ring.rsp_cons);
1967 bdesc = xnfp->xnf_rx_pkt_info[rxpkt->id];
1972 xnfp->xnf_rx_pkt_info[rxpkt->id] = NULL;
1979 if (!xnfp->xnf_running) {
1985 xnfp->xnf_stat_drop++;
1993 xnfp->xnf_stat_errrx++;
1997 xnfp->xnf_stat_runt++;
2000 xnfp->xnf_stat_mac_rcv_error++;
2003 xnfp->xnf_stat_norxbuf++;
2010 xvdi_get_oeid(xnfp->xnf_devinfo));
2015 off, len, xvdi_get_oeid(xnfp->xnf_devinfo));
2034 nbuf = xnf_buf_get(xnfp, KM_NOSLEEP, B_FALSE);
2046 xnfp->xnf_stat_rx_desballoc_fail++;
2047 xnfp->xnf_stat_norxbuf++;
2049 xnf_buf_put(xnfp, nbuf, B_FALSE);
2064 gref_put(xnfp, bdesc->grant_ref);
2081 xnfp->xnf_stat_rx_allocb_fail++;
2082 xnfp->xnf_stat_norxbuf++;
2093 xnf_rxbuf_hang(xnfp, bdesc);
2110 xnfp->xnf_stat_rx_cksum_no_need++;
2125 xnfp->xnf_stat_ipackets++;
2126 xnfp->xnf_stat_rbytes += len;
2129 xnfp->xnf_rx_ring.rsp_cons++;
2138 if (xnfp->xnf_rx_head == NULL) {
2139 ASSERT(xnfp->xnf_rx_tail == NULL);
2141 xnfp->xnf_rx_head = head;
2143 ASSERT(xnfp->xnf_rx_tail != NULL);
2145 xnfp->xnf_rx_tail->b_next = head;
2147 xnfp->xnf_rx_tail = tail;
2155 xnf_alloc_dma_resources(xnf_t *xnfp)
2157 dev_info_t *devinfo = xnfp->xnf_devinfo;
2171 DDI_DMA_SLEEP, 0, &xnfp->xnf_tx_ring_dma_handle) != DDI_SUCCESS)
2174 if (ddi_dma_mem_alloc(xnfp->xnf_tx_ring_dma_handle,
2177 &xnfp->xnf_tx_ring_dma_acchandle) != DDI_SUCCESS) {
2178 ddi_dma_free_handle(&xnfp->xnf_tx_ring_dma_handle);
2179 xnfp->xnf_tx_ring_dma_handle = NULL;
2183 if ((rc = ddi_dma_addr_bind_handle(xnfp->xnf_tx_ring_dma_handle, NULL,
2186 ddi_dma_mem_free(&xnfp->xnf_tx_ring_dma_acchandle);
2187 ddi_dma_free_handle(&xnfp->xnf_tx_ring_dma_handle);
2188 xnfp->xnf_tx_ring_dma_handle = NULL;
2189 xnfp->xnf_tx_ring_dma_acchandle = NULL;
2201 FRONT_RING_INIT(&xnfp->xnf_tx_ring, (netif_tx_sring_t *)rptr, PAGESIZE);
2202 xnfp->xnf_tx_ring_phys_addr = dma_cookie.dmac_laddress;
2208 DDI_DMA_SLEEP, 0, &xnfp->xnf_rx_ring_dma_handle) != DDI_SUCCESS)
2211 if (ddi_dma_mem_alloc(xnfp->xnf_rx_ring_dma_handle,
2214 &xnfp->xnf_rx_ring_dma_acchandle) != DDI_SUCCESS) {
2215 ddi_dma_free_handle(&xnfp->xnf_rx_ring_dma_handle);
2216 xnfp->xnf_rx_ring_dma_handle = NULL;
2220 if ((rc = ddi_dma_addr_bind_handle(xnfp->xnf_rx_ring_dma_handle, NULL,
2223 ddi_dma_mem_free(&xnfp->xnf_rx_ring_dma_acchandle);
2224 ddi_dma_free_handle(&xnfp->xnf_rx_ring_dma_handle);
2225 xnfp->xnf_rx_ring_dma_handle = NULL;
2226 xnfp->xnf_rx_ring_dma_acchandle = NULL;
2238 FRONT_RING_INIT(&xnfp->xnf_rx_ring, (netif_rx_sring_t *)rptr, PAGESIZE);
2239 xnfp->xnf_rx_ring_phys_addr = dma_cookie.dmac_laddress;
2245 ddi_get_instance(xnfp->xnf_devinfo));
2247 xnf_release_dma_resources(xnfp);
2255 xnf_release_dma_resources(xnf_t *xnfp)
2263 mutex_enter(&xnfp->xnf_rxlock);
2267 if ((bp = xnfp->xnf_rx_pkt_info[i]) == NULL)
2269 xnfp->xnf_rx_pkt_info[i] = NULL;
2270 xnf_buf_put(xnfp, bp, B_FALSE);
2272 mutex_exit(&xnfp->xnf_rxlock);
2275 if (xnfp->xnf_rx_ring_dma_acchandle != NULL) {
2276 (void) ddi_dma_unbind_handle(xnfp->xnf_rx_ring_dma_handle);
2277 ddi_dma_mem_free(&xnfp->xnf_rx_ring_dma_acchandle);
2278 ddi_dma_free_handle(&xnfp->xnf_rx_ring_dma_handle);
2279 xnfp->xnf_rx_ring_dma_acchandle = NULL;
2282 if (xnfp->xnf_tx_ring_dma_acchandle != NULL) {
2283 (void) ddi_dma_unbind_handle(xnfp->xnf_tx_ring_dma_handle);
2284 ddi_dma_mem_free(&xnfp->xnf_tx_ring_dma_acchandle);
2285 ddi_dma_free_handle(&xnfp->xnf_tx_ring_dma_handle);
2286 xnfp->xnf_tx_ring_dma_acchandle = NULL;
2295 xnf_release_mblks(xnf_t *xnfp)
2300 for (i = 0, tidp = &xnfp->xnf_tx_pkt_id[0];
2309 txid_put(xnfp, tidp);
2310 kmem_cache_free(xnfp->xnf_tx_buf_cache, txp);
2320 xnf_t *xnfp = arg;
2329 if (ddi_dma_alloc_handle(xnfp->xnf_devinfo, &buf_dma_attr,
2348 bdesc->xnfp = xnfp;
2353 bdesc->gen = xnfp->xnf_gen;
2355 atomic_inc_64(&xnfp->xnf_stat_buf_allocated);
2375 xnf_t *xnfp = arg;
2381 atomic_dec_64(&xnfp->xnf_stat_buf_allocated);
2385 xnf_buf_get(xnf_t *xnfp, int flags, boolean_t readonly)
2394 gref = gref_get(xnfp);
2398 bufp = kmem_cache_alloc(xnfp->xnf_buf_cache, flags);
2400 gref_put(xnfp, gref);
2408 if (bufp->gen != xnfp->xnf_gen)
2412 xvdi_get_oeid(bufp->xnfp->xnf_devinfo),
2415 atomic_inc_64(&xnfp->xnf_stat_buf_outstanding);
2421 xnf_buf_put(xnf_t *xnfp, xnf_buf_t *bufp, boolean_t readonly)
2426 gref_put(xnfp, bufp->grant_ref);
2430 kmem_cache_free(xnfp->xnf_buf_cache, bufp);
2432 atomic_dec_64(&xnfp->xnf_stat_buf_outstanding);
2442 bdesc->gen = bdesc->xnfp->xnf_gen;
2452 xnf_t *xnfp = bdesc->xnfp;
2454 xnf_buf_put(xnfp, bdesc, B_TRUE);
2462 xnf_t *xnfp = arg;
2467 if (ddi_dma_alloc_handle(xnfp->xnf_devinfo, &buf_dma_attr,
2508 xnf_t *xnfp;
2514 xnfp = ksp->ks_private;
2521 (knp++)->value.ui64 = xnfp->xnf_stat_tx_cksum_deferred;
2522 (knp++)->value.ui64 = xnfp->xnf_stat_rx_cksum_no_need;
2524 (knp++)->value.ui64 = xnfp->xnf_stat_interrupts;
2525 (knp++)->value.ui64 = xnfp->xnf_stat_unclaimed_interrupts;
2526 (knp++)->value.ui64 = xnfp->xnf_stat_tx_pullup;
2527 (knp++)->value.ui64 = xnfp->xnf_stat_tx_pagebndry;
2528 (knp++)->value.ui64 = xnfp->xnf_stat_tx_attempt;
2530 (knp++)->value.ui64 = xnfp->xnf_stat_buf_allocated;
2531 (knp++)->value.ui64 = xnfp->xnf_stat_buf_outstanding;
2532 (knp++)->value.ui64 = xnfp->xnf_stat_gref_outstanding;
2533 (knp++)->value.ui64 = xnfp->xnf_stat_gref_failure;
2534 (knp++)->value.ui64 = xnfp->xnf_stat_gref_peak;
2535 (knp++)->value.ui64 = xnfp->xnf_stat_rx_allocb_fail;
2536 (knp++)->value.ui64 = xnfp->xnf_stat_rx_desballoc_fail;
2542 xnf_kstat_init(xnf_t *xnfp)
2552 if ((xnfp->xnf_kstat_aux = kstat_create("xnf",
2553 ddi_get_instance(xnfp->xnf_devinfo),
2558 xnfp->xnf_kstat_aux->ks_private = xnfp;
2559 xnfp->xnf_kstat_aux->ks_update = xnf_kstat_aux_update;
2561 knp = xnfp->xnf_kstat_aux->ks_data;
2570 kstat_install(xnfp->xnf_kstat_aux);
2578 xnf_t *xnfp = arg;
2580 mutex_enter(&xnfp->xnf_rxlock);
2581 mutex_enter(&xnfp->xnf_txlock);
2585 *val = xnfp->xnf_stat_##r; \
2590 *val = xnfp->xnf_stat_##r; \
2617 mutex_exit(&xnfp->xnf_txlock);
2618 mutex_exit(&xnfp->xnf_rxlock);
2626 mutex_exit(&xnfp->xnf_txlock);
2627 mutex_exit(&xnfp->xnf_rxlock);
2676 xnf_t *xnfp = ddi_get_driver_private(dip);
2679 ASSERT(xnfp != NULL);
2692 xnf_read_config(xnfp);
2694 if (!xnfp->xnf_be_rx_copy) {
2698 (void) xvdi_switch_state(xnfp->xnf_devinfo,
2706 xnf_be_connect(xnfp);
2711 mac_unicst_update(xnfp->xnf_mh, xnfp->xnf_mac_addr);
2716 mutex_enter(&xnfp->xnf_rxlock);
2717 mutex_enter(&xnfp->xnf_txlock);
2719 xnfp->xnf_connected = B_TRUE;
2724 cv_broadcast(&xnfp->xnf_cv_state);
2726 mutex_exit(&xnfp->xnf_txlock);
2727 mutex_exit(&xnfp->xnf_rxlock);
2733 ec_notify_via_evtchn(xnfp->xnf_evtchn);
2741 (void) xnf_intr((caddr_t)xnfp);
2746 mac_link_update(xnfp->xnf_mh, LINK_STATE_UP);
2752 mac_multicast_refresh(xnfp->xnf_mh, NULL, xnfp, B_TRUE);