* [PATCH] Update ar9271.fw
From: Vivek Natarajan @ 2010-08-18 14:29 UTC (permalink / raw)
To: David.Woodhouse; +Cc: linux-wireless
* Enable bluetooth coexistence.
* Fix disconnection issue with WEP and TKIP noticed in some APs.
Signed-off-by: Vivek Natarajan <vnatarajan@atheros.com>
---
ar9271.fw | Bin 51280 -> 51312 bytes
1 files changed, 0 insertions(+), 0 deletions(-)
diff --git a/ar9271.fw b/ar9271.fw
index 0ec953b404c1912dc64fa3b0171cffae82b0f375..d0ee74a1c8dccb7cc21f5be90f1d4048fa9dbf9e 100644
GIT binary patch
delta 11372
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
delta 10631
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
--
1.7.2.1
^ permalink raw reply
* Re: [PATCH 1/4] wl1251: add missing __packed modifier for some structs
From: Kalle Valo @ 2010-08-18 15:12 UTC (permalink / raw)
To: Grazvydas Ignotas; +Cc: John W. Linville, linux-wireless
In-Reply-To: <1282074415-6168-2-git-send-email-notasas@gmail.com>
Grazvydas Ignotas <notasas@gmail.com> writes:
> Several acx and cmd structures are missing __packed modifier, add it.
> This was noticed while comparing them with corresponding wl1271 code.
Looks good.
> Signed-off-by: Grazvydas Ignotas <notasas@gmail.com>
Acked-by: Kalle Valo <kvalo@adurom.com>
--
Kalle Valo
^ permalink raw reply
* Re: [PATCH 2/4] wl1251: fix event handling mechanism
From: Kalle Valo @ 2010-08-18 15:13 UTC (permalink / raw)
To: Grazvydas Ignotas; +Cc: John W. Linville, linux-wireless
In-Reply-To: <1282074415-6168-3-git-send-email-notasas@gmail.com>
Grazvydas Ignotas <notasas@gmail.com> writes:
> In case both A and B events occured simultaneously, current code
> would only process A and clear both interrupts. Make it process both
> events instead.
>
> Based on wl1271 patches by Juuso Oikarinen:
> 1fd2794f36913992798184c464fe8f85753b13e0
> 13f2dc52c69bcca074cd12d4806953b2af45c386
>
> Signed-off-by: Grazvydas Ignotas <notasas@gmail.com>
Acked-by: Kalle Valo <kvalo@adurom.com>
--
Kalle Valo
^ permalink raw reply
* Re: [PATCH 3/4] wl1251: fix beacon filter table structure
From: Kalle Valo @ 2010-08-18 15:15 UTC (permalink / raw)
To: Grazvydas Ignotas; +Cc: John W. Linville, linux-wireless
In-Reply-To: <1282074415-6168-4-git-send-email-notasas@gmail.com>
Grazvydas Ignotas <notasas@gmail.com> writes:
> The beacon filter table configuration ACX structure had certain elements
> reversed, fix it to match TI driver.
>
> Based on wl1271 patch 1937e742639c03a6fe77239c3003ce9602302117 by
> Juuso Oikarinen.
Yes, the padding doesn't make any sense otherwise.
> Signed-off-by: Grazvydas Ignotas <notasas@gmail.com>
Acked-by: Kalle Valo <kvalo@adurom.com>
--
Kalle Valo
^ permalink raw reply
* Re: [PATCH 4/4] wl1251: wait for join command complete event
From: Kalle Valo @ 2010-08-18 15:18 UTC (permalink / raw)
To: Grazvydas Ignotas; +Cc: John W. Linville, linux-wireless
In-Reply-To: <1282074415-6168-5-git-send-email-notasas@gmail.com>
Grazvydas Ignotas <notasas@gmail.com> writes:
> Poll for join command completion instead of waiting blindly for 10
> msecs. There is a timeout of 100 msecs, if the command doesn't complete
> by then, we return an error code.
>
> Based on wl1271 patch 99d84c1de8fdf5f9b09f07fdbc628857a040bf8b
> by Luciano Coelho.
>
> Signed-off-by: Grazvydas Ignotas <notasas@gmail.com>
Acked-by: Kalle Valo <kvalo@adurom.com>
--
Kalle Valo
^ permalink raw reply
* [PATCH v2] nl80211: some documentation fixes
From: Johannes Berg @ 2010-08-18 15:44 UTC (permalink / raw)
To: John Linville; +Cc: linux-wireless
In-Reply-To: <1282138230.5249.0.camel@jlt3.sipsolutions.net>
From: Johannes Berg <johannes.berg@intel.com>
The nl80211 documentation is currently never
generated, so problems have accumulated. Fix
most of the trivial ones.
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
---
Forgotten quilt refresh? Not sure what the change even was...
include/linux/nl80211.h | 57 ++++++++++++++++++++++++++++++++++++++----------
1 file changed, 46 insertions(+), 11 deletions(-)
--- wireless-testing.orig/include/linux/nl80211.h 2010-08-18 17:37:48.000000000 +0200
+++ wireless-testing/include/linux/nl80211.h 2010-08-18 17:43:51.000000000 +0200
@@ -347,6 +347,8 @@
* four bytes for vendor frames including the OUI. The registration
* cannot be dropped, but is removed automatically when the netlink
* socket is closed. Multiple registrations can be made.
+ * @NL80211_CMD_REGISTER_ACTION: Alias for @NL80211_CMD_REGISTER_FRAME for
+ * backward compatibility
* @NL80211_CMD_FRAME: Management frame TX request and RX notification. This
* command is used both as a request to transmit a management frame and
* as an event indicating reception of a frame that was not processed in
@@ -359,11 +361,14 @@
* operational channel). When called, this operation returns a cookie
* (%NL80211_ATTR_COOKIE) that will be included with the TX status event
* pertaining to the TX request.
+ * @NL80211_CMD_ACTION: Alias for @NL80211_CMD_FRAME for backward compatibility.
* @NL80211_CMD_FRAME_TX_STATUS: Report TX status of a management frame
* transmitted with %NL80211_CMD_FRAME. %NL80211_ATTR_COOKIE identifies
* the TX command and %NL80211_ATTR_FRAME includes the contents of the
* frame. %NL80211_ATTR_ACK flag is included if the recipient acknowledged
* the frame.
+ * @NL80211_CMD_ACTION_TX_STATUS: Alias for @NL80211_CMD_FRAME_TX_STATUS for
+ * backward compatibility.
* @NL80211_CMD_SET_CQM: Connection quality monitor configuration. This command
* is used to configure connection quality monitoring notification trigger
* levels.
@@ -1034,11 +1039,14 @@ enum nl80211_iftype {
* Station flags. When a station is added to an AP interface, it is
* assumed to be already associated (and hence authenticated.)
*
+ * @__NL80211_STA_FLAG_INVALID: attribute number 0 is reserved
* @NL80211_STA_FLAG_AUTHORIZED: station is authorized (802.1X)
* @NL80211_STA_FLAG_SHORT_PREAMBLE: station is capable of receiving frames
* with short barker preamble
* @NL80211_STA_FLAG_WME: station is WME/QoS capable
* @NL80211_STA_FLAG_MFP: station uses management frame protection
+ * @NL80211_STA_FLAG_MAX: highest station flag number currently defined
+ * @__NL80211_STA_FLAG_AFTER_LAST: internal use
*/
enum nl80211_sta_flags {
__NL80211_STA_FLAG_INVALID,
@@ -1151,14 +1159,17 @@ enum nl80211_mpath_flags {
* information about a mesh path.
*
* @__NL80211_MPATH_INFO_INVALID: attribute number 0 is reserved
- * @NL80211_ATTR_MPATH_FRAME_QLEN: number of queued frames for this destination
- * @NL80211_ATTR_MPATH_SN: destination sequence number
- * @NL80211_ATTR_MPATH_METRIC: metric (cost) of this mesh path
- * @NL80211_ATTR_MPATH_EXPTIME: expiration time for the path, in msec from now
- * @NL80211_ATTR_MPATH_FLAGS: mesh path flags, enumerated in
+ * @NL80211_MPATH_INFO_FRAME_QLEN: number of queued frames for this destination
+ * @NL80211_MPATH_INFO_SN: destination sequence number
+ * @NL80211_MPATH_INFO_METRIC: metric (cost) of this mesh path
+ * @NL80211_MPATH_INFO_EXPTIME: expiration time for the path, in msec from now
+ * @NL80211_MPATH_INFO_FLAGS: mesh path flags, enumerated in
* &enum nl80211_mpath_flags;
- * @NL80211_ATTR_MPATH_DISCOVERY_TIMEOUT: total path discovery timeout, in msec
- * @NL80211_ATTR_MPATH_DISCOVERY_RETRIES: mesh path discovery retries
+ * @NL80211_MPATH_INFO_DISCOVERY_TIMEOUT: total path discovery timeout, in msec
+ * @NL80211_MPATH_INFO_DISCOVERY_RETRIES: mesh path discovery retries
+ * @NL80211_MPATH_INFO_MAX: highest mesh path information attribute number
+ * currently defind
+ * @__NL80211_MPATH_INFO_AFTER_LAST: internal use
*/
enum nl80211_mpath_info {
__NL80211_MPATH_INFO_INVALID,
@@ -1187,6 +1198,8 @@ enum nl80211_mpath_info {
* @NL80211_BAND_ATTR_HT_CAPA: HT capabilities, as in the HT information IE
* @NL80211_BAND_ATTR_HT_AMPDU_FACTOR: A-MPDU factor, as in 11n
* @NL80211_BAND_ATTR_HT_AMPDU_DENSITY: A-MPDU density, as in 11n
+ * @NL80211_BAND_ATTR_MAX: highest band attribute currently defined
+ * @__NL80211_BAND_ATTR_AFTER_LAST: internal use
*/
enum nl80211_band_attr {
__NL80211_BAND_ATTR_INVALID,
@@ -1207,6 +1220,7 @@ enum nl80211_band_attr {
/**
* enum nl80211_frequency_attr - frequency attributes
+ * @__NL80211_FREQUENCY_ATTR_INVALID: attribute number 0 is reserved
* @NL80211_FREQUENCY_ATTR_FREQ: Frequency in MHz
* @NL80211_FREQUENCY_ATTR_DISABLED: Channel is disabled in current
* regulatory domain.
@@ -1218,6 +1232,9 @@ enum nl80211_band_attr {
* on this channel in current regulatory domain.
* @NL80211_FREQUENCY_ATTR_MAX_TX_POWER: Maximum transmission power in mBm
* (100 * dBm).
+ * @NL80211_FREQUENCY_ATTR_MAX: highest frequency attribute number
+ * currently defined
+ * @__NL80211_FREQUENCY_ATTR_AFTER_LAST: internal use
*/
enum nl80211_frequency_attr {
__NL80211_FREQUENCY_ATTR_INVALID,
@@ -1237,9 +1254,13 @@ enum nl80211_frequency_attr {
/**
* enum nl80211_bitrate_attr - bitrate attributes
+ * @__NL80211_BITRATE_ATTR_INVALID: attribute number 0 is reserved
* @NL80211_BITRATE_ATTR_RATE: Bitrate in units of 100 kbps
* @NL80211_BITRATE_ATTR_2GHZ_SHORTPREAMBLE: Short preamble supported
* in 2.4 GHz band.
+ * @NL80211_BITRATE_ATTR_MAX: highest bitrate attribute number
+ * currently defined
+ * @__NL80211_BITRATE_ATTR_AFTER_LAST: internal use
*/
enum nl80211_bitrate_attr {
__NL80211_BITRATE_ATTR_INVALID,
@@ -1295,6 +1316,7 @@ enum nl80211_reg_type {
/**
* enum nl80211_reg_rule_attr - regulatory rule attributes
+ * @__NL80211_REG_RULE_ATTR_INVALID: attribute number 0 is reserved
* @NL80211_ATTR_REG_RULE_FLAGS: a set of flags which specify additional
* considerations for a given frequency range. These are the
* &enum nl80211_reg_rule_flags.
@@ -1311,6 +1333,9 @@ enum nl80211_reg_type {
* If you don't have one then don't send this.
* @NL80211_ATTR_POWER_RULE_MAX_EIRP: the maximum allowed EIRP for
* a given frequency range. The value is in mBm (100 * dBm).
+ * @NL80211_REG_RULE_ATTR_MAX: highest regulatory rule attribute number
+ * currently defined
+ * @__NL80211_REG_RULE_ATTR_AFTER_LAST: internal use
*/
enum nl80211_reg_rule_attr {
__NL80211_REG_RULE_ATTR_INVALID,
@@ -1362,6 +1387,9 @@ enum nl80211_reg_rule_flags {
* @__NL80211_SURVEY_INFO_INVALID: attribute number 0 is reserved
* @NL80211_SURVEY_INFO_FREQUENCY: center frequency of channel
* @NL80211_SURVEY_INFO_NOISE: noise level of channel (u8, dBm)
+ * @NL80211_SURVEY_INFO_MAX: highest survey info attribute number
+ * currently defined
+ * @__NL80211_SURVEY_INFO_AFTER_LAST: internal use
*/
enum nl80211_survey_info {
__NL80211_SURVEY_INFO_INVALID,
@@ -1526,6 +1554,7 @@ enum nl80211_channel_type {
* enum nl80211_bss - netlink attributes for a BSS
*
* @__NL80211_BSS_INVALID: invalid
+ * @NL80211_BSS_BSSID: BSSID of the BSS (6 octets)
* @NL80211_BSS_FREQUENCY: frequency in MHz (u32)
* @NL80211_BSS_TSF: TSF of the received probe response/beacon (u64)
* @NL80211_BSS_BEACON_INTERVAL: beacon interval of the (I)BSS (u16)
@@ -1569,6 +1598,12 @@ enum nl80211_bss {
/**
* enum nl80211_bss_status - BSS "status"
+ * @NL80211_BSS_STATUS_AUTHENTICATED: Authenticated with this BSS.
+ * @NL80211_BSS_STATUS_ASSOCIATED: Associated with this BSS.
+ * @NL80211_BSS_STATUS_IBSS_JOINED: Joined to this IBSS.
+ *
+ * The BSS status is a BSS attribute in scan dumps, which
+ * indicates the status the interface has wrt. this BSS.
*/
enum nl80211_bss_status {
NL80211_BSS_STATUS_AUTHENTICATED,
@@ -1686,8 +1721,8 @@ enum nl80211_tx_rate_attributes {
/**
* enum nl80211_band - Frequency band
- * @NL80211_BAND_2GHZ - 2.4 GHz ISM band
- * @NL80211_BAND_5GHZ - around 5 GHz band (4.9 - 5.7 GHz)
+ * @NL80211_BAND_2GHZ: 2.4 GHz ISM band
+ * @NL80211_BAND_5GHZ: around 5 GHz band (4.9 - 5.7 GHz)
*/
enum nl80211_band {
NL80211_BAND_2GHZ,
@@ -1725,9 +1760,9 @@ enum nl80211_attr_cqm {
/**
* enum nl80211_cqm_rssi_threshold_event - RSSI threshold event
- * @NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW - The RSSI level is lower than the
+ * @NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW: The RSSI level is lower than the
* configured threshold
- * @NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH - The RSSI is higher than the
+ * @NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH: The RSSI is higher than the
* configured threshold
*/
enum nl80211_cqm_rssi_threshold_event {
^ permalink raw reply
* Re: [PATCH 0/4] wl1271 -> wl1251 port patches
From: Kalle Valo @ 2010-08-18 15:48 UTC (permalink / raw)
To: Grazvydas Ignotas; +Cc: John W. Linville, linux-wireless, Luciano Coelho
In-Reply-To: <1282074415-6168-1-git-send-email-notasas@gmail.com>
Grazvydas Ignotas <notasas@gmail.com> writes:
> Hi,
Hi Grazvydas,
> I've been looking at wl1271 changelog and found several patches that
> seem to be also applicable to wl1251. I'm not that sure about patches
> 2 and 4, but 1 and 3 should be correct (I've verified 3 with TI driver).
> I've been running these on pandora for several days now without problems.
Patches looked good, thank you for them.
> It's a shame wl12xx drivers were completely split, it would look like
> they could share fair bit of code. Now wl1251 does not benefit from more
> actively developed wl1271 fixes.
We tried that first. But there were so many subtle differences
everywhere that it became very difficult to handle and we decided to
split the driver. Of course that also has it's problems like you
mentioned. A stable firmware API would have solved this, but as usual
when dealing with hardware, it's just a pipe dream.
> There are even more wl1271 patches that could be applicable to wl1251.
> Kalle, could you take a look at the list below? I could try porting if
> you think any of those make sense.
Sorry, I can't do it right now but I should have time for it later
this week.
--
Kalle Valo
^ permalink raw reply
* [PATCH 00/16] iwlwifi update for 2.6.37
From: Wey-Yi Guy @ 2010-08-18 16:22 UTC (permalink / raw)
To: linville; +Cc: linux-wireless, ipw3945-devel, Wey-Yi Guy
We enable the capabilities to use experimental uCode for debugging.
We also do some code cleanup and refactor works in iwlwifi driver
There is a possibility of race condition while performing roaming,
not sure it is the case, but to avoid the possibility is a much
better approach.
Jay Sternberg (2):
iwlwifi: enable experimental ucode support
iwlwifi: move debug options into submenu
Johannes Berg (1):
iwlwifi: refactor iwl_setup_rxon_timing
Shanyu Zhao (3):
iwlwifi: do not call ieee80211_frequency_to_channel
iwlwifi: avoid race condition in channel change
iwlwifi: cleanup iwl_set_rxon_channel()
Wey-Yi Guy (10):
iwlwifi: remove unused define
iwlwifi: additional comments in iwl_cfg
iwlwifi: max/min aggregation time limit
iwlwifi: make aggregation time limit configurable
iwlagn: adjust starting action for rate scale
iwlagn: continue perform rate scale when error detected
iwlwifi: additional parameter in REPLY_RX_PHY_CMD
iwlwifi: more generic name for rssi calc in iwlagn
iwlwifi: configurable ampdu factor and density
iwlwifi: remove unused iwl_send_card_state function
these patches are also available from wireless-next-2.6 branch on
git://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/iwlwifi-2.6.git
drivers/net/wireless/iwlwifi/Kconfig | 10 ++++
drivers/net/wireless/iwlwifi/iwl-4965.c | 2 +-
drivers/net/wireless/iwlwifi/iwl-5000.c | 2 +-
drivers/net/wireless/iwlwifi/iwl-6000.c | 2 +-
drivers/net/wireless/iwlwifi/iwl-agn-hcmd.c | 21 +++++---
drivers/net/wireless/iwlwifi/iwl-agn-lib.c | 2 +-
drivers/net/wireless/iwlwifi/iwl-agn-rs.c | 42 +++++++++++++---
drivers/net/wireless/iwlwifi/iwl-agn.c | 56 ++++++++++++---------
drivers/net/wireless/iwlwifi/iwl-commands.h | 45 +++++++++--------
drivers/net/wireless/iwlwifi/iwl-core.c | 71 +++++++++------------------
drivers/net/wireless/iwlwifi/iwl-core.h | 12 +++-
drivers/net/wireless/iwlwifi/iwl-debugfs.c | 6 +--
drivers/net/wireless/iwlwifi/iwl-dev.h | 14 +++++-
drivers/net/wireless/iwlwifi/iwl3945-base.c | 11 +---
14 files changed, 168 insertions(+), 128 deletions(-)
^ permalink raw reply
* [PATCH 01/16] iwlwifi: remove unused define
From: Wey-Yi Guy @ 2010-08-18 16:22 UTC (permalink / raw)
To: linville; +Cc: linux-wireless, ipw3945-devel, Wey-Yi Guy
In-Reply-To: <1282148571-9258-1-git-send-email-wey-yi.w.guy@intel.com>
IWL_SIXTY_SECS is not been used, remove it
Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
---
drivers/net/wireless/iwlwifi/iwl-dev.h | 1 -
1 files changed, 0 insertions(+), 1 deletions(-)
diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h
index a36b4f9..37ec76a 100644
--- a/drivers/net/wireless/iwlwifi/iwl-dev.h
+++ b/drivers/net/wireless/iwlwifi/iwl-dev.h
@@ -1053,7 +1053,6 @@ struct iwl_event_log {
#define IWL_DEF_MONITORING_PERIOD (1000)
#define IWL_LONG_MONITORING_PERIOD (5000)
#define IWL_ONE_HUNDRED_MSECS (100)
-#define IWL_SIXTY_SECS (60000)
enum iwl_reset {
IWL_RF_RESET = 0,
--
1.7.0.4
^ permalink raw reply related
* [PATCH 03/16] iwlwifi: max/min aggregation time limit
From: Wey-Yi Guy @ 2010-08-18 16:22 UTC (permalink / raw)
To: linville; +Cc: linux-wireless, ipw3945-devel, Wey-Yi Guy
In-Reply-To: <1282148571-9258-1-git-send-email-wey-yi.w.guy@intel.com>
Set the minimum and maximum for aggregation time limit in uSec.
Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
---
drivers/net/wireless/iwlwifi/iwl-commands.h | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/net/wireless/iwlwifi/iwl-commands.h b/drivers/net/wireless/iwlwifi/iwl-commands.h
index 9435fd9..c6a0470 100644
--- a/drivers/net/wireless/iwlwifi/iwl-commands.h
+++ b/drivers/net/wireless/iwlwifi/iwl-commands.h
@@ -2092,8 +2092,8 @@ struct iwl_link_qual_general_params {
} __packed;
#define LINK_QUAL_AGG_TIME_LIMIT_DEF (4000) /* 4 milliseconds */
-#define LINK_QUAL_AGG_TIME_LIMIT_MAX (65535)
-#define LINK_QUAL_AGG_TIME_LIMIT_MIN (0)
+#define LINK_QUAL_AGG_TIME_LIMIT_MAX (8000)
+#define LINK_QUAL_AGG_TIME_LIMIT_MIN (100)
#define LINK_QUAL_AGG_DISABLE_START_DEF (3)
#define LINK_QUAL_AGG_DISABLE_START_MAX (255)
--
1.7.0.4
^ permalink raw reply related
* [PATCH 04/16] iwlwifi: make aggregation time limit configurable
From: Wey-Yi Guy @ 2010-08-18 16:22 UTC (permalink / raw)
To: linville; +Cc: linux-wireless, ipw3945-devel, Wey-Yi Guy
In-Reply-To: <1282148571-9258-1-git-send-email-wey-yi.w.guy@intel.com>
By default, aggregation time limit is 4000 uSec, add the parameter to
.cfg
to allow this parameter can be configure per device base if needed.
Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
---
drivers/net/wireless/iwlwifi/iwl-agn-rs.c | 10 ++++++++++
drivers/net/wireless/iwlwifi/iwl-commands.h | 6 ++++--
drivers/net/wireless/iwlwifi/iwl-core.h | 2 ++
3 files changed, 16 insertions(+), 2 deletions(-)
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c
index 23e5c42..7c4deee 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c
@@ -2694,8 +2694,18 @@ static void rs_fill_link_cmd(struct iwl_priv *priv,
lq_cmd->agg_params.agg_frame_cnt_limit = LINK_QUAL_AGG_FRAME_LIMIT_DEF;
lq_cmd->agg_params.agg_dis_start_th = LINK_QUAL_AGG_DISABLE_START_DEF;
+
lq_cmd->agg_params.agg_time_limit =
cpu_to_le16(LINK_QUAL_AGG_TIME_LIMIT_DEF);
+ /*
+ * overwrite if needed, pass aggregation time limit
+ * to uCode in uSec
+ */
+ if (priv && priv->cfg->agg_time_limit &&
+ priv->cfg->agg_time_limit >= LINK_QUAL_AGG_TIME_LIMIT_MIN &&
+ priv->cfg->agg_time_limit <= LINK_QUAL_AGG_TIME_LIMIT_MAX)
+ lq_cmd->agg_params.agg_time_limit =
+ cpu_to_le16(priv->cfg->agg_time_limit);
}
static void *rs_alloc(struct ieee80211_hw *hw, struct dentry *debugfsdir)
diff --git a/drivers/net/wireless/iwlwifi/iwl-commands.h b/drivers/net/wireless/iwlwifi/iwl-commands.h
index c6a0470..14a7a8c 100644
--- a/drivers/net/wireless/iwlwifi/iwl-commands.h
+++ b/drivers/net/wireless/iwlwifi/iwl-commands.h
@@ -2110,8 +2110,10 @@ struct iwl_link_qual_general_params {
*/
struct iwl_link_qual_agg_params {
- /* Maximum number of uSec in aggregation.
- * Driver should set this to 4000 (4 milliseconds). */
+ /*
+ *Maximum number of uSec in aggregation.
+ * default set to 4000 (4 milliseconds) if not configured in .cfg
+ */
__le16 agg_time_limit;
/*
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.h b/drivers/net/wireless/iwlwifi/iwl-core.h
index 51ebd03..17fae00 100644
--- a/drivers/net/wireless/iwlwifi/iwl-core.h
+++ b/drivers/net/wireless/iwlwifi/iwl-core.h
@@ -280,6 +280,7 @@ struct iwl_mod_params {
* @scan_antennas: available antenna for scan operation
* @need_dc_calib: need to perform init dc calibration
* @bt_statistics: use BT version of statistics notification
+ * @agg_time_limit: maximum number of uSec in aggregation
*
* We enable the driver to be backward compatible wrt API version. The
* driver specifies which APIs it supports (with @ucode_api_max being the
@@ -350,6 +351,7 @@ struct iwl_cfg {
u8 scan_tx_antennas[IEEE80211_NUM_BANDS];
const bool need_dc_calib;
const bool bt_statistics;
+ u16 agg_time_limit;
};
/***************************
--
1.7.0.4
^ permalink raw reply related
* [PATCH 02/16] iwlwifi: additional comments in iwl_cfg
From: Wey-Yi Guy @ 2010-08-18 16:22 UTC (permalink / raw)
To: linville; +Cc: linux-wireless, ipw3945-devel, Wey-Yi Guy
In-Reply-To: <1282148571-9258-1-git-send-email-wey-yi.w.guy@intel.com>
No functional changes, just add additional comments to iwl_cfg structure
Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
---
drivers/net/wireless/iwlwifi/iwl-core.h | 2 ++
1 files changed, 2 insertions(+), 0 deletions(-)
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.h b/drivers/net/wireless/iwlwifi/iwl-core.h
index b9611ad..51ebd03 100644
--- a/drivers/net/wireless/iwlwifi/iwl-core.h
+++ b/drivers/net/wireless/iwlwifi/iwl-core.h
@@ -278,6 +278,8 @@ struct iwl_mod_params {
* @chain_noise_calib_by_driver: driver has the capability to perform
* chain noise calibration operation
* @scan_antennas: available antenna for scan operation
+ * @need_dc_calib: need to perform init dc calibration
+ * @bt_statistics: use BT version of statistics notification
*
* We enable the driver to be backward compatible wrt API version. The
* driver specifies which APIs it supports (with @ucode_api_max being the
--
1.7.0.4
^ permalink raw reply related
* [PATCH 06/16] iwlwifi: avoid race condition in channel change
From: Wey-Yi Guy @ 2010-08-18 16:22 UTC (permalink / raw)
To: linville; +Cc: linux-wireless, ipw3945-devel, Shanyu Zhao, Wey-Yi Guy
In-Reply-To: <1282148571-9258-1-git-send-email-wey-yi.w.guy@intel.com>
From: Shanyu Zhao <shanyu.zhao@intel.com>
When iwl_mac_config() is called by mac80211, the channel pointer
hw->conf->channel can potentially change, resulting in mismatch
band and channel number when configuring RXON command. To avoid
this situation, save the channel pointer in local variables
and validate the channel before using it. Note that priv->mutex
is locked during the whole function so the local variables are safe.
Same change is applied to iwl_mac_channel_switch() since basically
it copies code from iwl_mac_config().
Also removed an outdated comment in the flow.
Signed-off-by: Shanyu Zhao <shanyu.zhao@intel.com>
Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
---
drivers/net/wireless/iwlwifi/iwl-agn.c | 14 ++++++--------
drivers/net/wireless/iwlwifi/iwl-core.c | 14 ++++++--------
2 files changed, 12 insertions(+), 16 deletions(-)
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c
index 00cbb83..8011105 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
@@ -3632,6 +3632,7 @@ static void iwl_mac_channel_switch(struct ieee80211_hw *hw,
struct iwl_priv *priv = hw->priv;
const struct iwl_channel_info *ch_info;
struct ieee80211_conf *conf = &hw->conf;
+ struct ieee80211_channel *channel = ch_switch->channel;
struct iwl_ht_config *ht_conf = &priv->current_ht_config;
u16 ch;
unsigned long flags = 0;
@@ -3655,10 +3656,10 @@ static void iwl_mac_channel_switch(struct ieee80211_hw *hw,
mutex_lock(&priv->mutex);
if (priv->cfg->ops->lib->set_channel_switch) {
- ch = ch_switch->channel->hw_value;
+ ch = channel->hw_value;
if (le16_to_cpu(priv->active_rxon.channel) != ch) {
ch_info = iwl_get_channel_info(priv,
- conf->channel->band,
+ channel->band,
ch);
if (!is_channel_valid(ch_info)) {
IWL_DEBUG_MAC80211(priv, "invalid channel\n");
@@ -3687,15 +3688,12 @@ static void iwl_mac_channel_switch(struct ieee80211_hw *hw,
} else
ht_conf->is_40mhz = false;
- /* if we are switching from ht to 2.4 clear flags
- * from any ht related info since 2.4 does not
- * support ht */
- if ((le16_to_cpu(priv->staging_rxon.channel) != ch))
+ if (le16_to_cpu(priv->staging_rxon.channel) != ch)
priv->staging_rxon.flags = 0;
- iwl_set_rxon_channel(priv, conf->channel);
+ iwl_set_rxon_channel(priv, channel);
iwl_set_rxon_ht(priv, ht_conf);
- iwl_set_flags_for_band(priv, conf->channel->band,
+ iwl_set_flags_for_band(priv, channel->band,
priv->vif);
spin_unlock_irqrestore(&priv->lock, flags);
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c
index 221a211..fc78690 100644
--- a/drivers/net/wireless/iwlwifi/iwl-core.c
+++ b/drivers/net/wireless/iwlwifi/iwl-core.c
@@ -1947,6 +1947,7 @@ int iwl_mac_config(struct ieee80211_hw *hw, u32 changed)
struct iwl_priv *priv = hw->priv;
const struct iwl_channel_info *ch_info;
struct ieee80211_conf *conf = &hw->conf;
+ struct ieee80211_channel *channel = conf->channel;
struct iwl_ht_config *ht_conf = &priv->current_ht_config;
unsigned long flags = 0;
int ret = 0;
@@ -1956,7 +1957,7 @@ int iwl_mac_config(struct ieee80211_hw *hw, u32 changed)
mutex_lock(&priv->mutex);
IWL_DEBUG_MAC80211(priv, "enter to channel %d changed 0x%X\n",
- conf->channel->hw_value, changed);
+ channel->hw_value, changed);
if (unlikely(!priv->cfg->mod_params->disable_hw_scan &&
test_bit(STATUS_SCANNING, &priv->status))) {
@@ -1987,8 +1988,8 @@ int iwl_mac_config(struct ieee80211_hw *hw, u32 changed)
if (scan_active)
goto set_ch_out;
- ch = conf->channel->hw_value;
- ch_info = iwl_get_channel_info(priv, conf->channel->band, ch);
+ ch = channel->hw_value;
+ ch_info = iwl_get_channel_info(priv, channel->band, ch);
if (!is_channel_valid(ch_info)) {
IWL_DEBUG_MAC80211(priv, "leave - invalid channel\n");
ret = -EINVAL;
@@ -2019,16 +2020,13 @@ int iwl_mac_config(struct ieee80211_hw *hw, u32 changed)
* from BSS config in iwl_ht_conf */
ht_conf->ht_protection = IEEE80211_HT_OP_MODE_PROTECTION_NONE;
- /* if we are switching from ht to 2.4 clear flags
- * from any ht related info since 2.4 does not
- * support ht */
if ((le16_to_cpu(priv->staging_rxon.channel) != ch))
priv->staging_rxon.flags = 0;
- iwl_set_rxon_channel(priv, conf->channel);
+ iwl_set_rxon_channel(priv, channel);
iwl_set_rxon_ht(priv, ht_conf);
- iwl_set_flags_for_band(priv, conf->channel->band, priv->vif);
+ iwl_set_flags_for_band(priv, channel->band, priv->vif);
spin_unlock_irqrestore(&priv->lock, flags);
if (priv->cfg->ops->lib->update_bcast_station)
--
1.7.0.4
^ permalink raw reply related
* [PATCH 05/16] iwlwifi: do not call ieee80211_frequency_to_channel
From: Wey-Yi Guy @ 2010-08-18 16:22 UTC (permalink / raw)
To: linville
Cc: linux-wireless, ipw3945-devel, Shanyu Zhao, Johannes Berg,
Wey-Yi Guy
In-Reply-To: <1282148571-9258-1-git-send-email-wey-yi.w.guy@intel.com>
From: Shanyu Zhao <shanyu.zhao@intel.com>
A few cases in iwlwifi driver function ieee80211_frequency_to_channel()
is called to get channel number from center frequency. This is not needed
since the channel number is already saved in hw_value field of struct
ieee80211_channel in function iwlcore_init_geos(). So replace those function
calls with hw_value field of struct ieee80211_channel.
Signed-off-by: Shanyu Zhao <shanyu.zhao@intel.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
---
drivers/net/wireless/iwlwifi/iwl-4965.c | 2 +-
drivers/net/wireless/iwlwifi/iwl-5000.c | 2 +-
drivers/net/wireless/iwlwifi/iwl-6000.c | 2 +-
drivers/net/wireless/iwlwifi/iwl-agn-lib.c | 2 +-
drivers/net/wireless/iwlwifi/iwl-agn.c | 3 +--
drivers/net/wireless/iwlwifi/iwl-core.c | 4 ++--
drivers/net/wireless/iwlwifi/iwl-debugfs.c | 6 ++----
7 files changed, 9 insertions(+), 12 deletions(-)
diff --git a/drivers/net/wireless/iwlwifi/iwl-4965.c b/drivers/net/wireless/iwlwifi/iwl-4965.c
index d92b729..f0a47f4 100644
--- a/drivers/net/wireless/iwlwifi/iwl-4965.c
+++ b/drivers/net/wireless/iwlwifi/iwl-4965.c
@@ -1470,7 +1470,7 @@ static int iwl4965_hw_channel_switch(struct iwl_priv *priv,
cmd.band = band;
cmd.expect_beacon = 0;
- ch = ieee80211_frequency_to_channel(ch_switch->channel->center_freq);
+ ch = ch_switch->channel->hw_value;
cmd.channel = cpu_to_le16(ch);
cmd.rxon_flags = priv->staging_rxon.flags;
cmd.rxon_filter_flags = priv->staging_rxon.filter_flags;
diff --git a/drivers/net/wireless/iwlwifi/iwl-5000.c b/drivers/net/wireless/iwlwifi/iwl-5000.c
index 173f556..efd9e6b 100644
--- a/drivers/net/wireless/iwlwifi/iwl-5000.c
+++ b/drivers/net/wireless/iwlwifi/iwl-5000.c
@@ -291,7 +291,7 @@ static int iwl5000_hw_channel_switch(struct iwl_priv *priv,
};
cmd.band = priv->band == IEEE80211_BAND_2GHZ;
- ch = ieee80211_frequency_to_channel(ch_switch->channel->center_freq);
+ ch = ch_switch->channel->hw_value;
IWL_DEBUG_11H(priv, "channel switch from %d to %d\n",
priv->active_rxon.channel, ch);
cmd.channel = cpu_to_le16(ch);
diff --git a/drivers/net/wireless/iwlwifi/iwl-6000.c b/drivers/net/wireless/iwlwifi/iwl-6000.c
index a7af5e3..9e390f6 100644
--- a/drivers/net/wireless/iwlwifi/iwl-6000.c
+++ b/drivers/net/wireless/iwlwifi/iwl-6000.c
@@ -214,7 +214,7 @@ static int iwl6000_hw_channel_switch(struct iwl_priv *priv,
};
cmd.band = priv->band == IEEE80211_BAND_2GHZ;
- ch = ieee80211_frequency_to_channel(ch_switch->channel->center_freq);
+ ch = ch_switch->channel->hw_value;
IWL_DEBUG_11H(priv, "channel switch from %u to %u\n",
priv->active_rxon.channel, ch);
cmd.channel = cpu_to_le16(ch);
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-lib.c b/drivers/net/wireless/iwlwifi/iwl-agn-lib.c
index 9dd9e64..eedd71f 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn-lib.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn-lib.c
@@ -1098,7 +1098,7 @@ static int iwl_get_channels_for_scan(struct iwl_priv *priv,
if (chan->band != band)
continue;
- channel = ieee80211_frequency_to_channel(chan->center_freq);
+ channel = chan->hw_value;
scan_ch->channel = cpu_to_le16(channel);
ch_info = iwl_get_channel_info(priv, band, channel);
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c
index c8dec4a..00cbb83 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
@@ -3655,8 +3655,7 @@ static void iwl_mac_channel_switch(struct ieee80211_hw *hw,
mutex_lock(&priv->mutex);
if (priv->cfg->ops->lib->set_channel_switch) {
- ch = ieee80211_frequency_to_channel(
- ch_switch->channel->center_freq);
+ ch = ch_switch->channel->hw_value;
if (le16_to_cpu(priv->active_rxon.channel) != ch) {
ch_info = iwl_get_channel_info(priv,
conf->channel->band,
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c
index 98cd710..221a211 100644
--- a/drivers/net/wireless/iwlwifi/iwl-core.c
+++ b/drivers/net/wireless/iwlwifi/iwl-core.c
@@ -916,7 +916,7 @@ EXPORT_SYMBOL(iwl_get_single_channel_number);
int iwl_set_rxon_channel(struct iwl_priv *priv, struct ieee80211_channel *ch)
{
enum ieee80211_band band = ch->band;
- u16 channel = ieee80211_frequency_to_channel(ch->center_freq);
+ u16 channel = ch->hw_value;
if (!iwl_get_channel_info(priv, band, channel)) {
IWL_DEBUG_INFO(priv, "Could not set channel to %d [%d]\n",
@@ -1987,7 +1987,7 @@ int iwl_mac_config(struct ieee80211_hw *hw, u32 changed)
if (scan_active)
goto set_ch_out;
- ch = ieee80211_frequency_to_channel(conf->channel->center_freq);
+ ch = conf->channel->hw_value;
ch_info = iwl_get_channel_info(priv, conf->channel->band, ch);
if (!is_channel_valid(ch_info)) {
IWL_DEBUG_MAC80211(priv, "leave - invalid channel\n");
diff --git a/drivers/net/wireless/iwlwifi/iwl-debugfs.c b/drivers/net/wireless/iwlwifi/iwl-debugfs.c
index e96a1bb..d3acdae 100644
--- a/drivers/net/wireless/iwlwifi/iwl-debugfs.c
+++ b/drivers/net/wireless/iwlwifi/iwl-debugfs.c
@@ -467,8 +467,7 @@ static ssize_t iwl_dbgfs_channels_read(struct file *file, char __user *user_buf,
for (i = 0; i < supp_band->n_channels; i++)
pos += scnprintf(buf + pos, bufsz - pos,
"%d: %ddBm: BSS%s%s, %s.\n",
- ieee80211_frequency_to_channel(
- channels[i].center_freq),
+ channels[i].hw_value,
channels[i].max_power,
channels[i].flags & IEEE80211_CHAN_RADAR ?
" (IEEE 802.11h required)" : "",
@@ -491,8 +490,7 @@ static ssize_t iwl_dbgfs_channels_read(struct file *file, char __user *user_buf,
for (i = 0; i < supp_band->n_channels; i++)
pos += scnprintf(buf + pos, bufsz - pos,
"%d: %ddBm: BSS%s%s, %s.\n",
- ieee80211_frequency_to_channel(
- channels[i].center_freq),
+ channels[i].hw_value,
channels[i].max_power,
channels[i].flags & IEEE80211_CHAN_RADAR ?
" (IEEE 802.11h required)" : "",
--
1.7.0.4
^ permalink raw reply related
* [PATCH 07/16] iwlwifi: cleanup iwl_set_rxon_channel()
From: Wey-Yi Guy @ 2010-08-18 16:22 UTC (permalink / raw)
To: linville; +Cc: linux-wireless, ipw3945-devel, Shanyu Zhao, Wey-Yi Guy
In-Reply-To: <1282148571-9258-1-git-send-email-wey-yi.w.guy@intel.com>
From: Shanyu Zhao <shanyu.zhao@intel.com>
Update outdated comments of iwl_set_rxon_channel() to reflect the
current signature. Also remove the unnecessary validation of the
channel. Those channel info are constructed in iwlwifi driver
and mac80211 will never modify the content of the struct. Also
everytime before this function is called the channel info has
been validated already (as a paranoid check).
Signed-off-by: Shanyu Zhao <shanyu.zhao@intel.com>
Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
---
drivers/net/wireless/iwlwifi/iwl-core.c | 15 ++++-----------
1 files changed, 4 insertions(+), 11 deletions(-)
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c
index fc78690..fe28272 100644
--- a/drivers/net/wireless/iwlwifi/iwl-core.c
+++ b/drivers/net/wireless/iwlwifi/iwl-core.c
@@ -904,26 +904,19 @@ u8 iwl_get_single_channel_number(struct iwl_priv *priv,
EXPORT_SYMBOL(iwl_get_single_channel_number);
/**
- * iwl_set_rxon_channel - Set the phymode and channel values in staging RXON
- * @phymode: MODE_IEEE80211A sets to 5.2GHz; all else set to 2.4GHz
- * @channel: Any channel valid for the requested phymode
+ * iwl_set_rxon_channel - Set the band and channel values in staging RXON
+ * @ch: requested channel as a pointer to struct ieee80211_channel
- * In addition to setting the staging RXON, priv->phymode is also set.
+ * In addition to setting the staging RXON, priv->band is also set.
*
* NOTE: Does not commit to the hardware; it sets appropriate bit fields
- * in the staging RXON flag structure based on the phymode
+ * in the staging RXON flag structure based on the ch->band
*/
int iwl_set_rxon_channel(struct iwl_priv *priv, struct ieee80211_channel *ch)
{
enum ieee80211_band band = ch->band;
u16 channel = ch->hw_value;
- if (!iwl_get_channel_info(priv, band, channel)) {
- IWL_DEBUG_INFO(priv, "Could not set channel to %d [%d]\n",
- channel, band);
- return -EINVAL;
- }
-
if ((le16_to_cpu(priv->staging_rxon.channel) == channel) &&
(priv->band == band))
return 0;
--
1.7.0.4
^ permalink raw reply related
* [PATCH 08/16] iwlwifi: refactor iwl_setup_rxon_timing
From: Wey-Yi Guy @ 2010-08-18 16:22 UTC (permalink / raw)
To: linville; +Cc: linux-wireless, ipw3945-devel, Johannes Berg, Wey-Yi Guy
In-Reply-To: <1282148571-9258-1-git-send-email-wey-yi.w.guy@intel.com>
From: Johannes Berg <johannes.berg@intel.com>
All callers of iwl_setup_rxon_timing() also send
the command right away, so rename the function
to iwl_send_rxon_timing() and move the sending
into it. Also, some callers clear the data, this
can be done always and thus moved in as well.
Finally, there's no reason for the function to
acquire the spinlock, but it should be called
with the mutex held, so assert that.
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
---
drivers/net/wireless/iwlwifi/iwl-agn.c | 8 ++------
drivers/net/wireless/iwlwifi/iwl-core.c | 14 +++++++++-----
drivers/net/wireless/iwlwifi/iwl-core.h | 2 +-
drivers/net/wireless/iwlwifi/iwl3945-base.c | 11 ++---------
4 files changed, 14 insertions(+), 21 deletions(-)
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c
index 8011105..a88fabc 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
@@ -3109,9 +3109,7 @@ void iwl_post_associate(struct iwl_priv *priv, struct ieee80211_vif *vif)
priv->staging_rxon.filter_flags &= ~RXON_FILTER_ASSOC_MSK;
iwlcore_commit_rxon(priv);
- iwl_setup_rxon_timing(priv, vif);
- ret = iwl_send_cmd_pdu(priv, REPLY_RXON_TIMING,
- sizeof(priv->rxon_timing), &priv->rxon_timing);
+ ret = iwl_send_rxon_timing(priv, vif);
if (ret)
IWL_WARN(priv, "REPLY_RXON_TIMING failed - "
"Attempting to continue.\n");
@@ -3347,9 +3345,7 @@ void iwl_config_ap(struct iwl_priv *priv, struct ieee80211_vif *vif)
iwlcore_commit_rxon(priv);
/* RXON Timing */
- iwl_setup_rxon_timing(priv, vif);
- ret = iwl_send_cmd_pdu(priv, REPLY_RXON_TIMING,
- sizeof(priv->rxon_timing), &priv->rxon_timing);
+ ret = iwl_send_rxon_timing(priv, vif);
if (ret)
IWL_WARN(priv, "REPLY_RXON_TIMING failed - "
"Attempting to continue.\n");
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c
index fe28272..c31177c 100644
--- a/drivers/net/wireless/iwlwifi/iwl-core.c
+++ b/drivers/net/wireless/iwlwifi/iwl-core.c
@@ -491,17 +491,19 @@ static u16 iwl_adjust_beacon_interval(u16 beacon_val, u16 max_beacon_val)
return new_val;
}
-void iwl_setup_rxon_timing(struct iwl_priv *priv, struct ieee80211_vif *vif)
+int iwl_send_rxon_timing(struct iwl_priv *priv, struct ieee80211_vif *vif)
{
u64 tsf;
s32 interval_tm, rem;
- unsigned long flags;
struct ieee80211_conf *conf = NULL;
u16 beacon_int;
conf = ieee80211_get_hw_conf(priv->hw);
- spin_lock_irqsave(&priv->lock, flags);
+ lockdep_assert_held(&priv->mutex);
+
+ memset(&priv->rxon_timing, 0, sizeof(struct iwl_rxon_time_cmd));
+
priv->rxon_timing.timestamp = cpu_to_le64(priv->timestamp);
priv->rxon_timing.listen_interval = cpu_to_le16(conf->listen_interval);
@@ -524,14 +526,16 @@ void iwl_setup_rxon_timing(struct iwl_priv *priv, struct ieee80211_vif *vif)
rem = do_div(tsf, interval_tm);
priv->rxon_timing.beacon_init_val = cpu_to_le32(interval_tm - rem);
- spin_unlock_irqrestore(&priv->lock, flags);
IWL_DEBUG_ASSOC(priv,
"beacon interval %d beacon timer %d beacon tim %d\n",
le16_to_cpu(priv->rxon_timing.beacon_interval),
le32_to_cpu(priv->rxon_timing.beacon_init_val),
le16_to_cpu(priv->rxon_timing.atim_window));
+
+ return iwl_send_cmd_pdu(priv, REPLY_RXON_TIMING,
+ sizeof(priv->rxon_timing), &priv->rxon_timing);
}
-EXPORT_SYMBOL(iwl_setup_rxon_timing);
+EXPORT_SYMBOL(iwl_send_rxon_timing);
void iwl_set_rxon_hwcrypto(struct iwl_priv *priv, int hw_decrypt)
{
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.h b/drivers/net/wireless/iwlwifi/iwl-core.h
index 17fae00..4f4280e 100644
--- a/drivers/net/wireless/iwlwifi/iwl-core.h
+++ b/drivers/net/wireless/iwlwifi/iwl-core.h
@@ -711,7 +711,7 @@ extern int iwl_send_lq_cmd(struct iwl_priv *priv,
void iwl_apm_stop(struct iwl_priv *priv);
int iwl_apm_init(struct iwl_priv *priv);
-void iwl_setup_rxon_timing(struct iwl_priv *priv, struct ieee80211_vif *vif);
+int iwl_send_rxon_timing(struct iwl_priv *priv, struct ieee80211_vif *vif);
static inline int iwl_send_rxon_assoc(struct iwl_priv *priv)
{
return priv->cfg->ops->hcmd->rxon_assoc(priv);
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c
index bef5b17..94d7e6e 100644
--- a/drivers/net/wireless/iwlwifi/iwl3945-base.c
+++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c
@@ -3094,10 +3094,7 @@ void iwl3945_post_associate(struct iwl_priv *priv, struct ieee80211_vif *vif)
priv->staging_rxon.filter_flags &= ~RXON_FILTER_ASSOC_MSK;
iwlcore_commit_rxon(priv);
- memset(&priv->rxon_timing, 0, sizeof(struct iwl_rxon_time_cmd));
- iwl_setup_rxon_timing(priv, vif);
- rc = iwl_send_cmd_pdu(priv, REPLY_RXON_TIMING,
- sizeof(priv->rxon_timing), &priv->rxon_timing);
+ rc = iwl_send_rxon_timing(priv, vif);
if (rc)
IWL_WARN(priv, "REPLY_RXON_TIMING failed - "
"Attempting to continue.\n");
@@ -3271,11 +3268,7 @@ void iwl3945_config_ap(struct iwl_priv *priv, struct ieee80211_vif *vif)
iwlcore_commit_rxon(priv);
/* RXON Timing */
- memset(&priv->rxon_timing, 0, sizeof(struct iwl_rxon_time_cmd));
- iwl_setup_rxon_timing(priv, vif);
- rc = iwl_send_cmd_pdu(priv, REPLY_RXON_TIMING,
- sizeof(priv->rxon_timing),
- &priv->rxon_timing);
+ rc = iwl_send_rxon_timing(priv, vif);
if (rc)
IWL_WARN(priv, "REPLY_RXON_TIMING failed - "
"Attempting to continue.\n");
--
1.7.0.4
^ permalink raw reply related
* [PATCH 09/16] iwlagn: adjust starting action for rate scale
From: Wey-Yi Guy @ 2010-08-18 16:22 UTC (permalink / raw)
To: linville; +Cc: linux-wireless, ipw3945-devel, Wey-Yi Guy
In-Reply-To: <1282148571-9258-1-git-send-email-wey-yi.w.guy@intel.com>
During rate scale, reset starting action after making action adjustment
to avoid the possibility of break out of loop too early.
Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
---
drivers/net/wireless/iwlwifi/iwl-agn-rs.c | 12 ++++++++----
1 files changed, 8 insertions(+), 4 deletions(-)
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c
index 7c4deee..4d5738d 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c
@@ -1265,7 +1265,7 @@ static int rs_move_legacy_other(struct iwl_priv *priv,
struct iwl_rate_scale_data *window = &(tbl->win[index]);
u32 sz = (sizeof(struct iwl_scale_tbl_info) -
(sizeof(struct iwl_rate_scale_data) * IWL_RATE_COUNT));
- u8 start_action = tbl->action;
+ u8 start_action;
u8 valid_tx_ant = priv->hw_params.valid_tx_ant;
u8 tx_chains_num = priv->hw_params.tx_chains_num;
int ret = 0;
@@ -1277,6 +1277,7 @@ static int rs_move_legacy_other(struct iwl_priv *priv,
else if (iwl_tx_ant_restriction(priv) == IWL_ANT_OK_SINGLE &&
tbl->action > IWL_LEGACY_SWITCH_SISO)
tbl->action = IWL_LEGACY_SWITCH_SISO;
+ start_action = tbl->action;
for (; ;) {
lq_sta->action_counter++;
switch (tbl->action) {
@@ -1403,7 +1404,7 @@ static int rs_move_siso_to_other(struct iwl_priv *priv,
struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
u32 sz = (sizeof(struct iwl_scale_tbl_info) -
(sizeof(struct iwl_rate_scale_data) * IWL_RATE_COUNT));
- u8 start_action = tbl->action;
+ u8 start_action;
u8 valid_tx_ant = priv->hw_params.valid_tx_ant;
u8 tx_chains_num = priv->hw_params.tx_chains_num;
u8 update_search_tbl_counter = 0;
@@ -1414,6 +1415,7 @@ static int rs_move_siso_to_other(struct iwl_priv *priv,
/* stay in SISO */
tbl->action = IWL_SISO_SWITCH_ANTENNA1;
}
+ start_action = tbl->action;
for (;;) {
lq_sta->action_counter++;
switch (tbl->action) {
@@ -1541,7 +1543,7 @@ static int rs_move_mimo2_to_other(struct iwl_priv *priv,
struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
u32 sz = (sizeof(struct iwl_scale_tbl_info) -
(sizeof(struct iwl_rate_scale_data) * IWL_RATE_COUNT));
- u8 start_action = tbl->action;
+ u8 start_action;
u8 valid_tx_ant = priv->hw_params.valid_tx_ant;
u8 tx_chains_num = priv->hw_params.tx_chains_num;
u8 update_search_tbl_counter = 0;
@@ -1553,6 +1555,7 @@ static int rs_move_mimo2_to_other(struct iwl_priv *priv,
/* switch in SISO */
tbl->action = IWL_MIMO2_SWITCH_SISO_A;
}
+ start_action = tbl->action;
for (;;) {
lq_sta->action_counter++;
switch (tbl->action) {
@@ -1682,7 +1685,7 @@ static int rs_move_mimo3_to_other(struct iwl_priv *priv,
struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
u32 sz = (sizeof(struct iwl_scale_tbl_info) -
(sizeof(struct iwl_rate_scale_data) * IWL_RATE_COUNT));
- u8 start_action = tbl->action;
+ u8 start_action;
u8 valid_tx_ant = priv->hw_params.valid_tx_ant;
u8 tx_chains_num = priv->hw_params.tx_chains_num;
int ret;
@@ -1694,6 +1697,7 @@ static int rs_move_mimo3_to_other(struct iwl_priv *priv,
/* switch in SISO */
tbl->action = IWL_MIMO3_SWITCH_SISO_A;
}
+ start_action = tbl->action;
for (;;) {
lq_sta->action_counter++;
switch (tbl->action) {
--
1.7.0.4
^ permalink raw reply related
* [PATCH 10/16] iwlagn: continue perform rate scale when error detected
From: Wey-Yi Guy @ 2010-08-18 16:22 UTC (permalink / raw)
To: linville; +Cc: linux-wireless, ipw3945-devel, Wey-Yi Guy
In-Reply-To: <1282148571-9258-1-git-send-email-wey-yi.w.guy@intel.com>
If for some reason, the actual link command not matching neither
active nor search table; instead of return and not performing rate
scale, by-pass the data collection and continue the rate scale process.
Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
---
drivers/net/wireless/iwlwifi/iwl-agn-rs.c | 20 +++++++++++++++++---
1 files changed, 17 insertions(+), 3 deletions(-)
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c
index 4d5738d..a456338 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c
@@ -82,6 +82,7 @@ static void rs_rate_scale_perform(struct iwl_priv *priv,
struct iwl_lq_sta *lq_sta);
static void rs_fill_link_cmd(struct iwl_priv *priv,
struct iwl_lq_sta *lq_sta, u32 rate_n_flags);
+static void rs_stay_in_table(struct iwl_lq_sta *lq_sta);
#ifdef CONFIG_MAC80211_DEBUGFS
@@ -502,6 +503,7 @@ static int rs_get_tbl_info_from_mcs(const u32 rate_n_flags,
u8 num_of_ant = get_num_of_ant_from_rate(rate_n_flags);
u8 mcs;
+ memset(tbl, 0, sizeof(struct iwl_scale_tbl_info));
*rate_idx = iwl_hwrate_to_plcp_idx(rate_n_flags);
if (*rate_idx == IWL_RATE_INVALID) {
@@ -848,7 +850,20 @@ static void rs_tx_status(void *priv_r, struct ieee80211_supported_band *sband,
other_tbl = &(lq_sta->lq_info[lq_sta->active_tbl]);
} else {
IWL_DEBUG_RATE(priv, "Neither active nor search matches tx rate\n");
- return;
+ tmp_tbl = &(lq_sta->lq_info[lq_sta->active_tbl]);
+ IWL_DEBUG_RATE(priv, "active- lq:%x, ant:%x, SGI:%d\n",
+ tmp_tbl->lq_type, tmp_tbl->ant_type, tmp_tbl->is_SGI);
+ tmp_tbl = &(lq_sta->lq_info[1 - lq_sta->active_tbl]);
+ IWL_DEBUG_RATE(priv, "search- lq:%x, ant:%x, SGI:%d\n",
+ tmp_tbl->lq_type, tmp_tbl->ant_type, tmp_tbl->is_SGI);
+ IWL_DEBUG_RATE(priv, "actual- lq:%x, ant:%x, SGI:%d\n",
+ tbl_type.lq_type, tbl_type.ant_type, tbl_type.is_SGI);
+ /*
+ * no matching table found, let's by-pass the data collection
+ * and continue to perform rate scale to find the rate table
+ */
+ rs_stay_in_table(lq_sta);
+ goto done;
}
/*
@@ -909,7 +924,7 @@ static void rs_tx_status(void *priv_r, struct ieee80211_supported_band *sband,
}
/* The last TX rate is cached in lq_sta; it's set in if/else above */
lq_sta->last_rate_n_flags = tx_rate;
-
+done:
/* See if there's a better rate or modulation mode to try. */
if (sta && sta->supp_rates[sband->band])
rs_rate_scale_perform(priv, skb, sta, lq_sta);
@@ -2598,7 +2613,6 @@ static void rs_fill_link_cmd(struct iwl_priv *priv,
rs_dbgfs_set_mcs(lq_sta, &new_rate, index);
/* Interpret new_rate (rate_n_flags) */
- memset(&tbl_type, 0, sizeof(tbl_type));
rs_get_tbl_info_from_mcs(new_rate, lq_sta->band,
&tbl_type, &rate_idx);
--
1.7.0.4
^ permalink raw reply related
* [PATCH 12/16] iwlwifi: more generic name for rssi calc in iwlagn
From: Wey-Yi Guy @ 2010-08-18 16:22 UTC (permalink / raw)
To: linville; +Cc: linux-wireless, ipw3945-devel, Wey-Yi Guy
In-Reply-To: <1282148571-9258-1-git-send-email-wey-yi.w.guy@intel.com>
Change the define to more generic naming to match _agn devices
since the rssi calculation are common function for 5000 series and up
Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
---
drivers/net/wireless/iwlwifi/iwl-agn-hcmd.c | 21 +++++++++-------
drivers/net/wireless/iwlwifi/iwl-commands.h | 33 ++++++++++++++------------
2 files changed, 30 insertions(+), 24 deletions(-)
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-hcmd.c b/drivers/net/wireless/iwlwifi/iwl-agn-hcmd.c
index 75b901b..8493976 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn-hcmd.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn-hcmd.c
@@ -235,13 +235,13 @@ static int iwlagn_calc_rssi(struct iwl_priv *priv,
/* data from PHY/DSP regarding signal strength, etc.,
* contents are always there, not configurable by host
*/
- struct iwl5000_non_cfg_phy *ncphy =
- (struct iwl5000_non_cfg_phy *)rx_resp->non_cfg_phy_buf;
+ struct iwlagn_non_cfg_phy *ncphy =
+ (struct iwlagn_non_cfg_phy *)rx_resp->non_cfg_phy_buf;
u32 val, rssi_a, rssi_b, rssi_c, max_rssi;
u8 agc;
- val = le32_to_cpu(ncphy->non_cfg_phy[IWL50_RX_RES_AGC_IDX]);
- agc = (val & IWL50_OFDM_AGC_MSK) >> IWL50_OFDM_AGC_BIT_POS;
+ val = le32_to_cpu(ncphy->non_cfg_phy[IWLAGN_RX_RES_AGC_IDX]);
+ agc = (val & IWLAGN_OFDM_AGC_MSK) >> IWLAGN_OFDM_AGC_BIT_POS;
/* Find max rssi among 3 possible receivers.
* These values are measured by the digital signal processor (DSP).
@@ -249,11 +249,14 @@ static int iwlagn_calc_rssi(struct iwl_priv *priv,
* if the radio's automatic gain control (AGC) is working right.
* AGC value (see below) will provide the "interesting" info.
*/
- val = le32_to_cpu(ncphy->non_cfg_phy[IWL50_RX_RES_RSSI_AB_IDX]);
- rssi_a = (val & IWL50_OFDM_RSSI_A_MSK) >> IWL50_OFDM_RSSI_A_BIT_POS;
- rssi_b = (val & IWL50_OFDM_RSSI_B_MSK) >> IWL50_OFDM_RSSI_B_BIT_POS;
- val = le32_to_cpu(ncphy->non_cfg_phy[IWL50_RX_RES_RSSI_C_IDX]);
- rssi_c = (val & IWL50_OFDM_RSSI_C_MSK) >> IWL50_OFDM_RSSI_C_BIT_POS;
+ val = le32_to_cpu(ncphy->non_cfg_phy[IWLAGN_RX_RES_RSSI_AB_IDX]);
+ rssi_a = (val & IWLAGN_OFDM_RSSI_INBAND_A_BITMSK) >>
+ IWLAGN_OFDM_RSSI_A_BIT_POS;
+ rssi_b = (val & IWLAGN_OFDM_RSSI_INBAND_B_BITMSK) >>
+ IWLAGN_OFDM_RSSI_B_BIT_POS;
+ val = le32_to_cpu(ncphy->non_cfg_phy[IWLAGN_RX_RES_RSSI_C_IDX]);
+ rssi_c = (val & IWLAGN_OFDM_RSSI_INBAND_C_BITMSK) >>
+ IWLAGN_OFDM_RSSI_C_BIT_POS;
max_rssi = max_t(u32, rssi_a, rssi_b);
max_rssi = max_t(u32, max_rssi, rssi_c);
diff --git a/drivers/net/wireless/iwlwifi/iwl-commands.h b/drivers/net/wireless/iwlwifi/iwl-commands.h
index 13893a0..4083e44 100644
--- a/drivers/net/wireless/iwlwifi/iwl-commands.h
+++ b/drivers/net/wireless/iwlwifi/iwl-commands.h
@@ -1367,21 +1367,24 @@ struct iwl4965_rx_non_cfg_phy {
} __packed;
-#define IWL50_RX_RES_PHY_CNT 8
-#define IWL50_RX_RES_AGC_IDX 1
-#define IWL50_RX_RES_RSSI_AB_IDX 2
-#define IWL50_RX_RES_RSSI_C_IDX 3
-#define IWL50_OFDM_AGC_MSK 0xfe00
-#define IWL50_OFDM_AGC_BIT_POS 9
-#define IWL50_OFDM_RSSI_A_MSK 0x00ff
-#define IWL50_OFDM_RSSI_A_BIT_POS 0
-#define IWL50_OFDM_RSSI_B_MSK 0xff0000
-#define IWL50_OFDM_RSSI_B_BIT_POS 16
-#define IWL50_OFDM_RSSI_C_MSK 0x00ff
-#define IWL50_OFDM_RSSI_C_BIT_POS 0
-
-struct iwl5000_non_cfg_phy {
- __le32 non_cfg_phy[IWL50_RX_RES_PHY_CNT]; /* up to 8 phy entries */
+#define IWLAGN_RX_RES_PHY_CNT 8
+#define IWLAGN_RX_RES_AGC_IDX 1
+#define IWLAGN_RX_RES_RSSI_AB_IDX 2
+#define IWLAGN_RX_RES_RSSI_C_IDX 3
+#define IWLAGN_OFDM_AGC_MSK 0xfe00
+#define IWLAGN_OFDM_AGC_BIT_POS 9
+#define IWLAGN_OFDM_RSSI_INBAND_A_BITMSK 0x00ff
+#define IWLAGN_OFDM_RSSI_ALLBAND_A_BITMSK 0xff00
+#define IWLAGN_OFDM_RSSI_A_BIT_POS 0
+#define IWLAGN_OFDM_RSSI_INBAND_B_BITMSK 0xff0000
+#define IWLAGN_OFDM_RSSI_ALLBAND_B_BITMSK 0xff000000
+#define IWLAGN_OFDM_RSSI_B_BIT_POS 16
+#define IWLAGN_OFDM_RSSI_INBAND_C_BITMSK 0x00ff
+#define IWLAGN_OFDM_RSSI_ALLBAND_C_BITMSK 0xff00
+#define IWLAGN_OFDM_RSSI_C_BIT_POS 0
+
+struct iwlagn_non_cfg_phy {
+ __le32 non_cfg_phy[IWLAGN_RX_RES_PHY_CNT]; /* up to 8 phy entries */
} __packed;
--
1.7.0.4
^ permalink raw reply related
* [PATCH 11/16] iwlwifi: additional parameter in REPLY_RX_PHY_CMD
From: Wey-Yi Guy @ 2010-08-18 16:22 UTC (permalink / raw)
To: linville; +Cc: linux-wireless, ipw3945-devel, Wey-Yi Guy
In-Reply-To: <1282148571-9258-1-git-send-email-wey-yi.w.guy@intel.com>
Adding additional parameter in REPLY_RX_PHY_CMD, frame_time indicate the
frame's time on the air based on byte count and frame rate calculation
Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
---
drivers/net/wireless/iwlwifi/iwl-commands.h | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/drivers/net/wireless/iwlwifi/iwl-commands.h b/drivers/net/wireless/iwlwifi/iwl-commands.h
index 14a7a8c..13893a0 100644
--- a/drivers/net/wireless/iwlwifi/iwl-commands.h
+++ b/drivers/net/wireless/iwlwifi/iwl-commands.h
@@ -1401,7 +1401,7 @@ struct iwl_rx_phy_res {
u8 non_cfg_phy_buf[32]; /* for various implementations of non_cfg_phy */
__le32 rate_n_flags; /* RATE_MCS_* */
__le16 byte_count; /* frame's byte-count */
- __le16 reserved3;
+ __le16 frame_time; /* frame's time on the air */
} __packed;
struct iwl_rx_mpdu_res_start {
--
1.7.0.4
^ permalink raw reply related
* [PATCH 15/16] iwlwifi: enable experimental ucode support
From: Wey-Yi Guy @ 2010-08-18 16:22 UTC (permalink / raw)
To: linville; +Cc: linux-wireless, ipw3945-devel, Jay Sternberg, Wey-Yi Guy
In-Reply-To: <1282148571-9258-1-git-send-email-wey-yi.w.guy@intel.com>
From: Jay Sternberg <jay.e.sternberg@intel.com>
ucode firmware may need to be released as experimental for testing or
debugging. released ucode filenames have the API version as the last
component. experimental ucode files will have that component be "exp"
and the fw_version string reported by ethtool will also contain the
string EXP to clearly identify this ucode from released ucode.
EXP is short for EXPERIMENTAL since fw_version has a max lenght on 32.
this capability is controlled by Kconfig and defaulted to not be used.
Signed-off-by: Jay Sternberg <jay.e.sternberg@intel.com>
Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
---
drivers/net/wireless/iwlwifi/Kconfig | 6 +++++
drivers/net/wireless/iwlwifi/iwl-agn.c | 33 ++++++++++++++++++++++++-------
2 files changed, 31 insertions(+), 8 deletions(-)
diff --git a/drivers/net/wireless/iwlwifi/Kconfig b/drivers/net/wireless/iwlwifi/Kconfig
index a51e4da..7ab5b51 100644
--- a/drivers/net/wireless/iwlwifi/Kconfig
+++ b/drivers/net/wireless/iwlwifi/Kconfig
@@ -36,6 +36,12 @@ config IWLWIFI_DEBUGFS
is a low-impact option that allows getting insight into the
driver's state at runtime.
+config IWLWIFI_DEBUG_EXPERIMENTAL_UCODE
+ bool "Experimental uCode support"
+ depends on IWLWIFI && IWLWIFI_DEBUG
+ ---help---
+ Enable use of experimental ucode for testing and debugging.
+
config IWLWIFI_DEVICE_TRACING
bool "iwlwifi device access tracing"
depends on IWLWIFI
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c
index a88fabc..ca2cd9f 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
@@ -1659,24 +1659,37 @@ static void iwl_ucode_callback(const struct firmware *ucode_raw, void *context);
static int iwl_mac_setup_register(struct iwl_priv *priv,
struct iwlagn_ucode_capabilities *capa);
+#define UCODE_EXPERIMENTAL_INDEX 100
+#define UCODE_EXPERIMENTAL_TAG "exp"
+
static int __must_check iwl_request_firmware(struct iwl_priv *priv, bool first)
{
const char *name_pre = priv->cfg->fw_name_pre;
+ char tag[8];
- if (first)
+ if (first) {
+#ifdef CONFIG_IWLWIFI_DEBUG_EXPERIMENTAL_UCODE
+ priv->fw_index = UCODE_EXPERIMENTAL_INDEX;
+ strcpy(tag, UCODE_EXPERIMENTAL_TAG);
+ } else if (priv->fw_index == UCODE_EXPERIMENTAL_INDEX) {
+#endif
priv->fw_index = priv->cfg->ucode_api_max;
- else
+ sprintf(tag, "%d", priv->fw_index);
+ } else {
priv->fw_index--;
+ sprintf(tag, "%d", priv->fw_index);
+ }
if (priv->fw_index < priv->cfg->ucode_api_min) {
IWL_ERR(priv, "no suitable firmware found!\n");
return -ENOENT;
}
- sprintf(priv->firmware_name, "%s%d%s",
- name_pre, priv->fw_index, ".ucode");
+ sprintf(priv->firmware_name, "%s%s%s", name_pre, tag, ".ucode");
- IWL_DEBUG_INFO(priv, "attempting to load firmware '%s'\n",
+ IWL_DEBUG_INFO(priv, "attempting to load firmware %s'%s'\n",
+ (priv->fw_index == UCODE_EXPERIMENTAL_INDEX)
+ ? "EXPERIMENTAL " : "",
priv->firmware_name);
return request_firmware_nowait(THIS_MODULE, 1, priv->firmware_name,
@@ -1971,8 +1984,10 @@ static void iwl_ucode_callback(const struct firmware *ucode_raw, void *context)
memset(&pieces, 0, sizeof(pieces));
if (!ucode_raw) {
- IWL_ERR(priv, "request for firmware file '%s' failed.\n",
- priv->firmware_name);
+ if (priv->fw_index <= priv->cfg->ucode_api_max)
+ IWL_ERR(priv,
+ "request for firmware file '%s' failed.\n",
+ priv->firmware_name);
goto try_again;
}
@@ -2019,7 +2034,9 @@ static void iwl_ucode_callback(const struct firmware *ucode_raw, void *context)
api_max, api_ver);
if (build)
- sprintf(buildstr, " build %u", build);
+ sprintf(buildstr, " build %u%s", build,
+ (priv->fw_index == UCODE_EXPERIMENTAL_INDEX)
+ ? " (EXP)" : "");
else
buildstr[0] = '\0';
--
1.7.0.4
^ permalink raw reply related
* [PATCH 16/16] iwlwifi: move debug options into submenu
From: Wey-Yi Guy @ 2010-08-18 16:22 UTC (permalink / raw)
To: linville; +Cc: linux-wireless, ipw3945-devel, Jay Sternberg, Wey-Yi Guy
In-Reply-To: <1282148571-9258-1-git-send-email-wey-yi.w.guy@intel.com>
From: Jay Sternberg <jay.e.sternberg@intel.com>
more debug options being added so it is useful to move them
into a submenu for ease of readability when using config commands
like make menuconfig and make xconfig
Signed-off-by: Jay Sternberg <jay.e.sternberg@intel.com>
Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
---
drivers/net/wireless/iwlwifi/Kconfig | 4 ++++
1 files changed, 4 insertions(+), 0 deletions(-)
diff --git a/drivers/net/wireless/iwlwifi/Kconfig b/drivers/net/wireless/iwlwifi/Kconfig
index 7ab5b51..b823642 100644
--- a/drivers/net/wireless/iwlwifi/Kconfig
+++ b/drivers/net/wireless/iwlwifi/Kconfig
@@ -3,6 +3,9 @@ config IWLWIFI
depends on PCI && MAC80211
select FW_LOADER
+menu "Debugging Options"
+ depends on IWLWIFI
+
config IWLWIFI_DEBUG
bool "Enable full debugging output in iwlagn and iwl3945 drivers"
depends on IWLWIFI
@@ -59,6 +62,7 @@ config IWLWIFI_DEVICE_TRACING
If unsure, say Y so we can help you better when problems
occur.
+endmenu
config IWLAGN
tristate "Intel Wireless WiFi Next Gen AGN (iwlagn)"
--
1.7.0.4
^ permalink raw reply related
* [PATCH 13/16] iwlwifi: configurable ampdu factor and density
From: Wey-Yi Guy @ 2010-08-18 16:22 UTC (permalink / raw)
To: linville; +Cc: linux-wireless, ipw3945-devel, Wey-Yi Guy
In-Reply-To: <1282148571-9258-1-git-send-email-wey-yi.w.guy@intel.com>
Add ampdu factor and density to .cfg, this allow both parameters
can be configure per device based.
Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
---
drivers/net/wireless/iwlwifi/iwl-core.c | 4 ++++
drivers/net/wireless/iwlwifi/iwl-core.h | 4 ++++
drivers/net/wireless/iwlwifi/iwl-dev.h | 13 ++++++++++++-
3 files changed, 20 insertions(+), 1 deletions(-)
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c
index c31177c..e6497c6 100644
--- a/drivers/net/wireless/iwlwifi/iwl-core.c
+++ b/drivers/net/wireless/iwlwifi/iwl-core.c
@@ -239,7 +239,11 @@ static void iwlcore_init_ht_hw_capab(const struct iwl_priv *priv,
ht_info->cap |= IEEE80211_HT_CAP_MAX_AMSDU;
ht_info->ampdu_factor = CFG_HT_RX_AMPDU_FACTOR_DEF;
+ if (priv->cfg->ampdu_factor)
+ ht_info->ampdu_factor = priv->cfg->ampdu_factor;
ht_info->ampdu_density = CFG_HT_MPDU_DENSITY_DEF;
+ if (priv->cfg->ampdu_density)
+ ht_info->ampdu_density = priv->cfg->ampdu_density;
ht_info->mcs.rx_mask[0] = 0xFF;
if (rx_chains_num >= 2)
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.h b/drivers/net/wireless/iwlwifi/iwl-core.h
index 4f4280e..6bd6013 100644
--- a/drivers/net/wireless/iwlwifi/iwl-core.h
+++ b/drivers/net/wireless/iwlwifi/iwl-core.h
@@ -281,6 +281,8 @@ struct iwl_mod_params {
* @need_dc_calib: need to perform init dc calibration
* @bt_statistics: use BT version of statistics notification
* @agg_time_limit: maximum number of uSec in aggregation
+ * @ampdu_factor: Maximum A-MPDU length factor
+ * @ampdu_density: Minimum A-MPDU spacing
*
* We enable the driver to be backward compatible wrt API version. The
* driver specifies which APIs it supports (with @ucode_api_max being the
@@ -352,6 +354,8 @@ struct iwl_cfg {
const bool need_dc_calib;
const bool bt_statistics;
u16 agg_time_limit;
+ u8 ampdu_factor;
+ u8 ampdu_density;
};
/***************************
diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h
index 37ec76a..1ad3303 100644
--- a/drivers/net/wireless/iwlwifi/iwl-dev.h
+++ b/drivers/net/wireless/iwlwifi/iwl-dev.h
@@ -435,7 +435,13 @@ union iwl_ht_rate_supp {
};
};
-#define CFG_HT_RX_AMPDU_FACTOR_DEF (0x3)
+#define CFG_HT_RX_AMPDU_FACTOR_8K (0x0)
+#define CFG_HT_RX_AMPDU_FACTOR_16K (0x1)
+#define CFG_HT_RX_AMPDU_FACTOR_32K (0x2)
+#define CFG_HT_RX_AMPDU_FACTOR_64K (0x3)
+#define CFG_HT_RX_AMPDU_FACTOR_DEF CFG_HT_RX_AMPDU_FACTOR_64K
+#define CFG_HT_RX_AMPDU_FACTOR_MAX CFG_HT_RX_AMPDU_FACTOR_64K
+#define CFG_HT_RX_AMPDU_FACTOR_MIN CFG_HT_RX_AMPDU_FACTOR_8K
/*
* Maximal MPDU density for TX aggregation
@@ -444,8 +450,13 @@ union iwl_ht_rate_supp {
* 6 - 8us density
* 7 - 16us density
*/
+#define CFG_HT_MPDU_DENSITY_2USEC (0x4)
#define CFG_HT_MPDU_DENSITY_4USEC (0x5)
+#define CFG_HT_MPDU_DENSITY_8USEC (0x6)
+#define CFG_HT_MPDU_DENSITY_16USEC (0x7)
#define CFG_HT_MPDU_DENSITY_DEF CFG_HT_MPDU_DENSITY_4USEC
+#define CFG_HT_MPDU_DENSITY_MAX CFG_HT_MPDU_DENSITY_16USEC
+#define CFG_HT_MPDU_DENSITY_MIN (0x1)
struct iwl_ht_config {
/* self configuration data */
--
1.7.0.4
^ permalink raw reply related
* [PATCH 14/16] iwlwifi: remove unused iwl_send_card_state function
From: Wey-Yi Guy @ 2010-08-18 16:22 UTC (permalink / raw)
To: linville; +Cc: linux-wireless, ipw3945-devel, Wey-Yi Guy
In-Reply-To: <1282148571-9258-1-git-send-email-wey-yi.w.guy@intel.com>
iwl_send_card_state() is not being call from anywhere, remove it.
Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
---
drivers/net/wireless/iwlwifi/iwl-core.c | 22 ----------------------
drivers/net/wireless/iwlwifi/iwl-core.h | 2 --
2 files changed, 0 insertions(+), 24 deletions(-)
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c
index e6497c6..3d9443b 100644
--- a/drivers/net/wireless/iwlwifi/iwl-core.c
+++ b/drivers/net/wireless/iwlwifi/iwl-core.c
@@ -1470,28 +1470,6 @@ int iwl_send_statistics_request(struct iwl_priv *priv, u8 flags, bool clear)
}
EXPORT_SYMBOL(iwl_send_statistics_request);
-/*
- * CARD_STATE_CMD
- *
- * Use: Sets the device's internal card state to enable, disable, or halt
- *
- * When in the 'enable' state the card operates as normal.
- * When in the 'disable' state, the card enters into a low power mode.
- * When in the 'halt' state, the card is shut down and must be fully
- * restarted to come back on.
- */
-int iwl_send_card_state(struct iwl_priv *priv, u32 flags, u8 meta_flag)
-{
- struct iwl_host_cmd cmd = {
- .id = REPLY_CARD_STATE_CMD,
- .len = sizeof(u32),
- .data = &flags,
- .flags = meta_flag,
- };
-
- return iwl_send_cmd(priv, &cmd);
-}
-
void iwl_rx_pm_sleep_notif(struct iwl_priv *priv,
struct iwl_rx_mem_buffer *rxb)
{
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.h b/drivers/net/wireless/iwlwifi/iwl-core.h
index 6bd6013..7b1e832 100644
--- a/drivers/net/wireless/iwlwifi/iwl-core.h
+++ b/drivers/net/wireless/iwlwifi/iwl-core.h
@@ -592,8 +592,6 @@ int iwl_send_cmd_pdu_async(struct iwl_priv *priv, u8 id, u16 len,
int iwl_enqueue_hcmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd);
-int iwl_send_card_state(struct iwl_priv *priv, u32 flags,
- u8 meta_flag);
/*****************************************************
* PCI *
--
1.7.0.4
^ permalink raw reply related
* [PATCH 0/2] iwlwifi fix for 2.6.35
From: Wey-Yi Guy @ 2010-08-18 16:35 UTC (permalink / raw)
To: linville; +Cc: linux-wireless, ipw3945-devel, Wey-Yi Guy
Don't check WEP keys in AP mode.
Also handle the scan abort condition, iwlwifi should not tell
mac80211 later when scan completed.
Johannes Berg (2):
iwlagn: do not check for AP mode for WEP keys
iwlwifi: do not spuriously call ieee80211_scan_completed
these patches are also available from wireless-2.6 branch on
git://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/iwlwifi-2.6.git
drivers/net/wireless/iwlwifi/iwl-agn.c | 2 +-
drivers/net/wireless/iwlwifi/iwl-scan.c | 6 ++++--
2 files changed, 5 insertions(+), 3 deletions(-)
^ permalink raw reply
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox