CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
orangepi-xunlong

Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place. Commercial Alternative to JupyterHub.

GitHub Repository: orangepi-xunlong/orangepi-build
Path: blob/next/external/cache/sources/wl/include/dbus.h
Views: 3959
1
/*
2
* Dongle BUS interface Abstraction layer
3
* target serial buses like USB, SDIO, SPI, etc.
4
*
5
* $Copyright Open 2008 Broadcom Corporation$
6
*
7
* $Id: dbus.h 394558 2013-04-03 00:11:01Z $
8
*/
9
10
#ifndef __DBUS_H__
11
#define __DBUS_H__
12
13
#include "typedefs.h"
14
15
#define DBUSTRACE(args)
16
#define DBUSERR(args)
17
#define DBUSINFO(args)
18
#define DBUSTRACE(args)
19
#define DBUSDBGLOCK(args)
20
21
#define BCM_OTP_SIZE_43236 84 /* number of 16 bit values */
22
#define BCM_OTP_SW_RGN_43236 24 /* start offset of SW config region */
23
#define BCM_OTP_ADDR_43236 0x18000800 /* address of otp base */
24
25
#define ERR_CBMASK_TXFAIL 0x00000001
26
#define ERR_CBMASK_RXFAIL 0x00000002
27
#define ERR_CBMASK_ALL 0xFFFFFFFF
28
29
#define DBUS_CBCTL_WRITE 0
30
#define DBUS_CBCTL_READ 1
31
32
#define DBUS_TX_RETRY_LIMIT 3 /* retries for failed txirb */
33
#define DBUS_TX_TIMEOUT_INTERVAL 250 /* timeout for txirb complete, in ms */
34
35
#define DBUS_BUFFER_SIZE_TX 32000
36
#define DBUS_BUFFER_SIZE_RX 24000
37
38
#define DBUS_BUFFER_SIZE_TX_NOAGG 2048
39
#define DBUS_BUFFER_SIZE_RX_NOAGG 2048
40
41
enum {
42
DBUS_OK = 0,
43
DBUS_ERR = -200,
44
DBUS_ERR_TIMEOUT,
45
DBUS_ERR_DISCONNECT,
46
DBUS_ERR_NODEVICE,
47
DBUS_ERR_UNSUPPORTED,
48
DBUS_ERR_PENDING,
49
DBUS_ERR_NOMEM,
50
DBUS_ERR_TXFAIL,
51
DBUS_ERR_TXTIMEOUT,
52
DBUS_ERR_TXDROP,
53
DBUS_ERR_RXFAIL,
54
DBUS_ERR_RXDROP,
55
DBUS_ERR_TXCTLFAIL,
56
DBUS_ERR_RXCTLFAIL,
57
DBUS_ERR_REG_PARAM,
58
DBUS_STATUS_CANCELLED,
59
DBUS_ERR_NVRAM,
60
DBUS_JUMBO_NOMATCH,
61
DBUS_JUMBO_BAD_FORMAT,
62
DBUS_NVRAM_NONTXT
63
};
64
65
/* DBUS types */
66
enum {
67
DBUS_USB,
68
DBUS_SDIO,
69
DBUS_SPI,
70
DBUS_UNKNOWN
71
};
72
73
enum dbus_state {
74
DBUS_STATE_DL_PENDING,
75
DBUS_STATE_DL_DONE,
76
DBUS_STATE_UP,
77
DBUS_STATE_DOWN,
78
DBUS_STATE_PNP_FWDL,
79
DBUS_STATE_DISCONNECT,
80
DBUS_STATE_SLEEP
81
};
82
83
enum dbus_pnp_state {
84
DBUS_PNP_DISCONNECT,
85
DBUS_PNP_SLEEP,
86
DBUS_PNP_RESUME
87
};
88
89
enum dbus_file {
90
DBUS_FIRMWARE,
91
DBUS_NVFILE
92
};
93
94
typedef enum _DEVICE_SPEED {
95
INVALID_SPEED = -1,
96
LOW_SPEED = 1, /* USB 1.1: 1.5 Mbps */
97
FULL_SPEED, /* USB 1.1: 12 Mbps */
98
HIGH_SPEED, /* USB 2.0: 480 Mbps */
99
SUPER_SPEED, /* USB 3.0: 4.8 Gbps */
100
} DEVICE_SPEED;
101
102
typedef struct {
103
int bustype;
104
int vid;
105
int pid;
106
int devid;
107
int chiprev; /* chip revsion number */
108
int mtu;
109
int nchan; /* Data Channels */
110
int has_2nd_bulk_in_ep;
111
} dbus_attrib_t;
112
113
/* FIX: Account for errors related to DBUS;
114
* Let upper layer account for packets/bytes
115
*/
116
typedef struct {
117
uint32 rx_errors;
118
uint32 tx_errors;
119
uint32 rx_dropped;
120
uint32 tx_dropped;
121
} dbus_stats_t;
122
123
/*
124
* Configurable BUS parameters
125
*/
126
typedef struct {
127
bool rxctl_deferrespok;
128
} dbus_config_t;
129
130
/*
131
* External Download Info
132
*/
133
typedef struct dbus_extdl {
134
uint8 *fw;
135
int fwlen;
136
uint8 *vars;
137
int varslen;
138
} dbus_extdl_t;
139
140
struct dbus_callbacks;
141
struct exec_parms;
142
143
typedef void *(*probe_cb_t)(void *arg, const char *desc, uint32 bustype, uint32 hdrlen);
144
typedef void (*disconnect_cb_t)(void *arg);
145
typedef void *(*exec_cb_t)(struct exec_parms *args);
146
147
/* Client callbacks registered during dbus_attach() */
148
typedef struct dbus_callbacks {
149
void (*send_complete)(void *cbarg, void *info, int status);
150
void (*recv_buf)(void *cbarg, uint8 *buf, int len);
151
void (*recv_pkt)(void *cbarg, void *pkt);
152
void (*txflowcontrol)(void *cbarg, bool onoff);
153
void (*errhandler)(void *cbarg, int err);
154
void (*ctl_complete)(void *cbarg, int type, int status);
155
void (*state_change)(void *cbarg, int state);
156
void *(*pktget)(void *cbarg, uint len, bool send);
157
void (*pktfree)(void *cbarg, void *p, bool send);
158
} dbus_callbacks_t;
159
160
struct dbus_pub;
161
struct bcmstrbuf;
162
struct dbus_irb;
163
struct dbus_irb_rx;
164
struct dbus_irb_tx;
165
struct dbus_intf_callbacks;
166
167
typedef struct {
168
void* (*attach)(struct dbus_pub *pub, void *cbarg, struct dbus_intf_callbacks *cbs);
169
void (*detach)(struct dbus_pub *pub, void *bus);
170
171
int (*up)(void *bus);
172
int (*down)(void *bus);
173
int (*send_irb)(void *bus, struct dbus_irb_tx *txirb);
174
int (*recv_irb)(void *bus, struct dbus_irb_rx *rxirb);
175
int (*cancel_irb)(void *bus, struct dbus_irb_tx *txirb);
176
int (*send_ctl)(void *bus, uint8 *buf, int len);
177
int (*recv_ctl)(void *bus, uint8 *buf, int len);
178
int (*get_stats)(void *bus, dbus_stats_t *stats);
179
int (*get_attrib)(void *bus, dbus_attrib_t *attrib);
180
181
int (*pnp)(void *bus, int evnt);
182
int (*remove)(void *bus);
183
int (*resume)(void *bus);
184
int (*suspend)(void *bus);
185
int (*stop)(void *bus);
186
int (*reset)(void *bus);
187
188
/* Access to bus buffers directly */
189
void *(*pktget)(void *bus, int len);
190
void (*pktfree)(void *bus, void *pkt);
191
192
int (*iovar_op)(void *bus, const char *name, void *params, int plen, void *arg, int len,
193
bool set);
194
void (*dump)(void *bus, struct bcmstrbuf *strbuf);
195
int (*set_config)(void *bus, dbus_config_t *config);
196
int (*get_config)(void *bus, dbus_config_t *config);
197
198
bool (*device_exists)(void *bus);
199
bool (*dlneeded)(void *bus);
200
int (*dlstart)(void *bus, uint8 *fw, int len);
201
int (*dlrun)(void *bus);
202
bool (*recv_needed)(void *bus);
203
204
void *(*exec_rxlock)(void *bus, exec_cb_t func, struct exec_parms *args);
205
void *(*exec_txlock)(void *bus, exec_cb_t func, struct exec_parms *args);
206
207
int (*tx_timer_init)(void *bus);
208
int (*tx_timer_start)(void *bus, uint timeout);
209
int (*tx_timer_stop)(void *bus);
210
211
int (*sched_dpc)(void *bus);
212
int (*lock)(void *bus);
213
int (*unlock)(void *bus);
214
int (*sched_probe_cb)(void *bus);
215
216
int (*shutdown)(void *bus);
217
218
int (*recv_stop)(void *bus);
219
int (*recv_resume)(void *bus);
220
221
int (*recv_irb_from_ep)(void *bus, struct dbus_irb_rx *rxirb, uint ep_idx);
222
223
int (*readreg)(void *bus, uint32 regaddr, int datalen, uint32 *value);
224
225
/* Add from the bottom */
226
} dbus_intf_t;
227
228
typedef struct dbus_pub {
229
struct osl_info *osh;
230
dbus_stats_t stats;
231
dbus_attrib_t attrib;
232
enum dbus_state busstate;
233
DEVICE_SPEED device_speed;
234
int ntxq, nrxq, rxsize;
235
void *bus;
236
struct shared_info *sh;
237
void *dev_info;
238
} dbus_pub_t;
239
240
#define BUS_INFO(bus, type) (((type *) bus)->pub->bus)
241
242
#define ALIGNED_LOCAL_VARIABLE(var, align) \
243
uint8 buffer[SDALIGN+64]; \
244
uint8 *var = (uint8 *)(((uintptr)&buffer[0]) & ~(align-1)) + align;
245
246
/* IO Request Block (IRB) */
247
typedef struct dbus_irb {
248
struct dbus_irb *next; /* it's casted from dbus_irb_tx or dbus_irb_rx struct */
249
} dbus_irb_t;
250
251
/* General info for all BUS */
252
typedef struct dbus_irbq {
253
dbus_irb_t *head;
254
dbus_irb_t *tail;
255
int cnt;
256
} dbus_irbq_t;
257
258
typedef struct dbus_irb_rx {
259
struct dbus_irb irb; /* Must be first */
260
uint8 *buf;
261
int buf_len;
262
int actual_len;
263
void *pkt;
264
void *info;
265
void *arg;
266
} dbus_irb_rx_t;
267
268
typedef struct dbus_irb_tx {
269
struct dbus_irb irb; /* Must be first */
270
uint8 *buf;
271
int len;
272
void *pkt;
273
int retry_count;
274
void *info;
275
void *arg;
276
void *send_buf; /* linear bufffer for LINUX when aggreagtion is enabled */
277
} dbus_irb_tx_t;
278
279
280
/* DBUS interface callbacks are different from user callbacks
281
* so, internally, different info can be passed to upper layer
282
*/
283
typedef struct dbus_intf_callbacks {
284
void (*send_irb_timeout)(void *cbarg, dbus_irb_tx_t *txirb);
285
void (*send_irb_complete)(void *cbarg, dbus_irb_tx_t *txirb, int status);
286
void (*recv_irb_complete)(void *cbarg, dbus_irb_rx_t *rxirb, int status);
287
void (*errhandler)(void *cbarg, int err);
288
void (*ctl_complete)(void *cbarg, int type, int status);
289
void (*state_change)(void *cbarg, int state);
290
bool (*isr)(void *cbarg, bool *wantdpc);
291
bool (*dpc)(void *cbarg, bool bounded);
292
void (*watchdog)(void *cbarg);
293
void *(*pktget)(void *cbarg, uint len, bool send);
294
void (*pktfree)(void *cbarg, void *p, bool send);
295
struct dbus_irb* (*getirb)(void *cbarg, bool send);
296
void (*rxerr_indicate)(void *cbarg, bool on);
297
} dbus_intf_callbacks_t;
298
299
300
#if defined(EHCI_FASTPATH_TX) || defined(EHCI_FASTPATH_RX)
301
302
303
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 0))
304
/* Backward compatibility */
305
typedef unsigned int gfp_t;
306
307
#define dma_pool pci_pool
308
#define dma_pool_create(name, dev, size, align, alloc) \
309
pci_pool_create(name, dev, size, align, alloc, GFP_DMA | GFP_ATOMIC)
310
#define dma_pool_destroy(pool) pci_pool_destroy(pool)
311
#define dma_pool_alloc(pool, flags, handle) pci_pool_alloc(pool, flags, handle)
312
#define dma_pool_free(pool, vaddr, addr) pci_pool_free(pool, vaddr, addr)
313
#define dma_map_single(dev, addr, size, dir) pci_map_single(dev, addr, size, dir)
314
#define dma_unmap_single(dev, hnd, size, dir) pci_unmap_single(dev, hnd, size, dir)
315
#define DMA_FROM_DEVICE PCI_DMA_FROMDEVICE
316
#define DMA_TO_DEVICE PCI_DMA_TODEVICE
317
#endif /* (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 0)) */
318
319
/* Availability of these functions varies (when present, they have two arguments) */
320
#ifndef hc32_to_cpu
321
#define hc32_to_cpu(x) le32_to_cpu(x)
322
#define cpu_to_hc32(x) cpu_to_le32(x)
323
typedef unsigned int __hc32;
324
#else
325
#error Two-argument functions needed
326
#endif
327
328
/* Private USB opcode base */
329
#define EHCI_FASTPATH 0x31
330
#define EHCI_SET_EP_BYPASS EHCI_FASTPATH
331
#define EHCI_SET_BYPASS_CB (EHCI_FASTPATH + 1)
332
#define EHCI_SET_BYPASS_DEV (EHCI_FASTPATH + 2)
333
#define EHCI_DUMP_STATE (EHCI_FASTPATH + 3)
334
#define EHCI_SET_BYPASS_POOL (EHCI_FASTPATH + 4)
335
#define EHCI_CLR_EP_BYPASS (EHCI_FASTPATH + 5)
336
337
/*
338
* EHCI QTD structure (hardware and extension)
339
* NOTE that is does not need to (and does not) match its kernel counterpart
340
*/
341
#define EHCI_QTD_NBUFFERS 5
342
#define EHCI_QTD_ALIGN 32
343
#define EHCI_BULK_PACKET_SIZE 512
344
#define EHCI_QTD_XACTERR_MAX 32
345
346
struct ehci_qtd {
347
/* Hardware map */
348
volatile uint32_t qtd_next;
349
volatile uint32_t qtd_altnext;
350
volatile uint32_t qtd_status;
351
#define EHCI_QTD_GET_BYTES(x) (((x)>>16) & 0x7fff)
352
#define EHCI_QTD_IOC 0x00008000
353
#define EHCI_QTD_GET_CERR(x) (((x)>>10) & 0x3)
354
#define EHCI_QTD_SET_CERR(x) ((x) << 10)
355
#define EHCI_QTD_GET_PID(x) (((x)>>8) & 0x3)
356
#define EHCI_QTD_SET_PID(x) ((x) << 8)
357
#define EHCI_QTD_ACTIVE 0x80
358
#define EHCI_QTD_HALTED 0x40
359
#define EHCI_QTD_BUFERR 0x20
360
#define EHCI_QTD_BABBLE 0x10
361
#define EHCI_QTD_XACTERR 0x08
362
#define EHCI_QTD_MISSEDMICRO 0x04
363
volatile uint32_t qtd_buffer[EHCI_QTD_NBUFFERS];
364
volatile uint32_t qtd_buffer_hi[EHCI_QTD_NBUFFERS];
365
366
/* Implementation extension */
367
dma_addr_t qtd_self; /* own hardware address */
368
struct ehci_qtd *obj_next; /* software link to the next QTD */
369
void *rpc; /* pointer to the rpc buffer */
370
size_t length; /* length of the data in the buffer */
371
void *buff; /* pointer to the reassembly buffer */
372
int xacterrs; /* retry counter for qtd xact error */
373
} __attribute__ ((aligned(EHCI_QTD_ALIGN)));
374
375
#define EHCI_NULL __constant_cpu_to_le32(1) /* HW null pointer shall be odd */
376
377
#define SHORT_READ_Q(token) (EHCI_QTD_GET_BYTES(token) != 0 && EHCI_QTD_GET_PID(token) == 1)
378
379
/* Queue Head */
380
/* NOTE This structure is slightly different from the one in the kernel; but needs to stay
381
* compatible
382
*/
383
struct ehci_qh {
384
/* Hardware map */
385
volatile uint32_t qh_link;
386
volatile uint32_t qh_endp;
387
volatile uint32_t qh_endphub;
388
volatile uint32_t qh_curqtd;
389
390
/* QTD overlay */
391
volatile uint32_t ow_next;
392
volatile uint32_t ow_altnext;
393
volatile uint32_t ow_status;
394
volatile uint32_t ow_buffer [EHCI_QTD_NBUFFERS];
395
volatile uint32_t ow_buffer_hi [EHCI_QTD_NBUFFERS];
396
397
/* Extension (should match the kernel layout) */
398
dma_addr_t unused0;
399
void *unused1;
400
struct list_head unused2;
401
struct ehci_qtd *dummy;
402
struct ehci_qh *unused3;
403
404
struct ehci_hcd *unused4;
405
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0))
406
struct kref unused5;
407
unsigned unused6;
408
409
uint8_t unused7;
410
411
/* periodic schedule info */
412
uint8_t unused8;
413
uint8_t unused9;
414
uint8_t unused10;
415
uint16_t unused11;
416
uint16_t unused12;
417
uint16_t unused13;
418
struct usb_device *unused14;
419
#else
420
unsigned unused5;
421
u8 unused6;
422
423
/* periodic schedule info */
424
u8 unused7;
425
u8 unused8;
426
u8 unused9;
427
unsigned short unused10;
428
unsigned short unused11;
429
#define NO_FRAME ((unsigned short)~0)
430
#ifdef EHCI_QUIRK_FIX
431
struct usb_device *unused12;
432
#endif /* EHCI_QUIRK_FIX */
433
#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)) */
434
struct ehci_qtd *first_qtd;
435
/* Link to the first QTD; this is an optimized equivalent of the qtd_list field */
436
/* NOTE that ehci_qh in ehci.h shall reserve this word */
437
} __attribute__ ((aligned(EHCI_QTD_ALIGN)));
438
439
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 0))
440
/* The corresponding structure in the kernel is used to get the QH */
441
struct hcd_dev { /* usb_device.hcpriv points to this */
442
struct list_head unused0;
443
struct list_head unused1;
444
445
/* array of QH pointers */
446
void *ep[32];
447
};
448
#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)) */
449
#endif /* EHCI_FASTPATH_TX || EHCI_FASTPATH_RX */
450
451
/*
452
* Public Bus Function Interface
453
*/
454
extern int dbus_register(int vid, int pid, probe_cb_t prcb, disconnect_cb_t discb, void *prarg,
455
void *param1, void *param2);
456
extern int dbus_deregister(void);
457
extern dbus_pub_t *dbus_attach(struct osl_info *osh, int rxsize, int nrxq, int ntxq,
458
void *cbarg, dbus_callbacks_t *cbs, dbus_extdl_t *extdl, struct shared_info *sh);
459
extern void dbus_detach(dbus_pub_t *pub);
460
extern int dbus_up(dbus_pub_t *pub);
461
extern int dbus_down(dbus_pub_t *pub);
462
extern int dbus_stop(dbus_pub_t *pub);
463
extern int dbus_shutdown(dbus_pub_t *pub);
464
extern void dbus_flowctrl_rx(dbus_pub_t *pub, bool on);
465
extern int dbus_send_buf(dbus_pub_t *pub, uint8 *buf, int len, void *info);
466
extern int dbus_send_pkt(dbus_pub_t *pub, void *pkt, void *info);
467
extern int dbus_send_ctl(dbus_pub_t *pub, uint8 *buf, int len);
468
extern int dbus_recv_ctl(dbus_pub_t *pub, uint8 *buf, int len);
469
extern int dbus_recv_bulk(dbus_pub_t *pub, uint32 ep_idx);
470
extern int dbus_get_stats(dbus_pub_t *pub, dbus_stats_t *stats);
471
extern int dbus_get_attrib(dbus_pub_t *pub, dbus_attrib_t *attrib);
472
extern int dbus_get_device_speed(dbus_pub_t *pub);
473
extern int dbus_set_config(dbus_pub_t *pub, dbus_config_t *config);
474
extern int dbus_get_config(dbus_pub_t *pub, dbus_config_t *config);
475
extern void * dbus_get_devinfo(dbus_pub_t *pub);
476
extern void *dbus_pktget(dbus_pub_t *pub, int len);
477
extern void dbus_pktfree(dbus_pub_t *pub, void* pkt);
478
extern int dbus_set_errmask(dbus_pub_t *pub, uint32 mask);
479
extern int dbus_pnp_sleep(dbus_pub_t *pub);
480
extern int dbus_pnp_resume(dbus_pub_t *pub, int *fw_reload);
481
extern int dbus_pnp_disconnect(dbus_pub_t *pub);
482
extern int dbus_iovar_op(dbus_pub_t *pub, const char *name,
483
void *params, int plen, void *arg, int len, bool set);
484
extern void *dhd_dbus_txq(const dbus_pub_t *pub);
485
extern uint dhd_dbus_hdrlen(const dbus_pub_t *pub);
486
extern void dbus_flowctrl_tx(void *dbi, bool on);
487
#if defined(BCM_REQUEST_FW)
488
extern void *dbus_get_fw_nvfile(int devid, uint8 **fw, int *fwlen, int type,
489
uint16 boardtype, uint16 boardrev);
490
extern void dbus_release_fw_nvfile(void *firmware);
491
#endif /* #if defined(BCM_REQUEST_FW) */
492
493
/*
494
* Bus specific Interface
495
* Implemented by dbus_usb.c/dbus_sdio.c
496
*/
497
extern int dbus_bus_register(int vid, int pid, probe_cb_t prcb, disconnect_cb_t discb, void *prarg,
498
dbus_intf_t **intf, void *param1, void *param2);
499
extern int dbus_bus_deregister(void);
500
extern void dbus_bus_fw_get(void *bus, uint8 **fw, int *fwlen, int *decomp);
501
502
/*
503
* Bus-specific and OS-specific Interface
504
* Implemented by dbus_usb_[linux/ndis].c/dbus_sdio_[linux/ndis].c
505
*/
506
extern int dbus_bus_osl_register(int vid, int pid, probe_cb_t prcb, disconnect_cb_t discb,
507
void *prarg, dbus_intf_t **intf, void *param1, void *param2);
508
extern int dbus_bus_osl_deregister(void);
509
extern int dbus_bus_osl_hw_register(int vid, int pid, probe_cb_t prcb, disconnect_cb_t discb,
510
void *prarg, dbus_intf_t **intf);
511
extern int dbus_bus_osl_hw_deregister(void);
512
extern uint usbdev_bulkin_eps(void);
513
514
#if defined(EHCI_FASTPATH_TX) || defined(EHCI_FASTPATH_RX)
515
extern int optimize_qtd_fill_with_rpc(const dbus_pub_t *pub, int epn, struct ehci_qtd *qtd,
516
void *rpc, int token, int len);
517
extern int optimize_submit_async(struct ehci_qtd *qtd, int epn);
518
extern struct ehci_qtd *optimize_ehci_qtd_alloc(gfp_t flags);
519
extern void optimize_ehci_qtd_free(struct ehci_qtd *qtd);
520
extern void optimize_submit_rx_request(const dbus_pub_t *pub, int epn, struct ehci_qtd *qtd_in,
521
void *buf);
522
#endif /* EHCI_FASTPATH_TX || EHCI_FASTPATH_RX */
523
#endif /* __DBUS_H__ */
524
525