rtw_mcc.h 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. /******************************************************************************
  2. *
  3. * Copyright(c) 2015 - 2017 Realtek Corporation.
  4. *
  5. * This program is free software; you can redistribute it and/or modify it
  6. * under the terms of version 2 of the GNU General Public License as
  7. * published by the Free Software Foundation.
  8. *
  9. * This program is distributed in the hope that it will be useful, but WITHOUT
  10. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  12. * more details.
  13. *
  14. *****************************************************************************/
  15. #ifdef CONFIG_MCC_MODE
  16. #ifndef _RTW_MCC_H_
  17. #define _RTW_MCC_H_
  18. #include <drv_types.h> /* PADAPTER */
  19. #define MCC_STATUS_PROCESS_MCC_START_SETTING BIT0
  20. #define MCC_STATUS_PROCESS_MCC_STOP_SETTING BIT1
  21. #define MCC_STATUS_NEED_MCC BIT2
  22. #define MCC_STATUS_DOING_MCC BIT3
  23. #define MCC_SWCH_FW_EARLY_TIME 10 /* ms */
  24. #define MCC_EXPIRE_TIME 50 /* ms */
  25. #define MCC_TOLERANCE_TIME 2 /* 2*2 = 4s */
  26. #define MCC_UPDATE_PARAMETER_THRESHOLD 5 /* ms */
  27. #define MCC_ROLE_STA_GC_MGMT_QUEUE_MACID 0
  28. #define MCC_ROLE_SOFTAP_GO_MGMT_QUEUE_MACID 1
  29. /* Lower for stop, Higher for start */
  30. #define MCC_SETCMD_STATUS_STOP_DISCONNECT 0x0
  31. #define MCC_SETCMD_STATUS_STOP_SCAN_START 0x1
  32. #define MCC_SETCMD_STATUS_START_CONNECT 0x80
  33. #define MCC_SETCMD_STATUS_START_SCAN_DONE 0x81
  34. /*
  35. * depenad platform or customer requirement(TP unit:Mbps),
  36. * must be provided by PM or sales or product document
  37. * too large value means not to limit tx bytes (current for ap mode)
  38. * NOTE: following values ref from test results
  39. */
  40. #define MCC_AP_BW20_TARGET_TX_TP (300)
  41. #define MCC_AP_BW40_TARGET_TX_TP (300)
  42. #define MCC_AP_BW80_TARGET_TX_TP (300)
  43. #define MCC_STA_BW20_TARGET_TX_TP (35)
  44. #define MCC_STA_BW40_TARGET_TX_TP (70)
  45. #define MCC_STA_BW80_TARGET_TX_TP (140)
  46. #define MCC_SINGLE_TX_CRITERIA 5 /* Mbps */
  47. #define MAX_MCC_NUM 2
  48. #define MCC_STOP(adapter) (adapter->mcc_adapterpriv.mcc_tx_stop)
  49. #define MCC_EN(adapter) (adapter_to_dvobj(adapter)->mcc_objpriv.en_mcc)
  50. #define SET_MCC_EN_FLAG(adapter, flag)\
  51. do { \
  52. adapter_to_dvobj(adapter)->mcc_objpriv.en_mcc = (flag); \
  53. } while (0)
  54. #define SET_MCC_DURATION(adapter, val)\
  55. do { \
  56. adapter_to_dvobj(adapter)->mcc_objpriv.duration = (val); \
  57. } while (0)
  58. #define SET_MCC_RUNTIME_DURATION(adapter, flag)\
  59. do { \
  60. adapter_to_dvobj(adapter)->mcc_objpriv.enable_runtime_duration = (flag); \
  61. } while (0)
  62. /* Represent Channel Tx Null setting */
  63. enum mcc_channel_tx_null {
  64. MCC_ENABLE_TX_NULL = 0,
  65. MCC_DISABLE_TX_NULL = 1,
  66. };
  67. /* Represent C2H Report setting */
  68. enum mcc_c2h_report {
  69. MCC_C2H_REPORT_DISABLE = 0,
  70. MCC_C2H_REPORT_FAIL_STATUS = 1,
  71. MCC_C2H_REPORT_ALL_STATUS = 2,
  72. };
  73. /* Represent Channel Scan */
  74. enum mcc_channel_scan {
  75. MCC_CHIDX = 0,
  76. MCC_SCANCH_RSVD_LOC = 1,
  77. };
  78. /* Represent FW status report of channel switch */
  79. enum mcc_status_rpt {
  80. MCC_RPT_SUCCESS = 0,
  81. MCC_RPT_TXNULL_FAIL = 1,
  82. MCC_RPT_STOPMCC = 2,
  83. MCC_RPT_READY = 3,
  84. MCC_RPT_SWICH_CHANNEL_NOTIFY = 7,
  85. MCC_RPT_UPDATE_NOA_START_TIME = 8,
  86. MCC_RPT_TSF = 9,
  87. MCC_RPT_MAX,
  88. };
  89. enum mcc_role {
  90. MCC_ROLE_STA = 0,
  91. MCC_ROLE_AP = 1,
  92. MCC_ROLE_GC = 2,
  93. MCC_ROLE_GO = 3,
  94. MCC_ROLE_MAX,
  95. };
  96. struct mcc_iqk_backup {
  97. u16 TX_X;
  98. u16 TX_Y;
  99. u16 RX_X;
  100. u16 RX_Y;
  101. };
  102. enum MCC_DURATION_SETTING {
  103. MCC_DURATION_MAPPING = 0,
  104. MCC_DURATION_DIRECET = 1,
  105. };
  106. enum MCC_SCHED_MODE {
  107. MCC_FAIR_SCHEDULE = 0,
  108. MCC_FAVOE_STA = 1,
  109. MCC_FAVOE_P2P = 2,
  110. };
  111. /* mcc data for adapter */
  112. struct mcc_adapter_priv {
  113. u8 order; /* FW document, softap/AP must be 0 */
  114. enum mcc_role role; /* MCC role(AP,STA,GO,GC) */
  115. u8 mcc_duration; /* channel stay period, UNIT:1TU */
  116. /* flow control */
  117. u8 mcc_tx_stop; /* check if tp stop or not */
  118. u8 mcc_tp_limit; /* check if tp limit or not */
  119. u32 mcc_target_tx_bytes_to_port; /* customer require */
  120. u32 mcc_tx_bytes_to_port; /* already tx to tx fifo (write port) */
  121. /* data from kernel to check if enqueue data or netif stop queue */
  122. u32 mcc_tp;
  123. u64 mcc_tx_bytes_from_kernel;
  124. u64 mcc_last_tx_bytes_from_kernel;
  125. /* Backup IQK value for MCC */
  126. struct mcc_iqk_backup mcc_iqk_arr[MAX_RF_PATH];
  127. /* mgmt queue macid to avoid RA issue */
  128. u8 mgmt_queue_macid;
  129. /* set macid bitmap to let fw know which macid should be tx pause */
  130. /* all interface share total 16 macid */
  131. u16 mcc_macid_bitmap;
  132. /* use for NoA start time (unit: mircoseconds) */
  133. u32 noa_start_time;
  134. u8 p2p_go_noa_ie[MAX_P2P_IE_LEN];
  135. u32 p2p_go_noa_ie_len;
  136. u64 tsf;
  137. #ifdef CONFIG_TDLS
  138. u8 backup_tdls_en;
  139. #endif /* CONFIG_TDLS */
  140. u8 null_early;
  141. u8 null_rty_num;
  142. };
  143. struct mcc_obj_priv {
  144. u8 en_mcc; /* enable MCC or not */
  145. u8 duration; /* store duration(%) from registry, for primary adapter */
  146. u8 interval;
  147. u8 start_time;
  148. u8 mcc_c2h_status;
  149. u8 cur_mcc_success_cnt; /* used for check mcc switch channel success */
  150. u8 prev_mcc_success_cnt; /* used for check mcc switch channel success */
  151. u8 mcc_tolerance_time; /* used for detect mcc switch channel success */
  152. u8 mcc_loc_rsvd_paga[MAX_MCC_NUM]; /* mcc rsvd page */
  153. u8 mcc_status; /* mcc status stop or start .... */
  154. u8 policy_index;
  155. u8 mcc_stop_threshold;
  156. u8 current_order;
  157. u8 last_tsfdiff;
  158. systime mcc_launch_time; /* mcc launch time, used for starting detect mcc switch channel success */
  159. _mutex mcc_mutex;
  160. _lock mcc_lock;
  161. PADAPTER iface[MAX_MCC_NUM]; /* by order, use for mcc parameter cmd */
  162. struct submit_ctx mcc_sctx;
  163. struct submit_ctx mcc_tsf_req_sctx;
  164. _mutex mcc_tsf_req_mutex;
  165. u8 mcc_tsf_req_sctx_order; /* record current order for mcc_tsf_req_sctx */
  166. #ifdef CONFIG_MCC_MODE_V2
  167. u8 mcc_iqk_value_rsvd_page[3];
  168. #endif /* CONFIG_MCC_MODE_V2 */
  169. u8 mcc_pwr_idx_rsvd_page[MAX_MCC_NUM];
  170. u8 enable_runtime_duration;
  171. u32 backup_phydm_ability;
  172. /* for LG */
  173. u8 mchan_sched_mode;
  174. };
  175. /* backup IQK val */
  176. void rtw_hal_mcc_restore_iqk_val(PADAPTER padapter);
  177. /* check mcc status */
  178. u8 rtw_hal_check_mcc_status(PADAPTER padapter, u8 mcc_status);
  179. /* set mcc status */
  180. void rtw_hal_set_mcc_status(PADAPTER padapter, u8 mcc_status);
  181. /* clear mcc status */
  182. void rtw_hal_clear_mcc_status(PADAPTER padapter, u8 mcc_status);
  183. /* dl mcc rsvd page */
  184. u8 rtw_hal_dl_mcc_fw_rsvd_page(_adapter *adapter, u8 *pframe, u16 *index
  185. , u8 tx_desc, u32 page_size, u8 *total_page_num, RSVDPAGE_LOC *rsvd_page_loc, u8 *page_num);
  186. /* handle C2H */
  187. void rtw_hal_mcc_c2h_handler(PADAPTER padapter, u8 buflen, u8 *tmpBuf);
  188. /* switch channel successfully or not */
  189. void rtw_hal_mcc_sw_status_check(PADAPTER padapter);
  190. /* change some scan flags under site survey */
  191. u8 rtw_hal_mcc_change_scan_flag(PADAPTER padapter, u8 *ch, u8 *bw, u8 *offset);
  192. /* record data kernel TX to driver to check MCC concurrent TX */
  193. void rtw_hal_mcc_calc_tx_bytes_from_kernel(PADAPTER padapter, u32 len);
  194. /* record data to port to let driver do flow ctrl */
  195. void rtw_hal_mcc_calc_tx_bytes_to_port(PADAPTER padapter, u32 len);
  196. /* check stop write port or not */
  197. u8 rtw_hal_mcc_stop_tx_bytes_to_port(PADAPTER padapter);
  198. u8 rtw_hal_set_mcc_setting_scan_start(PADAPTER padapter);
  199. u8 rtw_hal_set_mcc_setting_scan_complete(PADAPTER padapter);
  200. u8 rtw_hal_set_mcc_setting_start_bss_network(PADAPTER padapter, u8 chbw_grouped);
  201. u8 rtw_hal_set_mcc_setting_disconnect(PADAPTER padapter);
  202. u8 rtw_hal_set_mcc_setting_join_done_chk_ch(PADAPTER padapter);
  203. u8 rtw_hal_set_mcc_setting_chk_start_clnt_join(PADAPTER padapter, u8 *ch, u8 *bw, u8 *offset, u8 chbw_allow);
  204. void rtw_hal_dump_mcc_info(void *sel, struct dvobj_priv *dvobj);
  205. void update_mcc_mgntframe_attrib(_adapter *padapter, struct pkt_attrib *pattrib);
  206. u8 rtw_hal_mcc_link_status_chk(_adapter *padapter, const char *msg);
  207. void rtw_hal_mcc_issue_null_data(_adapter *padapter, u8 chbw_allow, u8 ps_mode);
  208. u8 *rtw_hal_mcc_append_go_p2p_ie(PADAPTER padapter, u8 *pframe, u32 *len);
  209. void rtw_hal_dump_mcc_policy_table(void *sel);
  210. void rtw_hal_mcc_update_macid_bitmap(PADAPTER padapter, int mac_id, u8 add);
  211. void rtw_hal_mcc_process_noa(PADAPTER padapter);
  212. void rtw_hal_mcc_parameter_init(PADAPTER padapter);
  213. u8 rtw_set_mcc_duration_hdl(PADAPTER adapter, u8 type, const u8 *val);
  214. u8 rtw_set_mcc_duration_cmd(_adapter *adapter, u8 type, u8 val);
  215. #endif /* _RTW_MCC_H_ */
  216. #endif /* CONFIG_MCC_MODE */