linux/drivers/net/wireless/realtek/rtl8xxxu/core.c

// SPDX-License-Identifier: GPL-2.0-only
/*
 * RTL8XXXU mac80211 USB driver
 *
 * Copyright (c) 2014 - 2017 Jes Sorensen <[email protected]>
 *
 * Portions, notably calibration code:
 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
 *
 * This driver was written as a replacement for the vendor provided
 * rtl8723au driver. As the Realtek 8xxx chips are very similar in
 * their programming interface, I have started adding support for
 * additional 8xxx chips like the 8192cu, 8188cus, etc.
 */

#include <linux/firmware.h>
#include "regs.h"
#include "rtl8xxxu.h"

#define DRIVER_NAME

int rtl8xxxu_debug;
static bool rtl8xxxu_ht40_2g;
static bool rtl8xxxu_dma_aggregation;
static int rtl8xxxu_dma_agg_timeout =;
static int rtl8xxxu_dma_agg_pages =;

MODULE_AUTHOR();
MODULE_DESCRIPTION();
MODULE_LICENSE();
MODULE_FIRMWARE();
MODULE_FIRMWARE();
MODULE_FIRMWARE();
MODULE_FIRMWARE();
MODULE_FIRMWARE();
MODULE_FIRMWARE();
MODULE_FIRMWARE();
MODULE_FIRMWARE();
MODULE_FIRMWARE();
MODULE_FIRMWARE();
MODULE_FIRMWARE();
MODULE_FIRMWARE();
MODULE_FIRMWARE();
MODULE_FIRMWARE();

module_param_named(debug, rtl8xxxu_debug, int, 0600);
MODULE_PARM_DESC();
module_param_named(ht40_2g, rtl8xxxu_ht40_2g, bool, 0600);
MODULE_PARM_DESC();
module_param_named(dma_aggregation, rtl8xxxu_dma_aggregation, bool, 0600);
MODULE_PARM_DESC();
module_param_named(dma_agg_timeout, rtl8xxxu_dma_agg_timeout, int, 0600);
MODULE_PARM_DESC();
module_param_named(dma_agg_pages, rtl8xxxu_dma_agg_pages, int, 0600);
MODULE_PARM_DESC();

#define USB_VENDOR_ID_REALTEK
#define RTL8XXXU_RX_URBS
#define RTL8XXXU_RX_URB_PENDING_WATER
#define RTL8XXXU_TX_URBS
#define RTL8XXXU_TX_URB_LOW_WATER
#define RTL8XXXU_TX_URB_HIGH_WATER

static int rtl8xxxu_submit_rx_urb(struct rtl8xxxu_priv *priv,
				  struct rtl8xxxu_rx_urb *rx_urb);

static struct ieee80211_rate rtl8xxxu_rates[] =;

static struct ieee80211_channel rtl8xxxu_channels_2g[] =;

static struct ieee80211_supported_band rtl8xxxu_supported_band =;

static const struct rtl8xxxu_reg32val rtl8723a_phy_1t_init_table[] =;

static const struct rtl8xxxu_reg32val rtl8192cu_phy_2t_init_table[] =;

static const struct rtl8xxxu_reg32val rtl8188ru_phy_1t_highpa_table[] =;

static const struct rtl8xxxu_reg32val rtl8xxx_agc_standard_table[] =;

static const struct rtl8xxxu_reg32val rtl8xxx_agc_highpa_table[] =;

static const struct rtl8xxxu_rfregs rtl8xxxu_rfregs[] =;

const u32 rtl8xxxu_iqk_phy_iq_bb_reg[RTL8XXXU_BB_REGS] =;

u8 rtl8xxxu_read8(struct rtl8xxxu_priv *priv, u16 addr)
{}

u16 rtl8xxxu_read16(struct rtl8xxxu_priv *priv, u16 addr)
{}

u32 rtl8xxxu_read32(struct rtl8xxxu_priv *priv, u16 addr)
{}

int rtl8xxxu_write8(struct rtl8xxxu_priv *priv, u16 addr, u8 val)
{}

int rtl8xxxu_write16(struct rtl8xxxu_priv *priv, u16 addr, u16 val)
{}

int rtl8xxxu_write32(struct rtl8xxxu_priv *priv, u16 addr, u32 val)
{}

int rtl8xxxu_write8_set(struct rtl8xxxu_priv *priv, u16 addr, u8 bits)
{}

int rtl8xxxu_write8_clear(struct rtl8xxxu_priv *priv, u16 addr, u8 bits)
{}

int rtl8xxxu_write16_set(struct rtl8xxxu_priv *priv, u16 addr, u16 bits)
{}

int rtl8xxxu_write16_clear(struct rtl8xxxu_priv *priv, u16 addr, u16 bits)
{}

int rtl8xxxu_write32_set(struct rtl8xxxu_priv *priv, u16 addr, u32 bits)
{}

int rtl8xxxu_write32_clear(struct rtl8xxxu_priv *priv, u16 addr, u32 bits)
{}

int rtl8xxxu_write32_mask(struct rtl8xxxu_priv *priv, u16 addr,
			  u32 mask, u32 val)
{}

int rtl8xxxu_write_rfreg_mask(struct rtl8xxxu_priv *priv,
			      enum rtl8xxxu_rfpath path, u8 reg,
			      u32 mask, u32 val)
{}

static int
rtl8xxxu_writeN(struct rtl8xxxu_priv *priv, u16 addr, u8 *buf, u16 len)
{}

u32 rtl8xxxu_read_rfreg(struct rtl8xxxu_priv *priv,
			enum rtl8xxxu_rfpath path, u8 reg)
{}

/*
 * The RTL8723BU driver indicates that registers 0xb2 and 0xb6 can
 * have write issues in high temperature conditions. We may have to
 * retry writing them.
 */
int rtl8xxxu_write_rfreg(struct rtl8xxxu_priv *priv,
			 enum rtl8xxxu_rfpath path, u8 reg, u32 data)
{}

static int
rtl8xxxu_gen1_h2c_cmd(struct rtl8xxxu_priv *priv, struct h2c_cmd *h2c, int len)
{}

int
rtl8xxxu_gen2_h2c_cmd(struct rtl8xxxu_priv *priv, struct h2c_cmd *h2c, int len)
{}

void rtl8xxxu_gen1_enable_rf(struct rtl8xxxu_priv *priv)
{}

void rtl8xxxu_gen1_disable_rf(struct rtl8xxxu_priv *priv)
{}

static void rtl8xxxu_stop_tx_beacon(struct rtl8xxxu_priv *priv)
{}

static void rtl8xxxu_start_tx_beacon(struct rtl8xxxu_priv *priv)
{}


/*
 * The rtl8723a has 3 channel groups for it's efuse settings. It only
 * supports the 2.4GHz band, so channels 1 - 14:
 *  group 0: channels 1 - 3
 *  group 1: channels 4 - 9
 *  group 2: channels 10 - 14
 *
 * Note: We index from 0 in the code
 */
static int rtl8xxxu_gen1_channel_to_group(int channel)
{}

/*
 * Valid for rtl8723bu and rtl8192eu
 */
int rtl8xxxu_gen2_channel_to_group(int channel)
{}

void rtl8xxxu_gen1_config_channel(struct ieee80211_hw *hw)
{}

void rtl8xxxu_gen2_config_channel(struct ieee80211_hw *hw)
{}

void
rtl8xxxu_gen1_set_tx_power(struct rtl8xxxu_priv *priv, int channel, bool ht40)
{}

static void rtl8xxxu_set_linktype(struct rtl8xxxu_priv *priv,
				  enum nl80211_iftype linktype, int port_num)
{}

static void
rtl8xxxu_set_retry(struct rtl8xxxu_priv *priv, u16 short_retry, u16 long_retry)
{}

static void
rtl8xxxu_set_spec_sifs(struct rtl8xxxu_priv *priv, u16 cck, u16 ofdm)
{}

static void rtl8xxxu_print_chipinfo(struct rtl8xxxu_priv *priv)
{}

void rtl8xxxu_identify_vendor_1bit(struct rtl8xxxu_priv *priv, u32 vendor)
{}

void rtl8xxxu_identify_vendor_2bits(struct rtl8xxxu_priv *priv, u32 vendor)
{}

void rtl8xxxu_config_endpoints_sie(struct rtl8xxxu_priv *priv)
{}

int rtl8xxxu_config_endpoints_no_sie(struct rtl8xxxu_priv *priv)
{}

int
rtl8xxxu_read_efuse8(struct rtl8xxxu_priv *priv, u16 offset, u8 *data)
{}

int rtl8xxxu_read_efuse(struct rtl8xxxu_priv *priv)
{}

static void rtl8xxxu_dump_efuse(struct rtl8xxxu_priv *priv)
{}

void rtl8xxxu_reset_8051(struct rtl8xxxu_priv *priv)
{}

static int rtl8xxxu_start_firmware(struct rtl8xxxu_priv *priv)
{}

static int rtl8xxxu_download_firmware(struct rtl8xxxu_priv *priv)
{}

int rtl8xxxu_load_firmware(struct rtl8xxxu_priv *priv, const char *fw_name)
{}

void rtl8xxxu_firmware_self_reset(struct rtl8xxxu_priv *priv)
{}

static int
rtl8xxxu_init_mac(struct rtl8xxxu_priv *priv)
{}

int rtl8xxxu_init_phy_regs(struct rtl8xxxu_priv *priv,
			   const struct rtl8xxxu_reg32val *array)
{}

void rtl8xxxu_gen1_init_phy_bb(struct rtl8xxxu_priv *priv)
{}

/*
 * Most of this is black magic retrieved from the old rtl8723au driver
 */
static int rtl8xxxu_init_phy_bb(struct rtl8xxxu_priv *priv)
{}

static int rtl8xxxu_init_rf_regs(struct rtl8xxxu_priv *priv,
				 const struct rtl8xxxu_rfregval *array,
				 enum rtl8xxxu_rfpath path)
{}

int rtl8xxxu_init_phy_rf(struct rtl8xxxu_priv *priv,
			 const struct rtl8xxxu_rfregval *table,
			 enum rtl8xxxu_rfpath path)
{}

static int rtl8xxxu_llt_write(struct rtl8xxxu_priv *priv, u8 address, u8 data)
{}

int rtl8xxxu_init_llt_table(struct rtl8xxxu_priv *priv)
{}

int rtl8xxxu_auto_llt_table(struct rtl8xxxu_priv *priv)
{}

static int rtl8xxxu_init_queue_priority(struct rtl8xxxu_priv *priv)
{}

void rtl8xxxu_fill_iqk_matrix_a(struct rtl8xxxu_priv *priv, bool iqk_ok,
				int result[][8], int candidate, bool tx_only)
{}

void rtl8xxxu_fill_iqk_matrix_b(struct rtl8xxxu_priv *priv, bool iqk_ok,
				int result[][8], int candidate, bool tx_only)
{}

#define MAX_TOLERANCE

bool rtl8xxxu_simularity_compare(struct rtl8xxxu_priv *priv,
				 int result[][8], int c1, int c2)
{}

bool rtl8xxxu_gen2_simularity_compare(struct rtl8xxxu_priv *priv,
				      int result[][8], int c1, int c2)
{}

void
rtl8xxxu_save_mac_regs(struct rtl8xxxu_priv *priv, const u32 *reg, u32 *backup)
{}

void rtl8xxxu_restore_mac_regs(struct rtl8xxxu_priv *priv,
			       const u32 *reg, u32 *backup)
{}

void rtl8xxxu_save_regs(struct rtl8xxxu_priv *priv, const u32 *regs,
			u32 *backup, int count)
{}

void rtl8xxxu_restore_regs(struct rtl8xxxu_priv *priv, const u32 *regs,
			   u32 *backup, int count)
{}


void rtl8xxxu_path_adda_on(struct rtl8xxxu_priv *priv, const u32 *regs,
			   bool path_a_on)
{}

void rtl8xxxu_mac_calibration(struct rtl8xxxu_priv *priv,
			      const u32 *regs, u32 *backup)
{}

static int rtl8xxxu_iqk_path_a(struct rtl8xxxu_priv *priv)
{}

static int rtl8xxxu_iqk_path_b(struct rtl8xxxu_priv *priv)
{}

static void rtl8xxxu_phy_iqcalibrate(struct rtl8xxxu_priv *priv,
				     int result[][8], int t)
{}

void rtl8xxxu_gen2_prepare_calibrate(struct rtl8xxxu_priv *priv, u8 start)
{}

void rtl8xxxu_gen1_phy_iq_calibrate(struct rtl8xxxu_priv *priv)
{}

void rtl8723a_phy_lc_calibrate(struct rtl8xxxu_priv *priv)
{}

static int rtl8xxxu_set_mac(struct rtl8xxxu_priv *priv, int port_num)
{}

static int rtl8xxxu_set_bssid(struct rtl8xxxu_priv *priv, const u8 *bssid, int port_num)
{}

static void
rtl8xxxu_set_ampdu_factor(struct rtl8xxxu_priv *priv, u8 ampdu_factor)
{}

static void rtl8xxxu_set_ampdu_min_space(struct rtl8xxxu_priv *priv, u8 density)
{}

static int rtl8xxxu_active_to_emu(struct rtl8xxxu_priv *priv)
{}

int rtl8xxxu_active_to_lps(struct rtl8xxxu_priv *priv)
{}

void rtl8xxxu_disabled_to_emu(struct rtl8xxxu_priv *priv)
{}

static int rtl8xxxu_emu_to_disabled(struct rtl8xxxu_priv *priv)
{}

int rtl8xxxu_flush_fifo(struct rtl8xxxu_priv *priv)
{}

void rtl8xxxu_gen1_usb_quirks(struct rtl8xxxu_priv *priv)
{}

void rtl8xxxu_gen2_usb_quirks(struct rtl8xxxu_priv *priv)
{}

void rtl8xxxu_power_off(struct rtl8xxxu_priv *priv)
{}

void rtl8723bu_set_ps_tdma(struct rtl8xxxu_priv *priv,
			   u8 arg1, u8 arg2, u8 arg3, u8 arg4, u8 arg5)
{}

void rtl8xxxu_gen2_disable_rf(struct rtl8xxxu_priv *priv)
{}

static void rtl8xxxu_init_queue_reserved_page(struct rtl8xxxu_priv *priv)
{}

void rtl8xxxu_init_burst(struct rtl8xxxu_priv *priv)
{}

static u8 rtl8xxxu_acquire_macid(struct rtl8xxxu_priv *priv)
{}

static void rtl8xxxu_release_macid(struct rtl8xxxu_priv *priv, u8 macid)
{}

static inline u8 rtl8xxxu_get_macid(struct rtl8xxxu_priv *priv,
				    struct ieee80211_sta *sta)
{}

static int rtl8xxxu_init_device(struct ieee80211_hw *hw)
{}

static void rtl8xxxu_cam_write(struct rtl8xxxu_priv *priv,
			       struct ieee80211_key_conf *key, const u8 *mac)
{}

static
int rtl8xxxu_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant)
{}

static int rtl8xxxu_set_tim(struct ieee80211_hw *hw, struct ieee80211_sta *sta,
			    bool set)
{}

static void rtl8xxxu_sw_scan_start(struct ieee80211_hw *hw,
				   struct ieee80211_vif *vif, const u8 *mac)
{}

static void rtl8xxxu_sw_scan_complete(struct ieee80211_hw *hw,
				      struct ieee80211_vif *vif)
{}

void rtl8xxxu_update_rate_mask(struct rtl8xxxu_priv *priv,
			       u32 ramask, u8 rateid, int sgi, int txbw_40mhz,
			       u8 macid)
{}

void rtl8xxxu_gen2_update_rate_mask(struct rtl8xxxu_priv *priv,
				    u32 ramask, u8 rateid, int sgi, int txbw_40mhz,
				    u8 macid)
{}

void rtl8xxxu_gen1_report_connect(struct rtl8xxxu_priv *priv,
				  u8 macid, u8 role, bool connect)
{}

void rtl8xxxu_gen2_report_connect(struct rtl8xxxu_priv *priv,
				  u8 macid, u8 role, bool connect)
{}

void rtl8xxxu_gen1_report_rssi(struct rtl8xxxu_priv *priv, u8 macid, u8 rssi)
{}

void rtl8xxxu_gen2_report_rssi(struct rtl8xxxu_priv *priv, u8 macid, u8 rssi)
{}

void rtl8xxxu_gen1_init_aggregation(struct rtl8xxxu_priv *priv)
{}

static const struct ieee80211_rate rtl8xxxu_legacy_ratetable[] =;

static void rtl8xxxu_desc_to_mcsrate(u16 rate, u8 *mcs, u8 *nss)
{}

static void rtl8xxxu_set_basic_rates(struct rtl8xxxu_priv *priv, u32 rate_cfg)
{}

static u16
rtl8xxxu_wireless_mode(struct ieee80211_hw *hw, struct ieee80211_sta *sta)
{}

static void rtl8xxxu_set_aifs(struct rtl8xxxu_priv *priv, u8 slot_time)
{}

void rtl8xxxu_update_ra_report(struct rtl8xxxu_ra_report *rarpt,
			       u8 rate, u8 sgi, u8 bw)
{}

static void
rtl8xxxu_bss_info_changed(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
			  struct ieee80211_bss_conf *bss_conf, u64 changed)
{}

static int rtl8xxxu_start_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
			     struct ieee80211_bss_conf *link_conf)
{}

static u32 rtl8xxxu_80211_to_rtl_queue(u32 queue)
{}

static u32 rtl8xxxu_queue_select(struct ieee80211_hdr *hdr, struct sk_buff *skb)
{}

/*
 * Despite newer chips 8723b/8812/8821 having a larger TX descriptor
 * format. The descriptor checksum is still only calculated over the
 * initial 32 bytes of the descriptor!
 */
static void rtl8xxxu_calc_tx_desc_csum(struct rtl8xxxu_txdesc32 *tx_desc)
{}

static void rtl8xxxu_free_tx_resources(struct rtl8xxxu_priv *priv)
{}

static struct rtl8xxxu_tx_urb *
rtl8xxxu_alloc_tx_urb(struct rtl8xxxu_priv *priv)
{}

static void rtl8xxxu_free_tx_urb(struct rtl8xxxu_priv *priv,
				 struct rtl8xxxu_tx_urb *tx_urb)
{}

static void rtl8xxxu_tx_complete(struct urb *urb)
{}

static void rtl8xxxu_dump_action(struct device *dev,
				 struct ieee80211_hdr *hdr)
{}

/*
 * Fill in v1 (gen1) specific TX descriptor bits.
 * This format is used on 8188cu/8192cu/8723au
 */
void
rtl8xxxu_fill_txdesc_v1(struct ieee80211_hw *hw, struct ieee80211_hdr *hdr,
			struct ieee80211_tx_info *tx_info,
			struct rtl8xxxu_txdesc32 *tx_desc, bool sgi,
			bool short_preamble, bool ampdu_enable, u32 rts_rate,
			u8 macid)
{}

/*
 * Fill in v2 (gen2) specific TX descriptor bits.
 * This format is used on 8192eu/8723bu
 */
void
rtl8xxxu_fill_txdesc_v2(struct ieee80211_hw *hw, struct ieee80211_hdr *hdr,
			struct ieee80211_tx_info *tx_info,
			struct rtl8xxxu_txdesc32 *tx_desc32, bool sgi,
			bool short_preamble, bool ampdu_enable, u32 rts_rate,
			u8 macid)
{}

/*
 * Fill in v3 (gen1) specific TX descriptor bits.
 * This format is a hybrid between the v1 and v2 formats, only seen
 * on 8188eu devices so far.
 */
void
rtl8xxxu_fill_txdesc_v3(struct ieee80211_hw *hw, struct ieee80211_hdr *hdr,
			struct ieee80211_tx_info *tx_info,
			struct rtl8xxxu_txdesc32 *tx_desc, bool sgi,
			bool short_preamble, bool ampdu_enable, u32 rts_rate,
			u8 macid)
{}

static void rtl8xxxu_tx(struct ieee80211_hw *hw,
			struct ieee80211_tx_control *control,
			struct sk_buff *skb)
{}

static void rtl8xxxu_send_beacon_frame(struct ieee80211_hw *hw,
				       struct ieee80211_vif *vif)
{}

static void rtl8xxxu_update_beacon_work_callback(struct work_struct *work)
{}

static inline bool rtl8xxxu_is_packet_match_bssid(struct rtl8xxxu_priv *priv,
						  struct ieee80211_hdr *hdr,
						  int port_num)
{}

static inline bool rtl8xxxu_is_sta_sta(struct rtl8xxxu_priv *priv)
{}

void rtl8723au_rx_parse_phystats(struct rtl8xxxu_priv *priv,
				 struct ieee80211_rx_status *rx_status,
				 struct rtl8723au_phy_stats *phy_stats,
				 u32 rxmcs, struct ieee80211_hdr *hdr,
				 bool crc_icv_err)
{}

static void jaguar2_rx_parse_phystats_type0(struct rtl8xxxu_priv *priv,
					    struct ieee80211_rx_status *rx_status,
					    struct jaguar2_phy_stats_type0 *phy_stats0,
					    u32 rxmcs, struct ieee80211_hdr *hdr,
					    bool crc_icv_err)
{}

static void jaguar2_rx_parse_phystats_type1(struct rtl8xxxu_priv *priv,
					    struct ieee80211_rx_status *rx_status,
					    struct jaguar2_phy_stats_type1 *phy_stats1,
					    u32 rxmcs, struct ieee80211_hdr *hdr,
					    bool crc_icv_err)
{}

static void jaguar2_rx_parse_phystats_type2(struct rtl8xxxu_priv *priv,
					    struct ieee80211_rx_status *rx_status,
					    struct jaguar2_phy_stats_type2 *phy_stats2,
					    u32 rxmcs, struct ieee80211_hdr *hdr,
					    bool crc_icv_err)
{}

void jaguar2_rx_parse_phystats(struct rtl8xxxu_priv *priv,
			       struct ieee80211_rx_status *rx_status,
			       struct rtl8723au_phy_stats *phy_stats,
			       u32 rxmcs, struct ieee80211_hdr *hdr,
			       bool crc_icv_err)
{}

static void rtl8xxxu_free_rx_resources(struct rtl8xxxu_priv *priv)
{}

static void rtl8xxxu_queue_rx_urb(struct rtl8xxxu_priv *priv,
				  struct rtl8xxxu_rx_urb *rx_urb)
{}

static void rtl8xxxu_rx_urb_work(struct work_struct *work)
{}

/*
 * The RTL8723BU/RTL8192EU vendor driver use coexistence table type
 * 0-7 to represent writing different combinations of register values
 * to REG_BT_COEX_TABLEs. It's for different kinds of coexistence use
 * cases which Realtek doesn't provide detail for these settings. Keep
 * this aligned with vendor driver for easier maintenance.
 */
static
void rtl8723bu_set_coex_with_type(struct rtl8xxxu_priv *priv, u8 type)
{}

static
void rtl8723bu_update_bt_link_info(struct rtl8xxxu_priv *priv, u8 bt_info)
{}

static inline bool rtl8xxxu_is_assoc(struct rtl8xxxu_priv *priv)
{}

static
void rtl8723bu_handle_bt_inquiry(struct rtl8xxxu_priv *priv)
{}

static
void rtl8723bu_handle_bt_info(struct rtl8xxxu_priv *priv)
{}

static void rtl8xxxu_c2hcmd_callback(struct work_struct *work)
{}

static void rtl8723bu_handle_c2h(struct rtl8xxxu_priv *priv,
				 struct sk_buff *skb)
{}

static void rtl8188e_c2hcmd_callback(struct work_struct *work)
{}

#define rtl8xxxu_iterate_vifs_atomic(priv, iterator, data)

struct rtl8xxxu_rx_update_rssi_data {};

static void rtl8xxxu_rx_update_rssi_iter(void *data, u8 *mac,
					 struct ieee80211_vif *vif)
{}

static inline u8 *get_hdr_bssid(struct ieee80211_hdr *hdr)
{}

static void rtl8xxxu_rx_update_rssi(struct rtl8xxxu_priv *priv,
				    struct ieee80211_rx_status *rx_status,
				    struct ieee80211_hdr *hdr)
{}

int rtl8xxxu_parse_rxdesc16(struct rtl8xxxu_priv *priv, struct sk_buff *skb)
{}

int rtl8xxxu_parse_rxdesc24(struct rtl8xxxu_priv *priv, struct sk_buff *skb)
{}

static void rtl8xxxu_rx_complete(struct urb *urb)
{}

static int rtl8xxxu_submit_rx_urb(struct rtl8xxxu_priv *priv,
				  struct rtl8xxxu_rx_urb *rx_urb)
{}

static void rtl8xxxu_int_complete(struct urb *urb)
{}


static int rtl8xxxu_submit_int_urb(struct ieee80211_hw *hw)
{}

static void rtl8xxxu_switch_ports(struct rtl8xxxu_priv *priv)
{}

static int rtl8xxxu_add_interface(struct ieee80211_hw *hw,
				  struct ieee80211_vif *vif)
{}

static void rtl8xxxu_remove_interface(struct ieee80211_hw *hw,
				      struct ieee80211_vif *vif)
{}

static int rtl8xxxu_config(struct ieee80211_hw *hw, u32 changed)
{}

static int rtl8xxxu_conf_tx(struct ieee80211_hw *hw,
			    struct ieee80211_vif *vif,
			    unsigned int link_id, u16 queue,
			    const struct ieee80211_tx_queue_params *param)
{}

static void rtl8xxxu_configure_filter(struct ieee80211_hw *hw,
				      unsigned int changed_flags,
				      unsigned int *total_flags, u64 multicast)
{}

static int rtl8xxxu_set_rts_threshold(struct ieee80211_hw *hw, u32 rts)
{}

static int rtl8xxxu_get_free_sec_cam(struct ieee80211_hw *hw)
{}

static int rtl8xxxu_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
			    struct ieee80211_vif *vif,
			    struct ieee80211_sta *sta,
			    struct ieee80211_key_conf *key)
{}

static int
rtl8xxxu_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
		      struct ieee80211_ampdu_params *params)
{}

static void
rtl8xxxu_sta_statistics(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
			struct ieee80211_sta *sta, struct station_info *sinfo)
{}

static u8 rtl8xxxu_signal_to_snr(int signal)
{}

static void rtl8xxxu_refresh_rate_mask(struct rtl8xxxu_priv *priv,
				       int signal, struct ieee80211_sta *sta,
				       bool force)
{}

static void rtl8xxxu_set_atc_status(struct rtl8xxxu_priv *priv, bool atc_status)
{}

/* Central frequency offset correction */
static void rtl8xxxu_track_cfo(struct rtl8xxxu_priv *priv)
{}

static void rtl8xxxu_ra_iter(void *data, struct ieee80211_sta *sta)
{}

struct rtl8xxxu_stas_entry {};

struct rtl8xxxu_iter_stas_data {};

static void rtl8xxxu_collect_sta_iter(void *data, struct ieee80211_sta *sta)
{}

static void rtl8xxxu_watchdog_callback(struct work_struct *work)
{}

static int rtl8xxxu_start(struct ieee80211_hw *hw)
{}

static void rtl8xxxu_stop(struct ieee80211_hw *hw, bool suspend)
{}

static int rtl8xxxu_sta_add(struct ieee80211_hw *hw,
			    struct ieee80211_vif *vif,
			    struct ieee80211_sta *sta)
{}

static int rtl8xxxu_sta_remove(struct ieee80211_hw *hw,
			       struct ieee80211_vif *vif,
			       struct ieee80211_sta *sta)
{}

static const struct ieee80211_ops rtl8xxxu_ops =;

static int rtl8xxxu_parse_usb(struct rtl8xxxu_priv *priv,
			      struct usb_interface *interface)
{}

static void rtl8xxxu_init_led(struct rtl8xxxu_priv *priv)
{}

static void rtl8xxxu_deinit_led(struct rtl8xxxu_priv *priv)
{}

static const struct ieee80211_iface_limit rtl8xxxu_limits[] =;

static const struct ieee80211_iface_combination rtl8xxxu_combinations[] =;

static int rtl8xxxu_probe(struct usb_interface *interface,
			  const struct usb_device_id *id)
{}

static void rtl8xxxu_disconnect(struct usb_interface *interface)
{}

static const struct usb_device_id dev_table[] =;

static struct usb_driver rtl8xxxu_driver =;

MODULE_DEVICE_TABLE(usb, dev_table);

module_usb_driver();