hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
/******************************************************************************
 *
 * Copyright(c) 2019 - 2021 Realtek Corporation.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of version 2 of the GNU General Public License as
 * published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
 * more details.
 *
 *****************************************************************************/
#ifndef _PHL_STRUCT_H_
#define _PHL_STRUCT_H_
 
#define PHL_STA_TID_NUM (16)    /* TODO: */
 
struct hci_info_t {
   /* enum rtw_hci_type hci_type; */
 
#if defined(CONFIG_PCI_HCI)
 
   u8 total_txch_num;
   u8 total_rxch_num;
   u8 *txbd_buf;
   u8 *rxbd_buf;
#if defined(PCIE_TRX_MIT_EN)
   u8 fixed_mitigation; /*no watchdog dynamic setting*/
   u8 rx_mit_counter_high;
   u32 rx_mit_timer_high;
#endif
   void *wd_dma_pool;
   void *h2c_dma_pool;
#elif defined(CONFIG_USB_HCI)
   u16 usb_bulkout_size;
#elif defined(CONFIG_SDIO_HCI)
   u32 tx_drop_cnt;    /* bit31 means overflow or not */
#ifdef SDIO_TX_THREAD
   _os_sema tx_thrd_sema;
   _os_thread tx_thrd;
#ifdef CONFIG_PHL_SDIO_TX_CB_THREAD
#ifndef RTW_WKARD_SDIO_TX_USE_YIELD
   _os_lock tx_buf_lock;
   _os_event *tx_buf_event;
#endif /* !RTW_WKARD_SDIO_TX_USE_YIELD */
#endif /* CONFIG_PHL_SDIO_TX_CB_THREAD */
#endif /* SDIO_TX_THREAD */
#endif
 
   u8 *wd_ring;
   u8 *txbuf_pool;
   u8 *rxbuf_pool;
   u8 *wp_tag;
   u16 wp_seq[PHL_MACID_MAX_NUM];     /* maximum macid number */
 
};
 
 
#define MAX_PHL_RING_STATUS_NUMBER PHL_MACID_MAX_NUM
#define RX_REORDER_RING_NUMBER PHL_MACID_MAX_NUM
#define PCIE_BUS_EFFICIENCY 4
#define ETH_ALEN 6
 
struct phl_ring_status {
   _os_list list;
   u8 band;/*0 or 1*/
   u8 wmm;/*0 or 1*/
   u8 port;
   /*u8 mbssid*/
   u16 req_busy;
   struct rtw_phl_tx_ring *ring_ptr;
};
 
struct phl_ring_sts_pool {
   struct phl_ring_status ring_sts[MAX_PHL_RING_STATUS_NUMBER];
   _os_list idle;
   _os_list busy;
   _os_lock idle_lock;
   _os_lock busy_lock;
};
 
/**
 * struct phl_hci_trx_ops - interface specific operations
 *
 * @hci_trx_init: the function for HCI trx init
 * @hci_trx_deinit: the function for HCI trx deinit
 * @prepare_tx: prepare packets for hal transmission
 * @recycle_rx_buf: recycle rx buffer
 * @tx: tx packet to hw
 * @rx: rx packet to sw
 */
struct phl_info_t;
struct phl_hci_trx_ops {
   enum rtw_phl_status (*hci_trx_init)(struct phl_info_t *phl);
   void (*hci_trx_deinit)(struct phl_info_t *phl);
   enum rtw_phl_status (*prepare_tx)(struct phl_info_t *phl,
                   struct rtw_xmit_req *tx_req);
   enum rtw_phl_status (*recycle_rx_buf)(struct phl_info_t *phl,
                   void *r, u8 ch, enum rtw_rx_type type);
   enum rtw_phl_status (*tx)(struct phl_info_t *phl);
   enum rtw_phl_status (*rx)(struct phl_info_t *phl);
   enum rtw_phl_status (*trx_cfg)(struct phl_info_t *phl);
   void (*trx_stop)(struct phl_info_t *phl);
   enum rtw_phl_status (*pltfm_tx)(struct phl_info_t *phl, void *pkt);
   void (*free_h2c_pkt_buf)(struct phl_info_t *phl_info,
                  struct rtw_h2c_pkt *_h2c_pkt);
   enum rtw_phl_status (*alloc_h2c_pkt_buf)(struct phl_info_t *phl_info,
       struct rtw_h2c_pkt *_h2c_pkt, u32 buf_len);
   void (*trx_reset)(struct phl_info_t *phl, u8 type);
   void (*trx_resume)(struct phl_info_t *phl, u8 type);
   void (*tx_reset_hwband)(struct phl_info_t *phl_info, enum phl_band_idx band_idx);
   void (*req_tx_stop)(struct phl_info_t *phl);
   void (*req_rx_stop)(struct phl_info_t *phl);
   bool (*is_tx_pause)(struct phl_info_t *phl);
   bool (*is_rx_pause)(struct phl_info_t *phl);
   void *(*get_txbd_buf)(struct phl_info_t *phl);
   void *(*get_rxbd_buf)(struct phl_info_t *phl);
   void (*recycle_rx_pkt)(struct phl_info_t *phl,
                  struct rtw_phl_rx_pkt *phl_rx);
   void (*rx_handle_normal)(struct phl_info_t *phl_info,
                       struct rtw_phl_rx_pkt *phl_rx);
   void (*tx_watchdog)(struct phl_info_t *phl_info);
 
#ifdef CONFIG_PCI_HCI
   enum rtw_phl_status (*recycle_busy_wd)(struct phl_info_t *phl);
   enum rtw_phl_status (*recycle_busy_h2c)(struct phl_info_t *phl);
   void (*return_tx_wps)(struct phl_info_t *phl);
   void (*read_hw_rx)(struct phl_info_t *phl);
#endif
 
#ifdef CONFIG_USB_HCI
   enum rtw_phl_status (*pend_rxbuf)(struct phl_info_t *phl, void *rxobj,
                       u32 inbuf_len, u8 status_code);
   enum rtw_phl_status (*recycle_tx_buf)(void *phl, u8 *tx_buf_ptr);
#endif
 
#if defined(CONFIG_SDIO_HCI) && defined(CONFIG_PHL_SDIO_READ_RXFF_IN_INT)
   enum rtw_phl_status (*recv_rxfifo)(struct phl_info_t *phl);
#endif
 
#ifdef CONFIG_PCI_HCI
   void (*dump_wd_info)(struct phl_info_t *phl, u32 val);
#endif
 
};
 
/**
 * struct phl_tid_ampdu_rx - TID aggregation information (Rx).
 *
 * @reorder_buf: buffer to reorder incoming aggregated MPDUs.
 * @reorder_time: time when frame was added
 * @sta: station we are attached to
 * @head_seq_num: head sequence number in reordering buffer.
 * @stored_mpdu_num: number of MPDUs in reordering buffer
 * @ssn: Starting Sequence Number expected to be aggregated.
 * @buf_size: buffer size for incoming A-MPDUs
 * @timeout: reset timer value (in TUs).
 * @tid: TID number
 * @started: this session has started (head ssn or higher was received)
 */
struct phl_tid_ampdu_rx {
   struct rtw_phl_rx_pkt **reorder_buf;
   u32 *reorder_time;
   struct rtw_phl_stainfo_t *sta;
   u16 head_seq_num;
   u16 stored_mpdu_num;
   u16 ssn;
   u16 buf_size;
   u16 tid;
   u8 started:1,
        removed:1,
      sleep:1;
 
   void *drv_priv;
   struct phl_info_t *phl_info;
};
 
#ifdef DEBUG_PHL_RX
struct phl_rx_stats {
   u32 rx_isr;
   u32 phl_rx;
   u32 rx_type_all;
   u32 rx_type_wifi;
   u32 rx_type_ppdu;
   u32 rx_type_wp;
   u32 rx_type_c2h;
   u32 rx_amsdu;
 
   u32 rx_dont_reorder;
   u32 rx_put_reorder;
 
   u32 rx_drop_get;
   u32 rx_rdy_fail;
   u32 rxbd_fail;
   u32 rx_drop_reorder;
   u32 reorder_seq_less;
   u32 reorder_dup;
#ifdef PHL_RXSC_AMPDU
   u32 rxsc_ampdu[3];
#endif
 
   u32 rx_pkt_core;
   u32 rx_pktsz_phl;
   u32 rx_pktsz_core;
#ifdef CONFIG_DYNAMIC_RX_BUF
   u32 rxbuf_empty;
#endif
};
#endif /* DEBUG_PHL_RX */
 
struct macid_ctl_t {
   _os_lock lock;
   /*  used macid bitmap share for all wifi role */
   u32 used_map[PHL_MACID_MAX_ARRAY_NUM];
   u32 used_mld_map[PHL_MACID_MAX_ARRAY_NUM];
   u32 used_legacy_map[PHL_MACID_MAX_ARRAY_NUM];
   /* record bmc macid bitmap for all wifi role */
   u32 bmc_map[PHL_MACID_MAX_ARRAY_NUM];
   /* record used macid bitmap for each wifi role */
   u32 wifi_role_usedmap[MAX_WIFI_ROLE_NUMBER][PHL_MACID_MAX_ARRAY_NUM];
   /* record bmc TX macid for wifi role */
   u16 wrole_bmc[MAX_WIFI_ROLE_NUMBER][RTW_RLINK_MAX];
   /* record total stainfo by macid */
   struct rtw_phl_stainfo_t *sta[PHL_MACID_MAX_NUM];
   u16 max_num;
};
 
struct stainfo_ctl_t {
   struct phl_info_t *phl_info;
   u8 *allocated_stainfo_buf;
   int allocated_stainfo_sz;
   u8 *stainfo_buf;
   struct phl_queue free_sta_queue;
};
 
struct mld_ctl_t {
   struct phl_info_t *phl_info;
   u8 *allocated_mld_buf;
   int allocated_mld_sz;
   u8 *mld_buf;
   struct phl_queue free_mld_queue;
};
 
struct phl_h2c_pkt_pool {
   struct rtw_h2c_pkt *h2c_pkt_buf;
   struct phl_queue idle_h2c_pkt_cmd_list;
   struct phl_queue idle_h2c_pkt_data_list;
   struct phl_queue idle_h2c_pkt_ldata_list;
   struct phl_queue busy_h2c_pkt_list;
   _os_lock recycle_lock;
};
 
struct gtimer_ctx {
   u8 en;
   u8 timer_type;
   u32 duration;
};
 
#define _GT3_ENABLE 1
#define _GT3_DISABLE 0
 
#define _GT3_TYPE_SH_TASK 1
 
struct lifetime_ctx {
   u8 hw_band;
   u8 en;
   u16 val;
};
 
#define _LIFETIME_ENABLE 1
#define _LIFETIME_DISABLE 0
 
struct power_offset_ctx {
   u8 hw_band;
   s8 ofst_mode;
   s8 ofst_bw;
};
 
enum phl_tx_status {
   PHL_TX_STATUS_IDLE = 0,
   PHL_TX_STATUS_RUNNING = 1,
   PHL_TX_STATUS_STOP_INPROGRESS = 2,
   PHL_TX_STATUS_SW_PAUSE = 3,
   PHL_TX_STATUS_MAX = 0xFF
};
 
enum phl_rx_status {
   PHL_RX_STATUS_IDLE = 0,
   PHL_RX_STATUS_RUNNING = 1,
   PHL_RX_STATUS_STOP_INPROGRESS = 2,
   PHL_RX_STATUS_SW_PAUSE = 3,
   PHL_RX_STATUS_MAX = 0xFF
};
 
enum data_ctrl_mdl {
   DATA_CTRL_MDL_NONE = 0,
   DATA_CTRL_MDL_CMD_CTRLER = BIT0,
   DATA_CTRL_MDL_SER = BIT1,
   DATA_CTRL_MDL_PS = BIT2,
   DATA_CTRL_MDL_MRC = BIT3,
   DATA_CTRL_MDL_ECSA = BIT4,
   DATA_CTRL_MDL_MAX = BIT7
};
 
enum data_ctrl_err_code {
   CTRL_ERR_SW_TX_PAUSE_POLLTO = 1,
   CTRL_ERR_SW_TX_PAUSE_FAIL = 2,
   CTRL_ERR_SW_TX_RESUME_FAIL = 3,
   CTRL_ERR_SW_RX_PAUSE_POLLTO = 4,
   CTRL_ERR_SW_RX_PAUSE_FAIL = 5,
   CTRL_ERR_SW_RX_RESUME_FAIL = 6,
   CTRL_ERR_HW_TRX_PAUSE_FAIL = 7,
   CTRL_ERR_HW_TRX_RESUME_FAIL = 8,
   CTRL_ERR_MAX = 0xFF
};
 
#ifdef CONFIG_POWER_SAVE
struct phl_ps_info {
   bool init;
   _os_atomic tx_ntfy;
};
#endif
 
#define PHL_CTRL_TX BIT0
#define PHL_CTRL_RX BIT1
#define PHL_CTRL_IN_PIPE BIT2
#define PHL_CTRL_OUT_PIPE BIT3
#define POLL_SW_TX_PAUSE_MAX_MS 500
#define POLL_SW_RX_PAUSE_MAX_MS 500
 
#if defined(CONFIG_VW_REFINE) || defined(CONFIG_ONE_TXQ)
#define WP_MAX_CNT 4096
#define WP_USED_SEQ 0xFFFF
#endif
 
struct phl_info_t {
   struct macid_ctl_t macid_ctrl;
   struct stainfo_ctl_t sta_ctrl;
   struct mld_ctl_t mld_ctrl;
   struct phl_acs_info *acs_info;
 
   struct rtw_regulation_interface rg_interface;
   struct rtw_phl_com_t *phl_com;
   struct rtw_phl_handler phl_tx_handler;
   struct rtw_phl_handler phl_rx_handler;
   struct rtw_phl_handler phl_ser_handler;
   struct rtw_phl_handler phl_event_handler;
   struct rtw_phl_rx_ring phl_rx_ring;
   _os_atomic phl_sw_tx_sts;
   _os_atomic phl_sw_tx_more;
   _os_atomic phl_sw_tx_req_pwr;
   _os_atomic phl_sw_rx_sts;
   _os_atomic phl_sw_rx_more;
   _os_atomic phl_sw_rx_req_pwr;
   _os_atomic is_hw_trx_pause;
   enum data_ctrl_mdl pause_tx_id;
   enum data_ctrl_mdl pause_rx_id;
   _os_lock t_ring_list_lock;
   _os_lock rx_ring_lock;
   _os_lock t_fctrl_result_lock;
   _os_list t_ring_list;
   _os_list t_fctrl_result;
   struct phl_queue t_ring_free_q;
   void *ring_sts_pool;
   void *rx_pkt_pool;
   struct phl_h2c_pkt_pool *h2c_pool;
 
   struct hci_info_t *hci;
   struct phl_hci_trx_ops *hci_trx_ops;
 
   struct pkt_ofld_obj *pkt_ofld;
 
   struct phl_cmd_dispatch_engine disp_eng;
   struct phl_watchdog wdog;
   void *msg_hub;
   void *cmd_que;
   void *hal;
 
#ifdef CONFIG_FSM
   void *fsm_root;
   void *cmd_fsm;
   void *cmd_obj;
 
   void *ser_fsm;
   void *ser_obj;
 
   void *snd_fsm;
#endif /*CONFIG_FSM*/
   void *snd_obj;
 
   void *ps_obj;
 
   void *led_ctrl;
 
   void *ecsa_ctrl;
#ifdef CONFIG_PHL_TDLS
   struct phl_tdls_info_t tdls_info;
#endif
   void *phl_twt_info; /* struct phl_twt_info */
#ifdef PHL_RX_BATCH_IND
   u8 rx_new_pending;
#endif
#ifdef DEBUG_PHL_RX
   struct phl_rx_stats rx_stats;
   u32 cnt_rx_pktsz;
#endif
 
   struct phl_wow_info wow_info;
 
#ifdef CONFIG_POWER_SAVE
   struct phl_ps_info ps_info;
#endif
 
#ifdef CONFIG_PHL_TEST_SUITE
   void *trx_test;
   struct rtw_phl_handler sw_tx_handler;
#endif
 
   struct gtimer_ctx gt3_ctx;
   struct lifetime_ctx lt_ctx;
   struct power_offset_ctx pwr_ofst_ctx;
 
#if defined(CONFIG_VW_REFINE) || defined(CONFIG_ONE_TXQ)
   u16 free_wp[WP_MAX_CNT];
   u16 fw_ptr, fr_ptr;  /* wp management r/w ptr */
#endif
   u8 use_onetxring;
 
};
 
#define phl_to_drvpriv(_phl)        (_phl->phl_com->drv_priv)
 
#define phlcom_to_test_mgnt(_phl_com)    ((_phl_com)->test_mgnt)
#define phlcom_to_mr_ctrl(_phl_com)    (&(_phl_com->mr_ctrl))
 
#define phl_to_mr_ctrl(_phl)    (&(((struct phl_info_t *)_phl)->phl_com->mr_ctrl))
#define phl_to_mac_ctrl(_phlinfo)    (&(_phlinfo->macid_ctrl))
#define phl_to_sta_ctrl(_phlinfo)    (&(_phlinfo->sta_ctrl))
 
#define get_band_ctrl(_phl, _band)    (&(phl_to_mr_ctrl(_phl)->band_ctrl[_band]))
 
#define phl_to_p2pps_info(_phl)    (((_phl)->phl_com->p2pps_info))
#define get_role_idx(_wrole) (_wrole->id)
 
#define phl_to_mld_ctrl(_phlinfo) (&(_phlinfo->mld_ctrl))
#define get_rlink(_wrole, _idx) (&(_wrole->rlink[_idx]))
 
#endif /*_PHL_STRUCT_H_*/