diff options
author | Tomas Winkler <tomas.winkler@intel.com> | 2008-05-15 01:54:04 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2008-05-21 21:47:58 -0400 |
commit | 4f40e4d9fb8fe028db9ba2a7b4d3ac7328f73bbc (patch) | |
tree | 2fee89bbf870a188fb36c0c6a1cecc5c48fe8173 /drivers/net/wireless/iwlwifi/iwl4965-base.c | |
parent | 57bd1bea485bf6f37ff365dec2203ba6467b41a1 (diff) |
iwlwifi: move more station managment into iwl-sta.c
This patch moves station management functions into iwl-sta.c (iwlcore).
Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl4965-base.c')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl4965-base.c | 178 |
1 files changed, 8 insertions, 170 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl4965-base.c b/drivers/net/wireless/iwlwifi/iwl4965-base.c index bb820f35d602..88032ccc0ab5 100644 --- a/drivers/net/wireless/iwlwifi/iwl4965-base.c +++ b/drivers/net/wireless/iwlwifi/iwl4965-base.c | |||
@@ -258,79 +258,6 @@ out: | |||
258 | } | 258 | } |
259 | #endif | 259 | #endif |
260 | 260 | ||
261 | /** | ||
262 | * iwl4965_add_station_flags - Add station to tables in driver and device | ||
263 | */ | ||
264 | u8 iwl4965_add_station_flags(struct iwl_priv *priv, const u8 *addr, | ||
265 | int is_ap, u8 flags, void *ht_data) | ||
266 | { | ||
267 | int i; | ||
268 | int index = IWL_INVALID_STATION; | ||
269 | struct iwl_station_entry *station; | ||
270 | unsigned long flags_spin; | ||
271 | DECLARE_MAC_BUF(mac); | ||
272 | |||
273 | spin_lock_irqsave(&priv->sta_lock, flags_spin); | ||
274 | if (is_ap) | ||
275 | index = IWL_AP_ID; | ||
276 | else if (is_broadcast_ether_addr(addr)) | ||
277 | index = priv->hw_params.bcast_sta_id; | ||
278 | else | ||
279 | for (i = IWL_STA_ID; i < priv->hw_params.max_stations; i++) { | ||
280 | if (!compare_ether_addr(priv->stations[i].sta.sta.addr, | ||
281 | addr)) { | ||
282 | index = i; | ||
283 | break; | ||
284 | } | ||
285 | |||
286 | if (!priv->stations[i].used && | ||
287 | index == IWL_INVALID_STATION) | ||
288 | index = i; | ||
289 | } | ||
290 | |||
291 | |||
292 | /* These two conditions have the same outcome, but keep them separate | ||
293 | since they have different meanings */ | ||
294 | if (unlikely(index == IWL_INVALID_STATION)) { | ||
295 | spin_unlock_irqrestore(&priv->sta_lock, flags_spin); | ||
296 | return index; | ||
297 | } | ||
298 | |||
299 | if (priv->stations[index].used && | ||
300 | !compare_ether_addr(priv->stations[index].sta.sta.addr, addr)) { | ||
301 | spin_unlock_irqrestore(&priv->sta_lock, flags_spin); | ||
302 | return index; | ||
303 | } | ||
304 | |||
305 | |||
306 | IWL_DEBUG_ASSOC("Add STA ID %d: %s\n", index, print_mac(mac, addr)); | ||
307 | station = &priv->stations[index]; | ||
308 | station->used = 1; | ||
309 | priv->num_stations++; | ||
310 | |||
311 | /* Set up the REPLY_ADD_STA command to send to device */ | ||
312 | memset(&station->sta, 0, sizeof(struct iwl_addsta_cmd)); | ||
313 | memcpy(station->sta.sta.addr, addr, ETH_ALEN); | ||
314 | station->sta.mode = 0; | ||
315 | station->sta.sta.sta_id = index; | ||
316 | station->sta.station_flags = 0; | ||
317 | |||
318 | #ifdef CONFIG_IWL4965_HT | ||
319 | /* BCAST station and IBSS stations do not work in HT mode */ | ||
320 | if (index != priv->hw_params.bcast_sta_id && | ||
321 | priv->iw_mode != IEEE80211_IF_TYPE_IBSS) | ||
322 | iwl4965_set_ht_add_station(priv, index, | ||
323 | (struct ieee80211_ht_info *) ht_data); | ||
324 | #endif /*CONFIG_IWL4965_HT*/ | ||
325 | |||
326 | spin_unlock_irqrestore(&priv->sta_lock, flags_spin); | ||
327 | |||
328 | /* Add station to device's station table */ | ||
329 | iwl_send_add_sta(priv, &station->sta, flags); | ||
330 | return index; | ||
331 | |||
332 | } | ||
333 | |||
334 | 261 | ||
335 | 262 | ||
336 | /*************** HOST COMMAND QUEUE FUNCTIONS *****/ | 263 | /*************** HOST COMMAND QUEUE FUNCTIONS *****/ |
@@ -434,38 +361,6 @@ static void iwl4965_set_rxon_hwcrypto(struct iwl_priv *priv, int hw_decrypt) | |||
434 | } | 361 | } |
435 | 362 | ||
436 | /** | 363 | /** |
437 | * iwl4965_rxon_add_station - add station into station table. | ||
438 | * | ||
439 | * there is only one AP station with id= IWL_AP_ID | ||
440 | * NOTE: mutex must be held before calling this fnction | ||
441 | */ | ||
442 | static int iwl4965_rxon_add_station(struct iwl_priv *priv, | ||
443 | const u8 *addr, int is_ap) | ||
444 | { | ||
445 | u8 sta_id; | ||
446 | |||
447 | /* Add station to device's station table */ | ||
448 | #ifdef CONFIG_IWL4965_HT | ||
449 | struct ieee80211_conf *conf = &priv->hw->conf; | ||
450 | struct ieee80211_ht_info *cur_ht_config = &conf->ht_conf; | ||
451 | |||
452 | if ((is_ap) && | ||
453 | (conf->flags & IEEE80211_CONF_SUPPORT_HT_MODE) && | ||
454 | (priv->iw_mode == IEEE80211_IF_TYPE_STA)) | ||
455 | sta_id = iwl4965_add_station_flags(priv, addr, is_ap, | ||
456 | 0, cur_ht_config); | ||
457 | else | ||
458 | #endif /* CONFIG_IWL4965_HT */ | ||
459 | sta_id = iwl4965_add_station_flags(priv, addr, is_ap, | ||
460 | 0, NULL); | ||
461 | |||
462 | /* Set up default rate scaling table in device's station table */ | ||
463 | iwl4965_add_station(priv, addr, is_ap); | ||
464 | |||
465 | return sta_id; | ||
466 | } | ||
467 | |||
468 | /** | ||
469 | * iwl4965_check_rxon_cmd - validate RXON structure is valid | 364 | * iwl4965_check_rxon_cmd - validate RXON structure is valid |
470 | * | 365 | * |
471 | * NOTE: This is really only useful during development and can eventually | 366 | * NOTE: This is really only useful during development and can eventually |
@@ -691,7 +586,7 @@ static int iwl4965_commit_rxon(struct iwl_priv *priv) | |||
691 | } | 586 | } |
692 | 587 | ||
693 | /* Add the broadcast address so we can send broadcast frames */ | 588 | /* Add the broadcast address so we can send broadcast frames */ |
694 | if (iwl4965_rxon_add_station(priv, iwl_bcast_addr, 0) == | 589 | if (iwl_rxon_add_station(priv, iwl_bcast_addr, 0) == |
695 | IWL_INVALID_STATION) { | 590 | IWL_INVALID_STATION) { |
696 | IWL_ERROR("Error adding BROADCAST address for transmit.\n"); | 591 | IWL_ERROR("Error adding BROADCAST address for transmit.\n"); |
697 | return -EIO; | 592 | return -EIO; |
@@ -701,7 +596,7 @@ static int iwl4965_commit_rxon(struct iwl_priv *priv) | |||
701 | * add the IWL_AP_ID to the station rate table */ | 596 | * add the IWL_AP_ID to the station rate table */ |
702 | if (iwl_is_associated(priv) && | 597 | if (iwl_is_associated(priv) && |
703 | (priv->iw_mode == IEEE80211_IF_TYPE_STA)) { | 598 | (priv->iw_mode == IEEE80211_IF_TYPE_STA)) { |
704 | if (iwl4965_rxon_add_station(priv, priv->active_rxon.bssid_addr, 1) | 599 | if (iwl_rxon_add_station(priv, priv->active_rxon.bssid_addr, 1) |
705 | == IWL_INVALID_STATION) { | 600 | == IWL_INVALID_STATION) { |
706 | IWL_ERROR("Error adding AP address for transmit.\n"); | 601 | IWL_ERROR("Error adding AP address for transmit.\n"); |
707 | return -EIO; | 602 | return -EIO; |
@@ -1702,63 +1597,6 @@ static void iwl_update_tx_stats(struct iwl_priv *priv, u16 fc, u16 len) | |||
1702 | priv->tx_stats[idx].cnt++; | 1597 | priv->tx_stats[idx].cnt++; |
1703 | priv->tx_stats[idx].bytes += len; | 1598 | priv->tx_stats[idx].bytes += len; |
1704 | } | 1599 | } |
1705 | /** | ||
1706 | * iwl4965_get_sta_id - Find station's index within station table | ||
1707 | * | ||
1708 | * If new IBSS station, create new entry in station table | ||
1709 | */ | ||
1710 | static int iwl4965_get_sta_id(struct iwl_priv *priv, | ||
1711 | struct ieee80211_hdr *hdr) | ||
1712 | { | ||
1713 | int sta_id; | ||
1714 | u16 fc = le16_to_cpu(hdr->frame_control); | ||
1715 | DECLARE_MAC_BUF(mac); | ||
1716 | |||
1717 | /* If this frame is broadcast or management, use broadcast station id */ | ||
1718 | if (((fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_DATA) || | ||
1719 | is_multicast_ether_addr(hdr->addr1)) | ||
1720 | return priv->hw_params.bcast_sta_id; | ||
1721 | |||
1722 | switch (priv->iw_mode) { | ||
1723 | |||
1724 | /* If we are a client station in a BSS network, use the special | ||
1725 | * AP station entry (that's the only station we communicate with) */ | ||
1726 | case IEEE80211_IF_TYPE_STA: | ||
1727 | return IWL_AP_ID; | ||
1728 | |||
1729 | /* If we are an AP, then find the station, or use BCAST */ | ||
1730 | case IEEE80211_IF_TYPE_AP: | ||
1731 | sta_id = iwl_find_station(priv, hdr->addr1); | ||
1732 | if (sta_id != IWL_INVALID_STATION) | ||
1733 | return sta_id; | ||
1734 | return priv->hw_params.bcast_sta_id; | ||
1735 | |||
1736 | /* If this frame is going out to an IBSS network, find the station, | ||
1737 | * or create a new station table entry */ | ||
1738 | case IEEE80211_IF_TYPE_IBSS: | ||
1739 | sta_id = iwl_find_station(priv, hdr->addr1); | ||
1740 | if (sta_id != IWL_INVALID_STATION) | ||
1741 | return sta_id; | ||
1742 | |||
1743 | /* Create new station table entry */ | ||
1744 | sta_id = iwl4965_add_station_flags(priv, hdr->addr1, | ||
1745 | 0, CMD_ASYNC, NULL); | ||
1746 | |||
1747 | if (sta_id != IWL_INVALID_STATION) | ||
1748 | return sta_id; | ||
1749 | |||
1750 | IWL_DEBUG_DROP("Station %s not in station map. " | ||
1751 | "Defaulting to broadcast...\n", | ||
1752 | print_mac(mac, hdr->addr1)); | ||
1753 | iwl_print_hex_dump(priv, IWL_DL_DROP, (u8 *) hdr, sizeof(*hdr)); | ||
1754 | return priv->hw_params.bcast_sta_id; | ||
1755 | |||
1756 | default: | ||
1757 | IWL_WARNING("Unknown mode of operation: %d", priv->iw_mode); | ||
1758 | return priv->hw_params.bcast_sta_id; | ||
1759 | } | ||
1760 | } | ||
1761 | |||
1762 | /* | 1600 | /* |
1763 | * start REPLY_TX command process | 1601 | * start REPLY_TX command process |
1764 | */ | 1602 | */ |
@@ -1829,7 +1667,7 @@ static int iwl4965_tx_skb(struct iwl_priv *priv, | |||
1829 | hdr_len = ieee80211_get_hdrlen(fc); | 1667 | hdr_len = ieee80211_get_hdrlen(fc); |
1830 | 1668 | ||
1831 | /* Find (or create) index into station table for destination station */ | 1669 | /* Find (or create) index into station table for destination station */ |
1832 | sta_id = iwl4965_get_sta_id(priv, hdr); | 1670 | sta_id = iwl_get_sta_id(priv, hdr); |
1833 | if (sta_id == IWL_INVALID_STATION) { | 1671 | if (sta_id == IWL_INVALID_STATION) { |
1834 | DECLARE_MAC_BUF(mac); | 1672 | DECLARE_MAC_BUF(mac); |
1835 | 1673 | ||
@@ -3585,7 +3423,7 @@ static void iwl4965_error_recovery(struct iwl_priv *priv) | |||
3585 | priv->staging_rxon.filter_flags &= ~RXON_FILTER_ASSOC_MSK; | 3423 | priv->staging_rxon.filter_flags &= ~RXON_FILTER_ASSOC_MSK; |
3586 | iwl4965_commit_rxon(priv); | 3424 | iwl4965_commit_rxon(priv); |
3587 | 3425 | ||
3588 | iwl4965_rxon_add_station(priv, priv->bssid, 1); | 3426 | iwl_rxon_add_station(priv, priv->bssid, 1); |
3589 | 3427 | ||
3590 | spin_lock_irqsave(&priv->lock, flags); | 3428 | spin_lock_irqsave(&priv->lock, flags); |
3591 | priv->assoc_id = le16_to_cpu(priv->staging_rxon.assoc_id); | 3429 | priv->assoc_id = le16_to_cpu(priv->staging_rxon.assoc_id); |
@@ -4911,8 +4749,8 @@ static void iwl4965_post_associate(struct iwl_priv *priv) | |||
4911 | /* clear out the station table */ | 4749 | /* clear out the station table */ |
4912 | iwlcore_clear_stations_table(priv); | 4750 | iwlcore_clear_stations_table(priv); |
4913 | 4751 | ||
4914 | iwl4965_rxon_add_station(priv, iwl_bcast_addr, 0); | 4752 | iwl_rxon_add_station(priv, iwl_bcast_addr, 0); |
4915 | iwl4965_rxon_add_station(priv, priv->bssid, 0); | 4753 | iwl_rxon_add_station(priv, priv->bssid, 0); |
4916 | iwl4965_rate_scale_init(priv->hw, IWL_STA_ID); | 4754 | iwl4965_rate_scale_init(priv->hw, IWL_STA_ID); |
4917 | iwl4965_send_beacon_cmd(priv); | 4755 | iwl4965_send_beacon_cmd(priv); |
4918 | 4756 | ||
@@ -5323,7 +5161,7 @@ static void iwl4965_config_ap(struct iwl_priv *priv) | |||
5323 | priv->staging_rxon.filter_flags |= RXON_FILTER_ASSOC_MSK; | 5161 | priv->staging_rxon.filter_flags |= RXON_FILTER_ASSOC_MSK; |
5324 | iwl4965_commit_rxon(priv); | 5162 | iwl4965_commit_rxon(priv); |
5325 | iwl4965_activate_qos(priv, 1); | 5163 | iwl4965_activate_qos(priv, 1); |
5326 | iwl4965_rxon_add_station(priv, iwl_bcast_addr, 0); | 5164 | iwl_rxon_add_station(priv, iwl_bcast_addr, 0); |
5327 | } | 5165 | } |
5328 | iwl4965_send_beacon_cmd(priv); | 5166 | iwl4965_send_beacon_cmd(priv); |
5329 | 5167 | ||
@@ -5412,7 +5250,7 @@ static int iwl4965_mac_config_interface(struct ieee80211_hw *hw, | |||
5412 | else { | 5250 | else { |
5413 | rc = iwl4965_commit_rxon(priv); | 5251 | rc = iwl4965_commit_rxon(priv); |
5414 | if ((priv->iw_mode == IEEE80211_IF_TYPE_STA) && rc) | 5252 | if ((priv->iw_mode == IEEE80211_IF_TYPE_STA) && rc) |
5415 | iwl4965_rxon_add_station( | 5253 | iwl_rxon_add_station( |
5416 | priv, priv->active_rxon.bssid_addr, 1); | 5254 | priv, priv->active_rxon.bssid_addr, 1); |
5417 | } | 5255 | } |
5418 | 5256 | ||