You've already forked linux-rockchip
mirror of
https://github.com/armbian/linux-rockchip.git
synced 2026-01-06 11:08:10 -08:00
[IWLWIFI]: add iwlwifi wireless drivers
This patch adds the mac80211 based wireless drivers for the Intel PRO/Wireless 3945ABG/BG Network Connection and Intel Wireless WiFi Link AGN (4965) adapters. [ Move driver into it's own directory -DaveM ] Signed-off-by: Zhu Yi <yi.zhu@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -2080,6 +2080,15 @@ L: http://lists.sourceforge.net/mailman/listinfo/ipw2100-devel
|
||||
W: http://ipw2200.sourceforge.net
|
||||
S: Supported
|
||||
|
||||
INTEL WIRELESS WIFI LINK (iwlwifi)
|
||||
P: Zhu Yi
|
||||
M: yi.zhu@intel.com
|
||||
L: linux-wireless@vger.kernel.org
|
||||
L: ipw3945-devel@lists.sourceforge.net
|
||||
W: http://intellinuxwireless.org
|
||||
T: git git://intellinuxwireless.org/repos/iwlwifi
|
||||
S: Supported
|
||||
|
||||
IOC3 ETHERNET DRIVER
|
||||
P: Ralf Baechle
|
||||
M: ralf@linux-mips.org
|
||||
|
||||
@@ -577,6 +577,7 @@ config ADM8211
|
||||
|
||||
Thanks to Infineon-ADMtek for their support of this driver.
|
||||
|
||||
source "drivers/net/wireless/iwlwifi/Kconfig"
|
||||
source "drivers/net/wireless/hostap/Kconfig"
|
||||
source "drivers/net/wireless/bcm43xx/Kconfig"
|
||||
source "drivers/net/wireless/b43/Kconfig"
|
||||
|
||||
@@ -51,3 +51,5 @@ rtl8187-objs := rtl8187_dev.o rtl8187_rtl8225.o
|
||||
obj-$(CONFIG_RTL8187) += rtl8187.o
|
||||
|
||||
obj-$(CONFIG_ADM8211) += adm8211.o
|
||||
|
||||
obj-$(CONFIG_IWLWIFI) += iwlwifi/
|
||||
|
||||
128
drivers/net/wireless/iwlwifi/Kconfig
Normal file
128
drivers/net/wireless/iwlwifi/Kconfig
Normal file
@@ -0,0 +1,128 @@
|
||||
config IWLWIFI
|
||||
bool "Intel Wireless WiFi Link Drivers"
|
||||
depends on PCI && MAC80211 && WLAN_80211 && EXPERIMENTAL
|
||||
select FW_LOADER
|
||||
default n
|
||||
---help---
|
||||
Select to enable drivers based on the iwlwifi project. This
|
||||
project provides a common foundation for Intel's wireless
|
||||
drivers designed to use the mac80211 subsystem.
|
||||
|
||||
See <file:Documentation/networking/README.iwlwifi> for
|
||||
information on the capabilities currently enabled in this
|
||||
driver and for tips for debugging issues and problems.
|
||||
|
||||
config IWLWIFI_DEBUG
|
||||
bool "Enable full debugging output in iwlwifi drivers"
|
||||
depends on IWLWIFI
|
||||
default y
|
||||
---help---
|
||||
This option will enable debug tracing output for the iwlwifi
|
||||
drivers.
|
||||
|
||||
This will result in the kernel module being ~100k larger. You can
|
||||
control which debug output is sent to the kernel log by setting the
|
||||
value in
|
||||
|
||||
/sys/bus/pci/drivers/${DRIVER}/debug_level
|
||||
|
||||
This entry will only exist if this option is enabled.
|
||||
|
||||
To set a value, simply echo an 8-byte hex value to the same file:
|
||||
|
||||
% echo 0x43fff > /sys/bus/pci/drivers/${DRIVER}/debug_level
|
||||
|
||||
You can find the list of debug mask values in:
|
||||
drivers/net/wireless/mac80211/iwlwifi/iwl-debug.h
|
||||
|
||||
If this is your first time using this driver, you should say Y here
|
||||
as the debug information can assist others in helping you resolve
|
||||
any problems you may encounter.
|
||||
|
||||
config IWLWIFI_SENSITIVITY
|
||||
bool "Enable Sensitivity Calibration in iwlwifi drivers"
|
||||
depends on IWLWIFI
|
||||
default y
|
||||
---help---
|
||||
This option will enable sensitivity calibration for the iwlwifi
|
||||
drivers.
|
||||
|
||||
config IWLWIFI_SPECTRUM_MEASUREMENT
|
||||
bool "Enable Spectrum Measurement in iwlwifi drivers"
|
||||
depends on IWLWIFI
|
||||
default y
|
||||
---help---
|
||||
This option will enable spectrum measurement for the iwlwifi drivers.
|
||||
|
||||
config IWLWIFI_QOS
|
||||
bool "Enable Wireless QoS in iwlwifi drivers"
|
||||
depends on IWLWIFI
|
||||
default y
|
||||
---help---
|
||||
This option will enable wireless quality of service (QoS) for the
|
||||
iwlwifi drivers.
|
||||
|
||||
config IWLWIFI_HT
|
||||
bool "Enable 802.11n HT features in iwlwifi drivers"
|
||||
depends on EXPERIMENTAL
|
||||
depends on IWLWIFI && MAC80211_HT
|
||||
default n
|
||||
---help---
|
||||
This option enables IEEE 802.11n High Throughput features
|
||||
for the iwlwifi drivers.
|
||||
|
||||
config IWL4965
|
||||
tristate "Intel Wireless WiFi 4965AGN"
|
||||
depends on m && IWLWIFI && EXPERIMENTAL
|
||||
default m
|
||||
---help---
|
||||
Select to build the driver supporting the:
|
||||
|
||||
Intel Wireless WiFi Link 4965AGN
|
||||
|
||||
This driver uses the kernel's mac80211 subsystem.
|
||||
|
||||
See <file:Documentation/networking/README.iwlwifi> for
|
||||
information on the capabilities currently enabled in this
|
||||
driver and for tips for debugging any issues or problems.
|
||||
|
||||
In order to use this driver, you will need a microcode (uCode)
|
||||
image for it. You can obtain the microcode from:
|
||||
|
||||
<http://intellinuxwireless.org/>.
|
||||
|
||||
See the above referenced README.iwlwifi for information on where
|
||||
to install the microcode images.
|
||||
|
||||
If you want to compile the driver as a module ( = code which can be
|
||||
inserted in and remvoed from the running kernel whenever you want),
|
||||
say M here and read <file:Documentation/modules.txt>. The module
|
||||
will be called iwl4965.ko.
|
||||
|
||||
config IWL3945
|
||||
tristate "Intel PRO/Wireless 3945ABG/BG Network Connection"
|
||||
depends on m && IWLWIFI && EXPERIMENTAL
|
||||
default m
|
||||
---help---
|
||||
Select to build the driver supporting the:
|
||||
|
||||
Intel PRO/Wireless 3945ABG/BG Network Connection
|
||||
|
||||
This driver uses the kernel's mac80211 subsystem.
|
||||
|
||||
See <file:Documentation/networking/README.iwlwifi> for
|
||||
information on the capabilities currently enabled in this
|
||||
driver and for tips for debugging any issues or problems.
|
||||
|
||||
In order to use this driver, you will need a microcode (uCode)
|
||||
image for it. You can obtain the microcode from:
|
||||
|
||||
<http://intellinuxwireless.org/>.
|
||||
|
||||
See the above referenced README.iwlwifi for information on where
|
||||
to install the microcode images.
|
||||
|
||||
If you want to compile the driver as a module ( = code which can be
|
||||
inserted in and remvoed from the running kernel whenever you want),
|
||||
say M here and read <file:Documentation/modules.txt>. The module
|
||||
will be called iwl3945.ko.
|
||||
11
drivers/net/wireless/iwlwifi/Makefile
Normal file
11
drivers/net/wireless/iwlwifi/Makefile
Normal file
@@ -0,0 +1,11 @@
|
||||
obj-$(CONFIG_IWL3945) += iwl3945.o
|
||||
iwl3945-objs = iwl3945-base.o iwl-3945.o iwl-3945-rs.o
|
||||
CFLAGS_iwl3945-base.o = -DIWL=3945
|
||||
CFLAGS_iwl-3945.o = -DIWL=3945
|
||||
CFLAGS_iwl-3945-rs.o = -DIWL=3945
|
||||
|
||||
obj-$(CONFIG_IWL4965) += iwl4965.o
|
||||
iwl4965-objs = iwl4965-base.o iwl-4965.o iwl-4965-rs.o
|
||||
CFLAGS_iwl4965-base.o = -DIWL=4965
|
||||
CFLAGS_iwl-4965.o = -DIWL=4965
|
||||
CFLAGS_iwl-4965-rs.o = -DIWL=4965
|
||||
118
drivers/net/wireless/iwlwifi/iwl-3945-hw.h
Normal file
118
drivers/net/wireless/iwlwifi/iwl-3945-hw.h
Normal file
@@ -0,0 +1,118 @@
|
||||
/******************************************************************************
|
||||
*
|
||||
* This file is provided under a dual BSD/GPLv2 license. When using or
|
||||
* redistributing this file, you may do so under either license.
|
||||
*
|
||||
* GPL LICENSE SUMMARY
|
||||
*
|
||||
* Copyright(c) 2005 - 2007 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 Geeral 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.GPL.
|
||||
*
|
||||
* Contact Information:
|
||||
* James P. Ketrenos <ipw2100-admin@linux.intel.com>
|
||||
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
|
||||
*
|
||||
* BSD LICENSE
|
||||
*
|
||||
* Copyright(c) 2005 - 2007 Intel Corporation. All rights reserved.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name Intel Corporation nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef __iwl_3945_hw__
|
||||
#define __iwl_3945_hw__
|
||||
|
||||
#define IWL_RX_BUF_SIZE 3000
|
||||
/* card static random access memory (SRAM) for processor data and instructs */
|
||||
#define ALM_RTC_INST_UPPER_BOUND (0x014000)
|
||||
#define ALM_RTC_DATA_UPPER_BOUND (0x808000)
|
||||
|
||||
#define ALM_RTC_INST_SIZE (ALM_RTC_INST_UPPER_BOUND - RTC_INST_LOWER_BOUND)
|
||||
#define ALM_RTC_DATA_SIZE (ALM_RTC_DATA_UPPER_BOUND - RTC_DATA_LOWER_BOUND)
|
||||
|
||||
#define IWL_MAX_BSM_SIZE ALM_RTC_INST_SIZE
|
||||
#define IWL_MAX_INST_SIZE ALM_RTC_INST_SIZE
|
||||
#define IWL_MAX_DATA_SIZE ALM_RTC_DATA_SIZE
|
||||
#define IWL_MAX_NUM_QUEUES 8
|
||||
|
||||
static inline int iwl_hw_valid_rtc_data_addr(u32 addr)
|
||||
{
|
||||
return (addr >= RTC_DATA_LOWER_BOUND) &&
|
||||
(addr < ALM_RTC_DATA_UPPER_BOUND);
|
||||
}
|
||||
|
||||
/* Base physical address of iwl_shared is provided to FH_TSSR_CBB_BASE
|
||||
* and &iwl_shared.rx_read_ptr[0] is provided to FH_RCSR_RPTR_ADDR(0) */
|
||||
struct iwl_shared {
|
||||
__le32 tx_base_ptr[8];
|
||||
__le32 rx_read_ptr[3];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct iwl_tfd_frame_data {
|
||||
__le32 addr;
|
||||
__le32 len;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct iwl_tfd_frame {
|
||||
__le32 control_flags;
|
||||
struct iwl_tfd_frame_data pa[4];
|
||||
u8 reserved[28];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
static inline u8 iwl_hw_get_rate(__le16 rate_n_flags)
|
||||
{
|
||||
return le16_to_cpu(rate_n_flags) & 0xFF;
|
||||
}
|
||||
|
||||
static inline u16 iwl_hw_get_rate_n_flags(__le16 rate_n_flags)
|
||||
{
|
||||
return le16_to_cpu(rate_n_flags);
|
||||
}
|
||||
|
||||
static inline __le16 iwl_hw_set_rate_n_flags(u8 rate, u16 flags)
|
||||
{
|
||||
return cpu_to_le16((u16)rate|flags);
|
||||
}
|
||||
#endif
|
||||
979
drivers/net/wireless/iwlwifi/iwl-3945-rs.c
Normal file
979
drivers/net/wireless/iwlwifi/iwl-3945-rs.c
Normal file
File diff suppressed because it is too large
Load Diff
191
drivers/net/wireless/iwlwifi/iwl-3945-rs.h
Normal file
191
drivers/net/wireless/iwlwifi/iwl-3945-rs.h
Normal file
@@ -0,0 +1,191 @@
|
||||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2005 - 2007 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:
|
||||
* James P. Ketrenos <ipw2100-admin@linux.intel.com>
|
||||
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef __iwl_3945_rs_h__
|
||||
#define __iwl_3945_rs_h__
|
||||
|
||||
struct iwl_rate_info {
|
||||
u8 plcp;
|
||||
u8 ieee;
|
||||
u8 prev_ieee; /* previous rate in IEEE speeds */
|
||||
u8 next_ieee; /* next rate in IEEE speeds */
|
||||
u8 prev_rs; /* previous rate used in rs algo */
|
||||
u8 next_rs; /* next rate used in rs algo */
|
||||
u8 prev_rs_tgg; /* previous rate used in TGG rs algo */
|
||||
u8 next_rs_tgg; /* next rate used in TGG rs algo */
|
||||
};
|
||||
|
||||
enum {
|
||||
IWL_RATE_6M_INDEX = 0,
|
||||
IWL_RATE_9M_INDEX,
|
||||
IWL_RATE_12M_INDEX,
|
||||
IWL_RATE_18M_INDEX,
|
||||
IWL_RATE_24M_INDEX,
|
||||
IWL_RATE_36M_INDEX,
|
||||
IWL_RATE_48M_INDEX,
|
||||
IWL_RATE_54M_INDEX,
|
||||
IWL_RATE_1M_INDEX,
|
||||
IWL_RATE_2M_INDEX,
|
||||
IWL_RATE_5M_INDEX,
|
||||
IWL_RATE_11M_INDEX,
|
||||
IWL_RATE_COUNT,
|
||||
IWL_RATE_INVM_INDEX,
|
||||
IWL_RATE_INVALID = IWL_RATE_INVM_INDEX
|
||||
};
|
||||
|
||||
enum {
|
||||
IWL_FIRST_OFDM_RATE = IWL_RATE_6M_INDEX,
|
||||
IWL_LAST_OFDM_RATE = IWL_RATE_54M_INDEX,
|
||||
IWL_FIRST_CCK_RATE = IWL_RATE_1M_INDEX,
|
||||
IWL_LAST_CCK_RATE = IWL_RATE_11M_INDEX,
|
||||
};
|
||||
|
||||
/* #define vs. enum to keep from defaulting to 'large integer' */
|
||||
#define IWL_RATE_6M_MASK (1<<IWL_RATE_6M_INDEX)
|
||||
#define IWL_RATE_9M_MASK (1<<IWL_RATE_9M_INDEX)
|
||||
#define IWL_RATE_12M_MASK (1<<IWL_RATE_12M_INDEX)
|
||||
#define IWL_RATE_18M_MASK (1<<IWL_RATE_18M_INDEX)
|
||||
#define IWL_RATE_24M_MASK (1<<IWL_RATE_24M_INDEX)
|
||||
#define IWL_RATE_36M_MASK (1<<IWL_RATE_36M_INDEX)
|
||||
#define IWL_RATE_48M_MASK (1<<IWL_RATE_48M_INDEX)
|
||||
#define IWL_RATE_54M_MASK (1<<IWL_RATE_54M_INDEX)
|
||||
#define IWL_RATE_1M_MASK (1<<IWL_RATE_1M_INDEX)
|
||||
#define IWL_RATE_2M_MASK (1<<IWL_RATE_2M_INDEX)
|
||||
#define IWL_RATE_5M_MASK (1<<IWL_RATE_5M_INDEX)
|
||||
#define IWL_RATE_11M_MASK (1<<IWL_RATE_11M_INDEX)
|
||||
|
||||
enum {
|
||||
IWL_RATE_6M_PLCP = 13,
|
||||
IWL_RATE_9M_PLCP = 15,
|
||||
IWL_RATE_12M_PLCP = 5,
|
||||
IWL_RATE_18M_PLCP = 7,
|
||||
IWL_RATE_24M_PLCP = 9,
|
||||
IWL_RATE_36M_PLCP = 11,
|
||||
IWL_RATE_48M_PLCP = 1,
|
||||
IWL_RATE_54M_PLCP = 3,
|
||||
IWL_RATE_1M_PLCP = 10,
|
||||
IWL_RATE_2M_PLCP = 20,
|
||||
IWL_RATE_5M_PLCP = 55,
|
||||
IWL_RATE_11M_PLCP = 110,
|
||||
};
|
||||
|
||||
enum {
|
||||
IWL_RATE_6M_IEEE = 12,
|
||||
IWL_RATE_9M_IEEE = 18,
|
||||
IWL_RATE_12M_IEEE = 24,
|
||||
IWL_RATE_18M_IEEE = 36,
|
||||
IWL_RATE_24M_IEEE = 48,
|
||||
IWL_RATE_36M_IEEE = 72,
|
||||
IWL_RATE_48M_IEEE = 96,
|
||||
IWL_RATE_54M_IEEE = 108,
|
||||
IWL_RATE_1M_IEEE = 2,
|
||||
IWL_RATE_2M_IEEE = 4,
|
||||
IWL_RATE_5M_IEEE = 11,
|
||||
IWL_RATE_11M_IEEE = 22,
|
||||
};
|
||||
|
||||
#define IWL_CCK_BASIC_RATES_MASK \
|
||||
(IWL_RATE_1M_MASK | \
|
||||
IWL_RATE_2M_MASK)
|
||||
|
||||
#define IWL_CCK_RATES_MASK \
|
||||
(IWL_BASIC_RATES_MASK | \
|
||||
IWL_RATE_5M_MASK | \
|
||||
IWL_RATE_11M_MASK)
|
||||
|
||||
#define IWL_OFDM_BASIC_RATES_MASK \
|
||||
(IWL_RATE_6M_MASK | \
|
||||
IWL_RATE_12M_MASK | \
|
||||
IWL_RATE_24M_MASK)
|
||||
|
||||
#define IWL_OFDM_RATES_MASK \
|
||||
(IWL_OFDM_BASIC_RATES_MASK | \
|
||||
IWL_RATE_9M_MASK | \
|
||||
IWL_RATE_18M_MASK | \
|
||||
IWL_RATE_36M_MASK | \
|
||||
IWL_RATE_48M_MASK | \
|
||||
IWL_RATE_54M_MASK)
|
||||
|
||||
#define IWL_BASIC_RATES_MASK \
|
||||
(IWL_OFDM_BASIC_RATES_MASK | \
|
||||
IWL_CCK_BASIC_RATES_MASK)
|
||||
|
||||
#define IWL_RATES_MASK ((1<<IWL_RATE_COUNT)-1)
|
||||
|
||||
#define IWL_INVALID_VALUE -1
|
||||
|
||||
#define IWL_MIN_RSSI_VAL -100
|
||||
#define IWL_MAX_RSSI_VAL 0
|
||||
|
||||
extern const struct iwl_rate_info iwl_rates[IWL_RATE_COUNT];
|
||||
|
||||
static inline u8 iwl_get_prev_ieee_rate(u8 rate_index)
|
||||
{
|
||||
u8 rate = iwl_rates[rate_index].prev_ieee;
|
||||
|
||||
if (rate == IWL_RATE_INVALID)
|
||||
rate = rate_index;
|
||||
return rate;
|
||||
}
|
||||
|
||||
/**
|
||||
* iwl_fill_rs_info - Fill an output text buffer with the rate representation
|
||||
*
|
||||
* NOTE: This is provided as a quick mechanism for a user to visualize
|
||||
* the performance of the rate control alogirthm and is not meant to be
|
||||
* parsed software.
|
||||
*/
|
||||
extern int iwl_fill_rs_info(struct ieee80211_hw *, char *buf, u8 sta_id);
|
||||
|
||||
/**
|
||||
* iwl_rate_scale_init - Initialize the rate scale table based on assoc info
|
||||
*
|
||||
* The specific througput table used is based on the type of network
|
||||
* the associated with, including A, B, G, and G w/ TGG protection
|
||||
*/
|
||||
extern void iwl_rate_scale_init(struct ieee80211_hw *hw, s32 sta_id);
|
||||
|
||||
/**
|
||||
* iwl_rate_control_register - Register the rate control algorithm callbacks
|
||||
*
|
||||
* Since the rate control algorithm is hardware specific, there is no need
|
||||
* or reason to place it as a stand alone module. The driver can call
|
||||
* iwl_rate_control_register in order to register the rate control callbacks
|
||||
* with the mac80211 subsystem. This should be performed prior to calling
|
||||
* ieee80211_register_hw
|
||||
*
|
||||
*/
|
||||
extern void iwl_rate_control_register(struct ieee80211_hw *hw);
|
||||
|
||||
/**
|
||||
* iwl_rate_control_unregister - Unregister the rate control callbacks
|
||||
*
|
||||
* This should be called after calling ieee80211_unregister_hw, but before
|
||||
* the driver is unloaded.
|
||||
*/
|
||||
extern void iwl_rate_control_unregister(struct ieee80211_hw *hw);
|
||||
|
||||
#endif
|
||||
2290
drivers/net/wireless/iwlwifi/iwl-3945.c
Normal file
2290
drivers/net/wireless/iwlwifi/iwl-3945.c
Normal file
File diff suppressed because it is too large
Load Diff
41
drivers/net/wireless/iwlwifi/iwl-3945.h
Normal file
41
drivers/net/wireless/iwlwifi/iwl-3945.h
Normal file
@@ -0,0 +1,41 @@
|
||||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2003 - 2007 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:
|
||||
* James P. Ketrenos <ipw2100-admin@linux.intel.com>
|
||||
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef __iwl_3945_h__
|
||||
#define __iwl_3945_h__
|
||||
|
||||
/*
|
||||
* Forward declare iwl-3945.c functions for iwl-base.c
|
||||
*/
|
||||
extern int iwl_eeprom_aqcuire_semaphore(struct iwl_priv *priv);
|
||||
extern __le32 iwl3945_get_antenna_flags(const struct iwl_priv *priv);
|
||||
extern int iwl3945_init_hw_rate_table(struct iwl_priv *priv);
|
||||
extern void iwl3945_reg_txpower_periodic(struct iwl_priv *priv);
|
||||
extern void iwl3945_bg_reg_txpower_periodic(struct work_struct *work);
|
||||
extern int iwl3945_txpower_set_from_eeprom(struct iwl_priv *priv);
|
||||
extern u8 iwl3945_sync_sta(struct iwl_priv *priv, int sta_id,
|
||||
u16 tx_rate, u8 flags);
|
||||
#endif
|
||||
581
drivers/net/wireless/iwlwifi/iwl-4965-hw.h
Normal file
581
drivers/net/wireless/iwlwifi/iwl-4965-hw.h
Normal file
File diff suppressed because it is too large
Load Diff
2118
drivers/net/wireless/iwlwifi/iwl-4965-rs.c
Normal file
2118
drivers/net/wireless/iwlwifi/iwl-4965-rs.c
Normal file
File diff suppressed because it is too large
Load Diff
266
drivers/net/wireless/iwlwifi/iwl-4965-rs.h
Normal file
266
drivers/net/wireless/iwlwifi/iwl-4965-rs.h
Normal file
@@ -0,0 +1,266 @@
|
||||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2003 - 2007 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:
|
||||
* James P. Ketrenos <ipw2100-admin@linux.intel.com>
|
||||
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef __iwl_4965_rs_h__
|
||||
#define __iwl_4965_rs_h__
|
||||
|
||||
#include "iwl-4965.h"
|
||||
|
||||
struct iwl_rate_info {
|
||||
u8 plcp;
|
||||
u8 plcp_siso;
|
||||
u8 plcp_mimo;
|
||||
u8 ieee;
|
||||
u8 prev_ieee; /* previous rate in IEEE speeds */
|
||||
u8 next_ieee; /* next rate in IEEE speeds */
|
||||
u8 prev_rs; /* previous rate used in rs algo */
|
||||
u8 next_rs; /* next rate used in rs algo */
|
||||
u8 prev_rs_tgg; /* previous rate used in TGG rs algo */
|
||||
u8 next_rs_tgg; /* next rate used in TGG rs algo */
|
||||
};
|
||||
|
||||
enum {
|
||||
IWL_RATE_1M_INDEX = 0,
|
||||
IWL_RATE_2M_INDEX,
|
||||
IWL_RATE_5M_INDEX,
|
||||
IWL_RATE_11M_INDEX,
|
||||
IWL_RATE_6M_INDEX,
|
||||
IWL_RATE_9M_INDEX,
|
||||
IWL_RATE_12M_INDEX,
|
||||
IWL_RATE_18M_INDEX,
|
||||
IWL_RATE_24M_INDEX,
|
||||
IWL_RATE_36M_INDEX,
|
||||
IWL_RATE_48M_INDEX,
|
||||
IWL_RATE_54M_INDEX,
|
||||
IWL_RATE_60M_INDEX,
|
||||
IWL_RATE_COUNT,
|
||||
IWL_RATE_INVM_INDEX = IWL_RATE_COUNT,
|
||||
IWL_RATE_INVALID = IWL_RATE_INVM_INDEX
|
||||
};
|
||||
|
||||
enum {
|
||||
IWL_FIRST_OFDM_RATE = IWL_RATE_6M_INDEX,
|
||||
IWL_LAST_OFDM_RATE = IWL_RATE_60M_INDEX,
|
||||
IWL_FIRST_CCK_RATE = IWL_RATE_1M_INDEX,
|
||||
IWL_LAST_CCK_RATE = IWL_RATE_11M_INDEX,
|
||||
};
|
||||
|
||||
/* #define vs. enum to keep from defaulting to 'large integer' */
|
||||
#define IWL_RATE_6M_MASK (1<<IWL_RATE_6M_INDEX)
|
||||
#define IWL_RATE_9M_MASK (1<<IWL_RATE_9M_INDEX)
|
||||
#define IWL_RATE_12M_MASK (1<<IWL_RATE_12M_INDEX)
|
||||
#define IWL_RATE_18M_MASK (1<<IWL_RATE_18M_INDEX)
|
||||
#define IWL_RATE_24M_MASK (1<<IWL_RATE_24M_INDEX)
|
||||
#define IWL_RATE_36M_MASK (1<<IWL_RATE_36M_INDEX)
|
||||
#define IWL_RATE_48M_MASK (1<<IWL_RATE_48M_INDEX)
|
||||
#define IWL_RATE_54M_MASK (1<<IWL_RATE_54M_INDEX)
|
||||
#define IWL_RATE_60M_MASK (1<<IWL_RATE_60M_INDEX)
|
||||
#define IWL_RATE_1M_MASK (1<<IWL_RATE_1M_INDEX)
|
||||
#define IWL_RATE_2M_MASK (1<<IWL_RATE_2M_INDEX)
|
||||
#define IWL_RATE_5M_MASK (1<<IWL_RATE_5M_INDEX)
|
||||
#define IWL_RATE_11M_MASK (1<<IWL_RATE_11M_INDEX)
|
||||
|
||||
enum {
|
||||
IWL_RATE_6M_PLCP = 13,
|
||||
IWL_RATE_9M_PLCP = 15,
|
||||
IWL_RATE_12M_PLCP = 5,
|
||||
IWL_RATE_18M_PLCP = 7,
|
||||
IWL_RATE_24M_PLCP = 9,
|
||||
IWL_RATE_36M_PLCP = 11,
|
||||
IWL_RATE_48M_PLCP = 1,
|
||||
IWL_RATE_54M_PLCP = 3,
|
||||
IWL_RATE_60M_PLCP = 3,
|
||||
IWL_RATE_1M_PLCP = 10,
|
||||
IWL_RATE_2M_PLCP = 20,
|
||||
IWL_RATE_5M_PLCP = 55,
|
||||
IWL_RATE_11M_PLCP = 110,
|
||||
};
|
||||
|
||||
/* OFDM HT rate plcp */
|
||||
enum {
|
||||
IWL_RATE_SISO_6M_PLCP = 0,
|
||||
IWL_RATE_SISO_12M_PLCP = 1,
|
||||
IWL_RATE_SISO_18M_PLCP = 2,
|
||||
IWL_RATE_SISO_24M_PLCP = 3,
|
||||
IWL_RATE_SISO_36M_PLCP = 4,
|
||||
IWL_RATE_SISO_48M_PLCP = 5,
|
||||
IWL_RATE_SISO_54M_PLCP = 6,
|
||||
IWL_RATE_SISO_60M_PLCP = 7,
|
||||
IWL_RATE_MIMO_6M_PLCP = 0x8,
|
||||
IWL_RATE_MIMO_12M_PLCP = 0x9,
|
||||
IWL_RATE_MIMO_18M_PLCP = 0xa,
|
||||
IWL_RATE_MIMO_24M_PLCP = 0xb,
|
||||
IWL_RATE_MIMO_36M_PLCP = 0xc,
|
||||
IWL_RATE_MIMO_48M_PLCP = 0xd,
|
||||
IWL_RATE_MIMO_54M_PLCP = 0xe,
|
||||
IWL_RATE_MIMO_60M_PLCP = 0xf,
|
||||
IWL_RATE_SISO_INVM_PLCP,
|
||||
IWL_RATE_MIMO_INVM_PLCP = IWL_RATE_SISO_INVM_PLCP,
|
||||
};
|
||||
|
||||
enum {
|
||||
IWL_RATE_6M_IEEE = 12,
|
||||
IWL_RATE_9M_IEEE = 18,
|
||||
IWL_RATE_12M_IEEE = 24,
|
||||
IWL_RATE_18M_IEEE = 36,
|
||||
IWL_RATE_24M_IEEE = 48,
|
||||
IWL_RATE_36M_IEEE = 72,
|
||||
IWL_RATE_48M_IEEE = 96,
|
||||
IWL_RATE_54M_IEEE = 108,
|
||||
IWL_RATE_60M_IEEE = 120,
|
||||
IWL_RATE_1M_IEEE = 2,
|
||||
IWL_RATE_2M_IEEE = 4,
|
||||
IWL_RATE_5M_IEEE = 11,
|
||||
IWL_RATE_11M_IEEE = 22,
|
||||
};
|
||||
|
||||
#define IWL_CCK_BASIC_RATES_MASK \
|
||||
(IWL_RATE_1M_MASK | \
|
||||
IWL_RATE_2M_MASK)
|
||||
|
||||
#define IWL_CCK_RATES_MASK \
|
||||
(IWL_BASIC_RATES_MASK | \
|
||||
IWL_RATE_5M_MASK | \
|
||||
IWL_RATE_11M_MASK)
|
||||
|
||||
#define IWL_OFDM_BASIC_RATES_MASK \
|
||||
(IWL_RATE_6M_MASK | \
|
||||
IWL_RATE_12M_MASK | \
|
||||
IWL_RATE_24M_MASK)
|
||||
|
||||
#define IWL_OFDM_RATES_MASK \
|
||||
(IWL_OFDM_BASIC_RATES_MASK | \
|
||||
IWL_RATE_9M_MASK | \
|
||||
IWL_RATE_18M_MASK | \
|
||||
IWL_RATE_36M_MASK | \
|
||||
IWL_RATE_48M_MASK | \
|
||||
IWL_RATE_54M_MASK)
|
||||
|
||||
#define IWL_BASIC_RATES_MASK \
|
||||
(IWL_OFDM_BASIC_RATES_MASK | \
|
||||
IWL_CCK_BASIC_RATES_MASK)
|
||||
|
||||
#define IWL_RATES_MASK ((1<<IWL_RATE_COUNT)-1)
|
||||
|
||||
#define IWL_INVALID_VALUE -1
|
||||
|
||||
#define IWL_MIN_RSSI_VAL -100
|
||||
#define IWL_MAX_RSSI_VAL 0
|
||||
|
||||
#define IWL_LEGACY_SWITCH_ANTENNA 0
|
||||
#define IWL_LEGACY_SWITCH_SISO 1
|
||||
#define IWL_LEGACY_SWITCH_MIMO 2
|
||||
|
||||
#define IWL_RS_GOOD_RATIO 12800
|
||||
|
||||
#define IWL_ACTION_LIMIT 3
|
||||
#define IWL_LEGACY_FAILURE_LIMIT 160
|
||||
#define IWL_LEGACY_SUCCESS_LIMIT 480
|
||||
#define IWL_LEGACY_TABLE_COUNT 160
|
||||
|
||||
#define IWL_NONE_LEGACY_FAILURE_LIMIT 400
|
||||
#define IWL_NONE_LEGACY_SUCCESS_LIMIT 4500
|
||||
#define IWL_NONE_LEGACY_TABLE_COUNT 1500
|
||||
|
||||
#define IWL_RATE_SCALE_SWITCH (10880)
|
||||
|
||||
#define IWL_SISO_SWITCH_ANTENNA 0
|
||||
#define IWL_SISO_SWITCH_MIMO 1
|
||||
#define IWL_SISO_SWITCH_GI 2
|
||||
|
||||
#define IWL_MIMO_SWITCH_ANTENNA_A 0
|
||||
#define IWL_MIMO_SWITCH_ANTENNA_B 1
|
||||
#define IWL_MIMO_SWITCH_GI 2
|
||||
|
||||
#define LQ_SIZE 2
|
||||
|
||||
extern const struct iwl_rate_info iwl_rates[IWL_RATE_COUNT];
|
||||
|
||||
enum iwl_table_type {
|
||||
LQ_NONE,
|
||||
LQ_G,
|
||||
LQ_A,
|
||||
LQ_SISO,
|
||||
LQ_MIMO,
|
||||
LQ_MAX,
|
||||
};
|
||||
|
||||
enum iwl_antenna_type {
|
||||
ANT_NONE,
|
||||
ANT_MAIN,
|
||||
ANT_AUX,
|
||||
ANT_BOTH,
|
||||
};
|
||||
|
||||
static inline u8 iwl_get_prev_ieee_rate(u8 rate_index)
|
||||
{
|
||||
u8 rate = iwl_rates[rate_index].prev_ieee;
|
||||
|
||||
if (rate == IWL_RATE_INVALID)
|
||||
rate = rate_index;
|
||||
return rate;
|
||||
}
|
||||
|
||||
extern int iwl_rate_index_from_plcp(int plcp);
|
||||
|
||||
/**
|
||||
* iwl_fill_rs_info - Fill an output text buffer with the rate representation
|
||||
*
|
||||
* NOTE: This is provided as a quick mechanism for a user to visualize
|
||||
* the performance of the rate control alogirthm and is not meant to be
|
||||
* parsed software.
|
||||
*/
|
||||
extern int iwl_fill_rs_info(struct ieee80211_hw *, char *buf, u8 sta_id);
|
||||
|
||||
/**
|
||||
* iwl_rate_scale_init - Initialize the rate scale table based on assoc info
|
||||
*
|
||||
* The specific througput table used is based on the type of network
|
||||
* the associated with, including A, B, G, and G w/ TGG protection
|
||||
*/
|
||||
extern void iwl_rate_scale_init(struct ieee80211_hw *hw, s32 sta_id);
|
||||
|
||||
/**
|
||||
* iwl_rate_control_register - Register the rate control algorithm callbacks
|
||||
*
|
||||
* Since the rate control algorithm is hardware specific, there is no need
|
||||
* or reason to place it as a stand alone module. The driver can call
|
||||
* iwl_rate_control_register in order to register the rate control callbacks
|
||||
* with the mac80211 subsystem. This should be performed prior to calling
|
||||
* ieee80211_register_hw
|
||||
*
|
||||
*/
|
||||
extern void iwl_rate_control_register(struct ieee80211_hw *hw);
|
||||
|
||||
/**
|
||||
* iwl_rate_control_unregister - Unregister the rate control callbacks
|
||||
*
|
||||
* This should be called after calling ieee80211_unregister_hw, but before
|
||||
* the driver is unloaded.
|
||||
*/
|
||||
extern void iwl_rate_control_unregister(struct ieee80211_hw *hw);
|
||||
|
||||
#endif
|
||||
4719
drivers/net/wireless/iwlwifi/iwl-4965.c
Normal file
4719
drivers/net/wireless/iwlwifi/iwl-4965.c
Normal file
File diff suppressed because it is too large
Load Diff
341
drivers/net/wireless/iwlwifi/iwl-4965.h
Normal file
341
drivers/net/wireless/iwlwifi/iwl-4965.h
Normal file
@@ -0,0 +1,341 @@
|
||||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2003 - 2007 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:
|
||||
* James P. Ketrenos <ipw2100-admin@linux.intel.com>
|
||||
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
|
||||
*
|
||||
*****************************************************************************/
|
||||
#ifndef __iwl_4965_h__
|
||||
#define __iwl_4965_h__
|
||||
|
||||
struct iwl_priv;
|
||||
struct sta_ht_info;
|
||||
|
||||
/*
|
||||
* Forward declare iwl-4965.c functions for iwl-base.c
|
||||
*/
|
||||
extern int iwl_eeprom_aqcuire_semaphore(struct iwl_priv *priv);
|
||||
extern void iwl_eeprom_release_semaphore(struct iwl_priv *priv);
|
||||
|
||||
extern int iwl4965_tx_queue_update_wr_ptr(struct iwl_priv *priv,
|
||||
struct iwl_tx_queue *txq,
|
||||
u16 byte_cnt);
|
||||
extern void iwl4965_add_station(struct iwl_priv *priv, const u8 *addr,
|
||||
int is_ap);
|
||||
extern void iwl4965_set_rxon_ht(struct iwl_priv *priv,
|
||||
struct sta_ht_info *ht_info);
|
||||
|
||||
extern void iwl4965_set_rxon_chain(struct iwl_priv *priv);
|
||||
extern int iwl4965_tx_cmd(struct iwl_priv *priv, struct iwl_cmd *out_cmd,
|
||||
u8 sta_id, dma_addr_t txcmd_phys,
|
||||
struct ieee80211_hdr *hdr, u8 hdr_len,
|
||||
struct ieee80211_tx_control *ctrl, void *sta_in);
|
||||
extern int iwl4965_init_hw_rates(struct iwl_priv *priv,
|
||||
struct ieee80211_rate *rates);
|
||||
extern int iwl4965_alive_notify(struct iwl_priv *priv);
|
||||
extern void iwl4965_update_rate_scaling(struct iwl_priv *priv, u8 mode);
|
||||
extern void iwl4965_set_ht_add_station(struct iwl_priv *priv, u8 index);
|
||||
|
||||
extern void iwl4965_chain_noise_reset(struct iwl_priv *priv);
|
||||
extern void iwl4965_init_sensitivity(struct iwl_priv *priv, u8 flags,
|
||||
u8 force);
|
||||
extern int iwl4965_set_fat_chan_info(struct iwl_priv *priv, int phymode,
|
||||
u16 channel,
|
||||
const struct iwl_eeprom_channel *eeprom_ch,
|
||||
u8 fat_extension_channel);
|
||||
extern void iwl4965_rf_kill_ct_config(struct iwl_priv *priv);
|
||||
|
||||
#ifdef CONFIG_IWLWIFI_HT
|
||||
#ifdef CONFIG_IWLWIFI_HT_AGG
|
||||
extern int iwl_mac_ht_tx_agg_start(struct ieee80211_hw *hw, u8 *da,
|
||||
u16 tid, u16 *start_seq_num);
|
||||
extern int iwl_mac_ht_rx_agg_start(struct ieee80211_hw *hw, u8 *da,
|
||||
u16 tid, u16 start_seq_num);
|
||||
extern int iwl_mac_ht_rx_agg_stop(struct ieee80211_hw *hw, u8 *da,
|
||||
u16 tid, int generator);
|
||||
extern int iwl_mac_ht_tx_agg_stop(struct ieee80211_hw *hw, u8 *da,
|
||||
u16 tid, int generator);
|
||||
extern void iwl4965_turn_off_agg(struct iwl_priv *priv, u8 tid);
|
||||
#endif /* CONFIG_IWLWIFI_HT_AGG */
|
||||
#endif /*CONFIG_IWLWIFI_HT */
|
||||
/* Structures, enum, and defines specific to the 4965 */
|
||||
|
||||
#define IWL4965_KW_SIZE 0x1000 /*4k */
|
||||
|
||||
struct iwl_kw {
|
||||
dma_addr_t dma_addr;
|
||||
void *v_addr;
|
||||
size_t size;
|
||||
};
|
||||
|
||||
#define TID_QUEUE_CELL_SPACING 50 /*mS */
|
||||
#define TID_QUEUE_MAX_SIZE 20
|
||||
#define TID_ROUND_VALUE 5 /* mS */
|
||||
#define TID_MAX_LOAD_COUNT 8
|
||||
|
||||
#define TID_MAX_TIME_DIFF ((TID_QUEUE_MAX_SIZE - 1) * TID_QUEUE_CELL_SPACING)
|
||||
#define TIME_WRAP_AROUND(x, y) (((y) > (x)) ? (y) - (x) : (0-(x)) + (y))
|
||||
|
||||
#define TID_ALL_ENABLED 0x7f
|
||||
#define TID_ALL_SPECIFIED 0xff
|
||||
#define TID_AGG_TPT_THREHOLD 0x0
|
||||
|
||||
#define IWL_CHANNEL_WIDTH_20MHZ 0
|
||||
#define IWL_CHANNEL_WIDTH_40MHZ 1
|
||||
|
||||
#define IWL_MIMO_PS_STATIC 0
|
||||
#define IWL_MIMO_PS_NONE 3
|
||||
#define IWL_MIMO_PS_DYNAMIC 1
|
||||
#define IWL_MIMO_PS_INVALID 2
|
||||
|
||||
#define IWL_OPERATION_MODE_AUTO 0
|
||||
#define IWL_OPERATION_MODE_HT_ONLY 1
|
||||
#define IWL_OPERATION_MODE_MIXED 2
|
||||
#define IWL_OPERATION_MODE_20MHZ 3
|
||||
|
||||
#define IWL_EXT_CHANNEL_OFFSET_AUTO 0
|
||||
#define IWL_EXT_CHANNEL_OFFSET_ABOVE 1
|
||||
#define IWL_EXT_CHANNEL_OFFSET_ 2
|
||||
#define IWL_EXT_CHANNEL_OFFSET_BELOW 3
|
||||
#define IWL_EXT_CHANNEL_OFFSET_MAX 4
|
||||
|
||||
#define NRG_NUM_PREV_STAT_L 20
|
||||
#define NUM_RX_CHAINS (3)
|
||||
|
||||
#define TX_POWER_IWL_ILLEGAL_VDET -100000
|
||||
#define TX_POWER_IWL_ILLEGAL_VOLTAGE -10000
|
||||
#define TX_POWER_IWL_CLOSED_LOOP_MIN_POWER 18
|
||||
#define TX_POWER_IWL_CLOSED_LOOP_MAX_POWER 34
|
||||
#define TX_POWER_IWL_VDET_SLOPE_BELOW_NOMINAL 17
|
||||
#define TX_POWER_IWL_VDET_SLOPE_ABOVE_NOMINAL 20
|
||||
#define TX_POWER_IWL_NOMINAL_POWER 26
|
||||
#define TX_POWER_IWL_CLOSED_LOOP_ITERATION_LIMIT 1
|
||||
#define TX_POWER_IWL_VOLTAGE_CODES_PER_03V 7
|
||||
#define TX_POWER_IWL_DEGREES_PER_VDET_CODE 11
|
||||
#define IWL_TX_POWER_MAX_NUM_PA_MEASUREMENTS 1
|
||||
#define IWL_TX_POWER_CCK_COMPENSATION_B_STEP (9)
|
||||
#define IWL_TX_POWER_CCK_COMPENSATION_C_STEP (5)
|
||||
|
||||
struct iwl_traffic_load {
|
||||
unsigned long time_stamp;
|
||||
u32 packet_count[TID_QUEUE_MAX_SIZE];
|
||||
u8 queue_count;
|
||||
u8 head;
|
||||
u32 total;
|
||||
};
|
||||
|
||||
#ifdef CONFIG_IWLWIFI_HT_AGG
|
||||
struct iwl_agg_control {
|
||||
unsigned long next_retry;
|
||||
u32 wait_for_agg_status;
|
||||
u32 tid_retry;
|
||||
u32 requested_ba;
|
||||
u32 granted_ba;
|
||||
u8 auto_agg;
|
||||
u32 tid_traffic_load_threshold;
|
||||
u32 ba_timeout;
|
||||
struct iwl_traffic_load traffic_load[TID_MAX_LOAD_COUNT];
|
||||
};
|
||||
#endif /*CONFIG_IWLWIFI_HT_AGG */
|
||||
|
||||
struct iwl_lq_mngr {
|
||||
#ifdef CONFIG_IWLWIFI_HT_AGG
|
||||
struct iwl_agg_control agg_ctrl;
|
||||
#endif
|
||||
spinlock_t lock;
|
||||
s32 max_window_size;
|
||||
s32 *expected_tpt;
|
||||
u8 *next_higher_rate;
|
||||
u8 *next_lower_rate;
|
||||
unsigned long stamp;
|
||||
unsigned long stamp_last;
|
||||
u32 flush_time;
|
||||
u32 tx_packets;
|
||||
u8 lq_ready;
|
||||
};
|
||||
|
||||
|
||||
/* Sensitivity and chain noise calibration */
|
||||
#define INTERFERENCE_DATA_AVAILABLE __constant_cpu_to_le32(1)
|
||||
#define INITIALIZATION_VALUE 0xFFFF
|
||||
#define CAL_NUM_OF_BEACONS 20
|
||||
#define MAXIMUM_ALLOWED_PATHLOSS 15
|
||||
|
||||
/* Param table within SENSITIVITY_CMD */
|
||||
#define HD_MIN_ENERGY_CCK_DET_INDEX (0)
|
||||
#define HD_MIN_ENERGY_OFDM_DET_INDEX (1)
|
||||
#define HD_AUTO_CORR32_X1_TH_ADD_MIN_INDEX (2)
|
||||
#define HD_AUTO_CORR32_X1_TH_ADD_MIN_MRC_INDEX (3)
|
||||
#define HD_AUTO_CORR40_X4_TH_ADD_MIN_MRC_INDEX (4)
|
||||
#define HD_AUTO_CORR32_X4_TH_ADD_MIN_INDEX (5)
|
||||
#define HD_AUTO_CORR32_X4_TH_ADD_MIN_MRC_INDEX (6)
|
||||
#define HD_BARKER_CORR_TH_ADD_MIN_INDEX (7)
|
||||
#define HD_BARKER_CORR_TH_ADD_MIN_MRC_INDEX (8)
|
||||
#define HD_AUTO_CORR40_X4_TH_ADD_MIN_INDEX (9)
|
||||
#define HD_OFDM_ENERGY_TH_IN_INDEX (10)
|
||||
|
||||
#define SENSITIVITY_CMD_CONTROL_DEFAULT_TABLE __constant_cpu_to_le16(0)
|
||||
#define SENSITIVITY_CMD_CONTROL_WORK_TABLE __constant_cpu_to_le16(1)
|
||||
|
||||
#define CHAIN_NOISE_MAX_DELTA_GAIN_CODE 3
|
||||
|
||||
#define MAX_FA_OFDM 50
|
||||
#define MIN_FA_OFDM 5
|
||||
#define MAX_FA_CCK 50
|
||||
#define MIN_FA_CCK 5
|
||||
|
||||
#define NRG_MIN_CCK 97
|
||||
#define NRG_MAX_CCK 0
|
||||
|
||||
#define AUTO_CORR_MIN_OFDM 85
|
||||
#define AUTO_CORR_MIN_OFDM_MRC 170
|
||||
#define AUTO_CORR_MIN_OFDM_X1 105
|
||||
#define AUTO_CORR_MIN_OFDM_MRC_X1 220
|
||||
#define AUTO_CORR_MAX_OFDM 120
|
||||
#define AUTO_CORR_MAX_OFDM_MRC 210
|
||||
#define AUTO_CORR_MAX_OFDM_X1 140
|
||||
#define AUTO_CORR_MAX_OFDM_MRC_X1 270
|
||||
#define AUTO_CORR_STEP_OFDM 1
|
||||
|
||||
#define AUTO_CORR_MIN_CCK (125)
|
||||
#define AUTO_CORR_MAX_CCK (200)
|
||||
#define AUTO_CORR_MIN_CCK_MRC 200
|
||||
#define AUTO_CORR_MAX_CCK_MRC 400
|
||||
#define AUTO_CORR_STEP_CCK 3
|
||||
#define AUTO_CORR_MAX_TH_CCK 160
|
||||
|
||||
#define NRG_ALG 0
|
||||
#define AUTO_CORR_ALG 1
|
||||
#define NRG_DIFF 2
|
||||
#define NRG_STEP_CCK 2
|
||||
#define NRG_MARGIN 8
|
||||
#define MAX_NUMBER_CCK_NO_FA 100
|
||||
|
||||
#define AUTO_CORR_CCK_MIN_VAL_DEF (125)
|
||||
|
||||
#define CHAIN_A 0
|
||||
#define CHAIN_B 1
|
||||
#define CHAIN_C 2
|
||||
#define CHAIN_NOISE_DELTA_GAIN_INIT_VAL 4
|
||||
#define ALL_BAND_FILTER 0xFF00
|
||||
#define IN_BAND_FILTER 0xFF
|
||||
#define MIN_AVERAGE_NOISE_MAX_VALUE 0xFFFFFFFF
|
||||
|
||||
enum iwl_false_alarm_state {
|
||||
IWL_FA_TOO_MANY = 0,
|
||||
IWL_FA_TOO_FEW = 1,
|
||||
IWL_FA_GOOD_RANGE = 2,
|
||||
};
|
||||
|
||||
enum iwl_chain_noise_state {
|
||||
IWL_CHAIN_NOISE_ALIVE = 0, /* must be 0 */
|
||||
IWL_CHAIN_NOISE_ACCUMULATE = 1,
|
||||
IWL_CHAIN_NOISE_CALIBRATED = 2,
|
||||
};
|
||||
|
||||
enum iwl_sensitivity_state {
|
||||
IWL_SENS_CALIB_ALLOWED = 0,
|
||||
IWL_SENS_CALIB_NEED_REINIT = 1,
|
||||
};
|
||||
|
||||
enum iwl_calib_enabled_state {
|
||||
IWL_CALIB_DISABLED = 0, /* must be 0 */
|
||||
IWL_CALIB_ENABLED = 1,
|
||||
};
|
||||
|
||||
struct statistics_general_data {
|
||||
u32 beacon_silence_rssi_a;
|
||||
u32 beacon_silence_rssi_b;
|
||||
u32 beacon_silence_rssi_c;
|
||||
u32 beacon_energy_a;
|
||||
u32 beacon_energy_b;
|
||||
u32 beacon_energy_c;
|
||||
};
|
||||
|
||||
/* Sensitivity calib data */
|
||||
struct iwl_sensitivity_data {
|
||||
u32 auto_corr_ofdm;
|
||||
u32 auto_corr_ofdm_mrc;
|
||||
u32 auto_corr_ofdm_x1;
|
||||
u32 auto_corr_ofdm_mrc_x1;
|
||||
u32 auto_corr_cck;
|
||||
u32 auto_corr_cck_mrc;
|
||||
|
||||
u32 last_bad_plcp_cnt_ofdm;
|
||||
u32 last_fa_cnt_ofdm;
|
||||
u32 last_bad_plcp_cnt_cck;
|
||||
u32 last_fa_cnt_cck;
|
||||
|
||||
u32 nrg_curr_state;
|
||||
u32 nrg_prev_state;
|
||||
u32 nrg_value[10];
|
||||
u8 nrg_silence_rssi[NRG_NUM_PREV_STAT_L];
|
||||
u32 nrg_silence_ref;
|
||||
u32 nrg_energy_idx;
|
||||
u32 nrg_silence_idx;
|
||||
u32 nrg_th_cck;
|
||||
s32 nrg_auto_corr_silence_diff;
|
||||
u32 num_in_cck_no_fa;
|
||||
u32 nrg_th_ofdm;
|
||||
|
||||
u8 state;
|
||||
};
|
||||
|
||||
/* Chain noise (differential Rx gain) calib data */
|
||||
struct iwl_chain_noise_data {
|
||||
u8 state;
|
||||
u16 beacon_count;
|
||||
u32 chain_noise_a;
|
||||
u32 chain_noise_b;
|
||||
u32 chain_noise_c;
|
||||
u32 chain_signal_a;
|
||||
u32 chain_signal_b;
|
||||
u32 chain_signal_c;
|
||||
u8 disconn_array[NUM_RX_CHAINS];
|
||||
u8 delta_gain_code[NUM_RX_CHAINS];
|
||||
u8 radio_write;
|
||||
};
|
||||
|
||||
/* IWL4965 */
|
||||
#define RATE_MCS_CODE_MSK 0x7
|
||||
#define RATE_MCS_MIMO_POS 3
|
||||
#define RATE_MCS_MIMO_MSK 0x8
|
||||
#define RATE_MCS_HT_DUP_POS 5
|
||||
#define RATE_MCS_HT_DUP_MSK 0x20
|
||||
#define RATE_MCS_FLAGS_POS 8
|
||||
#define RATE_MCS_HT_POS 8
|
||||
#define RATE_MCS_HT_MSK 0x100
|
||||
#define RATE_MCS_CCK_POS 9
|
||||
#define RATE_MCS_CCK_MSK 0x200
|
||||
#define RATE_MCS_GF_POS 10
|
||||
#define RATE_MCS_GF_MSK 0x400
|
||||
|
||||
#define RATE_MCS_FAT_POS 11
|
||||
#define RATE_MCS_FAT_MSK 0x800
|
||||
#define RATE_MCS_DUP_POS 12
|
||||
#define RATE_MCS_DUP_MSK 0x1000
|
||||
#define RATE_MCS_SGI_POS 13
|
||||
#define RATE_MCS_SGI_MSK 0x2000
|
||||
|
||||
#define EEPROM_SEM_TIMEOUT 10
|
||||
#define EEPROM_SEM_RETRY_LIMIT 1000
|
||||
|
||||
#endif /* __iwl_4965_h__ */
|
||||
161
drivers/net/wireless/iwlwifi/iwl-channel.h
Normal file
161
drivers/net/wireless/iwlwifi/iwl-channel.h
Normal file
@@ -0,0 +1,161 @@
|
||||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2005 - 2007 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:
|
||||
* James P. Ketrenos <ipw2100-admin@linux.intel.com>
|
||||
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
|
||||
*
|
||||
*****************************************************************************/
|
||||
#ifndef __iwl_channel_h__
|
||||
#define __iwl_channel_h__
|
||||
|
||||
#define IWL_NUM_SCAN_RATES (2)
|
||||
|
||||
struct iwl_channel_tgd_info {
|
||||
u8 type;
|
||||
s8 max_power;
|
||||
};
|
||||
|
||||
struct iwl_channel_tgh_info {
|
||||
s64 last_radar_time;
|
||||
};
|
||||
|
||||
/* current Tx power values to use, one for each rate for each channel.
|
||||
* requested power is limited by:
|
||||
* -- regulatory EEPROM limits for this channel
|
||||
* -- hardware capabilities (clip-powers)
|
||||
* -- spectrum management
|
||||
* -- user preference (e.g. iwconfig)
|
||||
* when requested power is set, base power index must also be set. */
|
||||
struct iwl_channel_power_info {
|
||||
struct iwl_tx_power tpc; /* actual radio and DSP gain settings */
|
||||
s8 power_table_index; /* actual (compenst'd) index into gain table */
|
||||
s8 base_power_index; /* gain index for power at factory temp. */
|
||||
s8 requested_power; /* power (dBm) requested for this chnl/rate */
|
||||
};
|
||||
|
||||
/* current scan Tx power values to use, one for each scan rate for each
|
||||
* channel. */
|
||||
struct iwl_scan_power_info {
|
||||
struct iwl_tx_power tpc; /* actual radio and DSP gain settings */
|
||||
s8 power_table_index; /* actual (compenst'd) index into gain table */
|
||||
s8 requested_power; /* scan pwr (dBm) requested for chnl/rate */
|
||||
};
|
||||
|
||||
/* Channel unlock period is 15 seconds. If no beacon or probe response
|
||||
* has been received within 15 seconds on a locked channel then the channel
|
||||
* remains locked. */
|
||||
#define TX_UNLOCK_PERIOD 15
|
||||
|
||||
/* CSA lock period is 15 seconds. If a CSA has been received on a channel in
|
||||
* the last 15 seconds, the channel is locked */
|
||||
#define CSA_LOCK_PERIOD 15
|
||||
/*
|
||||
* One for each channel, holds all channel setup data
|
||||
* Some of the fields (e.g. eeprom and flags/max_power_avg) are redundant
|
||||
* with one another!
|
||||
*/
|
||||
#define IWL4965_MAX_RATE (33)
|
||||
|
||||
struct iwl_channel_info {
|
||||
struct iwl_channel_tgd_info tgd;
|
||||
struct iwl_channel_tgh_info tgh;
|
||||
struct iwl_eeprom_channel eeprom; /* EEPROM regulatory limit */
|
||||
struct iwl_eeprom_channel fat_eeprom; /* EEPROM regulatory limit for
|
||||
* FAT channel */
|
||||
|
||||
u8 channel; /* channel number */
|
||||
u8 flags; /* flags copied from EEPROM */
|
||||
s8 max_power_avg; /* (dBm) regul. eeprom, normal Tx, any rate */
|
||||
s8 curr_txpow; /* (dBm) regulatory/spectrum/user (not h/w) */
|
||||
s8 min_power; /* always 0 */
|
||||
s8 scan_power; /* (dBm) regul. eeprom, direct scans, any rate */
|
||||
|
||||
u8 group_index; /* 0-4, maps channel to group1/2/3/4/5 */
|
||||
u8 band_index; /* 0-4, maps channel to band1/2/3/4/5 */
|
||||
u8 phymode; /* MODE_IEEE80211{A,B,G} */
|
||||
|
||||
/* Radio/DSP gain settings for each "normal" data Tx rate.
|
||||
* These include, in addition to RF and DSP gain, a few fields for
|
||||
* remembering/modifying gain settings (indexes). */
|
||||
struct iwl_channel_power_info power_info[IWL4965_MAX_RATE];
|
||||
|
||||
#if IWL == 4965
|
||||
/* FAT channel info */
|
||||
s8 fat_max_power_avg; /* (dBm) regul. eeprom, normal Tx, any rate */
|
||||
s8 fat_curr_txpow; /* (dBm) regulatory/spectrum/user (not h/w) */
|
||||
s8 fat_min_power; /* always 0 */
|
||||
s8 fat_scan_power; /* (dBm) eeprom, direct scans, any rate */
|
||||
u8 fat_flags; /* flags copied from EEPROM */
|
||||
u8 fat_extension_channel;
|
||||
#endif
|
||||
|
||||
/* Radio/DSP gain settings for each scan rate, for directed scans. */
|
||||
struct iwl_scan_power_info scan_pwr_info[IWL_NUM_SCAN_RATES];
|
||||
};
|
||||
|
||||
struct iwl_clip_group {
|
||||
/* maximum power level to prevent clipping for each rate, derived by
|
||||
* us from this band's saturation power in EEPROM */
|
||||
const s8 clip_powers[IWL_MAX_RATES];
|
||||
};
|
||||
|
||||
static inline int is_channel_valid(const struct iwl_channel_info *ch_info)
|
||||
{
|
||||
if (ch_info == NULL)
|
||||
return 0;
|
||||
return (ch_info->flags & EEPROM_CHANNEL_VALID) ? 1 : 0;
|
||||
}
|
||||
|
||||
static inline int is_channel_narrow(const struct iwl_channel_info *ch_info)
|
||||
{
|
||||
return (ch_info->flags & EEPROM_CHANNEL_NARROW) ? 1 : 0;
|
||||
}
|
||||
|
||||
static inline int is_channel_radar(const struct iwl_channel_info *ch_info)
|
||||
{
|
||||
return (ch_info->flags & EEPROM_CHANNEL_RADAR) ? 1 : 0;
|
||||
}
|
||||
|
||||
static inline u8 is_channel_a_band(const struct iwl_channel_info *ch_info)
|
||||
{
|
||||
return ch_info->phymode == MODE_IEEE80211A;
|
||||
}
|
||||
|
||||
static inline u8 is_channel_bg_band(const struct iwl_channel_info *ch_info)
|
||||
{
|
||||
return ((ch_info->phymode == MODE_IEEE80211B) ||
|
||||
(ch_info->phymode == MODE_IEEE80211G));
|
||||
}
|
||||
|
||||
static inline int is_channel_passive(const struct iwl_channel_info *ch)
|
||||
{
|
||||
return (!(ch->flags & EEPROM_CHANNEL_ACTIVE)) ? 1 : 0;
|
||||
}
|
||||
|
||||
static inline int is_channel_ibss(const struct iwl_channel_info *ch)
|
||||
{
|
||||
return ((ch->flags & EEPROM_CHANNEL_IBSS)) ? 1 : 0;
|
||||
}
|
||||
|
||||
extern const struct iwl_channel_info *iwl_get_channel_info(
|
||||
const struct iwl_priv *priv, int phymode, u16 channel);
|
||||
|
||||
#endif
|
||||
1734
drivers/net/wireless/iwlwifi/iwl-commands.h
Normal file
1734
drivers/net/wireless/iwlwifi/iwl-commands.h
Normal file
File diff suppressed because it is too large
Load Diff
149
drivers/net/wireless/iwlwifi/iwl-debug.h
Normal file
149
drivers/net/wireless/iwlwifi/iwl-debug.h
Normal file
@@ -0,0 +1,149 @@
|
||||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2003 - 2007 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* Portions of this file are derived from the ipw3945 project.
|
||||
*
|
||||
* 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:
|
||||
* James P. Ketrenos <ipw2100-admin@linux.intel.com>
|
||||
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef __iwl_debug_h__
|
||||
#define __iwl_debug_h__
|
||||
|
||||
#ifdef CONFIG_IWLWIFI_DEBUG
|
||||
extern u32 iwl_debug_level;
|
||||
#define IWL_DEBUG(level, fmt, args...) \
|
||||
do { if (iwl_debug_level & (level)) \
|
||||
printk(KERN_ERR DRV_NAME": %c %s " fmt, \
|
||||
in_interrupt() ? 'I' : 'U', __FUNCTION__ , ## args); } while (0)
|
||||
|
||||
#define IWL_DEBUG_LIMIT(level, fmt, args...) \
|
||||
do { if ((iwl_debug_level & (level)) && net_ratelimit()) \
|
||||
printk(KERN_ERR DRV_NAME": %c %s " fmt, \
|
||||
in_interrupt() ? 'I' : 'U', __FUNCTION__ , ## args); } while (0)
|
||||
#else
|
||||
static inline void IWL_DEBUG(int level, const char *fmt, ...)
|
||||
{
|
||||
}
|
||||
static inline void IWL_DEBUG_LIMIT(int level, const char *fmt, ...)
|
||||
{
|
||||
}
|
||||
#endif /* CONFIG_IWLWIFI_DEBUG */
|
||||
|
||||
/*
|
||||
* To use the debug system;
|
||||
*
|
||||
* If you are defining a new debug classification, simply add it to the #define
|
||||
* list here in the form of:
|
||||
*
|
||||
* #define IWL_DL_xxxx VALUE
|
||||
*
|
||||
* shifting value to the left one bit from the previous entry. xxxx should be
|
||||
* the name of the classification (for example, WEP)
|
||||
*
|
||||
* You then need to either add a IWL_xxxx_DEBUG() macro definition for your
|
||||
* classification, or use IWL_DEBUG(IWL_DL_xxxx, ...) whenever you want
|
||||
* to send output to that classification.
|
||||
*
|
||||
* To add your debug level to the list of levels seen when you perform
|
||||
*
|
||||
* % cat /proc/net/iwl/debug_level
|
||||
*
|
||||
* you simply need to add your entry to the iwl_debug_levels array.
|
||||
*
|
||||
* If you do not see debug_level in /proc/net/iwl then you do not have
|
||||
* CONFIG_IWLWIFI_DEBUG defined in your kernel configuration
|
||||
*
|
||||
*/
|
||||
|
||||
#define IWL_DL_INFO (1<<0)
|
||||
#define IWL_DL_MAC80211 (1<<1)
|
||||
#define IWL_DL_HOST_COMMAND (1<<2)
|
||||
#define IWL_DL_STATE (1<<3)
|
||||
|
||||
#define IWL_DL_RADIO (1<<7)
|
||||
#define IWL_DL_POWER (1<<8)
|
||||
#define IWL_DL_TEMP (1<<9)
|
||||
|
||||
#define IWL_DL_NOTIF (1<<10)
|
||||
#define IWL_DL_SCAN (1<<11)
|
||||
#define IWL_DL_ASSOC (1<<12)
|
||||
#define IWL_DL_DROP (1<<13)
|
||||
|
||||
#define IWL_DL_TXPOWER (1<<14)
|
||||
|
||||
#define IWL_DL_AP (1<<15)
|
||||
|
||||
#define IWL_DL_FW (1<<16)
|
||||
#define IWL_DL_RF_KILL (1<<17)
|
||||
#define IWL_DL_FW_ERRORS (1<<18)
|
||||
|
||||
#define IWL_DL_LED (1<<19)
|
||||
|
||||
#define IWL_DL_RATE (1<<20)
|
||||
|
||||
#define IWL_DL_CALIB (1<<21)
|
||||
#define IWL_DL_WEP (1<<22)
|
||||
#define IWL_DL_TX (1<<23)
|
||||
#define IWL_DL_RX (1<<24)
|
||||
#define IWL_DL_ISR (1<<25)
|
||||
#define IWL_DL_HT (1<<26)
|
||||
#define IWL_DL_IO (1<<27)
|
||||
#define IWL_DL_11H (1<<28)
|
||||
|
||||
#define IWL_DL_STATS (1<<29)
|
||||
#define IWL_DL_TX_REPLY (1<<30)
|
||||
#define IWL_DL_QOS (1<<31)
|
||||
|
||||
#define IWL_ERROR(f, a...) printk(KERN_ERR DRV_NAME ": " f, ## a)
|
||||
#define IWL_WARNING(f, a...) printk(KERN_WARNING DRV_NAME ": " f, ## a)
|
||||
#define IWL_DEBUG_INFO(f, a...) IWL_DEBUG(IWL_DL_INFO, f, ## a)
|
||||
|
||||
#define IWL_DEBUG_MAC80211(f, a...) IWL_DEBUG(IWL_DL_MAC80211, f, ## a)
|
||||
#define IWL_DEBUG_TEMP(f, a...) IWL_DEBUG(IWL_DL_TEMP, f, ## a)
|
||||
#define IWL_DEBUG_SCAN(f, a...) IWL_DEBUG(IWL_DL_SCAN, f, ## a)
|
||||
#define IWL_DEBUG_RX(f, a...) IWL_DEBUG(IWL_DL_RX, f, ## a)
|
||||
#define IWL_DEBUG_TX(f, a...) IWL_DEBUG(IWL_DL_TX, f, ## a)
|
||||
#define IWL_DEBUG_ISR(f, a...) IWL_DEBUG(IWL_DL_ISR, f, ## a)
|
||||
#define IWL_DEBUG_LED(f, a...) IWL_DEBUG(IWL_DL_LED, f, ## a)
|
||||
#define IWL_DEBUG_WEP(f, a...) IWL_DEBUG(IWL_DL_WEP, f, ## a)
|
||||
#define IWL_DEBUG_HC(f, a...) IWL_DEBUG(IWL_DL_HOST_COMMAND, f, ## a)
|
||||
#define IWL_DEBUG_CALIB(f, a...) IWL_DEBUG(IWL_DL_CALIB, f, ## a)
|
||||
#define IWL_DEBUG_FW(f, a...) IWL_DEBUG(IWL_DL_FW, f, ## a)
|
||||
#define IWL_DEBUG_RF_KILL(f, a...) IWL_DEBUG(IWL_DL_RF_KILL, f, ## a)
|
||||
#define IWL_DEBUG_DROP(f, a...) IWL_DEBUG(IWL_DL_DROP, f, ## a)
|
||||
#define IWL_DEBUG_DROP_LIMIT(f, a...) IWL_DEBUG_LIMIT(IWL_DL_DROP, f, ## a)
|
||||
#define IWL_DEBUG_AP(f, a...) IWL_DEBUG(IWL_DL_AP, f, ## a)
|
||||
#define IWL_DEBUG_TXPOWER(f, a...) IWL_DEBUG(IWL_DL_TXPOWER, f, ## a)
|
||||
#define IWL_DEBUG_IO(f, a...) IWL_DEBUG(IWL_DL_IO, f, ## a)
|
||||
#define IWL_DEBUG_RATE(f, a...) IWL_DEBUG(IWL_DL_RATE, f, ## a)
|
||||
#define IWL_DEBUG_NOTIF(f, a...) IWL_DEBUG(IWL_DL_NOTIF, f, ## a)
|
||||
#define IWL_DEBUG_ASSOC(f, a...) IWL_DEBUG(IWL_DL_ASSOC | IWL_DL_INFO, f, ## a)
|
||||
#define IWL_DEBUG_HT(f, a...) IWL_DEBUG(IWL_DL_HT, f, ## a)
|
||||
#define IWL_DEBUG_STATS(f, a...) IWL_DEBUG(IWL_DL_STATS, f, ## a)
|
||||
#define IWL_DEBUG_TX_REPLY(f, a...) IWL_DEBUG(IWL_DL_TX_REPLY, f, ## a)
|
||||
#define IWL_DEBUG_QOS(f, a...) IWL_DEBUG(IWL_DL_QOS, f, ## a)
|
||||
#define IWL_DEBUG_RADIO(f, a...) IWL_DEBUG(IWL_DL_RADIO, f, ## a)
|
||||
#define IWL_DEBUG_POWER(f, a...) IWL_DEBUG(IWL_DL_POWER, f, ## a)
|
||||
#define IWL_DEBUG_11H(f, a...) IWL_DEBUG(IWL_DL_11H, f, ## a)
|
||||
|
||||
#endif
|
||||
336
drivers/net/wireless/iwlwifi/iwl-eeprom.h
Normal file
336
drivers/net/wireless/iwlwifi/iwl-eeprom.h
Normal file
@@ -0,0 +1,336 @@
|
||||
/******************************************************************************
|
||||
*
|
||||
* This file is provided under a dual BSD/GPLv2 license. When using or
|
||||
* redistributing this file, you may do so under either license.
|
||||
*
|
||||
* GPL LICENSE SUMMARY
|
||||
*
|
||||
* Copyright(c) 2005 - 2007 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 Geeral 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.GPL.
|
||||
*
|
||||
* Contact Information:
|
||||
* James P. Ketrenos <ipw2100-admin@linux.intel.com>
|
||||
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
|
||||
*
|
||||
* BSD LICENSE
|
||||
*
|
||||
* Copyright(c) 2005 - 2007 Intel Corporation. All rights reserved.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name Intel Corporation nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef __iwl_eeprom_h__
|
||||
#define __iwl_eeprom_h__
|
||||
|
||||
/*
|
||||
* This file defines EEPROM related constants, enums, and inline functions.
|
||||
*
|
||||
*/
|
||||
|
||||
#define IWL_EEPROM_ACCESS_TIMEOUT 5000 /* uSec */
|
||||
#define IWL_EEPROM_ACCESS_DELAY 10 /* uSec */
|
||||
/* EEPROM field values */
|
||||
#define ANTENNA_SWITCH_NORMAL 0
|
||||
#define ANTENNA_SWITCH_INVERSE 1
|
||||
|
||||
enum {
|
||||
EEPROM_CHANNEL_VALID = (1 << 0), /* usable for this SKU/geo */
|
||||
EEPROM_CHANNEL_IBSS = (1 << 1), /* usable as an IBSS channel */
|
||||
/* Bit 2 Reserved */
|
||||
EEPROM_CHANNEL_ACTIVE = (1 << 3), /* active scanning allowed */
|
||||
EEPROM_CHANNEL_RADAR = (1 << 4), /* radar detection required */
|
||||
EEPROM_CHANNEL_WIDE = (1 << 5),
|
||||
EEPROM_CHANNEL_NARROW = (1 << 6),
|
||||
EEPROM_CHANNEL_DFS = (1 << 7), /* dynamic freq selection candidate */
|
||||
};
|
||||
|
||||
/* EEPROM field lengths */
|
||||
#define EEPROM_BOARD_PBA_NUMBER_LENGTH 11
|
||||
|
||||
/* EEPROM field lengths */
|
||||
#define EEPROM_BOARD_PBA_NUMBER_LENGTH 11
|
||||
#define EEPROM_REGULATORY_SKU_ID_LENGTH 4
|
||||
#define EEPROM_REGULATORY_BAND1_CHANNELS_LENGTH 14
|
||||
#define EEPROM_REGULATORY_BAND2_CHANNELS_LENGTH 13
|
||||
#define EEPROM_REGULATORY_BAND3_CHANNELS_LENGTH 12
|
||||
#define EEPROM_REGULATORY_BAND4_CHANNELS_LENGTH 11
|
||||
#define EEPROM_REGULATORY_BAND5_CHANNELS_LENGTH 6
|
||||
|
||||
#if IWL == 3945
|
||||
#define EEPROM_REGULATORY_CHANNELS_LENGTH ( \
|
||||
EEPROM_REGULATORY_BAND1_CHANNELS_LENGTH + \
|
||||
EEPROM_REGULATORY_BAND2_CHANNELS_LENGTH + \
|
||||
EEPROM_REGULATORY_BAND3_CHANNELS_LENGTH + \
|
||||
EEPROM_REGULATORY_BAND4_CHANNELS_LENGTH + \
|
||||
EEPROM_REGULATORY_BAND5_CHANNELS_LENGTH)
|
||||
#elif IWL == 4965
|
||||
#define EEPROM_REGULATORY_BAND_24_FAT_CHANNELS_LENGTH 7
|
||||
#define EEPROM_REGULATORY_BAND_52_FAT_CHANNELS_LENGTH 11
|
||||
#define EEPROM_REGULATORY_CHANNELS_LENGTH ( \
|
||||
EEPROM_REGULATORY_BAND1_CHANNELS_LENGTH + \
|
||||
EEPROM_REGULATORY_BAND2_CHANNELS_LENGTH + \
|
||||
EEPROM_REGULATORY_BAND3_CHANNELS_LENGTH + \
|
||||
EEPROM_REGULATORY_BAND4_CHANNELS_LENGTH + \
|
||||
EEPROM_REGULATORY_BAND5_CHANNELS_LENGTH + \
|
||||
EEPROM_REGULATORY_BAND_24_FAT_CHANNELS_LENGTH + \
|
||||
EEPROM_REGULATORY_BAND_52_FAT_CHANNELS_LENGTH)
|
||||
#endif
|
||||
|
||||
#define EEPROM_REGULATORY_NUMBER_OF_BANDS 5
|
||||
|
||||
/* SKU Capabilities */
|
||||
#define EEPROM_SKU_CAP_SW_RF_KILL_ENABLE (1 << 0)
|
||||
#define EEPROM_SKU_CAP_HW_RF_KILL_ENABLE (1 << 1)
|
||||
#define EEPROM_SKU_CAP_OP_MODE_MRC (1 << 7)
|
||||
|
||||
/* *regulatory* channel data from eeprom, one for each channel */
|
||||
struct iwl_eeprom_channel {
|
||||
u8 flags; /* flags copied from EEPROM */
|
||||
s8 max_power_avg; /* max power (dBm) on this chnl, limit 31 */
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/*
|
||||
* Mapping of a Tx power level, at factory calibration temperature,
|
||||
* to a radio/DSP gain table index.
|
||||
* One for each of 5 "sample" power levels in each band.
|
||||
* v_det is measured at the factory, using the 3945's built-in power amplifier
|
||||
* (PA) output voltage detector. This same detector is used during Tx of
|
||||
* long packets in normal operation to provide feedback as to proper output
|
||||
* level.
|
||||
* Data copied from EEPROM.
|
||||
*/
|
||||
struct iwl_eeprom_txpower_sample {
|
||||
u8 gain_index; /* index into power (gain) setup table ... */
|
||||
s8 power; /* ... for this pwr level for this chnl group */
|
||||
u16 v_det; /* PA output voltage */
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/*
|
||||
* Mappings of Tx power levels -> nominal radio/DSP gain table indexes.
|
||||
* One for each channel group (a.k.a. "band") (1 for BG, 4 for A).
|
||||
* Tx power setup code interpolates between the 5 "sample" power levels
|
||||
* to determine the nominal setup for a requested power level.
|
||||
* Data copied from EEPROM.
|
||||
* DO NOT ALTER THIS STRUCTURE!!!
|
||||
*/
|
||||
struct iwl_eeprom_txpower_group {
|
||||
struct iwl_eeprom_txpower_sample samples[5]; /* 5 power levels */
|
||||
s32 a, b, c, d, e; /* coefficients for voltage->power
|
||||
* formula (signed) */
|
||||
s32 Fa, Fb, Fc, Fd, Fe; /* these modify coeffs based on
|
||||
* frequency (signed) */
|
||||
s8 saturation_power; /* highest power possible by h/w in this
|
||||
* band */
|
||||
u8 group_channel; /* "representative" channel # in this band */
|
||||
s16 temperature; /* h/w temperature at factory calib this band
|
||||
* (signed) */
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/*
|
||||
* Temperature-based Tx-power compensation data, not band-specific.
|
||||
* These coefficients are use to modify a/b/c/d/e coeffs based on
|
||||
* difference between current temperature and factory calib temperature.
|
||||
* Data copied from EEPROM.
|
||||
*/
|
||||
struct iwl_eeprom_temperature_corr {
|
||||
u32 Ta;
|
||||
u32 Tb;
|
||||
u32 Tc;
|
||||
u32 Td;
|
||||
u32 Te;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
#if IWL == 4965
|
||||
#define EEPROM_TX_POWER_TX_CHAINS (2)
|
||||
#define EEPROM_TX_POWER_BANDS (8)
|
||||
#define EEPROM_TX_POWER_MEASUREMENTS (3)
|
||||
#define EEPROM_TX_POWER_VERSION (2)
|
||||
#define EEPROM_TX_POWER_VERSION_NEW (5)
|
||||
|
||||
struct iwl_eeprom_calib_measure {
|
||||
u8 temperature;
|
||||
u8 gain_idx;
|
||||
u8 actual_pow;
|
||||
s8 pa_det;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct iwl_eeprom_calib_ch_info {
|
||||
u8 ch_num;
|
||||
struct iwl_eeprom_calib_measure measurements[EEPROM_TX_POWER_TX_CHAINS]
|
||||
[EEPROM_TX_POWER_MEASUREMENTS];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct iwl_eeprom_calib_subband_info {
|
||||
u8 ch_from;
|
||||
u8 ch_to;
|
||||
struct iwl_eeprom_calib_ch_info ch1;
|
||||
struct iwl_eeprom_calib_ch_info ch2;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct iwl_eeprom_calib_info {
|
||||
u8 saturation_power24;
|
||||
u8 saturation_power52;
|
||||
s16 voltage; /* signed */
|
||||
struct iwl_eeprom_calib_subband_info band_info[EEPROM_TX_POWER_BANDS];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
#endif
|
||||
|
||||
struct iwl_eeprom {
|
||||
u8 reserved0[16];
|
||||
#define EEPROM_DEVICE_ID (2*0x08) /* 2 bytes */
|
||||
u16 device_id; /* abs.ofs: 16 */
|
||||
u8 reserved1[2];
|
||||
#define EEPROM_PMC (2*0x0A) /* 2 bytes */
|
||||
u16 pmc; /* abs.ofs: 20 */
|
||||
u8 reserved2[20];
|
||||
#define EEPROM_MAC_ADDRESS (2*0x15) /* 6 bytes */
|
||||
u8 mac_address[6]; /* abs.ofs: 42 */
|
||||
u8 reserved3[58];
|
||||
#define EEPROM_BOARD_REVISION (2*0x35) /* 2 bytes */
|
||||
u16 board_revision; /* abs.ofs: 106 */
|
||||
u8 reserved4[11];
|
||||
#define EEPROM_BOARD_PBA_NUMBER (2*0x3B+1) /* 9 bytes */
|
||||
u8 board_pba_number[9]; /* abs.ofs: 119 */
|
||||
u8 reserved5[8];
|
||||
#define EEPROM_VERSION (2*0x44) /* 2 bytes */
|
||||
u16 version; /* abs.ofs: 136 */
|
||||
#define EEPROM_SKU_CAP (2*0x45) /* 1 bytes */
|
||||
u8 sku_cap; /* abs.ofs: 138 */
|
||||
#define EEPROM_LEDS_MODE (2*0x45+1) /* 1 bytes */
|
||||
u8 leds_mode; /* abs.ofs: 139 */
|
||||
#define EEPROM_OEM_MODE (2*0x46) /* 2 bytes */
|
||||
u16 oem_mode;
|
||||
#define EEPROM_WOWLAN_MODE (2*0x47) /* 2 bytes */
|
||||
u16 wowlan_mode; /* abs.ofs: 142 */
|
||||
#define EEPROM_LEDS_TIME_INTERVAL (2*0x48) /* 2 bytes */
|
||||
u16 leds_time_interval; /* abs.ofs: 144 */
|
||||
#define EEPROM_LEDS_OFF_TIME (2*0x49) /* 1 bytes */
|
||||
u8 leds_off_time; /* abs.ofs: 146 */
|
||||
#define EEPROM_LEDS_ON_TIME (2*0x49+1) /* 1 bytes */
|
||||
u8 leds_on_time; /* abs.ofs: 147 */
|
||||
#define EEPROM_ALMGOR_M_VERSION (2*0x4A) /* 1 bytes */
|
||||
u8 almgor_m_version; /* abs.ofs: 148 */
|
||||
#define EEPROM_ANTENNA_SWITCH_TYPE (2*0x4A+1) /* 1 bytes */
|
||||
u8 antenna_switch_type; /* abs.ofs: 149 */
|
||||
#if IWL == 3945
|
||||
u8 reserved6[42];
|
||||
#else
|
||||
u8 reserved6[8];
|
||||
#define EEPROM_4965_BOARD_REVISION (2*0x4F) /* 2 bytes */
|
||||
u16 board_revision_4965; /* abs.ofs: 158 */
|
||||
u8 reserved7[13];
|
||||
#define EEPROM_4965_BOARD_PBA (2*0x56+1) /* 9 bytes */
|
||||
u8 board_pba_number_4965[9]; /* abs.ofs: 173 */
|
||||
u8 reserved8[10];
|
||||
#endif
|
||||
#define EEPROM_REGULATORY_SKU_ID (2*0x60) /* 4 bytes */
|
||||
u8 sku_id[4]; /* abs.ofs: 192 */
|
||||
#define EEPROM_REGULATORY_BAND_1 (2*0x62) /* 2 bytes */
|
||||
u16 band_1_count; /* abs.ofs: 196 */
|
||||
#define EEPROM_REGULATORY_BAND_1_CHANNELS (2*0x63) /* 28 bytes */
|
||||
struct iwl_eeprom_channel band_1_channels[14]; /* abs.ofs: 196 */
|
||||
#define EEPROM_REGULATORY_BAND_2 (2*0x71) /* 2 bytes */
|
||||
u16 band_2_count; /* abs.ofs: 226 */
|
||||
#define EEPROM_REGULATORY_BAND_2_CHANNELS (2*0x72) /* 26 bytes */
|
||||
struct iwl_eeprom_channel band_2_channels[13]; /* abs.ofs: 228 */
|
||||
#define EEPROM_REGULATORY_BAND_3 (2*0x7F) /* 2 bytes */
|
||||
u16 band_3_count; /* abs.ofs: 254 */
|
||||
#define EEPROM_REGULATORY_BAND_3_CHANNELS (2*0x80) /* 24 bytes */
|
||||
struct iwl_eeprom_channel band_3_channels[12]; /* abs.ofs: 256 */
|
||||
#define EEPROM_REGULATORY_BAND_4 (2*0x8C) /* 2 bytes */
|
||||
u16 band_4_count; /* abs.ofs: 280 */
|
||||
#define EEPROM_REGULATORY_BAND_4_CHANNELS (2*0x8D) /* 22 bytes */
|
||||
struct iwl_eeprom_channel band_4_channels[11]; /* abs.ofs: 282 */
|
||||
#define EEPROM_REGULATORY_BAND_5 (2*0x98) /* 2 bytes */
|
||||
u16 band_5_count; /* abs.ofs: 304 */
|
||||
#define EEPROM_REGULATORY_BAND_5_CHANNELS (2*0x99) /* 12 bytes */
|
||||
struct iwl_eeprom_channel band_5_channels[6]; /* abs.ofs: 306 */
|
||||
|
||||
/* From here on out the EEPROM diverges between the 4965 and the 3945 */
|
||||
#if IWL == 3945
|
||||
|
||||
u8 reserved9[194];
|
||||
|
||||
#define EEPROM_TXPOWER_CALIB_GROUP0 0x200
|
||||
#define EEPROM_TXPOWER_CALIB_GROUP1 0x240
|
||||
#define EEPROM_TXPOWER_CALIB_GROUP2 0x280
|
||||
#define EEPROM_TXPOWER_CALIB_GROUP3 0x2c0
|
||||
#define EEPROM_TXPOWER_CALIB_GROUP4 0x300
|
||||
#define IWL_NUM_TX_CALIB_GROUPS 5
|
||||
struct iwl_eeprom_txpower_group groups[IWL_NUM_TX_CALIB_GROUPS];
|
||||
/* abs.ofs: 512 */
|
||||
#define EEPROM_CALIB_TEMPERATURE_CORRECT 0x340
|
||||
struct iwl_eeprom_temperature_corr corrections; /* abs.ofs: 832 */
|
||||
u8 reserved16[172]; /* fill out to full 1024 byte block */
|
||||
|
||||
/* 4965AGN adds fat channel support */
|
||||
#elif IWL == 4965
|
||||
|
||||
u8 reserved10[2];
|
||||
#define EEPROM_REGULATORY_BAND_24_FAT_CHANNELS (2*0xA0) /* 14 bytes */
|
||||
struct iwl_eeprom_channel band_24_channels[7]; /* abs.ofs: 320 */
|
||||
u8 reserved11[2];
|
||||
#define EEPROM_REGULATORY_BAND_52_FAT_CHANNELS (2*0xA8) /* 22 bytes */
|
||||
struct iwl_eeprom_channel band_52_channels[11]; /* abs.ofs: 336 */
|
||||
u8 reserved12[6];
|
||||
#define EEPROM_CALIB_VERSION_OFFSET (2*0xB6) /* 2 bytes */
|
||||
u16 calib_version; /* abs.ofs: 364 */
|
||||
u8 reserved13[2];
|
||||
#define EEPROM_SATURATION_POWER_OFFSET (2*0xB8) /* 2 bytes */
|
||||
u16 satruation_power; /* abs.ofs: 368 */
|
||||
u8 reserved14[94];
|
||||
#define EEPROM_IWL_CALIB_TXPOWER_OFFSET (2*0xE8) /* 48 bytes */
|
||||
struct iwl_eeprom_calib_info calib_info; /* abs.ofs: 464 */
|
||||
|
||||
u8 reserved16[140]; /* fill out to full 1024 byte block */
|
||||
|
||||
#endif
|
||||
|
||||
} __attribute__ ((packed));
|
||||
|
||||
#define IWL_EEPROM_IMAGE_SIZE 1024
|
||||
|
||||
#endif
|
||||
255
drivers/net/wireless/iwlwifi/iwl-helpers.h
Normal file
255
drivers/net/wireless/iwlwifi/iwl-helpers.h
Normal file
@@ -0,0 +1,255 @@
|
||||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2003 - 2007 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* Portions of this file are derived from the ipw3945 project, as well
|
||||
* as portions of the ieee80211 subsystem header files.
|
||||
*
|
||||
* 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:
|
||||
* James P. Ketrenos <ipw2100-admin@linux.intel.com>
|
||||
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef __iwl_helpers_h__
|
||||
#define __iwl_helpers_h__
|
||||
|
||||
#include <linux/ctype.h>
|
||||
|
||||
/*
|
||||
* The structures defined by the hardware/uCode interface
|
||||
* have bit-wise operations. For each bit-field there is
|
||||
* a data symbol in the structure, the start bit position
|
||||
* and the length of the bit-field.
|
||||
*
|
||||
* iwl_get_bits and iwl_set_bits will return or set the
|
||||
* appropriate bits on a 32-bit value.
|
||||
*
|
||||
* IWL_GET_BITS and IWL_SET_BITS use symbol expansion to
|
||||
* expand out to the appropriate call to iwl_get_bits
|
||||
* and iwl_set_bits without having to reference all of the
|
||||
* numerical constants and defines provided in the hardware
|
||||
* definition
|
||||
*/
|
||||
|
||||
/**
|
||||
* iwl_get_bits - Extract a hardware bit-field value
|
||||
* @src: source hardware value (__le32)
|
||||
* @pos: bit-position (0-based) of first bit of value
|
||||
* @len: length of bit-field
|
||||
*
|
||||
* iwl_get_bits will return the bit-field in cpu endian ordering.
|
||||
*
|
||||
* NOTE: If used from IWL_GET_BITS then pos and len are compile-constants and
|
||||
* will collapse to minimal code by the compiler.
|
||||
*/
|
||||
static inline u32 iwl_get_bits(__le32 src, u8 pos, u8 len)
|
||||
{
|
||||
u32 tmp = le32_to_cpu(src);
|
||||
|
||||
tmp >>= pos;
|
||||
tmp &= (1UL << len) - 1;
|
||||
return tmp;
|
||||
}
|
||||
|
||||
/**
|
||||
* iwl_set_bits - Set a hardware bit-field value
|
||||
* @dst: Address of __le32 hardware value
|
||||
* @pos: bit-position (0-based) of first bit of value
|
||||
* @len: length of bit-field
|
||||
* @val: cpu endian value to encode into the bit-field
|
||||
*
|
||||
* iwl_set_bits will encode val into dst, masked to be len bits long at bit
|
||||
* position pos.
|
||||
*
|
||||
* NOTE: If used IWL_SET_BITS pos and len will be compile-constants and
|
||||
* will collapse to minimal code by the compiler.
|
||||
*/
|
||||
static inline void iwl_set_bits(__le32 *dst, u8 pos, u8 len, int val)
|
||||
{
|
||||
u32 tmp = le32_to_cpu(*dst);
|
||||
|
||||
tmp &= ~(((1UL << len) - 1) << pos);
|
||||
tmp |= (val & ((1UL << len) - 1)) << pos;
|
||||
*dst = cpu_to_le32(tmp);
|
||||
}
|
||||
|
||||
static inline void iwl_set_bits16(__le16 *dst, u8 pos, u8 len, int val)
|
||||
{
|
||||
u16 tmp = le16_to_cpu(*dst);
|
||||
|
||||
tmp &= ~((1UL << (pos + len)) - (1UL << pos));
|
||||
tmp |= (val & ((1UL << len) - 1)) << pos;
|
||||
*dst = cpu_to_le16(tmp);
|
||||
}
|
||||
|
||||
/*
|
||||
* The bit-field definitions in iwl-xxxx-hw.h are in the form of:
|
||||
*
|
||||
* struct example {
|
||||
* __le32 val1;
|
||||
* #define IWL_name_POS 8
|
||||
* #define IWL_name_LEN 4
|
||||
* #define IWL_name_SYM val1
|
||||
* };
|
||||
*
|
||||
* The IWL_SET_BITS and IWL_GET_BITS macros are provided to allow the driver
|
||||
* to call:
|
||||
*
|
||||
* struct example bar;
|
||||
* u32 val = IWL_GET_BITS(bar, name);
|
||||
* val = val * 2;
|
||||
* IWL_SET_BITS(bar, name, val);
|
||||
*
|
||||
* All cpu / host ordering, masking, and shifts are performed by the macros
|
||||
* and iwl_{get,set}_bits.
|
||||
*
|
||||
*/
|
||||
#define IWL_SET_BITS(s, sym, v) \
|
||||
iwl_set_bits(&(s).IWL_ ## sym ## _SYM, IWL_ ## sym ## _POS, \
|
||||
IWL_ ## sym ## _LEN, (v))
|
||||
|
||||
#define IWL_SET_BITS16(s, sym, v) \
|
||||
iwl_set_bits16(&(s).IWL_ ## sym ## _SYM, IWL_ ## sym ## _POS, \
|
||||
IWL_ ## sym ## _LEN, (v))
|
||||
|
||||
#define IWL_GET_BITS(s, sym) \
|
||||
iwl_get_bits((s).IWL_ ## sym ## _SYM, IWL_ ## sym ## _POS, \
|
||||
IWL_ ## sym ## _LEN)
|
||||
|
||||
|
||||
#define KELVIN_TO_CELSIUS(x) ((x)-273)
|
||||
#define CELSIUS_TO_KELVIN(x) ((x)+273)
|
||||
|
||||
#define IEEE80211_CHAN_W_RADAR_DETECT 0x00000010
|
||||
|
||||
static inline struct ieee80211_conf *ieee80211_get_hw_conf(
|
||||
struct ieee80211_hw *hw)
|
||||
{
|
||||
return &hw->conf;
|
||||
}
|
||||
|
||||
#define QOS_CONTROL_LEN 2
|
||||
|
||||
#define IEEE80211_STYPE_BACK_REQ 0x0080
|
||||
#define IEEE80211_STYPE_BACK 0x0090
|
||||
|
||||
|
||||
static inline int ieee80211_is_management(u16 fc)
|
||||
{
|
||||
return (fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_MGMT;
|
||||
}
|
||||
|
||||
static inline int ieee80211_is_control(u16 fc)
|
||||
{
|
||||
return (fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_CTL;
|
||||
}
|
||||
|
||||
static inline int ieee80211_is_data(u16 fc)
|
||||
{
|
||||
return (fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_DATA;
|
||||
}
|
||||
|
||||
static inline int ieee80211_is_back_request(u16 fc)
|
||||
{
|
||||
return ((fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_CTL) &&
|
||||
((fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_BACK_REQ);
|
||||
}
|
||||
|
||||
static inline int ieee80211_is_probe_response(u16 fc)
|
||||
{
|
||||
return ((fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_MGMT) &&
|
||||
((fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_PROBE_RESP);
|
||||
}
|
||||
|
||||
static inline int ieee80211_is_probe_request(u16 fc)
|
||||
{
|
||||
return ((fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_MGMT) &&
|
||||
((fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_PROBE_REQ);
|
||||
}
|
||||
|
||||
static inline int ieee80211_is_beacon(u16 fc)
|
||||
{
|
||||
return ((fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_MGMT) &&
|
||||
((fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_BEACON);
|
||||
}
|
||||
|
||||
static inline int ieee80211_is_atim(u16 fc)
|
||||
{
|
||||
return ((fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_MGMT) &&
|
||||
((fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_ATIM);
|
||||
}
|
||||
|
||||
static inline int ieee80211_is_assoc_request(u16 fc)
|
||||
{
|
||||
return ((fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_MGMT) &&
|
||||
((fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_ASSOC_REQ);
|
||||
}
|
||||
|
||||
static inline int ieee80211_is_assoc_response(u16 fc)
|
||||
{
|
||||
return ((fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_MGMT) &&
|
||||
((fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_ASSOC_RESP);
|
||||
}
|
||||
|
||||
static inline int ieee80211_is_auth(u16 fc)
|
||||
{
|
||||
return ((fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_MGMT) &&
|
||||
((fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_ASSOC_REQ);
|
||||
}
|
||||
|
||||
static inline int ieee80211_is_deauth(u16 fc)
|
||||
{
|
||||
return ((fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_MGMT) &&
|
||||
((fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_ASSOC_REQ);
|
||||
}
|
||||
|
||||
static inline int ieee80211_is_disassoc(u16 fc)
|
||||
{
|
||||
return ((fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_MGMT) &&
|
||||
((fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_ASSOC_REQ);
|
||||
}
|
||||
|
||||
static inline int ieee80211_is_reassoc_request(u16 fc)
|
||||
{
|
||||
return ((fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_MGMT) &&
|
||||
((fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_REASSOC_REQ);
|
||||
}
|
||||
|
||||
static inline int ieee80211_is_reassoc_response(u16 fc)
|
||||
{
|
||||
return ((fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_MGMT) &&
|
||||
((fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_REASSOC_RESP);
|
||||
}
|
||||
|
||||
static inline int iwl_check_bits(unsigned long field, unsigned long mask)
|
||||
{
|
||||
return ((field & mask) == mask) ? 1 : 0;
|
||||
}
|
||||
|
||||
static inline unsigned long elapsed_jiffies(unsigned long start,
|
||||
unsigned long end)
|
||||
{
|
||||
if (end > start)
|
||||
return end - start;
|
||||
|
||||
return end + (MAX_JIFFY_OFFSET - start);
|
||||
}
|
||||
|
||||
#endif /* __iwl_helpers_h__ */
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user