#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)
{ … }
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)
{ … }
static int rtl8xxxu_gen1_channel_to_group(int channel)
{ … }
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)
{ … }
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)
{ … }
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)
{ … }
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)
{ … }
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)
{ … }
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)
{ … }
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)
{ … }
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(…) …;