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/bcmsdstd.h
Views: 3959
1
/*
2
* 'Standard' SDIO HOST CONTROLLER driver
3
*
4
* $ Copyright Open Broadcom Corporation $
5
*
6
* $Id: bcmsdstd.h 324979 2012-03-30 23:47:19Z $
7
*/
8
#ifndef _BCM_SD_STD_H
9
#define _BCM_SD_STD_H
10
11
/* global msglevel for debug messages - bitvals come from sdiovar.h */
12
#define sd_err(x) do { if (sd_msglevel & SDH_ERROR_VAL) printf x; } while (0)
13
#define sd_trace(x)
14
#define sd_info(x)
15
#define sd_debug(x)
16
#define sd_data(x)
17
#define sd_ctrl(x)
18
#define sd_dma(x)
19
20
#define sd_sync_dma(sd, read, nbytes)
21
#define sd_init_dma(sd)
22
#define sd_ack_intr(sd)
23
#define sd_wakeup(sd);
24
/* Allocate/init/free per-OS private data */
25
extern int sdstd_osinit(sdioh_info_t *sd);
26
extern void sdstd_osfree(sdioh_info_t *sd);
27
28
#define sd_log(x)
29
30
#define SDIOH_ASSERT(exp) \
31
do { if (!(exp)) \
32
printf("!!!ASSERT fail: file %s lines %d", __FILE__, __LINE__); \
33
} while (0)
34
35
#define BLOCK_SIZE_4318 64
36
#define BLOCK_SIZE_4328 512
37
38
/* internal return code */
39
#define SUCCESS 0
40
#define ERROR 1
41
42
/* private bus modes */
43
#define SDIOH_MODE_SPI 0
44
#define SDIOH_MODE_SD1 1
45
#define SDIOH_MODE_SD4 2
46
47
#define MAX_SLOTS 6 /* For PCI: Only 6 BAR entries => 6 slots */
48
#define SDIOH_REG_WINSZ 0x100 /* Number of registers in Standard Host Controller */
49
50
#define SDIOH_TYPE_ARASAN_HDK 1
51
#define SDIOH_TYPE_BCM27XX 2
52
#define SDIOH_TYPE_TI_PCIXX21 4 /* TI PCIxx21 Standard Host Controller */
53
#define SDIOH_TYPE_RICOH_R5C822 5 /* Ricoh Co Ltd R5C822 SD/SDIO/MMC/MS/MSPro Host Adapter */
54
#define SDIOH_TYPE_JMICRON 6 /* JMicron Standard SDIO Host Controller */
55
56
/* For linux, allow yielding for dongle */
57
#define BCMSDYIELD
58
59
/* Expected card status value for CMD7 */
60
#define SDIOH_CMD7_EXP_STATUS 0x00001E00
61
62
#define RETRIES_LARGE 100000
63
#define sdstd_os_yield(sd) do {} while (0)
64
#define RETRIES_SMALL 100
65
66
67
#define USE_BLOCKMODE 0x2 /* Block mode can be single block or multi */
68
#define USE_MULTIBLOCK 0x4
69
70
#define USE_FIFO 0x8 /* Fifo vs non-fifo */
71
72
#define CLIENT_INTR 0x100 /* Get rid of this! */
73
74
#define HC_INTR_RETUNING 0x1000
75
76
77
struct sdioh_info {
78
uint cfg_bar; /* pci cfg address for bar */
79
uint32 caps; /* cached value of capabilities reg */
80
uint32 curr_caps; /* max current capabilities reg */
81
82
osl_t *osh; /* osh handler */
83
volatile char *mem_space; /* pci device memory va */
84
uint lockcount; /* nest count of sdstd_lock() calls */
85
bool client_intr_enabled; /* interrupt connnected flag */
86
bool intr_handler_valid; /* client driver interrupt handler valid */
87
sdioh_cb_fn_t intr_handler; /* registered interrupt handler */
88
void *intr_handler_arg; /* argument to call interrupt handler */
89
bool initialized; /* card initialized */
90
uint target_dev; /* Target device ID */
91
uint16 intmask; /* Current active interrupts */
92
void *sdos_info; /* Pointer to per-OS private data */
93
94
uint32 controller_type; /* Host controller type */
95
uint8 version; /* Host Controller Spec Compliance Version */
96
uint irq; /* Client irq */
97
int intrcount; /* Client interrupts */
98
int local_intrcount; /* Controller interrupts */
99
bool host_init_done; /* Controller initted */
100
bool card_init_done; /* Client SDIO interface initted */
101
bool polled_mode; /* polling for command completion */
102
103
bool sd_blockmode; /* sd_blockmode == FALSE => 64 Byte Cmd 53s. */
104
/* Must be on for sd_multiblock to be effective */
105
bool use_client_ints; /* If this is false, make sure to restore */
106
/* polling hack in wl_linux.c:wl_timer() */
107
int adapter_slot; /* Maybe dealing with multiple slots/controllers */
108
int sd_mode; /* SD1/SD4/SPI */
109
int client_block_size[SDIOD_MAX_IOFUNCS]; /* Blocksize */
110
uint32 data_xfer_count; /* Current transfer */
111
uint16 card_rca; /* Current Address */
112
int8 sd_dma_mode; /* DMA Mode (PIO, SDMA, ... ADMA2) on CMD53 */
113
uint8 num_funcs; /* Supported funcs on client */
114
uint32 com_cis_ptr;
115
uint32 func_cis_ptr[SDIOD_MAX_FUNCS];
116
void *dma_buf; /* DMA Buffer virtual address */
117
ulong dma_phys; /* DMA Buffer physical address */
118
void *adma2_dscr_buf; /* ADMA2 Descriptor Buffer virtual address */
119
ulong adma2_dscr_phys; /* ADMA2 Descriptor Buffer physical address */
120
121
/* adjustments needed to make the dma align properly */
122
void *dma_start_buf;
123
ulong dma_start_phys;
124
uint alloced_dma_size;
125
void *adma2_dscr_start_buf;
126
ulong adma2_dscr_start_phys;
127
uint alloced_adma2_dscr_size;
128
129
int r_cnt; /* rx count */
130
int t_cnt; /* tx_count */
131
bool got_hcint; /* local interrupt flag */
132
uint16 last_intrstatus; /* to cache intrstatus */
133
int host_UHSISupported; /* whether UHSI is supported for HC. */
134
int card_UHSI_voltage_Supported; /* whether UHSI is supported for
135
* Card in terms of Voltage [1.8 or 3.3].
136
*/
137
int global_UHSI_Supp; /* type of UHSI support in both host and card.
138
* HOST_SDR_UNSUPP: capabilities not supported/matched
139
* HOST_SDR_12_25: SDR12 and SDR25 supported
140
* HOST_SDR_50_104_DDR: one of SDR50/SDR104 or DDR50 supptd
141
*/
142
volatile int sd3_dat_state; /* data transfer state used for retuning check */
143
volatile int sd3_tun_state; /* tuning state used for retuning check */
144
bool sd3_tuning_reqd; /* tuning requirement parameter */
145
uint32 caps3; /* cached value of 32 MSbits capabilities reg (SDIO 3.0) */
146
};
147
148
#define DMA_MODE_NONE 0
149
#define DMA_MODE_SDMA 1
150
#define DMA_MODE_ADMA1 2
151
#define DMA_MODE_ADMA2 3
152
#define DMA_MODE_ADMA2_64 4
153
#define DMA_MODE_AUTO -1
154
155
#define USE_DMA(sd) ((bool)((sd->sd_dma_mode > 0) ? TRUE : FALSE))
156
157
/* States for Tuning and corr data */
158
#define TUNING_IDLE 0
159
#define TUNING_START 1
160
#define TUNING_START_AFTER_DAT 2
161
#define TUNING_ONGOING 3
162
163
#define DATA_TRANSFER_IDLE 0
164
#define DATA_TRANSFER_ONGOING 1
165
166
#define CHECK_TUNING_PRE_DATA 1
167
#define CHECK_TUNING_POST_DATA 2
168
169
/************************************************************
170
* Internal interfaces: per-port references into bcmsdstd.c
171
*/
172
173
/* Global message bits */
174
extern uint sd_msglevel;
175
176
/* OS-independent interrupt handler */
177
extern bool check_client_intr(sdioh_info_t *sd);
178
179
/* Core interrupt enable/disable of device interrupts */
180
extern void sdstd_devintr_on(sdioh_info_t *sd);
181
extern void sdstd_devintr_off(sdioh_info_t *sd);
182
183
/* Enable/disable interrupts for local controller events */
184
extern void sdstd_intrs_on(sdioh_info_t *sd, uint16 norm, uint16 err);
185
extern void sdstd_intrs_off(sdioh_info_t *sd, uint16 norm, uint16 err);
186
187
/* Wait for specified interrupt and error bits to be set */
188
extern void sdstd_spinbits(sdioh_info_t *sd, uint16 norm, uint16 err);
189
190
191
/**************************************************************
192
* Internal interfaces: bcmsdstd.c references to per-port code
193
*/
194
195
/* Register mapping routines */
196
extern uint32 *sdstd_reg_map(osl_t *osh, int32 addr, int size);
197
extern void sdstd_reg_unmap(osl_t *osh, int32 addr, int size);
198
199
/* Interrupt (de)registration routines */
200
extern int sdstd_register_irq(sdioh_info_t *sd, uint irq);
201
extern void sdstd_free_irq(uint irq, sdioh_info_t *sd);
202
203
/* OS-specific interrupt wrappers (atomic interrupt enable/disable) */
204
extern void sdstd_lock(sdioh_info_t *sd);
205
extern void sdstd_unlock(sdioh_info_t *sd);
206
extern void sdstd_waitlockfree(sdioh_info_t *sd);
207
208
/* OS-specific wait-for-interrupt-or-status */
209
extern int sdstd_waitbits(sdioh_info_t *sd, uint16 norm, uint16 err, bool yield, uint16 *bits);
210
211
/* used by bcmsdstd_linux [implemented in sdstd] */
212
extern void sdstd_3_enable_retuning_int(sdioh_info_t *sd);
213
extern void sdstd_3_disable_retuning_int(sdioh_info_t *sd);
214
extern bool sdstd_3_is_retuning_int_set(sdioh_info_t *sd);
215
extern void sdstd_3_check_and_do_tuning(sdioh_info_t *sd, int tuning_param);
216
extern bool sdstd_3_check_and_set_retuning(sdioh_info_t *sd);
217
extern int sdstd_3_get_tune_state(sdioh_info_t *sd);
218
extern int sdstd_3_get_data_state(sdioh_info_t *sd);
219
extern void sdstd_3_set_tune_state(sdioh_info_t *sd, int state);
220
extern void sdstd_3_set_data_state(sdioh_info_t *sd, int state);
221
extern uint8 sdstd_3_get_tuning_exp(sdioh_info_t *sd);
222
extern uint32 sdstd_3_get_uhsi_clkmode(sdioh_info_t *sd);
223
extern int sdstd_3_clk_tuning(sdioh_info_t *sd, uint32 sd3ClkMode);
224
225
/* used by sdstd [implemented in bcmsdstd_linux/ndis] */
226
extern void sdstd_3_start_tuning(sdioh_info_t *sd);
227
extern void sdstd_3_osinit_tuning(sdioh_info_t *sd);
228
extern void sdstd_3_osclean_tuning(sdioh_info_t *sd);
229
230
#endif /* _BCM_SD_STD_H */
231
232