Commit 8793f9bb authored by Juuso Oikarinen's avatar Juuso Oikarinen Committed by John W. Linville

wl1271: Add config structure for RX path parameters

Add a configuration structure for RX path 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 2b60100b
...@@ -198,7 +198,7 @@ int wl1271_acx_mem_map(struct wl1271 *wl, struct acx_header *mem_map, ...@@ -198,7 +198,7 @@ int wl1271_acx_mem_map(struct wl1271 *wl, struct acx_header *mem_map,
return 0; return 0;
} }
int wl1271_acx_rx_msdu_life_time(struct wl1271 *wl, u32 life_time) int wl1271_acx_rx_msdu_life_time(struct wl1271 *wl)
{ {
struct acx_rx_msdu_lifetime *acx; struct acx_rx_msdu_lifetime *acx;
int ret; int ret;
...@@ -211,7 +211,7 @@ int wl1271_acx_rx_msdu_life_time(struct wl1271 *wl, u32 life_time) ...@@ -211,7 +211,7 @@ int wl1271_acx_rx_msdu_life_time(struct wl1271 *wl, u32 life_time)
goto out; goto out;
} }
acx->lifetime = life_time; acx->lifetime = wl->conf.rx.rx_msdu_life_time;
ret = wl1271_cmd_configure(wl, DOT11_RX_MSDU_LIFE_TIME, ret = wl1271_cmd_configure(wl, DOT11_RX_MSDU_LIFE_TIME,
acx, sizeof(*acx)); acx, sizeof(*acx));
if (ret < 0) { if (ret < 0) {
...@@ -265,7 +265,7 @@ int wl1271_acx_pd_threshold(struct wl1271 *wl) ...@@ -265,7 +265,7 @@ int wl1271_acx_pd_threshold(struct wl1271 *wl)
goto out; goto out;
} }
/* FIXME: threshold value not set */ pd->threshold = wl->conf.rx.packet_detection_threshold;
ret = wl1271_cmd_configure(wl, ACX_PD_THRESHOLD, pd, sizeof(*pd)); ret = wl1271_cmd_configure(wl, ACX_PD_THRESHOLD, pd, sizeof(*pd));
if (ret < 0) { if (ret < 0) {
...@@ -349,8 +349,8 @@ int wl1271_acx_service_period_timeout(struct wl1271 *wl) ...@@ -349,8 +349,8 @@ int wl1271_acx_service_period_timeout(struct wl1271 *wl)
wl1271_debug(DEBUG_ACX, "acx service period timeout"); wl1271_debug(DEBUG_ACX, "acx service period timeout");
rx_timeout->ps_poll_timeout = RX_TIMEOUT_PS_POLL_DEF; rx_timeout->ps_poll_timeout = wl->conf.rx.ps_poll_timeout;
rx_timeout->upsd_timeout = RX_TIMEOUT_UPSD_DEF; rx_timeout->upsd_timeout = wl->conf.rx.upsd_timeout;
ret = wl1271_cmd_configure(wl, ACX_SERVICE_PERIOD_TIMEOUT, ret = wl1271_cmd_configure(wl, ACX_SERVICE_PERIOD_TIMEOUT,
rx_timeout, sizeof(*rx_timeout)); rx_timeout, sizeof(*rx_timeout));
...@@ -557,7 +557,7 @@ int wl1271_acx_cca_threshold(struct wl1271 *wl) ...@@ -557,7 +557,7 @@ int wl1271_acx_cca_threshold(struct wl1271 *wl)
goto out; goto out;
} }
detection->rx_cca_threshold = CCA_THRSH_DISABLE_ENERGY_D; detection->rx_cca_threshold = wl->conf.rx.rx_cca_threshold;
detection->tx_energy_detection = 0; detection->tx_energy_detection = 0;
ret = wl1271_cmd_configure(wl, ACX_CCA_THRESHOLD, ret = wl1271_cmd_configure(wl, ACX_CCA_THRESHOLD,
...@@ -966,10 +966,10 @@ int wl1271_acx_init_rx_interrupt(struct wl1271 *wl) ...@@ -966,10 +966,10 @@ int wl1271_acx_init_rx_interrupt(struct wl1271 *wl)
goto out; goto out;
} }
rx_conf->threshold = WL1271_RX_INTR_THRESHOLD_DEF; rx_conf->threshold = wl->conf.rx.irq_pkt_threshold;
rx_conf->timeout = WL1271_RX_INTR_TIMEOUT_DEF; rx_conf->timeout = wl->conf.rx.irq_timeout;
rx_conf->mblk_threshold = USHORT_MAX; /* Disabled */ rx_conf->mblk_threshold = wl->conf.rx.irq_blk_threshold;
rx_conf->queue_type = RX_QUEUE_TYPE_RX_LOW_PRIORITY; rx_conf->queue_type = wl->conf.rx.queue_type;
ret = wl1271_cmd_configure(wl, ACX_RX_CONFIG_OPT, rx_conf, ret = wl1271_cmd_configure(wl, ACX_RX_CONFIG_OPT, rx_conf,
sizeof(*rx_conf)); sizeof(*rx_conf));
......
...@@ -314,35 +314,13 @@ struct acx_dot11_grp_addr_tbl { ...@@ -314,35 +314,13 @@ struct acx_dot11_grp_addr_tbl {
u8 mac_table[ADDRESS_GROUP_MAX_LEN]; u8 mac_table[ADDRESS_GROUP_MAX_LEN];
} __attribute__ ((packed)); } __attribute__ ((packed));
#define RX_TIMEOUT_PS_POLL_MIN 0
#define RX_TIMEOUT_PS_POLL_MAX (200000)
#define RX_TIMEOUT_PS_POLL_DEF (15)
#define RX_TIMEOUT_UPSD_MIN 0
#define RX_TIMEOUT_UPSD_MAX (200000)
#define RX_TIMEOUT_UPSD_DEF (15)
struct acx_rx_timeout { struct acx_rx_timeout {
struct acx_header header; struct acx_header header;
/*
* The longest time the STA will wait to receive
* traffic from the AP after a PS-poll has been
* transmitted.
*/
u16 ps_poll_timeout; u16 ps_poll_timeout;
/*
* The longest time the STA will wait to receive
* traffic from the AP after a frame has been sent
* from an UPSD enabled queue.
*/
u16 upsd_timeout; u16 upsd_timeout;
} __attribute__ ((packed)); } __attribute__ ((packed));
#define RTS_THRESHOLD_MIN 0
#define RTS_THRESHOLD_MAX 4096
#define RTS_THRESHOLD_DEF 2347
struct acx_rts_threshold { struct acx_rts_threshold {
struct acx_header header; struct acx_header header;
...@@ -510,9 +488,6 @@ struct acx_bt_wlan_coex_param { ...@@ -510,9 +488,6 @@ struct acx_bt_wlan_coex_param {
u8 padding[3]; u8 padding[3];
} __attribute__ ((packed)); } __attribute__ ((packed));
#define CCA_THRSH_ENABLE_ENERGY_D 0x140A
#define CCA_THRSH_DISABLE_ENERGY_D 0xFFEF
struct acx_energy_detection { struct acx_energy_detection {
struct acx_header header; struct acx_header header;
...@@ -1017,22 +992,6 @@ struct wl1271_acx_mem_map { ...@@ -1017,22 +992,6 @@ struct wl1271_acx_mem_map {
void *tx_ctrl; void *tx_ctrl;
} __attribute__ ((packed)); } __attribute__ ((packed));
enum wl1271_acx_rx_queue_type {
RX_QUEUE_TYPE_RX_LOW_PRIORITY, /* All except the high priority */
RX_QUEUE_TYPE_RX_HIGH_PRIORITY, /* Management and voice packets */
RX_QUEUE_TYPE_NUM,
RX_QUEUE_TYPE_MAX = USHORT_MAX
};
#define WL1271_RX_INTR_THRESHOLD_DEF 0 /* no pacing, send interrupt on
* every event */
#define WL1271_RX_INTR_THRESHOLD_MIN 0
#define WL1271_RX_INTR_THRESHOLD_MAX 15
#define WL1271_RX_INTR_TIMEOUT_DEF 5
#define WL1271_RX_INTR_TIMEOUT_MIN 1
#define WL1271_RX_INTR_TIMEOUT_MAX 100
struct wl1271_acx_rx_config_opt { struct wl1271_acx_rx_config_opt {
struct acx_header header; struct acx_header header;
...@@ -1122,7 +1081,7 @@ int wl1271_acx_tx_power(struct wl1271 *wl, int power); ...@@ -1122,7 +1081,7 @@ int wl1271_acx_tx_power(struct wl1271 *wl, int power);
int wl1271_acx_feature_cfg(struct wl1271 *wl); int wl1271_acx_feature_cfg(struct wl1271 *wl);
int wl1271_acx_mem_map(struct wl1271 *wl, int wl1271_acx_mem_map(struct wl1271 *wl,
struct acx_header *mem_map, size_t len); struct acx_header *mem_map, size_t len);
int wl1271_acx_rx_msdu_life_time(struct wl1271 *wl, u32 life_time); int wl1271_acx_rx_msdu_life_time(struct wl1271 *wl);
int wl1271_acx_rx_config(struct wl1271 *wl, u32 config, u32 filter); int wl1271_acx_rx_config(struct wl1271 *wl, u32 config, u32 filter);
int wl1271_acx_pd_threshold(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_slot(struct wl1271 *wl, enum acx_slot_type slot_time);
......
...@@ -171,8 +171,93 @@ struct conf_sg_settings { ...@@ -171,8 +171,93 @@ struct conf_sg_settings {
s8 rate_adaptation_snr; s8 rate_adaptation_snr;
}; };
enum conf_rx_queue_type {
CONF_RX_QUEUE_TYPE_LOW_PRIORITY, /* All except the high priority */
CONF_RX_QUEUE_TYPE_HIGH_PRIORITY, /* Management and voice packets */
};
struct conf_rx_settings {
/*
* The maximum amount of time, in TU, before the
* firmware discards the MSDU.
*
* Range: 0 - 0xFFFFFFFF
*/
u32 rx_msdu_life_time;
/*
* Packet detection threshold in the PHY.
*
* FIXME: details unknown.
*/
u32 packet_detection_threshold;
/*
* The longest time the STA will wait to receive traffic from the AP
* after a PS-poll has been transmitted.
*
* Range: 0 - 200000
*/
u16 ps_poll_timeout;
/*
* The longest time the STA will wait to receive traffic from the AP
* after a frame has been sent from an UPSD enabled queue.
*
* Range: 0 - 200000
*/
u16 upsd_timeout;
/*
* The number of octets in an MPDU, below which an RTS/CTS
* handshake is not performed.
*
* Range: 0 - 4096
*/
u16 rts_threshold;
/*
* The RX Clear Channel Assessment threshold in the PHY
* (the energy threshold).
*
* Range: ENABLE_ENERGY_D == 0x140A
* DISABLE_ENERGY_D == 0xFFEF
*/
u16 rx_cca_threshold;
/*
* Occupied Rx mem-blocks number which requires interrupting the host
* (0 = no buffering, 0xffff = disabled).
*
* Range: u16
*/
u16 irq_blk_threshold;
/*
* Rx packets number which requires interrupting the host
* (0 = no buffering).
*
* Range: u16
*/
u16 irq_pkt_threshold;
/*
* Max time in msec the FW may delay RX-Complete interrupt.
*
* Range: 1 - 100
*/
u16 irq_timeout;
/*
* The RX queue type.
*
* Range: RX_QUEUE_TYPE_RX_LOW_PRIORITY, RX_QUEUE_TYPE_RX_HIGH_PRIORITY,
*/
u8 queue_type;
};
struct conf_drv_settings { struct conf_drv_settings {
struct conf_sg_settings sg; struct conf_sg_settings sg;
struct conf_rx_settings rx;
}; };
#endif #endif
...@@ -94,7 +94,7 @@ static int wl1271_init_rx_config(struct wl1271 *wl, u32 config, u32 filter) ...@@ -94,7 +94,7 @@ static int wl1271_init_rx_config(struct wl1271 *wl, u32 config, u32 filter)
{ {
int ret; int ret;
ret = wl1271_acx_rx_msdu_life_time(wl, RX_MSDU_LIFETIME_DEF); ret = wl1271_acx_rx_msdu_life_time(wl);
if (ret < 0) if (ret < 0)
return ret; return ret;
...@@ -125,7 +125,7 @@ static int wl1271_init_phy_config(struct wl1271 *wl) ...@@ -125,7 +125,7 @@ static int wl1271_init_phy_config(struct wl1271 *wl)
if (ret < 0) if (ret < 0)
return ret; return ret;
ret = wl1271_acx_rts_threshold(wl, RTS_THRESHOLD_DEF); ret = wl1271_acx_rts_threshold(wl, wl->conf.rx.rts_threshold);
if (ret < 0) if (ret < 0)
return ret; return ret;
......
...@@ -61,6 +61,18 @@ static void wl1271_conf_init(struct wl1271 *wl) ...@@ -61,6 +61,18 @@ static void wl1271_conf_init(struct wl1271 *wl)
.beacon_miss_threshold = 60, .beacon_miss_threshold = 60,
.rate_adaptation_threshold = CONF_HW_BIT_RATE_12MBPS, .rate_adaptation_threshold = CONF_HW_BIT_RATE_12MBPS,
.rate_adaptation_snr = 0 .rate_adaptation_snr = 0
},
.rx = {
.rx_msdu_life_time = 512000,
.packet_detection_threshold = 0,
.ps_poll_timeout = 15,
.upsd_timeout = 15,
.rts_threshold = 2347,
.rx_cca_threshold = 0xFFEF,
.irq_blk_threshold = 0,
.irq_pkt_threshold = USHORT_MAX,
.irq_timeout = 5,
.queue_type = CONF_RX_QUEUE_TYPE_LOW_PRIORITY,
} }
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment