Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
b9d90578
Commit
b9d90578
authored
Feb 06, 2012
by
John W. Linville
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'for-linville' of
git://github.com/kvalo/ath6kl
parents
874239f5
5fbea5dc
Changes
21
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
21 changed files
with
2437 additions
and
922 deletions
+2437
-922
drivers/net/wireless/ath/ath6kl/Kconfig
drivers/net/wireless/ath/ath6kl/Kconfig
+21
-4
drivers/net/wireless/ath/ath6kl/Makefile
drivers/net/wireless/ath/ath6kl/Makefile
+17
-13
drivers/net/wireless/ath/ath6kl/bmi.c
drivers/net/wireless/ath/ath6kl/bmi.c
+8
-2
drivers/net/wireless/ath/ath6kl/cfg80211.c
drivers/net/wireless/ath/ath6kl/cfg80211.c
+403
-203
drivers/net/wireless/ath/ath6kl/cfg80211.h
drivers/net/wireless/ath/ath6kl/cfg80211.h
+8
-4
drivers/net/wireless/ath/ath6kl/common.h
drivers/net/wireless/ath/ath6kl/common.h
+0
-3
drivers/net/wireless/ath/ath6kl/core.c
drivers/net/wireless/ath/ath6kl/core.c
+316
-0
drivers/net/wireless/ath/ath6kl/core.h
drivers/net/wireless/ath/ath6kl/core.h
+77
-30
drivers/net/wireless/ath/ath6kl/debug.c
drivers/net/wireless/ath/ath6kl/debug.c
+69
-45
drivers/net/wireless/ath/ath6kl/debug.h
drivers/net/wireless/ath/ath6kl/debug.h
+5
-23
drivers/net/wireless/ath/ath6kl/hif.c
drivers/net/wireless/ath/ath6kl/hif.c
+12
-3
drivers/net/wireless/ath/ath6kl/htc.c
drivers/net/wireless/ath/ath6kl/htc.c
+10
-1
drivers/net/wireless/ath/ath6kl/init.c
drivers/net/wireless/ath/ath6kl/init.c
+204
-268
drivers/net/wireless/ath/ath6kl/main.c
drivers/net/wireless/ath/ath6kl/main.c
+164
-18
drivers/net/wireless/ath/ath6kl/sdio.c
drivers/net/wireless/ath/ath6kl/sdio.c
+87
-53
drivers/net/wireless/ath/ath6kl/testmode.c
drivers/net/wireless/ath/ath6kl/testmode.c
+17
-85
drivers/net/wireless/ath/ath6kl/testmode.h
drivers/net/wireless/ath/ath6kl/testmode.h
+3
-3
drivers/net/wireless/ath/ath6kl/txrx.c
drivers/net/wireless/ath/ath6kl/txrx.c
+398
-136
drivers/net/wireless/ath/ath6kl/usb.c
drivers/net/wireless/ath/ath6kl/usb.c
+431
-0
drivers/net/wireless/ath/ath6kl/wmi.c
drivers/net/wireless/ath/ath6kl/wmi.c
+128
-20
drivers/net/wireless/ath/ath6kl/wmi.h
drivers/net/wireless/ath/ath6kl/wmi.h
+59
-8
No files found.
drivers/net/wireless/ath/ath6kl/Kconfig
View file @
b9d90578
config ATH6KL
tristate "Atheros ath6kl support"
tristate "Atheros mobile chipsets support"
config ATH6KL_SDIO
tristate "Atheros ath6kl SDIO support"
depends on ATH6KL
depends on MMC
depends on CFG80211
---help---
This module adds support for wireless adapters based on
Atheros AR6003 chipset running over SDIO. If you choose to
build it as a module, it will be called ath6kl. Pls note
that AR6002 and AR6001 are not supported by this driver.
Atheros AR6003 and AR6004 chipsets running over SDIO. If you
choose to build it as a module, it will be called ath6kl_sdio.
Please note that AR6002 and AR6001 are not supported by this
driver.
config ATH6KL_USB
tristate "Atheros ath6kl USB support"
depends on ATH6KL
depends on USB
depends on CFG80211
depends on EXPERIMENTAL
---help---
This module adds support for wireless adapters based on
Atheros AR6004 chipset running over USB. This is still under
implementation and it isn't functional. If you choose to
build it as a module, it will be called ath6kl_usb.
config ATH6KL_DEBUG
bool "Atheros ath6kl debugging"
...
...
drivers/net/wireless/ath/ath6kl/Makefile
View file @
b9d90578
...
...
@@ -21,17 +21,21 @@
# Author(s): ="Atheros"
#------------------------------------------------------------------------------
obj-$(CONFIG_ATH6KL)
:=
ath6kl
.o
ath6kl-y
+=
debug.o
ath6kl-y
+=
hif.o
ath6kl-y
+=
htc.o
ath6kl-y
+=
bmi.o
ath6kl-y
+=
cfg80211.o
ath6kl-y
+=
init.o
ath6kl-y
+=
main.o
ath6kl-y
+=
txrx.o
ath6kl-y
+=
wmi.o
ath6kl
-y
+=
sdio
.o
ath6kl-$(CONFIG_NL80211_TESTMODE)
+=
testmode.o
obj-$(CONFIG_ATH6KL)
+=
ath6kl_core
.o
ath6kl
_core
-y
+=
debug.o
ath6kl
_core
-y
+=
hif.o
ath6kl
_core
-y
+=
htc.o
ath6kl
_core
-y
+=
bmi.o
ath6kl
_core
-y
+=
cfg80211.o
ath6kl
_core
-y
+=
init.o
ath6kl
_core
-y
+=
main.o
ath6kl
_core
-y
+=
txrx.o
ath6kl
_core
-y
+=
wmi.o
ath6kl
_core-y
+=
core
.o
ath6kl
_core
-$(CONFIG_NL80211_TESTMODE)
+=
testmode.o
ccflags-y
+=
-D__CHECK_ENDIAN__
obj-$(CONFIG_ATH6KL_SDIO)
+=
ath6kl_sdio.o
ath6kl_sdio-y
+=
sdio.o
obj-$(CONFIG_ATH6KL_USB)
+=
ath6kl_usb.o
ath6kl_usb-y
+=
usb.o
drivers/net/wireless/ath/ath6kl/bmi.c
View file @
b9d90578
...
...
@@ -57,8 +57,14 @@ int ath6kl_bmi_get_target_info(struct ath6kl *ar,
return
ret
;
}
ret
=
ath6kl_hif_bmi_read
(
ar
,
(
u8
*
)
&
targ_info
->
version
,
sizeof
(
targ_info
->
version
));
if
(
ar
->
hif_type
==
ATH6KL_HIF_TYPE_USB
)
{
ret
=
ath6kl_hif_bmi_read
(
ar
,
(
u8
*
)
targ_info
,
sizeof
(
*
targ_info
));
}
else
{
ret
=
ath6kl_hif_bmi_read
(
ar
,
(
u8
*
)
&
targ_info
->
version
,
sizeof
(
targ_info
->
version
));
}
if
(
ret
)
{
ath6kl_err
(
"Unable to recv target info: %d
\n
"
,
ret
);
return
ret
;
...
...
drivers/net/wireless/ath/ath6kl/cfg80211.c
View file @
b9d90578
This diff is collapsed.
Click to expand it.
drivers/net/wireless/ath/ath6kl/cfg80211.h
View file @
b9d90578
...
...
@@ -27,10 +27,6 @@ enum ath6kl_cfg_suspend_mode {
struct
net_device
*
ath6kl_interface_add
(
struct
ath6kl
*
ar
,
char
*
name
,
enum
nl80211_iftype
type
,
u8
fw_vif_idx
,
u8
nw_type
);
int
ath6kl_register_ieee80211_hw
(
struct
ath6kl
*
ar
);
struct
ath6kl
*
ath6kl_core_alloc
(
struct
device
*
dev
);
void
ath6kl_deinit_ieee80211_hw
(
struct
ath6kl
*
ar
);
void
ath6kl_cfg80211_scan_complete_event
(
struct
ath6kl_vif
*
vif
,
bool
aborted
);
void
ath6kl_cfg80211_connect_event
(
struct
ath6kl_vif
*
vif
,
u16
channel
,
...
...
@@ -53,7 +49,15 @@ int ath6kl_cfg80211_suspend(struct ath6kl *ar,
int
ath6kl_cfg80211_resume
(
struct
ath6kl
*
ar
);
void
ath6kl_cfg80211_vif_cleanup
(
struct
ath6kl_vif
*
vif
);
void
ath6kl_cfg80211_stop
(
struct
ath6kl_vif
*
vif
);
void
ath6kl_cfg80211_stop_all
(
struct
ath6kl
*
ar
);
int
ath6kl_cfg80211_init
(
struct
ath6kl
*
ar
);
void
ath6kl_cfg80211_cleanup
(
struct
ath6kl
*
ar
);
struct
ath6kl
*
ath6kl_cfg80211_create
(
void
);
void
ath6kl_cfg80211_destroy
(
struct
ath6kl
*
ar
);
#endif
/* ATH6KL_CFG80211_H */
drivers/net/wireless/ath/ath6kl/common.h
View file @
b9d90578
...
...
@@ -79,8 +79,5 @@ struct ath6kl;
enum
htc_credit_dist_reason
;
struct
ath6kl_htc_credit_info
;
struct
ath6kl
*
ath6kl_core_alloc
(
struct
device
*
sdev
);
int
ath6kl_core_init
(
struct
ath6kl
*
ar
);
void
ath6kl_core_cleanup
(
struct
ath6kl
*
ar
);
struct
sk_buff
*
ath6kl_buf_alloc
(
int
size
);
#endif
/* COMMON_H */
drivers/net/wireless/ath/ath6kl/core.c
0 → 100644
View file @
b9d90578
/*
* Copyright (c) 2004-2011 Atheros Communications Inc.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include "core.h"
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/export.h>
#include "debug.h"
#include "hif-ops.h"
#include "cfg80211.h"
unsigned
int
debug_mask
;
static
unsigned
int
suspend_mode
;
static
unsigned
int
uart_debug
;
static
unsigned
int
ath6kl_p2p
;
static
unsigned
int
testmode
;
module_param
(
debug_mask
,
uint
,
0644
);
module_param
(
suspend_mode
,
uint
,
0644
);
module_param
(
uart_debug
,
uint
,
0644
);
module_param
(
ath6kl_p2p
,
uint
,
0644
);
module_param
(
testmode
,
uint
,
0644
);
int
ath6kl_core_init
(
struct
ath6kl
*
ar
)
{
struct
ath6kl_bmi_target_info
targ_info
;
struct
net_device
*
ndev
;
int
ret
=
0
,
i
;
ar
->
ath6kl_wq
=
create_singlethread_workqueue
(
"ath6kl"
);
if
(
!
ar
->
ath6kl_wq
)
return
-
ENOMEM
;
ret
=
ath6kl_bmi_init
(
ar
);
if
(
ret
)
goto
err_wq
;
/*
* Turn on power to get hardware (target) version and leave power
* on delibrately as we will boot the hardware anyway within few
* seconds.
*/
ret
=
ath6kl_hif_power_on
(
ar
);
if
(
ret
)
goto
err_bmi_cleanup
;
ret
=
ath6kl_bmi_get_target_info
(
ar
,
&
targ_info
);
if
(
ret
)
goto
err_power_off
;
ar
->
version
.
target_ver
=
le32_to_cpu
(
targ_info
.
version
);
ar
->
target_type
=
le32_to_cpu
(
targ_info
.
type
);
ar
->
wiphy
->
hw_version
=
le32_to_cpu
(
targ_info
.
version
);
ret
=
ath6kl_init_hw_params
(
ar
);
if
(
ret
)
goto
err_power_off
;
ar
->
htc_target
=
ath6kl_htc_create
(
ar
);
if
(
!
ar
->
htc_target
)
{
ret
=
-
ENOMEM
;
goto
err_power_off
;
}
ar
->
testmode
=
testmode
;
ret
=
ath6kl_init_fetch_firmwares
(
ar
);
if
(
ret
)
goto
err_htc_cleanup
;
/* FIXME: we should free all firmwares in the error cases below */
/* Indicate that WMI is enabled (although not ready yet) */
set_bit
(
WMI_ENABLED
,
&
ar
->
flag
);
ar
->
wmi
=
ath6kl_wmi_init
(
ar
);
if
(
!
ar
->
wmi
)
{
ath6kl_err
(
"failed to initialize wmi
\n
"
);
ret
=
-
EIO
;
goto
err_htc_cleanup
;
}
ath6kl_dbg
(
ATH6KL_DBG_TRC
,
"%s: got wmi @ 0x%p.
\n
"
,
__func__
,
ar
->
wmi
);
ret
=
ath6kl_cfg80211_init
(
ar
);
if
(
ret
)
goto
err_node_cleanup
;
ret
=
ath6kl_debug_init
(
ar
);
if
(
ret
)
{
wiphy_unregister
(
ar
->
wiphy
);
goto
err_node_cleanup
;
}
for
(
i
=
0
;
i
<
ar
->
vif_max
;
i
++
)
ar
->
avail_idx_map
|=
BIT
(
i
);
rtnl_lock
();
/* Add an initial station interface */
ndev
=
ath6kl_interface_add
(
ar
,
"wlan%d"
,
NL80211_IFTYPE_STATION
,
0
,
INFRA_NETWORK
);
rtnl_unlock
();
if
(
!
ndev
)
{
ath6kl_err
(
"Failed to instantiate a network device
\n
"
);
ret
=
-
ENOMEM
;
wiphy_unregister
(
ar
->
wiphy
);
goto
err_debug_init
;
}
ath6kl_dbg
(
ATH6KL_DBG_TRC
,
"%s: name=%s dev=0x%p, ar=0x%p
\n
"
,
__func__
,
ndev
->
name
,
ndev
,
ar
);
/* setup access class priority mappings */
ar
->
ac_stream_pri_map
[
WMM_AC_BK
]
=
0
;
/* lowest */
ar
->
ac_stream_pri_map
[
WMM_AC_BE
]
=
1
;
ar
->
ac_stream_pri_map
[
WMM_AC_VI
]
=
2
;
ar
->
ac_stream_pri_map
[
WMM_AC_VO
]
=
3
;
/* highest */
/* give our connected endpoints some buffers */
ath6kl_rx_refill
(
ar
->
htc_target
,
ar
->
ctrl_ep
);
ath6kl_rx_refill
(
ar
->
htc_target
,
ar
->
ac2ep_map
[
WMM_AC_BE
]);
/* allocate some buffers that handle larger AMSDU frames */
ath6kl_refill_amsdu_rxbufs
(
ar
,
ATH6KL_MAX_AMSDU_RX_BUFFERS
);
ath6kl_cookie_init
(
ar
);
ar
->
conf_flags
=
ATH6KL_CONF_IGNORE_ERP_BARKER
|
ATH6KL_CONF_ENABLE_11N
|
ATH6KL_CONF_ENABLE_TX_BURST
;
if
(
suspend_mode
&&
suspend_mode
>=
WLAN_POWER_STATE_CUT_PWR
&&
suspend_mode
<=
WLAN_POWER_STATE_WOW
)
ar
->
suspend_mode
=
suspend_mode
;
else
ar
->
suspend_mode
=
0
;
if
(
uart_debug
)
ar
->
conf_flags
|=
ATH6KL_CONF_UART_DEBUG
;
ar
->
wiphy
->
flags
|=
WIPHY_FLAG_SUPPORTS_FW_ROAM
|
WIPHY_FLAG_HAVE_AP_SME
|
WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL
|
WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD
;
if
(
test_bit
(
ATH6KL_FW_CAPABILITY_SCHED_SCAN
,
ar
->
fw_capabilities
))
ar
->
wiphy
->
flags
|=
WIPHY_FLAG_SUPPORTS_SCHED_SCAN
;
ar
->
wiphy
->
probe_resp_offload
=
NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS
|
NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS2
|
NL80211_PROBE_RESP_OFFLOAD_SUPPORT_P2P
|
NL80211_PROBE_RESP_OFFLOAD_SUPPORT_80211U
;
set_bit
(
FIRST_BOOT
,
&
ar
->
flag
);
ndev
->
hw_features
|=
NETIF_F_IP_CSUM
|
NETIF_F_RXCSUM
;
ret
=
ath6kl_init_hw_start
(
ar
);
if
(
ret
)
{
ath6kl_err
(
"Failed to start hardware: %d
\n
"
,
ret
);
goto
err_rxbuf_cleanup
;
}
/*
* Set mac address which is received in ready event
* FIXME: Move to ath6kl_interface_add()
*/
memcpy
(
ndev
->
dev_addr
,
ar
->
mac_addr
,
ETH_ALEN
);
return
ret
;
err_rxbuf_cleanup:
ath6kl_htc_flush_rx_buf
(
ar
->
htc_target
);
ath6kl_cleanup_amsdu_rxbufs
(
ar
);
rtnl_lock
();
ath6kl_cfg80211_vif_cleanup
(
netdev_priv
(
ndev
));
rtnl_unlock
();
wiphy_unregister
(
ar
->
wiphy
);
err_debug_init:
ath6kl_debug_cleanup
(
ar
);
err_node_cleanup:
ath6kl_wmi_shutdown
(
ar
->
wmi
);
clear_bit
(
WMI_ENABLED
,
&
ar
->
flag
);
ar
->
wmi
=
NULL
;
err_htc_cleanup:
ath6kl_htc_cleanup
(
ar
->
htc_target
);
err_power_off:
ath6kl_hif_power_off
(
ar
);
err_bmi_cleanup:
ath6kl_bmi_cleanup
(
ar
);
err_wq:
destroy_workqueue
(
ar
->
ath6kl_wq
);
return
ret
;
}
EXPORT_SYMBOL
(
ath6kl_core_init
);
struct
ath6kl
*
ath6kl_core_create
(
struct
device
*
dev
)
{
struct
ath6kl
*
ar
;
u8
ctr
;
ar
=
ath6kl_cfg80211_create
();
if
(
!
ar
)
return
NULL
;
ar
->
p2p
=
!!
ath6kl_p2p
;
ar
->
dev
=
dev
;
ar
->
vif_max
=
1
;
ar
->
max_norm_iface
=
1
;
spin_lock_init
(
&
ar
->
lock
);
spin_lock_init
(
&
ar
->
mcastpsq_lock
);
spin_lock_init
(
&
ar
->
list_lock
);
init_waitqueue_head
(
&
ar
->
event_wq
);
sema_init
(
&
ar
->
sem
,
1
);
INIT_LIST_HEAD
(
&
ar
->
amsdu_rx_buffer_queue
);
INIT_LIST_HEAD
(
&
ar
->
vif_list
);
clear_bit
(
WMI_ENABLED
,
&
ar
->
flag
);
clear_bit
(
SKIP_SCAN
,
&
ar
->
flag
);
clear_bit
(
DESTROY_IN_PROGRESS
,
&
ar
->
flag
);
ar
->
listen_intvl_b
=
A_DEFAULT_LISTEN_INTERVAL
;
ar
->
tx_pwr
=
0
;
ar
->
intra_bss
=
1
;
ar
->
lrssi_roam_threshold
=
DEF_LRSSI_ROAM_THRESHOLD
;
ar
->
state
=
ATH6KL_STATE_OFF
;
memset
((
u8
*
)
ar
->
sta_list
,
0
,
AP_MAX_NUM_STA
*
sizeof
(
struct
ath6kl_sta
));
/* Init the PS queues */
for
(
ctr
=
0
;
ctr
<
AP_MAX_NUM_STA
;
ctr
++
)
{
spin_lock_init
(
&
ar
->
sta_list
[
ctr
].
psq_lock
);
skb_queue_head_init
(
&
ar
->
sta_list
[
ctr
].
psq
);
skb_queue_head_init
(
&
ar
->
sta_list
[
ctr
].
apsdq
);
ar
->
sta_list
[
ctr
].
aggr_conn
=
kzalloc
(
sizeof
(
struct
aggr_info_conn
),
GFP_KERNEL
);
if
(
!
ar
->
sta_list
[
ctr
].
aggr_conn
)
{
ath6kl_err
(
"Failed to allocate memory for sta aggregation information
\n
"
);
ath6kl_core_destroy
(
ar
);
return
NULL
;
}
}
skb_queue_head_init
(
&
ar
->
mcastpsq
);
memcpy
(
ar
->
ap_country_code
,
DEF_AP_COUNTRY_CODE
,
3
);
return
ar
;
}
EXPORT_SYMBOL
(
ath6kl_core_create
);
void
ath6kl_core_cleanup
(
struct
ath6kl
*
ar
)
{
ath6kl_hif_power_off
(
ar
);
destroy_workqueue
(
ar
->
ath6kl_wq
);
if
(
ar
->
htc_target
)
ath6kl_htc_cleanup
(
ar
->
htc_target
);
ath6kl_cookie_cleanup
(
ar
);
ath6kl_cleanup_amsdu_rxbufs
(
ar
);
ath6kl_bmi_cleanup
(
ar
);
ath6kl_debug_cleanup
(
ar
);
kfree
(
ar
->
fw_board
);
kfree
(
ar
->
fw_otp
);
kfree
(
ar
->
fw
);
kfree
(
ar
->
fw_patch
);
kfree
(
ar
->
fw_testscript
);
ath6kl_cfg80211_cleanup
(
ar
);
}
EXPORT_SYMBOL
(
ath6kl_core_cleanup
);
void
ath6kl_core_destroy
(
struct
ath6kl
*
ar
)
{
ath6kl_cfg80211_destroy
(
ar
);
}
EXPORT_SYMBOL
(
ath6kl_core_destroy
);
MODULE_AUTHOR
(
"Qualcomm Atheros"
);
MODULE_DESCRIPTION
(
"Core module for AR600x SDIO and USB devices."
);
MODULE_LICENSE
(
"Dual BSD/GPL"
);
drivers/net/wireless/ath/ath6kl/core.h
View file @
b9d90578
...
...
@@ -44,6 +44,10 @@
#define ATH6KL_MAX_ENDPOINTS 4
#define MAX_NODE_NUM 15
#define ATH6KL_APSD_ALL_FRAME 0xFFFF
#define ATH6KL_APSD_NUM_OF_AC 0x4
#define ATH6KL_APSD_FRAME_MASK 0xF
/* Extra bytes for htc header alignment */
#define ATH6KL_HTC_ALIGN_BYTES 3
...
...
@@ -55,7 +59,7 @@
#define MAX_DEFAULT_SEND_QUEUE_DEPTH (MAX_DEF_COOKIE_NUM / WMM_NUM_AC)
#define DISCON_TIMER_INTVAL 10000
/* in msec */
#define A_DEFAULT_LISTEN_INTERVAL 1
00
#define A_DEFAULT_LISTEN_INTERVAL 1
/* beacon intervals */
#define A_MAX_WOW_LISTEN_INTERVAL 1000
/* includes also the null byte */
...
...
@@ -97,45 +101,49 @@ struct ath6kl_fw_ie {
u8
data
[
0
];
};
#define ATH6KL_FW_API2_FILE "fw-2.bin"
#define ATH6KL_FW_API3_FILE "fw-3.bin"
/* AR6003 1.0 definitions */
#define AR6003_HW_1_0_VERSION 0x300002ba
/* AR6003 2.0 definitions */
#define AR6003_HW_2_0_VERSION 0x30000384
#define AR6003_HW_2_0_PATCH_DOWNLOAD_ADDRESS 0x57e910
#define AR6003_HW_2_0_
OTP_FILE "ath6k/AR6003/hw2.0/otp.bin.z77
"
#define AR6003_HW_2_0_
FIRMWARE_FILE "ath6k/AR6003/hw2.0/athwlan
.bin.z77"
#define AR6003_HW_2_0_
TCMD_FIRMWARE_FILE "ath6k/AR6003/hw2.0/athtcmd_ram.bin
"
#define AR6003_HW_2_0_
PATCH_FILE "ath6k/AR6003/hw2.0/data.patch
.bin"
#define AR6003_HW_2_0_
FIRMWARE_2_FILE "ath6k/AR6003/hw2.0/fw-2
.bin"
#define AR6003_HW_2_0_
FW_DIR "ath6k/AR6003/hw2.0
"
#define AR6003_HW_2_0_
OTP_FILE "otp
.bin.z77"
#define AR6003_HW_2_0_
FIRMWARE_FILE "athwlan.bin.z77
"
#define AR6003_HW_2_0_
TCMD_FIRMWARE_FILE "athtcmd_ram
.bin"
#define AR6003_HW_2_0_
PATCH_FILE "data.patch
.bin"
#define AR6003_HW_2_0_BOARD_DATA_FILE "ath6k/AR6003/hw2.0/bdata.bin"
#define AR6003_HW_2_0_DEFAULT_BOARD_DATA_FILE \
"ath6k/AR6003/hw2.0/bdata.SD31.bin"
/* AR6003 3.0 definitions */
#define AR6003_HW_2_1_1_VERSION 0x30000582
#define AR6003_HW_2_1_1_OTP_FILE "ath6k/AR6003/hw2.1.1/otp.bin"
#define AR6003_HW_2_1_1_FIRMWARE_FILE "ath6k/AR6003/hw2.1.1/athwlan.bin"
#define AR6003_HW_2_1_1_TCMD_FIRMWARE_FILE \
"ath6k/AR6003/hw2.1.1/athtcmd_ram.bin"
#define AR6003_HW_2_1_1_PATCH_FILE "ath6k/AR6003/hw2.1.1/data.patch.bin"
#define AR6003_HW_2_1_1_FIRMWARE_2_FILE "ath6k/AR6003/hw2.1.1/fw-2.bin"
#define AR6003_HW_2_1_1_FW_DIR "ath6k/AR6003/hw2.1.1"
#define AR6003_HW_2_1_1_OTP_FILE "otp.bin"
#define AR6003_HW_2_1_1_FIRMWARE_FILE "athwlan.bin"
#define AR6003_HW_2_1_1_TCMD_FIRMWARE_FILE "athtcmd_ram.bin"
#define AR6003_HW_2_1_1_UTF_FIRMWARE_FILE "utf.bin"
#define AR6003_HW_2_1_1_TESTSCRIPT_FILE "nullTestFlow.bin"
#define AR6003_HW_2_1_1_PATCH_FILE "data.patch.bin"
#define AR6003_HW_2_1_1_BOARD_DATA_FILE "ath6k/AR6003/hw2.1.1/bdata.bin"
#define AR6003_HW_2_1_1_DEFAULT_BOARD_DATA_FILE \
"ath6k/AR6003/hw2.1.1/bdata.SD31.bin"
/* AR6004 1.0 definitions */
#define AR6004_HW_1_0_VERSION 0x30000623
#define AR6004_HW_1_0_F
IRMWARE_2_FILE "ath6k/AR6004/hw1.0/fw-2.bin
"
#define AR6004_HW_1_0_FIRMWARE_FILE
"ath6k/AR6004/hw1.0/
fw.ram.bin"
#define AR6004_HW_1_0_F
W_DIR "ath6k/AR6004/hw1.0
"
#define AR6004_HW_1_0_FIRMWARE_FILE
"
fw.ram.bin"
#define AR6004_HW_1_0_BOARD_DATA_FILE "ath6k/AR6004/hw1.0/bdata.bin"
#define AR6004_HW_1_0_DEFAULT_BOARD_DATA_FILE \
"ath6k/AR6004/hw1.0/bdata.DB132.bin"
/* AR6004 1.1 definitions */
#define AR6004_HW_1_1_VERSION 0x30000001
#define AR6004_HW_1_1_F
IRMWARE_2_FILE "ath6k/AR6004/hw1.1/fw-2.bin
"
#define AR6004_HW_1_1_FIRMWARE_FILE
"ath6k/AR6004/hw1.1/
fw.ram.bin"
#define AR6004_HW_1_1_F
W_DIR "ath6k/AR6004/hw1.1
"
#define AR6004_HW_1_1_FIRMWARE_FILE
"
fw.ram.bin"
#define AR6004_HW_1_1_BOARD_DATA_FILE "ath6k/AR6004/hw1.1/bdata.bin"
#define AR6004_HW_1_1_DEFAULT_BOARD_DATA_FILE \
"ath6k/AR6004/hw1.1/bdata.DB132.bin"
...
...
@@ -144,6 +152,8 @@ struct ath6kl_fw_ie {
#define STA_PS_AWAKE BIT(0)
#define STA_PS_SLEEP BIT(1)
#define STA_PS_POLLED BIT(2)
#define STA_PS_APSD_TRIGGER BIT(3)
#define STA_PS_APSD_EOSP BIT(4)
/* HTC TX packet tagging definitions */
#define ATH6KL_CONTROL_PKT_TAG HTC_TX_PACKET_TAG_USER_DEFINED
...
...
@@ -186,7 +196,7 @@ struct ath6kl_fw_ie {
#define ATH6KL_CONF_IGNORE_PS_FAIL_EVT_IN_SCAN BIT(1)
#define ATH6KL_CONF_ENABLE_11N BIT(2)
#define ATH6KL_CONF_ENABLE_TX_BURST BIT(3)
#define ATH6KL_CONF_
SUSPEND_CUTPOWER
BIT(4)
#define ATH6KL_CONF_
UART_DEBUG
BIT(4)
enum
wlan_low_pwr_state
{
WLAN_POWER_STATE_ON
,
...
...
@@ -231,14 +241,19 @@ struct rxtid_stats {
u32
num_bar
;
};
struct
aggr_info
{
struct
aggr_info
_conn
{
u8
aggr_sz
;
u8
timer_scheduled
;
struct
timer_list
timer
;
struct
net_device
*
dev
;
struct
rxtid
rx_tid
[
NUM_OF_TIDS
];
struct
sk_buff_head
free_q
;
struct
rxtid_stats
stat
[
NUM_OF_TIDS
];
struct
aggr_info
*
aggr_info
;
};
struct
aggr_info
{
struct
aggr_info_conn
*
aggr_conn
;
struct
sk_buff_head
rx_amsdu_freeq
;
};
struct
ath6kl_wep_key
{
...
...
@@ -280,6 +295,9 @@ struct ath6kl_sta {
u8
wpa_ie
[
ATH6KL_MAX_IE
];
struct
sk_buff_head
psq
;
spinlock_t
psq_lock
;
u8
apsd_info
;
struct
sk_buff_head
apsdq
;
struct
aggr_info_conn
*
aggr_conn
;
};
struct
ath6kl_version
{
...
...
@@ -408,6 +426,13 @@ enum ath6kl_hif_type {
ATH6KL_HIF_TYPE_USB
,
};
/* Max number of filters that hw supports */
#define ATH6K_MAX_MC_FILTERS_PER_LIST 7
struct
ath6kl_mc_filter
{
struct
list_head
list
;
char
hw_addr
[
ATH6KL_MCAST_FILTER_MAC_ADDR_SIZE
];
};
/*
* Driver's maximum limit, note that some firmwares support only one vif
* and the runtime (current) limit must be checked from ar->vif_max.
...
...
@@ -426,6 +451,7 @@ enum ath6kl_vif_state {
DTIM_PERIOD_AVAIL
,
WLAN_ENABLED
,
STATS_UPDATE_PEND
,
HOST_SLEEP_MODE_CMD_PROCESSED
,
};
struct
ath6kl_vif
{
...
...
@@ -471,6 +497,8 @@ struct ath6kl_vif {
u8
assoc_bss_dtim_period
;
struct
net_device_stats
net_stats
;
struct
target_stats
target_stats
;
struct
list_head
mc_filter
;
};
#define WOW_LIST_ID 0
...
...
@@ -504,6 +532,7 @@ struct ath6kl {
struct
wiphy
*
wiphy
;
enum
ath6kl_state
state
;
unsigned
int
testmode
;
struct
ath6kl_bmi
bmi
;
const
struct
ath6kl_hif_ops
*
hif_ops
;
...
...
@@ -523,7 +552,6 @@ struct ath6kl {
spinlock_t
lock
;
struct
semaphore
sem
;
u16
listen_intvl_b
;
u16
listen_intvl_t
;
u8
lrssi_roam_threshold
;
struct
ath6kl_version
version
;
u32
target_type
;
...
...
@@ -574,17 +602,24 @@ struct ath6kl {
u32
board_addr
;
u32
refclk_hz
;
u32
uarttx_pin
;
u32
testscript_addr
;
struct
ath6kl_hw_fw
{
const
char
*
dir
;
const
char
*
otp
;
const
char
*
fw
;
const
char
*
tcmd
;
const
char
*
patch
;
const
char
*
utf
;
const
char
*
testscript
;
}
fw
;
const
char
*
fw_otp
;
const
char
*
fw
;
const
char
*
fw_tcmd
;
const
char
*
fw_patch
;
const
char
*
fw_api2
;
const
char
*
fw_board
;
const
char
*
fw_default_board
;
}
hw
;
u16
conf_flags
;
u16
suspend_mode
;
wait_queue_head_t
event_wq
;
struct
ath6kl_mbox_info
mbox_info
;
...
...
@@ -603,6 +638,10 @@ struct ath6kl {
u8
*
fw_patch
;
size_t
fw_patch_len
;
u8
*
fw_testscript
;
size_t
fw_testscript_len
;
unsigned
int
fw_api
;
unsigned
long
fw_capabilities
[
ATH6KL_CAPABILITY_LEN
];
struct
workqueue_struct
*
ath6kl_wq
;
...
...
@@ -676,7 +715,9 @@ struct ath6kl_cookie *ath6kl_alloc_cookie(struct ath6kl *ar);
void
ath6kl_free_cookie
(
struct
ath6kl
*
ar
,
struct
ath6kl_cookie
*
cookie
);
int
ath6kl_data_tx
(
struct
sk_buff
*
skb
,
struct
net_device
*
dev
);
struct
aggr_info
*
aggr_init
(
struct
net_device
*
dev
);
struct
aggr_info
*
aggr_init
(
struct
ath6kl_vif
*
vif
);
void
aggr_conn_init
(
struct
ath6kl_vif
*
vif
,
struct
aggr_info
*
aggr_info
,
struct
aggr_info_conn
*
aggr_conn
);
void
ath6kl_rx_refill
(
struct
htc_target
*
target
,
enum
htc_endpoint_id
endpoint
);
void
ath6kl_refill_amsdu_rxbufs
(
struct
ath6kl
*
ar
,
int
count
);
...
...
@@ -684,7 +725,7 @@ struct htc_packet *ath6kl_alloc_amsdu_rxbuf(struct htc_target *target,
enum
htc_endpoint_id
endpoint
,
int
len
);
void
aggr_module_destroy
(
struct
aggr_info
*
aggr_info
);
void
aggr_reset_state
(
struct
aggr_info
*
aggr_info
);
void
aggr_reset_state
(
struct
aggr_info
_conn
*
aggr_conn
);
struct
ath6kl_sta
*
ath6kl_find_sta
(
struct
ath6kl_vif
*
vif
,
u8
*
node_addr
);
struct
ath6kl_sta
*
ath6kl_find_sta_by_aid
(
struct
ath6kl
*
ar
,
u8
aid
);
...
...
@@ -700,7 +741,7 @@ void ath6kl_connect_event(struct ath6kl_vif *vif, u16 channel,
void
ath6kl_connect_ap_mode_bss
(
struct
ath6kl_vif
*
vif
,
u16
channel
);
void
ath6kl_connect_ap_mode_sta
(
struct
ath6kl_vif
*
vif
,
u16
aid
,
u8
*
mac_addr
,
u8
keymgmt
,
u8
ucipher
,
u8
auth
,
u8
assoc_req_len
,
u8
*
assoc_info
);
u8
assoc_req_len
,
u8
*
assoc_info
,
u8
apsd_info
);
void
ath6kl_disconnect_event
(
struct
ath6kl_vif
*
vif
,
u8
reason
,
u8
*
bssid
,
u8
assoc_resp_len
,
u8
*
assoc_info
,
u16
prot_reason_status
);
...
...
@@ -723,12 +764,18 @@ void ath6kl_wakeup_event(void *dev);
void
ath6kl_reset_device
(
struct
ath6kl
*
ar
,
u32
target_type
,
bool
wait_fot_compltn
,
bool
cold_reset
);
void
ath6kl_init_control_info
(
struct
ath6kl_vif
*
vif
);
void
ath6kl_deinit_if_data
(
struct
ath6kl_vif
*
vif
);
void
ath6kl_core_free
(
struct
ath6kl
*
ar
);
struct
ath6kl_vif
*
ath6kl_vif_first
(
struct
ath6kl
*
ar
);
void
ath6kl_cleanup_vif
(
struct
ath6kl_vif
*
vif
,
bool
wmi_ready
);
int
ath6kl_init_hw_start
(
struct
ath6kl
*
ar
);
int
ath6kl_init_hw_stop
(
struct
ath6kl
*
ar
);
int
ath6kl_init_fetch_firmwares
(
struct
ath6kl
*
ar
);
int
ath6kl_init_hw_params
(
struct
ath6kl
*
ar
);
void
ath6kl_check_wow_status
(
struct
ath6kl
*
ar
);
struct
ath6kl
*
ath6kl_core_create
(
struct
device
*
dev
);
int
ath6kl_core_init
(
struct
ath6kl
*
ar
);
void
ath6kl_core_cleanup
(
struct
ath6kl
*
ar
);
void
ath6kl_core_destroy
(
struct
ath6kl
*
ar
);
#endif
/* CORE_H */
drivers/net/wireless/ath/ath6kl/debug.c
View file @
b9d90578
...
...
@@ -54,9 +54,42 @@ int ath6kl_printk(const char *level, const char *fmt, ...)
return
rtn
;
}
EXPORT_SYMBOL
(
ath6kl_printk
);
#ifdef CONFIG_ATH6KL_DEBUG
void
ath6kl_dbg
(
enum
ATH6K_DEBUG_MASK
mask
,
const
char
*
fmt
,
...)
{
struct
va_format
vaf
;
va_list
args
;
if
(
!
(
debug_mask
&
mask
))
return
;
va_start
(
args
,
fmt
);
vaf
.
fmt
=
fmt
;
vaf
.
va
=
&
args
;
ath6kl_printk
(
KERN_DEBUG
,
"%pV"
,
&
vaf
);
va_end
(
args
);
}
EXPORT_SYMBOL
(
ath6kl_dbg
);
void
ath6kl_dbg_dump
(
enum
ATH6K_DEBUG_MASK
mask
,
const
char
*
msg
,
const
char
*
prefix
,
const
void
*
buf
,
size_t
len
)
{
if
(
debug_mask
&
mask
)
{
if
(
msg
)
ath6kl_dbg
(
mask
,
"%s
\n
"
,
msg
);
print_hex_dump_bytes
(
prefix
,
DUMP_PREFIX_OFFSET
,
buf
,
len
);
}
}
EXPORT_SYMBOL
(
ath6kl_dbg_dump
);
#define REG_OUTPUT_LEN_PER_LINE 25
#define REGTYPE_STR_LEN 100
...
...
@@ -82,31 +115,31 @@ void ath6kl_dump_registers(struct ath6kl_device *dev,
struct
ath6kl_irq_enable_reg
*
irq_enable_reg
)
{
ath6kl_dbg
(
ATH6KL_DBG_
ANY
,
(
"<------- Register Table -------->
\n
"
));
ath6kl_dbg
(
ATH6KL_DBG_
IRQ
,
(
"<------- Register Table -------->
\n
"
));
if
(
irq_proc_reg
!=
NULL
)
{
ath6kl_dbg
(
ATH6KL_DBG_
ANY
,
ath6kl_dbg
(
ATH6KL_DBG_
IRQ
,
"Host Int status: 0x%x
\n
"
,
irq_proc_reg
->
host_int_status
);
ath6kl_dbg
(
ATH6KL_DBG_
ANY
,
ath6kl_dbg
(
ATH6KL_DBG_
IRQ
,
"CPU Int status: 0x%x
\n
"
,
irq_proc_reg
->
cpu_int_status
);
ath6kl_dbg
(
ATH6KL_DBG_
ANY
,
ath6kl_dbg
(
ATH6KL_DBG_
IRQ
,
"Error Int status: 0x%x
\n
"
,
irq_proc_reg
->
error_int_status
);
ath6kl_dbg
(
ATH6KL_DBG_
ANY
,
ath6kl_dbg
(
ATH6KL_DBG_
IRQ
,
"Counter Int status: 0x%x
\n
"
,
irq_proc_reg
->
counter_int_status
);
ath6kl_dbg
(
ATH6KL_DBG_
ANY
,
ath6kl_dbg
(
ATH6KL_DBG_
IRQ
,
"Mbox Frame: 0x%x
\n
"
,
irq_proc_reg
->
mbox_frame
);
ath6kl_dbg
(
ATH6KL_DBG_
ANY
,
ath6kl_dbg
(
ATH6KL_DBG_
IRQ
,
"Rx Lookahead Valid: 0x%x
\n
"
,
irq_proc_reg
->
rx_lkahd_valid
);
ath6kl_dbg
(
ATH6KL_DBG_
ANY
,
ath6kl_dbg
(
ATH6KL_DBG_
IRQ
,
"Rx Lookahead 0: 0x%x
\n
"
,
irq_proc_reg
->
rx_lkahd
[
0
]);
ath6kl_dbg
(
ATH6KL_DBG_
ANY
,
ath6kl_dbg
(
ATH6KL_DBG_
IRQ
,
"Rx Lookahead 1: 0x%x
\n
"
,
irq_proc_reg
->
rx_lkahd
[
1
]);
...
...
@@ -115,16 +148,16 @@ void ath6kl_dump_registers(struct ath6kl_device *dev,
* If the target supports GMBOX hardware, dump some
* additional state.
*/
ath6kl_dbg
(
ATH6KL_DBG_
ANY
,
ath6kl_dbg
(
ATH6KL_DBG_
IRQ
,
"GMBOX Host Int status 2: 0x%x
\n
"
,
irq_proc_reg
->
host_int_status2
);
ath6kl_dbg
(
ATH6KL_DBG_
ANY
,
ath6kl_dbg
(
ATH6KL_DBG_
IRQ
,
"GMBOX RX Avail: 0x%x
\n
"
,
irq_proc_reg
->
gmbox_rx_avail
);
ath6kl_dbg
(
ATH6KL_DBG_
ANY
,
ath6kl_dbg
(
ATH6KL_DBG_
IRQ
,
"GMBOX lookahead alias 0: 0x%x
\n
"
,
irq_proc_reg
->
rx_gmbox_lkahd_alias
[
0
]);
ath6kl_dbg
(
ATH6KL_DBG_
ANY
,
ath6kl_dbg
(
ATH6KL_DBG_
IRQ
,
"GMBOX lookahead alias 1: 0x%x
\n
"
,
irq_proc_reg
->
rx_gmbox_lkahd_alias
[
1
]);
}
...
...
@@ -132,13 +165,13 @@ void ath6kl_dump_registers(struct ath6kl_device *dev,
}
if
(
irq_enable_reg
!=
NULL
)
{
ath6kl_dbg
(
ATH6KL_DBG_
ANY
,
ath6kl_dbg
(
ATH6KL_DBG_
IRQ
,
"Int status Enable: 0x%x
\n
"
,
irq_enable_reg
->
int_status_en
);
ath6kl_dbg
(
ATH6KL_DBG_
ANY
,
"Counter Int status Enable: 0x%x
\n
"
,
ath6kl_dbg
(
ATH6KL_DBG_
IRQ
,
"Counter Int status Enable: 0x%x
\n
"
,
irq_enable_reg
->
cntr_int_status_en
);
}
ath6kl_dbg
(
ATH6KL_DBG_
ANY
,
"<------------------------------->
\n
"
);
ath6kl_dbg
(
ATH6KL_DBG_
IRQ
,
"<------------------------------->
\n
"
);
}
static
void
dump_cred_dist
(
struct
htc_endpoint_credit_dist
*
ep_dist
)
...
...
@@ -175,9 +208,6 @@ void dump_cred_dist_stats(struct htc_target *target)
{
struct
htc_endpoint_credit_dist
*
ep_list
;
if
(
!
AR_DBG_LVL_CHECK
(
ATH6KL_DBG_CREDIT
))
return
;
list_for_each_entry
(
ep_list
,
&
target
->
cred_dist_list
,
list
)
dump_cred_dist
(
ep_list
);
...
...
@@ -1411,6 +1441,8 @@ static ssize_t ath6kl_create_qos_write(struct file *file,
return
-
EINVAL
;
pstream
.
medium_time
=
cpu_to_le32
(
val32
);
pstream
.
nominal_phy
=
le32_to_cpu
(
pstream
.
min_phy_rate
)
/
1000000
;
ath6kl_wmi_create_pstream_cmd
(
ar
->
wmi
,
vif
->
fw_vif_idx
,
&
pstream
);
return
count
;
...
...
@@ -1505,57 +1537,46 @@ static const struct file_operations fops_bgscan_int = {
};
static
ssize_t
ath6kl_listen_int_write
(
struct
file
*
file
,
const
char
__user
*
user_buf
,
size_t
count
,
loff_t
*
ppos
)
const
char
__user
*
user_buf
,
size_t
count
,
loff_t
*
ppos
)
{
struct
ath6kl
*
ar
=
file
->
private_data
;
u16
listen_int_t
,
listen_int_b
;
struct
ath6kl_vif
*
vif
;
u16
listen_interval
;
char
buf
[
32
];
char
*
sptr
,
*
token
;
ssize_t
len
;
vif
=
ath6kl_vif_first
(
ar
);
if
(
!
vif
)
return
-
EIO
;
len
=
min
(
count
,
sizeof
(
buf
)
-
1
);
if
(
copy_from_user
(
buf
,
user_buf
,
len
))
return
-
EFAULT
;
buf
[
len
]
=
'\0'
;
sptr
=
buf
;
token
=
strsep
(
&
sptr
,
" "
);
if
(
!
token
)
return
-
EINVAL
;
if
(
kstrtou16
(
token
,
0
,
&
listen_int_t
))
return
-
EINVAL
;
if
(
kstrtou16
(
sptr
,
0
,
&
listen_int_b
))
return
-
EINVAL
;
if
((
listen_int_t
<
15
)
||
(
listen_int_t
>
5000
))
if
(
kstrtou16
(
buf
,
0
,
&
listen_interval
))
return
-
EINVAL
;
if
((
listen_int
_b
<
1
)
||
(
listen_int_b
>
50
))
if
((
listen_int
erval
<
1
)
||
(
listen_interval
>
50
))
return
-
EINVAL
;
ar
->
listen_intvl_t
=
listen_int_t
;
ar
->
listen_intvl_b
=
listen_int_b
;
ath6kl_wmi_listeninterval_cmd
(
ar
->
wmi
,
0
,
ar
->
listen_intvl_t
,
ar
->
listen_intvl_b
=
listen_interval
;
ath6kl_wmi_listeninterval_cmd
(
ar
->
wmi
,
vif
->
fw_vif_idx
,
0
,
ar
->
listen_intvl_b
);
return
count
;
}
static
ssize_t
ath6kl_listen_int_read
(
struct
file
*
file
,
char
__user
*
user_buf
,
size_t
count
,
loff_t
*
ppos
)
char
__user
*
user_buf
,
size_t
count
,
loff_t
*
ppos
)
{
struct
ath6kl
*
ar
=
file
->
private_data
;
char
buf
[
32
];
int
len
;
len
=
scnprintf
(
buf
,
sizeof
(
buf
),
"%u %u
\n
"
,
ar
->
listen_intvl_t
,
ar
->
listen_intvl_b
);
len
=
scnprintf
(
buf
,
sizeof
(
buf
),
"%u
\n
"
,
ar
->
listen_intvl_b
);
return
simple_read_from_buffer
(
user_buf
,
count
,
ppos
,
buf
,
len
);
}
...
...
@@ -1710,6 +1731,9 @@ int ath6kl_debug_init(struct ath6kl *ar)
debugfs_create_file
(
"bgscan_interval"
,
S_IWUSR
,
ar
->
debugfs_phy
,
ar
,
&
fops_bgscan_int
);
debugfs_create_file
(
"listen_interval"
,
S_IRUSR
|
S_IWUSR
,
ar
->
debugfs_phy
,
ar
,
&
fops_listen_int
);
debugfs_create_file
(
"power_params"
,
S_IWUSR
,
ar
->
debugfs_phy
,
ar
,
&
fops_power_params
);
...
...
drivers/net/wireless/ath/ath6kl/debug.h
View file @
b9d90578
...
...
@@ -41,6 +41,7 @@ enum ATH6K_DEBUG_MASK {
ATH6KL_DBG_BOOT
=
BIT
(
18
),
/* driver init and fw boot */
ATH6KL_DBG_WMI_DUMP
=
BIT
(
19
),
ATH6KL_DBG_SUSPEND
=
BIT
(
20
),
ATH6KL_DBG_USB
=
BIT
(
21
),
ATH6KL_DBG_ANY
=
0xffffffff
/* enable all logs */
};
...
...
@@ -55,35 +56,16 @@ int ath6kl_printk(const char *level, const char *fmt, ...);
#define ath6kl_warn(fmt, ...) \
ath6kl_printk(KERN_WARNING, fmt, ##__VA_ARGS__)
#define AR_DBG_LVL_CHECK(mask) (debug_mask & mask)
enum
ath6kl_war
{
ATH6KL_WAR_INVALID_RATE
,
};
#ifdef CONFIG_ATH6KL_DEBUG
#define ath6kl_dbg(mask, fmt, ...) \
({ \
int rtn; \
if (debug_mask & mask) \
rtn = ath6kl_printk(KERN_DEBUG, fmt, ##__VA_ARGS__); \
else \
rtn = 0; \
\
rtn; \
})
static
inline
void
ath6kl_dbg_dump
(
enum
ATH6K_DEBUG_MASK
mask
,
const
char
*
msg
,
const
char
*
prefix
,
const
void
*
buf
,
size_t
len
)
{
if
(
debug_mask
&
mask
)
{
if
(
msg
)
ath6kl_dbg
(
mask
,
"%s
\n
"
,
msg
);
print_hex_dump_bytes
(
prefix
,
DUMP_PREFIX_OFFSET
,
buf
,
len
);
}
}
void
ath6kl_dbg
(
enum
ATH6K_DEBUG_MASK
mask
,
const
char
*
fmt
,
...);
void
ath6kl_dbg_dump
(
enum
ATH6K_DEBUG_MASK
mask
,
const
char
*
msg
,
const
char
*
prefix
,
const
void
*
buf
,
size_t
len
);
void
ath6kl_dump_registers
(
struct
ath6kl_device
*
dev
,
struct
ath6kl_irq_proc_registers
*
irq_proc_reg
,
...
...
drivers/net/wireless/ath/ath6kl/hif.c
View file @
b9d90578
...
...
@@ -15,6 +15,8 @@
*/
#include "hif.h"
#include <linux/export.h>
#include "core.h"
#include "target.h"
#include "hif-ops.h"
...
...
@@ -59,6 +61,8 @@ int ath6kl_hif_rw_comp_handler(void *context, int status)
return
0
;
}
EXPORT_SYMBOL
(
ath6kl_hif_rw_comp_handler
);
#define REG_DUMP_COUNT_AR6003 60
#define REGISTER_DUMP_LEN_MAX 60
...
...
@@ -429,9 +433,8 @@ static int proc_pending_irqs(struct ath6kl_device *dev, bool *done)
if
(
status
)
goto
out
;
if
(
AR_DBG_LVL_CHECK
(
ATH6KL_DBG_IRQ
))
ath6kl_dump_registers
(
dev
,
&
dev
->
irq_proc_reg
,
&
dev
->
irq_en_reg
);
ath6kl_dump_registers
(
dev
,
&
dev
->
irq_proc_reg
,
&
dev
->
irq_en_reg
);
/* Update only those registers that are enabled */
host_int_status
=
dev
->
irq_proc_reg
.
host_int_status
&
...
...
@@ -561,6 +564,7 @@ int ath6kl_hif_intr_bh_handler(struct ath6kl *ar)
return
status
;
}
EXPORT_SYMBOL
(
ath6kl_hif_intr_bh_handler
);
static
int
ath6kl_hif_enable_intrs
(
struct
ath6kl_device
*
dev
)
{
...
...
@@ -689,6 +693,11 @@ int ath6kl_hif_setup(struct ath6kl_device *dev)
ath6kl_dbg
(
ATH6KL_DBG_HIF
,
"hif block size %d mbox addr 0x%x
\n
"
,
dev
->
htc_cnxt
->
block_sz
,
dev
->
ar
->
mbox_info
.
htc_addr
);
/* usb doesn't support enabling interrupts */
/* FIXME: remove check once USB support is implemented */
if
(
dev
->
ar
->
hif_type
==
ATH6KL_HIF_TYPE_USB
)
return
0
;
status
=
ath6kl_hif_disable_intrs
(
dev
);
fail_setup:
...
...
drivers/net/wireless/ath/ath6kl/htc.c
View file @
b9d90578
...
...
@@ -2062,6 +2062,7 @@ int ath6kl_htc_rxmsg_pending_handler(struct htc_target *target,
enum
htc_endpoint_id
id
;
int
n_fetched
=
0
;
INIT_LIST_HEAD
(
&
comp_pktq
);
*
num_pkts
=
0
;
/*
...
...
@@ -2543,6 +2544,12 @@ int ath6kl_htc_wait_target(struct htc_target *target)
struct
htc_service_connect_resp
resp
;
int
status
;
/* FIXME: remove once USB support is implemented */
if
(
target
->
dev
->
ar
->
hif_type
==
ATH6KL_HIF_TYPE_USB
)
{
ath6kl_err
(
"HTC doesn't support USB yet. Patience!
\n
"
);
return
-
EOPNOTSUPP
;
}
/* we should be getting 1 control message that the target is ready */
packet
=
htc_wait_for_ctrl_msg
(
target
);
...
...
@@ -2772,7 +2779,9 @@ void ath6kl_htc_cleanup(struct htc_target *target)
{
struct
htc_packet
*
packet
,
*
tmp_packet
;
ath6kl_hif_cleanup_scatter
(
target
->
dev
->
ar
);
/* FIXME: remove check once USB support is implemented */
if
(
target
->
dev
->
ar
->
hif_type
!=
ATH6KL_HIF_TYPE_USB
)
ath6kl_hif_cleanup_scatter
(
target
->
dev
->
ar
);
list_for_each_entry_safe
(
packet
,
tmp_packet
,
&
target
->
free_ctrl_txbuf
,
list
)
{
...
...
drivers/net/wireless/ath/ath6kl/init.c
View file @
b9d90578
This diff is collapsed.
Click to expand it.
drivers/net/wireless/ath/ath6kl/main.c
View file @
b9d90578
...
...
@@ -52,9 +52,11 @@ struct ath6kl_sta *ath6kl_find_sta_by_aid(struct ath6kl *ar, u8 aid)
return
conn
;
}
static
void
ath6kl_add_new_sta
(
struct
ath6kl
*
ar
,
u8
*
mac
,
u16
aid
,
u8
*
wpaie
,
u8
ielen
,
u8
keymgmt
,
u8
ucipher
,
u8
auth
)
static
void
ath6kl_add_new_sta
(
struct
ath6kl_vif
*
vif
,
u8
*
mac
,
u16
aid
,
u8
*
wpaie
,
size_t
ielen
,
u8
keymgmt
,
u8
ucipher
,
u8
auth
,
u8
apsd_info
)
{
struct
ath6kl
*
ar
=
vif
->
ar
;
struct
ath6kl_sta
*
sta
;
u8
free_slot
;
...
...
@@ -68,9 +70,11 @@ static void ath6kl_add_new_sta(struct ath6kl *ar, u8 *mac, u16 aid, u8 *wpaie,
sta
->
keymgmt
=
keymgmt
;
sta
->
ucipher
=
ucipher
;
sta
->
auth
=
auth
;
sta
->
apsd_info
=
apsd_info
;
ar
->
sta_list_index
=
ar
->
sta_list_index
|
(
1
<<
free_slot
);
ar
->
ap_stats
.
sta
[
free_slot
].
aid
=
cpu_to_le32
(
aid
);
aggr_conn_init
(
vif
,
vif
->
aggr_cntxt
,
sta
->
aggr_conn
);
}
static
void
ath6kl_sta_cleanup
(
struct
ath6kl
*
ar
,
u8
i
)
...
...
@@ -80,6 +84,7 @@ static void ath6kl_sta_cleanup(struct ath6kl *ar, u8 i)
/* empty the queued pkts in the PS queue if any */
spin_lock_bh
(
&
sta
->
psq_lock
);
skb_queue_purge
(
&
sta
->
psq
);
skb_queue_purge
(
&
sta
->
apsdq
);
spin_unlock_bh
(
&
sta
->
psq_lock
);
memset
(
&
ar
->
ap_stats
.
sta
[
sta
->
aid
-
1
],
0
,
...
...
@@ -90,7 +95,7 @@ static void ath6kl_sta_cleanup(struct ath6kl *ar, u8 i)
sta
->
sta_flags
=
0
;
ar
->
sta_list_index
=
ar
->
sta_list_index
&
~
(
1
<<
i
);
aggr_reset_state
(
sta
->
aggr_conn
);
}
static
u8
ath6kl_remove_sta
(
struct
ath6kl
*
ar
,
u8
*
mac
,
u16
reason
)
...
...
@@ -252,7 +257,7 @@ int ath6kl_read_fwlogs(struct ath6kl *ar)
struct
ath6kl_dbglog_hdr
debug_hdr
;
struct
ath6kl_dbglog_buf
debug_buf
;
u32
address
,
length
,
dropped
,
firstbuf
,
debug_hdr_addr
;
int
ret
=
0
,
loop
;
int
ret
,
loop
;
u8
*
buf
;
buf
=
kmalloc
(
ATH6KL_FWLOG_PAYLOAD_SIZE
,
GFP_KERNEL
);
...
...
@@ -347,9 +352,6 @@ void ath6kl_reset_device(struct ath6kl *ar, u32 target_type,
case
TARGET_TYPE_AR6004
:
address
=
AR6004_RESET_CONTROL_ADDRESS
;
break
;
default:
address
=
AR6003_RESET_CONTROL_ADDRESS
;
break
;
}
status
=
ath6kl_diag_write32
(
ar
,
address
,
data
);
...
...
@@ -363,7 +365,7 @@ static void ath6kl_install_static_wep_keys(struct ath6kl_vif *vif)
u8
index
;
u8
keyusage
;
for
(
index
=
WMI_MIN_KEY_INDEX
;
index
<=
WMI_MAX_KEY_INDEX
;
index
++
)
{
for
(
index
=
0
;
index
<=
WMI_MAX_KEY_INDEX
;
index
++
)
{
if
(
vif
->
wep_key_list
[
index
].
key_len
)
{
keyusage
=
GROUP_USAGE
;
if
(
index
==
vif
->
def_txkey_index
)
...
...
@@ -428,9 +430,8 @@ void ath6kl_connect_ap_mode_bss(struct ath6kl_vif *vif, u16 channel)
void
ath6kl_connect_ap_mode_sta
(
struct
ath6kl_vif
*
vif
,
u16
aid
,
u8
*
mac_addr
,
u8
keymgmt
,
u8
ucipher
,
u8
auth
,
u8
assoc_req_len
,
u8
*
assoc_info
)
u8
assoc_req_len
,
u8
*
assoc_info
,
u8
apsd_info
)
{
struct
ath6kl
*
ar
=
vif
->
ar
;
u8
*
ies
=
NULL
,
*
wpa_ie
=
NULL
,
*
pos
;
size_t
ies_len
=
0
;
struct
station_info
sinfo
;
...
...
@@ -484,9 +485,9 @@ void ath6kl_connect_ap_mode_sta(struct ath6kl_vif *vif, u16 aid, u8 *mac_addr,
pos
+=
2
+
pos
[
1
];
}
ath6kl_add_new_sta
(
ar
,
mac_addr
,
aid
,
wpa_ie
,
ath6kl_add_new_sta
(
vif
,
mac_addr
,
aid
,
wpa_ie
,
wpa_ie
?
2
+
wpa_ie
[
1
]
:
0
,
keymgmt
,
ucipher
,
auth
);
keymgmt
,
ucipher
,
auth
,
apsd_info
);
/* send event to application */
memset
(
&
sinfo
,
0
,
sizeof
(
sinfo
));
...
...
@@ -587,10 +588,11 @@ void ath6kl_connect_event(struct ath6kl_vif *vif, u16 channel, u8 *bssid,
memcpy
(
vif
->
bssid
,
bssid
,
sizeof
(
vif
->
bssid
));
vif
->
bss_ch
=
channel
;
if
((
vif
->
nw_type
==
INFRA_NETWORK
))
if
((
vif
->
nw_type
==
INFRA_NETWORK
))
{
ar
->
listen_intvl_b
=
listen_int
;
ath6kl_wmi_listeninterval_cmd
(
ar
->
wmi
,
vif
->
fw_vif_idx
,
ar
->
listen_intvl_t
,
ar
->
listen_intvl_b
);
0
,
ar
->
listen_intvl_b
);
}
netif_wake_queue
(
vif
->
ndev
);
...
...
@@ -601,7 +603,7 @@ void ath6kl_connect_event(struct ath6kl_vif *vif, u16 channel, u8 *bssid,
netif_carrier_on
(
vif
->
ndev
);
spin_unlock_bh
(
&
vif
->
if_lock
);
aggr_reset_state
(
vif
->
aggr_cntxt
);
aggr_reset_state
(
vif
->
aggr_cntxt
->
aggr_conn
);
vif
->
reconnect_flag
=
0
;
if
((
vif
->
nw_type
==
ADHOC_NETWORK
)
&&
ar
->
ibss_ps_enable
)
{
...
...
@@ -923,7 +925,7 @@ void ath6kl_disconnect_event(struct ath6kl_vif *vif, u8 reason, u8 *bssid,
assoc_resp_len
,
assoc_info
,
prot_reason_status
);
aggr_reset_state
(
vif
->
aggr_cntxt
);
aggr_reset_state
(
vif
->
aggr_cntxt
->
aggr_conn
);
del_timer
(
&
vif
->
disconnect_timer
);
...
...
@@ -1020,11 +1022,155 @@ static struct net_device_stats *ath6kl_get_stats(struct net_device *dev)
return
&
vif
->
net_stats
;
}
static
struct
net_device_ops
ath6kl_netdev_ops
=
{
static
int
ath6kl_set_features
(
struct
net_device
*
dev
,
netdev_features_t
features
)
{
struct
ath6kl_vif
*
vif
=
netdev_priv
(
dev
);
struct
ath6kl
*
ar
=
vif
->
ar
;
int
err
=
0
;
if
((
features
&
NETIF_F_RXCSUM
)
&&
(
ar
->
rx_meta_ver
!=
WMI_META_VERSION_2
))
{
ar
->
rx_meta_ver
=
WMI_META_VERSION_2
;
err
=
ath6kl_wmi_set_rx_frame_format_cmd
(
ar
->
wmi
,
vif
->
fw_vif_idx
,
ar
->
rx_meta_ver
,
0
,
0
);
if
(
err
)
{
dev
->
features
=
features
&
~
NETIF_F_RXCSUM
;
return
err
;
}
}
else
if
(
!
(
features
&
NETIF_F_RXCSUM
)
&&
(
ar
->
rx_meta_ver
==
WMI_META_VERSION_2
))
{
ar
->
rx_meta_ver
=
0
;
err
=
ath6kl_wmi_set_rx_frame_format_cmd
(
ar
->
wmi
,
vif
->
fw_vif_idx
,
ar
->
rx_meta_ver
,
0
,
0
);
if
(
err
)
{
dev
->
features
=
features
|
NETIF_F_RXCSUM
;
return
err
;
}
}
return
err
;
}
static
void
ath6kl_set_multicast_list
(
struct
net_device
*
ndev
)
{
struct
ath6kl_vif
*
vif
=
netdev_priv
(
ndev
);
bool
mc_all_on
=
false
,
mc_all_off
=
false
;
int
mc_count
=
netdev_mc_count
(
ndev
);
struct
netdev_hw_addr
*
ha
;
bool
found
;
struct
ath6kl_mc_filter
*
mc_filter
,
*
tmp
;
struct
list_head
mc_filter_new
;
int
ret
;
if
(
!
test_bit
(
WMI_READY
,
&
vif
->
ar
->
flag
)
||
!
test_bit
(
WLAN_ENABLED
,
&
vif
->
flags
))
return
;
mc_all_on
=
!!
(
ndev
->
flags
&
IFF_PROMISC
)
||
!!
(
ndev
->
flags
&
IFF_ALLMULTI
)
||
!!
(
mc_count
>
ATH6K_MAX_MC_FILTERS_PER_LIST
);
mc_all_off
=
!
(
ndev
->
flags
&
IFF_MULTICAST
)
||
mc_count
==
0
;
if
(
mc_all_on
||
mc_all_off
)
{
/* Enable/disable all multicast */
ath6kl_dbg
(
ATH6KL_DBG_TRC
,
"%s multicast filter
\n
"
,
mc_all_on
?
"enabling"
:
"disabling"
);
ret
=
ath6kl_wmi_mcast_filter_cmd
(
vif
->
ar
->
wmi
,
vif
->
fw_vif_idx
,
mc_all_on
);
if
(
ret
)
ath6kl_warn
(
"Failed to %s multicast receive
\n
"
,
mc_all_on
?
"enable"
:
"disable"
);
return
;
}
list_for_each_entry_safe
(
mc_filter
,
tmp
,
&
vif
->
mc_filter
,
list
)
{
found
=
false
;
netdev_for_each_mc_addr
(
ha
,
ndev
)
{
if
(
memcmp
(
ha
->
addr
,
mc_filter
->
hw_addr
,
ATH6KL_MCAST_FILTER_MAC_ADDR_SIZE
)
==
0
)
{
found
=
true
;
break
;
}
}
if
(
!
found
)
{
/*
* Delete the filter which was previously set
* but not in the new request.
*/
ath6kl_dbg
(
ATH6KL_DBG_TRC
,
"Removing %pM from multicast filter
\n
"
,
mc_filter
->
hw_addr
);
ret
=
ath6kl_wmi_add_del_mcast_filter_cmd
(
vif
->
ar
->
wmi
,
vif
->
fw_vif_idx
,
mc_filter
->
hw_addr
,
false
);
if
(
ret
)
{
ath6kl_warn
(
"Failed to remove multicast filter:%pM
\n
"
,
mc_filter
->
hw_addr
);
return
;
}
list_del
(
&
mc_filter
->
list
);
kfree
(
mc_filter
);
}
}
INIT_LIST_HEAD
(
&
mc_filter_new
);
netdev_for_each_mc_addr
(
ha
,
ndev
)
{
found
=
false
;
list_for_each_entry
(
mc_filter
,
&
vif
->
mc_filter
,
list
)
{
if
(
memcmp
(
ha
->
addr
,
mc_filter
->
hw_addr
,
ATH6KL_MCAST_FILTER_MAC_ADDR_SIZE
)
==
0
)
{
found
=
true
;
break
;
}
}
if
(
!
found
)
{
mc_filter
=
kzalloc
(
sizeof
(
struct
ath6kl_mc_filter
),
GFP_ATOMIC
);
if
(
!
mc_filter
)
{
WARN_ON
(
1
);
goto
out
;
}
memcpy
(
mc_filter
->
hw_addr
,
ha
->
addr
,
ATH6KL_MCAST_FILTER_MAC_ADDR_SIZE
);
/* Set the multicast filter */
ath6kl_dbg
(
ATH6KL_DBG_TRC
,
"Adding %pM to multicast filter list
\n
"
,
mc_filter
->
hw_addr
);
ret
=
ath6kl_wmi_add_del_mcast_filter_cmd
(
vif
->
ar
->
wmi
,
vif
->
fw_vif_idx
,
mc_filter
->
hw_addr
,
true
);
if
(
ret
)
{
ath6kl_warn
(
"Failed to add multicast filter :%pM
\n
"
,
mc_filter
->
hw_addr
);
kfree
(
mc_filter
);
goto
out
;
}
list_add_tail
(
&
mc_filter
->
list
,
&
mc_filter_new
);
}
}
out:
list_splice_tail
(
&
mc_filter_new
,
&
vif
->
mc_filter
);
}
static
const
struct
net_device_ops
ath6kl_netdev_ops
=
{
.
ndo_open
=
ath6kl_open
,
.
ndo_stop
=
ath6kl_close
,
.
ndo_start_xmit
=
ath6kl_data_tx
,
.
ndo_get_stats
=
ath6kl_get_stats
,
.
ndo_set_features
=
ath6kl_set_features
,
.
ndo_set_rx_mode
=
ath6kl_set_multicast_list
,
};
void
init_netdev
(
struct
net_device
*
dev
)
...
...
drivers/net/wireless/ath/ath6kl/sdio.c
View file @
b9d90578
...
...
@@ -49,11 +49,13 @@ struct ath6kl_sdio {
/* scatter request list head */
struct
list_head
scat_req
;
/* Avoids disabling irq while the interrupts being handled */
struct
mutex
mtx_irq
;
spinlock_t
scat_lock
;
bool
scatter_enabled
;
bool
is_disabled
;
atomic_t
irq_handling
;
const
struct
sdio_device_id
*
id
;
struct
work_struct
wr_async_work
;
struct
list_head
wr_asyncq
;
...
...
@@ -460,8 +462,7 @@ static void ath6kl_sdio_irq_handler(struct sdio_func *func)
ath6kl_dbg
(
ATH6KL_DBG_SDIO
,
"irq
\n
"
);
ar_sdio
=
sdio_get_drvdata
(
func
);
atomic_set
(
&
ar_sdio
->
irq_handling
,
1
);
mutex_lock
(
&
ar_sdio
->
mtx_irq
);
/*
* Release the host during interrups so we can pick it back up when
* we process commands.
...
...
@@ -470,7 +471,7 @@ static void ath6kl_sdio_irq_handler(struct sdio_func *func)
status
=
ath6kl_hif_intr_bh_handler
(
ar_sdio
->
ar
);
sdio_claim_host
(
ar_sdio
->
func
);
atomic_set
(
&
ar_sdio
->
irq_handling
,
0
);
mutex_unlock
(
&
ar_sdio
->
mtx_irq
);
WARN_ON
(
status
&&
status
!=
-
ECANCELED
);
}
...
...
@@ -578,17 +579,14 @@ static void ath6kl_sdio_irq_disable(struct ath6kl *ar)
sdio_claim_host
(
ar_sdio
->
func
);
/* Mask our function IRQ */
while
(
atomic_read
(
&
ar_sdio
->
irq_handling
))
{
sdio_release_host
(
ar_sdio
->
func
);
schedule_timeout
(
HZ
/
10
);
sdio_claim_host
(
ar_sdio
->
func
);
}
mutex_lock
(
&
ar_sdio
->
mtx_irq
);
ret
=
sdio_release_irq
(
ar_sdio
->
func
);
if
(
ret
)
ath6kl_err
(
"Failed to release sdio irq: %d
\n
"
,
ret
);
mutex_unlock
(
&
ar_sdio
->
mtx_irq
);
sdio_release_host
(
ar_sdio
->
func
);
}
...
...
@@ -772,7 +770,6 @@ static int ath6kl_sdio_config(struct ath6kl *ar)
if
(
ret
)
{
ath6kl_err
(
"Set sdio block size %d failed: %d)
\n
"
,
HIF_MBOX_BLOCK_SIZE
,
ret
);
sdio_release_host
(
func
);
goto
out
;
}
...
...
@@ -782,7 +779,7 @@ static int ath6kl_sdio_config(struct ath6kl *ar)
return
ret
;
}
static
int
ath6kl_s
dio_suspend
(
struct
ath6kl
*
ar
,
struct
cfg80211_wowlan
*
wow
)
static
int
ath6kl_s
et_sdio_pm_caps
(
struct
ath6kl
*
ar
)
{
struct
ath6kl_sdio
*
ar_sdio
=
ath6kl_sdio_priv
(
ar
);
struct
sdio_func
*
func
=
ar_sdio
->
func
;
...
...
@@ -793,60 +790,95 @@ static int ath6kl_sdio_suspend(struct ath6kl *ar, struct cfg80211_wowlan *wow)
ath6kl_dbg
(
ATH6KL_DBG_SUSPEND
,
"sdio suspend pm_caps 0x%x
\n
"
,
flags
);
if
(
!
(
flags
&
MMC_PM_KEEP_POWER
)
||
(
ar
->
conf_flags
&
ATH6KL_CONF_SUSPEND_CUTPOWER
))
{
/* as host doesn't support keep power we need to cut power */
return
ath6kl_cfg80211_suspend
(
ar
,
ATH6KL_CFG_SUSPEND_CUTPOWER
,
NULL
);
}
if
(
!
(
flags
&
MMC_PM_WAKE_SDIO_IRQ
)
||
!
(
flags
&
MMC_PM_KEEP_POWER
))
return
-
EINVAL
;
ret
=
sdio_set_host_pm_flags
(
func
,
MMC_PM_KEEP_POWER
);
if
(
ret
)
{
printk
(
KERN_ERR
"ath6kl: set sdio pm flags failed: %d
\n
"
,
ret
);
ath6kl_err
(
"set sdio keep pwr flag failed: %d
\n
"
,
ret
);
return
ret
;
}
if
(
!
(
flags
&
MMC_PM_WAKE_SDIO_IRQ
))
goto
deepsleep
;
/* sdio irq wakes up host */
ret
=
sdio_set_host_pm_flags
(
func
,
MMC_PM_WAKE_SDIO_IRQ
);
if
(
ret
)
ath6kl_err
(
"set sdio wake irq flag failed: %d
\n
"
,
ret
);
return
ret
;
}
static
int
ath6kl_sdio_suspend
(
struct
ath6kl
*
ar
,
struct
cfg80211_wowlan
*
wow
)
{
struct
ath6kl_sdio
*
ar_sdio
=
ath6kl_sdio_priv
(
ar
);
struct
sdio_func
*
func
=
ar_sdio
->
func
;
mmc_pm_flag_t
flags
;
int
ret
;
if
(
ar
->
state
==
ATH6KL_STATE_SCHED_SCAN
)
{
ath6kl_dbg
(
ATH6KL_DBG_SUSPEND
,
"sched scan is in progress
\n
"
);
ret
=
ath6kl_set_sdio_pm_caps
(
ar
);
if
(
ret
)
goto
cut_pwr
;
ret
=
ath6kl_cfg80211_suspend
(
ar
,
ATH6KL_CFG_SUSPEND_SCHED_SCAN
,
NULL
);
if
(
ret
)
{
ath6kl_warn
(
"Schedule scan suspend failed: %d"
,
ret
);
return
ret
;
}
if
(
ret
)
goto
cut_pwr
;
return
0
;
}
if
(
ar
->
suspend_mode
==
WLAN_POWER_STATE_WOW
||
(
!
ar
->
suspend_mode
&&
wow
))
{
ret
=
sdio_set_host_pm_flags
(
func
,
MMC_PM_WAKE_SDIO_IRQ
);
ret
=
ath6kl_set_sdio_pm_caps
(
ar
);
if
(
ret
)
ath6kl_warn
(
"set sdio wake irq flag failed: %d
\n
"
,
ret
)
;
goto
cut_pwr
;
return
ret
;
ret
=
ath6kl_cfg80211_suspend
(
ar
,
ATH6KL_CFG_SUSPEND_WOW
,
wow
);
if
(
ret
)
goto
cut_pwr
;
return
0
;
}
if
(
wow
)
{
if
(
ar
->
suspend_mode
==
WLAN_POWER_STATE_DEEP_SLEEP
||
!
ar
->
suspend_mode
)
{
flags
=
sdio_get_host_pm_caps
(
func
);
if
(
!
(
flags
&
MMC_PM_KEEP_POWER
))
goto
cut_pwr
;
ret
=
sdio_set_host_pm_flags
(
func
,
MMC_PM_KEEP_POWER
);
if
(
ret
)
goto
cut_pwr
;
/*
* The host sdio controller is capable of keep power and
* sdio irq wake up at this point. It's fine to continue
* wow suspend operation.
* Workaround to support Deep Sleep with MSM, set the host pm
* flag as MMC_PM_WAKE_SDIO_IRQ to allow SDCC deiver to disable
* the sdc2_clock and internally allows MSM to enter
* TCXO shutdown properly.
*/
ret
=
ath6kl_cfg80211_suspend
(
ar
,
ATH6KL_CFG_SUSPEND_WOW
,
wow
);
if
(
ret
)
return
ret
;
if
((
flags
&
MMC_PM_WAKE_SDIO_IRQ
))
{
ret
=
sdio_set_host_pm_flags
(
func
,
MMC_PM_WAKE_SDIO_IRQ
);
if
(
ret
)
goto
cut_pwr
;
}
ret
=
sdio_set_host_pm_flags
(
func
,
MMC_PM_WAKE_SDIO_IRQ
);
ret
=
ath6kl_cfg80211_suspend
(
ar
,
ATH6KL_CFG_SUSPEND_DEEPSLEEP
,
NULL
);
if
(
ret
)
ath6kl_err
(
"set sdio wake irq flag failed: %d
\n
"
,
ret
)
;
goto
cut_pwr
;
return
ret
;
return
0
;
}
deepsleep
:
return
ath6kl_cfg80211_suspend
(
ar
,
ATH6KL_CFG_SUSPEND_
DEEPSLEEP
,
NULL
);
cut_pwr
:
return
ath6kl_cfg80211_suspend
(
ar
,
ATH6KL_CFG_SUSPEND_
CUTPOWER
,
NULL
);
}
static
int
ath6kl_sdio_resume
(
struct
ath6kl
*
ar
)
...
...
@@ -1253,6 +1285,7 @@ static int ath6kl_sdio_probe(struct sdio_func *func,
spin_lock_init
(
&
ar_sdio
->
scat_lock
);
spin_lock_init
(
&
ar_sdio
->
wr_async_lock
);
mutex_init
(
&
ar_sdio
->
dma_buffer_mutex
);
mutex_init
(
&
ar_sdio
->
mtx_irq
);
INIT_LIST_HEAD
(
&
ar_sdio
->
scat_req
);
INIT_LIST_HEAD
(
&
ar_sdio
->
bus_req_freeq
);
...
...
@@ -1263,7 +1296,7 @@ static int ath6kl_sdio_probe(struct sdio_func *func,
for
(
count
=
0
;
count
<
BUS_REQUEST_MAX_NUM
;
count
++
)
ath6kl_sdio_free_bus_req
(
ar_sdio
,
&
ar_sdio
->
bus_req
[
count
]);
ar
=
ath6kl_core_
alloc
(
&
ar_sdio
->
func
->
dev
);
ar
=
ath6kl_core_
create
(
&
ar_sdio
->
func
->
dev
);
if
(
!
ar
)
{
ath6kl_err
(
"Failed to alloc ath6kl core
\n
"
);
ret
=
-
ENOMEM
;
...
...
@@ -1293,7 +1326,7 @@ static int ath6kl_sdio_probe(struct sdio_func *func,
return
ret
;
err_core_alloc:
ath6kl_core_
free
(
ar_sdio
->
ar
);
ath6kl_core_
destroy
(
ar_sdio
->
ar
);
err_dma:
kfree
(
ar_sdio
->
dma_buffer
);
err_hif:
...
...
@@ -1316,6 +1349,7 @@ static void ath6kl_sdio_remove(struct sdio_func *func)
cancel_work_sync
(
&
ar_sdio
->
wr_async_work
);
ath6kl_core_cleanup
(
ar_sdio
->
ar
);
ath6kl_core_destroy
(
ar_sdio
->
ar
);
kfree
(
ar_sdio
->
dma_buffer
);
kfree
(
ar_sdio
);
...
...
@@ -1332,7 +1366,7 @@ static const struct sdio_device_id ath6kl_sdio_devices[] = {
MODULE_DEVICE_TABLE
(
sdio
,
ath6kl_sdio_devices
);
static
struct
sdio_driver
ath6kl_sdio_driver
=
{
.
name
=
"ath6kl"
,
.
name
=
"ath6kl
_sdio
"
,
.
id_table
=
ath6kl_sdio_devices
,
.
probe
=
ath6kl_sdio_probe
,
.
remove
=
ath6kl_sdio_remove
,
...
...
@@ -1362,19 +1396,19 @@ MODULE_AUTHOR("Atheros Communications, Inc.");
MODULE_DESCRIPTION
(
"Driver support for Atheros AR600x SDIO devices"
);
MODULE_LICENSE
(
"Dual BSD/GPL"
);
MODULE_FIRMWARE
(
AR6003_HW_2_0_OTP_FILE
);
MODULE_FIRMWARE
(
AR6003_HW_2_0_FIRMWARE_FILE
);
MODULE_FIRMWARE
(
AR6003_HW_2_0_PATCH_FILE
);
MODULE_FIRMWARE
(
AR6003_HW_2_0_
FW_DIR
"/"
AR6003_HW_2_0_
OTP_FILE
);
MODULE_FIRMWARE
(
AR6003_HW_2_0_F
W_DIR
"/"
AR6003_HW_2_0_F
IRMWARE_FILE
);
MODULE_FIRMWARE
(
AR6003_HW_2_0_
FW_DIR
"/"
AR6003_HW_2_0_
PATCH_FILE
);
MODULE_FIRMWARE
(
AR6003_HW_2_0_BOARD_DATA_FILE
);
MODULE_FIRMWARE
(
AR6003_HW_2_0_DEFAULT_BOARD_DATA_FILE
);
MODULE_FIRMWARE
(
AR6003_HW_2_1_1_OTP_FILE
);
MODULE_FIRMWARE
(
AR6003_HW_2_1_1_FIRMWARE_FILE
);
MODULE_FIRMWARE
(
AR6003_HW_2_1_1_PATCH_FILE
);
MODULE_FIRMWARE
(
AR6003_HW_2_1_1_
FW_DIR
"/"
AR6003_HW_2_1_1_
OTP_FILE
);
MODULE_FIRMWARE
(
AR6003_HW_2_1_1_F
W_DIR
"/"
AR6003_HW_2_1_1_F
IRMWARE_FILE
);
MODULE_FIRMWARE
(
AR6003_HW_2_1_1_
FW_DIR
"/"
AR6003_HW_2_1_1_
PATCH_FILE
);
MODULE_FIRMWARE
(
AR6003_HW_2_1_1_BOARD_DATA_FILE
);
MODULE_FIRMWARE
(
AR6003_HW_2_1_1_DEFAULT_BOARD_DATA_FILE
);
MODULE_FIRMWARE
(
AR6004_HW_1_0_FIRMWARE_FILE
);
MODULE_FIRMWARE
(
AR6004_HW_1_0_F
W_DIR
"/"
AR6004_HW_1_0_F
IRMWARE_FILE
);
MODULE_FIRMWARE
(
AR6004_HW_1_0_BOARD_DATA_FILE
);
MODULE_FIRMWARE
(
AR6004_HW_1_0_DEFAULT_BOARD_DATA_FILE
);
MODULE_FIRMWARE
(
AR6004_HW_1_1_FIRMWARE_FILE
);
MODULE_FIRMWARE
(
AR6004_HW_1_1_F
W_DIR
"/"
AR6004_HW_1_1_F
IRMWARE_FILE
);
MODULE_FIRMWARE
(
AR6004_HW_1_1_BOARD_DATA_FILE
);
MODULE_FIRMWARE
(
AR6004_HW_1_1_DEFAULT_BOARD_DATA_FILE
);
drivers/net/wireless/ath/ath6kl/testmode.c
View file @
b9d90578
...
...
@@ -15,6 +15,7 @@
*/
#include "testmode.h"
#include "debug.h"
#include <net/netlink.h>
...
...
@@ -30,7 +31,7 @@ enum ath6kl_tm_attr {
enum
ath6kl_tm_cmd
{
ATH6KL_TM_CMD_TCMD
=
0
,
ATH6KL_TM_CMD_RX_REPORT
=
1
,
ATH6KL_TM_CMD_RX_REPORT
=
1
,
/* not used anymore */
};
#define ATH6KL_TM_DATA_MAX_LEN 5000
...
...
@@ -41,84 +42,33 @@ static const struct nla_policy ath6kl_tm_policy[ATH6KL_TM_ATTR_MAX + 1] = {
.
len
=
ATH6KL_TM_DATA_MAX_LEN
},
};
void
ath6kl_tm_rx_
report_
event
(
struct
ath6kl
*
ar
,
void
*
buf
,
size_t
buf_len
)
void
ath6kl_tm_rx_event
(
struct
ath6kl
*
ar
,
void
*
buf
,
size_t
buf_len
)
{
if
(
down_interruptible
(
&
ar
->
sem
))
return
;
kfree
(
ar
->
tm
.
rx_report
);
ar
->
tm
.
rx_report
=
kmemdup
(
buf
,
buf_len
,
GFP_KERNEL
);
ar
->
tm
.
rx_report_len
=
buf_len
;
up
(
&
ar
->
sem
);
wake_up
(
&
ar
->
event_wq
);
}
static
int
ath6kl_tm_rx_report
(
struct
ath6kl
*
ar
,
void
*
buf
,
size_t
buf_len
,
struct
sk_buff
*
skb
)
{
int
ret
=
0
;
long
left
;
if
(
down_interruptible
(
&
ar
->
sem
))
return
-
ERESTARTSYS
;
if
(
!
test_bit
(
WMI_READY
,
&
ar
->
flag
))
{
ret
=
-
EIO
;
goto
out
;
}
if
(
test_bit
(
DESTROY_IN_PROGRESS
,
&
ar
->
flag
))
{
ret
=
-
EBUSY
;
goto
out
;
}
if
(
ath6kl_wmi_test_cmd
(
ar
->
wmi
,
buf
,
buf_len
)
<
0
)
{
up
(
&
ar
->
sem
);
return
-
EIO
;
}
left
=
wait_event_interruptible_timeout
(
ar
->
event_wq
,
ar
->
tm
.
rx_report
!=
NULL
,
WMI_TIMEOUT
);
struct
sk_buff
*
skb
;
if
(
left
==
0
)
{
ret
=
-
ETIMEDOUT
;
goto
out
;
}
else
if
(
left
<
0
)
{
ret
=
left
;
goto
out
;
}
if
(
!
buf
||
buf_len
==
0
)
return
;
if
(
ar
->
tm
.
rx_report
==
NULL
||
ar
->
tm
.
rx_report_len
==
0
)
{
ret
=
-
EINVAL
;
goto
out
;
skb
=
cfg80211_testmode_alloc_event_skb
(
ar
->
wiphy
,
buf_len
,
GFP_KERNEL
);
if
(
!
skb
)
{
ath6kl_warn
(
"failed to allocate testmode rx skb!
\n
"
);
return
;
}
NLA_PUT
(
skb
,
ATH6KL_TM_ATTR_DATA
,
ar
->
tm
.
rx_report_len
,
ar
->
tm
.
rx_report
);
kfree
(
ar
->
tm
.
rx_report
);
ar
->
tm
.
rx_report
=
NULL
;
out:
up
(
&
ar
->
sem
);
return
ret
;
NLA_PUT_U32
(
skb
,
ATH6KL_TM_ATTR_CMD
,
ATH6KL_TM_CMD_TCMD
);
NLA_PUT
(
skb
,
ATH6KL_TM_ATTR_DATA
,
buf_len
,
buf
);
cfg80211_testmode_event
(
skb
,
GFP_KERNEL
);
return
;
nla_put_failure:
ret
=
-
ENOBUFS
;
goto
out
;
kfree_skb
(
skb
)
;
ath6kl_warn
(
"nla_put failed on testmode rx skb!
\n
"
)
;
}
int
ath6kl_tm_cmd
(
struct
wiphy
*
wiphy
,
void
*
data
,
int
len
)
{
struct
ath6kl
*
ar
=
wiphy_priv
(
wiphy
);
struct
nlattr
*
tb
[
ATH6KL_TM_ATTR_MAX
+
1
];
int
err
,
buf_len
,
reply_len
;
struct
sk_buff
*
skb
;
int
err
,
buf_len
;
void
*
buf
;
err
=
nla_parse
(
tb
,
ATH6KL_TM_ATTR_MAX
,
data
,
len
,
...
...
@@ -143,24 +93,6 @@ int ath6kl_tm_cmd(struct wiphy *wiphy, void *data, int len)
break
;
case
ATH6KL_TM_CMD_RX_REPORT
:
if
(
!
tb
[
ATH6KL_TM_ATTR_DATA
])
return
-
EINVAL
;
buf
=
nla_data
(
tb
[
ATH6KL_TM_ATTR_DATA
]);
buf_len
=
nla_len
(
tb
[
ATH6KL_TM_ATTR_DATA
]);
reply_len
=
nla_total_size
(
ATH6KL_TM_DATA_MAX_LEN
);
skb
=
cfg80211_testmode_alloc_reply_skb
(
wiphy
,
reply_len
);
if
(
!
skb
)
return
-
ENOMEM
;
err
=
ath6kl_tm_rx_report
(
ar
,
buf
,
buf_len
,
skb
);
if
(
err
<
0
)
{
kfree_skb
(
skb
);
return
err
;
}
return
cfg80211_testmode_reply
(
skb
);
default:
return
-
EOPNOTSUPP
;
}
...
...
drivers/net/wireless/ath/ath6kl/testmode.h
View file @
b9d90578
...
...
@@ -18,13 +18,13 @@
#ifdef CONFIG_NL80211_TESTMODE
void
ath6kl_tm_rx_
report_
event
(
struct
ath6kl
*
ar
,
void
*
buf
,
size_t
buf_len
);
void
ath6kl_tm_rx_event
(
struct
ath6kl
*
ar
,
void
*
buf
,
size_t
buf_len
);
int
ath6kl_tm_cmd
(
struct
wiphy
*
wiphy
,
void
*
data
,
int
len
);
#else
static
inline
void
ath6kl_tm_rx_
report_
event
(
struct
ath6kl
*
ar
,
void
*
buf
,
size_t
buf_len
)
static
inline
void
ath6kl_tm_rx_event
(
struct
ath6kl
*
ar
,
void
*
buf
,
size_t
buf_len
)
{
}
...
...
drivers/net/wireless/ath/ath6kl/txrx.c
View file @
b9d90578
This diff is collapsed.
Click to expand it.
drivers/net/wireless/ath/ath6kl/usb.c
0 → 100644
View file @
b9d90578
This diff is collapsed.
Click to expand it.
drivers/net/wireless/ath/ath6kl/wmi.c
View file @
b9d90578
...
...
@@ -180,7 +180,7 @@ static int ath6kl_wmi_meta_add(struct wmi *wmi, struct sk_buff *skb,
}
int
ath6kl_wmi_data_hdr_add
(
struct
wmi
*
wmi
,
struct
sk_buff
*
skb
,
u8
msg_type
,
bool
more_data
,
u8
msg_type
,
u32
flags
,
enum
wmi_data_hdr_data_type
data_type
,
u8
meta_ver
,
void
*
tx_meta_info
,
u8
if_idx
)
{
...
...
@@ -204,17 +204,19 @@ int ath6kl_wmi_data_hdr_add(struct wmi *wmi, struct sk_buff *skb,
data_hdr
->
info
=
msg_type
<<
WMI_DATA_HDR_MSG_TYPE_SHIFT
;
data_hdr
->
info
|=
data_type
<<
WMI_DATA_HDR_DATA_TYPE_SHIFT
;
if
(
more_data
)
data_hdr
->
info
|=
WMI_DATA_HDR_MORE_MASK
<<
WMI_DATA_HDR_MORE_SHIFT
;
if
(
flags
&
WMI_DATA_HDR_FLAGS_MORE
)
data_hdr
->
info
|=
WMI_DATA_HDR_MORE
;
data_hdr
->
info2
=
cpu_to_le16
(
meta_ver
<<
WMI_DATA_HDR_META_SHIFT
);
data_hdr
->
info3
=
cpu_to_le16
(
if_idx
&
WMI_DATA_HDR_IF_IDX_MASK
);
if
(
flags
&
WMI_DATA_HDR_FLAGS_EOSP
)
data_hdr
->
info3
|=
cpu_to_le16
(
WMI_DATA_HDR_EOSP
);
data_hdr
->
info2
|=
cpu_to_le16
(
meta_ver
<<
WMI_DATA_HDR_META_SHIFT
);
data_hdr
->
info3
|=
cpu_to_le16
(
if_idx
&
WMI_DATA_HDR_IF_IDX_MASK
);
return
0
;
}
static
u8
ath6kl_wmi_determine_user_priority
(
u8
*
pkt
,
u32
layer2_pri
)
u8
ath6kl_wmi_determine_user_priority
(
u8
*
pkt
,
u32
layer2_pri
)
{
struct
iphdr
*
ip_hdr
=
(
struct
iphdr
*
)
pkt
;
u8
ip_pri
;
...
...
@@ -236,6 +238,11 @@ static u8 ath6kl_wmi_determine_user_priority(u8 *pkt, u32 layer2_pri)
return
ip_pri
;
}
u8
ath6kl_wmi_get_traffic_class
(
u8
user_priority
)
{
return
up_to_ac
[
user_priority
&
0x7
];
}
int
ath6kl_wmi_implicit_create_pstream
(
struct
wmi
*
wmi
,
u8
if_idx
,
struct
sk_buff
*
skb
,
u32
layer2_priority
,
bool
wmm_enabled
,
...
...
@@ -419,9 +426,6 @@ static int ath6kl_wmi_tx_complete_event_rx(u8 *datap, int len)
ath6kl_dbg
(
ATH6KL_DBG_WMI
,
"comp: %d %d %d
\n
"
,
evt
->
num_msg
,
evt
->
msg_len
,
evt
->
msg_type
);
if
(
!
AR_DBG_LVL_CHECK
(
ATH6KL_DBG_WMI
))
return
0
;
for
(
index
=
0
;
index
<
evt
->
num_msg
;
index
++
)
{
size
=
sizeof
(
struct
wmi_tx_complete_event
)
+
(
index
*
sizeof
(
struct
tx_complete_msg_v1
));
...
...
@@ -786,12 +790,14 @@ static int ath6kl_wmi_connect_event_rx(struct wmi *wmi, u8 *datap, int len,
ev
->
u
.
ap_sta
.
keymgmt
,
le16_to_cpu
(
ev
->
u
.
ap_sta
.
cipher
),
ev
->
u
.
ap_sta
.
apsd_info
);
ath6kl_connect_ap_mode_sta
(
vif
,
ev
->
u
.
ap_sta
.
aid
,
ev
->
u
.
ap_sta
.
mac_addr
,
ev
->
u
.
ap_sta
.
keymgmt
,
le16_to_cpu
(
ev
->
u
.
ap_sta
.
cipher
),
ev
->
u
.
ap_sta
.
auth
,
ev
->
assoc_req_len
,
ev
->
assoc_info
+
ev
->
beacon_ie_len
);
ev
->
assoc_info
+
ev
->
beacon_ie_len
,
ev
->
u
.
ap_sta
.
apsd_info
);
}
return
0
;
}
...
...
@@ -1145,9 +1151,9 @@ static int ath6kl_wmi_bitrate_reply_rx(struct wmi *wmi, u8 *datap, int len)
return
0
;
}
static
int
ath6kl_wmi_t
cmd_test_repor
t_rx
(
struct
wmi
*
wmi
,
u8
*
datap
,
int
len
)
static
int
ath6kl_wmi_t
es
t_rx
(
struct
wmi
*
wmi
,
u8
*
datap
,
int
len
)
{
ath6kl_tm_rx_
report_
event
(
wmi
->
parent_dev
,
datap
,
len
);
ath6kl_tm_rx_event
(
wmi
->
parent_dev
,
datap
,
len
);
return
0
;
}
...
...
@@ -2479,15 +2485,16 @@ int ath6kl_wmi_delete_pstream_cmd(struct wmi *wmi, u8 if_idx, u8 traffic_class,
return
ret
;
}
int
ath6kl_wmi_set_ip_cmd
(
struct
wmi
*
wmi
,
struct
wmi_set_ip_cmd
*
ip_cmd
)
int
ath6kl_wmi_set_ip_cmd
(
struct
wmi
*
wmi
,
u8
if_idx
,
__be32
ips0
,
__be32
ips1
)
{
struct
sk_buff
*
skb
;
struct
wmi_set_ip_cmd
*
cmd
;
int
ret
;
/* Multicast address are not valid */
if
(
(
*
((
u8
*
)
&
ip_cmd
->
ips
[
0
])
>=
0xE
0
)
||
(
*
((
u8
*
)
&
ip_cmd
->
ips
[
1
])
>=
0xE0
))
if
(
ipv4_is_multicast
(
ips
0
)
||
ipv4_is_multicast
(
ips1
))
return
-
EINVAL
;
skb
=
ath6kl_wmi_get_new_buf
(
sizeof
(
struct
wmi_set_ip_cmd
));
...
...
@@ -2495,9 +2502,10 @@ int ath6kl_wmi_set_ip_cmd(struct wmi *wmi, struct wmi_set_ip_cmd *ip_cmd)
return
-
ENOMEM
;
cmd
=
(
struct
wmi_set_ip_cmd
*
)
skb
->
data
;
memcpy
(
cmd
,
ip_cmd
,
sizeof
(
struct
wmi_set_ip_cmd
));
cmd
->
ips
[
0
]
=
ips0
;
cmd
->
ips
[
1
]
=
ips1
;
ret
=
ath6kl_wmi_cmd_send
(
wmi
,
0
,
skb
,
WMI_SET_IP_CMDID
,
ret
=
ath6kl_wmi_cmd_send
(
wmi
,
if_idx
,
skb
,
WMI_SET_IP_CMDID
,
NO_SYNC_WMIFLAG
);
return
ret
;
}
...
...
@@ -2582,6 +2590,18 @@ int ath6kl_wmi_set_host_sleep_mode_cmd(struct wmi *wmi, u8 if_idx,
return
ret
;
}
/* This command has zero length payload */
static
int
ath6kl_wmi_host_sleep_mode_cmd_prcd_evt_rx
(
struct
wmi
*
wmi
,
struct
ath6kl_vif
*
vif
)
{
struct
ath6kl
*
ar
=
wmi
->
parent_dev
;
set_bit
(
HOST_SLEEP_MODE_CMD_PROCESSED
,
&
vif
->
flags
);
wake_up
(
&
ar
->
event_wq
);
return
0
;
}
int
ath6kl_wmi_set_wow_mode_cmd
(
struct
wmi
*
wmi
,
u8
if_idx
,
enum
ath6kl_wow_mode
wow_mode
,
u32
filter
,
u16
host_req_delay
)
...
...
@@ -2612,7 +2632,8 @@ int ath6kl_wmi_set_wow_mode_cmd(struct wmi *wmi, u8 if_idx,
int
ath6kl_wmi_add_wow_pattern_cmd
(
struct
wmi
*
wmi
,
u8
if_idx
,
u8
list_id
,
u8
filter_size
,
u8
filter_offset
,
u8
*
filter
,
u8
*
mask
)
u8
filter_offset
,
const
u8
*
filter
,
const
u8
*
mask
)
{
struct
sk_buff
*
skb
;
struct
wmi_add_wow_pattern_cmd
*
cmd
;
...
...
@@ -2853,6 +2874,51 @@ int ath6kl_wmi_test_cmd(struct wmi *wmi, void *buf, size_t len)
return
ret
;
}
int
ath6kl_wmi_mcast_filter_cmd
(
struct
wmi
*
wmi
,
u8
if_idx
,
bool
mc_all_on
)
{
struct
sk_buff
*
skb
;
struct
wmi_mcast_filter_cmd
*
cmd
;
int
ret
;
skb
=
ath6kl_wmi_get_new_buf
(
sizeof
(
*
cmd
));
if
(
!
skb
)
return
-
ENOMEM
;
cmd
=
(
struct
wmi_mcast_filter_cmd
*
)
skb
->
data
;
cmd
->
mcast_all_enable
=
mc_all_on
;
ret
=
ath6kl_wmi_cmd_send
(
wmi
,
if_idx
,
skb
,
WMI_MCAST_FILTER_CMDID
,
NO_SYNC_WMIFLAG
);
return
ret
;
}
int
ath6kl_wmi_add_del_mcast_filter_cmd
(
struct
wmi
*
wmi
,
u8
if_idx
,
u8
*
filter
,
bool
add_filter
)
{
struct
sk_buff
*
skb
;
struct
wmi_mcast_filter_add_del_cmd
*
cmd
;
int
ret
;
if
((
filter
[
0
]
!=
0x33
||
filter
[
1
]
!=
0x33
)
&&
(
filter
[
0
]
!=
0x01
||
filter
[
1
]
!=
0x00
||
filter
[
2
]
!=
0x5e
||
filter
[
3
]
>
0x7f
))
{
ath6kl_warn
(
"invalid multicast filter address
\n
"
);
return
-
EINVAL
;
}
skb
=
ath6kl_wmi_get_new_buf
(
sizeof
(
*
cmd
));
if
(
!
skb
)
return
-
ENOMEM
;
cmd
=
(
struct
wmi_mcast_filter_add_del_cmd
*
)
skb
->
data
;
memcpy
(
cmd
->
mcast_mac
,
filter
,
ATH6KL_MCAST_FILTER_MAC_ADDR_SIZE
);
ret
=
ath6kl_wmi_cmd_send
(
wmi
,
if_idx
,
skb
,
add_filter
?
WMI_SET_MCAST_FILTER_CMDID
:
WMI_DEL_MCAST_FILTER_CMDID
,
NO_SYNC_WMIFLAG
);
return
ret
;
}
s32
ath6kl_wmi_get_rate
(
s8
rate_index
)
{
...
...
@@ -2946,6 +3012,43 @@ int ath6kl_wmi_ap_set_mlme(struct wmi *wmip, u8 if_idx, u8 cmd, const u8 *mac,
NO_SYNC_WMIFLAG
);
}
/* This command will be used to enable/disable AP uAPSD feature */
int
ath6kl_wmi_ap_set_apsd
(
struct
wmi
*
wmi
,
u8
if_idx
,
u8
enable
)
{
struct
wmi_ap_set_apsd_cmd
*
cmd
;
struct
sk_buff
*
skb
;
skb
=
ath6kl_wmi_get_new_buf
(
sizeof
(
*
cmd
));
if
(
!
skb
)
return
-
ENOMEM
;
cmd
=
(
struct
wmi_ap_set_apsd_cmd
*
)
skb
->
data
;
cmd
->
enable
=
enable
;
return
ath6kl_wmi_cmd_send
(
wmi
,
if_idx
,
skb
,
WMI_AP_SET_APSD_CMDID
,
NO_SYNC_WMIFLAG
);
}
int
ath6kl_wmi_set_apsd_bfrd_traf
(
struct
wmi
*
wmi
,
u8
if_idx
,
u16
aid
,
u16
bitmap
,
u32
flags
)
{
struct
wmi_ap_apsd_buffered_traffic_cmd
*
cmd
;
struct
sk_buff
*
skb
;
skb
=
ath6kl_wmi_get_new_buf
(
sizeof
(
*
cmd
));
if
(
!
skb
)
return
-
ENOMEM
;
cmd
=
(
struct
wmi_ap_apsd_buffered_traffic_cmd
*
)
skb
->
data
;
cmd
->
aid
=
cpu_to_le16
(
aid
);
cmd
->
bitmap
=
cpu_to_le16
(
bitmap
);
cmd
->
flags
=
cpu_to_le32
(
flags
);
return
ath6kl_wmi_cmd_send
(
wmi
,
if_idx
,
skb
,
WMI_AP_APSD_BUFFERED_TRAFFIC_CMDID
,
NO_SYNC_WMIFLAG
);
}
static
int
ath6kl_wmi_pspoll_event_rx
(
struct
wmi
*
wmi
,
u8
*
datap
,
int
len
,
struct
ath6kl_vif
*
vif
)
{
...
...
@@ -3400,7 +3503,7 @@ int ath6kl_wmi_control_rx(struct wmi *wmi, struct sk_buff *skb)
break
;
case
WMI_TEST_EVENTID
:
ath6kl_dbg
(
ATH6KL_DBG_WMI
,
"WMI_TEST_EVENTID
\n
"
);
ret
=
ath6kl_wmi_t
cmd_test_repor
t_rx
(
wmi
,
datap
,
len
);
ret
=
ath6kl_wmi_t
es
t_rx
(
wmi
,
datap
,
len
);
break
;
case
WMI_GET_FIXRATES_CMDID
:
ath6kl_dbg
(
ATH6KL_DBG_WMI
,
"WMI_GET_FIXRATES_CMDID
\n
"
);
...
...
@@ -3465,6 +3568,11 @@ int ath6kl_wmi_control_rx(struct wmi *wmi, struct sk_buff *skb)
ath6kl_dbg
(
ATH6KL_DBG_WMI
,
"WMI_TX_COMPLETE_EVENTID
\n
"
);
ret
=
ath6kl_wmi_tx_complete_event_rx
(
datap
,
len
);
break
;
case
WMI_SET_HOST_SLEEP_MODE_CMD_PROCESSED_EVENTID
:
ath6kl_dbg
(
ATH6KL_DBG_WMI
,
"WMI_SET_HOST_SLEEP_MODE_CMD_PROCESSED_EVENTID"
);
ret
=
ath6kl_wmi_host_sleep_mode_cmd_prcd_evt_rx
(
wmi
,
vif
);
break
;
case
WMI_REMAIN_ON_CHNL_EVENTID
:
ath6kl_dbg
(
ATH6KL_DBG_WMI
,
"WMI_REMAIN_ON_CHNL_EVENTID
\n
"
);
ret
=
ath6kl_wmi_remain_on_chnl_event_rx
(
wmi
,
datap
,
len
,
vif
);
...
...
drivers/net/wireless/ath/ath6kl/wmi.h
View file @
b9d90578
...
...
@@ -149,8 +149,7 @@ enum wmi_msg_type {
#define WMI_DATA_HDR_PS_MASK 0x1
#define WMI_DATA_HDR_PS_SHIFT 5
#define WMI_DATA_HDR_MORE_MASK 0x1
#define WMI_DATA_HDR_MORE_SHIFT 5
#define WMI_DATA_HDR_MORE 0x20
enum
wmi_data_hdr_data_type
{
WMI_DATA_HDR_DATA_TYPE_802_3
=
0
,
...
...
@@ -160,6 +159,13 @@ enum wmi_data_hdr_data_type {
WMI_DATA_HDR_DATA_TYPE_ACL
,
};
/* Bitmap of data header flags */
enum
wmi_data_hdr_flags
{
WMI_DATA_HDR_FLAGS_MORE
=
0x1
,
WMI_DATA_HDR_FLAGS_EOSP
=
0x2
,
WMI_DATA_HDR_FLAGS_UAPSD
=
0x4
,
};
#define WMI_DATA_HDR_DATA_TYPE_MASK 0x3
#define WMI_DATA_HDR_DATA_TYPE_SHIFT 6
...
...
@@ -173,8 +179,12 @@ enum wmi_data_hdr_data_type {
#define WMI_DATA_HDR_META_MASK 0x7
#define WMI_DATA_HDR_META_SHIFT 13
/* Macros for operating on WMI_DATA_HDR (info3) field */
#define WMI_DATA_HDR_IF_IDX_MASK 0xF
#define WMI_DATA_HDR_TRIG 0x10
#define WMI_DATA_HDR_EOSP 0x10
struct
wmi_data_hdr
{
s8
rssi
;
...
...
@@ -203,7 +213,8 @@ struct wmi_data_hdr {
/*
* usage of info3, 16-bit:
* b3:b0 - Interface index
* b15:b4 - Reserved
* b4 - uAPSD trigger in rx & EOSP in tx
* b15:b5 - Reserved
*/
__le16
info3
;
}
__packed
;
...
...
@@ -257,6 +268,9 @@ static inline u8 wmi_data_hdr_get_if_idx(struct wmi_data_hdr *dhdr)
#define WMI_META_VERSION_1 0x01
#define WMI_META_VERSION_2 0x02
/* Flag to signal to FW to calculate TCP checksum */
#define WMI_META_V2_FLAG_CSUM_OFFLOAD 0x01
struct
wmi_tx_meta_v1
{
/* packet ID to identify the tx request */
u8
pkt_id
;
...
...
@@ -646,7 +660,6 @@ enum auth_mode {
WPA2_AUTH_CCKM
=
0x40
,
};
#define WMI_MIN_KEY_INDEX 0
#define WMI_MAX_KEY_INDEX 3
#define WMI_MAX_KEY_LEN 32
...
...
@@ -1237,6 +1250,15 @@ enum target_event_report_config {
NO_DISCONN_EVT_IN_RECONN
};
struct
wmi_mcast_filter_cmd
{
u8
mcast_all_enable
;
}
__packed
;
#define ATH6KL_MCAST_FILTER_MAC_ADDR_SIZE 6
struct
wmi_mcast_filter_add_del_cmd
{
u8
mcast_mac
[
ATH6KL_MCAST_FILTER_MAC_ADDR_SIZE
];
}
__packed
;
/* Command Replies */
/* WMI_GET_CHANNEL_LIST_CMDID reply */
...
...
@@ -1335,6 +1357,8 @@ enum wmi_event_id {
WMI_P2P_START_SDPD_EVENTID
,
WMI_P2P_SDPD_RX_EVENTID
,
WMI_SET_HOST_SLEEP_MODE_CMD_PROCESSED_EVENTID
=
0x1047
,
WMI_THIN_RESERVED_START_EVENTID
=
0x8000
,
/* Events in this range are reserved for thinmode */
WMI_THIN_RESERVED_END_EVENTID
=
0x8fff
,
...
...
@@ -1903,7 +1927,7 @@ struct wow_filter {
struct
wmi_set_ip_cmd
{
/* IP in network byte order */
__
l
e32
ips
[
MAX_IP_ADDRS
];
__
b
e32
ips
[
MAX_IP_ADDRS
];
}
__packed
;
enum
ath6kl_wow_filters
{
...
...
@@ -2105,6 +2129,19 @@ struct wmi_rx_frame_format_cmd {
}
__packed
;
/* AP mode events */
struct
wmi_ap_set_apsd_cmd
{
u8
enable
;
}
__packed
;
enum
wmi_ap_apsd_buffered_traffic_flags
{
WMI_AP_APSD_NO_DELIVERY_FRAMES
=
0x1
,
};
struct
wmi_ap_apsd_buffered_traffic_cmd
{
__le16
aid
;
__le16
bitmap
;
__le32
flags
;
}
__packed
;
/* WMI_PS_POLL_EVENT */
struct
wmi_pspoll_event
{
...
...
@@ -2321,7 +2358,7 @@ enum htc_endpoint_id ath6kl_wmi_get_control_ep(struct wmi *wmi);
void
ath6kl_wmi_set_control_ep
(
struct
wmi
*
wmi
,
enum
htc_endpoint_id
ep_id
);
int
ath6kl_wmi_dix_2_dot3
(
struct
wmi
*
wmi
,
struct
sk_buff
*
skb
);
int
ath6kl_wmi_data_hdr_add
(
struct
wmi
*
wmi
,
struct
sk_buff
*
skb
,
u8
msg_type
,
bool
more_data
,
u8
msg_type
,
u32
flags
,
enum
wmi_data_hdr_data_type
data_type
,
u8
meta_ver
,
void
*
tx_meta_info
,
u8
if_idx
);
...
...
@@ -2417,7 +2454,8 @@ int ath6kl_wmi_test_cmd(struct wmi *wmi, void *buf, size_t len);
s32
ath6kl_wmi_get_rate
(
s8
rate_index
);
int
ath6kl_wmi_set_ip_cmd
(
struct
wmi
*
wmi
,
struct
wmi_set_ip_cmd
*
ip_cmd
);
int
ath6kl_wmi_set_ip_cmd
(
struct
wmi
*
wmi
,
u8
if_idx
,
__be32
ips0
,
__be32
ips1
);
int
ath6kl_wmi_set_host_sleep_mode_cmd
(
struct
wmi
*
wmi
,
u8
if_idx
,
enum
ath6kl_host_mode
host_mode
);
int
ath6kl_wmi_set_wow_mode_cmd
(
struct
wmi
*
wmi
,
u8
if_idx
,
...
...
@@ -2425,13 +2463,26 @@ int ath6kl_wmi_set_wow_mode_cmd(struct wmi *wmi, u8 if_idx,
u32
filter
,
u16
host_req_delay
);
int
ath6kl_wmi_add_wow_pattern_cmd
(
struct
wmi
*
wmi
,
u8
if_idx
,
u8
list_id
,
u8
filter_size
,
u8
filter_offset
,
u8
*
filter
,
u8
*
mask
);
u8
filter_offset
,
const
u8
*
filter
,
const
u8
*
mask
);
int
ath6kl_wmi_del_wow_pattern_cmd
(
struct
wmi
*
wmi
,
u8
if_idx
,
u16
list_id
,
u16
filter_id
);
int
ath6kl_wmi_set_roam_lrssi_cmd
(
struct
wmi
*
wmi
,
u8
lrssi
);
int
ath6kl_wmi_force_roam_cmd
(
struct
wmi
*
wmi
,
const
u8
*
bssid
);
int
ath6kl_wmi_set_roam_mode_cmd
(
struct
wmi
*
wmi
,
enum
wmi_roam_mode
mode
);
int
ath6kl_wmi_mcast_filter_cmd
(
struct
wmi
*
wmi
,
u8
if_idx
,
bool
mc_all_on
);
int
ath6kl_wmi_add_del_mcast_filter_cmd
(
struct
wmi
*
wmi
,
u8
if_idx
,
u8
*
filter
,
bool
add_filter
);
/* AP mode uAPSD */
int
ath6kl_wmi_ap_set_apsd
(
struct
wmi
*
wmi
,
u8
if_idx
,
u8
enable
);
int
ath6kl_wmi_set_apsd_bfrd_traf
(
struct
wmi
*
wmi
,
u8
if_idx
,
u16
aid
,
u16
bitmap
,
u32
flags
);
u8
ath6kl_wmi_get_traffic_class
(
u8
user_priority
);
u8
ath6kl_wmi_determine_user_priority
(
u8
*
pkt
,
u32
layer2_pri
);
/* AP mode */
int
ath6kl_wmi_ap_profile_commit
(
struct
wmi
*
wmip
,
u8
if_idx
,
struct
wmi_connect_cmd
*
p
);
...
...
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