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
ce77903c
Commit
ce77903c
authored
Jun 20, 2012
by
John W. Linville
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'for-linville' of
git://github.com/kvalo/ath6kl
parents
daf67ce8
d987dd13
Changes
10
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
477 additions
and
83 deletions
+477
-83
drivers/net/wireless/ath/ath6kl/cfg80211.c
drivers/net/wireless/ath/ath6kl/cfg80211.c
+174
-34
drivers/net/wireless/ath/ath6kl/cfg80211.h
drivers/net/wireless/ath/ath6kl/cfg80211.h
+2
-0
drivers/net/wireless/ath/ath6kl/core.h
drivers/net/wireless/ath/ath6kl/core.h
+32
-6
drivers/net/wireless/ath/ath6kl/htc_mbox.c
drivers/net/wireless/ath/ath6kl/htc_mbox.c
+1
-1
drivers/net/wireless/ath/ath6kl/init.c
drivers/net/wireless/ath/ath6kl/init.c
+25
-3
drivers/net/wireless/ath/ath6kl/main.c
drivers/net/wireless/ath/ath6kl/main.c
+17
-10
drivers/net/wireless/ath/ath6kl/target.h
drivers/net/wireless/ath/ath6kl/target.h
+1
-0
drivers/net/wireless/ath/ath6kl/txrx.c
drivers/net/wireless/ath/ath6kl/txrx.c
+24
-24
drivers/net/wireless/ath/ath6kl/wmi.c
drivers/net/wireless/ath/ath6kl/wmi.c
+145
-3
drivers/net/wireless/ath/ath6kl/wmi.h
drivers/net/wireless/ath/ath6kl/wmi.h
+56
-2
No files found.
drivers/net/wireless/ath/ath6kl/cfg80211.c
View file @
ce77903c
This diff is collapsed.
Click to expand it.
drivers/net/wireless/ath/ath6kl/cfg80211.h
View file @
ce77903c
...
...
@@ -62,5 +62,7 @@ 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 @
ce77903c
...
...
@@ -100,6 +100,21 @@ enum ath6kl_fw_capability {
/* Firmware has support to override rsn cap of rsn ie */
ATH6KL_FW_CAPABILITY_RSN_CAP_OVERRIDE
,
/*
* Multicast support in WOW and host awake mode.
* Allow all multicast in host awake mode.
* Apply multicast filter in WOW mode.
*/
ATH6KL_FW_CAPABILITY_WOW_MULTICAST_FILTER
,
/* Firmware supports enhanced bmiss detection */
ATH6KL_FW_CAPABILITY_BMISS_ENHANCE
,
/*
* FW supports matching of ssid in schedule scan
*/
ATH6KL_FW_CAPABILITY_SCHED_SCAN_MATCH_LIST
,
/* this needs to be last */
ATH6KL_FW_CAPABILITY_MAX
,
};
...
...
@@ -112,6 +127,10 @@ struct ath6kl_fw_ie {
u8
data
[
0
];
};
enum
ath6kl_hw_flags
{
ATH6KL_HW_FLAG_64BIT_RATES
=
BIT
(
0
),
};
#define ATH6KL_FW_API2_FILE "fw-2.bin"
#define ATH6KL_FW_API3_FILE "fw-3.bin"
...
...
@@ -196,7 +215,7 @@ struct ath6kl_fw_ie {
#define AGGR_NUM_OF_FREE_NETBUFS 16
#define AGGR_RX_TIMEOUT
4
00
/* in ms */
#define AGGR_RX_TIMEOUT
1
00
/* in ms */
#define WMI_TIMEOUT (2 * HZ)
...
...
@@ -245,7 +264,6 @@ struct skb_hold_q {
struct
rxtid
{
bool
aggr
;
bool
progress
;
bool
timer_mon
;
u16
win_sz
;
u16
seq_next
;
...
...
@@ -254,9 +272,15 @@ struct rxtid {
struct
sk_buff_head
q
;
/*
* FIXME: No clue what this should protect. Apparently it should
* protect some of the fields above but they are also accessed
* without taking the lock.
* lock mainly protects seq_next and hold_q. Movement of seq_next
* needs to be protected between aggr_timeout() and
* aggr_process_recv_frm(). hold_q will be holding the pending
* reorder frames and it's access should also be protected.
* Some of the other fields like hold_q_sz, win_sz and aggr are
* initialized/reset when receiving addba/delba req, also while
* deleting aggr state all the pending buffers are flushed before
* resetting these fields, so there should not be any race in accessing
* these fields.
*/
spinlock_t
lock
;
};
...
...
@@ -541,7 +565,7 @@ struct ath6kl_vif {
struct
ath6kl_wep_key
wep_key_list
[
WMI_MAX_KEY_INDEX
+
1
];
struct
ath6kl_key
keys
[
WMI_MAX_KEY_INDEX
+
1
];
struct
aggr_info
*
aggr_cntxt
;
struct
ath6kl_htcap
htcap
;
struct
ath6kl_htcap
htcap
[
IEEE80211_NUM_BANDS
]
;
struct
timer_list
disconnect_timer
;
struct
timer_list
sched_scan_timer
;
...
...
@@ -684,6 +708,8 @@ struct ath6kl {
u32
testscript_addr
;
enum
wmi_phy_cap
cap
;
u32
flags
;
struct
ath6kl_hw_fw
{
const
char
*
dir
;
const
char
*
otp
;
...
...
drivers/net/wireless/ath/ath6kl/htc_mbox.c
View file @
ce77903c
...
...
@@ -1309,7 +1309,7 @@ static int ath6kl_htc_rx_packet(struct htc_target *target,
}
ath6kl_dbg
(
ATH6KL_DBG_HTC
,
"htc rx 0x%p hdr x%x len %d mbox 0x%x
\n
"
,
"htc rx 0x%p hdr
0
x%x len %d mbox 0x%x
\n
"
,
packet
,
packet
->
info
.
rx
.
exp_hdr
,
padded_len
,
dev
->
ar
->
mbox_info
.
htc_addr
);
...
...
drivers/net/wireless/ath/ath6kl/init.c
View file @
ce77903c
...
...
@@ -42,6 +42,7 @@ static const struct ath6kl_hw hw_list[] = {
.
reserved_ram_size
=
6912
,
.
refclk_hz
=
26000000
,
.
uarttx_pin
=
8
,
.
flags
=
0
,
/* hw2.0 needs override address hardcoded */
.
app_start_override_addr
=
0x944C00
,
...
...
@@ -67,6 +68,7 @@ static const struct ath6kl_hw hw_list[] = {
.
refclk_hz
=
26000000
,
.
uarttx_pin
=
8
,
.
testscript_addr
=
0x57ef74
,
.
flags
=
0
,
.
fw
=
{
.
dir
=
AR6003_HW_2_1_1_FW_DIR
,
...
...
@@ -91,6 +93,7 @@ static const struct ath6kl_hw hw_list[] = {
.
board_addr
=
0x433900
,
.
refclk_hz
=
26000000
,
.
uarttx_pin
=
11
,
.
flags
=
ATH6KL_HW_FLAG_64BIT_RATES
,
.
fw
=
{
.
dir
=
AR6004_HW_1_0_FW_DIR
,
...
...
@@ -110,6 +113,7 @@ static const struct ath6kl_hw hw_list[] = {
.
board_addr
=
0x43d400
,
.
refclk_hz
=
40000000
,
.
uarttx_pin
=
11
,
.
flags
=
ATH6KL_HW_FLAG_64BIT_RATES
,
.
fw
=
{
.
dir
=
AR6004_HW_1_1_FW_DIR
,
...
...
@@ -129,6 +133,7 @@ static const struct ath6kl_hw hw_list[] = {
.
board_addr
=
0x435c00
,
.
refclk_hz
=
40000000
,
.
uarttx_pin
=
11
,
.
flags
=
ATH6KL_HW_FLAG_64BIT_RATES
,
.
fw
=
{
.
dir
=
AR6004_HW_1_2_FW_DIR
,
...
...
@@ -938,6 +943,14 @@ static int ath6kl_fetch_fw_apin(struct ath6kl *ar, const char *name)
}
switch
(
ie_id
)
{
case
ATH6KL_FW_IE_FW_VERSION
:
strlcpy
(
ar
->
wiphy
->
fw_version
,
data
,
sizeof
(
ar
->
wiphy
->
fw_version
));
ath6kl_dbg
(
ATH6KL_DBG_BOOT
,
"found fw version %s
\n
"
,
ar
->
wiphy
->
fw_version
);
break
;
case
ATH6KL_FW_IE_OTP_IMAGE
:
ath6kl_dbg
(
ATH6KL_DBG_BOOT
,
"found otp image ie (%zd B)
\n
"
,
ie_len
);
...
...
@@ -991,9 +1004,6 @@ static int ath6kl_fetch_fw_apin(struct ath6kl *ar, const char *name)
ar
->
hw
.
reserved_ram_size
);
break
;
case
ATH6KL_FW_IE_CAPABILITIES
:
if
(
ie_len
<
DIV_ROUND_UP
(
ATH6KL_FW_CAPABILITY_MAX
,
8
))
break
;
ath6kl_dbg
(
ATH6KL_DBG_BOOT
,
"found firmware capabilities ie (%zd B)
\n
"
,
ie_len
);
...
...
@@ -1002,6 +1012,9 @@ static int ath6kl_fetch_fw_apin(struct ath6kl *ar, const char *name)
index
=
i
/
8
;
bit
=
i
%
8
;
if
(
index
==
ie_len
)
break
;
if
(
data
[
index
]
&
(
1
<<
bit
))
__set_bit
(
i
,
ar
->
fw_capabilities
);
}
...
...
@@ -1392,6 +1405,12 @@ static int ath6kl_init_upload(struct ath6kl *ar)
ar
->
version
.
target_ver
==
AR6003_HW_2_1_1_VERSION
)
{
ath6kl_err
(
"temporary war to avoid sdio crc error
\n
"
);
param
=
0x28
;
address
=
GPIO_BASE_ADDRESS
+
GPIO_PIN9_ADDRESS
;
status
=
ath6kl_bmi_reg_write
(
ar
,
address
,
param
);
if
(
status
)
return
status
;
param
=
0x20
;
address
=
GPIO_BASE_ADDRESS
+
GPIO_PIN10_ADDRESS
;
...
...
@@ -1659,6 +1678,9 @@ void ath6kl_cleanup_vif(struct ath6kl_vif *vif, bool wmi_ready)
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
)
...
...
drivers/net/wireless/ath/ath6kl/main.c
View file @
ce77903c
...
...
@@ -554,20 +554,24 @@ void ath6kl_ready_event(void *devt, u8 *datap, u32 sw_ver, u32 abi_ver,
struct
ath6kl
*
ar
=
devt
;
memcpy
(
ar
->
mac_addr
,
datap
,
ETH_ALEN
);
ath6kl_dbg
(
ATH6KL_DBG_TRC
,
"%s: mac addr = %pM
\n
"
,
__func__
,
ar
->
mac_addr
);
ath6kl_dbg
(
ATH6KL_DBG_BOOT
,
"ready event mac addr %pM sw_ver 0x%x abi_ver 0x%x cap 0x%x
\n
"
,
ar
->
mac_addr
,
sw_ver
,
abi_ver
,
cap
);
ar
->
version
.
wlan_ver
=
sw_ver
;
ar
->
version
.
abi_ver
=
abi_ver
;
ar
->
hw
.
cap
=
cap
;
snprintf
(
ar
->
wiphy
->
fw_version
,
sizeof
(
ar
->
wiphy
->
fw_version
),
"%u.%u.%u.%u"
,
(
ar
->
version
.
wlan_ver
&
0xf0000000
)
>>
28
,
(
ar
->
version
.
wlan_ver
&
0x0f000000
)
>>
24
,
(
ar
->
version
.
wlan_ver
&
0x00ff0000
)
>>
16
,
(
ar
->
version
.
wlan_ver
&
0x0000ffff
));
if
(
strlen
(
ar
->
wiphy
->
fw_version
)
==
0
)
{
snprintf
(
ar
->
wiphy
->
fw_version
,
sizeof
(
ar
->
wiphy
->
fw_version
),
"%u.%u.%u.%u"
,
(
ar
->
version
.
wlan_ver
&
0xf0000000
)
>>
28
,
(
ar
->
version
.
wlan_ver
&
0x0f000000
)
>>
24
,
(
ar
->
version
.
wlan_ver
&
0x00ff0000
)
>>
16
,
(
ar
->
version
.
wlan_ver
&
0x0000ffff
));
}
/* indicate to the waiting thread that the ready event was received */
set_bit
(
WMI_READY
,
&
ar
->
flag
);
...
...
@@ -1166,7 +1170,10 @@ static void ath6kl_set_multicast_list(struct net_device *ndev)
else
clear_bit
(
NETDEV_MCAST_ALL_ON
,
&
vif
->
flags
);
mc_all_on
=
mc_all_on
||
(
vif
->
ar
->
state
==
ATH6KL_STATE_ON
);
if
(
test_bit
(
ATH6KL_FW_CAPABILITY_WOW_MULTICAST_FILTER
,
vif
->
ar
->
fw_capabilities
))
{
mc_all_on
=
mc_all_on
||
(
vif
->
ar
->
state
==
ATH6KL_STATE_ON
);
}
if
(
!
(
ndev
->
flags
&
IFF_MULTICAST
))
{
mc_all_on
=
false
;
...
...
drivers/net/wireless/ath/ath6kl/target.h
View file @
ce77903c
...
...
@@ -45,6 +45,7 @@
#define LPO_CAL_ENABLE_S 20
#define LPO_CAL_ENABLE 0x00100000
#define GPIO_PIN9_ADDRESS 0x0000004c
#define GPIO_PIN10_ADDRESS 0x00000050
#define GPIO_PIN11_ADDRESS 0x00000054
#define GPIO_PIN12_ADDRESS 0x00000058
...
...
drivers/net/wireless/ath/ath6kl/txrx.c
View file @
ce77903c
...
...
@@ -1036,6 +1036,7 @@ static void aggr_deque_frms(struct aggr_info_conn *agg_conn, u8 tid,
rxtid
=
&
agg_conn
->
rx_tid
[
tid
];
stats
=
&
agg_conn
->
stat
[
tid
];
spin_lock_bh
(
&
rxtid
->
lock
);
idx
=
AGGR_WIN_IDX
(
rxtid
->
seq_next
,
rxtid
->
hold_q_sz
);
/*
...
...
@@ -1054,8 +1055,6 @@ static void aggr_deque_frms(struct aggr_info_conn *agg_conn, u8 tid,
seq_end
=
seq_no
?
seq_no
:
rxtid
->
seq_next
;
idx_end
=
AGGR_WIN_IDX
(
seq_end
,
rxtid
->
hold_q_sz
);
spin_lock_bh
(
&
rxtid
->
lock
);
do
{
node
=
&
rxtid
->
hold_q
[
idx
];
if
((
order
==
1
)
&&
(
!
node
->
skb
))
...
...
@@ -1127,11 +1126,13 @@ static bool aggr_process_recv_frm(struct aggr_info_conn *agg_conn, u8 tid,
((
end
>
extended_end
)
&&
(
cur
>
extended_end
)
&&
(
cur
<
end
)))
{
aggr_deque_frms
(
agg_conn
,
tid
,
0
,
0
);
spin_lock_bh
(
&
rxtid
->
lock
);
if
(
cur
>=
rxtid
->
hold_q_sz
-
1
)
rxtid
->
seq_next
=
cur
-
(
rxtid
->
hold_q_sz
-
1
);
else
rxtid
->
seq_next
=
ATH6KL_MAX_SEQ_NO
-
(
rxtid
->
hold_q_sz
-
2
-
cur
);
spin_unlock_bh
(
&
rxtid
->
lock
);
}
else
{
/*
* Dequeue only those frames that are outside the
...
...
@@ -1185,25 +1186,25 @@ static bool aggr_process_recv_frm(struct aggr_info_conn *agg_conn, u8 tid,
aggr_deque_frms
(
agg_conn
,
tid
,
0
,
1
);
if
(
agg_conn
->
timer_scheduled
)
rxtid
->
progress
=
true
;
else
for
(
idx
=
0
;
idx
<
rxtid
->
hold_q_sz
;
idx
++
)
{
if
(
rxtid
->
hold_q
[
idx
].
skb
)
{
/*
* There is a frame in the queue and no
* timer so start a timer to ensure that
* the frame doesn't remain stuck
* forever.
*/
agg_conn
->
timer_scheduled
=
true
;
mod_timer
(
&
agg_conn
->
timer
,
(
jiffies
+
HZ
*
(
AGGR_RX_TIMEOUT
)
/
1000
));
rxtid
->
progress
=
false
;
rxtid
->
timer_mon
=
true
;
break
;
}
return
is_queued
;
spin_lock_bh
(
&
rxtid
->
lock
);
for
(
idx
=
0
;
idx
<
rxtid
->
hold_q_sz
;
idx
++
)
{
if
(
rxtid
->
hold_q
[
idx
].
skb
)
{
/*
* There is a frame in the queue and no
* timer so start a timer to ensure that
* the frame doesn't remain stuck
* forever.
*/
agg_conn
->
timer_scheduled
=
true
;
mod_timer
(
&
agg_conn
->
timer
,
(
jiffies
+
(
HZ
*
AGGR_RX_TIMEOUT
)
/
1000
));
rxtid
->
timer_mon
=
true
;
break
;
}
}
spin_unlock_bh
(
&
rxtid
->
lock
);
return
is_queued
;
}
...
...
@@ -1608,7 +1609,7 @@ static void aggr_timeout(unsigned long arg)
rxtid
=
&
aggr_conn
->
rx_tid
[
i
];
stats
=
&
aggr_conn
->
stat
[
i
];
if
(
!
rxtid
->
aggr
||
!
rxtid
->
timer_mon
||
rxtid
->
progress
)
if
(
!
rxtid
->
aggr
||
!
rxtid
->
timer_mon
)
continue
;
stats
->
num_timeouts
++
;
...
...
@@ -1626,14 +1627,15 @@ static void aggr_timeout(unsigned long arg)
rxtid
=
&
aggr_conn
->
rx_tid
[
i
];
if
(
rxtid
->
aggr
&&
rxtid
->
hold_q
)
{
spin_lock_bh
(
&
rxtid
->
lock
);
for
(
j
=
0
;
j
<
rxtid
->
hold_q_sz
;
j
++
)
{
if
(
rxtid
->
hold_q
[
j
].
skb
)
{
aggr_conn
->
timer_scheduled
=
true
;
rxtid
->
timer_mon
=
true
;
rxtid
->
progress
=
false
;
break
;
}
}
spin_unlock_bh
(
&
rxtid
->
lock
);
if
(
j
>=
rxtid
->
hold_q_sz
)
rxtid
->
timer_mon
=
false
;
...
...
@@ -1660,7 +1662,6 @@ static void aggr_delete_tid_state(struct aggr_info_conn *aggr_conn, u8 tid)
aggr_deque_frms
(
aggr_conn
,
tid
,
0
,
0
);
rxtid
->
aggr
=
false
;
rxtid
->
progress
=
false
;
rxtid
->
timer_mon
=
false
;
rxtid
->
win_sz
=
0
;
rxtid
->
seq_next
=
0
;
...
...
@@ -1739,7 +1740,6 @@ void aggr_conn_init(struct ath6kl_vif *vif, struct aggr_info *aggr_info,
for
(
i
=
0
;
i
<
NUM_OF_TIDS
;
i
++
)
{
rxtid
=
&
aggr_conn
->
rx_tid
[
i
];
rxtid
->
aggr
=
false
;
rxtid
->
progress
=
false
;
rxtid
->
timer_mon
=
false
;
skb_queue_head_init
(
&
rxtid
->
q
);
spin_lock_init
(
&
rxtid
->
lock
);
...
...
drivers/net/wireless/ath/ath6kl/wmi.c
View file @
ce77903c
...
...
@@ -743,7 +743,6 @@ int ath6kl_wmi_force_roam_cmd(struct wmi *wmi, const u8 *bssid)
return
-
ENOMEM
;
cmd
=
(
struct
roam_ctrl_cmd
*
)
skb
->
data
;
memset
(
cmd
,
0
,
sizeof
(
*
cmd
));
memcpy
(
cmd
->
info
.
bssid
,
bssid
,
ETH_ALEN
);
cmd
->
roam_ctrl
=
WMI_FORCE_ROAM
;
...
...
@@ -753,6 +752,22 @@ int ath6kl_wmi_force_roam_cmd(struct wmi *wmi, const u8 *bssid)
NO_SYNC_WMIFLAG
);
}
int
ath6kl_wmi_ap_set_dtim_cmd
(
struct
wmi
*
wmi
,
u8
if_idx
,
u32
dtim_period
)
{
struct
sk_buff
*
skb
;
struct
set_dtim_cmd
*
cmd
;
skb
=
ath6kl_wmi_get_new_buf
(
sizeof
(
*
cmd
));
if
(
!
skb
)
return
-
ENOMEM
;
cmd
=
(
struct
set_dtim_cmd
*
)
skb
->
data
;
cmd
->
dtim_period
=
cpu_to_le32
(
dtim_period
);
return
ath6kl_wmi_cmd_send
(
wmi
,
if_idx
,
skb
,
WMI_AP_SET_DTIM_CMDID
,
NO_SYNC_WMIFLAG
);
}
int
ath6kl_wmi_set_roam_mode_cmd
(
struct
wmi
*
wmi
,
enum
wmi_roam_mode
mode
)
{
struct
sk_buff
*
skb
;
...
...
@@ -763,7 +778,6 @@ int ath6kl_wmi_set_roam_mode_cmd(struct wmi *wmi, enum wmi_roam_mode mode)
return
-
ENOMEM
;
cmd
=
(
struct
roam_ctrl_cmd
*
)
skb
->
data
;
memset
(
cmd
,
0
,
sizeof
(
*
cmd
));
cmd
->
info
.
roam_mode
=
mode
;
cmd
->
roam_ctrl
=
WMI_SET_ROAM_MODE
;
...
...
@@ -1995,7 +2009,7 @@ int ath6kl_wmi_probedssid_cmd(struct wmi *wmi, u8 if_idx, u8 index, u8 flag,
struct
wmi_probed_ssid_cmd
*
cmd
;
int
ret
;
if
(
index
>
MAX_PROBED_SSID_INDEX
)
if
(
index
>
=
MAX_PROBED_SSIDS
)
return
-
EINVAL
;
if
(
ssid_len
>
sizeof
(
cmd
->
ssid
))
...
...
@@ -2599,6 +2613,115 @@ static void ath6kl_wmi_relinquish_implicit_pstream_credits(struct wmi *wmi)
spin_unlock_bh
(
&
wmi
->
lock
);
}
static
int
ath6kl_set_bitrate_mask64
(
struct
wmi
*
wmi
,
u8
if_idx
,
const
struct
cfg80211_bitrate_mask
*
mask
)
{
struct
sk_buff
*
skb
;
int
ret
,
mode
,
band
;
u64
mcsrate
,
ratemask
[
IEEE80211_NUM_BANDS
];
struct
wmi_set_tx_select_rates64_cmd
*
cmd
;
memset
(
&
ratemask
,
0
,
sizeof
(
ratemask
));
for
(
band
=
0
;
band
<
IEEE80211_NUM_BANDS
;
band
++
)
{
/* copy legacy rate mask */
ratemask
[
band
]
=
mask
->
control
[
band
].
legacy
;
if
(
band
==
IEEE80211_BAND_5GHZ
)
ratemask
[
band
]
=
mask
->
control
[
band
].
legacy
<<
4
;
/* copy mcs rate mask */
mcsrate
=
mask
->
control
[
band
].
mcs
[
1
];
mcsrate
<<=
8
;
mcsrate
|=
mask
->
control
[
band
].
mcs
[
0
];
ratemask
[
band
]
|=
mcsrate
<<
12
;
ratemask
[
band
]
|=
mcsrate
<<
28
;
}
ath6kl_dbg
(
ATH6KL_DBG_WMI
,
"Ratemask 64 bit: 2.4:%llx 5:%llx
\n
"
,
ratemask
[
0
],
ratemask
[
1
]);
skb
=
ath6kl_wmi_get_new_buf
(
sizeof
(
*
cmd
)
*
WMI_RATES_MODE_MAX
);
if
(
!
skb
)
return
-
ENOMEM
;
cmd
=
(
struct
wmi_set_tx_select_rates64_cmd
*
)
skb
->
data
;
for
(
mode
=
0
;
mode
<
WMI_RATES_MODE_MAX
;
mode
++
)
{
/* A mode operate in 5GHZ band */
if
(
mode
==
WMI_RATES_MODE_11A
||
mode
==
WMI_RATES_MODE_11A_HT20
||
mode
==
WMI_RATES_MODE_11A_HT40
)
band
=
IEEE80211_BAND_5GHZ
;
else
band
=
IEEE80211_BAND_2GHZ
;
cmd
->
ratemask
[
mode
]
=
cpu_to_le64
(
ratemask
[
band
]);
}
ret
=
ath6kl_wmi_cmd_send
(
wmi
,
if_idx
,
skb
,
WMI_SET_TX_SELECT_RATES_CMDID
,
NO_SYNC_WMIFLAG
);
return
ret
;
}
static
int
ath6kl_set_bitrate_mask32
(
struct
wmi
*
wmi
,
u8
if_idx
,
const
struct
cfg80211_bitrate_mask
*
mask
)
{
struct
sk_buff
*
skb
;
int
ret
,
mode
,
band
;
u32
mcsrate
,
ratemask
[
IEEE80211_NUM_BANDS
];
struct
wmi_set_tx_select_rates32_cmd
*
cmd
;
memset
(
&
ratemask
,
0
,
sizeof
(
ratemask
));
for
(
band
=
0
;
band
<
IEEE80211_NUM_BANDS
;
band
++
)
{
/* copy legacy rate mask */
ratemask
[
band
]
=
mask
->
control
[
band
].
legacy
;
if
(
band
==
IEEE80211_BAND_5GHZ
)
ratemask
[
band
]
=
mask
->
control
[
band
].
legacy
<<
4
;
/* copy mcs rate mask */
mcsrate
=
mask
->
control
[
band
].
mcs
[
0
];
ratemask
[
band
]
|=
mcsrate
<<
12
;
ratemask
[
band
]
|=
mcsrate
<<
20
;
}
ath6kl_dbg
(
ATH6KL_DBG_WMI
,
"Ratemask 32 bit: 2.4:%x 5:%x
\n
"
,
ratemask
[
0
],
ratemask
[
1
]);
skb
=
ath6kl_wmi_get_new_buf
(
sizeof
(
*
cmd
)
*
WMI_RATES_MODE_MAX
);
if
(
!
skb
)
return
-
ENOMEM
;
cmd
=
(
struct
wmi_set_tx_select_rates32_cmd
*
)
skb
->
data
;
for
(
mode
=
0
;
mode
<
WMI_RATES_MODE_MAX
;
mode
++
)
{
/* A mode operate in 5GHZ band */
if
(
mode
==
WMI_RATES_MODE_11A
||
mode
==
WMI_RATES_MODE_11A_HT20
||
mode
==
WMI_RATES_MODE_11A_HT40
)
band
=
IEEE80211_BAND_5GHZ
;
else
band
=
IEEE80211_BAND_2GHZ
;
cmd
->
ratemask
[
mode
]
=
cpu_to_le32
(
ratemask
[
band
]);
}
ret
=
ath6kl_wmi_cmd_send
(
wmi
,
if_idx
,
skb
,
WMI_SET_TX_SELECT_RATES_CMDID
,
NO_SYNC_WMIFLAG
);
return
ret
;
}
int
ath6kl_wmi_set_bitrate_mask
(
struct
wmi
*
wmi
,
u8
if_idx
,
const
struct
cfg80211_bitrate_mask
*
mask
)
{
struct
ath6kl
*
ar
=
wmi
->
parent_dev
;
if
(
ar
->
hw
.
flags
&
ATH6KL_HW_FLAG_64BIT_RATES
)
return
ath6kl_set_bitrate_mask64
(
wmi
,
if_idx
,
mask
);
else
return
ath6kl_set_bitrate_mask32
(
wmi
,
if_idx
,
mask
);
}
int
ath6kl_wmi_set_host_sleep_mode_cmd
(
struct
wmi
*
wmi
,
u8
if_idx
,
enum
ath6kl_host_mode
host_mode
)
{
...
...
@@ -2997,6 +3120,25 @@ int ath6kl_wmi_add_del_mcast_filter_cmd(struct wmi *wmi, u8 if_idx,
return
ret
;
}
int
ath6kl_wmi_sta_bmiss_enhance_cmd
(
struct
wmi
*
wmi
,
u8
if_idx
,
bool
enhance
)
{
struct
sk_buff
*
skb
;
struct
wmi_sta_bmiss_enhance_cmd
*
cmd
;
int
ret
;
skb
=
ath6kl_wmi_get_new_buf
(
sizeof
(
*
cmd
));
if
(
!
skb
)
return
-
ENOMEM
;
cmd
=
(
struct
wmi_sta_bmiss_enhance_cmd
*
)
skb
->
data
;
cmd
->
enable
=
enhance
?
1
:
0
;
ret
=
ath6kl_wmi_cmd_send
(
wmi
,
if_idx
,
skb
,
WMI_STA_BMISS_ENHANCE_CMDID
,
NO_SYNC_WMIFLAG
);
return
ret
;
}
s32
ath6kl_wmi_get_rate
(
s8
rate_index
)
{
if
(
rate_index
==
RATE_AUTO
)
...
...
drivers/net/wireless/ath/ath6kl/wmi.h
View file @
ce77903c
...
...
@@ -624,6 +624,10 @@ enum wmi_cmd_id {
WMI_SEND_MGMT_CMDID
,
WMI_BEGIN_SCAN_CMDID
,
WMI_SET_BLACK_LIST
,
WMI_SET_MCASTRATE
,
WMI_STA_BMISS_ENHANCE_CMDID
,
};
enum
wmi_mgmt_frame_type
{
...
...
@@ -960,6 +964,9 @@ enum wmi_bss_filter {
/* beacons matching probed ssid */
PROBED_SSID_FILTER
,
/* beacons matching matched ssid */
MATCHED_SSID_FILTER
,
/* marker only */
LAST_BSS_FILTER
,
};
...
...
@@ -978,7 +985,7 @@ struct wmi_bss_filter_cmd {
}
__packed
;
/* WMI_SET_PROBED_SSID_CMDID */
#define MAX_PROBED_SSID
_INDEX 9
#define MAX_PROBED_SSID
S 16
enum
wmi_ssid_flag
{
/* disables entry */
...
...
@@ -989,10 +996,13 @@ enum wmi_ssid_flag {
/* probes for any ssid */
ANY_SSID_FLAG
=
0x02
,
/* match for ssid */
MATCH_SSID_FLAG
=
0x08
,
};
struct
wmi_probed_ssid_cmd
{
/* 0 to MAX_PROBED_SSID
_INDEX
*/
/* 0 to MAX_PROBED_SSID
S - 1
*/
u8
entry_index
;
/* see, enum wmi_ssid_flg */
...
...
@@ -1017,6 +1027,11 @@ struct wmi_bmiss_time_cmd {
__le16
num_beacons
;
};
/* WMI_STA_ENHANCE_BMISS_CMDID */
struct
wmi_sta_bmiss_enhance_cmd
{
u8
enable
;
}
__packed
;
/* WMI_SET_POWER_MODE_CMDID */
enum
wmi_power_mode
{
REC_POWER
=
0x01
,
...
...
@@ -1048,6 +1063,36 @@ struct wmi_power_params_cmd {
__le16
ps_fail_event_policy
;
}
__packed
;
/*
* Ratemask for below modes should be passed
* to WMI_SET_TX_SELECT_RATES_CMDID.
* AR6003 has 32 bit mask for each modes.
* First 12 bits for legacy rates, 13 to 20
* bits for HT 20 rates and 21 to 28 bits for
* HT 40 rates
*/
enum
wmi_mode_phy
{
WMI_RATES_MODE_11A
=
0
,
WMI_RATES_MODE_11G
,
WMI_RATES_MODE_11B
,
WMI_RATES_MODE_11GONLY
,
WMI_RATES_MODE_11A_HT20
,
WMI_RATES_MODE_11G_HT20
,
WMI_RATES_MODE_11A_HT40
,
WMI_RATES_MODE_11G_HT40
,
WMI_RATES_MODE_MAX
};
/* WMI_SET_TX_SELECT_RATES_CMDID */
struct
wmi_set_tx_select_rates32_cmd
{
__le32
ratemask
[
WMI_RATES_MODE_MAX
];
}
__packed
;
/* WMI_SET_TX_SELECT_RATES_CMDID */
struct
wmi_set_tx_select_rates64_cmd
{
__le64
ratemask
[
WMI_RATES_MODE_MAX
];
}
__packed
;
/* WMI_SET_DISC_TIMEOUT_CMDID */
struct
wmi_disc_timeout_cmd
{
/* seconds */
...
...
@@ -1572,6 +1617,10 @@ struct roam_ctrl_cmd {
u8
roam_ctrl
;
}
__packed
;
struct
set_dtim_cmd
{
__le32
dtim_period
;
}
__packed
;
/* BSS INFO HDR version 2.0 */
struct
wmi_bss_info_hdr2
{
__le16
ch
;
/* frequency in MHz */
...
...
@@ -2532,6 +2581,8 @@ 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_bitrate_mask
(
struct
wmi
*
wmi
,
u8
if_idx
,
const
struct
cfg80211_bitrate_mask
*
mask
);
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
);
...
...
@@ -2542,11 +2593,14 @@ int ath6kl_wmi_add_wow_pattern_cmd(struct wmi *wmi, u8 if_idx,
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_ap_set_dtim_cmd
(
struct
wmi
*
wmi
,
u8
if_idx
,
u32
dtim_period
);
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
);
int
ath6kl_wmi_sta_bmiss_enhance_cmd
(
struct
wmi
*
wmi
,
u8
if_idx
,
bool
enable
);
/* AP mode uAPSD */
int
ath6kl_wmi_ap_set_apsd
(
struct
wmi
*
wmi
,
u8
if_idx
,
u8
enable
);
...
...
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