1 /* 2 * Copyright (c) 2010 Broadcom Corporation 3 * 4 * Permission to use, copy, modify, and/or distribute this software for any 5 * purpose with or without fee is hereby granted, provided that the above 6 * copyright notice and this permission notice appear in all copies. 7 * 8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 11 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION 13 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 14 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 */ 16 17 #ifndef _hnddma_h_ 18 #define _hnddma_h_ 19 20 #ifndef _hnddma_pub_ 21 #define _hnddma_pub_ 22 struct hnddma_pub; 23 #endif /* _hnddma_pub_ */ 24 25 /* map/unmap direction */ 26 #define DMA_TX 1 /* TX direction for DMA */ 27 #define DMA_RX 2 /* RX direction for DMA */ 28 #define BUS_SWAP32(v) (v) 29 30 /* range param for dma_getnexttxp() and dma_txreclaim */ 31 typedef enum txd_range { 32 HNDDMA_RANGE_ALL = 1, 33 HNDDMA_RANGE_TRANSMITTED, 34 HNDDMA_RANGE_TRANSFERED 35 } txd_range_t; 36 37 /* dma function type */ 38 typedef void (*di_detach_t) (struct hnddma_pub *dmah); 39 typedef bool(*di_txreset_t) (struct hnddma_pub *dmah); 40 typedef bool(*di_rxreset_t) (struct hnddma_pub *dmah); 41 typedef bool(*di_rxidle_t) (struct hnddma_pub *dmah); 42 typedef void (*di_txinit_t) (struct hnddma_pub *dmah); 43 typedef bool(*di_txenabled_t) (struct hnddma_pub *dmah); 44 typedef void (*di_rxinit_t) (struct hnddma_pub *dmah); 45 typedef void (*di_txsuspend_t) (struct hnddma_pub *dmah); 46 typedef void (*di_txresume_t) (struct hnddma_pub *dmah); 47 typedef bool(*di_txsuspended_t) (struct hnddma_pub *dmah); 48 typedef bool(*di_txsuspendedidle_t) (struct hnddma_pub *dmah); 49 typedef int (*di_txfast_t) (struct hnddma_pub *dmah, struct sk_buff *p, 50 bool commit); 51 typedef int (*di_txunframed_t) (struct hnddma_pub *dmah, void *p, uint len, 52 bool commit); 53 typedef void *(*di_getpos_t) (struct hnddma_pub *di, bool direction); 54 typedef void (*di_fifoloopbackenable_t) (struct hnddma_pub *dmah); 55 typedef bool(*di_txstopped_t) (struct hnddma_pub *dmah); 56 typedef bool(*di_rxstopped_t) (struct hnddma_pub *dmah); 57 typedef bool(*di_rxenable_t) (struct hnddma_pub *dmah); 58 typedef bool(*di_rxenabled_t) (struct hnddma_pub *dmah); 59 typedef void *(*di_rx_t) (struct hnddma_pub *dmah); 60 typedef bool(*di_rxfill_t) (struct hnddma_pub *dmah); 61 typedef void (*di_txreclaim_t) (struct hnddma_pub *dmah, txd_range_t range); 62 typedef void (*di_rxreclaim_t) (struct hnddma_pub *dmah); 63 typedef unsigned long (*di_getvar_t) (struct hnddma_pub *dmah, 64 const char *name); 65 typedef void *(*di_getnexttxp_t) (struct hnddma_pub *dmah, txd_range_t range); 66 typedef void *(*di_getnextrxp_t) (struct hnddma_pub *dmah, bool forceall); 67 typedef void *(*di_peeknexttxp_t) (struct hnddma_pub *dmah); 68 typedef void *(*di_peeknextrxp_t) (struct hnddma_pub *dmah); 69 typedef void (*di_rxparam_get_t) (struct hnddma_pub *dmah, u16 *rxoffset, 70 u16 *rxbufsize); 71 typedef void (*di_txblock_t) (struct hnddma_pub *dmah); 72 typedef void (*di_txunblock_t) (struct hnddma_pub *dmah); 73 typedef uint(*di_txactive_t) (struct hnddma_pub *dmah); 74 typedef void (*di_txrotate_t) (struct hnddma_pub *dmah); 75 typedef void (*di_counterreset_t) (struct hnddma_pub *dmah); 76 typedef uint(*di_ctrlflags_t) (struct hnddma_pub *dmah, uint mask, uint flags); 77 typedef char *(*di_dump_t) (struct hnddma_pub *dmah, struct bcmstrbuf *b, 78 bool dumpring); 79 typedef char *(*di_dumptx_t) (struct hnddma_pub *dmah, struct bcmstrbuf *b, 80 bool dumpring); 81 typedef char *(*di_dumprx_t) (struct hnddma_pub *dmah, struct bcmstrbuf *b, 82 bool dumpring); 83 typedef uint(*di_rxactive_t) (struct hnddma_pub *dmah); 84 typedef uint(*di_txpending_t) (struct hnddma_pub *dmah); 85 typedef uint(*di_txcommitted_t) (struct hnddma_pub *dmah); 86 87 /* dma opsvec */ 88 typedef struct di_fcn_s { 89 di_detach_t detach; 90 di_txinit_t txinit; 91 di_txreset_t txreset; 92 di_txenabled_t txenabled; 93 di_txsuspend_t txsuspend; 94 di_txresume_t txresume; 95 di_txsuspended_t txsuspended; 96 di_txsuspendedidle_t txsuspendedidle; 97 di_txfast_t txfast; 98 di_txunframed_t txunframed; 99 di_getpos_t getpos; 100 di_txstopped_t txstopped; 101 di_txreclaim_t txreclaim; 102 di_getnexttxp_t getnexttxp; 103 di_peeknexttxp_t peeknexttxp; 104 di_txblock_t txblock; 105 di_txunblock_t txunblock; 106 di_txactive_t txactive; 107 di_txrotate_t txrotate; 108 109 di_rxinit_t rxinit; 110 di_rxreset_t rxreset; 111 di_rxidle_t rxidle; 112 di_rxstopped_t rxstopped; 113 di_rxenable_t rxenable; 114 di_rxenabled_t rxenabled; 115 di_rx_t rx; 116 di_rxfill_t rxfill; 117 di_rxreclaim_t rxreclaim; 118 di_getnextrxp_t getnextrxp; 119 di_peeknextrxp_t peeknextrxp; 120 di_rxparam_get_t rxparam_get; 121 122 di_fifoloopbackenable_t fifoloopbackenable; 123 di_getvar_t d_getvar; 124 di_counterreset_t counterreset; 125 di_ctrlflags_t ctrlflags; 126 di_dump_t dump; 127 di_dumptx_t dumptx; 128 di_dumprx_t dumprx; 129 di_rxactive_t rxactive; 130 di_txpending_t txpending; 131 di_txcommitted_t txcommitted; 132 uint endnum; 133 } di_fcn_t; 134 135 /* 136 * Exported data structure (read-only) 137 */ 138 /* export structure */ 139 struct hnddma_pub { 140 const di_fcn_t *di_fn; /* DMA function pointers */ 141 uint txavail; /* # free tx descriptors */ 142 uint dmactrlflags; /* dma control flags */ 143 144 /* rx error counters */ 145 uint rxgiants; /* rx giant frames */ 146 uint rxnobuf; /* rx out of dma descriptors */ 147 /* tx error counters */ 148 uint txnobuf; /* tx out of dma descriptors */ 149 }; 150 151 extern struct hnddma_pub *dma_attach(char *name, si_t *sih, 152 void *dmaregstx, void *dmaregsrx, uint ntxd, 153 uint nrxd, uint rxbufsize, int rxextheadroom, 154 uint nrxpost, uint rxoffset, uint *msg_level); 155 156 extern const di_fcn_t dma64proc; 157 158 #define dma_detach(di) (dma64proc.detach(di)) 159 #define dma_txreset(di) (dma64proc.txreset(di)) 160 #define dma_rxreset(di) (dma64proc.rxreset(di)) 161 #define dma_rxidle(di) (dma64proc.rxidle(di)) 162 #define dma_txinit(di) (dma64proc.txinit(di)) 163 #define dma_txenabled(di) (dma64proc.txenabled(di)) 164 #define dma_rxinit(di) (dma64proc.rxinit(di)) 165 #define dma_txsuspend(di) (dma64proc.txsuspend(di)) 166 #define dma_txresume(di) (dma64proc.txresume(di)) 167 #define dma_txsuspended(di) (dma64proc.txsuspended(di)) 168 #define dma_txsuspendedidle(di) (dma64proc.txsuspendedidle(di)) 169 #define dma_txfast(di, p, commit) (dma64proc.txfast(di, p, commit)) 170 #define dma_txunframed(di, p, l, commit)(dma64proc.txunframed(di, p, l, commit)) 171 #define dma_getpos(di, dir) (dma64proc.getpos(di, dir)) 172 #define dma_fifoloopbackenable(di) (dma64proc.fifoloopbackenable(di)) 173 #define dma_txstopped(di) (dma64proc.txstopped(di)) 174 #define dma_rxstopped(di) (dma64proc.rxstopped(di)) 175 #define dma_rxenable(di) (dma64proc.rxenable(di)) 176 #define dma_rxenabled(di) (dma64proc.rxenabled(di)) 177 #define dma_rx(di) (dma64proc.rx(di)) 178 #define dma_rxfill(di) (dma64proc.rxfill(di)) 179 #define dma_txreclaim(di, range) (dma64proc.txreclaim(di, range)) 180 #define dma_rxreclaim(di) (dma64proc.rxreclaim(di)) 181 #define dma_getvar(di, name) (dma64proc.d_getvar(di, name)) 182 #define dma_getnexttxp(di, range) (dma64proc.getnexttxp(di, range)) 183 #define dma_getnextrxp(di, forceall) (dma64proc.getnextrxp(di, forceall)) 184 #define dma_peeknexttxp(di) (dma64proc.peeknexttxp(di)) 185 #define dma_peeknextrxp(di) (dma64proc.peeknextrxp(di)) 186 #define dma_rxparam_get(di, off, bufs) (dma64proc.rxparam_get(di, off, bufs)) 187 188 #define dma_txblock(di) (dma64proc.txblock(di)) 189 #define dma_txunblock(di) (dma64proc.txunblock(di)) 190 #define dma_txactive(di) (dma64proc.txactive(di)) 191 #define dma_rxactive(di) (dma64proc.rxactive(di)) 192 #define dma_txrotate(di) (dma64proc.txrotate(di)) 193 #define dma_counterreset(di) (dma64proc.counterreset(di)) 194 #define dma_ctrlflags(di, mask, flags) (dma64proc.ctrlflags((di), (mask), (flags))) 195 #define dma_txpending(di) (dma64proc.txpending(di)) 196 #define dma_txcommitted(di) (dma64proc.txcommitted(di)) 197 198 199 /* return addresswidth allowed 200 * This needs to be done after SB attach but before dma attach. 201 * SB attach provides ability to probe backplane and dma core capabilities 202 * This info is needed by DMA_ALLOC_CONSISTENT in dma attach 203 */ 204 extern uint dma_addrwidth(si_t *sih, void *dmaregs); 205 void dma_walk_packets(struct hnddma_pub *dmah, void (*callback_fnc) 206 (void *pkt, void *arg_a), void *arg_a); 207 #endif /* _hnddma_h_ */ 208