mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-05 22:16:39 +07:00
Merge branch 'wireless-next-2.6' of git://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/iwlwifi-2.6
This commit is contained in:
commit
62362dee83
@ -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
|
||||
@ -106,9 +110,27 @@ 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
|
||||
|
||||
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)"
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
|
556
drivers/net/wireless/iwlwifi/iwl-2000.c
Normal file
556
drivers/net/wireless/iwlwifi/iwl-2000.c
Normal file
@ -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 <ilw@linux.intel.com>
|
||||
* 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));
|
@ -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,
|
||||
};
|
||||
|
@ -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));
|
||||
|
@ -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 = 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;
|
||||
|
||||
@ -330,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;
|
||||
@ -344,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;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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,
|
||||
};
|
||||
|
@ -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__ */
|
||||
|
@ -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;
|
||||
@ -557,12 +574,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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
||||
@ -3209,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;
|
||||
|
||||
@ -3234,6 +3235,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 +3281,7 @@ int iwlagn_mac_start(struct ieee80211_hw *hw)
|
||||
}
|
||||
}
|
||||
|
||||
iwl_led_start(priv);
|
||||
iwlagn_led_enable(priv);
|
||||
|
||||
out:
|
||||
priv->is_open = 1;
|
||||
@ -3725,6 +3728,95 @@ void iwlagn_mac_flush(struct ieee80211_hw *hw, bool drop)
|
||||
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(IWL_MIN_SLOT_TIME); /* TU is almost ms */
|
||||
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
|
||||
@ -3746,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);
|
||||
|
||||
@ -3914,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
|
||||
|
||||
@ -4041,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;
|
||||
@ -4288,6 +4387,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;
|
||||
@ -4508,6 +4610,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}
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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 */
|
||||
@ -1676,7 +1677,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 +1769,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
|
||||
|
@ -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
|
||||
/*****************************************************
|
||||
|
@ -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)
|
||||
@ -300,9 +300,15 @@
|
||||
#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_NONE (0x00000F0)
|
||||
#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_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)
|
||||
|
@ -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;
|
||||
@ -668,29 +699,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 +864,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 +1732,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);
|
||||
|
@ -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;
|
||||
@ -1496,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
|
||||
};
|
||||
@ -1580,6 +1578,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)
|
||||
|
@ -247,13 +247,26 @@ 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)
|
||||
|
||||
/* 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)
|
||||
|
||||
/* 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)
|
||||
|
||||
/* 6x00g2 Specific */
|
||||
#define EEPROM_6000G2_TX_POWER_VERSION (6)
|
||||
#define EEPROM_6000G2_EEPROM_VERSION (0x709)
|
||||
|
||||
/* OTP */
|
||||
/* lower blocks contain EEPROM image and calibration data */
|
||||
@ -264,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];
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
int iwl_led_start(struct iwl_priv *priv)
|
||||
{
|
||||
return priv->cfg->ops->led->on(priv);
|
||||
}
|
||||
EXPORT_SYMBOL(iwl_led_start);
|
||||
|
||||
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;
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(iwl_led_associate);
|
||||
|
||||
int iwl_led_disassociate(struct iwl_priv *priv)
|
||||
{
|
||||
priv->allow_blinking = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
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)
|
||||
{
|
||||
u8 blink_idx;
|
||||
|
||||
if (test_bit(STATUS_EXIT_PENDING, &priv->status)) {
|
||||
priv->last_blink_time = 0;
|
||||
return;
|
||||
ret = priv->cfg->ops->led->cmd(priv, &led_cmd);
|
||||
if (!ret) {
|
||||
priv->blink_on = on;
|
||||
priv->blink_off = off;
|
||||
}
|
||||
if (iwl_is_rfkill(priv)) {
|
||||
priv->last_blink_time = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
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;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void iwl_led_brightness_set(struct led_classdev *led_cdev,
|
||||
enum led_brightness brightness)
|
||||
{
|
||||
struct iwl_priv *priv = container_of(led_cdev, struct iwl_priv, led);
|
||||
unsigned long on = 0;
|
||||
|
||||
if (brightness > 0)
|
||||
on = IWL_LED_SOLID;
|
||||
|
||||
iwl_led_cmd(priv, on, 0);
|
||||
}
|
||||
|
||||
static int iwl_led_blink_set(struct led_classdev *led_cdev,
|
||||
unsigned long *delay_on,
|
||||
unsigned long *delay_off)
|
||||
{
|
||||
struct iwl_priv *priv = container_of(led_cdev, struct iwl_priv, led);
|
||||
|
||||
return iwl_led_cmd(priv, *delay_on, *delay_off);
|
||||
}
|
||||
EXPORT_SYMBOL(iwl_leds_background);
|
||||
|
||||
void iwl_leds_init(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;
|
||||
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;
|
||||
}
|
||||
|
||||
ret = led_classdev_register(&priv->pci_dev->dev, &priv->led);
|
||||
if (ret) {
|
||||
kfree(priv->led.name);
|
||||
return;
|
||||
}
|
||||
|
||||
priv->led_registered = true;
|
||||
}
|
||||
EXPORT_SYMBOL(iwl_leds_init);
|
||||
|
||||
void iwl_leds_exit(struct iwl_priv *priv)
|
||||
{
|
||||
if (!priv->led_registered)
|
||||
return;
|
||||
|
||||
led_classdev_unregister(&priv->led);
|
||||
kfree(priv->led.name);
|
||||
}
|
||||
EXPORT_SYMBOL(iwl_leds_exit);
|
||||
|
@ -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__ */
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user