diff options
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl3945-base.c')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl3945-base.c | 239 |
1 files changed, 143 insertions, 96 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c index b775d5bab668..62b26befddc5 100644 --- a/drivers/net/wireless/iwlwifi/iwl3945-base.c +++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c | |||
@@ -1160,7 +1160,7 @@ static int iwl3945_commit_rxon(struct iwl3945_priv *priv) | |||
1160 | /* If we have set the ASSOC_MSK and we are in BSS mode then | 1160 | /* If we have set the ASSOC_MSK and we are in BSS mode then |
1161 | * add the IWL_AP_ID to the station rate table */ | 1161 | * add the IWL_AP_ID to the station rate table */ |
1162 | if (iwl3945_is_associated(priv) && | 1162 | if (iwl3945_is_associated(priv) && |
1163 | (priv->iw_mode == IEEE80211_IF_TYPE_STA)) | 1163 | (priv->iw_mode == NL80211_IFTYPE_STATION)) |
1164 | if (iwl3945_add_station(priv, priv->active_rxon.bssid_addr, 1, 0) | 1164 | if (iwl3945_add_station(priv, priv->active_rxon.bssid_addr, 1, 0) |
1165 | == IWL_INVALID_STATION) { | 1165 | == IWL_INVALID_STATION) { |
1166 | IWL_ERROR("Error adding AP address for transmit.\n"); | 1166 | IWL_ERROR("Error adding AP address for transmit.\n"); |
@@ -1447,8 +1447,8 @@ unsigned int iwl3945_fill_beacon_frame(struct iwl3945_priv *priv, | |||
1447 | { | 1447 | { |
1448 | 1448 | ||
1449 | if (!iwl3945_is_associated(priv) || !priv->ibss_beacon || | 1449 | if (!iwl3945_is_associated(priv) || !priv->ibss_beacon || |
1450 | ((priv->iw_mode != IEEE80211_IF_TYPE_IBSS) && | 1450 | ((priv->iw_mode != NL80211_IFTYPE_ADHOC) && |
1451 | (priv->iw_mode != IEEE80211_IF_TYPE_AP))) | 1451 | (priv->iw_mode != NL80211_IFTYPE_AP))) |
1452 | return 0; | 1452 | return 0; |
1453 | 1453 | ||
1454 | if (priv->ibss_beacon->len > left) | 1454 | if (priv->ibss_beacon->len > left) |
@@ -1746,14 +1746,14 @@ static void iwl3945_reset_qos(struct iwl3945_priv *priv) | |||
1746 | spin_lock_irqsave(&priv->lock, flags); | 1746 | spin_lock_irqsave(&priv->lock, flags); |
1747 | priv->qos_data.qos_active = 0; | 1747 | priv->qos_data.qos_active = 0; |
1748 | 1748 | ||
1749 | if (priv->iw_mode == IEEE80211_IF_TYPE_IBSS) { | 1749 | if (priv->iw_mode == NL80211_IFTYPE_ADHOC) { |
1750 | if (priv->qos_data.qos_enable) | 1750 | if (priv->qos_data.qos_enable) |
1751 | priv->qos_data.qos_active = 1; | 1751 | priv->qos_data.qos_active = 1; |
1752 | if (!(priv->active_rate & 0xfff0)) { | 1752 | if (!(priv->active_rate & 0xfff0)) { |
1753 | cw_min = 31; | 1753 | cw_min = 31; |
1754 | is_legacy = 1; | 1754 | is_legacy = 1; |
1755 | } | 1755 | } |
1756 | } else if (priv->iw_mode == IEEE80211_IF_TYPE_AP) { | 1756 | } else if (priv->iw_mode == NL80211_IFTYPE_AP) { |
1757 | if (priv->qos_data.qos_enable) | 1757 | if (priv->qos_data.qos_enable) |
1758 | priv->qos_data.qos_active = 1; | 1758 | priv->qos_data.qos_active = 1; |
1759 | } else if (!(priv->staging_rxon.flags & RXON_FLG_SHORT_SLOT_MSK)) { | 1759 | } else if (!(priv->staging_rxon.flags & RXON_FLG_SHORT_SLOT_MSK)) { |
@@ -2120,7 +2120,7 @@ static void iwl3945_setup_rxon_timing(struct iwl3945_priv *priv) | |||
2120 | beacon_int = priv->beacon_int; | 2120 | beacon_int = priv->beacon_int; |
2121 | spin_unlock_irqrestore(&priv->lock, flags); | 2121 | spin_unlock_irqrestore(&priv->lock, flags); |
2122 | 2122 | ||
2123 | if (priv->iw_mode == IEEE80211_IF_TYPE_STA) { | 2123 | if (priv->iw_mode == NL80211_IFTYPE_STATION) { |
2124 | if (beacon_int == 0) { | 2124 | if (beacon_int == 0) { |
2125 | priv->rxon_timing.beacon_interval = cpu_to_le16(100); | 2125 | priv->rxon_timing.beacon_interval = cpu_to_le16(100); |
2126 | priv->rxon_timing.beacon_init_val = cpu_to_le32(102400); | 2126 | priv->rxon_timing.beacon_init_val = cpu_to_le32(102400); |
@@ -2156,7 +2156,7 @@ static void iwl3945_setup_rxon_timing(struct iwl3945_priv *priv) | |||
2156 | 2156 | ||
2157 | static int iwl3945_scan_initiate(struct iwl3945_priv *priv) | 2157 | static int iwl3945_scan_initiate(struct iwl3945_priv *priv) |
2158 | { | 2158 | { |
2159 | if (priv->iw_mode == IEEE80211_IF_TYPE_AP) { | 2159 | if (priv->iw_mode == NL80211_IFTYPE_AP) { |
2160 | IWL_ERROR("APs don't scan.\n"); | 2160 | IWL_ERROR("APs don't scan.\n"); |
2161 | return 0; | 2161 | return 0; |
2162 | } | 2162 | } |
@@ -2218,7 +2218,7 @@ static void iwl3945_set_flags_for_phymode(struct iwl3945_priv *priv, | |||
2218 | else | 2218 | else |
2219 | priv->staging_rxon.flags &= ~RXON_FLG_SHORT_SLOT_MSK; | 2219 | priv->staging_rxon.flags &= ~RXON_FLG_SHORT_SLOT_MSK; |
2220 | 2220 | ||
2221 | if (priv->iw_mode == IEEE80211_IF_TYPE_IBSS) | 2221 | if (priv->iw_mode == NL80211_IFTYPE_ADHOC) |
2222 | priv->staging_rxon.flags &= ~RXON_FLG_SHORT_SLOT_MSK; | 2222 | priv->staging_rxon.flags &= ~RXON_FLG_SHORT_SLOT_MSK; |
2223 | 2223 | ||
2224 | priv->staging_rxon.flags |= RXON_FLG_BAND_24G_MSK; | 2224 | priv->staging_rxon.flags |= RXON_FLG_BAND_24G_MSK; |
@@ -2237,23 +2237,23 @@ static void iwl3945_connection_init_rx_config(struct iwl3945_priv *priv) | |||
2237 | memset(&priv->staging_rxon, 0, sizeof(priv->staging_rxon)); | 2237 | memset(&priv->staging_rxon, 0, sizeof(priv->staging_rxon)); |
2238 | 2238 | ||
2239 | switch (priv->iw_mode) { | 2239 | switch (priv->iw_mode) { |
2240 | case IEEE80211_IF_TYPE_AP: | 2240 | case NL80211_IFTYPE_AP: |
2241 | priv->staging_rxon.dev_type = RXON_DEV_TYPE_AP; | 2241 | priv->staging_rxon.dev_type = RXON_DEV_TYPE_AP; |
2242 | break; | 2242 | break; |
2243 | 2243 | ||
2244 | case IEEE80211_IF_TYPE_STA: | 2244 | case NL80211_IFTYPE_STATION: |
2245 | priv->staging_rxon.dev_type = RXON_DEV_TYPE_ESS; | 2245 | priv->staging_rxon.dev_type = RXON_DEV_TYPE_ESS; |
2246 | priv->staging_rxon.filter_flags = RXON_FILTER_ACCEPT_GRP_MSK; | 2246 | priv->staging_rxon.filter_flags = RXON_FILTER_ACCEPT_GRP_MSK; |
2247 | break; | 2247 | break; |
2248 | 2248 | ||
2249 | case IEEE80211_IF_TYPE_IBSS: | 2249 | case NL80211_IFTYPE_ADHOC: |
2250 | priv->staging_rxon.dev_type = RXON_DEV_TYPE_IBSS; | 2250 | priv->staging_rxon.dev_type = RXON_DEV_TYPE_IBSS; |
2251 | priv->staging_rxon.flags = RXON_FLG_SHORT_PREAMBLE_MSK; | 2251 | priv->staging_rxon.flags = RXON_FLG_SHORT_PREAMBLE_MSK; |
2252 | priv->staging_rxon.filter_flags = RXON_FILTER_BCON_AWARE_MSK | | 2252 | priv->staging_rxon.filter_flags = RXON_FILTER_BCON_AWARE_MSK | |
2253 | RXON_FILTER_ACCEPT_GRP_MSK; | 2253 | RXON_FILTER_ACCEPT_GRP_MSK; |
2254 | break; | 2254 | break; |
2255 | 2255 | ||
2256 | case IEEE80211_IF_TYPE_MNTR: | 2256 | case NL80211_IFTYPE_MONITOR: |
2257 | priv->staging_rxon.dev_type = RXON_DEV_TYPE_SNIFFER; | 2257 | priv->staging_rxon.dev_type = RXON_DEV_TYPE_SNIFFER; |
2258 | priv->staging_rxon.filter_flags = RXON_FILTER_PROMISC_MSK | | 2258 | priv->staging_rxon.filter_flags = RXON_FILTER_PROMISC_MSK | |
2259 | RXON_FILTER_CTL2HOST_MSK | RXON_FILTER_ACCEPT_GRP_MSK; | 2259 | RXON_FILTER_CTL2HOST_MSK | RXON_FILTER_ACCEPT_GRP_MSK; |
@@ -2282,7 +2282,7 @@ static void iwl3945_connection_init_rx_config(struct iwl3945_priv *priv) | |||
2282 | * in some case A channels are all non IBSS | 2282 | * in some case A channels are all non IBSS |
2283 | * in this case force B/G channel | 2283 | * in this case force B/G channel |
2284 | */ | 2284 | */ |
2285 | if ((priv->iw_mode == IEEE80211_IF_TYPE_IBSS) && | 2285 | if ((priv->iw_mode == NL80211_IFTYPE_ADHOC) && |
2286 | !(is_channel_ibss(ch_info))) | 2286 | !(is_channel_ibss(ch_info))) |
2287 | ch_info = &priv->channel_info[0]; | 2287 | ch_info = &priv->channel_info[0]; |
2288 | 2288 | ||
@@ -2302,7 +2302,7 @@ static void iwl3945_connection_init_rx_config(struct iwl3945_priv *priv) | |||
2302 | 2302 | ||
2303 | static int iwl3945_set_mode(struct iwl3945_priv *priv, int mode) | 2303 | static int iwl3945_set_mode(struct iwl3945_priv *priv, int mode) |
2304 | { | 2304 | { |
2305 | if (mode == IEEE80211_IF_TYPE_IBSS) { | 2305 | if (mode == NL80211_IFTYPE_ADHOC) { |
2306 | const struct iwl3945_channel_info *ch_info; | 2306 | const struct iwl3945_channel_info *ch_info; |
2307 | 2307 | ||
2308 | ch_info = iwl3945_get_channel_info(priv, | 2308 | ch_info = iwl3945_get_channel_info(priv, |
@@ -2469,11 +2469,11 @@ static int iwl3945_get_sta_id(struct iwl3945_priv *priv, struct ieee80211_hdr *h | |||
2469 | 2469 | ||
2470 | /* If we are a client station in a BSS network, use the special | 2470 | /* If we are a client station in a BSS network, use the special |
2471 | * AP station entry (that's the only station we communicate with) */ | 2471 | * AP station entry (that's the only station we communicate with) */ |
2472 | case IEEE80211_IF_TYPE_STA: | 2472 | case NL80211_IFTYPE_STATION: |
2473 | return IWL_AP_ID; | 2473 | return IWL_AP_ID; |
2474 | 2474 | ||
2475 | /* If we are an AP, then find the station, or use BCAST */ | 2475 | /* If we are an AP, then find the station, or use BCAST */ |
2476 | case IEEE80211_IF_TYPE_AP: | 2476 | case NL80211_IFTYPE_AP: |
2477 | sta_id = iwl3945_hw_find_station(priv, hdr->addr1); | 2477 | sta_id = iwl3945_hw_find_station(priv, hdr->addr1); |
2478 | if (sta_id != IWL_INVALID_STATION) | 2478 | if (sta_id != IWL_INVALID_STATION) |
2479 | return sta_id; | 2479 | return sta_id; |
@@ -2481,7 +2481,7 @@ static int iwl3945_get_sta_id(struct iwl3945_priv *priv, struct ieee80211_hdr *h | |||
2481 | 2481 | ||
2482 | /* If this frame is going out to an IBSS network, find the station, | 2482 | /* If this frame is going out to an IBSS network, find the station, |
2483 | * or create a new station table entry */ | 2483 | * or create a new station table entry */ |
2484 | case IEEE80211_IF_TYPE_IBSS: { | 2484 | case NL80211_IFTYPE_ADHOC: { |
2485 | DECLARE_MAC_BUF(mac); | 2485 | DECLARE_MAC_BUF(mac); |
2486 | 2486 | ||
2487 | /* Create new station table entry */ | 2487 | /* Create new station table entry */ |
@@ -2502,7 +2502,7 @@ static int iwl3945_get_sta_id(struct iwl3945_priv *priv, struct ieee80211_hdr *h | |||
2502 | } | 2502 | } |
2503 | /* If we are in monitor mode, use BCAST. This is required for | 2503 | /* If we are in monitor mode, use BCAST. This is required for |
2504 | * packet injection. */ | 2504 | * packet injection. */ |
2505 | case IEEE80211_IF_TYPE_MNTR: | 2505 | case NL80211_IFTYPE_MONITOR: |
2506 | return priv->hw_setting.bcast_sta_id; | 2506 | return priv->hw_setting.bcast_sta_id; |
2507 | 2507 | ||
2508 | default: | 2508 | default: |
@@ -2565,16 +2565,16 @@ static int iwl3945_tx_skb(struct iwl3945_priv *priv, struct sk_buff *skb) | |||
2565 | 2565 | ||
2566 | /* drop all data frame if we are not associated */ | 2566 | /* drop all data frame if we are not associated */ |
2567 | if (ieee80211_is_data(fc) && | 2567 | if (ieee80211_is_data(fc) && |
2568 | (priv->iw_mode != IEEE80211_IF_TYPE_MNTR) && /* packet injection */ | 2568 | (priv->iw_mode != NL80211_IFTYPE_MONITOR) && /* packet injection */ |
2569 | (!iwl3945_is_associated(priv) || | 2569 | (!iwl3945_is_associated(priv) || |
2570 | ((priv->iw_mode == IEEE80211_IF_TYPE_STA) && !priv->assoc_id))) { | 2570 | ((priv->iw_mode == NL80211_IFTYPE_STATION) && !priv->assoc_id))) { |
2571 | IWL_DEBUG_DROP("Dropping - !iwl3945_is_associated\n"); | 2571 | IWL_DEBUG_DROP("Dropping - !iwl3945_is_associated\n"); |
2572 | goto drop_unlock; | 2572 | goto drop_unlock; |
2573 | } | 2573 | } |
2574 | 2574 | ||
2575 | spin_unlock_irqrestore(&priv->lock, flags); | 2575 | spin_unlock_irqrestore(&priv->lock, flags); |
2576 | 2576 | ||
2577 | hdr_len = ieee80211_get_hdrlen(le16_to_cpu(fc)); | 2577 | hdr_len = ieee80211_hdrlen(fc); |
2578 | 2578 | ||
2579 | /* Find (or create) index into station table for destination station */ | 2579 | /* Find (or create) index into station table for destination station */ |
2580 | sta_id = iwl3945_get_sta_id(priv, hdr); | 2580 | sta_id = iwl3945_get_sta_id(priv, hdr); |
@@ -2590,7 +2590,7 @@ static int iwl3945_tx_skb(struct iwl3945_priv *priv, struct sk_buff *skb) | |||
2590 | 2590 | ||
2591 | if (ieee80211_is_data_qos(fc)) { | 2591 | if (ieee80211_is_data_qos(fc)) { |
2592 | qc = ieee80211_get_qos_ctl(hdr); | 2592 | qc = ieee80211_get_qos_ctl(hdr); |
2593 | tid = qc[0] & 0xf; | 2593 | tid = qc[0] & IEEE80211_QOS_CTL_TID_MASK; |
2594 | seq_number = priv->stations[sta_id].tid[tid].seq_number & | 2594 | seq_number = priv->stations[sta_id].tid[tid].seq_number & |
2595 | IEEE80211_SCTL_SEQ; | 2595 | IEEE80211_SCTL_SEQ; |
2596 | hdr->seq_ctrl = cpu_to_le16(seq_number) | | 2596 | hdr->seq_ctrl = cpu_to_le16(seq_number) | |
@@ -2709,7 +2709,7 @@ static int iwl3945_tx_skb(struct iwl3945_priv *priv, struct sk_buff *skb) | |||
2709 | sizeof(out_cmd->cmd.tx)); | 2709 | sizeof(out_cmd->cmd.tx)); |
2710 | 2710 | ||
2711 | iwl3945_print_hex_dump(IWL_DL_TX, (u8 *)out_cmd->cmd.tx.hdr, | 2711 | iwl3945_print_hex_dump(IWL_DL_TX, (u8 *)out_cmd->cmd.tx.hdr, |
2712 | ieee80211_get_hdrlen(le16_to_cpu(fc))); | 2712 | ieee80211_hdrlen(fc)); |
2713 | 2713 | ||
2714 | /* Tell device the write index *just past* this latest filled TFD */ | 2714 | /* Tell device the write index *just past* this latest filled TFD */ |
2715 | q->write_ptr = iwl_queue_inc_wrap(q->write_ptr, q->n_bd); | 2715 | q->write_ptr = iwl_queue_inc_wrap(q->write_ptr, q->n_bd); |
@@ -2806,7 +2806,7 @@ static void iwl3945_radio_kill_sw(struct iwl3945_priv *priv, int disable_radio) | |||
2806 | if (disable_radio) { | 2806 | if (disable_radio) { |
2807 | iwl3945_scan_cancel(priv); | 2807 | iwl3945_scan_cancel(priv); |
2808 | /* FIXME: This is a workaround for AP */ | 2808 | /* FIXME: This is a workaround for AP */ |
2809 | if (priv->iw_mode != IEEE80211_IF_TYPE_AP) { | 2809 | if (priv->iw_mode != NL80211_IFTYPE_AP) { |
2810 | spin_lock_irqsave(&priv->lock, flags); | 2810 | spin_lock_irqsave(&priv->lock, flags); |
2811 | iwl3945_write32(priv, CSR_UCODE_DRV_GP1_SET, | 2811 | iwl3945_write32(priv, CSR_UCODE_DRV_GP1_SET, |
2812 | CSR_UCODE_SW_BIT_RFKILL); | 2812 | CSR_UCODE_SW_BIT_RFKILL); |
@@ -3161,7 +3161,7 @@ static void iwl3945_rx_beacon_notif(struct iwl3945_priv *priv, | |||
3161 | le32_to_cpu(beacon->low_tsf), rate); | 3161 | le32_to_cpu(beacon->low_tsf), rate); |
3162 | #endif | 3162 | #endif |
3163 | 3163 | ||
3164 | if ((priv->iw_mode == IEEE80211_IF_TYPE_AP) && | 3164 | if ((priv->iw_mode == NL80211_IFTYPE_AP) && |
3165 | (!test_bit(STATUS_EXIT_PENDING, &priv->status))) | 3165 | (!test_bit(STATUS_EXIT_PENDING, &priv->status))) |
3166 | queue_work(priv->workqueue, &priv->beacon_update); | 3166 | queue_work(priv->workqueue, &priv->beacon_update); |
3167 | } | 3167 | } |
@@ -4782,8 +4782,11 @@ static void iwl3945_free_channel_map(struct iwl3945_priv *priv) | |||
4782 | /* For active scan, listen ACTIVE_DWELL_TIME (msec) on each channel after | 4782 | /* For active scan, listen ACTIVE_DWELL_TIME (msec) on each channel after |
4783 | * sending probe req. This should be set long enough to hear probe responses | 4783 | * sending probe req. This should be set long enough to hear probe responses |
4784 | * from more than one AP. */ | 4784 | * from more than one AP. */ |
4785 | #define IWL_ACTIVE_DWELL_TIME_24 (20) /* all times in msec */ | 4785 | #define IWL_ACTIVE_DWELL_TIME_24 (30) /* all times in msec */ |
4786 | #define IWL_ACTIVE_DWELL_TIME_52 (10) | 4786 | #define IWL_ACTIVE_DWELL_TIME_52 (20) |
4787 | |||
4788 | #define IWL_ACTIVE_DWELL_FACTOR_24GHZ (3) | ||
4789 | #define IWL_ACTIVE_DWELL_FACTOR_52GHZ (2) | ||
4787 | 4790 | ||
4788 | /* For faster active scanning, scan will move to the next channel if fewer than | 4791 | /* For faster active scanning, scan will move to the next channel if fewer than |
4789 | * PLCP_QUIET_THRESH packets are heard on this channel within | 4792 | * PLCP_QUIET_THRESH packets are heard on this channel within |
@@ -4792,7 +4795,7 @@ static void iwl3945_free_channel_map(struct iwl3945_priv *priv) | |||
4792 | * no other traffic). | 4795 | * no other traffic). |
4793 | * Disable "quiet" feature by setting PLCP_QUIET_THRESH to 0. */ | 4796 | * Disable "quiet" feature by setting PLCP_QUIET_THRESH to 0. */ |
4794 | #define IWL_PLCP_QUIET_THRESH __constant_cpu_to_le16(1) /* packets */ | 4797 | #define IWL_PLCP_QUIET_THRESH __constant_cpu_to_le16(1) /* packets */ |
4795 | #define IWL_ACTIVE_QUIET_TIME __constant_cpu_to_le16(5) /* msec */ | 4798 | #define IWL_ACTIVE_QUIET_TIME __constant_cpu_to_le16(10) /* msec */ |
4796 | 4799 | ||
4797 | /* For passive scan, listen PASSIVE_DWELL_TIME (msec) on each channel. | 4800 | /* For passive scan, listen PASSIVE_DWELL_TIME (msec) on each channel. |
4798 | * Must be set longer than active dwell time. | 4801 | * Must be set longer than active dwell time. |
@@ -4802,19 +4805,23 @@ static void iwl3945_free_channel_map(struct iwl3945_priv *priv) | |||
4802 | #define IWL_PASSIVE_DWELL_BASE (100) | 4805 | #define IWL_PASSIVE_DWELL_BASE (100) |
4803 | #define IWL_CHANNEL_TUNE_TIME 5 | 4806 | #define IWL_CHANNEL_TUNE_TIME 5 |
4804 | 4807 | ||
4808 | #define IWL_SCAN_PROBE_MASK(n) cpu_to_le32((BIT(n) | (BIT(n) - BIT(1)))) | ||
4809 | |||
4805 | static inline u16 iwl3945_get_active_dwell_time(struct iwl3945_priv *priv, | 4810 | static inline u16 iwl3945_get_active_dwell_time(struct iwl3945_priv *priv, |
4806 | enum ieee80211_band band) | 4811 | enum ieee80211_band band, |
4812 | u8 n_probes) | ||
4807 | { | 4813 | { |
4808 | if (band == IEEE80211_BAND_5GHZ) | 4814 | if (band == IEEE80211_BAND_5GHZ) |
4809 | return IWL_ACTIVE_DWELL_TIME_52; | 4815 | return IWL_ACTIVE_DWELL_TIME_52 + |
4816 | IWL_ACTIVE_DWELL_FACTOR_52GHZ * (n_probes + 1); | ||
4810 | else | 4817 | else |
4811 | return IWL_ACTIVE_DWELL_TIME_24; | 4818 | return IWL_ACTIVE_DWELL_TIME_24 + |
4819 | IWL_ACTIVE_DWELL_FACTOR_24GHZ * (n_probes + 1); | ||
4812 | } | 4820 | } |
4813 | 4821 | ||
4814 | static u16 iwl3945_get_passive_dwell_time(struct iwl3945_priv *priv, | 4822 | static u16 iwl3945_get_passive_dwell_time(struct iwl3945_priv *priv, |
4815 | enum ieee80211_band band) | 4823 | enum ieee80211_band band) |
4816 | { | 4824 | { |
4817 | u16 active = iwl3945_get_active_dwell_time(priv, band); | ||
4818 | u16 passive = (band == IEEE80211_BAND_2GHZ) ? | 4825 | u16 passive = (band == IEEE80211_BAND_2GHZ) ? |
4819 | IWL_PASSIVE_DWELL_BASE + IWL_PASSIVE_DWELL_TIME_24 : | 4826 | IWL_PASSIVE_DWELL_BASE + IWL_PASSIVE_DWELL_TIME_24 : |
4820 | IWL_PASSIVE_DWELL_BASE + IWL_PASSIVE_DWELL_TIME_52; | 4827 | IWL_PASSIVE_DWELL_BASE + IWL_PASSIVE_DWELL_TIME_52; |
@@ -4829,15 +4836,12 @@ static u16 iwl3945_get_passive_dwell_time(struct iwl3945_priv *priv, | |||
4829 | passive = (passive * 98) / 100 - IWL_CHANNEL_TUNE_TIME * 2; | 4836 | passive = (passive * 98) / 100 - IWL_CHANNEL_TUNE_TIME * 2; |
4830 | } | 4837 | } |
4831 | 4838 | ||
4832 | if (passive <= active) | ||
4833 | passive = active + 1; | ||
4834 | |||
4835 | return passive; | 4839 | return passive; |
4836 | } | 4840 | } |
4837 | 4841 | ||
4838 | static int iwl3945_get_channels_for_scan(struct iwl3945_priv *priv, | 4842 | static int iwl3945_get_channels_for_scan(struct iwl3945_priv *priv, |
4839 | enum ieee80211_band band, | 4843 | enum ieee80211_band band, |
4840 | u8 is_active, u8 direct_mask, | 4844 | u8 is_active, u8 n_probes, |
4841 | struct iwl3945_scan_channel *scan_ch) | 4845 | struct iwl3945_scan_channel *scan_ch) |
4842 | { | 4846 | { |
4843 | const struct ieee80211_channel *channels = NULL; | 4847 | const struct ieee80211_channel *channels = NULL; |
@@ -4853,9 +4857,12 @@ static int iwl3945_get_channels_for_scan(struct iwl3945_priv *priv, | |||
4853 | 4857 | ||
4854 | channels = sband->channels; | 4858 | channels = sband->channels; |
4855 | 4859 | ||
4856 | active_dwell = iwl3945_get_active_dwell_time(priv, band); | 4860 | active_dwell = iwl3945_get_active_dwell_time(priv, band, n_probes); |
4857 | passive_dwell = iwl3945_get_passive_dwell_time(priv, band); | 4861 | passive_dwell = iwl3945_get_passive_dwell_time(priv, band); |
4858 | 4862 | ||
4863 | if (passive_dwell <= active_dwell) | ||
4864 | passive_dwell = active_dwell + 1; | ||
4865 | |||
4859 | for (i = 0, added = 0; i < sband->n_channels; i++) { | 4866 | for (i = 0, added = 0; i < sband->n_channels; i++) { |
4860 | if (channels[i].flags & IEEE80211_CHAN_DISABLED) | 4867 | if (channels[i].flags & IEEE80211_CHAN_DISABLED) |
4861 | continue; | 4868 | continue; |
@@ -4875,8 +4882,8 @@ static int iwl3945_get_channels_for_scan(struct iwl3945_priv *priv, | |||
4875 | else | 4882 | else |
4876 | scan_ch->type = 1; /* active */ | 4883 | scan_ch->type = 1; /* active */ |
4877 | 4884 | ||
4878 | if (scan_ch->type & 1) | 4885 | if ((scan_ch->type & 1) && n_probes) |
4879 | scan_ch->type |= (direct_mask << 1); | 4886 | scan_ch->type |= IWL_SCAN_PROBE_MASK(n_probes); |
4880 | 4887 | ||
4881 | scan_ch->active_dwell = cpu_to_le16(active_dwell); | 4888 | scan_ch->active_dwell = cpu_to_le16(active_dwell); |
4882 | scan_ch->passive_dwell = cpu_to_le16(passive_dwell); | 4889 | scan_ch->passive_dwell = cpu_to_le16(passive_dwell); |
@@ -6052,7 +6059,7 @@ static void iwl3945_bg_set_monitor(struct work_struct *work) | |||
6052 | if (!iwl3945_is_ready(priv)) | 6059 | if (!iwl3945_is_ready(priv)) |
6053 | IWL_DEBUG(IWL_DL_STATE, "leave - not ready\n"); | 6060 | IWL_DEBUG(IWL_DL_STATE, "leave - not ready\n"); |
6054 | else | 6061 | else |
6055 | if (iwl3945_set_mode(priv, IEEE80211_IF_TYPE_MNTR) != 0) | 6062 | if (iwl3945_set_mode(priv, NL80211_IFTYPE_MONITOR) != 0) |
6056 | IWL_ERROR("iwl3945_set_mode() failed\n"); | 6063 | IWL_ERROR("iwl3945_set_mode() failed\n"); |
6057 | 6064 | ||
6058 | mutex_unlock(&priv->mutex); | 6065 | mutex_unlock(&priv->mutex); |
@@ -6093,7 +6100,7 @@ static void iwl3945_bg_request_scan(struct work_struct *data) | |||
6093 | int rc = 0; | 6100 | int rc = 0; |
6094 | struct iwl3945_scan_cmd *scan; | 6101 | struct iwl3945_scan_cmd *scan; |
6095 | struct ieee80211_conf *conf = NULL; | 6102 | struct ieee80211_conf *conf = NULL; |
6096 | u8 direct_mask; | 6103 | u8 n_probes = 2; |
6097 | enum ieee80211_band band; | 6104 | enum ieee80211_band band; |
6098 | 6105 | ||
6099 | conf = ieee80211_get_hw_conf(priv->hw); | 6106 | conf = ieee80211_get_hw_conf(priv->hw); |
@@ -6201,7 +6208,7 @@ static void iwl3945_bg_request_scan(struct work_struct *data) | |||
6201 | scan->direct_scan[0].len = priv->direct_ssid_len; | 6208 | scan->direct_scan[0].len = priv->direct_ssid_len; |
6202 | memcpy(scan->direct_scan[0].ssid, | 6209 | memcpy(scan->direct_scan[0].ssid, |
6203 | priv->direct_ssid, priv->direct_ssid_len); | 6210 | priv->direct_ssid, priv->direct_ssid_len); |
6204 | direct_mask = 1; | 6211 | n_probes++; |
6205 | } else if (!iwl3945_is_associated(priv) && priv->essid_len) { | 6212 | } else if (!iwl3945_is_associated(priv) && priv->essid_len) { |
6206 | IWL_DEBUG_SCAN | 6213 | IWL_DEBUG_SCAN |
6207 | ("Kicking off one direct scan for '%s' when not associated\n", | 6214 | ("Kicking off one direct scan for '%s' when not associated\n", |
@@ -6209,11 +6216,9 @@ static void iwl3945_bg_request_scan(struct work_struct *data) | |||
6209 | scan->direct_scan[0].id = WLAN_EID_SSID; | 6216 | scan->direct_scan[0].id = WLAN_EID_SSID; |
6210 | scan->direct_scan[0].len = priv->essid_len; | 6217 | scan->direct_scan[0].len = priv->essid_len; |
6211 | memcpy(scan->direct_scan[0].ssid, priv->essid, priv->essid_len); | 6218 | memcpy(scan->direct_scan[0].ssid, priv->essid, priv->essid_len); |
6212 | direct_mask = 1; | 6219 | n_probes++; |
6213 | } else { | 6220 | } else |
6214 | IWL_DEBUG_SCAN("Kicking off one indirect scan.\n"); | 6221 | IWL_DEBUG_SCAN("Kicking off one indirect scan.\n"); |
6215 | direct_mask = 0; | ||
6216 | } | ||
6217 | 6222 | ||
6218 | /* We don't build a direct scan probe request; the uCode will do | 6223 | /* We don't build a direct scan probe request; the uCode will do |
6219 | * that based on the direct_mask added to each channel entry */ | 6224 | * that based on the direct_mask added to each channel entry */ |
@@ -6243,21 +6248,13 @@ static void iwl3945_bg_request_scan(struct work_struct *data) | |||
6243 | /* select Rx antennas */ | 6248 | /* select Rx antennas */ |
6244 | scan->flags |= iwl3945_get_antenna_flags(priv); | 6249 | scan->flags |= iwl3945_get_antenna_flags(priv); |
6245 | 6250 | ||
6246 | if (priv->iw_mode == IEEE80211_IF_TYPE_MNTR) | 6251 | if (priv->iw_mode == NL80211_IFTYPE_MONITOR) |
6247 | scan->filter_flags = RXON_FILTER_PROMISC_MSK; | 6252 | scan->filter_flags = RXON_FILTER_PROMISC_MSK; |
6248 | 6253 | ||
6249 | if (direct_mask) | 6254 | scan->channel_count = |
6250 | scan->channel_count = | 6255 | iwl3945_get_channels_for_scan(priv, band, 1, /* active */ |
6251 | iwl3945_get_channels_for_scan( | 6256 | n_probes, |
6252 | priv, band, 1, /* active */ | 6257 | (void *)&scan->data[le16_to_cpu(scan->tx_cmd.len)]); |
6253 | direct_mask, | ||
6254 | (void *)&scan->data[le16_to_cpu(scan->tx_cmd.len)]); | ||
6255 | else | ||
6256 | scan->channel_count = | ||
6257 | iwl3945_get_channels_for_scan( | ||
6258 | priv, band, 0, /* passive */ | ||
6259 | direct_mask, | ||
6260 | (void *)&scan->data[le16_to_cpu(scan->tx_cmd.len)]); | ||
6261 | 6258 | ||
6262 | cmd.len += le16_to_cpu(scan->tx_cmd.len) + | 6259 | cmd.len += le16_to_cpu(scan->tx_cmd.len) + |
6263 | scan->channel_count * sizeof(struct iwl3945_scan_channel); | 6260 | scan->channel_count * sizeof(struct iwl3945_scan_channel); |
@@ -6320,16 +6317,13 @@ static void iwl3945_bg_rx_replenish(struct work_struct *data) | |||
6320 | 6317 | ||
6321 | #define IWL_DELAY_NEXT_SCAN (HZ*2) | 6318 | #define IWL_DELAY_NEXT_SCAN (HZ*2) |
6322 | 6319 | ||
6323 | static void iwl3945_bg_post_associate(struct work_struct *data) | 6320 | static void iwl3945_post_associate(struct iwl3945_priv *priv) |
6324 | { | 6321 | { |
6325 | struct iwl3945_priv *priv = container_of(data, struct iwl3945_priv, | ||
6326 | post_associate.work); | ||
6327 | |||
6328 | int rc = 0; | 6322 | int rc = 0; |
6329 | struct ieee80211_conf *conf = NULL; | 6323 | struct ieee80211_conf *conf = NULL; |
6330 | DECLARE_MAC_BUF(mac); | 6324 | DECLARE_MAC_BUF(mac); |
6331 | 6325 | ||
6332 | if (priv->iw_mode == IEEE80211_IF_TYPE_AP) { | 6326 | if (priv->iw_mode == NL80211_IFTYPE_AP) { |
6333 | IWL_ERROR("%s Should not be called in AP mode\n", __func__); | 6327 | IWL_ERROR("%s Should not be called in AP mode\n", __func__); |
6334 | return; | 6328 | return; |
6335 | } | 6329 | } |
@@ -6342,12 +6336,9 @@ static void iwl3945_bg_post_associate(struct work_struct *data) | |||
6342 | if (test_bit(STATUS_EXIT_PENDING, &priv->status)) | 6336 | if (test_bit(STATUS_EXIT_PENDING, &priv->status)) |
6343 | return; | 6337 | return; |
6344 | 6338 | ||
6345 | mutex_lock(&priv->mutex); | 6339 | if (!priv->vif || !priv->is_open) |
6346 | |||
6347 | if (!priv->vif || !priv->is_open) { | ||
6348 | mutex_unlock(&priv->mutex); | ||
6349 | return; | 6340 | return; |
6350 | } | 6341 | |
6351 | iwl3945_scan_cancel_timeout(priv, 200); | 6342 | iwl3945_scan_cancel_timeout(priv, 200); |
6352 | 6343 | ||
6353 | conf = ieee80211_get_hw_conf(priv->hw); | 6344 | conf = ieee80211_get_hw_conf(priv->hw); |
@@ -6381,7 +6372,7 @@ static void iwl3945_bg_post_associate(struct work_struct *data) | |||
6381 | else | 6372 | else |
6382 | priv->staging_rxon.flags &= ~RXON_FLG_SHORT_SLOT_MSK; | 6373 | priv->staging_rxon.flags &= ~RXON_FLG_SHORT_SLOT_MSK; |
6383 | 6374 | ||
6384 | if (priv->iw_mode == IEEE80211_IF_TYPE_IBSS) | 6375 | if (priv->iw_mode == NL80211_IFTYPE_ADHOC) |
6385 | priv->staging_rxon.flags &= ~RXON_FLG_SHORT_SLOT_MSK; | 6376 | priv->staging_rxon.flags &= ~RXON_FLG_SHORT_SLOT_MSK; |
6386 | 6377 | ||
6387 | } | 6378 | } |
@@ -6389,11 +6380,11 @@ static void iwl3945_bg_post_associate(struct work_struct *data) | |||
6389 | iwl3945_commit_rxon(priv); | 6380 | iwl3945_commit_rxon(priv); |
6390 | 6381 | ||
6391 | switch (priv->iw_mode) { | 6382 | switch (priv->iw_mode) { |
6392 | case IEEE80211_IF_TYPE_STA: | 6383 | case NL80211_IFTYPE_STATION: |
6393 | iwl3945_rate_scale_init(priv->hw, IWL_AP_ID); | 6384 | iwl3945_rate_scale_init(priv->hw, IWL_AP_ID); |
6394 | break; | 6385 | break; |
6395 | 6386 | ||
6396 | case IEEE80211_IF_TYPE_IBSS: | 6387 | case NL80211_IFTYPE_ADHOC: |
6397 | 6388 | ||
6398 | /* clear out the station table */ | 6389 | /* clear out the station table */ |
6399 | iwl3945_clear_stations_table(priv); | 6390 | iwl3945_clear_stations_table(priv); |
@@ -6419,7 +6410,6 @@ static void iwl3945_bg_post_associate(struct work_struct *data) | |||
6419 | 6410 | ||
6420 | /* we have just associated, don't start scan too early */ | 6411 | /* we have just associated, don't start scan too early */ |
6421 | priv->next_scan_jiffies = jiffies + IWL_DELAY_NEXT_SCAN; | 6412 | priv->next_scan_jiffies = jiffies + IWL_DELAY_NEXT_SCAN; |
6422 | mutex_unlock(&priv->mutex); | ||
6423 | } | 6413 | } |
6424 | 6414 | ||
6425 | static void iwl3945_bg_abort_scan(struct work_struct *work) | 6415 | static void iwl3945_bg_abort_scan(struct work_struct *work) |
@@ -6567,7 +6557,6 @@ static void iwl3945_mac_stop(struct ieee80211_hw *hw) | |||
6567 | */ | 6557 | */ |
6568 | mutex_lock(&priv->mutex); | 6558 | mutex_lock(&priv->mutex); |
6569 | iwl3945_scan_cancel_timeout(priv, 100); | 6559 | iwl3945_scan_cancel_timeout(priv, 100); |
6570 | cancel_delayed_work(&priv->post_associate); | ||
6571 | mutex_unlock(&priv->mutex); | 6560 | mutex_unlock(&priv->mutex); |
6572 | } | 6561 | } |
6573 | 6562 | ||
@@ -6650,8 +6639,6 @@ static int iwl3945_mac_config(struct ieee80211_hw *hw, struct ieee80211_conf *co | |||
6650 | mutex_lock(&priv->mutex); | 6639 | mutex_lock(&priv->mutex); |
6651 | IWL_DEBUG_MAC80211("enter to channel %d\n", conf->channel->hw_value); | 6640 | IWL_DEBUG_MAC80211("enter to channel %d\n", conf->channel->hw_value); |
6652 | 6641 | ||
6653 | priv->add_radiotap = !!(conf->flags & IEEE80211_CONF_RADIOTAP); | ||
6654 | |||
6655 | if (!iwl3945_is_ready(priv)) { | 6642 | if (!iwl3945_is_ready(priv)) { |
6656 | IWL_DEBUG_MAC80211("leave - not ready\n"); | 6643 | IWL_DEBUG_MAC80211("leave - not ready\n"); |
6657 | ret = -EIO; | 6644 | ret = -EIO; |
@@ -6767,7 +6754,7 @@ static void iwl3945_config_ap(struct iwl3945_priv *priv) | |||
6767 | priv->staging_rxon.flags &= | 6754 | priv->staging_rxon.flags &= |
6768 | ~RXON_FLG_SHORT_SLOT_MSK; | 6755 | ~RXON_FLG_SHORT_SLOT_MSK; |
6769 | 6756 | ||
6770 | if (priv->iw_mode == IEEE80211_IF_TYPE_IBSS) | 6757 | if (priv->iw_mode == NL80211_IFTYPE_ADHOC) |
6771 | priv->staging_rxon.flags &= | 6758 | priv->staging_rxon.flags &= |
6772 | ~RXON_FLG_SHORT_SLOT_MSK; | 6759 | ~RXON_FLG_SHORT_SLOT_MSK; |
6773 | } | 6760 | } |
@@ -6804,7 +6791,7 @@ static int iwl3945_mac_config_interface(struct ieee80211_hw *hw, | |||
6804 | } | 6791 | } |
6805 | 6792 | ||
6806 | /* handle this temporarily here */ | 6793 | /* handle this temporarily here */ |
6807 | if (priv->iw_mode == IEEE80211_IF_TYPE_IBSS && | 6794 | if (priv->iw_mode == NL80211_IFTYPE_ADHOC && |
6808 | conf->changed & IEEE80211_IFCC_BEACON) { | 6795 | conf->changed & IEEE80211_IFCC_BEACON) { |
6809 | struct sk_buff *beacon = ieee80211_beacon_get(hw, vif); | 6796 | struct sk_buff *beacon = ieee80211_beacon_get(hw, vif); |
6810 | if (!beacon) | 6797 | if (!beacon) |
@@ -6816,7 +6803,7 @@ static int iwl3945_mac_config_interface(struct ieee80211_hw *hw, | |||
6816 | 6803 | ||
6817 | /* XXX: this MUST use conf->mac_addr */ | 6804 | /* XXX: this MUST use conf->mac_addr */ |
6818 | 6805 | ||
6819 | if ((priv->iw_mode == IEEE80211_IF_TYPE_AP) && | 6806 | if ((priv->iw_mode == NL80211_IFTYPE_AP) && |
6820 | (!conf->ssid_len)) { | 6807 | (!conf->ssid_len)) { |
6821 | IWL_DEBUG_MAC80211 | 6808 | IWL_DEBUG_MAC80211 |
6822 | ("Leaving in AP mode because HostAPD is not ready.\n"); | 6809 | ("Leaving in AP mode because HostAPD is not ready.\n"); |
@@ -6839,7 +6826,7 @@ static int iwl3945_mac_config_interface(struct ieee80211_hw *hw, | |||
6839 | !(priv->hw->flags & IEEE80211_HW_NO_PROBE_FILTERING)) { | 6826 | !(priv->hw->flags & IEEE80211_HW_NO_PROBE_FILTERING)) { |
6840 | */ | 6827 | */ |
6841 | 6828 | ||
6842 | if (priv->iw_mode == IEEE80211_IF_TYPE_AP) { | 6829 | if (priv->iw_mode == NL80211_IFTYPE_AP) { |
6843 | if (!conf->bssid) { | 6830 | if (!conf->bssid) { |
6844 | conf->bssid = priv->mac_addr; | 6831 | conf->bssid = priv->mac_addr; |
6845 | memcpy(priv->bssid, priv->mac_addr, ETH_ALEN); | 6832 | memcpy(priv->bssid, priv->mac_addr, ETH_ALEN); |
@@ -6874,11 +6861,11 @@ static int iwl3945_mac_config_interface(struct ieee80211_hw *hw, | |||
6874 | * to verify) - jpk */ | 6861 | * to verify) - jpk */ |
6875 | memcpy(priv->bssid, conf->bssid, ETH_ALEN); | 6862 | memcpy(priv->bssid, conf->bssid, ETH_ALEN); |
6876 | 6863 | ||
6877 | if (priv->iw_mode == IEEE80211_IF_TYPE_AP) | 6864 | if (priv->iw_mode == NL80211_IFTYPE_AP) |
6878 | iwl3945_config_ap(priv); | 6865 | iwl3945_config_ap(priv); |
6879 | else { | 6866 | else { |
6880 | rc = iwl3945_commit_rxon(priv); | 6867 | rc = iwl3945_commit_rxon(priv); |
6881 | if ((priv->iw_mode == IEEE80211_IF_TYPE_STA) && rc) | 6868 | if ((priv->iw_mode == NL80211_IFTYPE_STATION) && rc) |
6882 | iwl3945_add_station(priv, | 6869 | iwl3945_add_station(priv, |
6883 | priv->active_rxon.bssid_addr, 1, 0); | 6870 | priv->active_rxon.bssid_addr, 1, 0); |
6884 | } | 6871 | } |
@@ -6914,7 +6901,7 @@ static void iwl3945_configure_filter(struct ieee80211_hw *hw, | |||
6914 | 6901 | ||
6915 | if (changed_flags & (*total_flags) & FIF_OTHER_BSS) { | 6902 | if (changed_flags & (*total_flags) & FIF_OTHER_BSS) { |
6916 | IWL_DEBUG_MAC80211("Enter: type %d (0x%x, 0x%x)\n", | 6903 | IWL_DEBUG_MAC80211("Enter: type %d (0x%x, 0x%x)\n", |
6917 | IEEE80211_IF_TYPE_MNTR, | 6904 | NL80211_IFTYPE_MONITOR, |
6918 | changed_flags, *total_flags); | 6905 | changed_flags, *total_flags); |
6919 | /* queue work 'cuz mac80211 is holding a lock which | 6906 | /* queue work 'cuz mac80211 is holding a lock which |
6920 | * prevents us from issuing (synchronous) f/w cmds */ | 6907 | * prevents us from issuing (synchronous) f/w cmds */ |
@@ -6935,7 +6922,6 @@ static void iwl3945_mac_remove_interface(struct ieee80211_hw *hw, | |||
6935 | 6922 | ||
6936 | if (iwl3945_is_ready_rf(priv)) { | 6923 | if (iwl3945_is_ready_rf(priv)) { |
6937 | iwl3945_scan_cancel_timeout(priv, 100); | 6924 | iwl3945_scan_cancel_timeout(priv, 100); |
6938 | cancel_delayed_work(&priv->post_associate); | ||
6939 | priv->staging_rxon.filter_flags &= ~RXON_FILTER_ASSOC_MSK; | 6925 | priv->staging_rxon.filter_flags &= ~RXON_FILTER_ASSOC_MSK; |
6940 | iwl3945_commit_rxon(priv); | 6926 | iwl3945_commit_rxon(priv); |
6941 | } | 6927 | } |
@@ -6950,6 +6936,63 @@ static void iwl3945_mac_remove_interface(struct ieee80211_hw *hw, | |||
6950 | IWL_DEBUG_MAC80211("leave\n"); | 6936 | IWL_DEBUG_MAC80211("leave\n"); |
6951 | } | 6937 | } |
6952 | 6938 | ||
6939 | #define IWL_DELAY_NEXT_SCAN_AFTER_ASSOC (HZ*6) | ||
6940 | |||
6941 | static void iwl3945_bss_info_changed(struct ieee80211_hw *hw, | ||
6942 | struct ieee80211_vif *vif, | ||
6943 | struct ieee80211_bss_conf *bss_conf, | ||
6944 | u32 changes) | ||
6945 | { | ||
6946 | struct iwl3945_priv *priv = hw->priv; | ||
6947 | |||
6948 | IWL_DEBUG_MAC80211("changes = 0x%X\n", changes); | ||
6949 | |||
6950 | if (changes & BSS_CHANGED_ERP_PREAMBLE) { | ||
6951 | IWL_DEBUG_MAC80211("ERP_PREAMBLE %d\n", | ||
6952 | bss_conf->use_short_preamble); | ||
6953 | if (bss_conf->use_short_preamble) | ||
6954 | priv->staging_rxon.flags |= RXON_FLG_SHORT_PREAMBLE_MSK; | ||
6955 | else | ||
6956 | priv->staging_rxon.flags &= ~RXON_FLG_SHORT_PREAMBLE_MSK; | ||
6957 | } | ||
6958 | |||
6959 | if (changes & BSS_CHANGED_ERP_CTS_PROT) { | ||
6960 | IWL_DEBUG_MAC80211("ERP_CTS %d\n", bss_conf->use_cts_prot); | ||
6961 | if (bss_conf->use_cts_prot && (priv->band != IEEE80211_BAND_5GHZ)) | ||
6962 | priv->staging_rxon.flags |= RXON_FLG_TGG_PROTECT_MSK; | ||
6963 | else | ||
6964 | priv->staging_rxon.flags &= ~RXON_FLG_TGG_PROTECT_MSK; | ||
6965 | } | ||
6966 | |||
6967 | if (changes & BSS_CHANGED_ASSOC) { | ||
6968 | IWL_DEBUG_MAC80211("ASSOC %d\n", bss_conf->assoc); | ||
6969 | /* This should never happen as this function should | ||
6970 | * never be called from interrupt context. */ | ||
6971 | if (WARN_ON_ONCE(in_interrupt())) | ||
6972 | return; | ||
6973 | if (bss_conf->assoc) { | ||
6974 | priv->assoc_id = bss_conf->aid; | ||
6975 | priv->beacon_int = bss_conf->beacon_int; | ||
6976 | priv->timestamp0 = bss_conf->timestamp & 0xFFFFFFFF; | ||
6977 | priv->timestamp1 = (bss_conf->timestamp >> 32) & | ||
6978 | 0xFFFFFFFF; | ||
6979 | priv->assoc_capability = bss_conf->assoc_capability; | ||
6980 | priv->next_scan_jiffies = jiffies + | ||
6981 | IWL_DELAY_NEXT_SCAN_AFTER_ASSOC; | ||
6982 | mutex_lock(&priv->mutex); | ||
6983 | iwl3945_post_associate(priv); | ||
6984 | mutex_unlock(&priv->mutex); | ||
6985 | } else { | ||
6986 | priv->assoc_id = 0; | ||
6987 | IWL_DEBUG_MAC80211("DISASSOC %d\n", bss_conf->assoc); | ||
6988 | } | ||
6989 | } else if (changes && iwl3945_is_associated(priv) && priv->assoc_id) { | ||
6990 | IWL_DEBUG_MAC80211("Associated Changes %d\n", changes); | ||
6991 | iwl3945_send_rxon_assoc(priv); | ||
6992 | } | ||
6993 | |||
6994 | } | ||
6995 | |||
6953 | static int iwl3945_mac_hw_scan(struct ieee80211_hw *hw, u8 *ssid, size_t len) | 6996 | static int iwl3945_mac_hw_scan(struct ieee80211_hw *hw, u8 *ssid, size_t len) |
6954 | { | 6997 | { |
6955 | int rc = 0; | 6998 | int rc = 0; |
@@ -6967,7 +7010,7 @@ static int iwl3945_mac_hw_scan(struct ieee80211_hw *hw, u8 *ssid, size_t len) | |||
6967 | goto out_unlock; | 7010 | goto out_unlock; |
6968 | } | 7011 | } |
6969 | 7012 | ||
6970 | if (priv->iw_mode == IEEE80211_IF_TYPE_AP) { /* APs don't scan */ | 7013 | if (priv->iw_mode == NL80211_IFTYPE_AP) { /* APs don't scan */ |
6971 | rc = -EIO; | 7014 | rc = -EIO; |
6972 | IWL_ERROR("ERROR: APs don't scan\n"); | 7015 | IWL_ERROR("ERROR: APs don't scan\n"); |
6973 | goto out_unlock; | 7016 | goto out_unlock; |
@@ -7109,7 +7152,7 @@ static int iwl3945_mac_conf_tx(struct ieee80211_hw *hw, u16 queue, | |||
7109 | spin_unlock_irqrestore(&priv->lock, flags); | 7152 | spin_unlock_irqrestore(&priv->lock, flags); |
7110 | 7153 | ||
7111 | mutex_lock(&priv->mutex); | 7154 | mutex_lock(&priv->mutex); |
7112 | if (priv->iw_mode == IEEE80211_IF_TYPE_AP) | 7155 | if (priv->iw_mode == NL80211_IFTYPE_AP) |
7113 | iwl3945_activate_qos(priv, 1); | 7156 | iwl3945_activate_qos(priv, 1); |
7114 | else if (priv->assoc_id && iwl3945_is_associated(priv)) | 7157 | else if (priv->assoc_id && iwl3945_is_associated(priv)) |
7115 | iwl3945_activate_qos(priv, 0); | 7158 | iwl3945_activate_qos(priv, 0); |
@@ -7182,8 +7225,6 @@ static void iwl3945_mac_reset_tsf(struct ieee80211_hw *hw) | |||
7182 | 7225 | ||
7183 | iwl3945_reset_qos(priv); | 7226 | iwl3945_reset_qos(priv); |
7184 | 7227 | ||
7185 | cancel_delayed_work(&priv->post_associate); | ||
7186 | |||
7187 | spin_lock_irqsave(&priv->lock, flags); | 7228 | spin_lock_irqsave(&priv->lock, flags); |
7188 | priv->assoc_id = 0; | 7229 | priv->assoc_id = 0; |
7189 | priv->assoc_capability = 0; | 7230 | priv->assoc_capability = 0; |
@@ -7198,7 +7239,7 @@ static void iwl3945_mac_reset_tsf(struct ieee80211_hw *hw) | |||
7198 | priv->beacon_int = priv->hw->conf.beacon_int; | 7239 | priv->beacon_int = priv->hw->conf.beacon_int; |
7199 | priv->timestamp1 = 0; | 7240 | priv->timestamp1 = 0; |
7200 | priv->timestamp0 = 0; | 7241 | priv->timestamp0 = 0; |
7201 | if ((priv->iw_mode == IEEE80211_IF_TYPE_STA)) | 7242 | if ((priv->iw_mode == NL80211_IFTYPE_STATION)) |
7202 | priv->beacon_int = 0; | 7243 | priv->beacon_int = 0; |
7203 | 7244 | ||
7204 | spin_unlock_irqrestore(&priv->lock, flags); | 7245 | spin_unlock_irqrestore(&priv->lock, flags); |
@@ -7212,14 +7253,14 @@ static void iwl3945_mac_reset_tsf(struct ieee80211_hw *hw) | |||
7212 | /* we are restarting association process | 7253 | /* we are restarting association process |
7213 | * clear RXON_FILTER_ASSOC_MSK bit | 7254 | * clear RXON_FILTER_ASSOC_MSK bit |
7214 | */ | 7255 | */ |
7215 | if (priv->iw_mode != IEEE80211_IF_TYPE_AP) { | 7256 | if (priv->iw_mode != NL80211_IFTYPE_AP) { |
7216 | iwl3945_scan_cancel_timeout(priv, 100); | 7257 | iwl3945_scan_cancel_timeout(priv, 100); |
7217 | priv->staging_rxon.filter_flags &= ~RXON_FILTER_ASSOC_MSK; | 7258 | priv->staging_rxon.filter_flags &= ~RXON_FILTER_ASSOC_MSK; |
7218 | iwl3945_commit_rxon(priv); | 7259 | iwl3945_commit_rxon(priv); |
7219 | } | 7260 | } |
7220 | 7261 | ||
7221 | /* Per mac80211.h: This is only used in IBSS mode... */ | 7262 | /* Per mac80211.h: This is only used in IBSS mode... */ |
7222 | if (priv->iw_mode != IEEE80211_IF_TYPE_IBSS) { | 7263 | if (priv->iw_mode != NL80211_IFTYPE_ADHOC) { |
7223 | 7264 | ||
7224 | IWL_DEBUG_MAC80211("leave - not in IBSS\n"); | 7265 | IWL_DEBUG_MAC80211("leave - not in IBSS\n"); |
7225 | mutex_unlock(&priv->mutex); | 7266 | mutex_unlock(&priv->mutex); |
@@ -7248,7 +7289,7 @@ static int iwl3945_mac_beacon_update(struct ieee80211_hw *hw, struct sk_buff *sk | |||
7248 | return -EIO; | 7289 | return -EIO; |
7249 | } | 7290 | } |
7250 | 7291 | ||
7251 | if (priv->iw_mode != IEEE80211_IF_TYPE_IBSS) { | 7292 | if (priv->iw_mode != NL80211_IFTYPE_ADHOC) { |
7252 | IWL_DEBUG_MAC80211("leave - not IBSS\n"); | 7293 | IWL_DEBUG_MAC80211("leave - not IBSS\n"); |
7253 | mutex_unlock(&priv->mutex); | 7294 | mutex_unlock(&priv->mutex); |
7254 | return -EIO; | 7295 | return -EIO; |
@@ -7268,7 +7309,7 @@ static int iwl3945_mac_beacon_update(struct ieee80211_hw *hw, struct sk_buff *sk | |||
7268 | 7309 | ||
7269 | iwl3945_reset_qos(priv); | 7310 | iwl3945_reset_qos(priv); |
7270 | 7311 | ||
7271 | queue_work(priv->workqueue, &priv->post_associate.work); | 7312 | iwl3945_post_associate(priv); |
7272 | 7313 | ||
7273 | mutex_unlock(&priv->mutex); | 7314 | mutex_unlock(&priv->mutex); |
7274 | 7315 | ||
@@ -7767,7 +7808,6 @@ static void iwl3945_setup_deferred_work(struct iwl3945_priv *priv) | |||
7767 | INIT_WORK(&priv->rf_kill, iwl3945_bg_rf_kill); | 7808 | INIT_WORK(&priv->rf_kill, iwl3945_bg_rf_kill); |
7768 | INIT_WORK(&priv->beacon_update, iwl3945_bg_beacon_update); | 7809 | INIT_WORK(&priv->beacon_update, iwl3945_bg_beacon_update); |
7769 | INIT_WORK(&priv->set_monitor, iwl3945_bg_set_monitor); | 7810 | INIT_WORK(&priv->set_monitor, iwl3945_bg_set_monitor); |
7770 | INIT_DELAYED_WORK(&priv->post_associate, iwl3945_bg_post_associate); | ||
7771 | INIT_DELAYED_WORK(&priv->init_alive_start, iwl3945_bg_init_alive_start); | 7811 | INIT_DELAYED_WORK(&priv->init_alive_start, iwl3945_bg_init_alive_start); |
7772 | INIT_DELAYED_WORK(&priv->alive_start, iwl3945_bg_alive_start); | 7812 | INIT_DELAYED_WORK(&priv->alive_start, iwl3945_bg_alive_start); |
7773 | INIT_DELAYED_WORK(&priv->scan_check, iwl3945_bg_scan_check); | 7813 | INIT_DELAYED_WORK(&priv->scan_check, iwl3945_bg_scan_check); |
@@ -7785,7 +7825,6 @@ static void iwl3945_cancel_deferred_work(struct iwl3945_priv *priv) | |||
7785 | cancel_delayed_work_sync(&priv->init_alive_start); | 7825 | cancel_delayed_work_sync(&priv->init_alive_start); |
7786 | cancel_delayed_work(&priv->scan_check); | 7826 | cancel_delayed_work(&priv->scan_check); |
7787 | cancel_delayed_work(&priv->alive_start); | 7827 | cancel_delayed_work(&priv->alive_start); |
7788 | cancel_delayed_work(&priv->post_associate); | ||
7789 | cancel_work_sync(&priv->beacon_update); | 7828 | cancel_work_sync(&priv->beacon_update); |
7790 | } | 7829 | } |
7791 | 7830 | ||
@@ -7830,6 +7869,7 @@ static struct ieee80211_ops iwl3945_hw_ops = { | |||
7830 | .conf_tx = iwl3945_mac_conf_tx, | 7869 | .conf_tx = iwl3945_mac_conf_tx, |
7831 | .get_tsf = iwl3945_mac_get_tsf, | 7870 | .get_tsf = iwl3945_mac_get_tsf, |
7832 | .reset_tsf = iwl3945_mac_reset_tsf, | 7871 | .reset_tsf = iwl3945_mac_reset_tsf, |
7872 | .bss_info_changed = iwl3945_bss_info_changed, | ||
7833 | .hw_scan = iwl3945_mac_hw_scan | 7873 | .hw_scan = iwl3945_mac_hw_scan |
7834 | }; | 7874 | }; |
7835 | 7875 | ||
@@ -7890,6 +7930,11 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e | |||
7890 | hw->flags = IEEE80211_HW_SIGNAL_DBM | | 7930 | hw->flags = IEEE80211_HW_SIGNAL_DBM | |
7891 | IEEE80211_HW_NOISE_DBM; | 7931 | IEEE80211_HW_NOISE_DBM; |
7892 | 7932 | ||
7933 | hw->wiphy->interface_modes = | ||
7934 | BIT(NL80211_IFTYPE_AP) | | ||
7935 | BIT(NL80211_IFTYPE_STATION) | | ||
7936 | BIT(NL80211_IFTYPE_ADHOC); | ||
7937 | |||
7893 | /* 4 EDCA QOS priorities */ | 7938 | /* 4 EDCA QOS priorities */ |
7894 | hw->queues = 4; | 7939 | hw->queues = 4; |
7895 | 7940 | ||
@@ -7951,7 +7996,7 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e | |||
7951 | IWL_DEBUG_INFO("Radio disabled.\n"); | 7996 | IWL_DEBUG_INFO("Radio disabled.\n"); |
7952 | } | 7997 | } |
7953 | 7998 | ||
7954 | priv->iw_mode = IEEE80211_IF_TYPE_STA; | 7999 | priv->iw_mode = NL80211_IFTYPE_STATION; |
7955 | 8000 | ||
7956 | printk(KERN_INFO DRV_NAME | 8001 | printk(KERN_INFO DRV_NAME |
7957 | ": Detected Intel Wireless WiFi Link %s\n", priv->cfg->name); | 8002 | ": Detected Intel Wireless WiFi Link %s\n", priv->cfg->name); |
@@ -8331,6 +8376,8 @@ static void __exit iwl3945_exit(void) | |||
8331 | iwl3945_rate_control_unregister(); | 8376 | iwl3945_rate_control_unregister(); |
8332 | } | 8377 | } |
8333 | 8378 | ||
8379 | MODULE_FIRMWARE("iwlwifi-3945" IWL3945_UCODE_API ".ucode"); | ||
8380 | |||
8334 | module_param_named(antenna, iwl3945_param_antenna, int, 0444); | 8381 | module_param_named(antenna, iwl3945_param_antenna, int, 0444); |
8335 | MODULE_PARM_DESC(antenna, "select antenna (1=Main, 2=Aux, default 0 [both])"); | 8382 | MODULE_PARM_DESC(antenna, "select antenna (1=Main, 2=Aux, default 0 [both])"); |
8336 | module_param_named(disable, iwl3945_param_disable, int, 0444); | 8383 | module_param_named(disable, iwl3945_param_disable, int, 0444); |