hal_halmac.h 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. /******************************************************************************
  2. *
  3. * Copyright(c) 2015 - 2018 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. #ifndef _HAL_HALMAC_H_
  16. #define _HAL_HALMAC_H_
  17. #include <drv_types.h> /* adapter_to_dvobj(), struct intf_hdl and etc. */
  18. #include <hal_data.h> /* struct hal_spec_t */
  19. #include "halmac/halmac_api.h" /* struct halmac_adapter* and etc. */
  20. /* HALMAC Definition for Driver */
  21. #define RTW_HALMAC_H2C_MAX_SIZE 8
  22. #define RTW_HALMAC_BA_SSN_RPT_SIZE 4
  23. #define dvobj_set_halmac(d, mac) ((d)->halmac = (mac))
  24. #define dvobj_to_halmac(d) ((struct halmac_adapter *)((d)->halmac))
  25. #define adapter_to_halmac(p) dvobj_to_halmac(adapter_to_dvobj(p))
  26. /* for H2C cmd */
  27. #define MAX_H2C_BOX_NUMS 4
  28. #define MESSAGE_BOX_SIZE 4
  29. #define EX_MESSAGE_BOX_SIZE 4
  30. typedef enum _RTW_HALMAC_MODE {
  31. RTW_HALMAC_MODE_NORMAL,
  32. RTW_HALMAC_MODE_WIFI_TEST,
  33. } RTW_HALMAC_MODE;
  34. union rtw_phy_para_data {
  35. struct _mac {
  36. u32 value; /* value to be set in bit mask(msk) */
  37. u32 msk; /* bit mask */
  38. u16 offset; /* address */
  39. u8 msk_en; /* 0/1 for msk invalid/valid */
  40. u8 size; /* Unit is bytes, and value should be 1/2/4 */
  41. } mac;
  42. struct _bb {
  43. u32 value;
  44. u32 msk;
  45. u16 offset;
  46. u8 msk_en;
  47. u8 size;
  48. } bb;
  49. struct _rf {
  50. u32 value;
  51. u32 msk;
  52. u8 offset;
  53. u8 msk_en;
  54. /*
  55. * 0: path A
  56. * 1: path B
  57. * 2: path C
  58. * 3: path D
  59. */
  60. u8 path;
  61. } rf;
  62. struct _delay {
  63. /*
  64. * 0: microsecond (us)
  65. * 1: millisecond (ms)
  66. */
  67. u8 unit;
  68. u16 value;
  69. } delay;
  70. };
  71. struct rtw_phy_parameter {
  72. /*
  73. * 0: MAC register
  74. * 1: BB register
  75. * 2: RF register
  76. * 3: Delay
  77. * 0xFF: Latest(End) command
  78. */
  79. u8 cmd;
  80. union rtw_phy_para_data data;
  81. };
  82. struct rtw_halmac_bcn_ctrl {
  83. u8 rx_bssid_fit:1; /* 0:HW handle beacon, 1:ignore */
  84. u8 txbcn_rpt:1; /* Enable TXBCN report in ad hoc and AP mode */
  85. u8 tsf_update:1; /* Update TSF when beacon or probe response */
  86. u8 enable_bcn:1; /* Enable beacon related functions */
  87. u8 rxbcn_rpt:1; /* Enable RXBCNOK report */
  88. u8 p2p_ctwin:1; /* Enable P2P CTN WINDOWS function */
  89. u8 p2p_bcn_area:1; /* Enable P2P BCN area on function */
  90. };
  91. extern struct halmac_platform_api rtw_halmac_platform_api;
  92. /* HALMAC API for Driver(HAL) */
  93. u8 rtw_halmac_read8(struct intf_hdl *, u32 addr);
  94. u16 rtw_halmac_read16(struct intf_hdl *, u32 addr);
  95. u32 rtw_halmac_read32(struct intf_hdl *, u32 addr);
  96. void rtw_halmac_read_mem(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem);
  97. #ifdef CONFIG_SDIO_INDIRECT_ACCESS
  98. u8 rtw_halmac_iread8(struct intf_hdl *pintfhdl, u32 addr);
  99. u16 rtw_halmac_iread16(struct intf_hdl *pintfhdl, u32 addr);
  100. u32 rtw_halmac_iread32(struct intf_hdl *pintfhdl, u32 addr);
  101. #endif /* CONFIG_SDIO_INDIRECT_ACCESS */
  102. int rtw_halmac_write8(struct intf_hdl *, u32 addr, u8 value);
  103. int rtw_halmac_write16(struct intf_hdl *, u32 addr, u16 value);
  104. int rtw_halmac_write32(struct intf_hdl *, u32 addr, u32 value);
  105. /* Software Information */
  106. void rtw_halmac_get_version(char *str, u32 len);
  107. /* Software Initialization */
  108. int rtw_halmac_init_adapter(struct dvobj_priv *d, struct halmac_platform_api *pf_api);
  109. int rtw_halmac_deinit_adapter(struct dvobj_priv *);
  110. /* Get operations */
  111. int rtw_halmac_get_hw_value(struct dvobj_priv *d, enum halmac_hw_id hw_id, void *pvalue);
  112. int rtw_halmac_get_tx_fifo_size(struct dvobj_priv *d, u32 *size);
  113. int rtw_halmac_get_rx_fifo_size(struct dvobj_priv *d, u32 *size);
  114. int rtw_halmac_get_rsvd_drv_pg_bndy(struct dvobj_priv *d, u16 *bndy);
  115. int rtw_halmac_get_page_size(struct dvobj_priv *d, u32 *size);
  116. int rtw_halmac_get_tx_agg_align_size(struct dvobj_priv *d, u16 *size);
  117. int rtw_halmac_get_rx_agg_align_size(struct dvobj_priv *d, u8 *size);
  118. int rtw_halmac_get_rx_drv_info_sz(struct dvobj_priv *, u8 *sz);
  119. int rtw_halmac_get_tx_desc_size(struct dvobj_priv *d, u32 *size);
  120. int rtw_halmac_get_rx_desc_size(struct dvobj_priv *d, u32 *size);
  121. int rtw_halmac_get_ori_h2c_size(struct dvobj_priv *d, u32 *size);
  122. int rtw_halmac_get_oqt_size(struct dvobj_priv *d, u8 *size);
  123. int rtw_halmac_get_ac_queue_number(struct dvobj_priv *d, u8 *num);
  124. int rtw_halmac_get_mac_address(struct dvobj_priv *d, enum _hw_port hwport, u8 *addr);
  125. int rtw_halmac_get_network_type(struct dvobj_priv *d, enum _hw_port hwport, u8 *type);
  126. int rtw_halmac_get_bcn_ctrl(struct dvobj_priv *d, enum _hw_port hwport, struct rtw_halmac_bcn_ctrl *bcn_ctrl);
  127. /*int rtw_halmac_get_wow_reason(struct dvobj_priv *, u8 *reason);*/
  128. /* Set operations */
  129. int rtw_halmac_config_rx_info(struct dvobj_priv *d, enum halmac_drv_info info);
  130. int rtw_halmac_set_max_dl_fw_size(struct dvobj_priv *d, u32 size);
  131. int rtw_halmac_set_mac_address(struct dvobj_priv *d, enum _hw_port hwport, u8 *addr);
  132. int rtw_halmac_set_bssid(struct dvobj_priv *d, enum _hw_port hwport, u8 *addr);
  133. int rtw_halmac_set_tx_address(struct dvobj_priv *d, enum _hw_port hwport, u8 *addr);
  134. int rtw_halmac_set_network_type(struct dvobj_priv *d, enum _hw_port hwport, u8 type);
  135. int rtw_halmac_reset_tsf(struct dvobj_priv *d, enum _hw_port hwport);
  136. int rtw_halmac_set_bcn_interval(struct dvobj_priv *d, enum _hw_port hwport, u32 space);
  137. int rtw_halmac_set_bcn_ctrl(struct dvobj_priv *d, enum _hw_port hwport, struct rtw_halmac_bcn_ctrl *bcn_ctrl);
  138. int rtw_halmac_set_aid(struct dvobj_priv *d, enum _hw_port hwport, u16 aid);
  139. int rtw_halmac_set_bandwidth(struct dvobj_priv *d, u8 channel, u8 pri_ch_idx, u8 bw);
  140. int rtw_halmac_set_edca(struct dvobj_priv *d, u8 queue, u8 aifs, u8 cw, u16 txop);
  141. int rtw_halmac_set_rts_full_bw(struct dvobj_priv *d, u8 enable);
  142. /* Functions */
  143. int rtw_halmac_poweron(struct dvobj_priv *);
  144. int rtw_halmac_poweroff(struct dvobj_priv *);
  145. int rtw_halmac_init_hal(struct dvobj_priv *);
  146. int rtw_halmac_init_hal_fw(struct dvobj_priv *, u8 *fw, u32 fwsize);
  147. int rtw_halmac_init_hal_fw_file(struct dvobj_priv *, u8 *fwpath);
  148. int rtw_halmac_deinit_hal(struct dvobj_priv *);
  149. int rtw_halmac_self_verify(struct dvobj_priv *);
  150. int rtw_halmac_txfifo_wait_empty(struct dvobj_priv *d, u32 timeout);
  151. int rtw_halmac_dlfw(struct dvobj_priv *, u8 *fw, u32 fwsize);
  152. int rtw_halmac_dlfw_from_file(struct dvobj_priv *, u8 *fwpath);
  153. int rtw_halmac_dlfw_mem(struct dvobj_priv *d, u8 *fw, u32 fwsize, enum fw_mem mem);
  154. int rtw_halmac_dlfw_mem_from_file(struct dvobj_priv *d, u8 *fwpath, enum fw_mem mem);
  155. int rtw_halmac_phy_power_switch(struct dvobj_priv *, u8 enable);
  156. int rtw_halmac_send_h2c(struct dvobj_priv *, u8 *h2c);
  157. int rtw_halmac_c2h_handle(struct dvobj_priv *, u8 *c2h, u32 size);
  158. /* eFuse */
  159. int rtw_halmac_get_available_efuse_size(struct dvobj_priv *d, u32 *size);
  160. int rtw_halmac_get_physical_efuse_size(struct dvobj_priv *, u32 *size);
  161. int rtw_halmac_read_physical_efuse_map(struct dvobj_priv *, u8 *map, u32 size);
  162. int rtw_halmac_read_physical_efuse(struct dvobj_priv *, u32 offset, u32 cnt, u8 *data);
  163. int rtw_halmac_write_physical_efuse(struct dvobj_priv *, u32 offset, u32 cnt, u8 *data);
  164. int rtw_halmac_get_logical_efuse_size(struct dvobj_priv *, u32 *size);
  165. int rtw_halmac_read_logical_efuse_map(struct dvobj_priv *, u8 *map, u32 size, u8 *maskmap, u32 masksize);
  166. int rtw_halmac_write_logical_efuse_map(struct dvobj_priv *, u8 *map, u32 size, u8 *maskmap, u32 masksize);
  167. int rtw_halmac_read_logical_efuse(struct dvobj_priv *, u32 offset, u32 cnt, u8 *data);
  168. int rtw_halmac_write_logical_efuse(struct dvobj_priv *, u32 offset, u32 cnt, u8 *data);
  169. int rtw_halmac_write_bt_physical_efuse(struct dvobj_priv *, u32 offset, u32 cnt, u8 *data);
  170. int rtw_halmac_read_bt_physical_efuse_map(struct dvobj_priv *, u8 *map, u32 size);
  171. int rtw_halmac_dump_fifo(struct dvobj_priv *d, u8 fifo_sel, u32 addr, u32 size, u8 *buffer);
  172. int rtw_halmac_rx_agg_switch(struct dvobj_priv *, u8 enable);
  173. /* Specific function APIs*/
  174. int rtw_halmac_download_rsvd_page(struct dvobj_priv *dvobj, u8 pg_offset, u8 *pbuf, u32 size);
  175. int rtw_halmac_fill_hal_spec(struct dvobj_priv *, struct hal_spec_t *);
  176. int rtw_halmac_p2pps(struct dvobj_priv *dvobj, PHAL_P2P_PS_PARA pp2p_ps_para);
  177. int rtw_halmac_iqk(struct dvobj_priv *d, u8 clear, u8 segment);
  178. int rtw_halmac_cfg_phy_para(struct dvobj_priv *d, struct rtw_phy_parameter *para);
  179. int rtw_halmac_led_cfg(struct dvobj_priv *d, u8 enable, u8 mode);
  180. void rtw_halmac_led_switch(struct dvobj_priv *d, u8 on);
  181. #ifdef CONFIG_SDIO_HCI
  182. int rtw_halmac_query_tx_page_num(struct dvobj_priv *);
  183. int rtw_halmac_get_tx_queue_page_num(struct dvobj_priv *, u8 queue, u32 *page);
  184. u32 rtw_halmac_sdio_get_tx_addr(struct dvobj_priv *, u8 *desc, u32 size);
  185. int rtw_halmac_sdio_tx_allowed(struct dvobj_priv *, u8 *buf, u32 size);
  186. u32 rtw_halmac_sdio_get_rx_addr(struct dvobj_priv *, u8 *seq);
  187. #endif /* CONFIG_SDIO_HCI */
  188. #ifdef CONFIG_USB_HCI
  189. u8 rtw_halmac_usb_get_bulkout_id(struct dvobj_priv *, u8 *buf, u32 size);
  190. int rtw_halmac_usb_get_txagg_desc_num(struct dvobj_priv *d, u8 *num);
  191. u8 rtw_halmac_switch_usb_mode(struct dvobj_priv *d, enum RTW_USB_SPEED usb_mode);
  192. #endif /* CONFIG_USB_HCI */
  193. #ifdef CONFIG_SUPPORT_TRX_SHARED
  194. void dump_trx_share_mode(void *sel, _adapter *adapter);
  195. #endif
  196. #ifdef CONFIG_BEAMFORMING
  197. #ifdef RTW_BEAMFORMING_VERSION_2
  198. int rtw_halmac_bf_add_mu_bfer(struct dvobj_priv *d, u16 paid, u16 csi_para,
  199. u16 my_aid, enum halmac_csi_seg_len sel, u8 *addr);
  200. int rtw_halmac_bf_del_mu_bfer(struct dvobj_priv *d);
  201. int rtw_halmac_bf_cfg_sounding(struct dvobj_priv *d, enum halmac_snd_role role,
  202. enum halmac_data_rate rate);
  203. int rtw_halmac_bf_del_sounding(struct dvobj_priv *d, enum halmac_snd_role role);
  204. int rtw_halmac_bf_cfg_csi_rate(struct dvobj_priv *d, u8 rssi, u8 current_rate,
  205. u8 fixrate_en, u8 *new_rate);
  206. int rtw_halmac_bf_cfg_mu_mimo(struct dvobj_priv *d, enum halmac_snd_role role,
  207. u8 *sounding_sts, u16 grouping_bitmap, u8 mu_tx_en,
  208. u32 *given_gid_tab, u32 *given_user_pos);
  209. #define rtw_halmac_bf_cfg_mu_bfee(d, gid_tab, user_pos) \
  210. rtw_halmac_bf_cfg_mu_mimo(d, HAL_BFEE, NULL, 0, 0, gid_tab, user_pos)
  211. #endif /* RTW_BEAMFORMING_VERSION_2 */
  212. #endif /* CONFIG_BEAMFORMING */
  213. #endif /* _HAL_HALMAC_H_ */