* * Initialize a free list and its buffers. * **********************************************************************/
| 2228 | * |
| 2229 | **********************************************************************/ |
| 2230 | static int |
| 2231 | iflib_fl_setup(iflib_fl_t fl) |
| 2232 | { |
| 2233 | iflib_rxq_t rxq = fl->ifl_rxq; |
| 2234 | if_ctx_t ctx = rxq->ifr_ctx; |
| 2235 | if_softc_ctx_t scctx = &ctx->ifc_softc_ctx; |
| 2236 | int qidx; |
| 2237 | |
| 2238 | bit_nclear(fl->ifl_rx_bitmap, 0, fl->ifl_size - 1); |
| 2239 | /* |
| 2240 | ** Free current RX buffer structs and their mbufs |
| 2241 | */ |
| 2242 | iflib_fl_bufs_free(fl); |
| 2243 | /* Now replenish the mbufs */ |
| 2244 | MPASS(fl->ifl_credits == 0); |
| 2245 | qidx = rxq->ifr_fl_offset + fl->ifl_id; |
| 2246 | if (scctx->isc_rxd_buf_size[qidx] != 0) |
| 2247 | fl->ifl_buf_size = scctx->isc_rxd_buf_size[qidx]; |
| 2248 | else |
| 2249 | fl->ifl_buf_size = ctx->ifc_rx_mbuf_sz; |
| 2250 | /* |
| 2251 | * ifl_buf_size may be a driver-supplied value, so pull it up |
| 2252 | * to the selected mbuf size. |
| 2253 | */ |
| 2254 | fl->ifl_buf_size = iflib_get_mbuf_size_for(fl->ifl_buf_size); |
| 2255 | if (fl->ifl_buf_size > ctx->ifc_max_fl_buf_size) |
| 2256 | ctx->ifc_max_fl_buf_size = fl->ifl_buf_size; |
| 2257 | fl->ifl_cltype = m_gettype(fl->ifl_buf_size); |
| 2258 | fl->ifl_zone = m_getzone(fl->ifl_buf_size); |
| 2259 | |
| 2260 | /* |
| 2261 | * Avoid pre-allocating zillions of clusters to an idle card |
| 2262 | * potentially speeding up attach. In any case make sure |
| 2263 | * to leave a descriptor unavailable. See the comment in |
| 2264 | * iflib_fl_refill_all(). |
| 2265 | */ |
| 2266 | MPASS(fl->ifl_size > 0); |
| 2267 | (void)iflib_fl_refill(ctx, fl, min(128, fl->ifl_size - 1)); |
| 2268 | if (min(128, fl->ifl_size - 1) != fl->ifl_credits) |
| 2269 | return (ENOBUFS); |
| 2270 | /* |
| 2271 | * handle failure |
| 2272 | */ |
| 2273 | MPASS(rxq != NULL); |
| 2274 | MPASS(fl->ifl_ifdi != NULL); |
| 2275 | bus_dmamap_sync(fl->ifl_ifdi->idi_tag, fl->ifl_ifdi->idi_map, |
| 2276 | BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); |
| 2277 | return (0); |
| 2278 | } |
| 2279 | |
| 2280 | /********************************************************************* |
| 2281 | * |
no test coverage detected