Lines Matching refs:rxq

221 	struct netfront_rxq 	*rxq;  member
294 xn_get_rx_mbuf(struct netfront_rxq *rxq, RING_IDX ri) in xn_get_rx_mbuf() argument
300 m = rxq->mbufs[i]; in xn_get_rx_mbuf()
301 rxq->mbufs[i] = NULL; in xn_get_rx_mbuf()
306 xn_get_rx_ref(struct netfront_rxq *rxq, RING_IDX ri) in xn_get_rx_ref() argument
309 grant_ref_t ref = rxq->grant_ref[i]; in xn_get_rx_ref()
312 rxq->grant_ref[i] = GRANT_REF_INVALID; in xn_get_rx_ref()
479 XN_RX_LOCK(&np->rxq[i]); in netfront_suspend()
484 XN_RX_UNLOCK(&np->rxq[i]); in netfront_suspend()
504 XN_RX_LOCK(&info->rxq[i]); in netfront_resume()
509 XN_RX_UNLOCK(&info->rxq[i]); in netfront_resume()
521 struct netfront_rxq *rxq, in write_queue_xenstore_keys() argument
531 KASSERT(rxq->id == txq->id, ("Mismatch between RX and TX queue ids")); in write_queue_xenstore_keys()
533 KASSERT(rxq->xen_intr_handle == txq->xen_intr_handle, in write_queue_xenstore_keys()
539 snprintf(path, path_size, "%s/queue-%u", node, rxq->id); in write_queue_xenstore_keys()
551 err = xs_printf(*xst, path, "rx-ring-ref","%u", rxq->ring_ref); in write_queue_xenstore_keys()
557 xen_intr_port(rxq->xen_intr_handle)); in write_queue_xenstore_keys()
613 err = write_queue_xenstore_keys(dev, &info->rxq[0], in talk_to_backend()
626 err = write_queue_xenstore_keys(dev, &info->rxq[i], in talk_to_backend()
684 xn_rxq_intr(struct netfront_rxq *rxq) in xn_rxq_intr() argument
687 XN_RX_LOCK(rxq); in xn_rxq_intr()
688 xn_rxeof(rxq); in xn_rxq_intr()
689 XN_RX_UNLOCK(rxq); in xn_rxq_intr()
725 disconnect_rxq(struct netfront_rxq *rxq) in disconnect_rxq() argument
728 xn_release_rx_bufs(rxq); in disconnect_rxq()
729 gnttab_free_grant_references(rxq->gref_head); in disconnect_rxq()
730 if (rxq->ring_ref != GRANT_REF_INVALID) { in disconnect_rxq()
731 gnttab_end_foreign_access(rxq->ring_ref, NULL); in disconnect_rxq()
732 rxq->ring_ref = GRANT_REF_INVALID; in disconnect_rxq()
739 rxq->xen_intr_handle = 0; in disconnect_rxq()
743 destroy_rxq(struct netfront_rxq *rxq) in destroy_rxq() argument
746 callout_drain(&rxq->rx_refill); in destroy_rxq()
747 free(rxq->ring.sring, M_DEVBUF); in destroy_rxq()
748 rxq->ring.sring = NULL; in destroy_rxq()
757 destroy_rxq(&np->rxq[i]); in destroy_rxqs()
759 free(np->rxq, M_DEVBUF); in destroy_rxqs()
760 np->rxq = NULL; in destroy_rxqs()
770 struct netfront_rxq *rxq; in setup_rxqs() local
772 info->rxq = malloc(sizeof(struct netfront_rxq) * num_queues, in setup_rxqs()
776 rxq = &info->rxq[q]; in setup_rxqs()
778 rxq->id = q; in setup_rxqs()
779 rxq->info = info; in setup_rxqs()
781 rxq->gref_head = GNTTAB_LIST_END; in setup_rxqs()
782 rxq->ring_ref = GRANT_REF_INVALID; in setup_rxqs()
783 rxq->ring.sring = NULL; in setup_rxqs()
784 snprintf(rxq->name, XN_QUEUE_NAME_LEN, "xnrx_%u", q); in setup_rxqs()
785 mtx_init(&rxq->lock, rxq->name, "netfront receive lock", in setup_rxqs()
789 rxq->mbufs[i] = NULL; in setup_rxqs()
790 rxq->grant_ref[i] = GRANT_REF_INVALID; in setup_rxqs()
796 &rxq->gref_head) != 0) { in setup_rxqs()
805 FRONT_RING_INIT(&rxq->ring, rxs, PAGE_SIZE); in setup_rxqs()
808 &rxq->ring_ref); in setup_rxqs()
814 callout_init(&rxq->rx_refill, 1); in setup_rxqs()
820 gnttab_free_grant_references(rxq->gref_head); in setup_rxqs()
821 free(rxq->ring.sring, M_DEVBUF); in setup_rxqs()
824 disconnect_rxq(&info->rxq[q]); in setup_rxqs()
825 destroy_rxq(&info->rxq[q]); in setup_rxqs()
828 free(info->rxq, M_DEVBUF); in setup_rxqs()
1007 if (info->rxq) in setup_device()
1023 info->rxq[q].xen_intr_handle = info->txq[q].xen_intr_handle; in setup_device()
1131 xn_alloc_one_rx_buffer(struct netfront_rxq *rxq) in xn_alloc_one_rx_buffer() argument
1144 xn_alloc_rx_buffers(struct netfront_rxq *rxq) in xn_alloc_rx_buffers() argument
1149 XN_RX_LOCK_ASSERT(rxq); in xn_alloc_rx_buffers()
1151 if (__predict_false(rxq->info->carrier == 0)) in xn_alloc_rx_buffers()
1154 for (req_prod = rxq->ring.req_prod_pvt; in xn_alloc_rx_buffers()
1155 req_prod - rxq->ring.rsp_cons < NET_RX_RING_SIZE; in xn_alloc_rx_buffers()
1163 m = xn_alloc_one_rx_buffer(rxq); in xn_alloc_rx_buffers()
1169 KASSERT(rxq->mbufs[id] == NULL, ("non-NULL xn_rx_chain")); in xn_alloc_rx_buffers()
1170 rxq->mbufs[id] = m; in xn_alloc_rx_buffers()
1172 ref = gnttab_claim_grant_reference(&rxq->gref_head); in xn_alloc_rx_buffers()
1175 rxq->grant_ref[id] = ref; in xn_alloc_rx_buffers()
1178 req = RING_GET_REQUEST(&rxq->ring, req_prod); in xn_alloc_rx_buffers()
1181 xenbus_get_otherend_id(rxq->info->xbdev), pfn, 0); in xn_alloc_rx_buffers()
1186 rxq->ring.req_prod_pvt = req_prod; in xn_alloc_rx_buffers()
1189 if (req_prod - rxq->ring.rsp_cons < NET_RX_SLOTS_MIN) { in xn_alloc_rx_buffers()
1190 callout_reset_curcpu(&rxq->rx_refill, hz/10, in xn_alloc_rx_buffers()
1191 xn_alloc_rx_buffers_callout, rxq); in xn_alloc_rx_buffers()
1197 RING_PUSH_REQUESTS_AND_CHECK_NOTIFY(&rxq->ring, notify); in xn_alloc_rx_buffers()
1199 xen_intr_signal(rxq->xen_intr_handle); in xn_alloc_rx_buffers()
1204 struct netfront_rxq *rxq; in xn_alloc_rx_buffers_callout() local
1206 rxq = (struct netfront_rxq *)arg; in xn_alloc_rx_buffers_callout()
1207 XN_RX_LOCK(rxq); in xn_alloc_rx_buffers_callout()
1208 xn_alloc_rx_buffers(rxq); in xn_alloc_rx_buffers_callout()
1209 XN_RX_UNLOCK(rxq); in xn_alloc_rx_buffers_callout()
1213 xn_release_rx_bufs(struct netfront_rxq *rxq) in xn_release_rx_bufs() argument
1219 m = rxq->mbufs[i]; in xn_release_rx_bufs()
1224 ref = rxq->grant_ref[i]; in xn_release_rx_bufs()
1229 gnttab_release_grant_reference(&rxq->gref_head, ref); in xn_release_rx_bufs()
1230 rxq->mbufs[i] = NULL; in xn_release_rx_bufs()
1231 rxq->grant_ref[i] = GRANT_REF_INVALID; in xn_release_rx_bufs()
1237 xn_rxeof(struct netfront_rxq *rxq) in xn_rxeof() argument
1240 struct netfront_info *np = rxq->info; in xn_rxeof()
1242 struct lro_ctrl *lro = &rxq->lro; in xn_rxeof()
1252 XN_RX_LOCK_ASSERT(rxq); in xn_rxeof()
1264 rp = rxq->ring.sring->rsp_prod; in xn_rxeof()
1267 i = rxq->ring.rsp_cons; in xn_rxeof()
1269 memcpy(rx, RING_GET_RESPONSE(&rxq->ring, i), sizeof(*rx)); in xn_rxeof()
1273 err = xn_get_responses(rxq, &rinfo, rp, &i, &m); in xn_rxeof()
1308 rxq->ring.rsp_cons = i; in xn_rxeof()
1310 xn_alloc_rx_buffers(rxq); in xn_rxeof()
1312 RING_FINAL_CHECK_FOR_RESPONSES(&rxq->ring, work_to_do); in xn_rxeof()
1429 struct netfront_rxq *rxq = &np->rxq[txq->id]; in xn_intr() local
1432 xn_rxq_intr(rxq); in xn_intr()
1437 xn_move_rx_slot(struct netfront_rxq *rxq, struct mbuf *m, in xn_move_rx_slot() argument
1440 int new = xn_rxidx(rxq->ring.req_prod_pvt); in xn_move_rx_slot()
1442 KASSERT(rxq->mbufs[new] == NULL, ("mbufs != NULL")); in xn_move_rx_slot()
1443 rxq->mbufs[new] = m; in xn_move_rx_slot()
1444 rxq->grant_ref[new] = ref; in xn_move_rx_slot()
1445 RING_GET_REQUEST(&rxq->ring, rxq->ring.req_prod_pvt)->id = new; in xn_move_rx_slot()
1446 RING_GET_REQUEST(&rxq->ring, rxq->ring.req_prod_pvt)->gref = ref; in xn_move_rx_slot()
1447 rxq->ring.req_prod_pvt++; in xn_move_rx_slot()
1451 xn_get_extras(struct netfront_rxq *rxq, in xn_get_extras() argument
1468 RING_GET_RESPONSE(&rxq->ring, ++(*cons)); in xn_get_extras()
1477 m = xn_get_rx_mbuf(rxq, *cons); in xn_get_extras()
1478 ref = xn_get_rx_ref(rxq, *cons); in xn_get_extras()
1479 xn_move_rx_slot(rxq, m, ref); in xn_get_extras()
1486 xn_get_responses(struct netfront_rxq *rxq, in xn_get_responses() argument
1493 grant_ref_t ref = xn_get_rx_ref(rxq, *cons); in xn_get_responses()
1498 m0 = m = m_prev = xn_get_rx_mbuf(rxq, *cons); in xn_get_responses()
1501 err = xn_get_extras(rxq, extras, rp, cons); in xn_get_responses()
1516 xn_move_rx_slot(rxq, m, ref); in xn_get_responses()
1538 gnttab_release_grant_reference(&rxq->gref_head, ref); in xn_get_responses()
1566 rx = RING_GET_RESPONSE(&rxq->ring, *cons + frags); in xn_get_responses()
1567 m = xn_get_rx_mbuf(rxq, *cons + frags); in xn_get_responses()
1583 ref = xn_get_rx_ref(rxq, *cons + frags); in xn_get_responses()
1781 struct netfront_rxq *rxq; in xn_ifinit_locked() local
1793 rxq = &np->rxq[i]; in xn_ifinit_locked()
1794 XN_RX_LOCK(rxq); in xn_ifinit_locked()
1795 xn_alloc_rx_buffers(rxq); in xn_ifinit_locked()
1796 rxq->ring.sring->rsp_event = rxq->ring.rsp_cons + 1; in xn_ifinit_locked()
1797 if (RING_HAS_UNCONSUMED_RESPONSES(&rxq->ring)) in xn_ifinit_locked()
1798 xn_rxeof(rxq); in xn_ifinit_locked()
1799 XN_RX_UNLOCK(rxq); in xn_ifinit_locked()
1965 xn_rebuild_rx_bufs(struct netfront_rxq *rxq) in xn_rebuild_rx_bufs() argument
1975 if (rxq->mbufs[i] == NULL) in xn_rebuild_rx_bufs()
1978 m = rxq->mbufs[requeue_idx] = xn_get_rx_mbuf(rxq, i); in xn_rebuild_rx_bufs()
1979 ref = rxq->grant_ref[requeue_idx] = xn_get_rx_ref(rxq, i); in xn_rebuild_rx_bufs()
1981 req = RING_GET_REQUEST(&rxq->ring, requeue_idx); in xn_rebuild_rx_bufs()
1985 xenbus_get_otherend_id(rxq->info->xbdev), in xn_rebuild_rx_bufs()
1994 rxq->ring.req_prod_pvt = requeue_idx; in xn_rebuild_rx_bufs()
2003 struct netfront_rxq *rxq; in xn_connect() local
2032 rxq = &np->rxq[i]; in xn_connect()
2033 xn_rebuild_rx_bufs(rxq); in xn_connect()
2050 struct netfront_rxq *rxq; in xn_kick_rings() local
2056 rxq = &np->rxq[i]; in xn_kick_rings()
2061 XN_RX_LOCK(rxq); in xn_kick_rings()
2062 xn_alloc_rx_buffers(rxq); in xn_kick_rings()
2063 XN_RX_UNLOCK(rxq); in xn_kick_rings()
2136 tcp_lro_free(&np->rxq[i].lro); in xn_configure_features()
2141 err = tcp_lro_init(&np->rxq[i].lro); in xn_configure_features()
2148 np->rxq[i].lro.ifp = ifp; in xn_configure_features()
2370 free(np->rxq, M_DEVBUF); in netif_free()
2384 XN_RX_LOCK(&np->rxq[i]); in netif_disconnect_backend()
2389 XN_RX_UNLOCK(&np->rxq[i]); in netif_disconnect_backend()
2394 disconnect_rxq(&np->rxq[i]); in netif_disconnect_backend()