1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20#ifndef __CARD_SDIO_H__
21#define __CARD_SDIO_H__
22
23#include "csr_wifi_hip_unifi.h"
24#include "csr_wifi_hip_unifi_udi.h"
25#include "csr_wifi_hip_unifihw.h"
26#include "csr_wifi_hip_unifiversion.h"
27#ifndef CSR_WIFI_HIP_TA_DISABLE
28#include "csr_wifi_hip_ta_sampling.h"
29#endif
30#include "csr_wifi_hip_xbv.h"
31#include "csr_wifi_hip_chiphelper.h"
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48#define RESUME_XMIT_THRESHOLD 4
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63#define TO_HOST_FLUSH_THRESHOLD (500 * 5)
64
65
66
67#define SDIO_CCCR_SDIO_REVISION (0x00)
68#define SDIO_SD_SPEC_REVISION (0x01)
69#define SDIO_IO_ENABLE (0x02)
70#define SDIO_IO_READY (0x03)
71#define SDIO_INT_ENABLE (0x04)
72#define SDIO_INT_PENDING (0x05)
73#define SDIO_IO_ABORT (0x06)
74#define SDIO_BUS_IFACE_CONTROL (0x07)
75#define SDIO_CARD_CAPABILOTY (0x08)
76#define SDIO_COMMON_CIS_POINTER (0x09)
77#define SDIO_BUS_SUSPEND (0x0C)
78#define SDIO_FUNCTION_SELECT (0x0D)
79#define SDIO_EXEC_FLAGS (0x0E)
80#define SDIO_READY_FLAGS (0x0F)
81#define SDIO_FN0_BLOCK_SIZE (0x10)
82#define SDIO_POWER_CONTROL (0x12)
83#define SDIO_VENDOR_START (0xF0)
84
85#define SDIO_CSR_HOST_WAKEUP (0xf0)
86#define SDIO_CSR_HOST_INT_CLEAR (0xf1)
87#define SDIO_CSR_FROM_HOST_SCRATCH0 (0xf2)
88#define SDIO_CSR_FROM_HOST_SCRATCH1 (0xf3)
89#define SDIO_CSR_TO_HOST_SCRATCH0 (0xf4)
90#define SDIO_CSR_TO_HOST_SCRATCH1 (0xf5)
91#define SDIO_CSR_FUNC_EN (0xf6)
92#define SDIO_CSR_CSPI_MODE (0xf7)
93#define SDIO_CSR_CSPI_STATUS (0xf8)
94#define SDIO_CSR_CSPI_PADDING (0xf9)
95
96
97#define UNIFI_SD_INT_ENABLE_IENM 0x0001
98
99#ifdef CSR_PRE_ALLOC_NET_DATA
100#define BULK_DATA_PRE_ALLOC_NUM 16
101#endif
102
103
104
105
106typedef struct
107{
108
109
110
111
112
113
114 u16 version;
115
116
117
118
119
120 u16 sdio_ctrl_offset;
121
122
123 u16 fromhost_sigbuf_handle;
124
125
126 u16 tohost_sigbuf_handle;
127
128
129
130
131
132 u16 num_fromhost_sig_frags;
133
134
135
136
137
138
139
140
141
142
143
144 u16 num_tohost_sig_frags;
145
146
147
148
149
150 u16 num_fromhost_data_slots;
151
152
153
154
155
156 u16 num_tohost_data_slots;
157
158
159
160
161
162
163 u16 data_slot_size;
164
165
166
167
168
169 u16 initialised;
170
171
172 u32 overlay_size;
173
174
175 u16 data_slot_round;
176 u16 sig_frag_size;
177
178
179 u16 tohost_signal_padding;
180} sdio_config_data_t;
181
182
183
184
185
186
187
188
189#define SDIO_CONFIG_DATA_SIZE 30
190
191
192#define SDIO_INIT_FLAG_OFFSET 0x12
193#define SDIO_TO_HOST_SIG_PADDING_OFFSET 0x1C
194
195
196
197typedef struct
198{
199 u16 cmd_and_len;
200 u16 data_slot;
201 u16 offset;
202 u16 buffer_handle;
203} bulk_data_cmd_t;
204
205
206
207#define SDIO_CMD_SIGNAL 0x00
208#define SDIO_CMD_TO_HOST_TRANSFER 0x01
209#define SDIO_CMD_TO_HOST_TRANSFER_ACK 0x02
210#define SDIO_CMD_FROM_HOST_TRANSFER 0x03
211#define SDIO_CMD_FROM_HOST_TRANSFER_ACK 0x04
212#define SDIO_CMD_CLEAR_SLOT 0x05
213#define SDIO_CMD_OVERLAY_TRANSFER 0x06
214#define SDIO_CMD_OVERLAY_TRANSFER_ACK 0x07
215#define SDIO_CMD_FROM_HOST_AND_CLEAR 0x08
216#define SDIO_CMD_PADDING 0x0f
217
218#define SLOT_DIR_TO_HOST 0x8000
219
220
221
222
223
224
225#define UNIFI_INIT_BULK_DATA(bulk_data_slot) \
226 { \
227 (bulk_data_slot)->os_data_ptr = NULL; \
228 (bulk_data_slot)->data_length = 0; \
229 (bulk_data_slot)->os_net_buf_ptr = NULL; \
230 (bulk_data_slot)->net_buf_length = 0; \
231 }
232
233
234
235
236
237
238
239
240
241
242
243typedef struct card_signal
244{
245 u8 sigbuf[UNIFI_PACKED_SIGBUF_SIZE];
246
247
248 u16 signal_length;
249
250 bulk_data_desc_t bulkdata[UNIFI_MAX_DATA_REFERENCES];
251} card_signal_t;
252
253
254
255
256
257#define UNIFI_QUEUE_NAME_MAX_LENGTH 16
258typedef struct
259{
260 card_signal_t *q_body;
261
262
263 u16 q_length;
264
265 u16 q_wr_ptr;
266 u16 q_rd_ptr;
267
268 char name[UNIFI_QUEUE_NAME_MAX_LENGTH];
269} q_t;
270
271
272#define UNIFI_RESERVED_COMMAND_SLOTS 2
273
274
275#define UNIFI_PACKETS_INTERVAL 1000
276
277
278
279
280typedef struct
281{
282 u16 from_host_used_slots[UNIFI_NO_OF_TX_QS];
283 u16 from_host_max_slots[UNIFI_NO_OF_TX_QS];
284 u16 from_host_reserved_slots[UNIFI_NO_OF_TX_QS];
285
286
287
288
289
290
291
292 u16 packets_txed[UNIFI_NO_OF_TX_QS];
293 u16 total_packets_txed;
294
295
296 u16 packets_interval;
297
298
299 u8 queue_stable[UNIFI_NO_OF_TX_QS];
300} card_dynamic_slot_t;
301
302
303
304
305
306
307
308
309
310
311
312#define CSR_WIFI_HIP_Q_SLOTS_USED(q) \
313 (((q)->q_wr_ptr - (q)->q_rd_ptr < 0)? \
314 ((q)->q_wr_ptr - (q)->q_rd_ptr + (q)->q_length) : ((q)->q_wr_ptr - (q)->q_rd_ptr))
315
316
317
318
319
320
321
322#define CSR_WIFI_HIP_Q_SLOTS_FREE(q) \
323 ((q)->q_length - CSR_WIFI_HIP_Q_SLOTS_USED((q)) - 1)
324
325
326
327
328
329
330
331
332#define CSR_WIFI_HIP_Q_SLOT_DATA(q, slot) \
333 ((q)->q_body + slot)
334
335
336
337
338
339
340
341#define CSR_WIFI_HIP_Q_NEXT_R_SLOT(q) \
342 ((q)->q_rd_ptr)
343
344
345
346
347
348
349
350#define CSR_WIFI_HIP_Q_NEXT_W_SLOT(q) \
351 ((q)->q_wr_ptr)
352
353
354
355
356
357
358
359
360#define CSR_WIFI_HIP_Q_WRAP(q, x) \
361 ((((x) >= (q)->q_length)?((x) % (q)->q_length) : (x)))
362
363
364
365
366
367#define CSR_WIFI_HIP_Q_INC_R(q) \
368 ((q)->q_rd_ptr = CSR_WIFI_HIP_Q_WRAP((q), (q)->q_rd_ptr + 1))
369
370
371
372
373
374#define CSR_WIFI_HIP_Q_INC_W(q) \
375 ((q)->q_wr_ptr = CSR_WIFI_HIP_Q_WRAP((q), (q)->q_wr_ptr + 1))
376
377enum unifi_host_state
378{
379 UNIFI_HOST_STATE_AWAKE = 0,
380 UNIFI_HOST_STATE_DROWSY = 1,
381 UNIFI_HOST_STATE_TORPID = 2
382};
383
384typedef struct
385{
386 bulk_data_desc_t bd;
387 unifi_TrafficQueue queue;
388} slot_desc_t;
389
390
391
392
393struct card
394{
395
396
397
398
399 void *ospriv;
400
401
402
403
404
405
406 u32 *fh_slot_host_tag_record;
407
408
409
410 u32 build_id;
411 char build_id_string[128];
412
413
414 u16 chip_id;
415
416
417 u16 chip_version;
418
419
420 u8 function;
421
422
423 ChipDescript *helper;
424
425
426
427
428
429
430 s32 loader_led_mask;
431
432
433
434
435
436
437
438#define card_is_tx_q_paused(card, q) (card->tx_q_paused_flag[q])
439#define card_tx_q_unpause(card, q) (card->tx_q_paused_flag[q] = 0)
440#define card_tx_q_pause(card, q) (card->tx_q_paused_flag[q] = 1)
441
442 u16 tx_q_paused_flag[UNIFI_TRAFFIC_Q_MAX + 1 + UNIFI_NO_OF_TX_QS];
443
444
445 udi_func_t udi_hook;
446
447 u8 bh_reason_host;
448 u8 bh_reason_unifi;
449
450
451 u8 request_max_clock;
452
453
454 u32 sdio_clock_speed;
455
456
457
458
459
460 enum unifi_host_state host_state;
461
462 enum unifi_low_power_mode low_power_mode;
463 enum unifi_periodic_wake_mode periodic_wake_mode;
464
465
466
467
468
469
470
471
472
473
474
475 card_signal_t fh_command_q_body[UNIFI_SOFT_COMMAND_Q_LENGTH];
476 q_t fh_command_queue;
477
478 card_signal_t fh_traffic_q_body[UNIFI_NO_OF_TX_QS][UNIFI_SOFT_TRAFFIC_Q_LENGTH];
479 q_t fh_traffic_queue[UNIFI_NO_OF_TX_QS];
480
481
482
483
484
485
486
487
488
489 s32 from_host_signals_w;
490 s32 from_host_signals_r;
491 s32 to_host_signals_r;
492 s32 to_host_signals_w;
493
494
495
496
497
498
499
500
501#define UNIFI_FH_BUF_SIZE 1024
502 struct sigbuf
503 {
504 u8 *buf;
505 u8 *ptr;
506 u16 count;
507 u16 bufsize;
508 } fh_buffer;
509 struct sigbuf th_buffer;
510
511
512
513
514
515
516
517 u32 unifi_interrupt_seq;
518 u8 generate_interrupt;
519
520
521
522 slot_desc_t *from_host_data;
523 bulk_data_desc_t *to_host_data;
524
525
526
527
528
529
530
531 s16 from_host_data_head;
532
533
534 card_dynamic_slot_t dynamic_slot_data;
535
536
537
538
539
540
541 CsrSdioFunction *sdio_if;
542
543
544 sdio_config_data_t config_data;
545
546
547 u32 init_flag_addr;
548 u32 sdio_ctrl_addr;
549
550
551 u32 proc_select;
552 u32 dmem_page;
553 u32 pmem_page;
554
555
556 u32 sdio_bytes_read;
557 u32 sdio_bytes_written;
558
559 u8 memory_resources_allocated;
560
561
562 u16 sdio_io_block_size;
563
564
565 u8 sdio_io_block_pad;
566
567
568 struct FWOV fwov;
569
570#ifndef CSR_WIFI_HIP_TA_DISABLE
571
572 ta_data_t ta_sampling;
573#endif
574
575
576 s16 request_coredump_on_reset;
577 struct coredump_buf *dump_buf;
578 struct coredump_buf *dump_next_write;
579 struct coredump_buf *dump_cur_read;
580
581#ifdef CSR_WIFI_HIP_DATA_PLANE_PROFILE
582 struct cmd_profile
583 {
584 u32 cmd52_count;
585 u32 cmd53_count;
586 u32 tx_count;
587 u32 tx_cfm_count;
588 u32 rx_count;
589 u32 bh_count;
590 u32 process_count;
591 u32 protocol_count;
592
593 u32 cmd52_f0_r_count;
594 u32 cmd52_f0_w_count;
595 u32 cmd52_r8or16_count;
596 u32 cmd52_w8or16_count;
597 u32 cmd52_r16_count;
598 u32 cmd52_w16_count;
599 u32 cmd52_r32_count;
600
601 u32 sdio_cmd_signal;
602 u32 sdio_cmd_clear_slot;
603 u32 sdio_cmd_to_host;
604 u32 sdio_cmd_from_host;
605 u32 sdio_cmd_from_host_and_clear;
606 } hip_prof;
607 struct cmd_profile cmd_prof;
608#endif
609
610
611 u32 intmode;
612
613#ifdef UNIFI_DEBUG
614 u8 lsb;
615#endif
616
617
618 u32 panic_data_phy_addr;
619 u32 panic_data_mac_addr;
620 u16 last_phy_panic_code;
621 u16 last_phy_panic_arg;
622 u16 last_mac_panic_code;
623 u16 last_mac_panic_arg;
624#ifdef CSR_PRE_ALLOC_NET_DATA
625 bulk_data_desc_t bulk_data_desc_list[BULK_DATA_PRE_ALLOC_NUM];
626 u16 prealloc_netdata_r;
627 u16 prealloc_netdata_w;
628#endif
629};
630
631
632
633enum unifi_reset_type
634{
635 UNIFI_COLD_RESET = 1,
636 UNIFI_WARM_RESET = 2
637};
638
639
640
641
642
643
644
645
646
647
648CsrResult unifi_set_host_state(card_t *card, enum unifi_host_state state);
649
650
651CsrResult unifi_set_proc_select(card_t *card, enum unifi_dbg_processors_select select);
652s32 card_read_signal_counts(card_t *card);
653bulk_data_desc_t* card_find_data_slot(card_t *card, s16 slot);
654
655
656CsrResult unifi_read32(card_t *card, u32 unifi_addr, u32 *pdata);
657CsrResult unifi_readnz(card_t *card, u32 unifi_addr,
658 void *pdata, u16 len);
659s32 unifi_read_shared_count(card_t *card, u32 addr);
660
661CsrResult unifi_writen(card_t *card, u32 unifi_addr, void *pdata, u16 len);
662
663CsrResult unifi_bulk_rw(card_t *card, u32 handle,
664 void *pdata, u32 len, s16 direction);
665CsrResult unifi_bulk_rw_noretry(card_t *card, u32 handle,
666 void *pdata, u32 len, s16 direction);
667#define UNIFI_SDIO_READ 0
668#define UNIFI_SDIO_WRITE 1
669
670CsrResult unifi_read_8_or_16(card_t *card, u32 unifi_addr, u8 *pdata);
671CsrResult unifi_write_8_or_16(card_t *card, u32 unifi_addr, u8 data);
672CsrResult unifi_read_direct_8_or_16(card_t *card, u32 addr, u8 *pdata);
673CsrResult unifi_write_direct_8_or_16(card_t *card, u32 addr, u8 data);
674
675CsrResult unifi_read_direct16(card_t *card, u32 addr, u16 *pdata);
676CsrResult unifi_read_direct32(card_t *card, u32 addr, u32 *pdata);
677CsrResult unifi_read_directn(card_t *card, u32 addr, void *pdata, u16 len);
678
679CsrResult unifi_write_direct16(card_t *card, u32 addr, u16 data);
680CsrResult unifi_write_directn(card_t *card, u32 addr, void *pdata, u16 len);
681
682CsrResult sdio_read_f0(card_t *card, u32 addr, u8 *pdata);
683CsrResult sdio_write_f0(card_t *card, u32 addr, u8 data);
684
685void unifi_read_panic(card_t *card);
686#ifdef CSR_PRE_ALLOC_NET_DATA
687void prealloc_netdata_free(card_t *card);
688CsrResult prealloc_netdata_alloc(card_t *card);
689#endif
690
691void dump(void *mem, u16 len);
692void dump16(void *mem, u16 len);
693
694#endif
695