We add 2000 series device support
We also fix a issue for 1000 series device to support idle power save
We add initial implementation on P2P supports
Jay Sternberg (1):
iwlwifi: correct debugfs data dumped from sram
Johannes Berg (3):
iwlwifi: implement remain-on-channel
iwlwifi: replace minimum slot time constant
iwlwifi: initial P2P support
Meenakshi Venkataraman (1):
iwlagn: Enable idle powersave mode in 1000 series
Wey-Yi Guy (9):
iwlwifi: use mac80211 throughput trigger
iwlagn: remove reference to gen2a and gen2b
iwlagn: add 2000 series EEPROM version
iwlagn: 2000 series devices support
iwlagn: add 2000 series pci id
iwlagn: add 2000 series to Kconfig
iwlagn: remove Gen2 from Kconfig
iwlwifi: remove g2 from csr hw rev
iwlwifi: add hw rev for 2000 series devices
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 | 26 ++-
drivers/net/wireless/iwlwifi/Makefile | 1 +
drivers/net/wireless/iwlwifi/iwl-1000.c | 1 +
drivers/net/wireless/iwlwifi/iwl-2000.c | 556 +++++++++++++++++++++++++++
drivers/net/wireless/iwlwifi/iwl-3945-led.c | 27 --
drivers/net/wireless/iwlwifi/iwl-6000.c | 52 ++--
drivers/net/wireless/iwlwifi/iwl-agn-hcmd.c | 18 +-
drivers/net/wireless/iwlwifi/iwl-agn-led.c | 14 +-
drivers/net/wireless/iwlwifi/iwl-agn-led.h | 1 +
drivers/net/wireless/iwlwifi/iwl-agn-rxon.c | 19 +-
drivers/net/wireless/iwlwifi/iwl-agn-tx.c | 9 +-
drivers/net/wireless/iwlwifi/iwl-agn.c | 151 +++++++-
drivers/net/wireless/iwlwifi/iwl-agn.h | 11 +
drivers/net/wireless/iwlwifi/iwl-commands.h | 5 +
drivers/net/wireless/iwlwifi/iwl-core.c | 7 +-
drivers/net/wireless/iwlwifi/iwl-core.h | 14 -
drivers/net/wireless/iwlwifi/iwl-csr.h | 14 +-
drivers/net/wireless/iwlwifi/iwl-debugfs.c | 106 +++---
drivers/net/wireless/iwlwifi/iwl-dev.h | 24 +-
drivers/net/wireless/iwlwifi/iwl-eeprom.h | 26 +-
drivers/net/wireless/iwlwifi/iwl-led.c | 201 ++++------
drivers/net/wireless/iwlwifi/iwl-led.h | 16 +-
drivers/net/wireless/iwlwifi/iwl-legacy.c | 4 -
drivers/net/wireless/iwlwifi/iwl3945-base.c | 8 +-
24 files changed, 998 insertions(+), 313 deletions(-)
create mode 100644 drivers/net/wireless/iwlwifi/iwl-2000.c
From: Meenakshi Venkataraman <[email protected]>
The iwlagn powersave algorithm uses the supports_idle parameter
to tell the device to save power when it is not associated with
an AP and is idle.
Enable this feature for the 1000 series of devices.
Reported-by: Johannes Berg <[email protected]>
Signed-off-by: Meenakshi Venkataraman <[email protected]>
Signed-off-by: Wey-Yi Guy <[email protected]>
---
drivers/net/wireless/iwlwifi/iwl-1000.c | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
diff --git a/drivers/net/wireless/iwlwifi/iwl-1000.c b/drivers/net/wireless/iwlwifi/iwl-1000.c
index ba78bc8..127723e 100644
--- a/drivers/net/wireless/iwlwifi/iwl-1000.c
+++ b/drivers/net/wireless/iwlwifi/iwl-1000.c
@@ -270,6 +270,7 @@ static struct iwl_base_params iwl1000_base_params = {
.ucode_tracing = true,
.sensitivity_calib_by_driver = true,
.chain_noise_calib_by_driver = true,
+ .supports_idle = true,
};
static struct iwl_ht_params iwl1000_ht_params = {
.ht_greenfield_support = true,
--
1.7.0.4
On Sat, Jan 22, 2011 at 1:06 AM, Wey-Yi Guy <[email protected]> wrote:
> Signed-off-by: Wey-Yi Guy <[email protected]>
>
> Remove Gen 2 from Kconfig file since 6005/6030/6150 series of
> products are released.
>
> Signed-off-by: Wey-Yi Guy <[email protected]>
> ---
> ?drivers/net/wireless/iwlwifi/Kconfig | ? ?5 +++--
> ?1 files changed, 3 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/net/wireless/iwlwifi/Kconfig b/drivers/net/wireless/iwlwifi/Kconfig
> index 442a146..236f900 100644
> --- a/drivers/net/wireless/iwlwifi/Kconfig
> +++ b/drivers/net/wireless/iwlwifi/Kconfig
> @@ -110,8 +110,9 @@ config IWL5000
> ? ? ? ? ? ? ? ?Intel WiFi Link 1000BGN
> ? ? ? ? ? ? ? ?Intel Wireless WiFi 5150AGN
> ? ? ? ? ? ? ? ?Intel Wireless WiFi 5100AGN, 5300AGN, and 5350AGN
> - ? ? ? ? ? ? ? Intel 6000 Gen 2 Series Wi-Fi Adapters (6000G2A and 6000G2B)
> - ? ? ? ? ? ? ? Intel WIreless WiFi Link 6050BGN Gen 2 Adapter
> + ? ? ? ? ? ? ? Intel 6005 Series Wi-Fi Adapters
> + ? ? ? ? ? ? ? Intel 6030 Series Wi-Fi Adapters
> + ? ? ? ? ? ? ? Intel Wireless WiFi Link 6150BGN 2 Adapter
Shouldn't this be "Intel Centrino Advanced-N 6150 Adapter"?
> ? ? ? ? ? ? ? ?Intel 100 Series Wi-Fi Adapters (100BGN and 130BGN)
> ? ? ? ? ? ? ? ?Intel 2000 Series Wi-Fi Adapters
>
> --
> 1.7.0.4
>
>
> ------------------------------------------------------------------------------
> Special Offer-- Download ArcSight Logger for FREE (a $49 USD value)!
> Finally, a world-class log management solution at an even better price-free!
> Download using promo code Free_Logger_4_Dev2Dev. Offer expires
> February 28th, so secure your free ArcSight Logger TODAY!
> http://p.sf.net/sfu/arcsight-sfd2d
> _______________________________________________
> Ipw3945-devel mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/ipw3945-devel
>
--
Vista: [V]iruses, [I]ntruders, [S]pyware, [T]rojans and [A]dware. :-)
On Sat, Jan 22, 2011 at 1:06 AM, Wey-Yi Guy <[email protected]> wrote:
> From: Wey-Yi Guy <[email protected]>
>
> Adding 2000 series devices supports, the 2000 series devices has
> many different SKUs which includes 1x1 and 2x2 devices,also with
Is it just me, or is Intel really abandoning 3-stream 802.11n technology?
> and without BT combo.
>
> Signed-off-by: Wey-Yi Guy <[email protected]>
> ---
> ?drivers/net/wireless/iwlwifi/Makefile ? | ? ?1 +
> ?drivers/net/wireless/iwlwifi/iwl-2000.c | ?556 +++++++++++++++++++++++++++++++
> ?drivers/net/wireless/iwlwifi/iwl-agn.h ?| ? 11 +
> ?3 files changed, 568 insertions(+), 0 deletions(-)
> ?create mode 100644 drivers/net/wireless/iwlwifi/iwl-2000.c
>
> diff --git a/drivers/net/wireless/iwlwifi/Makefile b/drivers/net/wireless/iwlwifi/Makefile
> index 93380f9..25be742 100644
> --- a/drivers/net/wireless/iwlwifi/Makefile
> +++ b/drivers/net/wireless/iwlwifi/Makefile
> @@ -26,6 +26,7 @@ iwlagn-$(CONFIG_IWL5000) += iwl-agn-rxon.o iwl-agn-hcmd.o iwl-agn-ict.o
> ?iwlagn-$(CONFIG_IWL5000) += iwl-5000.o
> ?iwlagn-$(CONFIG_IWL5000) += iwl-6000.o
> ?iwlagn-$(CONFIG_IWL5000) += iwl-1000.o
> +iwlagn-$(CONFIG_IWL5000) += iwl-2000.o
>
> ?# 3945
> ?obj-$(CONFIG_IWL3945) ?+= iwl3945.o
> diff --git a/drivers/net/wireless/iwlwifi/iwl-2000.c b/drivers/net/wireless/iwlwifi/iwl-2000.c
> new file mode 100644
> index 0000000..3c9e1b5
> --- /dev/null
> +++ b/drivers/net/wireless/iwlwifi/iwl-2000.c
> @@ -0,0 +1,556 @@
> +/******************************************************************************
> + *
> + * Copyright(c) 2008 - 2010 Intel Corporation. All rights reserved.
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of version 2 of the GNU General Public License as
> + * published by the Free Software Foundation.
> + *
> + * This program is distributed in the hope that it will be useful, but WITHOUT
> + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
> + * FITNESS FOR A PARTICULAR PURPOSE. ?See the GNU General Public License for
> + * more details.
> + *
> + * You should have received a copy of the GNU General Public License along with
> + * this program; if not, write to the Free Software Foundation, Inc.,
> + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
> + *
> + * The full GNU General Public License is included in this distribution in the
> + * file called LICENSE.
> + *
> + * Contact Information:
> + * ?Intel Linux Wireless <[email protected]>
> + * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
> + *
> + *****************************************************************************/
> +
> +#include <linux/kernel.h>
> +#include <linux/module.h>
> +#include <linux/init.h>
> +#include <linux/pci.h>
> +#include <linux/dma-mapping.h>
> +#include <linux/delay.h>
> +#include <linux/skbuff.h>
> +#include <linux/netdevice.h>
> +#include <linux/wireless.h>
> +#include <net/mac80211.h>
> +#include <linux/etherdevice.h>
> +#include <asm/unaligned.h>
> +
> +#include "iwl-eeprom.h"
> +#include "iwl-dev.h"
> +#include "iwl-core.h"
> +#include "iwl-io.h"
> +#include "iwl-sta.h"
> +#include "iwl-agn.h"
> +#include "iwl-helpers.h"
> +#include "iwl-agn-hw.h"
> +#include "iwl-6000-hw.h"
> +#include "iwl-agn-led.h"
> +#include "iwl-agn-debugfs.h"
> +
> +/* Highest firmware API version supported */
> +#define IWL2030_UCODE_API_MAX 5
> +#define IWL2000_UCODE_API_MAX 5
> +#define IWL200_UCODE_API_MAX 5
> +
> +/* Lowest firmware API version supported */
> +#define IWL2030_UCODE_API_MIN 5
> +#define IWL2000_UCODE_API_MIN 5
> +#define IWL200_UCODE_API_MIN 5
> +
> +#define IWL2030_FW_PRE "iwlwifi-2030-"
> +#define _IWL2030_MODULE_FIRMWARE(api) IWL2030_FW_PRE #api ".ucode"
> +#define IWL2030_MODULE_FIRMWARE(api) _IWL2030_MODULE_FIRMWARE(api)
> +
> +#define IWL2000_FW_PRE "iwlwifi-2000-"
> +#define _IWL2000_MODULE_FIRMWARE(api) IWL2000_FW_PRE #api ".ucode"
> +#define IWL2000_MODULE_FIRMWARE(api) _IWL2000_MODULE_FIRMWARE(api)
> +
> +#define IWL200_FW_PRE "iwlwifi-200-"
> +#define _IWL200_MODULE_FIRMWARE(api) IWL200_FW_PRE #api ".ucode"
> +#define IWL200_MODULE_FIRMWARE(api) _IWL200_MODULE_FIRMWARE(api)
> +
> +static void iwl2000_set_ct_threshold(struct iwl_priv *priv)
> +{
> + ? ? ? /* want Celsius */
> + ? ? ? priv->hw_params.ct_kill_threshold = CT_KILL_THRESHOLD;
> + ? ? ? priv->hw_params.ct_kill_exit_threshold = CT_KILL_EXIT_THRESHOLD;
> +}
> +
> +/* NIC configuration for 2000 series */
> +static void iwl2000_nic_config(struct iwl_priv *priv)
> +{
> + ? ? ? u16 radio_cfg;
> +
> + ? ? ? radio_cfg = iwl_eeprom_query16(priv, EEPROM_RADIO_CONFIG);
> +
> + ? ? ? /* write radio config values to register */
> + ? ? ? if (EEPROM_RF_CFG_TYPE_MSK(radio_cfg) <= EEPROM_RF_CONFIG_TYPE_MAX)
> + ? ? ? iwl_set_bit(priv, CSR_HW_IF_CONFIG_REG,
> + ? ? ? ? ? ? ? ? ? ? ? EEPROM_RF_CFG_TYPE_MSK(radio_cfg) |
> + ? ? ? ? ? ? ? ? ? ? ? EEPROM_RF_CFG_STEP_MSK(radio_cfg) |
> + ? ? ? ? ? ? ? ? ? ? ? EEPROM_RF_CFG_DASH_MSK(radio_cfg));
> +
> + ? ? ? /* set CSR_HW_CONFIG_REG for uCode use */
> + ? ? ? iwl_set_bit(priv, CSR_HW_IF_CONFIG_REG,
> + ? ? ? ? ? ? ? ? ? CSR_HW_IF_CONFIG_REG_BIT_RADIO_SI |
> + ? ? ? ? ? ? ? ? ? CSR_HW_IF_CONFIG_REG_BIT_MAC_SI);
> +
> +}
> +
> +static struct iwl_sensitivity_ranges iwl2000_sensitivity = {
> + ? ? ? .min_nrg_cck = 97,
> + ? ? ? .max_nrg_cck = 0, /* not used, set to 0 */
> + ? ? ? .auto_corr_min_ofdm = 80,
> + ? ? ? .auto_corr_min_ofdm_mrc = 128,
> + ? ? ? .auto_corr_min_ofdm_x1 = 105,
> + ? ? ? .auto_corr_min_ofdm_mrc_x1 = 192,
> +
> + ? ? ? .auto_corr_max_ofdm = 145,
> + ? ? ? .auto_corr_max_ofdm_mrc = 232,
> + ? ? ? .auto_corr_max_ofdm_x1 = 110,
> + ? ? ? .auto_corr_max_ofdm_mrc_x1 = 232,
> +
> + ? ? ? .auto_corr_min_cck = 125,
> + ? ? ? .auto_corr_max_cck = 175,
> + ? ? ? .auto_corr_min_cck_mrc = 160,
> + ? ? ? .auto_corr_max_cck_mrc = 310,
> + ? ? ? .nrg_th_cck = 97,
> + ? ? ? .nrg_th_ofdm = 100,
> +
> + ? ? ? .barker_corr_th_min = 190,
> + ? ? ? .barker_corr_th_min_mrc = 390,
> + ? ? ? .nrg_th_cca = 62,
> +};
> +
> +static int iwl2000_hw_set_hw_params(struct iwl_priv *priv)
> +{
> + ? ? ? if (priv->cfg->mod_params->num_of_queues >= IWL_MIN_NUM_QUEUES &&
> + ? ? ? ? ? priv->cfg->mod_params->num_of_queues <= IWLAGN_NUM_QUEUES)
> + ? ? ? ? ? ? ? priv->cfg->base_params->num_of_queues =
> + ? ? ? ? ? ? ? ? ? ? ? priv->cfg->mod_params->num_of_queues;
> +
> + ? ? ? priv->hw_params.max_txq_num = priv->cfg->base_params->num_of_queues;
> + ? ? ? priv->hw_params.dma_chnl_num = FH50_TCSR_CHNL_NUM;
> + ? ? ? priv->hw_params.scd_bc_tbls_size =
> + ? ? ? ? ? ? ? priv->cfg->base_params->num_of_queues *
> + ? ? ? ? ? ? ? sizeof(struct iwlagn_scd_bc_tbl);
> + ? ? ? priv->hw_params.tfd_size = sizeof(struct iwl_tfd);
> + ? ? ? priv->hw_params.max_stations = IWLAGN_STATION_COUNT;
> + ? ? ? priv->contexts[IWL_RXON_CTX_BSS].bcast_sta_id = IWLAGN_BROADCAST_ID;
> +
> + ? ? ? priv->hw_params.max_data_size = IWL60_RTC_DATA_SIZE;
> + ? ? ? priv->hw_params.max_inst_size = IWL60_RTC_INST_SIZE;
> +
> + ? ? ? priv->hw_params.max_bsm_size = 0;
> + ? ? ? priv->hw_params.ht40_channel = ?BIT(IEEE80211_BAND_2GHZ) |
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? BIT(IEEE80211_BAND_5GHZ);
> + ? ? ? priv->hw_params.rx_wrt_ptr_reg = FH_RSCSR_CHNL0_WPTR;
> +
> + ? ? ? priv->hw_params.tx_chains_num = num_of_ant(priv->cfg->valid_tx_ant);
> + ? ? ? if (priv->cfg->rx_with_siso_diversity)
> + ? ? ? ? ? ? ? priv->hw_params.rx_chains_num = 1;
> + ? ? ? else
> + ? ? ? ? ? ? ? priv->hw_params.rx_chains_num =
> + ? ? ? ? ? ? ? ? ? ? ? num_of_ant(priv->cfg->valid_rx_ant);
> + ? ? ? priv->hw_params.valid_tx_ant = priv->cfg->valid_tx_ant;
> + ? ? ? priv->hw_params.valid_rx_ant = priv->cfg->valid_rx_ant;
> +
> + ? ? ? iwl2000_set_ct_threshold(priv);
> +
> + ? ? ? /* Set initial sensitivity parameters */
> + ? ? ? /* Set initial calibration set */
> + ? ? ? priv->hw_params.sens = &iwl2000_sensitivity;
> + ? ? ? priv->hw_params.calib_init_cfg =
> + ? ? ? ? ? ? ? BIT(IWL_CALIB_XTAL) ? ? ? ? ? ? |
> + ? ? ? ? ? ? ? BIT(IWL_CALIB_LO) ? ? ? ? ? ? ? |
> + ? ? ? ? ? ? ? BIT(IWL_CALIB_TX_IQ) ? ? ? ? ? ?|
> + ? ? ? ? ? ? ? BIT(IWL_CALIB_BASE_BAND);
> + ? ? ? if (priv->cfg->need_dc_calib)
> + ? ? ? ? ? ? ? priv->hw_params.calib_rt_cfg |= BIT(IWL_CALIB_CFG_DC_IDX);
> + ? ? ? if (priv->cfg->need_temp_offset_calib)
> + ? ? ? ? ? ? ? priv->hw_params.calib_init_cfg |= BIT(IWL_CALIB_TEMP_OFFSET);
> +
> + ? ? ? priv->hw_params.beacon_time_tsf_bits = IWLAGN_EXT_BEACON_TIME_POS;
> +
> + ? ? ? return 0;
> +}
> +
> +static int iwl2030_hw_channel_switch(struct iwl_priv *priv,
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?struct ieee80211_channel_switch *ch_switch)
> +{
> + ? ? ? /*
> + ? ? ? ?* MULTI-FIXME
> + ? ? ? ?* See iwl_mac_channel_switch.
> + ? ? ? ?*/
> + ? ? ? struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_BSS];
> + ? ? ? struct iwl6000_channel_switch_cmd cmd;
> + ? ? ? const struct iwl_channel_info *ch_info;
> + ? ? ? u32 switch_time_in_usec, ucode_switch_time;
> + ? ? ? u16 ch;
> + ? ? ? u32 tsf_low;
> + ? ? ? u8 switch_count;
> + ? ? ? u16 beacon_interval = le16_to_cpu(ctx->timing.beacon_interval);
> + ? ? ? struct ieee80211_vif *vif = ctx->vif;
> + ? ? ? struct iwl_host_cmd hcmd = {
> + ? ? ? ? ? ? ? .id = REPLY_CHANNEL_SWITCH,
> + ? ? ? ? ? ? ? .len = sizeof(cmd),
> + ? ? ? ? ? ? ? .flags = CMD_SYNC,
> + ? ? ? ? ? ? ? .data = &cmd,
> + ? ? ? };
> +
> + ? ? ? cmd.band = priv->band == IEEE80211_BAND_2GHZ;
> + ? ? ? ch = ch_switch->channel->hw_value;
> + ? ? ? IWL_DEBUG_11H(priv, "channel switch from %u to %u\n",
> + ? ? ? ? ? ? ? ctx->active.channel, ch);
> + ? ? ? cmd.channel = cpu_to_le16(ch);
> + ? ? ? cmd.rxon_flags = ctx->staging.flags;
> + ? ? ? cmd.rxon_filter_flags = ctx->staging.filter_flags;
> + ? ? ? switch_count = ch_switch->count;
> + ? ? ? tsf_low = ch_switch->timestamp & 0x0ffffffff;
> + ? ? ? /*
> + ? ? ? ?* calculate the ucode channel switch time
> + ? ? ? ?* adding TSF as one of the factor for when to switch
> + ? ? ? ?*/
> + ? ? ? if ((priv->ucode_beacon_time > tsf_low) && beacon_interval) {
> + ? ? ? ? ? ? ? if (switch_count > ((priv->ucode_beacon_time - tsf_low) /
> + ? ? ? ? ? ? ? ? ? beacon_interval)) {
> + ? ? ? ? ? ? ? ? ? ? ? switch_count -= (priv->ucode_beacon_time -
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? tsf_low) / beacon_interval;
> + ? ? ? ? ? ? ? } else
> + ? ? ? ? ? ? ? ? ? ? ? switch_count = 0;
> + ? ? ? }
> + ? ? ? if (switch_count <= 1)
> + ? ? ? ? ? ? ? cmd.switch_time = cpu_to_le32(priv->ucode_beacon_time);
> + ? ? ? else {
> + ? ? ? ? ? ? ? switch_time_in_usec =
> + ? ? ? ? ? ? ? ? ? ? ? vif->bss_conf.beacon_int * switch_count * TIME_UNIT;
> + ? ? ? ? ? ? ? ucode_switch_time = iwl_usecs_to_beacons(priv,
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? switch_time_in_usec,
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? beacon_interval);
> + ? ? ? ? ? ? ? cmd.switch_time = iwl_add_beacon_time(priv,
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? priv->ucode_beacon_time,
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ucode_switch_time,
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? beacon_interval);
> + ? ? ? }
> + ? ? ? IWL_DEBUG_11H(priv, "uCode time for the switch is 0x%x\n",
> + ? ? ? ? ? ? ? ? ? ? cmd.switch_time);
> + ? ? ? ch_info = iwl_get_channel_info(priv, priv->band, ch);
> + ? ? ? if (ch_info)
> + ? ? ? ? ? ? ? cmd.expect_beacon = is_channel_radar(ch_info);
> + ? ? ? else {
> + ? ? ? ? ? ? ? IWL_ERR(priv, "invalid channel switch from %u to %u\n",
> + ? ? ? ? ? ? ? ? ? ? ? ctx->active.channel, ch);
> + ? ? ? ? ? ? ? return -EFAULT;
> + ? ? ? }
> + ? ? ? priv->switch_rxon.channel = cmd.channel;
> + ? ? ? priv->switch_rxon.switch_in_progress = true;
> +
> + ? ? ? return iwl_send_cmd_sync(priv, &hcmd);
> +}
> +
> +static struct iwl_lib_ops iwl2000_lib = {
> + ? ? ? .set_hw_params = iwl2000_hw_set_hw_params,
> + ? ? ? .txq_update_byte_cnt_tbl = iwlagn_txq_update_byte_cnt_tbl,
> + ? ? ? .txq_inval_byte_cnt_tbl = iwlagn_txq_inval_byte_cnt_tbl,
> + ? ? ? .txq_set_sched = iwlagn_txq_set_sched,
> + ? ? ? .txq_agg_enable = iwlagn_txq_agg_enable,
> + ? ? ? .txq_agg_disable = iwlagn_txq_agg_disable,
> + ? ? ? .txq_attach_buf_to_tfd = iwl_hw_txq_attach_buf_to_tfd,
> + ? ? ? .txq_free_tfd = iwl_hw_txq_free_tfd,
> + ? ? ? .txq_init = iwl_hw_tx_queue_init,
> + ? ? ? .rx_handler_setup = iwlagn_rx_handler_setup,
> + ? ? ? .setup_deferred_work = iwlagn_setup_deferred_work,
> + ? ? ? .is_valid_rtc_data_addr = iwlagn_hw_valid_rtc_data_addr,
> + ? ? ? .load_ucode = iwlagn_load_ucode,
> + ? ? ? .dump_nic_event_log = iwl_dump_nic_event_log,
> + ? ? ? .dump_nic_error_log = iwl_dump_nic_error_log,
> + ? ? ? .dump_csr = iwl_dump_csr,
> + ? ? ? .dump_fh = iwl_dump_fh,
> + ? ? ? .init_alive_start = iwlagn_init_alive_start,
> + ? ? ? .alive_notify = iwlagn_alive_notify,
> + ? ? ? .send_tx_power = iwlagn_send_tx_power,
> + ? ? ? .update_chain_flags = iwl_update_chain_flags,
> + ? ? ? .set_channel_switch = iwl2030_hw_channel_switch,
> + ? ? ? .apm_ops = {
> + ? ? ? ? ? ? ? .init = iwl_apm_init,
> + ? ? ? ? ? ? ? .config = iwl2000_nic_config,
> + ? ? ? },
> + ? ? ? .eeprom_ops = {
> + ? ? ? ? ? ? ? .regulatory_bands = {
> + ? ? ? ? ? ? ? ? ? ? ? EEPROM_REG_BAND_1_CHANNELS,
> + ? ? ? ? ? ? ? ? ? ? ? EEPROM_REG_BAND_2_CHANNELS,
> + ? ? ? ? ? ? ? ? ? ? ? EEPROM_REG_BAND_3_CHANNELS,
> + ? ? ? ? ? ? ? ? ? ? ? EEPROM_REG_BAND_4_CHANNELS,
> + ? ? ? ? ? ? ? ? ? ? ? EEPROM_REG_BAND_5_CHANNELS,
> + ? ? ? ? ? ? ? ? ? ? ? EEPROM_6000_REG_BAND_24_HT40_CHANNELS,
> + ? ? ? ? ? ? ? ? ? ? ? EEPROM_REG_BAND_52_HT40_CHANNELS
> + ? ? ? ? ? ? ? },
> + ? ? ? ? ? ? ? .acquire_semaphore = iwlcore_eeprom_acquire_semaphore,
> + ? ? ? ? ? ? ? .release_semaphore = iwlcore_eeprom_release_semaphore,
> + ? ? ? ? ? ? ? .calib_version ?= iwlagn_eeprom_calib_version,
> + ? ? ? ? ? ? ? .query_addr = iwlagn_eeprom_query_addr,
> + ? ? ? ? ? ? ? .update_enhanced_txpower = iwlcore_eeprom_enhanced_txpower,
> + ? ? ? },
> + ? ? ? .isr_ops = {
> + ? ? ? ? ? ? ? .isr = iwl_isr_ict,
> + ? ? ? ? ? ? ? .free = iwl_free_isr_ict,
> + ? ? ? ? ? ? ? .alloc = iwl_alloc_isr_ict,
> + ? ? ? ? ? ? ? .reset = iwl_reset_ict,
> + ? ? ? ? ? ? ? .disable = iwl_disable_ict,
> + ? ? ? },
> + ? ? ? .temp_ops = {
> + ? ? ? ? ? ? ? .temperature = iwlagn_temperature,
> + ? ? ? },
> + ? ? ? .debugfs_ops = {
> + ? ? ? ? ? ? ? .rx_stats_read = iwl_ucode_rx_stats_read,
> + ? ? ? ? ? ? ? .tx_stats_read = iwl_ucode_tx_stats_read,
> + ? ? ? ? ? ? ? .general_stats_read = iwl_ucode_general_stats_read,
> + ? ? ? ? ? ? ? .bt_stats_read = iwl_ucode_bt_stats_read,
> + ? ? ? ? ? ? ? .reply_tx_error = iwl_reply_tx_error_read,
> + ? ? ? },
> + ? ? ? .check_plcp_health = iwl_good_plcp_health,
> + ? ? ? .check_ack_health = iwl_good_ack_health,
> + ? ? ? .txfifo_flush = iwlagn_txfifo_flush,
> + ? ? ? .dev_txfifo_flush = iwlagn_dev_txfifo_flush,
> + ? ? ? .tt_ops = {
> + ? ? ? ? ? ? ? .lower_power_detection = iwl_tt_is_low_power_state,
> + ? ? ? ? ? ? ? .tt_power_mode = iwl_tt_current_power_mode,
> + ? ? ? ? ? ? ? .ct_kill_check = iwl_check_for_ct_kill,
> + ? ? ? }
> +};
> +
> +static const struct iwl_ops iwl2000_ops = {
> + ? ? ? .lib = &iwl2000_lib,
> + ? ? ? .hcmd = &iwlagn_hcmd,
> + ? ? ? .utils = &iwlagn_hcmd_utils,
> + ? ? ? .led = &iwlagn_led_ops,
> + ? ? ? .ieee80211_ops = &iwlagn_hw_ops,
> +};
> +
> +static const struct iwl_ops iwl2030_ops = {
> + ? ? ? .lib = &iwl2000_lib,
> + ? ? ? .hcmd = &iwlagn_bt_hcmd,
> + ? ? ? .utils = &iwlagn_hcmd_utils,
> + ? ? ? .led = &iwlagn_led_ops,
> + ? ? ? .ieee80211_ops = &iwlagn_hw_ops,
> +};
> +
> +static const struct iwl_ops iwl200_ops = {
> + ? ? ? .lib = &iwl2000_lib,
> + ? ? ? .hcmd = &iwlagn_hcmd,
> + ? ? ? .utils = &iwlagn_hcmd_utils,
> + ? ? ? .led = &iwlagn_led_ops,
> + ? ? ? .ieee80211_ops = &iwlagn_hw_ops,
> +};
> +
> +static const struct iwl_ops iwl230_ops = {
> + ? ? ? .lib = &iwl2000_lib,
> + ? ? ? .hcmd = &iwlagn_bt_hcmd,
> + ? ? ? .utils = &iwlagn_hcmd_utils,
> + ? ? ? .led = &iwlagn_led_ops,
> + ? ? ? .ieee80211_ops = &iwlagn_hw_ops,
> +};
> +
> +static struct iwl_base_params iwl2000_base_params = {
> + ? ? ? .eeprom_size = OTP_LOW_IMAGE_SIZE,
> + ? ? ? .num_of_queues = IWLAGN_NUM_QUEUES,
> + ? ? ? .num_of_ampdu_queues = IWLAGN_NUM_AMPDU_QUEUES,
> + ? ? ? .pll_cfg_val = 0,
> + ? ? ? .set_l0s = true,
> + ? ? ? .use_bsm = false,
> + ? ? ? .max_ll_items = OTP_MAX_LL_ITEMS_2x00,
> + ? ? ? .shadow_ram_support = true,
> + ? ? ? .led_compensation = 51,
> + ? ? ? .chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
> + ? ? ? .supports_idle = true,
> + ? ? ? .adv_thermal_throttle = true,
> + ? ? ? .support_ct_kill_exit = true,
> + ? ? ? .plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
> + ? ? ? .chain_noise_scale = 1000,
> + ? ? ? .wd_timeout = IWL_DEF_WD_TIMEOUT,
> + ? ? ? .max_event_log_size = 512,
> + ? ? ? .ucode_tracing = true,
> + ? ? ? .sensitivity_calib_by_driver = true,
> + ? ? ? .chain_noise_calib_by_driver = true,
> + ? ? ? .shadow_reg_enable = true,
> +};
> +
> +
> +static struct iwl_base_params iwl2030_base_params = {
> + ? ? ? .eeprom_size = OTP_LOW_IMAGE_SIZE,
> + ? ? ? .num_of_queues = IWLAGN_NUM_QUEUES,
> + ? ? ? .num_of_ampdu_queues = IWLAGN_NUM_AMPDU_QUEUES,
> + ? ? ? .pll_cfg_val = 0,
> + ? ? ? .set_l0s = true,
> + ? ? ? .use_bsm = false,
> + ? ? ? .max_ll_items = OTP_MAX_LL_ITEMS_2x00,
> + ? ? ? .shadow_ram_support = true,
> + ? ? ? .led_compensation = 57,
> + ? ? ? .chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
> + ? ? ? .supports_idle = true,
> + ? ? ? .adv_thermal_throttle = true,
> + ? ? ? .support_ct_kill_exit = true,
> + ? ? ? .plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
> + ? ? ? .chain_noise_scale = 1000,
> + ? ? ? .wd_timeout = IWL_LONG_WD_TIMEOUT,
> + ? ? ? .max_event_log_size = 512,
> + ? ? ? .ucode_tracing = true,
> + ? ? ? .sensitivity_calib_by_driver = true,
> + ? ? ? .chain_noise_calib_by_driver = true,
> + ? ? ? .shadow_reg_enable = true,
> +};
> +
> +static struct iwl_ht_params iwl2000_ht_params = {
> + ? ? ? .ht_greenfield_support = true,
> + ? ? ? .use_rts_for_aggregation = true, /* use rts/cts protection */
> +};
> +
> +static struct iwl_bt_params iwl2030_bt_params = {
> + ? ? ? .bt_statistics = true,
> + ? ? ? /* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */
> + ? ? ? .advanced_bt_coexist = true,
> + ? ? ? .agg_time_limit = BT_AGG_THRESHOLD_DEF,
> + ? ? ? .bt_init_traffic_load = IWL_BT_COEX_TRAFFIC_LOAD_NONE,
> + ? ? ? .bt_prio_boost = IWLAGN_BT_PRIO_BOOST_DEFAULT,
> + ? ? ? .bt_sco_disable = true,
> +};
> +
> +#define IWL_DEVICE_2000 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?\
> + ? ? ? .fw_name_pre = IWL2000_FW_PRE, ? ? ? ? ? ? ? ? ? ? ? ? ?\
> + ? ? ? .ucode_api_max = IWL2000_UCODE_API_MAX, ? ? ? ? ? ? ? ? \
> + ? ? ? .ucode_api_min = IWL2000_UCODE_API_MIN, ? ? ? ? ? ? ? ? \
> + ? ? ? .eeprom_ver = EEPROM_2000_EEPROM_VERSION, ? ? ? ? ? ? ? \
> + ? ? ? .eeprom_calib_ver = EEPROM_2000_TX_POWER_VERSION, ? ? ? \
> + ? ? ? .ops = &iwl2000_ops, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?\
> + ? ? ? .mod_params = &iwlagn_mod_params, ? ? ? ? ? ? ? ? ? ? ? \
> + ? ? ? .base_params = &iwl2000_base_params, ? ? ? ? ? ? ? ? ? ?\
> + ? ? ? .need_dc_calib = true, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?\
> + ? ? ? .need_temp_offset_calib = true, ? ? ? ? ? ? ? ? ? ? ? ? \
> + ? ? ? .led_mode = IWL_LED_RF_STATE ? ? ? ? ? ? ? ? ? ? ? ? ? ?\
> +
> +struct iwl_cfg iwl2000_2bgn_cfg = {
> + ? ? ? .name = "2000 Series 2x2 BGN",
> + ? ? ? IWL_DEVICE_2000,
> + ? ? ? .ht_params = &iwl2000_ht_params,
> +};
> +
> +struct iwl_cfg iwl2000_2bg_cfg = {
> + ? ? ? .name = "2000 Series 2x2 BG",
> + ? ? ? IWL_DEVICE_2000,
> +};
> +
> +#define IWL_DEVICE_2030 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?\
> + ? ? ? .fw_name_pre = IWL2030_FW_PRE, ? ? ? ? ? ? ? ? ? ? ? ? ?\
> + ? ? ? .ucode_api_max = IWL2030_UCODE_API_MAX, ? ? ? ? ? ? ? ? \
> + ? ? ? .ucode_api_min = IWL2030_UCODE_API_MIN, ? ? ? ? ? ? ? ? \
> + ? ? ? .eeprom_ver = EEPROM_2000_EEPROM_VERSION, ? ? ? ? ? ? ? \
> + ? ? ? .eeprom_calib_ver = EEPROM_2000_TX_POWER_VERSION, ? ? ? \
> + ? ? ? .ops = &iwl2030_ops, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?\
> + ? ? ? .mod_params = &iwlagn_mod_params, ? ? ? ? ? ? ? ? ? ? ? \
> + ? ? ? .base_params = &iwl2030_base_params, ? ? ? ? ? ? ? ? ? ?\
> + ? ? ? .bt_params = &iwl2030_bt_params, ? ? ? ? ? ? ? ? ? ? ? ?\
> + ? ? ? .need_dc_calib = true, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?\
> + ? ? ? .need_temp_offset_calib = true, ? ? ? ? ? ? ? ? ? ? ? ? \
> + ? ? ? .led_mode = IWL_LED_RF_STATE, ? ? ? ? ? ? ? ? ? ? ? ? ? \
> + ? ? ? .adv_pm = true ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?\
> +
> +struct iwl_cfg iwl2030_2bgn_cfg = {
> + ? ? ? .name = "2000 Series 2x2 BGN/BT",
> + ? ? ? IWL_DEVICE_2000,
> + ? ? ? .ht_params = &iwl2000_ht_params,
> +};
> +
> +struct iwl_cfg iwl2030_2bg_cfg = {
> + ? ? ? .name = "2000 Series 2x2 BG/BT",
> + ? ? ? IWL_DEVICE_2000,
> +};
> +
> +#define IWL_DEVICE_6035 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?\
> + ? ? ? .fw_name_pre = IWL2030_FW_PRE, ? ? ? ? ? ? ? ? ? ? ? ? ?\
> + ? ? ? .ucode_api_max = IWL2030_UCODE_API_MAX, ? ? ? ? ? ? ? ? \
> + ? ? ? .ucode_api_min = IWL2030_UCODE_API_MIN, ? ? ? ? ? ? ? ? \
> + ? ? ? .eeprom_ver = EEPROM_6035_EEPROM_VERSION, ? ? ? ? ? ? ? \
> + ? ? ? .eeprom_calib_ver = EEPROM_6035_TX_POWER_VERSION, ? ? ? \
> + ? ? ? .ops = &iwl2030_ops, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?\
> + ? ? ? .mod_params = &iwlagn_mod_params, ? ? ? ? ? ? ? ? ? ? ? \
> + ? ? ? .base_params = &iwl2030_base_params, ? ? ? ? ? ? ? ? ? ?\
> + ? ? ? .bt_params = &iwl2030_bt_params, ? ? ? ? ? ? ? ? ? ? ? ?\
> + ? ? ? .need_dc_calib = true, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?\
> + ? ? ? .need_temp_offset_calib = true, ? ? ? ? ? ? ? ? ? ? ? ? \
> + ? ? ? .led_mode = IWL_LED_RF_STATE, ? ? ? ? ? ? ? ? ? ? ? ? ? \
> + ? ? ? .adv_pm = true ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?\
> +
> +struct iwl_cfg iwl6035_2agn_cfg = {
> + ? ? ? .name = "2000 Series 2x2 AGN/BT",
> + ? ? ? IWL_DEVICE_6035,
> + ? ? ? .ht_params = &iwl2000_ht_params,
> +};
> +
> +struct iwl_cfg iwl6035_2abg_cfg = {
> + ? ? ? .name = "2000 Series 2x2 ABG/BT",
> + ? ? ? IWL_DEVICE_6035,
> +};
> +
> +struct iwl_cfg iwl6035_2bg_cfg = {
> + ? ? ? .name = "2000 Series 2x2 BG/BT",
> + ? ? ? IWL_DEVICE_6035,
> +};
> +
> +#define IWL_DEVICE_200 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
> + ? ? ? .fw_name_pre = IWL200_FW_PRE, ? ? ? ? ? ? ? ? ? ? ? ? ? \
> + ? ? ? .ucode_api_max = IWL200_UCODE_API_MAX, ? ? ? ? ? ? ? ? ?\
> + ? ? ? .ucode_api_min = IWL200_UCODE_API_MIN, ? ? ? ? ? ? ? ? ?\
> + ? ? ? .eeprom_ver = EEPROM_2000_EEPROM_VERSION, ? ? ? ? ? ? ? \
> + ? ? ? .eeprom_calib_ver = EEPROM_2000_TX_POWER_VERSION, ? ? ? \
> + ? ? ? .ops = &iwl200_ops, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
> + ? ? ? .mod_params = &iwlagn_mod_params, ? ? ? ? ? ? ? ? ? ? ? \
> + ? ? ? .base_params = &iwl2000_base_params, ? ? ? ? ? ? ? ? ? ?\
> + ? ? ? .need_dc_calib = true, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?\
> + ? ? ? .need_temp_offset_calib = true, ? ? ? ? ? ? ? ? ? ? ? ? \
> + ? ? ? .led_mode = IWL_LED_RF_STATE, ? ? ? ? ? ? ? ? ? ? ? ? ? \
> + ? ? ? .adv_pm = true, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
> + ? ? ? .rx_with_siso_diversity = true ? ? ? ? ? ? ? ? ? ? ? ? ?\
> +
> +struct iwl_cfg iwl200_bg_cfg = {
> + ? ? ? .name = "200 Series 1x1 BG",
> + ? ? ? IWL_DEVICE_200,
> +};
> +
> +struct iwl_cfg iwl200_bgn_cfg = {
> + ? ? ? .name = "200 Series 1x1 BGN",
> + ? ? ? IWL_DEVICE_200,
> + ? ? ? .ht_params = &iwl2000_ht_params,
> +};
> +
> +#define IWL_DEVICE_230 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
> + ? ? ? .fw_name_pre = IWL200_FW_PRE, ? ? ? ? ? ? ? ? ? ? ? ? ? \
> + ? ? ? .ucode_api_max = IWL200_UCODE_API_MAX, ? ? ? ? ? ? ? ? ?\
> + ? ? ? .ucode_api_min = IWL200_UCODE_API_MIN, ? ? ? ? ? ? ? ? ?\
> + ? ? ? .eeprom_ver = EEPROM_2000_EEPROM_VERSION, ? ? ? ? ? ? ? \
> + ? ? ? .eeprom_calib_ver = EEPROM_2000_TX_POWER_VERSION, ? ? ? \
> + ? ? ? .ops = &iwl230_ops, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
> + ? ? ? .mod_params = &iwlagn_mod_params, ? ? ? ? ? ? ? ? ? ? ? \
> + ? ? ? .base_params = &iwl2030_base_params, ? ? ? ? ? ? ? ? ? ?\
> + ? ? ? .bt_params = &iwl2030_bt_params, ? ? ? ? ? ? ? ? ? ? ? ?\
> + ? ? ? .need_dc_calib = true, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?\
> + ? ? ? .need_temp_offset_calib = true, ? ? ? ? ? ? ? ? ? ? ? ? \
> + ? ? ? .led_mode = IWL_LED_RF_STATE, ? ? ? ? ? ? ? ? ? ? ? ? ? \
> + ? ? ? .adv_pm = true, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
> + ? ? ? .rx_with_siso_diversity = true ? ? ? ? ? ? ? ? ? ? ? ? ?\
> +
> +struct iwl_cfg iwl230_bg_cfg = {
> + ? ? ? .name = "200 Series 1x1 BG/BT",
> + ? ? ? IWL_DEVICE_230,
> +};
> +
> +struct iwl_cfg iwl230_bgn_cfg = {
> + ? ? ? .name = "200 Series 1x1 BGN/BT",
> + ? ? ? IWL_DEVICE_230,
> + ? ? ? .ht_params = &iwl2000_ht_params,
> +};
> +
> +MODULE_FIRMWARE(IWL2000_MODULE_FIRMWARE(IWL2000_UCODE_API_MAX));
> +MODULE_FIRMWARE(IWL2030_MODULE_FIRMWARE(IWL2030_UCODE_API_MAX));
> +MODULE_FIRMWARE(IWL200_MODULE_FIRMWARE(IWL200_UCODE_API_MAX));
> diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.h b/drivers/net/wireless/iwlwifi/iwl-agn.h
> index 74d72ff..d00e1ea 100644
> --- a/drivers/net/wireless/iwlwifi/iwl-agn.h
> +++ b/drivers/net/wireless/iwlwifi/iwl-agn.h
> @@ -96,6 +96,17 @@ extern struct iwl_cfg iwl100_bgn_cfg;
> ?extern struct iwl_cfg iwl100_bg_cfg;
> ?extern struct iwl_cfg iwl130_bgn_cfg;
> ?extern struct iwl_cfg iwl130_bg_cfg;
> +extern struct iwl_cfg iwl2000_2bgn_cfg;
> +extern struct iwl_cfg iwl2000_2bg_cfg;
> +extern struct iwl_cfg iwl2030_2bgn_cfg;
> +extern struct iwl_cfg iwl2030_2bg_cfg;
> +extern struct iwl_cfg iwl6035_2agn_cfg;
> +extern struct iwl_cfg iwl6035_2abg_cfg;
> +extern struct iwl_cfg iwl6035_2bg_cfg;
> +extern struct iwl_cfg iwl200_bg_cfg;
> +extern struct iwl_cfg iwl200_bgn_cfg;
> +extern struct iwl_cfg iwl230_bg_cfg;
> +extern struct iwl_cfg iwl230_bgn_cfg;
>
> ?extern struct iwl_mod_params iwlagn_mod_params;
> ?extern struct iwl_hcmd_ops iwlagn_hcmd;
> --
> 1.7.0.4
>
>
> ------------------------------------------------------------------------------
> Special Offer-- Download ArcSight Logger for FREE (a $49 USD value)!
> Finally, a world-class log management solution at an even better price-free!
> Download using promo code Free_Logger_4_Dev2Dev. Offer expires
> February 28th, so secure your free ArcSight Logger TODAY!
> http://p.sf.net/sfu/arcsight-sfd2d
> _______________________________________________
> Ipw3945-devel mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/ipw3945-devel
>
--
Vista: [V]iruses, [I]ntruders, [S]pyware, [T]rojans and [A]dware. :-)
From: Johannes Berg <[email protected]>
If PAN functionality is present, advertise
P2P interface type support and thus support
for P2P. However, the support is currently
somewhat incomplete -- NoA schedule isn't
added to probe responses, and 11b bitrates
may be used still, etc. Therefore, make it
all optional with a Kconfig option.
Signed-off-by: Johannes Berg <[email protected]>
Signed-off-by: Wey-Yi Guy <[email protected]>
---
drivers/net/wireless/iwlwifi/Kconfig | 16 ++++++++++++++++
drivers/net/wireless/iwlwifi/iwl-agn.c | 4 ++++
drivers/net/wireless/iwlwifi/iwl-core.c | 5 +++--
3 files changed, 23 insertions(+), 2 deletions(-)
diff --git a/drivers/net/wireless/iwlwifi/Kconfig b/drivers/net/wireless/iwlwifi/Kconfig
index 236f900..e1e3b1c 100644
--- a/drivers/net/wireless/iwlwifi/Kconfig
+++ b/drivers/net/wireless/iwlwifi/Kconfig
@@ -116,6 +116,22 @@ config IWL5000
Intel 100 Series Wi-Fi Adapters (100BGN and 130BGN)
Intel 2000 Series Wi-Fi Adapters
+config IWL_P2P
+ bool "iwlwifi experimental P2P support"
+ depends on IWL5000
+ help
+ This option enables experimental P2P support for some devices
+ based on microcode support. Since P2P support is still under
+ development, this option may even enable it for some devices
+ now that turn out to not support it in the future due to
+ microcode restrictions.
+
+ To determine if your microcode supports the experimental P2P
+ offered by this option, check if the driver advertises AP
+ support when it is loaded.
+
+ Say Y only if you want to experiment with P2P.
+
config IWL3945
tristate "Intel PRO/Wireless 3945ABG/BG Network Connection (iwl3945)"
depends on IWLWIFI
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c
index 02771ef..eb16647 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
@@ -4136,6 +4136,10 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
priv->contexts[IWL_RXON_CTX_PAN].mcast_queue = IWL_IPAN_MCAST_QUEUE;
priv->contexts[IWL_RXON_CTX_PAN].interface_modes =
BIT(NL80211_IFTYPE_STATION) | BIT(NL80211_IFTYPE_AP);
+#ifdef CONFIG_IWL_P2P
+ priv->contexts[IWL_RXON_CTX_PAN].interface_modes |=
+ BIT(NL80211_IFTYPE_P2P_CLIENT) | BIT(NL80211_IFTYPE_P2P_GO);
+#endif
priv->contexts[IWL_RXON_CTX_PAN].ap_devtype = RXON_DEV_TYPE_CP;
priv->contexts[IWL_RXON_CTX_PAN].station_devtype = RXON_DEV_TYPE_2STA;
priv->contexts[IWL_RXON_CTX_PAN].unused_devtype = RXON_DEV_TYPE_P2P;
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c
index 8e1b801..a46ad60 100644
--- a/drivers/net/wireless/iwlwifi/iwl-core.c
+++ b/drivers/net/wireless/iwlwifi/iwl-core.c
@@ -1404,9 +1404,10 @@ int iwl_mac_add_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
struct iwl_vif_priv *vif_priv = (void *)vif->drv_priv;
struct iwl_rxon_context *tmp, *ctx = NULL;
int err;
+ enum nl80211_iftype viftype = ieee80211_vif_type_p2p(vif);
IWL_DEBUG_MAC80211(priv, "enter: type %d, addr %pM\n",
- vif->type, vif->addr);
+ viftype, vif->addr);
mutex_lock(&priv->mutex);
@@ -1430,7 +1431,7 @@ int iwl_mac_add_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
continue;
}
- if (!(possible_modes & BIT(vif->type)))
+ if (!(possible_modes & BIT(viftype)))
continue;
/* have maybe usable context w/o interface */
--
1.7.0.4
2011/1/21 G?bor Stefanik <[email protected]>:
> On Sat, Jan 22, 2011 at 1:06 AM, Wey-Yi Guy <[email protected]> wrote:
>> From: Wey-Yi Guy <[email protected]>
>>
>> Adding 2000 series devices supports, the 2000 series devices has
>> many different SKUs which includes 1x1 and 2x2 devices,also with
>
> Is it just me, or is Intel really abandoning 3-stream 802.11n technology?
It's just you. They released the 6300 not that long ago! But think
about the market, how many 3-stream APs can you buy today? Atheros
still doesn't even have a 3-stream NIC end users can buy (though some
companies are getting close!), but Intel's had one for nearly 3 years.
There's a lot more room in the market at the low end, and that's where
it makes sense to put your efforts towards product diversity.
Manufacturers are looking for chips for printers, phones, netbooks,
tiny laptops, etc., why would they pay for the silicon for extra
processing and the design constraints(!) for extra antennas when it's
not going to get used? Heck, a lot of these APs (see, e.g., Apple's
airport express) only come with 100 Mbps wired ports!
Dan
From: Jay Sternberg <[email protected]>
the sram data dumped through the debugfs interface would only work properly
when dumping data on even u32 boundaries and swap bytes based on endianness
on that boundary making byte arrays impossible to read.
now addresses are displayed at the start of every line and the data is
displayed consistently if dumping 1 byte or 20 and regardless of what is the
starting address.
if no lenght given, address displayed is u32 in device format
Signed-off-by: Jay Sternberg <[email protected]>
Signed-off-by: Wey-Yi Guy <[email protected]>
---
drivers/net/wireless/iwlwifi/iwl-debugfs.c | 81 +++++++++++++++++++---------
1 files changed, 56 insertions(+), 25 deletions(-)
diff --git a/drivers/net/wireless/iwlwifi/iwl-debugfs.c b/drivers/net/wireless/iwlwifi/iwl-debugfs.c
index 7f11a44..418c8ac 100644
--- a/drivers/net/wireless/iwlwifi/iwl-debugfs.c
+++ b/drivers/net/wireless/iwlwifi/iwl-debugfs.c
@@ -207,18 +207,19 @@ static ssize_t iwl_dbgfs_rx_statistics_read(struct file *file,
return ret;
}
-#define BYTE1_MASK 0x000000ff;
-#define BYTE2_MASK 0x0000ffff;
-#define BYTE3_MASK 0x00ffffff;
static ssize_t iwl_dbgfs_sram_read(struct file *file,
char __user *user_buf,
size_t count, loff_t *ppos)
{
- u32 val;
+ u32 val = 0;
char *buf;
ssize_t ret;
- int i;
+ int i = 0;
+ bool device_format = false;
+ int offset = 0;
+ int len = 0;
int pos = 0;
+ int sram;
struct iwl_priv *priv = file->private_data;
size_t bufsz;
@@ -230,35 +231,62 @@ static ssize_t iwl_dbgfs_sram_read(struct file *file,
else
priv->dbgfs_sram_len = priv->ucode_data.len;
}
- bufsz = 30 + priv->dbgfs_sram_len * sizeof(char) * 10;
+ len = priv->dbgfs_sram_len;
+
+ if (len == -4) {
+ device_format = true;
+ len = 4;
+ }
+
+ bufsz = 50 + len * 4;
buf = kmalloc(bufsz, GFP_KERNEL);
if (!buf)
return -ENOMEM;
+
pos += scnprintf(buf + pos, bufsz - pos, "sram_len: 0x%x\n",
- priv->dbgfs_sram_len);
+ len);
pos += scnprintf(buf + pos, bufsz - pos, "sram_offset: 0x%x\n",
priv->dbgfs_sram_offset);
- for (i = priv->dbgfs_sram_len; i > 0; i -= 4) {
- val = iwl_read_targ_mem(priv, priv->dbgfs_sram_offset + \
- priv->dbgfs_sram_len - i);
- if (i < 4) {
- switch (i) {
- case 1:
- val &= BYTE1_MASK;
- break;
- case 2:
- val &= BYTE2_MASK;
- break;
- case 3:
- val &= BYTE3_MASK;
- break;
- }
+
+ /* adjust sram address since reads are only on even u32 boundaries */
+ offset = priv->dbgfs_sram_offset & 0x3;
+ sram = priv->dbgfs_sram_offset & ~0x3;
+
+ /* read the first u32 from sram */
+ val = iwl_read_targ_mem(priv, sram);
+
+ for (; len; len--) {
+ /* put the address at the start of every line */
+ if (i == 0)
+ pos += scnprintf(buf + pos, bufsz - pos,
+ "%08X: ", sram + offset);
+
+ if (device_format)
+ pos += scnprintf(buf + pos, bufsz - pos,
+ "%02x", (val >> (8 * (3 - offset))) & 0xff);
+ else
+ pos += scnprintf(buf + pos, bufsz - pos,
+ "%02x ", (val >> (8 * offset)) & 0xff);
+
+ /* if all bytes processed, read the next u32 from sram */
+ if (++offset == 4) {
+ sram += 4;
+ offset = 0;
+ val = iwl_read_targ_mem(priv, sram);
}
- if (!(i % 16))
+
+ /* put in extra spaces and split lines for human readability */
+ if (++i == 16) {
+ i = 0;
pos += scnprintf(buf + pos, bufsz - pos, "\n");
- pos += scnprintf(buf + pos, bufsz - pos, "0x%08x ", val);
+ } else if (!(i & 7)) {
+ pos += scnprintf(buf + pos, bufsz - pos, " ");
+ } else if (!(i & 3)) {
+ pos += scnprintf(buf + pos, bufsz - pos, " ");
+ }
}
- pos += scnprintf(buf + pos, bufsz - pos, "\n");
+ if (i)
+ pos += scnprintf(buf + pos, bufsz - pos, "\n");
ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos);
kfree(buf);
@@ -282,6 +310,9 @@ static ssize_t iwl_dbgfs_sram_write(struct file *file,
if (sscanf(buf, "%x,%x", &offset, &len) == 2) {
priv->dbgfs_sram_offset = offset;
priv->dbgfs_sram_len = len;
+ } else if (sscanf(buf, "%x", &offset) == 1) {
+ priv->dbgfs_sram_offset = offset;
+ priv->dbgfs_sram_len = -4;
} else {
priv->dbgfs_sram_offset = 0;
priv->dbgfs_sram_len = 0;
--
1.7.0.4
On Sun, 2011-01-23 at 01:05 -0800, Johannes Berg wrote:
> That should have
>
> From: Johannes Berg <[email protected]>
>
> :-)
>
Very sorry, never mean to take the credit from you :-)
my mistake and need to be really careful and read twice before push.
Wey
Signed-off-by: Wey-Yi Guy <[email protected]>
Remove Gen 2 from Kconfig file since 6005/6030/6150 series of
products are released.
Signed-off-by: Wey-Yi Guy <[email protected]>
---
drivers/net/wireless/iwlwifi/Kconfig | 5 +++--
1 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/drivers/net/wireless/iwlwifi/Kconfig b/drivers/net/wireless/iwlwifi/Kconfig
index 442a146..236f900 100644
--- a/drivers/net/wireless/iwlwifi/Kconfig
+++ b/drivers/net/wireless/iwlwifi/Kconfig
@@ -110,8 +110,9 @@ config IWL5000
Intel WiFi Link 1000BGN
Intel Wireless WiFi 5150AGN
Intel Wireless WiFi 5100AGN, 5300AGN, and 5350AGN
- Intel 6000 Gen 2 Series Wi-Fi Adapters (6000G2A and 6000G2B)
- Intel WIreless WiFi Link 6050BGN Gen 2 Adapter
+ Intel 6005 Series Wi-Fi Adapters
+ Intel 6030 Series Wi-Fi Adapters
+ Intel Wireless WiFi Link 6150BGN 2 Adapter
Intel 100 Series Wi-Fi Adapters (100BGN and 130BGN)
Intel 2000 Series Wi-Fi Adapters
--
1.7.0.4
2011/1/22 G?bor Stefanik <[email protected]>:
> 2011/1/22 Daniel Halperin <[email protected]>:
>> 2011/1/21 G?bor Stefanik <[email protected]>:
>>> On Sat, Jan 22, 2011 at 1:06 AM, Wey-Yi Guy <[email protected]> wrote:
>>>> From: Wey-Yi Guy <[email protected]>
>>>>
>>>> Adding 2000 series devices supports, the 2000 series devices has
>>>> many different SKUs which includes 1x1 and 2x2 devices,also with
>>>
>>> Is it just me, or is Intel really abandoning 3-stream 802.11n technology?
>>
>> It's just you. ?They released the 6300 not that long ago! ?But think
>> about the market, how many 3-stream APs can you buy today?
>
> Well, there is the Airport Extreme, the D-Link DIR-665 (with a
> Marvell-chipped mini-PCI card inside), and also an offering from
my bad... mini-PCIE.
> Senao.
>
>> Atheros
>> still doesn't even have a 3-stream NIC end users can buy (though some
>> companies are getting close!), but Intel's had one for nearly 3 years.
>>
>> There's a lot more room in the market at the low end, and that's where
>> it makes sense to put your efforts towards product diversity.
>> Manufacturers are looking for chips for printers, phones, netbooks,
>> tiny laptops, etc., why would they pay for the silicon for extra
>> processing and the design constraints(!) for extra antennas when it's
>> not going to get used? ?Heck, a lot of these APs (see, e.g., Apple's
>> airport express) only come with 100 Mbps wired ports!
>>
>> Dan
>>
>
> The problem is that what I currently see is that Intel is updating the
> basic 2x2 half-mini offering (true, they are also releasing Bluetooth
> combos and other new devices, but AFAIK one of the "g2" devices is
> exactly the same feature-wise as the Centrino 6200), while the 6300
> has not received any update ("released not that long ago"? AFAIK it's
> been a year at least since it came out), and the 6350 was cancelled
> before release, leaving 5350 without a successor.
>
--
Vista: [V]iruses, [I]ntruders, [S]pyware, [T]rojans and [A]dware. :-)
From: Wey-Yi Guy <[email protected]>
Adding EEPROM version for 2000 series devices
Signed-off-by: Wey-Yi Guy <[email protected]>
---
drivers/net/wireless/iwlwifi/iwl-eeprom.h | 10 ++++++++++
1 files changed, 10 insertions(+), 0 deletions(-)
diff --git a/drivers/net/wireless/iwlwifi/iwl-eeprom.h b/drivers/net/wireless/iwlwifi/iwl-eeprom.h
index 4f4cd4f..98aa8af 100644
--- a/drivers/net/wireless/iwlwifi/iwl-eeprom.h
+++ b/drivers/net/wireless/iwlwifi/iwl-eeprom.h
@@ -259,6 +259,15 @@ struct iwl_eeprom_enhanced_txpwr {
#define EEPROM_6030_TX_POWER_VERSION (6)
#define EEPROM_6030_EEPROM_VERSION (0x709)
+/* 2x00 Specific */
+#define EEPROM_2000_TX_POWER_VERSION (6)
+#define EEPROM_2000_EEPROM_VERSION (0x805)
+
+/* 6x35 Specific */
+#define EEPROM_6035_TX_POWER_VERSION (6)
+#define EEPROM_6035_EEPROM_VERSION (0x753)
+
+
/* OTP */
/* lower blocks contain EEPROM image and calibration data */
#define OTP_LOW_IMAGE_SIZE (2 * 512 * sizeof(u16)) /* 2 KB */
@@ -268,6 +277,7 @@ struct iwl_eeprom_enhanced_txpwr {
#define OTP_MAX_LL_ITEMS_1000 (3) /* OTP blocks for 1000 */
#define OTP_MAX_LL_ITEMS_6x00 (4) /* OTP blocks for 6x00 */
#define OTP_MAX_LL_ITEMS_6x50 (7) /* OTP blocks for 6x50 */
+#define OTP_MAX_LL_ITEMS_2x00 (4) /* OTP blocks for 2x00 */
/* 2.4 GHz */
extern const u8 iwl_eeprom_band_1[14];
--
1.7.0.4
From: Johannes Berg <[email protected]>
For device supporting PAN/P2P, use the PAN
context to implement the remain-on-channel
operation using device offloads so that the
filters in the device will be programmed
correctly -- otherwise we cannot receive
any probe request frames during off-channel
periods.
Signed-off-by: Johannes Berg <[email protected]>
Signed-off-by: Wey-Yi Guy <[email protected]>
---
drivers/net/wireless/iwlwifi/iwl-agn-hcmd.c | 6 ++-
drivers/net/wireless/iwlwifi/iwl-agn-rxon.c | 17 +++++
drivers/net/wireless/iwlwifi/iwl-agn-tx.c | 9 ++-
drivers/net/wireless/iwlwifi/iwl-agn.c | 94 +++++++++++++++++++++++++++
drivers/net/wireless/iwlwifi/iwl-dev.h | 6 ++
5 files changed, 130 insertions(+), 2 deletions(-)
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-hcmd.c b/drivers/net/wireless/iwlwifi/iwl-agn-hcmd.c
index 366340f..fa6cf2a 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn-hcmd.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn-hcmd.c
@@ -305,7 +305,11 @@ static int iwlagn_set_pan_params(struct iwl_priv *priv)
cmd.slots[0].type = 0; /* BSS */
cmd.slots[1].type = 1; /* PAN */
- if (ctx_bss->vif && ctx_pan->vif) {
+ if (priv->_agn.hw_roc_channel) {
+ /* both contexts must be used for this to happen */
+ slot1 = priv->_agn.hw_roc_duration;
+ slot0 = 20;
+ } else if (ctx_bss->vif && ctx_pan->vif) {
int bcnint = ctx_pan->vif->bss_conf.beacon_int;
int dtim = ctx_pan->vif->bss_conf.dtim_period ?: 1;
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-rxon.c b/drivers/net/wireless/iwlwifi/iwl-agn-rxon.c
index f693293..2a4ff83 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn-rxon.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn-rxon.c
@@ -156,6 +156,23 @@ int iwlagn_commit_rxon(struct iwl_priv *priv, struct iwl_rxon_context *ctx)
/* always get timestamp with Rx frame */
ctx->staging.flags |= RXON_FLG_TSF2HOST_MSK;
+ if (ctx->ctxid == IWL_RXON_CTX_PAN && priv->_agn.hw_roc_channel) {
+ struct ieee80211_channel *chan = priv->_agn.hw_roc_channel;
+
+ iwl_set_rxon_channel(priv, chan, ctx);
+ iwl_set_flags_for_band(priv, ctx, chan->band, NULL);
+ ctx->staging.filter_flags |=
+ RXON_FILTER_ASSOC_MSK |
+ RXON_FILTER_PROMISC_MSK |
+ RXON_FILTER_CTL2HOST_MSK;
+ ctx->staging.dev_type = RXON_DEV_TYPE_P2P;
+ new_assoc = true;
+
+ if (memcmp(&ctx->staging, &ctx->active,
+ sizeof(ctx->staging)) == 0)
+ return 0;
+ }
+
if ((ctx->vif && ctx->vif->bss_conf.use_short_slot) ||
!(ctx->staging.flags & RXON_FLG_BAND_24G_MSK))
ctx->staging.flags |= RXON_FLG_SHORT_SLOT_MSK;
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-tx.c b/drivers/net/wireless/iwlwifi/iwl-agn-tx.c
index 24a11b8..266490d 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn-tx.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn-tx.c
@@ -539,7 +539,14 @@ int iwlagn_tx_skb(struct iwl_priv *priv, struct sk_buff *skb)
unsigned long flags;
bool is_agg = false;
- if (info->control.vif)
+ /*
+ * If the frame needs to go out off-channel, then
+ * we'll have put the PAN context to that channel,
+ * so make the frame go out there.
+ */
+ if (info->flags & IEEE80211_TX_CTL_TX_OFFCHAN)
+ ctx = &priv->contexts[IWL_RXON_CTX_PAN];
+ else if (info->control.vif)
ctx = iwl_rxon_ctx_from_vif(info->control.vif);
spin_lock_irqsave(&priv->lock, flags);
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c
index dad9a63..51e5ea4 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
@@ -3208,6 +3208,8 @@ static int iwl_mac_setup_register(struct iwl_priv *priv,
hw->wiphy->interface_modes |= ctx->exclusive_interface_modes;
}
+ hw->wiphy->max_remain_on_channel_duration = 1000;
+
hw->wiphy->flags |= WIPHY_FLAG_CUSTOM_REGULATORY |
WIPHY_FLAG_DISABLE_BEACON_HINTS;
@@ -3726,6 +3728,95 @@ done:
IWL_DEBUG_MAC80211(priv, "leave\n");
}
+static void iwlagn_disable_roc(struct iwl_priv *priv)
+{
+ struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_PAN];
+ struct ieee80211_channel *chan = ACCESS_ONCE(priv->hw->conf.channel);
+
+ lockdep_assert_held(&priv->mutex);
+
+ if (!ctx->is_active)
+ return;
+
+ ctx->staging.dev_type = RXON_DEV_TYPE_2STA;
+ ctx->staging.filter_flags &= ~RXON_FILTER_ASSOC_MSK;
+ iwl_set_rxon_channel(priv, chan, ctx);
+ iwl_set_flags_for_band(priv, ctx, chan->band, NULL);
+
+ priv->_agn.hw_roc_channel = NULL;
+
+ iwlagn_commit_rxon(priv, ctx);
+
+ ctx->is_active = false;
+}
+
+static void iwlagn_bg_roc_done(struct work_struct *work)
+{
+ struct iwl_priv *priv = container_of(work, struct iwl_priv,
+ _agn.hw_roc_work.work);
+
+ mutex_lock(&priv->mutex);
+ ieee80211_remain_on_channel_expired(priv->hw);
+ iwlagn_disable_roc(priv);
+ mutex_unlock(&priv->mutex);
+}
+
+static int iwl_mac_remain_on_channel(struct ieee80211_hw *hw,
+ struct ieee80211_channel *channel,
+ enum nl80211_channel_type channel_type,
+ int duration)
+{
+ struct iwl_priv *priv = hw->priv;
+ int err = 0;
+
+ if (!(priv->valid_contexts & BIT(IWL_RXON_CTX_PAN)))
+ return -EOPNOTSUPP;
+
+ if (!(priv->contexts[IWL_RXON_CTX_PAN].interface_modes &
+ BIT(NL80211_IFTYPE_P2P_CLIENT)))
+ return -EOPNOTSUPP;
+
+ mutex_lock(&priv->mutex);
+
+ if (priv->contexts[IWL_RXON_CTX_PAN].is_active ||
+ test_bit(STATUS_SCAN_HW, &priv->status)) {
+ err = -EBUSY;
+ goto out;
+ }
+
+ priv->contexts[IWL_RXON_CTX_PAN].is_active = true;
+ priv->_agn.hw_roc_channel = channel;
+ priv->_agn.hw_roc_chantype = channel_type;
+ priv->_agn.hw_roc_duration = DIV_ROUND_UP(duration * 1000, 1024);
+ iwlagn_commit_rxon(priv, &priv->contexts[IWL_RXON_CTX_PAN]);
+ queue_delayed_work(priv->workqueue, &priv->_agn.hw_roc_work,
+ msecs_to_jiffies(duration + 20));
+
+ msleep(20);
+ ieee80211_ready_on_channel(priv->hw);
+
+ out:
+ mutex_unlock(&priv->mutex);
+
+ return err;
+}
+
+static int iwl_mac_cancel_remain_on_channel(struct ieee80211_hw *hw)
+{
+ struct iwl_priv *priv = hw->priv;
+
+ if (!(priv->valid_contexts & BIT(IWL_RXON_CTX_PAN)))
+ return -EOPNOTSUPP;
+
+ cancel_delayed_work_sync(&priv->_agn.hw_roc_work);
+
+ mutex_lock(&priv->mutex);
+ iwlagn_disable_roc(priv);
+ mutex_unlock(&priv->mutex);
+
+ return 0;
+}
+
/*****************************************************************************
*
* driver setup and teardown
@@ -3747,6 +3838,7 @@ static void iwl_setup_deferred_work(struct iwl_priv *priv)
INIT_WORK(&priv->bt_runtime_config, iwl_bg_bt_runtime_config);
INIT_DELAYED_WORK(&priv->init_alive_start, iwl_bg_init_alive_start);
INIT_DELAYED_WORK(&priv->alive_start, iwl_bg_alive_start);
+ INIT_DELAYED_WORK(&priv->_agn.hw_roc_work, iwlagn_bg_roc_done);
iwl_setup_scan_deferred_work(priv);
@@ -3915,6 +4007,8 @@ struct ieee80211_ops iwlagn_hw_ops = {
.channel_switch = iwlagn_mac_channel_switch,
.flush = iwlagn_mac_flush,
.tx_last_beacon = iwl_mac_tx_last_beacon,
+ .remain_on_channel = iwl_mac_remain_on_channel,
+ .cancel_remain_on_channel = iwl_mac_cancel_remain_on_channel,
};
#endif
diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h
index 6dd6508..6fa1383 100644
--- a/drivers/net/wireless/iwlwifi/iwl-dev.h
+++ b/drivers/net/wireless/iwlwifi/iwl-dev.h
@@ -1488,6 +1488,12 @@ struct iwl_priv {
struct list_head notif_waits;
spinlock_t notif_wait_lock;
wait_queue_head_t notif_waitq;
+
+ /* remain-on-channel offload support */
+ struct ieee80211_channel *hw_roc_channel;
+ struct delayed_work hw_roc_work;
+ enum nl80211_channel_type hw_roc_chantype;
+ int hw_roc_duration;
} _agn;
#endif
};
--
1.7.0.4
From: Wey-Yi Guy <[email protected]>
Since 6005, 6030 and 6150 series are offical released, remove the reference
to gen2x and use the product number instead.
Signed-off-by: Wey-Yi Guy <[email protected]>
---
drivers/net/wireless/iwlwifi/iwl-6000.c | 52 ++++++++++++++--------------
drivers/net/wireless/iwlwifi/iwl-eeprom.h | 16 +++++---
2 files changed, 36 insertions(+), 32 deletions(-)
diff --git a/drivers/net/wireless/iwlwifi/iwl-6000.c b/drivers/net/wireless/iwlwifi/iwl-6000.c
index af505bc..c195674 100644
--- a/drivers/net/wireless/iwlwifi/iwl-6000.c
+++ b/drivers/net/wireless/iwlwifi/iwl-6000.c
@@ -67,13 +67,13 @@
#define _IWL6050_MODULE_FIRMWARE(api) IWL6050_FW_PRE #api ".ucode"
#define IWL6050_MODULE_FIRMWARE(api) _IWL6050_MODULE_FIRMWARE(api)
-#define IWL6000G2A_FW_PRE "iwlwifi-6000g2a-"
-#define _IWL6000G2A_MODULE_FIRMWARE(api) IWL6000G2A_FW_PRE #api ".ucode"
-#define IWL6000G2A_MODULE_FIRMWARE(api) _IWL6000G2A_MODULE_FIRMWARE(api)
+#define IWL6005_FW_PRE "iwlwifi-6000g2a-"
+#define _IWL6005_MODULE_FIRMWARE(api) IWL6005_FW_PRE #api ".ucode"
+#define IWL6005_MODULE_FIRMWARE(api) _IWL6005_MODULE_FIRMWARE(api)
-#define IWL6000G2B_FW_PRE "iwlwifi-6000g2b-"
-#define _IWL6000G2B_MODULE_FIRMWARE(api) IWL6000G2B_FW_PRE #api ".ucode"
-#define IWL6000G2B_MODULE_FIRMWARE(api) _IWL6000G2B_MODULE_FIRMWARE(api)
+#define IWL6030_FW_PRE "iwlwifi-6000g2b-"
+#define _IWL6030_MODULE_FIRMWARE(api) IWL6030_FW_PRE #api ".ucode"
+#define IWL6030_MODULE_FIRMWARE(api) _IWL6030_MODULE_FIRMWARE(api)
static void iwl6000_set_ct_threshold(struct iwl_priv *priv)
{
@@ -90,7 +90,7 @@ static void iwl6050_additional_nic_config(struct iwl_priv *priv)
CSR_GP_DRIVER_REG_BIT_CALIB_VERSION6);
}
-static void iwl6050g2_additional_nic_config(struct iwl_priv *priv)
+static void iwl6150_additional_nic_config(struct iwl_priv *priv)
{
/* Indicate calibration version to uCode. */
if (priv->cfg->ops->lib->eeprom_ops.calib_version(priv) >= 6)
@@ -354,7 +354,7 @@ static struct iwl_lib_ops iwl6000_lib = {
}
};
-static struct iwl_lib_ops iwl6000g2b_lib = {
+static struct iwl_lib_ops iwl6030_lib = {
.set_hw_params = iwl6000_hw_set_hw_params,
.txq_update_byte_cnt_tbl = iwlagn_txq_update_byte_cnt_tbl,
.txq_inval_byte_cnt_tbl = iwlagn_txq_inval_byte_cnt_tbl,
@@ -430,8 +430,8 @@ static struct iwl_nic_ops iwl6050_nic_ops = {
.additional_nic_config = &iwl6050_additional_nic_config,
};
-static struct iwl_nic_ops iwl6050g2_nic_ops = {
- .additional_nic_config = &iwl6050g2_additional_nic_config,
+static struct iwl_nic_ops iwl6150_nic_ops = {
+ .additional_nic_config = &iwl6150_additional_nic_config,
};
static const struct iwl_ops iwl6000_ops = {
@@ -451,17 +451,17 @@ static const struct iwl_ops iwl6050_ops = {
.ieee80211_ops = &iwlagn_hw_ops,
};
-static const struct iwl_ops iwl6050g2_ops = {
+static const struct iwl_ops iwl6150_ops = {
.lib = &iwl6000_lib,
.hcmd = &iwlagn_hcmd,
.utils = &iwlagn_hcmd_utils,
.led = &iwlagn_led_ops,
- .nic = &iwl6050g2_nic_ops,
+ .nic = &iwl6150_nic_ops,
.ieee80211_ops = &iwlagn_hw_ops,
};
-static const struct iwl_ops iwl6000g2b_ops = {
- .lib = &iwl6000g2b_lib,
+static const struct iwl_ops iwl6030_ops = {
+ .lib = &iwl6030_lib,
.hcmd = &iwlagn_bt_hcmd,
.utils = &iwlagn_hcmd_utils,
.led = &iwlagn_led_ops,
@@ -555,11 +555,11 @@ static struct iwl_bt_params iwl6000_bt_params = {
};
#define IWL_DEVICE_6005 \
- .fw_name_pre = IWL6000G2A_FW_PRE, \
+ .fw_name_pre = IWL6005_FW_PRE, \
.ucode_api_max = IWL6000G2_UCODE_API_MAX, \
.ucode_api_min = IWL6000G2_UCODE_API_MIN, \
- .eeprom_ver = EEPROM_6000G2_EEPROM_VERSION, \
- .eeprom_calib_ver = EEPROM_6000G2_TX_POWER_VERSION, \
+ .eeprom_ver = EEPROM_6005_EEPROM_VERSION, \
+ .eeprom_calib_ver = EEPROM_6005_TX_POWER_VERSION, \
.ops = &iwl6000_ops, \
.mod_params = &iwlagn_mod_params, \
.base_params = &iwl6000_g2_base_params, \
@@ -584,12 +584,12 @@ struct iwl_cfg iwl6005_2bg_cfg = {
};
#define IWL_DEVICE_6030 \
- .fw_name_pre = IWL6000G2B_FW_PRE, \
+ .fw_name_pre = IWL6030_FW_PRE, \
.ucode_api_max = IWL6000G2_UCODE_API_MAX, \
.ucode_api_min = IWL6000G2_UCODE_API_MIN, \
- .eeprom_ver = EEPROM_6000G2_EEPROM_VERSION, \
- .eeprom_calib_ver = EEPROM_6000G2_TX_POWER_VERSION, \
- .ops = &iwl6000g2b_ops, \
+ .eeprom_ver = EEPROM_6030_EEPROM_VERSION, \
+ .eeprom_calib_ver = EEPROM_6030_TX_POWER_VERSION, \
+ .ops = &iwl6030_ops, \
.mod_params = &iwlagn_mod_params, \
.base_params = &iwl6000_g2_base_params, \
.bt_params = &iwl6000_bt_params, \
@@ -706,9 +706,9 @@ struct iwl_cfg iwl6150_bgn_cfg = {
.fw_name_pre = IWL6050_FW_PRE,
.ucode_api_max = IWL6050_UCODE_API_MAX,
.ucode_api_min = IWL6050_UCODE_API_MIN,
- .eeprom_ver = EEPROM_6050G2_EEPROM_VERSION,
- .eeprom_calib_ver = EEPROM_6050G2_TX_POWER_VERSION,
- .ops = &iwl6050g2_ops,
+ .eeprom_ver = EEPROM_6150_EEPROM_VERSION,
+ .eeprom_calib_ver = EEPROM_6150_TX_POWER_VERSION,
+ .ops = &iwl6150_ops,
.mod_params = &iwlagn_mod_params,
.base_params = &iwl6050_base_params,
.ht_params = &iwl6000_ht_params,
@@ -734,5 +734,5 @@ struct iwl_cfg iwl6000_3agn_cfg = {
MODULE_FIRMWARE(IWL6000_MODULE_FIRMWARE(IWL6000_UCODE_API_MAX));
MODULE_FIRMWARE(IWL6050_MODULE_FIRMWARE(IWL6050_UCODE_API_MAX));
-MODULE_FIRMWARE(IWL6000G2A_MODULE_FIRMWARE(IWL6000G2_UCODE_API_MAX));
-MODULE_FIRMWARE(IWL6000G2B_MODULE_FIRMWARE(IWL6000G2_UCODE_API_MAX));
+MODULE_FIRMWARE(IWL6005_MODULE_FIRMWARE(IWL6000G2_UCODE_API_MAX));
+MODULE_FIRMWARE(IWL6030_MODULE_FIRMWARE(IWL6000G2_UCODE_API_MAX));
diff --git a/drivers/net/wireless/iwlwifi/iwl-eeprom.h b/drivers/net/wireless/iwlwifi/iwl-eeprom.h
index 9e6f313..4f4cd4f 100644
--- a/drivers/net/wireless/iwlwifi/iwl-eeprom.h
+++ b/drivers/net/wireless/iwlwifi/iwl-eeprom.h
@@ -247,13 +247,17 @@ struct iwl_eeprom_enhanced_txpwr {
#define EEPROM_6050_TX_POWER_VERSION (4)
#define EEPROM_6050_EEPROM_VERSION (0x532)
-/* 6x50g2 Specific */
-#define EEPROM_6050G2_TX_POWER_VERSION (6)
-#define EEPROM_6050G2_EEPROM_VERSION (0x553)
+/* 6150 Specific */
+#define EEPROM_6150_TX_POWER_VERSION (6)
+#define EEPROM_6150_EEPROM_VERSION (0x553)
-/* 6x00g2 Specific */
-#define EEPROM_6000G2_TX_POWER_VERSION (6)
-#define EEPROM_6000G2_EEPROM_VERSION (0x709)
+/* 6x05 Specific */
+#define EEPROM_6005_TX_POWER_VERSION (6)
+#define EEPROM_6005_EEPROM_VERSION (0x709)
+
+/* 6x30 Specific */
+#define EEPROM_6030_TX_POWER_VERSION (6)
+#define EEPROM_6030_EEPROM_VERSION (0x709)
/* OTP */
/* lower blocks contain EEPROM image and calibration data */
--
1.7.0.4
2011/1/21 G?bor Stefanik <[email protected]>:
> 2011/1/22 G?bor Stefanik <[email protected]>:
>>> about the market, how many 3-stream APs can you buy today?
>>
>> Well, there is the Airport Extreme, the D-Link DIR-665 (with a
>> Marvell-chipped mini-PCI card inside), and also an offering from
>> Senao
Wow, seriously, thanks for the list! I had no idea Apple added 3
streams to the Airport Extreme (the first gen and the first dual-band
one didn't have it); the only place i could find it was in the WFA
certificate. I also didn't know that D-Link made a plausibly useful
dual-band AP. That's awesome.
Still, that's 3 out of 325 of the 802.11n APs on the WFA certified
list. Okay, let's say there's 10 more that neither of us mentioned,
that's still maximum 3%, or say 5%. And they all cost around $200.
For one randomly-selected (well, selected from their "Value-priced"
category) example, D-link's DIR-515 costs $38.
A possibly silly, possibly illuminating question here: is there
anything *WRONG* with the 6300? Is there a reason you're looking for
a new iteration? What might be funny is that Wi-Fi, unlike CPU,
doesn't really get that much better over the years (as long as you
stick to the standard). And the newest, most exciting stuff -- e.g.,
Wi-Di -- works with the 6300.
Why might you want a new version? Lower cost? -- the chips already
cost like $30, that's pretty cheap, say Intel could bring it down to
$25 would that increase volume enough to make it worth while? I doubt
it. To save power? -- well, 6300 is a pretty feature-rich chip, it
probably goes in devices like fancy laptops where it isn't a
relatively large power drain, and pretty efficient use will come from
Wi-Fi sleep modes. Power efficiency matters more when Wi-Fi is a
relatively large contributor to power draw. Oh wait, that's in the
small devices that only want 1x1 or 1x2, so maybe it IS worth Intel's
time/money to keep revving those chips every time they can use a
smaller process.
I don't know anything about Intel's internal plans, and this is all my
own speculation, but ... I'd love to hear what it is you'd like the
new chip to have that the current ones don't. Certainly, no one's
asking for them to rev the 3945, and I think for good reason. ;).
Dan
2011/1/22 Daniel Halperin <[email protected]>:
> 2011/1/21 G?bor Stefanik <[email protected]>:
>> 2011/1/22 G?bor Stefanik <[email protected]>:
>>>> about the market, how many 3-stream APs can you buy today?
>>>
>>> Well, there is the Airport Extreme, the D-Link DIR-665 (with a
>>> Marvell-chipped mini-PCI card inside), and also an offering from
>>> Senao
>
> Wow, seriously, thanks for the list! ?I had no idea Apple added 3
> streams to the Airport Extreme (the first gen and the first dual-band
> one didn't have it); the only place i could find it was in the WFA
> certificate. ?I also didn't know that D-Link made a plausibly useful
> dual-band AP. ?That's awesome.
>
> Still, that's 3 out of 325 of the 802.11n APs on the WFA certified
> list. ?Okay, let's say there's 10 more that neither of us mentioned,
> that's still maximum 3%, or say 5%. ?And they all cost around $200.
> For one randomly-selected (well, selected from their "Value-priced"
> category) example, D-link's DIR-515 costs $38.
>
> A possibly silly, possibly illuminating question here: is there
> anything *WRONG* with the 6300? ?Is there a reason you're looking for
> a new iteration? ?What might be funny is that Wi-Fi, unlike CPU,
> doesn't really get that much better over the years (as long as you
> stick to the standard). ?And the newest, most exciting stuff -- e.g.,
> Wi-Di -- works with the 6300.
I'm not really referring to the 6300 - I'm talking about what the 6350
would have been, true 3-stream 802.11n + WiMax. The 5350 had only
partial WiMax implementation, and even that is gone now that the 5350
has been discontinued. Also, if they could pull off 3-stream+WiMax,
and they are doing 2-stream+Bluetooth 3.0 now, I'm pretty sure
3-stream+BT3.0 would be doable.
>
> Why might you want a new version? ?Lower cost? -- the chips already
> cost like $30, that's pretty cheap, say Intel could bring it down to
> $25 would that increase volume enough to make it worth while? ?I doubt
> it. ?To save power? -- well, 6300 is a pretty feature-rich chip, it
> probably goes in devices like fancy laptops where it isn't a
> relatively large power drain, and pretty efficient use will come from
> Wi-Fi sleep modes. ?Power efficiency matters more when Wi-Fi is a
> relatively large contributor to power draw. ?Oh wait, that's in the
> small devices that only want 1x1 or 1x2, so maybe it IS worth Intel's
> time/money to keep revving those chips every time they can use a
> smaller process.
Well, power efficiency does make sense for higher-end devices too -
expect that instead of lowering consumption, it should go into higher
TX power at the same consumption level. AFAIK both the 5xxx and 6xxx
series are capped @ 15dBm, while regulatory allows at least 20dBm, and
even more than that in some places.
Also, by creating lots of different non-3-stream devices, Intel is
indirectly discouraging OEMs from using 3-stream technology (because
there is only one 3-stream offering, the 6300, while in the 1- and
2-stream category, there are lots of different designs with different
bells and whistles each). While they did innovate in the high-end
range with the 5300 and the 6300, they went *backwards* in the
mainstream - remember how the 4965 was 3x3:2x2 (antennas/streams),
while its mainstream successor, the 5100, was 1x2:1x2 - 50% upstream
performance loss, plus losing all the benefits of extra antenna
diversity. Even the 6200 is only 2x2:2x2, still weaker than the 4965.
>
> I don't know anything about Intel's internal plans, and this is all my
> own speculation, but ... I'd love to hear what it is you'd like the
> new chip to have that the current ones don't. ?Certainly, no one's
> asking for them to rev the 3945, and I think for good reason. ;).
>
> Dan
>
--
Vista: [V]iruses, [I]ntruders, [S]pyware, [T]rojans and [A]dware. :-)
2011/1/22 Daniel Halperin <[email protected]>:
> 2011/1/21 G?bor Stefanik <[email protected]>:
>> On Sat, Jan 22, 2011 at 1:06 AM, Wey-Yi Guy <[email protected]> wrote:
>>> From: Wey-Yi Guy <[email protected]>
>>>
>>> Adding 2000 series devices supports, the 2000 series devices has
>>> many different SKUs which includes 1x1 and 2x2 devices,also with
>>
>> Is it just me, or is Intel really abandoning 3-stream 802.11n technology?
>
> It's just you. ?They released the 6300 not that long ago! ?But think
> about the market, how many 3-stream APs can you buy today?
Well, there is the Airport Extreme, the D-Link DIR-665 (with a
Marvell-chipped mini-PCI card inside), and also an offering from
Senao.
> Atheros
> still doesn't even have a 3-stream NIC end users can buy (though some
> companies are getting close!), but Intel's had one for nearly 3 years.
>
> There's a lot more room in the market at the low end, and that's where
> it makes sense to put your efforts towards product diversity.
> Manufacturers are looking for chips for printers, phones, netbooks,
> tiny laptops, etc., why would they pay for the silicon for extra
> processing and the design constraints(!) for extra antennas when it's
> not going to get used? ?Heck, a lot of these APs (see, e.g., Apple's
> airport express) only come with 100 Mbps wired ports!
>
> Dan
>
The problem is that what I currently see is that Intel is updating the
basic 2x2 half-mini offering (true, they are also releasing Bluetooth
combos and other new devices, but AFAIK one of the "g2" devices is
exactly the same feature-wise as the Centrino 6200), while the 6300
has not received any update ("released not that long ago"? AFAIK it's
been a year at least since it came out), and the 6350 was cancelled
before release, leaving 5350 without a successor.
From: Johannes Berg <[email protected]>
There are a number of places where the minimum
slot time is hardcoded to 20 TU, add a new
constant for that and use it everywhere.
Signed-off-by: Johannes Berg <[email protected]>
Signed-off-by: Wey-Yi Guy <[email protected]>
---
drivers/net/wireless/iwlwifi/iwl-agn-hcmd.c | 14 +++++++-------
drivers/net/wireless/iwlwifi/iwl-agn.c | 2 +-
drivers/net/wireless/iwlwifi/iwl-commands.h | 5 +++++
3 files changed, 13 insertions(+), 8 deletions(-)
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-hcmd.c b/drivers/net/wireless/iwlwifi/iwl-agn-hcmd.c
index fa6cf2a..41543ad 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn-hcmd.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn-hcmd.c
@@ -308,7 +308,7 @@ static int iwlagn_set_pan_params(struct iwl_priv *priv)
if (priv->_agn.hw_roc_channel) {
/* both contexts must be used for this to happen */
slot1 = priv->_agn.hw_roc_duration;
- slot0 = 20;
+ slot0 = IWL_MIN_SLOT_TIME;
} else if (ctx_bss->vif && ctx_pan->vif) {
int bcnint = ctx_pan->vif->bss_conf.beacon_int;
int dtim = ctx_pan->vif->bss_conf.dtim_period ?: 1;
@@ -334,12 +334,12 @@ static int iwlagn_set_pan_params(struct iwl_priv *priv)
if (test_bit(STATUS_SCAN_HW, &priv->status) ||
(!ctx_bss->vif->bss_conf.idle &&
!ctx_bss->vif->bss_conf.assoc)) {
- slot0 = dtim * bcnint * 3 - 20;
- slot1 = 20;
+ slot0 = dtim * bcnint * 3 - IWL_MIN_SLOT_TIME;
+ slot1 = IWL_MIN_SLOT_TIME;
} else if (!ctx_pan->vif->bss_conf.idle &&
!ctx_pan->vif->bss_conf.assoc) {
- slot1 = bcnint * 3 - 20;
- slot0 = 20;
+ slot1 = bcnint * 3 - IWL_MIN_SLOT_TIME;
+ slot0 = IWL_MIN_SLOT_TIME;
}
} else if (ctx_pan->vif) {
slot0 = 0;
@@ -348,8 +348,8 @@ static int iwlagn_set_pan_params(struct iwl_priv *priv)
slot1 = max_t(int, DEFAULT_BEACON_INTERVAL, slot1);
if (test_bit(STATUS_SCAN_HW, &priv->status)) {
- slot0 = slot1 * 3 - 20;
- slot1 = 20;
+ slot0 = slot1 * 3 - IWL_MIN_SLOT_TIME;
+ slot1 = IWL_MIN_SLOT_TIME;
}
}
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c
index 51e5ea4..02771ef 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
@@ -3792,7 +3792,7 @@ static int iwl_mac_remain_on_channel(struct ieee80211_hw *hw,
queue_delayed_work(priv->workqueue, &priv->_agn.hw_roc_work,
msecs_to_jiffies(duration + 20));
- msleep(20);
+ msleep(IWL_MIN_SLOT_TIME); /* TU is almost ms */
ieee80211_ready_on_channel(priv->hw);
out:
diff --git a/drivers/net/wireless/iwlwifi/iwl-commands.h b/drivers/net/wireless/iwlwifi/iwl-commands.h
index abe2479..935b19e 100644
--- a/drivers/net/wireless/iwlwifi/iwl-commands.h
+++ b/drivers/net/wireless/iwlwifi/iwl-commands.h
@@ -4370,6 +4370,11 @@ int iwl_agn_check_rxon_cmd(struct iwl_priv *priv);
* REPLY_WIPAN_PARAMS = 0xb2 (Commands and Notification)
*/
+/*
+ * Minimum slot time in TU
+ */
+#define IWL_MIN_SLOT_TIME 20
+
/**
* struct iwl_wipan_slot
* @width: Time in TU
--
1.7.0.4
On Sun, 2011-01-23 at 03:25 -0800, Bernhard Schmidt wrote:
> On Saturday 22 January 2011 01:06:39 Wey-Yi Guy wrote:
> > From: Wey-Yi Guy <[email protected]>
> >
> > Adding 2000 series devices supports, the 2000 series devices has
> > many different SKUs which includes 1x1 and 2x2 devices,also with
> > and without BT combo.
> >
> > Signed-off-by: Wey-Yi Guy <[email protected]>
> > [..]
> > +
> > +#define IWL_DEVICE_2030 \
> > + .fw_name_pre = IWL2030_FW_PRE, \
> > + .ucode_api_max = IWL2030_UCODE_API_MAX, \
> > + .ucode_api_min = IWL2030_UCODE_API_MIN, \
> > + .eeprom_ver = EEPROM_2000_EEPROM_VERSION, \
> > + .eeprom_calib_ver = EEPROM_2000_TX_POWER_VERSION, \
> > + .ops = &iwl2030_ops, \
> > + .mod_params = &iwlagn_mod_params, \
> > + .base_params = &iwl2030_base_params, \
> > + .bt_params = &iwl2030_bt_params, \
> > + .need_dc_calib = true, \
> > + .need_temp_offset_calib = true, \
> > + .led_mode = IWL_LED_RF_STATE, \
> > + .adv_pm = true \
> > +
> > +struct iwl_cfg iwl2030_2bgn_cfg = {
> > + .name = "2000 Series 2x2 BGN/BT",
> > + IWL_DEVICE_2000,
> > + .ht_params = &iwl2000_ht_params,
> > +};
> > +
> > +struct iwl_cfg iwl2030_2bg_cfg = {
> > + .name = "2000 Series 2x2 BG/BT",
> > + IWL_DEVICE_2000,
> > +};
>
> Shouldn't these use the IWL_DEVICE_2030 macro?
>
good catch, thank you very much, will submit separated patch to address
it
Wey
From: Wey-Yi Guy <[email protected]>
Adding 2000 series devices supports, the 2000 series devices has
many different SKUs which includes 1x1 and 2x2 devices,also with
and without BT combo.
Signed-off-by: Wey-Yi Guy <[email protected]>
---
drivers/net/wireless/iwlwifi/Makefile | 1 +
drivers/net/wireless/iwlwifi/iwl-2000.c | 556 +++++++++++++++++++++++++++++++
drivers/net/wireless/iwlwifi/iwl-agn.h | 11 +
3 files changed, 568 insertions(+), 0 deletions(-)
create mode 100644 drivers/net/wireless/iwlwifi/iwl-2000.c
diff --git a/drivers/net/wireless/iwlwifi/Makefile b/drivers/net/wireless/iwlwifi/Makefile
index 93380f9..25be742 100644
--- a/drivers/net/wireless/iwlwifi/Makefile
+++ b/drivers/net/wireless/iwlwifi/Makefile
@@ -26,6 +26,7 @@ iwlagn-$(CONFIG_IWL5000) += iwl-agn-rxon.o iwl-agn-hcmd.o iwl-agn-ict.o
iwlagn-$(CONFIG_IWL5000) += iwl-5000.o
iwlagn-$(CONFIG_IWL5000) += iwl-6000.o
iwlagn-$(CONFIG_IWL5000) += iwl-1000.o
+iwlagn-$(CONFIG_IWL5000) += iwl-2000.o
# 3945
obj-$(CONFIG_IWL3945) += iwl3945.o
diff --git a/drivers/net/wireless/iwlwifi/iwl-2000.c b/drivers/net/wireless/iwlwifi/iwl-2000.c
new file mode 100644
index 0000000..3c9e1b5
--- /dev/null
+++ b/drivers/net/wireless/iwlwifi/iwl-2000.c
@@ -0,0 +1,556 @@
+/******************************************************************************
+ *
+ * Copyright(c) 2008 - 2010 Intel Corporation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ * The full GNU General Public License is included in this distribution in the
+ * file called LICENSE.
+ *
+ * Contact Information:
+ * Intel Linux Wireless <[email protected]>
+ * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
+ *
+ *****************************************************************************/
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/pci.h>
+#include <linux/dma-mapping.h>
+#include <linux/delay.h>
+#include <linux/skbuff.h>
+#include <linux/netdevice.h>
+#include <linux/wireless.h>
+#include <net/mac80211.h>
+#include <linux/etherdevice.h>
+#include <asm/unaligned.h>
+
+#include "iwl-eeprom.h"
+#include "iwl-dev.h"
+#include "iwl-core.h"
+#include "iwl-io.h"
+#include "iwl-sta.h"
+#include "iwl-agn.h"
+#include "iwl-helpers.h"
+#include "iwl-agn-hw.h"
+#include "iwl-6000-hw.h"
+#include "iwl-agn-led.h"
+#include "iwl-agn-debugfs.h"
+
+/* Highest firmware API version supported */
+#define IWL2030_UCODE_API_MAX 5
+#define IWL2000_UCODE_API_MAX 5
+#define IWL200_UCODE_API_MAX 5
+
+/* Lowest firmware API version supported */
+#define IWL2030_UCODE_API_MIN 5
+#define IWL2000_UCODE_API_MIN 5
+#define IWL200_UCODE_API_MIN 5
+
+#define IWL2030_FW_PRE "iwlwifi-2030-"
+#define _IWL2030_MODULE_FIRMWARE(api) IWL2030_FW_PRE #api ".ucode"
+#define IWL2030_MODULE_FIRMWARE(api) _IWL2030_MODULE_FIRMWARE(api)
+
+#define IWL2000_FW_PRE "iwlwifi-2000-"
+#define _IWL2000_MODULE_FIRMWARE(api) IWL2000_FW_PRE #api ".ucode"
+#define IWL2000_MODULE_FIRMWARE(api) _IWL2000_MODULE_FIRMWARE(api)
+
+#define IWL200_FW_PRE "iwlwifi-200-"
+#define _IWL200_MODULE_FIRMWARE(api) IWL200_FW_PRE #api ".ucode"
+#define IWL200_MODULE_FIRMWARE(api) _IWL200_MODULE_FIRMWARE(api)
+
+static void iwl2000_set_ct_threshold(struct iwl_priv *priv)
+{
+ /* want Celsius */
+ priv->hw_params.ct_kill_threshold = CT_KILL_THRESHOLD;
+ priv->hw_params.ct_kill_exit_threshold = CT_KILL_EXIT_THRESHOLD;
+}
+
+/* NIC configuration for 2000 series */
+static void iwl2000_nic_config(struct iwl_priv *priv)
+{
+ u16 radio_cfg;
+
+ radio_cfg = iwl_eeprom_query16(priv, EEPROM_RADIO_CONFIG);
+
+ /* write radio config values to register */
+ if (EEPROM_RF_CFG_TYPE_MSK(radio_cfg) <= EEPROM_RF_CONFIG_TYPE_MAX)
+ iwl_set_bit(priv, CSR_HW_IF_CONFIG_REG,
+ EEPROM_RF_CFG_TYPE_MSK(radio_cfg) |
+ EEPROM_RF_CFG_STEP_MSK(radio_cfg) |
+ EEPROM_RF_CFG_DASH_MSK(radio_cfg));
+
+ /* set CSR_HW_CONFIG_REG for uCode use */
+ iwl_set_bit(priv, CSR_HW_IF_CONFIG_REG,
+ CSR_HW_IF_CONFIG_REG_BIT_RADIO_SI |
+ CSR_HW_IF_CONFIG_REG_BIT_MAC_SI);
+
+}
+
+static struct iwl_sensitivity_ranges iwl2000_sensitivity = {
+ .min_nrg_cck = 97,
+ .max_nrg_cck = 0, /* not used, set to 0 */
+ .auto_corr_min_ofdm = 80,
+ .auto_corr_min_ofdm_mrc = 128,
+ .auto_corr_min_ofdm_x1 = 105,
+ .auto_corr_min_ofdm_mrc_x1 = 192,
+
+ .auto_corr_max_ofdm = 145,
+ .auto_corr_max_ofdm_mrc = 232,
+ .auto_corr_max_ofdm_x1 = 110,
+ .auto_corr_max_ofdm_mrc_x1 = 232,
+
+ .auto_corr_min_cck = 125,
+ .auto_corr_max_cck = 175,
+ .auto_corr_min_cck_mrc = 160,
+ .auto_corr_max_cck_mrc = 310,
+ .nrg_th_cck = 97,
+ .nrg_th_ofdm = 100,
+
+ .barker_corr_th_min = 190,
+ .barker_corr_th_min_mrc = 390,
+ .nrg_th_cca = 62,
+};
+
+static int iwl2000_hw_set_hw_params(struct iwl_priv *priv)
+{
+ if (priv->cfg->mod_params->num_of_queues >= IWL_MIN_NUM_QUEUES &&
+ priv->cfg->mod_params->num_of_queues <= IWLAGN_NUM_QUEUES)
+ priv->cfg->base_params->num_of_queues =
+ priv->cfg->mod_params->num_of_queues;
+
+ priv->hw_params.max_txq_num = priv->cfg->base_params->num_of_queues;
+ priv->hw_params.dma_chnl_num = FH50_TCSR_CHNL_NUM;
+ priv->hw_params.scd_bc_tbls_size =
+ priv->cfg->base_params->num_of_queues *
+ sizeof(struct iwlagn_scd_bc_tbl);
+ priv->hw_params.tfd_size = sizeof(struct iwl_tfd);
+ priv->hw_params.max_stations = IWLAGN_STATION_COUNT;
+ priv->contexts[IWL_RXON_CTX_BSS].bcast_sta_id = IWLAGN_BROADCAST_ID;
+
+ priv->hw_params.max_data_size = IWL60_RTC_DATA_SIZE;
+ priv->hw_params.max_inst_size = IWL60_RTC_INST_SIZE;
+
+ priv->hw_params.max_bsm_size = 0;
+ priv->hw_params.ht40_channel = BIT(IEEE80211_BAND_2GHZ) |
+ BIT(IEEE80211_BAND_5GHZ);
+ priv->hw_params.rx_wrt_ptr_reg = FH_RSCSR_CHNL0_WPTR;
+
+ priv->hw_params.tx_chains_num = num_of_ant(priv->cfg->valid_tx_ant);
+ if (priv->cfg->rx_with_siso_diversity)
+ priv->hw_params.rx_chains_num = 1;
+ else
+ priv->hw_params.rx_chains_num =
+ num_of_ant(priv->cfg->valid_rx_ant);
+ priv->hw_params.valid_tx_ant = priv->cfg->valid_tx_ant;
+ priv->hw_params.valid_rx_ant = priv->cfg->valid_rx_ant;
+
+ iwl2000_set_ct_threshold(priv);
+
+ /* Set initial sensitivity parameters */
+ /* Set initial calibration set */
+ priv->hw_params.sens = &iwl2000_sensitivity;
+ priv->hw_params.calib_init_cfg =
+ BIT(IWL_CALIB_XTAL) |
+ BIT(IWL_CALIB_LO) |
+ BIT(IWL_CALIB_TX_IQ) |
+ BIT(IWL_CALIB_BASE_BAND);
+ if (priv->cfg->need_dc_calib)
+ priv->hw_params.calib_rt_cfg |= BIT(IWL_CALIB_CFG_DC_IDX);
+ if (priv->cfg->need_temp_offset_calib)
+ priv->hw_params.calib_init_cfg |= BIT(IWL_CALIB_TEMP_OFFSET);
+
+ priv->hw_params.beacon_time_tsf_bits = IWLAGN_EXT_BEACON_TIME_POS;
+
+ return 0;
+}
+
+static int iwl2030_hw_channel_switch(struct iwl_priv *priv,
+ struct ieee80211_channel_switch *ch_switch)
+{
+ /*
+ * MULTI-FIXME
+ * See iwl_mac_channel_switch.
+ */
+ struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_BSS];
+ struct iwl6000_channel_switch_cmd cmd;
+ const struct iwl_channel_info *ch_info;
+ u32 switch_time_in_usec, ucode_switch_time;
+ u16 ch;
+ u32 tsf_low;
+ u8 switch_count;
+ u16 beacon_interval = le16_to_cpu(ctx->timing.beacon_interval);
+ struct ieee80211_vif *vif = ctx->vif;
+ struct iwl_host_cmd hcmd = {
+ .id = REPLY_CHANNEL_SWITCH,
+ .len = sizeof(cmd),
+ .flags = CMD_SYNC,
+ .data = &cmd,
+ };
+
+ cmd.band = priv->band == IEEE80211_BAND_2GHZ;
+ ch = ch_switch->channel->hw_value;
+ IWL_DEBUG_11H(priv, "channel switch from %u to %u\n",
+ ctx->active.channel, ch);
+ cmd.channel = cpu_to_le16(ch);
+ cmd.rxon_flags = ctx->staging.flags;
+ cmd.rxon_filter_flags = ctx->staging.filter_flags;
+ switch_count = ch_switch->count;
+ tsf_low = ch_switch->timestamp & 0x0ffffffff;
+ /*
+ * calculate the ucode channel switch time
+ * adding TSF as one of the factor for when to switch
+ */
+ if ((priv->ucode_beacon_time > tsf_low) && beacon_interval) {
+ if (switch_count > ((priv->ucode_beacon_time - tsf_low) /
+ beacon_interval)) {
+ switch_count -= (priv->ucode_beacon_time -
+ tsf_low) / beacon_interval;
+ } else
+ switch_count = 0;
+ }
+ if (switch_count <= 1)
+ cmd.switch_time = cpu_to_le32(priv->ucode_beacon_time);
+ else {
+ switch_time_in_usec =
+ vif->bss_conf.beacon_int * switch_count * TIME_UNIT;
+ ucode_switch_time = iwl_usecs_to_beacons(priv,
+ switch_time_in_usec,
+ beacon_interval);
+ cmd.switch_time = iwl_add_beacon_time(priv,
+ priv->ucode_beacon_time,
+ ucode_switch_time,
+ beacon_interval);
+ }
+ IWL_DEBUG_11H(priv, "uCode time for the switch is 0x%x\n",
+ cmd.switch_time);
+ ch_info = iwl_get_channel_info(priv, priv->band, ch);
+ if (ch_info)
+ cmd.expect_beacon = is_channel_radar(ch_info);
+ else {
+ IWL_ERR(priv, "invalid channel switch from %u to %u\n",
+ ctx->active.channel, ch);
+ return -EFAULT;
+ }
+ priv->switch_rxon.channel = cmd.channel;
+ priv->switch_rxon.switch_in_progress = true;
+
+ return iwl_send_cmd_sync(priv, &hcmd);
+}
+
+static struct iwl_lib_ops iwl2000_lib = {
+ .set_hw_params = iwl2000_hw_set_hw_params,
+ .txq_update_byte_cnt_tbl = iwlagn_txq_update_byte_cnt_tbl,
+ .txq_inval_byte_cnt_tbl = iwlagn_txq_inval_byte_cnt_tbl,
+ .txq_set_sched = iwlagn_txq_set_sched,
+ .txq_agg_enable = iwlagn_txq_agg_enable,
+ .txq_agg_disable = iwlagn_txq_agg_disable,
+ .txq_attach_buf_to_tfd = iwl_hw_txq_attach_buf_to_tfd,
+ .txq_free_tfd = iwl_hw_txq_free_tfd,
+ .txq_init = iwl_hw_tx_queue_init,
+ .rx_handler_setup = iwlagn_rx_handler_setup,
+ .setup_deferred_work = iwlagn_setup_deferred_work,
+ .is_valid_rtc_data_addr = iwlagn_hw_valid_rtc_data_addr,
+ .load_ucode = iwlagn_load_ucode,
+ .dump_nic_event_log = iwl_dump_nic_event_log,
+ .dump_nic_error_log = iwl_dump_nic_error_log,
+ .dump_csr = iwl_dump_csr,
+ .dump_fh = iwl_dump_fh,
+ .init_alive_start = iwlagn_init_alive_start,
+ .alive_notify = iwlagn_alive_notify,
+ .send_tx_power = iwlagn_send_tx_power,
+ .update_chain_flags = iwl_update_chain_flags,
+ .set_channel_switch = iwl2030_hw_channel_switch,
+ .apm_ops = {
+ .init = iwl_apm_init,
+ .config = iwl2000_nic_config,
+ },
+ .eeprom_ops = {
+ .regulatory_bands = {
+ EEPROM_REG_BAND_1_CHANNELS,
+ EEPROM_REG_BAND_2_CHANNELS,
+ EEPROM_REG_BAND_3_CHANNELS,
+ EEPROM_REG_BAND_4_CHANNELS,
+ EEPROM_REG_BAND_5_CHANNELS,
+ EEPROM_6000_REG_BAND_24_HT40_CHANNELS,
+ EEPROM_REG_BAND_52_HT40_CHANNELS
+ },
+ .acquire_semaphore = iwlcore_eeprom_acquire_semaphore,
+ .release_semaphore = iwlcore_eeprom_release_semaphore,
+ .calib_version = iwlagn_eeprom_calib_version,
+ .query_addr = iwlagn_eeprom_query_addr,
+ .update_enhanced_txpower = iwlcore_eeprom_enhanced_txpower,
+ },
+ .isr_ops = {
+ .isr = iwl_isr_ict,
+ .free = iwl_free_isr_ict,
+ .alloc = iwl_alloc_isr_ict,
+ .reset = iwl_reset_ict,
+ .disable = iwl_disable_ict,
+ },
+ .temp_ops = {
+ .temperature = iwlagn_temperature,
+ },
+ .debugfs_ops = {
+ .rx_stats_read = iwl_ucode_rx_stats_read,
+ .tx_stats_read = iwl_ucode_tx_stats_read,
+ .general_stats_read = iwl_ucode_general_stats_read,
+ .bt_stats_read = iwl_ucode_bt_stats_read,
+ .reply_tx_error = iwl_reply_tx_error_read,
+ },
+ .check_plcp_health = iwl_good_plcp_health,
+ .check_ack_health = iwl_good_ack_health,
+ .txfifo_flush = iwlagn_txfifo_flush,
+ .dev_txfifo_flush = iwlagn_dev_txfifo_flush,
+ .tt_ops = {
+ .lower_power_detection = iwl_tt_is_low_power_state,
+ .tt_power_mode = iwl_tt_current_power_mode,
+ .ct_kill_check = iwl_check_for_ct_kill,
+ }
+};
+
+static const struct iwl_ops iwl2000_ops = {
+ .lib = &iwl2000_lib,
+ .hcmd = &iwlagn_hcmd,
+ .utils = &iwlagn_hcmd_utils,
+ .led = &iwlagn_led_ops,
+ .ieee80211_ops = &iwlagn_hw_ops,
+};
+
+static const struct iwl_ops iwl2030_ops = {
+ .lib = &iwl2000_lib,
+ .hcmd = &iwlagn_bt_hcmd,
+ .utils = &iwlagn_hcmd_utils,
+ .led = &iwlagn_led_ops,
+ .ieee80211_ops = &iwlagn_hw_ops,
+};
+
+static const struct iwl_ops iwl200_ops = {
+ .lib = &iwl2000_lib,
+ .hcmd = &iwlagn_hcmd,
+ .utils = &iwlagn_hcmd_utils,
+ .led = &iwlagn_led_ops,
+ .ieee80211_ops = &iwlagn_hw_ops,
+};
+
+static const struct iwl_ops iwl230_ops = {
+ .lib = &iwl2000_lib,
+ .hcmd = &iwlagn_bt_hcmd,
+ .utils = &iwlagn_hcmd_utils,
+ .led = &iwlagn_led_ops,
+ .ieee80211_ops = &iwlagn_hw_ops,
+};
+
+static struct iwl_base_params iwl2000_base_params = {
+ .eeprom_size = OTP_LOW_IMAGE_SIZE,
+ .num_of_queues = IWLAGN_NUM_QUEUES,
+ .num_of_ampdu_queues = IWLAGN_NUM_AMPDU_QUEUES,
+ .pll_cfg_val = 0,
+ .set_l0s = true,
+ .use_bsm = false,
+ .max_ll_items = OTP_MAX_LL_ITEMS_2x00,
+ .shadow_ram_support = true,
+ .led_compensation = 51,
+ .chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
+ .supports_idle = true,
+ .adv_thermal_throttle = true,
+ .support_ct_kill_exit = true,
+ .plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
+ .chain_noise_scale = 1000,
+ .wd_timeout = IWL_DEF_WD_TIMEOUT,
+ .max_event_log_size = 512,
+ .ucode_tracing = true,
+ .sensitivity_calib_by_driver = true,
+ .chain_noise_calib_by_driver = true,
+ .shadow_reg_enable = true,
+};
+
+
+static struct iwl_base_params iwl2030_base_params = {
+ .eeprom_size = OTP_LOW_IMAGE_SIZE,
+ .num_of_queues = IWLAGN_NUM_QUEUES,
+ .num_of_ampdu_queues = IWLAGN_NUM_AMPDU_QUEUES,
+ .pll_cfg_val = 0,
+ .set_l0s = true,
+ .use_bsm = false,
+ .max_ll_items = OTP_MAX_LL_ITEMS_2x00,
+ .shadow_ram_support = true,
+ .led_compensation = 57,
+ .chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
+ .supports_idle = true,
+ .adv_thermal_throttle = true,
+ .support_ct_kill_exit = true,
+ .plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
+ .chain_noise_scale = 1000,
+ .wd_timeout = IWL_LONG_WD_TIMEOUT,
+ .max_event_log_size = 512,
+ .ucode_tracing = true,
+ .sensitivity_calib_by_driver = true,
+ .chain_noise_calib_by_driver = true,
+ .shadow_reg_enable = true,
+};
+
+static struct iwl_ht_params iwl2000_ht_params = {
+ .ht_greenfield_support = true,
+ .use_rts_for_aggregation = true, /* use rts/cts protection */
+};
+
+static struct iwl_bt_params iwl2030_bt_params = {
+ .bt_statistics = true,
+ /* Due to bluetooth, we transmit 2.4 GHz probes only on antenna A */
+ .advanced_bt_coexist = true,
+ .agg_time_limit = BT_AGG_THRESHOLD_DEF,
+ .bt_init_traffic_load = IWL_BT_COEX_TRAFFIC_LOAD_NONE,
+ .bt_prio_boost = IWLAGN_BT_PRIO_BOOST_DEFAULT,
+ .bt_sco_disable = true,
+};
+
+#define IWL_DEVICE_2000 \
+ .fw_name_pre = IWL2000_FW_PRE, \
+ .ucode_api_max = IWL2000_UCODE_API_MAX, \
+ .ucode_api_min = IWL2000_UCODE_API_MIN, \
+ .eeprom_ver = EEPROM_2000_EEPROM_VERSION, \
+ .eeprom_calib_ver = EEPROM_2000_TX_POWER_VERSION, \
+ .ops = &iwl2000_ops, \
+ .mod_params = &iwlagn_mod_params, \
+ .base_params = &iwl2000_base_params, \
+ .need_dc_calib = true, \
+ .need_temp_offset_calib = true, \
+ .led_mode = IWL_LED_RF_STATE \
+
+struct iwl_cfg iwl2000_2bgn_cfg = {
+ .name = "2000 Series 2x2 BGN",
+ IWL_DEVICE_2000,
+ .ht_params = &iwl2000_ht_params,
+};
+
+struct iwl_cfg iwl2000_2bg_cfg = {
+ .name = "2000 Series 2x2 BG",
+ IWL_DEVICE_2000,
+};
+
+#define IWL_DEVICE_2030 \
+ .fw_name_pre = IWL2030_FW_PRE, \
+ .ucode_api_max = IWL2030_UCODE_API_MAX, \
+ .ucode_api_min = IWL2030_UCODE_API_MIN, \
+ .eeprom_ver = EEPROM_2000_EEPROM_VERSION, \
+ .eeprom_calib_ver = EEPROM_2000_TX_POWER_VERSION, \
+ .ops = &iwl2030_ops, \
+ .mod_params = &iwlagn_mod_params, \
+ .base_params = &iwl2030_base_params, \
+ .bt_params = &iwl2030_bt_params, \
+ .need_dc_calib = true, \
+ .need_temp_offset_calib = true, \
+ .led_mode = IWL_LED_RF_STATE, \
+ .adv_pm = true \
+
+struct iwl_cfg iwl2030_2bgn_cfg = {
+ .name = "2000 Series 2x2 BGN/BT",
+ IWL_DEVICE_2000,
+ .ht_params = &iwl2000_ht_params,
+};
+
+struct iwl_cfg iwl2030_2bg_cfg = {
+ .name = "2000 Series 2x2 BG/BT",
+ IWL_DEVICE_2000,
+};
+
+#define IWL_DEVICE_6035 \
+ .fw_name_pre = IWL2030_FW_PRE, \
+ .ucode_api_max = IWL2030_UCODE_API_MAX, \
+ .ucode_api_min = IWL2030_UCODE_API_MIN, \
+ .eeprom_ver = EEPROM_6035_EEPROM_VERSION, \
+ .eeprom_calib_ver = EEPROM_6035_TX_POWER_VERSION, \
+ .ops = &iwl2030_ops, \
+ .mod_params = &iwlagn_mod_params, \
+ .base_params = &iwl2030_base_params, \
+ .bt_params = &iwl2030_bt_params, \
+ .need_dc_calib = true, \
+ .need_temp_offset_calib = true, \
+ .led_mode = IWL_LED_RF_STATE, \
+ .adv_pm = true \
+
+struct iwl_cfg iwl6035_2agn_cfg = {
+ .name = "2000 Series 2x2 AGN/BT",
+ IWL_DEVICE_6035,
+ .ht_params = &iwl2000_ht_params,
+};
+
+struct iwl_cfg iwl6035_2abg_cfg = {
+ .name = "2000 Series 2x2 ABG/BT",
+ IWL_DEVICE_6035,
+};
+
+struct iwl_cfg iwl6035_2bg_cfg = {
+ .name = "2000 Series 2x2 BG/BT",
+ IWL_DEVICE_6035,
+};
+
+#define IWL_DEVICE_200 \
+ .fw_name_pre = IWL200_FW_PRE, \
+ .ucode_api_max = IWL200_UCODE_API_MAX, \
+ .ucode_api_min = IWL200_UCODE_API_MIN, \
+ .eeprom_ver = EEPROM_2000_EEPROM_VERSION, \
+ .eeprom_calib_ver = EEPROM_2000_TX_POWER_VERSION, \
+ .ops = &iwl200_ops, \
+ .mod_params = &iwlagn_mod_params, \
+ .base_params = &iwl2000_base_params, \
+ .need_dc_calib = true, \
+ .need_temp_offset_calib = true, \
+ .led_mode = IWL_LED_RF_STATE, \
+ .adv_pm = true, \
+ .rx_with_siso_diversity = true \
+
+struct iwl_cfg iwl200_bg_cfg = {
+ .name = "200 Series 1x1 BG",
+ IWL_DEVICE_200,
+};
+
+struct iwl_cfg iwl200_bgn_cfg = {
+ .name = "200 Series 1x1 BGN",
+ IWL_DEVICE_200,
+ .ht_params = &iwl2000_ht_params,
+};
+
+#define IWL_DEVICE_230 \
+ .fw_name_pre = IWL200_FW_PRE, \
+ .ucode_api_max = IWL200_UCODE_API_MAX, \
+ .ucode_api_min = IWL200_UCODE_API_MIN, \
+ .eeprom_ver = EEPROM_2000_EEPROM_VERSION, \
+ .eeprom_calib_ver = EEPROM_2000_TX_POWER_VERSION, \
+ .ops = &iwl230_ops, \
+ .mod_params = &iwlagn_mod_params, \
+ .base_params = &iwl2030_base_params, \
+ .bt_params = &iwl2030_bt_params, \
+ .need_dc_calib = true, \
+ .need_temp_offset_calib = true, \
+ .led_mode = IWL_LED_RF_STATE, \
+ .adv_pm = true, \
+ .rx_with_siso_diversity = true \
+
+struct iwl_cfg iwl230_bg_cfg = {
+ .name = "200 Series 1x1 BG/BT",
+ IWL_DEVICE_230,
+};
+
+struct iwl_cfg iwl230_bgn_cfg = {
+ .name = "200 Series 1x1 BGN/BT",
+ IWL_DEVICE_230,
+ .ht_params = &iwl2000_ht_params,
+};
+
+MODULE_FIRMWARE(IWL2000_MODULE_FIRMWARE(IWL2000_UCODE_API_MAX));
+MODULE_FIRMWARE(IWL2030_MODULE_FIRMWARE(IWL2030_UCODE_API_MAX));
+MODULE_FIRMWARE(IWL200_MODULE_FIRMWARE(IWL200_UCODE_API_MAX));
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.h b/drivers/net/wireless/iwlwifi/iwl-agn.h
index 74d72ff..d00e1ea 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn.h
+++ b/drivers/net/wireless/iwlwifi/iwl-agn.h
@@ -96,6 +96,17 @@ extern struct iwl_cfg iwl100_bgn_cfg;
extern struct iwl_cfg iwl100_bg_cfg;
extern struct iwl_cfg iwl130_bgn_cfg;
extern struct iwl_cfg iwl130_bg_cfg;
+extern struct iwl_cfg iwl2000_2bgn_cfg;
+extern struct iwl_cfg iwl2000_2bg_cfg;
+extern struct iwl_cfg iwl2030_2bgn_cfg;
+extern struct iwl_cfg iwl2030_2bg_cfg;
+extern struct iwl_cfg iwl6035_2agn_cfg;
+extern struct iwl_cfg iwl6035_2abg_cfg;
+extern struct iwl_cfg iwl6035_2bg_cfg;
+extern struct iwl_cfg iwl200_bg_cfg;
+extern struct iwl_cfg iwl200_bgn_cfg;
+extern struct iwl_cfg iwl230_bg_cfg;
+extern struct iwl_cfg iwl230_bgn_cfg;
extern struct iwl_mod_params iwlagn_mod_params;
extern struct iwl_hcmd_ops iwlagn_hcmd;
--
1.7.0.4
From: Wey-Yi Guy <[email protected]>
Remove refernce of g2 and use offical number for hw rev.
Signed-off-by: Wey-Yi Guy <[email protected]>
---
drivers/net/wireless/iwlwifi/iwl-csr.h | 5 +++--
1 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/drivers/net/wireless/iwlwifi/iwl-csr.h b/drivers/net/wireless/iwlwifi/iwl-csr.h
index b80bf7d..cb77c0f 100644
--- a/drivers/net/wireless/iwlwifi/iwl-csr.h
+++ b/drivers/net/wireless/iwlwifi/iwl-csr.h
@@ -300,8 +300,9 @@
#define CSR_HW_REV_TYPE_1000 (0x0000060)
#define CSR_HW_REV_TYPE_6x00 (0x0000070)
#define CSR_HW_REV_TYPE_6x50 (0x0000080)
-#define CSR_HW_REV_TYPE_6x50g2 (0x0000084)
-#define CSR_HW_REV_TYPE_6x00g2 (0x00000B0)
+#define CSR_HW_REV_TYPE_6150 (0x0000084)
+#define CSR_HW_REV_TYPE_6x05 (0x00000B0)
+#define CSR_HW_REV_TYPE_6x30 CSR_HW_REV_TYPE_6x05
#define CSR_HW_REV_TYPE_NONE (0x00000F0)
/* EEPROM REG */
--
1.7.0.4
That should have
From: Johannes Berg <[email protected]>
:-)
> Instead of keeping track of LED blink speed
> in the driver, use the new mac80211 trigger
> and link it up with an LED classdev that we
> now register. This also allows users more
> flexibility in how they want to have the LED
> blink or not.
>
> Signed-off-by: Johannes Berg <[email protected]>
> Signed-off-by: Wey-Yi Guy <[email protected]>
...
From: Wey-Yi Guy <[email protected]>
Add PCI ID supports for all 2000 series devices
Signed-off-by: Wey-Yi Guy <[email protected]>
---
drivers/net/wireless/iwlwifi/iwl-agn.c | 43 ++++++++++++++++++++++++++++++++
1 files changed, 43 insertions(+), 0 deletions(-)
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c
index 9240abf..dad9a63 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
@@ -4512,6 +4512,49 @@ static DEFINE_PCI_DEVICE_TABLE(iwl_hw_card_ids) = {
{IWL_PCI_DEVICE(0x0896, 0x5025, iwl130_bgn_cfg)},
{IWL_PCI_DEVICE(0x0896, 0x5027, iwl130_bg_cfg)},
+/* 2x00 Series */
+ {IWL_PCI_DEVICE(0x0890, 0x4022, iwl2000_2bgn_cfg)},
+ {IWL_PCI_DEVICE(0x0891, 0x4222, iwl2000_2bgn_cfg)},
+ {IWL_PCI_DEVICE(0x0890, 0x4422, iwl2000_2bgn_cfg)},
+ {IWL_PCI_DEVICE(0x0890, 0x4026, iwl2000_2bg_cfg)},
+ {IWL_PCI_DEVICE(0x0891, 0x4226, iwl2000_2bg_cfg)},
+ {IWL_PCI_DEVICE(0x0890, 0x4426, iwl2000_2bg_cfg)},
+
+/* 2x30 Series */
+ {IWL_PCI_DEVICE(0x0887, 0x4062, iwl2030_2bgn_cfg)},
+ {IWL_PCI_DEVICE(0x0888, 0x4262, iwl2030_2bgn_cfg)},
+ {IWL_PCI_DEVICE(0x0887, 0x4462, iwl2030_2bgn_cfg)},
+ {IWL_PCI_DEVICE(0x0887, 0x4066, iwl2030_2bg_cfg)},
+ {IWL_PCI_DEVICE(0x0888, 0x4266, iwl2030_2bg_cfg)},
+ {IWL_PCI_DEVICE(0x0887, 0x4466, iwl2030_2bg_cfg)},
+
+/* 6x35 Series */
+ {IWL_PCI_DEVICE(0x088E, 0x4060, iwl6035_2agn_cfg)},
+ {IWL_PCI_DEVICE(0x088F, 0x4260, iwl6035_2agn_cfg)},
+ {IWL_PCI_DEVICE(0x088E, 0x4460, iwl6035_2agn_cfg)},
+ {IWL_PCI_DEVICE(0x088E, 0x4064, iwl6035_2abg_cfg)},
+ {IWL_PCI_DEVICE(0x088F, 0x4264, iwl6035_2abg_cfg)},
+ {IWL_PCI_DEVICE(0x088E, 0x4464, iwl6035_2abg_cfg)},
+ {IWL_PCI_DEVICE(0x088E, 0x4066, iwl6035_2bg_cfg)},
+ {IWL_PCI_DEVICE(0x088F, 0x4266, iwl6035_2bg_cfg)},
+ {IWL_PCI_DEVICE(0x088E, 0x4466, iwl6035_2bg_cfg)},
+
+/* 200 Series */
+ {IWL_PCI_DEVICE(0x0894, 0x0022, iwl200_bgn_cfg)},
+ {IWL_PCI_DEVICE(0x0895, 0x0222, iwl200_bgn_cfg)},
+ {IWL_PCI_DEVICE(0x0894, 0x0422, iwl200_bgn_cfg)},
+ {IWL_PCI_DEVICE(0x0894, 0x0026, iwl200_bg_cfg)},
+ {IWL_PCI_DEVICE(0x0895, 0x0226, iwl200_bg_cfg)},
+ {IWL_PCI_DEVICE(0x0894, 0x0426, iwl200_bg_cfg)},
+
+/* 230 Series */
+ {IWL_PCI_DEVICE(0x0892, 0x0062, iwl230_bgn_cfg)},
+ {IWL_PCI_DEVICE(0x0893, 0x0262, iwl230_bgn_cfg)},
+ {IWL_PCI_DEVICE(0x0892, 0x0462, iwl230_bgn_cfg)},
+ {IWL_PCI_DEVICE(0x0892, 0x0066, iwl230_bg_cfg)},
+ {IWL_PCI_DEVICE(0x0893, 0x0266, iwl230_bg_cfg)},
+ {IWL_PCI_DEVICE(0x0892, 0x0466, iwl230_bg_cfg)},
+
#endif /* CONFIG_IWL5000 */
{0}
--
1.7.0.4
On Saturday 22 January 2011 01:06:39 Wey-Yi Guy wrote:
> From: Wey-Yi Guy <[email protected]>
>
> Adding 2000 series devices supports, the 2000 series devices has
> many different SKUs which includes 1x1 and 2x2 devices,also with
> and without BT combo.
>
> Signed-off-by: Wey-Yi Guy <[email protected]>
> [..]
> +
> +#define IWL_DEVICE_2030 \
> + .fw_name_pre = IWL2030_FW_PRE, \
> + .ucode_api_max = IWL2030_UCODE_API_MAX, \
> + .ucode_api_min = IWL2030_UCODE_API_MIN, \
> + .eeprom_ver = EEPROM_2000_EEPROM_VERSION, \
> + .eeprom_calib_ver = EEPROM_2000_TX_POWER_VERSION, \
> + .ops = &iwl2030_ops, \
> + .mod_params = &iwlagn_mod_params, \
> + .base_params = &iwl2030_base_params, \
> + .bt_params = &iwl2030_bt_params, \
> + .need_dc_calib = true, \
> + .need_temp_offset_calib = true, \
> + .led_mode = IWL_LED_RF_STATE, \
> + .adv_pm = true \
> +
> +struct iwl_cfg iwl2030_2bgn_cfg = {
> + .name = "2000 Series 2x2 BGN/BT",
> + IWL_DEVICE_2000,
> + .ht_params = &iwl2000_ht_params,
> +};
> +
> +struct iwl_cfg iwl2030_2bg_cfg = {
> + .name = "2000 Series 2x2 BG/BT",
> + IWL_DEVICE_2000,
> +};
Shouldn't these use the IWL_DEVICE_2030 macro?
--
Bernhard
From: Wey-Yi Guy <[email protected]>
Add 2000 series support to Kconfig
Signed-off-by: Wey-Yi Guy <[email protected]>
---
drivers/net/wireless/iwlwifi/Kconfig | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
diff --git a/drivers/net/wireless/iwlwifi/Kconfig b/drivers/net/wireless/iwlwifi/Kconfig
index 8994d30..442a146 100644
--- a/drivers/net/wireless/iwlwifi/Kconfig
+++ b/drivers/net/wireless/iwlwifi/Kconfig
@@ -113,6 +113,7 @@ config IWL5000
Intel 6000 Gen 2 Series Wi-Fi Adapters (6000G2A and 6000G2B)
Intel WIreless WiFi Link 6050BGN Gen 2 Adapter
Intel 100 Series Wi-Fi Adapters (100BGN and 130BGN)
+ Intel 2000 Series Wi-Fi Adapters
config IWL3945
tristate "Intel PRO/Wireless 3945ABG/BG Network Connection (iwl3945)"
--
1.7.0.4
Instead of keeping track of LED blink speed
in the driver, use the new mac80211 trigger
and link it up with an LED classdev that we
now register. This also allows users more
flexibility in how they want to have the LED
blink or not.
Signed-off-by: Johannes Berg <[email protected]>
Signed-off-by: Wey-Yi Guy <[email protected]>
---
drivers/net/wireless/iwlwifi/Kconfig | 4 +
drivers/net/wireless/iwlwifi/iwl-3945-led.c | 27 ----
drivers/net/wireless/iwlwifi/iwl-agn-led.c | 14 +--
drivers/net/wireless/iwlwifi/iwl-agn-led.h | 1 +
drivers/net/wireless/iwlwifi/iwl-agn-rxon.c | 2 -
drivers/net/wireless/iwlwifi/iwl-agn.c | 10 +-
drivers/net/wireless/iwlwifi/iwl-core.c | 2 -
drivers/net/wireless/iwlwifi/iwl-core.h | 14 --
drivers/net/wireless/iwlwifi/iwl-debugfs.c | 25 ----
drivers/net/wireless/iwlwifi/iwl-dev.h | 18 +--
drivers/net/wireless/iwlwifi/iwl-led.c | 201 +++++++++++----------------
drivers/net/wireless/iwlwifi/iwl-led.h | 16 +--
drivers/net/wireless/iwlwifi/iwl-legacy.c | 4 -
drivers/net/wireless/iwlwifi/iwl3945-base.c | 8 +-
14 files changed, 106 insertions(+), 240 deletions(-)
diff --git a/drivers/net/wireless/iwlwifi/Kconfig b/drivers/net/wireless/iwlwifi/Kconfig
index ed42457..8994d30 100644
--- a/drivers/net/wireless/iwlwifi/Kconfig
+++ b/drivers/net/wireless/iwlwifi/Kconfig
@@ -2,6 +2,10 @@ config IWLWIFI
tristate "Intel Wireless Wifi"
depends on PCI && MAC80211
select FW_LOADER
+ select NEW_LEDS
+ select LEDS_CLASS
+ select LEDS_TRIGGERS
+ select MAC80211_LEDS
menu "Debugging Options"
depends on IWLWIFI
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945-led.c b/drivers/net/wireless/iwlwifi/iwl-3945-led.c
index abe2b73..dc7c3a4 100644
--- a/drivers/net/wireless/iwlwifi/iwl-3945-led.c
+++ b/drivers/net/wireless/iwlwifi/iwl-3945-led.c
@@ -59,33 +59,6 @@ static int iwl3945_send_led_cmd(struct iwl_priv *priv,
return iwl_send_cmd(priv, &cmd);
}
-/* Set led on command */
-static int iwl3945_led_on(struct iwl_priv *priv)
-{
- struct iwl_led_cmd led_cmd = {
- .id = IWL_LED_LINK,
- .on = IWL_LED_SOLID,
- .off = 0,
- .interval = IWL_DEF_LED_INTRVL
- };
- return iwl3945_send_led_cmd(priv, &led_cmd);
-}
-
-/* Set led off command */
-static int iwl3945_led_off(struct iwl_priv *priv)
-{
- struct iwl_led_cmd led_cmd = {
- .id = IWL_LED_LINK,
- .on = 0,
- .off = 0,
- .interval = IWL_DEF_LED_INTRVL
- };
- IWL_DEBUG_LED(priv, "led off\n");
- return iwl3945_send_led_cmd(priv, &led_cmd);
-}
-
const struct iwl_led_ops iwl3945_led_ops = {
.cmd = iwl3945_send_led_cmd,
- .on = iwl3945_led_on,
- .off = iwl3945_led_off,
};
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-led.c b/drivers/net/wireless/iwlwifi/iwl-agn-led.c
index 1a24946..c1190d9 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn-led.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn-led.c
@@ -63,23 +63,11 @@ static int iwl_send_led_cmd(struct iwl_priv *priv, struct iwl_led_cmd *led_cmd)
}
/* Set led register off */
-static int iwl_led_on_reg(struct iwl_priv *priv)
+void iwlagn_led_enable(struct iwl_priv *priv)
{
- IWL_DEBUG_LED(priv, "led on\n");
iwl_write32(priv, CSR_LED_REG, CSR_LED_REG_TRUN_ON);
- return 0;
-}
-
-/* Set led register off */
-static int iwl_led_off_reg(struct iwl_priv *priv)
-{
- IWL_DEBUG_LED(priv, "LED Reg off\n");
- iwl_write32(priv, CSR_LED_REG, CSR_LED_REG_TRUN_OFF);
- return 0;
}
const struct iwl_led_ops iwlagn_led_ops = {
.cmd = iwl_send_led_cmd,
- .on = iwl_led_on_reg,
- .off = iwl_led_off_reg,
};
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-led.h b/drivers/net/wireless/iwlwifi/iwl-agn-led.h
index a594e4f..96f323d 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn-led.h
+++ b/drivers/net/wireless/iwlwifi/iwl-agn-led.h
@@ -28,5 +28,6 @@
#define __iwl_agn_led_h__
extern const struct iwl_led_ops iwlagn_led_ops;
+void iwlagn_led_enable(struct iwl_priv *priv);
#endif /* __iwl_agn_led_h__ */
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-rxon.c b/drivers/net/wireless/iwlwifi/iwl-agn-rxon.c
index 6e80f10..f693293 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn-rxon.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn-rxon.c
@@ -557,12 +557,10 @@ void iwlagn_bss_info_changed(struct ieee80211_hw *hw,
if (changes & BSS_CHANGED_ASSOC) {
if (bss_conf->assoc) {
- iwl_led_associate(priv);
priv->timestamp = bss_conf->timestamp;
ctx->staging.filter_flags |= RXON_FILTER_ASSOC_MSK;
} else {
ctx->staging.filter_flags &= ~RXON_FILTER_ASSOC_MSK;
- iwl_led_disassociate(priv);
}
}
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c
index 97657d0..9240abf 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
@@ -59,6 +59,7 @@
#include "iwl-sta.h"
#include "iwl-agn-calib.h"
#include "iwl-agn.h"
+#include "iwl-agn-led.h"
/******************************************************************************
@@ -2741,8 +2742,6 @@ static void iwl_alive_start(struct iwl_priv *priv)
/* At this point, the NIC is initialized and operational */
iwl_rf_kill_ct_config(priv);
- iwl_leds_init(priv);
-
IWL_DEBUG_INFO(priv, "ALIVE processing complete.\n");
wake_up_interruptible(&priv->wait_command_queue);
@@ -3234,6 +3233,8 @@ static int iwl_mac_setup_register(struct iwl_priv *priv,
priv->hw->wiphy->bands[IEEE80211_BAND_5GHZ] =
&priv->bands[IEEE80211_BAND_5GHZ];
+ iwl_leds_init(priv);
+
ret = ieee80211_register_hw(priv->hw);
if (ret) {
IWL_ERR(priv, "Failed to register hw (error %d)\n", ret);
@@ -3278,7 +3279,7 @@ int iwlagn_mac_start(struct ieee80211_hw *hw)
}
}
- iwl_led_start(priv);
+ iwlagn_led_enable(priv);
out:
priv->is_open = 1;
@@ -4288,6 +4289,9 @@ static void __devexit iwl_pci_remove(struct pci_dev *pdev)
* we need to set STATUS_EXIT_PENDING bit.
*/
set_bit(STATUS_EXIT_PENDING, &priv->status);
+
+ iwl_leds_exit(priv);
+
if (priv->mac80211_registered) {
ieee80211_unregister_hw(priv->hw);
priv->mac80211_registered = 0;
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c
index a8d4a93..8e1b801 100644
--- a/drivers/net/wireless/iwlwifi/iwl-core.c
+++ b/drivers/net/wireless/iwlwifi/iwl-core.c
@@ -1676,7 +1676,6 @@ void iwl_clear_traffic_stats(struct iwl_priv *priv)
{
memset(&priv->tx_stats, 0, sizeof(struct traffic_stats));
memset(&priv->rx_stats, 0, sizeof(struct traffic_stats));
- priv->led_tpt = 0;
}
/*
@@ -1769,7 +1768,6 @@ void iwl_update_stats(struct iwl_priv *priv, bool is_tx, __le16 fc, u16 len)
stats->data_cnt++;
stats->data_bytes += len;
}
- iwl_leds_background(priv);
}
EXPORT_SYMBOL(iwl_update_stats);
#endif
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.h b/drivers/net/wireless/iwlwifi/iwl-core.h
index a347437..bbc5aa7 100644
--- a/drivers/net/wireless/iwlwifi/iwl-core.h
+++ b/drivers/net/wireless/iwlwifi/iwl-core.h
@@ -227,8 +227,6 @@ struct iwl_lib_ops {
struct iwl_led_ops {
int (*cmd)(struct iwl_priv *priv, struct iwl_led_cmd *led_cmd);
- int (*on)(struct iwl_priv *priv);
- int (*off)(struct iwl_priv *priv);
};
/* NIC specific ops */
@@ -494,18 +492,6 @@ static inline void iwl_dbg_log_rx_data_frame(struct iwl_priv *priv,
static inline void iwl_update_stats(struct iwl_priv *priv, bool is_tx,
__le16 fc, u16 len)
{
- struct traffic_stats *stats;
-
- if (is_tx)
- stats = &priv->tx_stats;
- else
- stats = &priv->rx_stats;
-
- if (ieee80211_is_data(fc)) {
- /* data */
- stats->data_bytes += len;
- }
- iwl_leds_background(priv);
}
#endif
/*****************************************************
diff --git a/drivers/net/wireless/iwlwifi/iwl-debugfs.c b/drivers/net/wireless/iwlwifi/iwl-debugfs.c
index 6fe80b5..7f11a44 100644
--- a/drivers/net/wireless/iwlwifi/iwl-debugfs.c
+++ b/drivers/net/wireless/iwlwifi/iwl-debugfs.c
@@ -668,29 +668,6 @@ static ssize_t iwl_dbgfs_qos_read(struct file *file, char __user *user_buf,
return simple_read_from_buffer(user_buf, count, ppos, buf, pos);
}
-static ssize_t iwl_dbgfs_led_read(struct file *file, char __user *user_buf,
- size_t count, loff_t *ppos)
-{
- struct iwl_priv *priv = file->private_data;
- int pos = 0;
- char buf[256];
- const size_t bufsz = sizeof(buf);
-
- pos += scnprintf(buf + pos, bufsz - pos,
- "allow blinking: %s\n",
- (priv->allow_blinking) ? "True" : "False");
- if (priv->allow_blinking) {
- pos += scnprintf(buf + pos, bufsz - pos,
- "Led blinking rate: %u\n",
- priv->last_blink_rate);
- pos += scnprintf(buf + pos, bufsz - pos,
- "Last blink time: %lu\n",
- priv->last_blink_time);
- }
-
- return simple_read_from_buffer(user_buf, count, ppos, buf, pos);
-}
-
static ssize_t iwl_dbgfs_thermal_throttling_read(struct file *file,
char __user *user_buf,
size_t count, loff_t *ppos)
@@ -856,7 +833,6 @@ DEBUGFS_READ_FILE_OPS(channels);
DEBUGFS_READ_FILE_OPS(status);
DEBUGFS_READ_WRITE_FILE_OPS(interrupt);
DEBUGFS_READ_FILE_OPS(qos);
-DEBUGFS_READ_FILE_OPS(led);
DEBUGFS_READ_FILE_OPS(thermal_throttling);
DEBUGFS_READ_WRITE_FILE_OPS(disable_ht40);
DEBUGFS_READ_WRITE_FILE_OPS(sleep_level_override);
@@ -1725,7 +1701,6 @@ int iwl_dbgfs_register(struct iwl_priv *priv, const char *name)
DEBUGFS_ADD_FILE(status, dir_data, S_IRUSR);
DEBUGFS_ADD_FILE(interrupt, dir_data, S_IWUSR | S_IRUSR);
DEBUGFS_ADD_FILE(qos, dir_data, S_IRUSR);
- DEBUGFS_ADD_FILE(led, dir_data, S_IRUSR);
if (!priv->cfg->base_params->broken_powersave) {
DEBUGFS_ADD_FILE(sleep_level_override, dir_data,
S_IWUSR | S_IRUSR);
diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h
index 2ec680b..6dd6508 100644
--- a/drivers/net/wireless/iwlwifi/iwl-dev.h
+++ b/drivers/net/wireless/iwlwifi/iwl-dev.h
@@ -35,6 +35,7 @@
#include <linux/pci.h> /* for struct pci_device_id */
#include <linux/kernel.h>
#include <linux/wait.h>
+#include <linux/leds.h>
#include <net/ieee80211_radiotap.h>
#include "iwl-eeprom.h"
@@ -996,7 +997,6 @@ struct reply_agg_tx_error_statistics {
u32 unknown;
};
-#ifdef CONFIG_IWLWIFI_DEBUGFS
/* management statistics */
enum iwl_mgmt_stats {
MANAGEMENT_ASSOC_REQ = 0,
@@ -1027,16 +1027,13 @@ enum iwl_ctrl_stats {
};
struct traffic_stats {
+#ifdef CONFIG_IWLWIFI_DEBUGFS
u32 mgmt[MANAGEMENT_MAX];
u32 ctrl[CONTROL_MAX];
u32 data_cnt;
u64 data_bytes;
-};
-#else
-struct traffic_stats {
- u64 data_bytes;
-};
#endif
+};
/*
* iwl_switch_rxon: "channel switch" structure
@@ -1338,11 +1335,6 @@ struct iwl_priv {
struct iwl_init_alive_resp card_alive_init;
struct iwl_alive_resp card_alive;
- unsigned long last_blink_time;
- u8 last_blink_rate;
- u8 allow_blinking;
- u64 led_tpt;
-
u16 active_rate;
u8 start_calib;
@@ -1580,6 +1572,10 @@ struct iwl_priv {
bool hw_ready;
struct iwl_event_log event_log;
+
+ struct led_classdev led;
+ unsigned long blink_on, blink_off;
+ bool led_registered;
}; /*iwl_priv */
static inline void iwl_txq_ctx_activate(struct iwl_priv *priv, int txq_id)
diff --git a/drivers/net/wireless/iwlwifi/iwl-led.c b/drivers/net/wireless/iwlwifi/iwl-led.c
index 46ccdf4..074ad22 100644
--- a/drivers/net/wireless/iwlwifi/iwl-led.c
+++ b/drivers/net/wireless/iwlwifi/iwl-led.c
@@ -48,31 +48,19 @@ module_param(led_mode, int, S_IRUGO);
MODULE_PARM_DESC(led_mode, "0=system default, "
"1=On(RF On)/Off(RF Off), 2=blinking");
-static const struct {
- u16 tpt; /* Mb/s */
- u8 on_time;
- u8 off_time;
-} blink_tbl[] =
-{
- {300, 25, 25},
- {200, 40, 40},
- {100, 55, 55},
- {70, 65, 65},
- {50, 75, 75},
- {20, 85, 85},
- {10, 95, 95},
- {5, 110, 110},
- {1, 130, 130},
- {0, 167, 167},
- /* SOLID_ON */
- {-1, IWL_LED_SOLID, 0}
+static const struct ieee80211_tpt_blink iwl_blink[] = {
+ { .throughput = 0 * 1024 - 1, .blink_time = 334 },
+ { .throughput = 1 * 1024 - 1, .blink_time = 260 },
+ { .throughput = 5 * 1024 - 1, .blink_time = 220 },
+ { .throughput = 10 * 1024 - 1, .blink_time = 190 },
+ { .throughput = 20 * 1024 - 1, .blink_time = 170 },
+ { .throughput = 50 * 1024 - 1, .blink_time = 150 },
+ { .throughput = 70 * 1024 - 1, .blink_time = 130 },
+ { .throughput = 100 * 1024 - 1, .blink_time = 110 },
+ { .throughput = 200 * 1024 - 1, .blink_time = 80 },
+ { .throughput = 300 * 1024 - 1, .blink_time = 50 },
};
-#define IWL_1MB_RATE (128 * 1024)
-#define IWL_LED_THRESHOLD (16)
-#define IWL_MAX_BLINK_TBL (ARRAY_SIZE(blink_tbl) - 1) /* exclude SOLID_ON */
-#define IWL_SOLID_BLINK_IDX (ARRAY_SIZE(blink_tbl) - 1)
-
/*
* Adjust led blink rate to compensate on a MAC Clock difference on every HW
* Led blink rate analysis showed an average deviation of 0% on 3945,
@@ -97,133 +85,104 @@ static inline u8 iwl_blink_compensation(struct iwl_priv *priv,
}
/* Set led pattern command */
-static int iwl_led_pattern(struct iwl_priv *priv, unsigned int idx)
+static int iwl_led_cmd(struct iwl_priv *priv,
+ unsigned long on,
+ unsigned long off)
{
struct iwl_led_cmd led_cmd = {
.id = IWL_LED_LINK,
.interval = IWL_DEF_LED_INTRVL
};
+ int ret;
- BUG_ON(idx > IWL_MAX_BLINK_TBL);
+ if (!test_bit(STATUS_READY, &priv->status))
+ return -EBUSY;
- IWL_DEBUG_LED(priv, "Led blink time compensation= %u\n",
+ if (priv->blink_on == on && priv->blink_off == off)
+ return 0;
+
+ IWL_DEBUG_LED(priv, "Led blink time compensation=%u\n",
priv->cfg->base_params->led_compensation);
- led_cmd.on =
- iwl_blink_compensation(priv, blink_tbl[idx].on_time,
+ led_cmd.on = iwl_blink_compensation(priv, on,
priv->cfg->base_params->led_compensation);
- led_cmd.off =
- iwl_blink_compensation(priv, blink_tbl[idx].off_time,
+ led_cmd.off = iwl_blink_compensation(priv, off,
priv->cfg->base_params->led_compensation);
- return priv->cfg->ops->led->cmd(priv, &led_cmd);
+ ret = priv->cfg->ops->led->cmd(priv, &led_cmd);
+ if (!ret) {
+ priv->blink_on = on;
+ priv->blink_off = off;
+ }
+ return ret;
}
-int iwl_led_start(struct iwl_priv *priv)
+static void iwl_led_brightness_set(struct led_classdev *led_cdev,
+ enum led_brightness brightness)
{
- return priv->cfg->ops->led->on(priv);
-}
-EXPORT_SYMBOL(iwl_led_start);
+ struct iwl_priv *priv = container_of(led_cdev, struct iwl_priv, led);
+ unsigned long on = 0;
-int iwl_led_associate(struct iwl_priv *priv)
-{
- IWL_DEBUG_LED(priv, "Associated\n");
- if (priv->cfg->led_mode == IWL_LED_BLINK)
- priv->allow_blinking = 1;
- priv->last_blink_time = jiffies;
+ if (brightness > 0)
+ on = IWL_LED_SOLID;
- return 0;
+ iwl_led_cmd(priv, on, 0);
}
-EXPORT_SYMBOL(iwl_led_associate);
-int iwl_led_disassociate(struct iwl_priv *priv)
+static int iwl_led_blink_set(struct led_classdev *led_cdev,
+ unsigned long *delay_on,
+ unsigned long *delay_off)
{
- priv->allow_blinking = 0;
+ struct iwl_priv *priv = container_of(led_cdev, struct iwl_priv, led);
- return 0;
+ return iwl_led_cmd(priv, *delay_on, *delay_off);
}
-EXPORT_SYMBOL(iwl_led_disassociate);
-/*
- * calculate blink rate according to last second Tx/Rx activities
- */
-static int iwl_get_blink_rate(struct iwl_priv *priv)
-{
- int i;
- /* count both tx and rx traffic to be able to
- * handle traffic in either direction
- */
- u64 current_tpt = priv->tx_stats.data_bytes +
- priv->rx_stats.data_bytes;
- s64 tpt = current_tpt - priv->led_tpt;
-
- if (tpt < 0) /* wraparound */
- tpt = -tpt;
-
- IWL_DEBUG_LED(priv, "tpt %lld current_tpt %llu\n",
- (long long)tpt,
- (unsigned long long)current_tpt);
- priv->led_tpt = current_tpt;
-
- if (!priv->allow_blinking)
- i = IWL_MAX_BLINK_TBL;
- else
- for (i = 0; i < IWL_MAX_BLINK_TBL; i++)
- if (tpt > (blink_tbl[i].tpt * IWL_1MB_RATE))
- break;
-
- IWL_DEBUG_LED(priv, "LED BLINK IDX=%d\n", i);
- return i;
-}
-
-/*
- * this function called from handler. Since setting Led command can
- * happen very frequent we postpone led command to be called from
- * REPLY handler so we know ucode is up
- */
-void iwl_leds_background(struct iwl_priv *priv)
+void iwl_leds_init(struct iwl_priv *priv)
{
- u8 blink_idx;
-
- if (test_bit(STATUS_EXIT_PENDING, &priv->status)) {
- priv->last_blink_time = 0;
- return;
- }
- if (iwl_is_rfkill(priv)) {
- priv->last_blink_time = 0;
- return;
+ int mode = led_mode;
+ int ret;
+
+ if (mode == IWL_LED_DEFAULT)
+ mode = priv->cfg->led_mode;
+
+ priv->led.name = kasprintf(GFP_KERNEL, "%s-led",
+ wiphy_name(priv->hw->wiphy));
+ priv->led.brightness_set = iwl_led_brightness_set;
+ priv->led.blink_set = iwl_led_blink_set;
+ priv->led.max_brightness = 1;
+
+ switch (mode) {
+ case IWL_LED_DEFAULT:
+ WARN_ON(1);
+ break;
+ case IWL_LED_BLINK:
+ priv->led.default_trigger =
+ ieee80211_create_tpt_led_trigger(priv->hw,
+ IEEE80211_TPT_LEDTRIG_FL_CONNECTED,
+ iwl_blink, ARRAY_SIZE(iwl_blink));
+ break;
+ case IWL_LED_RF_STATE:
+ priv->led.default_trigger =
+ ieee80211_get_radio_led_name(priv->hw);
+ break;
}
- if (!priv->allow_blinking) {
- priv->last_blink_time = 0;
- if (priv->last_blink_rate != IWL_SOLID_BLINK_IDX) {
- priv->last_blink_rate = IWL_SOLID_BLINK_IDX;
- iwl_led_pattern(priv, IWL_SOLID_BLINK_IDX);
- }
+ ret = led_classdev_register(&priv->pci_dev->dev, &priv->led);
+ if (ret) {
+ kfree(priv->led.name);
return;
}
- if (!priv->last_blink_time ||
- !time_after(jiffies, priv->last_blink_time +
- msecs_to_jiffies(1000)))
- return;
-
- blink_idx = iwl_get_blink_rate(priv);
- /* call only if blink rate change */
- if (blink_idx != priv->last_blink_rate)
- iwl_led_pattern(priv, blink_idx);
-
- priv->last_blink_time = jiffies;
- priv->last_blink_rate = blink_idx;
+ priv->led_registered = true;
}
-EXPORT_SYMBOL(iwl_leds_background);
+EXPORT_SYMBOL(iwl_leds_init);
-void iwl_leds_init(struct iwl_priv *priv)
+void iwl_leds_exit(struct iwl_priv *priv)
{
- priv->last_blink_rate = 0;
- priv->last_blink_time = 0;
- priv->allow_blinking = 0;
- if (led_mode != IWL_LED_DEFAULT &&
- led_mode != priv->cfg->led_mode)
- priv->cfg->led_mode = led_mode;
+ if (!priv->led_registered)
+ return;
+
+ led_classdev_unregister(&priv->led);
+ kfree(priv->led.name);
}
-EXPORT_SYMBOL(iwl_leds_init);
+EXPORT_SYMBOL(iwl_leds_exit);
diff --git a/drivers/net/wireless/iwlwifi/iwl-led.h b/drivers/net/wireless/iwlwifi/iwl-led.h
index 9079b33..101eef1 100644
--- a/drivers/net/wireless/iwlwifi/iwl-led.h
+++ b/drivers/net/wireless/iwlwifi/iwl-led.h
@@ -31,23 +31,14 @@
struct iwl_priv;
#define IWL_LED_SOLID 11
-#define IWL_LED_NAME_LEN 31
#define IWL_DEF_LED_INTRVL cpu_to_le32(1000)
#define IWL_LED_ACTIVITY (0<<1)
#define IWL_LED_LINK (1<<1)
-enum led_type {
- IWL_LED_TRG_TX,
- IWL_LED_TRG_RX,
- IWL_LED_TRG_ASSOC,
- IWL_LED_TRG_RADIO,
- IWL_LED_TRG_MAX,
-};
-
/*
* LED mode
- * IWL_LED_DEFAULT: use system default
+ * IWL_LED_DEFAULT: use device default
* IWL_LED_RF_STATE: turn LED on/off based on RF state
* LED ON = RF ON
* LED OFF = RF OFF
@@ -60,9 +51,6 @@ enum iwl_led_mode {
};
void iwl_leds_init(struct iwl_priv *priv);
-void iwl_leds_background(struct iwl_priv *priv);
-int iwl_led_start(struct iwl_priv *priv);
-int iwl_led_associate(struct iwl_priv *priv);
-int iwl_led_disassociate(struct iwl_priv *priv);
+void iwl_leds_exit(struct iwl_priv *priv);
#endif /* __iwl_leds_h__ */
diff --git a/drivers/net/wireless/iwlwifi/iwl-legacy.c b/drivers/net/wireless/iwlwifi/iwl-legacy.c
index bb1a742..927fe37 100644
--- a/drivers/net/wireless/iwlwifi/iwl-legacy.c
+++ b/drivers/net/wireless/iwlwifi/iwl-legacy.c
@@ -332,7 +332,6 @@ static inline void iwl_set_no_assoc(struct iwl_priv *priv,
{
struct iwl_rxon_context *ctx = iwl_rxon_ctx_from_vif(vif);
- iwl_led_disassociate(priv);
/*
* inform the ucode that there is no longer an
* association and that no more packets should be
@@ -520,8 +519,6 @@ void iwl_legacy_mac_bss_info_changed(struct ieee80211_hw *hw,
if (bss_conf->assoc) {
priv->timestamp = bss_conf->timestamp;
- iwl_led_associate(priv);
-
if (!iwl_is_rfkill(priv))
priv->cfg->ops->legacy->post_associate(priv);
} else
@@ -545,7 +542,6 @@ void iwl_legacy_mac_bss_info_changed(struct ieee80211_hw *hw,
memcpy(ctx->staging.bssid_addr,
bss_conf->bssid, ETH_ALEN);
memcpy(priv->bssid, bss_conf->bssid, ETH_ALEN);
- iwl_led_associate(priv);
priv->cfg->ops->legacy->config_ap(priv);
} else
iwl_set_no_assoc(priv, vif);
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c
index 371abbf..9c986f2 100644
--- a/drivers/net/wireless/iwlwifi/iwl3945-base.c
+++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c
@@ -2540,8 +2540,6 @@ static void iwl3945_alive_start(struct iwl_priv *priv)
iwl3945_reg_txpower_periodic(priv);
- iwl_leds_init(priv);
-
IWL_DEBUG_INFO(priv, "ALIVE processing complete.\n");
set_bit(STATUS_READY, &priv->status);
wake_up_interruptible(&priv->wait_command_queue);
@@ -3170,8 +3168,6 @@ static int iwl3945_mac_start(struct ieee80211_hw *hw)
* no need to poll the killswitch state anymore */
cancel_delayed_work(&priv->_3945.rfkill_poll);
- iwl_led_start(priv);
-
priv->is_open = 1;
IWL_DEBUG_MAC80211(priv, "leave\n");
return 0;
@@ -3935,6 +3931,8 @@ static int iwl3945_setup_mac(struct iwl_priv *priv)
priv->hw->wiphy->bands[IEEE80211_BAND_5GHZ] =
&priv->bands[IEEE80211_BAND_5GHZ];
+ iwl_leds_init(priv);
+
ret = ieee80211_register_hw(priv->hw);
if (ret) {
IWL_ERR(priv, "Failed to register hw (error %d)\n", ret);
@@ -4194,6 +4192,8 @@ static void __devexit iwl3945_pci_remove(struct pci_dev *pdev)
set_bit(STATUS_EXIT_PENDING, &priv->status);
+ iwl_leds_exit(priv);
+
if (priv->mac80211_registered) {
ieee80211_unregister_hw(priv->hw);
priv->mac80211_registered = 0;
--
1.7.0.4
From: Wey-Yi Guy <[email protected]>
2000 series device has different HW rev, add it
Signed-off-by: Wey-Yi Guy <[email protected]>
---
drivers/net/wireless/iwlwifi/iwl-csr.h | 9 +++++++--
1 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/drivers/net/wireless/iwlwifi/iwl-csr.h b/drivers/net/wireless/iwlwifi/iwl-csr.h
index cb77c0f..6c2b2df 100644
--- a/drivers/net/wireless/iwlwifi/iwl-csr.h
+++ b/drivers/net/wireless/iwlwifi/iwl-csr.h
@@ -290,7 +290,7 @@
/* HW REV */
-#define CSR_HW_REV_TYPE_MSK (0x00000F0)
+#define CSR_HW_REV_TYPE_MSK (0x00001F0)
#define CSR_HW_REV_TYPE_3945 (0x00000D0)
#define CSR_HW_REV_TYPE_4965 (0x0000000)
#define CSR_HW_REV_TYPE_5300 (0x0000020)
@@ -303,7 +303,12 @@
#define CSR_HW_REV_TYPE_6150 (0x0000084)
#define CSR_HW_REV_TYPE_6x05 (0x00000B0)
#define CSR_HW_REV_TYPE_6x30 CSR_HW_REV_TYPE_6x05
-#define CSR_HW_REV_TYPE_NONE (0x00000F0)
+#define CSR_HW_REV_TYPE_6x35 CSR_HW_REV_TYPE_6x05
+#define CSR_HW_REV_TYPE_2x30 (0x00000C0)
+#define CSR_HW_REV_TYPE_2x00 (0x0000100)
+#define CSR_HW_REV_TYPE_200 (0x0000110)
+#define CSR_HW_REV_TYPE_230 (0x0000120)
+#define CSR_HW_REV_TYPE_NONE (0x00001F0)
/* EEPROM REG */
#define CSR_EEPROM_REG_READ_VALID_MSK (0x00000001)
--
1.7.0.4