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
2014-04-30 16:19:04 +04:00
static inline bool check_sdata_in_driver ( struct ieee80211_sub_if_data * sdata )
2011-11-03 17:41:13 +04:00
{
2014-04-30 16:19:04 +04:00
return ! WARN ( ! ( sdata - > flags & IEEE80211_SDATA_IN_DRIVER ) ,
" %s: Failed check-sdata-in-driver check, flags: 0x%x \n " ,
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 & &
2013-05-28 15:01:53 +04:00
! ( local - > hw . flags & IEEE80211_HW_WANT_MONITOR_VIF ) & &
! ( sdata - > u . mntr_flags & MONITOR_FLAG_ACTIVE ) ) ) )
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 ( ) ;
2014-04-30 16:19:04 +04:00
if ( ! check_sdata_in_driver ( sdata ) )
return - EIO ;
2011-11-03 17:41:13 +04:00
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 ( ) ;
2014-04-30 16:19:04 +04:00
if ( ! check_sdata_in_driver ( sdata ) )
return ;
2011-11-03 17:41:13 +04:00
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 ( ) ;
2013-02-13 16:50:51 +04:00
if ( WARN_ON_ONCE ( changed & ( BSS_CHANGED_BEACON |
BSS_CHANGED_BEACON_ENABLED ) & &
sdata - > vif . type ! = NL80211_IFTYPE_AP & &
sdata - > vif . type ! = NL80211_IFTYPE_ADHOC & &
sdata - > vif . type ! = NL80211_IFTYPE_MESH_POINT ) )
return ;
if ( WARN_ON_ONCE ( sdata - > vif . type = = NL80211_IFTYPE_P2P_DEVICE | |
sdata - > vif . type = = NL80211_IFTYPE_MONITOR ) )
return ;
2012-12-14 17:22:10 +04:00
2014-04-30 16:19:04 +04:00
if ( ! check_sdata_in_driver ( sdata ) )
return ;
2011-11-03 17:41:13 +04:00
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 ) ;
2014-04-30 16:19:04 +04:00
if ( ! check_sdata_in_driver ( sdata ) )
return - EIO ;
2011-11-03 17:41:13 +04:00
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 ) ;
2014-04-30 16:19:04 +04:00
if ( ! check_sdata_in_driver ( sdata ) )
return ;
2011-11-03 17:41:13 +04:00
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 ,
2014-02-05 17:21:13 +04:00
struct ieee80211_scan_request * req )
2009-04-23 20:52:52 +04:00
{
2009-12-23 15:15:47 +03:00
int ret ;
might_sleep ( ) ;
2014-04-30 16:19:04 +04:00
if ( ! check_sdata_in_driver ( sdata ) )
return - EIO ;
2011-11-03 17:41:13 +04:00
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 ( ) ;
2014-04-30 16:19:04 +04:00
if ( ! check_sdata_in_driver ( sdata ) )
return ;
2011-11-03 17:41:13 +04:00
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 ,
2014-02-06 18:15:23 +04:00
struct ieee80211_scan_ies * ies )
2011-05-11 18:09:36 +04:00
{
int ret ;
might_sleep ( ) ;
2014-04-30 16:19:04 +04:00
if ( ! check_sdata_in_driver ( sdata ) )
return - EIO ;
2011-11-03 17:41:13 +04:00
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 ;
}
2014-02-17 13:48:17 +04:00
static inline int drv_sched_scan_stop ( struct ieee80211_local * local ,
struct ieee80211_sub_if_data * sdata )
2011-05-11 18:09:36 +04:00
{
2014-02-17 13:48:17 +04:00
int ret ;
2011-05-11 18:09:36 +04:00
might_sleep ( ) ;
2014-04-30 16:19:04 +04:00
if ( ! check_sdata_in_driver ( sdata ) )
return - EIO ;
2011-11-03 17:41:13 +04:00
2011-05-11 18:09:36 +04:00
trace_drv_sched_scan_stop ( local , sdata ) ;
2014-02-17 13:48:17 +04:00
ret = local - > ops - > sched_scan_stop ( & local - > hw , & sdata - > vif ) ;
trace_drv_return_int ( local , ret ) ;
return ret ;
2011-05-11 18:09:36 +04:00
}
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 ,
2014-09-05 01:57:41 +04:00
s16 value )
2009-12-22 00:50:48 +03:00
{
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 ) ;
2014-04-30 16:19:04 +04:00
if ( ! check_sdata_in_driver ( sdata ) )
return ;
2011-11-03 17:41:13 +04:00
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 ) ;
2014-04-30 16:19:04 +04:00
if ( ! check_sdata_in_driver ( sdata ) )
return - EIO ;
2011-11-03 17:41:13 +04:00
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 ) ;
2014-04-30 16:19:04 +04:00
if ( ! check_sdata_in_driver ( sdata ) )
return ;
2011-11-03 17:41:13 +04:00
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-11-20 07:16:02 +04:00
# ifdef CONFIG_MAC80211_DEBUGFS
static inline void drv_sta_add_debugfs ( struct ieee80211_local * local ,
struct ieee80211_sub_if_data * sdata ,
struct ieee80211_sta * sta ,
struct dentry * dir )
{
might_sleep ( ) ;
sdata = get_bss_sdata ( sdata ) ;
2014-04-30 16:19:04 +04:00
if ( ! check_sdata_in_driver ( sdata ) )
return ;
2012-11-20 07:16:02 +04:00
if ( local - > ops - > sta_add_debugfs )
local - > ops - > sta_add_debugfs ( & local - > hw , & sdata - > vif ,
sta , dir ) ;
}
static inline void drv_sta_remove_debugfs ( struct ieee80211_local * local ,
struct ieee80211_sub_if_data * sdata ,
struct ieee80211_sta * sta ,
struct dentry * dir )
{
might_sleep ( ) ;
sdata = get_bss_sdata ( sdata ) ;
check_sdata_in_driver ( sdata ) ;
if ( local - > ops - > sta_remove_debugfs )
local - > ops - > sta_remove_debugfs ( & local - > hw , & sdata - > vif ,
sta , dir ) ;
}
# endif
2013-12-05 01:39:17 +04:00
static inline void drv_sta_pre_rcu_remove ( struct ieee80211_local * local ,
struct ieee80211_sub_if_data * sdata ,
struct sta_info * sta )
{
might_sleep ( ) ;
sdata = get_bss_sdata ( sdata ) ;
2014-04-30 16:19:04 +04:00
if ( ! check_sdata_in_driver ( sdata ) )
return ;
2013-12-05 01:39:17 +04:00
trace_drv_sta_pre_rcu_remove ( local , sdata , & sta - > sta ) ;
if ( local - > ops - > sta_pre_rcu_remove )
local - > ops - > sta_pre_rcu_remove ( & local - > hw , & sdata - > vif ,
& sta - > sta ) ;
trace_drv_return_void ( local ) ;
}
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 ) ;
2014-04-30 16:19:04 +04:00
if ( ! check_sdata_in_driver ( sdata ) )
return - EIO ;
2012-01-20 16:55:21 +04:00
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 ) ;
2014-04-30 16:19:04 +04:00
if ( ! check_sdata_in_driver ( sdata ) )
return ;
2012-03-30 10:43:32 +04:00
2012-08-12 20:24:55 +04:00
WARN_ON ( changed & IEEE80211_RC_SUPP_RATES_CHANGED & &
2013-01-24 00:18:13 +04:00
( sdata - > vif . type ! = NL80211_IFTYPE_ADHOC & &
sdata - > vif . type ! = NL80211_IFTYPE_MESH_POINT ) ) ;
2012-08-12 20:24:55 +04:00
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 ( ) ;
2014-04-30 16:19:04 +04:00
if ( ! check_sdata_in_driver ( sdata ) )
return - EIO ;
2011-11-03 17:41:13 +04:00
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 ( ) ;
2014-04-30 16:19:04 +04:00
if ( ! check_sdata_in_driver ( sdata ) )
return ret ;
2011-11-03 17:41:13 +04:00
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 ( ) ;
2014-04-30 16:19:04 +04:00
if ( ! check_sdata_in_driver ( sdata ) )
return ;
2011-11-03 17:41:13 +04:00
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 ( ) ;
2014-04-30 16:19:04 +04:00
if ( ! check_sdata_in_driver ( sdata ) )
return ;
2011-11-03 17:41:13 +04:00
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 )
{
2012-08-22 14:11:26 +04:00
int ret = 0 ; /* default unsupported 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 ) ;
2014-04-30 16:19:04 +04:00
if ( ! check_sdata_in_driver ( sdata ) )
return - EIO ;
2011-11-03 17:41:13 +04:00
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
2013-02-13 15:11:00 +04:00
static inline void drv_flush ( struct ieee80211_local * local ,
2014-03-27 13:30:29 +04:00
struct ieee80211_sub_if_data * sdata ,
2013-02-13 15:11:00 +04:00
u32 queues , bool drop )
2009-12-23 15:15:32 +03:00
{
2014-03-27 13:30:29 +04:00
struct ieee80211_vif * vif = sdata ? & sdata - > vif : NULL ;
2009-12-23 15:15:47 +03:00
might_sleep ( ) ;
2014-04-30 16:19:04 +04:00
if ( sdata & & ! check_sdata_in_driver ( sdata ) )
return ;
2014-03-27 13:30:29 +04:00
2013-02-13 15:11:00 +04:00
trace_drv_flush ( local , queues , drop ) ;
2009-12-23 15:15:32 +03:00
if ( local - > ops - > flush )
2014-03-27 13:30:29 +04:00
local - > ops - > flush ( & local - > hw , vif , queues , 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 ,
2012-11-19 19:05:09 +04:00
struct ieee80211_sub_if_data * sdata ,
2010-12-18 19:20:47 +03:00
struct ieee80211_channel * chan ,
2013-02-12 11:34:13 +04:00
unsigned int duration ,
enum ieee80211_roc_type type )
2010-12-18 19:20:47 +03:00
{
int ret ;
might_sleep ( ) ;
2013-02-12 11:34:13 +04:00
trace_drv_remain_on_channel ( local , sdata , chan , duration , type ) ;
2012-11-19 19:05:09 +04:00
ret = local - > ops - > remain_on_channel ( & local - > hw , & sdata - > vif ,
2013-02-12 11:34:13 +04:00
chan , duration , type ) ;
2010-12-18 19:20:47 +03:00
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 ( ) ;
2014-04-30 16:19:04 +04:00
if ( ! check_sdata_in_driver ( sdata ) )
return - EIO ;
2011-11-03 17:41:13 +04:00
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 )
{
2014-04-30 16:19:04 +04:00
if ( ! check_sdata_in_driver ( sdata ) )
return ;
2011-11-03 17:41:13 +04:00
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 ,
2013-01-20 19:32:41 +04:00
struct ieee80211_sub_if_data * sdata ,
2011-07-08 19:46:22 +04:00
const enum ieee80211_rssi_event event )
{
2013-01-20 19:32:41 +04:00
trace_drv_rssi_callback ( local , sdata , event ) ;
2011-07-08 19:46:22 +04:00
if ( local - > ops - > rssi_callback )
2013-01-20 19:32:41 +04:00
local - > ops - > rssi_callback ( & local - > hw , & sdata - > vif , event ) ;
2011-07-08 19:46:22 +04:00
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 ( ) ;
2014-04-30 16:19:04 +04:00
if ( ! check_sdata_in_driver ( sdata ) )
return ;
2012-06-27 15:18:36 +04:00
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
2014-06-11 18:18:27 +04:00
static inline void
drv_mgd_protect_tdls_discover ( struct ieee80211_local * local ,
struct ieee80211_sub_if_data * sdata )
{
might_sleep ( ) ;
if ( ! check_sdata_in_driver ( sdata ) )
return ;
WARN_ON_ONCE ( sdata - > vif . type ! = NL80211_IFTYPE_STATION ) ;
trace_drv_mgd_protect_tdls_discover ( local , sdata ) ;
if ( local - > ops - > mgd_protect_tdls_discover )
local - > ops - > mgd_protect_tdls_discover ( & 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 ) ;
2012-12-13 20:42:30 +04:00
if ( ! ret )
ctx - > driver_present = true ;
2012-06-26 16:37:17 +04:00
return ret ;
}
static inline void drv_remove_chanctx ( struct ieee80211_local * local ,
struct ieee80211_chanctx * ctx )
{
2014-04-30 16:19:04 +04:00
if ( WARN_ON ( ! ctx - > driver_present ) )
return ;
2012-06-26 16:37:17 +04:00
trace_drv_remove_chanctx ( local , ctx ) ;
if ( local - > ops - > remove_chanctx )
local - > ops - > remove_chanctx ( & local - > hw , & ctx - > conf ) ;
trace_drv_return_void ( local ) ;
2012-12-13 20:42:30 +04:00
ctx - > driver_present = false ;
2012-06-26 16:37:17 +04:00
}
static inline void drv_change_chanctx ( struct ieee80211_local * local ,
struct ieee80211_chanctx * ctx ,
u32 changed )
{
trace_drv_change_chanctx ( local , ctx , changed ) ;
2012-12-13 20:42:30 +04:00
if ( local - > ops - > change_chanctx ) {
WARN_ON_ONCE ( ! ctx - > driver_present ) ;
2012-06-26 16:37:17 +04:00
local - > ops - > change_chanctx ( & local - > hw , & ctx - > conf , changed ) ;
2012-12-13 20:42:30 +04:00
}
2012-06-26 16:37:17 +04:00
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 ;
2014-04-30 16:19:04 +04:00
if ( ! check_sdata_in_driver ( sdata ) )
return - EIO ;
2012-06-26 16:37:17 +04:00
trace_drv_assign_vif_chanctx ( local , sdata , ctx ) ;
2012-12-13 20:42:30 +04:00
if ( local - > ops - > assign_vif_chanctx ) {
WARN_ON_ONCE ( ! ctx - > driver_present ) ;
2012-06-26 16:37:17 +04:00
ret = local - > ops - > assign_vif_chanctx ( & local - > hw ,
& sdata - > vif ,
& ctx - > conf ) ;
2012-12-13 20:42:30 +04:00
}
2012-06-26 16:37:17 +04:00
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 )
{
2014-04-30 16:19:04 +04:00
if ( ! check_sdata_in_driver ( sdata ) )
return ;
2012-06-26 16:37:17 +04:00
trace_drv_unassign_vif_chanctx ( local , sdata , ctx ) ;
2012-12-13 20:42:30 +04:00
if ( local - > ops - > unassign_vif_chanctx ) {
WARN_ON_ONCE ( ! ctx - > driver_present ) ;
2012-06-26 16:37:17 +04:00
local - > ops - > unassign_vif_chanctx ( & local - > hw ,
& sdata - > vif ,
& ctx - > conf ) ;
2012-12-13 20:42:30 +04:00
}
2012-06-26 16:37:17 +04:00
trace_drv_return_void ( local ) ;
}
2014-05-23 15:33:12 +04:00
static inline int
drv_switch_vif_chanctx ( struct ieee80211_local * local ,
struct ieee80211_vif_chanctx_switch * vifs ,
int n_vifs ,
enum ieee80211_chanctx_switch_mode mode )
{
int ret = 0 ;
int i ;
if ( ! local - > ops - > switch_vif_chanctx )
return - EOPNOTSUPP ;
for ( i = 0 ; i < n_vifs ; i + + ) {
struct ieee80211_chanctx * new_ctx =
container_of ( vifs [ i ] . new_ctx ,
struct ieee80211_chanctx ,
conf ) ;
struct ieee80211_chanctx * old_ctx =
container_of ( vifs [ i ] . old_ctx ,
struct ieee80211_chanctx ,
conf ) ;
WARN_ON_ONCE ( ! old_ctx - > driver_present ) ;
WARN_ON_ONCE ( ( mode = = CHANCTX_SWMODE_SWAP_CONTEXTS & &
new_ctx - > driver_present ) | |
( mode = = CHANCTX_SWMODE_REASSIGN_VIF & &
! new_ctx - > driver_present ) ) ;
}
trace_drv_switch_vif_chanctx ( local , vifs , n_vifs , mode ) ;
ret = local - > ops - > switch_vif_chanctx ( & local - > hw ,
vifs , n_vifs , mode ) ;
trace_drv_return_int ( local , ret ) ;
if ( ! ret & & mode = = CHANCTX_SWMODE_SWAP_CONTEXTS ) {
for ( i = 0 ; i < n_vifs ; i + + ) {
struct ieee80211_chanctx * new_ctx =
container_of ( vifs [ i ] . new_ctx ,
struct ieee80211_chanctx ,
conf ) ;
struct ieee80211_chanctx * old_ctx =
container_of ( vifs [ i ] . old_ctx ,
struct ieee80211_chanctx ,
conf ) ;
new_ctx - > driver_present = true ;
old_ctx - > driver_present = false ;
}
}
return ret ;
}
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 ;
2014-04-30 16:19:04 +04:00
if ( ! check_sdata_in_driver ( sdata ) )
return - EIO ;
2012-10-19 17:44:42 +04:00
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 )
{
2014-04-30 16:19:04 +04:00
if ( ! check_sdata_in_driver ( sdata ) )
return ;
2012-10-19 17:44:42 +04:00
trace_drv_stop_ap ( local , sdata ) ;
if ( local - > ops - > stop_ap )
local - > ops - > stop_ap ( & local - > hw , & sdata - > vif ) ;
trace_drv_return_void ( local ) ;
}
2012-11-06 22:18:13 +04:00
static inline void drv_restart_complete ( struct ieee80211_local * local )
{
might_sleep ( ) ;
trace_drv_restart_complete ( local ) ;
if ( local - > ops - > restart_complete )
local - > ops - > restart_complete ( & local - > hw ) ;
trace_drv_return_void ( local ) ;
}
2012-05-30 12:36:39 +04:00
static inline void
drv_set_default_unicast_key ( struct ieee80211_local * local ,
struct ieee80211_sub_if_data * sdata ,
int key_idx )
{
2014-04-30 16:19:04 +04:00
if ( ! check_sdata_in_driver ( sdata ) )
return ;
2012-05-30 12:36:39 +04:00
WARN_ON_ONCE ( key_idx < - 1 | | key_idx > 3 ) ;
trace_drv_set_default_unicast_key ( local , sdata , key_idx ) ;
if ( local - > ops - > set_default_unicast_key )
local - > ops - > set_default_unicast_key ( & local - > hw , & sdata - > vif ,
key_idx ) ;
trace_drv_return_void ( local ) ;
}
2013-01-14 18:14:34 +04:00
# if IS_ENABLED(CONFIG_IPV6)
static inline void drv_ipv6_addr_change ( struct ieee80211_local * local ,
struct ieee80211_sub_if_data * sdata ,
struct inet6_dev * idev )
{
trace_drv_ipv6_addr_change ( local , sdata ) ;
if ( local - > ops - > ipv6_addr_change )
local - > ops - > ipv6_addr_change ( & local - > hw , & sdata - > vif , idev ) ;
trace_drv_return_void ( local ) ;
}
# endif
2013-07-11 18:09:06 +04:00
static inline void
drv_channel_switch_beacon ( struct ieee80211_sub_if_data * sdata ,
struct cfg80211_chan_def * chandef )
{
struct ieee80211_local * local = sdata - > local ;
if ( local - > ops - > channel_switch_beacon ) {
trace_drv_channel_switch_beacon ( local , sdata , chandef ) ;
local - > ops - > channel_switch_beacon ( & local - > hw , & sdata - > vif ,
chandef ) ;
}
}
2013-08-19 20:48:41 +04:00
static inline int drv_join_ibss ( struct ieee80211_local * local ,
struct ieee80211_sub_if_data * sdata )
{
int ret = 0 ;
might_sleep ( ) ;
2014-04-30 16:19:04 +04:00
if ( ! check_sdata_in_driver ( sdata ) )
return - EIO ;
2013-08-19 20:48:41 +04:00
trace_drv_join_ibss ( local , sdata , & sdata - > vif . bss_conf ) ;
if ( local - > ops - > join_ibss )
ret = local - > ops - > join_ibss ( & local - > hw , & sdata - > vif ) ;
trace_drv_return_int ( local , ret ) ;
return ret ;
}
static inline void drv_leave_ibss ( struct ieee80211_local * local ,
struct ieee80211_sub_if_data * sdata )
{
might_sleep ( ) ;
2014-04-30 16:19:04 +04:00
if ( ! check_sdata_in_driver ( sdata ) )
return ;
2013-08-19 20:48:41 +04:00
trace_drv_leave_ibss ( local , sdata ) ;
if ( local - > ops - > leave_ibss )
local - > ops - > leave_ibss ( & local - > hw , & sdata - > vif ) ;
trace_drv_return_void ( local ) ;
}
2014-05-19 23:53:20 +04:00
static inline u32 drv_get_expected_throughput ( struct ieee80211_local * local ,
struct ieee80211_sta * sta )
{
u32 ret = 0 ;
trace_drv_get_expected_throughput ( sta ) ;
if ( local - > ops - > get_expected_throughput )
ret = local - > ops - > get_expected_throughput ( sta ) ;
trace_drv_return_u32 ( local , ret ) ;
return ret ;
}
2009-04-23 20:52:52 +04:00
# endif /* __MAC80211_DRIVER_OPS */