aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/iwlwifi/iwl4965-base.c
diff options
context:
space:
mode:
authorTomas Winkler <tomas.winkler@intel.com>2008-05-15 01:54:04 -0400
committerJohn W. Linville <linville@tuxdriver.com>2008-05-21 21:47:58 -0400
commit4f40e4d9fb8fe028db9ba2a7b4d3ac7328f73bbc (patch)
tree2fee89bbf870a188fb36c0c6a1cecc5c48fe8173 /drivers/net/wireless/iwlwifi/iwl4965-base.c
parent57bd1bea485bf6f37ff365dec2203ba6467b41a1 (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.c178
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 */
264u8 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 */
442static 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 */
1710static 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