Loading drivers/net/wireless/wl12xx/acx.c +142 −48 Original line number Diff line number Diff line Loading @@ -325,12 +325,19 @@ int wl1271_acx_service_period_timeout(struct wl1271 *wl) return ret; } int wl1271_acx_rts_threshold(struct wl1271 *wl, u16 rts_threshold) int wl1271_acx_rts_threshold(struct wl1271 *wl, u32 rts_threshold) { struct acx_rts_threshold *rts; int ret; wl1271_debug(DEBUG_ACX, "acx rts threshold"); /* * If the RTS threshold is not configured or out of range, use the * default value. */ if (rts_threshold > IEEE80211_MAX_RTS_THRESHOLD) rts_threshold = wl->conf.rx.rts_threshold; wl1271_debug(DEBUG_ACX, "acx rts threshold: %d", rts_threshold); rts = kzalloc(sizeof(*rts), GFP_KERNEL); if (!rts) { Loading @@ -338,7 +345,7 @@ int wl1271_acx_rts_threshold(struct wl1271 *wl, u16 rts_threshold) goto out; } rts->threshold = cpu_to_le16(rts_threshold); rts->threshold = cpu_to_le16((u16)rts_threshold); ret = wl1271_cmd_configure(wl, DOT11_RTS_THRESHOLD, rts, sizeof(*rts)); if (ret < 0) { Loading Loading @@ -540,13 +547,43 @@ int wl1271_acx_sg_enable(struct wl1271 *wl, bool enable) return ret; } int wl1271_acx_sg_cfg(struct wl1271 *wl) int wl1271_acx_sta_sg_cfg(struct wl1271 *wl) { struct acx_sta_bt_wlan_coex_param *param; struct conf_sg_settings *c = &wl->conf.sg; int i, ret; wl1271_debug(DEBUG_ACX, "acx sg sta cfg"); param = kzalloc(sizeof(*param), GFP_KERNEL); if (!param) { ret = -ENOMEM; goto out; } /* BT-WLAN coext parameters */ for (i = 0; i < CONF_SG_STA_PARAMS_MAX; i++) param->params[i] = cpu_to_le32(c->sta_params[i]); param->param_idx = CONF_SG_PARAMS_ALL; ret = wl1271_cmd_configure(wl, ACX_SG_CFG, param, sizeof(*param)); if (ret < 0) { wl1271_warning("failed to set sg config: %d", ret); goto out; } out: kfree(param); return ret; } int wl1271_acx_ap_sg_cfg(struct wl1271 *wl) { struct acx_bt_wlan_coex_param *param; struct acx_ap_bt_wlan_coex_param *param; struct conf_sg_settings *c = &wl->conf.sg; int i, ret; wl1271_debug(DEBUG_ACX, "acx sg cfg"); wl1271_debug(DEBUG_ACX, "acx sg ap cfg"); param = kzalloc(sizeof(*param), GFP_KERNEL); if (!param) { Loading @@ -555,8 +592,8 @@ int wl1271_acx_sg_cfg(struct wl1271 *wl) } /* BT-WLAN coext parameters */ for (i = 0; i < CONF_SG_PARAMS_MAX; i++) param->params[i] = cpu_to_le32(c->params[i]); for (i = 0; i < CONF_SG_AP_PARAMS_MAX; i++) param->params[i] = cpu_to_le32(c->ap_params[i]); param->param_idx = CONF_SG_PARAMS_ALL; ret = wl1271_cmd_configure(wl, ACX_SG_CFG, param, sizeof(*param)); Loading Loading @@ -804,7 +841,8 @@ int wl1271_acx_ap_rate_policy(struct wl1271 *wl, struct conf_tx_rate_class *c, struct acx_ap_rate_policy *acx; int ret = 0; wl1271_debug(DEBUG_ACX, "acx ap rate policy"); wl1271_debug(DEBUG_ACX, "acx ap rate policy %d rates 0x%x", idx, c->enabled_rates); acx = kzalloc(sizeof(*acx), GFP_KERNEL); if (!acx) { Loading Loading @@ -898,12 +936,19 @@ int wl1271_acx_tid_cfg(struct wl1271 *wl, u8 queue_id, u8 channel_type, return ret; } int wl1271_acx_frag_threshold(struct wl1271 *wl, u16 frag_threshold) int wl1271_acx_frag_threshold(struct wl1271 *wl, u32 frag_threshold) { struct acx_frag_threshold *acx; int ret = 0; wl1271_debug(DEBUG_ACX, "acx frag threshold"); /* * If the fragmentation is not configured or out of range, use the * default value. */ if (frag_threshold > IEEE80211_MAX_FRAG_THRESHOLD) frag_threshold = wl->conf.tx.frag_threshold; wl1271_debug(DEBUG_ACX, "acx frag threshold: %d", frag_threshold); acx = kzalloc(sizeof(*acx), GFP_KERNEL); Loading @@ -912,7 +957,7 @@ int wl1271_acx_frag_threshold(struct wl1271 *wl, u16 frag_threshold) goto out; } acx->frag_threshold = cpu_to_le16(frag_threshold); acx->frag_threshold = cpu_to_le16((u16)frag_threshold); ret = wl1271_cmd_configure(wl, ACX_FRAG_CFG, acx, sizeof(*acx)); if (ret < 0) { wl1271_warning("Setting of frag threshold failed: %d", ret); Loading Loading @@ -954,6 +999,7 @@ int wl1271_acx_tx_config_options(struct wl1271 *wl) int wl1271_acx_ap_mem_cfg(struct wl1271 *wl) { struct wl1271_acx_ap_config_memory *mem_conf; struct conf_memory_settings *mem; int ret; wl1271_debug(DEBUG_ACX, "wl1271 mem cfg"); Loading @@ -964,14 +1010,21 @@ int wl1271_acx_ap_mem_cfg(struct wl1271 *wl) goto out; } if (wl->chip.id == CHIP_ID_1283_PG20) /* * FIXME: The 128x AP FW does not yet support dynamic memory. * Use the base memory configuration for 128x for now. This * should be fine tuned in the future. */ mem = &wl->conf.mem_wl128x; else mem = &wl->conf.mem_wl127x; /* memory config */ /* FIXME: for now we always use mem_wl127x for AP, because it * doesn't support dynamic memory and we don't have the * optimal values for wl128x without dynamic memory yet */ mem_conf->num_stations = wl->conf.mem_wl127x.num_stations; mem_conf->rx_mem_block_num = wl->conf.mem_wl127x.rx_block_num; mem_conf->tx_min_mem_block_num = wl->conf.mem_wl127x.tx_min_block_num; mem_conf->num_ssid_profiles = wl->conf.mem_wl127x.ssid_profiles; mem_conf->num_stations = mem->num_stations; mem_conf->rx_mem_block_num = mem->rx_block_num; mem_conf->tx_min_mem_block_num = mem->tx_min_block_num; mem_conf->num_ssid_profiles = mem->ssid_profiles; mem_conf->total_tx_descriptors = cpu_to_le32(ACX_TX_DESCRIPTORS); ret = wl1271_cmd_configure(wl, ACX_MEM_CFG, mem_conf, Loading Loading @@ -1524,46 +1577,22 @@ int wl1271_acx_tsf_info(struct wl1271 *wl, u64 *mactime) return ret; } int wl1271_acx_ap_max_tx_retry(struct wl1271 *wl) int wl1271_acx_max_tx_retry(struct wl1271 *wl) { struct wl1271_acx_ap_max_tx_retry *acx = NULL; struct wl1271_acx_max_tx_retry *acx = NULL; int ret; wl1271_debug(DEBUG_ACX, "acx ap max tx retry"); wl1271_debug(DEBUG_ACX, "acx max tx retry"); acx = kzalloc(sizeof(*acx), GFP_KERNEL); if (!acx) return -ENOMEM; acx->max_tx_retry = cpu_to_le16(wl->conf.tx.max_tx_retries); acx->max_tx_retry = cpu_to_le16(wl->conf.tx.ap_max_tx_retries); ret = wl1271_cmd_configure(wl, ACX_MAX_TX_FAILURE, acx, sizeof(*acx)); if (ret < 0) { wl1271_warning("acx ap max tx retry failed: %d", ret); goto out; } out: kfree(acx); return ret; } int wl1271_acx_sta_max_tx_retry(struct wl1271 *wl) { struct wl1271_acx_sta_max_tx_retry *acx = NULL; int ret; wl1271_debug(DEBUG_ACX, "acx sta max tx retry"); acx = kzalloc(sizeof(*acx), GFP_KERNEL); if (!acx) return -ENOMEM; acx->max_tx_retry = wl->conf.tx.max_tx_retries; ret = wl1271_cmd_configure(wl, ACX_CONS_TX_FAILURE, acx, sizeof(*acx)); if (ret < 0) { wl1271_warning("acx sta max tx retry failed: %d", ret); wl1271_warning("acx max tx retry failed: %d", ret); goto out; } Loading Loading @@ -1626,3 +1655,68 @@ int wl1271_acx_set_inconnection_sta(struct wl1271 *wl, u8 *addr) kfree(acx); return ret; } int wl1271_acx_set_ap_beacon_filter(struct wl1271 *wl, bool enable) { struct acx_ap_beacon_filter *acx = NULL; int ret; wl1271_debug(DEBUG_ACX, "acx set ap beacon filter: %d", enable); acx = kzalloc(sizeof(*acx), GFP_KERNEL); if (!acx) return -ENOMEM; acx->enable = enable ? 1 : 0; ret = wl1271_cmd_configure(wl, ACX_AP_BEACON_FILTER_OPT, acx, sizeof(*acx)); if (ret < 0) { wl1271_warning("acx set ap beacon filter failed: %d", ret); goto out; } out: kfree(acx); return ret; } int wl1271_acx_fm_coex(struct wl1271 *wl) { struct wl1271_acx_fm_coex *acx; int ret; wl1271_debug(DEBUG_ACX, "acx fm coex setting"); acx = kzalloc(sizeof(*acx), GFP_KERNEL); if (!acx) { ret = -ENOMEM; goto out; } acx->enable = wl->conf.fm_coex.enable; acx->swallow_period = wl->conf.fm_coex.swallow_period; acx->n_divider_fref_set_1 = wl->conf.fm_coex.n_divider_fref_set_1; acx->n_divider_fref_set_2 = wl->conf.fm_coex.n_divider_fref_set_2; acx->m_divider_fref_set_1 = cpu_to_le16(wl->conf.fm_coex.m_divider_fref_set_1); acx->m_divider_fref_set_2 = cpu_to_le16(wl->conf.fm_coex.m_divider_fref_set_2); acx->coex_pll_stabilization_time = cpu_to_le32(wl->conf.fm_coex.coex_pll_stabilization_time); acx->ldo_stabilization_time = cpu_to_le16(wl->conf.fm_coex.ldo_stabilization_time); acx->fm_disturbed_band_margin = wl->conf.fm_coex.fm_disturbed_band_margin; acx->swallow_clk_diff = wl->conf.fm_coex.swallow_clk_diff; ret = wl1271_cmd_configure(wl, ACX_FM_COEX_CFG, acx, sizeof(*acx)); if (ret < 0) { wl1271_warning("acx fm coex setting failed: %d", ret); goto out; } out: kfree(acx); return ret; } drivers/net/wireless/wl12xx/acx.h +87 −16 Original line number Diff line number Diff line Loading @@ -303,7 +303,6 @@ struct acx_beacon_filter_option { struct acx_header header; u8 enable; /* * The number of beacons without the unicast TIM * bit set that the firmware buffers before Loading Loading @@ -370,14 +369,23 @@ struct acx_bt_wlan_coex { u8 pad[3]; } __packed; struct acx_bt_wlan_coex_param { struct acx_sta_bt_wlan_coex_param { struct acx_header header; __le32 params[CONF_SG_PARAMS_MAX]; __le32 params[CONF_SG_STA_PARAMS_MAX]; u8 param_idx; u8 padding[3]; } __packed; struct acx_ap_bt_wlan_coex_param { struct acx_header header; __le32 params[CONF_SG_AP_PARAMS_MAX]; u8 param_idx; u8 padding[3]; } __packed; struct acx_dco_itrim_params { struct acx_header header; Loading Loading @@ -1145,7 +1153,7 @@ struct wl1271_acx_fw_tsf_information { u8 padding[3]; } __packed; struct wl1271_acx_ap_max_tx_retry { struct wl1271_acx_max_tx_retry { struct acx_header header; /* Loading @@ -1156,13 +1164,6 @@ struct wl1271_acx_ap_max_tx_retry { u8 padding_1[2]; } __packed; struct wl1271_acx_sta_max_tx_retry { struct acx_header header; u8 max_tx_retry; u8 padding_1[3]; } __packed; struct wl1271_acx_config_ps { struct acx_header header; Loading @@ -1179,6 +1180,72 @@ struct wl1271_acx_inconnection_sta { u8 padding1[2]; } __packed; struct acx_ap_beacon_filter { struct acx_header header; u8 enable; u8 pad[3]; } __packed; /* * ACX_FM_COEX_CFG * set the FM co-existence parameters. */ struct wl1271_acx_fm_coex { struct acx_header header; /* enable(1) / disable(0) the FM Coex feature */ u8 enable; /* * Swallow period used in COEX PLL swallowing mechanism. * 0xFF = use FW default */ u8 swallow_period; /* * The N divider used in COEX PLL swallowing mechanism for Fref of * 38.4/19.2 Mhz. 0xFF = use FW default */ u8 n_divider_fref_set_1; /* * The N divider used in COEX PLL swallowing mechanism for Fref of * 26/52 Mhz. 0xFF = use FW default */ u8 n_divider_fref_set_2; /* * The M divider used in COEX PLL swallowing mechanism for Fref of * 38.4/19.2 Mhz. 0xFFFF = use FW default */ __le16 m_divider_fref_set_1; /* * The M divider used in COEX PLL swallowing mechanism for Fref of * 26/52 Mhz. 0xFFFF = use FW default */ __le16 m_divider_fref_set_2; /* * The time duration in uSec required for COEX PLL to stabilize. * 0xFFFFFFFF = use FW default */ __le32 coex_pll_stabilization_time; /* * The time duration in uSec required for LDO to stabilize. * 0xFFFFFFFF = use FW default */ __le16 ldo_stabilization_time; /* * The disturbed frequency band margin around the disturbed frequency * center (single sided). * For example, if 2 is configured, the following channels will be * considered disturbed channel: * 80 +- 0.1 MHz, 91 +- 0.1 MHz, 98 +- 0.1 MHz, 102 +- 0.1 MH * 0xFF = use FW default */ u8 fm_disturbed_band_margin; /* * The swallow clock difference of the swallowing mechanism. * 0xFF = use FW default */ u8 swallow_clk_diff; } __packed; enum { ACX_WAKE_UP_CONDITIONS = 0x0002, ACX_MEM_CFG = 0x0003, Loading @@ -1197,6 +1264,7 @@ enum { ACX_TID_CFG = 0x001A, ACX_PS_RX_STREAMING = 0x001B, ACX_BEACON_FILTER_OPT = 0x001F, ACX_AP_BEACON_FILTER_OPT = 0x0020, ACX_NOISE_HIST = 0x0021, ACX_HDK_VERSION = 0x0022, /* ??? */ ACX_PD_THRESHOLD = 0x0023, Loading @@ -1208,6 +1276,7 @@ enum { ACX_BCN_DTIM_OPTIONS = 0x0031, ACX_SG_ENABLE = 0x0032, ACX_SG_CFG = 0x0033, ACX_FM_COEX_CFG = 0x0034, ACX_BEACON_FILTER_TABLE = 0x0038, ACX_ARP_IP_FILTER = 0x0039, ACX_ROAMING_STATISTICS_TBL = 0x003B, Loading Loading @@ -1264,13 +1333,14 @@ 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, u16 rts_threshold); int wl1271_acx_rts_threshold(struct wl1271 *wl, 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_sg_enable(struct wl1271 *wl, bool enable); int wl1271_acx_sg_cfg(struct wl1271 *wl); int wl1271_acx_sta_sg_cfg(struct wl1271 *wl); int wl1271_acx_ap_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); Loading @@ -1287,7 +1357,7 @@ int wl1271_acx_ac_cfg(struct wl1271 *wl, u8 ac, u8 cw_min, u16 cw_max, int wl1271_acx_tid_cfg(struct wl1271 *wl, 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, u16 frag_threshold); int wl1271_acx_frag_threshold(struct wl1271 *wl, u32 frag_threshold); int wl1271_acx_tx_config_options(struct wl1271 *wl); int wl1271_acx_ap_mem_cfg(struct wl1271 *wl); int wl1271_acx_sta_mem_cfg(struct wl1271 *wl); Loading @@ -1314,9 +1384,10 @@ int wl1271_acx_set_ba_session(struct wl1271 *wl, int wl1271_acx_set_ba_receiver_session(struct wl1271 *wl, u8 tid_index, u16 ssn, bool enable); int wl1271_acx_tsf_info(struct wl1271 *wl, u64 *mactime); int wl1271_acx_ap_max_tx_retry(struct wl1271 *wl); int wl1271_acx_sta_max_tx_retry(struct wl1271 *wl); int wl1271_acx_max_tx_retry(struct wl1271 *wl); int wl1271_acx_config_ps(struct wl1271 *wl); int wl1271_acx_set_inconnection_sta(struct wl1271 *wl, u8 *addr); int wl1271_acx_set_ap_beacon_filter(struct wl1271 *wl, bool enable); int wl1271_acx_fm_coex(struct wl1271 *wl); #endif /* __WL1271_ACX_H__ */ drivers/net/wireless/wl12xx/boot.c +2 −4 Original line number Diff line number Diff line Loading @@ -478,12 +478,10 @@ static int wl1271_boot_run_firmware(struct wl1271 *wl) DISCONNECT_EVENT_COMPLETE_ID | RSSI_SNR_TRIGGER_0_EVENT_ID | PSPOLL_DELIVERY_FAILURE_EVENT_ID | SOFT_GEMINI_SENSE_EVENT_ID | MAX_TX_RETRY_EVENT_ID; SOFT_GEMINI_SENSE_EVENT_ID; if (wl->bss_type == BSS_TYPE_AP_BSS) wl->event_mask |= STA_REMOVE_COMPLETE_EVENT_ID | INACTIVE_STA_EVENT_ID; wl->event_mask |= STA_REMOVE_COMPLETE_EVENT_ID; else wl->event_mask |= DUMMY_PACKET_EVENT_ID; Loading drivers/net/wireless/wl12xx/cmd.c +14 −4 Original line number Diff line number Diff line Loading @@ -76,7 +76,7 @@ int wl1271_cmd_send(struct wl1271 *wl, u16 id, void *buf, size_t len, if (time_after(jiffies, timeout)) { wl1271_error("command complete timeout"); ret = -ETIMEDOUT; goto out; goto fail; } poll_count++; Loading @@ -96,14 +96,17 @@ int wl1271_cmd_send(struct wl1271 *wl, u16 id, void *buf, size_t len, status = le16_to_cpu(cmd->status); if (status != CMD_STATUS_SUCCESS) { wl1271_error("command execute failure %d", status); ieee80211_queue_work(wl->hw, &wl->recovery_work); ret = -EIO; goto fail; } wl1271_write32(wl, ACX_REG_INTERRUPT_ACK, WL1271_ACX_INTR_CMD_COMPLETE); return 0; out: fail: WARN_ON(1); ieee80211_queue_work(wl->hw, &wl->recovery_work); return ret; } Loading @@ -129,6 +132,9 @@ int wl1271_cmd_general_parms(struct wl1271 *wl) if (gp->tx_bip_fem_auto_detect) answer = true; /* Override the REF CLK from the NVS with the one from platform data */ gen_parms->general_params.ref_clock = wl->ref_clock; ret = wl1271_cmd_test(wl, gen_parms, sizeof(*gen_parms), answer); if (ret < 0) { wl1271_warning("CMD_INI_FILE_GENERAL_PARAM failed"); Loading Loading @@ -168,6 +174,10 @@ int wl128x_cmd_general_parms(struct wl1271 *wl) if (gp->tx_bip_fem_auto_detect) answer = true; /* Replace REF and TCXO CLKs with the ones from platform data */ gen_parms->general_params.ref_clock = wl->ref_clock; gen_parms->general_params.tcxo_ref_clock = wl->tcxo_clock; ret = wl1271_cmd_test(wl, gen_parms, sizeof(*gen_parms), answer); if (ret < 0) { wl1271_warning("CMD_INI_FILE_GENERAL_PARAM failed"); Loading Loading @@ -1070,7 +1080,7 @@ int wl1271_cmd_start_bss(struct wl1271 *wl) memcpy(cmd->bssid, bss_conf->bssid, ETH_ALEN); cmd->aging_period = cpu_to_le16(wl->conf.tx.ap_aging_period); cmd->aging_period = cpu_to_le16(WL1271_AP_DEF_INACTIV_SEC); cmd->bss_index = WL1271_AP_BSS_INDEX; cmd->global_hlid = WL1271_AP_GLOBAL_HLID; cmd->broadcast_hlid = WL1271_AP_BROADCAST_HLID; Loading drivers/net/wireless/wl12xx/conf.h +62 −28 Original line number Diff line number Diff line Loading @@ -396,12 +396,43 @@ enum { CONF_SG_TEMP_PARAM_3, CONF_SG_TEMP_PARAM_4, CONF_SG_TEMP_PARAM_5, CONF_SG_PARAMS_MAX, /* * AP beacon miss * * Range: 0 - 255 */ CONF_SG_AP_BEACON_MISS_TX, /* * AP RX window length * * Range: 0 - 50 */ CONF_SG_RX_WINDOW_LENGTH, /* * AP connection protection time * * Range: 0 - 5000 */ CONF_SG_AP_CONNECTION_PROTECTION_TIME, CONF_SG_TEMP_PARAM_6, CONF_SG_TEMP_PARAM_7, CONF_SG_TEMP_PARAM_8, CONF_SG_TEMP_PARAM_9, CONF_SG_TEMP_PARAM_10, CONF_SG_STA_PARAMS_MAX = CONF_SG_TEMP_PARAM_5 + 1, CONF_SG_AP_PARAMS_MAX = CONF_SG_TEMP_PARAM_10 + 1, CONF_SG_PARAMS_ALL = 0xff }; struct conf_sg_settings { u32 params[CONF_SG_PARAMS_MAX]; u32 sta_params[CONF_SG_STA_PARAMS_MAX]; u32 ap_params[CONF_SG_AP_PARAMS_MAX]; u8 state; }; Loading Loading @@ -509,6 +540,12 @@ struct conf_rx_settings { CONF_HW_BIT_RATE_36MBPS | CONF_HW_BIT_RATE_48MBPS | \ CONF_HW_BIT_RATE_54MBPS) #define CONF_TX_OFDM_RATES (CONF_HW_BIT_RATE_6MBPS | \ CONF_HW_BIT_RATE_12MBPS | CONF_HW_BIT_RATE_24MBPS | \ CONF_HW_BIT_RATE_36MBPS | CONF_HW_BIT_RATE_48MBPS | \ CONF_HW_BIT_RATE_54MBPS) /* * Default rates for management traffic when operating in AP mode. This * should be configured according to the basic rate set of the AP Loading @@ -516,6 +553,13 @@ struct conf_rx_settings { #define CONF_TX_AP_DEFAULT_MGMT_RATES (CONF_HW_BIT_RATE_1MBPS | \ CONF_HW_BIT_RATE_2MBPS | CONF_HW_BIT_RATE_5_5MBPS) /* * Default rates for working as IBSS. use 11b rates */ #define CONF_TX_IBSS_DEFAULT_RATES (CONF_HW_BIT_RATE_1MBPS | \ CONF_HW_BIT_RATE_2MBPS | CONF_HW_BIT_RATE_5_5MBPS | \ CONF_HW_BIT_RATE_11MBPS); struct conf_tx_rate_class { /* Loading Loading @@ -667,34 +711,10 @@ struct conf_tx_settings { struct conf_tx_ac_category ac_conf[CONF_TX_MAX_AC_COUNT]; /* * Configuration for rate classes in AP-mode. These rate classes * are for the AC TX queues */ struct conf_tx_rate_class ap_rc_conf[CONF_TX_MAX_AC_COUNT]; /* * Management TX rate class for AP-mode. */ struct conf_tx_rate_class ap_mgmt_conf; /* * Broadcast TX rate class for AP-mode. */ struct conf_tx_rate_class ap_bcst_conf; /* * Allow this number of TX retries to a connected station/AP before an * AP-mode - allow this number of TX retries to a station before an * event is triggered from FW. * In AP-mode the hlids of unreachable stations are given in the * "sta_tx_retry_exceeded" member in the event mailbox. */ u8 max_tx_retries; /* * AP-mode - after this number of seconds a connected station is * considered inactive. */ u16 ap_aging_period; u16 ap_max_tx_retries; /* * Configuration for TID parameters. Loading Loading @@ -1192,6 +1212,19 @@ struct conf_memory_settings { u8 tx_min; }; struct conf_fm_coex { u8 enable; u8 swallow_period; u8 n_divider_fref_set_1; u8 n_divider_fref_set_2; u16 m_divider_fref_set_1; u16 m_divider_fref_set_2; u32 coex_pll_stabilization_time; u16 ldo_stabilization_time; u8 fm_disturbed_band_margin; u8 swallow_clk_diff; }; struct conf_drv_settings { struct conf_sg_settings sg; struct conf_rx_settings rx; Loading @@ -1205,6 +1238,7 @@ struct conf_drv_settings { struct conf_ht_setting ht; struct conf_memory_settings mem_wl127x; struct conf_memory_settings mem_wl128x; struct conf_fm_coex fm_coex; u8 hci_io_ds; }; Loading Loading
drivers/net/wireless/wl12xx/acx.c +142 −48 Original line number Diff line number Diff line Loading @@ -325,12 +325,19 @@ int wl1271_acx_service_period_timeout(struct wl1271 *wl) return ret; } int wl1271_acx_rts_threshold(struct wl1271 *wl, u16 rts_threshold) int wl1271_acx_rts_threshold(struct wl1271 *wl, u32 rts_threshold) { struct acx_rts_threshold *rts; int ret; wl1271_debug(DEBUG_ACX, "acx rts threshold"); /* * If the RTS threshold is not configured or out of range, use the * default value. */ if (rts_threshold > IEEE80211_MAX_RTS_THRESHOLD) rts_threshold = wl->conf.rx.rts_threshold; wl1271_debug(DEBUG_ACX, "acx rts threshold: %d", rts_threshold); rts = kzalloc(sizeof(*rts), GFP_KERNEL); if (!rts) { Loading @@ -338,7 +345,7 @@ int wl1271_acx_rts_threshold(struct wl1271 *wl, u16 rts_threshold) goto out; } rts->threshold = cpu_to_le16(rts_threshold); rts->threshold = cpu_to_le16((u16)rts_threshold); ret = wl1271_cmd_configure(wl, DOT11_RTS_THRESHOLD, rts, sizeof(*rts)); if (ret < 0) { Loading Loading @@ -540,13 +547,43 @@ int wl1271_acx_sg_enable(struct wl1271 *wl, bool enable) return ret; } int wl1271_acx_sg_cfg(struct wl1271 *wl) int wl1271_acx_sta_sg_cfg(struct wl1271 *wl) { struct acx_sta_bt_wlan_coex_param *param; struct conf_sg_settings *c = &wl->conf.sg; int i, ret; wl1271_debug(DEBUG_ACX, "acx sg sta cfg"); param = kzalloc(sizeof(*param), GFP_KERNEL); if (!param) { ret = -ENOMEM; goto out; } /* BT-WLAN coext parameters */ for (i = 0; i < CONF_SG_STA_PARAMS_MAX; i++) param->params[i] = cpu_to_le32(c->sta_params[i]); param->param_idx = CONF_SG_PARAMS_ALL; ret = wl1271_cmd_configure(wl, ACX_SG_CFG, param, sizeof(*param)); if (ret < 0) { wl1271_warning("failed to set sg config: %d", ret); goto out; } out: kfree(param); return ret; } int wl1271_acx_ap_sg_cfg(struct wl1271 *wl) { struct acx_bt_wlan_coex_param *param; struct acx_ap_bt_wlan_coex_param *param; struct conf_sg_settings *c = &wl->conf.sg; int i, ret; wl1271_debug(DEBUG_ACX, "acx sg cfg"); wl1271_debug(DEBUG_ACX, "acx sg ap cfg"); param = kzalloc(sizeof(*param), GFP_KERNEL); if (!param) { Loading @@ -555,8 +592,8 @@ int wl1271_acx_sg_cfg(struct wl1271 *wl) } /* BT-WLAN coext parameters */ for (i = 0; i < CONF_SG_PARAMS_MAX; i++) param->params[i] = cpu_to_le32(c->params[i]); for (i = 0; i < CONF_SG_AP_PARAMS_MAX; i++) param->params[i] = cpu_to_le32(c->ap_params[i]); param->param_idx = CONF_SG_PARAMS_ALL; ret = wl1271_cmd_configure(wl, ACX_SG_CFG, param, sizeof(*param)); Loading Loading @@ -804,7 +841,8 @@ int wl1271_acx_ap_rate_policy(struct wl1271 *wl, struct conf_tx_rate_class *c, struct acx_ap_rate_policy *acx; int ret = 0; wl1271_debug(DEBUG_ACX, "acx ap rate policy"); wl1271_debug(DEBUG_ACX, "acx ap rate policy %d rates 0x%x", idx, c->enabled_rates); acx = kzalloc(sizeof(*acx), GFP_KERNEL); if (!acx) { Loading Loading @@ -898,12 +936,19 @@ int wl1271_acx_tid_cfg(struct wl1271 *wl, u8 queue_id, u8 channel_type, return ret; } int wl1271_acx_frag_threshold(struct wl1271 *wl, u16 frag_threshold) int wl1271_acx_frag_threshold(struct wl1271 *wl, u32 frag_threshold) { struct acx_frag_threshold *acx; int ret = 0; wl1271_debug(DEBUG_ACX, "acx frag threshold"); /* * If the fragmentation is not configured or out of range, use the * default value. */ if (frag_threshold > IEEE80211_MAX_FRAG_THRESHOLD) frag_threshold = wl->conf.tx.frag_threshold; wl1271_debug(DEBUG_ACX, "acx frag threshold: %d", frag_threshold); acx = kzalloc(sizeof(*acx), GFP_KERNEL); Loading @@ -912,7 +957,7 @@ int wl1271_acx_frag_threshold(struct wl1271 *wl, u16 frag_threshold) goto out; } acx->frag_threshold = cpu_to_le16(frag_threshold); acx->frag_threshold = cpu_to_le16((u16)frag_threshold); ret = wl1271_cmd_configure(wl, ACX_FRAG_CFG, acx, sizeof(*acx)); if (ret < 0) { wl1271_warning("Setting of frag threshold failed: %d", ret); Loading Loading @@ -954,6 +999,7 @@ int wl1271_acx_tx_config_options(struct wl1271 *wl) int wl1271_acx_ap_mem_cfg(struct wl1271 *wl) { struct wl1271_acx_ap_config_memory *mem_conf; struct conf_memory_settings *mem; int ret; wl1271_debug(DEBUG_ACX, "wl1271 mem cfg"); Loading @@ -964,14 +1010,21 @@ int wl1271_acx_ap_mem_cfg(struct wl1271 *wl) goto out; } if (wl->chip.id == CHIP_ID_1283_PG20) /* * FIXME: The 128x AP FW does not yet support dynamic memory. * Use the base memory configuration for 128x for now. This * should be fine tuned in the future. */ mem = &wl->conf.mem_wl128x; else mem = &wl->conf.mem_wl127x; /* memory config */ /* FIXME: for now we always use mem_wl127x for AP, because it * doesn't support dynamic memory and we don't have the * optimal values for wl128x without dynamic memory yet */ mem_conf->num_stations = wl->conf.mem_wl127x.num_stations; mem_conf->rx_mem_block_num = wl->conf.mem_wl127x.rx_block_num; mem_conf->tx_min_mem_block_num = wl->conf.mem_wl127x.tx_min_block_num; mem_conf->num_ssid_profiles = wl->conf.mem_wl127x.ssid_profiles; mem_conf->num_stations = mem->num_stations; mem_conf->rx_mem_block_num = mem->rx_block_num; mem_conf->tx_min_mem_block_num = mem->tx_min_block_num; mem_conf->num_ssid_profiles = mem->ssid_profiles; mem_conf->total_tx_descriptors = cpu_to_le32(ACX_TX_DESCRIPTORS); ret = wl1271_cmd_configure(wl, ACX_MEM_CFG, mem_conf, Loading Loading @@ -1524,46 +1577,22 @@ int wl1271_acx_tsf_info(struct wl1271 *wl, u64 *mactime) return ret; } int wl1271_acx_ap_max_tx_retry(struct wl1271 *wl) int wl1271_acx_max_tx_retry(struct wl1271 *wl) { struct wl1271_acx_ap_max_tx_retry *acx = NULL; struct wl1271_acx_max_tx_retry *acx = NULL; int ret; wl1271_debug(DEBUG_ACX, "acx ap max tx retry"); wl1271_debug(DEBUG_ACX, "acx max tx retry"); acx = kzalloc(sizeof(*acx), GFP_KERNEL); if (!acx) return -ENOMEM; acx->max_tx_retry = cpu_to_le16(wl->conf.tx.max_tx_retries); acx->max_tx_retry = cpu_to_le16(wl->conf.tx.ap_max_tx_retries); ret = wl1271_cmd_configure(wl, ACX_MAX_TX_FAILURE, acx, sizeof(*acx)); if (ret < 0) { wl1271_warning("acx ap max tx retry failed: %d", ret); goto out; } out: kfree(acx); return ret; } int wl1271_acx_sta_max_tx_retry(struct wl1271 *wl) { struct wl1271_acx_sta_max_tx_retry *acx = NULL; int ret; wl1271_debug(DEBUG_ACX, "acx sta max tx retry"); acx = kzalloc(sizeof(*acx), GFP_KERNEL); if (!acx) return -ENOMEM; acx->max_tx_retry = wl->conf.tx.max_tx_retries; ret = wl1271_cmd_configure(wl, ACX_CONS_TX_FAILURE, acx, sizeof(*acx)); if (ret < 0) { wl1271_warning("acx sta max tx retry failed: %d", ret); wl1271_warning("acx max tx retry failed: %d", ret); goto out; } Loading Loading @@ -1626,3 +1655,68 @@ int wl1271_acx_set_inconnection_sta(struct wl1271 *wl, u8 *addr) kfree(acx); return ret; } int wl1271_acx_set_ap_beacon_filter(struct wl1271 *wl, bool enable) { struct acx_ap_beacon_filter *acx = NULL; int ret; wl1271_debug(DEBUG_ACX, "acx set ap beacon filter: %d", enable); acx = kzalloc(sizeof(*acx), GFP_KERNEL); if (!acx) return -ENOMEM; acx->enable = enable ? 1 : 0; ret = wl1271_cmd_configure(wl, ACX_AP_BEACON_FILTER_OPT, acx, sizeof(*acx)); if (ret < 0) { wl1271_warning("acx set ap beacon filter failed: %d", ret); goto out; } out: kfree(acx); return ret; } int wl1271_acx_fm_coex(struct wl1271 *wl) { struct wl1271_acx_fm_coex *acx; int ret; wl1271_debug(DEBUG_ACX, "acx fm coex setting"); acx = kzalloc(sizeof(*acx), GFP_KERNEL); if (!acx) { ret = -ENOMEM; goto out; } acx->enable = wl->conf.fm_coex.enable; acx->swallow_period = wl->conf.fm_coex.swallow_period; acx->n_divider_fref_set_1 = wl->conf.fm_coex.n_divider_fref_set_1; acx->n_divider_fref_set_2 = wl->conf.fm_coex.n_divider_fref_set_2; acx->m_divider_fref_set_1 = cpu_to_le16(wl->conf.fm_coex.m_divider_fref_set_1); acx->m_divider_fref_set_2 = cpu_to_le16(wl->conf.fm_coex.m_divider_fref_set_2); acx->coex_pll_stabilization_time = cpu_to_le32(wl->conf.fm_coex.coex_pll_stabilization_time); acx->ldo_stabilization_time = cpu_to_le16(wl->conf.fm_coex.ldo_stabilization_time); acx->fm_disturbed_band_margin = wl->conf.fm_coex.fm_disturbed_band_margin; acx->swallow_clk_diff = wl->conf.fm_coex.swallow_clk_diff; ret = wl1271_cmd_configure(wl, ACX_FM_COEX_CFG, acx, sizeof(*acx)); if (ret < 0) { wl1271_warning("acx fm coex setting failed: %d", ret); goto out; } out: kfree(acx); return ret; }
drivers/net/wireless/wl12xx/acx.h +87 −16 Original line number Diff line number Diff line Loading @@ -303,7 +303,6 @@ struct acx_beacon_filter_option { struct acx_header header; u8 enable; /* * The number of beacons without the unicast TIM * bit set that the firmware buffers before Loading Loading @@ -370,14 +369,23 @@ struct acx_bt_wlan_coex { u8 pad[3]; } __packed; struct acx_bt_wlan_coex_param { struct acx_sta_bt_wlan_coex_param { struct acx_header header; __le32 params[CONF_SG_PARAMS_MAX]; __le32 params[CONF_SG_STA_PARAMS_MAX]; u8 param_idx; u8 padding[3]; } __packed; struct acx_ap_bt_wlan_coex_param { struct acx_header header; __le32 params[CONF_SG_AP_PARAMS_MAX]; u8 param_idx; u8 padding[3]; } __packed; struct acx_dco_itrim_params { struct acx_header header; Loading Loading @@ -1145,7 +1153,7 @@ struct wl1271_acx_fw_tsf_information { u8 padding[3]; } __packed; struct wl1271_acx_ap_max_tx_retry { struct wl1271_acx_max_tx_retry { struct acx_header header; /* Loading @@ -1156,13 +1164,6 @@ struct wl1271_acx_ap_max_tx_retry { u8 padding_1[2]; } __packed; struct wl1271_acx_sta_max_tx_retry { struct acx_header header; u8 max_tx_retry; u8 padding_1[3]; } __packed; struct wl1271_acx_config_ps { struct acx_header header; Loading @@ -1179,6 +1180,72 @@ struct wl1271_acx_inconnection_sta { u8 padding1[2]; } __packed; struct acx_ap_beacon_filter { struct acx_header header; u8 enable; u8 pad[3]; } __packed; /* * ACX_FM_COEX_CFG * set the FM co-existence parameters. */ struct wl1271_acx_fm_coex { struct acx_header header; /* enable(1) / disable(0) the FM Coex feature */ u8 enable; /* * Swallow period used in COEX PLL swallowing mechanism. * 0xFF = use FW default */ u8 swallow_period; /* * The N divider used in COEX PLL swallowing mechanism for Fref of * 38.4/19.2 Mhz. 0xFF = use FW default */ u8 n_divider_fref_set_1; /* * The N divider used in COEX PLL swallowing mechanism for Fref of * 26/52 Mhz. 0xFF = use FW default */ u8 n_divider_fref_set_2; /* * The M divider used in COEX PLL swallowing mechanism for Fref of * 38.4/19.2 Mhz. 0xFFFF = use FW default */ __le16 m_divider_fref_set_1; /* * The M divider used in COEX PLL swallowing mechanism for Fref of * 26/52 Mhz. 0xFFFF = use FW default */ __le16 m_divider_fref_set_2; /* * The time duration in uSec required for COEX PLL to stabilize. * 0xFFFFFFFF = use FW default */ __le32 coex_pll_stabilization_time; /* * The time duration in uSec required for LDO to stabilize. * 0xFFFFFFFF = use FW default */ __le16 ldo_stabilization_time; /* * The disturbed frequency band margin around the disturbed frequency * center (single sided). * For example, if 2 is configured, the following channels will be * considered disturbed channel: * 80 +- 0.1 MHz, 91 +- 0.1 MHz, 98 +- 0.1 MHz, 102 +- 0.1 MH * 0xFF = use FW default */ u8 fm_disturbed_band_margin; /* * The swallow clock difference of the swallowing mechanism. * 0xFF = use FW default */ u8 swallow_clk_diff; } __packed; enum { ACX_WAKE_UP_CONDITIONS = 0x0002, ACX_MEM_CFG = 0x0003, Loading @@ -1197,6 +1264,7 @@ enum { ACX_TID_CFG = 0x001A, ACX_PS_RX_STREAMING = 0x001B, ACX_BEACON_FILTER_OPT = 0x001F, ACX_AP_BEACON_FILTER_OPT = 0x0020, ACX_NOISE_HIST = 0x0021, ACX_HDK_VERSION = 0x0022, /* ??? */ ACX_PD_THRESHOLD = 0x0023, Loading @@ -1208,6 +1276,7 @@ enum { ACX_BCN_DTIM_OPTIONS = 0x0031, ACX_SG_ENABLE = 0x0032, ACX_SG_CFG = 0x0033, ACX_FM_COEX_CFG = 0x0034, ACX_BEACON_FILTER_TABLE = 0x0038, ACX_ARP_IP_FILTER = 0x0039, ACX_ROAMING_STATISTICS_TBL = 0x003B, Loading Loading @@ -1264,13 +1333,14 @@ 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, u16 rts_threshold); int wl1271_acx_rts_threshold(struct wl1271 *wl, 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_sg_enable(struct wl1271 *wl, bool enable); int wl1271_acx_sg_cfg(struct wl1271 *wl); int wl1271_acx_sta_sg_cfg(struct wl1271 *wl); int wl1271_acx_ap_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); Loading @@ -1287,7 +1357,7 @@ int wl1271_acx_ac_cfg(struct wl1271 *wl, u8 ac, u8 cw_min, u16 cw_max, int wl1271_acx_tid_cfg(struct wl1271 *wl, 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, u16 frag_threshold); int wl1271_acx_frag_threshold(struct wl1271 *wl, u32 frag_threshold); int wl1271_acx_tx_config_options(struct wl1271 *wl); int wl1271_acx_ap_mem_cfg(struct wl1271 *wl); int wl1271_acx_sta_mem_cfg(struct wl1271 *wl); Loading @@ -1314,9 +1384,10 @@ int wl1271_acx_set_ba_session(struct wl1271 *wl, int wl1271_acx_set_ba_receiver_session(struct wl1271 *wl, u8 tid_index, u16 ssn, bool enable); int wl1271_acx_tsf_info(struct wl1271 *wl, u64 *mactime); int wl1271_acx_ap_max_tx_retry(struct wl1271 *wl); int wl1271_acx_sta_max_tx_retry(struct wl1271 *wl); int wl1271_acx_max_tx_retry(struct wl1271 *wl); int wl1271_acx_config_ps(struct wl1271 *wl); int wl1271_acx_set_inconnection_sta(struct wl1271 *wl, u8 *addr); int wl1271_acx_set_ap_beacon_filter(struct wl1271 *wl, bool enable); int wl1271_acx_fm_coex(struct wl1271 *wl); #endif /* __WL1271_ACX_H__ */
drivers/net/wireless/wl12xx/boot.c +2 −4 Original line number Diff line number Diff line Loading @@ -478,12 +478,10 @@ static int wl1271_boot_run_firmware(struct wl1271 *wl) DISCONNECT_EVENT_COMPLETE_ID | RSSI_SNR_TRIGGER_0_EVENT_ID | PSPOLL_DELIVERY_FAILURE_EVENT_ID | SOFT_GEMINI_SENSE_EVENT_ID | MAX_TX_RETRY_EVENT_ID; SOFT_GEMINI_SENSE_EVENT_ID; if (wl->bss_type == BSS_TYPE_AP_BSS) wl->event_mask |= STA_REMOVE_COMPLETE_EVENT_ID | INACTIVE_STA_EVENT_ID; wl->event_mask |= STA_REMOVE_COMPLETE_EVENT_ID; else wl->event_mask |= DUMMY_PACKET_EVENT_ID; Loading
drivers/net/wireless/wl12xx/cmd.c +14 −4 Original line number Diff line number Diff line Loading @@ -76,7 +76,7 @@ int wl1271_cmd_send(struct wl1271 *wl, u16 id, void *buf, size_t len, if (time_after(jiffies, timeout)) { wl1271_error("command complete timeout"); ret = -ETIMEDOUT; goto out; goto fail; } poll_count++; Loading @@ -96,14 +96,17 @@ int wl1271_cmd_send(struct wl1271 *wl, u16 id, void *buf, size_t len, status = le16_to_cpu(cmd->status); if (status != CMD_STATUS_SUCCESS) { wl1271_error("command execute failure %d", status); ieee80211_queue_work(wl->hw, &wl->recovery_work); ret = -EIO; goto fail; } wl1271_write32(wl, ACX_REG_INTERRUPT_ACK, WL1271_ACX_INTR_CMD_COMPLETE); return 0; out: fail: WARN_ON(1); ieee80211_queue_work(wl->hw, &wl->recovery_work); return ret; } Loading @@ -129,6 +132,9 @@ int wl1271_cmd_general_parms(struct wl1271 *wl) if (gp->tx_bip_fem_auto_detect) answer = true; /* Override the REF CLK from the NVS with the one from platform data */ gen_parms->general_params.ref_clock = wl->ref_clock; ret = wl1271_cmd_test(wl, gen_parms, sizeof(*gen_parms), answer); if (ret < 0) { wl1271_warning("CMD_INI_FILE_GENERAL_PARAM failed"); Loading Loading @@ -168,6 +174,10 @@ int wl128x_cmd_general_parms(struct wl1271 *wl) if (gp->tx_bip_fem_auto_detect) answer = true; /* Replace REF and TCXO CLKs with the ones from platform data */ gen_parms->general_params.ref_clock = wl->ref_clock; gen_parms->general_params.tcxo_ref_clock = wl->tcxo_clock; ret = wl1271_cmd_test(wl, gen_parms, sizeof(*gen_parms), answer); if (ret < 0) { wl1271_warning("CMD_INI_FILE_GENERAL_PARAM failed"); Loading Loading @@ -1070,7 +1080,7 @@ int wl1271_cmd_start_bss(struct wl1271 *wl) memcpy(cmd->bssid, bss_conf->bssid, ETH_ALEN); cmd->aging_period = cpu_to_le16(wl->conf.tx.ap_aging_period); cmd->aging_period = cpu_to_le16(WL1271_AP_DEF_INACTIV_SEC); cmd->bss_index = WL1271_AP_BSS_INDEX; cmd->global_hlid = WL1271_AP_GLOBAL_HLID; cmd->broadcast_hlid = WL1271_AP_BROADCAST_HLID; Loading
drivers/net/wireless/wl12xx/conf.h +62 −28 Original line number Diff line number Diff line Loading @@ -396,12 +396,43 @@ enum { CONF_SG_TEMP_PARAM_3, CONF_SG_TEMP_PARAM_4, CONF_SG_TEMP_PARAM_5, CONF_SG_PARAMS_MAX, /* * AP beacon miss * * Range: 0 - 255 */ CONF_SG_AP_BEACON_MISS_TX, /* * AP RX window length * * Range: 0 - 50 */ CONF_SG_RX_WINDOW_LENGTH, /* * AP connection protection time * * Range: 0 - 5000 */ CONF_SG_AP_CONNECTION_PROTECTION_TIME, CONF_SG_TEMP_PARAM_6, CONF_SG_TEMP_PARAM_7, CONF_SG_TEMP_PARAM_8, CONF_SG_TEMP_PARAM_9, CONF_SG_TEMP_PARAM_10, CONF_SG_STA_PARAMS_MAX = CONF_SG_TEMP_PARAM_5 + 1, CONF_SG_AP_PARAMS_MAX = CONF_SG_TEMP_PARAM_10 + 1, CONF_SG_PARAMS_ALL = 0xff }; struct conf_sg_settings { u32 params[CONF_SG_PARAMS_MAX]; u32 sta_params[CONF_SG_STA_PARAMS_MAX]; u32 ap_params[CONF_SG_AP_PARAMS_MAX]; u8 state; }; Loading Loading @@ -509,6 +540,12 @@ struct conf_rx_settings { CONF_HW_BIT_RATE_36MBPS | CONF_HW_BIT_RATE_48MBPS | \ CONF_HW_BIT_RATE_54MBPS) #define CONF_TX_OFDM_RATES (CONF_HW_BIT_RATE_6MBPS | \ CONF_HW_BIT_RATE_12MBPS | CONF_HW_BIT_RATE_24MBPS | \ CONF_HW_BIT_RATE_36MBPS | CONF_HW_BIT_RATE_48MBPS | \ CONF_HW_BIT_RATE_54MBPS) /* * Default rates for management traffic when operating in AP mode. This * should be configured according to the basic rate set of the AP Loading @@ -516,6 +553,13 @@ struct conf_rx_settings { #define CONF_TX_AP_DEFAULT_MGMT_RATES (CONF_HW_BIT_RATE_1MBPS | \ CONF_HW_BIT_RATE_2MBPS | CONF_HW_BIT_RATE_5_5MBPS) /* * Default rates for working as IBSS. use 11b rates */ #define CONF_TX_IBSS_DEFAULT_RATES (CONF_HW_BIT_RATE_1MBPS | \ CONF_HW_BIT_RATE_2MBPS | CONF_HW_BIT_RATE_5_5MBPS | \ CONF_HW_BIT_RATE_11MBPS); struct conf_tx_rate_class { /* Loading Loading @@ -667,34 +711,10 @@ struct conf_tx_settings { struct conf_tx_ac_category ac_conf[CONF_TX_MAX_AC_COUNT]; /* * Configuration for rate classes in AP-mode. These rate classes * are for the AC TX queues */ struct conf_tx_rate_class ap_rc_conf[CONF_TX_MAX_AC_COUNT]; /* * Management TX rate class for AP-mode. */ struct conf_tx_rate_class ap_mgmt_conf; /* * Broadcast TX rate class for AP-mode. */ struct conf_tx_rate_class ap_bcst_conf; /* * Allow this number of TX retries to a connected station/AP before an * AP-mode - allow this number of TX retries to a station before an * event is triggered from FW. * In AP-mode the hlids of unreachable stations are given in the * "sta_tx_retry_exceeded" member in the event mailbox. */ u8 max_tx_retries; /* * AP-mode - after this number of seconds a connected station is * considered inactive. */ u16 ap_aging_period; u16 ap_max_tx_retries; /* * Configuration for TID parameters. Loading Loading @@ -1192,6 +1212,19 @@ struct conf_memory_settings { u8 tx_min; }; struct conf_fm_coex { u8 enable; u8 swallow_period; u8 n_divider_fref_set_1; u8 n_divider_fref_set_2; u16 m_divider_fref_set_1; u16 m_divider_fref_set_2; u32 coex_pll_stabilization_time; u16 ldo_stabilization_time; u8 fm_disturbed_band_margin; u8 swallow_clk_diff; }; struct conf_drv_settings { struct conf_sg_settings sg; struct conf_rx_settings rx; Loading @@ -1205,6 +1238,7 @@ struct conf_drv_settings { struct conf_ht_setting ht; struct conf_memory_settings mem_wl127x; struct conf_memory_settings mem_wl128x; struct conf_fm_coex fm_coex; u8 hci_io_ds; }; Loading