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
9e97d14b
Commit
9e97d14b
authored
Feb 15, 2013
by
John W. Linville
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'for-linville' of
git://github.com/kvalo/ath6kl
parents
ded652a6
6f7c1adb
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
119 additions
and
96 deletions
+119
-96
drivers/net/wireless/ath/ath6kl/cfg80211.c
drivers/net/wireless/ath/ath6kl/cfg80211.c
+69
-40
drivers/net/wireless/ath/ath6kl/cfg80211.h
drivers/net/wireless/ath/ath6kl/cfg80211.h
+0
-2
drivers/net/wireless/ath/ath6kl/core.h
drivers/net/wireless/ath/ath6kl/core.h
+1
-1
drivers/net/wireless/ath/ath6kl/htc_pipe.c
drivers/net/wireless/ath/ath6kl/htc_pipe.c
+20
-6
drivers/net/wireless/ath/ath6kl/init.c
drivers/net/wireless/ath/ath6kl/init.c
+1
-35
drivers/net/wireless/ath/ath6kl/usb.c
drivers/net/wireless/ath/ath6kl/usb.c
+2
-4
drivers/net/wireless/ath/ath6kl/wmi.c
drivers/net/wireless/ath/ath6kl/wmi.c
+20
-8
drivers/net/wireless/ath/ath6kl/wmi.h
drivers/net/wireless/ath/ath6kl/wmi.h
+6
-0
No files found.
drivers/net/wireless/ath/ath6kl/cfg80211.c
View file @
9e97d14b
...
...
@@ -427,6 +427,30 @@ static bool ath6kl_is_tx_pending(struct ath6kl *ar)
return
ar
->
tx_pending
[
ath6kl_wmi_get_control_ep
(
ar
->
wmi
)]
==
0
;
}
static
void
ath6kl_cfg80211_sta_bmiss_enhance
(
struct
ath6kl_vif
*
vif
,
bool
enable
)
{
int
err
;
if
(
WARN_ON
(
!
test_bit
(
WMI_READY
,
&
vif
->
ar
->
flag
)))
return
;
if
(
vif
->
nw_type
!=
INFRA_NETWORK
)
return
;
if
(
!
test_bit
(
ATH6KL_FW_CAPABILITY_BMISS_ENHANCE
,
vif
->
ar
->
fw_capabilities
))
return
;
ath6kl_dbg
(
ATH6KL_DBG_WLAN_CFG
,
"%s fw bmiss enhance
\n
"
,
enable
?
"enable"
:
"disable"
);
err
=
ath6kl_wmi_sta_bmiss_enhance_cmd
(
vif
->
ar
->
wmi
,
vif
->
fw_vif_idx
,
enable
);
if
(
err
)
ath6kl_err
(
"failed to %s enhanced bmiss detection: %d
\n
"
,
enable
?
"enable"
:
"disable"
,
err
);
}
static
int
ath6kl_cfg80211_connect
(
struct
wiphy
*
wiphy
,
struct
net_device
*
dev
,
struct
cfg80211_connect_params
*
sme
)
...
...
@@ -616,13 +640,13 @@ static int ath6kl_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev,
vif
->
req_bssid
,
vif
->
ch_hint
,
ar
->
connect_ctrl_flags
,
nw_subtype
);
/* disable background scan if period is 0 */
if
(
sme
->
bg_scan_period
==
0
)
if
(
sme
->
bg_scan_period
==
0
)
{
/* disable background scan if period is 0 */
sme
->
bg_scan_period
=
0xffff
;
/* configure default value if not specified */
if
(
sme
->
bg_scan_period
==
-
1
)
}
else
if
(
sme
->
bg_scan_period
==
-
1
)
{
/* configure default value if not specified */
sme
->
bg_scan_period
=
DEFAULT_BG_SCAN_PERIOD
;
}
ath6kl_wmi_scanparams_cmd
(
ar
->
wmi
,
vif
->
fw_vif_idx
,
0
,
0
,
sme
->
bg_scan_period
,
0
,
0
,
0
,
3
,
0
,
0
,
0
);
...
...
@@ -1454,10 +1478,10 @@ static int ath6kl_cfg80211_set_power_mgmt(struct wiphy *wiphy,
return
-
EIO
;
if
(
pmgmt
)
{
ath6kl_dbg
(
ATH6KL_DBG_WLAN_CFG
,
"%s:
max perf
\n
"
,
__func__
);
ath6kl_dbg
(
ATH6KL_DBG_WLAN_CFG
,
"%s:
rec power
\n
"
,
__func__
);
mode
.
pwr_mode
=
REC_POWER
;
}
else
{
ath6kl_dbg
(
ATH6KL_DBG_WLAN_CFG
,
"%s:
rec power
\n
"
,
__func__
);
ath6kl_dbg
(
ATH6KL_DBG_WLAN_CFG
,
"%s:
max perf
\n
"
,
__func__
);
mode
.
pwr_mode
=
MAX_PERF_POWER
;
}
...
...
@@ -1509,7 +1533,7 @@ static int ath6kl_cfg80211_del_iface(struct wiphy *wiphy,
list_del
(
&
vif
->
list
);
spin_unlock_bh
(
&
ar
->
list_lock
);
ath6kl_c
leanup_vif
(
vif
,
test_bit
(
WMI_READY
,
&
ar
->
flag
));
ath6kl_c
fg80211_vif_stop
(
vif
,
test_bit
(
WMI_READY
,
&
ar
->
flag
));
ath6kl_cfg80211_vif_cleanup
(
vif
);
...
...
@@ -1559,17 +1583,13 @@ static int ath6kl_cfg80211_change_iface(struct wiphy *wiphy,
set_iface_type:
switch
(
type
)
{
case
NL80211_IFTYPE_STATION
:
case
NL80211_IFTYPE_P2P_CLIENT
:
vif
->
next_mode
=
INFRA_NETWORK
;
break
;
case
NL80211_IFTYPE_ADHOC
:
vif
->
next_mode
=
ADHOC_NETWORK
;
break
;
case
NL80211_IFTYPE_AP
:
vif
->
next_mode
=
AP_NETWORK
;
break
;
case
NL80211_IFTYPE_P2P_CLIENT
:
vif
->
next_mode
=
INFRA_NETWORK
;
break
;
case
NL80211_IFTYPE_P2P_GO
:
vif
->
next_mode
=
AP_NETWORK
;
break
;
...
...
@@ -2673,30 +2693,6 @@ static int ath6kl_set_ies(struct ath6kl_vif *vif,
return
0
;
}
void
ath6kl_cfg80211_sta_bmiss_enhance
(
struct
ath6kl_vif
*
vif
,
bool
enable
)
{
int
err
;
if
(
WARN_ON
(
!
test_bit
(
WMI_READY
,
&
vif
->
ar
->
flag
)))
return
;
if
(
vif
->
nw_type
!=
INFRA_NETWORK
)
return
;
if
(
!
test_bit
(
ATH6KL_FW_CAPABILITY_BMISS_ENHANCE
,
vif
->
ar
->
fw_capabilities
))
return
;
ath6kl_dbg
(
ATH6KL_DBG_WLAN_CFG
,
"%s fw bmiss enhance
\n
"
,
enable
?
"enable"
:
"disable"
);
err
=
ath6kl_wmi_sta_bmiss_enhance_cmd
(
vif
->
ar
->
wmi
,
vif
->
fw_vif_idx
,
enable
);
if
(
err
)
ath6kl_err
(
"failed to %s enhanced bmiss detection: %d
\n
"
,
enable
?
"enable"
:
"disable"
,
err
);
}
static
int
ath6kl_get_rsn_capab
(
struct
cfg80211_beacon_data
*
beacon
,
u8
*
rsn_capab
)
{
...
...
@@ -2776,9 +2772,11 @@ static int ath6kl_start_ap(struct wiphy *wiphy, struct net_device *dev,
ar
->
ap_mode_bkey
.
valid
=
false
;
/* TODO:
* info->interval
*/
ret
=
ath6kl_wmi_ap_set_beacon_intvl_cmd
(
ar
->
wmi
,
vif
->
fw_vif_idx
,
info
->
beacon_interval
);
if
(
ret
)
ath6kl_warn
(
"Failed to set beacon interval: %d
\n
"
,
ret
);
ret
=
ath6kl_wmi_ap_set_dtim_cmd
(
ar
->
wmi
,
vif
->
fw_vif_idx
,
info
->
dtim_period
);
...
...
@@ -3557,6 +3555,37 @@ static int ath6kl_cfg80211_vif_init(struct ath6kl_vif *vif)
return
0
;
}
void
ath6kl_cfg80211_vif_stop
(
struct
ath6kl_vif
*
vif
,
bool
wmi_ready
)
{
static
u8
bcast_mac
[]
=
{
0xff
,
0xff
,
0xff
,
0xff
,
0xff
,
0xff
};
bool
discon_issued
;
netif_stop_queue
(
vif
->
ndev
);
clear_bit
(
WLAN_ENABLED
,
&
vif
->
flags
);
if
(
wmi_ready
)
{
discon_issued
=
test_bit
(
CONNECTED
,
&
vif
->
flags
)
||
test_bit
(
CONNECT_PEND
,
&
vif
->
flags
);
ath6kl_disconnect
(
vif
);
del_timer
(
&
vif
->
disconnect_timer
);
if
(
discon_issued
)
ath6kl_disconnect_event
(
vif
,
DISCONNECT_CMD
,
(
vif
->
nw_type
&
AP_NETWORK
)
?
bcast_mac
:
vif
->
bssid
,
0
,
NULL
,
0
);
}
if
(
vif
->
scan_req
)
{
cfg80211_scan_done
(
vif
->
scan_req
,
true
);
vif
->
scan_req
=
NULL
;
}
/* need to clean up enhanced bmiss detection fw state */
ath6kl_cfg80211_sta_bmiss_enhance
(
vif
,
false
);
}
void
ath6kl_cfg80211_vif_cleanup
(
struct
ath6kl_vif
*
vif
)
{
struct
ath6kl
*
ar
=
vif
->
ar
;
...
...
drivers/net/wireless/ath/ath6kl/cfg80211.h
View file @
9e97d14b
...
...
@@ -61,7 +61,5 @@ void ath6kl_cfg80211_cleanup(struct ath6kl *ar);
struct
ath6kl
*
ath6kl_cfg80211_create
(
void
);
void
ath6kl_cfg80211_destroy
(
struct
ath6kl
*
ar
);
/* TODO: remove this once ath6kl_vif_cleanup() is moved to cfg80211.c */
void
ath6kl_cfg80211_sta_bmiss_enhance
(
struct
ath6kl_vif
*
vif
,
bool
enable
);
#endif
/* ATH6KL_CFG80211_H */
drivers/net/wireless/ath/ath6kl/core.h
View file @
9e97d14b
...
...
@@ -940,7 +940,7 @@ 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
);
struct
ath6kl_vif
*
ath6kl_vif_first
(
struct
ath6kl
*
ar
);
void
ath6kl_c
leanup_vif
(
struct
ath6kl_vif
*
vif
,
bool
wmi_ready
);
void
ath6kl_c
fg80211_vif_stop
(
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
);
...
...
drivers/net/wireless/ath/ath6kl/htc_pipe.c
View file @
9e97d14b
...
...
@@ -509,9 +509,7 @@ static void destroy_htc_txctrl_packet(struct htc_packet *packet)
{
struct
sk_buff
*
skb
;
skb
=
packet
->
skb
;
if
(
skb
!=
NULL
)
dev_kfree_skb
(
skb
);
dev_kfree_skb
(
skb
);
kfree
(
packet
);
}
...
...
@@ -969,6 +967,22 @@ static int ath6kl_htc_pipe_rx_complete(struct ath6kl *ar, struct sk_buff *skb,
u16
payload_len
;
int
status
=
0
;
/*
* ar->htc_target can be NULL due to a race condition that can occur
* during driver initialization(we do 'ath6kl_hif_power_on' before
* initializing 'ar->htc_target' via 'ath6kl_htc_create').
* 'ath6kl_hif_power_on' assigns 'ath6kl_recv_complete' as
* usb_complete_t/callback function for 'usb_fill_bulk_urb'.
* Thus the possibility of ar->htc_target being NULL
* via ath6kl_recv_complete -> ath6kl_usb_io_comp_work.
*/
if
(
WARN_ON_ONCE
(
!
target
))
{
ath6kl_err
(
"Target not yet initialized
\n
"
);
status
=
-
EINVAL
;
goto
free_skb
;
}
netdata
=
skb
->
data
;
netlen
=
skb
->
len
;
...
...
@@ -1054,6 +1068,7 @@ static int ath6kl_htc_pipe_rx_complete(struct ath6kl *ar, struct sk_buff *skb,
dev_kfree_skb
(
skb
);
skb
=
NULL
;
goto
free_skb
;
}
...
...
@@ -1089,8 +1104,7 @@ static int ath6kl_htc_pipe_rx_complete(struct ath6kl *ar, struct sk_buff *skb,
skb
=
NULL
;
free_skb:
if
(
skb
!=
NULL
)
dev_kfree_skb
(
skb
);
dev_kfree_skb
(
skb
);
return
status
;
...
...
@@ -1184,7 +1198,7 @@ static void reset_endpoint_states(struct htc_target *target)
INIT_LIST_HEAD
(
&
ep
->
pipe
.
tx_lookup_queue
);
INIT_LIST_HEAD
(
&
ep
->
rx_bufq
);
ep
->
target
=
target
;
ep
->
pipe
.
tx_credit_flow_enabled
=
(
bool
)
1
;
/* FIXME */
ep
->
pipe
.
tx_credit_flow_enabled
=
true
;
}
}
...
...
drivers/net/wireless/ath/ath6kl/init.c
View file @
9e97d14b
...
...
@@ -1715,38 +1715,6 @@ void ath6kl_init_hw_restart(struct ath6kl *ar)
}
}
/* FIXME: move this to cfg80211.c and rename to ath6kl_cfg80211_vif_stop() */
void
ath6kl_cleanup_vif
(
struct
ath6kl_vif
*
vif
,
bool
wmi_ready
)
{
static
u8
bcast_mac
[]
=
{
0xff
,
0xff
,
0xff
,
0xff
,
0xff
,
0xff
};
bool
discon_issued
;
netif_stop_queue
(
vif
->
ndev
);
clear_bit
(
WLAN_ENABLED
,
&
vif
->
flags
);
if
(
wmi_ready
)
{
discon_issued
=
test_bit
(
CONNECTED
,
&
vif
->
flags
)
||
test_bit
(
CONNECT_PEND
,
&
vif
->
flags
);
ath6kl_disconnect
(
vif
);
del_timer
(
&
vif
->
disconnect_timer
);
if
(
discon_issued
)
ath6kl_disconnect_event
(
vif
,
DISCONNECT_CMD
,
(
vif
->
nw_type
&
AP_NETWORK
)
?
bcast_mac
:
vif
->
bssid
,
0
,
NULL
,
0
);
}
if
(
vif
->
scan_req
)
{
cfg80211_scan_done
(
vif
->
scan_req
,
true
);
vif
->
scan_req
=
NULL
;
}
/* need to clean up enhanced bmiss detection fw state */
ath6kl_cfg80211_sta_bmiss_enhance
(
vif
,
false
);
}
void
ath6kl_stop_txrx
(
struct
ath6kl
*
ar
)
{
struct
ath6kl_vif
*
vif
,
*
tmp_vif
;
...
...
@@ -1766,7 +1734,7 @@ void ath6kl_stop_txrx(struct ath6kl *ar)
list_for_each_entry_safe
(
vif
,
tmp_vif
,
&
ar
->
vif_list
,
list
)
{
list_del
(
&
vif
->
list
);
spin_unlock_bh
(
&
ar
->
list_lock
);
ath6kl_c
leanup_vif
(
vif
,
test_bit
(
WMI_READY
,
&
ar
->
flag
));
ath6kl_c
fg80211_vif_stop
(
vif
,
test_bit
(
WMI_READY
,
&
ar
->
flag
));
rtnl_lock
();
ath6kl_cfg80211_vif_cleanup
(
vif
);
rtnl_unlock
();
...
...
@@ -1801,8 +1769,6 @@ void ath6kl_stop_txrx(struct ath6kl *ar)
"attempting to reset target on instance destroy
\n
"
);
ath6kl_reset_device
(
ar
,
ar
->
target_type
,
true
,
true
);
clear_bit
(
WLAN_ENABLED
,
&
ar
->
flag
);
up
(
&
ar
->
sem
);
}
EXPORT_SYMBOL
(
ath6kl_stop_txrx
);
drivers/net/wireless/ath/ath6kl/usb.c
View file @
9e97d14b
...
...
@@ -159,10 +159,8 @@ static void ath6kl_usb_free_urb_to_pipe(struct ath6kl_usb_pipe *pipe,
static
void
ath6kl_usb_cleanup_recv_urb
(
struct
ath6kl_urb_context
*
urb_context
)
{
if
(
urb_context
->
skb
!=
NULL
)
{
dev_kfree_skb
(
urb_context
->
skb
);
urb_context
->
skb
=
NULL
;
}
dev_kfree_skb
(
urb_context
->
skb
);
urb_context
->
skb
=
NULL
;
ath6kl_usb_free_urb_to_pipe
(
urb_context
->
pipe
,
urb_context
);
}
...
...
drivers/net/wireless/ath/ath6kl/wmi.c
View file @
9e97d14b
...
...
@@ -751,6 +751,23 @@ int ath6kl_wmi_force_roam_cmd(struct wmi *wmi, const u8 *bssid)
NO_SYNC_WMIFLAG
);
}
int
ath6kl_wmi_ap_set_beacon_intvl_cmd
(
struct
wmi
*
wmi
,
u8
if_idx
,
u32
beacon_intvl
)
{
struct
sk_buff
*
skb
;
struct
set_beacon_int_cmd
*
cmd
;
skb
=
ath6kl_wmi_get_new_buf
(
sizeof
(
*
cmd
));
if
(
!
skb
)
return
-
ENOMEM
;
cmd
=
(
struct
set_beacon_int_cmd
*
)
skb
->
data
;
cmd
->
beacon_intvl
=
cpu_to_le32
(
beacon_intvl
);
return
ath6kl_wmi_cmd_send
(
wmi
,
if_idx
,
skb
,
WMI_SET_BEACON_INT_CMDID
,
NO_SYNC_WMIFLAG
);
}
int
ath6kl_wmi_ap_set_dtim_cmd
(
struct
wmi
*
wmi
,
u8
if_idx
,
u32
dtim_period
)
{
struct
sk_buff
*
skb
;
...
...
@@ -2480,16 +2497,11 @@ static int ath6kl_wmi_sync_point(struct wmi *wmi, u8 if_idx)
free_cmd_skb:
/* free up any resources left over (possibly due to an error) */
if
(
skb
)
dev_kfree_skb
(
skb
);
dev_kfree_skb
(
skb
);
free_data_skb:
for
(
index
=
0
;
index
<
num_pri_streams
;
index
++
)
{
if
(
data_sync_bufs
[
index
].
skb
!=
NULL
)
{
dev_kfree_skb
((
struct
sk_buff
*
)
data_sync_bufs
[
index
].
skb
);
}
}
for
(
index
=
0
;
index
<
num_pri_streams
;
index
++
)
dev_kfree_skb
((
struct
sk_buff
*
)
data_sync_bufs
[
index
].
skb
);
return
ret
;
}
...
...
drivers/net/wireless/ath/ath6kl/wmi.h
View file @
9e97d14b
...
...
@@ -1660,6 +1660,10 @@ struct roam_ctrl_cmd {
u8
roam_ctrl
;
}
__packed
;
struct
set_beacon_int_cmd
{
__le32
beacon_intvl
;
}
__packed
;
struct
set_dtim_cmd
{
__le32
dtim_period
;
}
__packed
;
...
...
@@ -2649,6 +2653,8 @@ int ath6kl_wmi_del_wow_pattern_cmd(struct wmi *wmi, u8 if_idx,
int
ath6kl_wmi_set_rssi_filter_cmd
(
struct
wmi
*
wmi
,
u8
if_idx
,
s8
rssi
);
int
ath6kl_wmi_set_roam_lrssi_cmd
(
struct
wmi
*
wmi
,
u8
lrssi
);
int
ath6kl_wmi_ap_set_dtim_cmd
(
struct
wmi
*
wmi
,
u8
if_idx
,
u32
dtim_period
);
int
ath6kl_wmi_ap_set_beacon_intvl_cmd
(
struct
wmi
*
wmi
,
u8
if_idx
,
u32
beacon_interval
);
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
);
...
...
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