1 Index: kernel-power-2.6.28/drivers/net/wireless/wl12xx/wl1251_cmd.c
2 ===================================================================
3 --- kernel-power-2.6.28.orig/drivers/net/wireless/wl12xx/wl1251_cmd.c 2010-05-14 23:59:06.832141497 +0200
4 +++ kernel-power-2.6.28/drivers/net/wireless/wl12xx/wl1251_cmd.c 2010-05-14 23:59:07.524273985 +0200
9 -int wl1251_cmd_data_path(struct wl1251 *wl, u8 channel, bool enable)
10 +int wl1251_cmd_data_path_rx(struct wl1251 *wl, u8 channel, bool enable)
12 struct cmd_enabledisable_path *cmd;
17 wl1251_debug(DEBUG_CMD, "cmd data path");
22 cmd_rx = CMD_ENABLE_RX;
23 - cmd_tx = CMD_ENABLE_TX;
25 cmd_rx = CMD_DISABLE_RX;
26 - cmd_tx = CMD_DISABLE_TX;
29 ret = wl1251_cmd_send(wl, cmd_rx, cmd, sizeof(*cmd));
31 wl1251_debug(DEBUG_BOOT, "rx %s cmd channel %d",
32 enable ? "start" : "stop", channel);
39 +int wl1251_cmd_data_path_tx(struct wl1251 *wl, u8 channel, bool enable)
41 + struct cmd_enabledisable_path *cmd;
45 + wl1251_debug(DEBUG_CMD, "cmd data path");
47 + cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
53 + cmd->channel = channel;
56 + cmd_tx = CMD_ENABLE_TX;
58 + cmd_tx = CMD_DISABLE_TX;
61 ret = wl1251_cmd_send(wl, cmd_tx, cmd, sizeof(*cmd));
63 wl1251_error("tx %s cmd for channel %d failed",
64 Index: kernel-power-2.6.28/drivers/net/wireless/wl12xx/wl1251_cmd.h
65 ===================================================================
66 --- kernel-power-2.6.28.orig/drivers/net/wireless/wl12xx/wl1251_cmd.h 2010-05-14 23:59:06.832141497 +0200
67 +++ kernel-power-2.6.28/drivers/net/wireless/wl12xx/wl1251_cmd.h 2010-05-14 23:59:07.524273985 +0200
69 int wl1251_cmd_configure(struct wl1251 *wl, u16 id, void *buf, size_t len);
70 int wl1251_cmd_vbm(struct wl1251 *wl, u8 identity,
71 void *bitmap, u16 bitmap_len, u8 bitmap_control);
72 -int wl1251_cmd_data_path(struct wl1251 *wl, u8 channel, bool enable);
73 +int wl1251_cmd_data_path_rx(struct wl1251 *wl, u8 channel, bool enable);
74 +int wl1251_cmd_data_path_tx(struct wl1251 *wl, u8 channel, bool enable);
75 int wl1251_cmd_join(struct wl1251 *wl, u8 bss_type, u8 channel,
76 u16 beacon_interval, u8 dtim_interval);
77 int wl1251_cmd_ps_mode(struct wl1251 *wl, u8 ps_mode);
78 Index: kernel-power-2.6.28/drivers/net/wireless/wl12xx/wl1251_init.c
79 ===================================================================
80 --- kernel-power-2.6.28.orig/drivers/net/wireless/wl12xx/wl1251_init.c 2010-05-14 23:59:07.063992150 +0200
81 +++ kernel-power-2.6.28/drivers/net/wireless/wl12xx/wl1251_init.c 2010-05-15 00:46:16.884045939 +0200
86 - ret = wl1251_acx_feature_cfg(wl);
87 + ret = wl1251_acx_feature_cfg(wl, DF_SNIFF_MODE_ENABLE);
89 wl1251_warning("couldn't set feature config");
93 goto out_free_data_path;
95 - /* Enable data path */
96 - ret = wl1251_cmd_data_path(wl, wl->channel, 1);
97 + /* Enable rx data path */
98 + ret = wl1251_cmd_data_path_rx(wl, wl->channel, 1);
100 + goto out_free_data_path;
102 + /* Enable tx data path */
103 + ret = wl1251_cmd_data_path_tx(wl, wl->channel, 1);
105 goto out_free_data_path;
107 Index: kernel-power-2.6.28/drivers/net/wireless/wl12xx/wl1251_main.c
108 ===================================================================
109 --- kernel-power-2.6.28.orig/drivers/net/wireless/wl12xx/wl1251_main.c 2010-05-14 23:59:07.063992150 +0200
110 +++ kernel-power-2.6.28/drivers/net/wireless/wl12xx/wl1251_main.c 2010-05-15 03:33:55.871890108 +0200
115 - ret = wl1251_cmd_data_path(wl, wl->channel, 1);
116 + ret = wl1251_cmd_data_path_rx(wl, wl->channel, 1);
120 + ret = wl1251_cmd_data_path_tx(wl, wl->channel, 1);
128 + ret = wl1251_acx_feature_cfg(wl, 0);
130 + wl1251_warning("couldn't set feature config");
136 switch (conf->type) {
137 @@ -998,10 +1008,19 @@
138 struct ieee80211_if_init_conf *conf)
140 struct wl1251 *wl = hw->priv;
143 mutex_lock(&wl->mutex);
145 wl1251_debug(DEBUG_MAC80211, "mac80211 remove interface");
149 + ret = wl1251_acx_feature_cfg(wl, DF_SNIFF_MODE_ENABLE);
151 + wl1251_warning("couldn't set feature config");
154 mutex_unlock(&wl->mutex);
157 @@ -1180,6 +1199,13 @@
162 + if (wl->vif == NULL && wl->channel != channel) {
163 + ret = wl1251_cmd_data_path_rx(wl, channel, 1);
168 wl->channel = channel;
170 if (conf->flags & IEEE80211_CONF_PS && !wl->psm_requested) {
171 Index: kernel-power-2.6.28/drivers/net/wireless/wl12xx/wl1251_acx.c
172 ===================================================================
173 --- kernel-power-2.6.28.orig/drivers/net/wireless/wl12xx/wl1251_acx.c 2010-05-15 00:00:22.995807778 +0200
174 +++ kernel-power-2.6.28/drivers/net/wireless/wl12xx/wl1251_acx.c 2010-05-15 00:14:02.111891358 +0200
179 -int wl1251_acx_feature_cfg(struct wl1251 *wl)
180 +int wl1251_acx_feature_cfg(struct wl1251 *wl, u32 data_flow_options)
182 struct acx_feature_config *feature;
187 /* DF_ENCRYPTION_DISABLE and DF_SNIFF_MODE_ENABLE are disabled */
188 - feature->data_flow_options = 0;
189 + feature->data_flow_options = data_flow_options;
190 feature->options = 0;
192 ret = wl1251_cmd_configure(wl, ACX_FEATURE_CFG,
193 Index: kernel-power-2.6.28/drivers/net/wireless/wl12xx/wl1251_acx.h
194 ===================================================================
195 --- kernel-power-2.6.28.orig/drivers/net/wireless/wl12xx/wl1251_acx.h 2010-05-15 00:01:16.660049057 +0200
196 +++ kernel-power-2.6.28/drivers/net/wireless/wl12xx/wl1251_acx.h 2010-05-15 00:14:27.776191658 +0200
197 @@ -1454,7 +1454,7 @@
198 int wl1251_acx_sleep_auth(struct wl1251 *wl, u8 sleep_auth);
199 int wl1251_acx_fw_version(struct wl1251 *wl, char *buf, size_t len);
200 int wl1251_acx_tx_power(struct wl1251 *wl, int power);
201 -int wl1251_acx_feature_cfg(struct wl1251 *wl);
202 +int wl1251_acx_feature_cfg(struct wl1251 *wl, u32 data_flow_options);
203 int wl1251_acx_mem_map(struct wl1251 *wl,
204 struct acx_header *mem_map, size_t len);
205 int wl1251_acx_data_path_params(struct wl1251 *wl,
206 Index: kernel-power-2.6.28/drivers/net/wireless/wl12xx/wl1251_rx.c
207 ===================================================================
208 --- kernel-power-2.6.28.orig/drivers/net/wireless/wl12xx/wl1251_rx.c 2010-05-16 15:04:08.279402004 +0200
209 +++ kernel-power-2.6.28/drivers/net/wireless/wl12xx/wl1251_rx.c 2010-05-16 18:56:57.075800531 +0200
211 status->flag |= RX_FLAG_FAILED_FCS_CRC;
214 - /* FIXME: set status->rate_idx */
215 + switch (desc->rate) {
216 + /* skip 1 and 12 Mbps because they have same value 0x0a */
218 + status->rate_idx = 1;
221 + status->rate_idx = 2;
224 + status->rate_idx = 3;
227 + status->rate_idx = 4;
230 + status->rate_idx = 5;
233 + status->rate_idx = 7;
236 + status->rate_idx = 8;
239 + status->rate_idx = 9;
242 + status->rate_idx = 10;
245 + status->rate_idx = 11;
249 + /* for 1 and 12 Mbps we have to check the modulation */
250 + if (desc->rate == RATE_1MBPS) {
251 + if ((desc->mod_pre & OFDM_RATE_BIT) == 0) {
252 + /* CCK -> RATE_1MBPS*/
253 + status->rate_idx = 0;
255 + /* OFDM -> RATE_12MBPS */
256 + status->rate_idx = 6;
260 + if ((desc->mod_pre & SHORT_PREAMBLE_BIT) != 0) {
261 + status->flag |= RX_FLAG_SHORTPRE;
265 static void wl1251_rx_body(struct wl1251 *wl,