Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 51f2be24 authored by Juuso Oikarinen's avatar Juuso Oikarinen Committed by John W. Linville
Browse files

wl1271: Add config structure for connection management parameters



Add a configuration structure for connection management parameters, and
set default configuration values there.

Signed-off-by: default avatarJuuso Oikarinen <juuso.oikarinen@nokia.com>
Reviewed-by: default avatarLuciano Coelho <luciano.coelho@nokia.com>
Signed-off-by: default avatarLuciano Coelho <luciano.coelho@nokia.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 45b531a8
Loading
Loading
Loading
Loading
+0 −1
Original line number Original line Diff line number Diff line
@@ -323,7 +323,6 @@ struct wl1271 {
	u8 bss_type;
	u8 bss_type;
	u8 ssid[IW_ESSID_MAX_SIZE + 1];
	u8 ssid[IW_ESSID_MAX_SIZE + 1];
	u8 ssid_len;
	u8 ssid_len;
	u8 listen_int;
	int channel;
	int channel;


	struct wl1271_acx_mem_map *target_mem_map;
	struct wl1271_acx_mem_map *target_mem_map;
+47 −16
Original line number Original line Diff line number Diff line
@@ -34,8 +34,7 @@
#include "wl1271_spi.h"
#include "wl1271_spi.h"
#include "wl1271_ps.h"
#include "wl1271_ps.h"


int wl1271_acx_wake_up_conditions(struct wl1271 *wl, u8 wake_up_event,
int wl1271_acx_wake_up_conditions(struct wl1271 *wl)
				  u8 listen_interval)
{
{
	struct acx_wake_up_condition *wake_up;
	struct acx_wake_up_condition *wake_up;
	int ret;
	int ret;
@@ -48,8 +47,8 @@ int wl1271_acx_wake_up_conditions(struct wl1271 *wl, u8 wake_up_event,
		goto out;
		goto out;
	}
	}


	wake_up->wake_up_event = wake_up_event;
	wake_up->wake_up_event = wl->conf.conn.wake_up_event;
	wake_up->listen_interval = listen_interval;
	wake_up->listen_interval = wl->conf.conn.listen_interval;


	ret = wl1271_cmd_configure(wl, ACX_WAKE_UP_CONDITIONS,
	ret = wl1271_cmd_configure(wl, ACX_WAKE_UP_CONDITIONS,
				   wake_up, sizeof(*wake_up));
				   wake_up, sizeof(*wake_up));
@@ -393,11 +392,15 @@ int wl1271_acx_rts_threshold(struct wl1271 *wl, u16 rts_threshold)


int wl1271_acx_beacon_filter_opt(struct wl1271 *wl, bool enable_filter)
int wl1271_acx_beacon_filter_opt(struct wl1271 *wl, bool enable_filter)
{
{
	struct acx_beacon_filter_option *beacon_filter;
	struct acx_beacon_filter_option *beacon_filter = NULL;
	int ret;
	int ret = 0;


	wl1271_debug(DEBUG_ACX, "acx beacon filter opt");
	wl1271_debug(DEBUG_ACX, "acx beacon filter opt");


	if (enable_filter &&
	    wl->conf.conn.bcn_filt_mode == CONF_BCN_FILT_MODE_DISABLED)
		goto out;

	beacon_filter = kzalloc(sizeof(*beacon_filter), GFP_KERNEL);
	beacon_filter = kzalloc(sizeof(*beacon_filter), GFP_KERNEL);
	if (!beacon_filter) {
	if (!beacon_filter) {
		ret = -ENOMEM;
		ret = -ENOMEM;
@@ -405,6 +408,11 @@ int wl1271_acx_beacon_filter_opt(struct wl1271 *wl, bool enable_filter)
	}
	}


	beacon_filter->enable = enable_filter;
	beacon_filter->enable = enable_filter;

	/*
	 * When set to zero, and the filter is enabled, beacons
	 * without the unicast TIM bit set are dropped.
	 */
	beacon_filter->max_num_beacons = 0;
	beacon_filter->max_num_beacons = 0;


	ret = wl1271_cmd_configure(wl, ACX_BEACON_FILTER_OPT,
	ret = wl1271_cmd_configure(wl, ACX_BEACON_FILTER_OPT,
@@ -422,8 +430,9 @@ int wl1271_acx_beacon_filter_opt(struct wl1271 *wl, bool enable_filter)
int wl1271_acx_beacon_filter_table(struct wl1271 *wl)
int wl1271_acx_beacon_filter_table(struct wl1271 *wl)
{
{
	struct acx_beacon_filter_ie_table *ie_table;
	struct acx_beacon_filter_ie_table *ie_table;
	int idx = 0;
	int i, idx = 0;
	int ret;
	int ret;
	bool vendor_spec = false;


	wl1271_debug(DEBUG_ACX, "acx beacon filter table");
	wl1271_debug(DEBUG_ACX, "acx beacon filter table");


@@ -434,9 +443,31 @@ int wl1271_acx_beacon_filter_table(struct wl1271 *wl)
	}
	}


	/* configure default beacon pass-through rules */
	/* configure default beacon pass-through rules */
	ie_table->num_ie = 1;
	ie_table->num_ie = 0;
	ie_table->table[idx++] = BEACON_FILTER_IE_ID_CHANNEL_SWITCH_ANN;
	for (i = 0; i < wl->conf.conn.bcn_filt_ie_count; i++) {
	ie_table->table[idx++] = BEACON_RULE_PASS_ON_APPEARANCE;
		struct conf_bcn_filt_rule *r = &(wl->conf.conn.bcn_filt_ie[i]);
		ie_table->table[idx++] = r->ie;
		ie_table->table[idx++] = r->rule;

		if (r->ie == WLAN_EID_VENDOR_SPECIFIC) {
			/* only one vendor specific ie allowed */
			if (vendor_spec)
				continue;

			/* for vendor specific rules configure the
			   additional fields */
			memcpy(&(ie_table->table[idx]), r->oui,
			       CONF_BCN_IE_OUI_LEN);
			idx += CONF_BCN_IE_OUI_LEN;
			ie_table->table[idx++] = r->type;
			memcpy(&(ie_table->table[idx]), r->version,
			       CONF_BCN_IE_VER_LEN);
			idx += CONF_BCN_IE_VER_LEN;
			vendor_spec = true;
		}

		ie_table->num_ie++;
	}


	ret = wl1271_cmd_configure(wl, ACX_BEACON_FILTER_TABLE,
	ret = wl1271_cmd_configure(wl, ACX_BEACON_FILTER_TABLE,
				   ie_table, sizeof(*ie_table));
				   ie_table, sizeof(*ie_table));
@@ -463,8 +494,8 @@ int wl1271_acx_conn_monit_params(struct wl1271 *wl)
		goto out;
		goto out;
	}
	}


	acx->synch_fail_thold = SYNCH_FAIL_DEFAULT_THRESHOLD;
	acx->synch_fail_thold = wl->conf.conn.synch_fail_thold;
	acx->bss_lose_timeout = NO_BEACON_DEFAULT_TIMEOUT;
	acx->bss_lose_timeout = wl->conf.conn.bss_lose_timeout;


	ret = wl1271_cmd_configure(wl, ACX_CONN_MONIT_PARAMS,
	ret = wl1271_cmd_configure(wl, ACX_CONN_MONIT_PARAMS,
				   acx, sizeof(*acx));
				   acx, sizeof(*acx));
@@ -585,10 +616,10 @@ int wl1271_acx_bcn_dtim_options(struct wl1271 *wl)
		goto out;
		goto out;
	}
	}


	bb->beacon_rx_timeout = BCN_RX_TIMEOUT_DEF_VALUE;
	bb->beacon_rx_timeout = wl->conf.conn.beacon_rx_timeout;
	bb->broadcast_timeout = BROADCAST_RX_TIMEOUT_DEF_VALUE;
	bb->broadcast_timeout = wl->conf.conn.broadcast_timeout;
	bb->rx_broadcast_in_ps = RX_BROADCAST_IN_PS_DEF_VALUE;
	bb->rx_broadcast_in_ps = wl->conf.conn.rx_broadcast_in_ps;
	bb->ps_poll_threshold = CONSECUTIVE_PS_POLL_FAILURE_DEF;
	bb->ps_poll_threshold = wl->conf.conn.ps_poll_threshold;


	ret = wl1271_cmd_configure(wl, ACX_BCN_DTIM_OPTIONS, bb, sizeof(*bb));
	ret = wl1271_cmd_configure(wl, ACX_BCN_DTIM_OPTIONS, bb, sizeof(*bb));
	if (ret < 0) {
	if (ret < 0) {
+1 −23
Original line number Original line Diff line number Diff line
@@ -377,11 +377,6 @@ struct acx_beacon_filter_option {
			   (BEACON_FILTER_TABLE_MAX_VENDOR_SPECIFIC_IE_NUM * \
			   (BEACON_FILTER_TABLE_MAX_VENDOR_SPECIFIC_IE_NUM * \
			    BEACON_FILTER_TABLE_EXTRA_VENDOR_SPECIFIC_IE_SIZE))
			    BEACON_FILTER_TABLE_EXTRA_VENDOR_SPECIFIC_IE_SIZE))


#define BEACON_RULE_PASS_ON_CHANGE                     BIT(0)
#define BEACON_RULE_PASS_ON_APPEARANCE                 BIT(1)

#define BEACON_FILTER_IE_ID_CHANNEL_SWITCH_ANN         (37)

struct acx_beacon_filter_ie_table {
struct acx_beacon_filter_ie_table {
	struct acx_header header;
	struct acx_header header;


@@ -390,9 +385,6 @@ struct acx_beacon_filter_ie_table {
	u8 pad[3];
	u8 pad[3];
} __attribute__ ((packed));
} __attribute__ ((packed));


#define SYNCH_FAIL_DEFAULT_THRESHOLD    5     /* number of beacons */
#define NO_BEACON_DEFAULT_TIMEOUT       (100) /* TU */

struct acx_conn_monit_params {
struct acx_conn_monit_params {
       struct acx_header header;
       struct acx_header header;


@@ -497,11 +489,6 @@ struct acx_energy_detection {
	u8 pad;
	u8 pad;
} __attribute__ ((packed));
} __attribute__ ((packed));


#define BCN_RX_TIMEOUT_DEF_VALUE        10000
#define BROADCAST_RX_TIMEOUT_DEF_VALUE  20000
#define RX_BROADCAST_IN_PS_DEF_VALUE    1
#define CONSECUTIVE_PS_POLL_FAILURE_DEF 4

struct acx_beacon_broadcast {
struct acx_beacon_broadcast {
	struct acx_header header;
	struct acx_header header;


@@ -575,14 +562,6 @@ struct acx_current_tx_power {
	u8  padding[3];
	u8  padding[3];
} __attribute__ ((packed));
} __attribute__ ((packed));


enum acx_wake_up_event {
	WAKE_UP_EVENT_BEACON_BITMAP	= 0x01, /* Wake on every Beacon*/
	WAKE_UP_EVENT_DTIM_BITMAP	= 0x02,	/* Wake on every DTIM*/
	WAKE_UP_EVENT_N_DTIM_BITMAP	= 0x04, /* Wake on every Nth DTIM */
	WAKE_UP_EVENT_N_BEACONS_BITMAP	= 0x08, /* Wake on every Nth Beacon */
	WAKE_UP_EVENT_BITS_MASK		= 0x0F
};

struct acx_wake_up_condition {
struct acx_wake_up_condition {
	struct acx_header header;
	struct acx_header header;


@@ -1038,8 +1017,7 @@ enum {
};
};




int wl1271_acx_wake_up_conditions(struct wl1271 *wl, u8 wake_up_event,
int wl1271_acx_wake_up_conditions(struct wl1271 *wl);
				  u8 listen_interval);
int wl1271_acx_sleep_auth(struct wl1271 *wl, u8 sleep_auth);
int wl1271_acx_sleep_auth(struct wl1271 *wl, u8 sleep_auth);
int wl1271_acx_fw_version(struct wl1271 *wl, char *buf, size_t len);
int wl1271_acx_fw_version(struct wl1271 *wl, char *buf, size_t len);
int wl1271_acx_tx_power(struct wl1271 *wl, int power);
int wl1271_acx_tx_power(struct wl1271 *wl, int power);
+1 −2
Original line number Original line Diff line number Diff line
@@ -436,8 +436,7 @@ int wl1271_cmd_ps_mode(struct wl1271 *wl, u8 ps_mode)
	int ret = 0;
	int ret = 0;


	/* FIXME: this should be in ps.c */
	/* FIXME: this should be in ps.c */
	ret = wl1271_acx_wake_up_conditions(wl, WAKE_UP_EVENT_DTIM_BITMAP,
	ret = wl1271_acx_wake_up_conditions(wl);
					    wl->listen_int);
	if (ret < 0) {
	if (ret < 0) {
		wl1271_error("couldn't set wake up conditions");
		wl1271_error("couldn't set wake up conditions");
		goto out;
		goto out;
+251 −0
Original line number Original line Diff line number Diff line
@@ -441,10 +441,261 @@ struct conf_tx_settings {


};
};


enum {
	CONF_WAKE_UP_EVENT_BEACON    = 0x01, /* Wake on every Beacon*/
	CONF_WAKE_UP_EVENT_DTIM      = 0x02, /* Wake on every DTIM*/
	CONF_WAKE_UP_EVENT_N_DTIM    = 0x04, /* Wake every Nth DTIM */
	CONF_WAKE_UP_EVENT_N_BEACONS = 0x08, /* Wake every Nth beacon */
	CONF_WAKE_UP_EVENT_BITS_MASK = 0x0F
};

#define CONF_MAX_BCN_FILT_IE_COUNT 32

#define CONF_BCN_RULE_PASS_ON_CHANGE         BIT(0)
#define CONF_BCN_RULE_PASS_ON_APPEARANCE     BIT(1)

#define CONF_BCN_IE_OUI_LEN    3
#define CONF_BCN_IE_VER_LEN    2

struct conf_bcn_filt_rule {
	/*
	 * IE number to which to associate a rule.
	 *
	 * Range: u8
	 */
	u8 ie;

	/*
	 * Rule to associate with the specific ie.
	 *
	 * Range: CONF_BCN_RULE_PASS_ON_*
	 */
	u8 rule;

	/*
	 * OUI for the vendor specifie IE (221)
	 */
	u8 oui[CONF_BCN_IE_OUI_LEN];

	/*
	 * Type for the vendor specifie IE (221)
	 */
	u8 type;

	/*
	 * Version for the vendor specifie IE (221)
	 */
	u8 version[CONF_BCN_IE_VER_LEN];
};

#define CONF_MAX_RSSI_SNR_TRIGGERS 8

enum {
	CONF_TRIG_METRIC_RSSI_BEACON = 0,
	CONF_TRIG_METRIC_RSSI_DATA,
	CONF_TRIG_METRIC_SNR_BEACON,
	CONF_TRIG_METRIC_SNR_DATA
};

enum {
	CONF_TRIG_EVENT_TYPE_LEVEL = 0,
	CONF_TRIG_EVENT_TYPE_EDGE
};

enum {
	CONF_TRIG_EVENT_DIR_LOW = 0,
	CONF_TRIG_EVENT_DIR_HIGH,
	CONF_TRIG_EVENT_DIR_BIDIR
};


struct conf_sig_trigger {
	/*
	 * The RSSI / SNR threshold value.
	 *
	 * FIXME: what is the range?
	 */
	s16 threshold;

	/*
	 * Minimum delay between two trigger events for this trigger in ms.
	 *
	 * Range: 0 - 60000
	 */
	u16 pacing;

	/*
	 * The measurement data source for this trigger.
	 *
	 * Range: CONF_TRIG_METRIC_*
	 */
	u8 metric;

	/*
	 * The trigger type of this trigger.
	 *
	 * Range: CONF_TRIG_EVENT_TYPE_*
	 */
	u8 type;

	/*
	 * The direction of the trigger.
	 *
	 * Range: CONF_TRIG_EVENT_DIR_*
	 */
	u8 direction;

	/*
	 * Hysteresis range of the trigger around the threshold (in dB)
	 *
	 * Range: u8
	 */
	u8 hysteresis;

	/*
	 * Index of the trigger rule.
	 *
	 * Range: 0 - CONF_MAX_RSSI_SNR_TRIGGERS-1
	 */
	u8 index;

	/*
	 * Enable / disable this rule (to use for clearing rules.)
	 *
	 * Range: 1 - Enabled, 2 - Not enabled
	 */
	u8 enable;
};

struct conf_sig_weights {

	/*
	 * RSSI from beacons average weight.
	 *
	 * Range: u8
	 */
	u8 rssi_bcn_avg_weight;

	/*
	 * RSSI from data average weight.
	 *
	 * Range: u8
	 */
	u8 rssi_pkt_avg_weight;

	/*
	 * SNR from beacons average weight.
	 *
	 * Range: u8
	 */
	u8 snr_bcn_avg_weight;

	/*
	 * SNR from data average weight.
	 *
	 * Range: u8
	 */
	u8 snr_pkt_avg_weight;
};

enum conf_bcn_filt_mode {
	CONF_BCN_FILT_MODE_DISABLED = 0,
	CONF_BCN_FILT_MODE_ENABLED = 1
};

struct conf_conn_settings {
	/*
	 * Firmware wakeup conditions configuration. The host may set only
	 * one bit.
	 *
	 * Range: CONF_WAKE_UP_EVENT_*
	 */
	u8 wake_up_event;

	/*
	 * Listen interval for beacons or Dtims.
	 *
	 * Range: 0 for beacon and Dtim wakeup
	 *        1-10 for x Dtims
	 *        1-255 for x beacons
	 */
	u8 listen_interval;

	/*
	 * Enable or disable the beacon filtering.
	 *
	 * Range: CONF_BCN_FILT_MODE_*
	 */
	enum conf_bcn_filt_mode bcn_filt_mode;

	/*
	 * Configure Beacon filter pass-thru rules.
	 */
	u8 bcn_filt_ie_count;
	struct conf_bcn_filt_rule bcn_filt_ie[CONF_MAX_BCN_FILT_IE_COUNT];

	/*
	 * The number of consequtive beacons to lose, before the firmware
	 * becomes out of synch.
	 *
	 * Range: u32
	 */
	u32 synch_fail_thold;

	/*
	 * After out-of-synch, the number of TU's to wait without a further
	 * received beacon (or probe response) before issuing the BSS_EVENT_LOSE
	 * event.
	 *
	 * Range: u32
	 */
	u32 bss_lose_timeout;

	/*
	 * Beacon receive timeout.
	 *
	 * Range: u32
	 */
	u32 beacon_rx_timeout;

	/*
	 * Broadcast receive timeout.
	 *
	 * Range: u32
	 */
	u32 broadcast_timeout;

	/*
	 * Enable/disable reception of broadcast packets in power save mode
	 *
	 * Range: 1 - enable, 0 - disable
	 */
	u8 rx_broadcast_in_ps;

	/*
	 * Consequtive PS Poll failures before sending event to driver
	 *
	 * Range: u8
	 */
	u8 ps_poll_threshold;

	/*
	 * Configuration of signal (rssi/snr) triggers.
	 */
	u8 sig_trigger_count;
	struct conf_sig_trigger sig_trigger[CONF_MAX_RSSI_SNR_TRIGGERS];

	/*
	 * Configuration of signal average weights.
	 */
	struct conf_sig_weights sig_weights;
};

struct conf_drv_settings {
struct conf_drv_settings {
	struct conf_sg_settings sg;
	struct conf_sg_settings sg;
	struct conf_rx_settings rx;
	struct conf_rx_settings rx;
	struct conf_tx_settings tx;
	struct conf_tx_settings tx;
	struct conf_conn_settings conn;
};
};


#endif
#endif
Loading