8d1b5acb6b0c82b069f09388eb63d5bac53e088a
[openwrt.git] / package / broadcom-wl / src / driver / hnddma.h
1 /*
2  * Generic Broadcom Home Networking Division (HND) DMA engine SW interface
3  * This supports the following chips: BCM42xx, 44xx, 47xx .
4  *
5  * Copyright 2007, Broadcom Corporation
6  * All Rights Reserved.
7  * 
8  * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
9  * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
10  * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
11  * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
12  * $Id$
13  */
14
15 #ifndef _hnddma_h_
16 #define _hnddma_h_
17
18 typedef const struct hnddma_pub hnddma_t;
19
20 /* dma function type */
21 typedef void (*di_detach_t)(hnddma_t *dmah);
22 typedef bool (*di_txreset_t)(hnddma_t *dmah);
23 typedef bool (*di_rxreset_t)(hnddma_t *dmah);
24 typedef bool (*di_rxidle_t)(hnddma_t *dmah);
25 typedef void (*di_txinit_t)(hnddma_t *dmah);
26 typedef bool (*di_txenabled_t)(hnddma_t *dmah);
27 typedef void (*di_rxinit_t)(hnddma_t *dmah);
28 typedef void (*di_txsuspend_t)(hnddma_t *dmah);
29 typedef void (*di_txresume_t)(hnddma_t *dmah);
30 typedef bool (*di_txsuspended_t)(hnddma_t *dmah);
31 typedef bool (*di_txsuspendedidle_t)(hnddma_t *dmah);
32 typedef int (*di_txfast_t)(hnddma_t *dmah, void *p, bool commit);
33 typedef void (*di_fifoloopbackenable_t)(hnddma_t *dmah);
34 typedef bool  (*di_txstopped_t)(hnddma_t *dmah);
35 typedef bool  (*di_rxstopped_t)(hnddma_t *dmah);
36 typedef bool  (*di_rxenable_t)(hnddma_t *dmah);
37 typedef bool  (*di_rxenabled_t)(hnddma_t *dmah);
38 typedef void* (*di_rx_t)(hnddma_t *dmah);
39 typedef void (*di_rxfill_t)(hnddma_t *dmah);
40 typedef void (*di_txreclaim_t)(hnddma_t *dmah, bool forceall);
41 typedef void (*di_rxreclaim_t)(hnddma_t *dmah);
42 typedef uintptr (*di_getvar_t)(hnddma_t *dmah, const char *name);
43 typedef void* (*di_getnexttxp_t)(hnddma_t *dmah, bool forceall);
44 typedef void* (*di_getnextrxp_t)(hnddma_t *dmah, bool forceall);
45 typedef void* (*di_peeknexttxp_t)(hnddma_t *dmah);
46 typedef void (*di_txblock_t)(hnddma_t *dmah);
47 typedef void (*di_txunblock_t)(hnddma_t *dmah);
48 typedef uint (*di_txactive_t)(hnddma_t *dmah);
49 typedef void (*di_txrotate_t)(hnddma_t *dmah);
50 typedef void (*di_counterreset_t)(hnddma_t *dmah);
51 typedef char* (*di_dump_t)(hnddma_t *dmah, struct bcmstrbuf *b, bool dumpring);
52 typedef char* (*di_dumptx_t)(hnddma_t *dmah, struct bcmstrbuf *b, bool dumpring);
53 typedef char* (*di_dumprx_t)(hnddma_t *dmah, struct bcmstrbuf *b, bool dumpring);
54
55 /* dma opsvec */
56 typedef struct di_fcn_s {
57         di_detach_t             detach;
58         di_txinit_t             txinit;
59         di_txreset_t            txreset;
60         di_txenabled_t          txenabled;
61         di_txsuspend_t          txsuspend;
62         di_txresume_t           txresume;
63         di_txsuspended_t        txsuspended;
64         di_txsuspendedidle_t    txsuspendedidle;
65         di_txfast_t             txfast;
66         di_txstopped_t          txstopped;
67         di_txreclaim_t          txreclaim;
68         di_getnexttxp_t         getnexttxp;
69         di_peeknexttxp_t        peeknexttxp;
70         di_txblock_t            txblock;
71         di_txunblock_t          txunblock;
72         di_txactive_t           txactive;
73         di_txrotate_t           txrotate;
74
75         di_rxinit_t             rxinit;
76         di_rxreset_t            rxreset;
77         di_rxidle_t             rxidle;
78         di_rxstopped_t          rxstopped;
79         di_rxenable_t           rxenable;
80         di_rxenabled_t          rxenabled;
81         di_rx_t                 rx;
82         di_rxfill_t             rxfill;
83         di_rxreclaim_t          rxreclaim;
84         di_getnextrxp_t         getnextrxp;
85
86         di_fifoloopbackenable_t fifoloopbackenable;
87         di_getvar_t             d_getvar;
88         di_counterreset_t       counterreset;
89         di_dump_t               dump;
90         di_dumptx_t             dumptx;
91         di_dumprx_t             dumprx;
92         uint                    endnum;
93 } di_fcn_t;
94
95 /*
96  * Exported data structure (read-only)
97  */
98 /* export structure */
99 struct hnddma_pub {
100         di_fcn_t        di_fn;          /* DMA function pointers */
101         uint            txavail;        /* # free tx descriptors */
102
103         /* rx error counters */
104         uint            rxgiants;       /* rx giant frames */
105         uint            rxnobuf;        /* rx out of dma descriptors */
106         /* tx error counters */
107         uint            txnobuf;        /* tx out of dma descriptors */
108 };
109
110
111 extern hnddma_t * dma_attach(osl_t *osh, char *name, sb_t *sbh, void *dmaregstx, void *dmaregsrx,
112                              uint ntxd, uint nrxd, uint rxbufsize, uint nrxpost, uint rxoffset,
113                              uint *msg_level);
114 #define dma_detach(di)                  ((di)->di_fn.detach(di))
115 #define dma_txreset(di)                 ((di)->di_fn.txreset(di))
116 #define dma_rxreset(di)                 ((di)->di_fn.rxreset(di))
117 #define dma_rxidle(di)                  ((di)->di_fn.rxidle(di))
118 #define dma_txinit(di)                  ((di)->di_fn.txinit(di))
119 #define dma_txenabled(di)               ((di)->di_fn.txenabled(di))
120 #define dma_rxinit(di)                  ((di)->di_fn.rxinit(di))
121 #define dma_txsuspend(di)               ((di)->di_fn.txsuspend(di))
122 #define dma_txresume(di)                ((di)->di_fn.txresume(di))
123 #define dma_txsuspended(di)             ((di)->di_fn.txsuspended(di))
124 #define dma_txsuspendedidle(di)         ((di)->di_fn.txsuspendedidle(di))
125 #define dma_txfast(di, p, commit)       ((di)->di_fn.txfast(di, p, commit))
126 #define dma_fifoloopbackenable(di)      ((di)->di_fn.fifoloopbackenable(di))
127 #define dma_txstopped(di)               ((di)->di_fn.txstopped(di))
128 #define dma_rxstopped(di)               ((di)->di_fn.rxstopped(di))
129 #define dma_rxenable(di)                ((di)->di_fn.rxenable(di))
130 #define dma_rxenabled(di)               ((di)->di_fn.rxenabled(di))
131 #define dma_rx(di)                      ((di)->di_fn.rx(di))
132 #define dma_rxfill(di)                  ((di)->di_fn.rxfill(di))
133 #define dma_txreclaim(di, forceall)     ((di)->di_fn.txreclaim(di, forceall))
134 #define dma_rxreclaim(di)               ((di)->di_fn.rxreclaim(di))
135 #define dma_getvar(di, name)            ((di)->di_fn.d_getvar(di, name))
136 #define dma_getnexttxp(di, forceall)    ((di)->di_fn.getnexttxp(di, forceall))
137 #define dma_getnextrxp(di, forceall)    ((di)->di_fn.getnextrxp(di, forceall))
138 #define dma_peeknexttxp(di)             ((di)->di_fn.peeknexttxp(di))
139 #define dma_txblock(di)                 ((di)->di_fn.txblock(di))
140 #define dma_txunblock(di)               ((di)->di_fn.txunblock(di))
141 #define dma_txactive(di)                ((di)->di_fn.txactive(di))
142 #define dma_txrotate(di)                ((di)->di_fn.txrotate(di))
143 #define dma_counterreset(di)            ((di)->di_fn.counterreset(di))
144 #ifdef BCMDBG
145 #define dma_dump(di, buf, dumpring)     ((di)->di_fn.dump(di, buf, dumpring))
146 #define dma_dumptx(di, buf, dumpring)   ((di)->di_fn.dumptx(di, buf, dumpring))
147 #define dma_dumprx(di, buf, dumpring)   ((di)->di_fn.dumprx(di, buf, dumpring))
148 #endif
149
150 /* return addresswidth allowed
151  * This needs to be done after SB attach but before dma attach.
152  * SB attach provides ability to probe backplane and dma core capabilities
153  * This info is needed by DMA_ALLOC_CONSISTENT in dma attach
154  */
155 extern uint dma_addrwidth(sb_t *sbh, void *dmaregs);
156
157 /* pio helpers */
158 void dma_txpioloopback(osl_t *osh, dma32regs_t *);
159
160 #endif  /* _hnddma_h_ */