Commit 44c866a0 authored by John W. Linville's avatar John W. Linville

Merge branch 'wireless-next-2.6' of...

Merge branch 'wireless-next-2.6' of git://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/iwlwifi-2.6
parents 34a0a202 f212b43c
# AGN # AGN
obj-$(CONFIG_IWLAGN) += iwlagn.o obj-$(CONFIG_IWLAGN) += iwlagn.o
iwlagn-objs := iwl-agn.o iwl-agn-rs.o iwl-agn-led.o iwlagn-objs := iwl-agn.o iwl-agn-rs.o
iwlagn-objs += iwl-agn-ucode.o iwl-agn-tx.o iwlagn-objs += iwl-agn-ucode.o iwl-agn-tx.o
iwlagn-objs += iwl-agn-lib.o iwl-agn-calib.o iwl-io.o iwlagn-objs += iwl-agn-lib.o iwl-agn-calib.o iwl-io.o
iwlagn-objs += iwl-agn-tt.o iwl-agn-sta.o iwl-agn-eeprom.o iwlagn-objs += iwl-agn-tt.o iwl-agn-sta.o iwl-agn-eeprom.o
......
...@@ -45,7 +45,6 @@ ...@@ -45,7 +45,6 @@
#include "iwl-agn.h" #include "iwl-agn.h"
#include "iwl-helpers.h" #include "iwl-helpers.h"
#include "iwl-agn-hw.h" #include "iwl-agn-hw.h"
#include "iwl-agn-led.h"
#include "iwl-agn-debugfs.h" #include "iwl-agn-debugfs.h"
/* Highest firmware API version supported */ /* Highest firmware API version supported */
...@@ -196,7 +195,7 @@ static struct iwl_lib_ops iwl1000_lib = { ...@@ -196,7 +195,7 @@ static struct iwl_lib_ops iwl1000_lib = {
EEPROM_REG_BAND_4_CHANNELS, EEPROM_REG_BAND_4_CHANNELS,
EEPROM_REG_BAND_5_CHANNELS, EEPROM_REG_BAND_5_CHANNELS,
EEPROM_REG_BAND_24_HT40_CHANNELS, EEPROM_REG_BAND_24_HT40_CHANNELS,
EEPROM_REG_BAND_52_HT40_CHANNELS EEPROM_REGULATORY_BAND_NO_HT40,
}, },
.acquire_semaphore = iwlcore_eeprom_acquire_semaphore, .acquire_semaphore = iwlcore_eeprom_acquire_semaphore,
.release_semaphore = iwlcore_eeprom_release_semaphore, .release_semaphore = iwlcore_eeprom_release_semaphore,
...@@ -215,19 +214,12 @@ static struct iwl_lib_ops iwl1000_lib = { ...@@ -215,19 +214,12 @@ static struct iwl_lib_ops iwl1000_lib = {
}, },
.txfifo_flush = iwlagn_txfifo_flush, .txfifo_flush = iwlagn_txfifo_flush,
.dev_txfifo_flush = iwlagn_dev_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 iwl1000_ops = { static const struct iwl_ops iwl1000_ops = {
.lib = &iwl1000_lib, .lib = &iwl1000_lib,
.hcmd = &iwlagn_hcmd, .hcmd = &iwlagn_hcmd,
.utils = &iwlagn_hcmd_utils, .utils = &iwlagn_hcmd_utils,
.led = &iwlagn_led_ops,
.ieee80211_ops = &iwlagn_hw_ops,
}; };
static struct iwl_base_params iwl1000_base_params = { static struct iwl_base_params iwl1000_base_params = {
...@@ -244,7 +236,6 @@ static struct iwl_base_params iwl1000_base_params = { ...@@ -244,7 +236,6 @@ static struct iwl_base_params iwl1000_base_params = {
.chain_noise_scale = 1000, .chain_noise_scale = 1000,
.wd_timeout = IWL_DEF_WD_TIMEOUT, .wd_timeout = IWL_DEF_WD_TIMEOUT,
.max_event_log_size = 128, .max_event_log_size = 128,
.ucode_tracing = true,
}; };
static struct iwl_ht_params iwl1000_ht_params = { static struct iwl_ht_params iwl1000_ht_params = {
.ht_greenfield_support = true, .ht_greenfield_support = true,
......
...@@ -46,7 +46,6 @@ ...@@ -46,7 +46,6 @@
#include "iwl-helpers.h" #include "iwl-helpers.h"
#include "iwl-agn-hw.h" #include "iwl-agn-hw.h"
#include "iwl-6000-hw.h" #include "iwl-6000-hw.h"
#include "iwl-agn-led.h"
#include "iwl-agn-debugfs.h" #include "iwl-agn-debugfs.h"
/* Highest firmware API version supported */ /* Highest firmware API version supported */
...@@ -279,7 +278,7 @@ static struct iwl_lib_ops iwl2000_lib = { ...@@ -279,7 +278,7 @@ static struct iwl_lib_ops iwl2000_lib = {
EEPROM_REG_BAND_4_CHANNELS, EEPROM_REG_BAND_4_CHANNELS,
EEPROM_REG_BAND_5_CHANNELS, EEPROM_REG_BAND_5_CHANNELS,
EEPROM_6000_REG_BAND_24_HT40_CHANNELS, EEPROM_6000_REG_BAND_24_HT40_CHANNELS,
EEPROM_REG_BAND_52_HT40_CHANNELS EEPROM_REGULATORY_BAND_NO_HT40,
}, },
.acquire_semaphore = iwlcore_eeprom_acquire_semaphore, .acquire_semaphore = iwlcore_eeprom_acquire_semaphore,
.release_semaphore = iwlcore_eeprom_release_semaphore, .release_semaphore = iwlcore_eeprom_release_semaphore,
...@@ -299,43 +298,30 @@ static struct iwl_lib_ops iwl2000_lib = { ...@@ -299,43 +298,30 @@ static struct iwl_lib_ops iwl2000_lib = {
}, },
.txfifo_flush = iwlagn_txfifo_flush, .txfifo_flush = iwlagn_txfifo_flush,
.dev_txfifo_flush = iwlagn_dev_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 = { static const struct iwl_ops iwl2000_ops = {
.lib = &iwl2000_lib, .lib = &iwl2000_lib,
.hcmd = &iwlagn_hcmd, .hcmd = &iwlagn_hcmd,
.utils = &iwlagn_hcmd_utils, .utils = &iwlagn_hcmd_utils,
.led = &iwlagn_led_ops,
.ieee80211_ops = &iwlagn_hw_ops,
}; };
static const struct iwl_ops iwl2030_ops = { static const struct iwl_ops iwl2030_ops = {
.lib = &iwl2000_lib, .lib = &iwl2000_lib,
.hcmd = &iwlagn_bt_hcmd, .hcmd = &iwlagn_bt_hcmd,
.utils = &iwlagn_hcmd_utils, .utils = &iwlagn_hcmd_utils,
.led = &iwlagn_led_ops,
.ieee80211_ops = &iwlagn_hw_ops,
}; };
static const struct iwl_ops iwl200_ops = { static const struct iwl_ops iwl200_ops = {
.lib = &iwl2000_lib, .lib = &iwl2000_lib,
.hcmd = &iwlagn_hcmd, .hcmd = &iwlagn_hcmd,
.utils = &iwlagn_hcmd_utils, .utils = &iwlagn_hcmd_utils,
.led = &iwlagn_led_ops,
.ieee80211_ops = &iwlagn_hw_ops,
}; };
static const struct iwl_ops iwl230_ops = { static const struct iwl_ops iwl230_ops = {
.lib = &iwl2000_lib, .lib = &iwl2000_lib,
.hcmd = &iwlagn_bt_hcmd, .hcmd = &iwlagn_bt_hcmd,
.utils = &iwlagn_hcmd_utils, .utils = &iwlagn_hcmd_utils,
.led = &iwlagn_led_ops,
.ieee80211_ops = &iwlagn_hw_ops,
}; };
static struct iwl_base_params iwl2000_base_params = { static struct iwl_base_params iwl2000_base_params = {
...@@ -353,7 +339,6 @@ static struct iwl_base_params iwl2000_base_params = { ...@@ -353,7 +339,6 @@ static struct iwl_base_params iwl2000_base_params = {
.chain_noise_scale = 1000, .chain_noise_scale = 1000,
.wd_timeout = IWL_DEF_WD_TIMEOUT, .wd_timeout = IWL_DEF_WD_TIMEOUT,
.max_event_log_size = 512, .max_event_log_size = 512,
.ucode_tracing = true,
.shadow_reg_enable = true, .shadow_reg_enable = true,
}; };
...@@ -373,7 +358,6 @@ static struct iwl_base_params iwl2030_base_params = { ...@@ -373,7 +358,6 @@ static struct iwl_base_params iwl2030_base_params = {
.chain_noise_scale = 1000, .chain_noise_scale = 1000,
.wd_timeout = IWL_LONG_WD_TIMEOUT, .wd_timeout = IWL_LONG_WD_TIMEOUT,
.max_event_log_size = 512, .max_event_log_size = 512,
.ucode_tracing = true,
.shadow_reg_enable = true, .shadow_reg_enable = true,
}; };
......
...@@ -45,7 +45,6 @@ ...@@ -45,7 +45,6 @@
#include "iwl-sta.h" #include "iwl-sta.h"
#include "iwl-helpers.h" #include "iwl-helpers.h"
#include "iwl-agn.h" #include "iwl-agn.h"
#include "iwl-agn-led.h"
#include "iwl-agn-hw.h" #include "iwl-agn-hw.h"
#include "iwl-5000-hw.h" #include "iwl-5000-hw.h"
#include "iwl-agn-debugfs.h" #include "iwl-agn-debugfs.h"
...@@ -384,11 +383,6 @@ static struct iwl_lib_ops iwl5000_lib = { ...@@ -384,11 +383,6 @@ static struct iwl_lib_ops iwl5000_lib = {
}, },
.txfifo_flush = iwlagn_txfifo_flush, .txfifo_flush = iwlagn_txfifo_flush,
.dev_txfifo_flush = iwlagn_dev_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 struct iwl_lib_ops iwl5150_lib = { static struct iwl_lib_ops iwl5150_lib = {
...@@ -436,27 +430,18 @@ static struct iwl_lib_ops iwl5150_lib = { ...@@ -436,27 +430,18 @@ static struct iwl_lib_ops iwl5150_lib = {
}, },
.txfifo_flush = iwlagn_txfifo_flush, .txfifo_flush = iwlagn_txfifo_flush,
.dev_txfifo_flush = iwlagn_dev_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 iwl5000_ops = { static const struct iwl_ops iwl5000_ops = {
.lib = &iwl5000_lib, .lib = &iwl5000_lib,
.hcmd = &iwlagn_hcmd, .hcmd = &iwlagn_hcmd,
.utils = &iwlagn_hcmd_utils, .utils = &iwlagn_hcmd_utils,
.led = &iwlagn_led_ops,
.ieee80211_ops = &iwlagn_hw_ops,
}; };
static const struct iwl_ops iwl5150_ops = { static const struct iwl_ops iwl5150_ops = {
.lib = &iwl5150_lib, .lib = &iwl5150_lib,
.hcmd = &iwlagn_hcmd, .hcmd = &iwlagn_hcmd,
.utils = &iwlagn_hcmd_utils, .utils = &iwlagn_hcmd_utils,
.led = &iwlagn_led_ops,
.ieee80211_ops = &iwlagn_hw_ops,
}; };
static struct iwl_base_params iwl5000_base_params = { static struct iwl_base_params iwl5000_base_params = {
...@@ -470,7 +455,6 @@ static struct iwl_base_params iwl5000_base_params = { ...@@ -470,7 +455,6 @@ static struct iwl_base_params iwl5000_base_params = {
.chain_noise_scale = 1000, .chain_noise_scale = 1000,
.wd_timeout = IWL_LONG_WD_TIMEOUT, .wd_timeout = IWL_LONG_WD_TIMEOUT,
.max_event_log_size = 512, .max_event_log_size = 512,
.ucode_tracing = true,
}; };
static struct iwl_ht_params iwl5000_ht_params = { static struct iwl_ht_params iwl5000_ht_params = {
.ht_greenfield_support = true, .ht_greenfield_support = true,
......
...@@ -46,7 +46,6 @@ ...@@ -46,7 +46,6 @@
#include "iwl-helpers.h" #include "iwl-helpers.h"
#include "iwl-agn-hw.h" #include "iwl-agn-hw.h"
#include "iwl-6000-hw.h" #include "iwl-6000-hw.h"
#include "iwl-agn-led.h"
#include "iwl-agn-debugfs.h" #include "iwl-agn-debugfs.h"
/* Highest firmware API version supported */ /* Highest firmware API version supported */
...@@ -324,11 +323,6 @@ static struct iwl_lib_ops iwl6000_lib = { ...@@ -324,11 +323,6 @@ static struct iwl_lib_ops iwl6000_lib = {
}, },
.txfifo_flush = iwlagn_txfifo_flush, .txfifo_flush = iwlagn_txfifo_flush,
.dev_txfifo_flush = iwlagn_dev_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 struct iwl_lib_ops iwl6030_lib = { static struct iwl_lib_ops iwl6030_lib = {
...@@ -378,11 +372,6 @@ static struct iwl_lib_ops iwl6030_lib = { ...@@ -378,11 +372,6 @@ static struct iwl_lib_ops iwl6030_lib = {
}, },
.txfifo_flush = iwlagn_txfifo_flush, .txfifo_flush = iwlagn_txfifo_flush,
.dev_txfifo_flush = iwlagn_dev_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 struct iwl_nic_ops iwl6050_nic_ops = { static struct iwl_nic_ops iwl6050_nic_ops = {
...@@ -397,34 +386,26 @@ static const struct iwl_ops iwl6000_ops = { ...@@ -397,34 +386,26 @@ static const struct iwl_ops iwl6000_ops = {
.lib = &iwl6000_lib, .lib = &iwl6000_lib,
.hcmd = &iwlagn_hcmd, .hcmd = &iwlagn_hcmd,
.utils = &iwlagn_hcmd_utils, .utils = &iwlagn_hcmd_utils,
.led = &iwlagn_led_ops,
.ieee80211_ops = &iwlagn_hw_ops,
}; };
static const struct iwl_ops iwl6050_ops = { static const struct iwl_ops iwl6050_ops = {
.lib = &iwl6000_lib, .lib = &iwl6000_lib,
.hcmd = &iwlagn_hcmd, .hcmd = &iwlagn_hcmd,
.utils = &iwlagn_hcmd_utils, .utils = &iwlagn_hcmd_utils,
.led = &iwlagn_led_ops,
.nic = &iwl6050_nic_ops, .nic = &iwl6050_nic_ops,
.ieee80211_ops = &iwlagn_hw_ops,
}; };
static const struct iwl_ops iwl6150_ops = { static const struct iwl_ops iwl6150_ops = {
.lib = &iwl6000_lib, .lib = &iwl6000_lib,
.hcmd = &iwlagn_hcmd, .hcmd = &iwlagn_hcmd,
.utils = &iwlagn_hcmd_utils, .utils = &iwlagn_hcmd_utils,
.led = &iwlagn_led_ops,
.nic = &iwl6150_nic_ops, .nic = &iwl6150_nic_ops,
.ieee80211_ops = &iwlagn_hw_ops,
}; };
static const struct iwl_ops iwl6030_ops = { static const struct iwl_ops iwl6030_ops = {
.lib = &iwl6030_lib, .lib = &iwl6030_lib,
.hcmd = &iwlagn_bt_hcmd, .hcmd = &iwlagn_bt_hcmd,
.utils = &iwlagn_hcmd_utils, .utils = &iwlagn_hcmd_utils,
.led = &iwlagn_led_ops,
.ieee80211_ops = &iwlagn_hw_ops,
}; };
static struct iwl_base_params iwl6000_base_params = { static struct iwl_base_params iwl6000_base_params = {
...@@ -442,7 +423,6 @@ static struct iwl_base_params iwl6000_base_params = { ...@@ -442,7 +423,6 @@ static struct iwl_base_params iwl6000_base_params = {
.chain_noise_scale = 1000, .chain_noise_scale = 1000,
.wd_timeout = IWL_DEF_WD_TIMEOUT, .wd_timeout = IWL_DEF_WD_TIMEOUT,
.max_event_log_size = 512, .max_event_log_size = 512,
.ucode_tracing = true,
.shadow_reg_enable = true, .shadow_reg_enable = true,
}; };
...@@ -461,7 +441,6 @@ static struct iwl_base_params iwl6050_base_params = { ...@@ -461,7 +441,6 @@ static struct iwl_base_params iwl6050_base_params = {
.chain_noise_scale = 1500, .chain_noise_scale = 1500,
.wd_timeout = IWL_DEF_WD_TIMEOUT, .wd_timeout = IWL_DEF_WD_TIMEOUT,
.max_event_log_size = 1024, .max_event_log_size = 1024,
.ucode_tracing = true,
.shadow_reg_enable = true, .shadow_reg_enable = true,
}; };
static struct iwl_base_params iwl6000_g2_base_params = { static struct iwl_base_params iwl6000_g2_base_params = {
...@@ -479,7 +458,6 @@ static struct iwl_base_params iwl6000_g2_base_params = { ...@@ -479,7 +458,6 @@ static struct iwl_base_params iwl6000_g2_base_params = {
.chain_noise_scale = 1000, .chain_noise_scale = 1000,
.wd_timeout = IWL_LONG_WD_TIMEOUT, .wd_timeout = IWL_LONG_WD_TIMEOUT,
.max_event_log_size = 512, .max_event_log_size = 512,
.ucode_tracing = true,
.shadow_reg_enable = true, .shadow_reg_enable = true,
}; };
......
/******************************************************************************
*
* Copyright(c) 2003 - 2011 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-commands.h"
#include "iwl-dev.h"
#include "iwl-core.h"
#include "iwl-io.h"
#include "iwl-agn-led.h"
/* Send led command */
static int iwl_send_led_cmd(struct iwl_priv *priv, struct iwl_led_cmd *led_cmd)
{
struct iwl_host_cmd cmd = {
.id = REPLY_LEDS_CMD,
.len = sizeof(struct iwl_led_cmd),
.data = led_cmd,
.flags = CMD_ASYNC,
.callback = NULL,
};
u32 reg;
reg = iwl_read32(priv, CSR_LED_REG);
if (reg != (reg & CSR_LED_BSM_CTRL_MSK))
iwl_write32(priv, CSR_LED_REG, reg & CSR_LED_BSM_CTRL_MSK);
return iwl_send_cmd(priv, &cmd);
}
/* Set led register off */
void iwlagn_led_enable(struct iwl_priv *priv)
{
iwl_write32(priv, CSR_LED_REG, CSR_LED_REG_TRUN_ON);
}
const struct iwl_led_ops iwlagn_led_ops = {
.cmd = iwl_send_led_cmd,
};
/******************************************************************************
*
* Copyright(c) 2003 - 2011 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
*
*****************************************************************************/
#ifndef __iwl_agn_led_h__
#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__ */
...@@ -59,7 +59,6 @@ ...@@ -59,7 +59,6 @@
#include "iwl-sta.h" #include "iwl-sta.h"
#include "iwl-agn-calib.h" #include "iwl-agn-calib.h"
#include "iwl-agn.h" #include "iwl-agn.h"
#include "iwl-agn-led.h"
/****************************************************************************** /******************************************************************************
...@@ -254,6 +253,10 @@ int iwlagn_send_beacon_cmd(struct iwl_priv *priv) ...@@ -254,6 +253,10 @@ int iwlagn_send_beacon_cmd(struct iwl_priv *priv)
struct iwl_frame *frame; struct iwl_frame *frame;
unsigned int frame_size; unsigned int frame_size;
int rc; int rc;
struct iwl_host_cmd cmd = {
.id = REPLY_TX_BEACON,
.flags = CMD_SIZE_HUGE,
};
frame = iwl_get_free_frame(priv); frame = iwl_get_free_frame(priv);
if (!frame) { if (!frame) {
...@@ -269,8 +272,10 @@ int iwlagn_send_beacon_cmd(struct iwl_priv *priv) ...@@ -269,8 +272,10 @@ int iwlagn_send_beacon_cmd(struct iwl_priv *priv)
return -EINVAL; return -EINVAL;
} }
rc = iwl_send_cmd_pdu(priv, REPLY_TX_BEACON, frame_size, cmd.len = frame_size;
&frame->u.cmd[0]); cmd.data = &frame->u.cmd[0];
rc = iwl_send_cmd_sync(priv, &cmd);
iwl_free_frame(priv, frame); iwl_free_frame(priv, frame);
...@@ -395,7 +400,9 @@ int iwl_hw_txq_attach_buf_to_tfd(struct iwl_priv *priv, ...@@ -395,7 +400,9 @@ int iwl_hw_txq_attach_buf_to_tfd(struct iwl_priv *priv,
return -EINVAL; return -EINVAL;
} }
BUG_ON(addr & ~DMA_BIT_MASK(36)); if (WARN_ON(addr & ~DMA_BIT_MASK(36)))
return -EINVAL;
if (unlikely(addr & ~IWL_TX_DMA_MASK)) if (unlikely(addr & ~IWL_TX_DMA_MASK))
IWL_ERR(priv, "Unaligned address = %llx\n", IWL_ERR(priv, "Unaligned address = %llx\n",
(unsigned long long)addr); (unsigned long long)addr);
...@@ -719,7 +726,10 @@ static void iwl_rx_handle(struct iwl_priv *priv) ...@@ -719,7 +726,10 @@ static void iwl_rx_handle(struct iwl_priv *priv)
/* If an RXB doesn't have a Rx queue slot associated with it, /* If an RXB doesn't have a Rx queue slot associated with it,
* then a bug has been introduced in the queue refilling * then a bug has been introduced in the queue refilling
* routines -- catch it here */ * routines -- catch it here */
BUG_ON(rxb == NULL); if (WARN_ON(rxb == NULL)) {
i = (i + 1) & RX_QUEUE_MASK;
continue;
}
rxq->queue[i] = NULL; rxq->queue[i] = NULL;
...@@ -3718,6 +3728,28 @@ static const u8 iwlagn_pan_ac_to_queue[] = { ...@@ -3718,6 +3728,28 @@ static const u8 iwlagn_pan_ac_to_queue[] = {
7, 6, 5, 4, 7, 6, 5, 4,
}; };
/* This function both allocates and initializes hw and priv. */
static struct ieee80211_hw *iwl_alloc_all(struct iwl_cfg *cfg)
{
struct iwl_priv *priv;
/* mac80211 allocates memory for this device instance, including
* space for this driver's private structure */
struct ieee80211_hw *hw;
hw = ieee80211_alloc_hw(sizeof(struct iwl_priv), &iwlagn_hw_ops);
if (hw == NULL) {
pr_err("%s: Can not allocate network device\n",
cfg->name);
goto out;
}
priv = hw->priv;
priv->hw = hw;
out:
return hw;
}
static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
{ {
int err = 0, i; int err = 0, i;
......
...@@ -67,30 +67,6 @@ u32 iwl_debug_level; ...@@ -67,30 +67,6 @@ u32 iwl_debug_level;
const u8 iwl_bcast_addr[ETH_ALEN] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; const u8 iwl_bcast_addr[ETH_ALEN] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
/* This function both allocates and initializes hw and priv. */
struct ieee80211_hw *iwl_alloc_all(struct iwl_cfg *cfg)
{
struct iwl_priv *priv;
/* mac80211 allocates memory for this device instance, including
* space for this driver's private structure */
struct ieee80211_hw *hw;
hw = ieee80211_alloc_hw(sizeof(struct iwl_priv),
cfg->ops->ieee80211_ops);
if (hw == NULL) {
pr_err("%s: Can not allocate network device\n",
cfg->name);
goto out;
}
priv = hw->priv;
priv->hw = hw;
out:
return hw;
}
#define MAX_BIT_RATE_40_MHZ 150 /* Mbps */ #define MAX_BIT_RATE_40_MHZ 150 /* Mbps */
#define MAX_BIT_RATE_20_MHZ 72 /* Mbps */ #define MAX_BIT_RATE_20_MHZ 72 /* Mbps */
static void iwlcore_init_ht_hw_capab(const struct iwl_priv *priv, static void iwlcore_init_ht_hw_capab(const struct iwl_priv *priv,
......
...@@ -139,12 +139,6 @@ struct iwl_temp_ops { ...@@ -139,12 +139,6 @@ struct iwl_temp_ops {
void (*temperature)(struct iwl_priv *priv); void (*temperature)(struct iwl_priv *priv);
}; };
struct iwl_tt_ops {
bool (*lower_power_detection)(struct iwl_priv *priv);
u8 (*tt_power_mode)(struct iwl_priv *priv);
bool (*ct_kill_check)(struct iwl_priv *priv);
};
struct iwl_lib_ops { struct iwl_lib_ops {
/* set hw dependent parameters */ /* set hw dependent parameters */
int (*set_hw_params)(struct iwl_priv *priv); int (*set_hw_params)(struct iwl_priv *priv);
...@@ -190,13 +184,6 @@ struct iwl_lib_ops { ...@@ -190,13 +184,6 @@ struct iwl_lib_ops {
void (*dev_txfifo_flush)(struct iwl_priv *priv, u16 flush_control); void (*dev_txfifo_flush)(struct iwl_priv *priv, u16 flush_control);
struct iwl_debugfs_ops debugfs_ops; struct iwl_debugfs_ops debugfs_ops;
/* thermal throttling */
struct iwl_tt_ops tt_ops;
};
struct iwl_led_ops {
int (*cmd)(struct iwl_priv *priv, struct iwl_led_cmd *led_cmd);
}; };
/* NIC specific ops */ /* NIC specific ops */
...@@ -204,23 +191,11 @@ struct iwl_nic_ops { ...@@ -204,23 +191,11 @@ struct iwl_nic_ops {
void (*additional_nic_config)(struct iwl_priv *priv); void (*additional_nic_config)(struct iwl_priv *priv);
}; };
struct iwl_legacy_ops {
void (*post_associate)(struct iwl_priv *priv);
void (*config_ap)(struct iwl_priv *priv);
/* station management */
int (*update_bcast_stations)(struct iwl_priv *priv);
int (*manage_ibss_station)(struct iwl_priv *priv,
struct ieee80211_vif *vif, bool add);
};
struct iwl_ops { struct iwl_ops {
const struct iwl_lib_ops *lib; const struct iwl_lib_ops *lib;
const struct iwl_hcmd_ops *hcmd; const struct iwl_hcmd_ops *hcmd;
const struct iwl_hcmd_utils_ops *utils; const struct iwl_hcmd_utils_ops *utils;
const struct iwl_led_ops *led;
const struct iwl_nic_ops *nic; const struct iwl_nic_ops *nic;
const struct iwl_legacy_ops *legacy;
const struct ieee80211_ops *ieee80211_ops;
}; };
struct iwl_mod_params { struct iwl_mod_params {
...@@ -250,7 +225,6 @@ struct iwl_mod_params { ...@@ -250,7 +225,6 @@ struct iwl_mod_params {
* @wd_timeout: TX queues watchdog timeout * @wd_timeout: TX queues watchdog timeout
* @temperature_kelvin: temperature report by uCode in kelvin * @temperature_kelvin: temperature report by uCode in kelvin
* @max_event_log_size: size of event log buffer size for ucode event logging * @max_event_log_size: size of event log buffer size for ucode event logging
* @ucode_tracing: support ucode continuous tracing
* @shadow_reg_enable: HW shadhow register bit * @shadow_reg_enable: HW shadhow register bit
*/ */
struct iwl_base_params { struct iwl_base_params {
...@@ -272,7 +246,6 @@ struct iwl_base_params { ...@@ -272,7 +246,6 @@ struct iwl_base_params {
unsigned int wd_timeout; unsigned int wd_timeout;
bool temperature_kelvin; bool temperature_kelvin;
u32 max_event_log_size; u32 max_event_log_size;
const bool ucode_tracing;
const bool shadow_reg_enable; const bool shadow_reg_enable;
}; };
/* /*
...@@ -376,7 +349,6 @@ struct iwl_cfg { ...@@ -376,7 +349,6 @@ struct iwl_cfg {
* L i b * * L i b *
***************************/ ***************************/
struct ieee80211_hw *iwl_alloc_all(struct iwl_cfg *cfg);
int iwl_mac_conf_tx(struct ieee80211_hw *hw, u16 queue, int iwl_mac_conf_tx(struct ieee80211_hw *hw, u16 queue,
const struct ieee80211_tx_queue_params *params); const struct ieee80211_tx_queue_params *params);
int iwl_mac_tx_last_beacon(struct ieee80211_hw *hw); int iwl_mac_tx_last_beacon(struct ieee80211_hw *hw);
......
...@@ -1749,8 +1749,7 @@ int iwl_dbgfs_register(struct iwl_priv *priv, const char *name) ...@@ -1749,8 +1749,7 @@ int iwl_dbgfs_register(struct iwl_priv *priv, const char *name)
DEBUGFS_ADD_FILE(sensitivity, dir_debug, S_IRUSR); DEBUGFS_ADD_FILE(sensitivity, dir_debug, S_IRUSR);
DEBUGFS_ADD_FILE(chain_noise, dir_debug, S_IRUSR); DEBUGFS_ADD_FILE(chain_noise, dir_debug, S_IRUSR);
if (priv->cfg->base_params->ucode_tracing) DEBUGFS_ADD_FILE(ucode_tracing, dir_debug, S_IWUSR | S_IRUSR);
DEBUGFS_ADD_FILE(ucode_tracing, dir_debug, S_IWUSR | S_IRUSR);
DEBUGFS_ADD_FILE(ucode_bt_stats, dir_debug, S_IRUSR); DEBUGFS_ADD_FILE(ucode_bt_stats, dir_debug, S_IRUSR);
DEBUGFS_ADD_FILE(reply_tx_error, dir_debug, S_IRUSR); DEBUGFS_ADD_FILE(reply_tx_error, dir_debug, S_IRUSR);
DEBUGFS_ADD_FILE(rxon_flags, dir_debug, S_IWUSR); DEBUGFS_ADD_FILE(rxon_flags, dir_debug, S_IWUSR);
......
...@@ -215,12 +215,6 @@ static int iwlcore_get_nvm_type(struct iwl_priv *priv, u32 hw_rev) ...@@ -215,12 +215,6 @@ static int iwlcore_get_nvm_type(struct iwl_priv *priv, u32 hw_rev)
return nvm_type; return nvm_type;
} }
const u8 *iwlcore_eeprom_query_addr(const struct iwl_priv *priv, size_t offset)
{
BUG_ON(offset >= priv->cfg->base_params->eeprom_size);
return &priv->eeprom[offset];
}
static int iwl_init_otp_access(struct iwl_priv *priv) static int iwl_init_otp_access(struct iwl_priv *priv)
{ {
int ret; int ret;
......
...@@ -309,7 +309,6 @@ int iwl_eeprom_check_sku(struct iwl_priv *priv); ...@@ -309,7 +309,6 @@ int iwl_eeprom_check_sku(struct iwl_priv *priv);
const u8 *iwl_eeprom_query_addr(const struct iwl_priv *priv, size_t offset); const u8 *iwl_eeprom_query_addr(const struct iwl_priv *priv, size_t offset);
int iwlcore_eeprom_verify_signature(struct iwl_priv *priv); int iwlcore_eeprom_verify_signature(struct iwl_priv *priv);
u16 iwl_eeprom_query16(const struct iwl_priv *priv, size_t offset); u16 iwl_eeprom_query16(const struct iwl_priv *priv, size_t offset);
const u8 *iwlcore_eeprom_query_addr(const struct iwl_priv *priv, size_t offset);
int iwl_init_channel_map(struct iwl_priv *priv); int iwl_init_channel_map(struct iwl_priv *priv);
void iwl_free_channel_map(struct iwl_priv *priv); void iwl_free_channel_map(struct iwl_priv *priv);
const struct iwl_channel_info *iwl_get_channel_info( const struct iwl_channel_info *iwl_get_channel_info(
......
...@@ -143,10 +143,12 @@ static int iwl_send_cmd_async(struct iwl_priv *priv, struct iwl_host_cmd *cmd) ...@@ -143,10 +143,12 @@ static int iwl_send_cmd_async(struct iwl_priv *priv, struct iwl_host_cmd *cmd)
{ {
int ret; int ret;
BUG_ON(!(cmd->flags & CMD_ASYNC)); if (WARN_ON(!(cmd->flags & CMD_ASYNC)))
return -EINVAL;
/* An asynchronous command can not expect an SKB to be set. */ /* An asynchronous command can not expect an SKB to be set. */
BUG_ON(cmd->flags & CMD_WANT_SKB); if (WARN_ON(cmd->flags & CMD_WANT_SKB))
return -EINVAL;
/* Assign a generic callback if one is not provided */ /* Assign a generic callback if one is not provided */
if (!cmd->callback) if (!cmd->callback)
...@@ -169,10 +171,12 @@ int iwl_send_cmd_sync(struct iwl_priv *priv, struct iwl_host_cmd *cmd) ...@@ -169,10 +171,12 @@ int iwl_send_cmd_sync(struct iwl_priv *priv, struct iwl_host_cmd *cmd)
int cmd_idx; int cmd_idx;
int ret; int ret;
lockdep_assert_held(&priv->mutex); if (WARN_ON(cmd->flags & CMD_ASYNC))
return -EINVAL;
/* A synchronous command can not have a callback set. */ /* A synchronous command can not have a callback set. */
BUG_ON((cmd->flags & CMD_ASYNC) || cmd->callback); if (WARN_ON(cmd->callback))
return -EINVAL;
IWL_DEBUG_INFO(priv, "Attempting to send sync command %s\n", IWL_DEBUG_INFO(priv, "Attempting to send sync command %s\n",
get_cmd_string(cmd->id)); get_cmd_string(cmd->id));
......
...@@ -61,6 +61,12 @@ static const struct ieee80211_tpt_blink iwl_blink[] = { ...@@ -61,6 +61,12 @@ static const struct ieee80211_tpt_blink iwl_blink[] = {
{ .throughput = 300 * 1024 - 1, .blink_time = 50 }, { .throughput = 300 * 1024 - 1, .blink_time = 50 },
}; };
/* Set led register off */
void iwlagn_led_enable(struct iwl_priv *priv)
{
iwl_write32(priv, CSR_LED_REG, CSR_LED_REG_TRUN_ON);
}
/* /*
* Adjust led blink rate to compensate on a MAC Clock difference on every HW * Adjust led blink rate to compensate on a MAC Clock difference on every HW
* Led blink rate analysis showed an average deviation of 20% on 5000 series * Led blink rate analysis showed an average deviation of 20% on 5000 series
...@@ -84,6 +90,24 @@ static inline u8 iwl_blink_compensation(struct iwl_priv *priv, ...@@ -84,6 +90,24 @@ static inline u8 iwl_blink_compensation(struct iwl_priv *priv,
return (u8)((time * compensation) >> 6); return (u8)((time * compensation) >> 6);
} }
static int iwl_send_led_cmd(struct iwl_priv *priv, struct iwl_led_cmd *led_cmd)
{
struct iwl_host_cmd cmd = {
.id = REPLY_LEDS_CMD,
.len = sizeof(struct iwl_led_cmd),
.data = led_cmd,
.flags = CMD_ASYNC,
.callback = NULL,
};
u32 reg;
reg = iwl_read32(priv, CSR_LED_REG);
if (reg != (reg & CSR_LED_BSM_CTRL_MSK))
iwl_write32(priv, CSR_LED_REG, reg & CSR_LED_BSM_CTRL_MSK);
return iwl_send_cmd(priv, &cmd);
}
/* Set led pattern command */ /* Set led pattern command */
static int iwl_led_cmd(struct iwl_priv *priv, static int iwl_led_cmd(struct iwl_priv *priv,
unsigned long on, unsigned long on,
...@@ -108,7 +132,7 @@ static int iwl_led_cmd(struct iwl_priv *priv, ...@@ -108,7 +132,7 @@ static int iwl_led_cmd(struct iwl_priv *priv,
led_cmd.off = iwl_blink_compensation(priv, off, led_cmd.off = iwl_blink_compensation(priv, off,
priv->cfg->base_params->led_compensation); priv->cfg->base_params->led_compensation);
ret = priv->cfg->ops->led->cmd(priv, &led_cmd); ret = iwl_send_led_cmd(priv, &led_cmd);
if (!ret) { if (!ret) {
priv->blink_on = on; priv->blink_on = on;
priv->blink_off = off; priv->blink_off = off;
......
...@@ -50,6 +50,7 @@ enum iwl_led_mode { ...@@ -50,6 +50,7 @@ enum iwl_led_mode {
IWL_LED_BLINK, IWL_LED_BLINK,
}; };
void iwlagn_led_enable(struct iwl_priv *priv);
void iwl_leds_init(struct iwl_priv *priv); void iwl_leds_init(struct iwl_priv *priv);
void iwl_leds_exit(struct iwl_priv *priv); void iwl_leds_exit(struct iwl_priv *priv);
......
...@@ -188,9 +188,10 @@ static void iwl_static_sleep_cmd(struct iwl_priv *priv, ...@@ -188,9 +188,10 @@ static void iwl_static_sleep_cmd(struct iwl_priv *priv,
table = range_0; table = range_0;
} }
BUG_ON(lvl < 0 || lvl >= IWL_POWER_NUM); if (WARN_ON(lvl < 0 || lvl >= IWL_POWER_NUM))
memset(cmd, 0, sizeof(*cmd));
*cmd = table[lvl].cmd; else
*cmd = table[lvl].cmd;
if (period == 0) { if (period == 0) {
skip = 0; skip = 0;
...@@ -356,12 +357,10 @@ static void iwl_power_build_cmd(struct iwl_priv *priv, ...@@ -356,12 +357,10 @@ static void iwl_power_build_cmd(struct iwl_priv *priv,
if (priv->hw->conf.flags & IEEE80211_CONF_IDLE) if (priv->hw->conf.flags & IEEE80211_CONF_IDLE)
iwl_static_sleep_cmd(priv, cmd, IWL_POWER_INDEX_5, 20); iwl_static_sleep_cmd(priv, cmd, IWL_POWER_INDEX_5, 20);
else if (priv->cfg->ops->lib->tt_ops.lower_power_detection && else if (iwl_tt_is_low_power_state(priv)) {
priv->cfg->ops->lib->tt_ops.tt_power_mode &&
priv->cfg->ops->lib->tt_ops.lower_power_detection(priv)) {
/* in thermal throttling low power state */ /* in thermal throttling low power state */
iwl_static_sleep_cmd(priv, cmd, iwl_static_sleep_cmd(priv, cmd,
priv->cfg->ops->lib->tt_ops.tt_power_mode(priv), dtimper); iwl_tt_current_power_mode(priv), dtimper);
} else if (!enabled) } else if (!enabled)
iwl_power_sleep_cam_cmd(priv, cmd); iwl_power_sleep_cam_cmd(priv, cmd);
else if (priv->power_data.debug_sleep_level_override >= 0) else if (priv->power_data.debug_sleep_level_override >= 0)
......
...@@ -494,7 +494,8 @@ int iwl_remove_station(struct iwl_priv *priv, const u8 sta_id, ...@@ -494,7 +494,8 @@ int iwl_remove_station(struct iwl_priv *priv, const u8 sta_id,
priv->num_stations--; priv->num_stations--;
BUG_ON(priv->num_stations < 0); if (WARN_ON(priv->num_stations < 0))
priv->num_stations = 0;
spin_unlock_irqrestore(&priv->sta_lock, flags); spin_unlock_irqrestore(&priv->sta_lock, flags);
...@@ -679,7 +680,8 @@ void iwl_dealloc_bcast_stations(struct iwl_priv *priv) ...@@ -679,7 +680,8 @@ void iwl_dealloc_bcast_stations(struct iwl_priv *priv)
priv->stations[i].used &= ~IWL_STA_UCODE_ACTIVE; priv->stations[i].used &= ~IWL_STA_UCODE_ACTIVE;
priv->num_stations--; priv->num_stations--;
BUG_ON(priv->num_stations < 0); if (WARN_ON(priv->num_stations < 0))
priv->num_stations = 0;
kfree(priv->stations[i].lq); kfree(priv->stations[i].lq);
priv->stations[i].lq = NULL; priv->stations[i].lq = NULL;
} }
...@@ -775,7 +777,8 @@ int iwl_send_lq_cmd(struct iwl_priv *priv, struct iwl_rxon_context *ctx, ...@@ -775,7 +777,8 @@ int iwl_send_lq_cmd(struct iwl_priv *priv, struct iwl_rxon_context *ctx,
spin_unlock_irqrestore(&priv->sta_lock, flags_spin); spin_unlock_irqrestore(&priv->sta_lock, flags_spin);
iwl_dump_lq_cmd(priv, lq); iwl_dump_lq_cmd(priv, lq);
BUG_ON(init && (cmd.flags & CMD_ASYNC)); if (WARN_ON(init && (cmd.flags & CMD_ASYNC)))
return -EINVAL;
if (is_lq_table_valid(priv, ctx, lq)) if (is_lq_table_valid(priv, ctx, lq))
ret = iwl_send_cmd(priv, &cmd); ret = iwl_send_cmd(priv, &cmd);
......
...@@ -263,11 +263,13 @@ static int iwl_queue_init(struct iwl_priv *priv, struct iwl_queue *q, ...@@ -263,11 +263,13 @@ static int iwl_queue_init(struct iwl_priv *priv, struct iwl_queue *q,
/* count must be power-of-two size, otherwise iwl_queue_inc_wrap /* count must be power-of-two size, otherwise iwl_queue_inc_wrap
* and iwl_queue_dec_wrap are broken. */ * and iwl_queue_dec_wrap are broken. */
BUG_ON(!is_power_of_2(count)); if (WARN_ON(!is_power_of_2(count)))
return -EINVAL;
/* slots_num must be power-of-two size, otherwise /* slots_num must be power-of-two size, otherwise
* get_cmd_index is broken. */ * get_cmd_index is broken. */
BUG_ON(!is_power_of_2(slots_num)); if (WARN_ON(!is_power_of_2(slots_num)))
return -EINVAL;
q->low_mark = q->n_window / 4; q->low_mark = q->n_window / 4;
if (q->low_mark < 4) if (q->low_mark < 4)
...@@ -384,7 +386,9 @@ int iwl_tx_queue_init(struct iwl_priv *priv, struct iwl_tx_queue *txq, ...@@ -384,7 +386,9 @@ int iwl_tx_queue_init(struct iwl_priv *priv, struct iwl_tx_queue *txq,
BUILD_BUG_ON(TFD_QUEUE_SIZE_MAX & (TFD_QUEUE_SIZE_MAX - 1)); BUILD_BUG_ON(TFD_QUEUE_SIZE_MAX & (TFD_QUEUE_SIZE_MAX - 1));
/* Initialize queue's high/low-water marks, and head/tail indexes */ /* Initialize queue's high/low-water marks, and head/tail indexes */
iwl_queue_init(priv, &txq->q, TFD_QUEUE_SIZE_MAX, slots_num, txq_id); ret = iwl_queue_init(priv, &txq->q, TFD_QUEUE_SIZE_MAX, slots_num, txq_id);
if (ret)
return ret;
/* Tell device where to find queue */ /* Tell device where to find queue */
priv->cfg->ops->lib->txq_init(priv, txq); priv->cfg->ops->lib->txq_init(priv, txq);
...@@ -446,14 +450,19 @@ int iwl_enqueue_hcmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd) ...@@ -446,14 +450,19 @@ int iwl_enqueue_hcmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd)
cmd->len = priv->cfg->ops->utils->get_hcmd_size(cmd->id, cmd->len); cmd->len = priv->cfg->ops->utils->get_hcmd_size(cmd->id, cmd->len);
fix_size = (u16)(cmd->len + sizeof(out_cmd->hdr)); fix_size = (u16)(cmd->len + sizeof(out_cmd->hdr));
/* If any of the command structures end up being larger than /*
* If any of the command structures end up being larger than
* the TFD_MAX_PAYLOAD_SIZE, and it sent as a 'small' command then * the TFD_MAX_PAYLOAD_SIZE, and it sent as a 'small' command then
* we will need to increase the size of the TFD entries * we will need to increase the size of the TFD entries
* Also, check to see if command buffer should not exceed the size * Also, check to see if command buffer should not exceed the size
* of device_cmd and max_cmd_size. */ * of device_cmd and max_cmd_size.
BUG_ON((fix_size > TFD_MAX_PAYLOAD_SIZE) && */
!(cmd->flags & CMD_SIZE_HUGE)); if (WARN_ON((fix_size > TFD_MAX_PAYLOAD_SIZE) &&
BUG_ON(fix_size > IWL_MAX_CMD_SIZE); !(cmd->flags & CMD_SIZE_HUGE)))
return -EINVAL;
if (WARN_ON(fix_size > IWL_MAX_CMD_SIZE))
return -EINVAL;
if (iwl_is_rfkill(priv) || iwl_is_ctkill(priv)) { if (iwl_is_rfkill(priv) || iwl_is_ctkill(priv)) {
IWL_WARN(priv, "Not sending command - %s KILL\n", IWL_WARN(priv, "Not sending command - %s KILL\n",
...@@ -461,16 +470,21 @@ int iwl_enqueue_hcmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd) ...@@ -461,16 +470,21 @@ int iwl_enqueue_hcmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd)
return -EIO; return -EIO;
} }
/*
* As we only have a single huge buffer, check that the command
* is synchronous (otherwise buffers could end up being reused).
*/
if (WARN_ON((cmd->flags & CMD_ASYNC) && (cmd->flags & CMD_SIZE_HUGE)))
return -EINVAL;
spin_lock_irqsave(&priv->hcmd_lock, flags); spin_lock_irqsave(&priv->hcmd_lock, flags);
if (iwl_queue_space(q) < ((cmd->flags & CMD_ASYNC) ? 2 : 1)) { if (iwl_queue_space(q) < ((cmd->flags & CMD_ASYNC) ? 2 : 1)) {
spin_unlock_irqrestore(&priv->hcmd_lock, flags); spin_unlock_irqrestore(&priv->hcmd_lock, flags);
IWL_ERR(priv, "No space in command queue\n"); IWL_ERR(priv, "No space in command queue\n");
if (priv->cfg->ops->lib->tt_ops.ct_kill_check) { is_ct_kill = iwl_check_for_ct_kill(priv);
is_ct_kill =
priv->cfg->ops->lib->tt_ops.ct_kill_check(priv);
}
if (!is_ct_kill) { if (!is_ct_kill) {
IWL_ERR(priv, "Restarting adapter due to queue full\n"); IWL_ERR(priv, "Restarting adapter due to queue full\n");
iwlagn_fw_error(priv, false); iwlagn_fw_error(priv, false);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment