Lines Matching refs:chan
129 msgdma_next_desc(struct msgdma_channel *chan, uint32_t curidx) in msgdma_next_desc() argument
132 return ((curidx + 1) % chan->descs_num); in msgdma_next_desc()
141 struct msgdma_channel *chan; in msgdma_intr() local
147 chan = &sc->channels[0]; in msgdma_intr()
148 xchan = chan->xchan; in msgdma_intr()
158 while (chan->idx_tail != chan->idx_head) { in msgdma_intr()
160 chan->idx_tail, chan->idx_head); in msgdma_intr()
161 bus_dmamap_sync(chan->dma_tag, chan->dma_map[chan->idx_tail], in msgdma_intr()
164 desc = chan->descs[chan->idx_tail]; in msgdma_intr()
174 chan->idx_tail = msgdma_next_desc(chan, chan->idx_tail); in msgdma_intr()
175 atomic_subtract_int(&chan->descs_used_count, 1); in msgdma_intr()
183 xdma_callback(chan->xchan, &status); in msgdma_intr()
288 struct msgdma_channel *chan; in msgdma_dmamap_cb() local
290 chan = (struct msgdma_channel *)arg; in msgdma_dmamap_cb()
291 KASSERT(chan != NULL, ("xchan is NULL")); in msgdma_dmamap_cb()
294 chan->map_err = 1; in msgdma_dmamap_cb()
298 chan->descs_phys[chan->map_descr].ds_addr = segs[0].ds_addr; in msgdma_dmamap_cb()
299 chan->descs_phys[chan->map_descr].ds_len = segs[0].ds_len; in msgdma_dmamap_cb()
302 chan->map_descr, segs[0].ds_addr, segs[0].ds_len); in msgdma_dmamap_cb()
306 msgdma_desc_free(struct msgdma_softc *sc, struct msgdma_channel *chan) in msgdma_desc_free() argument
312 nsegments = chan->descs_num; in msgdma_desc_free()
315 desc = chan->descs[i]; in msgdma_desc_free()
316 bus_dmamap_unload(chan->dma_tag, chan->dma_map[i]); in msgdma_desc_free()
317 bus_dmamem_free(chan->dma_tag, desc, chan->dma_map[i]); in msgdma_desc_free()
320 bus_dma_tag_destroy(chan->dma_tag); in msgdma_desc_free()
321 free(chan->descs, M_DEVBUF); in msgdma_desc_free()
322 free(chan->dma_map, M_DEVBUF); in msgdma_desc_free()
323 free(chan->descs_phys, M_DEVBUF); in msgdma_desc_free()
329 msgdma_desc_alloc(struct msgdma_softc *sc, struct msgdma_channel *chan, in msgdma_desc_alloc() argument
336 nsegments = chan->descs_num; in msgdma_desc_alloc()
349 &chan->dma_tag); in msgdma_desc_alloc()
357 chan->descs = malloc(nsegments * sizeof(struct msgdma_desc *), in msgdma_desc_alloc()
359 chan->dma_map = malloc(nsegments * sizeof(bus_dmamap_t), in msgdma_desc_alloc()
361 chan->descs_phys = malloc(nsegments * sizeof(bus_dma_segment_t), in msgdma_desc_alloc()
366 err = bus_dmamem_alloc(chan->dma_tag, (void **)&chan->descs[i], in msgdma_desc_alloc()
367 BUS_DMA_WAITOK | BUS_DMA_ZERO, &chan->dma_map[i]); in msgdma_desc_alloc()
375 chan->map_err = 0; in msgdma_desc_alloc()
376 chan->map_descr = i; in msgdma_desc_alloc()
377 err = bus_dmamap_load(chan->dma_tag, chan->dma_map[i], chan->descs[i], in msgdma_desc_alloc()
378 desc_size, msgdma_dmamap_cb, chan, BUS_DMA_WAITOK); in msgdma_desc_alloc()
385 if (chan->map_err != 0) { in msgdma_desc_alloc()
398 struct msgdma_channel *chan; in msgdma_channel_alloc() local
405 chan = &sc->channels[i]; in msgdma_channel_alloc()
406 if (chan->used == 0) { in msgdma_channel_alloc()
407 chan->xchan = xchan; in msgdma_channel_alloc()
408 xchan->chan = (void *)chan; in msgdma_channel_alloc()
411 chan->index = i; in msgdma_channel_alloc()
412 chan->sc = sc; in msgdma_channel_alloc()
413 chan->used = 1; in msgdma_channel_alloc()
414 chan->idx_head = 0; in msgdma_channel_alloc()
415 chan->idx_tail = 0; in msgdma_channel_alloc()
416 chan->descs_used_count = 0; in msgdma_channel_alloc()
417 chan->descs_num = 1024; in msgdma_channel_alloc()
429 struct msgdma_channel *chan; in msgdma_channel_free() local
434 chan = (struct msgdma_channel *)xchan->chan; in msgdma_channel_free()
436 msgdma_desc_free(sc, chan); in msgdma_channel_free()
438 chan->used = 0; in msgdma_channel_free()
447 struct msgdma_channel *chan; in msgdma_channel_capacity() local
450 chan = (struct msgdma_channel *)xchan->chan; in msgdma_channel_capacity()
453 c = (chan->descs_num - chan->descs_used_count - 1); in msgdma_channel_capacity()
464 struct msgdma_channel *chan; in msgdma_channel_submit_sg() local
475 chan = (struct msgdma_channel *)xchan->chan; in msgdma_channel_submit_sg()
485 desc = chan->descs[chan->idx_head]; in msgdma_channel_submit_sg()
514 tmp = chan->idx_head; in msgdma_channel_submit_sg()
516 atomic_add_int(&chan->descs_used_count, 1); in msgdma_channel_submit_sg()
517 chan->idx_head = msgdma_next_desc(chan, chan->idx_head); in msgdma_channel_submit_sg()
521 bus_dmamap_sync(chan->dma_tag, chan->dma_map[tmp], in msgdma_channel_submit_sg()
531 struct msgdma_channel *chan; in msgdma_channel_prep_sg() local
543 chan = (struct msgdma_channel *)xchan->chan; in msgdma_channel_prep_sg()
545 ret = msgdma_desc_alloc(sc, chan, sizeof(struct msgdma_desc), 16); in msgdma_channel_prep_sg()
552 for (i = 0; i < chan->descs_num; i++) { in msgdma_channel_prep_sg()
553 desc = chan->descs[i]; in msgdma_channel_prep_sg()
555 if (i == (chan->descs_num - 1)) { in msgdma_channel_prep_sg()
556 desc->next = htole32(chan->descs_phys[0].ds_addr); in msgdma_channel_prep_sg()
558 desc->next = htole32(chan->descs_phys[i+1].ds_addr); in msgdma_channel_prep_sg()
565 addr = chan->descs_phys[0].ds_addr; in msgdma_channel_prep_sg()
580 struct msgdma_channel *chan; in msgdma_channel_control() local
585 chan = (struct msgdma_channel *)xchan->chan; in msgdma_channel_control()