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
nexedi
linux
Commits
ed4b2019
Commit
ed4b2019
authored
Dec 21, 2009
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
b7466560
92c6f8d8
Changes
31
Show whitespace changes
Inline
Side-by-side
Showing
31 changed files
with
160 additions
and
112 deletions
+160
-112
drivers/net/Kconfig
drivers/net/Kconfig
+2
-0
drivers/net/wireless/ath/ath9k/mac.c
drivers/net/wireless/ath/ath9k/mac.c
+1
-1
drivers/net/wireless/ath/ath9k/main.c
drivers/net/wireless/ath/ath9k/main.c
+6
-0
drivers/net/wireless/ath/ath9k/xmit.c
drivers/net/wireless/ath/ath9k/xmit.c
+17
-23
drivers/net/wireless/iwlwifi/iwl-3945.c
drivers/net/wireless/iwlwifi/iwl-3945.c
+3
-2
drivers/net/wireless/iwlwifi/iwl-4965.c
drivers/net/wireless/iwlwifi/iwl-4965.c
+1
-1
drivers/net/wireless/iwlwifi/iwl-5000-hw.h
drivers/net/wireless/iwlwifi/iwl-5000-hw.h
+9
-5
drivers/net/wireless/iwlwifi/iwl-5000.c
drivers/net/wireless/iwlwifi/iwl-5000.c
+4
-3
drivers/net/wireless/iwlwifi/iwl-agn.c
drivers/net/wireless/iwlwifi/iwl-agn.c
+3
-3
drivers/net/wireless/iwlwifi/iwl-csr.h
drivers/net/wireless/iwlwifi/iwl-csr.h
+3
-5
drivers/net/wireless/iwlwifi/iwl-dev.h
drivers/net/wireless/iwlwifi/iwl-dev.h
+12
-1
drivers/net/wireless/iwlwifi/iwl-eeprom.c
drivers/net/wireless/iwlwifi/iwl-eeprom.c
+16
-21
drivers/net/wireless/iwlwifi/iwl-eeprom.h
drivers/net/wireless/iwlwifi/iwl-eeprom.h
+2
-2
drivers/net/wireless/iwlwifi/iwl-hcmd.c
drivers/net/wireless/iwlwifi/iwl-hcmd.c
+1
-1
drivers/net/wireless/iwlwifi/iwl-rx.c
drivers/net/wireless/iwlwifi/iwl-rx.c
+2
-6
drivers/net/wireless/iwlwifi/iwl-scan.c
drivers/net/wireless/iwlwifi/iwl-scan.c
+1
-2
drivers/net/wireless/iwlwifi/iwl-sta.c
drivers/net/wireless/iwlwifi/iwl-sta.c
+2
-6
drivers/net/wireless/iwlwifi/iwl-tx.c
drivers/net/wireless/iwlwifi/iwl-tx.c
+2
-1
drivers/net/wireless/iwlwifi/iwl3945-base.c
drivers/net/wireless/iwlwifi/iwl3945-base.c
+14
-13
drivers/net/wireless/iwmc3200wifi/iwm.h
drivers/net/wireless/iwmc3200wifi/iwm.h
+1
-1
drivers/net/wireless/iwmc3200wifi/netdev.c
drivers/net/wireless/iwmc3200wifi/netdev.c
+1
-1
drivers/net/wireless/iwmc3200wifi/rx.c
drivers/net/wireless/iwmc3200wifi/rx.c
+1
-1
drivers/net/wireless/libertas/wext.c
drivers/net/wireless/libertas/wext.c
+0
-2
drivers/net/wireless/rt2x00/rt2800.h
drivers/net/wireless/rt2x00/rt2800.h
+1
-1
drivers/net/wireless/rt2x00/rt2800lib.c
drivers/net/wireless/rt2x00/rt2800lib.c
+11
-6
drivers/net/wireless/rt2x00/rt61pci.c
drivers/net/wireless/rt2x00/rt61pci.c
+5
-0
include/linux/ieee80211.h
include/linux/ieee80211.h
+1
-1
include/net/mac80211.h
include/net/mac80211.h
+6
-0
net/mac80211/ht.c
net/mac80211/ht.c
+22
-3
net/mac80211/main.c
net/mac80211/main.c
+2
-0
net/mac80211/mlme.c
net/mac80211/mlme.c
+8
-0
No files found.
drivers/net/Kconfig
View file @
ed4b2019
...
...
@@ -2344,6 +2344,7 @@ config GELIC_NET
config GELIC_WIRELESS
bool "PS3 Wireless support"
depends on WLAN
depends on GELIC_NET
select WIRELESS_EXT
help
...
...
@@ -2356,6 +2357,7 @@ config GELIC_WIRELESS
config GELIC_WIRELESS_OLD_PSK_INTERFACE
bool "PS3 Wireless private PSK interface (OBSOLETE)"
depends on GELIC_WIRELESS
select WEXT_PRIV
help
This option retains the obsolete private interface to pass
the PSK from user space programs to the driver. The PSK
...
...
drivers/net/wireless/ath/ath9k/mac.c
View file @
ed4b2019
...
...
@@ -186,7 +186,7 @@ bool ath9k_hw_stoptxdma(struct ath_hw *ah, u32 q)
wait
=
wait_time
;
while
(
ath9k_hw_numtxpending
(
ah
,
q
))
{
if
((
--
wait
)
==
0
)
{
ath_print
(
common
,
ATH_DBG_
QUEUE
,
ath_print
(
common
,
ATH_DBG_
FATAL
,
"Failed to stop TX DMA in 100 "
"msec after killing last frame
\n
"
);
break
;
...
...
drivers/net/wireless/ath/ath9k/main.c
View file @
ed4b2019
...
...
@@ -1973,6 +1973,9 @@ int ath_reset(struct ath_softc *sc, bool retry_tx)
struct
ieee80211_hw
*
hw
=
sc
->
hw
;
int
r
;
/* Stop ANI */
del_timer_sync
(
&
common
->
ani
.
timer
);
ath9k_hw_set_interrupts
(
ah
,
0
);
ath_drain_all_txq
(
sc
,
retry_tx
);
ath_stoprecv
(
sc
);
...
...
@@ -2014,6 +2017,9 @@ int ath_reset(struct ath_softc *sc, bool retry_tx)
}
}
/* Start ANI */
ath_start_ani
(
common
);
return
r
;
}
...
...
drivers/net/wireless/ath/ath9k/xmit.c
View file @
ed4b2019
...
...
@@ -1108,11 +1108,11 @@ void ath_drain_all_txq(struct ath_softc *sc, bool retry_tx)
if
(
npend
)
{
int
r
;
ath_print
(
common
,
ATH_DBG_
XMIT
,
ath_print
(
common
,
ATH_DBG_
FATAL
,
"Unable to stop TxDMA. Reset HAL!
\n
"
);
spin_lock_bh
(
&
sc
->
sc_resetlock
);
r
=
ath9k_hw_reset
(
ah
,
sc
->
sc_ah
->
curchan
,
tru
e
);
r
=
ath9k_hw_reset
(
ah
,
sc
->
sc_ah
->
curchan
,
fals
e
);
if
(
r
)
ath_print
(
common
,
ATH_DBG_FATAL
,
"Unable to reset hardware; reset status %d
\n
"
,
...
...
@@ -1414,17 +1414,9 @@ static void assign_aggr_tid_seqno(struct sk_buff *skb,
* For HT capable stations, we save tidno for later use.
* We also override seqno set by upper layer with the one
* in tx aggregation state.
*
* If fragmentation is on, the sequence number is
* not overridden, since it has been
* incremented by the fragmentation routine.
*
* FIXME: check if the fragmentation threshold exceeds
* IEEE80211 max.
*/
tid
=
ATH_AN_2_TID
(
an
,
bf
->
bf_tidno
);
hdr
->
seq_ctrl
=
cpu_to_le16
(
tid
->
seq_next
<<
IEEE80211_SEQ_SEQ_SHIFT
);
hdr
->
seq_ctrl
=
cpu_to_le16
(
tid
->
seq_next
<<
IEEE80211_SEQ_SEQ_SHIFT
);
bf
->
bf_seqno
=
tid
->
seq_next
;
INCR
(
tid
->
seq_next
,
IEEE80211_SEQ_MAX
);
}
...
...
@@ -1636,7 +1628,8 @@ static int ath_tx_setup_buffer(struct ieee80211_hw *hw, struct ath_buf *bf,
bf
->
bf_keyix
=
ATH9K_TXKEYIX_INVALID
;
}
if
(
ieee80211_is_data_qos
(
fc
)
&&
(
sc
->
sc_flags
&
SC_OP_TXAGGR
))
if
(
ieee80211_is_data_qos
(
fc
)
&&
bf_isht
(
bf
)
&&
(
sc
->
sc_flags
&
SC_OP_TXAGGR
))
assign_aggr_tid_seqno
(
skb
,
bf
);
bf
->
bf_mpdu
=
skb
;
...
...
@@ -1780,7 +1773,8 @@ void ath_tx_cabq(struct ieee80211_hw *hw, struct sk_buff *skb)
struct
ath_wiphy
*
aphy
=
hw
->
priv
;
struct
ath_softc
*
sc
=
aphy
->
sc
;
struct
ath_common
*
common
=
ath9k_hw_common
(
sc
->
sc_ah
);
int
hdrlen
,
padsize
;
struct
ieee80211_hdr
*
hdr
=
(
struct
ieee80211_hdr
*
)
skb
->
data
;
int
padpos
,
padsize
;
struct
ieee80211_tx_info
*
info
=
IEEE80211_SKB_CB
(
skb
);
struct
ath_tx_control
txctl
;
...
...
@@ -1792,7 +1786,6 @@ void ath_tx_cabq(struct ieee80211_hw *hw, struct sk_buff *skb)
* BSSes.
*/
if
(
info
->
flags
&
IEEE80211_TX_CTL_ASSIGN_SEQ
)
{
struct
ieee80211_hdr
*
hdr
=
(
struct
ieee80211_hdr
*
)
skb
->
data
;
if
(
info
->
flags
&
IEEE80211_TX_CTL_FIRST_FRAGMENT
)
sc
->
tx
.
seq_no
+=
0x10
;
hdr
->
seq_ctrl
&=
cpu_to_le16
(
IEEE80211_SCTL_FRAG
);
...
...
@@ -1800,9 +1793,9 @@ void ath_tx_cabq(struct ieee80211_hw *hw, struct sk_buff *skb)
}
/* Add the padding after the header if this is not already done */
hdrlen
=
ieee80211_get_hdrlen_from_skb
(
skb
);
if
(
hdrlen
&
3
)
{
padsize
=
hdrlen
%
4
;
padpos
=
ath9k_cmn_padpos
(
hdr
->
frame_control
);
padsize
=
padpos
&
3
;
if
(
padsize
&&
skb
->
len
>
padpos
)
{
if
(
skb_headroom
(
skb
)
<
padsize
)
{
ath_print
(
common
,
ATH_DBG_XMIT
,
"TX CABQ padding failed
\n
"
);
...
...
@@ -1810,7 +1803,7 @@ void ath_tx_cabq(struct ieee80211_hw *hw, struct sk_buff *skb)
return
;
}
skb_push
(
skb
,
padsize
);
memmove
(
skb
->
data
,
skb
->
data
+
padsize
,
hdrlen
);
memmove
(
skb
->
data
,
skb
->
data
+
padsize
,
padpos
);
}
txctl
.
txq
=
sc
->
beacon
.
cabq
;
...
...
@@ -1838,7 +1831,8 @@ static void ath_tx_complete(struct ath_softc *sc, struct sk_buff *skb,
struct
ieee80211_hw
*
hw
=
sc
->
hw
;
struct
ieee80211_tx_info
*
tx_info
=
IEEE80211_SKB_CB
(
skb
);
struct
ath_common
*
common
=
ath9k_hw_common
(
sc
->
sc_ah
);
int
hdrlen
,
padsize
;
struct
ieee80211_hdr
*
hdr
=
(
struct
ieee80211_hdr
*
)
skb
->
data
;
int
padpos
,
padsize
;
ath_print
(
common
,
ATH_DBG_XMIT
,
"TX complete: skb: %p
\n
"
,
skb
);
...
...
@@ -1853,14 +1847,14 @@ static void ath_tx_complete(struct ath_softc *sc, struct sk_buff *skb,
tx_info
->
flags
|=
IEEE80211_TX_STAT_ACK
;
}
hdrlen
=
ieee80211_get_hdrlen_from_skb
(
skb
);
padsize
=
hdrlen
&
3
;
if
(
padsize
&&
hdrlen
>=
24
)
{
padpos
=
ath9k_cmn_padpos
(
hdr
->
frame_control
);
padsize
=
padpos
&
3
;
if
(
padsize
&&
skb
->
len
>
padpos
+
padsize
)
{
/*
* Remove MAC header padding before giving the frame back to
* mac80211.
*/
memmove
(
skb
->
data
+
padsize
,
skb
->
data
,
hdrlen
);
memmove
(
skb
->
data
+
padsize
,
skb
->
data
,
padpos
);
skb_pull
(
skb
,
padsize
);
}
...
...
drivers/net/wireless/iwlwifi/iwl-3945.c
View file @
ed4b2019
...
...
@@ -1835,8 +1835,7 @@ static int iwl3945_send_rxon_assoc(struct iwl_priv *priv)
rc
=
-
EIO
;
}
priv
->
alloc_rxb_page
--
;
free_pages
(
cmd
.
reply_page
,
priv
->
hw_params
.
rx_page_order
);
iwl_free_pages
(
priv
,
cmd
.
reply_page
);
return
rc
;
}
...
...
@@ -2836,6 +2835,7 @@ static struct iwl_cfg iwl3945_bg_cfg = {
.
use_isr_legacy
=
true
,
.
ht_greenfield_support
=
false
,
.
led_compensation
=
64
,
.
broken_powersave
=
true
,
};
static
struct
iwl_cfg
iwl3945_abg_cfg
=
{
...
...
@@ -2852,6 +2852,7 @@ static struct iwl_cfg iwl3945_abg_cfg = {
.
use_isr_legacy
=
true
,
.
ht_greenfield_support
=
false
,
.
led_compensation
=
64
,
.
broken_powersave
=
true
,
};
struct
pci_device_id
iwl3945_hw_card_ids
[]
=
{
...
...
drivers/net/wireless/iwlwifi/iwl-4965.c
View file @
ed4b2019
...
...
@@ -1204,7 +1204,7 @@ static int iwl4965_fill_txpower_tbl(struct iwl_priv *priv, u8 band, u16 channel,
iwl4965_interpolate_chan
(
priv
,
channel
,
&
ch_eeprom_info
);
/* calculate tx gain adjustment based on power supply voltage */
voltage
=
priv
->
calib_info
->
voltage
;
voltage
=
le16_to_cpu
(
priv
->
calib_info
->
voltage
)
;
init_voltage
=
(
s32
)
le32_to_cpu
(
priv
->
card_alive_init
.
voltage
);
voltage_compensation
=
iwl4965_get_voltage_compensation
(
voltage
,
init_voltage
);
...
...
drivers/net/wireless/iwlwifi/iwl-5000-hw.h
View file @
ed4b2019
...
...
@@ -92,11 +92,15 @@
static
inline
s32
iwl_temp_calib_to_offset
(
struct
iwl_priv
*
priv
)
{
u16
*
temp_calib
=
(
u16
*
)
iwl_eeprom_query_addr
(
priv
,
EEPROM_5000_TEMPERATURE
);
/* offset = temperature - voltage / coef */
s32
offset
=
(
s32
)(
temp_calib
[
0
]
-
temp_calib
[
1
]
/
IWL_5150_VOLTAGE_TO_TEMPERATURE_COEFF
);
return
offset
;
u16
temperature
,
voltage
;
__le16
*
temp_calib
=
(
__le16
*
)
iwl_eeprom_query_addr
(
priv
,
EEPROM_5000_TEMPERATURE
);
temperature
=
le16_to_cpu
(
temp_calib
[
0
]);
voltage
=
le16_to_cpu
(
temp_calib
[
1
]);
/* offset = temp - volt / coeff */
return
(
s32
)(
temperature
-
voltage
/
IWL_5150_VOLTAGE_TO_TEMPERATURE_COEFF
);
}
/* Fixed (non-configurable) rx data from phy */
...
...
drivers/net/wireless/iwlwifi/iwl-5000.c
View file @
ed4b2019
...
...
@@ -333,14 +333,15 @@ static void iwl5000_set_ct_threshold(struct iwl_priv *priv)
static
int
iwl5000_set_Xtal_calib
(
struct
iwl_priv
*
priv
)
{
struct
iwl_calib_xtal_freq_cmd
cmd
;
u16
*
xtal_calib
=
(
u16
*
)
iwl_eeprom_query_addr
(
priv
,
EEPROM_5000_XTAL
);
__le16
*
xtal_calib
=
(
__le16
*
)
iwl_eeprom_query_addr
(
priv
,
EEPROM_5000_XTAL
);
cmd
.
hdr
.
op_code
=
IWL_PHY_CALIBRATE_CRYSTAL_FRQ_CMD
;
cmd
.
hdr
.
first_group
=
0
;
cmd
.
hdr
.
groups_num
=
1
;
cmd
.
hdr
.
data_valid
=
1
;
cmd
.
cap_pin1
=
(
u8
)
xtal_calib
[
0
]
;
cmd
.
cap_pin2
=
(
u8
)
xtal_calib
[
1
]
;
cmd
.
cap_pin1
=
le16_to_cpu
(
xtal_calib
[
0
])
;
cmd
.
cap_pin2
=
le16_to_cpu
(
xtal_calib
[
1
])
;
return
iwl_calib_set
(
&
priv
->
calib_results
[
IWL_CALIB_XTAL
],
(
u8
*
)
&
cmd
,
sizeof
(
cmd
));
}
...
...
drivers/net/wireless/iwlwifi/iwl-agn.c
View file @
ed4b2019
...
...
@@ -1842,7 +1842,7 @@ void iwl_dump_nic_event_log(struct iwl_priv *priv, bool full_log)
}
#ifdef CONFIG_IWLWIFI_DEBUG
if
(
!
(
iwl_get_debug_level
(
priv
)
&
IWL_DL_FW_ERRORS
))
if
(
!
(
iwl_get_debug_level
(
priv
)
&
IWL_DL_FW_ERRORS
)
&&
!
full_log
)
size
=
(
size
>
DEFAULT_DUMP_EVENT_LOG_ENTRIES
)
?
DEFAULT_DUMP_EVENT_LOG_ENTRIES
:
size
;
#else
...
...
@@ -3173,7 +3173,6 @@ static int iwl_init_drv(struct iwl_priv *priv)
priv
->
ibss_beacon
=
NULL
;
spin_lock_init
(
&
priv
->
lock
);
spin_lock_init
(
&
priv
->
sta_lock
);
spin_lock_init
(
&
priv
->
hcmd_lock
);
...
...
@@ -3361,10 +3360,11 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
(
unsigned
long
long
)
pci_resource_len
(
pdev
,
0
));
IWL_DEBUG_INFO
(
priv
,
"pci_resource_base = %p
\n
"
,
priv
->
hw_base
);
/* th
is spin lock
will be used in apm_ops.init and EEPROM access
/* th
ese spin locks
will be used in apm_ops.init and EEPROM access
* we should init now
*/
spin_lock_init
(
&
priv
->
reg_lock
);
spin_lock_init
(
&
priv
->
lock
);
iwl_hw_detect
(
priv
);
IWL_INFO
(
priv
,
"Detected Intel Wireless WiFi Link %s REV=0x%X
\n
"
,
priv
->
cfg
->
name
,
priv
->
hw_rev
);
...
...
drivers/net/wireless/iwlwifi/iwl-csr.h
View file @
ed4b2019
...
...
@@ -77,8 +77,7 @@
* The MAC (uCode processor, etc.) does not need to be powered up for accessing
* the CSR registers.
*
* NOTE: Newer devices using one-time-programmable (OTP) memory
* require device to be awake in order to read this memory
* NOTE: Device does need to be awake in order to read this memory
* via CSR_EEPROM and CSR_OTP registers
*/
#define CSR_BASE (0x000)
...
...
@@ -111,9 +110,8 @@
/*
* EEPROM and OTP (one-time-programmable) memory reads
*
* NOTE: For (newer) devices using OTP, device must be awake, initialized via
* apm_ops.init() in order to read. Older devices (3945/4965/5000)
* use EEPROM and do not require this.
* NOTE: Device must be awake, initialized via apm_ops.init(),
* in order to read.
*/
#define CSR_EEPROM_REG (CSR_BASE+0x02c)
#define CSR_EEPROM_GP (CSR_BASE+0x030)
...
...
drivers/net/wireless/iwlwifi/iwl-dev.h
View file @
ed4b2019
...
...
@@ -1168,7 +1168,7 @@ struct iwl_priv {
u32
last_beacon_time
;
u64
last_tsf
;
/* eeprom */
/* eeprom
-- this is in the card's little endian byte order
*/
u8
*
eeprom
;
int
nvm_device_type
;
struct
iwl_eeprom_calib_info
*
calib_info
;
...
...
@@ -1353,4 +1353,15 @@ static inline int is_channel_ibss(const struct iwl_channel_info *ch)
return
((
ch
->
flags
&
EEPROM_CHANNEL_IBSS
))
?
1
:
0
;
}
static
inline
void
__iwl_free_pages
(
struct
iwl_priv
*
priv
,
struct
page
*
page
)
{
__free_pages
(
page
,
priv
->
hw_params
.
rx_page_order
);
priv
->
alloc_rxb_page
--
;
}
static
inline
void
iwl_free_pages
(
struct
iwl_priv
*
priv
,
unsigned
long
page
)
{
free_pages
(
page
,
priv
->
hw_params
.
rx_page_order
);
priv
->
alloc_rxb_page
--
;
}
#endif
/* __iwl_dev_h__ */
drivers/net/wireless/iwlwifi/iwl-eeprom.c
View file @
ed4b2019
...
...
@@ -370,7 +370,7 @@ static int iwl_init_otp_access(struct iwl_priv *priv)
return
ret
;
}
static
int
iwl_read_otp_word
(
struct
iwl_priv
*
priv
,
u16
addr
,
u
16
*
eeprom_data
)
static
int
iwl_read_otp_word
(
struct
iwl_priv
*
priv
,
u16
addr
,
__le
16
*
eeprom_data
)
{
int
ret
=
0
;
u32
r
;
...
...
@@ -404,7 +404,7 @@ static int iwl_read_otp_word(struct iwl_priv *priv, u16 addr, u16 *eeprom_data)
CSR_OTP_GP_REG_ECC_CORR_STATUS_MSK
);
IWL_ERR
(
priv
,
"Correctable OTP ECC error, continue read
\n
"
);
}
*
eeprom_data
=
le16_to_cpu
((
__force
__le16
)(
r
>>
16
)
);
*
eeprom_data
=
cpu_to_le16
(
r
>>
16
);
return
0
;
}
...
...
@@ -413,7 +413,8 @@ static int iwl_read_otp_word(struct iwl_priv *priv, u16 addr, u16 *eeprom_data)
*/
static
bool
iwl_is_otp_empty
(
struct
iwl_priv
*
priv
)
{
u16
next_link_addr
=
0
,
link_value
;
u16
next_link_addr
=
0
;
__le16
link_value
;
bool
is_empty
=
false
;
/* locate the beginning of OTP link list */
...
...
@@ -443,7 +444,8 @@ static bool iwl_is_otp_empty(struct iwl_priv *priv)
static
int
iwl_find_otp_image
(
struct
iwl_priv
*
priv
,
u16
*
validblockaddr
)
{
u16
next_link_addr
=
0
,
link_value
=
0
,
valid_addr
;
u16
next_link_addr
=
0
,
valid_addr
;
__le16
link_value
=
0
;
int
usedblocks
=
0
;
/* set addressing mode to absolute to traverse the link list */
...
...
@@ -463,7 +465,7 @@ static int iwl_find_otp_image(struct iwl_priv *priv,
* check for more block on the link list
*/
valid_addr
=
next_link_addr
;
next_link_addr
=
l
ink_value
*
sizeof
(
u16
);
next_link_addr
=
l
e16_to_cpu
(
link_value
)
*
sizeof
(
u16
);
IWL_DEBUG_INFO
(
priv
,
"OTP blocks %d addr 0x%x
\n
"
,
usedblocks
,
next_link_addr
);
if
(
iwl_read_otp_word
(
priv
,
next_link_addr
,
&
link_value
))
...
...
@@ -497,7 +499,7 @@ static int iwl_find_otp_image(struct iwl_priv *priv,
*/
int
iwl_eeprom_init
(
struct
iwl_priv
*
priv
)
{
u
16
*
e
;
__le
16
*
e
;
u32
gp
=
iwl_read32
(
priv
,
CSR_EEPROM_GP
);
int
sz
;
int
ret
;
...
...
@@ -516,12 +518,9 @@ int iwl_eeprom_init(struct iwl_priv *priv)
ret
=
-
ENOMEM
;
goto
alloc_err
;
}
e
=
(
u
16
*
)
priv
->
eeprom
;
e
=
(
__le
16
*
)
priv
->
eeprom
;
if
(
priv
->
nvm_device_type
==
NVM_DEVICE_TYPE_OTP
)
{
/* OTP reads require powered-up chip */
priv
->
cfg
->
ops
->
lib
->
apm_ops
.
init
(
priv
);
}
ret
=
priv
->
cfg
->
ops
->
lib
->
eeprom_ops
.
verify_signature
(
priv
);
if
(
ret
<
0
)
{
...
...
@@ -562,7 +561,7 @@ int iwl_eeprom_init(struct iwl_priv *priv)
}
for
(
addr
=
validblockaddr
;
addr
<
validblockaddr
+
sz
;
addr
+=
sizeof
(
u16
))
{
u
16
eeprom_data
;
__le
16
eeprom_data
;
ret
=
iwl_read_otp_word
(
priv
,
addr
,
&
eeprom_data
);
if
(
ret
)
...
...
@@ -570,13 +569,6 @@ int iwl_eeprom_init(struct iwl_priv *priv)
e
[
cache_addr
/
2
]
=
eeprom_data
;
cache_addr
+=
sizeof
(
u16
);
}
/*
* Now that OTP reads are complete, reset chip to save
* power until we load uCode during "up".
*/
priv
->
cfg
->
ops
->
lib
->
apm_ops
.
stop
(
priv
);
}
else
{
/* eeprom is an array of 16bit values */
for
(
addr
=
0
;
addr
<
sz
;
addr
+=
sizeof
(
u16
))
{
...
...
@@ -594,7 +586,7 @@ int iwl_eeprom_init(struct iwl_priv *priv)
goto
done
;
}
r
=
_iwl_read_direct32
(
priv
,
CSR_EEPROM_REG
);
e
[
addr
/
2
]
=
le16_to_cpu
((
__force
__le16
)(
r
>>
16
)
);
e
[
addr
/
2
]
=
cpu_to_le16
(
r
>>
16
);
}
}
ret
=
0
;
...
...
@@ -603,6 +595,8 @@ int iwl_eeprom_init(struct iwl_priv *priv)
err:
if
(
ret
)
iwl_eeprom_free
(
priv
);
/* Reset chip to save power until we load uCode during "up". */
priv
->
cfg
->
ops
->
lib
->
apm_ops
.
stop
(
priv
);
alloc_err:
return
ret
;
}
...
...
@@ -755,6 +749,7 @@ static int iwl_mod_ht40_chan_info(struct iwl_priv *priv,
ch_info
->
ht40_eeprom
=
*
eeprom_ch
;
ch_info
->
ht40_max_power_avg
=
eeprom_ch
->
max_power_avg
;
ch_info
->
ht40_flags
=
eeprom_ch
->
flags
;
if
(
eeprom_ch
->
flags
&
EEPROM_CHANNEL_VALID
)
ch_info
->
ht40_extension_channel
&=
~
clear_ht40_extension_channel
;
return
0
;
...
...
drivers/net/wireless/iwlwifi/iwl-eeprom.h
View file @
ed4b2019
...
...
@@ -137,7 +137,7 @@ struct iwl_eeprom_channel {
*
*/
struct
iwl_eeprom_enhanced_txpwr
{
u
16
common
;
__le
16
common
;
s8
chain_a_max
;
s8
chain_b_max
;
s8
chain_c_max
;
...
...
@@ -360,7 +360,7 @@ struct iwl_eeprom_calib_subband_info {
struct
iwl_eeprom_calib_info
{
u8
saturation_power24
;
/* half-dBm (e.g. "34" = 17 dBm) */
u8
saturation_power52
;
/* half-dBm */
s
16
voltage
;
/* signed */
__le
16
voltage
;
/* signed */
struct
iwl_eeprom_calib_subband_info
band_info
[
EEPROM_TX_POWER_BANDS
];
}
__attribute__
((
packed
));
...
...
drivers/net/wireless/iwlwifi/iwl-hcmd.c
View file @
ed4b2019
...
...
@@ -234,7 +234,7 @@ int iwl_send_cmd_sync(struct iwl_priv *priv, struct iwl_host_cmd *cmd)
}
fail:
if
(
cmd
->
reply_page
)
{
free_pages
(
cmd
->
reply_page
,
priv
->
hw_params
.
rx_page_order
);
iwl_free_pages
(
priv
,
cmd
->
reply_page
);
cmd
->
reply_page
=
0
;
}
out:
...
...
drivers/net/wireless/iwlwifi/iwl-rx.c
View file @
ed4b2019
...
...
@@ -345,10 +345,8 @@ void iwl_rx_queue_free(struct iwl_priv *priv, struct iwl_rx_queue *rxq)
pci_unmap_page
(
priv
->
pci_dev
,
rxq
->
pool
[
i
].
page_dma
,
PAGE_SIZE
<<
priv
->
hw_params
.
rx_page_order
,
PCI_DMA_FROMDEVICE
);
__free_pages
(
rxq
->
pool
[
i
].
page
,
priv
->
hw_params
.
rx_page_order
);
__iwl_free_pages
(
priv
,
rxq
->
pool
[
i
].
page
);
rxq
->
pool
[
i
].
page
=
NULL
;
priv
->
alloc_rxb_page
--
;
}
}
...
...
@@ -416,9 +414,7 @@ void iwl_rx_queue_reset(struct iwl_priv *priv, struct iwl_rx_queue *rxq)
pci_unmap_page
(
priv
->
pci_dev
,
rxq
->
pool
[
i
].
page_dma
,
PAGE_SIZE
<<
priv
->
hw_params
.
rx_page_order
,
PCI_DMA_FROMDEVICE
);
priv
->
alloc_rxb_page
--
;
__free_pages
(
rxq
->
pool
[
i
].
page
,
priv
->
hw_params
.
rx_page_order
);
__iwl_free_pages
(
priv
,
rxq
->
pool
[
i
].
page
);
rxq
->
pool
[
i
].
page
=
NULL
;
}
list_add_tail
(
&
rxq
->
pool
[
i
].
list
,
&
rxq
->
rx_used
);
...
...
drivers/net/wireless/iwlwifi/iwl-scan.c
View file @
ed4b2019
...
...
@@ -144,8 +144,7 @@ static int iwl_send_scan_abort(struct iwl_priv *priv)
clear_bit
(
STATUS_SCAN_HW
,
&
priv
->
status
);
}
priv
->
alloc_rxb_page
--
;
free_pages
(
cmd
.
reply_page
,
priv
->
hw_params
.
rx_page_order
);
iwl_free_pages
(
priv
,
cmd
.
reply_page
);
return
ret
;
}
...
...
drivers/net/wireless/iwlwifi/iwl-sta.c
View file @
ed4b2019
...
...
@@ -164,9 +164,7 @@ int iwl_send_add_sta(struct iwl_priv *priv,
break
;
}
}
priv
->
alloc_rxb_page
--
;
free_pages
(
cmd
.
reply_page
,
priv
->
hw_params
.
rx_page_order
);
iwl_free_pages
(
priv
,
cmd
.
reply_page
);
return
ret
;
}
...
...
@@ -391,9 +389,7 @@ static int iwl_send_remove_station(struct iwl_priv *priv, const u8 *addr,
break
;
}
}
priv
->
alloc_rxb_page
--
;
free_pages
(
cmd
.
reply_page
,
priv
->
hw_params
.
rx_page_order
);
iwl_free_pages
(
priv
,
cmd
.
reply_page
);
return
ret
;
}
...
...
drivers/net/wireless/iwlwifi/iwl-tx.c
View file @
ed4b2019
...
...
@@ -407,13 +407,14 @@ void iwl_hw_txq_ctx_free(struct iwl_priv *priv)
int
txq_id
;
/* Tx queues */
if
(
priv
->
txq
)
if
(
priv
->
txq
)
{
for
(
txq_id
=
0
;
txq_id
<
priv
->
hw_params
.
max_txq_num
;
txq_id
++
)
if
(
txq_id
==
IWL_CMD_QUEUE_NUM
)
iwl_cmd_queue_free
(
priv
);
else
iwl_tx_queue_free
(
priv
,
txq_id
);
}
iwl_free_dma_ptr
(
priv
,
&
priv
->
kw
);
iwl_free_dma_ptr
(
priv
,
&
priv
->
scd_bc_tbls
);
...
...
drivers/net/wireless/iwlwifi/iwl3945-base.c
View file @
ed4b2019
...
...
@@ -548,6 +548,9 @@ static int iwl3945_tx_skb(struct iwl_priv *priv, struct sk_buff *skb)
txq
=
&
priv
->
txq
[
txq_id
];
q
=
&
txq
->
q
;
if
((
iwl_queue_space
(
q
)
<
q
->
high_mark
))
goto
drop
;
spin_lock_irqsave
(
&
priv
->
lock
,
flags
);
idx
=
get_cmd_index
(
q
,
q
->
write_ptr
,
0
);
...
...
@@ -812,7 +815,7 @@ static int iwl3945_get_measurement(struct iwl_priv *priv,
break
;
}
free_pages
(
cmd
.
reply_page
,
priv
->
hw_params
.
rx_page_order
);
iwl_free_pages
(
priv
,
cmd
.
reply_page
);
return
rc
;
}
...
...
@@ -1198,9 +1201,7 @@ void iwl3945_rx_queue_reset(struct iwl_priv *priv, struct iwl_rx_queue *rxq)
pci_unmap_page
(
priv
->
pci_dev
,
rxq
->
pool
[
i
].
page_dma
,
PAGE_SIZE
<<
priv
->
hw_params
.
rx_page_order
,
PCI_DMA_FROMDEVICE
);
priv
->
alloc_rxb_page
--
;
__free_pages
(
rxq
->
pool
[
i
].
page
,
priv
->
hw_params
.
rx_page_order
);
__iwl_free_pages
(
priv
,
rxq
->
pool
[
i
].
page
);
rxq
->
pool
[
i
].
page
=
NULL
;
}
list_add_tail
(
&
rxq
->
pool
[
i
].
list
,
&
rxq
->
rx_used
);
...
...
@@ -1247,10 +1248,8 @@ static void iwl3945_rx_queue_free(struct iwl_priv *priv, struct iwl_rx_queue *rx
pci_unmap_page
(
priv
->
pci_dev
,
rxq
->
pool
[
i
].
page_dma
,
PAGE_SIZE
<<
priv
->
hw_params
.
rx_page_order
,
PCI_DMA_FROMDEVICE
);
__free_pages
(
rxq
->
pool
[
i
].
page
,
priv
->
hw_params
.
rx_page_order
);
__iwl_free_pages
(
priv
,
rxq
->
pool
[
i
].
page
);
rxq
->
pool
[
i
].
page
=
NULL
;
priv
->
alloc_rxb_page
--
;
}
}
...
...
@@ -1688,7 +1687,7 @@ void iwl3945_dump_nic_event_log(struct iwl_priv *priv, bool full_log)
}
#ifdef CONFIG_IWLWIFI_DEBUG
if
(
!
(
iwl_get_debug_level
(
priv
)
&
IWL_DL_FW_ERRORS
))
if
(
!
(
iwl_get_debug_level
(
priv
)
&
IWL_DL_FW_ERRORS
)
&&
!
full_log
)
size
=
(
size
>
DEFAULT_IWL3945_DUMP_EVENT_LOG_ENTRIES
)
?
DEFAULT_IWL3945_DUMP_EVENT_LOG_ENTRIES
:
size
;
#else
...
...
@@ -3867,7 +3866,6 @@ static int iwl3945_init_drv(struct iwl_priv *priv)
priv
->
retry_rate
=
1
;
priv
->
ibss_beacon
=
NULL
;
spin_lock_init
(
&
priv
->
lock
);
spin_lock_init
(
&
priv
->
sta_lock
);
spin_lock_init
(
&
priv
->
hcmd_lock
);
...
...
@@ -3936,8 +3934,10 @@ static int iwl3945_setup_mac(struct iwl_priv *priv)
/* Tell mac80211 our characteristics */
hw
->
flags
=
IEEE80211_HW_SIGNAL_DBM
|
IEEE80211_HW_NOISE_DBM
|
IEEE80211_HW_SPECTRUM_MGMT
|
IEEE80211_HW_SUPPORTS_PS
|
IEEE80211_HW_SPECTRUM_MGMT
;
if
(
!
priv
->
cfg
->
broken_powersave
)
hw
->
flags
|=
IEEE80211_HW_SUPPORTS_PS
|
IEEE80211_HW_SUPPORTS_DYNAMIC_PS
;
hw
->
wiphy
->
interface_modes
=
...
...
@@ -4057,10 +4057,11 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e
* PCI Tx retries from interfering with C3 CPU state */
pci_write_config_byte
(
pdev
,
0x41
,
0x00
);
/* th
is spin lock
will be used in apm_ops.init and EEPROM access
/* th
ese spin locks
will be used in apm_ops.init and EEPROM access
* we should init now
*/
spin_lock_init
(
&
priv
->
reg_lock
);
spin_lock_init
(
&
priv
->
lock
);
/***********************
* 4. Read EEPROM
...
...
drivers/net/wireless/iwmc3200wifi/iwm.h
View file @
ed4b2019
...
...
@@ -349,7 +349,7 @@ int iwm_up(struct iwm_priv *iwm);
int
iwm_down
(
struct
iwm_priv
*
iwm
);
/* TX API */
u16
iwm_tid_to_queue
(
u16
tid
);
int
iwm_tid_to_queue
(
u16
tid
);
void
iwm_tx_credit_inc
(
struct
iwm_priv
*
iwm
,
int
id
,
int
total_freed_pages
);
void
iwm_tx_worker
(
struct
work_struct
*
work
);
int
iwm_xmit_frame
(
struct
sk_buff
*
skb
,
struct
net_device
*
netdev
);
...
...
drivers/net/wireless/iwmc3200wifi/netdev.c
View file @
ed4b2019
...
...
@@ -76,7 +76,7 @@ static int iwm_stop(struct net_device *ndev)
*/
static
const
u16
iwm_1d_to_queue
[
8
]
=
{
1
,
0
,
0
,
1
,
2
,
2
,
3
,
3
};
u16
iwm_tid_to_queue
(
u16
tid
)
int
iwm_tid_to_queue
(
u16
tid
)
{
if
(
tid
>
IWM_UMAC_TID_NR
-
2
)
return
-
EINVAL
;
...
...
drivers/net/wireless/iwmc3200wifi/rx.c
View file @
ed4b2019
...
...
@@ -1126,7 +1126,7 @@ static int iwm_ntf_stop_resume_tx(struct iwm_priv *iwm, u8 *buf,
if
(
!
stop
)
{
struct
iwm_tx_queue
*
txq
;
u16
queue
=
iwm_tid_to_queue
(
bit
);
int
queue
=
iwm_tid_to_queue
(
bit
);
if
(
queue
<
0
)
continue
;
...
...
drivers/net/wireless/libertas/wext.c
View file @
ed4b2019
...
...
@@ -2025,10 +2025,8 @@ static int lbs_get_essid(struct net_device *dev, struct iw_request_info *info,
if
(
priv
->
connect_status
==
LBS_CONNECTED
)
{
memcpy
(
extra
,
priv
->
curbssparams
.
ssid
,
priv
->
curbssparams
.
ssid_len
);
extra
[
priv
->
curbssparams
.
ssid_len
]
=
'\0'
;
}
else
{
memset
(
extra
,
0
,
32
);
extra
[
priv
->
curbssparams
.
ssid_len
]
=
'\0'
;
}
/*
* If none, we may want to get the one that was set
...
...
drivers/net/wireless/rt2x00/rt2800.h
View file @
ed4b2019
...
...
@@ -1323,7 +1323,7 @@
#define PAIRWISE_KEY_ENTRY(__idx) \
( PAIRWISE_KEY_TABLE_BASE + ((__idx) * sizeof(struct hw_key_entry)) )
#define MAC_IVEIV_ENTRY(__idx) \
( MAC_IVEIV_TABLE_BASE + ((__idx)
&
sizeof(struct mac_iveiv_entry)) )
( MAC_IVEIV_TABLE_BASE + ((__idx)
*
sizeof(struct mac_iveiv_entry)) )
#define MAC_WCID_ATTR_ENTRY(__idx) \
( MAC_WCID_ATTRIBUTE_BASE + ((__idx) * sizeof(u32)) )
#define SHARED_KEY_ENTRY(__idx) \
...
...
drivers/net/wireless/rt2x00/rt2800lib.c
View file @
ed4b2019
...
...
@@ -37,7 +37,7 @@
#include <linux/module.h>
#include "rt2x00.h"
#if
def CONFIG_RT2800USB
#if
defined(CONFIG_RT2800USB) || defined(CONFIG_RT2800USB_MODULE)
#include "rt2x00usb.h"
#endif
#include "rt2800lib.h"
...
...
@@ -1121,7 +1121,7 @@ int rt2800_init_registers(struct rt2x00_dev *rt2x00dev)
if
(
rt2x00_intf_is_usb
(
rt2x00dev
))
{
rt2800_register_write
(
rt2x00dev
,
USB_DMA_CFG
,
0x00000000
);
#if
def CONFIG_RT2800USB
#if
defined(CONFIG_RT2800USB) || defined(CONFIG_RT2800USB_MODULE)
rt2x00usb_vendor_request_sw
(
rt2x00dev
,
USB_DEVICE_MODE
,
0
,
USB_MODE_RESET
,
REGISTER_TIMEOUT
);
#endif
...
...
@@ -2021,6 +2021,12 @@ int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
unsigned
int
i
;
u16
eeprom
;
/*
* Disable powersaving as default on PCI devices.
*/
if
(
rt2x00_intf_is_pci
(
rt2x00dev
))
rt2x00dev
->
hw
->
wiphy
->
flags
&=
~
WIPHY_FLAG_PS_ON_BY_DEFAULT
;
/*
* Initialize all hw fields.
*/
...
...
@@ -2074,8 +2080,7 @@ int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
IEEE80211_HT_CAP_SGI_20
|
IEEE80211_HT_CAP_SGI_40
|
IEEE80211_HT_CAP_TX_STBC
|
IEEE80211_HT_CAP_RX_STBC
|
IEEE80211_HT_CAP_PSMP_SUPPORT
;
IEEE80211_HT_CAP_RX_STBC
;
spec
->
ht
.
ampdu_factor
=
3
;
spec
->
ht
.
ampdu_density
=
4
;
spec
->
ht
.
mcs
.
tx_params
=
...
...
@@ -2140,8 +2145,8 @@ static void rt2800_get_tkip_seq(struct ieee80211_hw *hw, u8 hw_key_idx,
rt2800_register_multiread
(
rt2x00dev
,
offset
,
&
iveiv_entry
,
sizeof
(
iveiv_entry
));
memcpy
(
&
iveiv_entry
.
iv
[
0
],
iv16
,
sizeof
(
iv16
));
memcpy
(
&
iveiv_entry
.
iv
[
4
],
iv32
,
sizeof
(
iv32
));
memcpy
(
iv16
,
&
iveiv_entry
.
iv
[
0
],
sizeof
(
*
iv16
));
memcpy
(
iv32
,
&
iveiv_entry
.
iv
[
4
],
sizeof
(
*
iv32
));
}
static
int
rt2800_set_rts_threshold
(
struct
ieee80211_hw
*
hw
,
u32
value
)
...
...
drivers/net/wireless/rt2x00/rt61pci.c
View file @
ed4b2019
...
...
@@ -2538,6 +2538,11 @@ static int rt61pci_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
char
*
tx_power
;
unsigned
int
i
;
/*
* Disable powersaving as default.
*/
rt2x00dev
->
hw
->
wiphy
->
flags
&=
~
WIPHY_FLAG_PS_ON_BY_DEFAULT
;
/*
* Initialize all hw fields.
*/
...
...
include/linux/ieee80211.h
View file @
ed4b2019
...
...
@@ -832,7 +832,7 @@ struct ieee80211_ht_cap {
#define IEEE80211_HT_CAP_DELAY_BA 0x0400
#define IEEE80211_HT_CAP_MAX_AMSDU 0x0800
#define IEEE80211_HT_CAP_DSSSCCK40 0x1000
#define IEEE80211_HT_CAP_
PSMP_SUPPORT
0x2000
#define IEEE80211_HT_CAP_
RESERVED
0x2000
#define IEEE80211_HT_CAP_40MHZ_INTOLERANT 0x4000
#define IEEE80211_HT_CAP_LSIG_TXOP_PROT 0x8000
...
...
include/net/mac80211.h
View file @
ed4b2019
...
...
@@ -1737,6 +1737,12 @@ static inline void ieee80211_rx_ni(struct ieee80211_hw *hw,
local_bh_enable
();
}
/*
* The TX headroom reserved by mac80211 for its own tx_status functions.
* This is enough for the radiotap header.
*/
#define IEEE80211_TX_STATUS_HEADROOM 13
/**
* ieee80211_tx_status - transmit status callback
*
...
...
net/mac80211/ht.c
View file @
ed4b2019
...
...
@@ -34,9 +34,28 @@ void ieee80211_ht_cap_ie_to_sta_ht_cap(struct ieee80211_supported_band *sband,
ht_cap
->
ht_supported
=
true
;
ht_cap
->
cap
=
le16_to_cpu
(
ht_cap_ie
->
cap_info
)
&
sband
->
ht_cap
.
cap
;
ht_cap
->
cap
&=
~
IEEE80211_HT_CAP_SM_PS
;
ht_cap
->
cap
|=
sband
->
ht_cap
.
cap
&
IEEE80211_HT_CAP_SM_PS
;
/*
* The bits listed in this expression should be
* the same for the peer and us, if the station
* advertises more then we can't use those thus
* we mask them out.
*/
ht_cap
->
cap
=
le16_to_cpu
(
ht_cap_ie
->
cap_info
)
&
(
sband
->
ht_cap
.
cap
|
~
(
IEEE80211_HT_CAP_LDPC_CODING
|
IEEE80211_HT_CAP_SUP_WIDTH_20_40
|
IEEE80211_HT_CAP_GRN_FLD
|
IEEE80211_HT_CAP_SGI_20
|
IEEE80211_HT_CAP_SGI_40
|
IEEE80211_HT_CAP_DSSSCCK40
));
/*
* The STBC bits are asymmetric -- if we don't have
* TX then mask out the peer's RX and vice versa.
*/
if
(
!
(
sband
->
ht_cap
.
cap
&
IEEE80211_HT_CAP_TX_STBC
))
ht_cap
->
cap
&=
~
IEEE80211_HT_CAP_RX_STBC
;
if
(
!
(
sband
->
ht_cap
.
cap
&
IEEE80211_HT_CAP_RX_STBC
))
ht_cap
->
cap
&=
~
IEEE80211_HT_CAP_TX_STBC
;
ampdu_info
=
ht_cap_ie
->
ampdu_params_info
;
ht_cap
->
ampdu_factor
=
...
...
net/mac80211/main.c
View file @
ed4b2019
...
...
@@ -515,6 +515,8 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
* and we need some headroom for passing the frame to monitor
* interfaces, but never both at the same time.
*/
BUILD_BUG_ON
(
IEEE80211_TX_STATUS_HEADROOM
!=
sizeof
(
struct
ieee80211_tx_status_rtap_hdr
));
local
->
tx_headroom
=
max_t
(
unsigned
int
,
local
->
hw
.
extra_tx_headroom
,
sizeof
(
struct
ieee80211_tx_status_rtap_hdr
));
...
...
net/mac80211/mlme.c
View file @
ed4b2019
...
...
@@ -915,6 +915,14 @@ static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata,
sdata
->
u
.
mgd
.
flags
&=
~
(
IEEE80211_STA_CONNECTION_POLL
|
IEEE80211_STA_BEACON_POLL
);
/*
* Always handle WMM once after association regardless
* of the first value the AP uses. Setting -1 here has
* that effect because the AP values is an unsigned
* 4-bit value.
*/
sdata
->
u
.
mgd
.
wmm_last_param_set
=
-
1
;
ieee80211_led_assoc
(
local
,
1
);
sdata
->
vif
.
bss_conf
.
assoc
=
1
;
...
...
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