Lines Matching +full:rx +full:- +full:m
3 /*-
6 * Copyright (c) 2015-2016 Andriy Voskoboinyk <avos@FreeBSD.org>
80 if (!(sc->sc_flags & RTWN_RUNNING)) in rtwn_rx_check_pre_alloc()
81 return (-1); in rtwn_rx_check_pre_alloc()
83 rxdw0 = le32toh(stat->rxdw0); in rtwn_rx_check_pre_alloc()
86 * This should not happen since we setup our Rx filter in rtwn_rx_check_pre_alloc()
90 "%s: RX flags error (%s)\n", __func__, in rtwn_rx_check_pre_alloc()
92 return (-1); in rtwn_rx_check_pre_alloc()
98 * Should not happen (because of Rx filter setup). in rtwn_rx_check_pre_alloc()
102 return (-1); in rtwn_rx_check_pre_alloc()
112 struct ieee80211com *ic = &sc->sc_ic; in rtwn_rx_copy_to_mbuf()
113 struct mbuf *m; in rtwn_rx_copy_to_mbuf() local
117 /* Dump Rx descriptor. */ in rtwn_rx_copy_to_mbuf()
120 __func__, le32toh(stat->rxdw0), le32toh(stat->rxdw1), in rtwn_rx_copy_to_mbuf()
121 le32toh(stat->rxdw2), le32toh(stat->rxdw3), le32toh(stat->rxdw4), in rtwn_rx_copy_to_mbuf()
122 le32toh(stat->tsf_low)); in rtwn_rx_copy_to_mbuf()
127 m = m_get2(totlen, M_NOWAIT, MT_DATA, M_PKTHDR); in rtwn_rx_copy_to_mbuf()
128 if (__predict_false(m == NULL)) { in rtwn_rx_copy_to_mbuf()
129 device_printf(sc->sc_dev, "%s: could not allocate RX mbuf\n", in rtwn_rx_copy_to_mbuf()
135 memcpy(mtod(m, uint8_t *), (uint8_t *)stat, totlen); in rtwn_rx_copy_to_mbuf()
136 m->m_pkthdr.len = m->m_len = totlen; in rtwn_rx_copy_to_mbuf()
138 if (rtwn_check_frame(sc, m) != 0) { in rtwn_rx_copy_to_mbuf()
139 m_freem(m); in rtwn_rx_copy_to_mbuf()
143 return (m); in rtwn_rx_copy_to_mbuf()
145 counter_u64_add(ic->ic_ierrors, 1); in rtwn_rx_copy_to_mbuf()
153 struct rtwn_softc *sc = &uc->uc_sc; in rtwn_rxeof_fragmented()
154 struct ieee80211com *ic = &sc->sc_ic; in rtwn_rxeof_fragmented()
155 struct rtwn_rx_stat_common *stat = &uc->uc_rx_stat; in rtwn_rxeof_fragmented()
161 /* Check if Rx descriptor is not truncated. */ in rtwn_rxeof_fragmented()
162 if (uc->uc_rx_stat_len < sizeof(*stat)) { in rtwn_rxeof_fragmented()
163 min_len = min(sizeof(*stat) - uc->uc_rx_stat_len, len); in rtwn_rxeof_fragmented()
164 memcpy((uint8_t *)stat + uc->uc_rx_stat_len, buf, min_len); in rtwn_rxeof_fragmented()
166 uc->uc_rx_stat_len += min_len; in rtwn_rxeof_fragmented()
168 len -= min_len; in rtwn_rxeof_fragmented()
170 if (uc->uc_rx_stat_len < sizeof(*stat)) in rtwn_rxeof_fragmented()
173 KASSERT(data->m == NULL, ("%s: data->m != NULL!\n", __func__)); in rtwn_rxeof_fragmented()
176 /* Dump Rx descriptor. */ in rtwn_rxeof_fragmented()
179 "tsfl %08X\n", __func__, le32toh(stat->rxdw0), in rtwn_rxeof_fragmented()
180 le32toh(stat->rxdw1), le32toh(stat->rxdw2), in rtwn_rxeof_fragmented()
181 le32toh(stat->rxdw3), le32toh(stat->rxdw4), in rtwn_rxeof_fragmented()
182 le32toh(stat->tsf_low)); in rtwn_rxeof_fragmented()
185 rxdw0 = le32toh(stat->rxdw0); in rtwn_rxeof_fragmented()
191 data->m = m_getm(NULL, totlen, M_NOWAIT, MT_DATA); in rtwn_rxeof_fragmented()
192 if (data->m != NULL) { in rtwn_rxeof_fragmented()
193 m_copyback(data->m, 0, uc->uc_rx_stat_len, in rtwn_rxeof_fragmented()
196 if (rtwn_check_frame(sc, data->m) != 0) { in rtwn_rxeof_fragmented()
197 m_freem(data->m); in rtwn_rxeof_fragmented()
198 data->m = NULL; in rtwn_rxeof_fragmented()
199 counter_u64_add(ic->ic_ierrors, 1); in rtwn_rxeof_fragmented()
202 counter_u64_add(ic->ic_ierrors, 1); in rtwn_rxeof_fragmented()
204 counter_u64_add(ic->ic_ierrors, 1); in rtwn_rxeof_fragmented()
206 uc->uc_rx_off = sizeof(*stat); in rtwn_rxeof_fragmented()
210 min_len = min(totlen - uc->uc_rx_off, len); in rtwn_rxeof_fragmented()
211 if (data->m != NULL) in rtwn_rxeof_fragmented()
212 m_copyback(data->m, uc->uc_rx_off, min_len, buf); in rtwn_rxeof_fragmented()
214 uc->uc_rx_off += min_len; in rtwn_rxeof_fragmented()
215 if (uc->uc_rx_off == totlen) { in rtwn_rxeof_fragmented()
218 orig_len - len + min_len, orig_len); in rtwn_rxeof_fragmented()
219 min_len -= (orig_len - len); in rtwn_rxeof_fragmented()
224 uc->uc_rx_stat_len = 0; in rtwn_rxeof_fragmented()
225 uc->uc_rx_off = 0; in rtwn_rxeof_fragmented()
227 len -= min_len; in rtwn_rxeof_fragmented()
230 if (uc->uc_rx_stat_len == 0) in rtwn_rxeof_fragmented()
242 struct mbuf *m, *m0 = NULL; in rtwn_rxeof() local
247 if (data->m != NULL) { in rtwn_rxeof()
248 m0 = m = data->m; in rtwn_rxeof()
249 data->m = NULL; in rtwn_rxeof()
255 rxdw0 = le32toh(stat->rxdw0); in rtwn_rxeof()
273 m0 = m = rtwn_rx_copy_to_mbuf(sc, stat, totlen); in rtwn_rxeof()
275 m->m_nextpkt = rtwn_rx_copy_to_mbuf(sc, stat, totlen); in rtwn_rxeof()
276 if (m->m_nextpkt != NULL) in rtwn_rxeof()
277 m = m->m_nextpkt; in rtwn_rxeof()
283 len -= totlen; in rtwn_rxeof()
296 struct rtwn_softc *sc = &uc->uc_sc; in rtwn_report_intr()
297 struct ieee80211com *ic = &sc->sc_ic; in rtwn_report_intr()
304 uc->uc_rx_stat_len == 0)) { in rtwn_report_intr()
305 counter_u64_add(ic->ic_ierrors, 1); in rtwn_report_intr()
309 buf = data->buf; in rtwn_report_intr()
310 if (uc->uc_rx_stat_len > 0) in rtwn_report_intr()
311 return (rtwn_rxeof_fragmented(uc, data, data->buf, len)); in rtwn_report_intr()
317 if (sc->sc_ratectl != RTWN_RATECTL_NET80211) { in rtwn_report_intr()
319 device_printf(sc->sc_dev, in rtwn_report_intr()
321 __func__, sc->sc_ratectl); in rtwn_report_intr()
333 if (sc->sc_tx_n_active > 0 && --sc->sc_tx_n_active <= 1) in rtwn_report_intr()
338 if (sc->sc_ratectl != RTWN_RATECTL_NET80211) { in rtwn_report_intr()
340 device_printf(sc->sc_dev, in rtwn_report_intr()
342 __func__, sc->sc_ratectl); in rtwn_report_intr()
354 if (sc->sc_tx_n_active > 0 && --sc->sc_tx_n_active <= 1) in rtwn_report_intr()
363 KASSERT(0, ("unknown Rx classification code")); in rtwn_report_intr()
371 rtwn_rx_frame(struct rtwn_softc *sc, struct mbuf *m) in rtwn_rx_frame() argument
376 m_copydata(m, 0, sizeof(stat), (caddr_t)&stat); in rtwn_rx_frame()
377 m_adj(m, sizeof(stat)); in rtwn_rx_frame()
379 return (rtwn_rx_common(sc, m, &stat)); in rtwn_rx_frame()
386 struct rtwn_softc *sc = &uc->uc_sc; in rtwn_bulk_rx_callback()
387 struct ieee80211com *ic = &sc->sc_ic; in rtwn_bulk_rx_callback()
389 struct mbuf *m0, *m = NULL, *next; in rtwn_bulk_rx_callback() local
396 data = STAILQ_FIRST(&uc->uc_rx_active); in rtwn_bulk_rx_callback()
399 STAILQ_REMOVE_HEAD(&uc->uc_rx_active, next); in rtwn_bulk_rx_callback()
400 m = rtwn_report_intr(uc, xfer, data); in rtwn_bulk_rx_callback()
401 STAILQ_INSERT_TAIL(&uc->uc_rx_inactive, data, next); in rtwn_bulk_rx_callback()
405 data = STAILQ_FIRST(&uc->uc_rx_inactive); in rtwn_bulk_rx_callback()
407 KASSERT(m == NULL, ("mbuf isn't NULL")); in rtwn_bulk_rx_callback()
410 STAILQ_REMOVE_HEAD(&uc->uc_rx_inactive, next); in rtwn_bulk_rx_callback()
411 STAILQ_INSERT_TAIL(&uc->uc_rx_active, data, next); in rtwn_bulk_rx_callback()
412 usbd_xfer_set_frame_data(xfer, 0, data->buf, in rtwn_bulk_rx_callback()
421 m0 = m; in rtwn_bulk_rx_callback()
422 while (m != NULL) { in rtwn_bulk_rx_callback()
423 M_ASSERTPKTHDR(m); in rtwn_bulk_rx_callback()
424 m->m_pkthdr.PH_loc.ptr = rtwn_rx_frame(sc, m); in rtwn_bulk_rx_callback()
425 m = m->m_nextpkt; in rtwn_bulk_rx_callback()
428 m = m0; in rtwn_bulk_rx_callback()
429 while (m != NULL) { in rtwn_bulk_rx_callback()
430 next = m->m_nextpkt; in rtwn_bulk_rx_callback()
431 m->m_nextpkt = NULL; in rtwn_bulk_rx_callback()
433 ni = m->m_pkthdr.PH_loc.ptr; in rtwn_bulk_rx_callback()
434 m->m_pkthdr.PH_loc.ptr = NULL; in rtwn_bulk_rx_callback()
436 (void)ieee80211_input_mimo(ni, m); in rtwn_bulk_rx_callback()
439 (void)ieee80211_input_mimo_all(ic, m); in rtwn_bulk_rx_callback()
441 m = next; in rtwn_bulk_rx_callback()
447 data = STAILQ_FIRST(&uc->uc_rx_active); in rtwn_bulk_rx_callback()
449 STAILQ_REMOVE_HEAD(&uc->uc_rx_active, next); in rtwn_bulk_rx_callback()
450 STAILQ_INSERT_TAIL(&uc->uc_rx_inactive, data, next); in rtwn_bulk_rx_callback()
456 counter_u64_add(ic->ic_ierrors, 1); in rtwn_bulk_rx_callback()
462 /* Kick-start more transmit in case we stalled */ in rtwn_bulk_rx_callback()