Loading drivers/net/wireless/wl12xx/Kconfig +0 −10 Original line number Diff line number Diff line Loading @@ -42,16 +42,6 @@ config WL12XX_SDIO If you choose to build a module, it'll be called wl12xx_sdio. Say N if unsure. config WL12XX_SDIO_TEST tristate "TI wl12xx SDIO testing support" depends on WL12XX && MMC && WL12XX_SDIO default n ---help--- This module adds support for the SDIO bus testing with the TI wl12xx chipsets. You probably don't want this unless you are testing a new hardware platform. Select this if you want to test the SDIO bus which is connected to the wl12xx chip. config WL12XX_PLATFORM_DATA bool depends on WL12XX_SDIO != n || WL1251_SDIO != n Loading drivers/net/wireless/wl12xx/Makefile +0 −3 Original line number Diff line number Diff line Loading @@ -3,14 +3,11 @@ wl12xx-objs = main.o cmd.o io.o event.o tx.o rx.o ps.o acx.o \ wl12xx_spi-objs = spi.o wl12xx_sdio-objs = sdio.o wl12xx_sdio_test-objs = sdio_test.o wl12xx-$(CONFIG_NL80211_TESTMODE) += testmode.o obj-$(CONFIG_WL12XX) += wl12xx.o obj-$(CONFIG_WL12XX_SPI) += wl12xx_spi.o obj-$(CONFIG_WL12XX_SDIO) += wl12xx_sdio.o obj-$(CONFIG_WL12XX_SDIO_TEST) += wl12xx_sdio_test.o # small builtin driver bit obj-$(CONFIG_WL12XX_PLATFORM_DATA) += wl12xx_platform_data.o drivers/net/wireless/wl12xx/acx.c +82 −64 Original line number Diff line number Diff line Loading @@ -29,11 +29,12 @@ #include <linux/slab.h> #include "wl12xx.h" #include "debug.h" #include "wl12xx_80211.h" #include "reg.h" #include "ps.h" int wl1271_acx_wake_up_conditions(struct wl1271 *wl) int wl1271_acx_wake_up_conditions(struct wl1271 *wl, struct wl12xx_vif *wlvif) { struct acx_wake_up_condition *wake_up; int ret; Loading @@ -46,7 +47,7 @@ int wl1271_acx_wake_up_conditions(struct wl1271 *wl) goto out; } wake_up->role_id = wl->role_id; wake_up->role_id = wlvif->role_id; wake_up->wake_up_event = wl->conf.conn.wake_up_event; wake_up->listen_interval = wl->conf.conn.listen_interval; Loading Loading @@ -84,7 +85,8 @@ int wl1271_acx_sleep_auth(struct wl1271 *wl, u8 sleep_auth) return ret; } int wl1271_acx_tx_power(struct wl1271 *wl, int power) int wl1271_acx_tx_power(struct wl1271 *wl, struct wl12xx_vif *wlvif, int power) { struct acx_current_tx_power *acx; int ret; Loading @@ -100,7 +102,7 @@ int wl1271_acx_tx_power(struct wl1271 *wl, int power) goto out; } acx->role_id = wl->role_id; acx->role_id = wlvif->role_id; acx->current_tx_power = power * 10; ret = wl1271_cmd_configure(wl, DOT11_CUR_TX_PWR, acx, sizeof(*acx)); Loading @@ -114,7 +116,7 @@ int wl1271_acx_tx_power(struct wl1271 *wl, int power) return ret; } int wl1271_acx_feature_cfg(struct wl1271 *wl) int wl1271_acx_feature_cfg(struct wl1271 *wl, struct wl12xx_vif *wlvif) { struct acx_feature_config *feature; int ret; Loading @@ -128,7 +130,7 @@ int wl1271_acx_feature_cfg(struct wl1271 *wl) } /* DF_ENCRYPTION_DISABLE and DF_SNIFF_MODE_ENABLE are disabled */ feature->role_id = wl->role_id; feature->role_id = wlvif->role_id; feature->data_flow_options = 0; feature->options = 0; Loading Loading @@ -210,7 +212,8 @@ int wl1271_acx_pd_threshold(struct wl1271 *wl) return ret; } int wl1271_acx_slot(struct wl1271 *wl, enum acx_slot_type slot_time) int wl1271_acx_slot(struct wl1271 *wl, struct wl12xx_vif *wlvif, enum acx_slot_type slot_time) { struct acx_slot *slot; int ret; Loading @@ -223,7 +226,7 @@ int wl1271_acx_slot(struct wl1271 *wl, enum acx_slot_type slot_time) goto out; } slot->role_id = wl->role_id; slot->role_id = wlvif->role_id; slot->wone_index = STATION_WONE_INDEX; slot->slot_time = slot_time; Loading @@ -238,8 +241,8 @@ int wl1271_acx_slot(struct wl1271 *wl, enum acx_slot_type slot_time) return ret; } int wl1271_acx_group_address_tbl(struct wl1271 *wl, bool enable, void *mc_list, u32 mc_list_len) int wl1271_acx_group_address_tbl(struct wl1271 *wl, struct wl12xx_vif *wlvif, bool enable, void *mc_list, u32 mc_list_len) { struct acx_dot11_grp_addr_tbl *acx; int ret; Loading @@ -253,7 +256,7 @@ int wl1271_acx_group_address_tbl(struct wl1271 *wl, bool enable, } /* MAC filtering */ acx->role_id = wl->role_id; acx->role_id = wlvif->role_id; acx->enabled = enable; acx->num_groups = mc_list_len; memcpy(acx->mac_table, mc_list, mc_list_len * ETH_ALEN); Loading @@ -270,7 +273,8 @@ int wl1271_acx_group_address_tbl(struct wl1271 *wl, bool enable, return ret; } int wl1271_acx_service_period_timeout(struct wl1271 *wl) int wl1271_acx_service_period_timeout(struct wl1271 *wl, struct wl12xx_vif *wlvif) { struct acx_rx_timeout *rx_timeout; int ret; Loading @@ -283,7 +287,7 @@ int wl1271_acx_service_period_timeout(struct wl1271 *wl) wl1271_debug(DEBUG_ACX, "acx service period timeout"); rx_timeout->role_id = wl->role_id; rx_timeout->role_id = wlvif->role_id; rx_timeout->ps_poll_timeout = cpu_to_le16(wl->conf.rx.ps_poll_timeout); rx_timeout->upsd_timeout = cpu_to_le16(wl->conf.rx.upsd_timeout); Loading @@ -300,7 +304,8 @@ int wl1271_acx_service_period_timeout(struct wl1271 *wl) return ret; } int wl1271_acx_rts_threshold(struct wl1271 *wl, u32 rts_threshold) int wl1271_acx_rts_threshold(struct wl1271 *wl, struct wl12xx_vif *wlvif, u32 rts_threshold) { struct acx_rts_threshold *rts; int ret; Loading @@ -320,7 +325,7 @@ int wl1271_acx_rts_threshold(struct wl1271 *wl, u32 rts_threshold) goto out; } rts->role_id = wl->role_id; rts->role_id = wlvif->role_id; rts->threshold = cpu_to_le16((u16)rts_threshold); ret = wl1271_cmd_configure(wl, DOT11_RTS_THRESHOLD, rts, sizeof(*rts)); Loading Loading @@ -363,7 +368,8 @@ int wl1271_acx_dco_itrim_params(struct wl1271 *wl) return ret; } int wl1271_acx_beacon_filter_opt(struct wl1271 *wl, bool enable_filter) int wl1271_acx_beacon_filter_opt(struct wl1271 *wl, struct wl12xx_vif *wlvif, bool enable_filter) { struct acx_beacon_filter_option *beacon_filter = NULL; int ret = 0; Loading @@ -380,7 +386,7 @@ int wl1271_acx_beacon_filter_opt(struct wl1271 *wl, bool enable_filter) goto out; } beacon_filter->role_id = wl->role_id; beacon_filter->role_id = wlvif->role_id; beacon_filter->enable = enable_filter; /* Loading @@ -401,7 +407,8 @@ int wl1271_acx_beacon_filter_opt(struct wl1271 *wl, bool enable_filter) return ret; } int wl1271_acx_beacon_filter_table(struct wl1271 *wl) int wl1271_acx_beacon_filter_table(struct wl1271 *wl, struct wl12xx_vif *wlvif) { struct acx_beacon_filter_ie_table *ie_table; int i, idx = 0; Loading @@ -417,7 +424,7 @@ int wl1271_acx_beacon_filter_table(struct wl1271 *wl) } /* configure default beacon pass-through rules */ ie_table->role_id = wl->role_id; ie_table->role_id = wlvif->role_id; ie_table->num_ie = 0; for (i = 0; i < wl->conf.conn.bcn_filt_ie_count; i++) { struct conf_bcn_filt_rule *r = &(wl->conf.conn.bcn_filt_ie[i]); Loading Loading @@ -458,7 +465,8 @@ int wl1271_acx_beacon_filter_table(struct wl1271 *wl) #define ACX_CONN_MONIT_DISABLE_VALUE 0xffffffff int wl1271_acx_conn_monit_params(struct wl1271 *wl, bool enable) int wl1271_acx_conn_monit_params(struct wl1271 *wl, struct wl12xx_vif *wlvif, bool enable) { struct acx_conn_monit_params *acx; u32 threshold = ACX_CONN_MONIT_DISABLE_VALUE; Loading @@ -479,7 +487,7 @@ int wl1271_acx_conn_monit_params(struct wl1271 *wl, bool enable) timeout = wl->conf.conn.bss_lose_timeout; } acx->role_id = wl->role_id; acx->role_id = wlvif->role_id; acx->synch_fail_thold = cpu_to_le32(threshold); acx->bss_lose_timeout = cpu_to_le32(timeout); Loading Loading @@ -582,7 +590,7 @@ int wl1271_acx_cca_threshold(struct wl1271 *wl) return ret; } int wl1271_acx_bcn_dtim_options(struct wl1271 *wl) int wl1271_acx_bcn_dtim_options(struct wl1271 *wl, struct wl12xx_vif *wlvif) { struct acx_beacon_broadcast *bb; int ret; Loading @@ -595,7 +603,7 @@ int wl1271_acx_bcn_dtim_options(struct wl1271 *wl) goto out; } bb->role_id = wl->role_id; bb->role_id = wlvif->role_id; bb->beacon_rx_timeout = cpu_to_le16(wl->conf.conn.beacon_rx_timeout); bb->broadcast_timeout = cpu_to_le16(wl->conf.conn.broadcast_timeout); bb->rx_broadcast_in_ps = wl->conf.conn.rx_broadcast_in_ps; Loading @@ -612,7 +620,7 @@ int wl1271_acx_bcn_dtim_options(struct wl1271 *wl) return ret; } int wl1271_acx_aid(struct wl1271 *wl, u16 aid) int wl1271_acx_aid(struct wl1271 *wl, struct wl12xx_vif *wlvif, u16 aid) { struct acx_aid *acx_aid; int ret; Loading @@ -625,7 +633,7 @@ int wl1271_acx_aid(struct wl1271 *wl, u16 aid) goto out; } acx_aid->role_id = wl->role_id; acx_aid->role_id = wlvif->role_id; acx_aid->aid = cpu_to_le16(aid); ret = wl1271_cmd_configure(wl, ACX_AID, acx_aid, sizeof(*acx_aid)); Loading Loading @@ -668,7 +676,8 @@ int wl1271_acx_event_mbox_mask(struct wl1271 *wl, u32 event_mask) return ret; } int wl1271_acx_set_preamble(struct wl1271 *wl, enum acx_preamble_type preamble) int wl1271_acx_set_preamble(struct wl1271 *wl, struct wl12xx_vif *wlvif, enum acx_preamble_type preamble) { struct acx_preamble *acx; int ret; Loading @@ -681,7 +690,7 @@ int wl1271_acx_set_preamble(struct wl1271 *wl, enum acx_preamble_type preamble) goto out; } acx->role_id = wl->role_id; acx->role_id = wlvif->role_id; acx->preamble = preamble; ret = wl1271_cmd_configure(wl, ACX_PREAMBLE_TYPE, acx, sizeof(*acx)); Loading @@ -695,7 +704,7 @@ int wl1271_acx_set_preamble(struct wl1271 *wl, enum acx_preamble_type preamble) return ret; } int wl1271_acx_cts_protect(struct wl1271 *wl, int wl1271_acx_cts_protect(struct wl1271 *wl, struct wl12xx_vif *wlvif, enum acx_ctsprotect_type ctsprotect) { struct acx_ctsprotect *acx; Loading @@ -709,7 +718,7 @@ int wl1271_acx_cts_protect(struct wl1271 *wl, goto out; } acx->role_id = wl->role_id; acx->role_id = wlvif->role_id; acx->ctsprotect = ctsprotect; ret = wl1271_cmd_configure(wl, ACX_CTS_PROTECTION, acx, sizeof(*acx)); Loading Loading @@ -739,7 +748,7 @@ int wl1271_acx_statistics(struct wl1271 *wl, struct acx_statistics *stats) return 0; } int wl1271_acx_sta_rate_policies(struct wl1271 *wl) int wl1271_acx_sta_rate_policies(struct wl1271 *wl, struct wl12xx_vif *wlvif) { struct acx_rate_policy *acx; struct conf_tx_rate_class *c = &wl->conf.tx.sta_rc_conf; Loading @@ -755,11 +764,11 @@ int wl1271_acx_sta_rate_policies(struct wl1271 *wl) } wl1271_debug(DEBUG_ACX, "basic_rate: 0x%x, full_rate: 0x%x", wl->basic_rate, wl->rate_set); wlvif->basic_rate, wlvif->rate_set); /* configure one basic rate class */ acx->rate_policy_idx = cpu_to_le32(ACX_TX_BASIC_RATE); acx->rate_policy.enabled_rates = cpu_to_le32(wl->basic_rate); acx->rate_policy_idx = cpu_to_le32(wlvif->sta.basic_rate_idx); acx->rate_policy.enabled_rates = cpu_to_le32(wlvif->basic_rate); acx->rate_policy.short_retry_limit = c->short_retry_limit; acx->rate_policy.long_retry_limit = c->long_retry_limit; acx->rate_policy.aflags = c->aflags; Loading @@ -771,8 +780,8 @@ int wl1271_acx_sta_rate_policies(struct wl1271 *wl) } /* configure one AP supported rate class */ acx->rate_policy_idx = cpu_to_le32(ACX_TX_AP_FULL_RATE); acx->rate_policy.enabled_rates = cpu_to_le32(wl->rate_set); acx->rate_policy_idx = cpu_to_le32(wlvif->sta.ap_rate_idx); acx->rate_policy.enabled_rates = cpu_to_le32(wlvif->rate_set); acx->rate_policy.short_retry_limit = c->short_retry_limit; acx->rate_policy.long_retry_limit = c->long_retry_limit; acx->rate_policy.aflags = c->aflags; Loading @@ -788,7 +797,7 @@ int wl1271_acx_sta_rate_policies(struct wl1271 *wl) * (p2p packets should always go out with OFDM rates, even * if we are currently connected to 11b AP) */ acx->rate_policy_idx = cpu_to_le32(ACX_TX_BASIC_RATE_P2P); acx->rate_policy_idx = cpu_to_le32(wlvif->sta.p2p_rate_idx); acx->rate_policy.enabled_rates = cpu_to_le32(CONF_TX_RATE_MASK_BASIC_P2P); acx->rate_policy.short_retry_limit = c->short_retry_limit; Loading Loading @@ -839,8 +848,8 @@ int wl1271_acx_ap_rate_policy(struct wl1271 *wl, struct conf_tx_rate_class *c, return ret; } int wl1271_acx_ac_cfg(struct wl1271 *wl, u8 ac, u8 cw_min, u16 cw_max, u8 aifsn, u16 txop) int wl1271_acx_ac_cfg(struct wl1271 *wl, struct wl12xx_vif *wlvif, u8 ac, u8 cw_min, u16 cw_max, u8 aifsn, u16 txop) { struct acx_ac_cfg *acx; int ret = 0; Loading @@ -855,7 +864,7 @@ int wl1271_acx_ac_cfg(struct wl1271 *wl, u8 ac, u8 cw_min, u16 cw_max, goto out; } acx->role_id = wl->role_id; acx->role_id = wlvif->role_id; acx->ac = ac; acx->cw_min = cw_min; acx->cw_max = cpu_to_le16(cw_max); Loading @@ -873,7 +882,8 @@ int wl1271_acx_ac_cfg(struct wl1271 *wl, u8 ac, u8 cw_min, u16 cw_max, return ret; } int wl1271_acx_tid_cfg(struct wl1271 *wl, u8 queue_id, u8 channel_type, int wl1271_acx_tid_cfg(struct wl1271 *wl, struct wl12xx_vif *wlvif, u8 queue_id, u8 channel_type, u8 tsid, u8 ps_scheme, u8 ack_policy, u32 apsd_conf0, u32 apsd_conf1) { Loading @@ -889,7 +899,7 @@ int wl1271_acx_tid_cfg(struct wl1271 *wl, u8 queue_id, u8 channel_type, goto out; } acx->role_id = wl->role_id; acx->role_id = wlvif->role_id; acx->queue_id = queue_id; acx->channel_type = channel_type; acx->tsid = tsid; Loading Loading @@ -1098,7 +1108,8 @@ int wl1271_acx_init_rx_interrupt(struct wl1271 *wl) return ret; } int wl1271_acx_bet_enable(struct wl1271 *wl, bool enable) int wl1271_acx_bet_enable(struct wl1271 *wl, struct wl12xx_vif *wlvif, bool enable) { struct wl1271_acx_bet_enable *acx = NULL; int ret = 0; Loading @@ -1114,7 +1125,7 @@ int wl1271_acx_bet_enable(struct wl1271 *wl, bool enable) goto out; } acx->role_id = wl->role_id; acx->role_id = wlvif->role_id; acx->enable = enable ? CONF_BET_MODE_ENABLE : CONF_BET_MODE_DISABLE; acx->max_consecutive = wl->conf.conn.bet_max_consecutive; Loading @@ -1129,7 +1140,8 @@ int wl1271_acx_bet_enable(struct wl1271 *wl, bool enable) return ret; } int wl1271_acx_arp_ip_filter(struct wl1271 *wl, u8 enable, __be32 address) int wl1271_acx_arp_ip_filter(struct wl1271 *wl, struct wl12xx_vif *wlvif, u8 enable, __be32 address) { struct wl1271_acx_arp_filter *acx; int ret; Loading @@ -1142,7 +1154,7 @@ int wl1271_acx_arp_ip_filter(struct wl1271 *wl, u8 enable, __be32 address) goto out; } acx->role_id = wl->role_id; acx->role_id = wlvif->role_id; acx->version = ACX_IPV4_VERSION; acx->enable = enable; Loading Loading @@ -1189,7 +1201,8 @@ int wl1271_acx_pm_config(struct wl1271 *wl) return ret; } int wl1271_acx_keep_alive_mode(struct wl1271 *wl, bool enable) int wl1271_acx_keep_alive_mode(struct wl1271 *wl, struct wl12xx_vif *wlvif, bool enable) { struct wl1271_acx_keep_alive_mode *acx = NULL; int ret = 0; Loading @@ -1202,7 +1215,7 @@ int wl1271_acx_keep_alive_mode(struct wl1271 *wl, bool enable) goto out; } acx->role_id = wl->role_id; acx->role_id = wlvif->role_id; acx->enabled = enable; ret = wl1271_cmd_configure(wl, ACX_KEEP_ALIVE_MODE, acx, sizeof(*acx)); Loading @@ -1216,7 +1229,8 @@ int wl1271_acx_keep_alive_mode(struct wl1271 *wl, bool enable) return ret; } int wl1271_acx_keep_alive_config(struct wl1271 *wl, u8 index, u8 tpl_valid) int wl1271_acx_keep_alive_config(struct wl1271 *wl, struct wl12xx_vif *wlvif, u8 index, u8 tpl_valid) { struct wl1271_acx_keep_alive_config *acx = NULL; int ret = 0; Loading @@ -1229,7 +1243,7 @@ int wl1271_acx_keep_alive_config(struct wl1271 *wl, u8 index, u8 tpl_valid) goto out; } acx->role_id = wl->role_id; acx->role_id = wlvif->role_id; acx->period = cpu_to_le32(wl->conf.conn.keep_alive_interval); acx->index = index; acx->tpl_validation = tpl_valid; Loading @@ -1247,8 +1261,8 @@ int wl1271_acx_keep_alive_config(struct wl1271 *wl, u8 index, u8 tpl_valid) return ret; } int wl1271_acx_rssi_snr_trigger(struct wl1271 *wl, bool enable, s16 thold, u8 hyst) int wl1271_acx_rssi_snr_trigger(struct wl1271 *wl, struct wl12xx_vif *wlvif, bool enable, s16 thold, u8 hyst) { struct wl1271_acx_rssi_snr_trigger *acx = NULL; int ret = 0; Loading @@ -1261,9 +1275,9 @@ int wl1271_acx_rssi_snr_trigger(struct wl1271 *wl, bool enable, goto out; } wl->last_rssi_event = -1; wlvif->last_rssi_event = -1; acx->role_id = wl->role_id; acx->role_id = wlvif->role_id; acx->pacing = cpu_to_le16(wl->conf.roam_trigger.trigger_pacing); acx->metric = WL1271_ACX_TRIG_METRIC_RSSI_BEACON; acx->type = WL1271_ACX_TRIG_TYPE_EDGE; Loading @@ -1288,7 +1302,8 @@ int wl1271_acx_rssi_snr_trigger(struct wl1271 *wl, bool enable, return ret; } int wl1271_acx_rssi_snr_avg_weights(struct wl1271 *wl) int wl1271_acx_rssi_snr_avg_weights(struct wl1271 *wl, struct wl12xx_vif *wlvif) { struct wl1271_acx_rssi_snr_avg_weights *acx = NULL; struct conf_roam_trigger_settings *c = &wl->conf.roam_trigger; Loading @@ -1302,7 +1317,7 @@ int wl1271_acx_rssi_snr_avg_weights(struct wl1271 *wl) goto out; } acx->role_id = wl->role_id; acx->role_id = wlvif->role_id; acx->rssi_beacon = c->avg_weight_rssi_beacon; acx->rssi_data = c->avg_weight_rssi_data; acx->snr_beacon = c->avg_weight_snr_beacon; Loading Loading @@ -1367,6 +1382,7 @@ int wl1271_acx_set_ht_capabilities(struct wl1271 *wl, } int wl1271_acx_set_ht_information(struct wl1271 *wl, struct wl12xx_vif *wlvif, u16 ht_operation_mode) { struct wl1271_acx_ht_information *acx; Loading @@ -1380,7 +1396,7 @@ int wl1271_acx_set_ht_information(struct wl1271 *wl, goto out; } acx->role_id = wl->role_id; acx->role_id = wlvif->role_id; acx->ht_protection = (u8)(ht_operation_mode & IEEE80211_HT_OP_MODE_PROTECTION); acx->rifs_mode = 0; Loading @@ -1402,7 +1418,8 @@ int wl1271_acx_set_ht_information(struct wl1271 *wl, } /* Configure BA session initiator/receiver parameters setting in the FW. */ int wl12xx_acx_set_ba_initiator_policy(struct wl1271 *wl) int wl12xx_acx_set_ba_initiator_policy(struct wl1271 *wl, struct wl12xx_vif *wlvif) { struct wl1271_acx_ba_initiator_policy *acx; int ret; Loading @@ -1416,7 +1433,7 @@ int wl12xx_acx_set_ba_initiator_policy(struct wl1271 *wl) } /* set for the current role */ acx->role_id = wl->role_id; acx->role_id = wlvif->role_id; acx->tid_bitmap = wl->conf.ht.tx_ba_tid_bitmap; acx->win_size = wl->conf.ht.tx_ba_win_size; acx->inactivity_timeout = wl->conf.ht.inactivity_timeout; Loading Loading @@ -1494,7 +1511,8 @@ int wl1271_acx_tsf_info(struct wl1271 *wl, u64 *mactime) return ret; } int wl1271_acx_ps_rx_streaming(struct wl1271 *wl, bool enable) int wl1271_acx_ps_rx_streaming(struct wl1271 *wl, struct wl12xx_vif *wlvif, bool enable) { struct wl1271_acx_ps_rx_streaming *rx_streaming; u32 conf_queues, enable_queues; Loading Loading @@ -1523,7 +1541,7 @@ int wl1271_acx_ps_rx_streaming(struct wl1271 *wl, bool enable) if (!(conf_queues & BIT(i))) continue; rx_streaming->role_id = wl->role_id; rx_streaming->role_id = wlvif->role_id; rx_streaming->tid = i; rx_streaming->enable = enable_queues & BIT(i); rx_streaming->period = wl->conf.rx_streaming.interval; Loading @@ -1542,7 +1560,7 @@ int wl1271_acx_ps_rx_streaming(struct wl1271 *wl, bool enable) return ret; } int wl1271_acx_ap_max_tx_retry(struct wl1271 *wl) int wl1271_acx_ap_max_tx_retry(struct wl1271 *wl, struct wl12xx_vif *wlvif) { struct wl1271_acx_ap_max_tx_retry *acx = NULL; int ret; Loading @@ -1553,7 +1571,7 @@ int wl1271_acx_ap_max_tx_retry(struct wl1271 *wl) if (!acx) return -ENOMEM; acx->role_id = wl->role_id; acx->role_id = wlvif->role_id; acx->max_tx_retry = cpu_to_le16(wl->conf.tx.max_tx_retries); ret = wl1271_cmd_configure(wl, ACX_MAX_TX_FAILURE, acx, sizeof(*acx)); Loading @@ -1567,7 +1585,7 @@ int wl1271_acx_ap_max_tx_retry(struct wl1271 *wl) return ret; } int wl1271_acx_config_ps(struct wl1271 *wl) int wl12xx_acx_config_ps(struct wl1271 *wl, struct wl12xx_vif *wlvif) { struct wl1271_acx_config_ps *config_ps; int ret; Loading @@ -1582,7 +1600,7 @@ int wl1271_acx_config_ps(struct wl1271 *wl) config_ps->exit_retries = wl->conf.conn.psm_exit_retries; config_ps->enter_retries = wl->conf.conn.psm_entry_retries; config_ps->null_data_rate = cpu_to_le32(wl->basic_rate); config_ps->null_data_rate = cpu_to_le32(wlvif->basic_rate); ret = wl1271_cmd_configure(wl, ACX_CONFIG_PS, config_ps, sizeof(*config_ps)); Loading drivers/net/wireless/wl12xx/acx.h +48 −35 Original line number Diff line number Diff line Loading @@ -654,11 +654,6 @@ struct acx_rate_class { u8 reserved; }; #define ACX_TX_BASIC_RATE 0 #define ACX_TX_AP_FULL_RATE 1 #define ACX_TX_BASIC_RATE_P2P 2 #define ACX_TX_AP_MODE_MGMT_RATE 4 #define ACX_TX_AP_MODE_BCST_RATE 5 struct acx_rate_policy { struct acx_header header; Loading Loading @@ -1234,39 +1229,49 @@ enum { }; int wl1271_acx_wake_up_conditions(struct wl1271 *wl); int wl1271_acx_wake_up_conditions(struct wl1271 *wl, struct wl12xx_vif *wlvif); int wl1271_acx_sleep_auth(struct wl1271 *wl, u8 sleep_auth); int wl1271_acx_tx_power(struct wl1271 *wl, int power); int wl1271_acx_feature_cfg(struct wl1271 *wl); int wl1271_acx_tx_power(struct wl1271 *wl, struct wl12xx_vif *wlvif, int power); int wl1271_acx_feature_cfg(struct wl1271 *wl, struct wl12xx_vif *wlvif); int wl1271_acx_mem_map(struct wl1271 *wl, struct acx_header *mem_map, size_t len); int wl1271_acx_rx_msdu_life_time(struct wl1271 *wl); int wl1271_acx_pd_threshold(struct wl1271 *wl); int wl1271_acx_slot(struct wl1271 *wl, enum acx_slot_type slot_time); int wl1271_acx_group_address_tbl(struct wl1271 *wl, bool enable, void *mc_list, u32 mc_list_len); int wl1271_acx_service_period_timeout(struct wl1271 *wl); int wl1271_acx_rts_threshold(struct wl1271 *wl, u32 rts_threshold); int wl1271_acx_slot(struct wl1271 *wl, struct wl12xx_vif *wlvif, enum acx_slot_type slot_time); int wl1271_acx_group_address_tbl(struct wl1271 *wl, struct wl12xx_vif *wlvif, bool enable, void *mc_list, u32 mc_list_len); int wl1271_acx_service_period_timeout(struct wl1271 *wl, struct wl12xx_vif *wlvif); int wl1271_acx_rts_threshold(struct wl1271 *wl, struct wl12xx_vif *wlvif, u32 rts_threshold); int wl1271_acx_dco_itrim_params(struct wl1271 *wl); int wl1271_acx_beacon_filter_opt(struct wl1271 *wl, bool enable_filter); int wl1271_acx_beacon_filter_table(struct wl1271 *wl); int wl1271_acx_conn_monit_params(struct wl1271 *wl, bool enable); int wl1271_acx_beacon_filter_opt(struct wl1271 *wl, struct wl12xx_vif *wlvif, bool enable_filter); int wl1271_acx_beacon_filter_table(struct wl1271 *wl, struct wl12xx_vif *wlvif); int wl1271_acx_conn_monit_params(struct wl1271 *wl, struct wl12xx_vif *wlvif, bool enable); int wl1271_acx_sg_enable(struct wl1271 *wl, bool enable); int wl12xx_acx_sg_cfg(struct wl1271 *wl); int wl1271_acx_cca_threshold(struct wl1271 *wl); int wl1271_acx_bcn_dtim_options(struct wl1271 *wl); int wl1271_acx_aid(struct wl1271 *wl, u16 aid); int wl1271_acx_bcn_dtim_options(struct wl1271 *wl, struct wl12xx_vif *wlvif); int wl1271_acx_aid(struct wl1271 *wl, struct wl12xx_vif *wlvif, u16 aid); int wl1271_acx_event_mbox_mask(struct wl1271 *wl, u32 event_mask); int wl1271_acx_set_preamble(struct wl1271 *wl, enum acx_preamble_type preamble); int wl1271_acx_cts_protect(struct wl1271 *wl, int wl1271_acx_set_preamble(struct wl1271 *wl, struct wl12xx_vif *wlvif, enum acx_preamble_type preamble); int wl1271_acx_cts_protect(struct wl1271 *wl, struct wl12xx_vif *wlvif, enum acx_ctsprotect_type ctsprotect); int wl1271_acx_statistics(struct wl1271 *wl, struct acx_statistics *stats); int wl1271_acx_sta_rate_policies(struct wl1271 *wl); int wl1271_acx_sta_rate_policies(struct wl1271 *wl, struct wl12xx_vif *wlvif); int wl1271_acx_ap_rate_policy(struct wl1271 *wl, struct conf_tx_rate_class *c, u8 idx); int wl1271_acx_ac_cfg(struct wl1271 *wl, u8 ac, u8 cw_min, u16 cw_max, u8 aifsn, u16 txop); int wl1271_acx_tid_cfg(struct wl1271 *wl, u8 queue_id, u8 channel_type, int wl1271_acx_ac_cfg(struct wl1271 *wl, struct wl12xx_vif *wlvif, u8 ac, u8 cw_min, u16 cw_max, u8 aifsn, u16 txop); int wl1271_acx_tid_cfg(struct wl1271 *wl, struct wl12xx_vif *wlvif, u8 queue_id, u8 channel_type, u8 tsid, u8 ps_scheme, u8 ack_policy, u32 apsd_conf0, u32 apsd_conf1); int wl1271_acx_frag_threshold(struct wl1271 *wl, u32 frag_threshold); Loading @@ -1276,26 +1281,34 @@ int wl1271_acx_init_mem_config(struct wl1271 *wl); int wl1271_acx_host_if_cfg_bitmap(struct wl1271 *wl, u32 host_cfg_bitmap); int wl1271_acx_init_rx_interrupt(struct wl1271 *wl); int wl1271_acx_smart_reflex(struct wl1271 *wl); int wl1271_acx_bet_enable(struct wl1271 *wl, bool enable); int wl1271_acx_arp_ip_filter(struct wl1271 *wl, u8 enable, __be32 address); int wl1271_acx_bet_enable(struct wl1271 *wl, struct wl12xx_vif *wlvif, bool enable); int wl1271_acx_arp_ip_filter(struct wl1271 *wl, struct wl12xx_vif *wlvif, u8 enable, __be32 address); int wl1271_acx_pm_config(struct wl1271 *wl); int wl1271_acx_keep_alive_mode(struct wl1271 *wl, bool enable); int wl1271_acx_keep_alive_config(struct wl1271 *wl, u8 index, u8 tpl_valid); int wl1271_acx_rssi_snr_trigger(struct wl1271 *wl, bool enable, s16 thold, u8 hyst); int wl1271_acx_rssi_snr_avg_weights(struct wl1271 *wl); int wl1271_acx_keep_alive_mode(struct wl1271 *wl, struct wl12xx_vif *vif, bool enable); int wl1271_acx_keep_alive_config(struct wl1271 *wl, struct wl12xx_vif *wlvif, u8 index, u8 tpl_valid); int wl1271_acx_rssi_snr_trigger(struct wl1271 *wl, struct wl12xx_vif *wlvif, bool enable, s16 thold, u8 hyst); int wl1271_acx_rssi_snr_avg_weights(struct wl1271 *wl, struct wl12xx_vif *wlvif); int wl1271_acx_set_ht_capabilities(struct wl1271 *wl, struct ieee80211_sta_ht_cap *ht_cap, bool allow_ht_operation, u8 hlid); int wl1271_acx_set_ht_information(struct wl1271 *wl, struct wl12xx_vif *wlvif, u16 ht_operation_mode); int wl12xx_acx_set_ba_initiator_policy(struct wl1271 *wl); int wl12xx_acx_set_ba_initiator_policy(struct wl1271 *wl, struct wl12xx_vif *wlvif); int wl12xx_acx_set_ba_receiver_session(struct wl1271 *wl, u8 tid_index, u16 ssn, bool enable, u8 peer_hlid); int wl1271_acx_tsf_info(struct wl1271 *wl, u64 *mactime); int wl1271_acx_ps_rx_streaming(struct wl1271 *wl, bool enable); int wl1271_acx_ap_max_tx_retry(struct wl1271 *wl); int wl1271_acx_config_ps(struct wl1271 *wl); int wl1271_acx_ps_rx_streaming(struct wl1271 *wl, struct wl12xx_vif *wlvif, bool enable); int wl1271_acx_ap_max_tx_retry(struct wl1271 *wl, struct wl12xx_vif *wlvif); int wl12xx_acx_config_ps(struct wl1271 *wl, struct wl12xx_vif *wlvif); int wl1271_acx_set_inconnection_sta(struct wl1271 *wl, u8 *addr); int wl1271_acx_fm_coex(struct wl1271 *wl); int wl12xx_acx_set_rate_mgmt_params(struct wl1271 *wl); Loading drivers/net/wireless/wl12xx/boot.c +15 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ #include <linux/wl12xx.h> #include <linux/export.h> #include "debug.h" #include "acx.h" #include "reg.h" #include "boot.h" Loading Loading @@ -347,6 +348,9 @@ static int wl1271_boot_upload_nvs(struct wl1271 *wl) nvs_ptr += 3; for (i = 0; i < burst_len; i++) { if (nvs_ptr + 3 >= (u8 *) wl->nvs + nvs_len) goto out_badnvs; val = (nvs_ptr[0] | (nvs_ptr[1] << 8) | (nvs_ptr[2] << 16) | (nvs_ptr[3] << 24)); Loading @@ -358,6 +362,9 @@ static int wl1271_boot_upload_nvs(struct wl1271 *wl) nvs_ptr += 4; dest_addr += 4; } if (nvs_ptr >= (u8 *) wl->nvs + nvs_len) goto out_badnvs; } /* Loading @@ -369,6 +376,10 @@ static int wl1271_boot_upload_nvs(struct wl1271 *wl) */ nvs_ptr = (u8 *)wl->nvs + ALIGN(nvs_ptr - (u8 *)wl->nvs + 7, 4); if (nvs_ptr >= (u8 *) wl->nvs + nvs_len) goto out_badnvs; nvs_len -= nvs_ptr - (u8 *)wl->nvs; /* Now we must set the partition correctly */ Loading @@ -384,6 +395,10 @@ static int wl1271_boot_upload_nvs(struct wl1271 *wl) kfree(nvs_aligned); return 0; out_badnvs: wl1271_error("nvs data is malformed"); return -EILSEQ; } static void wl1271_boot_enable_interrupts(struct wl1271 *wl) Loading Loading
drivers/net/wireless/wl12xx/Kconfig +0 −10 Original line number Diff line number Diff line Loading @@ -42,16 +42,6 @@ config WL12XX_SDIO If you choose to build a module, it'll be called wl12xx_sdio. Say N if unsure. config WL12XX_SDIO_TEST tristate "TI wl12xx SDIO testing support" depends on WL12XX && MMC && WL12XX_SDIO default n ---help--- This module adds support for the SDIO bus testing with the TI wl12xx chipsets. You probably don't want this unless you are testing a new hardware platform. Select this if you want to test the SDIO bus which is connected to the wl12xx chip. config WL12XX_PLATFORM_DATA bool depends on WL12XX_SDIO != n || WL1251_SDIO != n Loading
drivers/net/wireless/wl12xx/Makefile +0 −3 Original line number Diff line number Diff line Loading @@ -3,14 +3,11 @@ wl12xx-objs = main.o cmd.o io.o event.o tx.o rx.o ps.o acx.o \ wl12xx_spi-objs = spi.o wl12xx_sdio-objs = sdio.o wl12xx_sdio_test-objs = sdio_test.o wl12xx-$(CONFIG_NL80211_TESTMODE) += testmode.o obj-$(CONFIG_WL12XX) += wl12xx.o obj-$(CONFIG_WL12XX_SPI) += wl12xx_spi.o obj-$(CONFIG_WL12XX_SDIO) += wl12xx_sdio.o obj-$(CONFIG_WL12XX_SDIO_TEST) += wl12xx_sdio_test.o # small builtin driver bit obj-$(CONFIG_WL12XX_PLATFORM_DATA) += wl12xx_platform_data.o
drivers/net/wireless/wl12xx/acx.c +82 −64 Original line number Diff line number Diff line Loading @@ -29,11 +29,12 @@ #include <linux/slab.h> #include "wl12xx.h" #include "debug.h" #include "wl12xx_80211.h" #include "reg.h" #include "ps.h" int wl1271_acx_wake_up_conditions(struct wl1271 *wl) int wl1271_acx_wake_up_conditions(struct wl1271 *wl, struct wl12xx_vif *wlvif) { struct acx_wake_up_condition *wake_up; int ret; Loading @@ -46,7 +47,7 @@ int wl1271_acx_wake_up_conditions(struct wl1271 *wl) goto out; } wake_up->role_id = wl->role_id; wake_up->role_id = wlvif->role_id; wake_up->wake_up_event = wl->conf.conn.wake_up_event; wake_up->listen_interval = wl->conf.conn.listen_interval; Loading Loading @@ -84,7 +85,8 @@ int wl1271_acx_sleep_auth(struct wl1271 *wl, u8 sleep_auth) return ret; } int wl1271_acx_tx_power(struct wl1271 *wl, int power) int wl1271_acx_tx_power(struct wl1271 *wl, struct wl12xx_vif *wlvif, int power) { struct acx_current_tx_power *acx; int ret; Loading @@ -100,7 +102,7 @@ int wl1271_acx_tx_power(struct wl1271 *wl, int power) goto out; } acx->role_id = wl->role_id; acx->role_id = wlvif->role_id; acx->current_tx_power = power * 10; ret = wl1271_cmd_configure(wl, DOT11_CUR_TX_PWR, acx, sizeof(*acx)); Loading @@ -114,7 +116,7 @@ int wl1271_acx_tx_power(struct wl1271 *wl, int power) return ret; } int wl1271_acx_feature_cfg(struct wl1271 *wl) int wl1271_acx_feature_cfg(struct wl1271 *wl, struct wl12xx_vif *wlvif) { struct acx_feature_config *feature; int ret; Loading @@ -128,7 +130,7 @@ int wl1271_acx_feature_cfg(struct wl1271 *wl) } /* DF_ENCRYPTION_DISABLE and DF_SNIFF_MODE_ENABLE are disabled */ feature->role_id = wl->role_id; feature->role_id = wlvif->role_id; feature->data_flow_options = 0; feature->options = 0; Loading Loading @@ -210,7 +212,8 @@ int wl1271_acx_pd_threshold(struct wl1271 *wl) return ret; } int wl1271_acx_slot(struct wl1271 *wl, enum acx_slot_type slot_time) int wl1271_acx_slot(struct wl1271 *wl, struct wl12xx_vif *wlvif, enum acx_slot_type slot_time) { struct acx_slot *slot; int ret; Loading @@ -223,7 +226,7 @@ int wl1271_acx_slot(struct wl1271 *wl, enum acx_slot_type slot_time) goto out; } slot->role_id = wl->role_id; slot->role_id = wlvif->role_id; slot->wone_index = STATION_WONE_INDEX; slot->slot_time = slot_time; Loading @@ -238,8 +241,8 @@ int wl1271_acx_slot(struct wl1271 *wl, enum acx_slot_type slot_time) return ret; } int wl1271_acx_group_address_tbl(struct wl1271 *wl, bool enable, void *mc_list, u32 mc_list_len) int wl1271_acx_group_address_tbl(struct wl1271 *wl, struct wl12xx_vif *wlvif, bool enable, void *mc_list, u32 mc_list_len) { struct acx_dot11_grp_addr_tbl *acx; int ret; Loading @@ -253,7 +256,7 @@ int wl1271_acx_group_address_tbl(struct wl1271 *wl, bool enable, } /* MAC filtering */ acx->role_id = wl->role_id; acx->role_id = wlvif->role_id; acx->enabled = enable; acx->num_groups = mc_list_len; memcpy(acx->mac_table, mc_list, mc_list_len * ETH_ALEN); Loading @@ -270,7 +273,8 @@ int wl1271_acx_group_address_tbl(struct wl1271 *wl, bool enable, return ret; } int wl1271_acx_service_period_timeout(struct wl1271 *wl) int wl1271_acx_service_period_timeout(struct wl1271 *wl, struct wl12xx_vif *wlvif) { struct acx_rx_timeout *rx_timeout; int ret; Loading @@ -283,7 +287,7 @@ int wl1271_acx_service_period_timeout(struct wl1271 *wl) wl1271_debug(DEBUG_ACX, "acx service period timeout"); rx_timeout->role_id = wl->role_id; rx_timeout->role_id = wlvif->role_id; rx_timeout->ps_poll_timeout = cpu_to_le16(wl->conf.rx.ps_poll_timeout); rx_timeout->upsd_timeout = cpu_to_le16(wl->conf.rx.upsd_timeout); Loading @@ -300,7 +304,8 @@ int wl1271_acx_service_period_timeout(struct wl1271 *wl) return ret; } int wl1271_acx_rts_threshold(struct wl1271 *wl, u32 rts_threshold) int wl1271_acx_rts_threshold(struct wl1271 *wl, struct wl12xx_vif *wlvif, u32 rts_threshold) { struct acx_rts_threshold *rts; int ret; Loading @@ -320,7 +325,7 @@ int wl1271_acx_rts_threshold(struct wl1271 *wl, u32 rts_threshold) goto out; } rts->role_id = wl->role_id; rts->role_id = wlvif->role_id; rts->threshold = cpu_to_le16((u16)rts_threshold); ret = wl1271_cmd_configure(wl, DOT11_RTS_THRESHOLD, rts, sizeof(*rts)); Loading Loading @@ -363,7 +368,8 @@ int wl1271_acx_dco_itrim_params(struct wl1271 *wl) return ret; } int wl1271_acx_beacon_filter_opt(struct wl1271 *wl, bool enable_filter) int wl1271_acx_beacon_filter_opt(struct wl1271 *wl, struct wl12xx_vif *wlvif, bool enable_filter) { struct acx_beacon_filter_option *beacon_filter = NULL; int ret = 0; Loading @@ -380,7 +386,7 @@ int wl1271_acx_beacon_filter_opt(struct wl1271 *wl, bool enable_filter) goto out; } beacon_filter->role_id = wl->role_id; beacon_filter->role_id = wlvif->role_id; beacon_filter->enable = enable_filter; /* Loading @@ -401,7 +407,8 @@ int wl1271_acx_beacon_filter_opt(struct wl1271 *wl, bool enable_filter) return ret; } int wl1271_acx_beacon_filter_table(struct wl1271 *wl) int wl1271_acx_beacon_filter_table(struct wl1271 *wl, struct wl12xx_vif *wlvif) { struct acx_beacon_filter_ie_table *ie_table; int i, idx = 0; Loading @@ -417,7 +424,7 @@ int wl1271_acx_beacon_filter_table(struct wl1271 *wl) } /* configure default beacon pass-through rules */ ie_table->role_id = wl->role_id; ie_table->role_id = wlvif->role_id; ie_table->num_ie = 0; for (i = 0; i < wl->conf.conn.bcn_filt_ie_count; i++) { struct conf_bcn_filt_rule *r = &(wl->conf.conn.bcn_filt_ie[i]); Loading Loading @@ -458,7 +465,8 @@ int wl1271_acx_beacon_filter_table(struct wl1271 *wl) #define ACX_CONN_MONIT_DISABLE_VALUE 0xffffffff int wl1271_acx_conn_monit_params(struct wl1271 *wl, bool enable) int wl1271_acx_conn_monit_params(struct wl1271 *wl, struct wl12xx_vif *wlvif, bool enable) { struct acx_conn_monit_params *acx; u32 threshold = ACX_CONN_MONIT_DISABLE_VALUE; Loading @@ -479,7 +487,7 @@ int wl1271_acx_conn_monit_params(struct wl1271 *wl, bool enable) timeout = wl->conf.conn.bss_lose_timeout; } acx->role_id = wl->role_id; acx->role_id = wlvif->role_id; acx->synch_fail_thold = cpu_to_le32(threshold); acx->bss_lose_timeout = cpu_to_le32(timeout); Loading Loading @@ -582,7 +590,7 @@ int wl1271_acx_cca_threshold(struct wl1271 *wl) return ret; } int wl1271_acx_bcn_dtim_options(struct wl1271 *wl) int wl1271_acx_bcn_dtim_options(struct wl1271 *wl, struct wl12xx_vif *wlvif) { struct acx_beacon_broadcast *bb; int ret; Loading @@ -595,7 +603,7 @@ int wl1271_acx_bcn_dtim_options(struct wl1271 *wl) goto out; } bb->role_id = wl->role_id; bb->role_id = wlvif->role_id; bb->beacon_rx_timeout = cpu_to_le16(wl->conf.conn.beacon_rx_timeout); bb->broadcast_timeout = cpu_to_le16(wl->conf.conn.broadcast_timeout); bb->rx_broadcast_in_ps = wl->conf.conn.rx_broadcast_in_ps; Loading @@ -612,7 +620,7 @@ int wl1271_acx_bcn_dtim_options(struct wl1271 *wl) return ret; } int wl1271_acx_aid(struct wl1271 *wl, u16 aid) int wl1271_acx_aid(struct wl1271 *wl, struct wl12xx_vif *wlvif, u16 aid) { struct acx_aid *acx_aid; int ret; Loading @@ -625,7 +633,7 @@ int wl1271_acx_aid(struct wl1271 *wl, u16 aid) goto out; } acx_aid->role_id = wl->role_id; acx_aid->role_id = wlvif->role_id; acx_aid->aid = cpu_to_le16(aid); ret = wl1271_cmd_configure(wl, ACX_AID, acx_aid, sizeof(*acx_aid)); Loading Loading @@ -668,7 +676,8 @@ int wl1271_acx_event_mbox_mask(struct wl1271 *wl, u32 event_mask) return ret; } int wl1271_acx_set_preamble(struct wl1271 *wl, enum acx_preamble_type preamble) int wl1271_acx_set_preamble(struct wl1271 *wl, struct wl12xx_vif *wlvif, enum acx_preamble_type preamble) { struct acx_preamble *acx; int ret; Loading @@ -681,7 +690,7 @@ int wl1271_acx_set_preamble(struct wl1271 *wl, enum acx_preamble_type preamble) goto out; } acx->role_id = wl->role_id; acx->role_id = wlvif->role_id; acx->preamble = preamble; ret = wl1271_cmd_configure(wl, ACX_PREAMBLE_TYPE, acx, sizeof(*acx)); Loading @@ -695,7 +704,7 @@ int wl1271_acx_set_preamble(struct wl1271 *wl, enum acx_preamble_type preamble) return ret; } int wl1271_acx_cts_protect(struct wl1271 *wl, int wl1271_acx_cts_protect(struct wl1271 *wl, struct wl12xx_vif *wlvif, enum acx_ctsprotect_type ctsprotect) { struct acx_ctsprotect *acx; Loading @@ -709,7 +718,7 @@ int wl1271_acx_cts_protect(struct wl1271 *wl, goto out; } acx->role_id = wl->role_id; acx->role_id = wlvif->role_id; acx->ctsprotect = ctsprotect; ret = wl1271_cmd_configure(wl, ACX_CTS_PROTECTION, acx, sizeof(*acx)); Loading Loading @@ -739,7 +748,7 @@ int wl1271_acx_statistics(struct wl1271 *wl, struct acx_statistics *stats) return 0; } int wl1271_acx_sta_rate_policies(struct wl1271 *wl) int wl1271_acx_sta_rate_policies(struct wl1271 *wl, struct wl12xx_vif *wlvif) { struct acx_rate_policy *acx; struct conf_tx_rate_class *c = &wl->conf.tx.sta_rc_conf; Loading @@ -755,11 +764,11 @@ int wl1271_acx_sta_rate_policies(struct wl1271 *wl) } wl1271_debug(DEBUG_ACX, "basic_rate: 0x%x, full_rate: 0x%x", wl->basic_rate, wl->rate_set); wlvif->basic_rate, wlvif->rate_set); /* configure one basic rate class */ acx->rate_policy_idx = cpu_to_le32(ACX_TX_BASIC_RATE); acx->rate_policy.enabled_rates = cpu_to_le32(wl->basic_rate); acx->rate_policy_idx = cpu_to_le32(wlvif->sta.basic_rate_idx); acx->rate_policy.enabled_rates = cpu_to_le32(wlvif->basic_rate); acx->rate_policy.short_retry_limit = c->short_retry_limit; acx->rate_policy.long_retry_limit = c->long_retry_limit; acx->rate_policy.aflags = c->aflags; Loading @@ -771,8 +780,8 @@ int wl1271_acx_sta_rate_policies(struct wl1271 *wl) } /* configure one AP supported rate class */ acx->rate_policy_idx = cpu_to_le32(ACX_TX_AP_FULL_RATE); acx->rate_policy.enabled_rates = cpu_to_le32(wl->rate_set); acx->rate_policy_idx = cpu_to_le32(wlvif->sta.ap_rate_idx); acx->rate_policy.enabled_rates = cpu_to_le32(wlvif->rate_set); acx->rate_policy.short_retry_limit = c->short_retry_limit; acx->rate_policy.long_retry_limit = c->long_retry_limit; acx->rate_policy.aflags = c->aflags; Loading @@ -788,7 +797,7 @@ int wl1271_acx_sta_rate_policies(struct wl1271 *wl) * (p2p packets should always go out with OFDM rates, even * if we are currently connected to 11b AP) */ acx->rate_policy_idx = cpu_to_le32(ACX_TX_BASIC_RATE_P2P); acx->rate_policy_idx = cpu_to_le32(wlvif->sta.p2p_rate_idx); acx->rate_policy.enabled_rates = cpu_to_le32(CONF_TX_RATE_MASK_BASIC_P2P); acx->rate_policy.short_retry_limit = c->short_retry_limit; Loading Loading @@ -839,8 +848,8 @@ int wl1271_acx_ap_rate_policy(struct wl1271 *wl, struct conf_tx_rate_class *c, return ret; } int wl1271_acx_ac_cfg(struct wl1271 *wl, u8 ac, u8 cw_min, u16 cw_max, u8 aifsn, u16 txop) int wl1271_acx_ac_cfg(struct wl1271 *wl, struct wl12xx_vif *wlvif, u8 ac, u8 cw_min, u16 cw_max, u8 aifsn, u16 txop) { struct acx_ac_cfg *acx; int ret = 0; Loading @@ -855,7 +864,7 @@ int wl1271_acx_ac_cfg(struct wl1271 *wl, u8 ac, u8 cw_min, u16 cw_max, goto out; } acx->role_id = wl->role_id; acx->role_id = wlvif->role_id; acx->ac = ac; acx->cw_min = cw_min; acx->cw_max = cpu_to_le16(cw_max); Loading @@ -873,7 +882,8 @@ int wl1271_acx_ac_cfg(struct wl1271 *wl, u8 ac, u8 cw_min, u16 cw_max, return ret; } int wl1271_acx_tid_cfg(struct wl1271 *wl, u8 queue_id, u8 channel_type, int wl1271_acx_tid_cfg(struct wl1271 *wl, struct wl12xx_vif *wlvif, u8 queue_id, u8 channel_type, u8 tsid, u8 ps_scheme, u8 ack_policy, u32 apsd_conf0, u32 apsd_conf1) { Loading @@ -889,7 +899,7 @@ int wl1271_acx_tid_cfg(struct wl1271 *wl, u8 queue_id, u8 channel_type, goto out; } acx->role_id = wl->role_id; acx->role_id = wlvif->role_id; acx->queue_id = queue_id; acx->channel_type = channel_type; acx->tsid = tsid; Loading Loading @@ -1098,7 +1108,8 @@ int wl1271_acx_init_rx_interrupt(struct wl1271 *wl) return ret; } int wl1271_acx_bet_enable(struct wl1271 *wl, bool enable) int wl1271_acx_bet_enable(struct wl1271 *wl, struct wl12xx_vif *wlvif, bool enable) { struct wl1271_acx_bet_enable *acx = NULL; int ret = 0; Loading @@ -1114,7 +1125,7 @@ int wl1271_acx_bet_enable(struct wl1271 *wl, bool enable) goto out; } acx->role_id = wl->role_id; acx->role_id = wlvif->role_id; acx->enable = enable ? CONF_BET_MODE_ENABLE : CONF_BET_MODE_DISABLE; acx->max_consecutive = wl->conf.conn.bet_max_consecutive; Loading @@ -1129,7 +1140,8 @@ int wl1271_acx_bet_enable(struct wl1271 *wl, bool enable) return ret; } int wl1271_acx_arp_ip_filter(struct wl1271 *wl, u8 enable, __be32 address) int wl1271_acx_arp_ip_filter(struct wl1271 *wl, struct wl12xx_vif *wlvif, u8 enable, __be32 address) { struct wl1271_acx_arp_filter *acx; int ret; Loading @@ -1142,7 +1154,7 @@ int wl1271_acx_arp_ip_filter(struct wl1271 *wl, u8 enable, __be32 address) goto out; } acx->role_id = wl->role_id; acx->role_id = wlvif->role_id; acx->version = ACX_IPV4_VERSION; acx->enable = enable; Loading Loading @@ -1189,7 +1201,8 @@ int wl1271_acx_pm_config(struct wl1271 *wl) return ret; } int wl1271_acx_keep_alive_mode(struct wl1271 *wl, bool enable) int wl1271_acx_keep_alive_mode(struct wl1271 *wl, struct wl12xx_vif *wlvif, bool enable) { struct wl1271_acx_keep_alive_mode *acx = NULL; int ret = 0; Loading @@ -1202,7 +1215,7 @@ int wl1271_acx_keep_alive_mode(struct wl1271 *wl, bool enable) goto out; } acx->role_id = wl->role_id; acx->role_id = wlvif->role_id; acx->enabled = enable; ret = wl1271_cmd_configure(wl, ACX_KEEP_ALIVE_MODE, acx, sizeof(*acx)); Loading @@ -1216,7 +1229,8 @@ int wl1271_acx_keep_alive_mode(struct wl1271 *wl, bool enable) return ret; } int wl1271_acx_keep_alive_config(struct wl1271 *wl, u8 index, u8 tpl_valid) int wl1271_acx_keep_alive_config(struct wl1271 *wl, struct wl12xx_vif *wlvif, u8 index, u8 tpl_valid) { struct wl1271_acx_keep_alive_config *acx = NULL; int ret = 0; Loading @@ -1229,7 +1243,7 @@ int wl1271_acx_keep_alive_config(struct wl1271 *wl, u8 index, u8 tpl_valid) goto out; } acx->role_id = wl->role_id; acx->role_id = wlvif->role_id; acx->period = cpu_to_le32(wl->conf.conn.keep_alive_interval); acx->index = index; acx->tpl_validation = tpl_valid; Loading @@ -1247,8 +1261,8 @@ int wl1271_acx_keep_alive_config(struct wl1271 *wl, u8 index, u8 tpl_valid) return ret; } int wl1271_acx_rssi_snr_trigger(struct wl1271 *wl, bool enable, s16 thold, u8 hyst) int wl1271_acx_rssi_snr_trigger(struct wl1271 *wl, struct wl12xx_vif *wlvif, bool enable, s16 thold, u8 hyst) { struct wl1271_acx_rssi_snr_trigger *acx = NULL; int ret = 0; Loading @@ -1261,9 +1275,9 @@ int wl1271_acx_rssi_snr_trigger(struct wl1271 *wl, bool enable, goto out; } wl->last_rssi_event = -1; wlvif->last_rssi_event = -1; acx->role_id = wl->role_id; acx->role_id = wlvif->role_id; acx->pacing = cpu_to_le16(wl->conf.roam_trigger.trigger_pacing); acx->metric = WL1271_ACX_TRIG_METRIC_RSSI_BEACON; acx->type = WL1271_ACX_TRIG_TYPE_EDGE; Loading @@ -1288,7 +1302,8 @@ int wl1271_acx_rssi_snr_trigger(struct wl1271 *wl, bool enable, return ret; } int wl1271_acx_rssi_snr_avg_weights(struct wl1271 *wl) int wl1271_acx_rssi_snr_avg_weights(struct wl1271 *wl, struct wl12xx_vif *wlvif) { struct wl1271_acx_rssi_snr_avg_weights *acx = NULL; struct conf_roam_trigger_settings *c = &wl->conf.roam_trigger; Loading @@ -1302,7 +1317,7 @@ int wl1271_acx_rssi_snr_avg_weights(struct wl1271 *wl) goto out; } acx->role_id = wl->role_id; acx->role_id = wlvif->role_id; acx->rssi_beacon = c->avg_weight_rssi_beacon; acx->rssi_data = c->avg_weight_rssi_data; acx->snr_beacon = c->avg_weight_snr_beacon; Loading Loading @@ -1367,6 +1382,7 @@ int wl1271_acx_set_ht_capabilities(struct wl1271 *wl, } int wl1271_acx_set_ht_information(struct wl1271 *wl, struct wl12xx_vif *wlvif, u16 ht_operation_mode) { struct wl1271_acx_ht_information *acx; Loading @@ -1380,7 +1396,7 @@ int wl1271_acx_set_ht_information(struct wl1271 *wl, goto out; } acx->role_id = wl->role_id; acx->role_id = wlvif->role_id; acx->ht_protection = (u8)(ht_operation_mode & IEEE80211_HT_OP_MODE_PROTECTION); acx->rifs_mode = 0; Loading @@ -1402,7 +1418,8 @@ int wl1271_acx_set_ht_information(struct wl1271 *wl, } /* Configure BA session initiator/receiver parameters setting in the FW. */ int wl12xx_acx_set_ba_initiator_policy(struct wl1271 *wl) int wl12xx_acx_set_ba_initiator_policy(struct wl1271 *wl, struct wl12xx_vif *wlvif) { struct wl1271_acx_ba_initiator_policy *acx; int ret; Loading @@ -1416,7 +1433,7 @@ int wl12xx_acx_set_ba_initiator_policy(struct wl1271 *wl) } /* set for the current role */ acx->role_id = wl->role_id; acx->role_id = wlvif->role_id; acx->tid_bitmap = wl->conf.ht.tx_ba_tid_bitmap; acx->win_size = wl->conf.ht.tx_ba_win_size; acx->inactivity_timeout = wl->conf.ht.inactivity_timeout; Loading Loading @@ -1494,7 +1511,8 @@ int wl1271_acx_tsf_info(struct wl1271 *wl, u64 *mactime) return ret; } int wl1271_acx_ps_rx_streaming(struct wl1271 *wl, bool enable) int wl1271_acx_ps_rx_streaming(struct wl1271 *wl, struct wl12xx_vif *wlvif, bool enable) { struct wl1271_acx_ps_rx_streaming *rx_streaming; u32 conf_queues, enable_queues; Loading Loading @@ -1523,7 +1541,7 @@ int wl1271_acx_ps_rx_streaming(struct wl1271 *wl, bool enable) if (!(conf_queues & BIT(i))) continue; rx_streaming->role_id = wl->role_id; rx_streaming->role_id = wlvif->role_id; rx_streaming->tid = i; rx_streaming->enable = enable_queues & BIT(i); rx_streaming->period = wl->conf.rx_streaming.interval; Loading @@ -1542,7 +1560,7 @@ int wl1271_acx_ps_rx_streaming(struct wl1271 *wl, bool enable) return ret; } int wl1271_acx_ap_max_tx_retry(struct wl1271 *wl) int wl1271_acx_ap_max_tx_retry(struct wl1271 *wl, struct wl12xx_vif *wlvif) { struct wl1271_acx_ap_max_tx_retry *acx = NULL; int ret; Loading @@ -1553,7 +1571,7 @@ int wl1271_acx_ap_max_tx_retry(struct wl1271 *wl) if (!acx) return -ENOMEM; acx->role_id = wl->role_id; acx->role_id = wlvif->role_id; acx->max_tx_retry = cpu_to_le16(wl->conf.tx.max_tx_retries); ret = wl1271_cmd_configure(wl, ACX_MAX_TX_FAILURE, acx, sizeof(*acx)); Loading @@ -1567,7 +1585,7 @@ int wl1271_acx_ap_max_tx_retry(struct wl1271 *wl) return ret; } int wl1271_acx_config_ps(struct wl1271 *wl) int wl12xx_acx_config_ps(struct wl1271 *wl, struct wl12xx_vif *wlvif) { struct wl1271_acx_config_ps *config_ps; int ret; Loading @@ -1582,7 +1600,7 @@ int wl1271_acx_config_ps(struct wl1271 *wl) config_ps->exit_retries = wl->conf.conn.psm_exit_retries; config_ps->enter_retries = wl->conf.conn.psm_entry_retries; config_ps->null_data_rate = cpu_to_le32(wl->basic_rate); config_ps->null_data_rate = cpu_to_le32(wlvif->basic_rate); ret = wl1271_cmd_configure(wl, ACX_CONFIG_PS, config_ps, sizeof(*config_ps)); Loading
drivers/net/wireless/wl12xx/acx.h +48 −35 Original line number Diff line number Diff line Loading @@ -654,11 +654,6 @@ struct acx_rate_class { u8 reserved; }; #define ACX_TX_BASIC_RATE 0 #define ACX_TX_AP_FULL_RATE 1 #define ACX_TX_BASIC_RATE_P2P 2 #define ACX_TX_AP_MODE_MGMT_RATE 4 #define ACX_TX_AP_MODE_BCST_RATE 5 struct acx_rate_policy { struct acx_header header; Loading Loading @@ -1234,39 +1229,49 @@ enum { }; int wl1271_acx_wake_up_conditions(struct wl1271 *wl); int wl1271_acx_wake_up_conditions(struct wl1271 *wl, struct wl12xx_vif *wlvif); int wl1271_acx_sleep_auth(struct wl1271 *wl, u8 sleep_auth); int wl1271_acx_tx_power(struct wl1271 *wl, int power); int wl1271_acx_feature_cfg(struct wl1271 *wl); int wl1271_acx_tx_power(struct wl1271 *wl, struct wl12xx_vif *wlvif, int power); int wl1271_acx_feature_cfg(struct wl1271 *wl, struct wl12xx_vif *wlvif); int wl1271_acx_mem_map(struct wl1271 *wl, struct acx_header *mem_map, size_t len); int wl1271_acx_rx_msdu_life_time(struct wl1271 *wl); int wl1271_acx_pd_threshold(struct wl1271 *wl); int wl1271_acx_slot(struct wl1271 *wl, enum acx_slot_type slot_time); int wl1271_acx_group_address_tbl(struct wl1271 *wl, bool enable, void *mc_list, u32 mc_list_len); int wl1271_acx_service_period_timeout(struct wl1271 *wl); int wl1271_acx_rts_threshold(struct wl1271 *wl, u32 rts_threshold); int wl1271_acx_slot(struct wl1271 *wl, struct wl12xx_vif *wlvif, enum acx_slot_type slot_time); int wl1271_acx_group_address_tbl(struct wl1271 *wl, struct wl12xx_vif *wlvif, bool enable, void *mc_list, u32 mc_list_len); int wl1271_acx_service_period_timeout(struct wl1271 *wl, struct wl12xx_vif *wlvif); int wl1271_acx_rts_threshold(struct wl1271 *wl, struct wl12xx_vif *wlvif, u32 rts_threshold); int wl1271_acx_dco_itrim_params(struct wl1271 *wl); int wl1271_acx_beacon_filter_opt(struct wl1271 *wl, bool enable_filter); int wl1271_acx_beacon_filter_table(struct wl1271 *wl); int wl1271_acx_conn_monit_params(struct wl1271 *wl, bool enable); int wl1271_acx_beacon_filter_opt(struct wl1271 *wl, struct wl12xx_vif *wlvif, bool enable_filter); int wl1271_acx_beacon_filter_table(struct wl1271 *wl, struct wl12xx_vif *wlvif); int wl1271_acx_conn_monit_params(struct wl1271 *wl, struct wl12xx_vif *wlvif, bool enable); int wl1271_acx_sg_enable(struct wl1271 *wl, bool enable); int wl12xx_acx_sg_cfg(struct wl1271 *wl); int wl1271_acx_cca_threshold(struct wl1271 *wl); int wl1271_acx_bcn_dtim_options(struct wl1271 *wl); int wl1271_acx_aid(struct wl1271 *wl, u16 aid); int wl1271_acx_bcn_dtim_options(struct wl1271 *wl, struct wl12xx_vif *wlvif); int wl1271_acx_aid(struct wl1271 *wl, struct wl12xx_vif *wlvif, u16 aid); int wl1271_acx_event_mbox_mask(struct wl1271 *wl, u32 event_mask); int wl1271_acx_set_preamble(struct wl1271 *wl, enum acx_preamble_type preamble); int wl1271_acx_cts_protect(struct wl1271 *wl, int wl1271_acx_set_preamble(struct wl1271 *wl, struct wl12xx_vif *wlvif, enum acx_preamble_type preamble); int wl1271_acx_cts_protect(struct wl1271 *wl, struct wl12xx_vif *wlvif, enum acx_ctsprotect_type ctsprotect); int wl1271_acx_statistics(struct wl1271 *wl, struct acx_statistics *stats); int wl1271_acx_sta_rate_policies(struct wl1271 *wl); int wl1271_acx_sta_rate_policies(struct wl1271 *wl, struct wl12xx_vif *wlvif); int wl1271_acx_ap_rate_policy(struct wl1271 *wl, struct conf_tx_rate_class *c, u8 idx); int wl1271_acx_ac_cfg(struct wl1271 *wl, u8 ac, u8 cw_min, u16 cw_max, u8 aifsn, u16 txop); int wl1271_acx_tid_cfg(struct wl1271 *wl, u8 queue_id, u8 channel_type, int wl1271_acx_ac_cfg(struct wl1271 *wl, struct wl12xx_vif *wlvif, u8 ac, u8 cw_min, u16 cw_max, u8 aifsn, u16 txop); int wl1271_acx_tid_cfg(struct wl1271 *wl, struct wl12xx_vif *wlvif, u8 queue_id, u8 channel_type, u8 tsid, u8 ps_scheme, u8 ack_policy, u32 apsd_conf0, u32 apsd_conf1); int wl1271_acx_frag_threshold(struct wl1271 *wl, u32 frag_threshold); Loading @@ -1276,26 +1281,34 @@ int wl1271_acx_init_mem_config(struct wl1271 *wl); int wl1271_acx_host_if_cfg_bitmap(struct wl1271 *wl, u32 host_cfg_bitmap); int wl1271_acx_init_rx_interrupt(struct wl1271 *wl); int wl1271_acx_smart_reflex(struct wl1271 *wl); int wl1271_acx_bet_enable(struct wl1271 *wl, bool enable); int wl1271_acx_arp_ip_filter(struct wl1271 *wl, u8 enable, __be32 address); int wl1271_acx_bet_enable(struct wl1271 *wl, struct wl12xx_vif *wlvif, bool enable); int wl1271_acx_arp_ip_filter(struct wl1271 *wl, struct wl12xx_vif *wlvif, u8 enable, __be32 address); int wl1271_acx_pm_config(struct wl1271 *wl); int wl1271_acx_keep_alive_mode(struct wl1271 *wl, bool enable); int wl1271_acx_keep_alive_config(struct wl1271 *wl, u8 index, u8 tpl_valid); int wl1271_acx_rssi_snr_trigger(struct wl1271 *wl, bool enable, s16 thold, u8 hyst); int wl1271_acx_rssi_snr_avg_weights(struct wl1271 *wl); int wl1271_acx_keep_alive_mode(struct wl1271 *wl, struct wl12xx_vif *vif, bool enable); int wl1271_acx_keep_alive_config(struct wl1271 *wl, struct wl12xx_vif *wlvif, u8 index, u8 tpl_valid); int wl1271_acx_rssi_snr_trigger(struct wl1271 *wl, struct wl12xx_vif *wlvif, bool enable, s16 thold, u8 hyst); int wl1271_acx_rssi_snr_avg_weights(struct wl1271 *wl, struct wl12xx_vif *wlvif); int wl1271_acx_set_ht_capabilities(struct wl1271 *wl, struct ieee80211_sta_ht_cap *ht_cap, bool allow_ht_operation, u8 hlid); int wl1271_acx_set_ht_information(struct wl1271 *wl, struct wl12xx_vif *wlvif, u16 ht_operation_mode); int wl12xx_acx_set_ba_initiator_policy(struct wl1271 *wl); int wl12xx_acx_set_ba_initiator_policy(struct wl1271 *wl, struct wl12xx_vif *wlvif); int wl12xx_acx_set_ba_receiver_session(struct wl1271 *wl, u8 tid_index, u16 ssn, bool enable, u8 peer_hlid); int wl1271_acx_tsf_info(struct wl1271 *wl, u64 *mactime); int wl1271_acx_ps_rx_streaming(struct wl1271 *wl, bool enable); int wl1271_acx_ap_max_tx_retry(struct wl1271 *wl); int wl1271_acx_config_ps(struct wl1271 *wl); int wl1271_acx_ps_rx_streaming(struct wl1271 *wl, struct wl12xx_vif *wlvif, bool enable); int wl1271_acx_ap_max_tx_retry(struct wl1271 *wl, struct wl12xx_vif *wlvif); int wl12xx_acx_config_ps(struct wl1271 *wl, struct wl12xx_vif *wlvif); int wl1271_acx_set_inconnection_sta(struct wl1271 *wl, u8 *addr); int wl1271_acx_fm_coex(struct wl1271 *wl); int wl12xx_acx_set_rate_mgmt_params(struct wl1271 *wl); Loading
drivers/net/wireless/wl12xx/boot.c +15 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ #include <linux/wl12xx.h> #include <linux/export.h> #include "debug.h" #include "acx.h" #include "reg.h" #include "boot.h" Loading Loading @@ -347,6 +348,9 @@ static int wl1271_boot_upload_nvs(struct wl1271 *wl) nvs_ptr += 3; for (i = 0; i < burst_len; i++) { if (nvs_ptr + 3 >= (u8 *) wl->nvs + nvs_len) goto out_badnvs; val = (nvs_ptr[0] | (nvs_ptr[1] << 8) | (nvs_ptr[2] << 16) | (nvs_ptr[3] << 24)); Loading @@ -358,6 +362,9 @@ static int wl1271_boot_upload_nvs(struct wl1271 *wl) nvs_ptr += 4; dest_addr += 4; } if (nvs_ptr >= (u8 *) wl->nvs + nvs_len) goto out_badnvs; } /* Loading @@ -369,6 +376,10 @@ static int wl1271_boot_upload_nvs(struct wl1271 *wl) */ nvs_ptr = (u8 *)wl->nvs + ALIGN(nvs_ptr - (u8 *)wl->nvs + 7, 4); if (nvs_ptr >= (u8 *) wl->nvs + nvs_len) goto out_badnvs; nvs_len -= nvs_ptr - (u8 *)wl->nvs; /* Now we must set the partition correctly */ Loading @@ -384,6 +395,10 @@ static int wl1271_boot_upload_nvs(struct wl1271 *wl) kfree(nvs_aligned); return 0; out_badnvs: wl1271_error("nvs data is malformed"); return -EILSEQ; } static void wl1271_boot_enable_interrupts(struct wl1271 *wl) Loading