Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
ff30b364
Commit
ff30b364
authored
Jan 12, 2010
by
David S. Miller
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'master' of
git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6
parents
9db2f1be
8c5d9808
Changes
23
Hide whitespace changes
Inline
Side-by-side
Showing
23 changed files
with
254 additions
and
86 deletions
+254
-86
drivers/net/wireless/ath/ath5k/eeprom.c
drivers/net/wireless/ath/ath5k/eeprom.c
+29
-3
drivers/net/wireless/ath/ath5k/eeprom.h
drivers/net/wireless/ath/ath5k/eeprom.h
+8
-0
drivers/net/wireless/ath/ath9k/Kconfig
drivers/net/wireless/ath/ath9k/Kconfig
+1
-1
drivers/net/wireless/ath/ath9k/ath9k.h
drivers/net/wireless/ath/ath9k/ath9k.h
+3
-3
drivers/net/wireless/iwlwifi/iwl-4965.c
drivers/net/wireless/iwlwifi/iwl-4965.c
+1
-1
drivers/net/wireless/iwlwifi/iwl-core.c
drivers/net/wireless/iwlwifi/iwl-core.c
+25
-20
drivers/net/wireless/iwlwifi/iwl-dev.h
drivers/net/wireless/iwlwifi/iwl-dev.h
+1
-1
drivers/net/wireless/mwl8k.c
drivers/net/wireless/mwl8k.c
+3
-1
drivers/net/wireless/rt2x00/rt2800lib.c
drivers/net/wireless/rt2x00/rt2800lib.c
+1
-1
drivers/net/wireless/rt2x00/rt2x00.h
drivers/net/wireless/rt2x00/rt2x00.h
+6
-0
drivers/net/wireless/rt2x00/rt2x00dev.c
drivers/net/wireless/rt2x00/rt2x00dev.c
+11
-1
drivers/net/wireless/rt2x00/rt2x00queue.c
drivers/net/wireless/rt2x00/rt2x00queue.c
+3
-3
drivers/net/wireless/zd1211rw/zd_mac.c
drivers/net/wireless/zd1211rw/zd_mac.c
+7
-6
net/mac80211/iface.c
net/mac80211/iface.c
+43
-4
net/mac80211/mlme.c
net/mac80211/mlme.c
+5
-3
net/mac80211/rx.c
net/mac80211/rx.c
+7
-1
net/mac80211/scan.c
net/mac80211/scan.c
+5
-5
net/mac80211/tx.c
net/mac80211/tx.c
+4
-1
net/mac80211/util.c
net/mac80211/util.c
+12
-0
net/mac80211/wme.c
net/mac80211/wme.c
+70
-26
net/mac80211/wme.h
net/mac80211/wme.h
+6
-2
net/wireless/core.c
net/wireless/core.c
+2
-2
net/wireless/reg.c
net/wireless/reg.c
+1
-1
No files found.
drivers/net/wireless/ath/ath5k/eeprom.c
View file @
ff30b364
...
...
@@ -97,7 +97,7 @@ ath5k_eeprom_init_header(struct ath5k_hw *ah)
struct
ath5k_eeprom_info
*
ee
=
&
ah
->
ah_capabilities
.
cap_eeprom
;
int
ret
;
u16
val
;
u32
cksum
,
offset
;
u32
cksum
,
offset
,
eep_max
=
AR5K_EEPROM_INFO_MAX
;
/*
* Read values from EEPROM and store them in the capability structure
...
...
@@ -116,12 +116,38 @@ ath5k_eeprom_init_header(struct ath5k_hw *ah)
* Validate the checksum of the EEPROM date. There are some
* devices with invalid EEPROMs.
*/
for
(
cksum
=
0
,
offset
=
0
;
offset
<
AR5K_EEPROM_INFO_MAX
;
offset
++
)
{
AR5K_EEPROM_READ
(
AR5K_EEPROM_SIZE_UPPER
,
val
);
if
(
val
)
{
eep_max
=
(
val
&
AR5K_EEPROM_SIZE_UPPER_MASK
)
<<
AR5K_EEPROM_SIZE_ENDLOC_SHIFT
;
AR5K_EEPROM_READ
(
AR5K_EEPROM_SIZE_LOWER
,
val
);
eep_max
=
(
eep_max
|
val
)
-
AR5K_EEPROM_INFO_BASE
;
/*
* Fail safe check to prevent stupid loops due
* to busted EEPROMs. XXX: This value is likely too
* big still, waiting on a better value.
*/
if
(
eep_max
>
(
3
*
AR5K_EEPROM_INFO_MAX
))
{
ATH5K_ERR
(
ah
->
ah_sc
,
"Invalid max custom EEPROM size: "
"%d (0x%04x) max expected: %d (0x%04x)
\n
"
,
eep_max
,
eep_max
,
3
*
AR5K_EEPROM_INFO_MAX
,
3
*
AR5K_EEPROM_INFO_MAX
);
return
-
EIO
;
}
}
for
(
cksum
=
0
,
offset
=
0
;
offset
<
eep_max
;
offset
++
)
{
AR5K_EEPROM_READ
(
AR5K_EEPROM_INFO
(
offset
),
val
);
cksum
^=
val
;
}
if
(
cksum
!=
AR5K_EEPROM_INFO_CKSUM
)
{
ATH5K_ERR
(
ah
->
ah_sc
,
"Invalid EEPROM checksum 0x%04x
\n
"
,
cksum
);
ATH5K_ERR
(
ah
->
ah_sc
,
"Invalid EEPROM "
"checksum: 0x%04x eep_max: 0x%04x (%s)
\n
"
,
cksum
,
eep_max
,
eep_max
==
AR5K_EEPROM_INFO_MAX
?
"default size"
:
"custom size"
);
return
-
EIO
;
}
...
...
drivers/net/wireless/ath/ath5k/eeprom.h
View file @
ff30b364
...
...
@@ -37,6 +37,14 @@
#define AR5K_EEPROM_RFKILL_POLARITY_S 1
#define AR5K_EEPROM_REG_DOMAIN 0x00bf
/* EEPROM regdom */
/* FLASH(EEPROM) Defines for AR531X chips */
#define AR5K_EEPROM_SIZE_LOWER 0x1b
/* size info -- lower */
#define AR5K_EEPROM_SIZE_UPPER 0x1c
/* size info -- upper */
#define AR5K_EEPROM_SIZE_UPPER_MASK 0xfff0
#define AR5K_EEPROM_SIZE_UPPER_SHIFT 4
#define AR5K_EEPROM_SIZE_ENDLOC_SHIFT 12
#define AR5K_EEPROM_CHECKSUM 0x00c0
/* EEPROM checksum */
#define AR5K_EEPROM_INFO_BASE 0x00c0
/* EEPROM header */
#define AR5K_EEPROM_INFO_MAX (0x400 - AR5K_EEPROM_INFO_BASE)
...
...
drivers/net/wireless/ath/ath9k/Kconfig
View file @
ff30b364
...
...
@@ -25,7 +25,7 @@ config ATH9K
config ATH9K_DEBUGFS
bool "Atheros ath9k debugging"
depends on ATH9K
depends on ATH9K
&& DEBUG_FS
---help---
Say Y, if you need access to ath9k's statistics for
interrupts, rate control, etc.
...
...
drivers/net/wireless/ath/ath9k/ath9k.h
View file @
ff30b364
...
...
@@ -33,11 +33,11 @@ struct ath_node;
/* Macro to expand scalars to 64-bit objects */
#define ito64(x) (sizeof(x) ==
8
) ? \
#define ito64(x) (sizeof(x) ==
1
) ? \
(((unsigned long long int)(x)) & (0xff)) : \
(sizeof(x) ==
16
) ? \
(sizeof(x) ==
2
) ? \
(((unsigned long long int)(x)) & 0xffff) : \
((sizeof(x) ==
32
) ? \
((sizeof(x) ==
4
) ? \
(((unsigned long long int)(x)) & 0xffffffff) : \
(unsigned long long int)(x))
...
...
drivers/net/wireless/iwlwifi/iwl-4965.c
View file @
ff30b364
...
...
@@ -1961,7 +1961,7 @@ static void iwl4965_rx_reply_tx(struct iwl_priv *priv,
struct
ieee80211_tx_info
*
info
;
struct
iwl4965_tx_resp
*
tx_resp
=
(
void
*
)
&
pkt
->
u
.
raw
[
0
];
u32
status
=
le32_to_cpu
(
tx_resp
->
u
.
status
);
int
tid
=
MAX_TID_COUNT
;
int
uninitialized_var
(
tid
)
;
int
sta_id
;
int
freed
;
u8
*
qc
=
NULL
;
...
...
drivers/net/wireless/iwlwifi/iwl-core.c
View file @
ff30b364
...
...
@@ -2344,6 +2344,21 @@ static void iwl_ht_conf(struct iwl_priv *priv,
IWL_DEBUG_MAC80211
(
priv
,
"leave
\n
"
);
}
static
inline
void
iwl_set_no_assoc
(
struct
iwl_priv
*
priv
)
{
priv
->
assoc_id
=
0
;
iwl_led_disassociate
(
priv
);
/*
* inform the ucode that there is no longer an
* association and that no more packets should be
* sent
*/
priv
->
staging_rxon
.
filter_flags
&=
~
RXON_FILTER_ASSOC_MSK
;
priv
->
staging_rxon
.
assoc_id
=
0
;
iwlcore_commit_rxon
(
priv
);
}
#define IWL_DELAY_NEXT_SCAN_AFTER_ASSOC (HZ*6)
void
iwl_bss_info_changed
(
struct
ieee80211_hw
*
hw
,
struct
ieee80211_vif
*
vif
,
...
...
@@ -2475,20 +2490,8 @@ void iwl_bss_info_changed(struct ieee80211_hw *hw,
IWL_DELAY_NEXT_SCAN_AFTER_ASSOC
;
if
(
!
iwl_is_rfkill
(
priv
))
priv
->
cfg
->
ops
->
lib
->
post_associate
(
priv
);
}
else
{
priv
->
assoc_id
=
0
;
iwl_led_disassociate
(
priv
);
/*
* inform the ucode that there is no longer an
* association and that no more packets should be
* send
*/
priv
->
staging_rxon
.
filter_flags
&=
~
RXON_FILTER_ASSOC_MSK
;
priv
->
staging_rxon
.
assoc_id
=
0
;
iwlcore_commit_rxon
(
priv
);
}
}
else
iwl_set_no_assoc
(
priv
);
}
if
(
changes
&&
iwl_is_associated
(
priv
)
&&
priv
->
assoc_id
)
{
...
...
@@ -2503,12 +2506,14 @@ void iwl_bss_info_changed(struct ieee80211_hw *hw,
}
}
if
((
changes
&
BSS_CHANGED_BEACON_ENABLED
)
&&
vif
->
bss_conf
.
enable_beacon
)
{
memcpy
(
priv
->
staging_rxon
.
bssid_addr
,
bss_conf
->
bssid
,
ETH_ALEN
);
memcpy
(
priv
->
bssid
,
bss_conf
->
bssid
,
ETH_ALEN
);
iwlcore_config_ap
(
priv
);
if
(
changes
&
BSS_CHANGED_BEACON_ENABLED
)
{
if
(
vif
->
bss_conf
.
enable_beacon
)
{
memcpy
(
priv
->
staging_rxon
.
bssid_addr
,
bss_conf
->
bssid
,
ETH_ALEN
);
memcpy
(
priv
->
bssid
,
bss_conf
->
bssid
,
ETH_ALEN
);
iwlcore_config_ap
(
priv
);
}
else
iwl_set_no_assoc
(
priv
);
}
mutex_unlock
(
&
priv
->
mutex
);
...
...
drivers/net/wireless/iwlwifi/iwl-dev.h
View file @
ff30b364
...
...
@@ -711,7 +711,7 @@ extern void iwl_txq_ctx_stop(struct iwl_priv *priv);
extern
int
iwl_queue_space
(
const
struct
iwl_queue
*
q
);
static
inline
int
iwl_queue_used
(
const
struct
iwl_queue
*
q
,
int
i
)
{
return
q
->
write_ptr
>
q
->
read_ptr
?
return
q
->
write_ptr
>
=
q
->
read_ptr
?
(
i
>=
q
->
read_ptr
&&
i
<
q
->
write_ptr
)
:
!
(
i
<
q
->
read_ptr
&&
i
>=
q
->
write_ptr
);
}
...
...
drivers/net/wireless/mwl8k.c
View file @
ff30b364
...
...
@@ -3157,8 +3157,10 @@ static void mwl8k_configure_filter(struct ieee80211_hw *hw,
/* Clear unsupported feature flags */
*
total_flags
&=
FIF_ALLMULTI
|
FIF_BCN_PRBRESP_PROMISC
;
if
(
mwl8k_fw_lock
(
hw
))
if
(
mwl8k_fw_lock
(
hw
))
{
kfree
(
cmd
);
return
;
}
if
(
priv
->
sniffer_enabled
)
{
mwl8k_enable_sniffer
(
hw
,
0
);
...
...
drivers/net/wireless/rt2x00/rt2800lib.c
View file @
ff30b364
...
...
@@ -340,7 +340,7 @@ static int rt2800_blink_set(struct led_classdev *led_cdev,
rt2x00_set_field32
(
&
reg
,
LED_CFG_OFF_PERIOD
,
*
delay_off
);
rt2x00_set_field32
(
&
reg
,
LED_CFG_SLOW_BLINK_PERIOD
,
3
);
rt2x00_set_field32
(
&
reg
,
LED_CFG_R_LED_MODE
,
3
);
rt2x00_set_field32
(
&
reg
,
LED_CFG_G_LED_MODE
,
12
);
rt2x00_set_field32
(
&
reg
,
LED_CFG_G_LED_MODE
,
3
);
rt2x00_set_field32
(
&
reg
,
LED_CFG_Y_LED_MODE
,
3
);
rt2x00_set_field32
(
&
reg
,
LED_CFG_LED_POLAR
,
1
);
rt2800_register_write
(
led
->
rt2x00dev
,
LED_CFG
,
reg
);
...
...
drivers/net/wireless/rt2x00/rt2x00.h
View file @
ff30b364
...
...
@@ -112,6 +112,12 @@
#define ALIGN_SIZE(__skb, __header) \
( ((unsigned long)((__skb)->data + (__header))) & 3 )
/*
* Constants for extra TX headroom for alignment purposes.
*/
#define RT2X00_ALIGN_SIZE 4
/* Only whole frame needs alignment */
#define RT2X00_L2PAD_SIZE 8
/* Both header & payload need alignment */
/*
* Standard timing and size defines.
* These values should follow the ieee80211 specifications.
...
...
drivers/net/wireless/rt2x00/rt2x00dev.c
View file @
ff30b364
...
...
@@ -686,7 +686,17 @@ static int rt2x00lib_probe_hw(struct rt2x00_dev *rt2x00dev)
/*
* Initialize extra TX headroom required.
*/
rt2x00dev
->
hw
->
extra_tx_headroom
=
rt2x00dev
->
ops
->
extra_tx_headroom
;
rt2x00dev
->
hw
->
extra_tx_headroom
=
max_t
(
unsigned
int
,
IEEE80211_TX_STATUS_HEADROOM
,
rt2x00dev
->
ops
->
extra_tx_headroom
);
/*
* Take TX headroom required for alignment into account.
*/
if
(
test_bit
(
DRIVER_REQUIRE_L2PAD
,
&
rt2x00dev
->
flags
))
rt2x00dev
->
hw
->
extra_tx_headroom
+=
RT2X00_L2PAD_SIZE
;
else
if
(
test_bit
(
DRIVER_REQUIRE_DMA
,
&
rt2x00dev
->
flags
))
rt2x00dev
->
hw
->
extra_tx_headroom
+=
RT2X00_ALIGN_SIZE
;
/*
* Register HW.
...
...
drivers/net/wireless/rt2x00/rt2x00queue.c
View file @
ff30b364
...
...
@@ -104,7 +104,7 @@ void rt2x00queue_map_txskb(struct rt2x00_dev *rt2x00dev, struct sk_buff *skb)
* is also mapped to the DMA so it can be used for transfering
* additional descriptor information to the hardware.
*/
skb_push
(
skb
,
rt2x00dev
->
hw
->
extra_tx_headroom
);
skb_push
(
skb
,
rt2x00dev
->
ops
->
extra_tx_headroom
);
skbdesc
->
skb_dma
=
dma_map_single
(
rt2x00dev
->
dev
,
skb
->
data
,
skb
->
len
,
DMA_TO_DEVICE
);
...
...
@@ -112,7 +112,7 @@ void rt2x00queue_map_txskb(struct rt2x00_dev *rt2x00dev, struct sk_buff *skb)
/*
* Restore data pointer to original location again.
*/
skb_pull
(
skb
,
rt2x00dev
->
hw
->
extra_tx_headroom
);
skb_pull
(
skb
,
rt2x00dev
->
ops
->
extra_tx_headroom
);
skbdesc
->
flags
|=
SKBDESC_DMA_MAPPED_TX
;
}
...
...
@@ -134,7 +134,7 @@ void rt2x00queue_unmap_skb(struct rt2x00_dev *rt2x00dev, struct sk_buff *skb)
* by the driver, but it was actually mapped to DMA.
*/
dma_unmap_single
(
rt2x00dev
->
dev
,
skbdesc
->
skb_dma
,
skb
->
len
+
rt2x00dev
->
hw
->
extra_tx_headroom
,
skb
->
len
+
rt2x00dev
->
ops
->
extra_tx_headroom
,
DMA_TO_DEVICE
);
skbdesc
->
flags
&=
~
SKBDESC_DMA_MAPPED_TX
;
}
...
...
drivers/net/wireless/zd1211rw/zd_mac.c
View file @
ff30b364
...
...
@@ -987,12 +987,13 @@ static void zd_op_configure_filter(struct ieee80211_hw *hw,
changed_flags
&=
SUPPORTED_FIF_FLAGS
;
*
new_flags
&=
SUPPORTED_FIF_FLAGS
;
/* changed_flags is always populated but this driver
* doesn't support all FIF flags so its possible we don't
* need to do anything */
if
(
!
changed_flags
)
return
;
/*
* If multicast parameter (as returned by zd_op_prepare_multicast)
* has changed, no bit in changed_flags is set. To handle this
* situation, we do not return if changed_flags is 0. If we do so,
* we will have some issue with IPv6 which uses multicast for link
* layer address resolution.
*/
if
(
*
new_flags
&
(
FIF_PROMISC_IN_BSS
|
FIF_ALLMULTI
))
zd_mc_add_all
(
&
hash
);
...
...
net/mac80211/iface.c
View file @
ff30b364
...
...
@@ -15,12 +15,14 @@
#include <linux/netdevice.h>
#include <linux/rtnetlink.h>
#include <net/mac80211.h>
#include <net/ieee80211_radiotap.h>
#include "ieee80211_i.h"
#include "sta_info.h"
#include "debugfs_netdev.h"
#include "mesh.h"
#include "led.h"
#include "driver-ops.h"
#include "wme.h"
/**
* DOC: Interface list locking
...
...
@@ -314,7 +316,7 @@ static int ieee80211_open(struct net_device *dev)
if
(
sdata
->
vif
.
type
==
NL80211_IFTYPE_STATION
)
ieee80211_queue_work
(
&
local
->
hw
,
&
sdata
->
u
.
mgd
.
work
);
netif_
start_queue
(
dev
);
netif_
tx_start_all_queues
(
dev
);
return
0
;
err_del_interface:
...
...
@@ -343,7 +345,7 @@ static int ieee80211_stop(struct net_device *dev)
/*
* Stop TX on this interface first.
*/
netif_
stop_queue
(
dev
);
netif_
tx_stop_all_queues
(
dev
);
/*
* Now delete all active aggregation sessions.
...
...
@@ -644,6 +646,12 @@ static void ieee80211_teardown_sdata(struct net_device *dev)
WARN_ON
(
flushed
);
}
static
u16
ieee80211_netdev_select_queue
(
struct
net_device
*
dev
,
struct
sk_buff
*
skb
)
{
return
ieee80211_select_queue
(
IEEE80211_DEV_TO_SUB_IF
(
dev
),
skb
);
}
static
const
struct
net_device_ops
ieee80211_dataif_ops
=
{
.
ndo_open
=
ieee80211_open
,
.
ndo_stop
=
ieee80211_stop
,
...
...
@@ -652,8 +660,38 @@ static const struct net_device_ops ieee80211_dataif_ops = {
.
ndo_set_multicast_list
=
ieee80211_set_multicast_list
,
.
ndo_change_mtu
=
ieee80211_change_mtu
,
.
ndo_set_mac_address
=
eth_mac_addr
,
.
ndo_select_queue
=
ieee80211_netdev_select_queue
,
};
static
u16
ieee80211_monitor_select_queue
(
struct
net_device
*
dev
,
struct
sk_buff
*
skb
)
{
struct
ieee80211_sub_if_data
*
sdata
=
IEEE80211_DEV_TO_SUB_IF
(
dev
);
struct
ieee80211_local
*
local
=
sdata
->
local
;
struct
ieee80211_hdr
*
hdr
;
struct
ieee80211_radiotap_header
*
rtap
=
(
void
*
)
skb
->
data
;
u8
*
p
;
if
(
local
->
hw
.
queues
<
4
)
return
0
;
if
(
skb
->
len
<
4
||
skb
->
len
<
le16_to_cpu
(
rtap
->
it_len
)
+
2
/* frame control */
)
return
0
;
/* doesn't matter, frame will be dropped */
hdr
=
(
void
*
)((
u8
*
)
skb
->
data
+
le16_to_cpu
(
rtap
->
it_len
));
if
(
!
ieee80211_is_data_qos
(
hdr
->
frame_control
))
{
skb
->
priority
=
7
;
return
ieee802_1d_to_ac
[
skb
->
priority
];
}
p
=
ieee80211_get_qos_ctl
(
hdr
);
skb
->
priority
=
*
p
&
IEEE80211_QOS_CTL_TAG1D_MASK
;
return
ieee80211_downgrade_queue
(
local
,
skb
);
}
static
const
struct
net_device_ops
ieee80211_monitorif_ops
=
{
.
ndo_open
=
ieee80211_open
,
.
ndo_stop
=
ieee80211_stop
,
...
...
@@ -662,6 +700,7 @@ static const struct net_device_ops ieee80211_monitorif_ops = {
.
ndo_set_multicast_list
=
ieee80211_set_multicast_list
,
.
ndo_change_mtu
=
ieee80211_change_mtu
,
.
ndo_set_mac_address
=
eth_mac_addr
,
.
ndo_select_queue
=
ieee80211_monitor_select_queue
,
};
static
void
ieee80211_if_setup
(
struct
net_device
*
dev
)
...
...
@@ -768,8 +807,8 @@ int ieee80211_if_add(struct ieee80211_local *local, const char *name,
ASSERT_RTNL
();
ndev
=
alloc_netdev
(
sizeof
(
*
sdata
)
+
local
->
hw
.
vif_data_size
,
name
,
ieee80211_if_setup
);
ndev
=
alloc_netdev
_mq
(
sizeof
(
*
sdata
)
+
local
->
hw
.
vif_data_size
,
name
,
ieee80211_if_setup
,
local
->
hw
.
queues
);
if
(
!
ndev
)
return
-
ENOMEM
;
dev_net_set
(
ndev
,
wiphy_net
(
local
->
hw
.
wiphy
));
...
...
net/mac80211/mlme.c
View file @
ff30b364
...
...
@@ -942,7 +942,7 @@ static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata,
ieee80211_recalc_ps
(
local
,
-
1
);
mutex_unlock
(
&
local
->
iflist_mtx
);
netif_
start_queue
(
sdata
->
dev
);
netif_
tx_start_all_queues
(
sdata
->
dev
);
netif_carrier_on
(
sdata
->
dev
);
}
...
...
@@ -1074,7 +1074,7 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata,
* time -- we don't want the scan code to enable queues.
*/
netif_
stop_queue
(
sdata
->
dev
);
netif_
tx_stop_all_queues
(
sdata
->
dev
);
netif_carrier_off
(
sdata
->
dev
);
rcu_read_lock
();
...
...
@@ -1963,7 +1963,9 @@ static void ieee80211_sta_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
rma
=
ieee80211_rx_mgmt_disassoc
(
sdata
,
mgmt
,
skb
->
len
);
break
;
case
IEEE80211_STYPE_ACTION
:
/* XXX: differentiate, can only happen for CSA now! */
if
(
mgmt
->
u
.
action
.
category
!=
WLAN_CATEGORY_SPECTRUM_MGMT
)
break
;
ieee80211_sta_process_chanswitch
(
sdata
,
&
mgmt
->
u
.
action
.
u
.
chan_switch
.
sw_elem
,
ifmgd
->
associated
);
...
...
net/mac80211/rx.c
View file @
ff30b364
...
...
@@ -1746,7 +1746,9 @@ ieee80211_rx_h_mesh_fwding(struct ieee80211_rx_data *rx)
memset
(
info
,
0
,
sizeof
(
*
info
));
info
->
flags
|=
IEEE80211_TX_INTFL_NEED_TXPROCESSING
;
info
->
control
.
vif
=
&
rx
->
sdata
->
vif
;
ieee80211_select_queue
(
local
,
fwd_skb
);
skb_set_queue_mapping
(
skb
,
ieee80211_select_queue
(
rx
->
sdata
,
fwd_skb
));
ieee80211_set_qos_hdr
(
local
,
skb
);
if
(
is_multicast_ether_addr
(
fwd_hdr
->
addr1
))
IEEE80211_IFSTA_MESH_CTR_INC
(
&
sdata
->
u
.
mesh
,
fwded_mcast
);
...
...
@@ -2013,6 +2015,10 @@ ieee80211_rx_h_action(struct ieee80211_rx_data *rx)
}
break
;
default:
/* do not process rejected action frames */
if
(
mgmt
->
u
.
action
.
category
&
0x80
)
return
RX_DROP_MONITOR
;
return
RX_CONTINUE
;
}
...
...
net/mac80211/scan.c
View file @
ff30b364
...
...
@@ -353,10 +353,10 @@ void ieee80211_scan_completed(struct ieee80211_hw *hw, bool aborted)
if
(
sdata
->
vif
.
type
==
NL80211_IFTYPE_STATION
)
{
if
(
sdata
->
u
.
mgd
.
associated
)
{
ieee80211_scan_ps_disable
(
sdata
);
netif_
wake_queue
(
sdata
->
dev
);
netif_
tx_wake_all_queues
(
sdata
->
dev
);
}
}
else
netif_
wake_queue
(
sdata
->
dev
);
netif_
tx_wake_all_queues
(
sdata
->
dev
);
/* re-enable beaconing */
if
(
sdata
->
vif
.
type
==
NL80211_IFTYPE_AP
||
...
...
@@ -411,7 +411,7 @@ static int ieee80211_start_sw_scan(struct ieee80211_local *local)
* are handled in the scan state machine
*/
if
(
sdata
->
vif
.
type
!=
NL80211_IFTYPE_STATION
)
netif_
stop_queue
(
sdata
->
dev
);
netif_
tx_stop_all_queues
(
sdata
->
dev
);
}
mutex_unlock
(
&
local
->
iflist_mtx
);
...
...
@@ -575,7 +575,7 @@ static void ieee80211_scan_state_leave_oper_channel(struct ieee80211_local *loca
continue
;
if
(
sdata
->
vif
.
type
==
NL80211_IFTYPE_STATION
)
{
netif_
stop_queue
(
sdata
->
dev
);
netif_
tx_stop_all_queues
(
sdata
->
dev
);
if
(
sdata
->
u
.
mgd
.
associated
)
ieee80211_scan_ps_enable
(
sdata
);
}
...
...
@@ -610,7 +610,7 @@ static void ieee80211_scan_state_enter_oper_channel(struct ieee80211_local *loca
if
(
sdata
->
vif
.
type
==
NL80211_IFTYPE_STATION
)
{
if
(
sdata
->
u
.
mgd
.
associated
)
ieee80211_scan_ps_disable
(
sdata
);
netif_
wake_queue
(
sdata
->
dev
);
netif_
tx_wake_all_queues
(
sdata
->
dev
);
}
}
mutex_unlock
(
&
local
->
iflist_mtx
);
...
...
net/mac80211/tx.c
View file @
ff30b364
...
...
@@ -1512,7 +1512,7 @@ static void ieee80211_xmit(struct ieee80211_sub_if_data *sdata,
return
;
}
ieee80211_se
lect_queue
(
local
,
skb
);
ieee80211_se
t_qos_hdr
(
local
,
skb
);
ieee80211_tx
(
sdata
,
skb
,
false
);
rcu_read_unlock
();
}
...
...
@@ -2291,6 +2291,9 @@ void ieee80211_tx_skb(struct ieee80211_sub_if_data *sdata, struct sk_buff *skb)
skb_set_network_header
(
skb
,
0
);
skb_set_transport_header
(
skb
,
0
);
/* send all internal mgmt frames on VO */
skb_set_queue_mapping
(
skb
,
0
);
/*
* The other path calling ieee80211_xmit is from the tasklet,
* and while we can handle concurrent transmissions locking
...
...
net/mac80211/util.c
View file @
ff30b364
...
...
@@ -269,6 +269,7 @@ static void __ieee80211_wake_queue(struct ieee80211_hw *hw, int queue,
enum
queue_stop_reason
reason
)
{
struct
ieee80211_local
*
local
=
hw_to_local
(
hw
);
struct
ieee80211_sub_if_data
*
sdata
;
if
(
WARN_ON
(
queue
>=
hw
->
queues
))
return
;
...
...
@@ -281,6 +282,11 @@ static void __ieee80211_wake_queue(struct ieee80211_hw *hw, int queue,
if
(
!
skb_queue_empty
(
&
local
->
pending
[
queue
]))
tasklet_schedule
(
&
local
->
tx_pending_tasklet
);
rcu_read_lock
();
list_for_each_entry_rcu
(
sdata
,
&
local
->
interfaces
,
list
)
netif_tx_wake_queue
(
netdev_get_tx_queue
(
sdata
->
dev
,
queue
));
rcu_read_unlock
();
}
void
ieee80211_wake_queue_by_reason
(
struct
ieee80211_hw
*
hw
,
int
queue
,
...
...
@@ -305,11 +311,17 @@ static void __ieee80211_stop_queue(struct ieee80211_hw *hw, int queue,
enum
queue_stop_reason
reason
)
{
struct
ieee80211_local
*
local
=
hw_to_local
(
hw
);
struct
ieee80211_sub_if_data
*
sdata
;
if
(
WARN_ON
(
queue
>=
hw
->
queues
))
return
;
__set_bit
(
reason
,
&
local
->
queue_stop_reasons
[
queue
]);
rcu_read_lock
();
list_for_each_entry_rcu
(
sdata
,
&
local
->
interfaces
,
list
)
netif_tx_stop_queue
(
netdev_get_tx_queue
(
sdata
->
dev
,
queue
));
rcu_read_unlock
();
}
void
ieee80211_stop_queue_by_reason
(
struct
ieee80211_hw
*
hw
,
int
queue
,
...
...
net/mac80211/wme.c
View file @
ff30b364
...
...
@@ -44,22 +44,69 @@ static int wme_downgrade_ac(struct sk_buff *skb)
}
/* Indicate which queue to use. */
static
u16
classify80211
(
struct
ieee80211_local
*
local
,
struct
sk_buff
*
skb
)
/* Indicate which queue to use. */
u16
ieee80211_select_queue
(
struct
ieee80211_sub_if_data
*
sdata
,
struct
sk_buff
*
skb
)
{
struct
ieee80211_hdr
*
hdr
=
(
struct
ieee80211_hdr
*
)
skb
->
data
;
struct
ieee80211_local
*
local
=
sdata
->
local
;
struct
sta_info
*
sta
=
NULL
;
u32
sta_flags
=
0
;
const
u8
*
ra
=
NULL
;
bool
qos
=
false
;
if
(
!
ieee80211_is_data
(
hdr
->
frame_control
))
{
/* management frames go on AC_VO queue, but are sent
* without QoS control fields */
return
0
;
if
(
local
->
hw
.
queues
<
4
||
skb
->
len
<
6
)
{
skb
->
priority
=
0
;
/* required for correct WPA/11i MIC */
return
min_t
(
u16
,
local
->
hw
.
queues
-
1
,
ieee802_1d_to_ac
[
skb
->
priority
]);
}
rcu_read_lock
();
switch
(
sdata
->
vif
.
type
)
{
case
NL80211_IFTYPE_AP_VLAN
:
rcu_read_lock
();
sta
=
rcu_dereference
(
sdata
->
u
.
vlan
.
sta
);
if
(
sta
)
sta_flags
=
get_sta_flags
(
sta
);
rcu_read_unlock
();
if
(
sta
)
break
;
case
NL80211_IFTYPE_AP
:
ra
=
skb
->
data
;
break
;
case
NL80211_IFTYPE_WDS
:
ra
=
sdata
->
u
.
wds
.
remote_addr
;
break
;
#ifdef CONFIG_MAC80211_MESH
case
NL80211_IFTYPE_MESH_POINT
:
/*
* XXX: This is clearly broken ... but already was before,
* because ieee80211_fill_mesh_addresses() would clear A1
* except for multicast addresses.
*/
break
;
#endif
case
NL80211_IFTYPE_STATION
:
ra
=
sdata
->
u
.
mgd
.
bssid
;
break
;
case
NL80211_IFTYPE_ADHOC
:
ra
=
skb
->
data
;
break
;
default:
break
;
}
if
(
0
/* injected */
)
{
/* use AC from radiotap */
if
(
!
sta
&&
ra
&&
!
is_multicast_ether_addr
(
ra
))
{
sta
=
sta_info_get
(
local
,
ra
);
if
(
sta
)
sta_flags
=
get_sta_flags
(
sta
);
}
if
(
!
ieee80211_is_data_qos
(
hdr
->
frame_control
))
{
if
(
sta_flags
&
WLAN_STA_WME
)
qos
=
true
;
rcu_read_unlock
();
if
(
!
qos
)
{
skb
->
priority
=
0
;
/* required for correct WPA/11i MIC */
return
ieee802_1d_to_ac
[
skb
->
priority
];
}
...
...
@@ -68,6 +115,12 @@ static u16 classify80211(struct ieee80211_local *local, struct sk_buff *skb)
* data frame has */
skb
->
priority
=
cfg80211_classify8021d
(
skb
);
return
ieee80211_downgrade_queue
(
local
,
skb
);
}
u16
ieee80211_downgrade_queue
(
struct
ieee80211_local
*
local
,
struct
sk_buff
*
skb
)
{
/* in case we are a client verify acm is not set for this ac */
while
(
unlikely
(
local
->
wmm_acm
&
BIT
(
skb
->
priority
)))
{
if
(
wme_downgrade_ac
(
skb
))
{
...
...
@@ -85,24 +138,17 @@ static u16 classify80211(struct ieee80211_local *local, struct sk_buff *skb)
return
ieee802_1d_to_ac
[
skb
->
priority
];
}
void
ieee80211_se
lect_queue
(
struct
ieee80211_local
*
local
,
struct
sk_buff
*
skb
)
void
ieee80211_se
t_qos_hdr
(
struct
ieee80211_local
*
local
,
struct
sk_buff
*
skb
)
{
struct
ieee80211_hdr
*
hdr
=
(
struct
ieee80211_hdr
*
)
skb
->
data
;
u16
queue
;
u8
tid
;
queue
=
classify80211
(
local
,
skb
);
if
(
unlikely
(
queue
>=
local
->
hw
.
queues
))
queue
=
local
->
hw
.
queues
-
1
;
/*
* Now we know the 1d priority, fill in the QoS header if
* there is one (and we haven't done this before).
*/
struct
ieee80211_hdr
*
hdr
=
(
void
*
)
skb
->
data
;
/* Fill in the QoS header if there is one. */
if
(
ieee80211_is_data_qos
(
hdr
->
frame_control
))
{
u8
*
p
=
ieee80211_get_qos_ctl
(
hdr
);
u8
ack_policy
=
0
;
u8
ack_policy
=
0
,
tid
;
tid
=
skb
->
priority
&
IEEE80211_QOS_CTL_TAG1D_MASK
;
if
(
unlikely
(
local
->
wifi_wme_noack_test
))
ack_policy
|=
QOS_CONTROL_ACK_POLICY_NOACK
<<
QOS_CONTROL_ACK_POLICY_SHIFT
;
...
...
@@ -110,6 +156,4 @@ void ieee80211_select_queue(struct ieee80211_local *local, struct sk_buff *skb)
*
p
++
=
ack_policy
|
tid
;
*
p
=
0
;
}
skb_set_queue_mapping
(
skb
,
queue
);
}
net/mac80211/wme.h
View file @
ff30b364
...
...
@@ -20,7 +20,11 @@
extern
const
int
ieee802_1d_to_ac
[
8
];
void
ieee80211_select_queue
(
struct
ieee80211_local
*
local
,
struct
sk_buff
*
skb
);
u16
ieee80211_select_queue
(
struct
ieee80211_sub_if_data
*
sdata
,
struct
sk_buff
*
skb
);
void
ieee80211_set_qos_hdr
(
struct
ieee80211_local
*
local
,
struct
sk_buff
*
skb
);
u16
ieee80211_downgrade_queue
(
struct
ieee80211_local
*
local
,
struct
sk_buff
*
skb
);
#endif
/* _WME_H */
net/wireless/core.c
View file @
ff30b364
...
...
@@ -745,9 +745,9 @@ static int cfg80211_netdev_notifier_call(struct notifier_block * nb,
mutex_unlock
(
&
rdev
->
devlist_mtx
);
dev_put
(
dev
);
}
#ifdef CONFIG_CFG80211_WEXT
cfg80211_lock_rdev
(
rdev
);
mutex_lock
(
&
rdev
->
devlist_mtx
);
#ifdef CONFIG_CFG80211_WEXT
wdev_lock
(
wdev
);
switch
(
wdev
->
iftype
)
{
case
NL80211_IFTYPE_ADHOC
:
...
...
@@ -760,10 +760,10 @@ static int cfg80211_netdev_notifier_call(struct notifier_block * nb,
break
;
}
wdev_unlock
(
wdev
);
#endif
rdev
->
opencount
++
;
mutex_unlock
(
&
rdev
->
devlist_mtx
);
cfg80211_unlock_rdev
(
rdev
);
#endif
break
;
case
NETDEV_UNREGISTER
:
/*
...
...
net/wireless/reg.c
View file @
ff30b364
...
...
@@ -1690,7 +1690,7 @@ int regulatory_hint_user(const char *alpha2)
request
->
wiphy_idx
=
WIPHY_IDX_STALE
;
request
->
alpha2
[
0
]
=
alpha2
[
0
];
request
->
alpha2
[
1
]
=
alpha2
[
1
];
request
->
initiator
=
NL80211_REGDOM_SET_BY_USER
,
request
->
initiator
=
NL80211_REGDOM_SET_BY_USER
;
queue_regulatory_request
(
request
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment