2009-04-23 20:52:52 +04:00
# ifndef __MAC80211_DRIVER_OPS
# define __MAC80211_DRIVER_OPS
# include <net/mac80211.h>
# include "ieee80211_i.h"
2012-06-22 14:55:52 +04:00
# include "trace.h"
2009-04-23 20:52:52 +04:00
2011-11-03 17:41:13 +04:00
static inline void check_sdata_in_driver ( struct ieee80211_sub_if_data * sdata )
{
2012-03-16 03:22:05 +04:00
WARN ( ! ( sdata - > flags & IEEE80211_SDATA_IN_DRIVER ) ,
" %s: Failed check-sdata-in-driver check, flags: 0x%x \n " ,
2012-06-18 22:07:15 +04:00
sdata - > dev ? sdata - > dev - > name : sdata - > name , sdata - > flags ) ;
2011-11-03 17:41:13 +04:00
}
2011-11-23 18:09:49 +04:00
static inline struct ieee80211_sub_if_data *
get_bss_sdata ( struct ieee80211_sub_if_data * sdata )
{
if ( sdata - > vif . type = = NL80211_IFTYPE_AP_VLAN )
sdata = container_of ( sdata - > bss , struct ieee80211_sub_if_data ,
u . ap ) ;
return sdata ;
}
2012-07-23 23:33:42 +04:00
static inline void drv_tx ( struct ieee80211_local * local ,
struct ieee80211_tx_control * control ,
struct sk_buff * skb )
2009-04-23 20:52:52 +04:00
{
2012-07-23 23:33:42 +04:00
local - > ops - > tx ( & local - > hw , control , skb ) ;
2009-04-23 20:52:52 +04:00
}
2012-04-23 23:50:31 +04:00
static inline void drv_get_et_strings ( struct ieee80211_sub_if_data * sdata ,
u32 sset , u8 * data )
{
struct ieee80211_local * local = sdata - > local ;
if ( local - > ops - > get_et_strings ) {
trace_drv_get_et_strings ( local , sset ) ;
local - > ops - > get_et_strings ( & local - > hw , & sdata - > vif , sset , data ) ;
trace_drv_return_void ( local ) ;
}
}
static inline void drv_get_et_stats ( struct ieee80211_sub_if_data * sdata ,
struct ethtool_stats * stats ,
u64 * data )
{
struct ieee80211_local * local = sdata - > local ;
if ( local - > ops - > get_et_stats ) {
trace_drv_get_et_stats ( local ) ;
local - > ops - > get_et_stats ( & local - > hw , & sdata - > vif , stats , data ) ;
trace_drv_return_void ( local ) ;
}
}
static inline int drv_get_et_sset_count ( struct ieee80211_sub_if_data * sdata ,
int sset )
{
struct ieee80211_local * local = sdata - > local ;
int rv = 0 ;
if ( local - > ops - > get_et_sset_count ) {
trace_drv_get_et_sset_count ( local , sset ) ;
rv = local - > ops - > get_et_sset_count ( & local - > hw , & sdata - > vif ,
sset ) ;
trace_drv_return_int ( local , rv ) ;
}
return rv ;
}
2009-04-23 20:52:52 +04:00
static inline int drv_start ( struct ieee80211_local * local )
{
2009-08-21 16:44:45 +04:00
int ret ;
2009-12-23 15:15:47 +03:00
might_sleep ( ) ;
2010-06-10 12:56:20 +04:00
trace_drv_start ( local ) ;
2009-08-21 16:44:45 +04:00
local - > started = true ;
smp_mb ( ) ;
ret = local - > ops - > start ( & local - > hw ) ;
2010-06-10 12:56:20 +04:00
trace_drv_return_int ( local , ret ) ;
2009-07-07 15:46:22 +04:00
return ret ;
2009-04-23 20:52:52 +04:00
}
static inline void drv_stop ( struct ieee80211_local * local )
{
2009-12-23 15:15:47 +03:00
might_sleep ( ) ;
2009-07-07 15:46:22 +04:00
trace_drv_stop ( local ) ;
2010-06-10 12:56:20 +04:00
local - > ops - > stop ( & local - > hw ) ;
trace_drv_return_void ( local ) ;
2009-08-21 16:44:45 +04:00
/* sync away all work on the tasklet before clearing started */
tasklet_disable ( & local - > tasklet ) ;
tasklet_enable ( & local - > tasklet ) ;
barrier ( ) ;
local - > started = false ;
2009-04-23 20:52:52 +04:00
}
2011-05-04 17:37:29 +04:00
# ifdef CONFIG_PM
static inline int drv_suspend ( struct ieee80211_local * local ,
struct cfg80211_wowlan * wowlan )
{
int ret ;
might_sleep ( ) ;
trace_drv_suspend ( local ) ;
ret = local - > ops - > suspend ( & local - > hw , wowlan ) ;
trace_drv_return_int ( local , ret ) ;
return ret ;
}
static inline int drv_resume ( struct ieee80211_local * local )
{
int ret ;
might_sleep ( ) ;
trace_drv_resume ( local ) ;
ret = local - > ops - > resume ( & local - > hw ) ;
trace_drv_return_int ( local , ret ) ;
return ret ;
}
2012-04-04 17:05:25 +04:00
static inline void drv_set_wakeup ( struct ieee80211_local * local ,
bool enabled )
{
might_sleep ( ) ;
if ( ! local - > ops - > set_wakeup )
return ;
trace_drv_set_wakeup ( local , enabled ) ;
local - > ops - > set_wakeup ( & local - > hw , enabled ) ;
trace_drv_return_void ( local ) ;
}
2011-05-04 17:37:29 +04:00
# endif
2009-04-23 20:52:52 +04:00
static inline int drv_add_interface ( struct ieee80211_local * local ,
2011-11-03 17:41:13 +04:00
struct ieee80211_sub_if_data * sdata )
2009-04-23 20:52:52 +04:00
{
2009-12-23 15:15:47 +03:00
int ret ;
might_sleep ( ) ;
2011-11-03 17:41:13 +04:00
if ( WARN_ON ( sdata - > vif . type = = NL80211_IFTYPE_AP_VLAN | |
2012-04-03 16:35:57 +04:00
( sdata - > vif . type = = NL80211_IFTYPE_MONITOR & &
! ( local - > hw . flags & IEEE80211_HW_WANT_MONITOR_VIF ) ) ) )
2011-11-03 17:41:13 +04:00
return - EINVAL ;
trace_drv_add_interface ( local , sdata ) ;
ret = local - > ops - > add_interface ( & local - > hw , & sdata - > vif ) ;
2010-06-10 12:56:20 +04:00
trace_drv_return_int ( local , ret ) ;
2011-11-03 17:41:13 +04:00
if ( ret = = 0 )
sdata - > flags | = IEEE80211_SDATA_IN_DRIVER ;
2009-07-07 15:46:22 +04:00
return ret ;
2009-04-23 20:52:52 +04:00
}
2010-08-27 14:35:58 +04:00
static inline int drv_change_interface ( struct ieee80211_local * local ,
struct ieee80211_sub_if_data * sdata ,
2010-09-16 16:58:23 +04:00
enum nl80211_iftype type , bool p2p )
2010-08-27 14:35:58 +04:00
{
int ret ;
might_sleep ( ) ;
2011-11-03 17:41:13 +04:00
check_sdata_in_driver ( sdata ) ;
2010-09-16 16:58:23 +04:00
trace_drv_change_interface ( local , sdata , type , p2p ) ;
ret = local - > ops - > change_interface ( & local - > hw , & sdata - > vif , type , p2p ) ;
2010-08-27 14:35:58 +04:00
trace_drv_return_int ( local , ret ) ;
return ret ;
}
2009-04-23 20:52:52 +04:00
static inline void drv_remove_interface ( struct ieee80211_local * local ,
2011-11-03 17:41:13 +04:00
struct ieee80211_sub_if_data * sdata )
2009-04-23 20:52:52 +04:00
{
2009-12-23 15:15:47 +03:00
might_sleep ( ) ;
2011-11-03 17:41:13 +04:00
check_sdata_in_driver ( sdata ) ;
trace_drv_remove_interface ( local , sdata ) ;
local - > ops - > remove_interface ( & local - > hw , & sdata - > vif ) ;
sdata - > flags & = ~ IEEE80211_SDATA_IN_DRIVER ;
2010-06-10 12:56:20 +04:00
trace_drv_return_void ( local ) ;
2009-04-23 20:52:52 +04:00
}
static inline int drv_config ( struct ieee80211_local * local , u32 changed )
{
2009-12-23 15:15:47 +03:00
int ret ;
might_sleep ( ) ;
2010-06-10 12:56:20 +04:00
trace_drv_config ( local , changed ) ;
2009-12-23 15:15:47 +03:00
ret = local - > ops - > config ( & local - > hw , changed ) ;
2010-06-10 12:56:20 +04:00
trace_drv_return_int ( local , ret ) ;
2009-07-07 15:46:22 +04:00
return ret ;
2009-04-23 20:52:52 +04:00
}
static inline void drv_bss_info_changed ( struct ieee80211_local * local ,
2009-11-25 22:30:31 +03:00
struct ieee80211_sub_if_data * sdata ,
2009-04-23 20:52:52 +04:00
struct ieee80211_bss_conf * info ,
u32 changed )
{
2009-12-23 15:15:47 +03:00
might_sleep ( ) ;
2011-11-03 17:41:13 +04:00
check_sdata_in_driver ( sdata ) ;
2010-06-10 12:56:20 +04:00
trace_drv_bss_info_changed ( local , sdata , info , changed ) ;
2009-04-23 20:52:52 +04:00
if ( local - > ops - > bss_info_changed )
2009-11-25 22:30:31 +03:00
local - > ops - > bss_info_changed ( & local - > hw , & sdata - > vif , info , changed ) ;
2010-06-10 12:56:20 +04:00
trace_drv_return_void ( local ) ;
2009-04-23 20:52:52 +04:00
}
2009-08-17 18:16:53 +04:00
static inline u64 drv_prepare_multicast ( struct ieee80211_local * local ,
2010-04-02 01:22:57 +04:00
struct netdev_hw_addr_list * mc_list )
2009-08-17 18:16:53 +04:00
{
u64 ret = 0 ;
2010-06-10 12:56:20 +04:00
trace_drv_prepare_multicast ( local , mc_list - > count ) ;
2009-08-17 18:16:53 +04:00
if ( local - > ops - > prepare_multicast )
2010-04-02 01:22:57 +04:00
ret = local - > ops - > prepare_multicast ( & local - > hw , mc_list ) ;
2009-08-17 18:16:53 +04:00
2010-06-10 12:56:20 +04:00
trace_drv_return_u64 ( local , ret ) ;
2009-08-17 18:16:53 +04:00
return ret ;
}
2009-04-23 20:52:52 +04:00
static inline void drv_configure_filter ( struct ieee80211_local * local ,
unsigned int changed_flags ,
unsigned int * total_flags ,
2009-08-17 18:16:53 +04:00
u64 multicast )
2009-04-23 20:52:52 +04:00
{
2009-08-17 18:16:53 +04:00
might_sleep ( ) ;
2009-07-07 15:46:22 +04:00
trace_drv_configure_filter ( local , changed_flags , total_flags ,
2009-08-17 18:16:53 +04:00
multicast ) ;
2010-06-10 12:56:20 +04:00
local - > ops - > configure_filter ( & local - > hw , changed_flags , total_flags ,
multicast ) ;
trace_drv_return_void ( local ) ;
2009-04-23 20:52:52 +04:00
}
static inline int drv_set_tim ( struct ieee80211_local * local ,
struct ieee80211_sta * sta , bool set )
{
2009-07-07 15:46:22 +04:00
int ret = 0 ;
2010-06-10 12:56:20 +04:00
trace_drv_set_tim ( local , sta , set ) ;
2009-04-23 20:52:52 +04:00
if ( local - > ops - > set_tim )
2009-07-07 15:46:22 +04:00
ret = local - > ops - > set_tim ( & local - > hw , sta , set ) ;
2010-06-10 12:56:20 +04:00
trace_drv_return_int ( local , ret ) ;
2009-07-07 15:46:22 +04:00
return ret ;
2009-04-23 20:52:52 +04:00
}
static inline int drv_set_key ( struct ieee80211_local * local ,
2009-11-25 22:30:31 +03:00
enum set_key_cmd cmd ,
struct ieee80211_sub_if_data * sdata ,
2009-04-23 20:52:52 +04:00
struct ieee80211_sta * sta ,
struct ieee80211_key_conf * key )
{
2009-12-23 15:15:47 +03:00
int ret ;
might_sleep ( ) ;
2012-01-20 16:55:18 +04:00
sdata = get_bss_sdata ( sdata ) ;
2011-11-03 17:41:13 +04:00
check_sdata_in_driver ( sdata ) ;
2010-06-10 12:56:20 +04:00
trace_drv_set_key ( local , cmd , sdata , sta , key ) ;
2009-12-23 15:15:47 +03:00
ret = local - > ops - > set_key ( & local - > hw , cmd , & sdata - > vif , sta , key ) ;
2010-06-10 12:56:20 +04:00
trace_drv_return_int ( local , ret ) ;
2009-07-07 15:46:22 +04:00
return ret ;
2009-04-23 20:52:52 +04:00
}
static inline void drv_update_tkip_key ( struct ieee80211_local * local ,
2010-01-21 13:40:47 +03:00
struct ieee80211_sub_if_data * sdata ,
2009-04-23 20:52:52 +04:00
struct ieee80211_key_conf * conf ,
2010-01-21 13:40:47 +03:00
struct sta_info * sta , u32 iv32 ,
2009-04-23 20:52:52 +04:00
u16 * phase1key )
{
2010-01-21 13:40:47 +03:00
struct ieee80211_sta * ista = NULL ;
if ( sta )
ista = & sta - > sta ;
2012-01-20 16:55:18 +04:00
sdata = get_bss_sdata ( sdata ) ;
2011-11-03 17:41:13 +04:00
check_sdata_in_driver ( sdata ) ;
2010-06-10 12:56:20 +04:00
trace_drv_update_tkip_key ( local , sdata , conf , ista , iv32 ) ;
2009-04-23 20:52:52 +04:00
if ( local - > ops - > update_tkip_key )
2010-01-21 13:40:47 +03:00
local - > ops - > update_tkip_key ( & local - > hw , & sdata - > vif , conf ,
ista , iv32 , phase1key ) ;
2010-06-10 12:56:20 +04:00
trace_drv_return_void ( local ) ;
2009-04-23 20:52:52 +04:00
}
static inline int drv_hw_scan ( struct ieee80211_local * local ,
2010-04-27 13:59:34 +04:00
struct ieee80211_sub_if_data * sdata ,
2009-04-23 20:52:52 +04:00
struct cfg80211_scan_request * req )
{
2009-12-23 15:15:47 +03:00
int ret ;
might_sleep ( ) ;
2011-11-03 17:41:13 +04:00
check_sdata_in_driver ( sdata ) ;
2011-05-11 18:09:36 +04:00
trace_drv_hw_scan ( local , sdata ) ;
2010-04-27 13:59:34 +04:00
ret = local - > ops - > hw_scan ( & local - > hw , & sdata - > vif , req ) ;
2010-06-10 12:56:20 +04:00
trace_drv_return_int ( local , ret ) ;
2009-07-07 15:46:22 +04:00
return ret ;
2009-04-23 20:52:52 +04:00
}
2011-06-13 13:47:30 +04:00
static inline void drv_cancel_hw_scan ( struct ieee80211_local * local ,
struct ieee80211_sub_if_data * sdata )
{
might_sleep ( ) ;
2011-11-03 17:41:13 +04:00
check_sdata_in_driver ( sdata ) ;
2011-06-13 13:47:30 +04:00
trace_drv_cancel_hw_scan ( local , sdata ) ;
local - > ops - > cancel_hw_scan ( & local - > hw , & sdata - > vif ) ;
trace_drv_return_void ( local ) ;
}
2011-05-11 18:09:36 +04:00
static inline int
drv_sched_scan_start ( struct ieee80211_local * local ,
struct ieee80211_sub_if_data * sdata ,
struct cfg80211_sched_scan_request * req ,
struct ieee80211_sched_scan_ies * ies )
{
int ret ;
might_sleep ( ) ;
2011-11-03 17:41:13 +04:00
check_sdata_in_driver ( sdata ) ;
2011-05-11 18:09:36 +04:00
trace_drv_sched_scan_start ( local , sdata ) ;
ret = local - > ops - > sched_scan_start ( & local - > hw , & sdata - > vif ,
req , ies ) ;
trace_drv_return_int ( local , ret ) ;
return ret ;
}
static inline void drv_sched_scan_stop ( struct ieee80211_local * local ,
struct ieee80211_sub_if_data * sdata )
{
might_sleep ( ) ;
2011-11-03 17:41:13 +04:00
check_sdata_in_driver ( sdata ) ;
2011-05-11 18:09:36 +04:00
trace_drv_sched_scan_stop ( local , sdata ) ;
local - > ops - > sched_scan_stop ( & local - > hw , & sdata - > vif ) ;
trace_drv_return_void ( local ) ;
}
2009-04-23 20:52:52 +04:00
static inline void drv_sw_scan_start ( struct ieee80211_local * local )
{
2009-12-23 15:15:47 +03:00
might_sleep ( ) ;
2010-06-10 12:56:20 +04:00
trace_drv_sw_scan_start ( local ) ;
2009-04-23 20:52:52 +04:00
if ( local - > ops - > sw_scan_start )
local - > ops - > sw_scan_start ( & local - > hw ) ;
2010-06-10 12:56:20 +04:00
trace_drv_return_void ( local ) ;
2009-04-23 20:52:52 +04:00
}
static inline void drv_sw_scan_complete ( struct ieee80211_local * local )
{
2009-12-23 15:15:47 +03:00
might_sleep ( ) ;
2010-06-10 12:56:20 +04:00
trace_drv_sw_scan_complete ( local ) ;
2009-04-23 20:52:52 +04:00
if ( local - > ops - > sw_scan_complete )
local - > ops - > sw_scan_complete ( & local - > hw ) ;
2010-06-10 12:56:20 +04:00
trace_drv_return_void ( local ) ;
2009-04-23 20:52:52 +04:00
}
static inline int drv_get_stats ( struct ieee80211_local * local ,
struct ieee80211_low_level_stats * stats )
{
2009-07-07 15:46:22 +04:00
int ret = - EOPNOTSUPP ;
2009-12-23 15:15:47 +03:00
might_sleep ( ) ;
2009-07-07 15:46:22 +04:00
if ( local - > ops - > get_stats )
ret = local - > ops - > get_stats ( & local - > hw , stats ) ;
trace_drv_get_stats ( local , stats , ret ) ;
return ret ;
2009-04-23 20:52:52 +04:00
}
static inline void drv_get_tkip_seq ( struct ieee80211_local * local ,
u8 hw_key_idx , u32 * iv32 , u16 * iv16 )
{
if ( local - > ops - > get_tkip_seq )
local - > ops - > get_tkip_seq ( & local - > hw , hw_key_idx , iv32 , iv16 ) ;
2009-07-07 15:46:22 +04:00
trace_drv_get_tkip_seq ( local , hw_key_idx , iv32 , iv16 ) ;
2009-04-23 20:52:52 +04:00
}
2010-11-08 12:51:06 +03:00
static inline int drv_set_frag_threshold ( struct ieee80211_local * local ,
u32 value )
{
int ret = 0 ;
might_sleep ( ) ;
trace_drv_set_frag_threshold ( local , value ) ;
if ( local - > ops - > set_frag_threshold )
ret = local - > ops - > set_frag_threshold ( & local - > hw , value ) ;
trace_drv_return_int ( local , ret ) ;
return ret ;
}
2009-04-23 20:52:52 +04:00
static inline int drv_set_rts_threshold ( struct ieee80211_local * local ,
u32 value )
{
2009-07-07 15:46:22 +04:00
int ret = 0 ;
2009-12-23 15:15:47 +03:00
might_sleep ( ) ;
2010-06-10 12:56:20 +04:00
trace_drv_set_rts_threshold ( local , value ) ;
2009-04-23 20:52:52 +04:00
if ( local - > ops - > set_rts_threshold )
2009-07-07 15:46:22 +04:00
ret = local - > ops - > set_rts_threshold ( & local - > hw , value ) ;
2010-06-10 12:56:20 +04:00
trace_drv_return_int ( local , ret ) ;
2009-07-07 15:46:22 +04:00
return ret ;
2009-04-23 20:52:52 +04:00
}
2009-12-22 00:50:48 +03:00
static inline int drv_set_coverage_class ( struct ieee80211_local * local ,
u8 value )
{
int ret = 0 ;
might_sleep ( ) ;
2010-06-10 12:56:20 +04:00
trace_drv_set_coverage_class ( local , value ) ;
2009-12-22 00:50:48 +03:00
if ( local - > ops - > set_coverage_class )
local - > ops - > set_coverage_class ( & local - > hw , value ) ;
else
ret = - EOPNOTSUPP ;
2010-06-10 12:56:20 +04:00
trace_drv_return_int ( local , ret ) ;
2009-12-22 00:50:48 +03:00
return ret ;
}
2009-04-23 20:52:52 +04:00
static inline void drv_sta_notify ( struct ieee80211_local * local ,
2009-11-25 22:30:31 +03:00
struct ieee80211_sub_if_data * sdata ,
2009-04-23 20:52:52 +04:00
enum sta_notify_cmd cmd ,
struct ieee80211_sta * sta )
{
2011-11-23 18:09:49 +04:00
sdata = get_bss_sdata ( sdata ) ;
2011-11-03 17:41:13 +04:00
check_sdata_in_driver ( sdata ) ;
2010-06-10 12:56:20 +04:00
trace_drv_sta_notify ( local , sdata , cmd , sta ) ;
2009-04-23 20:52:52 +04:00
if ( local - > ops - > sta_notify )
2009-11-25 22:30:31 +03:00
local - > ops - > sta_notify ( & local - > hw , & sdata - > vif , cmd , sta ) ;
2010-06-10 12:56:20 +04:00
trace_drv_return_void ( local ) ;
2009-04-23 20:52:52 +04:00
}
2010-02-03 15:59:58 +03:00
static inline int drv_sta_add ( struct ieee80211_local * local ,
struct ieee80211_sub_if_data * sdata ,
struct ieee80211_sta * sta )
{
int ret = 0 ;
might_sleep ( ) ;
2011-11-23 18:09:49 +04:00
sdata = get_bss_sdata ( sdata ) ;
2011-11-03 17:41:13 +04:00
check_sdata_in_driver ( sdata ) ;
2010-06-10 12:56:20 +04:00
trace_drv_sta_add ( local , sdata , sta ) ;
2010-02-03 15:59:58 +03:00
if ( local - > ops - > sta_add )
ret = local - > ops - > sta_add ( & local - > hw , & sdata - > vif , sta ) ;
2010-06-10 12:56:20 +04:00
trace_drv_return_int ( local , ret ) ;
2010-02-03 15:59:58 +03:00
return ret ;
}
static inline void drv_sta_remove ( struct ieee80211_local * local ,
struct ieee80211_sub_if_data * sdata ,
struct ieee80211_sta * sta )
{
might_sleep ( ) ;
2011-11-23 18:09:49 +04:00
sdata = get_bss_sdata ( sdata ) ;
2011-11-03 17:41:13 +04:00
check_sdata_in_driver ( sdata ) ;
2010-06-10 12:56:20 +04:00
trace_drv_sta_remove ( local , sdata , sta ) ;
2010-02-03 15:59:58 +03:00
if ( local - > ops - > sta_remove )
local - > ops - > sta_remove ( & local - > hw , & sdata - > vif , sta ) ;
2010-06-10 12:56:20 +04:00
trace_drv_return_void ( local ) ;
2010-02-03 15:59:58 +03:00
}
2012-01-20 16:55:21 +04:00
static inline __must_check
int drv_sta_state ( struct ieee80211_local * local ,
struct ieee80211_sub_if_data * sdata ,
struct sta_info * sta ,
enum ieee80211_sta_state old_state ,
enum ieee80211_sta_state new_state )
{
int ret = 0 ;
might_sleep ( ) ;
sdata = get_bss_sdata ( sdata ) ;
check_sdata_in_driver ( sdata ) ;
trace_drv_sta_state ( local , sdata , & sta - > sta , old_state , new_state ) ;
2012-01-20 16:55:22 +04:00
if ( local - > ops - > sta_state ) {
2012-01-20 16:55:21 +04:00
ret = local - > ops - > sta_state ( & local - > hw , & sdata - > vif , & sta - > sta ,
old_state , new_state ) ;
2012-01-20 16:55:22 +04:00
} else if ( old_state = = IEEE80211_STA_AUTH & &
new_state = = IEEE80211_STA_ASSOC ) {
ret = drv_sta_add ( local , sdata , & sta - > sta ) ;
if ( ret = = 0 )
sta - > uploaded = true ;
} else if ( old_state = = IEEE80211_STA_ASSOC & &
new_state = = IEEE80211_STA_AUTH ) {
drv_sta_remove ( local , sdata , & sta - > sta ) ;
}
2012-01-20 16:55:21 +04:00
trace_drv_return_int ( local , ret ) ;
return ret ;
}
2012-03-30 10:43:32 +04:00
static inline void drv_sta_rc_update ( struct ieee80211_local * local ,
struct ieee80211_sub_if_data * sdata ,
struct ieee80211_sta * sta , u32 changed )
{
sdata = get_bss_sdata ( sdata ) ;
check_sdata_in_driver ( sdata ) ;
2012-08-12 20:24:55 +04:00
WARN_ON ( changed & IEEE80211_RC_SUPP_RATES_CHANGED & &
sdata - > vif . type ! = NL80211_IFTYPE_ADHOC ) ;
2012-03-30 10:43:32 +04:00
trace_drv_sta_rc_update ( local , sdata , sta , changed ) ;
if ( local - > ops - > sta_rc_update )
local - > ops - > sta_rc_update ( & local - > hw , & sdata - > vif ,
sta , changed ) ;
trace_drv_return_void ( local ) ;
}
2011-09-25 21:06:54 +04:00
static inline int drv_conf_tx ( struct ieee80211_local * local ,
2012-03-28 13:04:24 +04:00
struct ieee80211_sub_if_data * sdata , u16 ac ,
2009-04-23 20:52:52 +04:00
const struct ieee80211_tx_queue_params * params )
{
2009-07-07 15:46:22 +04:00
int ret = - EOPNOTSUPP ;
2009-12-23 15:15:47 +03:00
might_sleep ( ) ;
2011-11-03 17:41:13 +04:00
check_sdata_in_driver ( sdata ) ;
2012-03-28 13:04:24 +04:00
trace_drv_conf_tx ( local , sdata , ac , params ) ;
2009-04-23 20:52:52 +04:00
if ( local - > ops - > conf_tx )
2011-10-02 12:15:52 +04:00
ret = local - > ops - > conf_tx ( & local - > hw , & sdata - > vif ,
2012-03-28 13:04:24 +04:00
ac , params ) ;
2010-06-10 12:56:20 +04:00
trace_drv_return_int ( local , ret ) ;
2009-07-07 15:46:22 +04:00
return ret ;
2009-04-23 20:52:52 +04:00
}
2011-09-21 15:06:11 +04:00
static inline u64 drv_get_tsf ( struct ieee80211_local * local ,
struct ieee80211_sub_if_data * sdata )
2009-04-23 20:52:52 +04:00
{
2009-07-07 15:46:22 +04:00
u64 ret = - 1ULL ;
2009-12-23 15:15:47 +03:00
might_sleep ( ) ;
2011-11-03 17:41:13 +04:00
check_sdata_in_driver ( sdata ) ;
2011-09-21 15:06:11 +04:00
trace_drv_get_tsf ( local , sdata ) ;
2009-04-23 20:52:52 +04:00
if ( local - > ops - > get_tsf )
2011-09-21 15:06:11 +04:00
ret = local - > ops - > get_tsf ( & local - > hw , & sdata - > vif ) ;
2010-06-10 12:56:20 +04:00
trace_drv_return_u64 ( local , ret ) ;
2009-07-07 15:46:22 +04:00
return ret ;
2009-04-23 20:52:52 +04:00
}
2011-09-21 15:06:11 +04:00
static inline void drv_set_tsf ( struct ieee80211_local * local ,
struct ieee80211_sub_if_data * sdata ,
u64 tsf )
2009-04-23 20:52:52 +04:00
{
2009-12-23 15:15:47 +03:00
might_sleep ( ) ;
2011-11-03 17:41:13 +04:00
check_sdata_in_driver ( sdata ) ;
2011-09-21 15:06:11 +04:00
trace_drv_set_tsf ( local , sdata , tsf ) ;
2009-04-23 20:52:52 +04:00
if ( local - > ops - > set_tsf )
2011-09-21 15:06:11 +04:00
local - > ops - > set_tsf ( & local - > hw , & sdata - > vif , tsf ) ;
2010-06-10 12:56:20 +04:00
trace_drv_return_void ( local ) ;
2009-04-23 20:52:52 +04:00
}
2011-09-21 15:06:11 +04:00
static inline void drv_reset_tsf ( struct ieee80211_local * local ,
struct ieee80211_sub_if_data * sdata )
2009-04-23 20:52:52 +04:00
{
2009-12-23 15:15:47 +03:00
might_sleep ( ) ;
2011-11-03 17:41:13 +04:00
check_sdata_in_driver ( sdata ) ;
2011-09-21 15:06:11 +04:00
trace_drv_reset_tsf ( local , sdata ) ;
2009-04-23 20:52:52 +04:00
if ( local - > ops - > reset_tsf )
2011-09-21 15:06:11 +04:00
local - > ops - > reset_tsf ( & local - > hw , & sdata - > vif ) ;
2010-06-10 12:56:20 +04:00
trace_drv_return_void ( local ) ;
2009-04-23 20:52:52 +04:00
}
static inline int drv_tx_last_beacon ( struct ieee80211_local * local )
{
2010-12-10 00:15:45 +03:00
int ret = 0 ; /* default unsuported op for less congestion */
2009-12-23 15:15:47 +03:00
might_sleep ( ) ;
2010-06-10 12:56:20 +04:00
trace_drv_tx_last_beacon ( local ) ;
2009-04-23 20:52:52 +04:00
if ( local - > ops - > tx_last_beacon )
2009-07-07 15:46:22 +04:00
ret = local - > ops - > tx_last_beacon ( & local - > hw ) ;
2010-06-10 12:56:20 +04:00
trace_drv_return_int ( local , ret ) ;
2009-07-07 15:46:22 +04:00
return ret ;
2009-04-23 20:52:52 +04:00
}
static inline int drv_ampdu_action ( struct ieee80211_local * local ,
2009-11-25 22:30:31 +03:00
struct ieee80211_sub_if_data * sdata ,
2009-04-23 20:52:52 +04:00
enum ieee80211_ampdu_mlme_action action ,
struct ieee80211_sta * sta , u16 tid ,
2011-01-18 15:51:05 +03:00
u16 * ssn , u8 buf_size )
2009-04-23 20:52:52 +04:00
{
2009-07-07 15:46:22 +04:00
int ret = - EOPNOTSUPP ;
2010-06-10 12:21:48 +04:00
might_sleep ( ) ;
2011-11-23 18:09:49 +04:00
sdata = get_bss_sdata ( sdata ) ;
2011-11-03 17:41:13 +04:00
check_sdata_in_driver ( sdata ) ;
2011-01-18 15:51:05 +03:00
trace_drv_ampdu_action ( local , sdata , action , sta , tid , ssn , buf_size ) ;
2010-06-10 12:56:20 +04:00
2009-04-23 20:52:52 +04:00
if ( local - > ops - > ampdu_action )
2009-11-25 22:30:31 +03:00
ret = local - > ops - > ampdu_action ( & local - > hw , & sdata - > vif , action ,
2011-01-18 15:51:05 +03:00
sta , tid , ssn , buf_size ) ;
2010-06-10 12:21:49 +04:00
2010-06-10 12:56:20 +04:00
trace_drv_return_int ( local , ret ) ;
2009-07-07 15:46:22 +04:00
return ret ;
2009-04-23 20:52:52 +04:00
}
2009-06-02 15:01:41 +04:00
2010-04-19 12:23:57 +04:00
static inline int drv_get_survey ( struct ieee80211_local * local , int idx ,
struct survey_info * survey )
{
int ret = - EOPNOTSUPP ;
2010-06-29 22:51:23 +04:00
trace_drv_get_survey ( local , idx , survey ) ;
2010-06-07 18:33:49 +04:00
if ( local - > ops - > get_survey )
2010-04-19 12:23:57 +04:00
ret = local - > ops - > get_survey ( & local - > hw , idx , survey ) ;
2010-06-29 22:51:23 +04:00
trace_drv_return_int ( local , ret ) ;
2010-04-19 12:23:57 +04:00
return ret ;
}
2009-06-02 15:01:41 +04:00
static inline void drv_rfkill_poll ( struct ieee80211_local * local )
{
2009-12-23 15:15:47 +03:00
might_sleep ( ) ;
2009-06-02 15:01:41 +04:00
if ( local - > ops - > rfkill_poll )
local - > ops - > rfkill_poll ( & local - > hw ) ;
}
2009-12-23 15:15:32 +03:00
static inline void drv_flush ( struct ieee80211_local * local , bool drop )
{
2009-12-23 15:15:47 +03:00
might_sleep ( ) ;
2009-12-23 15:15:32 +03:00
trace_drv_flush ( local , drop ) ;
if ( local - > ops - > flush )
local - > ops - > flush ( & local - > hw , drop ) ;
2010-06-10 12:56:20 +04:00
trace_drv_return_void ( local ) ;
2009-12-23 15:15:32 +03:00
}
2010-05-11 18:20:57 +04:00
static inline void drv_channel_switch ( struct ieee80211_local * local ,
struct ieee80211_channel_switch * ch_switch )
{
might_sleep ( ) ;
trace_drv_channel_switch ( local , ch_switch ) ;
2010-06-10 12:56:20 +04:00
local - > ops - > channel_switch ( & local - > hw , ch_switch ) ;
trace_drv_return_void ( local ) ;
2010-05-11 18:20:57 +04:00
}
2010-11-10 06:50:56 +03:00
static inline int drv_set_antenna ( struct ieee80211_local * local ,
u32 tx_ant , u32 rx_ant )
{
int ret = - EOPNOTSUPP ;
might_sleep ( ) ;
if ( local - > ops - > set_antenna )
ret = local - > ops - > set_antenna ( & local - > hw , tx_ant , rx_ant ) ;
trace_drv_set_antenna ( local , tx_ant , rx_ant , ret ) ;
return ret ;
}
static inline int drv_get_antenna ( struct ieee80211_local * local ,
u32 * tx_ant , u32 * rx_ant )
{
int ret = - EOPNOTSUPP ;
might_sleep ( ) ;
if ( local - > ops - > get_antenna )
ret = local - > ops - > get_antenna ( & local - > hw , tx_ant , rx_ant ) ;
trace_drv_get_antenna ( local , * tx_ant , * rx_ant , ret ) ;
return ret ;
}
2010-12-18 19:20:47 +03:00
static inline int drv_remain_on_channel ( struct ieee80211_local * local ,
struct ieee80211_channel * chan ,
enum nl80211_channel_type chantype ,
unsigned int duration )
{
int ret ;
might_sleep ( ) ;
trace_drv_remain_on_channel ( local , chan , chantype , duration ) ;
ret = local - > ops - > remain_on_channel ( & local - > hw , chan , chantype ,
duration ) ;
trace_drv_return_int ( local , ret ) ;
return ret ;
}
static inline int drv_cancel_remain_on_channel ( struct ieee80211_local * local )
{
int ret ;
might_sleep ( ) ;
trace_drv_cancel_remain_on_channel ( local ) ;
ret = local - > ops - > cancel_remain_on_channel ( & local - > hw ) ;
trace_drv_return_int ( local , ret ) ;
2011-02-25 17:36:57 +03:00
return ret ;
}
2011-03-08 00:19:18 +03:00
static inline int drv_set_ringparam ( struct ieee80211_local * local ,
u32 tx , u32 rx )
{
int ret = - ENOTSUPP ;
might_sleep ( ) ;
trace_drv_set_ringparam ( local , tx , rx ) ;
if ( local - > ops - > set_ringparam )
ret = local - > ops - > set_ringparam ( & local - > hw , tx , rx ) ;
trace_drv_return_int ( local , ret ) ;
return ret ;
}
static inline void drv_get_ringparam ( struct ieee80211_local * local ,
u32 * tx , u32 * tx_max , u32 * rx , u32 * rx_max )
{
might_sleep ( ) ;
trace_drv_get_ringparam ( local , tx , tx_max , rx , rx_max ) ;
if ( local - > ops - > get_ringparam )
local - > ops - > get_ringparam ( & local - > hw , tx , tx_max , rx , rx_max ) ;
trace_drv_return_void ( local ) ;
}
2011-04-06 10:11:10 +04:00
static inline bool drv_tx_frames_pending ( struct ieee80211_local * local )
{
bool ret = false ;
might_sleep ( ) ;
trace_drv_tx_frames_pending ( local ) ;
if ( local - > ops - > tx_frames_pending )
ret = local - > ops - > tx_frames_pending ( & local - > hw ) ;
trace_drv_return_bool ( local , ret ) ;
return ret ;
}
2011-04-27 15:26:51 +04:00
static inline int drv_set_bitrate_mask ( struct ieee80211_local * local ,
struct ieee80211_sub_if_data * sdata ,
const struct cfg80211_bitrate_mask * mask )
{
int ret = - EOPNOTSUPP ;
might_sleep ( ) ;
2011-11-03 17:41:13 +04:00
check_sdata_in_driver ( sdata ) ;
2011-04-27 15:26:51 +04:00
trace_drv_set_bitrate_mask ( local , sdata , mask ) ;
if ( local - > ops - > set_bitrate_mask )
ret = local - > ops - > set_bitrate_mask ( & local - > hw ,
& sdata - > vif , mask ) ;
trace_drv_return_int ( local , ret ) ;
return ret ;
}
2011-07-05 18:35:41 +04:00
static inline void drv_set_rekey_data ( struct ieee80211_local * local ,
struct ieee80211_sub_if_data * sdata ,
struct cfg80211_gtk_rekey_data * data )
{
2011-11-03 17:41:13 +04:00
check_sdata_in_driver ( sdata ) ;
2011-07-05 18:35:41 +04:00
trace_drv_set_rekey_data ( local , sdata , data ) ;
if ( local - > ops - > set_rekey_data )
local - > ops - > set_rekey_data ( & local - > hw , & sdata - > vif , data ) ;
trace_drv_return_void ( local ) ;
}
2011-07-08 19:46:22 +04:00
static inline void drv_rssi_callback ( struct ieee80211_local * local ,
const enum ieee80211_rssi_event event )
{
trace_drv_rssi_callback ( local , event ) ;
if ( local - > ops - > rssi_callback )
local - > ops - > rssi_callback ( & local - > hw , event ) ;
trace_drv_return_void ( local ) ;
}
2011-09-29 18:04:32 +04:00
static inline void
drv_release_buffered_frames ( struct ieee80211_local * local ,
struct sta_info * sta , u16 tids , int num_frames ,
enum ieee80211_frame_release_type reason ,
bool more_data )
{
trace_drv_release_buffered_frames ( local , & sta - > sta , tids , num_frames ,
reason , more_data ) ;
if ( local - > ops - > release_buffered_frames )
local - > ops - > release_buffered_frames ( & local - > hw , & sta - > sta , tids ,
num_frames , reason ,
more_data ) ;
trace_drv_return_void ( local ) ;
}
2011-09-29 18:04:38 +04:00
static inline void
drv_allow_buffered_frames ( struct ieee80211_local * local ,
struct sta_info * sta , u16 tids , int num_frames ,
enum ieee80211_frame_release_type reason ,
bool more_data )
{
trace_drv_allow_buffered_frames ( local , & sta - > sta , tids , num_frames ,
reason , more_data ) ;
if ( local - > ops - > allow_buffered_frames )
local - > ops - > allow_buffered_frames ( & local - > hw , & sta - > sta ,
tids , num_frames , reason ,
more_data ) ;
trace_drv_return_void ( local ) ;
}
2012-06-21 11:56:46 +04:00
static inline int drv_get_rssi ( struct ieee80211_local * local ,
struct ieee80211_sub_if_data * sdata ,
struct ieee80211_sta * sta ,
s8 * rssi_dbm )
{
int ret ;
might_sleep ( ) ;
ret = local - > ops - > get_rssi ( & local - > hw , & sdata - > vif , sta , rssi_dbm ) ;
trace_drv_get_rssi ( local , sta , * rssi_dbm , ret ) ;
return ret ;
}
2012-06-27 15:18:36 +04:00
static inline void drv_mgd_prepare_tx ( struct ieee80211_local * local ,
struct ieee80211_sub_if_data * sdata )
{
might_sleep ( ) ;
check_sdata_in_driver ( sdata ) ;
WARN_ON_ONCE ( sdata - > vif . type ! = NL80211_IFTYPE_STATION ) ;
trace_drv_mgd_prepare_tx ( local , sdata ) ;
if ( local - > ops - > mgd_prepare_tx )
local - > ops - > mgd_prepare_tx ( & local - > hw , & sdata - > vif ) ;
trace_drv_return_void ( local ) ;
}
2012-06-26 16:37:17 +04:00
static inline int drv_add_chanctx ( struct ieee80211_local * local ,
struct ieee80211_chanctx * ctx )
{
int ret = - EOPNOTSUPP ;
trace_drv_add_chanctx ( local , ctx ) ;
if ( local - > ops - > add_chanctx )
ret = local - > ops - > add_chanctx ( & local - > hw , & ctx - > conf ) ;
trace_drv_return_int ( local , ret ) ;
return ret ;
}
static inline void drv_remove_chanctx ( struct ieee80211_local * local ,
struct ieee80211_chanctx * ctx )
{
trace_drv_remove_chanctx ( local , ctx ) ;
if ( local - > ops - > remove_chanctx )
local - > ops - > remove_chanctx ( & local - > hw , & ctx - > conf ) ;
trace_drv_return_void ( local ) ;
}
static inline void drv_change_chanctx ( struct ieee80211_local * local ,
struct ieee80211_chanctx * ctx ,
u32 changed )
{
trace_drv_change_chanctx ( local , ctx , changed ) ;
if ( local - > ops - > change_chanctx )
local - > ops - > change_chanctx ( & local - > hw , & ctx - > conf , changed ) ;
trace_drv_return_void ( local ) ;
}
static inline int drv_assign_vif_chanctx ( struct ieee80211_local * local ,
struct ieee80211_sub_if_data * sdata ,
struct ieee80211_chanctx * ctx )
{
int ret = 0 ;
check_sdata_in_driver ( sdata ) ;
trace_drv_assign_vif_chanctx ( local , sdata , ctx ) ;
if ( local - > ops - > assign_vif_chanctx )
ret = local - > ops - > assign_vif_chanctx ( & local - > hw ,
& sdata - > vif ,
& ctx - > conf ) ;
trace_drv_return_int ( local , ret ) ;
return ret ;
}
static inline void drv_unassign_vif_chanctx ( struct ieee80211_local * local ,
struct ieee80211_sub_if_data * sdata ,
struct ieee80211_chanctx * ctx )
{
check_sdata_in_driver ( sdata ) ;
trace_drv_unassign_vif_chanctx ( local , sdata , ctx ) ;
if ( local - > ops - > unassign_vif_chanctx )
local - > ops - > unassign_vif_chanctx ( & local - > hw ,
& sdata - > vif ,
& ctx - > conf ) ;
trace_drv_return_void ( local ) ;
}
2012-10-19 17:44:42 +04:00
static inline int drv_start_ap ( struct ieee80211_local * local ,
struct ieee80211_sub_if_data * sdata )
{
int ret = 0 ;
check_sdata_in_driver ( sdata ) ;
trace_drv_start_ap ( local , sdata , & sdata - > vif . bss_conf ) ;
if ( local - > ops - > start_ap )
ret = local - > ops - > start_ap ( & local - > hw , & sdata - > vif ) ;
trace_drv_return_int ( local , ret ) ;
return ret ;
}
static inline void drv_stop_ap ( struct ieee80211_local * local ,
struct ieee80211_sub_if_data * sdata )
{
check_sdata_in_driver ( sdata ) ;
trace_drv_stop_ap ( local , sdata ) ;
if ( local - > ops - > stop_ap )
local - > ops - > stop_ap ( & local - > hw , & sdata - > vif ) ;
trace_drv_return_void ( local ) ;
}
2009-04-23 20:52:52 +04:00
# endif /* __MAC80211_DRIVER_OPS */