162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci#ifndef B43_DMA_H_ 362306a36Sopenharmony_ci#define B43_DMA_H_ 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci#include <linux/err.h> 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#include "b43.h" 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci/* DMA-Interrupt reasons. */ 1162306a36Sopenharmony_ci#define B43_DMAIRQ_FATALMASK ((1 << 10) | (1 << 11) | (1 << 12) \ 1262306a36Sopenharmony_ci | (1 << 14) | (1 << 15)) 1362306a36Sopenharmony_ci#define B43_DMAIRQ_RDESC_UFLOW (1 << 13) 1462306a36Sopenharmony_ci#define B43_DMAIRQ_RX_DONE (1 << 16) 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci/*** 32-bit DMA Engine. ***/ 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci/* 32-bit DMA controller registers. */ 1962306a36Sopenharmony_ci#define B43_DMA32_TXCTL 0x00 2062306a36Sopenharmony_ci#define B43_DMA32_TXENABLE 0x00000001 2162306a36Sopenharmony_ci#define B43_DMA32_TXSUSPEND 0x00000002 2262306a36Sopenharmony_ci#define B43_DMA32_TXLOOPBACK 0x00000004 2362306a36Sopenharmony_ci#define B43_DMA32_TXFLUSH 0x00000010 2462306a36Sopenharmony_ci#define B43_DMA32_TXPARITYDISABLE 0x00000800 2562306a36Sopenharmony_ci#define B43_DMA32_TXADDREXT_MASK 0x00030000 2662306a36Sopenharmony_ci#define B43_DMA32_TXADDREXT_SHIFT 16 2762306a36Sopenharmony_ci#define B43_DMA32_TXRING 0x04 2862306a36Sopenharmony_ci#define B43_DMA32_TXINDEX 0x08 2962306a36Sopenharmony_ci#define B43_DMA32_TXSTATUS 0x0C 3062306a36Sopenharmony_ci#define B43_DMA32_TXDPTR 0x00000FFF 3162306a36Sopenharmony_ci#define B43_DMA32_TXSTATE 0x0000F000 3262306a36Sopenharmony_ci#define B43_DMA32_TXSTAT_DISABLED 0x00000000 3362306a36Sopenharmony_ci#define B43_DMA32_TXSTAT_ACTIVE 0x00001000 3462306a36Sopenharmony_ci#define B43_DMA32_TXSTAT_IDLEWAIT 0x00002000 3562306a36Sopenharmony_ci#define B43_DMA32_TXSTAT_STOPPED 0x00003000 3662306a36Sopenharmony_ci#define B43_DMA32_TXSTAT_SUSP 0x00004000 3762306a36Sopenharmony_ci#define B43_DMA32_TXERROR 0x000F0000 3862306a36Sopenharmony_ci#define B43_DMA32_TXERR_NOERR 0x00000000 3962306a36Sopenharmony_ci#define B43_DMA32_TXERR_PROT 0x00010000 4062306a36Sopenharmony_ci#define B43_DMA32_TXERR_UNDERRUN 0x00020000 4162306a36Sopenharmony_ci#define B43_DMA32_TXERR_BUFREAD 0x00030000 4262306a36Sopenharmony_ci#define B43_DMA32_TXERR_DESCREAD 0x00040000 4362306a36Sopenharmony_ci#define B43_DMA32_TXACTIVE 0xFFF00000 4462306a36Sopenharmony_ci#define B43_DMA32_RXCTL 0x10 4562306a36Sopenharmony_ci#define B43_DMA32_RXENABLE 0x00000001 4662306a36Sopenharmony_ci#define B43_DMA32_RXFROFF_MASK 0x000000FE 4762306a36Sopenharmony_ci#define B43_DMA32_RXFROFF_SHIFT 1 4862306a36Sopenharmony_ci#define B43_DMA32_RXDIRECTFIFO 0x00000100 4962306a36Sopenharmony_ci#define B43_DMA32_RXPARITYDISABLE 0x00000800 5062306a36Sopenharmony_ci#define B43_DMA32_RXADDREXT_MASK 0x00030000 5162306a36Sopenharmony_ci#define B43_DMA32_RXADDREXT_SHIFT 16 5262306a36Sopenharmony_ci#define B43_DMA32_RXRING 0x14 5362306a36Sopenharmony_ci#define B43_DMA32_RXINDEX 0x18 5462306a36Sopenharmony_ci#define B43_DMA32_RXSTATUS 0x1C 5562306a36Sopenharmony_ci#define B43_DMA32_RXDPTR 0x00000FFF 5662306a36Sopenharmony_ci#define B43_DMA32_RXSTATE 0x0000F000 5762306a36Sopenharmony_ci#define B43_DMA32_RXSTAT_DISABLED 0x00000000 5862306a36Sopenharmony_ci#define B43_DMA32_RXSTAT_ACTIVE 0x00001000 5962306a36Sopenharmony_ci#define B43_DMA32_RXSTAT_IDLEWAIT 0x00002000 6062306a36Sopenharmony_ci#define B43_DMA32_RXSTAT_STOPPED 0x00003000 6162306a36Sopenharmony_ci#define B43_DMA32_RXERROR 0x000F0000 6262306a36Sopenharmony_ci#define B43_DMA32_RXERR_NOERR 0x00000000 6362306a36Sopenharmony_ci#define B43_DMA32_RXERR_PROT 0x00010000 6462306a36Sopenharmony_ci#define B43_DMA32_RXERR_OVERFLOW 0x00020000 6562306a36Sopenharmony_ci#define B43_DMA32_RXERR_BUFWRITE 0x00030000 6662306a36Sopenharmony_ci#define B43_DMA32_RXERR_DESCREAD 0x00040000 6762306a36Sopenharmony_ci#define B43_DMA32_RXACTIVE 0xFFF00000 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci/* 32-bit DMA descriptor. */ 7062306a36Sopenharmony_cistruct b43_dmadesc32 { 7162306a36Sopenharmony_ci __le32 control; 7262306a36Sopenharmony_ci __le32 address; 7362306a36Sopenharmony_ci} __packed; 7462306a36Sopenharmony_ci#define B43_DMA32_DCTL_BYTECNT 0x00001FFF 7562306a36Sopenharmony_ci#define B43_DMA32_DCTL_ADDREXT_MASK 0x00030000 7662306a36Sopenharmony_ci#define B43_DMA32_DCTL_ADDREXT_SHIFT 16 7762306a36Sopenharmony_ci#define B43_DMA32_DCTL_DTABLEEND 0x10000000 7862306a36Sopenharmony_ci#define B43_DMA32_DCTL_IRQ 0x20000000 7962306a36Sopenharmony_ci#define B43_DMA32_DCTL_FRAMEEND 0x40000000 8062306a36Sopenharmony_ci#define B43_DMA32_DCTL_FRAMESTART 0x80000000 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ci/*** 64-bit DMA Engine. ***/ 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ci/* 64-bit DMA controller registers. */ 8562306a36Sopenharmony_ci#define B43_DMA64_TXCTL 0x00 8662306a36Sopenharmony_ci#define B43_DMA64_TXENABLE 0x00000001 8762306a36Sopenharmony_ci#define B43_DMA64_TXSUSPEND 0x00000002 8862306a36Sopenharmony_ci#define B43_DMA64_TXLOOPBACK 0x00000004 8962306a36Sopenharmony_ci#define B43_DMA64_TXFLUSH 0x00000010 9062306a36Sopenharmony_ci#define B43_DMA64_TXPARITYDISABLE 0x00000800 9162306a36Sopenharmony_ci#define B43_DMA64_TXADDREXT_MASK 0x00030000 9262306a36Sopenharmony_ci#define B43_DMA64_TXADDREXT_SHIFT 16 9362306a36Sopenharmony_ci#define B43_DMA64_TXINDEX 0x04 9462306a36Sopenharmony_ci#define B43_DMA64_TXRINGLO 0x08 9562306a36Sopenharmony_ci#define B43_DMA64_TXRINGHI 0x0C 9662306a36Sopenharmony_ci#define B43_DMA64_TXSTATUS 0x10 9762306a36Sopenharmony_ci#define B43_DMA64_TXSTATDPTR 0x00001FFF 9862306a36Sopenharmony_ci#define B43_DMA64_TXSTAT 0xF0000000 9962306a36Sopenharmony_ci#define B43_DMA64_TXSTAT_DISABLED 0x00000000 10062306a36Sopenharmony_ci#define B43_DMA64_TXSTAT_ACTIVE 0x10000000 10162306a36Sopenharmony_ci#define B43_DMA64_TXSTAT_IDLEWAIT 0x20000000 10262306a36Sopenharmony_ci#define B43_DMA64_TXSTAT_STOPPED 0x30000000 10362306a36Sopenharmony_ci#define B43_DMA64_TXSTAT_SUSP 0x40000000 10462306a36Sopenharmony_ci#define B43_DMA64_TXERROR 0x14 10562306a36Sopenharmony_ci#define B43_DMA64_TXERRDPTR 0x0001FFFF 10662306a36Sopenharmony_ci#define B43_DMA64_TXERR 0xF0000000 10762306a36Sopenharmony_ci#define B43_DMA64_TXERR_NOERR 0x00000000 10862306a36Sopenharmony_ci#define B43_DMA64_TXERR_PROT 0x10000000 10962306a36Sopenharmony_ci#define B43_DMA64_TXERR_UNDERRUN 0x20000000 11062306a36Sopenharmony_ci#define B43_DMA64_TXERR_TRANSFER 0x30000000 11162306a36Sopenharmony_ci#define B43_DMA64_TXERR_DESCREAD 0x40000000 11262306a36Sopenharmony_ci#define B43_DMA64_TXERR_CORE 0x50000000 11362306a36Sopenharmony_ci#define B43_DMA64_RXCTL 0x20 11462306a36Sopenharmony_ci#define B43_DMA64_RXENABLE 0x00000001 11562306a36Sopenharmony_ci#define B43_DMA64_RXFROFF_MASK 0x000000FE 11662306a36Sopenharmony_ci#define B43_DMA64_RXFROFF_SHIFT 1 11762306a36Sopenharmony_ci#define B43_DMA64_RXDIRECTFIFO 0x00000100 11862306a36Sopenharmony_ci#define B43_DMA64_RXPARITYDISABLE 0x00000800 11962306a36Sopenharmony_ci#define B43_DMA64_RXADDREXT_MASK 0x00030000 12062306a36Sopenharmony_ci#define B43_DMA64_RXADDREXT_SHIFT 16 12162306a36Sopenharmony_ci#define B43_DMA64_RXINDEX 0x24 12262306a36Sopenharmony_ci#define B43_DMA64_RXRINGLO 0x28 12362306a36Sopenharmony_ci#define B43_DMA64_RXRINGHI 0x2C 12462306a36Sopenharmony_ci#define B43_DMA64_RXSTATUS 0x30 12562306a36Sopenharmony_ci#define B43_DMA64_RXSTATDPTR 0x00001FFF 12662306a36Sopenharmony_ci#define B43_DMA64_RXSTAT 0xF0000000 12762306a36Sopenharmony_ci#define B43_DMA64_RXSTAT_DISABLED 0x00000000 12862306a36Sopenharmony_ci#define B43_DMA64_RXSTAT_ACTIVE 0x10000000 12962306a36Sopenharmony_ci#define B43_DMA64_RXSTAT_IDLEWAIT 0x20000000 13062306a36Sopenharmony_ci#define B43_DMA64_RXSTAT_STOPPED 0x30000000 13162306a36Sopenharmony_ci#define B43_DMA64_RXSTAT_SUSP 0x40000000 13262306a36Sopenharmony_ci#define B43_DMA64_RXERROR 0x34 13362306a36Sopenharmony_ci#define B43_DMA64_RXERRDPTR 0x0001FFFF 13462306a36Sopenharmony_ci#define B43_DMA64_RXERR 0xF0000000 13562306a36Sopenharmony_ci#define B43_DMA64_RXERR_NOERR 0x00000000 13662306a36Sopenharmony_ci#define B43_DMA64_RXERR_PROT 0x10000000 13762306a36Sopenharmony_ci#define B43_DMA64_RXERR_UNDERRUN 0x20000000 13862306a36Sopenharmony_ci#define B43_DMA64_RXERR_TRANSFER 0x30000000 13962306a36Sopenharmony_ci#define B43_DMA64_RXERR_DESCREAD 0x40000000 14062306a36Sopenharmony_ci#define B43_DMA64_RXERR_CORE 0x50000000 14162306a36Sopenharmony_ci 14262306a36Sopenharmony_ci/* 64-bit DMA descriptor. */ 14362306a36Sopenharmony_cistruct b43_dmadesc64 { 14462306a36Sopenharmony_ci __le32 control0; 14562306a36Sopenharmony_ci __le32 control1; 14662306a36Sopenharmony_ci __le32 address_low; 14762306a36Sopenharmony_ci __le32 address_high; 14862306a36Sopenharmony_ci} __packed; 14962306a36Sopenharmony_ci#define B43_DMA64_DCTL0_DTABLEEND 0x10000000 15062306a36Sopenharmony_ci#define B43_DMA64_DCTL0_IRQ 0x20000000 15162306a36Sopenharmony_ci#define B43_DMA64_DCTL0_FRAMEEND 0x40000000 15262306a36Sopenharmony_ci#define B43_DMA64_DCTL0_FRAMESTART 0x80000000 15362306a36Sopenharmony_ci#define B43_DMA64_DCTL1_BYTECNT 0x00001FFF 15462306a36Sopenharmony_ci#define B43_DMA64_DCTL1_ADDREXT_MASK 0x00030000 15562306a36Sopenharmony_ci#define B43_DMA64_DCTL1_ADDREXT_SHIFT 16 15662306a36Sopenharmony_ci 15762306a36Sopenharmony_cistruct b43_dmadesc_generic { 15862306a36Sopenharmony_ci union { 15962306a36Sopenharmony_ci struct b43_dmadesc32 dma32; 16062306a36Sopenharmony_ci struct b43_dmadesc64 dma64; 16162306a36Sopenharmony_ci } __packed; 16262306a36Sopenharmony_ci} __packed; 16362306a36Sopenharmony_ci 16462306a36Sopenharmony_ci/* Misc DMA constants */ 16562306a36Sopenharmony_ci#define B43_DMA32_RINGMEMSIZE 4096 16662306a36Sopenharmony_ci#define B43_DMA64_RINGMEMSIZE 8192 16762306a36Sopenharmony_ci/* Offset of frame with actual data */ 16862306a36Sopenharmony_ci#define B43_DMA0_RX_FW598_FO 38 16962306a36Sopenharmony_ci#define B43_DMA0_RX_FW351_FO 30 17062306a36Sopenharmony_ci 17162306a36Sopenharmony_ci/* DMA engine tuning knobs */ 17262306a36Sopenharmony_ci#define B43_TXRING_SLOTS 256 17362306a36Sopenharmony_ci#define B43_RXRING_SLOTS 256 17462306a36Sopenharmony_ci#define B43_DMA0_RX_FW598_BUFSIZE (B43_DMA0_RX_FW598_FO + IEEE80211_MAX_FRAME_LEN) 17562306a36Sopenharmony_ci#define B43_DMA0_RX_FW351_BUFSIZE (B43_DMA0_RX_FW351_FO + IEEE80211_MAX_FRAME_LEN) 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_ci/* Pointer poison */ 17862306a36Sopenharmony_ci#define B43_DMA_PTR_POISON ((void *)ERR_PTR(-ENOMEM)) 17962306a36Sopenharmony_ci#define b43_dma_ptr_is_poisoned(ptr) (unlikely((ptr) == B43_DMA_PTR_POISON)) 18062306a36Sopenharmony_ci 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_cistruct sk_buff; 18362306a36Sopenharmony_cistruct b43_private; 18462306a36Sopenharmony_cistruct b43_txstatus; 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_cistruct b43_dmadesc_meta { 18762306a36Sopenharmony_ci /* The kernel DMA-able buffer. */ 18862306a36Sopenharmony_ci struct sk_buff *skb; 18962306a36Sopenharmony_ci /* DMA base bus-address of the descriptor buffer. */ 19062306a36Sopenharmony_ci dma_addr_t dmaaddr; 19162306a36Sopenharmony_ci /* ieee80211 TX status. Only used once per 802.11 frag. */ 19262306a36Sopenharmony_ci bool is_last_fragment; 19362306a36Sopenharmony_ci}; 19462306a36Sopenharmony_ci 19562306a36Sopenharmony_cistruct b43_dmaring; 19662306a36Sopenharmony_ci 19762306a36Sopenharmony_ci/* Lowlevel DMA operations that differ between 32bit and 64bit DMA. */ 19862306a36Sopenharmony_cistruct b43_dma_ops { 19962306a36Sopenharmony_ci struct b43_dmadesc_generic *(*idx2desc) (struct b43_dmaring * ring, 20062306a36Sopenharmony_ci int slot, 20162306a36Sopenharmony_ci struct b43_dmadesc_meta ** 20262306a36Sopenharmony_ci meta); 20362306a36Sopenharmony_ci void (*fill_descriptor) (struct b43_dmaring * ring, 20462306a36Sopenharmony_ci struct b43_dmadesc_generic * desc, 20562306a36Sopenharmony_ci dma_addr_t dmaaddr, u16 bufsize, int start, 20662306a36Sopenharmony_ci int end, int irq); 20762306a36Sopenharmony_ci void (*poke_tx) (struct b43_dmaring * ring, int slot); 20862306a36Sopenharmony_ci void (*tx_suspend) (struct b43_dmaring * ring); 20962306a36Sopenharmony_ci void (*tx_resume) (struct b43_dmaring * ring); 21062306a36Sopenharmony_ci int (*get_current_rxslot) (struct b43_dmaring * ring); 21162306a36Sopenharmony_ci void (*set_current_rxslot) (struct b43_dmaring * ring, int slot); 21262306a36Sopenharmony_ci}; 21362306a36Sopenharmony_ci 21462306a36Sopenharmony_cienum b43_dmatype { 21562306a36Sopenharmony_ci B43_DMA_30BIT = 30, 21662306a36Sopenharmony_ci B43_DMA_32BIT = 32, 21762306a36Sopenharmony_ci B43_DMA_64BIT = 64, 21862306a36Sopenharmony_ci}; 21962306a36Sopenharmony_ci 22062306a36Sopenharmony_cienum b43_addrtype { 22162306a36Sopenharmony_ci B43_DMA_ADDR_LOW, 22262306a36Sopenharmony_ci B43_DMA_ADDR_HIGH, 22362306a36Sopenharmony_ci B43_DMA_ADDR_EXT, 22462306a36Sopenharmony_ci}; 22562306a36Sopenharmony_ci 22662306a36Sopenharmony_cistruct b43_dmaring { 22762306a36Sopenharmony_ci /* Lowlevel DMA ops. */ 22862306a36Sopenharmony_ci const struct b43_dma_ops *ops; 22962306a36Sopenharmony_ci /* Kernel virtual base address of the ring memory. */ 23062306a36Sopenharmony_ci void *descbase; 23162306a36Sopenharmony_ci /* Meta data about all descriptors. */ 23262306a36Sopenharmony_ci struct b43_dmadesc_meta *meta; 23362306a36Sopenharmony_ci /* Cache of TX headers for each TX frame. 23462306a36Sopenharmony_ci * This is to avoid an allocation on each TX. 23562306a36Sopenharmony_ci * This is NULL for an RX ring. 23662306a36Sopenharmony_ci */ 23762306a36Sopenharmony_ci u8 *txhdr_cache; 23862306a36Sopenharmony_ci /* (Unadjusted) DMA base bus-address of the ring memory. */ 23962306a36Sopenharmony_ci dma_addr_t dmabase; 24062306a36Sopenharmony_ci /* Number of descriptor slots in the ring. */ 24162306a36Sopenharmony_ci int nr_slots; 24262306a36Sopenharmony_ci /* Number of used descriptor slots. */ 24362306a36Sopenharmony_ci int used_slots; 24462306a36Sopenharmony_ci /* Currently used slot in the ring. */ 24562306a36Sopenharmony_ci int current_slot; 24662306a36Sopenharmony_ci /* Frameoffset in octets. */ 24762306a36Sopenharmony_ci u32 frameoffset; 24862306a36Sopenharmony_ci /* Descriptor buffer size. */ 24962306a36Sopenharmony_ci u16 rx_buffersize; 25062306a36Sopenharmony_ci /* The MMIO base register of the DMA controller. */ 25162306a36Sopenharmony_ci u16 mmio_base; 25262306a36Sopenharmony_ci /* DMA controller index number (0-5). */ 25362306a36Sopenharmony_ci int index; 25462306a36Sopenharmony_ci /* Boolean. Is this a TX ring? */ 25562306a36Sopenharmony_ci bool tx; 25662306a36Sopenharmony_ci /* The type of DMA engine used. */ 25762306a36Sopenharmony_ci enum b43_dmatype type; 25862306a36Sopenharmony_ci /* Boolean. Is this ring stopped at ieee80211 level? */ 25962306a36Sopenharmony_ci bool stopped; 26062306a36Sopenharmony_ci /* The QOS priority assigned to this ring. Only used for TX rings. 26162306a36Sopenharmony_ci * This is the mac80211 "queue" value. */ 26262306a36Sopenharmony_ci u8 queue_prio; 26362306a36Sopenharmony_ci struct b43_wldev *dev; 26462306a36Sopenharmony_ci#ifdef CONFIG_B43_DEBUG 26562306a36Sopenharmony_ci /* Maximum number of used slots. */ 26662306a36Sopenharmony_ci int max_used_slots; 26762306a36Sopenharmony_ci /* Last time we injected a ring overflow. */ 26862306a36Sopenharmony_ci unsigned long last_injected_overflow; 26962306a36Sopenharmony_ci /* Statistics: Number of successfully transmitted packets */ 27062306a36Sopenharmony_ci u64 nr_succeed_tx_packets; 27162306a36Sopenharmony_ci /* Statistics: Number of failed TX packets */ 27262306a36Sopenharmony_ci u64 nr_failed_tx_packets; 27362306a36Sopenharmony_ci /* Statistics: Total number of TX plus all retries. */ 27462306a36Sopenharmony_ci u64 nr_total_packet_tries; 27562306a36Sopenharmony_ci#endif /* CONFIG_B43_DEBUG */ 27662306a36Sopenharmony_ci}; 27762306a36Sopenharmony_ci 27862306a36Sopenharmony_cistatic inline u32 b43_dma_read(struct b43_dmaring *ring, u16 offset) 27962306a36Sopenharmony_ci{ 28062306a36Sopenharmony_ci return b43_read32(ring->dev, ring->mmio_base + offset); 28162306a36Sopenharmony_ci} 28262306a36Sopenharmony_ci 28362306a36Sopenharmony_cistatic inline void b43_dma_write(struct b43_dmaring *ring, u16 offset, u32 value) 28462306a36Sopenharmony_ci{ 28562306a36Sopenharmony_ci b43_write32(ring->dev, ring->mmio_base + offset, value); 28662306a36Sopenharmony_ci} 28762306a36Sopenharmony_ci 28862306a36Sopenharmony_ciint b43_dma_init(struct b43_wldev *dev); 28962306a36Sopenharmony_civoid b43_dma_free(struct b43_wldev *dev); 29062306a36Sopenharmony_ci 29162306a36Sopenharmony_civoid b43_dma_tx_suspend(struct b43_wldev *dev); 29262306a36Sopenharmony_civoid b43_dma_tx_resume(struct b43_wldev *dev); 29362306a36Sopenharmony_ci 29462306a36Sopenharmony_ciint b43_dma_tx(struct b43_wldev *dev, 29562306a36Sopenharmony_ci struct sk_buff *skb); 29662306a36Sopenharmony_civoid b43_dma_handle_txstatus(struct b43_wldev *dev, 29762306a36Sopenharmony_ci const struct b43_txstatus *status); 29862306a36Sopenharmony_ci 29962306a36Sopenharmony_civoid b43_dma_handle_rx_overflow(struct b43_dmaring *ring); 30062306a36Sopenharmony_ci 30162306a36Sopenharmony_civoid b43_dma_rx(struct b43_dmaring *ring); 30262306a36Sopenharmony_ci 30362306a36Sopenharmony_civoid b43_dma_direct_fifo_rx(struct b43_wldev *dev, 30462306a36Sopenharmony_ci unsigned int engine_index, bool enable); 30562306a36Sopenharmony_ci 30662306a36Sopenharmony_ci#endif /* B43_DMA_H_ */ 307