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
9e4b4269
Commit
9e4b4269
authored
Feb 24, 2014
by
John W. Linville
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'for-linville' of
git://github.com/kvalo/ath
parents
161d7855
9797febc
Changes
15
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
15 changed files
with
895 additions
and
194 deletions
+895
-194
drivers/net/wireless/ath/ath.h
drivers/net/wireless/ath/ath.h
+1
-1
drivers/net/wireless/ath/ath10k/core.c
drivers/net/wireless/ath/ath10k/core.c
+31
-5
drivers/net/wireless/ath/ath10k/core.h
drivers/net/wireless/ath/ath10k/core.h
+41
-6
drivers/net/wireless/ath/ath10k/debug.h
drivers/net/wireless/ath/ath10k/debug.h
+1
-1
drivers/net/wireless/ath/ath10k/htt_rx.c
drivers/net/wireless/ath/ath10k/htt_rx.c
+22
-13
drivers/net/wireless/ath/ath10k/htt_tx.c
drivers/net/wireless/ath/ath10k/htt_tx.c
+2
-2
drivers/net/wireless/ath/ath10k/hw.h
drivers/net/wireless/ath/ath10k/hw.h
+6
-0
drivers/net/wireless/ath/ath10k/mac.c
drivers/net/wireless/ath/ath10k/mac.c
+529
-105
drivers/net/wireless/ath/ath10k/pci.c
drivers/net/wireless/ath/ath10k/pci.c
+133
-14
drivers/net/wireless/ath/ath10k/txrx.c
drivers/net/wireless/ath/ath10k/txrx.c
+2
-2
drivers/net/wireless/ath/ath10k/wmi.c
drivers/net/wireless/ath/ath10k/wmi.c
+87
-31
drivers/net/wireless/ath/ath10k/wmi.h
drivers/net/wireless/ath/ath10k/wmi.h
+30
-4
drivers/net/wireless/ath/ath6kl/usb.c
drivers/net/wireless/ath/ath6kl/usb.c
+3
-3
drivers/net/wireless/ath/ath6kl/wmi.c
drivers/net/wireless/ath/ath6kl/wmi.c
+2
-2
drivers/net/wireless/ath/regd.c
drivers/net/wireless/ath/regd.c
+5
-5
No files found.
drivers/net/wireless/ath/ath.h
View file @
9e4b4269
...
...
@@ -63,7 +63,7 @@ enum ath_bus_type {
};
struct
reg_dmn_pair_mapping
{
u16
reg
DmnEnum
;
u16
reg
_domain
;
u16
reg_5ghz_ctl
;
u16
reg_2ghz_ctl
;
};
...
...
drivers/net/wireless/ath/ath10k/core.c
View file @
9e4b4269
...
...
@@ -55,8 +55,7 @@ static void ath10k_send_suspend_complete(struct ath10k *ar)
{
ath10k_dbg
(
ATH10K_DBG_BOOT
,
"boot suspend complete
\n
"
);
ar
->
is_target_paused
=
true
;
wake_up
(
&
ar
->
event_queue
);
complete
(
&
ar
->
target_suspend
);
}
static
int
ath10k_init_connect_htc
(
struct
ath10k
*
ar
)
...
...
@@ -470,8 +469,12 @@ static int ath10k_core_fetch_firmware_api_n(struct ath10k *ar, const char *name)
if
(
index
==
ie_len
)
break
;
if
(
data
[
index
]
&
(
1
<<
bit
))
if
(
data
[
index
]
&
(
1
<<
bit
))
{
ath10k_dbg
(
ATH10K_DBG_BOOT
,
"Enabling feature bit: %i
\n
"
,
i
);
__set_bit
(
i
,
ar
->
fw_features
);
}
}
ath10k_dbg_dump
(
ATH10K_DBG_BOOT
,
"features"
,
""
,
...
...
@@ -699,6 +702,7 @@ struct ath10k *ath10k_core_create(void *hif_priv, struct device *dev,
init_completion
(
&
ar
->
scan
.
started
);
init_completion
(
&
ar
->
scan
.
completed
);
init_completion
(
&
ar
->
scan
.
on_channel
);
init_completion
(
&
ar
->
target_suspend
);
init_completion
(
&
ar
->
install_key_done
);
init_completion
(
&
ar
->
vdev_setup_done
);
...
...
@@ -722,8 +726,6 @@ struct ath10k *ath10k_core_create(void *hif_priv, struct device *dev,
INIT_WORK
(
&
ar
->
wmi_mgmt_tx_work
,
ath10k_mgmt_over_wmi_tx_work
);
skb_queue_head_init
(
&
ar
->
wmi_mgmt_tx_queue
);
init_waitqueue_head
(
&
ar
->
event_queue
);
INIT_WORK
(
&
ar
->
restart_work
,
ath10k_core_restart
);
return
ar
;
...
...
@@ -856,10 +858,34 @@ int ath10k_core_start(struct ath10k *ar)
}
EXPORT_SYMBOL
(
ath10k_core_start
);
int
ath10k_wait_for_suspend
(
struct
ath10k
*
ar
,
u32
suspend_opt
)
{
int
ret
;
reinit_completion
(
&
ar
->
target_suspend
);
ret
=
ath10k_wmi_pdev_suspend_target
(
ar
,
suspend_opt
);
if
(
ret
)
{
ath10k_warn
(
"could not suspend target (%d)
\n
"
,
ret
);
return
ret
;
}
ret
=
wait_for_completion_timeout
(
&
ar
->
target_suspend
,
1
*
HZ
);
if
(
ret
==
0
)
{
ath10k_warn
(
"suspend timed out - target pause event never came
\n
"
);
return
-
ETIMEDOUT
;
}
return
0
;
}
void
ath10k_core_stop
(
struct
ath10k
*
ar
)
{
lockdep_assert_held
(
&
ar
->
conf_mutex
);
/* try to suspend target */
ath10k_wait_for_suspend
(
ar
,
WMI_PDEV_SUSPEND_AND_DISABLE_INTR
);
ath10k_debug_stop
(
ar
);
ath10k_htc_stop
(
&
ar
->
htc
);
ath10k_htt_detach
(
&
ar
->
htt
);
...
...
drivers/net/wireless/ath/ath10k/core.h
View file @
9e4b4269
...
...
@@ -46,6 +46,18 @@
#define ATH10K_MAX_NUM_MGMT_PENDING 128
/* number of failed packets */
#define ATH10K_KICKOUT_THRESHOLD 50
/*
* Use insanely high numbers to make sure that the firmware implementation
* won't start, we have the same functionality already in hostapd. Unit
* is seconds.
*/
#define ATH10K_KEEPALIVE_MIN_IDLE 3747
#define ATH10K_KEEPALIVE_MAX_IDLE 3895
#define ATH10K_KEEPALIVE_MAX_UNRESPONSIVE 3900
struct
ath10k
;
struct
ath10k_skb_cb
{
...
...
@@ -61,6 +73,11 @@ struct ath10k_skb_cb {
u8
frag_len
;
u8
pad_len
;
}
__packed
htt
;
struct
{
bool
dtim_zero
;
bool
deliver_cab
;
}
bcn
;
}
__packed
;
static
inline
struct
ath10k_skb_cb
*
ATH10K_SKB_CB
(
struct
sk_buff
*
skb
)
...
...
@@ -211,6 +228,18 @@ struct ath10k_peer {
struct
ieee80211_key_conf
*
keys
[
WMI_MAX_KEY_INDEX
+
1
];
};
struct
ath10k_sta
{
struct
ath10k_vif
*
arvif
;
/* the following are protected by ar->data_lock */
u32
changed
;
/* IEEE80211_RC_* */
u32
bw
;
u32
nss
;
u32
smps
;
struct
work_struct
update_wk
;
};
#define ATH10K_VDEV_SETUP_TIMEOUT_HZ (5*HZ)
struct
ath10k_vif
{
...
...
@@ -222,10 +251,17 @@ struct ath10k_vif {
u32
beacon_interval
;
u32
dtim_period
;
struct
sk_buff
*
beacon
;
/* protected by data_lock */
bool
beacon_sent
;
struct
ath10k
*
ar
;
struct
ieee80211_vif
*
vif
;
bool
is_started
;
bool
is_up
;
u32
aid
;
u8
bssid
[
ETH_ALEN
];
struct
work_struct
wep_key_work
;
struct
ieee80211_key_conf
*
wep_keys
[
WMI_MAX_KEY_INDEX
+
1
];
u8
def_wep_key_idx
;
...
...
@@ -235,7 +271,6 @@ struct ath10k_vif {
union
{
struct
{
u8
bssid
[
ETH_ALEN
];
u32
uapsd
;
}
sta
;
struct
{
...
...
@@ -249,9 +284,6 @@ struct ath10k_vif {
u32
noa_len
;
u8
*
noa_data
;
}
ap
;
struct
{
u8
bssid
[
ETH_ALEN
];
}
ibss
;
}
u
;
u8
fixed_rate
;
...
...
@@ -355,8 +387,7 @@ struct ath10k {
const
struct
ath10k_hif_ops
*
ops
;
}
hif
;
wait_queue_head_t
event_queue
;
bool
is_target_paused
;
struct
completion
target_suspend
;
struct
ath10k_bmi
bmi
;
struct
ath10k_wmi
wmi
;
...
...
@@ -412,6 +443,9 @@ struct ath10k {
/* valid during scan; needed for mgmt rx during scan */
struct
ieee80211_channel
*
scan_channel
;
/* current operating channel definition */
struct
cfg80211_chan_def
chandef
;
int
free_vdev_map
;
int
monitor_vdev_id
;
bool
monitor_enabled
;
...
...
@@ -470,6 +504,7 @@ struct ath10k *ath10k_core_create(void *hif_priv, struct device *dev,
void
ath10k_core_destroy
(
struct
ath10k
*
ar
);
int
ath10k_core_start
(
struct
ath10k
*
ar
);
int
ath10k_wait_for_suspend
(
struct
ath10k
*
ar
,
u32
suspend_opt
);
void
ath10k_core_stop
(
struct
ath10k
*
ar
);
int
ath10k_core_register
(
struct
ath10k
*
ar
,
u32
chip_id
);
void
ath10k_core_unregister
(
struct
ath10k
*
ar
);
...
...
drivers/net/wireless/ath/ath10k/debug.h
View file @
9e4b4269
...
...
@@ -92,7 +92,7 @@ static inline void ath10k_debug_read_target_stats(struct ath10k *ar,
#ifdef CONFIG_ATH10K_DEBUG
__printf
(
2
,
3
)
void
ath10k_dbg
(
enum
ath10k_debug_mask
mask
,
const
char
*
fmt
,
...);
const
char
*
fmt
,
...);
void
ath10k_dbg_dump
(
enum
ath10k_debug_mask
mask
,
const
char
*
msg
,
const
char
*
prefix
,
const
void
*
buf
,
size_t
len
);
...
...
drivers/net/wireless/ath/ath10k/htt_rx.c
View file @
9e4b4269
...
...
@@ -324,7 +324,7 @@ static int ath10k_htt_rx_amsdu_pop(struct ath10k_htt *htt,
msdu
->
len
+
skb_tailroom
(
msdu
),
DMA_FROM_DEVICE
);
ath10k_dbg_dump
(
ATH10K_DBG_HTT_DUMP
,
NULL
,
"htt rx: "
,
ath10k_dbg_dump
(
ATH10K_DBG_HTT_DUMP
,
NULL
,
"htt rx
pop
: "
,
msdu
->
data
,
msdu
->
len
+
skb_tailroom
(
msdu
));
rx_desc
=
(
struct
htt_rx_desc
*
)
msdu
->
data
;
...
...
@@ -417,8 +417,8 @@ static int ath10k_htt_rx_amsdu_pop(struct ath10k_htt *htt,
next
->
len
+
skb_tailroom
(
next
),
DMA_FROM_DEVICE
);
ath10k_dbg_dump
(
ATH10K_DBG_HTT_DUMP
,
NULL
,
"htt rx: "
,
next
->
data
,
ath10k_dbg_dump
(
ATH10K_DBG_HTT_DUMP
,
NULL
,
"htt rx chained: "
,
next
->
data
,
next
->
len
+
skb_tailroom
(
next
));
skb_trim
(
next
,
0
);
...
...
@@ -430,12 +430,6 @@ static int ath10k_htt_rx_amsdu_pop(struct ath10k_htt *htt,
msdu_chaining
=
1
;
}
if
(
msdu_len
>
0
)
{
/* This may suggest FW bug? */
ath10k_warn
(
"htt rx msdu len not consumed (%d)
\n
"
,
msdu_len
);
}
last_msdu
=
__le32_to_cpu
(
rx_desc
->
msdu_end
.
info0
)
&
RX_MSDU_END_INFO0_LAST_MSDU
;
...
...
@@ -751,7 +745,7 @@ static void ath10k_htt_rx_msdu(struct ath10k_htt *htt, struct htt_rx_info *info)
/* This shouldn't happen. If it does than it may be a FW bug. */
if
(
skb
->
next
)
{
ath10k_warn
(
"received chained non A-MSDU frame
\n
"
);
ath10k_warn
(
"
htt rx
received chained non A-MSDU frame
\n
"
);
ath10k_htt_rx_free_msdu_chain
(
skb
->
next
);
skb
->
next
=
NULL
;
}
...
...
@@ -937,6 +931,8 @@ static void ath10k_htt_rx_handler(struct ath10k_htt *htt,
}
if
(
ath10k_htt_rx_has_decrypt_err
(
msdu_head
))
{
ath10k_dbg
(
ATH10K_DBG_HTT
,
"htt rx dropping due to decrypt-err
\n
"
);
ath10k_htt_rx_free_msdu_chain
(
msdu_head
);
continue
;
}
...
...
@@ -945,12 +941,14 @@ static void ath10k_htt_rx_handler(struct ath10k_htt *htt,
/* Skip mgmt frames while we handle this in WMI */
if
(
status
==
HTT_RX_IND_MPDU_STATUS_MGMT_CTRL
)
{
ath10k_dbg
(
ATH10K_DBG_HTT
,
"htt rx mgmt ctrl
\n
"
);
ath10k_htt_rx_free_msdu_chain
(
msdu_head
);
continue
;
}
if
(
status
!=
HTT_RX_IND_MPDU_STATUS_OK
&&
status
!=
HTT_RX_IND_MPDU_STATUS_TKIP_MIC_ERR
&&
status
!=
HTT_RX_IND_MPDU_STATUS_ERR_INV_PEER
&&
!
htt
->
ar
->
monitor_enabled
)
{
ath10k_dbg
(
ATH10K_DBG_HTT
,
"htt rx ignoring frame w/ status %d
\n
"
,
...
...
@@ -960,6 +958,8 @@ static void ath10k_htt_rx_handler(struct ath10k_htt *htt,
}
if
(
test_bit
(
ATH10K_CAC_RUNNING
,
&
htt
->
ar
->
dev_flags
))
{
ath10k_dbg
(
ATH10K_DBG_HTT
,
"htt rx CAC running
\n
"
);
ath10k_htt_rx_free_msdu_chain
(
msdu_head
);
continue
;
}
...
...
@@ -967,7 +967,7 @@ static void ath10k_htt_rx_handler(struct ath10k_htt *htt,
/* FIXME: we do not support chaining yet.
* this needs investigation */
if
(
msdu_chaining
)
{
ath10k_warn
(
"msdu_chaining is true
\n
"
);
ath10k_warn
(
"
htt rx
msdu_chaining is true
\n
"
);
ath10k_htt_rx_free_msdu_chain
(
msdu_head
);
continue
;
}
...
...
@@ -975,6 +975,15 @@ static void ath10k_htt_rx_handler(struct ath10k_htt *htt,
info
.
skb
=
msdu_head
;
info
.
fcs_err
=
ath10k_htt_rx_has_fcs_err
(
msdu_head
);
info
.
mic_err
=
ath10k_htt_rx_has_mic_err
(
msdu_head
);
if
(
info
.
fcs_err
)
ath10k_dbg
(
ATH10K_DBG_HTT
,
"htt rx has FCS err
\n
"
);
if
(
info
.
mic_err
)
ath10k_dbg
(
ATH10K_DBG_HTT
,
"htt rx has MIC err
\n
"
);
info
.
signal
=
ATH10K_DEFAULT_NOISE_FLOOR
;
info
.
signal
+=
rx
->
ppdu
.
combined_rssi
;
...
...
@@ -1095,7 +1104,7 @@ static void ath10k_htt_rx_frag_handler(struct ath10k_htt *htt,
skb_trim
(
info
.
skb
,
info
.
skb
->
len
-
trim
);
ath10k_dbg_dump
(
ATH10K_DBG_HTT_DUMP
,
NULL
,
"htt frag mpdu: "
,
ath10k_dbg_dump
(
ATH10K_DBG_HTT_DUMP
,
NULL
,
"htt
rx
frag mpdu: "
,
info
.
skb
->
data
,
info
.
skb
->
len
);
ath10k_process_rx
(
htt
->
ar
,
&
info
);
...
...
@@ -1116,7 +1125,7 @@ void ath10k_htt_t2h_msg_handler(struct ath10k *ar, struct sk_buff *skb)
if
(
!
IS_ALIGNED
((
unsigned
long
)
skb
->
data
,
4
))
ath10k_warn
(
"unaligned htt message, expect trouble
\n
"
);
ath10k_dbg
(
ATH10K_DBG_HTT
,
"
HTT RX
, msg_type: 0x%0X
\n
"
,
ath10k_dbg
(
ATH10K_DBG_HTT
,
"
htt rx
, msg_type: 0x%0X
\n
"
,
resp
->
hdr
.
msg_type
);
switch
(
resp
->
hdr
.
msg_type
)
{
case
HTT_T2H_MSG_TYPE_VERSION_CONF
:
{
...
...
drivers/net/wireless/ath/ath10k/htt_tx.c
View file @
9e4b4269
...
...
@@ -460,9 +460,9 @@ int ath10k_htt_tx(struct ath10k_htt *htt, struct sk_buff *msdu)
DMA_TO_DEVICE
);
}
ath10k_dbg
(
ATH10K_DBG_HTT
,
"msdu 0x%llx
\n
"
,
ath10k_dbg
(
ATH10K_DBG_HTT
,
"
tx-
msdu 0x%llx
\n
"
,
(
unsigned
long
long
)
ATH10K_SKB_CB
(
msdu
)
->
paddr
);
ath10k_dbg_dump
(
ATH10K_DBG_HTT_DUMP
,
NULL
,
"msdu: "
,
ath10k_dbg_dump
(
ATH10K_DBG_HTT_DUMP
,
NULL
,
"
tx-
msdu: "
,
msdu
->
data
,
msdu
->
len
);
skb_put
(
txdesc
,
desc_len
);
...
...
drivers/net/wireless/ath/ath10k/hw.h
View file @
9e4b4269
...
...
@@ -205,8 +205,11 @@ enum ath10k_mcast2ucast_mode {
#define WLAN_ANALOG_INTF_PCIE_BASE_ADDRESS 0x0006c000
#define PCIE_LOCAL_BASE_ADDRESS 0x00080000
#define SOC_RESET_CONTROL_ADDRESS 0x00000000
#define SOC_RESET_CONTROL_OFFSET 0x00000000
#define SOC_RESET_CONTROL_SI0_RST_MASK 0x00000001
#define SOC_RESET_CONTROL_CE_RST_MASK 0x00040000
#define SOC_RESET_CONTROL_CPU_WARM_RST_MASK 0x00000040
#define SOC_CPU_CLOCK_OFFSET 0x00000020
#define SOC_CPU_CLOCK_STANDARD_LSB 0
#define SOC_CPU_CLOCK_STANDARD_MASK 0x00000003
...
...
@@ -216,6 +219,8 @@ enum ath10k_mcast2ucast_mode {
#define SOC_LPO_CAL_OFFSET 0x000000e0
#define SOC_LPO_CAL_ENABLE_LSB 20
#define SOC_LPO_CAL_ENABLE_MASK 0x00100000
#define SOC_LF_TIMER_CONTROL0_ADDRESS 0x00000050
#define SOC_LF_TIMER_CONTROL0_ENABLE_MASK 0x00000004
#define SOC_CHIP_ID_ADDRESS 0x000000ec
#define SOC_CHIP_ID_REV_LSB 8
...
...
@@ -273,6 +278,7 @@ enum ath10k_mcast2ucast_mode {
#define PCIE_INTR_CAUSE_ADDRESS 0x000c
#define PCIE_INTR_CLR_ADDRESS 0x0014
#define SCRATCH_3_ADDRESS 0x0030
#define CPU_INTR_ADDRESS 0x0010
/* Firmware indications to the Host via SCRATCH_3 register. */
#define FW_INDICATOR_ADDRESS (SOC_CORE_BASE_ADDRESS + SCRATCH_3_ADDRESS)
...
...
drivers/net/wireless/ath/ath10k/mac.c
View file @
9e4b4269
This diff is collapsed.
Click to expand it.
drivers/net/wireless/ath/ath10k/pci.c
View file @
9e4b4269
...
...
@@ -64,7 +64,8 @@ static int ath10k_pci_post_rx_pipe(struct ath10k_pci_pipe *pipe_info,
int
num
);
static
void
ath10k_pci_rx_pipe_cleanup
(
struct
ath10k_pci_pipe
*
pipe_info
);
static
void
ath10k_pci_stop_ce
(
struct
ath10k
*
ar
);
static
int
ath10k_pci_device_reset
(
struct
ath10k
*
ar
);
static
int
ath10k_pci_cold_reset
(
struct
ath10k
*
ar
);
static
int
ath10k_pci_warm_reset
(
struct
ath10k
*
ar
);
static
int
ath10k_pci_wait_for_target_init
(
struct
ath10k
*
ar
);
static
int
ath10k_pci_init_irq
(
struct
ath10k
*
ar
);
static
int
ath10k_pci_deinit_irq
(
struct
ath10k
*
ar
);
...
...
@@ -833,9 +834,7 @@ static void ath10k_pci_hif_dump_area(struct ath10k *ar)
ath10k_err
(
"firmware crashed!
\n
"
);
ath10k_err
(
"hardware name %s version 0x%x
\n
"
,
ar
->
hw_params
.
name
,
ar
->
target_version
);
ath10k_err
(
"firmware version: %u.%u.%u.%u
\n
"
,
ar
->
fw_version_major
,
ar
->
fw_version_minor
,
ar
->
fw_version_release
,
ar
->
fw_version_build
);
ath10k_err
(
"firmware version: %s
\n
"
,
ar
->
hw
->
wiphy
->
fw_version
);
host_addr
=
host_interest_item_address
(
HI_ITEM
(
hi_failure_state
));
ret
=
ath10k_pci_diag_read_mem
(
ar
,
host_addr
,
...
...
@@ -1502,7 +1501,7 @@ static void ath10k_pci_hif_stop(struct ath10k *ar)
* configuration during init. If ringbuffers are freed and the device
* were to access them this could lead to memory corruption on the
* host. */
ath10k_pci_
device
_reset
(
ar
);
ath10k_pci_
warm
_reset
(
ar
);
ar_pci
->
started
=
0
;
}
...
...
@@ -1993,7 +1992,94 @@ static void ath10k_pci_fw_interrupt_handler(struct ath10k *ar)
ath10k_pci_sleep
(
ar
);
}
static
int
ath10k_pci_hif_power_up
(
struct
ath10k
*
ar
)
static
int
ath10k_pci_warm_reset
(
struct
ath10k
*
ar
)
{
struct
ath10k_pci
*
ar_pci
=
ath10k_pci_priv
(
ar
);
int
ret
=
0
;
u32
val
;
ath10k_dbg
(
ATH10K_DBG_BOOT
,
"boot performing warm chip reset
\n
"
);
ret
=
ath10k_do_pci_wake
(
ar
);
if
(
ret
)
{
ath10k_err
(
"failed to wake up target: %d
\n
"
,
ret
);
return
ret
;
}
/* debug */
val
=
ath10k_pci_read32
(
ar
,
SOC_CORE_BASE_ADDRESS
+
PCIE_INTR_CAUSE_ADDRESS
);
ath10k_dbg
(
ATH10K_DBG_BOOT
,
"boot host cpu intr cause: 0x%08x
\n
"
,
val
);
val
=
ath10k_pci_read32
(
ar
,
SOC_CORE_BASE_ADDRESS
+
CPU_INTR_ADDRESS
);
ath10k_dbg
(
ATH10K_DBG_BOOT
,
"boot target cpu intr cause: 0x%08x
\n
"
,
val
);
/* disable pending irqs */
ath10k_pci_write32
(
ar
,
SOC_CORE_BASE_ADDRESS
+
PCIE_INTR_ENABLE_ADDRESS
,
0
);
ath10k_pci_write32
(
ar
,
SOC_CORE_BASE_ADDRESS
+
PCIE_INTR_CLR_ADDRESS
,
~
0
);
msleep
(
100
);
/* clear fw indicator */
ath10k_pci_write32
(
ar
,
ar_pci
->
fw_indicator_address
,
0
);
/* clear target LF timer interrupts */
val
=
ath10k_pci_read32
(
ar
,
RTC_SOC_BASE_ADDRESS
+
SOC_LF_TIMER_CONTROL0_ADDRESS
);
ath10k_pci_write32
(
ar
,
RTC_SOC_BASE_ADDRESS
+
SOC_LF_TIMER_CONTROL0_ADDRESS
,
val
&
~
SOC_LF_TIMER_CONTROL0_ENABLE_MASK
);
/* reset CE */
val
=
ath10k_pci_read32
(
ar
,
RTC_SOC_BASE_ADDRESS
+
SOC_RESET_CONTROL_ADDRESS
);
ath10k_pci_write32
(
ar
,
RTC_SOC_BASE_ADDRESS
+
SOC_RESET_CONTROL_ADDRESS
,
val
|
SOC_RESET_CONTROL_CE_RST_MASK
);
val
=
ath10k_pci_read32
(
ar
,
RTC_SOC_BASE_ADDRESS
+
SOC_RESET_CONTROL_ADDRESS
);
msleep
(
10
);
/* unreset CE */
ath10k_pci_write32
(
ar
,
RTC_SOC_BASE_ADDRESS
+
SOC_RESET_CONTROL_ADDRESS
,
val
&
~
SOC_RESET_CONTROL_CE_RST_MASK
);
val
=
ath10k_pci_read32
(
ar
,
RTC_SOC_BASE_ADDRESS
+
SOC_RESET_CONTROL_ADDRESS
);
msleep
(
10
);
/* debug */
val
=
ath10k_pci_read32
(
ar
,
SOC_CORE_BASE_ADDRESS
+
PCIE_INTR_CAUSE_ADDRESS
);
ath10k_dbg
(
ATH10K_DBG_BOOT
,
"boot host cpu intr cause: 0x%08x
\n
"
,
val
);
val
=
ath10k_pci_read32
(
ar
,
SOC_CORE_BASE_ADDRESS
+
CPU_INTR_ADDRESS
);
ath10k_dbg
(
ATH10K_DBG_BOOT
,
"boot target cpu intr cause: 0x%08x
\n
"
,
val
);
/* CPU warm reset */
val
=
ath10k_pci_read32
(
ar
,
RTC_SOC_BASE_ADDRESS
+
SOC_RESET_CONTROL_ADDRESS
);
ath10k_pci_write32
(
ar
,
RTC_SOC_BASE_ADDRESS
+
SOC_RESET_CONTROL_ADDRESS
,
val
|
SOC_RESET_CONTROL_CPU_WARM_RST_MASK
);
val
=
ath10k_pci_read32
(
ar
,
RTC_SOC_BASE_ADDRESS
+
SOC_RESET_CONTROL_ADDRESS
);
ath10k_dbg
(
ATH10K_DBG_BOOT
,
"boot target reset state: 0x%08x
\n
"
,
val
);
msleep
(
100
);
ath10k_dbg
(
ATH10K_DBG_BOOT
,
"boot warm reset complete
\n
"
);
ath10k_do_pci_sleep
(
ar
);
return
ret
;
}
static
int
__ath10k_pci_hif_power_up
(
struct
ath10k
*
ar
,
bool
cold_reset
)
{
struct
ath10k_pci
*
ar_pci
=
ath10k_pci_priv
(
ar
);
const
char
*
irq_mode
;
...
...
@@ -2009,7 +2095,11 @@ static int ath10k_pci_hif_power_up(struct ath10k *ar)
* is in an unexpected state. We try to catch that here in order to
* reset the Target and retry the probe.
*/
ret
=
ath10k_pci_device_reset
(
ar
);
if
(
cold_reset
)
ret
=
ath10k_pci_cold_reset
(
ar
);
else
ret
=
ath10k_pci_warm_reset
(
ar
);
if
(
ret
)
{
ath10k_err
(
"failed to reset target: %d
\n
"
,
ret
);
goto
err
;
...
...
@@ -2079,7 +2169,7 @@ static int ath10k_pci_hif_power_up(struct ath10k *ar)
ath10k_pci_deinit_irq
(
ar
);
err_ce:
ath10k_pci_ce_deinit
(
ar
);
ath10k_pci_
device
_reset
(
ar
);
ath10k_pci_
warm
_reset
(
ar
);
err_ps:
if
(
!
test_bit
(
ATH10K_PCI_FEATURE_SOC_POWER_SAVE
,
ar_pci
->
features
))
ath10k_do_pci_sleep
(
ar
);
...
...
@@ -2087,6 +2177,34 @@ static int ath10k_pci_hif_power_up(struct ath10k *ar)
return
ret
;
}
static
int
ath10k_pci_hif_power_up
(
struct
ath10k
*
ar
)
{
int
ret
;
/*
* Hardware CUS232 version 2 has some issues with cold reset and the
* preferred (and safer) way to perform a device reset is through a
* warm reset.
*
* Warm reset doesn't always work though (notably after a firmware
* crash) so fall back to cold reset if necessary.
*/
ret
=
__ath10k_pci_hif_power_up
(
ar
,
false
);
if
(
ret
)
{
ath10k_warn
(
"failed to power up target using warm reset (%d), trying cold reset
\n
"
,
ret
);
ret
=
__ath10k_pci_hif_power_up
(
ar
,
true
);
if
(
ret
)
{
ath10k_err
(
"failed to power up target using cold reset too (%d)
\n
"
,
ret
);
return
ret
;
}
}
return
0
;
}
static
void
ath10k_pci_hif_power_down
(
struct
ath10k
*
ar
)
{
struct
ath10k_pci
*
ar_pci
=
ath10k_pci_priv
(
ar
);
...
...
@@ -2094,7 +2212,7 @@ static void ath10k_pci_hif_power_down(struct ath10k *ar)
ath10k_pci_free_early_irq
(
ar
);
ath10k_pci_kill_tasklet
(
ar
);
ath10k_pci_deinit_irq
(
ar
);
ath10k_pci_
device
_reset
(
ar
);
ath10k_pci_
warm
_reset
(
ar
);
ath10k_pci_ce_deinit
(
ar
);
if
(
!
test_bit
(
ATH10K_PCI_FEATURE_SOC_POWER_SAVE
,
ar_pci
->
features
))
...
...
@@ -2411,11 +2529,10 @@ static int ath10k_pci_init_irq(struct ath10k *ar)
/* Try MSI-X */
if
(
ath10k_pci_irq_mode
==
ATH10K_PCI_IRQ_AUTO
&&
msix_supported
)
{
ar_pci
->
num_msi_intrs
=
MSI_NUM_REQUEST
;
ret
=
pci_enable_msi_block
(
ar_pci
->
pdev
,
ar_pci
->
num_msi_intrs
);
if
(
ret
==
0
)
return
0
;
ret
=
pci_enable_msi_range
(
ar_pci
->
pdev
,
ar_pci
->
num_msi_intrs
,
ar_pci
->
num_msi_intrs
);
if
(
ret
>
0
)
pci_disable_msi
(
ar_pci
->
pdev
)
;
return
0
;
/* fall-through */
}
...
...
@@ -2482,6 +2599,8 @@ static int ath10k_pci_deinit_irq(struct ath10k *ar)
case
MSI_NUM_REQUEST
:
pci_disable_msi
(
ar_pci
->
pdev
);
return
0
;
default:
pci_disable_msi
(
ar_pci
->
pdev
);
}
ath10k_warn
(
"unknown irq configuration upon deinit
\n
"
);
...
...
@@ -2523,7 +2642,7 @@ static int ath10k_pci_wait_for_target_init(struct ath10k *ar)
return
ret
;
}
static
int
ath10k_pci_
device
_reset
(
struct
ath10k
*
ar
)
static
int
ath10k_pci_
cold
_reset
(
struct
ath10k
*
ar
)
{
int
i
,
ret
;
u32
val
;
...
...
drivers/net/wireless/ath/ath10k/txrx.c
View file @
9e4b4269
...
...
@@ -259,7 +259,7 @@ void ath10k_process_rx(struct ath10k *ar, struct htt_rx_info *info)
status
->
freq
=
ch
->
center_freq
;
ath10k_dbg
(
ATH10K_DBG_DATA
,
"rx skb %p len %u %s%s%s%s%s %srate_idx %u vht_nss %u freq %u band %u
\n
"
,
"rx skb %p len %u %s%s%s%s%s %srate_idx %u vht_nss %u freq %u band %u
flag 0x%x fcs-err %i
\n
"
,
info
->
skb
,
info
->
skb
->
len
,
status
->
flag
==
0
?
"legacy"
:
""
,
...
...
@@ -271,7 +271,7 @@ void ath10k_process_rx(struct ath10k *ar, struct htt_rx_info *info)
status
->
rate_idx
,
status
->
vht_nss
,
status
->
freq
,
status
->
band
);
status
->
band
,
status
->
flag
,
info
->
fcs_err
);
ath10k_dbg_dump
(
ATH10K_DBG_HTT_DUMP
,
NULL
,
"rx skb: "
,
info
->
skb
->
data
,
info
->
skb
->
len
);
...
...
drivers/net/wireless/ath/ath10k/wmi.c
View file @
9e4b4269
...
...
@@ -213,7 +213,7 @@ static struct wmi_cmd_map wmi_10x_cmd_map = {
.
p2p_go_set_beacon_ie
=
WMI_10X_P2P_GO_SET_BEACON_IE
,
.
p2p_go_set_probe_resp_ie
=
WMI_10X_P2P_GO_SET_PROBE_RESP_IE
,
.
p2p_set_vendor_ie_data_cmdid
=
WMI_CMD_UNSUPPORTED
,
.
ap_ps_peer_param_cmdid
=
WMI_
CMD_UNSUPPORTE
D
,
.
ap_ps_peer_param_cmdid
=
WMI_
10X_AP_PS_PEER_PARAM_CMDI
D
,
.
ap_ps_peer_uapsd_coex_cmdid
=
WMI_CMD_UNSUPPORTED
,
.
peer_rate_retry_sched_cmdid
=
WMI_10X_PEER_RATE_RETRY_SCHED_CMDID
,
.
wlan_profile_trigger_cmdid
=
WMI_10X_WLAN_PROFILE_TRIGGER_CMDID
,
...
...
@@ -420,7 +420,6 @@ static struct wmi_pdev_param_map wmi_pdev_param_map = {
.
bcnflt_stats_update_period
=
WMI_PDEV_PARAM_BCNFLT_STATS_UPDATE_PERIOD
,
.
pmf_qos
=
WMI_PDEV_PARAM_PMF_QOS
,
.
arp_ac_override
=
WMI_PDEV_PARAM_ARP_AC_OVERRIDE
,
.
arpdhcp_ac_override
=
WMI_PDEV_PARAM_UNSUPPORTED
,
.
dcs
=
WMI_PDEV_PARAM_DCS
,
.
ani_enable
=
WMI_PDEV_PARAM_ANI_ENABLE
,
.
ani_poll_period
=
WMI_PDEV_PARAM_ANI_POLL_PERIOD
,
...
...
@@ -472,8 +471,7 @@ static struct wmi_pdev_param_map wmi_10x_pdev_param_map = {
.
bcnflt_stats_update_period
=
WMI_10X_PDEV_PARAM_BCNFLT_STATS_UPDATE_PERIOD
,
.
pmf_qos
=
WMI_10X_PDEV_PARAM_PMF_QOS
,
.
arp_ac_override
=
WMI_PDEV_PARAM_UNSUPPORTED
,
.
arpdhcp_ac_override
=
WMI_10X_PDEV_PARAM_ARPDHCP_AC_OVERRIDE
,
.
arp_ac_override
=
WMI_10X_PDEV_PARAM_ARPDHCP_AC_OVERRIDE
,
.
dcs
=
WMI_10X_PDEV_PARAM_DCS
,
.
ani_enable
=
WMI_10X_PDEV_PARAM_ANI_ENABLE
,
.
ani_poll_period
=
WMI_10X_PDEV_PARAM_ANI_POLL_PERIOD
,
...
...
@@ -561,7 +559,6 @@ static int ath10k_wmi_cmd_send_nowait(struct ath10k *ar, struct sk_buff *skb,
static
void
ath10k_wmi_tx_beacon_nowait
(
struct
ath10k_vif
*
arvif
)
{
struct
wmi_bcn_tx_arg
arg
=
{
0
};
int
ret
;
lockdep_assert_held
(
&
arvif
->
ar
->
data_lock
);
...
...
@@ -569,18 +566,16 @@ static void ath10k_wmi_tx_beacon_nowait(struct ath10k_vif *arvif)
if
(
arvif
->
beacon
==
NULL
)
return
;
arg
.
vdev_id
=
arvif
->
vdev_id
;
arg
.
tx_rate
=
0
;
arg
.
tx_power
=
0
;
arg
.
bcn
=
arvif
->
beacon
->
data
;
arg
.
bcn_len
=
arvif
->
beacon
->
len
;
if
(
arvif
->
beacon_sent
)
return
;
ret
=
ath10k_wmi_beacon_send_
nowait
(
arvif
->
ar
,
&
arg
);
ret
=
ath10k_wmi_beacon_send_
ref_nowait
(
arvif
);
if
(
ret
)
return
;
dev_kfree_skb_any
(
arvif
->
beacon
);
arvif
->
beacon
=
NULL
;
/* We need to retain the arvif->beacon reference for DMA unmapping and
* freeing the skbuff later. */
arvif
->
beacon_sent
=
true
;
}
static
void
ath10k_wmi_tx_beacons_iter
(
void
*
data
,
u8
*
mac
,
...
...
@@ -1116,7 +1111,27 @@ static void ath10k_wmi_event_vdev_stopped(struct ath10k *ar,
static
void
ath10k_wmi_event_peer_sta_kickout
(
struct
ath10k
*
ar
,
struct
sk_buff
*
skb
)
{
ath10k_dbg
(
ATH10K_DBG_WMI
,
"WMI_PEER_STA_KICKOUT_EVENTID
\n
"
);
struct
wmi_peer_sta_kickout_event
*
ev
;
struct
ieee80211_sta
*
sta
;
ev
=
(
struct
wmi_peer_sta_kickout_event
*
)
skb
->
data
;
ath10k_dbg
(
ATH10K_DBG_WMI
,
"wmi event peer sta kickout %pM
\n
"
,
ev
->
peer_macaddr
.
addr
);
rcu_read_lock
();
sta
=
ieee80211_find_sta_by_ifaddr
(
ar
->
hw
,
ev
->
peer_macaddr
.
addr
,
NULL
);
if
(
!
sta
)
{
ath10k_warn
(
"Spurious quick kickout for STA %pM
\n
"
,
ev
->
peer_macaddr
.
addr
);
goto
exit
;
}
ieee80211_report_low_ack
(
sta
,
10
);
exit:
rcu_read_unlock
();
}
/*
...
...
@@ -1217,6 +1232,13 @@ static void ath10k_wmi_update_tim(struct ath10k *ar,
tim
->
bitmap_ctrl
=
!!
__le32_to_cpu
(
bcn_info
->
tim_info
.
tim_mcast
);
memcpy
(
tim
->
virtual_map
,
arvif
->
u
.
ap
.
tim_bitmap
,
pvm_len
);
if
(
tim
->
dtim_count
==
0
)
{
ATH10K_SKB_CB
(
bcn
)
->
bcn
.
dtim_zero
=
true
;
if
(
__le32_to_cpu
(
bcn_info
->
tim_info
.
tim_mcast
)
==
1
)
ATH10K_SKB_CB
(
bcn
)
->
bcn
.
deliver_cab
=
true
;
}
ath10k_dbg
(
ATH10K_DBG_MGMT
,
"dtim %d/%d mcast %d pvmlen %d
\n
"
,
tim
->
dtim_count
,
tim
->
dtim_period
,
tim
->
bitmap_ctrl
,
pvm_len
);
...
...
@@ -1385,6 +1407,17 @@ static void ath10k_wmi_event_host_swba(struct ath10k *ar, struct sk_buff *skb)
continue
;
}
/* There are no completions for beacons so wait for next SWBA
* before telling mac80211 to decrement CSA counter
*
* Once CSA counter is completed stop sending beacons until
* actual channel switch is done */
if
(
arvif
->
vif
->
csa_active
&&
ieee80211_csa_is_complete
(
arvif
->
vif
))
{
ieee80211_csa_finish
(
arvif
->
vif
);
continue
;
}
bcn
=
ieee80211_beacon_get
(
ar
->
hw
,
arvif
->
vif
);
if
(
!
bcn
)
{
ath10k_warn
(
"could not get mac80211 beacon
\n
"
);
...
...
@@ -1396,13 +1429,20 @@ static void ath10k_wmi_event_host_swba(struct ath10k *ar, struct sk_buff *skb)
ath10k_wmi_update_noa
(
ar
,
arvif
,
bcn
,
bcn_info
);
spin_lock_bh
(
&
ar
->
data_lock
);
if
(
arvif
->
beacon
)
{
ath10k_warn
(
"SWBA overrun on vdev %d
\n
"
,
arvif
->
vdev_id
);
if
(
!
arvif
->
beacon_sent
)
ath10k_warn
(
"SWBA overrun on vdev %d
\n
"
,
arvif
->
vdev_id
);
ath10k_skb_unmap
(
ar
->
dev
,
arvif
->
beacon
);
dev_kfree_skb_any
(
arvif
->
beacon
);
}
ath10k_skb_map
(
ar
->
dev
,
bcn
);
arvif
->
beacon
=
bcn
;
arvif
->
beacon_sent
=
false
;
ath10k_wmi_tx_beacon_nowait
(
arvif
);
spin_unlock_bh
(
&
ar
->
data_lock
);
...
...
@@ -2031,11 +2071,11 @@ static int ath10k_wmi_ready_event_rx(struct ath10k *ar, struct sk_buff *skb)
memcpy
(
ar
->
mac_addr
,
ev
->
mac_addr
.
addr
,
ETH_ALEN
);
ath10k_dbg
(
ATH10K_DBG_WMI
,
"wmi event ready sw_version %u abi_version %u mac_addr %pM status %d
\n
"
,
"wmi event ready sw_version %u abi_version %u mac_addr %pM status %d
skb->len %i ev-sz %zu
\n
"
,
__le32_to_cpu
(
ev
->
sw_version
),
__le32_to_cpu
(
ev
->
abi_version
),
ev
->
mac_addr
.
addr
,
__le32_to_cpu
(
ev
->
status
));
__le32_to_cpu
(
ev
->
status
)
,
skb
->
len
,
sizeof
(
*
ev
)
);
complete
(
&
ar
->
wmi
.
unified_ready
);
return
0
;
...
...
@@ -2403,7 +2443,7 @@ int ath10k_wmi_pdev_set_channel(struct ath10k *ar,
ar
->
wmi
.
cmd
->
pdev_set_channel_cmdid
);
}
int
ath10k_wmi_pdev_suspend_target
(
struct
ath10k
*
ar
)
int
ath10k_wmi_pdev_suspend_target
(
struct
ath10k
*
ar
,
u32
suspend_opt
)
{
struct
wmi_pdev_suspend_cmd
*
cmd
;
struct
sk_buff
*
skb
;
...
...
@@ -2413,7 +2453,7 @@ int ath10k_wmi_pdev_suspend_target(struct ath10k *ar)
return
-
ENOMEM
;
cmd
=
(
struct
wmi_pdev_suspend_cmd
*
)
skb
->
data
;
cmd
->
suspend_opt
=
WMI_PDEV_SUSPEND
;
cmd
->
suspend_opt
=
__cpu_to_le32
(
suspend_opt
)
;
return
ath10k_wmi_cmd_send
(
ar
,
skb
,
ar
->
wmi
.
cmd
->
pdev_suspend_cmdid
);
}
...
...
@@ -3411,25 +3451,41 @@ int ath10k_wmi_peer_assoc(struct ath10k *ar,
return
ath10k_wmi_cmd_send
(
ar
,
skb
,
ar
->
wmi
.
cmd
->
peer_assoc_cmdid
);
}
int
ath10k_wmi_beacon_send_nowait
(
struct
ath10k
*
ar
,
const
struct
wmi_bcn_tx_arg
*
arg
)
/* This function assumes the beacon is already DMA mapped */
int
ath10k_wmi_beacon_send_ref_nowait
(
struct
ath10k_vif
*
arvif
)
{
struct
wmi_bcn_tx_cmd
*
cmd
;
struct
wmi_bcn_tx_
ref_
cmd
*
cmd
;
struct
sk_buff
*
skb
;
struct
sk_buff
*
beacon
=
arvif
->
beacon
;
struct
ath10k
*
ar
=
arvif
->
ar
;
struct
ieee80211_hdr
*
hdr
;
int
ret
;
u16
fc
;
skb
=
ath10k_wmi_alloc_skb
(
sizeof
(
*
cmd
)
+
arg
->
bcn_len
);
skb
=
ath10k_wmi_alloc_skb
(
sizeof
(
*
cmd
));
if
(
!
skb
)
return
-
ENOMEM
;
cmd
=
(
struct
wmi_bcn_tx_cmd
*
)
skb
->
data
;
cmd
->
hdr
.
vdev_id
=
__cpu_to_le32
(
arg
->
vdev_id
);
cmd
->
hdr
.
tx_rate
=
__cpu_to_le32
(
arg
->
tx_rate
);
cmd
->
hdr
.
tx_power
=
__cpu_to_le32
(
arg
->
tx_power
);
cmd
->
hdr
.
bcn_len
=
__cpu_to_le32
(
arg
->
bcn_len
);
memcpy
(
cmd
->
bcn
,
arg
->
bcn
,
arg
->
bcn_len
);
hdr
=
(
struct
ieee80211_hdr
*
)
beacon
->
data
;
fc
=
le16_to_cpu
(
hdr
->
frame_control
);
cmd
=
(
struct
wmi_bcn_tx_ref_cmd
*
)
skb
->
data
;
cmd
->
vdev_id
=
__cpu_to_le32
(
arvif
->
vdev_id
);
cmd
->
data_len
=
__cpu_to_le32
(
beacon
->
len
);
cmd
->
data_ptr
=
__cpu_to_le32
(
ATH10K_SKB_CB
(
beacon
)
->
paddr
);
cmd
->
msdu_id
=
0
;
cmd
->
frame_control
=
__cpu_to_le32
(
fc
);
cmd
->
flags
=
0
;
if
(
ATH10K_SKB_CB
(
beacon
)
->
bcn
.
dtim_zero
)
cmd
->
flags
|=
__cpu_to_le32
(
WMI_BCN_TX_REF_FLAG_DTIM_ZERO
);
if
(
ATH10K_SKB_CB
(
beacon
)
->
bcn
.
deliver_cab
)
cmd
->
flags
|=
__cpu_to_le32
(
WMI_BCN_TX_REF_FLAG_DELIVER_CAB
);
ret
=
ath10k_wmi_cmd_send_nowait
(
ar
,
skb
,
ar
->
wmi
.
cmd
->
pdev_send_bcn_cmdid
);
ret
=
ath10k_wmi_cmd_send_nowait
(
ar
,
skb
,
ar
->
wmi
.
cmd
->
bcn_tx_cmdid
);
if
(
ret
)
dev_kfree_skb
(
skb
);
...
...
drivers/net/wireless/ath/ath10k/wmi.h
View file @
9e4b4269
...
...
@@ -2277,7 +2277,6 @@ struct wmi_pdev_param_map {
u32
bcnflt_stats_update_period
;
u32
pmf_qos
;
u32
arp_ac_override
;
u32
arpdhcp_ac_override
;
u32
dcs
;
u32
ani_enable
;
u32
ani_poll_period
;
...
...
@@ -3403,6 +3402,24 @@ struct wmi_bcn_tx_arg {
const
void
*
bcn
;
};
enum
wmi_bcn_tx_ref_flags
{
WMI_BCN_TX_REF_FLAG_DTIM_ZERO
=
0x1
,
WMI_BCN_TX_REF_FLAG_DELIVER_CAB
=
0x2
,
};
struct
wmi_bcn_tx_ref_cmd
{
__le32
vdev_id
;
__le32
data_len
;
/* physical address of the frame - dma pointer */
__le32
data_ptr
;
/* id for host to track */
__le32
msdu_id
;
/* frame ctrl to setup PPDU desc */
__le32
frame_control
;
/* to control CABQ traffic: WMI_BCN_TX_REF_FLAG_ */
__le32
flags
;
}
__packed
;
/* Beacon filter */
#define WMI_BCN_FILTER_ALL 0
/* Filter all beacons */
#define WMI_BCN_FILTER_NONE 1
/* Pass all beacons */
...
...
@@ -3859,6 +3876,12 @@ enum wmi_peer_smps_state {
WMI_PEER_SMPS_DYNAMIC
=
0x2
};
enum
wmi_peer_chwidth
{
WMI_PEER_CHWIDTH_20MHZ
=
0
,
WMI_PEER_CHWIDTH_40MHZ
=
1
,
WMI_PEER_CHWIDTH_80MHZ
=
2
,
};
enum
wmi_peer_param
{
WMI_PEER_SMPS_STATE
=
0x1
,
/* see %wmi_peer_smps_state */
WMI_PEER_AMPDU
=
0x2
,
...
...
@@ -4039,6 +4062,10 @@ struct wmi_chan_info_event {
__le32
cycle_count
;
}
__packed
;
struct
wmi_peer_sta_kickout_event
{
struct
wmi_mac_addr
peer_macaddr
;
}
__packed
;
#define WMI_CHAN_INFO_FLAG_COMPLETE BIT(0)
/* FIXME: empirically extrapolated */
...
...
@@ -4172,7 +4199,7 @@ int ath10k_wmi_wait_for_unified_ready(struct ath10k *ar);
int
ath10k_wmi_connect_htc_service
(
struct
ath10k
*
ar
);
int
ath10k_wmi_pdev_set_channel
(
struct
ath10k
*
ar
,
const
struct
wmi_channel_arg
*
);
int
ath10k_wmi_pdev_suspend_target
(
struct
ath10k
*
ar
);
int
ath10k_wmi_pdev_suspend_target
(
struct
ath10k
*
ar
,
u32
suspend_opt
);
int
ath10k_wmi_pdev_resume_target
(
struct
ath10k
*
ar
);
int
ath10k_wmi_pdev_set_regdomain
(
struct
ath10k
*
ar
,
u16
rd
,
u16
rd2g
,
u16
rd5g
,
u16
ctl2g
,
u16
ctl5g
);
...
...
@@ -4219,8 +4246,7 @@ int ath10k_wmi_set_ap_ps_param(struct ath10k *ar, u32 vdev_id, const u8 *mac,
enum
wmi_ap_ps_peer_param
param_id
,
u32
value
);
int
ath10k_wmi_scan_chan_list
(
struct
ath10k
*
ar
,
const
struct
wmi_scan_chan_list_arg
*
arg
);
int
ath10k_wmi_beacon_send_nowait
(
struct
ath10k
*
ar
,
const
struct
wmi_bcn_tx_arg
*
arg
);
int
ath10k_wmi_beacon_send_ref_nowait
(
struct
ath10k_vif
*
arvif
);
int
ath10k_wmi_pdev_set_wmm_params
(
struct
ath10k
*
ar
,
const
struct
wmi_pdev_set_wmm_params_arg
*
arg
);
int
ath10k_wmi_request_stats
(
struct
ath10k
*
ar
,
enum
wmi_stats_id
stats_id
);
...
...
drivers/net/wireless/ath/ath6kl/usb.c
View file @
9e4b4269
...
...
@@ -24,7 +24,7 @@
/* constants */
#define TX_URB_COUNT 32
#define RX_URB_COUNT 32
#define ATH6KL_USB_RX_BUFFER_SIZE
1700
#define ATH6KL_USB_RX_BUFFER_SIZE
4096
/* tx/rx pipes for usb */
enum
ATH6KL_USB_PIPE_ID
{
...
...
@@ -481,8 +481,8 @@ static void ath6kl_usb_start_recv_pipes(struct ath6kl_usb *ar_usb)
* ATH6KL_USB_RX_BUFFER_SIZE);
*/
ar_usb
->
pipes
[
ATH6KL_USB_PIPE_RX_DATA
].
urb_cnt_thresh
=
ar_usb
->
pipes
[
ATH6KL_USB_PIPE_RX_DATA
].
urb_alloc
/
2
;
ar_usb
->
pipes
[
ATH6KL_USB_PIPE_RX_DATA
].
urb_cnt_thresh
=
1
;
ath6kl_usb_post_recv_transfers
(
&
ar_usb
->
pipes
[
ATH6KL_USB_PIPE_RX_DATA
],
ATH6KL_USB_RX_BUFFER_SIZE
);
}
...
...
drivers/net/wireless/ath/ath6kl/wmi.c
View file @
9e4b4269
...
...
@@ -914,7 +914,7 @@ ath6kl_get_regpair(u16 regdmn)
return
NULL
;
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
regDomainPairs
);
i
++
)
{
if
(
regDomainPairs
[
i
].
reg
DmnEnum
==
regdmn
)
if
(
regDomainPairs
[
i
].
reg
_domain
==
regdmn
)
return
&
regDomainPairs
[
i
];
}
...
...
@@ -954,7 +954,7 @@ static void ath6kl_wmi_regdomain_event(struct wmi *wmi, u8 *datap, int len)
country
=
ath6kl_regd_find_country_by_rd
((
u16
)
reg_code
);
if
(
regpair
)
ath6kl_dbg
(
ATH6KL_DBG_WMI
,
"Regpair used: 0x%0x
\n
"
,
regpair
->
reg
DmnEnum
);
regpair
->
reg
_domain
);
else
ath6kl_warn
(
"Regpair not found reg_code 0x%0x
\n
"
,
reg_code
);
...
...
drivers/net/wireless/ath/regd.c
View file @
9e4b4269
...
...
@@ -222,7 +222,7 @@ static const struct ieee80211_regdomain *ath_default_world_regdomain(void)
static
const
struct
ieee80211_regdomain
*
ath_world_regdomain
(
struct
ath_regulatory
*
reg
)
{
switch
(
reg
->
regpair
->
reg
DmnEnum
)
{
switch
(
reg
->
regpair
->
reg
_domain
)
{
case
0x60
:
case
0x61
:
case
0x62
:
...
...
@@ -431,7 +431,7 @@ static void ath_reg_apply_world_flags(struct wiphy *wiphy,
enum
nl80211_reg_initiator
initiator
,
struct
ath_regulatory
*
reg
)
{
switch
(
reg
->
regpair
->
reg
DmnEnum
)
{
switch
(
reg
->
regpair
->
reg
_domain
)
{
case
0x60
:
case
0x63
:
case
0x66
:
...
...
@@ -560,7 +560,7 @@ static bool ath_regd_is_eeprom_valid(struct ath_regulatory *reg)
printk
(
KERN_DEBUG
"ath: EEPROM indicates we "
"should expect a direct regpair map
\n
"
);
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
regDomainPairs
);
i
++
)
if
(
regDomainPairs
[
i
].
reg
DmnEnum
==
rd
)
if
(
regDomainPairs
[
i
].
reg
_domain
==
rd
)
return
true
;
}
printk
(
KERN_DEBUG
...
...
@@ -617,7 +617,7 @@ ath_get_regpair(int regdmn)
if
(
regdmn
==
NO_ENUMRD
)
return
NULL
;
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
regDomainPairs
);
i
++
)
{
if
(
regDomainPairs
[
i
].
reg
DmnEnum
==
regdmn
)
if
(
regDomainPairs
[
i
].
reg
_domain
==
regdmn
)
return
&
regDomainPairs
[
i
];
}
return
NULL
;
...
...
@@ -741,7 +741,7 @@ static int __ath_regd_init(struct ath_regulatory *reg)
printk
(
KERN_DEBUG
"ath: Country alpha2 being used: %c%c
\n
"
,
reg
->
alpha2
[
0
],
reg
->
alpha2
[
1
]);
printk
(
KERN_DEBUG
"ath: Regpair used: 0x%0x
\n
"
,
reg
->
regpair
->
reg
DmnEnum
);
reg
->
regpair
->
reg
_domain
);
return
0
;
}
...
...
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