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 */ |
