diff options
author | Dan Williams <dcbw@redhat.com> | 2008-08-21 17:51:07 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2008-08-29 16:24:07 -0400 |
commit | d5db2dfa660de13c3643149b89c7602dd49aa168 (patch) | |
tree | c2dbf5cbd27a83c73cba68f4285d1e51024d168f /drivers/net | |
parent | 191bb40e725304c5fcfabd92c57eef58799f0e25 (diff) |
libertas: convert CMD_802_11_RADIO_CONTROL to a direct command
and return errors for operations like join & scan that aren't possible
when the radio is turned off.
Signed-off-by: Dan Williams <dcbw@redhat.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/wireless/libertas/assoc.c | 57 | ||||
-rw-r--r-- | drivers/net/wireless/libertas/cmd.c | 46 | ||||
-rw-r--r-- | drivers/net/wireless/libertas/cmd.h | 2 | ||||
-rw-r--r-- | drivers/net/wireless/libertas/decl.h | 1 | ||||
-rw-r--r-- | drivers/net/wireless/libertas/dev.h | 3 | ||||
-rw-r--r-- | drivers/net/wireless/libertas/host.h | 15 | ||||
-rw-r--r-- | drivers/net/wireless/libertas/main.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/libertas/scan.c | 5 | ||||
-rw-r--r-- | drivers/net/wireless/libertas/wext.c | 69 |
9 files changed, 100 insertions, 100 deletions
diff --git a/drivers/net/wireless/libertas/assoc.c b/drivers/net/wireless/libertas/assoc.c index 5072a8917fd9..d47e4d5734cd 100644 --- a/drivers/net/wireless/libertas/assoc.c +++ b/drivers/net/wireless/libertas/assoc.c | |||
@@ -25,7 +25,7 @@ static const u8 bssid_off[ETH_ALEN] __attribute__ ((aligned (2))) = | |||
25 | * @brief Associate to a specific BSS discovered in a scan | 25 | * @brief Associate to a specific BSS discovered in a scan |
26 | * | 26 | * |
27 | * @param priv A pointer to struct lbs_private structure | 27 | * @param priv A pointer to struct lbs_private structure |
28 | * @param pbssdesc Pointer to the BSS descriptor to associate with. | 28 | * @param assoc_req The association request describing the BSS to associate with |
29 | * | 29 | * |
30 | * @return 0-success, otherwise fail | 30 | * @return 0-success, otherwise fail |
31 | */ | 31 | */ |
@@ -33,29 +33,29 @@ static int lbs_associate(struct lbs_private *priv, | |||
33 | struct assoc_request *assoc_req) | 33 | struct assoc_request *assoc_req) |
34 | { | 34 | { |
35 | int ret; | 35 | int ret; |
36 | u8 preamble = RADIO_PREAMBLE_LONG; | ||
36 | 37 | ||
37 | lbs_deb_enter(LBS_DEB_ASSOC); | 38 | lbs_deb_enter(LBS_DEB_ASSOC); |
38 | 39 | ||
39 | ret = lbs_prepare_and_send_command(priv, CMD_802_11_AUTHENTICATE, | 40 | ret = lbs_prepare_and_send_command(priv, CMD_802_11_AUTHENTICATE, |
40 | 0, CMD_OPTION_WAITFORRSP, | 41 | 0, CMD_OPTION_WAITFORRSP, |
41 | 0, assoc_req->bss.bssid); | 42 | 0, assoc_req->bss.bssid); |
42 | |||
43 | if (ret) | 43 | if (ret) |
44 | goto done; | 44 | goto out; |
45 | 45 | ||
46 | /* set preamble to firmware */ | 46 | /* Use short preamble only when both the BSS and firmware support it */ |
47 | if ((priv->capability & WLAN_CAPABILITY_SHORT_PREAMBLE) && | 47 | if ((priv->capability & WLAN_CAPABILITY_SHORT_PREAMBLE) && |
48 | (assoc_req->bss.capability & WLAN_CAPABILITY_SHORT_PREAMBLE)) | 48 | (assoc_req->bss.capability & WLAN_CAPABILITY_SHORT_PREAMBLE)) |
49 | priv->preamble = CMD_TYPE_SHORT_PREAMBLE; | 49 | preamble = RADIO_PREAMBLE_SHORT; |
50 | else | ||
51 | priv->preamble = CMD_TYPE_LONG_PREAMBLE; | ||
52 | 50 | ||
53 | lbs_set_radio_control(priv); | 51 | ret = lbs_set_radio(priv, preamble, 1); |
52 | if (ret) | ||
53 | goto out; | ||
54 | 54 | ||
55 | ret = lbs_prepare_and_send_command(priv, CMD_802_11_ASSOCIATE, | 55 | ret = lbs_prepare_and_send_command(priv, CMD_802_11_ASSOCIATE, |
56 | 0, CMD_OPTION_WAITFORRSP, 0, assoc_req); | 56 | 0, CMD_OPTION_WAITFORRSP, 0, assoc_req); |
57 | 57 | ||
58 | done: | 58 | out: |
59 | lbs_deb_leave_args(LBS_DEB_ASSOC, "ret %d", ret); | 59 | lbs_deb_leave_args(LBS_DEB_ASSOC, "ret %d", ret); |
60 | return ret; | 60 | return ret; |
61 | } | 61 | } |
@@ -64,8 +64,7 @@ done: | |||
64 | * @brief Join an adhoc network found in a previous scan | 64 | * @brief Join an adhoc network found in a previous scan |
65 | * | 65 | * |
66 | * @param priv A pointer to struct lbs_private structure | 66 | * @param priv A pointer to struct lbs_private structure |
67 | * @param pbssdesc Pointer to a BSS descriptor found in a previous scan | 67 | * @param assoc_req The association request describing the BSS to join |
68 | * to attempt to join | ||
69 | * | 68 | * |
70 | * @return 0--success, -1--fail | 69 | * @return 0--success, -1--fail |
71 | */ | 70 | */ |
@@ -74,6 +73,9 @@ static int lbs_join_adhoc_network(struct lbs_private *priv, | |||
74 | { | 73 | { |
75 | struct bss_descriptor *bss = &assoc_req->bss; | 74 | struct bss_descriptor *bss = &assoc_req->bss; |
76 | int ret = 0; | 75 | int ret = 0; |
76 | u8 preamble = RADIO_PREAMBLE_LONG; | ||
77 | |||
78 | lbs_deb_enter(LBS_DEB_ASSOC); | ||
77 | 79 | ||
78 | lbs_deb_join("current SSID '%s', ssid length %u\n", | 80 | lbs_deb_join("current SSID '%s', ssid length %u\n", |
79 | escape_essid(priv->curbssparams.ssid, | 81 | escape_essid(priv->curbssparams.ssid, |
@@ -106,18 +108,16 @@ static int lbs_join_adhoc_network(struct lbs_private *priv, | |||
106 | goto out; | 108 | goto out; |
107 | } | 109 | } |
108 | 110 | ||
109 | /* Use shortpreamble only when both creator and card supports | 111 | /* Use short preamble only when both the BSS and firmware support it */ |
110 | short preamble */ | 112 | if ((priv->capability & WLAN_CAPABILITY_SHORT_PREAMBLE) && |
111 | if (!(bss->capability & WLAN_CAPABILITY_SHORT_PREAMBLE) || | 113 | (bss->capability & WLAN_CAPABILITY_SHORT_PREAMBLE)) { |
112 | !(priv->capability & WLAN_CAPABILITY_SHORT_PREAMBLE)) { | ||
113 | lbs_deb_join("AdhocJoin: Long preamble\n"); | ||
114 | priv->preamble = CMD_TYPE_LONG_PREAMBLE; | ||
115 | } else { | ||
116 | lbs_deb_join("AdhocJoin: Short preamble\n"); | 114 | lbs_deb_join("AdhocJoin: Short preamble\n"); |
117 | priv->preamble = CMD_TYPE_SHORT_PREAMBLE; | 115 | preamble = RADIO_PREAMBLE_SHORT; |
118 | } | 116 | } |
119 | 117 | ||
120 | lbs_set_radio_control(priv); | 118 | ret = lbs_set_radio(priv, preamble, 1); |
119 | if (ret) | ||
120 | goto out; | ||
121 | 121 | ||
122 | lbs_deb_join("AdhocJoin: channel = %d\n", assoc_req->channel); | 122 | lbs_deb_join("AdhocJoin: channel = %d\n", assoc_req->channel); |
123 | lbs_deb_join("AdhocJoin: band = %c\n", assoc_req->band); | 123 | lbs_deb_join("AdhocJoin: band = %c\n", assoc_req->band); |
@@ -129,6 +129,7 @@ static int lbs_join_adhoc_network(struct lbs_private *priv, | |||
129 | OID_802_11_SSID, assoc_req); | 129 | OID_802_11_SSID, assoc_req); |
130 | 130 | ||
131 | out: | 131 | out: |
132 | lbs_deb_leave_args(LBS_DEB_ASSOC, "ret %d", ret); | ||
132 | return ret; | 133 | return ret; |
133 | } | 134 | } |
134 | 135 | ||
@@ -136,25 +137,27 @@ out: | |||
136 | * @brief Start an Adhoc Network | 137 | * @brief Start an Adhoc Network |
137 | * | 138 | * |
138 | * @param priv A pointer to struct lbs_private structure | 139 | * @param priv A pointer to struct lbs_private structure |
139 | * @param adhocssid The ssid of the Adhoc Network | 140 | * @param assoc_req The association request describing the BSS to start |
140 | * @return 0--success, -1--fail | 141 | * @return 0--success, -1--fail |
141 | */ | 142 | */ |
142 | static int lbs_start_adhoc_network(struct lbs_private *priv, | 143 | static int lbs_start_adhoc_network(struct lbs_private *priv, |
143 | struct assoc_request *assoc_req) | 144 | struct assoc_request *assoc_req) |
144 | { | 145 | { |
145 | int ret = 0; | 146 | int ret = 0; |
147 | u8 preamble = RADIO_PREAMBLE_LONG; | ||
148 | |||
149 | lbs_deb_enter(LBS_DEB_ASSOC); | ||
146 | 150 | ||
147 | priv->adhoccreate = 1; | 151 | priv->adhoccreate = 1; |
148 | 152 | ||
149 | if (priv->capability & WLAN_CAPABILITY_SHORT_PREAMBLE) { | 153 | if (priv->capability & WLAN_CAPABILITY_SHORT_PREAMBLE) { |
150 | lbs_deb_join("AdhocStart: Short preamble\n"); | 154 | lbs_deb_join("AdhocStart: Short preamble\n"); |
151 | priv->preamble = CMD_TYPE_SHORT_PREAMBLE; | 155 | preamble = RADIO_PREAMBLE_SHORT; |
152 | } else { | ||
153 | lbs_deb_join("AdhocStart: Long preamble\n"); | ||
154 | priv->preamble = CMD_TYPE_LONG_PREAMBLE; | ||
155 | } | 156 | } |
156 | 157 | ||
157 | lbs_set_radio_control(priv); | 158 | ret = lbs_set_radio(priv, preamble, 1); |
159 | if (ret) | ||
160 | goto out; | ||
158 | 161 | ||
159 | lbs_deb_join("AdhocStart: channel = %d\n", assoc_req->channel); | 162 | lbs_deb_join("AdhocStart: channel = %d\n", assoc_req->channel); |
160 | lbs_deb_join("AdhocStart: band = %d\n", assoc_req->band); | 163 | lbs_deb_join("AdhocStart: band = %d\n", assoc_req->band); |
@@ -162,6 +165,8 @@ static int lbs_start_adhoc_network(struct lbs_private *priv, | |||
162 | ret = lbs_prepare_and_send_command(priv, CMD_802_11_AD_HOC_START, | 165 | ret = lbs_prepare_and_send_command(priv, CMD_802_11_AD_HOC_START, |
163 | 0, CMD_OPTION_WAITFORRSP, 0, assoc_req); | 166 | 0, CMD_OPTION_WAITFORRSP, 0, assoc_req); |
164 | 167 | ||
168 | out: | ||
169 | lbs_deb_leave_args(LBS_DEB_ASSOC, "ret %d", ret); | ||
165 | return ret; | 170 | return ret; |
166 | } | 171 | } |
167 | 172 | ||
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c index 8364a2f71b51..f3073a5a954a 100644 --- a/drivers/net/wireless/libertas/cmd.c +++ b/drivers/net/wireless/libertas/cmd.c | |||
@@ -1289,41 +1289,47 @@ void lbs_complete_command(struct lbs_private *priv, struct cmd_ctrl_node *cmd, | |||
1289 | priv->cur_cmd = NULL; | 1289 | priv->cur_cmd = NULL; |
1290 | } | 1290 | } |
1291 | 1291 | ||
1292 | int lbs_set_radio_control(struct lbs_private *priv) | 1292 | int lbs_set_radio(struct lbs_private *priv, u8 preamble, u8 radio_on) |
1293 | { | 1293 | { |
1294 | int ret = 0; | ||
1295 | struct cmd_ds_802_11_radio_control cmd; | 1294 | struct cmd_ds_802_11_radio_control cmd; |
1295 | int ret = -EINVAL; | ||
1296 | 1296 | ||
1297 | lbs_deb_enter(LBS_DEB_CMD); | 1297 | lbs_deb_enter(LBS_DEB_CMD); |
1298 | 1298 | ||
1299 | cmd.hdr.size = cpu_to_le16(sizeof(cmd)); | 1299 | cmd.hdr.size = cpu_to_le16(sizeof(cmd)); |
1300 | cmd.action = cpu_to_le16(CMD_ACT_SET); | 1300 | cmd.action = cpu_to_le16(CMD_ACT_SET); |
1301 | 1301 | ||
1302 | switch (priv->preamble) { | 1302 | /* Only v8 and below support setting the preamble */ |
1303 | case CMD_TYPE_SHORT_PREAMBLE: | 1303 | if (priv->fwrelease < 0x09000000) { |
1304 | cmd.control = cpu_to_le16(SET_SHORT_PREAMBLE); | 1304 | switch (preamble) { |
1305 | break; | 1305 | case RADIO_PREAMBLE_SHORT: |
1306 | 1306 | if (!(priv->capability & WLAN_CAPABILITY_SHORT_PREAMBLE)) | |
1307 | case CMD_TYPE_LONG_PREAMBLE: | 1307 | goto out; |
1308 | cmd.control = cpu_to_le16(SET_LONG_PREAMBLE); | 1308 | /* Fall through */ |
1309 | break; | 1309 | case RADIO_PREAMBLE_AUTO: |
1310 | case RADIO_PREAMBLE_LONG: | ||
1311 | cmd.control = cpu_to_le16(preamble); | ||
1312 | break; | ||
1313 | default: | ||
1314 | goto out; | ||
1315 | } | ||
1316 | } | ||
1310 | 1317 | ||
1311 | case CMD_TYPE_AUTO_PREAMBLE: | 1318 | if (radio_on) |
1312 | default: | 1319 | cmd.control |= cpu_to_le16(0x1); |
1313 | cmd.control = cpu_to_le16(SET_AUTO_PREAMBLE); | 1320 | else { |
1314 | break; | 1321 | cmd.control &= cpu_to_le16(~0x1); |
1322 | priv->txpower_cur = 0; | ||
1315 | } | 1323 | } |
1316 | 1324 | ||
1317 | if (priv->radioon) | 1325 | lbs_deb_cmd("RADIO_CONTROL: radio %s, preamble %d\n", |
1318 | cmd.control |= cpu_to_le16(TURN_ON_RF); | 1326 | radio_on ? "ON" : "OFF", preamble); |
1319 | else | ||
1320 | cmd.control &= cpu_to_le16(~TURN_ON_RF); | ||
1321 | 1327 | ||
1322 | lbs_deb_cmd("RADIO_SET: radio %d, preamble %d\n", priv->radioon, | 1328 | priv->radio_on = radio_on; |
1323 | priv->preamble); | ||
1324 | 1329 | ||
1325 | ret = lbs_cmd_with_response(priv, CMD_802_11_RADIO_CONTROL, &cmd); | 1330 | ret = lbs_cmd_with_response(priv, CMD_802_11_RADIO_CONTROL, &cmd); |
1326 | 1331 | ||
1332 | out: | ||
1327 | lbs_deb_leave_args(LBS_DEB_CMD, "ret %d", ret); | 1333 | lbs_deb_leave_args(LBS_DEB_CMD, "ret %d", ret); |
1328 | return ret; | 1334 | return ret; |
1329 | } | 1335 | } |
diff --git a/drivers/net/wireless/libertas/cmd.h b/drivers/net/wireless/libertas/cmd.h index 6fba8ef7d09a..11ac996e895e 100644 --- a/drivers/net/wireless/libertas/cmd.h +++ b/drivers/net/wireless/libertas/cmd.h | |||
@@ -65,4 +65,6 @@ int lbs_get_tx_power(struct lbs_private *priv, s16 *curlevel, s16 *minlevel, | |||
65 | s16 *maxlevel); | 65 | s16 *maxlevel); |
66 | int lbs_set_tx_power(struct lbs_private *priv, s16 dbm); | 66 | int lbs_set_tx_power(struct lbs_private *priv, s16 dbm); |
67 | 67 | ||
68 | int lbs_set_radio(struct lbs_private *priv, u8 preamble, u8 radio_on); | ||
69 | |||
68 | #endif /* _LBS_CMD_H */ | 70 | #endif /* _LBS_CMD_H */ |
diff --git a/drivers/net/wireless/libertas/decl.h b/drivers/net/wireless/libertas/decl.h index a8ac974dacac..1a8888cceadc 100644 --- a/drivers/net/wireless/libertas/decl.h +++ b/drivers/net/wireless/libertas/decl.h | |||
@@ -34,7 +34,6 @@ int lbs_process_event(struct lbs_private *priv, u32 event); | |||
34 | void lbs_queue_event(struct lbs_private *priv, u32 event); | 34 | void lbs_queue_event(struct lbs_private *priv, u32 event); |
35 | void lbs_notify_command_response(struct lbs_private *priv, u8 resp_idx); | 35 | void lbs_notify_command_response(struct lbs_private *priv, u8 resp_idx); |
36 | 36 | ||
37 | int lbs_set_radio_control(struct lbs_private *priv); | ||
38 | u32 lbs_fw_index_to_data_rate(u8 index); | 37 | u32 lbs_fw_index_to_data_rate(u8 index); |
39 | u8 lbs_data_rate_to_fw_index(u32 rate); | 38 | u8 lbs_data_rate_to_fw_index(u32 rate); |
40 | 39 | ||
diff --git a/drivers/net/wireless/libertas/dev.h b/drivers/net/wireless/libertas/dev.h index 560d4d3db66b..fd59e1816460 100644 --- a/drivers/net/wireless/libertas/dev.h +++ b/drivers/net/wireless/libertas/dev.h | |||
@@ -293,8 +293,7 @@ struct lbs_private { | |||
293 | u16 nextSNRNF; | 293 | u16 nextSNRNF; |
294 | u16 numSNRNF; | 294 | u16 numSNRNF; |
295 | 295 | ||
296 | u8 radioon; | 296 | u8 radio_on; |
297 | u32 preamble; | ||
298 | 297 | ||
299 | /** data rate stuff */ | 298 | /** data rate stuff */ |
300 | u8 cur_rate; | 299 | u8 cur_rate; |
diff --git a/drivers/net/wireless/libertas/host.h b/drivers/net/wireless/libertas/host.h index caebb9b5715b..da618fc997ce 100644 --- a/drivers/net/wireless/libertas/host.h +++ b/drivers/net/wireless/libertas/host.h | |||
@@ -152,11 +152,6 @@ | |||
152 | #define CMD_ACT_MAC_ALL_MULTICAST_ENABLE 0x0100 | 152 | #define CMD_ACT_MAC_ALL_MULTICAST_ENABLE 0x0100 |
153 | #define CMD_ACT_MAC_STRICT_PROTECTION_ENABLE 0x0400 | 153 | #define CMD_ACT_MAC_STRICT_PROTECTION_ENABLE 0x0400 |
154 | 154 | ||
155 | /* Define action or option for CMD_802_11_RADIO_CONTROL */ | ||
156 | #define CMD_TYPE_AUTO_PREAMBLE 0x0001 | ||
157 | #define CMD_TYPE_SHORT_PREAMBLE 0x0002 | ||
158 | #define CMD_TYPE_LONG_PREAMBLE 0x0003 | ||
159 | |||
160 | /* Event flags for CMD_802_11_SUBSCRIBE_EVENT */ | 155 | /* Event flags for CMD_802_11_SUBSCRIBE_EVENT */ |
161 | #define CMD_SUBSCRIBE_RSSI_LOW 0x0001 | 156 | #define CMD_SUBSCRIBE_RSSI_LOW 0x0001 |
162 | #define CMD_SUBSCRIBE_SNR_LOW 0x0002 | 157 | #define CMD_SUBSCRIBE_SNR_LOW 0x0002 |
@@ -165,13 +160,9 @@ | |||
165 | #define CMD_SUBSCRIBE_RSSI_HIGH 0x0010 | 160 | #define CMD_SUBSCRIBE_RSSI_HIGH 0x0010 |
166 | #define CMD_SUBSCRIBE_SNR_HIGH 0x0020 | 161 | #define CMD_SUBSCRIBE_SNR_HIGH 0x0020 |
167 | 162 | ||
168 | #define TURN_ON_RF 0x01 | 163 | #define RADIO_PREAMBLE_LONG 0x00 |
169 | #define RADIO_ON 0x01 | 164 | #define RADIO_PREAMBLE_SHORT 0x02 |
170 | #define RADIO_OFF 0x00 | 165 | #define RADIO_PREAMBLE_AUTO 0x04 |
171 | |||
172 | #define SET_AUTO_PREAMBLE 0x05 | ||
173 | #define SET_SHORT_PREAMBLE 0x03 | ||
174 | #define SET_LONG_PREAMBLE 0x01 | ||
175 | 166 | ||
176 | /* Define action or option for CMD_802_11_RF_CHANNEL */ | 167 | /* Define action or option for CMD_802_11_RF_CHANNEL */ |
177 | #define CMD_OPT_802_11_RF_CHANNEL_GET 0x00 | 168 | #define CMD_OPT_802_11_RF_CHANNEL_GET 0x00 |
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c index 5e4c4e41098a..dafe62e9d3e7 100644 --- a/drivers/net/wireless/libertas/main.c +++ b/drivers/net/wireless/libertas/main.c | |||
@@ -1051,7 +1051,7 @@ static int lbs_init_adapter(struct lbs_private *priv) | |||
1051 | priv->mode = IW_MODE_INFRA; | 1051 | priv->mode = IW_MODE_INFRA; |
1052 | priv->curbssparams.channel = DEFAULT_AD_HOC_CHANNEL; | 1052 | priv->curbssparams.channel = DEFAULT_AD_HOC_CHANNEL; |
1053 | priv->mac_control = CMD_ACT_MAC_RX_ON | CMD_ACT_MAC_TX_ON; | 1053 | priv->mac_control = CMD_ACT_MAC_RX_ON | CMD_ACT_MAC_TX_ON; |
1054 | priv->radioon = RADIO_ON; | 1054 | priv->radio_on = 1; |
1055 | priv->enablehwauto = 1; | 1055 | priv->enablehwauto = 1; |
1056 | priv->capability = WLAN_CAPABILITY_SHORT_PREAMBLE; | 1056 | priv->capability = WLAN_CAPABILITY_SHORT_PREAMBLE; |
1057 | priv->psmode = LBS802_11POWERMODECAM; | 1057 | priv->psmode = LBS802_11POWERMODECAM; |
diff --git a/drivers/net/wireless/libertas/scan.c b/drivers/net/wireless/libertas/scan.c index 4b274562f965..8f66903641b9 100644 --- a/drivers/net/wireless/libertas/scan.c +++ b/drivers/net/wireless/libertas/scan.c | |||
@@ -944,6 +944,11 @@ int lbs_set_scan(struct net_device *dev, struct iw_request_info *info, | |||
944 | 944 | ||
945 | lbs_deb_enter(LBS_DEB_WEXT); | 945 | lbs_deb_enter(LBS_DEB_WEXT); |
946 | 946 | ||
947 | if (!priv->radio_on) { | ||
948 | ret = -EINVAL; | ||
949 | goto out; | ||
950 | } | ||
951 | |||
947 | if (!netif_running(dev)) { | 952 | if (!netif_running(dev)) { |
948 | ret = -ENETDOWN; | 953 | ret = -ENETDOWN; |
949 | goto out; | 954 | goto out; |
diff --git a/drivers/net/wireless/libertas/wext.c b/drivers/net/wireless/libertas/wext.c index 38295ee1a05f..4307090f4eff 100644 --- a/drivers/net/wireless/libertas/wext.c +++ b/drivers/net/wireless/libertas/wext.c | |||
@@ -120,34 +120,6 @@ static struct chan_freq_power *find_cfp_by_band_and_freq( | |||
120 | return cfp; | 120 | return cfp; |
121 | } | 121 | } |
122 | 122 | ||
123 | |||
124 | /** | ||
125 | * @brief Set Radio On/OFF | ||
126 | * | ||
127 | * @param priv A pointer to struct lbs_private structure | ||
128 | * @option Radio Option | ||
129 | * @return 0 --success, otherwise fail | ||
130 | */ | ||
131 | static int lbs_radio_ioctl(struct lbs_private *priv, u8 option) | ||
132 | { | ||
133 | int ret = 0; | ||
134 | |||
135 | lbs_deb_enter(LBS_DEB_WEXT); | ||
136 | |||
137 | if (priv->radioon != option) { | ||
138 | lbs_deb_wext("switching radio %s\n", option ? "on" : "off"); | ||
139 | priv->radioon = option; | ||
140 | |||
141 | ret = lbs_prepare_and_send_command(priv, | ||
142 | CMD_802_11_RADIO_CONTROL, | ||
143 | CMD_ACT_SET, | ||
144 | CMD_OPTION_WAITFORRSP, 0, NULL); | ||
145 | } | ||
146 | |||
147 | lbs_deb_leave_args(LBS_DEB_WEXT, "ret %d", ret); | ||
148 | return ret; | ||
149 | } | ||
150 | |||
151 | /** | 123 | /** |
152 | * @brief Copy active data rates based on adapter mode and status | 124 | * @brief Copy active data rates based on adapter mode and status |
153 | * | 125 | * |
@@ -420,26 +392,30 @@ static int lbs_get_txpow(struct net_device *dev, | |||
420 | struct iw_request_info *info, | 392 | struct iw_request_info *info, |
421 | struct iw_param *vwrq, char *extra) | 393 | struct iw_param *vwrq, char *extra) |
422 | { | 394 | { |
423 | int ret = 0; | ||
424 | struct lbs_private *priv = dev->priv; | 395 | struct lbs_private *priv = dev->priv; |
425 | s16 curlevel = 0; | 396 | s16 curlevel = 0; |
397 | int ret = 0; | ||
426 | 398 | ||
427 | lbs_deb_enter(LBS_DEB_WEXT); | 399 | lbs_deb_enter(LBS_DEB_WEXT); |
428 | 400 | ||
401 | if (!priv->radio_on) { | ||
402 | lbs_deb_wext("tx power off\n"); | ||
403 | vwrq->value = 0; | ||
404 | vwrq->disabled = 1; | ||
405 | goto out; | ||
406 | } | ||
407 | |||
429 | ret = lbs_get_tx_power(priv, &curlevel, NULL, NULL); | 408 | ret = lbs_get_tx_power(priv, &curlevel, NULL, NULL); |
430 | if (ret) | 409 | if (ret) |
431 | goto out; | 410 | goto out; |
432 | 411 | ||
433 | lbs_deb_wext("tx power level %d dbm\n", curlevel); | 412 | lbs_deb_wext("tx power level %d dbm\n", curlevel); |
434 | |||
435 | priv->txpower_cur = curlevel; | 413 | priv->txpower_cur = curlevel; |
414 | |||
436 | vwrq->value = curlevel; | 415 | vwrq->value = curlevel; |
437 | vwrq->fixed = 1; | 416 | vwrq->fixed = 1; |
438 | if (priv->radioon) { | 417 | vwrq->disabled = 0; |
439 | vwrq->disabled = 0; | 418 | vwrq->flags = IW_TXPOW_DBM; |
440 | vwrq->flags = IW_TXPOW_DBM; | ||
441 | } else | ||
442 | vwrq->disabled = 1; | ||
443 | 419 | ||
444 | out: | 420 | out: |
445 | lbs_deb_leave_args(LBS_DEB_WEXT, "ret %d", ret); | 421 | lbs_deb_leave_args(LBS_DEB_WEXT, "ret %d", ret); |
@@ -1839,13 +1815,12 @@ static int lbs_set_txpow(struct net_device *dev, struct iw_request_info *info, | |||
1839 | lbs_deb_enter(LBS_DEB_WEXT); | 1815 | lbs_deb_enter(LBS_DEB_WEXT); |
1840 | 1816 | ||
1841 | if (vwrq->disabled) { | 1817 | if (vwrq->disabled) { |
1842 | lbs_radio_ioctl(priv, RADIO_OFF); | 1818 | lbs_set_radio(priv, RADIO_PREAMBLE_AUTO, 0); |
1843 | goto out; | 1819 | goto out; |
1844 | } | 1820 | } |
1845 | 1821 | ||
1846 | if (vwrq->fixed == 0) { | 1822 | if (vwrq->fixed == 0) { |
1847 | /* Auto power control */ | 1823 | /* Auto power control */ |
1848 | priv->preamble = CMD_TYPE_AUTO_PREAMBLE; | ||
1849 | dbm = priv->txpower_max; | 1824 | dbm = priv->txpower_max; |
1850 | } else { | 1825 | } else { |
1851 | /* Userspace check in iwrange if it should use dBm or mW, | 1826 | /* Userspace check in iwrange if it should use dBm or mW, |
@@ -1867,7 +1842,12 @@ static int lbs_set_txpow(struct net_device *dev, struct iw_request_info *info, | |||
1867 | } | 1842 | } |
1868 | } | 1843 | } |
1869 | 1844 | ||
1870 | lbs_radio_ioctl(priv, RADIO_ON); | 1845 | /* If the radio was off, turn it on */ |
1846 | if (!priv->radio_on) { | ||
1847 | ret = lbs_set_radio(priv, RADIO_PREAMBLE_AUTO, 1); | ||
1848 | if (ret) | ||
1849 | goto out; | ||
1850 | } | ||
1871 | 1851 | ||
1872 | lbs_deb_wext("txpower set %d dBm\n", dbm); | 1852 | lbs_deb_wext("txpower set %d dBm\n", dbm); |
1873 | 1853 | ||
@@ -1925,6 +1905,11 @@ static int lbs_set_essid(struct net_device *dev, struct iw_request_info *info, | |||
1925 | 1905 | ||
1926 | lbs_deb_enter(LBS_DEB_WEXT); | 1906 | lbs_deb_enter(LBS_DEB_WEXT); |
1927 | 1907 | ||
1908 | if (!priv->radio_on) { | ||
1909 | ret = -EINVAL; | ||
1910 | goto out; | ||
1911 | } | ||
1912 | |||
1928 | /* Check the size of the string */ | 1913 | /* Check the size of the string */ |
1929 | if (in_ssid_len > IW_ESSID_MAX_SIZE) { | 1914 | if (in_ssid_len > IW_ESSID_MAX_SIZE) { |
1930 | ret = -E2BIG; | 1915 | ret = -E2BIG; |
@@ -2002,6 +1987,11 @@ static int lbs_mesh_set_essid(struct net_device *dev, | |||
2002 | 1987 | ||
2003 | lbs_deb_enter(LBS_DEB_WEXT); | 1988 | lbs_deb_enter(LBS_DEB_WEXT); |
2004 | 1989 | ||
1990 | if (!priv->radio_on) { | ||
1991 | ret = -EINVAL; | ||
1992 | goto out; | ||
1993 | } | ||
1994 | |||
2005 | /* Check the size of the string */ | 1995 | /* Check the size of the string */ |
2006 | if (dwrq->length > IW_ESSID_MAX_SIZE) { | 1996 | if (dwrq->length > IW_ESSID_MAX_SIZE) { |
2007 | ret = -E2BIG; | 1997 | ret = -E2BIG; |
@@ -2043,6 +2033,9 @@ static int lbs_set_wap(struct net_device *dev, struct iw_request_info *info, | |||
2043 | 2033 | ||
2044 | lbs_deb_enter(LBS_DEB_WEXT); | 2034 | lbs_deb_enter(LBS_DEB_WEXT); |
2045 | 2035 | ||
2036 | if (!priv->radio_on) | ||
2037 | return -EINVAL; | ||
2038 | |||
2046 | if (awrq->sa_family != ARPHRD_ETHER) | 2039 | if (awrq->sa_family != ARPHRD_ETHER) |
2047 | return -EINVAL; | 2040 | return -EINVAL; |
2048 | 2041 | ||