diff options
author | Reinette Chatre <reinette.chatre@intel.com> | 2009-10-16 17:25:55 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2009-10-27 16:48:33 -0400 |
commit | 8d9698b3e6ce3c50f9ec5a0aaea4da82d5af7779 (patch) | |
tree | 652b1fecb395e4f41397bfa68d11144dfe918ccf /drivers/net/wireless/iwlwifi | |
parent | cc1282f63b53d0967bd96ed56aa3d2463dc4b4b6 (diff) |
iwlagn: store station rate scale information in mac80211 station structure
Currently mac80211 initializes the rate scaling before notifying the driver
of the station's existence. The driver dealt with this by not relying on
mac80211's station notifications and instead mixing this functionality with
the rate scaling code and other places. To clean this up the driver needs
to do rate scaling initialization after being notified of the station, this
can be done if the rate scaling information forms part of the station
information passed from mac80211 to driver.
Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/iwlwifi')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-agn-rs.c | 8 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-agn.c | 1 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-dev.h | 13 |
3 files changed, 16 insertions, 6 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c index 2d4ec1a65957..27d4ece4d467 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c | |||
@@ -2475,19 +2475,17 @@ static void *rs_alloc_sta(void *priv_rate, struct ieee80211_sta *sta, | |||
2475 | gfp_t gfp) | 2475 | gfp_t gfp) |
2476 | { | 2476 | { |
2477 | struct iwl_lq_sta *lq_sta; | 2477 | struct iwl_lq_sta *lq_sta; |
2478 | struct iwl_station_priv *sta_priv = (struct iwl_station_priv *) sta->drv_priv; | ||
2478 | struct iwl_priv *priv; | 2479 | struct iwl_priv *priv; |
2479 | int i, j; | 2480 | int i, j; |
2480 | 2481 | ||
2481 | priv = (struct iwl_priv *)priv_rate; | 2482 | priv = (struct iwl_priv *)priv_rate; |
2482 | IWL_DEBUG_RATE(priv, "create station rate scale window\n"); | 2483 | IWL_DEBUG_RATE(priv, "create station rate scale window\n"); |
2483 | 2484 | ||
2484 | lq_sta = kzalloc(sizeof(struct iwl_lq_sta), gfp); | 2485 | lq_sta = &sta_priv->lq_sta; |
2485 | 2486 | ||
2486 | if (lq_sta == NULL) | ||
2487 | return NULL; | ||
2488 | lq_sta->lq.sta_id = 0xff; | 2487 | lq_sta->lq.sta_id = 0xff; |
2489 | 2488 | ||
2490 | |||
2491 | for (j = 0; j < LQ_SIZE; j++) | 2489 | for (j = 0; j < LQ_SIZE; j++) |
2492 | for (i = 0; i < IWL_RATE_COUNT; i++) | 2490 | for (i = 0; i < IWL_RATE_COUNT; i++) |
2493 | rs_rate_scale_clear_window(&lq_sta->lq_info[j].win[i]); | 2491 | rs_rate_scale_clear_window(&lq_sta->lq_info[j].win[i]); |
@@ -2719,11 +2717,9 @@ static void rs_free(void *priv_rate) | |||
2719 | static void rs_free_sta(void *priv_r, struct ieee80211_sta *sta, | 2717 | static void rs_free_sta(void *priv_r, struct ieee80211_sta *sta, |
2720 | void *priv_sta) | 2718 | void *priv_sta) |
2721 | { | 2719 | { |
2722 | struct iwl_lq_sta *lq_sta = priv_sta; | ||
2723 | struct iwl_priv *priv __maybe_unused = priv_r; | 2720 | struct iwl_priv *priv __maybe_unused = priv_r; |
2724 | 2721 | ||
2725 | IWL_DEBUG_RATE(priv, "enter\n"); | 2722 | IWL_DEBUG_RATE(priv, "enter\n"); |
2726 | kfree(lq_sta); | ||
2727 | IWL_DEBUG_RATE(priv, "leave\n"); | 2723 | IWL_DEBUG_RATE(priv, "leave\n"); |
2728 | } | 2724 | } |
2729 | 2725 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c index 6c4fa011a924..64d918787e88 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn.c | |||
@@ -2304,6 +2304,7 @@ static int iwl_setup_mac(struct iwl_priv *priv) | |||
2304 | hw->flags |= IEEE80211_HW_SUPPORTS_PS | | 2304 | hw->flags |= IEEE80211_HW_SUPPORTS_PS | |
2305 | IEEE80211_HW_SUPPORTS_DYNAMIC_PS; | 2305 | IEEE80211_HW_SUPPORTS_DYNAMIC_PS; |
2306 | 2306 | ||
2307 | hw->sta_data_size = sizeof(struct iwl_station_priv); | ||
2307 | hw->wiphy->interface_modes = | 2308 | hw->wiphy->interface_modes = |
2308 | BIT(NL80211_IFTYPE_STATION) | | 2309 | BIT(NL80211_IFTYPE_STATION) | |
2309 | BIT(NL80211_IFTYPE_ADHOC); | 2310 | BIT(NL80211_IFTYPE_ADHOC); |
diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h index 35d579455c3c..6ba082d6ab16 100644 --- a/drivers/net/wireless/iwlwifi/iwl-dev.h +++ b/drivers/net/wireless/iwlwifi/iwl-dev.h | |||
@@ -576,6 +576,19 @@ struct iwl_station_entry { | |||
576 | struct iwl_hw_key keyinfo; | 576 | struct iwl_hw_key keyinfo; |
577 | }; | 577 | }; |
578 | 578 | ||
579 | /* | ||
580 | * iwl_station_priv: Driver's private station information | ||
581 | * | ||
582 | * When mac80211 creates a station it reserves some space (hw->sta_data_size) | ||
583 | * in the structure for use by driver. This structure is places in that | ||
584 | * space. | ||
585 | * | ||
586 | * At the moment use it for the station's rate scaling information. | ||
587 | */ | ||
588 | struct iwl_station_priv { | ||
589 | struct iwl_lq_sta lq_sta; | ||
590 | }; | ||
591 | |||
579 | /* one for each uCode image (inst/data, boot/init/runtime) */ | 592 | /* one for each uCode image (inst/data, boot/init/runtime) */ |
580 | struct fw_desc { | 593 | struct fw_desc { |
581 | void *v_addr; /* access by driver */ | 594 | void *v_addr; /* access by driver */ |