[iwm] Move iwm_dma_contig_alloc/_free functions to if_iwm_util.c.
Obtained from: dragonflybsd.git 83a1185edeede081051a6c00417d4c5a8f5988eb
This commit is contained in:
parent
2fd963796d
commit
b28a6ab3bd
@ -239,10 +239,6 @@ static int iwm_firmware_store_section(struct iwm_softc *,
|
||||
static int iwm_set_default_calib(struct iwm_softc *, const void *);
|
||||
static void iwm_fw_info_free(struct iwm_fw_info *);
|
||||
static int iwm_read_firmware(struct iwm_softc *, enum iwm_ucode_type);
|
||||
static void iwm_dma_map_addr(void *, bus_dma_segment_t *, int, int);
|
||||
static int iwm_dma_contig_alloc(bus_dma_tag_t, struct iwm_dma_info *,
|
||||
bus_size_t, bus_size_t);
|
||||
static void iwm_dma_contig_free(struct iwm_dma_info *);
|
||||
static int iwm_alloc_fwmem(struct iwm_softc *);
|
||||
static int iwm_alloc_sched(struct iwm_softc *);
|
||||
static int iwm_alloc_kw(struct iwm_softc *);
|
||||
@ -893,71 +889,6 @@ iwm_read_firmware(struct iwm_softc *sc, enum iwm_ucode_type ucode_type)
|
||||
* DMA resource routines
|
||||
*/
|
||||
|
||||
static void
|
||||
iwm_dma_map_addr(void *arg, bus_dma_segment_t *segs, int nsegs, int error)
|
||||
{
|
||||
if (error != 0)
|
||||
return;
|
||||
KASSERT(nsegs == 1, ("too many DMA segments, %d should be 1", nsegs));
|
||||
*(bus_addr_t *)arg = segs[0].ds_addr;
|
||||
}
|
||||
|
||||
static int
|
||||
iwm_dma_contig_alloc(bus_dma_tag_t tag, struct iwm_dma_info *dma,
|
||||
bus_size_t size, bus_size_t alignment)
|
||||
{
|
||||
int error;
|
||||
|
||||
dma->tag = NULL;
|
||||
dma->map = NULL;
|
||||
dma->size = size;
|
||||
dma->vaddr = NULL;
|
||||
|
||||
error = bus_dma_tag_create(tag, alignment,
|
||||
0, BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, size,
|
||||
1, size, 0, NULL, NULL, &dma->tag);
|
||||
if (error != 0)
|
||||
goto fail;
|
||||
|
||||
error = bus_dmamem_alloc(dma->tag, (void **)&dma->vaddr,
|
||||
BUS_DMA_NOWAIT | BUS_DMA_ZERO | BUS_DMA_COHERENT, &dma->map);
|
||||
if (error != 0)
|
||||
goto fail;
|
||||
|
||||
error = bus_dmamap_load(dma->tag, dma->map, dma->vaddr, size,
|
||||
iwm_dma_map_addr, &dma->paddr, BUS_DMA_NOWAIT);
|
||||
if (error != 0) {
|
||||
bus_dmamem_free(dma->tag, dma->vaddr, dma->map);
|
||||
dma->vaddr = NULL;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
bus_dmamap_sync(dma->tag, dma->map, BUS_DMASYNC_PREWRITE);
|
||||
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
iwm_dma_contig_free(dma);
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
static void
|
||||
iwm_dma_contig_free(struct iwm_dma_info *dma)
|
||||
{
|
||||
if (dma->vaddr != NULL) {
|
||||
bus_dmamap_sync(dma->tag, dma->map,
|
||||
BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
|
||||
bus_dmamap_unload(dma->tag, dma->map);
|
||||
bus_dmamem_free(dma->tag, dma->vaddr, dma->map);
|
||||
dma->vaddr = NULL;
|
||||
}
|
||||
if (dma->tag != NULL) {
|
||||
bus_dma_tag_destroy(dma->tag);
|
||||
dma->tag = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/* fwmem is used to load firmware onto the card */
|
||||
static int
|
||||
iwm_alloc_fwmem(struct iwm_softc *sc)
|
||||
|
@ -421,3 +421,68 @@ iwm_free_resp(struct iwm_softc *sc, struct iwm_host_cmd *hcmd)
|
||||
sc->sc_wantresp = -1;
|
||||
wakeup(&sc->sc_wantresp);
|
||||
}
|
||||
|
||||
static void
|
||||
iwm_dma_map_addr(void *arg, bus_dma_segment_t *segs, int nsegs, int error)
|
||||
{
|
||||
if (error != 0)
|
||||
return;
|
||||
KASSERT(nsegs == 1, ("too many DMA segments, %d should be 1", nsegs));
|
||||
*(bus_addr_t *)arg = segs[0].ds_addr;
|
||||
}
|
||||
|
||||
int
|
||||
iwm_dma_contig_alloc(bus_dma_tag_t tag, struct iwm_dma_info *dma,
|
||||
bus_size_t size, bus_size_t alignment)
|
||||
{
|
||||
int error;
|
||||
|
||||
dma->tag = NULL;
|
||||
dma->map = NULL;
|
||||
dma->size = size;
|
||||
dma->vaddr = NULL;
|
||||
|
||||
error = bus_dma_tag_create(tag, alignment,
|
||||
0, BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, size,
|
||||
1, size, 0, NULL, NULL, &dma->tag);
|
||||
if (error != 0)
|
||||
goto fail;
|
||||
|
||||
error = bus_dmamem_alloc(dma->tag, (void **)&dma->vaddr,
|
||||
BUS_DMA_NOWAIT | BUS_DMA_ZERO | BUS_DMA_COHERENT, &dma->map);
|
||||
if (error != 0)
|
||||
goto fail;
|
||||
|
||||
error = bus_dmamap_load(dma->tag, dma->map, dma->vaddr, size,
|
||||
iwm_dma_map_addr, &dma->paddr, BUS_DMA_NOWAIT);
|
||||
if (error != 0) {
|
||||
bus_dmamem_free(dma->tag, dma->vaddr, dma->map);
|
||||
dma->vaddr = NULL;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
bus_dmamap_sync(dma->tag, dma->map, BUS_DMASYNC_PREWRITE);
|
||||
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
iwm_dma_contig_free(dma);
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
void
|
||||
iwm_dma_contig_free(struct iwm_dma_info *dma)
|
||||
{
|
||||
if (dma->vaddr != NULL) {
|
||||
bus_dmamap_sync(dma->tag, dma->map,
|
||||
BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
|
||||
bus_dmamap_unload(dma->tag, dma->map);
|
||||
bus_dmamem_free(dma->tag, dma->vaddr, dma->map);
|
||||
dma->vaddr = NULL;
|
||||
}
|
||||
if (dma->tag != NULL) {
|
||||
bus_dma_tag_destroy(dma->tag);
|
||||
dma->tag = NULL;
|
||||
}
|
||||
}
|
||||
|
@ -116,6 +116,10 @@ extern int iwm_mvm_send_cmd_pdu_status(struct iwm_softc *sc, uint8_t id,
|
||||
uint16_t len, const void *data, uint32_t *status);
|
||||
extern void iwm_free_resp(struct iwm_softc *sc, struct iwm_host_cmd *hcmd);
|
||||
|
||||
extern int iwm_dma_contig_alloc(bus_dma_tag_t tag, struct iwm_dma_info *dma,
|
||||
bus_size_t size, bus_size_t alignment);
|
||||
extern void iwm_dma_contig_free(struct iwm_dma_info *);
|
||||
|
||||
static inline uint8_t
|
||||
iwm_mvm_get_valid_tx_ant(struct iwm_softc *sc)
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user