Commit 890641b2 authored by John W. Linville's avatar John W. Linville
Browse files
parents eaef6a93 25eaea30
Loading
Loading
Loading
Loading
+142 −48
Original line number Diff line number Diff line
@@ -325,12 +325,19 @@ out:
	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) {
@@ -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) {
@@ -540,13 +547,43 @@ out:
	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) {
@@ -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));
@@ -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) {
@@ -898,12 +936,19 @@ out:
	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);

@@ -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);
@@ -954,6 +999,7 @@ out:
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");
@@ -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,
@@ -1524,46 +1577,22 @@ out:
	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;
	}

@@ -1626,3 +1655,68 @@ out:
	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;
}
+87 −16
Original line number Diff line number Diff line
@@ -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
@@ -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;

@@ -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;

	/*
@@ -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;

@@ -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,
@@ -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,
@@ -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,
@@ -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);
@@ -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);
@@ -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__ */
+2 −4
Original line number Diff line number Diff line
@@ -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;

+14 −4
Original line number Diff line number Diff line
@@ -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++;
@@ -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;
}

@@ -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");
@@ -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");
@@ -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;
+62 −28
Original line number Diff line number Diff line
@@ -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;
};

@@ -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
@@ -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 {

	/*
@@ -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.
@@ -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;
@@ -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