v29
[kernel-power] / kernel-power-2.6.28 / debian / patches / wl1251-monitor-mode.diff
1 --- kernel-power-2.6.28.orig/drivers/net/wireless/wl12xx/wl1251_cmd.c
2 +++ kernel-power-2.6.28/drivers/net/wireless/wl12xx/wl1251_cmd.c
3 @@ -204,11 +204,11 @@
4         return 0;
5  }
6  
7 -int wl1251_cmd_data_path(struct wl1251 *wl, u8 channel, bool enable)
8 +int wl1251_cmd_data_path_rx(struct wl1251 *wl, u8 channel, bool enable)
9  {
10         struct cmd_enabledisable_path *cmd;
11         int ret;
12 -       u16 cmd_rx, cmd_tx;
13 +       u16 cmd_rx;
14  
15         wl1251_debug(DEBUG_CMD, "cmd data path");
16  
17 @@ -222,10 +222,8 @@
18  
19         if (enable) {
20                 cmd_rx = CMD_ENABLE_RX;
21 -               cmd_tx = CMD_ENABLE_TX;
22         } else {
23                 cmd_rx = CMD_DISABLE_RX;
24 -               cmd_tx = CMD_DISABLE_TX;
25         }
26  
27         ret = wl1251_cmd_send(wl, cmd_rx, cmd, sizeof(*cmd));
28 @@ -238,6 +236,33 @@
29         wl1251_debug(DEBUG_BOOT, "rx %s cmd channel %d",
30                      enable ? "start" : "stop", channel);
31  
32 +out:
33 +       kfree(cmd);
34 +       return ret;
35 +}
36 +
37 +int wl1251_cmd_data_path_tx(struct wl1251 *wl, u8 channel, bool enable)
38 +{
39 +       struct cmd_enabledisable_path *cmd;
40 +       int ret;
41 +       u16 cmd_tx;
42 +
43 +       wl1251_debug(DEBUG_CMD, "cmd data path");
44 +
45 +       cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
46 +       if (!cmd) {
47 +               ret = -ENOMEM;
48 +               goto out;
49 +       }
50 +
51 +       cmd->channel = channel;
52 +
53 +       if (enable) {
54 +               cmd_tx = CMD_ENABLE_TX;
55 +       } else {
56 +               cmd_tx = CMD_DISABLE_TX;
57 +       }
58 +
59         ret = wl1251_cmd_send(wl, cmd_tx, cmd, sizeof(*cmd));
60         if (ret < 0) {
61                 wl1251_error("tx %s cmd for channel %d failed",
62 --- kernel-power-2.6.28.orig/drivers/net/wireless/wl12xx/wl1251_cmd.h
63 +++ kernel-power-2.6.28/drivers/net/wireless/wl12xx/wl1251_cmd.h
64 @@ -35,7 +35,8 @@
65  int wl1251_cmd_configure(struct wl1251 *wl, u16 id, void *buf, size_t len);
66  int wl1251_cmd_vbm(struct wl1251 *wl, u8 identity,
67                    void *bitmap, u16 bitmap_len, u8 bitmap_control);
68 -int wl1251_cmd_data_path(struct wl1251 *wl, u8 channel, bool enable);
69 +int wl1251_cmd_data_path_rx(struct wl1251 *wl, u8 channel, bool enable);
70 +int wl1251_cmd_data_path_tx(struct wl1251 *wl, u8 channel, bool enable);
71  int wl1251_cmd_join(struct wl1251 *wl, u8 bss_type, u8 channel,
72                     u16 beacon_interval, u8 dtim_interval);
73  int wl1251_cmd_ps_mode(struct wl1251 *wl, u8 ps_mode);
74 --- kernel-power-2.6.28.orig/drivers/net/wireless/wl12xx/wl1251_init.c
75 +++ kernel-power-2.6.28/drivers/net/wireless/wl12xx/wl1251_init.c
76 @@ -399,8 +399,13 @@
77         if (ret < 0)
78                 goto out_free_data_path;
79  
80 -       /* Enable data path */
81 -       ret = wl1251_cmd_data_path(wl, wl->channel, 1);
82 +       /* Enable rx data path */
83 +       ret = wl1251_cmd_data_path_rx(wl, wl->channel, 1);
84 +       if (ret < 0)
85 +               goto out_free_data_path;
86 +
87 +       /* Enable tx data path */
88 +       ret = wl1251_cmd_data_path_tx(wl, wl->channel, 1);
89         if (ret < 0)
90                 goto out_free_data_path;
91  
92 --- kernel-power-2.6.28.orig/drivers/net/wireless/wl12xx/wl1251_main.c
93 +++ kernel-power-2.6.28/drivers/net/wireless/wl12xx/wl1251_main.c
94 @@ -667,7 +667,11 @@
95         if (ret < 0)
96                 return ret;
97  
98 -       ret = wl1251_cmd_data_path(wl, wl->channel, 1);
99 +       ret = wl1251_cmd_data_path_rx(wl, wl->channel, 1);
100 +       if (ret < 0)
101 +               return ret;
102 +
103 +       ret = wl1251_cmd_data_path_tx(wl, wl->channel, 1);
104         if (ret < 0)
105                 return ret;
106  
107 @@ -1180,6 +1184,13 @@
108         if (ret < 0)
109                 goto out;
110  
111 +       /* Monitor mode */
112 +       if (wl->vif == NULL && wl->channel != channel) {
113 +               ret = wl1251_cmd_data_path_rx(wl, channel, 1);
114 +               if (ret < 0)
115 +                       goto out_sleep;
116 +       }
117 +
118         wl->channel = channel;
119  
120         if (conf->flags & IEEE80211_CONF_PS && !wl->psm_requested) {