Commit ed85f2c3 authored by David S. Miller's avatar David S. Miller
parents bc09dff1 e5225b39
...@@ -284,7 +284,7 @@ config LIBERTAS_USB ...@@ -284,7 +284,7 @@ config LIBERTAS_USB
config LIBERTAS_CS config LIBERTAS_CS
tristate "Marvell Libertas 8385 CompactFlash 802.11b/g cards" tristate "Marvell Libertas 8385 CompactFlash 802.11b/g cards"
depends on LIBERTAS && PCMCIA && EXPERIMENTAL depends on LIBERTAS && PCMCIA
select FW_LOADER select FW_LOADER
---help--- ---help---
A driver for Marvell Libertas 8385 CompactFlash devices. A driver for Marvell Libertas 8385 CompactFlash devices.
......
...@@ -2,6 +2,13 @@ config IWLCORE ...@@ -2,6 +2,13 @@ config IWLCORE
tristate "Intel Wireless Wifi Core" tristate "Intel Wireless Wifi Core"
depends on PCI && MAC80211 && WLAN_80211 && EXPERIMENTAL depends on PCI && MAC80211 && WLAN_80211 && EXPERIMENTAL
config IWLWIFI_LEDS
bool "Enable LEDS features in iwlwifi driver"
depends on IWLCORE && MAC80211_LEDS && LEDS_CLASS
---help---
This option enables LEDS for the iwlwifi drivers
config IWL4965 config IWL4965
tristate "Intel Wireless WiFi 4965AGN" tristate "Intel Wireless WiFi 4965AGN"
depends on PCI && MAC80211 && WLAN_80211 && EXPERIMENTAL depends on PCI && MAC80211 && WLAN_80211 && EXPERIMENTAL
...@@ -37,6 +44,13 @@ config IWL4965_HT ...@@ -37,6 +44,13 @@ config IWL4965_HT
This option enables IEEE 802.11n High Throughput features This option enables IEEE 802.11n High Throughput features
for the iwl4965 driver. for the iwl4965 driver.
config IWL4965_LEDS
bool "Enable LEDS features in iwl4965 driver"
depends on IWL4965 && IWLWIFI_LEDS
---help---
This option enables LEDS for the iwlwifi drivers
config IWL4965_SPECTRUM_MEASUREMENT config IWL4965_SPECTRUM_MEASUREMENT
bool "Enable Spectrum Measurement in iwl4965 driver" bool "Enable Spectrum Measurement in iwl4965 driver"
depends on IWL4965 depends on IWL4965
...@@ -114,6 +128,12 @@ config IWL3945_SPECTRUM_MEASUREMENT ...@@ -114,6 +128,12 @@ config IWL3945_SPECTRUM_MEASUREMENT
---help--- ---help---
This option will enable spectrum measurement for the iwl3945 driver. This option will enable spectrum measurement for the iwl3945 driver.
config IWL3945_LEDS
bool "Enable LEDS features in iwl3945 driver"
depends on IWL3945 && MAC80211_LEDS && LEDS_CLASS
---help---
This option enables LEDS for the iwl3945 driver.
config IWL3945_DEBUG config IWL3945_DEBUG
bool "Enable full debugging output in iwl3945 driver" bool "Enable full debugging output in iwl3945 driver"
depends on IWL3945 depends on IWL3945
......
...@@ -5,8 +5,18 @@ ifeq ($(CONFIG_IWLWIFI_DEBUGFS),y) ...@@ -5,8 +5,18 @@ ifeq ($(CONFIG_IWLWIFI_DEBUGFS),y)
iwlcore-objs += iwl-debugfs.o iwlcore-objs += iwl-debugfs.o
endif endif
ifeq ($(CONFIG_IWLWIFI_LEDS),y)
iwlcore-objs += iwl-led.o
endif
obj-$(CONFIG_IWL3945) += iwl3945.o obj-$(CONFIG_IWL3945) += iwl3945.o
iwl3945-objs = iwl3945-base.o iwl-3945.o iwl-3945-rs.o iwl3945-objs = iwl3945-base.o iwl-3945.o iwl-3945-rs.o
ifeq ($(CONFIG_IWL3945_LEDS),y)
iwl3945-objs += iwl-3945-led.o
endif
obj-$(CONFIG_IWL4965) += iwl4965.o obj-$(CONFIG_IWL4965) += iwl4965.o
iwl4965-objs = iwl4965-base.o iwl-4965.o iwl-4965-rs.o iwl4965-objs = iwl4965-base.o iwl-4965.o iwl-4965-rs.o
This diff is collapsed.
/******************************************************************************
*
* Copyright(c) 2003 - 2008 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 IWL3945_LEDS_H
#define IWL3945_LEDS_H
struct iwl3945_priv;
#ifdef CONFIG_IWL3945_LEDS
#define IWL_LED_SOLID 11
#define IWL_LED_NAME_LEN 31
#define IWL_DEF_LED_INTRVL __constant_cpu_to_le32(1000)
#define IWL_LED_ACTIVITY (0<<1)
#define IWL_LED_LINK (1<<1)
enum led_type {
IWL_LED_TRG_TX,
IWL_LED_TRG_RX,
IWL_LED_TRG_ASSOC,
IWL_LED_TRG_RADIO,
IWL_LED_TRG_MAX,
};
#include <linux/leds.h>
struct iwl3945_led {
struct iwl3945_priv *priv;
struct led_classdev led_dev;
int (*led_on) (struct iwl3945_priv *priv, int led_id);
int (*led_off) (struct iwl3945_priv *priv, int led_id);
int (*led_pattern) (struct iwl3945_priv *priv, int led_id,
enum led_brightness brightness);
enum led_type type;
unsigned int registered;
};
extern int iwl3945_led_register(struct iwl3945_priv *priv);
extern void iwl3945_led_unregister(struct iwl3945_priv *priv);
extern void iwl3945_led_background(struct iwl3945_priv *priv);
#else
static inline int iwl3945_led_register(struct iwl3945_priv *priv) { return 0; }
static inline void iwl3945_led_unregister(struct iwl3945_priv *priv) {}
static inline void iwl3945_led_background(struct iwl3945_priv *priv) {}
#endif /* CONFIG_IWL3945_LEDS */
#endif /* IWL3945_LEDS_H */
...@@ -358,6 +358,8 @@ void iwl3945_hw_rx_statistics(struct iwl3945_priv *priv, struct iwl3945_rx_mem_b ...@@ -358,6 +358,8 @@ void iwl3945_hw_rx_statistics(struct iwl3945_priv *priv, struct iwl3945_rx_mem_b
memcpy(&priv->statistics, pkt->u.raw, sizeof(priv->statistics)); memcpy(&priv->statistics, pkt->u.raw, sizeof(priv->statistics));
iwl3945_led_background(priv);
priv->last_statistics_time = jiffies; priv->last_statistics_time = jiffies;
} }
...@@ -640,6 +642,10 @@ static void iwl3945_handle_data_packet(struct iwl3945_priv *priv, int is_data, ...@@ -640,6 +642,10 @@ static void iwl3945_handle_data_packet(struct iwl3945_priv *priv, int is_data,
if (priv->add_radiotap) if (priv->add_radiotap)
iwl3945_add_radiotap(priv, rxb->skb, rx_hdr, stats); iwl3945_add_radiotap(priv, rxb->skb, rx_hdr, stats);
#ifdef CONFIG_IWL3945_LEDS
if (is_data)
priv->rxtxpackets += len;
#endif
ieee80211_rx_irqsafe(priv->hw, rxb->skb, stats); ieee80211_rx_irqsafe(priv->hw, rxb->skb, stats);
rxb->skb = NULL; rxb->skb = NULL;
} }
......
...@@ -44,6 +44,7 @@ extern struct pci_device_id iwl3945_hw_card_ids[]; ...@@ -44,6 +44,7 @@ extern struct pci_device_id iwl3945_hw_card_ids[];
#include "iwl-prph.h" #include "iwl-prph.h"
#include "iwl-3945-hw.h" #include "iwl-3945-hw.h"
#include "iwl-3945-debug.h" #include "iwl-3945-debug.h"
#include "iwl-3945-led.h"
/* Change firmware file name, using "-" and incrementing number, /* Change firmware file name, using "-" and incrementing number,
* *only* when uCode interface or architecture changes so that it * *only* when uCode interface or architecture changes so that it
...@@ -777,13 +778,15 @@ struct iwl3945_priv { ...@@ -777,13 +778,15 @@ struct iwl3945_priv {
struct iwl3945_init_alive_resp card_alive_init; struct iwl3945_init_alive_resp card_alive_init;
struct iwl3945_alive_resp card_alive; struct iwl3945_alive_resp card_alive;
#ifdef LED #ifdef CONFIG_IWL4965_LEDS
/* LED related variables */ struct iwl3945_led led[IWL_LED_TRG_MAX];
struct iwl3945_activity_blink activity; unsigned long last_blink_time;
unsigned long led_packets; u8 last_blink_rate;
int led_state; u8 allow_blinking;
unsigned int rxtxpackets;
#endif #endif
u16 active_rate; u16 active_rate;
u16 active_rate_basic; u16 active_rate_basic;
...@@ -827,7 +830,7 @@ struct iwl3945_priv { ...@@ -827,7 +830,7 @@ struct iwl3945_priv {
struct iwl3945_station_entry stations[IWL_STATION_COUNT]; struct iwl3945_station_entry stations[IWL_STATION_COUNT];
/* Indication if ieee80211_ops->open has been called */ /* Indication if ieee80211_ops->open has been called */
int is_open; u8 is_open;
u8 mac80211_registered; u8 mac80211_registered;
...@@ -848,7 +851,7 @@ struct iwl3945_priv { ...@@ -848,7 +851,7 @@ struct iwl3945_priv {
/* eeprom */ /* eeprom */
struct iwl3945_eeprom eeprom; struct iwl3945_eeprom eeprom;
int iw_mode; enum ieee80211_if_types iw_mode;
struct sk_buff *ibss_beacon; struct sk_buff *ibss_beacon;
......
...@@ -397,7 +397,7 @@ static void rs_tl_turn_on_agg_for_tid(struct iwl_priv *priv, ...@@ -397,7 +397,7 @@ static void rs_tl_turn_on_agg_for_tid(struct iwl_priv *priv,
DECLARE_MAC_BUF(mac); DECLARE_MAC_BUF(mac);
spin_lock_bh(&sta->ampdu_mlme.ampdu_tx); spin_lock_bh(&sta->ampdu_mlme.ampdu_tx);
state = sta->ampdu_mlme.tid_tx[tid].state; state = sta->ampdu_mlme.tid_state_tx[tid];
spin_unlock_bh(&sta->ampdu_mlme.ampdu_tx); spin_unlock_bh(&sta->ampdu_mlme.ampdu_tx);
if (state == HT_AGG_STATE_IDLE && if (state == HT_AGG_STATE_IDLE &&
......
This diff is collapsed.
...@@ -45,6 +45,7 @@ extern struct pci_device_id iwl4965_hw_card_ids[]; ...@@ -45,6 +45,7 @@ extern struct pci_device_id iwl4965_hw_card_ids[];
#include "iwl-csr.h" #include "iwl-csr.h"
#include "iwl-prph.h" #include "iwl-prph.h"
#include "iwl-debug.h" #include "iwl-debug.h"
#include "iwl-led.h"
/* Change firmware file name, using "-" and incrementing number, /* Change firmware file name, using "-" and incrementing number,
* *only* when uCode interface or architecture changes so that it * *only* when uCode interface or architecture changes so that it
...@@ -1050,11 +1051,12 @@ struct iwl_priv { ...@@ -1050,11 +1051,12 @@ struct iwl_priv {
struct iwl4965_init_alive_resp card_alive_init; struct iwl4965_init_alive_resp card_alive_init;
struct iwl4965_alive_resp card_alive; struct iwl4965_alive_resp card_alive;
#ifdef LED #ifdef CONFIG_IWL4965_LEDS
/* LED related variables */ struct iwl4965_led led[IWL_LED_TRG_MAX];
struct iwl4965_activity_blink activity; unsigned long last_blink_time;
unsigned long led_packets; u8 last_blink_rate;
int led_state; u8 allow_blinking;
u64 led_tpt;
#endif #endif
u16 active_rate; u16 active_rate;
...@@ -1127,7 +1129,7 @@ struct iwl_priv { ...@@ -1127,7 +1129,7 @@ struct iwl_priv {
struct iwl4965_station_entry stations[IWL_STATION_COUNT]; struct iwl4965_station_entry stations[IWL_STATION_COUNT];
/* Indication if ieee80211_ops->open has been called */ /* Indication if ieee80211_ops->open has been called */
int is_open; u8 is_open;
u8 mac80211_registered; u8 mac80211_registered;
...@@ -1148,7 +1150,7 @@ struct iwl_priv { ...@@ -1148,7 +1150,7 @@ struct iwl_priv {
/* eeprom */ /* eeprom */
struct iwl4965_eeprom eeprom; struct iwl4965_eeprom eeprom;
int iw_mode; enum ieee80211_if_types iw_mode;
struct sk_buff *ibss_beacon; struct sk_buff *ibss_beacon;
...@@ -1264,6 +1266,5 @@ extern const struct iwl_channel_info *iwl_get_channel_info( ...@@ -1264,6 +1266,5 @@ extern const struct iwl_channel_info *iwl_get_channel_info(
const struct iwl_priv *priv, enum ieee80211_band band, u16 channel); const struct iwl_priv *priv, enum ieee80211_band band, u16 channel);
/* Requires full declaration of iwl_priv before including */ /* Requires full declaration of iwl_priv before including */
#include "iwl-4965-io.h"
#endif /* __iwl4965_4965_h__ */ #endif /* __iwl4965_4965_h__ */
...@@ -93,6 +93,7 @@ ...@@ -93,6 +93,7 @@
#define CSR_UCODE_DRV_GP1_CLR (CSR_BASE+0x05c) #define CSR_UCODE_DRV_GP1_CLR (CSR_BASE+0x05c)
#define CSR_UCODE_DRV_GP2 (CSR_BASE+0x060) #define CSR_UCODE_DRV_GP2 (CSR_BASE+0x060)
#define CSR_GIO_CHICKEN_BITS (CSR_BASE+0x100) #define CSR_GIO_CHICKEN_BITS (CSR_BASE+0x100)
#define CSR_LED_REG (CSR_BASE+0x094)
/* Analog phase-lock-loop configuration (3945 only) /* Analog phase-lock-loop configuration (3945 only)
* Set bit 24. */ * Set bit 24. */
...@@ -214,6 +215,11 @@ ...@@ -214,6 +215,11 @@
#define CSR_GIO_CHICKEN_BITS_REG_BIT_L1A_NO_L0S_RX (0x00800000) #define CSR_GIO_CHICKEN_BITS_REG_BIT_L1A_NO_L0S_RX (0x00800000)
#define CSR_GIO_CHICKEN_BITS_REG_BIT_DIS_L0S_EXIT_TIMER (0x20000000) #define CSR_GIO_CHICKEN_BITS_REG_BIT_DIS_L0S_EXIT_TIMER (0x20000000)
/* LED */
#define CSR_LED_BSM_CTRL_MSK (0xFFFFFFDF)
#define CSR_LED_REG_TRUN_ON (0x78)
#define CSR_LED_REG_TRUN_OFF (0x38)
/*=== HBUS (Host-side Bus) ===*/ /*=== HBUS (Host-side Bus) ===*/
#define HBUS_BASE (0x400) #define HBUS_BASE (0x400)
/* /*
......
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
#include "iwl-4965.h" #include "iwl-4965.h"
#include "iwl-debug.h" #include "iwl-debug.h"
#include "iwl-4965-io.h" #include "iwl-io.h"
/* create and remove of files */ /* create and remove of files */
...@@ -141,9 +141,9 @@ static ssize_t iwl_dbgfs_sram_read(struct file *file, ...@@ -141,9 +141,9 @@ static ssize_t iwl_dbgfs_sram_read(struct file *file,
printk(KERN_DEBUG "offset is: 0x%x\tlen is: 0x%x\n", printk(KERN_DEBUG "offset is: 0x%x\tlen is: 0x%x\n",
priv->dbgfs->sram_offset, priv->dbgfs->sram_len); priv->dbgfs->sram_offset, priv->dbgfs->sram_len);
iwl4965_grab_nic_access(priv); iwl_grab_nic_access(priv);
for (i = priv->dbgfs->sram_len; i > 0; i -= 4) { for (i = priv->dbgfs->sram_len; i > 0; i -= 4) {
val = iwl4965_read_targ_mem(priv, priv->dbgfs->sram_offset + \ val = iwl_read_targ_mem(priv, priv->dbgfs->sram_offset + \
priv->dbgfs->sram_len - i); priv->dbgfs->sram_len - i);
if (i < 4) { if (i < 4) {
switch (i) { switch (i) {
...@@ -161,7 +161,7 @@ static ssize_t iwl_dbgfs_sram_read(struct file *file, ...@@ -161,7 +161,7 @@ static ssize_t iwl_dbgfs_sram_read(struct file *file,
pos += sprintf(buf+pos, "0x%08x ", val); pos += sprintf(buf+pos, "0x%08x ", val);
} }
pos += sprintf(buf+pos, "\n"); pos += sprintf(buf+pos, "\n");
iwl4965_release_nic_access(priv); iwl_release_nic_access(priv);
ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos);
return ret; return ret;
......
...@@ -73,7 +73,7 @@ ...@@ -73,7 +73,7 @@
#include "iwl-core.h" #include "iwl-core.h"
#include "iwl-debug.h" #include "iwl-debug.h"
#include "iwl-eeprom.h" #include "iwl-eeprom.h"
#include "iwl-4965-io.h" #include "iwl-io.h"
/************************** EEPROM BANDS **************************** /************************** EEPROM BANDS ****************************
* *
...@@ -144,7 +144,7 @@ static const u8 iwl_eeprom_band_7[] = { /* 5.2 FAT channel */ ...@@ -144,7 +144,7 @@ static const u8 iwl_eeprom_band_7[] = { /* 5.2 FAT channel */
int iwlcore_eeprom_verify_signature(struct iwl_priv *priv) int iwlcore_eeprom_verify_signature(struct iwl_priv *priv)
{ {
u32 gp = iwl4965_read32(priv, CSR_EEPROM_GP); u32 gp = iwl_read32(priv, CSR_EEPROM_GP);
if ((gp & CSR_EEPROM_GP_VALID_MSK) == CSR_EEPROM_GP_BAD_SIGNATURE) { if ((gp & CSR_EEPROM_GP_VALID_MSK) == CSR_EEPROM_GP_BAD_SIGNATURE) {
IWL_ERROR("EEPROM not found, EEPROM_GP=0x%08x", gp); IWL_ERROR("EEPROM not found, EEPROM_GP=0x%08x", gp);
return -ENOENT; return -ENOENT;
...@@ -166,11 +166,11 @@ int iwlcore_eeprom_acquire_semaphore(struct iwl_priv *priv) ...@@ -166,11 +166,11 @@ int iwlcore_eeprom_acquire_semaphore(struct iwl_priv *priv)
for (count = 0; count < EEPROM_SEM_RETRY_LIMIT; count++) { for (count = 0; count < EEPROM_SEM_RETRY_LIMIT; count++) {
/* Request semaphore */ /* Request semaphore */
iwl4965_set_bit(priv, CSR_HW_IF_CONFIG_REG, iwl_set_bit(priv, CSR_HW_IF_CONFIG_REG,
CSR_HW_IF_CONFIG_REG_BIT_EEPROM_OWN_SEM); CSR_HW_IF_CONFIG_REG_BIT_EEPROM_OWN_SEM);
/* See if we got it */ /* See if we got it */
ret = iwl4965_poll_bit(priv, CSR_HW_IF_CONFIG_REG, ret = iwl_poll_bit(priv, CSR_HW_IF_CONFIG_REG,
CSR_HW_IF_CONFIG_REG_BIT_EEPROM_OWN_SEM, CSR_HW_IF_CONFIG_REG_BIT_EEPROM_OWN_SEM,
CSR_HW_IF_CONFIG_REG_BIT_EEPROM_OWN_SEM, CSR_HW_IF_CONFIG_REG_BIT_EEPROM_OWN_SEM,
EEPROM_SEM_TIMEOUT); EEPROM_SEM_TIMEOUT);
...@@ -187,7 +187,7 @@ EXPORT_SYMBOL(iwlcore_eeprom_acquire_semaphore); ...@@ -187,7 +187,7 @@ EXPORT_SYMBOL(iwlcore_eeprom_acquire_semaphore);
void iwlcore_eeprom_release_semaphore(struct iwl_priv *priv) void iwlcore_eeprom_release_semaphore(struct iwl_priv *priv)
{ {
iwl4965_clear_bit(priv, CSR_HW_IF_CONFIG_REG, iwl_clear_bit(priv, CSR_HW_IF_CONFIG_REG,
CSR_HW_IF_CONFIG_REG_BIT_EEPROM_OWN_SEM); CSR_HW_IF_CONFIG_REG_BIT_EEPROM_OWN_SEM);
} }
...@@ -204,7 +204,7 @@ EXPORT_SYMBOL(iwlcore_eeprom_release_semaphore); ...@@ -204,7 +204,7 @@ EXPORT_SYMBOL(iwlcore_eeprom_release_semaphore);
int iwl_eeprom_init(struct iwl_priv *priv) int iwl_eeprom_init(struct iwl_priv *priv)
{ {
u16 *e = (u16 *)&priv->eeprom; u16 *e = (u16 *)&priv->eeprom;
u32 gp = iwl4965_read32(priv, CSR_EEPROM_GP); u32 gp = iwl_read32(priv, CSR_EEPROM_GP);
u32 r; u32 r;
int sz = sizeof(priv->eeprom); int sz = sizeof(priv->eeprom);
int ret; int ret;
...@@ -231,12 +231,12 @@ int iwl_eeprom_init(struct iwl_priv *priv) ...@@ -231,12 +231,12 @@ int iwl_eeprom_init(struct iwl_priv *priv)
/* eeprom is an array of 16bit values */ /* eeprom is an array of 16bit values */
for (addr = 0; addr < sz; addr += sizeof(u16)) { for (addr = 0; addr < sz; addr += sizeof(u16)) {
_iwl4965_write32(priv, CSR_EEPROM_REG, addr << 1); _iwl_write32(priv, CSR_EEPROM_REG, addr << 1);
_iwl4965_clear_bit(priv, CSR_EEPROM_REG, CSR_EEPROM_REG_BIT_CMD); _iwl_clear_bit(priv, CSR_EEPROM_REG, CSR_EEPROM_REG_BIT_CMD);
for (i = 0; i < IWL_EEPROM_ACCESS_TIMEOUT; for (i = 0; i < IWL_EEPROM_ACCESS_TIMEOUT;
i += IWL_EEPROM_ACCESS_DELAY) { i += IWL_EEPROM_ACCESS_DELAY) {
r = _iwl4965_read_direct32(priv, CSR_EEPROM_REG); r = _iwl_read_direct32(priv, CSR_EEPROM_REG);
if (r & CSR_EEPROM_REG_READ_VALID_MSK) if (r & CSR_EEPROM_REG_READ_VALID_MSK)
break; break;
udelay(IWL_EEPROM_ACCESS_DELAY); udelay(IWL_EEPROM_ACCESS_DELAY);
......
...@@ -97,6 +97,31 @@ EXPORT_SYMBOL(get_cmd_string); ...@@ -97,6 +97,31 @@ EXPORT_SYMBOL(get_cmd_string);
#define HOST_COMPLETE_TIMEOUT (HZ / 2) #define HOST_COMPLETE_TIMEOUT (HZ / 2)
static int iwl_generic_cmd_callback(struct iwl_priv *priv,
struct iwl_cmd *cmd, struct sk_buff *skb)
{
struct iwl4965_rx_packet *pkt = NULL;
if (!skb) {
IWL_ERROR("Error: Response NULL in %s.\n",
get_cmd_string(cmd->hdr.cmd));
return 1;
}
pkt = (struct iwl4965_rx_packet *)skb->data;
if (pkt->hdr.flags & IWL_CMD_FAILED_MSK) {
IWL_ERROR("Bad return from %s (0x%08X)\n",
get_cmd_string(cmd->hdr.cmd), pkt->hdr.flags);
return 1;
}
IWL_DEBUG_HC("back from %s (0x%08X)\n",
get_cmd_string(cmd->hdr.cmd), pkt->hdr.flags);
/* Let iwl_tx_complete free the response skb */
return 1;
}
static int iwl_send_cmd_async(struct iwl_priv *priv, struct iwl_host_cmd *cmd) static int iwl_send_cmd_async(struct iwl_priv *priv, struct iwl_host_cmd *cmd)
{ {
int ret; int ret;
...@@ -106,8 +131,9 @@ static int iwl_send_cmd_async(struct iwl_priv *priv, struct iwl_host_cmd *cmd) ...@@ -106,8 +131,9 @@ static int iwl_send_cmd_async(struct iwl_priv *priv, struct iwl_host_cmd *cmd)
/* 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->meta.flags & CMD_WANT_SKB); BUG_ON(cmd->meta.flags & CMD_WANT_SKB);
/* An asynchronous command MUST have a callback. */ /* Assign a generic callback if one is not provided */
BUG_ON(!cmd->meta.u.callback); if (!cmd->meta.u.callback)
cmd->meta.u.callback = iwl_generic_cmd_callback;
if (test_bit(STATUS_EXIT_PENDING, &priv->status)) if (test_bit(STATUS_EXIT_PENDING, &priv->status))
return -EBUSY; return -EBUSY;
......
This diff is collapsed.
/******************************************************************************
*
* Copyright(c) 2003 - 2008 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_leds_h__
#define __iwl_leds_h__
struct iwl_priv;
#ifdef CONFIG_IWLWIFI_LEDS
#include <linux/leds.h>
#define IWL_LED_SOLID 11
#define IWL_LED_NAME_LEN 31
#define IWL_DEF_LED_INTRVL __constant_cpu_to_le32(1000)
#define IWL_LED_ACTIVITY (0<<1)
#define IWL_LED_LINK (1<<1)
enum led_type {
IWL_LED_TRG_TX,
IWL_LED_TRG_RX,
IWL_LED_TRG_ASSOC,
IWL_LED_TRG_RADIO,
IWL_LED_TRG_MAX,
};
struct iwl4965_led {
struct iwl_priv *priv;
struct led_classdev led_dev;
int (*led_on) (struct iwl_priv *priv, int led_id);
int (*led_off) (struct iwl_priv *priv, int led_id);
int (*led_pattern) (struct iwl_priv *priv, int led_id,
enum led_brightness brightness);
enum led_type type;
unsigned int registered;
};
int iwl_leds_register(struct iwl_priv *priv);
void iwl_leds_unregister(struct iwl_priv *priv);
void iwl_leds_background(struct iwl_priv *priv);
#else
static inline int iwl_leds_register(struct iwl_priv *priv)
{
return 0;
}
static inline void iwl_leds_unregister(struct iwl_priv *priv)
{
}
static inline void iwl_leds_background(struct iwl_priv *priv)
{
}
#endif /* CONFIG_IWLWIFI_LEDS */
#endif /* __iwl_leds_h__ */
...@@ -2058,6 +2058,8 @@ int iwl3945_is_network_packet(struct iwl3945_priv *priv, struct ieee80211_hdr *h ...@@ -2058,6 +2058,8 @@ int iwl3945_is_network_packet(struct iwl3945_priv *priv, struct ieee80211_hdr *h
return !compare_ether_addr(header->addr2, priv->bssid); return !compare_ether_addr(header->addr2, priv->bssid);
/* packets to our adapter go through */ /* packets to our adapter go through */
return !compare_ether_addr(header->addr1, priv->mac_addr); return !compare_ether_addr(header->addr1, priv->mac_addr);
default:
return 1;
} }
return 1; return 1;
...@@ -2302,6 +2304,9 @@ static void iwl3945_connection_init_rx_config(struct iwl3945_priv *priv) ...@@ -2302,6 +2304,9 @@ static void iwl3945_connection_init_rx_config(struct iwl3945_priv *priv)
priv->staging_rxon.filter_flags = RXON_FILTER_PROMISC_MSK | priv->staging_rxon.filter_flags = RXON_FILTER_PROMISC_MSK |
RXON_FILTER_CTL2HOST_MSK | RXON_FILTER_ACCEPT_GRP_MSK; RXON_FILTER_CTL2HOST_MSK | RXON_FILTER_ACCEPT_GRP_MSK;
break; break;
default:
IWL_ERROR("Unsupported interface type %d\n", priv->iw_mode);
break;
} }
#if 0 #if 0
...@@ -2481,8 +2486,12 @@ static void iwl3945_build_tx_cmd_basic(struct iwl3945_priv *priv, ...@@ -2481,8 +2486,12 @@ static void iwl3945_build_tx_cmd_basic(struct iwl3945_priv *priv,
cmd->cmd.tx.timeout.pm_frame_timeout = cpu_to_le16(3); cmd->cmd.tx.timeout.pm_frame_timeout = cpu_to_le16(3);
else else
cmd->cmd.tx.timeout.pm_frame_timeout = cpu_to_le16(2); cmd->cmd.tx.timeout.pm_frame_timeout = cpu_to_le16(2);
} else } else {
cmd->cmd.tx.timeout.pm_frame_timeout = 0; cmd->cmd.tx.timeout.pm_frame_timeout = 0;
#ifdef CONFIG_IWL3945_LEDS
priv->rxtxpackets += le16_to_cpu(cmd->cmd.tx.len);
#endif
}
cmd->cmd.tx.driver_txop = 0; cmd->cmd.tx.driver_txop = 0;
cmd->cmd.tx.tx_flags = tx_flags; cmd->cmd.tx.tx_flags = tx_flags;
...@@ -5136,8 +5145,12 @@ static int iwl3945_init_geos(struct iwl3945_priv *priv) ...@@ -5136,8 +5145,12 @@ static int iwl3945_init_geos(struct iwl3945_priv *priv)
priv->bands[IEEE80211_BAND_2GHZ].n_channels, priv->bands[IEEE80211_BAND_2GHZ].n_channels,
priv->bands[IEEE80211_BAND_5GHZ].n_channels); priv->bands[IEEE80211_BAND_5GHZ].n_channels);
priv->hw->wiphy->bands[IEEE80211_BAND_2GHZ] = &priv->bands[IEEE80211_BAND_2GHZ]; if (priv->bands[IEEE80211_BAND_2GHZ].n_channels)
priv->hw->wiphy->bands[IEEE80211_BAND_5GHZ] = &priv->bands[IEEE80211_BAND_5GHZ]; priv->hw->wiphy->bands[IEEE80211_BAND_2GHZ] =
&priv->bands[IEEE80211_BAND_2GHZ];
if (priv->bands[IEEE80211_BAND_5GHZ].n_channels)
priv->hw->wiphy->bands[IEEE80211_BAND_5GHZ] =
&priv->bands[IEEE80211_BAND_5GHZ];
set_bit(STATUS_GEO_CONFIGURED, &priv->status); set_bit(STATUS_GEO_CONFIGURED, &priv->status);
...@@ -5851,6 +5864,8 @@ static void iwl3945_alive_start(struct iwl3945_priv *priv) ...@@ -5851,6 +5864,8 @@ static void iwl3945_alive_start(struct iwl3945_priv *priv)
IWL_DEBUG_INFO("ALIVE processing complete.\n"); IWL_DEBUG_INFO("ALIVE processing complete.\n");
wake_up_interruptible(&priv->wait_command_queue); wake_up_interruptible(&priv->wait_command_queue);
iwl3945_led_register(priv);
if (priv->error_recovering) if (priv->error_recovering)
iwl3945_error_recovery(priv); iwl3945_error_recovery(priv);
...@@ -5875,6 +5890,7 @@ static void __iwl3945_down(struct iwl3945_priv *priv) ...@@ -5875,6 +5890,7 @@ static void __iwl3945_down(struct iwl3945_priv *priv)
if (!exit_pending) if (!exit_pending)
set_bit(STATUS_EXIT_PENDING, &priv->status); set_bit(STATUS_EXIT_PENDING, &priv->status);
iwl3945_led_unregister(priv);
iwl3945_clear_stations_table(priv); iwl3945_clear_stations_table(priv);
/* Unblock any waiting calls */ /* Unblock any waiting calls */
......
This diff is collapsed.
...@@ -1186,8 +1186,8 @@ static void lbs_submit_command(struct lbs_private *priv, ...@@ -1186,8 +1186,8 @@ static void lbs_submit_command(struct lbs_private *priv,
command == CMD_802_11_AUTHENTICATE) command == CMD_802_11_AUTHENTICATE)
timeo = 10 * HZ; timeo = 10 * HZ;
lbs_deb_cmd("DNLD_CMD: command 0x%04x, seq %d, size %d, jiffies %lu\n", lbs_deb_cmd("DNLD_CMD: command 0x%04x, seq %d, size %d\n",
command, le16_to_cpu(cmd->seqnum), cmdsize, jiffies); command, le16_to_cpu(cmd->seqnum), cmdsize);
lbs_deb_hex(LBS_DEB_CMD, "DNLD_CMD", (void *) cmdnode->cmdbuf, cmdsize); lbs_deb_hex(LBS_DEB_CMD, "DNLD_CMD", (void *) cmdnode->cmdbuf, cmdsize);
ret = priv->hw_host_to_card(priv, MVMS_CMD, (u8 *) cmd, cmdsize); ret = priv->hw_host_to_card(priv, MVMS_CMD, (u8 *) cmd, cmdsize);
...@@ -1496,16 +1496,6 @@ int lbs_prepare_and_send_command(struct lbs_private *priv, ...@@ -1496,16 +1496,6 @@ int lbs_prepare_and_send_command(struct lbs_private *priv,
break; break;
} }
case CMD_802_11_PWR_CFG:
cmdptr->command = cpu_to_le16(CMD_802_11_PWR_CFG);
cmdptr->size =
cpu_to_le16(sizeof(struct cmd_ds_802_11_pwr_cfg) +
S_DS_GEN);
memmove(&cmdptr->params.pwrcfg, pdata_buf,
sizeof(struct cmd_ds_802_11_pwr_cfg));
ret = 0;
break;
case CMD_BT_ACCESS: case CMD_BT_ACCESS:
ret = lbs_cmd_bt_access(cmdptr, cmd_action, pdata_buf); ret = lbs_cmd_bt_access(cmdptr, cmd_action, pdata_buf);
break; break;
......
...@@ -397,14 +397,6 @@ static inline int handle_cmd_response(struct lbs_private *priv, ...@@ -397,14 +397,6 @@ static inline int handle_cmd_response(struct lbs_private *priv,
spin_unlock_irqrestore(&priv->driver_lock, flags); spin_unlock_irqrestore(&priv->driver_lock, flags);
break; break;
case CMD_RET(CMD_802_11_PWR_CFG):
spin_lock_irqsave(&priv->driver_lock, flags);
memmove((void *)priv->cur_cmd->callback_arg, &resp->params.pwrcfg,
sizeof(struct cmd_ds_802_11_pwr_cfg));
spin_unlock_irqrestore(&priv->driver_lock, flags);
break;
case CMD_RET(CMD_GET_TSF): case CMD_RET(CMD_GET_TSF):
spin_lock_irqsave(&priv->driver_lock, flags); spin_lock_irqsave(&priv->driver_lock, flags);
memcpy((void *)priv->cur_cmd->callback_arg, memcpy((void *)priv->cur_cmd->callback_arg,
...@@ -463,8 +455,8 @@ int lbs_process_rx_command(struct lbs_private *priv) ...@@ -463,8 +455,8 @@ int lbs_process_rx_command(struct lbs_private *priv)
respcmd = le16_to_cpu(resp->command); respcmd = le16_to_cpu(resp->command);
result = le16_to_cpu(resp->result); result = le16_to_cpu(resp->result);
lbs_deb_cmd("CMD_RESP: response 0x%04x, seq %d, size %d, jiffies %lu\n", lbs_deb_cmd("CMD_RESP: response 0x%04x, seq %d, size %d\n",
respcmd, le16_to_cpu(resp->seqnum), priv->upld_len, jiffies); respcmd, le16_to_cpu(resp->seqnum), priv->upld_len);
lbs_deb_hex(LBS_DEB_CMD, "CMD_RESP", (void *) resp, priv->upld_len); lbs_deb_hex(LBS_DEB_CMD, "CMD_RESP", (void *) resp, priv->upld_len);
if (resp->seqnum != priv->cur_cmd->cmdbuf->seqnum) { if (resp->seqnum != priv->cur_cmd->cmdbuf->seqnum) {
......
...@@ -53,14 +53,14 @@ do { if ((lbs_debug & (grp)) == (grp)) \ ...@@ -53,14 +53,14 @@ do { if ((lbs_debug & (grp)) == (grp)) \
#endif #endif
#define lbs_deb_enter(grp) \ #define lbs_deb_enter(grp) \
LBS_DEB_LL(grp | LBS_DEB_ENTER, " enter", "%s():%d\n", __FUNCTION__, __LINE__); LBS_DEB_LL(grp | LBS_DEB_ENTER, " enter", "%s()\n", __func__);
#define lbs_deb_enter_args(grp, fmt, args...) \ #define lbs_deb_enter_args(grp, fmt, args...) \
LBS_DEB_LL(grp | LBS_DEB_ENTER, " enter", "%s(" fmt "):%d\n", __FUNCTION__, ## args, __LINE__); LBS_DEB_LL(grp | LBS_DEB_ENTER, " enter", "%s(" fmt ")\n", __func__, ## args);
#define lbs_deb_leave(grp) \ #define lbs_deb_leave(grp) \
LBS_DEB_LL(grp | LBS_DEB_LEAVE, " leave", "%s():%d\n", __FUNCTION__, __LINE__); LBS_DEB_LL(grp | LBS_DEB_LEAVE, " leave", "%s()\n", __func__);
#define lbs_deb_leave_args(grp, fmt, args...) \ #define lbs_deb_leave_args(grp, fmt, args...) \
LBS_DEB_LL(grp | LBS_DEB_LEAVE, " leave", "%s():%d, " fmt "\n", \ LBS_DEB_LL(grp | LBS_DEB_LEAVE, " leave", "%s(), " fmt "\n", \
__FUNCTION__, __LINE__, ##args); __func__, ##args);
#define lbs_deb_main(fmt, args...) LBS_DEB_LL(LBS_DEB_MAIN, " main", fmt, ##args) #define lbs_deb_main(fmt, args...) LBS_DEB_LL(LBS_DEB_MAIN, " main", fmt, ##args)
#define lbs_deb_net(fmt, args...) LBS_DEB_LL(LBS_DEB_NET, " net", fmt, ##args) #define lbs_deb_net(fmt, args...) LBS_DEB_LL(LBS_DEB_NET, " net", fmt, ##args)
#define lbs_deb_mesh(fmt, args...) LBS_DEB_LL(LBS_DEB_MESH, " mesh", fmt, ##args) #define lbs_deb_mesh(fmt, args...) LBS_DEB_LL(LBS_DEB_MESH, " mesh", fmt, ##args)
......
...@@ -84,7 +84,6 @@ ...@@ -84,7 +84,6 @@
#define CMD_802_11_INACTIVITY_TIMEOUT 0x0067 #define CMD_802_11_INACTIVITY_TIMEOUT 0x0067
#define CMD_802_11_SLEEP_PERIOD 0x0068 #define CMD_802_11_SLEEP_PERIOD 0x0068
#define CMD_802_11_TPC_CFG 0x0072 #define CMD_802_11_TPC_CFG 0x0072
#define CMD_802_11_PWR_CFG 0x0073
#define CMD_802_11_FW_WAKE_METHOD 0x0074 #define CMD_802_11_FW_WAKE_METHOD 0x0074
#define CMD_802_11_SUBSCRIBE_EVENT 0x0075 #define CMD_802_11_SUBSCRIBE_EVENT 0x0075
#define CMD_802_11_RATE_ADAPT_RATESET 0x0076 #define CMD_802_11_RATE_ADAPT_RATESET 0x0076
......
...@@ -609,14 +609,6 @@ struct cmd_ds_802_11_led_ctrl { ...@@ -609,14 +609,6 @@ struct cmd_ds_802_11_led_ctrl {
u8 data[256]; u8 data[256];
} __attribute__ ((packed)); } __attribute__ ((packed));
struct cmd_ds_802_11_pwr_cfg {
__le16 action;
u8 enable;
s8 PA_P0;
s8 PA_P1;
s8 PA_P2;
} __attribute__ ((packed));
struct cmd_ds_802_11_afc { struct cmd_ds_802_11_afc {
__le16 afc_auto; __le16 afc_auto;
union { union {
...@@ -726,7 +718,6 @@ struct cmd_ds_command { ...@@ -726,7 +718,6 @@ struct cmd_ds_command {
struct cmd_ds_802_11d_domain_info domaininforesp; struct cmd_ds_802_11d_domain_info domaininforesp;
struct cmd_ds_802_11_tpc_cfg tpccfg; struct cmd_ds_802_11_tpc_cfg tpccfg;
struct cmd_ds_802_11_pwr_cfg pwrcfg;
struct cmd_ds_802_11_afc afc; struct cmd_ds_802_11_afc afc;
struct cmd_ds_802_11_led_ctrl ledgpio; struct cmd_ds_802_11_led_ctrl ledgpio;
......
...@@ -277,10 +277,10 @@ static ssize_t lbs_rtap_set(struct device *dev, ...@@ -277,10 +277,10 @@ static ssize_t lbs_rtap_set(struct device *dev,
struct lbs_private *priv = to_net_dev(dev)->priv; struct lbs_private *priv = to_net_dev(dev)->priv;
sscanf(buf, "%x", &monitor_mode); sscanf(buf, "%x", &monitor_mode);
if (monitor_mode != LBS_MONITOR_OFF) { if (monitor_mode) {
if(priv->monitormode == monitor_mode) if (priv->monitormode == monitor_mode)
return strlen(buf); return strlen(buf);
if (priv->monitormode == LBS_MONITOR_OFF) { if (!priv->monitormode) {
if (priv->infra_open || priv->mesh_open) if (priv->infra_open || priv->mesh_open)
return -EBUSY; return -EBUSY;
if (priv->mode == IW_MODE_INFRA) if (priv->mode == IW_MODE_INFRA)
...@@ -293,9 +293,9 @@ static ssize_t lbs_rtap_set(struct device *dev, ...@@ -293,9 +293,9 @@ static ssize_t lbs_rtap_set(struct device *dev,
} }
else { else {
if (priv->monitormode == LBS_MONITOR_OFF) if (!priv->monitormode)
return strlen(buf); return strlen(buf);
priv->monitormode = LBS_MONITOR_OFF; priv->monitormode = 0;
lbs_remove_rtap(priv); lbs_remove_rtap(priv);
if (priv->currenttxskb) { if (priv->currenttxskb) {
...@@ -392,7 +392,7 @@ static int lbs_dev_open(struct net_device *dev) ...@@ -392,7 +392,7 @@ static int lbs_dev_open(struct net_device *dev)
spin_lock_irq(&priv->driver_lock); spin_lock_irq(&priv->driver_lock);
if (priv->monitormode != LBS_MONITOR_OFF) { if (priv->monitormode) {
ret = -EBUSY; ret = -EBUSY;
goto out; goto out;
} }
......
...@@ -155,7 +155,7 @@ int lbs_process_rxed_packet(struct lbs_private *priv, struct sk_buff *skb) ...@@ -155,7 +155,7 @@ int lbs_process_rxed_packet(struct lbs_private *priv, struct sk_buff *skb)
skb->ip_summed = CHECKSUM_NONE; skb->ip_summed = CHECKSUM_NONE;
if (priv->monitormode != LBS_MONITOR_OFF) if (priv->monitormode)
return process_rxed_802_11_packet(priv, skb); return process_rxed_802_11_packet(priv, skb);
p_rx_pkt = (struct rxpackethdr *) skb->data; p_rx_pkt = (struct rxpackethdr *) skb->data;
......
...@@ -151,7 +151,7 @@ int lbs_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -151,7 +151,7 @@ int lbs_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
dev->trans_start = jiffies; dev->trans_start = jiffies;
if (priv->monitormode != LBS_MONITOR_OFF) { if (priv->monitormode) {
/* Keep the skb to echo it back once Tx feedback is /* Keep the skb to echo it back once Tx feedback is
received from FW */ received from FW */
skb_orphan(skb); skb_orphan(skb);
...@@ -186,8 +186,7 @@ void lbs_send_tx_feedback(struct lbs_private *priv) ...@@ -186,8 +186,7 @@ void lbs_send_tx_feedback(struct lbs_private *priv)
int txfail; int txfail;
int try_count; int try_count;
if (priv->monitormode == LBS_MONITOR_OFF || if (!priv->monitormode || priv->currenttxskb == NULL)
priv->currenttxskb == NULL)
return; return;
radiotap_hdr = (struct tx_radiotap_hdr *)priv->currenttxskb->data; radiotap_hdr = (struct tx_radiotap_hdr *)priv->currenttxskb->data;
......
...@@ -15,8 +15,6 @@ struct lbs_ioctl_regrdwr { ...@@ -15,8 +15,6 @@ struct lbs_ioctl_regrdwr {
u32 value; u32 value;
}; };
#define LBS_MONITOR_OFF 0
extern struct iw_handler_def lbs_handler_def; extern struct iw_handler_def lbs_handler_def;
extern struct iw_handler_def mesh_handler_def; extern struct iw_handler_def mesh_handler_def;
......
...@@ -218,7 +218,7 @@ prism54_get_wireless_stats(struct net_device *ndev) ...@@ -218,7 +218,7 @@ prism54_get_wireless_stats(struct net_device *ndev)
islpci_private *priv = netdev_priv(ndev); islpci_private *priv = netdev_priv(ndev);
/* If the stats are being updated return old data */ /* If the stats are being updated return old data */
if (mutex_trylock(&priv->stats_lock) == 0) { if (mutex_trylock(&priv->stats_lock)) {
memcpy(&priv->iwstatistics, &priv->local_iwstatistics, memcpy(&priv->iwstatistics, &priv->local_iwstatistics,
sizeof (struct iw_statistics)); sizeof (struct iw_statistics));
/* They won't be marked updated for the next time */ /* They won't be marked updated for the next time */
......
...@@ -304,10 +304,22 @@ extern int ieee80211_channel_to_frequency(int chan); ...@@ -304,10 +304,22 @@ extern int ieee80211_channel_to_frequency(int chan);
*/ */
extern int ieee80211_frequency_to_channel(int freq); extern int ieee80211_frequency_to_channel(int freq);
/** /*
* ieee80211_get_channel - get channel struct from wiphy for specified frequency * Name indirection necessary because the ieee80211 code also has
* a function named "ieee80211_get_channel", so if you include
* cfg80211's header file you get cfg80211's version, if you try
* to include both header files you'll (rightfully!) get a symbol
* clash.
*/ */
extern struct ieee80211_channel *ieee80211_get_channel(struct wiphy *wiphy, extern struct ieee80211_channel *__ieee80211_get_channel(struct wiphy *wiphy,
int freq); int freq);
/**
* ieee80211_get_channel - get channel struct from wiphy for specified frequency
*/
static inline struct ieee80211_channel *
ieee80211_get_channel(struct wiphy *wiphy, int freq)
{
return __ieee80211_get_channel(wiphy, freq);
}
#endif /* __NET_WIRELESS_H */ #endif /* __NET_WIRELESS_H */
...@@ -169,27 +169,30 @@ static ssize_t sta_agg_status_read(struct file *file, char __user *userbuf, ...@@ -169,27 +169,30 @@ static ssize_t sta_agg_status_read(struct file *file, char __user *userbuf,
p += scnprintf(p, sizeof(buf)+buf-p, "\n RX :"); p += scnprintf(p, sizeof(buf)+buf-p, "\n RX :");
for (i = 0; i < STA_TID_NUM; i++) for (i = 0; i < STA_TID_NUM; i++)
p += scnprintf(p, sizeof(buf)+buf-p, "%5d", p += scnprintf(p, sizeof(buf)+buf-p, "%5d",
sta->ampdu_mlme.tid_rx[i].state); sta->ampdu_mlme.tid_state_rx[i]);
p += scnprintf(p, sizeof(buf)+buf-p, "\n DTKN:"); p += scnprintf(p, sizeof(buf)+buf-p, "\n DTKN:");
for (i = 0; i < STA_TID_NUM; i++) for (i = 0; i < STA_TID_NUM; i++)
p += scnprintf(p, sizeof(buf)+buf-p, "%5d", p += scnprintf(p, sizeof(buf)+buf-p, "%5d",
sta->ampdu_mlme.tid_rx[i].dialog_token); sta->ampdu_mlme.tid_state_rx[i]?
sta->ampdu_mlme.tid_rx[i]->dialog_token : 0);
p += scnprintf(p, sizeof(buf)+buf-p, "\n TX :"); p += scnprintf(p, sizeof(buf)+buf-p, "\n TX :");
for (i = 0; i < STA_TID_NUM; i++) for (i = 0; i < STA_TID_NUM; i++)
p += scnprintf(p, sizeof(buf)+buf-p, "%5d", p += scnprintf(p, sizeof(buf)+buf-p, "%5d",
sta->ampdu_mlme.tid_tx[i].state); sta->ampdu_mlme.tid_state_tx[i]);
p += scnprintf(p, sizeof(buf)+buf-p, "\n DTKN:"); p += scnprintf(p, sizeof(buf)+buf-p, "\n DTKN:");
for (i = 0; i < STA_TID_NUM; i++) for (i = 0; i < STA_TID_NUM; i++)
p += scnprintf(p, sizeof(buf)+buf-p, "%5d", p += scnprintf(p, sizeof(buf)+buf-p, "%5d",
sta->ampdu_mlme.tid_tx[i].dialog_token); sta->ampdu_mlme.tid_state_tx[i]?
sta->ampdu_mlme.tid_tx[i]->dialog_token : 0);
p += scnprintf(p, sizeof(buf)+buf-p, "\n SSN :"); p += scnprintf(p, sizeof(buf)+buf-p, "\n SSN :");
for (i = 0; i < STA_TID_NUM; i++) for (i = 0; i < STA_TID_NUM; i++)
p += scnprintf(p, sizeof(buf)+buf-p, "%5d", p += scnprintf(p, sizeof(buf)+buf-p, "%5d",
sta->ampdu_mlme.tid_tx[i].ssn); sta->ampdu_mlme.tid_state_tx[i]?
sta->ampdu_mlme.tid_tx[i]->ssn : 0);
p += scnprintf(p, sizeof(buf)+buf-p, "\n"); p += scnprintf(p, sizeof(buf)+buf-p, "\n");
...@@ -230,11 +233,13 @@ static ssize_t sta_agg_status_write(struct file *file, ...@@ -230,11 +233,13 @@ static ssize_t sta_agg_status_write(struct file *file,
strcpy(state, "off "); strcpy(state, "off ");
ieee80211_sta_stop_rx_ba_session(dev, da, tid_num, 0, ieee80211_sta_stop_rx_ba_session(dev, da, tid_num, 0,
WLAN_REASON_QSTA_REQUIRE_SETUP); WLAN_REASON_QSTA_REQUIRE_SETUP);
sta->ampdu_mlme.tid_rx[tid_num].buf_size = 0xFF; sta->ampdu_mlme.tid_state_rx[tid_num] |=
HT_AGG_STATE_DEBUGFS_CTL;
tid_static_rx[tid_num] = 0; tid_static_rx[tid_num] = 0;
} else { } else {
strcpy(state, "on "); strcpy(state, "on ");
sta->ampdu_mlme.tid_rx[tid_num].buf_size = 0x00; sta->ampdu_mlme.tid_state_rx[tid_num] &=
~HT_AGG_STATE_DEBUGFS_CTL;
tid_static_rx[tid_num] = 1; tid_static_rx[tid_num] = 1;
} }
printk(KERN_DEBUG "debugfs - try switching tid %u %s\n", printk(KERN_DEBUG "debugfs - try switching tid %u %s\n",
......
...@@ -569,12 +569,12 @@ int ieee80211_start_tx_ba_session(struct ieee80211_hw *hw, u8 *ra, u16 tid) ...@@ -569,12 +569,12 @@ int ieee80211_start_tx_ba_session(struct ieee80211_hw *hw, u8 *ra, u16 tid)
spin_lock_bh(&sta->ampdu_mlme.ampdu_tx); spin_lock_bh(&sta->ampdu_mlme.ampdu_tx);
/* we have tried too many times, receiver does not want A-MPDU */ /* we have tried too many times, receiver does not want A-MPDU */
if (sta->ampdu_mlme.tid_tx[tid].addba_req_num > HT_AGG_MAX_RETRIES) { if (sta->ampdu_mlme.addba_req_num[tid] > HT_AGG_MAX_RETRIES) {
ret = -EBUSY; ret = -EBUSY;
goto start_ba_exit; goto start_ba_exit;
} }
state = &sta->ampdu_mlme.tid_tx[tid].state; state = &sta->ampdu_mlme.tid_state_tx[tid];
/* check if the TID is not in aggregation flow already */ /* check if the TID is not in aggregation flow already */
if (*state != HT_AGG_STATE_IDLE) { if (*state != HT_AGG_STATE_IDLE) {
#ifdef CONFIG_MAC80211_HT_DEBUG #ifdef CONFIG_MAC80211_HT_DEBUG
...@@ -585,6 +585,23 @@ int ieee80211_start_tx_ba_session(struct ieee80211_hw *hw, u8 *ra, u16 tid) ...@@ -585,6 +585,23 @@ int ieee80211_start_tx_ba_session(struct ieee80211_hw *hw, u8 *ra, u16 tid)
goto start_ba_exit; goto start_ba_exit;
} }
/* prepare A-MPDU MLME for Tx aggregation */
sta->ampdu_mlme.tid_tx[tid] =
kmalloc(sizeof(struct tid_ampdu_tx), GFP_ATOMIC);
if (!sta->ampdu_mlme.tid_tx[tid]) {
if (net_ratelimit())
printk(KERN_ERR "allocate tx mlme to tid %d failed\n",
tid);
ret = -ENOMEM;
goto start_ba_exit;
}
/* Tx timer */
sta->ampdu_mlme.tid_tx[tid]->addba_resp_timer.function =
sta_addba_resp_timer_expired;
sta->ampdu_mlme.tid_tx[tid]->addba_resp_timer.data =
(unsigned long)&sta->timer_to_tid[tid];
init_timer(&sta->ampdu_mlme.tid_tx[tid]->addba_resp_timer);
/* ensure that TX flow won't interrupt us /* ensure that TX flow won't interrupt us
* until the end of the call to requeue function */ * until the end of the call to requeue function */
spin_lock_bh(&local->mdev->queue_lock); spin_lock_bh(&local->mdev->queue_lock);
...@@ -596,11 +613,10 @@ int ieee80211_start_tx_ba_session(struct ieee80211_hw *hw, u8 *ra, u16 tid) ...@@ -596,11 +613,10 @@ int ieee80211_start_tx_ba_session(struct ieee80211_hw *hw, u8 *ra, u16 tid)
* don't switch to aggregation */ * don't switch to aggregation */
if (ret) { if (ret) {
#ifdef CONFIG_MAC80211_HT_DEBUG #ifdef CONFIG_MAC80211_HT_DEBUG
printk(KERN_DEBUG "BA request denied - no queue available for" printk(KERN_DEBUG "BA request denied - queue unavailable for"
" tid %d\n", tid); " tid %d\n", tid);
#endif /* CONFIG_MAC80211_HT_DEBUG */ #endif /* CONFIG_MAC80211_HT_DEBUG */
spin_unlock_bh(&local->mdev->queue_lock); goto start_ba_err;
goto start_ba_exit;
} }
sdata = sta->sdata; sdata = sta->sdata;
...@@ -618,38 +634,40 @@ int ieee80211_start_tx_ba_session(struct ieee80211_hw *hw, u8 *ra, u16 tid) ...@@ -618,38 +634,40 @@ int ieee80211_start_tx_ba_session(struct ieee80211_hw *hw, u8 *ra, u16 tid)
* allocated queue */ * allocated queue */
ieee80211_ht_agg_queue_remove(local, sta, tid, 0); ieee80211_ht_agg_queue_remove(local, sta, tid, 0);
#ifdef CONFIG_MAC80211_HT_DEBUG #ifdef CONFIG_MAC80211_HT_DEBUG
printk(KERN_DEBUG "BA request denied - HW or queue unavailable" printk(KERN_DEBUG "BA request denied - HW unavailable for"
" for tid %d\n", tid); " tid %d\n", tid);
#endif /* CONFIG_MAC80211_HT_DEBUG */ #endif /* CONFIG_MAC80211_HT_DEBUG */
spin_unlock_bh(&local->mdev->queue_lock);
*state = HT_AGG_STATE_IDLE; *state = HT_AGG_STATE_IDLE;
goto start_ba_exit; goto start_ba_err;
} }
/* Will put all the packets in the new SW queue */ /* Will put all the packets in the new SW queue */
ieee80211_requeue(local, ieee802_1d_to_ac[tid]); ieee80211_requeue(local, ieee802_1d_to_ac[tid]);
spin_unlock_bh(&local->mdev->queue_lock); spin_unlock_bh(&local->mdev->queue_lock);
/* We have most probably almost emptied the legacy queue */
/* ieee80211_wake_queue(local_to_hw(local), ieee802_1d_to_ac[tid]); */
/* send an addBA request */ /* send an addBA request */
sta->ampdu_mlme.dialog_token_allocator++; sta->ampdu_mlme.dialog_token_allocator++;
sta->ampdu_mlme.tid_tx[tid].dialog_token = sta->ampdu_mlme.tid_tx[tid]->dialog_token =
sta->ampdu_mlme.dialog_token_allocator; sta->ampdu_mlme.dialog_token_allocator;
sta->ampdu_mlme.tid_tx[tid].ssn = start_seq_num; sta->ampdu_mlme.tid_tx[tid]->ssn = start_seq_num;
ieee80211_send_addba_request(sta->sdata->dev, ra, tid, ieee80211_send_addba_request(sta->sdata->dev, ra, tid,
sta->ampdu_mlme.tid_tx[tid].dialog_token, sta->ampdu_mlme.tid_tx[tid]->dialog_token,
sta->ampdu_mlme.tid_tx[tid].ssn, sta->ampdu_mlme.tid_tx[tid]->ssn,
0x40, 5000); 0x40, 5000);
/* activate the timer for the recipient's addBA response */ /* activate the timer for the recipient's addBA response */
sta->ampdu_mlme.tid_tx[tid].addba_resp_timer.expires = sta->ampdu_mlme.tid_tx[tid]->addba_resp_timer.expires =
jiffies + ADDBA_RESP_INTERVAL; jiffies + ADDBA_RESP_INTERVAL;
add_timer(&sta->ampdu_mlme.tid_tx[tid].addba_resp_timer); add_timer(&sta->ampdu_mlme.tid_tx[tid]->addba_resp_timer);
printk(KERN_DEBUG "activated addBA response timer on tid %d\n", tid); printk(KERN_DEBUG "activated addBA response timer on tid %d\n", tid);
goto start_ba_exit;
start_ba_err:
kfree(sta->ampdu_mlme.tid_tx[tid]);
sta->ampdu_mlme.tid_tx[tid] = NULL;
spin_unlock_bh(&local->mdev->queue_lock);
ret = -EBUSY;
start_ba_exit: start_ba_exit:
spin_unlock_bh(&sta->ampdu_mlme.ampdu_tx); spin_unlock_bh(&sta->ampdu_mlme.ampdu_tx);
rcu_read_unlock(); rcu_read_unlock();
...@@ -683,7 +701,7 @@ int ieee80211_stop_tx_ba_session(struct ieee80211_hw *hw, ...@@ -683,7 +701,7 @@ int ieee80211_stop_tx_ba_session(struct ieee80211_hw *hw,
} }
/* check if the TID is in aggregation */ /* check if the TID is in aggregation */
state = &sta->ampdu_mlme.tid_tx[tid].state; state = &sta->ampdu_mlme.tid_state_tx[tid];
spin_lock_bh(&sta->ampdu_mlme.ampdu_tx); spin_lock_bh(&sta->ampdu_mlme.ampdu_tx);
if (*state != HT_AGG_STATE_OPERATIONAL) { if (*state != HT_AGG_STATE_OPERATIONAL) {
...@@ -741,7 +759,7 @@ void ieee80211_start_tx_ba_cb(struct ieee80211_hw *hw, u8 *ra, u16 tid) ...@@ -741,7 +759,7 @@ void ieee80211_start_tx_ba_cb(struct ieee80211_hw *hw, u8 *ra, u16 tid)
return; return;
} }
state = &sta->ampdu_mlme.tid_tx[tid].state; state = &sta->ampdu_mlme.tid_state_tx[tid];
spin_lock_bh(&sta->ampdu_mlme.ampdu_tx); spin_lock_bh(&sta->ampdu_mlme.ampdu_tx);
if (!(*state & HT_ADDBA_REQUESTED_MSK)) { if (!(*state & HT_ADDBA_REQUESTED_MSK)) {
...@@ -790,7 +808,7 @@ void ieee80211_stop_tx_ba_cb(struct ieee80211_hw *hw, u8 *ra, u8 tid) ...@@ -790,7 +808,7 @@ void ieee80211_stop_tx_ba_cb(struct ieee80211_hw *hw, u8 *ra, u8 tid)
rcu_read_unlock(); rcu_read_unlock();
return; return;
} }
state = &sta->ampdu_mlme.tid_tx[tid].state; state = &sta->ampdu_mlme.tid_state_tx[tid];
spin_lock_bh(&sta->ampdu_mlme.ampdu_tx); spin_lock_bh(&sta->ampdu_mlme.ampdu_tx);
if ((*state & HT_AGG_STATE_REQ_STOP_BA_MSK) == 0) { if ((*state & HT_AGG_STATE_REQ_STOP_BA_MSK) == 0) {
...@@ -819,7 +837,9 @@ void ieee80211_stop_tx_ba_cb(struct ieee80211_hw *hw, u8 *ra, u8 tid) ...@@ -819,7 +837,9 @@ void ieee80211_stop_tx_ba_cb(struct ieee80211_hw *hw, u8 *ra, u8 tid)
* necessarily stopped */ * necessarily stopped */
netif_schedule(local->mdev); netif_schedule(local->mdev);
*state = HT_AGG_STATE_IDLE; *state = HT_AGG_STATE_IDLE;
sta->ampdu_mlme.tid_tx[tid].addba_req_num = 0; sta->ampdu_mlme.addba_req_num[tid] = 0;
kfree(sta->ampdu_mlme.tid_tx[tid]);
sta->ampdu_mlme.tid_tx[tid] = NULL;
spin_unlock_bh(&sta->ampdu_mlme.ampdu_tx); spin_unlock_bh(&sta->ampdu_mlme.ampdu_tx);
rcu_read_unlock(); rcu_read_unlock();
......
...@@ -73,11 +73,12 @@ struct ieee80211_fragment_entry { ...@@ -73,11 +73,12 @@ struct ieee80211_fragment_entry {
struct ieee80211_sta_bss { struct ieee80211_sta_bss {
struct list_head list; struct list_head list;
struct ieee80211_sta_bss *hnext; struct ieee80211_sta_bss *hnext;
size_t ssid_len;
atomic_t users; atomic_t users;
u8 bssid[ETH_ALEN]; u8 bssid[ETH_ALEN];
u8 ssid[IEEE80211_MAX_SSID_LEN]; u8 ssid[IEEE80211_MAX_SSID_LEN];
size_t ssid_len;
u16 capability; /* host byte order */ u16 capability; /* host byte order */
enum ieee80211_band band; enum ieee80211_band band;
int freq; int freq;
...@@ -98,8 +99,8 @@ struct ieee80211_sta_bss { ...@@ -98,8 +99,8 @@ struct ieee80211_sta_bss {
#define IEEE80211_MAX_SUPP_RATES 32 #define IEEE80211_MAX_SUPP_RATES 32
u8 supp_rates[IEEE80211_MAX_SUPP_RATES]; u8 supp_rates[IEEE80211_MAX_SUPP_RATES];
size_t supp_rates_len; size_t supp_rates_len;
int beacon_int;
u64 timestamp; u64 timestamp;
int beacon_int;
int probe_resp; int probe_resp;
unsigned long last_update; unsigned long last_update;
...@@ -154,9 +155,7 @@ struct ieee80211_tx_data { ...@@ -154,9 +155,7 @@ struct ieee80211_tx_data {
struct ieee80211_local *local; struct ieee80211_local *local;
struct ieee80211_sub_if_data *sdata; struct ieee80211_sub_if_data *sdata;
struct sta_info *sta; struct sta_info *sta;
u16 fc, ethertype;
struct ieee80211_key *key; struct ieee80211_key *key;
unsigned int flags;
struct ieee80211_tx_control *control; struct ieee80211_tx_control *control;
struct ieee80211_channel *channel; struct ieee80211_channel *channel;
...@@ -168,8 +167,11 @@ struct ieee80211_tx_data { ...@@ -168,8 +167,11 @@ struct ieee80211_tx_data {
/* Extra fragments (in addition to the first fragment /* Extra fragments (in addition to the first fragment
* in skb) */ * in skb) */
int num_extra_frag;
struct sk_buff **extra_frag; struct sk_buff **extra_frag;
int num_extra_frag;
u16 fc, ethertype;
unsigned int flags;
}; };
...@@ -192,12 +194,12 @@ struct ieee80211_rx_data { ...@@ -192,12 +194,12 @@ struct ieee80211_rx_data {
struct ieee80211_local *local; struct ieee80211_local *local;
struct ieee80211_sub_if_data *sdata; struct ieee80211_sub_if_data *sdata;
struct sta_info *sta; struct sta_info *sta;
u16 fc, ethertype;
struct ieee80211_key *key; struct ieee80211_key *key;
unsigned int flags;
struct ieee80211_rx_status *status; struct ieee80211_rx_status *status;
struct ieee80211_rate *rate; struct ieee80211_rate *rate;
u16 fc, ethertype;
unsigned int flags;
int sent_ps_buffered; int sent_ps_buffered;
int queue; int queue;
int load; int load;
...@@ -222,9 +224,9 @@ struct ieee80211_tx_packet_data { ...@@ -222,9 +224,9 @@ struct ieee80211_tx_packet_data {
struct ieee80211_tx_stored_packet { struct ieee80211_tx_stored_packet {
struct ieee80211_tx_control control; struct ieee80211_tx_control control;
struct sk_buff *skb; struct sk_buff *skb;
int num_extra_frag;
struct sk_buff **extra_frag; struct sk_buff **extra_frag;
struct ieee80211_rate *last_frag_rate; struct ieee80211_rate *last_frag_rate;
int num_extra_frag;
unsigned int last_frag_rate_ctrl_probe; unsigned int last_frag_rate_ctrl_probe;
}; };
...@@ -246,8 +248,8 @@ struct ieee80211_if_ap { ...@@ -246,8 +248,8 @@ struct ieee80211_if_ap {
* bitmap_empty :) * bitmap_empty :)
* NB: don't touch this bitmap, use sta_info_{set,clear}_tim_bit */ * NB: don't touch this bitmap, use sta_info_{set,clear}_tim_bit */
u8 tim[sizeof(unsigned long) * BITS_TO_LONGS(IEEE80211_MAX_AID + 1)]; u8 tim[sizeof(unsigned long) * BITS_TO_LONGS(IEEE80211_MAX_AID + 1)];
atomic_t num_sta_ps; /* number of stations in PS mode */
struct sk_buff_head ps_bc_buf; struct sk_buff_head ps_bc_buf;
atomic_t num_sta_ps; /* number of stations in PS mode */
int dtim_count; int dtim_count;
int force_unicast_rateidx; /* forced TX rateidx for unicast frames */ int force_unicast_rateidx; /* forced TX rateidx for unicast frames */
int max_ratectrl_rateidx; /* max TX rateidx for rate control */ int max_ratectrl_rateidx; /* max TX rateidx for rate control */
...@@ -255,8 +257,8 @@ struct ieee80211_if_ap { ...@@ -255,8 +257,8 @@ struct ieee80211_if_ap {
}; };
struct ieee80211_if_wds { struct ieee80211_if_wds {
u8 remote_addr[ETH_ALEN];
struct sta_info *sta; struct sta_info *sta;
u8 remote_addr[ETH_ALEN];
}; };
struct ieee80211_if_vlan { struct ieee80211_if_vlan {
...@@ -290,12 +292,12 @@ struct mesh_config { ...@@ -290,12 +292,12 @@ struct mesh_config {
u8 dot11MeshTTL; u8 dot11MeshTTL;
bool auto_open_plinks; bool auto_open_plinks;
/* HWMP parameters */ /* HWMP parameters */
u32 dot11MeshHWMPactivePathTimeout;
u16 dot11MeshHWMPpreqMinInterval;
u16 dot11MeshHWMPnetDiameterTraversalTime;
u8 dot11MeshHWMPmaxPREQretries; u8 dot11MeshHWMPmaxPREQretries;
u32 path_refresh_time; u32 path_refresh_time;
u16 min_discovery_timeout; u16 min_discovery_timeout;
u32 dot11MeshHWMPactivePathTimeout;
u16 dot11MeshHWMPpreqMinInterval;
u16 dot11MeshHWMPnetDiameterTraversalTime;
}; };
...@@ -314,23 +316,22 @@ struct mesh_config { ...@@ -314,23 +316,22 @@ struct mesh_config {
#define IEEE80211_STA_AUTO_CHANNEL_SEL BIT(12) #define IEEE80211_STA_AUTO_CHANNEL_SEL BIT(12)
#define IEEE80211_STA_PRIVACY_INVOKED BIT(13) #define IEEE80211_STA_PRIVACY_INVOKED BIT(13)
struct ieee80211_if_sta { struct ieee80211_if_sta {
struct timer_list timer;
struct work_struct work;
u8 bssid[ETH_ALEN], prev_bssid[ETH_ALEN];
u8 ssid[IEEE80211_MAX_SSID_LEN];
enum { enum {
IEEE80211_DISABLED, IEEE80211_AUTHENTICATE, IEEE80211_DISABLED, IEEE80211_AUTHENTICATE,
IEEE80211_ASSOCIATE, IEEE80211_ASSOCIATED, IEEE80211_ASSOCIATE, IEEE80211_ASSOCIATED,
IEEE80211_IBSS_SEARCH, IEEE80211_IBSS_JOINED, IEEE80211_IBSS_SEARCH, IEEE80211_IBSS_JOINED,
IEEE80211_MESH_UP IEEE80211_MESH_UP
} state; } state;
struct timer_list timer;
struct work_struct work;
u8 bssid[ETH_ALEN], prev_bssid[ETH_ALEN];
u8 ssid[IEEE80211_MAX_SSID_LEN];
size_t ssid_len; size_t ssid_len;
u8 scan_ssid[IEEE80211_MAX_SSID_LEN]; u8 scan_ssid[IEEE80211_MAX_SSID_LEN];
size_t scan_ssid_len; size_t scan_ssid_len;
#ifdef CONFIG_MAC80211_MESH #ifdef CONFIG_MAC80211_MESH
struct timer_list mesh_path_timer; struct timer_list mesh_path_timer;
u8 mesh_id[IEEE80211_MAX_MESH_ID_LEN]; u8 mesh_id[IEEE80211_MAX_MESH_ID_LEN];
bool accepting_plinks;
size_t mesh_id_len; size_t mesh_id_len;
/* Active Path Selection Protocol Identifier */ /* Active Path Selection Protocol Identifier */
u8 mesh_pp_id[4]; u8 mesh_pp_id[4];
...@@ -354,6 +355,7 @@ struct ieee80211_if_sta { ...@@ -354,6 +355,7 @@ struct ieee80211_if_sta {
struct mesh_stats mshstats; struct mesh_stats mshstats;
struct mesh_config mshcfg; struct mesh_config mshcfg;
u8 mesh_seqnum[3]; u8 mesh_seqnum[3];
bool accepting_plinks;
#endif #endif
u16 aid; u16 aid;
u16 ap_capab, capab; u16 ap_capab, capab;
...@@ -364,16 +366,18 @@ struct ieee80211_if_sta { ...@@ -364,16 +366,18 @@ struct ieee80211_if_sta {
u8 *assocreq_ies, *assocresp_ies; u8 *assocreq_ies, *assocresp_ies;
size_t assocreq_ies_len, assocresp_ies_len; size_t assocreq_ies_len, assocresp_ies_len;
struct sk_buff_head skb_queue;
int auth_tries, assoc_tries; int auth_tries, assoc_tries;
unsigned long request;
unsigned long last_probe;
unsigned int flags; unsigned int flags;
#define IEEE80211_STA_REQ_SCAN 0 #define IEEE80211_STA_REQ_SCAN 0
#define IEEE80211_STA_REQ_AUTH 1 #define IEEE80211_STA_REQ_AUTH 1
#define IEEE80211_STA_REQ_RUN 2 #define IEEE80211_STA_REQ_RUN 2
unsigned long request;
struct sk_buff_head skb_queue;
unsigned long last_probe;
#define IEEE80211_AUTH_ALG_OPEN BIT(0) #define IEEE80211_AUTH_ALG_OPEN BIT(0)
#define IEEE80211_AUTH_ALG_SHARED_KEY BIT(1) #define IEEE80211_AUTH_ALG_SHARED_KEY BIT(1)
......
...@@ -55,9 +55,6 @@ static int ieee80211_set_encryption(struct net_device *dev, u8 *sta_addr, ...@@ -55,9 +55,6 @@ static int ieee80211_set_encryption(struct net_device *dev, u8 *sta_addr,
key = sta->key; key = sta->key;
} }
if (!key)
return -ENOENT;
ieee80211_key_free(key); ieee80211_key_free(key);
return 0; return 0;
} else { } else {
......
...@@ -1216,12 +1216,11 @@ static void ieee80211_sta_process_addba_request(struct net_device *dev, ...@@ -1216,12 +1216,11 @@ static void ieee80211_sta_process_addba_request(struct net_device *dev,
buf_size = buf_size << sband->ht_info.ampdu_factor; buf_size = buf_size << sband->ht_info.ampdu_factor;
} }
tid_agg_rx = &sta->ampdu_mlme.tid_rx[tid];
/* examine state machine */ /* examine state machine */
spin_lock_bh(&sta->ampdu_mlme.ampdu_rx); spin_lock_bh(&sta->ampdu_mlme.ampdu_rx);
if (tid_agg_rx->state != HT_AGG_STATE_IDLE) { if (sta->ampdu_mlme.tid_state_rx[tid] != HT_AGG_STATE_IDLE) {
#ifdef CONFIG_MAC80211_HT_DEBUG #ifdef CONFIG_MAC80211_HT_DEBUG
if (net_ratelimit()) if (net_ratelimit())
printk(KERN_DEBUG "unexpected AddBA Req from " printk(KERN_DEBUG "unexpected AddBA Req from "
...@@ -1231,6 +1230,24 @@ static void ieee80211_sta_process_addba_request(struct net_device *dev, ...@@ -1231,6 +1230,24 @@ static void ieee80211_sta_process_addba_request(struct net_device *dev,
goto end; goto end;
} }
/* prepare A-MPDU MLME for Rx aggregation */
sta->ampdu_mlme.tid_rx[tid] =
kmalloc(sizeof(struct tid_ampdu_rx), GFP_ATOMIC);
if (!sta->ampdu_mlme.tid_rx[tid]) {
if (net_ratelimit())
printk(KERN_ERR "allocate rx mlme to tid %d failed\n",
tid);
goto end;
}
/* rx timer */
sta->ampdu_mlme.tid_rx[tid]->session_timer.function =
sta_rx_agg_session_timer_expired;
sta->ampdu_mlme.tid_rx[tid]->session_timer.data =
(unsigned long)&sta->timer_to_tid[tid];
init_timer(&sta->ampdu_mlme.tid_rx[tid]->session_timer);
tid_agg_rx = sta->ampdu_mlme.tid_rx[tid];
/* prepare reordering buffer */ /* prepare reordering buffer */
tid_agg_rx->reorder_buf = tid_agg_rx->reorder_buf =
kmalloc(buf_size * sizeof(struct sk_buf *), GFP_ATOMIC); kmalloc(buf_size * sizeof(struct sk_buf *), GFP_ATOMIC);
...@@ -1238,6 +1255,7 @@ static void ieee80211_sta_process_addba_request(struct net_device *dev, ...@@ -1238,6 +1255,7 @@ static void ieee80211_sta_process_addba_request(struct net_device *dev,
if (net_ratelimit()) if (net_ratelimit())
printk(KERN_ERR "can not allocate reordering buffer " printk(KERN_ERR "can not allocate reordering buffer "
"to tid %d\n", tid); "to tid %d\n", tid);
kfree(sta->ampdu_mlme.tid_rx[tid]);
goto end; goto end;
} }
memset(tid_agg_rx->reorder_buf, 0, memset(tid_agg_rx->reorder_buf, 0,
...@@ -1252,11 +1270,13 @@ static void ieee80211_sta_process_addba_request(struct net_device *dev, ...@@ -1252,11 +1270,13 @@ static void ieee80211_sta_process_addba_request(struct net_device *dev,
if (ret) { if (ret) {
kfree(tid_agg_rx->reorder_buf); kfree(tid_agg_rx->reorder_buf);
kfree(tid_agg_rx);
sta->ampdu_mlme.tid_rx[tid] = NULL;
goto end; goto end;
} }
/* change state and send addba resp */ /* change state and send addba resp */
tid_agg_rx->state = HT_AGG_STATE_OPERATIONAL; sta->ampdu_mlme.tid_state_rx[tid] = HT_AGG_STATE_OPERATIONAL;
tid_agg_rx->dialog_token = dialog_token; tid_agg_rx->dialog_token = dialog_token;
tid_agg_rx->ssn = start_seq_num; tid_agg_rx->ssn = start_seq_num;
tid_agg_rx->head_seq_num = start_seq_num; tid_agg_rx->head_seq_num = start_seq_num;
...@@ -1295,39 +1315,37 @@ static void ieee80211_sta_process_addba_resp(struct net_device *dev, ...@@ -1295,39 +1315,37 @@ static void ieee80211_sta_process_addba_resp(struct net_device *dev,
capab = le16_to_cpu(mgmt->u.action.u.addba_resp.capab); capab = le16_to_cpu(mgmt->u.action.u.addba_resp.capab);
tid = (capab & IEEE80211_ADDBA_PARAM_TID_MASK) >> 2; tid = (capab & IEEE80211_ADDBA_PARAM_TID_MASK) >> 2;
state = &sta->ampdu_mlme.tid_tx[tid].state; state = &sta->ampdu_mlme.tid_state_tx[tid];
spin_lock_bh(&sta->ampdu_mlme.ampdu_tx); spin_lock_bh(&sta->ampdu_mlme.ampdu_tx);
if (!(*state & HT_ADDBA_REQUESTED_MSK)) {
spin_unlock_bh(&sta->ampdu_mlme.ampdu_tx);
printk(KERN_DEBUG "state not HT_ADDBA_REQUESTED_MSK:"
"%d\n", *state);
goto addba_resp_exit;
}
if (mgmt->u.action.u.addba_resp.dialog_token != if (mgmt->u.action.u.addba_resp.dialog_token !=
sta->ampdu_mlme.tid_tx[tid].dialog_token) { sta->ampdu_mlme.tid_tx[tid]->dialog_token) {
spin_unlock_bh(&sta->ampdu_mlme.ampdu_tx); spin_unlock_bh(&sta->ampdu_mlme.ampdu_tx);
#ifdef CONFIG_MAC80211_HT_DEBUG #ifdef CONFIG_MAC80211_HT_DEBUG
printk(KERN_DEBUG "wrong addBA response token, tid %d\n", tid); printk(KERN_DEBUG "wrong addBA response token, tid %d\n", tid);
#endif /* CONFIG_MAC80211_HT_DEBUG */ #endif /* CONFIG_MAC80211_HT_DEBUG */
rcu_read_unlock(); goto addba_resp_exit;
return;
} }
del_timer_sync(&sta->ampdu_mlme.tid_tx[tid].addba_resp_timer); del_timer_sync(&sta->ampdu_mlme.tid_tx[tid]->addba_resp_timer);
#ifdef CONFIG_MAC80211_HT_DEBUG #ifdef CONFIG_MAC80211_HT_DEBUG
printk(KERN_DEBUG "switched off addBA timer for tid %d \n", tid); printk(KERN_DEBUG "switched off addBA timer for tid %d \n", tid);
#endif /* CONFIG_MAC80211_HT_DEBUG */ #endif /* CONFIG_MAC80211_HT_DEBUG */
if (le16_to_cpu(mgmt->u.action.u.addba_resp.status) if (le16_to_cpu(mgmt->u.action.u.addba_resp.status)
== WLAN_STATUS_SUCCESS) { == WLAN_STATUS_SUCCESS) {
if (!(*state & HT_ADDBA_REQUESTED_MSK)) {
spin_unlock_bh(&sta->ampdu_mlme.ampdu_tx);
printk(KERN_DEBUG "state not HT_ADDBA_REQUESTED_MSK:"
"%d\n", *state);
rcu_read_unlock();
return;
}
if (*state & HT_ADDBA_RECEIVED_MSK) if (*state & HT_ADDBA_RECEIVED_MSK)
printk(KERN_DEBUG "double addBA response\n"); printk(KERN_DEBUG "double addBA response\n");
*state |= HT_ADDBA_RECEIVED_MSK; *state |= HT_ADDBA_RECEIVED_MSK;
sta->ampdu_mlme.tid_tx[tid].addba_req_num = 0; sta->ampdu_mlme.addba_req_num[tid] = 0;
if (*state == HT_AGG_STATE_OPERATIONAL) { if (*state == HT_AGG_STATE_OPERATIONAL) {
printk(KERN_DEBUG "Aggregation on for tid %d \n", tid); printk(KERN_DEBUG "Aggregation on for tid %d \n", tid);
...@@ -1339,13 +1357,15 @@ static void ieee80211_sta_process_addba_resp(struct net_device *dev, ...@@ -1339,13 +1357,15 @@ static void ieee80211_sta_process_addba_resp(struct net_device *dev,
} else { } else {
printk(KERN_DEBUG "recipient rejected agg: tid %d \n", tid); printk(KERN_DEBUG "recipient rejected agg: tid %d \n", tid);
sta->ampdu_mlme.tid_tx[tid].addba_req_num++; sta->ampdu_mlme.addba_req_num[tid]++;
/* this will allow the state check in stop_BA_session */ /* this will allow the state check in stop_BA_session */
*state = HT_AGG_STATE_OPERATIONAL; *state = HT_AGG_STATE_OPERATIONAL;
spin_unlock_bh(&sta->ampdu_mlme.ampdu_tx); spin_unlock_bh(&sta->ampdu_mlme.ampdu_tx);
ieee80211_stop_tx_ba_session(hw, sta->addr, tid, ieee80211_stop_tx_ba_session(hw, sta->addr, tid,
WLAN_BACK_INITIATOR); WLAN_BACK_INITIATOR);
} }
addba_resp_exit:
rcu_read_unlock(); rcu_read_unlock();
} }
...@@ -1411,13 +1431,13 @@ void ieee80211_sta_stop_rx_ba_session(struct net_device *dev, u8 *ra, u16 tid, ...@@ -1411,13 +1431,13 @@ void ieee80211_sta_stop_rx_ba_session(struct net_device *dev, u8 *ra, u16 tid,
/* check if TID is in operational state */ /* check if TID is in operational state */
spin_lock_bh(&sta->ampdu_mlme.ampdu_rx); spin_lock_bh(&sta->ampdu_mlme.ampdu_rx);
if (sta->ampdu_mlme.tid_rx[tid].state if (sta->ampdu_mlme.tid_state_rx[tid]
!= HT_AGG_STATE_OPERATIONAL) { != HT_AGG_STATE_OPERATIONAL) {
spin_unlock_bh(&sta->ampdu_mlme.ampdu_rx); spin_unlock_bh(&sta->ampdu_mlme.ampdu_rx);
rcu_read_unlock(); rcu_read_unlock();
return; return;
} }
sta->ampdu_mlme.tid_rx[tid].state = sta->ampdu_mlme.tid_state_rx[tid] =
HT_AGG_STATE_REQ_STOP_BA_MSK | HT_AGG_STATE_REQ_STOP_BA_MSK |
(initiator << HT_AGG_STATE_INITIATOR_SHIFT); (initiator << HT_AGG_STATE_INITIATOR_SHIFT);
spin_unlock_bh(&sta->ampdu_mlme.ampdu_rx); spin_unlock_bh(&sta->ampdu_mlme.ampdu_rx);
...@@ -1434,25 +1454,27 @@ void ieee80211_sta_stop_rx_ba_session(struct net_device *dev, u8 *ra, u16 tid, ...@@ -1434,25 +1454,27 @@ void ieee80211_sta_stop_rx_ba_session(struct net_device *dev, u8 *ra, u16 tid,
/* shutdown timer has not expired */ /* shutdown timer has not expired */
if (initiator != WLAN_BACK_TIMER) if (initiator != WLAN_BACK_TIMER)
del_timer_sync(&sta->ampdu_mlme.tid_rx[tid]. del_timer_sync(&sta->ampdu_mlme.tid_rx[tid]->session_timer);
session_timer);
/* check if this is a self generated aggregation halt */ /* check if this is a self generated aggregation halt */
if (initiator == WLAN_BACK_RECIPIENT || initiator == WLAN_BACK_TIMER) if (initiator == WLAN_BACK_RECIPIENT || initiator == WLAN_BACK_TIMER)
ieee80211_send_delba(dev, ra, tid, 0, reason); ieee80211_send_delba(dev, ra, tid, 0, reason);
/* free the reordering buffer */ /* free the reordering buffer */
for (i = 0; i < sta->ampdu_mlme.tid_rx[tid].buf_size; i++) { for (i = 0; i < sta->ampdu_mlme.tid_rx[tid]->buf_size; i++) {
if (sta->ampdu_mlme.tid_rx[tid].reorder_buf[i]) { if (sta->ampdu_mlme.tid_rx[tid]->reorder_buf[i]) {
/* release the reordered frames */ /* release the reordered frames */
dev_kfree_skb(sta->ampdu_mlme.tid_rx[tid].reorder_buf[i]); dev_kfree_skb(sta->ampdu_mlme.tid_rx[tid]->reorder_buf[i]);
sta->ampdu_mlme.tid_rx[tid].stored_mpdu_num--; sta->ampdu_mlme.tid_rx[tid]->stored_mpdu_num--;
sta->ampdu_mlme.tid_rx[tid].reorder_buf[i] = NULL; sta->ampdu_mlme.tid_rx[tid]->reorder_buf[i] = NULL;
} }
} }
kfree(sta->ampdu_mlme.tid_rx[tid].reorder_buf); /* free resources */
kfree(sta->ampdu_mlme.tid_rx[tid]->reorder_buf);
kfree(sta->ampdu_mlme.tid_rx[tid]);
sta->ampdu_mlme.tid_rx[tid] = NULL;
sta->ampdu_mlme.tid_state_rx[tid] = HT_AGG_STATE_IDLE;
sta->ampdu_mlme.tid_rx[tid].state = HT_AGG_STATE_IDLE;
rcu_read_unlock(); rcu_read_unlock();
} }
...@@ -1491,7 +1513,7 @@ static void ieee80211_sta_process_delba(struct net_device *dev, ...@@ -1491,7 +1513,7 @@ static void ieee80211_sta_process_delba(struct net_device *dev,
WLAN_BACK_INITIATOR, 0); WLAN_BACK_INITIATOR, 0);
else { /* WLAN_BACK_RECIPIENT */ else { /* WLAN_BACK_RECIPIENT */
spin_lock_bh(&sta->ampdu_mlme.ampdu_tx); spin_lock_bh(&sta->ampdu_mlme.ampdu_tx);
sta->ampdu_mlme.tid_tx[tid].state = sta->ampdu_mlme.tid_state_tx[tid] =
HT_AGG_STATE_OPERATIONAL; HT_AGG_STATE_OPERATIONAL;
spin_unlock_bh(&sta->ampdu_mlme.ampdu_tx); spin_unlock_bh(&sta->ampdu_mlme.ampdu_tx);
ieee80211_stop_tx_ba_session(&local->hw, sta->addr, tid, ieee80211_stop_tx_ba_session(&local->hw, sta->addr, tid,
...@@ -1528,7 +1550,7 @@ void sta_addba_resp_timer_expired(unsigned long data) ...@@ -1528,7 +1550,7 @@ void sta_addba_resp_timer_expired(unsigned long data)
return; return;
} }
state = &sta->ampdu_mlme.tid_tx[tid].state; state = &sta->ampdu_mlme.tid_state_tx[tid];
/* check if the TID waits for addBA response */ /* check if the TID waits for addBA response */
spin_lock_bh(&sta->ampdu_mlme.ampdu_tx); spin_lock_bh(&sta->ampdu_mlme.ampdu_tx);
if (!(*state & HT_ADDBA_REQUESTED_MSK)) { if (!(*state & HT_ADDBA_REQUESTED_MSK)) {
......
...@@ -1514,9 +1514,10 @@ ieee80211_rx_h_ctrl(struct ieee80211_rx_data *rx) ...@@ -1514,9 +1514,10 @@ ieee80211_rx_h_ctrl(struct ieee80211_rx_data *rx)
if (!rx->sta) if (!rx->sta)
return RX_CONTINUE; return RX_CONTINUE;
tid = le16_to_cpu(bar->control) >> 12; tid = le16_to_cpu(bar->control) >> 12;
tid_agg_rx = &(rx->sta->ampdu_mlme.tid_rx[tid]); if (rx->sta->ampdu_mlme.tid_state_rx[tid]
if (tid_agg_rx->state != HT_AGG_STATE_OPERATIONAL) != HT_AGG_STATE_OPERATIONAL)
return RX_CONTINUE; return RX_CONTINUE;
tid_agg_rx = rx->sta->ampdu_mlme.tid_rx[tid];
start_seq_num = le16_to_cpu(bar->start_seq_num) >> 4; start_seq_num = le16_to_cpu(bar->start_seq_num) >> 4;
...@@ -2123,11 +2124,12 @@ static u8 ieee80211_rx_reorder_ampdu(struct ieee80211_local *local, ...@@ -2123,11 +2124,12 @@ static u8 ieee80211_rx_reorder_ampdu(struct ieee80211_local *local,
qc = skb->data + ieee80211_get_hdrlen(fc) - QOS_CONTROL_LEN; qc = skb->data + ieee80211_get_hdrlen(fc) - QOS_CONTROL_LEN;
tid = qc[0] & QOS_CONTROL_TID_MASK; tid = qc[0] & QOS_CONTROL_TID_MASK;
tid_agg_rx = &(sta->ampdu_mlme.tid_rx[tid]);
if (tid_agg_rx->state != HT_AGG_STATE_OPERATIONAL) if (sta->ampdu_mlme.tid_state_rx[tid] != HT_AGG_STATE_OPERATIONAL)
goto end_reorder; goto end_reorder;
tid_agg_rx = sta->ampdu_mlme.tid_rx[tid];
/* null data frames are excluded */ /* null data frames are excluded */
if (unlikely(fc & IEEE80211_STYPE_NULLFUNC)) if (unlikely(fc & IEEE80211_STYPE_NULLFUNC))
goto end_reorder; goto end_reorder;
......
...@@ -170,9 +170,16 @@ void sta_info_destroy(struct sta_info *sta) ...@@ -170,9 +170,16 @@ void sta_info_destroy(struct sta_info *sta)
dev_kfree_skb_any(skb); dev_kfree_skb_any(skb);
for (i = 0; i < STA_TID_NUM; i++) { for (i = 0; i < STA_TID_NUM; i++) {
del_timer_sync(&sta->ampdu_mlme.tid_rx[i].session_timer); spin_lock_bh(&sta->ampdu_mlme.ampdu_rx);
del_timer_sync(&sta->ampdu_mlme.tid_tx[i].addba_resp_timer); if (sta->ampdu_mlme.tid_rx[i])
del_timer_sync(&sta->ampdu_mlme.tid_rx[i]->session_timer);
spin_unlock_bh(&sta->ampdu_mlme.ampdu_rx);
spin_lock_bh(&sta->ampdu_mlme.ampdu_tx);
if (sta->ampdu_mlme.tid_tx[i])
del_timer_sync(&sta->ampdu_mlme.tid_tx[i]->addba_resp_timer);
spin_unlock_bh(&sta->ampdu_mlme.ampdu_tx);
} }
rate_control_free_sta(sta->rate_ctrl, sta->rate_ctrl_priv); rate_control_free_sta(sta->rate_ctrl, sta->rate_ctrl_priv);
rate_control_put(sta->rate_ctrl); rate_control_put(sta->rate_ctrl);
...@@ -227,18 +234,13 @@ struct sta_info *sta_info_alloc(struct ieee80211_sub_if_data *sdata, ...@@ -227,18 +234,13 @@ struct sta_info *sta_info_alloc(struct ieee80211_sub_if_data *sdata,
sta->timer_to_tid[i] = i; sta->timer_to_tid[i] = i;
/* tid to tx queue: initialize according to HW (0 is valid) */ /* tid to tx queue: initialize according to HW (0 is valid) */
sta->tid_to_tx_q[i] = local->hw.queues; sta->tid_to_tx_q[i] = local->hw.queues;
/* rx timers */ /* rx */
sta->ampdu_mlme.tid_rx[i].session_timer.function = sta->ampdu_mlme.tid_state_rx[i] = HT_AGG_STATE_IDLE;
sta_rx_agg_session_timer_expired; sta->ampdu_mlme.tid_rx[i] = NULL;
sta->ampdu_mlme.tid_rx[i].session_timer.data = /* tx */
(unsigned long)&sta->timer_to_tid[i]; sta->ampdu_mlme.tid_state_tx[i] = HT_AGG_STATE_IDLE;
init_timer(&sta->ampdu_mlme.tid_rx[i].session_timer); sta->ampdu_mlme.tid_tx[i] = NULL;
/* tx timers */ sta->ampdu_mlme.addba_req_num[i] = 0;
sta->ampdu_mlme.tid_tx[i].addba_resp_timer.function =
sta_addba_resp_timer_expired;
sta->ampdu_mlme.tid_tx[i].addba_resp_timer.data =
(unsigned long)&sta->timer_to_tid[i];
init_timer(&sta->ampdu_mlme.tid_tx[i].addba_resp_timer);
} }
skb_queue_head_init(&sta->ps_tx_buf); skb_queue_head_init(&sta->ps_tx_buf);
skb_queue_head_init(&sta->tx_filtered); skb_queue_head_init(&sta->tx_filtered);
......
...@@ -63,47 +63,42 @@ enum ieee80211_sta_info_flags { ...@@ -63,47 +63,42 @@ enum ieee80211_sta_info_flags {
#define HT_AGG_STATE_OPERATIONAL (HT_ADDBA_REQUESTED_MSK | \ #define HT_AGG_STATE_OPERATIONAL (HT_ADDBA_REQUESTED_MSK | \
HT_ADDBA_DRV_READY_MSK | \ HT_ADDBA_DRV_READY_MSK | \
HT_ADDBA_RECEIVED_MSK) HT_ADDBA_RECEIVED_MSK)
#define HT_AGG_STATE_DEBUGFS_CTL BIT(7)
/** /**
* struct tid_ampdu_tx - TID aggregation information (Tx). * struct tid_ampdu_tx - TID aggregation information (Tx).
* *
* @state: TID's state in session state machine.
* @dialog_token: dialog token for aggregation session
* @ssn: Starting Sequence Number expected to be aggregated.
* @addba_resp_timer: timer for peer's response to addba request * @addba_resp_timer: timer for peer's response to addba request
* @addba_req_num: number of times addBA request has been sent. * @ssn: Starting Sequence Number expected to be aggregated.
* @dialog_token: dialog token for aggregation session
*/ */
struct tid_ampdu_tx { struct tid_ampdu_tx {
u8 state;
u8 dialog_token;
u16 ssn;
struct timer_list addba_resp_timer; struct timer_list addba_resp_timer;
u8 addba_req_num; u16 ssn;
u8 dialog_token;
}; };
/** /**
* struct tid_ampdu_rx - TID aggregation information (Rx). * struct tid_ampdu_rx - TID aggregation information (Rx).
* *
* @state: TID's state in session state machine. * @reorder_buf: buffer to reorder incoming aggregated MPDUs
* @dialog_token: dialog token for aggregation session * @session_timer: check if peer keeps Tx-ing on the TID (by timeout value)
* @head_seq_num: head sequence number in reordering buffer.
* @stored_mpdu_num: number of MPDUs in reordering buffer
* @ssn: Starting Sequence Number expected to be aggregated. * @ssn: Starting Sequence Number expected to be aggregated.
* @buf_size: buffer size for incoming A-MPDUs * @buf_size: buffer size for incoming A-MPDUs
* @timeout: reset timer value. * @timeout: reset timer value.
* @head_seq_num: head sequence number in reordering buffer. * @dialog_token: dialog token for aggregation session
* @stored_mpdu_num: number of MPDUs in reordering buffer
* @reorder_buf: buffer to reorder incoming aggregated MPDUs
* @session_timer: check if peer keeps Tx-ing on the TID (by timeout value)
*/ */
struct tid_ampdu_rx { struct tid_ampdu_rx {
u8 state; struct sk_buff **reorder_buf;
u8 dialog_token; struct timer_list session_timer;
u16 head_seq_num;
u16 stored_mpdu_num;
u16 ssn; u16 ssn;
u16 buf_size; u16 buf_size;
u16 timeout; u16 timeout;
u16 head_seq_num; u8 dialog_token;
u16 stored_mpdu_num;
struct sk_buff **reorder_buf;
struct timer_list session_timer;
}; };
/** /**
...@@ -132,16 +127,24 @@ enum plink_state { ...@@ -132,16 +127,24 @@ enum plink_state {
/** /**
* struct sta_ampdu_mlme - STA aggregation information. * struct sta_ampdu_mlme - STA aggregation information.
* *
* @tid_state_rx: TID's state in Rx session state machine.
* @tid_rx: aggregation info for Rx per TID * @tid_rx: aggregation info for Rx per TID
* @tid_tx: aggregation info for Tx per TID
* @ampdu_rx: for locking sections in aggregation Rx flow * @ampdu_rx: for locking sections in aggregation Rx flow
* @tid_state_tx: TID's state in Tx session state machine.
* @tid_tx: aggregation info for Tx per TID
* @addba_req_num: number of times addBA request has been sent.
* @ampdu_tx: for locking sectionsi in aggregation Tx flow * @ampdu_tx: for locking sectionsi in aggregation Tx flow
* @dialog_token_allocator: dialog token enumerator for each new session; * @dialog_token_allocator: dialog token enumerator for each new session;
*/ */
struct sta_ampdu_mlme { struct sta_ampdu_mlme {
struct tid_ampdu_rx tid_rx[STA_TID_NUM]; /* rx */
struct tid_ampdu_tx tid_tx[STA_TID_NUM]; u8 tid_state_rx[STA_TID_NUM];
struct tid_ampdu_rx *tid_rx[STA_TID_NUM];
spinlock_t ampdu_rx; spinlock_t ampdu_rx;
/* tx */
u8 tid_state_tx[STA_TID_NUM];
struct tid_ampdu_tx *tid_tx[STA_TID_NUM];
u8 addba_req_num[STA_TID_NUM];
spinlock_t ampdu_tx; spinlock_t ampdu_tx;
u8 dialog_token_allocator; u8 dialog_token_allocator;
}; };
......
...@@ -33,7 +33,7 @@ int ieee80211_frequency_to_channel(int freq) ...@@ -33,7 +33,7 @@ int ieee80211_frequency_to_channel(int freq)
} }
EXPORT_SYMBOL(ieee80211_frequency_to_channel); EXPORT_SYMBOL(ieee80211_frequency_to_channel);
struct ieee80211_channel *ieee80211_get_channel(struct wiphy *wiphy, struct ieee80211_channel *__ieee80211_get_channel(struct wiphy *wiphy,
int freq) int freq)
{ {
enum ieee80211_band band; enum ieee80211_band band;
...@@ -54,7 +54,7 @@ struct ieee80211_channel *ieee80211_get_channel(struct wiphy *wiphy, ...@@ -54,7 +54,7 @@ struct ieee80211_channel *ieee80211_get_channel(struct wiphy *wiphy,
return NULL; return NULL;
} }
EXPORT_SYMBOL(ieee80211_get_channel); EXPORT_SYMBOL(__ieee80211_get_channel);
static void set_mandatory_flags_band(struct ieee80211_supported_band *sband, static void set_mandatory_flags_band(struct ieee80211_supported_band *sband,
enum ieee80211_band band) enum ieee80211_band band)
......
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