Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7e5b796c authored by Ping-Ke Shih's avatar Ping-Ke Shih Committed by Greg Kroah-Hartman
Browse files

staging: r8822be: Add the driver code



The RTL8822BE, an 802.11ac wireless network card, is now appearing in
new computers. Its driver is being placed in staging to reduce the time
that users of this new card will have access to in-kernel drivers.

This commit adds the code for the new r8822be driver.

Signed-off-by: default avatarPing-Ke Shih <pkshih@realtek.com>
Signed-off-by: default avatarLarry Finger <Larry.Finger@lwfinger.net>
Cc: Yan-Hsuan Chuang <yhchuang@realtek.com>
Cc: Birming Chiu <birming@realtek.com>
Cc: Shaofu <shaofu@realtek.com>
Cc: Steven Ting <steventing@realtek.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 9ce99b04
Loading
Loading
Loading
Loading
+82 −0
Original line number Diff line number Diff line
/******************************************************************************
 *
 * Copyright(c) 2016  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.
 *
 * The full GNU General Public License is included in this distribution in the
 * file called LICENSE.
 *
 * Contact Information:
 * wlanfae <wlanfae@realtek.com>
 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
 * Hsinchu 300, Taiwan.
 *
 * Larry Finger <Larry.Finger@lwfinger.net>
 *
 *****************************************************************************/

#ifndef __RTL8822B_DEF_H__
#define __RTL8822B_DEF_H__

#define RX_DESC_NUM_8822BE	512

#define HAL_PRIME_CHNL_OFFSET_DONT_CARE	0
#define HAL_PRIME_CHNL_OFFSET_LOWER	1
#define HAL_PRIME_CHNL_OFFSET_UPPER	2

#define RX_MPDU_QUEUE	0

#define IS_HT_RATE(_rate) (_rate >= DESC_RATEMCS0)
#define IS_CCK_RATE(_rate) (_rate >= DESC_RATE1M && _rate <= DESC_RATE11M)
#define IS_OFDM_RATE(_rate) (_rate >= DESC_RATE6M && _rate <= DESC_RATE54M)
#define IS_1T_RATE(_rate)                                                      \
	((_rate >= DESC_RATE1M && _rate <= DESC_RATEMCS7) ||                   \
	 (_rate >= DESC_RATEVHT1SS_MCS0 && _rate <= DESC_RATEVHT1SS_MCS9))
#define IS_2T_RATE(_rate)                                                      \
	((_rate >= DESC_RATEMCS8 && _rate <= DESC_RATEMCS15) ||                \
	 (_rate >= DESC_RATEVHT2SS_MCS0 && _rate <= DESC_RATEVHT2SS_MCS9))

#define IS_1T_RATESEC(_rs)                                                     \
	((_rs == CCK) || (_rs == OFDM) || (_rs == HT_MCS0_MCS7) ||             \
	 (_rs == VHT_1SSMCS0_1SSMCS9))
#define IS_2T_RATESEC(_rs)                                                     \
	((_rs == HT_MCS8_MCS15) || (_rs == VHT_2SSMCS0_2SSMCS9))

enum rx_packet_type {
	NORMAL_RX,
	C2H_PACKET,
};

enum rtl_desc_qsel {
	QSLT_BK	= 0x2,
	QSLT_BE	= 0x0,
	QSLT_VI	= 0x5,
	QSLT_VO	= 0x7,
	QSLT_BEACON	= 0x10,
	QSLT_HIGH	= 0x11,
	QSLT_MGNT	= 0x12,
	QSLT_CMD	= 0x13,
};

enum vht_data_sc {
	VHT_DATA_SC_DONOT_CARE	= 0,
	VHT_DATA_SC_20_UPPER_OF_80MHZ	= 1,
	VHT_DATA_SC_20_LOWER_OF_80MHZ	= 2,
	VHT_DATA_SC_20_UPPERST_OF_80MHZ	= 3,
	VHT_DATA_SC_20_LOWEST_OF_80MHZ	= 4,
	VHT_DATA_SC_20_RECV1	= 5,
	VHT_DATA_SC_20_RECV2	= 6,
	VHT_DATA_SC_20_RECV3	= 7,
	VHT_DATA_SC_20_RECV4	= 8,
	VHT_DATA_SC_40_UPPER_OF_80MHZ	= 9,
	VHT_DATA_SC_40_LOWER_OF_80MHZ	= 10,
};
#endif
+968 −0

File added.

Preview size limit exceeded, changes collapsed.

+198 −0
Original line number Diff line number Diff line
/******************************************************************************
 *
 * Copyright(c) 2016  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.
 *
 * The full GNU General Public License is included in this distribution in the
 * file called LICENSE.
 *
 * Contact Information:
 * wlanfae <wlanfae@realtek.com>
 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
 * Hsinchu 300, Taiwan.
 *
 * Larry Finger <Larry.Finger@lwfinger.net>
 *
 *****************************************************************************/

#ifndef __RTL8822B__FW__H__
#define __RTL8822B__FW__H__

#define USE_OLD_WOWLAN_DEBUG_FW	0

#define H2C_8822B_RSVDPAGE_LOC_LEN	5
#define H2C_8822B_PWEMODE_LENGTH	7
#define H2C_8822B_JOINBSSRPT_LENGTH	1
#define H2C_8822B_AP_OFFLOAD_LENGTH	3
#define H2C_8822B_WOWLAN_LENGTH	3
#define H2C_8822B_KEEP_ALIVE_CTRL_LENGTH	3
#if (USE_OLD_WOWLAN_DEBUG_FW == 0)
#define H2C_8822B_REMOTE_WAKE_CTRL_LEN	1
#else
#define H2C_8822B_REMOTE_WAKE_CTRL_LEN	3
#endif
#define H2C_8822B_AOAC_GLOBAL_INFO_LEN	2
#define H2C_8822B_AOAC_RSVDPAGE_LOC_LEN	7
#define H2C_DEFAULT_PORT_ID_LEN	2

/* Fw PS state for RPWM.
 *BIT[2:0] = HW state
 *BIT[3] = Protocol PS state,  1: register active state, 0: register sleep state
 *BIT[4] = sub-state
 */
#define FW_PS_RF_ON	BIT(2)
#define FW_PS_REGISTER_ACTIVE	BIT(3)

#define FW_PS_ACK	BIT(6)
#define FW_PS_TOGGLE	BIT(7)

/* 8822B RPWM value*/
/* BIT[0] = 1: 32k, 0: 40M*/
#define FW_PS_CLOCK_OFF	BIT(0) /* 32k */
#define FW_PS_CLOCK_ON	0 /* 40M */

#define FW_PS_STATE_MASK	(0x0F)
#define FW_PS_STATE_HW_MASK	(0x07)
#define FW_PS_STATE_INT_MASK	(0x3F)

#define FW_PS_STATE(x) (FW_PS_STATE_MASK & (x))

#define FW_PS_STATE_ALL_ON_8822B	(FW_PS_CLOCK_ON)
#define FW_PS_STATE_RF_ON_8822B	(FW_PS_CLOCK_ON)
#define FW_PS_STATE_RF_OFF_8822B	(FW_PS_CLOCK_ON)
#define FW_PS_STATE_RF_OFF_LOW_PWR	(FW_PS_CLOCK_OFF)

/* For 8822B H2C PwrMode Cmd ID 5.*/
#define FW_PWR_STATE_ACTIVE ((FW_PS_RF_ON) | (FW_PS_REGISTER_ACTIVE))
#define FW_PWR_STATE_RF_OFF	0

#define FW_PS_IS_ACK(x) ((x) & FW_PS_ACK)

#define IS_IN_LOW_POWER_STATE_8822B(fw_ps_state)                               \
	(FW_PS_STATE(fw_ps_state) == FW_PS_CLOCK_OFF)

#define FW_PWR_STATE_ACTIVE ((FW_PS_RF_ON) | (FW_PS_REGISTER_ACTIVE))
#define FW_PWR_STATE_RF_OFF	0

enum rtl8822b_h2c_cmd {
	H2C_8822B_RSVDPAGE	= 0,
	H2C_8822B_MSRRPT	= 1,
	H2C_8822B_SCAN	= 2,
	H2C_8822B_KEEP_ALIVE_CTRL	= 3,
	H2C_8822B_DISCONNECT_DECISION	= 4,
#if (USE_OLD_WOWLAN_DEBUG_FW == 1)
	H2C_8822B_WO_WLAN	= 5,
#endif
	H2C_8822B_INIT_OFFLOAD	= 6,
#if (USE_OLD_WOWLAN_DEBUG_FW == 1)
	H2C_8822B_REMOTE_WAKE_CTRL	= 7,
#endif
	H2C_8822B_AP_OFFLOAD	= 8,
	H2C_8822B_BCN_RSVDPAGE	= 9,
	H2C_8822B_PROBERSP_RSVDPAGE	= 10,

	H2C_8822B_SETPWRMODE	= 0x20,
	H2C_8822B_PS_TUNING_PARA	= 0x21,
	H2C_8822B_PS_TUNING_PARA2	= 0x22,
	H2C_8822B_PS_LPS_PARA	= 0x23,
	H2C_8822B_P2P_PS_OFFLOAD	= 024,
	H2C_8822B_DEFAULT_PORT_ID	= 0x2C,

#if (USE_OLD_WOWLAN_DEBUG_FW == 0)
	H2C_8822B_WO_WLAN	= 0x80,
	H2C_8822B_REMOTE_WAKE_CTRL	= 0x81,
	H2C_8822B_AOAC_GLOBAL_INFO	= 0x82,
	H2C_8822B_AOAC_RSVDPAGE	= 0x83,
#endif
	H2C_8822B_MACID_CFG	= 0x40,
	H2C_8822B_RSSI_REPORT	= 0x42,
	H2C_8822B_MACID_CFG_3SS	= 0x46,
	/*Not defined CTW CMD for P2P yet*/
	H2C_8822B_P2P_PS_CTW_CMD	= 0x99,
	MAX_8822B_H2CCMD
};

enum rtl8822b_c2h_evt {
	C2H_8822B_DBG	= 0x00,
	C2H_8822B_LB	= 0x01,
	C2H_8822B_TXBF	= 0x02,
	C2H_8822B_TX_REPORT	= 0x03,
	C2H_8822B_BT_INFO	= 0x09,
	C2H_8822B_BT_MP	= 0x0B,
	C2H_8822B_RA_RPT	= 0x0C,
	MAX_8822B_C2HEVENT
};

/* H2C: 0x20 */
#define SET_H2CCMD_PWRMODE_PARM_MODE(__ph2ccmd, __val)                         \
	SET_BITS_TO_LE_1BYTE(__ph2ccmd, 0, 7, __val)
#define SET_H2CCMD_PWRMODE_PARM_CLK_REQ(__ph2ccmd, __val)                      \
	SET_BITS_TO_LE_1BYTE(__ph2ccmd, 7, 1, __val)
#define SET_H2CCMD_PWRMODE_PARM_RLBM(__ph2ccmd, __val)                         \
	SET_BITS_TO_LE_1BYTE((__ph2ccmd) + 1, 0, 4, __val)
#define SET_H2CCMD_PWRMODE_PARM_SMART_PS(__ph2ccmd, __val)                     \
	SET_BITS_TO_LE_1BYTE((__ph2ccmd) + 1, 4, 4, __val)
#define SET_H2CCMD_PWRMODE_PARM_AWAKE_INTERVAL(__ph2ccmd, __val)               \
	SET_BITS_TO_LE_1BYTE((__ph2ccmd) + 2, 0, 8, __val)
#define SET_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(__ph2ccmd, __val)              \
	SET_BITS_TO_LE_1BYTE((__ph2ccmd) + 3, 0, 1, __val)
#define SET_H2CCMD_PWRMODE_PARM_BCN_EARLY_RPT(__ph2ccmd, __val)                \
	SET_BITS_TO_LE_1BYTE((__ph2ccmd) + 3, 2, 1, __val)
#define SET_H2CCMD_PWRMODE_PARM_PORT_ID(__ph2ccmd, __val)                      \
	SET_BITS_TO_LE_1BYTE((__ph2ccmd) + 3, 5, 3, __val)
#define SET_H2CCMD_PWRMODE_PARM_PWR_STATE(__ph2ccmd, __val)                    \
	SET_BITS_TO_LE_1BYTE((__ph2ccmd) + 4, 0, 8, __val)
#define SET_H2CCMD_PWRMODE_PARM_BYTE5(__ph2ccmd, __val)                        \
	SET_BITS_TO_LE_1BYTE((__ph2ccmd) + 5, 0, 8, __val)

/* H2C: 0x00 */
#define SET_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(__ph2ccmd, __val)                    \
	SET_BITS_TO_LE_1BYTE(__ph2ccmd, 0, 8, __val)
#define SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(__ph2ccmd, __val)                       \
	SET_BITS_TO_LE_1BYTE((__ph2ccmd) + 1, 0, 8, __val)
#define SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(__ph2ccmd, __val)                    \
	SET_BITS_TO_LE_1BYTE((__ph2ccmd) + 2, 0, 8, __val)
#define SET_H2CCMD_RSVDPAGE_LOC_QOS_NULL_DATA(__ph2ccmd, __val)                \
	SET_BITS_TO_LE_1BYTE((__ph2ccmd) + 3, 0, 8, __val)
#define SET_H2CCMD_RSVDPAGE_LOC_BT_QOS_NULL_DATA(__ph2ccmd, __val)             \
	SET_BITS_TO_LE_1BYTE((__ph2ccmd) + 4, 0, 8, __val)

/* H2C: 0x01 */
#define SET_H2CCMD_MSRRPT_PARM_OPMODE(__ph2ccmd, __val)                        \
	SET_BITS_TO_LE_1BYTE(__ph2ccmd, 0, 1, __val)
#define SET_H2CCMD_MSRRPT_PARM_MACID_IND(__ph2ccmd, __val)                     \
	SET_BITS_TO_LE_1BYTE(__ph2ccmd, 1, 1, __val)
#define SET_H2CCMD_MSRRPT_PARM_MACID(__ph2ccmd, __val)                         \
	SET_BITS_TO_LE_1BYTE(__ph2ccmd + 1, 0, 8, __val)
#define SET_H2CCMD_MSRRPT_PARM_MACID_END(__ph2ccmd, __val)                     \
	SET_BITS_TO_LE_1BYTE(__ph2ccmd + 2, 0, 8, __val)

/* H2C: 0x2C */
#define SET_H2CCMD_DFTPID_PORT_ID(__ph2ccmd, __val)                            \
	SET_BITS_TO_LE_1BYTE(((u8 *)(__ph2ccmd)), 0, 8, (__val))
#define SET_H2CCMD_DFTPID_MAC_ID(__ph2ccmd, __val)                             \
	SET_BITS_TO_LE_1BYTE(((u8 *)(__ph2ccmd)) + 1, 0, 8, (__val))

void rtl8822be_fill_h2c_cmd(struct ieee80211_hw *hw, u8 element_id, u32 cmd_len,
			    u8 *cmdbuffer);
void rtl8822be_set_default_port_id_cmd(struct ieee80211_hw *hw);
void rtl8822be_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode);
void rtl8822be_set_fw_media_status_rpt_cmd(struct ieee80211_hw *hw, u8 mstatus);
void rtl8822be_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool b_dl_finished);
void rtl8822be_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state);
void rtl8822be_c2h_packet_handler(struct ieee80211_hw *hw, u8 *buffer, u8 len);
void rtl8822be_c2h_content_parsing(struct ieee80211_hw *hw, u8 c2h_cmd_id,
				   u8 c2h_cmd_len, u8 *tmp_buf);
bool rtl8822b_halmac_cb_write_data_rsvd_page(struct rtl_priv *rtlpriv, u8 *buf,
					     u32 size);
bool rtl8822b_halmac_cb_write_data_h2c(struct rtl_priv *rtlpriv, u8 *buf,
				       u32 size);
#endif
+2441 −0

File added.

Preview size limit exceeded, changes collapsed.

+66 −0
Original line number Diff line number Diff line
/******************************************************************************
 *
 * Copyright(c) 2016  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.
 *
 * The full GNU General Public License is included in this distribution in the
 * file called LICENSE.
 *
 * Contact Information:
 * wlanfae <wlanfae@realtek.com>
 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
 * Hsinchu 300, Taiwan.
 *
 * Larry Finger <Larry.Finger@lwfinger.net>
 *
 *****************************************************************************/

#ifndef __RTL8822B_HW_H__
#define __RTL8822B_HW_H__

extern u8 rtl_channel5g[CHANNEL_MAX_NUMBER_5G];
extern u8 rtl_channel5g_80m[CHANNEL_MAX_NUMBER_5G_80M];

void rtl8822be_get_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val);
void rtl8822be_read_eeprom_info(struct ieee80211_hw *hw,
				struct rtl_phydm_params *params);
void rtl8822be_read_eeprom_info_dummy(struct ieee80211_hw *hw);
void rtl8822be_interrupt_recognized(struct ieee80211_hw *hw, u32 *p_inta,
				    u32 *p_intb, u32 *p_intc, u32 *p_intd);
int rtl8822be_hw_init(struct ieee80211_hw *hw);
void rtl8822be_card_disable(struct ieee80211_hw *hw);
void rtl8822be_enable_interrupt(struct ieee80211_hw *hw);
void rtl8822be_disable_interrupt(struct ieee80211_hw *hw);
int rtl8822be_set_network_type(struct ieee80211_hw *hw,
			       enum nl80211_iftype type);
void rtl8822be_set_check_bssid(struct ieee80211_hw *hw, bool check_bssid);
void rtl8822be_set_qos(struct ieee80211_hw *hw, int aci);
void rtl8822be_set_beacon_related_registers(struct ieee80211_hw *hw);
void rtl8822be_set_beacon_interval(struct ieee80211_hw *hw);
void rtl8822be_update_interrupt_mask(struct ieee80211_hw *hw, u32 add_msr,
				     u32 rm_msr);
void rtl8822be_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val);
void rtl8822be_update_hal_rate_tbl(struct ieee80211_hw *hw,
				   struct ieee80211_sta *sta, u8 rssi_level,
				   bool update_bw);
void rtl8822be_update_channel_access_setting(struct ieee80211_hw *hw);
bool rtl8822be_gpio_radio_on_off_checking(struct ieee80211_hw *hw, u8 *valid);
void rtl8822be_set_key(struct ieee80211_hw *hw, u32 key_index, u8 *p_macaddr,
		       bool is_group, u8 enc_algo, bool is_wepkey,
		       bool clear_all);
void rtl8822be_enable_hw_security_config(struct ieee80211_hw *hw);
void rtl8822be_read_bt_coexist_info_from_hwpg(struct ieee80211_hw *hw,
					      bool autoload_fail, u8 *hwinfo);
void rtl8822be_bt_reg_init(struct ieee80211_hw *hw);
void rtl8822be_suspend(struct ieee80211_hw *hw);
void rtl8822be_resume(struct ieee80211_hw *hw);
void rtl8822be_fw_clk_off_timer_callback(unsigned long data);
#endif
Loading