diff options
author | Tomas Winkler <tomas.winkler@intel.com> | 2008-03-28 19:33:35 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2008-04-08 15:05:56 -0400 |
commit | 3109ece1114293b8201d9c140d02d7ce9a9fa387 (patch) | |
tree | fd04ee3aab9fde3d0b93633263bc0504d73aa418 /drivers | |
parent | 21c0cbe760ca6b5d4c6927c3ec1352a843a8c11c (diff) |
iwlwifi: Eliminate association from beacon
This patch removes association from beacon
using bss_info_change handler for association
Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
Signed-off-by: Gregory Greenman <gregory.greenman@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-4965-rs.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-4965.c | 174 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-4965.h | 6 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl4965-base.c | 73 |
4 files changed, 51 insertions, 204 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-4965-rs.c b/drivers/net/wireless/iwlwifi/iwl-4965-rs.c index 90ecf26af280..32eb414899d6 100644 --- a/drivers/net/wireless/iwlwifi/iwl-4965-rs.c +++ b/drivers/net/wireless/iwlwifi/iwl-4965-rs.c | |||
@@ -275,7 +275,7 @@ static int rs_send_lq_cmd(struct iwl_priv *priv, | |||
275 | if (flags & CMD_ASYNC) | 275 | if (flags & CMD_ASYNC) |
276 | cmd.meta.u.callback = iwl4965_lq_sync_callback; | 276 | cmd.meta.u.callback = iwl4965_lq_sync_callback; |
277 | 277 | ||
278 | if (iwl4965_is_associated(priv) && priv->assoc_station_added && | 278 | if (iwl_is_associated(priv) && priv->assoc_station_added && |
279 | priv->lq_mngr.lq_ready) | 279 | priv->lq_mngr.lq_ready) |
280 | return iwl_send_cmd(priv, &cmd); | 280 | return iwl_send_cmd(priv, &cmd); |
281 | 281 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-4965.c b/drivers/net/wireless/iwlwifi/iwl-4965.c index 89d600cfb846..0171bb8cbbc6 100644 --- a/drivers/net/wireless/iwlwifi/iwl-4965.c +++ b/drivers/net/wireless/iwlwifi/iwl-4965.c | |||
@@ -1306,7 +1306,7 @@ void iwl4965_chain_noise_reset(struct iwl_priv *priv) | |||
1306 | struct iwl4965_chain_noise_data *data = NULL; | 1306 | struct iwl4965_chain_noise_data *data = NULL; |
1307 | 1307 | ||
1308 | data = &(priv->chain_noise_data); | 1308 | data = &(priv->chain_noise_data); |
1309 | if ((data->state == IWL_CHAIN_NOISE_ALIVE) && iwl4965_is_associated(priv)) { | 1309 | if ((data->state == IWL_CHAIN_NOISE_ALIVE) && iwl_is_associated(priv)) { |
1310 | struct iwl4965_calibration_cmd cmd; | 1310 | struct iwl4965_calibration_cmd cmd; |
1311 | 1311 | ||
1312 | memset(&cmd, 0, sizeof(cmd)); | 1312 | memset(&cmd, 0, sizeof(cmd)); |
@@ -1581,7 +1581,7 @@ static void iwl4965_sensitivity_calibration(struct iwl_priv *priv, | |||
1581 | 1581 | ||
1582 | data = &(priv->sensitivity_data); | 1582 | data = &(priv->sensitivity_data); |
1583 | 1583 | ||
1584 | if (!iwl4965_is_associated(priv)) { | 1584 | if (!iwl_is_associated(priv)) { |
1585 | IWL_DEBUG_CALIB("<< - not associated\n"); | 1585 | IWL_DEBUG_CALIB("<< - not associated\n"); |
1586 | return; | 1586 | return; |
1587 | } | 1587 | } |
@@ -3575,77 +3575,6 @@ static int iwl4965_calc_rssi(struct iwl4965_rx_phy_res *rx_resp) | |||
3575 | 3575 | ||
3576 | #ifdef CONFIG_IWL4965_HT | 3576 | #ifdef CONFIG_IWL4965_HT |
3577 | 3577 | ||
3578 | /* Parsed Information Elements */ | ||
3579 | struct ieee802_11_elems { | ||
3580 | u8 *ds_params; | ||
3581 | u8 ds_params_len; | ||
3582 | u8 *tim; | ||
3583 | u8 tim_len; | ||
3584 | u8 *ibss_params; | ||
3585 | u8 ibss_params_len; | ||
3586 | u8 *erp_info; | ||
3587 | u8 erp_info_len; | ||
3588 | u8 *ht_cap_param; | ||
3589 | u8 ht_cap_param_len; | ||
3590 | u8 *ht_extra_param; | ||
3591 | u8 ht_extra_param_len; | ||
3592 | }; | ||
3593 | |||
3594 | static int parse_elems(u8 *start, size_t len, struct ieee802_11_elems *elems) | ||
3595 | { | ||
3596 | size_t left = len; | ||
3597 | u8 *pos = start; | ||
3598 | int unknown = 0; | ||
3599 | |||
3600 | memset(elems, 0, sizeof(*elems)); | ||
3601 | |||
3602 | while (left >= 2) { | ||
3603 | u8 id, elen; | ||
3604 | |||
3605 | id = *pos++; | ||
3606 | elen = *pos++; | ||
3607 | left -= 2; | ||
3608 | |||
3609 | if (elen > left) | ||
3610 | return -1; | ||
3611 | |||
3612 | switch (id) { | ||
3613 | case WLAN_EID_DS_PARAMS: | ||
3614 | elems->ds_params = pos; | ||
3615 | elems->ds_params_len = elen; | ||
3616 | break; | ||
3617 | case WLAN_EID_TIM: | ||
3618 | elems->tim = pos; | ||
3619 | elems->tim_len = elen; | ||
3620 | break; | ||
3621 | case WLAN_EID_IBSS_PARAMS: | ||
3622 | elems->ibss_params = pos; | ||
3623 | elems->ibss_params_len = elen; | ||
3624 | break; | ||
3625 | case WLAN_EID_ERP_INFO: | ||
3626 | elems->erp_info = pos; | ||
3627 | elems->erp_info_len = elen; | ||
3628 | break; | ||
3629 | case WLAN_EID_HT_CAPABILITY: | ||
3630 | elems->ht_cap_param = pos; | ||
3631 | elems->ht_cap_param_len = elen; | ||
3632 | break; | ||
3633 | case WLAN_EID_HT_EXTRA_INFO: | ||
3634 | elems->ht_extra_param = pos; | ||
3635 | elems->ht_extra_param_len = elen; | ||
3636 | break; | ||
3637 | default: | ||
3638 | unknown++; | ||
3639 | break; | ||
3640 | } | ||
3641 | |||
3642 | left -= elen; | ||
3643 | pos += elen; | ||
3644 | } | ||
3645 | |||
3646 | return 0; | ||
3647 | } | ||
3648 | |||
3649 | void iwl4965_init_ht_hw_capab(struct iwl_priv *priv, | 3578 | void iwl4965_init_ht_hw_capab(struct iwl_priv *priv, |
3650 | struct ieee80211_ht_info *ht_info, | 3579 | struct ieee80211_ht_info *ht_info, |
3651 | enum ieee80211_band band) | 3580 | enum ieee80211_band band) |
@@ -3862,7 +3791,6 @@ static inline void iwl4965_dbg_report_frame(struct iwl_priv *priv, | |||
3862 | #endif | 3791 | #endif |
3863 | 3792 | ||
3864 | 3793 | ||
3865 | #define IWL_DELAY_NEXT_SCAN_AFTER_ASSOC (HZ*6) | ||
3866 | 3794 | ||
3867 | /* Called for REPLY_RX (legacy ABG frames), or | 3795 | /* Called for REPLY_RX (legacy ABG frames), or |
3868 | * REPLY_RX_MPDU_CMD (HT high-throughput N frames). */ | 3796 | * REPLY_RX_MPDU_CMD (HT high-throughput N frames). */ |
@@ -3951,7 +3879,7 @@ static void iwl4965_rx_reply_rx(struct iwl_priv *priv, | |||
3951 | * which are gathered only when associated, and indicate noise | 3879 | * which are gathered only when associated, and indicate noise |
3952 | * only for the associated network channel ... | 3880 | * only for the associated network channel ... |
3953 | * Ignore these noise values while scanning (other channels) */ | 3881 | * Ignore these noise values while scanning (other channels) */ |
3954 | if (iwl4965_is_associated(priv) && | 3882 | if (iwl_is_associated(priv) && |
3955 | !test_bit(STATUS_SCANNING, &priv->status)) { | 3883 | !test_bit(STATUS_SCANNING, &priv->status)) { |
3956 | rx_status.noise = priv->last_rx_noise; | 3884 | rx_status.noise = priv->last_rx_noise; |
3957 | rx_status.signal = iwl4965_calc_sig_qual(rx_status.ssi, | 3885 | rx_status.signal = iwl4965_calc_sig_qual(rx_status.ssi, |
@@ -3962,7 +3890,7 @@ static void iwl4965_rx_reply_rx(struct iwl_priv *priv, | |||
3962 | } | 3890 | } |
3963 | 3891 | ||
3964 | /* Reset beacon noise level if not associated. */ | 3892 | /* Reset beacon noise level if not associated. */ |
3965 | if (!iwl4965_is_associated(priv)) | 3893 | if (!iwl_is_associated(priv)) |
3966 | priv->last_rx_noise = IWL_NOISE_MEAS_NOT_AVAILABLE; | 3894 | priv->last_rx_noise = IWL_NOISE_MEAS_NOT_AVAILABLE; |
3967 | 3895 | ||
3968 | /* Set "1" to report good data frames in groups of 100 */ | 3896 | /* Set "1" to report good data frames in groups of 100 */ |
@@ -3983,101 +3911,9 @@ static void iwl4965_rx_reply_rx(struct iwl_priv *priv, | |||
3983 | fc = le16_to_cpu(header->frame_control); | 3911 | fc = le16_to_cpu(header->frame_control); |
3984 | switch (fc & IEEE80211_FCTL_FTYPE) { | 3912 | switch (fc & IEEE80211_FCTL_FTYPE) { |
3985 | case IEEE80211_FTYPE_MGMT: | 3913 | case IEEE80211_FTYPE_MGMT: |
3986 | |||
3987 | if (priv->iw_mode == IEEE80211_IF_TYPE_AP) | 3914 | if (priv->iw_mode == IEEE80211_IF_TYPE_AP) |
3988 | iwl4965_update_ps_mode(priv, fc & IEEE80211_FCTL_PM, | 3915 | iwl4965_update_ps_mode(priv, fc & IEEE80211_FCTL_PM, |
3989 | header->addr2); | 3916 | header->addr2); |
3990 | switch (fc & IEEE80211_FCTL_STYPE) { | ||
3991 | case IEEE80211_STYPE_PROBE_RESP: | ||
3992 | case IEEE80211_STYPE_BEACON: | ||
3993 | if ((priv->iw_mode == IEEE80211_IF_TYPE_STA && | ||
3994 | !compare_ether_addr(header->addr2, priv->bssid)) || | ||
3995 | (priv->iw_mode == IEEE80211_IF_TYPE_IBSS && | ||
3996 | !compare_ether_addr(header->addr3, priv->bssid))) { | ||
3997 | struct ieee80211_mgmt *mgmt = | ||
3998 | (struct ieee80211_mgmt *)header; | ||
3999 | u64 timestamp = | ||
4000 | le64_to_cpu(mgmt->u.beacon.timestamp); | ||
4001 | |||
4002 | priv->timestamp0 = timestamp & 0xFFFFFFFF; | ||
4003 | priv->timestamp1 = | ||
4004 | (timestamp >> 32) & 0xFFFFFFFF; | ||
4005 | priv->beacon_int = le16_to_cpu( | ||
4006 | mgmt->u.beacon.beacon_int); | ||
4007 | if (priv->call_post_assoc_from_beacon && | ||
4008 | (priv->iw_mode == IEEE80211_IF_TYPE_STA)) { | ||
4009 | priv->call_post_assoc_from_beacon = 0; | ||
4010 | queue_work(priv->workqueue, | ||
4011 | &priv->post_associate.work); | ||
4012 | } | ||
4013 | } | ||
4014 | break; | ||
4015 | |||
4016 | case IEEE80211_STYPE_ACTION: | ||
4017 | break; | ||
4018 | |||
4019 | /* | ||
4020 | * TODO: Use the new callback function from | ||
4021 | * mac80211 instead of sniffing these packets. | ||
4022 | */ | ||
4023 | case IEEE80211_STYPE_ASSOC_RESP: | ||
4024 | case IEEE80211_STYPE_REASSOC_RESP: | ||
4025 | if (network_packet) { | ||
4026 | #ifdef CONFIG_IWL4965_HT | ||
4027 | u8 *pos = NULL; | ||
4028 | struct ieee802_11_elems elems; | ||
4029 | #endif /*CONFIG_IWL4965_HT */ | ||
4030 | struct ieee80211_mgmt *mgnt = | ||
4031 | (struct ieee80211_mgmt *)header; | ||
4032 | |||
4033 | /* We have just associated, give some | ||
4034 | * time for the 4-way handshake if | ||
4035 | * any. Don't start scan too early. */ | ||
4036 | priv->next_scan_jiffies = jiffies + | ||
4037 | IWL_DELAY_NEXT_SCAN_AFTER_ASSOC; | ||
4038 | |||
4039 | priv->assoc_id = (~((1 << 15) | (1 << 14)) | ||
4040 | & le16_to_cpu(mgnt->u.assoc_resp.aid)); | ||
4041 | priv->assoc_capability = | ||
4042 | le16_to_cpu( | ||
4043 | mgnt->u.assoc_resp.capab_info); | ||
4044 | #ifdef CONFIG_IWL4965_HT | ||
4045 | pos = mgnt->u.assoc_resp.variable; | ||
4046 | if (!parse_elems(pos, | ||
4047 | len - (pos - (u8 *) mgnt), | ||
4048 | &elems)) { | ||
4049 | if (elems.ht_extra_param && | ||
4050 | elems.ht_cap_param) | ||
4051 | break; | ||
4052 | } | ||
4053 | #endif /*CONFIG_IWL4965_HT */ | ||
4054 | /* assoc_id is 0 no association */ | ||
4055 | if (!priv->assoc_id) | ||
4056 | break; | ||
4057 | if (priv->beacon_int) | ||
4058 | queue_work(priv->workqueue, | ||
4059 | &priv->post_associate.work); | ||
4060 | else | ||
4061 | priv->call_post_assoc_from_beacon = 1; | ||
4062 | } | ||
4063 | |||
4064 | break; | ||
4065 | |||
4066 | case IEEE80211_STYPE_PROBE_REQ: | ||
4067 | if ((priv->iw_mode == IEEE80211_IF_TYPE_IBSS) && | ||
4068 | !iwl4965_is_associated(priv)) { | ||
4069 | DECLARE_MAC_BUF(mac1); | ||
4070 | DECLARE_MAC_BUF(mac2); | ||
4071 | DECLARE_MAC_BUF(mac3); | ||
4072 | |||
4073 | IWL_DEBUG_DROP("Dropping (non network): " | ||
4074 | "%s, %s, %s\n", | ||
4075 | print_mac(mac1, header->addr1), | ||
4076 | print_mac(mac2, header->addr2), | ||
4077 | print_mac(mac3, header->addr3)); | ||
4078 | return; | ||
4079 | } | ||
4080 | } | ||
4081 | iwl4965_handle_data_packet(priv, 0, include_phy, rxb, &rx_status); | 3917 | iwl4965_handle_data_packet(priv, 0, include_phy, rxb, &rx_status); |
4082 | break; | 3918 | break; |
4083 | 3919 | ||
@@ -4136,7 +3972,6 @@ static void iwl4965_rx_reply_rx_phy(struct iwl_priv *priv, | |||
4136 | memcpy(&priv->last_phy_res[1], &(pkt->u.raw[0]), | 3972 | memcpy(&priv->last_phy_res[1], &(pkt->u.raw[0]), |
4137 | sizeof(struct iwl4965_rx_phy_res)); | 3973 | sizeof(struct iwl4965_rx_phy_res)); |
4138 | } | 3974 | } |
4139 | |||
4140 | static void iwl4965_rx_missed_beacon_notif(struct iwl_priv *priv, | 3975 | static void iwl4965_rx_missed_beacon_notif(struct iwl_priv *priv, |
4141 | struct iwl4965_rx_mem_buffer *rxb) | 3976 | struct iwl4965_rx_mem_buffer *rxb) |
4142 | 3977 | ||
@@ -4158,7 +3993,6 @@ static void iwl4965_rx_missed_beacon_notif(struct iwl_priv *priv, | |||
4158 | } | 3993 | } |
4159 | #endif /*CONFIG_IWL4965_SENSITIVITY*/ | 3994 | #endif /*CONFIG_IWL4965_SENSITIVITY*/ |
4160 | } | 3995 | } |
4161 | |||
4162 | #ifdef CONFIG_IWL4965_HT | 3996 | #ifdef CONFIG_IWL4965_HT |
4163 | 3997 | ||
4164 | /** | 3998 | /** |
diff --git a/drivers/net/wireless/iwlwifi/iwl-4965.h b/drivers/net/wireless/iwlwifi/iwl-4965.h index 8c14e9a87c14..c8e7028cdf2a 100644 --- a/drivers/net/wireless/iwlwifi/iwl-4965.h +++ b/drivers/net/wireless/iwlwifi/iwl-4965.h | |||
@@ -1068,7 +1068,6 @@ struct iwl_priv { | |||
1068 | u16 active_rate; | 1068 | u16 active_rate; |
1069 | u16 active_rate_basic; | 1069 | u16 active_rate_basic; |
1070 | 1070 | ||
1071 | u8 call_post_assoc_from_beacon; | ||
1072 | u8 assoc_station_added; | 1071 | u8 assoc_station_added; |
1073 | u8 use_ant_b_for_management_frame; /* Tx antenna selection */ | 1072 | u8 use_ant_b_for_management_frame; /* Tx antenna selection */ |
1074 | u8 valid_antenna; /* Bit mask of antennas actually connected */ | 1073 | u8 valid_antenna; /* Bit mask of antennas actually connected */ |
@@ -1161,8 +1160,7 @@ struct iwl_priv { | |||
1161 | struct sk_buff *ibss_beacon; | 1160 | struct sk_buff *ibss_beacon; |
1162 | 1161 | ||
1163 | /* Last Rx'd beacon timestamp */ | 1162 | /* Last Rx'd beacon timestamp */ |
1164 | u32 timestamp0; | 1163 | u64 timestamp; |
1165 | u32 timestamp1; | ||
1166 | u16 beacon_int; | 1164 | u16 beacon_int; |
1167 | struct iwl4965_driver_hw_info hw_setting; | 1165 | struct iwl4965_driver_hw_info hw_setting; |
1168 | struct ieee80211_vif *vif; | 1166 | struct ieee80211_vif *vif; |
@@ -1226,7 +1224,7 @@ struct iwl_priv { | |||
1226 | struct timer_list statistics_periodic; | 1224 | struct timer_list statistics_periodic; |
1227 | }; /*iwl_priv */ | 1225 | }; /*iwl_priv */ |
1228 | 1226 | ||
1229 | static inline int iwl4965_is_associated(struct iwl_priv *priv) | 1227 | static inline int iwl_is_associated(struct iwl_priv *priv) |
1230 | { | 1228 | { |
1231 | return (priv->active_rxon.filter_flags & RXON_FILTER_ASSOC_MSK) ? 1 : 0; | 1229 | return (priv->active_rxon.filter_flags & RXON_FILTER_ASSOC_MSK) ? 1 : 0; |
1232 | } | 1230 | } |
diff --git a/drivers/net/wireless/iwlwifi/iwl4965-base.c b/drivers/net/wireless/iwlwifi/iwl4965-base.c index 826c912aea9a..f995af682233 100644 --- a/drivers/net/wireless/iwlwifi/iwl4965-base.c +++ b/drivers/net/wireless/iwlwifi/iwl4965-base.c | |||
@@ -901,7 +901,7 @@ static int iwl4965_commit_rxon(struct iwl_priv *priv) | |||
901 | * an RXON_ASSOC and the new config wants the associated mask enabled, | 901 | * an RXON_ASSOC and the new config wants the associated mask enabled, |
902 | * we must clear the associated from the active configuration | 902 | * we must clear the associated from the active configuration |
903 | * before we apply the new config */ | 903 | * before we apply the new config */ |
904 | if (iwl4965_is_associated(priv) && | 904 | if (iwl_is_associated(priv) && |
905 | (priv->staging_rxon.filter_flags & RXON_FILTER_ASSOC_MSK)) { | 905 | (priv->staging_rxon.filter_flags & RXON_FILTER_ASSOC_MSK)) { |
906 | IWL_DEBUG_INFO("Toggling associated bit on current RXON\n"); | 906 | IWL_DEBUG_INFO("Toggling associated bit on current RXON\n"); |
907 | active_rxon->filter_flags &= ~RXON_FILTER_ASSOC_MSK; | 907 | active_rxon->filter_flags &= ~RXON_FILTER_ASSOC_MSK; |
@@ -967,7 +967,7 @@ static int iwl4965_commit_rxon(struct iwl_priv *priv) | |||
967 | 967 | ||
968 | /* If we have set the ASSOC_MSK and we are in BSS mode then | 968 | /* If we have set the ASSOC_MSK and we are in BSS mode then |
969 | * add the IWL_AP_ID to the station rate table */ | 969 | * add the IWL_AP_ID to the station rate table */ |
970 | if (iwl4965_is_associated(priv) && | 970 | if (iwl_is_associated(priv) && |
971 | (priv->iw_mode == IEEE80211_IF_TYPE_STA)) { | 971 | (priv->iw_mode == IEEE80211_IF_TYPE_STA)) { |
972 | if (iwl4965_rxon_add_station(priv, priv->active_rxon.bssid_addr, 1) | 972 | if (iwl4965_rxon_add_station(priv, priv->active_rxon.bssid_addr, 1) |
973 | == IWL_INVALID_STATION) { | 973 | == IWL_INVALID_STATION) { |
@@ -1319,7 +1319,7 @@ unsigned int iwl4965_fill_beacon_frame(struct iwl_priv *priv, | |||
1319 | const u8 *dest, int left) | 1319 | const u8 *dest, int left) |
1320 | { | 1320 | { |
1321 | 1321 | ||
1322 | if (!iwl4965_is_associated(priv) || !priv->ibss_beacon || | 1322 | if (!iwl_is_associated(priv) || !priv->ibss_beacon || |
1323 | ((priv->iw_mode != IEEE80211_IF_TYPE_IBSS) && | 1323 | ((priv->iw_mode != IEEE80211_IF_TYPE_IBSS) && |
1324 | (priv->iw_mode != IEEE80211_IF_TYPE_AP))) | 1324 | (priv->iw_mode != IEEE80211_IF_TYPE_AP))) |
1325 | return 0; | 1325 | return 0; |
@@ -1582,7 +1582,7 @@ static void iwl4965_activate_qos(struct iwl_priv *priv, u8 force) | |||
1582 | 1582 | ||
1583 | spin_unlock_irqrestore(&priv->lock, flags); | 1583 | spin_unlock_irqrestore(&priv->lock, flags); |
1584 | 1584 | ||
1585 | if (force || iwl4965_is_associated(priv)) { | 1585 | if (force || iwl_is_associated(priv)) { |
1586 | IWL_DEBUG_QOS("send QoS cmd with Qos active=%d FLAGS=0x%X\n", | 1586 | IWL_DEBUG_QOS("send QoS cmd with Qos active=%d FLAGS=0x%X\n", |
1587 | priv->qos_data.qos_active, | 1587 | priv->qos_data.qos_active, |
1588 | priv->qos_data.def_qos_parm.qos_flags); | 1588 | priv->qos_data.def_qos_parm.qos_flags); |
@@ -1921,13 +1921,13 @@ static void iwl4965_setup_rxon_timing(struct iwl_priv *priv) | |||
1921 | conf = ieee80211_get_hw_conf(priv->hw); | 1921 | conf = ieee80211_get_hw_conf(priv->hw); |
1922 | 1922 | ||
1923 | spin_lock_irqsave(&priv->lock, flags); | 1923 | spin_lock_irqsave(&priv->lock, flags); |
1924 | priv->rxon_timing.timestamp.dw[1] = cpu_to_le32(priv->timestamp1); | 1924 | priv->rxon_timing.timestamp.dw[1] = cpu_to_le32(priv->timestamp >> 32); |
1925 | priv->rxon_timing.timestamp.dw[0] = cpu_to_le32(priv->timestamp0); | 1925 | priv->rxon_timing.timestamp.dw[0] = |
1926 | cpu_to_le32(priv->timestamp & 0xFFFFFFFF); | ||
1926 | 1927 | ||
1927 | priv->rxon_timing.listen_interval = INTEL_CONN_LISTEN_INTERVAL; | 1928 | priv->rxon_timing.listen_interval = INTEL_CONN_LISTEN_INTERVAL; |
1928 | 1929 | ||
1929 | tsf = priv->timestamp1; | 1930 | tsf = priv->timestamp; |
1930 | tsf = ((tsf << 32) | priv->timestamp0); | ||
1931 | 1931 | ||
1932 | beacon_int = priv->beacon_int; | 1932 | beacon_int = priv->beacon_int; |
1933 | spin_unlock_irqrestore(&priv->lock, flags); | 1933 | spin_unlock_irqrestore(&priv->lock, flags); |
@@ -2374,10 +2374,10 @@ static int iwl4965_tx_skb(struct iwl_priv *priv, | |||
2374 | 2374 | ||
2375 | /* drop all data frame if we are not associated */ | 2375 | /* drop all data frame if we are not associated */ |
2376 | if (((fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_DATA) && | 2376 | if (((fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_DATA) && |
2377 | (!iwl4965_is_associated(priv) || | 2377 | (!iwl_is_associated(priv) || |
2378 | ((priv->iw_mode == IEEE80211_IF_TYPE_STA) && !priv->assoc_id) || | 2378 | ((priv->iw_mode == IEEE80211_IF_TYPE_STA) && !priv->assoc_id) || |
2379 | !priv->assoc_station_added)) { | 2379 | !priv->assoc_station_added)) { |
2380 | IWL_DEBUG_DROP("Dropping - !iwl4965_is_associated\n"); | 2380 | IWL_DEBUG_DROP("Dropping - !iwl_is_associated\n"); |
2381 | goto drop_unlock; | 2381 | goto drop_unlock; |
2382 | } | 2382 | } |
2383 | 2383 | ||
@@ -2838,7 +2838,7 @@ static int iwl4965_get_measurement(struct iwl_priv *priv, | |||
2838 | int spectrum_resp_status; | 2838 | int spectrum_resp_status; |
2839 | int duration = le16_to_cpu(params->duration); | 2839 | int duration = le16_to_cpu(params->duration); |
2840 | 2840 | ||
2841 | if (iwl4965_is_associated(priv)) | 2841 | if (iwl_is_associated(priv)) |
2842 | add_time = | 2842 | add_time = |
2843 | iwl4965_usecs_to_beacons( | 2843 | iwl4965_usecs_to_beacons( |
2844 | le64_to_cpu(params->start_time) - priv->last_tsf, | 2844 | le64_to_cpu(params->start_time) - priv->last_tsf, |
@@ -2853,7 +2853,7 @@ static int iwl4965_get_measurement(struct iwl_priv *priv, | |||
2853 | cmd.len = sizeof(spectrum); | 2853 | cmd.len = sizeof(spectrum); |
2854 | spectrum.len = cpu_to_le16(cmd.len - sizeof(spectrum.len)); | 2854 | spectrum.len = cpu_to_le16(cmd.len - sizeof(spectrum.len)); |
2855 | 2855 | ||
2856 | if (iwl4965_is_associated(priv)) | 2856 | if (iwl_is_associated(priv)) |
2857 | spectrum.start_time = | 2857 | spectrum.start_time = |
2858 | iwl4965_add_beacon_time(priv->last_beacon_time, | 2858 | iwl4965_add_beacon_time(priv->last_beacon_time, |
2859 | add_time, | 2859 | add_time, |
@@ -4504,7 +4504,7 @@ static void iwl4965_irq_handle_error(struct iwl_priv *priv) | |||
4504 | IWL_DEBUG(IWL_DL_INFO | IWL_DL_FW_ERRORS, | 4504 | IWL_DEBUG(IWL_DL_INFO | IWL_DL_FW_ERRORS, |
4505 | "Restarting adapter due to uCode error.\n"); | 4505 | "Restarting adapter due to uCode error.\n"); |
4506 | 4506 | ||
4507 | if (iwl4965_is_associated(priv)) { | 4507 | if (iwl_is_associated(priv)) { |
4508 | memcpy(&priv->recovery_rxon, &priv->active_rxon, | 4508 | memcpy(&priv->recovery_rxon, &priv->active_rxon, |
4509 | sizeof(priv->recovery_rxon)); | 4509 | sizeof(priv->recovery_rxon)); |
4510 | priv->error_recovering = 1; | 4510 | priv->error_recovering = 1; |
@@ -4790,7 +4790,7 @@ static u16 iwl4965_get_passive_dwell_time(struct iwl_priv *priv, | |||
4790 | IWL_PASSIVE_DWELL_BASE + IWL_PASSIVE_DWELL_TIME_24 : | 4790 | IWL_PASSIVE_DWELL_BASE + IWL_PASSIVE_DWELL_TIME_24 : |
4791 | IWL_PASSIVE_DWELL_BASE + IWL_PASSIVE_DWELL_TIME_52; | 4791 | IWL_PASSIVE_DWELL_BASE + IWL_PASSIVE_DWELL_TIME_52; |
4792 | 4792 | ||
4793 | if (iwl4965_is_associated(priv)) { | 4793 | if (iwl_is_associated(priv)) { |
4794 | /* If we're associated, we clamp the maximum passive | 4794 | /* If we're associated, we clamp the maximum passive |
4795 | * dwell time to be 98% of the beacon interval (minus | 4795 | * dwell time to be 98% of the beacon interval (minus |
4796 | * 2 * channel tune time) */ | 4796 | * 2 * channel tune time) */ |
@@ -4830,7 +4830,7 @@ static int iwl4965_get_channels_for_scan(struct iwl_priv *priv, | |||
4830 | for (i = 0, added = 0; i < sband->n_channels; i++) { | 4830 | for (i = 0, added = 0; i < sband->n_channels; i++) { |
4831 | if (ieee80211_frequency_to_channel(channels[i].center_freq) == | 4831 | if (ieee80211_frequency_to_channel(channels[i].center_freq) == |
4832 | le16_to_cpu(priv->active_rxon.channel)) { | 4832 | le16_to_cpu(priv->active_rxon.channel)) { |
4833 | if (iwl4965_is_associated(priv)) { | 4833 | if (iwl_is_associated(priv)) { |
4834 | IWL_DEBUG_SCAN | 4834 | IWL_DEBUG_SCAN |
4835 | ("Skipping current channel %d\n", | 4835 | ("Skipping current channel %d\n", |
4836 | le16_to_cpu(priv->active_rxon.channel)); | 4836 | le16_to_cpu(priv->active_rxon.channel)); |
@@ -5711,7 +5711,7 @@ static void iwl4965_alive_start(struct iwl_priv *priv) | |||
5711 | 5711 | ||
5712 | iwl4965_send_power_mode(priv, IWL_POWER_LEVEL(priv->power_mode)); | 5712 | iwl4965_send_power_mode(priv, IWL_POWER_LEVEL(priv->power_mode)); |
5713 | 5713 | ||
5714 | if (iwl4965_is_associated(priv)) { | 5714 | if (iwl_is_associated(priv)) { |
5715 | struct iwl4965_rxon_cmd *active_rxon = | 5715 | struct iwl4965_rxon_cmd *active_rxon = |
5716 | (struct iwl4965_rxon_cmd *)(&priv->active_rxon); | 5716 | (struct iwl4965_rxon_cmd *)(&priv->active_rxon); |
5717 | 5717 | ||
@@ -6129,7 +6129,7 @@ static void iwl4965_bg_request_scan(struct work_struct *data) | |||
6129 | scan->quiet_plcp_th = IWL_PLCP_QUIET_THRESH; | 6129 | scan->quiet_plcp_th = IWL_PLCP_QUIET_THRESH; |
6130 | scan->quiet_time = IWL_ACTIVE_QUIET_TIME; | 6130 | scan->quiet_time = IWL_ACTIVE_QUIET_TIME; |
6131 | 6131 | ||
6132 | if (iwl4965_is_associated(priv)) { | 6132 | if (iwl_is_associated(priv)) { |
6133 | u16 interval = 0; | 6133 | u16 interval = 0; |
6134 | u32 extra; | 6134 | u32 extra; |
6135 | u32 suspend_time = 100; | 6135 | u32 suspend_time = 100; |
@@ -6166,7 +6166,7 @@ static void iwl4965_bg_request_scan(struct work_struct *data) | |||
6166 | memcpy(scan->direct_scan[0].ssid, | 6166 | memcpy(scan->direct_scan[0].ssid, |
6167 | priv->direct_ssid, priv->direct_ssid_len); | 6167 | priv->direct_ssid, priv->direct_ssid_len); |
6168 | direct_mask = 1; | 6168 | direct_mask = 1; |
6169 | } else if (!iwl4965_is_associated(priv) && priv->essid_len) { | 6169 | } else if (!iwl_is_associated(priv) && priv->essid_len) { |
6170 | scan->direct_scan[0].id = WLAN_EID_SSID; | 6170 | scan->direct_scan[0].id = WLAN_EID_SSID; |
6171 | scan->direct_scan[0].len = priv->essid_len; | 6171 | scan->direct_scan[0].len = priv->essid_len; |
6172 | memcpy(scan->direct_scan[0].ssid, priv->essid, priv->essid_len); | 6172 | memcpy(scan->direct_scan[0].ssid, priv->essid, priv->essid_len); |
@@ -6999,6 +6999,7 @@ static inline void iwl4965_ht_conf(struct iwl_priv *priv, | |||
6999 | } | 6999 | } |
7000 | #endif | 7000 | #endif |
7001 | 7001 | ||
7002 | #define IWL_DELAY_NEXT_SCAN_AFTER_ASSOC (HZ*6) | ||
7002 | static void iwl4965_bss_info_changed(struct ieee80211_hw *hw, | 7003 | static void iwl4965_bss_info_changed(struct ieee80211_hw *hw, |
7003 | struct ieee80211_vif *vif, | 7004 | struct ieee80211_vif *vif, |
7004 | struct ieee80211_bss_conf *bss_conf, | 7005 | struct ieee80211_bss_conf *bss_conf, |
@@ -7006,7 +7007,11 @@ static void iwl4965_bss_info_changed(struct ieee80211_hw *hw, | |||
7006 | { | 7007 | { |
7007 | struct iwl_priv *priv = hw->priv; | 7008 | struct iwl_priv *priv = hw->priv; |
7008 | 7009 | ||
7010 | IWL_DEBUG_MAC80211("changes = 0x%X\n", changes); | ||
7011 | |||
7009 | if (changes & BSS_CHANGED_ERP_PREAMBLE) { | 7012 | if (changes & BSS_CHANGED_ERP_PREAMBLE) { |
7013 | IWL_DEBUG_MAC80211("ERP_PREAMBLE %d\n", | ||
7014 | bss_conf->use_short_preamble); | ||
7010 | if (bss_conf->use_short_preamble) | 7015 | if (bss_conf->use_short_preamble) |
7011 | priv->staging_rxon.flags |= RXON_FLG_SHORT_PREAMBLE_MSK; | 7016 | priv->staging_rxon.flags |= RXON_FLG_SHORT_PREAMBLE_MSK; |
7012 | else | 7017 | else |
@@ -7014,6 +7019,7 @@ static void iwl4965_bss_info_changed(struct ieee80211_hw *hw, | |||
7014 | } | 7019 | } |
7015 | 7020 | ||
7016 | if (changes & BSS_CHANGED_ERP_CTS_PROT) { | 7021 | if (changes & BSS_CHANGED_ERP_CTS_PROT) { |
7022 | IWL_DEBUG_MAC80211("ERP_CTS %d\n", bss_conf->use_cts_prot); | ||
7017 | if (bss_conf->use_cts_prot && (priv->band != IEEE80211_BAND_5GHZ)) | 7023 | if (bss_conf->use_cts_prot && (priv->band != IEEE80211_BAND_5GHZ)) |
7018 | priv->staging_rxon.flags |= RXON_FLG_TGG_PROTECT_MSK; | 7024 | priv->staging_rxon.flags |= RXON_FLG_TGG_PROTECT_MSK; |
7019 | else | 7025 | else |
@@ -7021,19 +7027,30 @@ static void iwl4965_bss_info_changed(struct ieee80211_hw *hw, | |||
7021 | } | 7027 | } |
7022 | 7028 | ||
7023 | if (changes & BSS_CHANGED_HT) { | 7029 | if (changes & BSS_CHANGED_HT) { |
7030 | IWL_DEBUG_MAC80211("HT %d\n", bss_conf->assoc_ht); | ||
7024 | iwl4965_ht_conf(priv, bss_conf); | 7031 | iwl4965_ht_conf(priv, bss_conf); |
7025 | iwl4965_set_rxon_chain(priv); | 7032 | iwl4965_set_rxon_chain(priv); |
7026 | } | 7033 | } |
7027 | 7034 | ||
7028 | if (changes & BSS_CHANGED_ASSOC) { | 7035 | if (changes & BSS_CHANGED_ASSOC) { |
7029 | /* | 7036 | IWL_DEBUG_MAC80211("ASSOC %d\n", bss_conf->assoc); |
7030 | * TODO: | 7037 | if (bss_conf->assoc) { |
7031 | * do stuff instead of sniffing assoc resp | 7038 | priv->assoc_id = bss_conf->aid; |
7032 | */ | 7039 | priv->beacon_int = bss_conf->beacon_int; |
7040 | priv->timestamp = bss_conf->timestamp; | ||
7041 | priv->assoc_capability = bss_conf->assoc_capability; | ||
7042 | priv->next_scan_jiffies = jiffies + | ||
7043 | IWL_DELAY_NEXT_SCAN_AFTER_ASSOC; | ||
7044 | queue_work(priv->workqueue, &priv->post_associate.work); | ||
7045 | } else { | ||
7046 | priv->assoc_id = 0; | ||
7047 | IWL_DEBUG_MAC80211("DISASSOC %d\n", bss_conf->assoc); | ||
7048 | } | ||
7049 | } else if (changes && iwl_is_associated(priv) && priv->assoc_id) { | ||
7050 | IWL_DEBUG_MAC80211("Associated Changes %d\n", changes); | ||
7051 | iwl4965_send_rxon_assoc(priv); | ||
7033 | } | 7052 | } |
7034 | 7053 | ||
7035 | if (iwl4965_is_associated(priv)) | ||
7036 | iwl4965_send_rxon_assoc(priv); | ||
7037 | } | 7054 | } |
7038 | 7055 | ||
7039 | static int iwl4965_mac_hw_scan(struct ieee80211_hw *hw, u8 *ssid, size_t len) | 7056 | static int iwl4965_mac_hw_scan(struct ieee80211_hw *hw, u8 *ssid, size_t len) |
@@ -7166,7 +7183,7 @@ static int iwl4965_mac_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd, | |||
7166 | 7183 | ||
7167 | /* FIXME: need to differenciate between static and dynamic key | 7184 | /* FIXME: need to differenciate between static and dynamic key |
7168 | * in the level of mac80211 */ | 7185 | * in the level of mac80211 */ |
7169 | static_key = !iwl4965_is_associated(priv); | 7186 | static_key = !iwl_is_associated(priv); |
7170 | 7187 | ||
7171 | if (!static_key) { | 7188 | if (!static_key) { |
7172 | sta_id = iwl4965_hw_find_station(priv, addr); | 7189 | sta_id = iwl4965_hw_find_station(priv, addr); |
@@ -7247,7 +7264,7 @@ static int iwl4965_mac_conf_tx(struct ieee80211_hw *hw, int queue, | |||
7247 | mutex_lock(&priv->mutex); | 7264 | mutex_lock(&priv->mutex); |
7248 | if (priv->iw_mode == IEEE80211_IF_TYPE_AP) | 7265 | if (priv->iw_mode == IEEE80211_IF_TYPE_AP) |
7249 | iwl4965_activate_qos(priv, 1); | 7266 | iwl4965_activate_qos(priv, 1); |
7250 | else if (priv->assoc_id && iwl4965_is_associated(priv)) | 7267 | else if (priv->assoc_id && iwl_is_associated(priv)) |
7251 | iwl4965_activate_qos(priv, 0); | 7268 | iwl4965_activate_qos(priv, 0); |
7252 | 7269 | ||
7253 | mutex_unlock(&priv->mutex); | 7270 | mutex_unlock(&priv->mutex); |
@@ -7330,7 +7347,6 @@ static void iwl4965_mac_reset_tsf(struct ieee80211_hw *hw) | |||
7330 | spin_lock_irqsave(&priv->lock, flags); | 7347 | spin_lock_irqsave(&priv->lock, flags); |
7331 | priv->assoc_id = 0; | 7348 | priv->assoc_id = 0; |
7332 | priv->assoc_capability = 0; | 7349 | priv->assoc_capability = 0; |
7333 | priv->call_post_assoc_from_beacon = 0; | ||
7334 | priv->assoc_station_added = 0; | 7350 | priv->assoc_station_added = 0; |
7335 | 7351 | ||
7336 | /* new association get rid of ibss beacon skb */ | 7352 | /* new association get rid of ibss beacon skb */ |
@@ -7340,8 +7356,7 @@ static void iwl4965_mac_reset_tsf(struct ieee80211_hw *hw) | |||
7340 | priv->ibss_beacon = NULL; | 7356 | priv->ibss_beacon = NULL; |
7341 | 7357 | ||
7342 | priv->beacon_int = priv->hw->conf.beacon_int; | 7358 | priv->beacon_int = priv->hw->conf.beacon_int; |
7343 | priv->timestamp1 = 0; | 7359 | priv->timestamp = 0; |
7344 | priv->timestamp0 = 0; | ||
7345 | if ((priv->iw_mode == IEEE80211_IF_TYPE_STA)) | 7360 | if ((priv->iw_mode == IEEE80211_IF_TYPE_STA)) |
7346 | priv->beacon_int = 0; | 7361 | priv->beacon_int = 0; |
7347 | 7362 | ||