diff options
-rw-r--r-- | drivers/net/wireless/iwmc3200wifi/cfg80211.c | 24 | ||||
-rw-r--r-- | drivers/net/wireless/iwmc3200wifi/iwm.h | 7 | ||||
-rw-r--r-- | drivers/net/wireless/iwmc3200wifi/netdev.c | 12 | ||||
-rw-r--r-- | drivers/net/wireless/iwmc3200wifi/rx.c | 18 | ||||
-rw-r--r-- | drivers/net/wireless/iwmc3200wifi/sdio.c | 6 | ||||
-rw-r--r-- | drivers/net/wireless/iwmc3200wifi/wext.c | 4 |
6 files changed, 39 insertions, 32 deletions
diff --git a/drivers/net/wireless/iwmc3200wifi/cfg80211.c b/drivers/net/wireless/iwmc3200wifi/cfg80211.c index 0cdd7ef68b78..d0629d4757d7 100644 --- a/drivers/net/wireless/iwmc3200wifi/cfg80211.c +++ b/drivers/net/wireless/iwmc3200wifi/cfg80211.c | |||
@@ -500,6 +500,28 @@ static int iwm_cfg80211_leave_ibss(struct wiphy *wiphy, struct net_device *dev) | |||
500 | return 0; | 500 | return 0; |
501 | } | 501 | } |
502 | 502 | ||
503 | static int iwm_cfg80211_set_txpower(struct wiphy *wiphy, | ||
504 | enum tx_power_setting type, int dbm) | ||
505 | { | ||
506 | switch (type) { | ||
507 | case TX_POWER_AUTOMATIC: | ||
508 | return 0; | ||
509 | default: | ||
510 | return -EOPNOTSUPP; | ||
511 | } | ||
512 | |||
513 | return 0; | ||
514 | } | ||
515 | |||
516 | static int iwm_cfg80211_get_txpower(struct wiphy *wiphy, int *dbm) | ||
517 | { | ||
518 | struct iwm_priv *iwm = wiphy_to_iwm(wiphy); | ||
519 | |||
520 | *dbm = iwm->txpower; | ||
521 | |||
522 | return 0; | ||
523 | } | ||
524 | |||
503 | static struct cfg80211_ops iwm_cfg80211_ops = { | 525 | static struct cfg80211_ops iwm_cfg80211_ops = { |
504 | .change_virtual_intf = iwm_cfg80211_change_iface, | 526 | .change_virtual_intf = iwm_cfg80211_change_iface, |
505 | .add_key = iwm_cfg80211_add_key, | 527 | .add_key = iwm_cfg80211_add_key, |
@@ -510,6 +532,8 @@ static struct cfg80211_ops iwm_cfg80211_ops = { | |||
510 | .set_wiphy_params = iwm_cfg80211_set_wiphy_params, | 532 | .set_wiphy_params = iwm_cfg80211_set_wiphy_params, |
511 | .join_ibss = iwm_cfg80211_join_ibss, | 533 | .join_ibss = iwm_cfg80211_join_ibss, |
512 | .leave_ibss = iwm_cfg80211_leave_ibss, | 534 | .leave_ibss = iwm_cfg80211_leave_ibss, |
535 | .set_tx_power = iwm_cfg80211_set_txpower, | ||
536 | .get_tx_power = iwm_cfg80211_get_txpower, | ||
513 | }; | 537 | }; |
514 | 538 | ||
515 | struct wireless_dev *iwm_wdev_alloc(int sizeof_bus, struct device *dev) | 539 | struct wireless_dev *iwm_wdev_alloc(int sizeof_bus, struct device *dev) |
diff --git a/drivers/net/wireless/iwmc3200wifi/iwm.h b/drivers/net/wireless/iwmc3200wifi/iwm.h index 90b05d999635..4da57f737f27 100644 --- a/drivers/net/wireless/iwmc3200wifi/iwm.h +++ b/drivers/net/wireless/iwmc3200wifi/iwm.h | |||
@@ -184,10 +184,6 @@ struct iwm_key { | |||
184 | #define IWM_STATUS_ASSOCIATING 3 | 184 | #define IWM_STATUS_ASSOCIATING 3 |
185 | #define IWM_STATUS_ASSOCIATED 4 | 185 | #define IWM_STATUS_ASSOCIATED 4 |
186 | 186 | ||
187 | #define IWM_RADIO_RFKILL_OFF 0 | ||
188 | #define IWM_RADIO_RFKILL_HW 1 | ||
189 | #define IWM_RADIO_RFKILL_SW 2 | ||
190 | |||
191 | struct iwm_tx_queue { | 187 | struct iwm_tx_queue { |
192 | int id; | 188 | int id; |
193 | struct sk_buff_head queue; | 189 | struct sk_buff_head queue; |
@@ -221,7 +217,6 @@ struct iwm_priv { | |||
221 | struct iwm_conf conf; | 217 | struct iwm_conf conf; |
222 | 218 | ||
223 | unsigned long status; | 219 | unsigned long status; |
224 | unsigned long radio; | ||
225 | 220 | ||
226 | struct list_head pending_notif; | 221 | struct list_head pending_notif; |
227 | wait_queue_head_t notif_queue; | 222 | wait_queue_head_t notif_queue; |
@@ -240,6 +235,7 @@ struct iwm_priv { | |||
240 | u8 bssid[ETH_ALEN]; | 235 | u8 bssid[ETH_ALEN]; |
241 | u8 channel; | 236 | u8 channel; |
242 | u16 rate; | 237 | u16 rate; |
238 | u32 txpower; | ||
243 | 239 | ||
244 | struct iwm_sta_info sta_table[IWM_STA_TABLE_NUM]; | 240 | struct iwm_sta_info sta_table[IWM_STA_TABLE_NUM]; |
245 | struct list_head bss_list; | 241 | struct list_head bss_list; |
@@ -290,7 +286,6 @@ struct iwm_priv { | |||
290 | struct timer_list watchdog; | 286 | struct timer_list watchdog; |
291 | struct work_struct reset_worker; | 287 | struct work_struct reset_worker; |
292 | struct mutex mutex; | 288 | struct mutex mutex; |
293 | struct rfkill *rfkill; | ||
294 | 289 | ||
295 | char private[0] __attribute__((__aligned__(NETDEV_ALIGN))); | 290 | char private[0] __attribute__((__aligned__(NETDEV_ALIGN))); |
296 | }; | 291 | }; |
diff --git a/drivers/net/wireless/iwmc3200wifi/netdev.c b/drivers/net/wireless/iwmc3200wifi/netdev.c index d4deb4b471e5..e94e96955b99 100644 --- a/drivers/net/wireless/iwmc3200wifi/netdev.c +++ b/drivers/net/wireless/iwmc3200wifi/netdev.c | |||
@@ -55,23 +55,15 @@ | |||
55 | static int iwm_open(struct net_device *ndev) | 55 | static int iwm_open(struct net_device *ndev) |
56 | { | 56 | { |
57 | struct iwm_priv *iwm = ndev_to_iwm(ndev); | 57 | struct iwm_priv *iwm = ndev_to_iwm(ndev); |
58 | int ret = 0; | ||
59 | |||
60 | if (!test_bit(IWM_RADIO_RFKILL_SW, &iwm->radio)) | ||
61 | ret = iwm_up(iwm); | ||
62 | 58 | ||
63 | return ret; | 59 | return iwm_up(iwm); |
64 | } | 60 | } |
65 | 61 | ||
66 | static int iwm_stop(struct net_device *ndev) | 62 | static int iwm_stop(struct net_device *ndev) |
67 | { | 63 | { |
68 | struct iwm_priv *iwm = ndev_to_iwm(ndev); | 64 | struct iwm_priv *iwm = ndev_to_iwm(ndev); |
69 | int ret = 0; | ||
70 | |||
71 | if (!test_bit(IWM_RADIO_RFKILL_SW, &iwm->radio)) | ||
72 | ret = iwm_down(iwm); | ||
73 | 65 | ||
74 | return ret; | 66 | return iwm_down(iwm); |
75 | } | 67 | } |
76 | 68 | ||
77 | /* | 69 | /* |
diff --git a/drivers/net/wireless/iwmc3200wifi/rx.c b/drivers/net/wireless/iwmc3200wifi/rx.c index 49a8be7c5396..55871da695a9 100644 --- a/drivers/net/wireless/iwmc3200wifi/rx.c +++ b/drivers/net/wireless/iwmc3200wifi/rx.c | |||
@@ -143,17 +143,18 @@ static int iwm_ntf_init_complete(struct iwm_priv *iwm, u8 *buf, | |||
143 | unsigned long buf_size, | 143 | unsigned long buf_size, |
144 | struct iwm_wifi_cmd *cmd) | 144 | struct iwm_wifi_cmd *cmd) |
145 | { | 145 | { |
146 | struct wiphy *wiphy = iwm_to_wiphy(iwm); | ||
146 | struct iwm_umac_notif_init_complete *init_complete = | 147 | struct iwm_umac_notif_init_complete *init_complete = |
147 | (struct iwm_umac_notif_init_complete *)(buf); | 148 | (struct iwm_umac_notif_init_complete *)(buf); |
148 | u16 status = le16_to_cpu(init_complete->status); | 149 | u16 status = le16_to_cpu(init_complete->status); |
150 | bool blocked = (status == UMAC_NTFY_INIT_COMPLETE_STATUS_ERR); | ||
149 | 151 | ||
150 | if (status == UMAC_NTFY_INIT_COMPLETE_STATUS_ERR) { | 152 | if (blocked) |
151 | IWM_DBG_NTF(iwm, DBG, "Hardware rf kill is on (radio off)\n"); | 153 | IWM_DBG_NTF(iwm, DBG, "Hardware rf kill is on (radio off)\n"); |
152 | set_bit(IWM_RADIO_RFKILL_HW, &iwm->radio); | 154 | else |
153 | } else { | ||
154 | IWM_DBG_NTF(iwm, DBG, "Hardware rf kill is off (radio on)\n"); | 155 | IWM_DBG_NTF(iwm, DBG, "Hardware rf kill is off (radio on)\n"); |
155 | clear_bit(IWM_RADIO_RFKILL_HW, &iwm->radio); | 156 | |
156 | } | 157 | wiphy_rfkill_set_hw_state(wiphy, blocked); |
157 | 158 | ||
158 | return 0; | 159 | return 0; |
159 | } | 160 | } |
@@ -875,6 +876,7 @@ static int iwm_ntf_statistics(struct iwm_priv *iwm, u8 *buf, | |||
875 | /* UMAC passes rate info multiplies by 2 */ | 876 | /* UMAC passes rate info multiplies by 2 */ |
876 | iwm->rate = max_rate >> 1; | 877 | iwm->rate = max_rate >> 1; |
877 | } | 878 | } |
879 | iwm->txpower = le32_to_cpu(stats->tx_power); | ||
878 | 880 | ||
879 | wstats->status = 0; | 881 | wstats->status = 0; |
880 | 882 | ||
@@ -1015,6 +1017,7 @@ static int iwm_ntf_wifi_if_wrapper(struct iwm_priv *iwm, u8 *buf, | |||
1015 | static int iwm_ntf_card_state(struct iwm_priv *iwm, u8 *buf, | 1017 | static int iwm_ntf_card_state(struct iwm_priv *iwm, u8 *buf, |
1016 | unsigned long buf_size, struct iwm_wifi_cmd *cmd) | 1018 | unsigned long buf_size, struct iwm_wifi_cmd *cmd) |
1017 | { | 1019 | { |
1020 | struct wiphy *wiphy = iwm_to_wiphy(iwm); | ||
1018 | struct iwm_lmac_card_state *state = (struct iwm_lmac_card_state *) | 1021 | struct iwm_lmac_card_state *state = (struct iwm_lmac_card_state *) |
1019 | (buf + sizeof(struct iwm_umac_wifi_in_hdr)); | 1022 | (buf + sizeof(struct iwm_umac_wifi_in_hdr)); |
1020 | u32 flags = le32_to_cpu(state->flags); | 1023 | u32 flags = le32_to_cpu(state->flags); |
@@ -1023,10 +1026,7 @@ static int iwm_ntf_card_state(struct iwm_priv *iwm, u8 *buf, | |||
1023 | flags & IWM_CARD_STATE_HW_DISABLED ? "ON" : "OFF", | 1026 | flags & IWM_CARD_STATE_HW_DISABLED ? "ON" : "OFF", |
1024 | flags & IWM_CARD_STATE_CTKILL_DISABLED ? "ON" : "OFF"); | 1027 | flags & IWM_CARD_STATE_CTKILL_DISABLED ? "ON" : "OFF"); |
1025 | 1028 | ||
1026 | if (flags & IWM_CARD_STATE_HW_DISABLED) | 1029 | wiphy_rfkill_set_hw_state(wiphy, flags & IWM_CARD_STATE_HW_DISABLED); |
1027 | set_bit(IWM_RADIO_RFKILL_HW, &iwm->radio); | ||
1028 | else | ||
1029 | clear_bit(IWM_RADIO_RFKILL_HW, &iwm->radio); | ||
1030 | 1030 | ||
1031 | return 0; | 1031 | return 0; |
1032 | } | 1032 | } |
diff --git a/drivers/net/wireless/iwmc3200wifi/sdio.c b/drivers/net/wireless/iwmc3200wifi/sdio.c index 916681837fd2..b93f620ee4f1 100644 --- a/drivers/net/wireless/iwmc3200wifi/sdio.c +++ b/drivers/net/wireless/iwmc3200wifi/sdio.c | |||
@@ -506,11 +506,7 @@ static struct sdio_driver iwm_sdio_driver = { | |||
506 | 506 | ||
507 | static int __init iwm_sdio_init_module(void) | 507 | static int __init iwm_sdio_init_module(void) |
508 | { | 508 | { |
509 | int ret; | 509 | return sdio_register_driver(&iwm_sdio_driver); |
510 | |||
511 | ret = sdio_register_driver(&iwm_sdio_driver); | ||
512 | |||
513 | return ret; | ||
514 | } | 510 | } |
515 | 511 | ||
516 | static void __exit iwm_sdio_exit_module(void) | 512 | static void __exit iwm_sdio_exit_module(void) |
diff --git a/drivers/net/wireless/iwmc3200wifi/wext.c b/drivers/net/wireless/iwmc3200wifi/wext.c index 3062f37bbe95..973457383c11 100644 --- a/drivers/net/wireless/iwmc3200wifi/wext.c +++ b/drivers/net/wireless/iwmc3200wifi/wext.c | |||
@@ -452,8 +452,8 @@ static const iw_handler iwm_handlers[] = | |||
452 | (iw_handler) cfg80211_wext_giwrts, /* SIOCGIWRTS */ | 452 | (iw_handler) cfg80211_wext_giwrts, /* SIOCGIWRTS */ |
453 | (iw_handler) cfg80211_wext_siwfrag, /* SIOCSIWFRAG */ | 453 | (iw_handler) cfg80211_wext_siwfrag, /* SIOCSIWFRAG */ |
454 | (iw_handler) cfg80211_wext_giwfrag, /* SIOCGIWFRAG */ | 454 | (iw_handler) cfg80211_wext_giwfrag, /* SIOCGIWFRAG */ |
455 | (iw_handler) NULL, /* SIOCSIWTXPOW */ | 455 | (iw_handler) cfg80211_wext_siwtxpower, /* SIOCSIWTXPOW */ |
456 | (iw_handler) NULL, /* SIOCGIWTXPOW */ | 456 | (iw_handler) cfg80211_wext_giwtxpower, /* SIOCGIWTXPOW */ |
457 | (iw_handler) NULL, /* SIOCSIWRETRY */ | 457 | (iw_handler) NULL, /* SIOCSIWRETRY */ |
458 | (iw_handler) NULL, /* SIOCGIWRETRY */ | 458 | (iw_handler) NULL, /* SIOCGIWRETRY */ |
459 | (iw_handler) cfg80211_wext_siwencode, /* SIOCSIWENCODE */ | 459 | (iw_handler) cfg80211_wext_siwencode, /* SIOCSIWENCODE */ |