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
1f807827
Commit
1f807827
authored
Aug 02, 2013
by
John W. Linville
Browse files
Options
Browse Files
Download
Plain Diff
Merge tag 'for-linville-20130730' of
git://github.com/kvalo/ath6kl
parents
20416229
424121c3
Changes
19
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
19 changed files
with
959 additions
and
454 deletions
+959
-454
drivers/net/wireless/ath/ath10k/bmi.c
drivers/net/wireless/ath/ath10k/bmi.c
+10
-2
drivers/net/wireless/ath/ath10k/bmi.h
drivers/net/wireless/ath/ath10k/bmi.h
+1
-0
drivers/net/wireless/ath/ath10k/ce.c
drivers/net/wireless/ath/ath10k/ce.c
+1
-1
drivers/net/wireless/ath/ath10k/core.c
drivers/net/wireless/ath/ath10k/core.c
+210
-111
drivers/net/wireless/ath/ath10k/core.h
drivers/net/wireless/ath/ath10k/core.h
+36
-14
drivers/net/wireless/ath/ath10k/debug.c
drivers/net/wireless/ath/ath10k/debug.c
+73
-14
drivers/net/wireless/ath/ath10k/hif.h
drivers/net/wireless/ath/ath10k/hif.h
+44
-5
drivers/net/wireless/ath/ath10k/htc.c
drivers/net/wireless/ath/ath10k/htc.c
+25
-36
drivers/net/wireless/ath/ath10k/htc.h
drivers/net/wireless/ath/ath10k/htc.h
+3
-5
drivers/net/wireless/ath/ath10k/htt.c
drivers/net/wireless/ath/ath10k/htt.c
+14
-13
drivers/net/wireless/ath/ath10k/htt.h
drivers/net/wireless/ath/ath10k/htt.h
+1
-2
drivers/net/wireless/ath/ath10k/htt_rx.c
drivers/net/wireless/ath/ath10k/htt_rx.c
+2
-1
drivers/net/wireless/ath/ath10k/htt_tx.c
drivers/net/wireless/ath/ath10k/htt_tx.c
+6
-6
drivers/net/wireless/ath/ath10k/mac.c
drivers/net/wireless/ath/ath10k/mac.c
+346
-63
drivers/net/wireless/ath/ath10k/mac.h
drivers/net/wireless/ath/ath10k/mac.h
+1
-0
drivers/net/wireless/ath/ath10k/pci.c
drivers/net/wireless/ath/ath10k/pci.c
+129
-175
drivers/net/wireless/ath/ath10k/pci.h
drivers/net/wireless/ath/ath10k/pci.h
+2
-2
drivers/net/wireless/ath/ath10k/wmi.c
drivers/net/wireless/ath/ath10k/wmi.c
+36
-4
drivers/net/wireless/ath/ath10k/wmi.h
drivers/net/wireless/ath/ath10k/wmi.h
+19
-0
No files found.
drivers/net/wireless/ath/ath10k/bmi.c
View file @
1f807827
...
@@ -20,6 +20,12 @@
...
@@ -20,6 +20,12 @@
#include "debug.h"
#include "debug.h"
#include "htc.h"
#include "htc.h"
void
ath10k_bmi_start
(
struct
ath10k
*
ar
)
{
ath10k_dbg
(
ATH10K_DBG_CORE
,
"BMI started
\n
"
);
ar
->
bmi
.
done_sent
=
false
;
}
int
ath10k_bmi_done
(
struct
ath10k
*
ar
)
int
ath10k_bmi_done
(
struct
ath10k
*
ar
)
{
{
struct
bmi_cmd
cmd
;
struct
bmi_cmd
cmd
;
...
@@ -105,7 +111,8 @@ int ath10k_bmi_read_memory(struct ath10k *ar,
...
@@ -105,7 +111,8 @@ int ath10k_bmi_read_memory(struct ath10k *ar,
ret
=
ath10k_hif_exchange_bmi_msg
(
ar
,
&
cmd
,
cmdlen
,
ret
=
ath10k_hif_exchange_bmi_msg
(
ar
,
&
cmd
,
cmdlen
,
&
resp
,
&
rxlen
);
&
resp
,
&
rxlen
);
if
(
ret
)
{
if
(
ret
)
{
ath10k_warn
(
"unable to read from the device
\n
"
);
ath10k_warn
(
"unable to read from the device (%d)
\n
"
,
ret
);
return
ret
;
return
ret
;
}
}
...
@@ -149,7 +156,8 @@ int ath10k_bmi_write_memory(struct ath10k *ar,
...
@@ -149,7 +156,8 @@ int ath10k_bmi_write_memory(struct ath10k *ar,
ret
=
ath10k_hif_exchange_bmi_msg
(
ar
,
&
cmd
,
hdrlen
+
txlen
,
ret
=
ath10k_hif_exchange_bmi_msg
(
ar
,
&
cmd
,
hdrlen
+
txlen
,
NULL
,
NULL
);
NULL
,
NULL
);
if
(
ret
)
{
if
(
ret
)
{
ath10k_warn
(
"unable to write to the device
\n
"
);
ath10k_warn
(
"unable to write to the device (%d)
\n
"
,
ret
);
return
ret
;
return
ret
;
}
}
...
...
drivers/net/wireless/ath/ath10k/bmi.h
View file @
1f807827
...
@@ -184,6 +184,7 @@ struct bmi_target_info {
...
@@ -184,6 +184,7 @@ struct bmi_target_info {
#define BMI_CE_NUM_TO_TARG 0
#define BMI_CE_NUM_TO_TARG 0
#define BMI_CE_NUM_TO_HOST 1
#define BMI_CE_NUM_TO_HOST 1
void
ath10k_bmi_start
(
struct
ath10k
*
ar
);
int
ath10k_bmi_done
(
struct
ath10k
*
ar
);
int
ath10k_bmi_done
(
struct
ath10k
*
ar
);
int
ath10k_bmi_get_target_info
(
struct
ath10k
*
ar
,
int
ath10k_bmi_get_target_info
(
struct
ath10k
*
ar
,
struct
bmi_target_info
*
target_info
);
struct
bmi_target_info
*
target_info
);
...
...
drivers/net/wireless/ath/ath10k/ce.c
View file @
1f807827
...
@@ -79,7 +79,7 @@ static inline void ath10k_ce_src_ring_write_index_set(struct ath10k *ar,
...
@@ -79,7 +79,7 @@ static inline void ath10k_ce_src_ring_write_index_set(struct ath10k *ar,
struct
ath10k_pci
*
ar_pci
=
ath10k_pci_priv
(
ar
);
struct
ath10k_pci
*
ar_pci
=
ath10k_pci_priv
(
ar
);
void
__iomem
*
indicator_addr
;
void
__iomem
*
indicator_addr
;
if
(
!
test_bit
(
ATH10K_PCI_FEATURE_HW_1_0_W
A
RKAROUND
,
ar_pci
->
features
))
{
if
(
!
test_bit
(
ATH10K_PCI_FEATURE_HW_1_0_W
O
RKAROUND
,
ar_pci
->
features
))
{
ath10k_pci_write32
(
ar
,
ce_ctrl_addr
+
SR_WR_INDEX_ADDRESS
,
n
);
ath10k_pci_write32
(
ar
,
ce_ctrl_addr
+
SR_WR_INDEX_ADDRESS
,
n
);
return
;
return
;
}
}
...
...
drivers/net/wireless/ath/ath10k/core.c
View file @
1f807827
This diff is collapsed.
Click to expand it.
drivers/net/wireless/ath/ath10k/core.h
View file @
1f807827
...
@@ -23,6 +23,7 @@
...
@@ -23,6 +23,7 @@
#include <linux/types.h>
#include <linux/types.h>
#include <linux/pci.h>
#include <linux/pci.h>
#include "htt.h"
#include "htc.h"
#include "htc.h"
#include "hw.h"
#include "hw.h"
#include "targaddrs.h"
#include "targaddrs.h"
...
@@ -43,10 +44,6 @@
...
@@ -43,10 +44,6 @@
struct
ath10k
;
struct
ath10k
;
enum
ath10k_bus
{
ATH10K_BUS_PCI
,
};
struct
ath10k_skb_cb
{
struct
ath10k_skb_cb
{
dma_addr_t
paddr
;
dma_addr_t
paddr
;
bool
is_mapped
;
bool
is_mapped
;
...
@@ -250,6 +247,28 @@ struct ath10k_debug {
...
@@ -250,6 +247,28 @@ struct ath10k_debug {
struct
completion
event_stats_compl
;
struct
completion
event_stats_compl
;
};
};
enum
ath10k_state
{
ATH10K_STATE_OFF
=
0
,
ATH10K_STATE_ON
,
/* When doing firmware recovery the device is first powered down.
* mac80211 is supposed to call in to start() hook later on. It is
* however possible that driver unloading and firmware crash overlap.
* mac80211 can wait on conf_mutex in stop() while the device is
* stopped in ath10k_core_restart() work holding conf_mutex. The state
* RESTARTED means that the device is up and mac80211 has started hw
* reconfiguration. Once mac80211 is done with the reconfiguration we
* set the state to STATE_ON in restart_complete(). */
ATH10K_STATE_RESTARTING
,
ATH10K_STATE_RESTARTED
,
/* The device has crashed while restarting hw. This state is like ON
* but commands are blocked in HTC and -ECOMM response is given. This
* prevents completion timeouts and makes the driver more responsive to
* userspace commands. This is also prevents recursive recovery. */
ATH10K_STATE_WEDGED
,
};
struct
ath10k
{
struct
ath10k
{
struct
ath_common
ath_common
;
struct
ath_common
ath_common
;
struct
ieee80211_hw
*
hw
;
struct
ieee80211_hw
*
hw
;
...
@@ -274,19 +293,16 @@ struct ath10k {
...
@@ -274,19 +293,16 @@ struct ath10k {
struct
{
struct
{
void
*
priv
;
void
*
priv
;
enum
ath10k_bus
bus
;
const
struct
ath10k_hif_ops
*
ops
;
const
struct
ath10k_hif_ops
*
ops
;
}
hif
;
}
hif
;
struct
ath10k_wmi
wmi
;
wait_queue_head_t
event_queue
;
wait_queue_head_t
event_queue
;
bool
is_target_paused
;
bool
is_target_paused
;
struct
ath10k_bmi
bmi
;
struct
ath10k_bmi
bmi
;
struct
ath10k_wmi
wmi
;
struct
ath10k_htc
*
htc
;
struct
ath10k_htc
htc
;
struct
ath10k_htt
*
htt
;
struct
ath10k_htt
htt
;
struct
ath10k_hw_params
{
struct
ath10k_hw_params
{
u32
id
;
u32
id
;
...
@@ -301,6 +317,10 @@ struct ath10k {
...
@@ -301,6 +317,10 @@ struct ath10k {
}
fw
;
}
fw
;
}
hw_params
;
}
hw_params
;
const
struct
firmware
*
board_data
;
const
struct
firmware
*
otp
;
const
struct
firmware
*
firmware
;
struct
{
struct
{
struct
completion
started
;
struct
completion
started
;
struct
completion
completed
;
struct
completion
completed
;
...
@@ -350,20 +370,22 @@ struct ath10k {
...
@@ -350,20 +370,22 @@ struct ath10k {
struct
completion
offchan_tx_completed
;
struct
completion
offchan_tx_completed
;
struct
sk_buff
*
offchan_tx_skb
;
struct
sk_buff
*
offchan_tx_skb
;
enum
ath10k_state
state
;
struct
work_struct
restart_work
;
#ifdef CONFIG_ATH10K_DEBUGFS
#ifdef CONFIG_ATH10K_DEBUGFS
struct
ath10k_debug
debug
;
struct
ath10k_debug
debug
;
#endif
#endif
};
};
struct
ath10k
*
ath10k_core_create
(
void
*
hif_priv
,
struct
device
*
dev
,
struct
ath10k
*
ath10k_core_create
(
void
*
hif_priv
,
struct
device
*
dev
,
enum
ath10k_bus
bus
,
const
struct
ath10k_hif_ops
*
hif_ops
);
const
struct
ath10k_hif_ops
*
hif_ops
);
void
ath10k_core_destroy
(
struct
ath10k
*
ar
);
void
ath10k_core_destroy
(
struct
ath10k
*
ar
);
int
ath10k_core_start
(
struct
ath10k
*
ar
);
void
ath10k_core_stop
(
struct
ath10k
*
ar
);
int
ath10k_core_register
(
struct
ath10k
*
ar
);
int
ath10k_core_register
(
struct
ath10k
*
ar
);
void
ath10k_core_unregister
(
struct
ath10k
*
ar
);
void
ath10k_core_unregister
(
struct
ath10k
*
ar
);
int
ath10k_core_target_suspend
(
struct
ath10k
*
ar
);
int
ath10k_core_target_resume
(
struct
ath10k
*
ar
);
#endif
/* _CORE_H_ */
#endif
/* _CORE_H_ */
drivers/net/wireless/ath/ath10k/debug.c
View file @
1f807827
...
@@ -161,7 +161,7 @@ void ath10k_debug_read_target_stats(struct ath10k *ar,
...
@@ -161,7 +161,7 @@ void ath10k_debug_read_target_stats(struct ath10k *ar,
struct
wmi_pdev_stats
*
ps
;
struct
wmi_pdev_stats
*
ps
;
int
i
;
int
i
;
mutex_lock
(
&
ar
->
conf_mutex
);
spin_lock_bh
(
&
ar
->
data_lock
);
stats
=
&
ar
->
debug
.
target_stats
;
stats
=
&
ar
->
debug
.
target_stats
;
...
@@ -259,6 +259,7 @@ void ath10k_debug_read_target_stats(struct ath10k *ar,
...
@@ -259,6 +259,7 @@ void ath10k_debug_read_target_stats(struct ath10k *ar,
}
}
}
}
spin_unlock_bh
(
&
ar
->
data_lock
);
mutex_unlock
(
&
ar
->
conf_mutex
);
mutex_unlock
(
&
ar
->
conf_mutex
);
complete
(
&
ar
->
debug
.
event_stats_compl
);
complete
(
&
ar
->
debug
.
event_stats_compl
);
}
}
...
@@ -268,35 +269,35 @@ static ssize_t ath10k_read_fw_stats(struct file *file, char __user *user_buf,
...
@@ -268,35 +269,35 @@ static ssize_t ath10k_read_fw_stats(struct file *file, char __user *user_buf,
{
{
struct
ath10k
*
ar
=
file
->
private_data
;
struct
ath10k
*
ar
=
file
->
private_data
;
struct
ath10k_target_stats
*
fw_stats
;
struct
ath10k_target_stats
*
fw_stats
;
char
*
buf
;
char
*
buf
=
NULL
;
unsigned
int
len
=
0
,
buf_len
=
2500
;
unsigned
int
len
=
0
,
buf_len
=
2500
;
ssize_t
ret_cnt
;
ssize_t
ret_cnt
=
0
;
long
left
;
long
left
;
int
i
;
int
i
;
int
ret
;
int
ret
;
fw_stats
=
&
ar
->
debug
.
target_stats
;
fw_stats
=
&
ar
->
debug
.
target_stats
;
mutex_lock
(
&
ar
->
conf_mutex
);
if
(
ar
->
state
!=
ATH10K_STATE_ON
)
goto
exit
;
buf
=
kzalloc
(
buf_len
,
GFP_KERNEL
);
buf
=
kzalloc
(
buf_len
,
GFP_KERNEL
);
if
(
!
buf
)
if
(
!
buf
)
return
-
ENOMEM
;
goto
exit
;
ret
=
ath10k_wmi_request_stats
(
ar
,
WMI_REQUEST_PEER_STAT
);
ret
=
ath10k_wmi_request_stats
(
ar
,
WMI_REQUEST_PEER_STAT
);
if
(
ret
)
{
if
(
ret
)
{
ath10k_warn
(
"could not request stats (%d)
\n
"
,
ret
);
ath10k_warn
(
"could not request stats (%d)
\n
"
,
ret
);
kfree
(
buf
);
goto
exit
;
return
-
EIO
;
}
}
left
=
wait_for_completion_timeout
(
&
ar
->
debug
.
event_stats_compl
,
1
*
HZ
);
left
=
wait_for_completion_timeout
(
&
ar
->
debug
.
event_stats_compl
,
1
*
HZ
);
if
(
left
<=
0
)
goto
exit
;
if
(
left
<=
0
)
{
spin_lock_bh
(
&
ar
->
data_lock
);
kfree
(
buf
);
return
-
ETIMEDOUT
;
}
mutex_lock
(
&
ar
->
conf_mutex
);
len
+=
scnprintf
(
buf
+
len
,
buf_len
-
len
,
"
\n
"
);
len
+=
scnprintf
(
buf
+
len
,
buf_len
-
len
,
"
\n
"
);
len
+=
scnprintf
(
buf
+
len
,
buf_len
-
len
,
"%30s
\n
"
,
len
+=
scnprintf
(
buf
+
len
,
buf_len
-
len
,
"%30s
\n
"
,
"ath10k PDEV stats"
);
"ath10k PDEV stats"
);
...
@@ -424,14 +425,15 @@ static ssize_t ath10k_read_fw_stats(struct file *file, char __user *user_buf,
...
@@ -424,14 +425,15 @@ static ssize_t ath10k_read_fw_stats(struct file *file, char __user *user_buf,
fw_stats
->
peer_stat
[
i
].
peer_tx_rate
);
fw_stats
->
peer_stat
[
i
].
peer_tx_rate
);
len
+=
scnprintf
(
buf
+
len
,
buf_len
-
len
,
"
\n
"
);
len
+=
scnprintf
(
buf
+
len
,
buf_len
-
len
,
"
\n
"
);
}
}
spin_unlock_bh
(
&
ar
->
data_lock
);
if
(
len
>
buf_len
)
if
(
len
>
buf_len
)
len
=
buf_len
;
len
=
buf_len
;
ret_cnt
=
simple_read_from_buffer
(
user_buf
,
count
,
ppos
,
buf
,
len
);
ret_cnt
=
simple_read_from_buffer
(
user_buf
,
count
,
ppos
,
buf
,
len
);
exit:
mutex_unlock
(
&
ar
->
conf_mutex
);
mutex_unlock
(
&
ar
->
conf_mutex
);
kfree
(
buf
);
kfree
(
buf
);
return
ret_cnt
;
return
ret_cnt
;
}
}
...
@@ -443,6 +445,60 @@ static const struct file_operations fops_fw_stats = {
...
@@ -443,6 +445,60 @@ static const struct file_operations fops_fw_stats = {
.
llseek
=
default_llseek
,
.
llseek
=
default_llseek
,
};
};
static
ssize_t
ath10k_read_simulate_fw_crash
(
struct
file
*
file
,
char
__user
*
user_buf
,
size_t
count
,
loff_t
*
ppos
)
{
const
char
buf
[]
=
"To simulate firmware crash write the keyword"
" `crash` to this file.
\n
This will force firmware"
" to report a crash to the host system.
\n
"
;
return
simple_read_from_buffer
(
user_buf
,
count
,
ppos
,
buf
,
strlen
(
buf
));
}
static
ssize_t
ath10k_write_simulate_fw_crash
(
struct
file
*
file
,
const
char
__user
*
user_buf
,
size_t
count
,
loff_t
*
ppos
)
{
struct
ath10k
*
ar
=
file
->
private_data
;
char
buf
[
32
]
=
{};
int
ret
;
mutex_lock
(
&
ar
->
conf_mutex
);
simple_write_to_buffer
(
buf
,
sizeof
(
buf
)
-
1
,
ppos
,
user_buf
,
count
);
if
(
strcmp
(
buf
,
"crash"
)
&&
strcmp
(
buf
,
"crash
\n
"
))
{
ret
=
-
EINVAL
;
goto
exit
;
}
if
(
ar
->
state
!=
ATH10K_STATE_ON
&&
ar
->
state
!=
ATH10K_STATE_RESTARTED
)
{
ret
=
-
ENETDOWN
;
goto
exit
;
}
ath10k_info
(
"simulating firmware crash
\n
"
);
ret
=
ath10k_wmi_force_fw_hang
(
ar
,
WMI_FORCE_FW_HANG_ASSERT
,
0
);
if
(
ret
)
ath10k_warn
(
"failed to force fw hang (%d)
\n
"
,
ret
);
if
(
ret
==
0
)
ret
=
count
;
exit:
mutex_unlock
(
&
ar
->
conf_mutex
);
return
ret
;
}
static
const
struct
file_operations
fops_simulate_fw_crash
=
{
.
read
=
ath10k_read_simulate_fw_crash
,
.
write
=
ath10k_write_simulate_fw_crash
,
.
open
=
simple_open
,
.
owner
=
THIS_MODULE
,
.
llseek
=
default_llseek
,
};
int
ath10k_debug_create
(
struct
ath10k
*
ar
)
int
ath10k_debug_create
(
struct
ath10k
*
ar
)
{
{
ar
->
debug
.
debugfs_phy
=
debugfs_create_dir
(
"ath10k"
,
ar
->
debug
.
debugfs_phy
=
debugfs_create_dir
(
"ath10k"
,
...
@@ -459,6 +515,9 @@ int ath10k_debug_create(struct ath10k *ar)
...
@@ -459,6 +515,9 @@ int ath10k_debug_create(struct ath10k *ar)
debugfs_create_file
(
"wmi_services"
,
S_IRUSR
,
ar
->
debug
.
debugfs_phy
,
ar
,
debugfs_create_file
(
"wmi_services"
,
S_IRUSR
,
ar
->
debug
.
debugfs_phy
,
ar
,
&
fops_wmi_services
);
&
fops_wmi_services
);
debugfs_create_file
(
"simulate_fw_crash"
,
S_IRUSR
,
ar
->
debug
.
debugfs_phy
,
ar
,
&
fops_simulate_fw_crash
);
return
0
;
return
0
;
}
}
#endif
/* CONFIG_ATH10K_DEBUGFS */
#endif
/* CONFIG_ATH10K_DEBUGFS */
...
...
drivers/net/wireless/ath/ath10k/hif.h
View file @
1f807827
...
@@ -46,8 +46,11 @@ struct ath10k_hif_ops {
...
@@ -46,8 +46,11 @@ struct ath10k_hif_ops {
void
*
request
,
u32
request_len
,
void
*
request
,
u32
request_len
,
void
*
response
,
u32
*
response_len
);
void
*
response
,
u32
*
response_len
);
/* Post BMI phase, after FW is loaded. Starts regular operation */
int
(
*
start
)(
struct
ath10k
*
ar
);
int
(
*
start
)(
struct
ath10k
*
ar
);
/* Clean up what start() did. This does not revert to BMI phase. If
* desired so, call power_down() and power_up() */
void
(
*
stop
)(
struct
ath10k
*
ar
);
void
(
*
stop
)(
struct
ath10k
*
ar
);
int
(
*
map_service_to_pipe
)(
struct
ath10k
*
ar
,
u16
service_id
,
int
(
*
map_service_to_pipe
)(
struct
ath10k
*
ar
,
u16
service_id
,
...
@@ -66,10 +69,20 @@ struct ath10k_hif_ops {
...
@@ -66,10 +69,20 @@ struct ath10k_hif_ops {
*/
*/
void
(
*
send_complete_check
)(
struct
ath10k
*
ar
,
u8
pipe_id
,
int
force
);
void
(
*
send_complete_check
)(
struct
ath10k
*
ar
,
u8
pipe_id
,
int
force
);
void
(
*
init
)(
struct
ath10k
*
ar
,
void
(
*
set_callbacks
)(
struct
ath10k
*
ar
,
struct
ath10k_hif_cb
*
callbacks
);
struct
ath10k_hif_cb
*
callbacks
);
u16
(
*
get_free_queue_number
)(
struct
ath10k
*
ar
,
u8
pipe_id
);
u16
(
*
get_free_queue_number
)(
struct
ath10k
*
ar
,
u8
pipe_id
);
/* Power up the device and enter BMI transfer mode for FW download */
int
(
*
power_up
)(
struct
ath10k
*
ar
);
/* Power down the device and free up resources. stop() must be called
* before this if start() was called earlier */
void
(
*
power_down
)(
struct
ath10k
*
ar
);
int
(
*
suspend
)(
struct
ath10k
*
ar
);
int
(
*
resume
)(
struct
ath10k
*
ar
);
};
};
...
@@ -122,10 +135,10 @@ static inline void ath10k_hif_send_complete_check(struct ath10k *ar,
...
@@ -122,10 +135,10 @@ static inline void ath10k_hif_send_complete_check(struct ath10k *ar,
ar
->
hif
.
ops
->
send_complete_check
(
ar
,
pipe_id
,
force
);
ar
->
hif
.
ops
->
send_complete_check
(
ar
,
pipe_id
,
force
);
}
}
static
inline
void
ath10k_hif_
init
(
struct
ath10k
*
ar
,
static
inline
void
ath10k_hif_
set_callbacks
(
struct
ath10k
*
ar
,
struct
ath10k_hif_cb
*
callbacks
)
struct
ath10k_hif_cb
*
callbacks
)
{
{
ar
->
hif
.
ops
->
init
(
ar
,
callbacks
);
ar
->
hif
.
ops
->
set_callbacks
(
ar
,
callbacks
);
}
}
static
inline
u16
ath10k_hif_get_free_queue_number
(
struct
ath10k
*
ar
,
static
inline
u16
ath10k_hif_get_free_queue_number
(
struct
ath10k
*
ar
,
...
@@ -134,4 +147,30 @@ static inline u16 ath10k_hif_get_free_queue_number(struct ath10k *ar,
...
@@ -134,4 +147,30 @@ static inline u16 ath10k_hif_get_free_queue_number(struct ath10k *ar,
return
ar
->
hif
.
ops
->
get_free_queue_number
(
ar
,
pipe_id
);
return
ar
->
hif
.
ops
->
get_free_queue_number
(
ar
,
pipe_id
);
}
}
static
inline
int
ath10k_hif_power_up
(
struct
ath10k
*
ar
)
{
return
ar
->
hif
.
ops
->
power_up
(
ar
);
}
static
inline
void
ath10k_hif_power_down
(
struct
ath10k
*
ar
)
{
ar
->
hif
.
ops
->
power_down
(
ar
);
}
static
inline
int
ath10k_hif_suspend
(
struct
ath10k
*
ar
)
{
if
(
!
ar
->
hif
.
ops
->
suspend
)
return
-
EOPNOTSUPP
;
return
ar
->
hif
.
ops
->
suspend
(
ar
);
}
static
inline
int
ath10k_hif_resume
(
struct
ath10k
*
ar
)
{
if
(
!
ar
->
hif
.
ops
->
resume
)
return
-
EOPNOTSUPP
;
return
ar
->
hif
.
ops
->
resume
(
ar
);
}
#endif
/* _HIF_H_ */
#endif
/* _HIF_H_ */
drivers/net/wireless/ath/ath10k/htc.c
View file @
1f807827
...
@@ -246,15 +246,22 @@ int ath10k_htc_send(struct ath10k_htc *htc,
...
@@ -246,15 +246,22 @@ int ath10k_htc_send(struct ath10k_htc *htc,
{
{
struct
ath10k_htc_ep
*
ep
=
&
htc
->
endpoint
[
eid
];
struct
ath10k_htc_ep
*
ep
=
&
htc
->
endpoint
[
eid
];
if
(
htc
->
ar
->
state
==
ATH10K_STATE_WEDGED
)
return
-
ECOMM
;
if
(
eid
>=
ATH10K_HTC_EP_COUNT
)
{
if
(
eid
>=
ATH10K_HTC_EP_COUNT
)
{
ath10k_warn
(
"Invalid endpoint id: %d
\n
"
,
eid
);
ath10k_warn
(
"Invalid endpoint id: %d
\n
"
,
eid
);
return
-
ENOENT
;
return
-
ENOENT
;
}
}
skb_push
(
skb
,
sizeof
(
struct
ath10k_htc_hdr
));
spin_lock_bh
(
&
htc
->
tx_lock
);
spin_lock_bh
(
&
htc
->
tx_lock
);
if
(
htc
->
stopped
)
{
spin_unlock_bh
(
&
htc
->
tx_lock
);
return
-
ESHUTDOWN
;
}
__skb_queue_tail
(
&
ep
->
tx_queue
,
skb
);
__skb_queue_tail
(
&
ep
->
tx_queue
,
skb
);
skb_push
(
skb
,
sizeof
(
struct
ath10k_htc_hdr
));
spin_unlock_bh
(
&
htc
->
tx_lock
);
spin_unlock_bh
(
&
htc
->
tx_lock
);
queue_work
(
htc
->
ar
->
workqueue
,
&
ep
->
send_work
);
queue_work
(
htc
->
ar
->
workqueue
,
&
ep
->
send_work
);
...
@@ -265,25 +272,19 @@ static int ath10k_htc_tx_completion_handler(struct ath10k *ar,
...
@@ -265,25 +272,19 @@ static int ath10k_htc_tx_completion_handler(struct ath10k *ar,
struct
sk_buff
*
skb
,
struct
sk_buff
*
skb
,
unsigned
int
eid
)
unsigned
int
eid
)
{
{
struct
ath10k_htc
*
htc
=
ar
->
htc
;
struct
ath10k_htc
*
htc
=
&
ar
->
htc
;
struct
ath10k_htc_ep
*
ep
=
&
htc
->
endpoint
[
eid
];
struct
ath10k_htc_ep
*
ep
=
&
htc
->
endpoint
[
eid
];
bool
stopping
;
ath10k_htc_notify_tx_completion
(
ep
,
skb
);
ath10k_htc_notify_tx_completion
(
ep
,
skb
);
/* the skb now belongs to the completion handler */
/* the skb now belongs to the completion handler */
/* note: when using TX credit flow, the re-checking of queues happens
* when credits flow back from the target. in the non-TX credit case,
* we recheck after the packet completes */
spin_lock_bh
(
&
htc
->
tx_lock
);
spin_lock_bh
(
&
htc
->
tx_lock
);
stopping
=
htc
->
stopping
;
if
(
!
ep
->
tx_credit_flow_enabled
&&
!
htc
->
stopped
)
spin_unlock_bh
(
&
htc
->
tx_lock
);
if
(
!
ep
->
tx_credit_flow_enabled
&&
!
stopping
)
/*
* note: when using TX credit flow, the re-checking of
* queues happens when credits flow back from the target.
* in the non-TX credit case, we recheck after the packet
* completes
*/
queue_work
(
ar
->
workqueue
,
&
ep
->
send_work
);
queue_work
(
ar
->
workqueue
,
&
ep
->
send_work
);
spin_unlock_bh
(
&
htc
->
tx_lock
);
return
0
;
return
0
;
}
}
...
@@ -414,7 +415,7 @@ static int ath10k_htc_rx_completion_handler(struct ath10k *ar,
...
@@ -414,7 +415,7 @@ static int ath10k_htc_rx_completion_handler(struct ath10k *ar,
u8
pipe_id
)
u8
pipe_id
)
{
{
int
status
=
0
;
int
status
=
0
;
struct
ath10k_htc
*
htc
=
ar
->
htc
;
struct
ath10k_htc
*
htc
=
&
ar
->
htc
;
struct
ath10k_htc_hdr
*
hdr
;
struct
ath10k_htc_hdr
*
hdr
;
struct
ath10k_htc_ep
*
ep
;
struct
ath10k_htc_ep
*
ep
;
u16
payload_len
;
u16
payload_len
;
...
@@ -751,8 +752,9 @@ int ath10k_htc_connect_service(struct ath10k_htc *htc,
...
@@ -751,8 +752,9 @@ int ath10k_htc_connect_service(struct ath10k_htc *htc,
tx_alloc
=
ath10k_htc_get_credit_allocation
(
htc
,
tx_alloc
=
ath10k_htc_get_credit_allocation
(
htc
,
conn_req
->
service_id
);
conn_req
->
service_id
);
if
(
!
tx_alloc
)
if
(
!
tx_alloc
)
ath10k_warn
(
"HTC Service %s does not allocate target credits
\n
"
,
ath10k_dbg
(
ATH10K_DBG_HTC
,
htc_service_name
(
conn_req
->
service_id
));
"HTC Service %s does not allocate target credits
\n
"
,
htc_service_name
(
conn_req
->
service_id
));
skb
=
ath10k_htc_build_tx_ctrl_skb
(
htc
->
ar
);
skb
=
ath10k_htc_build_tx_ctrl_skb
(
htc
->
ar
);
if
(
!
skb
)
{
if
(
!
skb
)
{
...
@@ -947,7 +949,7 @@ void ath10k_htc_stop(struct ath10k_htc *htc)
...
@@ -947,7 +949,7 @@ void ath10k_htc_stop(struct ath10k_htc *htc)
struct
ath10k_htc_ep
*
ep
;
struct
ath10k_htc_ep
*
ep
;
spin_lock_bh
(
&
htc
->
tx_lock
);
spin_lock_bh
(
&
htc
->
tx_lock
);
htc
->
stopp
ing
=
true
;
htc
->
stopp
ed
=
true
;
spin_unlock_bh
(
&
htc
->
tx_lock
);
spin_unlock_bh
(
&
htc
->
tx_lock
);
for
(
i
=
ATH10K_HTC_EP_0
;
i
<
ATH10K_HTC_EP_COUNT
;
i
++
)
{
for
(
i
=
ATH10K_HTC_EP_0
;
i
<
ATH10K_HTC_EP_COUNT
;
i
++
)
{
...
@@ -956,26 +958,18 @@ void ath10k_htc_stop(struct ath10k_htc *htc)
...
@@ -956,26 +958,18 @@ void ath10k_htc_stop(struct ath10k_htc *htc)
}
}
ath10k_hif_stop
(
htc
->
ar
);
ath10k_hif_stop
(
htc
->
ar
);
ath10k_htc_reset_endpoint_states
(
htc
);
}
}
/* registered target arrival callback from the HIF layer */
/* registered target arrival callback from the HIF layer */
struct
ath10k_htc
*
ath10k_htc_create
(
struct
ath10k
*
ar
,
int
ath10k_htc_init
(
struct
ath10k
*
ar
)
struct
ath10k_htc_ops
*
htc_ops
)
{
{
struct
ath10k_hif_cb
htc_callbacks
;
struct
ath10k_hif_cb
htc_callbacks
;
struct
ath10k_htc_ep
*
ep
=
NULL
;
struct
ath10k_htc_ep
*
ep
=
NULL
;
struct
ath10k_htc
*
htc
=
NULL
;
struct
ath10k_htc
*
htc
=
&
ar
->
htc
;
/* FIXME: use struct ath10k instead */
htc
=
kzalloc
(
sizeof
(
struct
ath10k_htc
),
GFP_KERNEL
);
if
(
!
htc
)
return
ERR_PTR
(
-
ENOMEM
);
spin_lock_init
(
&
htc
->
tx_lock
);
spin_lock_init
(
&
htc
->
tx_lock
);
memcpy
(
&
htc
->
htc_ops
,
htc_ops
,
sizeof
(
struct
ath10k_htc_ops
));
htc
->
stopped
=
false
;
ath10k_htc_reset_endpoint_states
(
htc
);
ath10k_htc_reset_endpoint_states
(
htc
);
/* setup HIF layer callbacks */
/* setup HIF layer callbacks */
...
@@ -986,15 +980,10 @@ struct ath10k_htc *ath10k_htc_create(struct ath10k *ar,
...
@@ -986,15 +980,10 @@ struct ath10k_htc *ath10k_htc_create(struct ath10k *ar,
/* Get HIF default pipe for HTC message exchange */
/* Get HIF default pipe for HTC message exchange */
ep
=
&
htc
->
endpoint
[
ATH10K_HTC_EP_0
];
ep
=
&
htc
->
endpoint
[
ATH10K_HTC_EP_0
];
ath10k_hif_
init
(
ar
,
&
htc_callbacks
);
ath10k_hif_
set_callbacks
(
ar
,
&
htc_callbacks
);
ath10k_hif_get_default_pipe
(
ar
,
&
ep
->
ul_pipe_id
,
&
ep
->
dl_pipe_id
);
ath10k_hif_get_default_pipe
(
ar
,
&
ep
->
ul_pipe_id
,
&
ep
->
dl_pipe_id
);
init_completion
(
&
htc
->
ctl_resp
);
init_completion
(
&
htc
->
ctl_resp
);
return
htc
;
return
0
;
}
void
ath10k_htc_destroy
(
struct
ath10k_htc
*
htc
)
{
kfree
(
htc
);
}
}
drivers/net/wireless/ath/ath10k/htc.h
View file @
1f807827
...
@@ -335,7 +335,7 @@ struct ath10k_htc {
...
@@ -335,7 +335,7 @@ struct ath10k_htc {
struct
ath10k
*
ar
;
struct
ath10k
*
ar
;
struct
ath10k_htc_ep
endpoint
[
ATH10K_HTC_EP_COUNT
];
struct
ath10k_htc_ep
endpoint
[
ATH10K_HTC_EP_COUNT
];
/* protects endpoint and stopp
ing
fields */
/* protects endpoint and stopp
ed
fields */
spinlock_t
tx_lock
;
spinlock_t
tx_lock
;
struct
ath10k_htc_ops
htc_ops
;
struct
ath10k_htc_ops
htc_ops
;
...
@@ -349,11 +349,10 @@ struct ath10k_htc {
...
@@ -349,11 +349,10 @@ struct ath10k_htc {
struct
ath10k_htc_svc_tx_credits
service_tx_alloc
[
ATH10K_HTC_EP_COUNT
];
struct
ath10k_htc_svc_tx_credits
service_tx_alloc
[
ATH10K_HTC_EP_COUNT
];
int
target_credit_size
;
int
target_credit_size
;
bool
stopp
ing
;
bool
stopp
ed
;
};
};
struct
ath10k_htc
*
ath10k_htc_create
(
struct
ath10k
*
ar
,
int
ath10k_htc_init
(
struct
ath10k
*
ar
);
struct
ath10k_htc_ops
*
htc_ops
);
int
ath10k_htc_wait_target
(
struct
ath10k_htc
*
htc
);
int
ath10k_htc_wait_target
(
struct
ath10k_htc
*
htc
);
int
ath10k_htc_start
(
struct
ath10k_htc
*
htc
);
int
ath10k_htc_start
(
struct
ath10k_htc
*
htc
);
int
ath10k_htc_connect_service
(
struct
ath10k_htc
*
htc
,
int
ath10k_htc_connect_service
(
struct
ath10k_htc
*
htc
,
...
@@ -362,7 +361,6 @@ int ath10k_htc_connect_service(struct ath10k_htc *htc,
...
@@ -362,7 +361,6 @@ int ath10k_htc_connect_service(struct ath10k_htc *htc,
int
ath10k_htc_send
(
struct
ath10k_htc
*
htc
,
enum
ath10k_htc_ep_id
eid
,
int
ath10k_htc_send
(
struct
ath10k_htc
*
htc
,
enum
ath10k_htc_ep_id
eid
,
struct
sk_buff
*
packet
);
struct
sk_buff
*
packet
);
void
ath10k_htc_stop
(
struct
ath10k_htc
*
htc
);
void
ath10k_htc_stop
(
struct
ath10k_htc
*
htc
);
void
ath10k_htc_destroy
(
struct
ath10k_htc
*
htc
);
struct
sk_buff
*
ath10k_htc_alloc_skb
(
int
size
);
struct
sk_buff
*
ath10k_htc_alloc_skb
(
int
size
);
#endif
#endif
drivers/net/wireless/ath/ath10k/htt.c
View file @
1f807827
...
@@ -16,6 +16,7 @@
...
@@ -16,6 +16,7 @@
*/
*/
#include <linux/slab.h>
#include <linux/slab.h>
#include <linux/if_ether.h>
#include "htt.h"
#include "htt.h"
#include "core.h"
#include "core.h"
...
@@ -36,7 +37,7 @@ static int ath10k_htt_htc_attach(struct ath10k_htt *htt)
...
@@ -36,7 +37,7 @@ static int ath10k_htt_htc_attach(struct ath10k_htt *htt)
/* connect to control service */
/* connect to control service */
conn_req
.
service_id
=
ATH10K_HTC_SVC_ID_HTT_DATA_MSG
;
conn_req
.
service_id
=
ATH10K_HTC_SVC_ID_HTT_DATA_MSG
;
status
=
ath10k_htc_connect_service
(
htt
->
ar
->
htc
,
&
conn_req
,
status
=
ath10k_htc_connect_service
(
&
htt
->
ar
->
htc
,
&
conn_req
,
&
conn_resp
);
&
conn_resp
);
if
(
status
)
if
(
status
)
...
@@ -47,15 +48,11 @@ static int ath10k_htt_htc_attach(struct ath10k_htt *htt)
...
@@ -47,15 +48,11 @@ static int ath10k_htt_htc_attach(struct ath10k_htt *htt)
return
0
;
return
0
;
}
}
struct
ath10k_htt
*
ath10k_htt_attach
(
struct
ath10k
*
ar
)
int
ath10k_htt_attach
(
struct
ath10k
*
ar
)
{
{
struct
ath10k_htt
*
htt
;
struct
ath10k_htt
*
htt
=
&
ar
->
htt
;
int
ret
;
int
ret
;
htt
=
kzalloc
(
sizeof
(
*
htt
),
GFP_KERNEL
);
if
(
!
htt
)
return
NULL
;
htt
->
ar
=
ar
;
htt
->
ar
=
ar
;
htt
->
max_throughput_mbps
=
800
;
htt
->
max_throughput_mbps
=
800
;
...
@@ -65,8 +62,11 @@ struct ath10k_htt *ath10k_htt_attach(struct ath10k *ar)
...
@@ -65,8 +62,11 @@ struct ath10k_htt *ath10k_htt_attach(struct ath10k *ar)
* since ath10k_htt_rx_attach involves sending a rx ring configure
* since ath10k_htt_rx_attach involves sending a rx ring configure
* message to the target.
* message to the target.
*/
*/
if
(
ath10k_htt_htc_attach
(
htt
))
ret
=
ath10k_htt_htc_attach
(
htt
);
if
(
ret
)
{
ath10k_err
(
"could not attach htt htc (%d)
\n
"
,
ret
);
goto
err_htc_attach
;
goto
err_htc_attach
;
}
ret
=
ath10k_htt_tx_attach
(
htt
);
ret
=
ath10k_htt_tx_attach
(
htt
);
if
(
ret
)
{
if
(
ret
)
{
...
@@ -74,8 +74,11 @@ struct ath10k_htt *ath10k_htt_attach(struct ath10k *ar)
...
@@ -74,8 +74,11 @@ struct ath10k_htt *ath10k_htt_attach(struct ath10k *ar)
goto
err_htc_attach
;
goto
err_htc_attach
;
}
}
if
(
ath10k_htt_rx_attach
(
htt
))
ret
=
ath10k_htt_rx_attach
(
htt
);
if
(
ret
)
{
ath10k_err
(
"could not attach htt rx (%d)
\n
"
,
ret
);
goto
err_rx_attach
;
goto
err_rx_attach
;
}
/*
/*
* Prefetch enough data to satisfy target
* Prefetch enough data to satisfy target
...
@@ -89,13 +92,12 @@ struct ath10k_htt *ath10k_htt_attach(struct ath10k *ar)
...
@@ -89,13 +92,12 @@ struct ath10k_htt *ath10k_htt_attach(struct ath10k *ar)
8
+
/* llc snap */
8
+
/* llc snap */
2
;
/* ip4 dscp or ip6 priority */
2
;
/* ip4 dscp or ip6 priority */
return
htt
;
return
0
;
err_rx_attach:
err_rx_attach:
ath10k_htt_tx_detach
(
htt
);
ath10k_htt_tx_detach
(
htt
);
err_htc_attach:
err_htc_attach:
kfree
(
htt
);
return
ret
;
return
NULL
;
}
}
#define HTT_TARGET_VERSION_TIMEOUT_HZ (3*HZ)
#define HTT_TARGET_VERSION_TIMEOUT_HZ (3*HZ)
...
@@ -148,5 +150,4 @@ void ath10k_htt_detach(struct ath10k_htt *htt)
...
@@ -148,5 +150,4 @@ void ath10k_htt_detach(struct ath10k_htt *htt)
{
{
ath10k_htt_rx_detach
(
htt
);
ath10k_htt_rx_detach
(
htt
);
ath10k_htt_tx_detach
(
htt
);
ath10k_htt_tx_detach
(
htt
);
kfree
(
htt
);
}
}
drivers/net/wireless/ath/ath10k/htt.h
View file @
1f807827
...
@@ -20,7 +20,6 @@
...
@@ -20,7 +20,6 @@
#include <linux/bug.h>
#include <linux/bug.h>
#include "core.h"
#include "htc.h"
#include "htc.h"
#include "rx_desc.h"
#include "rx_desc.h"
...
@@ -1317,7 +1316,7 @@ struct htt_rx_desc {
...
@@ -1317,7 +1316,7 @@ struct htt_rx_desc {
#define HTT_LOG2_MAX_CACHE_LINE_SIZE 7
/* 2^7 = 128 */
#define HTT_LOG2_MAX_CACHE_LINE_SIZE 7
/* 2^7 = 128 */
#define HTT_MAX_CACHE_LINE_SIZE_MASK ((1 << HTT_LOG2_MAX_CACHE_LINE_SIZE) - 1)
#define HTT_MAX_CACHE_LINE_SIZE_MASK ((1 << HTT_LOG2_MAX_CACHE_LINE_SIZE) - 1)
struct
ath10k_htt
*
ath10k_htt_attach
(
struct
ath10k
*
ar
);
int
ath10k_htt_attach
(
struct
ath10k
*
ar
);
int
ath10k_htt_attach_target
(
struct
ath10k_htt
*
htt
);
int
ath10k_htt_attach_target
(
struct
ath10k_htt
*
htt
);
void
ath10k_htt_detach
(
struct
ath10k_htt
*
htt
);
void
ath10k_htt_detach
(
struct
ath10k_htt
*
htt
);
...
...
drivers/net/wireless/ath/ath10k/htt_rx.c
View file @
1f807827
...
@@ -15,6 +15,7 @@
...
@@ -15,6 +15,7 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
*/
#include "core.h"
#include "htc.h"
#include "htc.h"
#include "htt.h"
#include "htt.h"
#include "txrx.h"
#include "txrx.h"
...
@@ -1036,7 +1037,7 @@ static void ath10k_htt_rx_frag_handler(struct ath10k_htt *htt,
...
@@ -1036,7 +1037,7 @@ static void ath10k_htt_rx_frag_handler(struct ath10k_htt *htt,
void
ath10k_htt_t2h_msg_handler
(
struct
ath10k
*
ar
,
struct
sk_buff
*
skb
)
void
ath10k_htt_t2h_msg_handler
(
struct
ath10k
*
ar
,
struct
sk_buff
*
skb
)
{
{
struct
ath10k_htt
*
htt
=
ar
->
htt
;
struct
ath10k_htt
*
htt
=
&
ar
->
htt
;
struct
htt_resp
*
resp
=
(
struct
htt_resp
*
)
skb
->
data
;
struct
htt_resp
*
resp
=
(
struct
htt_resp
*
)
skb
->
data
;
/* confirm alignment */
/* confirm alignment */
...
...
drivers/net/wireless/ath/ath10k/htt_tx.c
View file @
1f807827
...
@@ -92,7 +92,7 @@ int ath10k_htt_tx_attach(struct ath10k_htt *htt)
...
@@ -92,7 +92,7 @@ int ath10k_htt_tx_attach(struct ath10k_htt *htt)
/* At the beginning free queue number should hint us the maximum
/* At the beginning free queue number should hint us the maximum
* queue length */
* queue length */
pipe
=
htt
->
ar
->
htc
->
endpoint
[
htt
->
eid
].
ul_pipe_id
;
pipe
=
htt
->
ar
->
htc
.
endpoint
[
htt
->
eid
].
ul_pipe_id
;
htt
->
max_num_pending_tx
=
ath10k_hif_get_free_queue_number
(
htt
->
ar
,
htt
->
max_num_pending_tx
=
ath10k_hif_get_free_queue_number
(
htt
->
ar
,
pipe
);
pipe
);
...
@@ -153,7 +153,7 @@ void ath10k_htt_tx_detach(struct ath10k_htt *htt)
...
@@ -153,7 +153,7 @@ void ath10k_htt_tx_detach(struct ath10k_htt *htt)
void
ath10k_htt_htc_tx_complete
(
struct
ath10k
*
ar
,
struct
sk_buff
*
skb
)
void
ath10k_htt_htc_tx_complete
(
struct
ath10k
*
ar
,
struct
sk_buff
*
skb
)
{
{
struct
ath10k_skb_cb
*
skb_cb
=
ATH10K_SKB_CB
(
skb
);
struct
ath10k_skb_cb
*
skb_cb
=
ATH10K_SKB_CB
(
skb
);
struct
ath10k_htt
*
htt
=
ar
->
htt
;
struct
ath10k_htt
*
htt
=
&
ar
->
htt
;
if
(
skb_cb
->
htt
.
is_conf
)
{
if
(
skb_cb
->
htt
.
is_conf
)
{
dev_kfree_skb_any
(
skb
);
dev_kfree_skb_any
(
skb
);
...
@@ -194,7 +194,7 @@ int ath10k_htt_h2t_ver_req_msg(struct ath10k_htt *htt)
...
@@ -194,7 +194,7 @@ int ath10k_htt_h2t_ver_req_msg(struct ath10k_htt *htt)
ATH10K_SKB_CB
(
skb
)
->
htt
.
is_conf
=
true
;
ATH10K_SKB_CB
(
skb
)
->
htt
.
is_conf
=
true
;
ret
=
ath10k_htc_send
(
htt
->
ar
->
htc
,
htt
->
eid
,
skb
);
ret
=
ath10k_htc_send
(
&
htt
->
ar
->
htc
,
htt
->
eid
,
skb
);
if
(
ret
)
{
if
(
ret
)
{
dev_kfree_skb_any
(
skb
);
dev_kfree_skb_any
(
skb
);
return
ret
;
return
ret
;
...
@@ -281,7 +281,7 @@ int ath10k_htt_send_rx_ring_cfg_ll(struct ath10k_htt *htt)
...
@@ -281,7 +281,7 @@ int ath10k_htt_send_rx_ring_cfg_ll(struct ath10k_htt *htt)
ATH10K_SKB_CB
(
skb
)
->
htt
.
is_conf
=
true
;
ATH10K_SKB_CB
(
skb
)
->
htt
.
is_conf
=
true
;
ret
=
ath10k_htc_send
(
htt
->
ar
->
htc
,
htt
->
eid
,
skb
);
ret
=
ath10k_htc_send
(
&
htt
->
ar
->
htc
,
htt
->
eid
,
skb
);
if
(
ret
)
{
if
(
ret
)
{
dev_kfree_skb_any
(
skb
);
dev_kfree_skb_any
(
skb
);
return
ret
;
return
ret
;
...
@@ -346,7 +346,7 @@ int ath10k_htt_mgmt_tx(struct ath10k_htt *htt, struct sk_buff *msdu)
...
@@ -346,7 +346,7 @@ int ath10k_htt_mgmt_tx(struct ath10k_htt *htt, struct sk_buff *msdu)
skb_cb
->
htt
.
refcount
=
2
;
skb_cb
->
htt
.
refcount
=
2
;
skb_cb
->
htt
.
msdu
=
msdu
;
skb_cb
->
htt
.
msdu
=
msdu
;
res
=
ath10k_htc_send
(
htt
->
ar
->
htc
,
htt
->
eid
,
txdesc
);
res
=
ath10k_htc_send
(
&
htt
->
ar
->
htc
,
htt
->
eid
,
txdesc
);
if
(
res
)
if
(
res
)
goto
err
;
goto
err
;
...
@@ -486,7 +486,7 @@ int ath10k_htt_tx(struct ath10k_htt *htt, struct sk_buff *msdu)
...
@@ -486,7 +486,7 @@ int ath10k_htt_tx(struct ath10k_htt *htt, struct sk_buff *msdu)
skb_cb
->
htt
.
txfrag
=
txfrag
;
skb_cb
->
htt
.
txfrag
=
txfrag
;
skb_cb
->
htt
.
msdu
=
msdu
;
skb_cb
->
htt
.
msdu
=
msdu
;
res
=
ath10k_htc_send
(
htt
->
ar
->
htc
,
htt
->
eid
,
txdesc
);
res
=
ath10k_htc_send
(
&
htt
->
ar
->
htc
,
htt
->
eid
,
txdesc
);
if
(
res
)
if
(
res
)
goto
err
;
goto
err
;
...
...
drivers/net/wireless/ath/ath10k/mac.c
View file @
1f807827
This diff is collapsed.
Click to expand it.
drivers/net/wireless/ath/ath10k/mac.h
View file @
1f807827
...
@@ -34,6 +34,7 @@ struct ath10k_vif *ath10k_get_arvif(struct ath10k *ar, u32 vdev_id);
...
@@ -34,6 +34,7 @@ struct ath10k_vif *ath10k_get_arvif(struct ath10k *ar, u32 vdev_id);
void
ath10k_reset_scan
(
unsigned
long
ptr
);
void
ath10k_reset_scan
(
unsigned
long
ptr
);
void
ath10k_offchan_tx_purge
(
struct
ath10k
*
ar
);
void
ath10k_offchan_tx_purge
(
struct
ath10k
*
ar
);
void
ath10k_offchan_tx_work
(
struct
work_struct
*
work
);
void
ath10k_offchan_tx_work
(
struct
work_struct
*
work
);
void
ath10k_halt
(
struct
ath10k
*
ar
);
static
inline
struct
ath10k_vif
*
ath10k_vif_to_arvif
(
struct
ieee80211_vif
*
vif
)
static
inline
struct
ath10k_vif
*
ath10k_vif_to_arvif
(
struct
ieee80211_vif
*
vif
)
{
{
...
...
drivers/net/wireless/ath/ath10k/pci.c
View file @
1f807827
This diff is collapsed.
Click to expand it.
drivers/net/wireless/ath/ath10k/pci.h
View file @
1f807827
...
@@ -152,7 +152,7 @@ struct service_to_pipe {
...
@@ -152,7 +152,7 @@ struct service_to_pipe {
enum
ath10k_pci_features
{
enum
ath10k_pci_features
{
ATH10K_PCI_FEATURE_MSI_X
=
0
,
ATH10K_PCI_FEATURE_MSI_X
=
0
,
ATH10K_PCI_FEATURE_HW_1_0_W
A
RKAROUND
=
1
,
ATH10K_PCI_FEATURE_HW_1_0_W
O
RKAROUND
=
1
,
/* keep last */
/* keep last */
ATH10K_PCI_FEATURE_COUNT
ATH10K_PCI_FEATURE_COUNT
...
@@ -311,7 +311,7 @@ static inline void ath10k_pci_write32(struct ath10k *ar, u32 offset,
...
@@ -311,7 +311,7 @@ static inline void ath10k_pci_write32(struct ath10k *ar, u32 offset,
struct
ath10k_pci
*
ar_pci
=
ath10k_pci_priv
(
ar
);
struct
ath10k_pci
*
ar_pci
=
ath10k_pci_priv
(
ar
);
void
__iomem
*
addr
=
ar_pci
->
mem
;
void
__iomem
*
addr
=
ar_pci
->
mem
;
if
(
test_bit
(
ATH10K_PCI_FEATURE_HW_1_0_W
A
RKAROUND
,
ar_pci
->
features
))
{
if
(
test_bit
(
ATH10K_PCI_FEATURE_HW_1_0_W
O
RKAROUND
,
ar_pci
->
features
))
{
unsigned
long
irq_flags
;
unsigned
long
irq_flags
;
spin_lock_irqsave
(
&
ar_pci
->
hw_v1_workaround_lock
,
irq_flags
);
spin_lock_irqsave
(
&
ar_pci
->
hw_v1_workaround_lock
,
irq_flags
);
...
...
drivers/net/wireless/ath/ath10k/wmi.c
View file @
1f807827
...
@@ -27,6 +27,13 @@ void ath10k_wmi_flush_tx(struct ath10k *ar)
...
@@ -27,6 +27,13 @@ void ath10k_wmi_flush_tx(struct ath10k *ar)
{
{
int
ret
;
int
ret
;
lockdep_assert_held
(
&
ar
->
conf_mutex
);
if
(
ar
->
state
==
ATH10K_STATE_WEDGED
)
{
ath10k_warn
(
"wmi flush skipped - device is wedged anyway
\n
"
);
return
;
}
ret
=
wait_event_timeout
(
ar
->
wmi
.
wq
,
ret
=
wait_event_timeout
(
ar
->
wmi
.
wq
,
atomic_read
(
&
ar
->
wmi
.
pending_tx_count
)
==
0
,
atomic_read
(
&
ar
->
wmi
.
pending_tx_count
)
==
0
,
5
*
HZ
);
5
*
HZ
);
...
@@ -111,7 +118,7 @@ static int ath10k_wmi_cmd_send(struct ath10k *ar, struct sk_buff *skb,
...
@@ -111,7 +118,7 @@ static int ath10k_wmi_cmd_send(struct ath10k *ar, struct sk_buff *skb,
trace_ath10k_wmi_cmd
(
cmd_id
,
skb
->
data
,
skb
->
len
);
trace_ath10k_wmi_cmd
(
cmd_id
,
skb
->
data
,
skb
->
len
);
status
=
ath10k_htc_send
(
ar
->
htc
,
ar
->
wmi
.
eid
,
skb
);
status
=
ath10k_htc_send
(
&
ar
->
htc
,
ar
->
wmi
.
eid
,
skb
);
if
(
status
)
{
if
(
status
)
{
dev_kfree_skb_any
(
skb
);
dev_kfree_skb_any
(
skb
);
atomic_dec
(
&
ar
->
wmi
.
pending_tx_count
);
atomic_dec
(
&
ar
->
wmi
.
pending_tx_count
);
...
@@ -501,8 +508,8 @@ static void ath10k_wmi_update_tim(struct ath10k *ar,
...
@@ -501,8 +508,8 @@ static void ath10k_wmi_update_tim(struct ath10k *ar,
ie
=
(
u8
*
)
cfg80211_find_ie
(
WLAN_EID_TIM
,
ies
,
ie
=
(
u8
*
)
cfg80211_find_ie
(
WLAN_EID_TIM
,
ies
,
(
u8
*
)
skb_tail_pointer
(
bcn
)
-
ies
);
(
u8
*
)
skb_tail_pointer
(
bcn
)
-
ies
);
if
(
!
ie
)
{
if
(
!
ie
)
{
/* highly unlikely for mac80211 */
if
(
arvif
->
vdev_type
!=
WMI_VDEV_TYPE_IBSS
)
ath10k_warn
(
"no tim ie found;
\n
"
);
ath10k_warn
(
"no tim ie found;
\n
"
);
return
;
return
;
}
}
...
@@ -1114,7 +1121,7 @@ int ath10k_wmi_connect_htc_service(struct ath10k *ar)
...
@@ -1114,7 +1121,7 @@ int ath10k_wmi_connect_htc_service(struct ath10k *ar)
/* connect to control service */
/* connect to control service */
conn_req
.
service_id
=
ATH10K_HTC_SVC_ID_WMI_CONTROL
;
conn_req
.
service_id
=
ATH10K_HTC_SVC_ID_WMI_CONTROL
;
status
=
ath10k_htc_connect_service
(
ar
->
htc
,
&
conn_req
,
&
conn_resp
);
status
=
ath10k_htc_connect_service
(
&
ar
->
htc
,
&
conn_req
,
&
conn_resp
);
if
(
status
)
{
if
(
status
)
{
ath10k_warn
(
"failed to connect to WMI CONTROL service status: %d
\n
"
,
ath10k_warn
(
"failed to connect to WMI CONTROL service status: %d
\n
"
,
status
);
status
);
...
@@ -1748,6 +1755,9 @@ int ath10k_wmi_vdev_install_key(struct ath10k *ar,
...
@@ -1748,6 +1755,9 @@ int ath10k_wmi_vdev_install_key(struct ath10k *ar,
if
(
arg
->
key_data
)
if
(
arg
->
key_data
)
memcpy
(
cmd
->
key_data
,
arg
->
key_data
,
arg
->
key_len
);
memcpy
(
cmd
->
key_data
,
arg
->
key_data
,
arg
->
key_len
);
ath10k_dbg
(
ATH10K_DBG_WMI
,
"wmi vdev install key idx %d cipher %d len %d
\n
"
,
arg
->
key_idx
,
arg
->
key_cipher
,
arg
->
key_len
);
return
ath10k_wmi_cmd_send
(
ar
,
skb
,
WMI_VDEV_INSTALL_KEY_CMDID
);
return
ath10k_wmi_cmd_send
(
ar
,
skb
,
WMI_VDEV_INSTALL_KEY_CMDID
);
}
}
...
@@ -2011,6 +2021,9 @@ int ath10k_wmi_peer_assoc(struct ath10k *ar,
...
@@ -2011,6 +2021,9 @@ int ath10k_wmi_peer_assoc(struct ath10k *ar,
cmd
->
peer_vht_rates
.
tx_mcs_set
=
cmd
->
peer_vht_rates
.
tx_mcs_set
=
__cpu_to_le32
(
arg
->
peer_vht_rates
.
tx_mcs_set
);
__cpu_to_le32
(
arg
->
peer_vht_rates
.
tx_mcs_set
);
ath10k_dbg
(
ATH10K_DBG_WMI
,
"wmi peer assoc vdev %d addr %pM
\n
"
,
arg
->
vdev_id
,
arg
->
addr
);
return
ath10k_wmi_cmd_send
(
ar
,
skb
,
WMI_PEER_ASSOC_CMDID
);
return
ath10k_wmi_cmd_send
(
ar
,
skb
,
WMI_PEER_ASSOC_CMDID
);
}
}
...
@@ -2079,3 +2092,22 @@ int ath10k_wmi_request_stats(struct ath10k *ar, enum wmi_stats_id stats_id)
...
@@ -2079,3 +2092,22 @@ int ath10k_wmi_request_stats(struct ath10k *ar, enum wmi_stats_id stats_id)
ath10k_dbg
(
ATH10K_DBG_WMI
,
"wmi request stats %d
\n
"
,
(
int
)
stats_id
);
ath10k_dbg
(
ATH10K_DBG_WMI
,
"wmi request stats %d
\n
"
,
(
int
)
stats_id
);
return
ath10k_wmi_cmd_send
(
ar
,
skb
,
WMI_REQUEST_STATS_CMDID
);
return
ath10k_wmi_cmd_send
(
ar
,
skb
,
WMI_REQUEST_STATS_CMDID
);
}
}
int
ath10k_wmi_force_fw_hang
(
struct
ath10k
*
ar
,
enum
wmi_force_fw_hang_type
type
,
u32
delay_ms
)
{
struct
wmi_force_fw_hang_cmd
*
cmd
;
struct
sk_buff
*
skb
;
skb
=
ath10k_wmi_alloc_skb
(
sizeof
(
*
cmd
));
if
(
!
skb
)
return
-
ENOMEM
;
cmd
=
(
struct
wmi_force_fw_hang_cmd
*
)
skb
->
data
;
cmd
->
type
=
__cpu_to_le32
(
type
);
cmd
->
delay_ms
=
__cpu_to_le32
(
delay_ms
);
ath10k_dbg
(
ATH10K_DBG_WMI
,
"wmi force fw hang %d delay %d
\n
"
,
type
,
delay_ms
);
return
ath10k_wmi_cmd_send
(
ar
,
skb
,
WMI_FORCE_FW_HANG_CMDID
);
}
drivers/net/wireless/ath/ath10k/wmi.h
View file @
1f807827
...
@@ -416,6 +416,7 @@ enum wmi_cmd_id {
...
@@ -416,6 +416,7 @@ enum wmi_cmd_id {
WMI_PDEV_FTM_INTG_CMDID
,
WMI_PDEV_FTM_INTG_CMDID
,
WMI_VDEV_SET_KEEPALIVE_CMDID
,
WMI_VDEV_SET_KEEPALIVE_CMDID
,
WMI_VDEV_GET_KEEPALIVE_CMDID
,
WMI_VDEV_GET_KEEPALIVE_CMDID
,
WMI_FORCE_FW_HANG_CMDID
,
/* GPIO Configuration */
/* GPIO Configuration */
WMI_GPIO_CONFIG_CMDID
=
WMI_CMD_GRP
(
WMI_GRP_GPIO
),
WMI_GPIO_CONFIG_CMDID
=
WMI_CMD_GRP
(
WMI_GRP_GPIO
),
...
@@ -2972,6 +2973,22 @@ struct wmi_sta_keepalive_cmd {
...
@@ -2972,6 +2973,22 @@ struct wmi_sta_keepalive_cmd {
struct
wmi_sta_keepalive_arp_resp
arp_resp
;
struct
wmi_sta_keepalive_arp_resp
arp_resp
;
}
__packed
;
}
__packed
;
enum
wmi_force_fw_hang_type
{
WMI_FORCE_FW_HANG_ASSERT
=
1
,
WMI_FORCE_FW_HANG_NO_DETECT
,
WMI_FORCE_FW_HANG_CTRL_EP_FULL
,
WMI_FORCE_FW_HANG_EMPTY_POINT
,
WMI_FORCE_FW_HANG_STACK_OVERFLOW
,
WMI_FORCE_FW_HANG_INFINITE_LOOP
,
};
#define WMI_FORCE_FW_HANG_RANDOM_TIME 0xFFFFFFFF
struct
wmi_force_fw_hang_cmd
{
__le32
type
;
__le32
delay_ms
;
}
__packed
;
#define ATH10K_RTS_MAX 2347
#define ATH10K_RTS_MAX 2347
#define ATH10K_FRAGMT_THRESHOLD_MIN 540
#define ATH10K_FRAGMT_THRESHOLD_MIN 540
#define ATH10K_FRAGMT_THRESHOLD_MAX 2346
#define ATH10K_FRAGMT_THRESHOLD_MAX 2346
...
@@ -3048,5 +3065,7 @@ int ath10k_wmi_beacon_send(struct ath10k *ar, const struct wmi_bcn_tx_arg *arg);
...
@@ -3048,5 +3065,7 @@ int ath10k_wmi_beacon_send(struct ath10k *ar, const struct wmi_bcn_tx_arg *arg);
int
ath10k_wmi_pdev_set_wmm_params
(
struct
ath10k
*
ar
,
int
ath10k_wmi_pdev_set_wmm_params
(
struct
ath10k
*
ar
,
const
struct
wmi_pdev_set_wmm_params_arg
*
arg
);
const
struct
wmi_pdev_set_wmm_params_arg
*
arg
);
int
ath10k_wmi_request_stats
(
struct
ath10k
*
ar
,
enum
wmi_stats_id
stats_id
);
int
ath10k_wmi_request_stats
(
struct
ath10k
*
ar
,
enum
wmi_stats_id
stats_id
);
int
ath10k_wmi_force_fw_hang
(
struct
ath10k
*
ar
,
enum
wmi_force_fw_hang_type
type
,
u32
delay_ms
);
#endif
/* _WMI_H_ */
#endif
/* _WMI_H_ */
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