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