All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] mac80211: remove hw.conf.channel usage where possible
@ 2012-03-28 10:54 Michal Kazior
  2012-03-28 11:17 ` Johannes Berg
  0 siblings, 1 reply; 6+ messages in thread
From: Michal Kazior @ 2012-03-28 10:54 UTC (permalink / raw)
  To: johannes; +Cc: linux-wireless, Michal Kazior

Removes hw.conf.channel usage from the following functions:
 * ieee80211_mandatory_rates
 * ieee80211_sta_get_rates
 * ieee80211_frame_duration

This is in preparation for multi-channel operation.

Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
---
 drivers/net/wireless/ath/ath5k/ath5k.h |    1 +
 drivers/net/wireless/ath/ath5k/pcu.c   |    9 +++++--
 drivers/net/wireless/ath/ath5k/qcu.c   |    8 ++++--
 include/net/mac80211.h                 |    1 +
 net/mac80211/ieee80211_i.h             |    2 +-
 net/mac80211/rc80211_minstrel.c        |   11 +++++----
 net/mac80211/rc80211_minstrel_ht.c     |    4 +-
 net/mac80211/tx.c                      |    4 +-
 net/mac80211/util.c                    |   34 ++++++++++++++-----------------
 9 files changed, 39 insertions(+), 35 deletions(-)

diff --git a/drivers/net/wireless/ath/ath5k/ath5k.h b/drivers/net/wireless/ath/ath5k/ath5k.h
index 8d434b8..2a4371d 100644
--- a/drivers/net/wireless/ath/ath5k/ath5k.h
+++ b/drivers/net/wireless/ath/ath5k/ath5k.h
@@ -1525,6 +1525,7 @@ void ath5k_eeprom_detach(struct ath5k_hw *ah);
 /* Protocol Control Unit Functions */
 /* Helpers */
 int ath5k_hw_get_frame_duration(struct ath5k_hw *ah,
+		struct ieee80211_supported_band *sband,
 		int len, struct ieee80211_rate *rate, bool shortpre);
 unsigned int ath5k_hw_get_default_slottime(struct ath5k_hw *ah);
 unsigned int ath5k_hw_get_default_sifs(struct ath5k_hw *ah);
diff --git a/drivers/net/wireless/ath/ath5k/pcu.c b/drivers/net/wireless/ath/ath5k/pcu.c
index cebfd6f..1220273 100644
--- a/drivers/net/wireless/ath/ath5k/pcu.c
+++ b/drivers/net/wireless/ath/ath5k/pcu.c
@@ -111,6 +111,7 @@ static const unsigned int ack_rates_high[] =
  */
 int
 ath5k_hw_get_frame_duration(struct ath5k_hw *ah,
+		struct ieee80211_supported_band *sband,
 		int len, struct ieee80211_rate *rate, bool shortpre)
 {
 	int sifs, preamble, plcp_bits, sym_time;
@@ -120,7 +121,7 @@ ath5k_hw_get_frame_duration(struct ath5k_hw *ah,
 	/* Fallback */
 	if (!ah->ah_bwmode) {
 		__le16 raw_dur = ieee80211_generic_frame_duration(ah->hw,
-					NULL, len, rate);
+					NULL, sband, len, rate);
 
 		/* subtract difference between long and short preamble */
 		dur = le16_to_cpu(raw_dur);
@@ -302,14 +303,16 @@ ath5k_hw_write_rate_duration(struct ath5k_hw *ah)
 		 * actual rate for this rate. See mac80211 tx.c
 		 * ieee80211_duration() for a brief description of
 		 * what rate we should choose to TX ACKs. */
-		tx_time = ath5k_hw_get_frame_duration(ah, 10, rate, false);
+		tx_time = ath5k_hw_get_frame_duration(ah, &ah->sbands[band], 10,
+					rate, false);
 
 		ath5k_hw_reg_write(ah, tx_time, reg);
 
 		if (!(rate->flags & IEEE80211_RATE_SHORT_PREAMBLE))
 			continue;
 
-		tx_time = ath5k_hw_get_frame_duration(ah, 10, rate, true);
+		tx_time = ath5k_hw_get_frame_duration(ah, &ah->sbands[band],
+				10, rate, true);
 		ath5k_hw_reg_write(ah, tx_time,
 			reg + (AR5K_SET_SHORT_PREAMBLE << 2));
 	}
diff --git a/drivers/net/wireless/ath/ath5k/qcu.c b/drivers/net/wireless/ath/ath5k/qcu.c
index 30b50f9..81d463b 100644
--- a/drivers/net/wireless/ath/ath5k/qcu.c
+++ b/drivers/net/wireless/ath/ath5k/qcu.c
@@ -563,6 +563,7 @@ ath5k_hw_reset_tx_queue(struct ath5k_hw *ah, unsigned int queue)
 int ath5k_hw_set_ifs_intervals(struct ath5k_hw *ah, unsigned int slot_time)
 {
 	struct ieee80211_channel *channel = ah->ah_current_channel;
+	struct ieee80211_supported_band *sband;
 	struct ieee80211_rate *rate;
 	u32 ack_tx_time, eifs, eifs_clock, sifs, sifs_clock;
 	u32 slot_time_clock = ath5k_hw_htoclock(ah, slot_time);
@@ -598,11 +599,12 @@ int ath5k_hw_set_ifs_intervals(struct ath5k_hw *ah, unsigned int slot_time)
 	 * Also we have different lowest rate for 802.11a
 	 */
 	if (channel->band == IEEE80211_BAND_5GHZ)
-		rate = &ah->sbands[IEEE80211_BAND_5GHZ].bitrates[0];
+		sband = &ah->sbands[IEEE80211_BAND_5GHZ];
 	else
-		rate = &ah->sbands[IEEE80211_BAND_2GHZ].bitrates[0];
+		sband = &ah->sbands[IEEE80211_BAND_2GHZ];
 
-	ack_tx_time = ath5k_hw_get_frame_duration(ah, 10, rate, false);
+	rate = &sband->bitrates[0];
+	ack_tx_time = ath5k_hw_get_frame_duration(ah, sband, 10, rate, false);
 
 	/* ack_tx_time includes an SIFS already */
 	eifs = ack_tx_time + sifs + 2 * slot_time;
diff --git a/include/net/mac80211.h b/include/net/mac80211.h
index 9a012be..12116d3 100644
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
@@ -2842,6 +2842,7 @@ __le16 ieee80211_ctstoself_duration(struct ieee80211_hw *hw,
  */
 __le16 ieee80211_generic_frame_duration(struct ieee80211_hw *hw,
 					struct ieee80211_vif *vif,
+					struct ieee80211_supported_band *sband,
 					size_t frame_len,
 					struct ieee80211_rate *rate);
 
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h
index d9798a3..a3c4eae 100644
--- a/net/mac80211/ieee80211_i.h
+++ b/net/mac80211/ieee80211_i.h
@@ -1383,7 +1383,7 @@ static inline int __ieee80211_resume(struct ieee80211_hw *hw)
 extern void *mac80211_wiphy_privid; /* for wiphy privid */
 u8 *ieee80211_get_bssid(struct ieee80211_hdr *hdr, size_t len,
 			enum nl80211_iftype type);
-int ieee80211_frame_duration(struct ieee80211_local *local, size_t len,
+int ieee80211_frame_duration(struct ieee80211_supported_band *sband, size_t len,
 			     int rate, int erp, int short_preamble);
 void mac80211_ev_michael_mic_failure(struct ieee80211_sub_if_data *sdata, int keyidx,
 				     struct ieee80211_hdr *hdr, const u8 *tsc,
diff --git a/net/mac80211/rc80211_minstrel.c b/net/mac80211/rc80211_minstrel.c
index b39dda5..a146ef7 100644
--- a/net/mac80211/rc80211_minstrel.c
+++ b/net/mac80211/rc80211_minstrel.c
@@ -334,14 +334,15 @@ minstrel_get_rate(void *priv, struct ieee80211_sta *sta,
 
 
 static void
-calc_rate_durations(struct ieee80211_local *local, struct minstrel_rate *d,
+calc_rate_durations(struct ieee80211_supported_band *sband,
+		    struct minstrel_rate *d,
 		    struct ieee80211_rate *rate)
 {
 	int erp = !!(rate->flags & IEEE80211_RATE_ERP_G);
 
-	d->perfect_tx_time = ieee80211_frame_duration(local, 1200,
+	d->perfect_tx_time = ieee80211_frame_duration(sband, 1200,
 			rate->bitrate, erp, 1);
-	d->ack_time = ieee80211_frame_duration(local, 10,
+	d->ack_time = ieee80211_frame_duration(sband, 10,
 			rate->bitrate, erp, 1);
 }
 
@@ -386,7 +387,7 @@ minstrel_rate_init(void *priv, struct ieee80211_supported_band *sband,
 
 	mi->lowest_rix = rate_lowest_index(sband, sta);
 	ctl_rate = &sband->bitrates[mi->lowest_rix];
-	mi->sp_ack_dur = ieee80211_frame_duration(local, 10, ctl_rate->bitrate,
+	mi->sp_ack_dur = ieee80211_frame_duration(sband, 10, ctl_rate->bitrate,
 				!!(ctl_rate->flags & IEEE80211_RATE_ERP_G), 1);
 
 	for (i = 0; i < sband->n_bitrates; i++) {
@@ -402,7 +403,7 @@ minstrel_rate_init(void *priv, struct ieee80211_supported_band *sband,
 
 		mr->rix = i;
 		mr->bitrate = sband->bitrates[i].bitrate / 5;
-		calc_rate_durations(local, mr, &sband->bitrates[i]);
+		calc_rate_durations(sband, mr, &sband->bitrates[i]);
 
 		/* calculate maximum number of retransmissions before
 		 * fallback (based on maximum segment size) */
diff --git a/net/mac80211/rc80211_minstrel_ht.c b/net/mac80211/rc80211_minstrel_ht.c
index 16e0b27..c222ff4 100644
--- a/net/mac80211/rc80211_minstrel_ht.c
+++ b/net/mac80211/rc80211_minstrel_ht.c
@@ -712,8 +712,8 @@ minstrel_ht_update_caps(void *priv, struct ieee80211_supported_band *sband,
 	memset(mi, 0, sizeof(*mi));
 	mi->stats_update = jiffies;
 
-	ack_dur = ieee80211_frame_duration(local, 10, 60, 1, 1);
-	mi->overhead = ieee80211_frame_duration(local, 0, 60, 1, 1) + ack_dur;
+	ack_dur = ieee80211_frame_duration(sband, 10, 60, 1, 1);
+	mi->overhead = ieee80211_frame_duration(sband, 0, 60, 1, 1) + ack_dur;
 	mi->overhead_rtscts = mi->overhead + 2 * ack_dur;
 
 	mi->avg_ampdu_len = MINSTREL_FRAC(1, 1);
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
index 782a601..bedffc6 100644
--- a/net/mac80211/tx.c
+++ b/net/mac80211/tx.c
@@ -159,7 +159,7 @@ static __le16 ieee80211_duration(struct ieee80211_tx_data *tx,
 		/* Time needed to transmit ACK
 		 * (10 bytes + 4-byte FCS = 112 bits) plus SIFS; rounded up
 		 * to closest integer */
-		dur = ieee80211_frame_duration(local, 10, rate, erp,
+		dur = ieee80211_frame_duration(sband, 10, rate, erp,
 				tx->sdata->vif.bss_conf.use_short_preamble);
 
 	if (next_frag_len) {
@@ -167,7 +167,7 @@ static __le16 ieee80211_duration(struct ieee80211_tx_data *tx,
 		 * transmit next fragment plus ACK and 2 x SIFS. */
 		dur *= 2; /* ACK + SIFS */
 		/* next fragment */
-		dur += ieee80211_frame_duration(local, next_frag_len,
+		dur += ieee80211_frame_duration(sband, next_frag_len,
 				txrate->bitrate, erp,
 				tx->sdata->vif.bss_conf.use_short_preamble);
 	}
diff --git a/net/mac80211/util.c b/net/mac80211/util.c
index 32f7a3b..f713a37 100644
--- a/net/mac80211/util.c
+++ b/net/mac80211/util.c
@@ -106,7 +106,7 @@ void ieee80211_tx_set_protected(struct ieee80211_tx_data *tx)
 	}
 }
 
-int ieee80211_frame_duration(struct ieee80211_local *local, size_t len,
+int ieee80211_frame_duration(struct ieee80211_supported_band *sband, size_t len,
 			     int rate, int erp, int short_preamble)
 {
 	int dur;
@@ -120,7 +120,7 @@ int ieee80211_frame_duration(struct ieee80211_local *local, size_t len,
 	 * DIV_ROUND_UP() operations.
 	 */
 
-	if (local->hw.conf.channel->band == IEEE80211_BAND_5GHZ || erp) {
+	if (!WARN_ON(!sband) && sband->band == IEEE80211_BAND_5GHZ || erp) {
 		/*
 		 * OFDM:
 		 *
@@ -162,10 +162,10 @@ int ieee80211_frame_duration(struct ieee80211_local *local, size_t len,
 /* Exported duration function for driver use */
 __le16 ieee80211_generic_frame_duration(struct ieee80211_hw *hw,
 					struct ieee80211_vif *vif,
+					struct ieee80211_supported_band *sband,
 					size_t frame_len,
 					struct ieee80211_rate *rate)
 {
-	struct ieee80211_local *local = hw_to_local(hw);
 	struct ieee80211_sub_if_data *sdata;
 	u16 dur;
 	int erp;
@@ -179,7 +179,7 @@ __le16 ieee80211_generic_frame_duration(struct ieee80211_hw *hw,
 			erp = rate->flags & IEEE80211_RATE_ERP_G;
 	}
 
-	dur = ieee80211_frame_duration(local, frame_len, rate->bitrate, erp,
+	dur = ieee80211_frame_duration(sband, frame_len, rate->bitrate, erp,
 				       short_preamble);
 
 	return cpu_to_le16(dur);
@@ -198,7 +198,7 @@ __le16 ieee80211_rts_duration(struct ieee80211_hw *hw,
 	u16 dur;
 	struct ieee80211_supported_band *sband;
 
-	sband = local->hw.wiphy->bands[local->hw.conf.channel->band];
+	sband = local->hw.wiphy->bands[frame_txctl->band];
 
 	short_preamble = false;
 
@@ -213,13 +213,13 @@ __le16 ieee80211_rts_duration(struct ieee80211_hw *hw,
 	}
 
 	/* CTS duration */
-	dur = ieee80211_frame_duration(local, 10, rate->bitrate,
+	dur = ieee80211_frame_duration(sband, 10, rate->bitrate,
 				       erp, short_preamble);
 	/* Data frame duration */
-	dur += ieee80211_frame_duration(local, frame_len, rate->bitrate,
+	dur += ieee80211_frame_duration(sband, frame_len, rate->bitrate,
 					erp, short_preamble);
 	/* ACK duration */
-	dur += ieee80211_frame_duration(local, 10, rate->bitrate,
+	dur += ieee80211_frame_duration(sband, 10, rate->bitrate,
 					erp, short_preamble);
 
 	return cpu_to_le16(dur);
@@ -239,7 +239,7 @@ __le16 ieee80211_ctstoself_duration(struct ieee80211_hw *hw,
 	u16 dur;
 	struct ieee80211_supported_band *sband;
 
-	sband = local->hw.wiphy->bands[local->hw.conf.channel->band];
+	sband = local->hw.wiphy->bands[frame_txctl->band];
 
 	short_preamble = false;
 
@@ -253,11 +253,11 @@ __le16 ieee80211_ctstoself_duration(struct ieee80211_hw *hw,
 	}
 
 	/* Data frame duration */
-	dur = ieee80211_frame_duration(local, frame_len, rate->bitrate,
+	dur = ieee80211_frame_duration(sband, frame_len, rate->bitrate,
 				       erp, short_preamble);
 	if (!(frame_txctl->flags & IEEE80211_TX_CTL_NO_ACK)) {
 		/* ACK duration */
-		dur += ieee80211_frame_duration(local, 10, rate->bitrate,
+		dur += ieee80211_frame_duration(sband, 10, rate->bitrate,
 						erp, short_preamble);
 	}
 
@@ -878,10 +878,8 @@ u32 ieee80211_mandatory_rates(struct ieee80211_local *local,
 	int i;
 
 	sband = local->hw.wiphy->bands[band];
-	if (!sband) {
-		WARN_ON(1);
-		sband = local->hw.wiphy->bands[local->hw.conf.channel->band];
-	}
+	if (WARN_ON(!sband))
+		return 1;
 
 	if (band == IEEE80211_BAND_2GHZ)
 		mandatory_flag = IEEE80211_RATE_MANDATORY_B;
@@ -1115,10 +1113,8 @@ u32 ieee80211_sta_get_rates(struct ieee80211_local *local,
 	int i, j;
 	sband = local->hw.wiphy->bands[band];
 
-	if (!sband) {
-		WARN_ON(1);
-		sband = local->hw.wiphy->bands[local->hw.conf.channel->band];
-	}
+	if (WARN_ON(!sband))
+		return 1;
 
 	bitrates = sband->bitrates;
 	num_rates = sband->n_bitrates;
-- 
1.7.0.4


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH] mac80211: remove hw.conf.channel usage where possible
  2012-03-28 10:54 [PATCH] mac80211: remove hw.conf.channel usage where possible Michal Kazior
@ 2012-03-28 11:17 ` Johannes Berg
  0 siblings, 0 replies; 6+ messages in thread
From: Johannes Berg @ 2012-03-28 11:17 UTC (permalink / raw)
  To: Michal Kazior; +Cc: linux-wireless

On Wed, 2012-03-28 at 12:54 +0200, Michal Kazior wrote:
> Removes hw.conf.channel usage from the following functions:
>  * ieee80211_mandatory_rates
>  * ieee80211_sta_get_rates
>  * ieee80211_frame_duration
> 
> This is in preparation for multi-channel operation.

Nice, thanks.

> @@ -120,7 +120,7 @@ int ieee80211_frame_duration(struct ieee80211_local *local, size_t len,
>  	 * DIV_ROUND_UP() operations.
>  	 */
>  
> -	if (local->hw.conf.channel->band == IEEE80211_BAND_5GHZ || erp) {
> +	if (!WARN_ON(!sband) && sband->band == IEEE80211_BAND_5GHZ || erp) {

This seems a bit odd to me, maybe change to

if (WARN_ON(!sband))
	return 0;
if (sband->band == ... || erp)
	...

or something like that? Or is there any code that has to pass NULL for
some reason?

Also, now that I think about it, is there a reason to pass
	struct ieee80211_supported_band *sband
rather than
	enum ieee80211_band band?

That wouldn't allow invalid/NULL value of course.


>  __le16 ieee80211_generic_frame_duration(struct ieee80211_hw *hw,
>  					struct ieee80211_vif *vif,
> +					struct ieee80211_supported_band *sband,

same here.

Other than that, which may be needed, this looks good to me.

johannes


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] mac80211: remove hw.conf.channel usage where possible
  2012-04-10 19:20 ` John W. Linville
@ 2012-04-11  6:22   ` Michal Kazior
  0 siblings, 0 replies; 6+ messages in thread
From: Michal Kazior @ 2012-04-11  6:22 UTC (permalink / raw)
  To: John W. Linville; +Cc: johannes, linux-wireless

On 10/04/12 21:20, John W. Linville wrote:
> On Thu, Mar 29, 2012 at 09:01:58AM +0200, Michal Kazior wrote:
>> Removes hw.conf.channel usage from the following functions:
>>   * ieee80211_mandatory_rates
>>   * ieee80211_sta_get_rates
>>   * ieee80211_frame_duration
>>   * ieee80211_rts_duration
>>   * ieee80211_ctstoself_duration
>>
>> This is in preparation for multi-channel operation.
>>
>> Signed-off-by: Michal Kazior<michal.kazior@tieto.com>
>
>    CC      drivers/net/wireless/b43/xmit.o
> drivers/net/wireless/b43/xmit.c: In function ‘b43_generate_txhdr’:
> drivers/net/wireless/b43/xmit.c:293:4: warning: passing argument 4 of ‘ieee80211_generic_frame_duration’ makes integer from pointer without a cast
> include/net/mac80211.h:2870:8: note: expected ‘size_t’ but argument is of type ‘struct ieee80211_rate *’
> drivers/net/wireless/b43/xmit.c:293:4: error: too few arguments to function ‘ieee80211_generic_frame_duration’
> include/net/mac80211.h:2870:8: note: declared here
> make[2]: *** [drivers/net/wireless/b43/xmit.o] Error 1
> make[1]: *** [drivers/net/wireless/b43] Error 2
> make: *** [drivers/net/wireless/] Error 2
>

Oops! Sorry I missed that. I'll send PATCH v2.


-- 
Pozdrawiam / Best regards, Michal Kazior.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] mac80211: remove hw.conf.channel usage where possible
  2012-03-29  7:01 Michal Kazior
  2012-03-29  7:07 ` Johannes Berg
@ 2012-04-10 19:20 ` John W. Linville
  2012-04-11  6:22   ` Michal Kazior
  1 sibling, 1 reply; 6+ messages in thread
From: John W. Linville @ 2012-04-10 19:20 UTC (permalink / raw)
  To: Michal Kazior; +Cc: johannes, linux-wireless

On Thu, Mar 29, 2012 at 09:01:58AM +0200, Michal Kazior wrote:
> Removes hw.conf.channel usage from the following functions:
>  * ieee80211_mandatory_rates
>  * ieee80211_sta_get_rates
>  * ieee80211_frame_duration
>  * ieee80211_rts_duration
>  * ieee80211_ctstoself_duration
> 
> This is in preparation for multi-channel operation.
> 
> Signed-off-by: Michal Kazior <michal.kazior@tieto.com>

  CC      drivers/net/wireless/b43/xmit.o
drivers/net/wireless/b43/xmit.c: In function ‘b43_generate_txhdr’:
drivers/net/wireless/b43/xmit.c:293:4: warning: passing argument 4 of ‘ieee80211_generic_frame_duration’ makes integer from pointer without a cast
include/net/mac80211.h:2870:8: note: expected ‘size_t’ but argument is of type ‘struct ieee80211_rate *’
drivers/net/wireless/b43/xmit.c:293:4: error: too few arguments to function ‘ieee80211_generic_frame_duration’
include/net/mac80211.h:2870:8: note: declared here
make[2]: *** [drivers/net/wireless/b43/xmit.o] Error 1
make[1]: *** [drivers/net/wireless/b43] Error 2
make: *** [drivers/net/wireless/] Error 2

-- 
John W. Linville		Someday the world will need a hero, and you
linville@tuxdriver.com			might be all we have.  Be ready.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] mac80211: remove hw.conf.channel usage where possible
  2012-03-29  7:01 Michal Kazior
@ 2012-03-29  7:07 ` Johannes Berg
  2012-04-10 19:20 ` John W. Linville
  1 sibling, 0 replies; 6+ messages in thread
From: Johannes Berg @ 2012-03-29  7:07 UTC (permalink / raw)
  To: Michal Kazior; +Cc: linux-wireless

On Thu, 2012-03-29 at 09:01 +0200, Michal Kazior wrote:
> Removes hw.conf.channel usage from the following functions:
>  * ieee80211_mandatory_rates
>  * ieee80211_sta_get_rates
>  * ieee80211_frame_duration
>  * ieee80211_rts_duration
>  * ieee80211_ctstoself_duration
> 
> This is in preparation for multi-channel operation.

Thanks!

Reviewed-by: Johannes Berg <johannes@sipsolutions.net>

> Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
> ---
>  drivers/net/wireless/ath/ath5k/ath5k.h |    2 +-
>  drivers/net/wireless/ath/ath5k/pcu.c   |    9 ++++---
>  drivers/net/wireless/ath/ath5k/qcu.c   |    8 ++++--
>  include/net/mac80211.h                 |    1 +
>  net/mac80211/ieee80211_i.h             |    2 +-
>  net/mac80211/rc80211_minstrel.c        |   13 ++++++-----
>  net/mac80211/rc80211_minstrel_ht.c     |    5 +--
>  net/mac80211/tx.c                      |    4 +-
>  net/mac80211/util.c                    |   34 ++++++++++++++-----------------
>  9 files changed, 39 insertions(+), 39 deletions(-)
> 
> diff --git a/drivers/net/wireless/ath/ath5k/ath5k.h b/drivers/net/wireless/ath/ath5k/ath5k.h
> index 8d434b8..727f2e5 100644
> --- a/drivers/net/wireless/ath/ath5k/ath5k.h
> +++ b/drivers/net/wireless/ath/ath5k/ath5k.h
> @@ -1524,7 +1524,7 @@ void ath5k_eeprom_detach(struct ath5k_hw *ah);
>  
>  /* Protocol Control Unit Functions */
>  /* Helpers */
> -int ath5k_hw_get_frame_duration(struct ath5k_hw *ah,
> +int ath5k_hw_get_frame_duration(struct ath5k_hw *ah, enum ieee80211_band band,
>  		int len, struct ieee80211_rate *rate, bool shortpre);
>  unsigned int ath5k_hw_get_default_slottime(struct ath5k_hw *ah);
>  unsigned int ath5k_hw_get_default_sifs(struct ath5k_hw *ah);
> diff --git a/drivers/net/wireless/ath/ath5k/pcu.c b/drivers/net/wireless/ath/ath5k/pcu.c
> index cebfd6f..1f16b42 100644
> --- a/drivers/net/wireless/ath/ath5k/pcu.c
> +++ b/drivers/net/wireless/ath/ath5k/pcu.c
> @@ -110,7 +110,7 @@ static const unsigned int ack_rates_high[] =
>   * bwmodes.
>   */
>  int
> -ath5k_hw_get_frame_duration(struct ath5k_hw *ah,
> +ath5k_hw_get_frame_duration(struct ath5k_hw *ah, enum ieee80211_band band,
>  		int len, struct ieee80211_rate *rate, bool shortpre)
>  {
>  	int sifs, preamble, plcp_bits, sym_time;
> @@ -120,7 +120,7 @@ ath5k_hw_get_frame_duration(struct ath5k_hw *ah,
>  	/* Fallback */
>  	if (!ah->ah_bwmode) {
>  		__le16 raw_dur = ieee80211_generic_frame_duration(ah->hw,
> -					NULL, len, rate);
> +					NULL, band, len, rate);
>  
>  		/* subtract difference between long and short preamble */
>  		dur = le16_to_cpu(raw_dur);
> @@ -302,14 +302,15 @@ ath5k_hw_write_rate_duration(struct ath5k_hw *ah)
>  		 * actual rate for this rate. See mac80211 tx.c
>  		 * ieee80211_duration() for a brief description of
>  		 * what rate we should choose to TX ACKs. */
> -		tx_time = ath5k_hw_get_frame_duration(ah, 10, rate, false);
> +		tx_time = ath5k_hw_get_frame_duration(ah, band, 10,
> +					rate, false);
>  
>  		ath5k_hw_reg_write(ah, tx_time, reg);
>  
>  		if (!(rate->flags & IEEE80211_RATE_SHORT_PREAMBLE))
>  			continue;
>  
> -		tx_time = ath5k_hw_get_frame_duration(ah, 10, rate, true);
> +		tx_time = ath5k_hw_get_frame_duration(ah, band, 10, rate, true);
>  		ath5k_hw_reg_write(ah, tx_time,
>  			reg + (AR5K_SET_SHORT_PREAMBLE << 2));
>  	}
> diff --git a/drivers/net/wireless/ath/ath5k/qcu.c b/drivers/net/wireless/ath/ath5k/qcu.c
> index 30b50f9..1f9677a 100644
> --- a/drivers/net/wireless/ath/ath5k/qcu.c
> +++ b/drivers/net/wireless/ath/ath5k/qcu.c
> @@ -563,6 +563,7 @@ ath5k_hw_reset_tx_queue(struct ath5k_hw *ah, unsigned int queue)
>  int ath5k_hw_set_ifs_intervals(struct ath5k_hw *ah, unsigned int slot_time)
>  {
>  	struct ieee80211_channel *channel = ah->ah_current_channel;
> +	enum ieee80211_band band;
>  	struct ieee80211_rate *rate;
>  	u32 ack_tx_time, eifs, eifs_clock, sifs, sifs_clock;
>  	u32 slot_time_clock = ath5k_hw_htoclock(ah, slot_time);
> @@ -598,11 +599,12 @@ int ath5k_hw_set_ifs_intervals(struct ath5k_hw *ah, unsigned int slot_time)
>  	 * Also we have different lowest rate for 802.11a
>  	 */
>  	if (channel->band == IEEE80211_BAND_5GHZ)
> -		rate = &ah->sbands[IEEE80211_BAND_5GHZ].bitrates[0];
> +		band = IEEE80211_BAND_5GHZ;
>  	else
> -		rate = &ah->sbands[IEEE80211_BAND_2GHZ].bitrates[0];
> +		band = IEEE80211_BAND_2GHZ;
>  
> -	ack_tx_time = ath5k_hw_get_frame_duration(ah, 10, rate, false);
> +	rate = &ah->sbands[band].bitrates[0];
> +	ack_tx_time = ath5k_hw_get_frame_duration(ah, band, 10, rate, false);
>  
>  	/* ack_tx_time includes an SIFS already */
>  	eifs = ack_tx_time + sifs + 2 * slot_time;
> diff --git a/include/net/mac80211.h b/include/net/mac80211.h
> index 9a012be..ee7a38b 100644
> --- a/include/net/mac80211.h
> +++ b/include/net/mac80211.h
> @@ -2842,6 +2842,7 @@ __le16 ieee80211_ctstoself_duration(struct ieee80211_hw *hw,
>   */
>  __le16 ieee80211_generic_frame_duration(struct ieee80211_hw *hw,
>  					struct ieee80211_vif *vif,
> +					enum ieee80211_band band,
>  					size_t frame_len,
>  					struct ieee80211_rate *rate);
>  
> diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h
> index d9798a3..c5c6ab0 100644
> --- a/net/mac80211/ieee80211_i.h
> +++ b/net/mac80211/ieee80211_i.h
> @@ -1383,7 +1383,7 @@ static inline int __ieee80211_resume(struct ieee80211_hw *hw)
>  extern void *mac80211_wiphy_privid; /* for wiphy privid */
>  u8 *ieee80211_get_bssid(struct ieee80211_hdr *hdr, size_t len,
>  			enum nl80211_iftype type);
> -int ieee80211_frame_duration(struct ieee80211_local *local, size_t len,
> +int ieee80211_frame_duration(enum ieee80211_band band, size_t len,
>  			     int rate, int erp, int short_preamble);
>  void mac80211_ev_michael_mic_failure(struct ieee80211_sub_if_data *sdata, int keyidx,
>  				     struct ieee80211_hdr *hdr, const u8 *tsc,
> diff --git a/net/mac80211/rc80211_minstrel.c b/net/mac80211/rc80211_minstrel.c
> index b39dda5..79633ae 100644
> --- a/net/mac80211/rc80211_minstrel.c
> +++ b/net/mac80211/rc80211_minstrel.c
> @@ -334,14 +334,15 @@ minstrel_get_rate(void *priv, struct ieee80211_sta *sta,
>  
> 
>  static void
> -calc_rate_durations(struct ieee80211_local *local, struct minstrel_rate *d,
> +calc_rate_durations(enum ieee80211_band band,
> +		    struct minstrel_rate *d,
>  		    struct ieee80211_rate *rate)
>  {
>  	int erp = !!(rate->flags & IEEE80211_RATE_ERP_G);
>  
> -	d->perfect_tx_time = ieee80211_frame_duration(local, 1200,
> +	d->perfect_tx_time = ieee80211_frame_duration(band, 1200,
>  			rate->bitrate, erp, 1);
> -	d->ack_time = ieee80211_frame_duration(local, 10,
> +	d->ack_time = ieee80211_frame_duration(band, 10,
>  			rate->bitrate, erp, 1);
>  }
>  
> @@ -379,14 +380,14 @@ minstrel_rate_init(void *priv, struct ieee80211_supported_band *sband,
>  {
>  	struct minstrel_sta_info *mi = priv_sta;
>  	struct minstrel_priv *mp = priv;
> -	struct ieee80211_local *local = hw_to_local(mp->hw);
>  	struct ieee80211_rate *ctl_rate;
>  	unsigned int i, n = 0;
>  	unsigned int t_slot = 9; /* FIXME: get real slot time */
>  
>  	mi->lowest_rix = rate_lowest_index(sband, sta);
>  	ctl_rate = &sband->bitrates[mi->lowest_rix];
> -	mi->sp_ack_dur = ieee80211_frame_duration(local, 10, ctl_rate->bitrate,
> +	mi->sp_ack_dur = ieee80211_frame_duration(sband->band, 10,
> +				ctl_rate->bitrate,
>  				!!(ctl_rate->flags & IEEE80211_RATE_ERP_G), 1);
>  
>  	for (i = 0; i < sband->n_bitrates; i++) {
> @@ -402,7 +403,7 @@ minstrel_rate_init(void *priv, struct ieee80211_supported_band *sband,
>  
>  		mr->rix = i;
>  		mr->bitrate = sband->bitrates[i].bitrate / 5;
> -		calc_rate_durations(local, mr, &sband->bitrates[i]);
> +		calc_rate_durations(sband->band, mr, &sband->bitrates[i]);
>  
>  		/* calculate maximum number of retransmissions before
>  		 * fallback (based on maximum segment size) */
> diff --git a/net/mac80211/rc80211_minstrel_ht.c b/net/mac80211/rc80211_minstrel_ht.c
> index 16e0b27..08048fc 100644
> --- a/net/mac80211/rc80211_minstrel_ht.c
> +++ b/net/mac80211/rc80211_minstrel_ht.c
> @@ -693,7 +693,6 @@ minstrel_ht_update_caps(void *priv, struct ieee80211_supported_band *sband,
>  	struct minstrel_ht_sta_priv *msp = priv_sta;
>  	struct minstrel_ht_sta *mi = &msp->ht;
>  	struct ieee80211_mcs_info *mcs = &sta->ht_cap.mcs;
> -	struct ieee80211_local *local = hw_to_local(mp->hw);
>  	u16 sta_cap = sta->ht_cap.cap;
>  	int n_supported = 0;
>  	int ack_dur;
> @@ -712,8 +711,8 @@ minstrel_ht_update_caps(void *priv, struct ieee80211_supported_band *sband,
>  	memset(mi, 0, sizeof(*mi));
>  	mi->stats_update = jiffies;
>  
> -	ack_dur = ieee80211_frame_duration(local, 10, 60, 1, 1);
> -	mi->overhead = ieee80211_frame_duration(local, 0, 60, 1, 1) + ack_dur;
> +	ack_dur = ieee80211_frame_duration(sband->band, 10, 60, 1, 1);
> +	mi->overhead = ieee80211_frame_duration(sband->band, 0, 60, 1, 1) + ack_dur;
>  	mi->overhead_rtscts = mi->overhead + 2 * ack_dur;
>  
>  	mi->avg_ampdu_len = MINSTREL_FRAC(1, 1);
> diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
> index 782a601..1a0732d 100644
> --- a/net/mac80211/tx.c
> +++ b/net/mac80211/tx.c
> @@ -159,7 +159,7 @@ static __le16 ieee80211_duration(struct ieee80211_tx_data *tx,
>  		/* Time needed to transmit ACK
>  		 * (10 bytes + 4-byte FCS = 112 bits) plus SIFS; rounded up
>  		 * to closest integer */
> -		dur = ieee80211_frame_duration(local, 10, rate, erp,
> +		dur = ieee80211_frame_duration(sband->band, 10, rate, erp,
>  				tx->sdata->vif.bss_conf.use_short_preamble);
>  
>  	if (next_frag_len) {
> @@ -167,7 +167,7 @@ static __le16 ieee80211_duration(struct ieee80211_tx_data *tx,
>  		 * transmit next fragment plus ACK and 2 x SIFS. */
>  		dur *= 2; /* ACK + SIFS */
>  		/* next fragment */
> -		dur += ieee80211_frame_duration(local, next_frag_len,
> +		dur += ieee80211_frame_duration(sband->band, next_frag_len,
>  				txrate->bitrate, erp,
>  				tx->sdata->vif.bss_conf.use_short_preamble);
>  	}
> diff --git a/net/mac80211/util.c b/net/mac80211/util.c
> index 32f7a3b..cae3dc4 100644
> --- a/net/mac80211/util.c
> +++ b/net/mac80211/util.c
> @@ -106,7 +106,7 @@ void ieee80211_tx_set_protected(struct ieee80211_tx_data *tx)
>  	}
>  }
>  
> -int ieee80211_frame_duration(struct ieee80211_local *local, size_t len,
> +int ieee80211_frame_duration(enum ieee80211_band band, size_t len,
>  			     int rate, int erp, int short_preamble)
>  {
>  	int dur;
> @@ -120,7 +120,7 @@ int ieee80211_frame_duration(struct ieee80211_local *local, size_t len,
>  	 * DIV_ROUND_UP() operations.
>  	 */
>  
> -	if (local->hw.conf.channel->band == IEEE80211_BAND_5GHZ || erp) {
> +	if (band == IEEE80211_BAND_5GHZ || erp) {
>  		/*
>  		 * OFDM:
>  		 *
> @@ -162,10 +162,10 @@ int ieee80211_frame_duration(struct ieee80211_local *local, size_t len,
>  /* Exported duration function for driver use */
>  __le16 ieee80211_generic_frame_duration(struct ieee80211_hw *hw,
>  					struct ieee80211_vif *vif,
> +					enum ieee80211_band band,
>  					size_t frame_len,
>  					struct ieee80211_rate *rate)
>  {
> -	struct ieee80211_local *local = hw_to_local(hw);
>  	struct ieee80211_sub_if_data *sdata;
>  	u16 dur;
>  	int erp;
> @@ -179,7 +179,7 @@ __le16 ieee80211_generic_frame_duration(struct ieee80211_hw *hw,
>  			erp = rate->flags & IEEE80211_RATE_ERP_G;
>  	}
>  
> -	dur = ieee80211_frame_duration(local, frame_len, rate->bitrate, erp,
> +	dur = ieee80211_frame_duration(band, frame_len, rate->bitrate, erp,
>  				       short_preamble);
>  
>  	return cpu_to_le16(dur);
> @@ -198,7 +198,7 @@ __le16 ieee80211_rts_duration(struct ieee80211_hw *hw,
>  	u16 dur;
>  	struct ieee80211_supported_band *sband;
>  
> -	sband = local->hw.wiphy->bands[local->hw.conf.channel->band];
> +	sband = local->hw.wiphy->bands[frame_txctl->band];
>  
>  	short_preamble = false;
>  
> @@ -213,13 +213,13 @@ __le16 ieee80211_rts_duration(struct ieee80211_hw *hw,
>  	}
>  
>  	/* CTS duration */
> -	dur = ieee80211_frame_duration(local, 10, rate->bitrate,
> +	dur = ieee80211_frame_duration(sband->band, 10, rate->bitrate,
>  				       erp, short_preamble);
>  	/* Data frame duration */
> -	dur += ieee80211_frame_duration(local, frame_len, rate->bitrate,
> +	dur += ieee80211_frame_duration(sband->band, frame_len, rate->bitrate,
>  					erp, short_preamble);
>  	/* ACK duration */
> -	dur += ieee80211_frame_duration(local, 10, rate->bitrate,
> +	dur += ieee80211_frame_duration(sband->band, 10, rate->bitrate,
>  					erp, short_preamble);
>  
>  	return cpu_to_le16(dur);
> @@ -239,7 +239,7 @@ __le16 ieee80211_ctstoself_duration(struct ieee80211_hw *hw,
>  	u16 dur;
>  	struct ieee80211_supported_band *sband;
>  
> -	sband = local->hw.wiphy->bands[local->hw.conf.channel->band];
> +	sband = local->hw.wiphy->bands[frame_txctl->band];
>  
>  	short_preamble = false;
>  
> @@ -253,11 +253,11 @@ __le16 ieee80211_ctstoself_duration(struct ieee80211_hw *hw,
>  	}
>  
>  	/* Data frame duration */
> -	dur = ieee80211_frame_duration(local, frame_len, rate->bitrate,
> +	dur = ieee80211_frame_duration(sband->band, frame_len, rate->bitrate,
>  				       erp, short_preamble);
>  	if (!(frame_txctl->flags & IEEE80211_TX_CTL_NO_ACK)) {
>  		/* ACK duration */
> -		dur += ieee80211_frame_duration(local, 10, rate->bitrate,
> +		dur += ieee80211_frame_duration(sband->band, 10, rate->bitrate,
>  						erp, short_preamble);
>  	}
>  
> @@ -878,10 +878,8 @@ u32 ieee80211_mandatory_rates(struct ieee80211_local *local,
>  	int i;
>  
>  	sband = local->hw.wiphy->bands[band];
> -	if (!sband) {
> -		WARN_ON(1);
> -		sband = local->hw.wiphy->bands[local->hw.conf.channel->band];
> -	}
> +	if (WARN_ON(!sband))
> +		return 1;
>  
>  	if (band == IEEE80211_BAND_2GHZ)
>  		mandatory_flag = IEEE80211_RATE_MANDATORY_B;
> @@ -1115,10 +1113,8 @@ u32 ieee80211_sta_get_rates(struct ieee80211_local *local,
>  	int i, j;
>  	sband = local->hw.wiphy->bands[band];
>  
> -	if (!sband) {
> -		WARN_ON(1);
> -		sband = local->hw.wiphy->bands[local->hw.conf.channel->band];
> -	}
> +	if (WARN_ON(!sband))
> +		return 1;
>  
>  	bitrates = sband->bitrates;
>  	num_rates = sband->n_bitrates;



^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH] mac80211: remove hw.conf.channel usage where possible
@ 2012-03-29  7:01 Michal Kazior
  2012-03-29  7:07 ` Johannes Berg
  2012-04-10 19:20 ` John W. Linville
  0 siblings, 2 replies; 6+ messages in thread
From: Michal Kazior @ 2012-03-29  7:01 UTC (permalink / raw)
  To: johannes; +Cc: linux-wireless, Michal Kazior

Removes hw.conf.channel usage from the following functions:
 * ieee80211_mandatory_rates
 * ieee80211_sta_get_rates
 * ieee80211_frame_duration
 * ieee80211_rts_duration
 * ieee80211_ctstoself_duration

This is in preparation for multi-channel operation.

Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
---
 drivers/net/wireless/ath/ath5k/ath5k.h |    2 +-
 drivers/net/wireless/ath/ath5k/pcu.c   |    9 ++++---
 drivers/net/wireless/ath/ath5k/qcu.c   |    8 ++++--
 include/net/mac80211.h                 |    1 +
 net/mac80211/ieee80211_i.h             |    2 +-
 net/mac80211/rc80211_minstrel.c        |   13 ++++++-----
 net/mac80211/rc80211_minstrel_ht.c     |    5 +--
 net/mac80211/tx.c                      |    4 +-
 net/mac80211/util.c                    |   34 ++++++++++++++-----------------
 9 files changed, 39 insertions(+), 39 deletions(-)

diff --git a/drivers/net/wireless/ath/ath5k/ath5k.h b/drivers/net/wireless/ath/ath5k/ath5k.h
index 8d434b8..727f2e5 100644
--- a/drivers/net/wireless/ath/ath5k/ath5k.h
+++ b/drivers/net/wireless/ath/ath5k/ath5k.h
@@ -1524,7 +1524,7 @@ void ath5k_eeprom_detach(struct ath5k_hw *ah);
 
 /* Protocol Control Unit Functions */
 /* Helpers */
-int ath5k_hw_get_frame_duration(struct ath5k_hw *ah,
+int ath5k_hw_get_frame_duration(struct ath5k_hw *ah, enum ieee80211_band band,
 		int len, struct ieee80211_rate *rate, bool shortpre);
 unsigned int ath5k_hw_get_default_slottime(struct ath5k_hw *ah);
 unsigned int ath5k_hw_get_default_sifs(struct ath5k_hw *ah);
diff --git a/drivers/net/wireless/ath/ath5k/pcu.c b/drivers/net/wireless/ath/ath5k/pcu.c
index cebfd6f..1f16b42 100644
--- a/drivers/net/wireless/ath/ath5k/pcu.c
+++ b/drivers/net/wireless/ath/ath5k/pcu.c
@@ -110,7 +110,7 @@ static const unsigned int ack_rates_high[] =
  * bwmodes.
  */
 int
-ath5k_hw_get_frame_duration(struct ath5k_hw *ah,
+ath5k_hw_get_frame_duration(struct ath5k_hw *ah, enum ieee80211_band band,
 		int len, struct ieee80211_rate *rate, bool shortpre)
 {
 	int sifs, preamble, plcp_bits, sym_time;
@@ -120,7 +120,7 @@ ath5k_hw_get_frame_duration(struct ath5k_hw *ah,
 	/* Fallback */
 	if (!ah->ah_bwmode) {
 		__le16 raw_dur = ieee80211_generic_frame_duration(ah->hw,
-					NULL, len, rate);
+					NULL, band, len, rate);
 
 		/* subtract difference between long and short preamble */
 		dur = le16_to_cpu(raw_dur);
@@ -302,14 +302,15 @@ ath5k_hw_write_rate_duration(struct ath5k_hw *ah)
 		 * actual rate for this rate. See mac80211 tx.c
 		 * ieee80211_duration() for a brief description of
 		 * what rate we should choose to TX ACKs. */
-		tx_time = ath5k_hw_get_frame_duration(ah, 10, rate, false);
+		tx_time = ath5k_hw_get_frame_duration(ah, band, 10,
+					rate, false);
 
 		ath5k_hw_reg_write(ah, tx_time, reg);
 
 		if (!(rate->flags & IEEE80211_RATE_SHORT_PREAMBLE))
 			continue;
 
-		tx_time = ath5k_hw_get_frame_duration(ah, 10, rate, true);
+		tx_time = ath5k_hw_get_frame_duration(ah, band, 10, rate, true);
 		ath5k_hw_reg_write(ah, tx_time,
 			reg + (AR5K_SET_SHORT_PREAMBLE << 2));
 	}
diff --git a/drivers/net/wireless/ath/ath5k/qcu.c b/drivers/net/wireless/ath/ath5k/qcu.c
index 30b50f9..1f9677a 100644
--- a/drivers/net/wireless/ath/ath5k/qcu.c
+++ b/drivers/net/wireless/ath/ath5k/qcu.c
@@ -563,6 +563,7 @@ ath5k_hw_reset_tx_queue(struct ath5k_hw *ah, unsigned int queue)
 int ath5k_hw_set_ifs_intervals(struct ath5k_hw *ah, unsigned int slot_time)
 {
 	struct ieee80211_channel *channel = ah->ah_current_channel;
+	enum ieee80211_band band;
 	struct ieee80211_rate *rate;
 	u32 ack_tx_time, eifs, eifs_clock, sifs, sifs_clock;
 	u32 slot_time_clock = ath5k_hw_htoclock(ah, slot_time);
@@ -598,11 +599,12 @@ int ath5k_hw_set_ifs_intervals(struct ath5k_hw *ah, unsigned int slot_time)
 	 * Also we have different lowest rate for 802.11a
 	 */
 	if (channel->band == IEEE80211_BAND_5GHZ)
-		rate = &ah->sbands[IEEE80211_BAND_5GHZ].bitrates[0];
+		band = IEEE80211_BAND_5GHZ;
 	else
-		rate = &ah->sbands[IEEE80211_BAND_2GHZ].bitrates[0];
+		band = IEEE80211_BAND_2GHZ;
 
-	ack_tx_time = ath5k_hw_get_frame_duration(ah, 10, rate, false);
+	rate = &ah->sbands[band].bitrates[0];
+	ack_tx_time = ath5k_hw_get_frame_duration(ah, band, 10, rate, false);
 
 	/* ack_tx_time includes an SIFS already */
 	eifs = ack_tx_time + sifs + 2 * slot_time;
diff --git a/include/net/mac80211.h b/include/net/mac80211.h
index 9a012be..ee7a38b 100644
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
@@ -2842,6 +2842,7 @@ __le16 ieee80211_ctstoself_duration(struct ieee80211_hw *hw,
  */
 __le16 ieee80211_generic_frame_duration(struct ieee80211_hw *hw,
 					struct ieee80211_vif *vif,
+					enum ieee80211_band band,
 					size_t frame_len,
 					struct ieee80211_rate *rate);
 
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h
index d9798a3..c5c6ab0 100644
--- a/net/mac80211/ieee80211_i.h
+++ b/net/mac80211/ieee80211_i.h
@@ -1383,7 +1383,7 @@ static inline int __ieee80211_resume(struct ieee80211_hw *hw)
 extern void *mac80211_wiphy_privid; /* for wiphy privid */
 u8 *ieee80211_get_bssid(struct ieee80211_hdr *hdr, size_t len,
 			enum nl80211_iftype type);
-int ieee80211_frame_duration(struct ieee80211_local *local, size_t len,
+int ieee80211_frame_duration(enum ieee80211_band band, size_t len,
 			     int rate, int erp, int short_preamble);
 void mac80211_ev_michael_mic_failure(struct ieee80211_sub_if_data *sdata, int keyidx,
 				     struct ieee80211_hdr *hdr, const u8 *tsc,
diff --git a/net/mac80211/rc80211_minstrel.c b/net/mac80211/rc80211_minstrel.c
index b39dda5..79633ae 100644
--- a/net/mac80211/rc80211_minstrel.c
+++ b/net/mac80211/rc80211_minstrel.c
@@ -334,14 +334,15 @@ minstrel_get_rate(void *priv, struct ieee80211_sta *sta,
 
 
 static void
-calc_rate_durations(struct ieee80211_local *local, struct minstrel_rate *d,
+calc_rate_durations(enum ieee80211_band band,
+		    struct minstrel_rate *d,
 		    struct ieee80211_rate *rate)
 {
 	int erp = !!(rate->flags & IEEE80211_RATE_ERP_G);
 
-	d->perfect_tx_time = ieee80211_frame_duration(local, 1200,
+	d->perfect_tx_time = ieee80211_frame_duration(band, 1200,
 			rate->bitrate, erp, 1);
-	d->ack_time = ieee80211_frame_duration(local, 10,
+	d->ack_time = ieee80211_frame_duration(band, 10,
 			rate->bitrate, erp, 1);
 }
 
@@ -379,14 +380,14 @@ minstrel_rate_init(void *priv, struct ieee80211_supported_band *sband,
 {
 	struct minstrel_sta_info *mi = priv_sta;
 	struct minstrel_priv *mp = priv;
-	struct ieee80211_local *local = hw_to_local(mp->hw);
 	struct ieee80211_rate *ctl_rate;
 	unsigned int i, n = 0;
 	unsigned int t_slot = 9; /* FIXME: get real slot time */
 
 	mi->lowest_rix = rate_lowest_index(sband, sta);
 	ctl_rate = &sband->bitrates[mi->lowest_rix];
-	mi->sp_ack_dur = ieee80211_frame_duration(local, 10, ctl_rate->bitrate,
+	mi->sp_ack_dur = ieee80211_frame_duration(sband->band, 10,
+				ctl_rate->bitrate,
 				!!(ctl_rate->flags & IEEE80211_RATE_ERP_G), 1);
 
 	for (i = 0; i < sband->n_bitrates; i++) {
@@ -402,7 +403,7 @@ minstrel_rate_init(void *priv, struct ieee80211_supported_band *sband,
 
 		mr->rix = i;
 		mr->bitrate = sband->bitrates[i].bitrate / 5;
-		calc_rate_durations(local, mr, &sband->bitrates[i]);
+		calc_rate_durations(sband->band, mr, &sband->bitrates[i]);
 
 		/* calculate maximum number of retransmissions before
 		 * fallback (based on maximum segment size) */
diff --git a/net/mac80211/rc80211_minstrel_ht.c b/net/mac80211/rc80211_minstrel_ht.c
index 16e0b27..08048fc 100644
--- a/net/mac80211/rc80211_minstrel_ht.c
+++ b/net/mac80211/rc80211_minstrel_ht.c
@@ -693,7 +693,6 @@ minstrel_ht_update_caps(void *priv, struct ieee80211_supported_band *sband,
 	struct minstrel_ht_sta_priv *msp = priv_sta;
 	struct minstrel_ht_sta *mi = &msp->ht;
 	struct ieee80211_mcs_info *mcs = &sta->ht_cap.mcs;
-	struct ieee80211_local *local = hw_to_local(mp->hw);
 	u16 sta_cap = sta->ht_cap.cap;
 	int n_supported = 0;
 	int ack_dur;
@@ -712,8 +711,8 @@ minstrel_ht_update_caps(void *priv, struct ieee80211_supported_band *sband,
 	memset(mi, 0, sizeof(*mi));
 	mi->stats_update = jiffies;
 
-	ack_dur = ieee80211_frame_duration(local, 10, 60, 1, 1);
-	mi->overhead = ieee80211_frame_duration(local, 0, 60, 1, 1) + ack_dur;
+	ack_dur = ieee80211_frame_duration(sband->band, 10, 60, 1, 1);
+	mi->overhead = ieee80211_frame_duration(sband->band, 0, 60, 1, 1) + ack_dur;
 	mi->overhead_rtscts = mi->overhead + 2 * ack_dur;
 
 	mi->avg_ampdu_len = MINSTREL_FRAC(1, 1);
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
index 782a601..1a0732d 100644
--- a/net/mac80211/tx.c
+++ b/net/mac80211/tx.c
@@ -159,7 +159,7 @@ static __le16 ieee80211_duration(struct ieee80211_tx_data *tx,
 		/* Time needed to transmit ACK
 		 * (10 bytes + 4-byte FCS = 112 bits) plus SIFS; rounded up
 		 * to closest integer */
-		dur = ieee80211_frame_duration(local, 10, rate, erp,
+		dur = ieee80211_frame_duration(sband->band, 10, rate, erp,
 				tx->sdata->vif.bss_conf.use_short_preamble);
 
 	if (next_frag_len) {
@@ -167,7 +167,7 @@ static __le16 ieee80211_duration(struct ieee80211_tx_data *tx,
 		 * transmit next fragment plus ACK and 2 x SIFS. */
 		dur *= 2; /* ACK + SIFS */
 		/* next fragment */
-		dur += ieee80211_frame_duration(local, next_frag_len,
+		dur += ieee80211_frame_duration(sband->band, next_frag_len,
 				txrate->bitrate, erp,
 				tx->sdata->vif.bss_conf.use_short_preamble);
 	}
diff --git a/net/mac80211/util.c b/net/mac80211/util.c
index 32f7a3b..cae3dc4 100644
--- a/net/mac80211/util.c
+++ b/net/mac80211/util.c
@@ -106,7 +106,7 @@ void ieee80211_tx_set_protected(struct ieee80211_tx_data *tx)
 	}
 }
 
-int ieee80211_frame_duration(struct ieee80211_local *local, size_t len,
+int ieee80211_frame_duration(enum ieee80211_band band, size_t len,
 			     int rate, int erp, int short_preamble)
 {
 	int dur;
@@ -120,7 +120,7 @@ int ieee80211_frame_duration(struct ieee80211_local *local, size_t len,
 	 * DIV_ROUND_UP() operations.
 	 */
 
-	if (local->hw.conf.channel->band == IEEE80211_BAND_5GHZ || erp) {
+	if (band == IEEE80211_BAND_5GHZ || erp) {
 		/*
 		 * OFDM:
 		 *
@@ -162,10 +162,10 @@ int ieee80211_frame_duration(struct ieee80211_local *local, size_t len,
 /* Exported duration function for driver use */
 __le16 ieee80211_generic_frame_duration(struct ieee80211_hw *hw,
 					struct ieee80211_vif *vif,
+					enum ieee80211_band band,
 					size_t frame_len,
 					struct ieee80211_rate *rate)
 {
-	struct ieee80211_local *local = hw_to_local(hw);
 	struct ieee80211_sub_if_data *sdata;
 	u16 dur;
 	int erp;
@@ -179,7 +179,7 @@ __le16 ieee80211_generic_frame_duration(struct ieee80211_hw *hw,
 			erp = rate->flags & IEEE80211_RATE_ERP_G;
 	}
 
-	dur = ieee80211_frame_duration(local, frame_len, rate->bitrate, erp,
+	dur = ieee80211_frame_duration(band, frame_len, rate->bitrate, erp,
 				       short_preamble);
 
 	return cpu_to_le16(dur);
@@ -198,7 +198,7 @@ __le16 ieee80211_rts_duration(struct ieee80211_hw *hw,
 	u16 dur;
 	struct ieee80211_supported_band *sband;
 
-	sband = local->hw.wiphy->bands[local->hw.conf.channel->band];
+	sband = local->hw.wiphy->bands[frame_txctl->band];
 
 	short_preamble = false;
 
@@ -213,13 +213,13 @@ __le16 ieee80211_rts_duration(struct ieee80211_hw *hw,
 	}
 
 	/* CTS duration */
-	dur = ieee80211_frame_duration(local, 10, rate->bitrate,
+	dur = ieee80211_frame_duration(sband->band, 10, rate->bitrate,
 				       erp, short_preamble);
 	/* Data frame duration */
-	dur += ieee80211_frame_duration(local, frame_len, rate->bitrate,
+	dur += ieee80211_frame_duration(sband->band, frame_len, rate->bitrate,
 					erp, short_preamble);
 	/* ACK duration */
-	dur += ieee80211_frame_duration(local, 10, rate->bitrate,
+	dur += ieee80211_frame_duration(sband->band, 10, rate->bitrate,
 					erp, short_preamble);
 
 	return cpu_to_le16(dur);
@@ -239,7 +239,7 @@ __le16 ieee80211_ctstoself_duration(struct ieee80211_hw *hw,
 	u16 dur;
 	struct ieee80211_supported_band *sband;
 
-	sband = local->hw.wiphy->bands[local->hw.conf.channel->band];
+	sband = local->hw.wiphy->bands[frame_txctl->band];
 
 	short_preamble = false;
 
@@ -253,11 +253,11 @@ __le16 ieee80211_ctstoself_duration(struct ieee80211_hw *hw,
 	}
 
 	/* Data frame duration */
-	dur = ieee80211_frame_duration(local, frame_len, rate->bitrate,
+	dur = ieee80211_frame_duration(sband->band, frame_len, rate->bitrate,
 				       erp, short_preamble);
 	if (!(frame_txctl->flags & IEEE80211_TX_CTL_NO_ACK)) {
 		/* ACK duration */
-		dur += ieee80211_frame_duration(local, 10, rate->bitrate,
+		dur += ieee80211_frame_duration(sband->band, 10, rate->bitrate,
 						erp, short_preamble);
 	}
 
@@ -878,10 +878,8 @@ u32 ieee80211_mandatory_rates(struct ieee80211_local *local,
 	int i;
 
 	sband = local->hw.wiphy->bands[band];
-	if (!sband) {
-		WARN_ON(1);
-		sband = local->hw.wiphy->bands[local->hw.conf.channel->band];
-	}
+	if (WARN_ON(!sband))
+		return 1;
 
 	if (band == IEEE80211_BAND_2GHZ)
 		mandatory_flag = IEEE80211_RATE_MANDATORY_B;
@@ -1115,10 +1113,8 @@ u32 ieee80211_sta_get_rates(struct ieee80211_local *local,
 	int i, j;
 	sband = local->hw.wiphy->bands[band];
 
-	if (!sband) {
-		WARN_ON(1);
-		sband = local->hw.wiphy->bands[local->hw.conf.channel->band];
-	}
+	if (WARN_ON(!sband))
+		return 1;
 
 	bitrates = sband->bitrates;
 	num_rates = sband->n_bitrates;
-- 
1.7.0.4


^ permalink raw reply related	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2012-04-11  6:22 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-03-28 10:54 [PATCH] mac80211: remove hw.conf.channel usage where possible Michal Kazior
2012-03-28 11:17 ` Johannes Berg
2012-03-29  7:01 Michal Kazior
2012-03-29  7:07 ` Johannes Berg
2012-04-10 19:20 ` John W. Linville
2012-04-11  6:22   ` Michal Kazior

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.