Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-davinci
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
linux
linux-davinci
Commits
56e9c0a6
Commit
56e9c0a6
authored
Sep 03, 2008
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
6c00055a
9aab3e3e
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
97 additions
and
61 deletions
+97
-61
drivers/net/wireless/ath9k/main.c
drivers/net/wireless/ath9k/main.c
+10
-2
drivers/net/wireless/ath9k/xmit.c
drivers/net/wireless/ath9k/xmit.c
+2
-2
drivers/net/wireless/iwlwifi/iwl-agn-rs.c
drivers/net/wireless/iwlwifi/iwl-agn-rs.c
+2
-1
drivers/net/wireless/iwlwifi/iwl-agn.c
drivers/net/wireless/iwlwifi/iwl-agn.c
+15
-12
drivers/net/wireless/iwlwifi/iwl-core.c
drivers/net/wireless/iwlwifi/iwl-core.c
+46
-31
drivers/net/wireless/iwlwifi/iwl-dev.h
drivers/net/wireless/iwlwifi/iwl-dev.h
+0
-1
drivers/net/wireless/iwlwifi/iwl-rx.c
drivers/net/wireless/iwlwifi/iwl-rx.c
+4
-1
drivers/net/wireless/iwlwifi/iwl-scan.c
drivers/net/wireless/iwlwifi/iwl-scan.c
+1
-1
drivers/net/wireless/iwlwifi/iwl-tx.c
drivers/net/wireless/iwlwifi/iwl-tx.c
+17
-10
No files found.
drivers/net/wireless/ath9k/main.c
View file @
56e9c0a6
...
...
@@ -1067,8 +1067,16 @@ void ath_tx_complete(struct ath_softc *sc, struct sk_buff *skb,
tx_info
->
flags
|=
IEEE80211_TX_STAT_AMPDU_NO_BACK
;
tx_status
->
flags
&=
~
ATH_TX_BAR
;
}
if
(
tx_status
->
flags
)
tx_info
->
status
.
excessive_retries
=
1
;
if
(
tx_status
->
flags
&
(
ATH_TX_ERROR
|
ATH_TX_XRETRY
))
{
if
(
!
(
tx_info
->
flags
&
IEEE80211_TX_CTL_NO_ACK
))
{
/* Frame was not ACKed, but an ACK was expected */
tx_info
->
status
.
excessive_retries
=
1
;
}
}
else
{
/* Frame was ACKed */
tx_info
->
flags
|=
IEEE80211_TX_STAT_ACK
;
}
tx_info
->
status
.
retry_count
=
tx_status
->
retries
;
...
...
drivers/net/wireless/ath9k/xmit.c
View file @
56e9c0a6
...
...
@@ -357,9 +357,9 @@ static int ath_tx_prepare(struct ath_softc *sc,
txctl
->
flags
=
ATH9K_TXDESC_CLRDMASK
;
/* needed for crypto errors */
if
(
tx_info
->
flags
&
IEEE80211_TX_CTL_NO_ACK
)
tx
_info
->
flags
|=
ATH9K_TXDESC_NOACK
;
tx
ctl
->
flags
|=
ATH9K_TXDESC_NOACK
;
if
(
tx_info
->
flags
&
IEEE80211_TX_CTL_USE_RTS_CTS
)
tx
_info
->
flags
|=
ATH9K_TXDESC_RTSENA
;
tx
ctl
->
flags
|=
ATH9K_TXDESC_RTSENA
;
/*
* Setup for rate calculations.
...
...
drivers/net/wireless/iwlwifi/iwl-agn-rs.c
View file @
56e9c0a6
...
...
@@ -1153,7 +1153,8 @@ static int rs_switch_to_mimo2(struct iwl_priv *priv,
!
sta
->
ht_info
.
ht_supported
)
return
-
1
;
if
(
priv
->
current_ht_config
.
tx_mimo_ps_mode
==
IWL_MIMO_PS_STATIC
)
if
(((
sta
->
ht_info
.
cap
&
IEEE80211_HT_CAP_MIMO_PS
)
>>
2
)
==
IWL_MIMO_PS_STATIC
)
return
-
1
;
/* Need both Tx chains/antennas to support MIMO */
...
...
drivers/net/wireless/iwlwifi/iwl-agn.c
View file @
56e9c0a6
...
...
@@ -181,14 +181,14 @@ static int iwl4965_check_rxon_cmd(struct iwl_rxon_cmd *rxon)
}
/**
* iwl
4965
_full_rxon_required - check if full RXON (vs RXON_ASSOC) cmd is needed
* iwl_full_rxon_required - check if full RXON (vs RXON_ASSOC) cmd is needed
* @priv: staging_rxon is compared to active_rxon
*
* If the RXON structure is changing enough to require a new tune,
* or is clearing the RXON_FILTER_ASSOC_MSK, then return 1 to indicate that
* a new tune (full RXON command, rather than RXON_ASSOC cmd) is required.
*/
static
int
iwl
4965
_full_rxon_required
(
struct
iwl_priv
*
priv
)
static
int
iwl_full_rxon_required
(
struct
iwl_priv
*
priv
)
{
/* These items are only settable from the full RXON command */
...
...
@@ -207,7 +207,6 @@ static int iwl4965_full_rxon_required(struct iwl_priv *priv)
priv
->
active_rxon
.
ofdm_ht_single_stream_basic_rates
)
||
(
priv
->
staging_rxon
.
ofdm_ht_dual_stream_basic_rates
!=
priv
->
active_rxon
.
ofdm_ht_dual_stream_basic_rates
)
||
(
priv
->
staging_rxon
.
rx_chain
!=
priv
->
active_rxon
.
rx_chain
)
||
(
priv
->
staging_rxon
.
assoc_id
!=
priv
->
active_rxon
.
assoc_id
))
return
1
;
...
...
@@ -263,7 +262,7 @@ static int iwl4965_commit_rxon(struct iwl_priv *priv)
/* If we don't need to send a full RXON, we can use
* iwl4965_rxon_assoc_cmd which is used to reconfigure filter
* and other flags for the current radio configuration. */
if
(
!
iwl
4965
_full_rxon_required
(
priv
))
{
if
(
!
iwl_full_rxon_required
(
priv
))
{
ret
=
iwl_send_rxon_assoc
(
priv
);
if
(
ret
)
{
IWL_ERROR
(
"Error setting RXON_ASSOC (%d)
\n
"
,
ret
);
...
...
@@ -587,8 +586,6 @@ static void iwl4965_ht_conf(struct iwl_priv *priv,
iwl_conf
->
supported_chan_width
=
0
;
}
iwl_conf
->
tx_mimo_ps_mode
=
(
u8
)((
ht_conf
->
cap
&
IEEE80211_HT_CAP_MIMO_PS
)
>>
2
);
memcpy
(
iwl_conf
->
supp_mcs_set
,
ht_conf
->
supp_mcs_set
,
16
);
iwl_conf
->
control_channel
=
ht_bss_conf
->
primary_channel
;
...
...
@@ -2190,7 +2187,10 @@ static void __iwl4965_down(struct iwl_priv *priv)
udelay
(
5
);
/* FIXME: apm_ops.suspend(priv) */
priv
->
cfg
->
ops
->
lib
->
apm_ops
.
reset
(
priv
);
if
(
exit_pending
||
test_bit
(
STATUS_IN_SUSPEND
,
&
priv
->
status
))
priv
->
cfg
->
ops
->
lib
->
apm_ops
.
stop
(
priv
);
else
priv
->
cfg
->
ops
->
lib
->
apm_ops
.
reset
(
priv
);
priv
->
cfg
->
ops
->
lib
->
free_shared_mem
(
priv
);
exit:
...
...
@@ -3588,7 +3588,7 @@ static int iwl4965_mac_beacon_update(struct ieee80211_hw *hw, struct sk_buff *sk
priv
->
assoc_id
=
0
;
timestamp
=
((
struct
ieee80211_mgmt
*
)
skb
->
data
)
->
u
.
beacon
.
timestamp
;
priv
->
timestamp
=
le64_to_cpu
(
timestamp
)
+
(
priv
->
beacon_int
*
1000
)
;
priv
->
timestamp
=
le64_to_cpu
(
timestamp
);
IWL_DEBUG_MAC80211
(
"leave
\n
"
);
spin_unlock_irqrestore
(
&
priv
->
lock
,
flags
);
...
...
@@ -4372,15 +4372,18 @@ static void __devexit iwl4965_pci_remove(struct pci_dev *pdev)
iwl_dbgfs_unregister
(
priv
);
sysfs_remove_group
(
&
pdev
->
dev
.
kobj
,
&
iwl4965_attribute_group
);
/* ieee80211_unregister_hw call wil cause iwl4965_mac_stop to
* to be called and iwl4965_down since we are removing the device
* we need to set STATUS_EXIT_PENDING bit.
*/
set_bit
(
STATUS_EXIT_PENDING
,
&
priv
->
status
);
if
(
priv
->
mac80211_registered
)
{
ieee80211_unregister_hw
(
priv
->
hw
);
priv
->
mac80211_registered
=
0
;
}
else
{
iwl4965_down
(
priv
);
}
set_bit
(
STATUS_EXIT_PENDING
,
&
priv
->
status
);
iwl4965_down
(
priv
);
/* make sure we flush any pending irq or
* tasklet for the driver
*/
...
...
drivers/net/wireless/iwlwifi/iwl-core.c
View file @
56e9c0a6
...
...
@@ -592,12 +592,11 @@ static void iwlcore_free_geos(struct iwl_priv *priv)
clear_bit
(
STATUS_GEO_CONFIGURED
,
&
priv
->
status
);
}
static
u8
is_single_rx_stream
(
struct
iwl_priv
*
priv
)
static
bool
is_single_rx_stream
(
struct
iwl_priv
*
priv
)
{
return
!
priv
->
current_ht_config
.
is_ht
||
((
priv
->
current_ht_config
.
supp_mcs_set
[
1
]
==
0
)
&&
(
priv
->
current_ht_config
.
supp_mcs_set
[
2
]
==
0
))
||
priv
->
ps_mode
==
IWL_MIMO_PS_STATIC
;
(
priv
->
current_ht_config
.
supp_mcs_set
[
2
]
==
0
));
}
static
u8
iwl_is_channel_extension
(
struct
iwl_priv
*
priv
,
...
...
@@ -704,33 +703,39 @@ EXPORT_SYMBOL(iwl_set_rxon_ht);
* MIMO (dual stream) requires at least 2, but works better with 3.
* This does not determine *which* chains to use, just how many.
*/
static
int
iwlcore_get_rx_chain_counter
(
struct
iwl_priv
*
priv
,
u8
*
idle_state
,
u8
*
rx_state
)
static
int
iwl_get_active_rx_chain_count
(
struct
iwl_priv
*
priv
)
{
u8
is_single
=
is_single_rx_stream
(
priv
);
u8
is_cam
=
test_bit
(
STATUS_POWER_PMI
,
&
priv
->
status
)
?
0
:
1
;
bool
is_single
=
is_single_rx_stream
(
priv
);
bool
is_cam
=
!
test_bit
(
STATUS_POWER_PMI
,
&
priv
->
status
)
;
/* # of Rx chains to use when expecting MIMO. */
if
(
is_single
||
(
!
is_cam
&&
(
priv
->
ps_mode
==
IWL_MIMO_PS_STATIC
)))
*
rx_state
=
2
;
return
2
;
else
*
rx_state
=
3
;
return
3
;
}
static
int
iwl_get_idle_rx_chain_count
(
struct
iwl_priv
*
priv
,
int
active_cnt
)
{
int
idle_cnt
;
bool
is_cam
=
!
test_bit
(
STATUS_POWER_PMI
,
&
priv
->
status
);
/* # Rx chains when idling and maybe trying to save power */
switch
(
priv
->
ps_mode
)
{
case
IWL_MIMO_PS_STATIC
:
case
IWL_MIMO_PS_DYNAMIC
:
*
idle_state
=
(
is_cam
)
?
2
:
1
;
idle_cnt
=
(
is_cam
)
?
2
:
1
;
break
;
case
IWL_MIMO_PS_NONE
:
*
idle_state
=
(
is_cam
)
?
*
rx_state
:
1
;
idle_cnt
=
(
is_cam
)
?
active_cnt
:
1
;
break
;
case
IWL_MIMO_PS_INVALID
:
default:
*
idle_state
=
1
;
IWL_ERROR
(
"invalide mimo ps mode %d
\n
"
,
priv
->
ps_mode
);
WARN_ON
(
1
);
idle_cnt
=
-
1
;
break
;
}
return
0
;
return
idle_cnt
;
}
/**
...
...
@@ -741,34 +746,44 @@ static int iwlcore_get_rx_chain_counter(struct iwl_priv *priv,
*/
void
iwl_set_rxon_chain
(
struct
iwl_priv
*
priv
)
{
u8
is_single
=
is_single_rx_stream
(
priv
);
u8
idle_state
,
rx_state
;
priv
->
staging_rxon
.
rx_chain
=
0
;
rx_state
=
idle_state
=
3
;
bool
is_single
=
is_single_rx_stream
(
priv
);
bool
is_cam
=
!
test_bit
(
STATUS_POWER_PMI
,
&
priv
->
status
);
u8
idle_rx_cnt
,
active_rx_cnt
;
u16
rx_chain
;
/* Tell uCode which antennas are actually connected.
* Before first association, we assume all antennas are connected.
* Just after first association, iwl_chain_noise_calibration()
* checks which antennas actually *are* connected. */
priv
->
staging_rxon
.
rx_chain
|=
cpu_to_le16
(
priv
->
hw_params
.
valid_rx_ant
<<
RXON_RX_CHAIN_VALID_POS
);
rx_chain
=
priv
->
hw_params
.
valid_rx_ant
<<
RXON_RX_CHAIN_VALID_POS
;
/* How many receivers should we use? */
iwlcore_get_rx_chain_counter
(
priv
,
&
idle_state
,
&
rx_state
);
priv
->
staging_rxon
.
rx_chain
|=
cpu_to_le16
(
rx_state
<<
RXON_RX_CHAIN_MIMO_CNT_POS
);
priv
->
staging_rxon
.
rx_chain
|=
cpu_to_le16
(
idle_state
<<
RXON_RX_CHAIN_CNT_POS
);
if
(
!
is_single
&&
(
rx_state
>=
2
)
&&
!
test_bit
(
STATUS_POWER_PMI
,
&
priv
->
status
))
active_rx_cnt
=
iwl_get_active_rx_chain_count
(
priv
);
idle_rx_cnt
=
iwl_get_idle_rx_chain_count
(
priv
,
active_rx_cnt
);
/* correct rx chain count accoridng hw settings */
if
(
priv
->
hw_params
.
rx_chains_num
<
active_rx_cnt
)
active_rx_cnt
=
priv
->
hw_params
.
rx_chains_num
;
if
(
priv
->
hw_params
.
rx_chains_num
<
idle_rx_cnt
)
idle_rx_cnt
=
priv
->
hw_params
.
rx_chains_num
;
rx_chain
|=
active_rx_cnt
<<
RXON_RX_CHAIN_MIMO_CNT_POS
;
rx_chain
|=
idle_rx_cnt
<<
RXON_RX_CHAIN_CNT_POS
;
priv
->
staging_rxon
.
rx_chain
=
cpu_to_le16
(
rx_chain
);
if
(
!
is_single
&&
(
active_rx_cnt
>=
2
)
&&
is_cam
)
priv
->
staging_rxon
.
rx_chain
|=
RXON_RX_CHAIN_MIMO_FORCE_MSK
;
else
priv
->
staging_rxon
.
rx_chain
&=
~
RXON_RX_CHAIN_MIMO_FORCE_MSK
;
IWL_DEBUG_ASSOC
(
"rx chain %X
\n
"
,
priv
->
staging_rxon
.
rx_chain
);
IWL_DEBUG_ASSOC
(
"rx_chain=0x%Xi active=%d idle=%d
\n
"
,
priv
->
staging_rxon
.
rx_chain
,
active_rx_cnt
,
idle_rx_cnt
);
WARN_ON
(
active_rx_cnt
==
0
||
idle_rx_cnt
==
0
||
active_rx_cnt
<
idle_rx_cnt
);
}
EXPORT_SYMBOL
(
iwl_set_rxon_chain
);
...
...
drivers/net/wireless/iwlwifi/iwl-dev.h
View file @
56e9c0a6
...
...
@@ -412,7 +412,6 @@ struct iwl_ht_info {
/* self configuration data */
u8
is_ht
;
u8
supported_chan_width
;
u16
tx_mimo_ps_mode
;
u8
is_green_field
;
u8
sgf
;
/* HT_SHORT_GI_* short guard interval */
u8
max_amsdu_size
;
...
...
drivers/net/wireless/iwlwifi/iwl-rx.c
View file @
56e9c0a6
...
...
@@ -1173,7 +1173,10 @@ void iwl_rx_reply_rx(struct iwl_priv *priv,
rx_status
.
antenna
=
0
;
rx_status
.
flag
=
0
;
rx_status
.
flag
|=
RX_FLAG_TSFT
;
/* TSF isn't reliable. In order to allow smooth user experience,
* this W/A doesn't propagate it to the mac80211 */
/*rx_status.flag |= RX_FLAG_TSFT;*/
if
((
unlikely
(
rx_start
->
cfg_phy_cnt
>
20
)))
{
IWL_DEBUG_DROP
(
"dsp size out of range [0,20]: %d/n"
,
...
...
drivers/net/wireless/iwlwifi/iwl-scan.c
View file @
56e9c0a6
...
...
@@ -421,7 +421,7 @@ static int iwl_get_channels_for_scan(struct iwl_priv *priv,
else
scan_ch
->
type
=
SCAN_CHANNEL_TYPE_ACTIVE
;
if
(
(
scan_ch
->
type
&
SCAN_CHANNEL_TYPE_ACTIVE
)
&&
n_probes
)
if
(
n_probes
)
scan_ch
->
type
|=
IWL_SCAN_PROBE_MASK
(
n_probes
);
scan_ch
->
active_dwell
=
cpu_to_le16
(
active_dwell
);
...
...
drivers/net/wireless/iwlwifi/iwl-tx.c
View file @
56e9c0a6
...
...
@@ -402,12 +402,11 @@ static int iwl_hw_tx_queue_init(struct iwl_priv *priv,
/**
* iwl_tx_queue_init - Allocate and initialize one tx/cmd queue
*/
static
int
iwl_tx_queue_init
(
struct
iwl_priv
*
priv
,
struct
iwl_tx_queue
*
txq
,
static
int
iwl_tx_queue_init
(
struct
iwl_priv
*
priv
,
struct
iwl_tx_queue
*
txq
,
int
slots_num
,
u32
txq_id
)
{
int
i
,
len
;
int
r
c
=
0
;
int
r
et
;
/*
* Alloc buffer array for commands (Tx or other types of commands).
...
...
@@ -428,17 +427,14 @@ static int iwl_tx_queue_init(struct iwl_priv *priv,
txq
->
cmd
[
i
]
=
kmalloc
(
len
,
GFP_KERNEL
);
if
(
!
txq
->
cmd
[
i
])
return
-
ENOMEM
;
goto
err
;
}
/* Alloc driver data array and TFD circular buffer */
rc
=
iwl_tx_queue_alloc
(
priv
,
txq
,
txq_id
);
if
(
rc
)
{
for
(
i
=
0
;
i
<
slots_num
;
i
++
)
kfree
(
txq
->
cmd
[
i
]);
ret
=
iwl_tx_queue_alloc
(
priv
,
txq
,
txq_id
);
if
(
ret
)
goto
err
;
return
-
ENOMEM
;
}
txq
->
need_update
=
0
;
/* TFD_QUEUE_SIZE_MAX must be power-of-two size, otherwise
...
...
@@ -452,6 +448,17 @@ static int iwl_tx_queue_init(struct iwl_priv *priv,
iwl_hw_tx_queue_init
(
priv
,
txq
);
return
0
;
err:
for
(
i
=
0
;
i
<
slots_num
;
i
++
)
{
kfree
(
txq
->
cmd
[
i
]);
txq
->
cmd
[
i
]
=
NULL
;
}
if
(
txq_id
==
IWL_CMD_QUEUE_NUM
)
{
kfree
(
txq
->
cmd
[
slots_num
]);
txq
->
cmd
[
slots_num
]
=
NULL
;
}
return
-
ENOMEM
;
}
/**
* iwl_hw_txq_ctx_free - Free TXQ Context
...
...
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