2016-03-03 00:46:14 +03:00
/*
* Portions of this file
* Copyright ( c ) 2016 Intel Deutschland GmbH
*/
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
}
2016-03-03 00:46:14 +03:00
static inline void drv_sync_rx_queues ( struct ieee80211_local * local ,
struct sta_info * sta )
{
if ( local - > ops - > sync_rx_queues ) {
trace_drv_sync_rx_queues ( local , sta - > sdata , & sta - > sta ) ;
local - > ops - > sync_rx_queues ( & local - > hw ) ;
trace_drv_return_void ( local ) ;
}
}
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 ;
}
2015-10-25 11:59:36 +03:00
int drv_start ( struct ieee80211_local * local ) ;
void drv_stop ( struct ieee80211_local * local ) ;
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
2015-09-18 16:19:38 +03:00
int drv_add_interface ( struct ieee80211_local * local ,
struct ieee80211_sub_if_data * sdata ) ;
2011-11-03 17:41:13 +04:00
2015-09-18 16:19:38 +03:00
int drv_change_interface ( struct ieee80211_local * local ,
struct ieee80211_sub_if_data * sdata ,
enum nl80211_iftype type , bool p2p ) ;
2011-11-03 17:41:13 +04:00
2015-09-18 16:19:38 +03:00
void drv_remove_interface ( struct ieee80211_local * local ,
struct ieee80211_sub_if_data * sdata ) ;
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 & &
2014-11-03 12:33:19 +03:00
sdata - > vif . type ! = NL80211_IFTYPE_MESH_POINT & &
sdata - > vif . type ! = NL80211_IFTYPE_OCB ) )
2013-02-13 16:50:51 +04:00
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
}
2015-08-15 22:39:50 +03:00
static inline void drv_config_iface_filter ( struct ieee80211_local * local ,
struct ieee80211_sub_if_data * sdata ,
unsigned int filter_flags ,
unsigned int changed_flags )
{
might_sleep ( ) ;
trace_drv_config_iface_filter ( local , sdata , filter_flags ,
changed_flags ) ;
if ( local - > ops - > config_iface_filter )
local - > ops - > config_iface_filter ( & local - > hw , & sdata - > vif ,
filter_flags ,
changed_flags ) ;
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
}
2014-06-13 00:24:31 +04:00
static inline void drv_sw_scan_start ( struct ieee80211_local * local ,
struct ieee80211_sub_if_data * sdata ,
const u8 * mac_addr )
2009-04-23 20:52:52 +04:00
{
2009-12-23 15:15:47 +03:00
might_sleep ( ) ;
2014-06-13 00:24:31 +04:00
trace_drv_sw_scan_start ( local , sdata , mac_addr ) ;
2009-04-23 20:52:52 +04:00
if ( local - > ops - > sw_scan_start )
2014-06-13 00:24:31 +04:00
local - > ops - > sw_scan_start ( & local - > hw , & sdata - > vif , mac_addr ) ;
2010-06-10 12:56:20 +04:00
trace_drv_return_void ( local ) ;
2009-04-23 20:52:52 +04:00
}
2014-06-13 00:24:31 +04:00
static inline void drv_sw_scan_complete ( 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-06-13 00:24:31 +04:00
trace_drv_sw_scan_complete ( local , sdata ) ;
2009-04-23 20:52:52 +04:00
if ( local - > ops - > sw_scan_complete )
2014-06-13 00:24:31 +04:00
local - > ops - > sw_scan_complete ( & 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_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
}
2015-04-20 19:12:41 +03:00
static inline void drv_get_key_seq ( struct ieee80211_local * local ,
struct ieee80211_key * key ,
struct ieee80211_key_seq * seq )
2009-04-23 20:52:52 +04:00
{
2015-04-20 19:12:41 +03:00
if ( local - > ops - > get_key_seq )
local - > ops - > get_key_seq ( & local - > hw , & key - > conf , seq ) ;
trace_drv_get_key_seq ( local , & key - > conf ) ;
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 ) ;
}
2015-07-15 15:56:05 +03:00
__must_check
2012-01-20 16:55:21 +04:00
int drv_sta_state ( struct ieee80211_local * local ,
struct ieee80211_sub_if_data * sdata ,
struct sta_info * sta ,
enum ieee80211_sta_state old_state ,
2015-07-15 15:56:05 +03:00
enum ieee80211_sta_state new_state ) ;
2012-01-20 16:55:21 +04:00
2015-09-18 16:19:35 +03:00
void drv_sta_rc_update ( struct ieee80211_local * local ,
struct ieee80211_sub_if_data * sdata ,
struct ieee80211_sta * sta , u32 changed ) ;
2012-03-30 10:43:32 +04:00
2014-11-19 02:10:42 +03:00
static inline void drv_sta_rate_tbl_update ( struct ieee80211_local * local ,
struct ieee80211_sub_if_data * sdata ,
struct ieee80211_sta * sta )
{
sdata = get_bss_sdata ( sdata ) ;
if ( ! check_sdata_in_driver ( sdata ) )
return ;
trace_drv_sta_rate_tbl_update ( local , sdata , sta ) ;
if ( local - > ops - > sta_rate_tbl_update )
local - > ops - > sta_rate_tbl_update ( & local - > hw , & sdata - > vif , sta ) ;
trace_drv_return_void ( local ) ;
}
2014-11-17 13:35:23 +03:00
static inline void drv_sta_statistics ( struct ieee80211_local * local ,
struct ieee80211_sub_if_data * sdata ,
struct ieee80211_sta * sta ,
struct station_info * sinfo )
{
sdata = get_bss_sdata ( sdata ) ;
if ( ! check_sdata_in_driver ( sdata ) )
return ;
trace_drv_sta_statistics ( local , sdata , sta ) ;
if ( local - > ops - > sta_statistics )
local - > ops - > sta_statistics ( & local - > hw , & sdata - > vif , sta , sinfo ) ;
trace_drv_return_void ( local ) ;
}
2015-09-18 16:19:34 +03:00
int drv_conf_tx ( struct ieee80211_local * local ,
struct ieee80211_sub_if_data * sdata , u16 ac ,
const struct ieee80211_tx_queue_params * params ) ;
2009-04-23 20:52:52 +04:00
2015-09-23 15:18:36 +03:00
u64 drv_get_tsf ( struct ieee80211_local * local ,
struct ieee80211_sub_if_data * sdata ) ;
void drv_set_tsf ( struct ieee80211_local * local ,
struct ieee80211_sub_if_data * sdata ,
u64 tsf ) ;
void drv_reset_tsf ( struct ieee80211_local * local ,
struct ieee80211_sub_if_data * sdata ) ;
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
}
2015-09-23 15:18:35 +03:00
int drv_ampdu_action ( struct ieee80211_local * local ,
struct ieee80211_sub_if_data * sdata ,
2015-12-30 17:06:04 +03:00
struct ieee80211_ampdu_params * params ) ;
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 ,
2014-10-08 10:48:40 +04:00
struct ieee80211_sub_if_data * sdata ,
struct ieee80211_channel_switch * ch_switch )
2010-05-11 18:20:57 +04:00
{
might_sleep ( ) ;
2014-10-08 10:48:40 +04:00
trace_drv_channel_switch ( local , sdata , ch_switch ) ;
local - > ops - > channel_switch ( & local - > hw , & sdata - > vif , ch_switch ) ;
2010-06-10 12:56:20 +04:00
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 ) ;
}
2015-03-17 00:23:34 +03:00
static inline void drv_event_callback ( struct ieee80211_local * local ,
struct ieee80211_sub_if_data * sdata ,
const struct ieee80211_event * event )
2011-07-08 19:46:22 +04:00
{
2015-03-17 00:23:34 +03:00
trace_drv_event_callback ( local , sdata , event ) ;
if ( local - > ops - > event_callback )
local - > ops - > event_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
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 ;
2015-10-30 20:46:15 +03:00
might_sleep ( ) ;
2012-06-26 16:37:17 +04:00
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 )
{
2015-10-30 20:46:15 +03:00
might_sleep ( ) ;
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 )
{
2015-10-30 20:46:15 +03:00
might_sleep ( ) ;
2012-06-26 16:37:17 +04:00
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 )
{
2015-10-30 20:46:15 +03:00
might_sleep ( ) ;
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 ) ;
}
2015-09-23 15:18:34 +03:00
int drv_switch_vif_chanctx ( struct ieee80211_local * local ,
struct ieee80211_vif_chanctx_switch * vifs ,
int n_vifs , enum ieee80211_chanctx_switch_mode mode ) ;
2014-05-23 15:33:12 +04:00
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 ;
2015-10-30 20:46:15 +03:00
might_sleep ( ) ;
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 ) ;
}
2014-11-04 12:43:54 +03:00
static inline void
drv_reconfig_complete ( struct ieee80211_local * local ,
enum ieee80211_reconfig_type reconfig_type )
2012-11-06 22:18:13 +04:00
{
might_sleep ( ) ;
2014-11-04 12:43:54 +03:00
trace_drv_reconfig_complete ( local , reconfig_type ) ;
if ( local - > ops - > reconfig_complete )
local - > ops - > reconfig_complete ( & local - > hw , reconfig_type ) ;
2012-11-06 22:18:13 +04:00
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 ) ;
}
}
2014-10-08 10:48:37 +04:00
static inline int
drv_pre_channel_switch ( struct ieee80211_sub_if_data * sdata ,
struct ieee80211_channel_switch * ch_switch )
{
struct ieee80211_local * local = sdata - > local ;
int ret = 0 ;
if ( ! check_sdata_in_driver ( sdata ) )
return - EIO ;
trace_drv_pre_channel_switch ( local , sdata , ch_switch ) ;
if ( local - > ops - > pre_channel_switch )
ret = local - > ops - > pre_channel_switch ( & local - > hw , & sdata - > vif ,
ch_switch ) ;
trace_drv_return_int ( local , ret ) ;
return ret ;
}
2014-10-08 10:48:38 +04:00
static inline int
drv_post_channel_switch ( struct ieee80211_sub_if_data * sdata )
{
struct ieee80211_local * local = sdata - > local ;
int ret = 0 ;
if ( ! check_sdata_in_driver ( sdata ) )
return - EIO ;
trace_drv_post_channel_switch ( local , sdata ) ;
if ( local - > ops - > post_channel_switch )
ret = local - > ops - > post_channel_switch ( & local - > hw , & sdata - > vif ) ;
trace_drv_return_int ( local , ret ) ;
return ret ;
}
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 )
2016-08-04 15:43:04 +03:00
ret = local - > ops - > get_expected_throughput ( & local - > hw , sta ) ;
2014-05-19 23:53:20 +04:00
trace_drv_return_u32 ( local , ret ) ;
return ret ;
}
2014-10-26 01:32:53 +03:00
static inline int drv_get_txpower ( struct ieee80211_local * local ,
struct ieee80211_sub_if_data * sdata , int * dbm )
{
int ret ;
if ( ! local - > ops - > get_txpower )
return - EOPNOTSUPP ;
ret = local - > ops - > get_txpower ( & local - > hw , & sdata - > vif , dbm ) ;
trace_drv_get_txpower ( local , sdata , * dbm , ret ) ;
return ret ;
}
2014-11-09 19:50:19 +03:00
static inline int
drv_tdls_channel_switch ( struct ieee80211_local * local ,
struct ieee80211_sub_if_data * sdata ,
struct ieee80211_sta * sta , u8 oper_class ,
struct cfg80211_chan_def * chandef ,
struct sk_buff * tmpl_skb , u32 ch_sw_tm_ie )
{
int ret ;
might_sleep ( ) ;
if ( ! check_sdata_in_driver ( sdata ) )
return - EIO ;
if ( ! local - > ops - > tdls_channel_switch )
return - EOPNOTSUPP ;
trace_drv_tdls_channel_switch ( local , sdata , sta , oper_class , chandef ) ;
ret = local - > ops - > tdls_channel_switch ( & local - > hw , & sdata - > vif , sta ,
oper_class , chandef , tmpl_skb ,
ch_sw_tm_ie ) ;
trace_drv_return_int ( local , ret ) ;
return ret ;
}
static inline void
drv_tdls_cancel_channel_switch ( struct ieee80211_local * local ,
struct ieee80211_sub_if_data * sdata ,
struct ieee80211_sta * sta )
{
might_sleep ( ) ;
if ( ! check_sdata_in_driver ( sdata ) )
return ;
if ( ! local - > ops - > tdls_cancel_channel_switch )
return ;
trace_drv_tdls_cancel_channel_switch ( local , sdata , sta ) ;
local - > ops - > tdls_cancel_channel_switch ( & local - > hw , & sdata - > vif , sta ) ;
trace_drv_return_void ( local ) ;
}
2014-11-09 19:50:20 +03:00
static inline void
drv_tdls_recv_channel_switch ( struct ieee80211_local * local ,
struct ieee80211_sub_if_data * sdata ,
struct ieee80211_tdls_ch_sw_params * params )
{
trace_drv_tdls_recv_channel_switch ( local , sdata , params ) ;
if ( local - > ops - > tdls_recv_channel_switch )
local - > ops - > tdls_recv_channel_switch ( & local - > hw , & sdata - > vif ,
params ) ;
trace_drv_return_void ( local ) ;
}
2015-03-27 23:30:37 +03:00
static inline void drv_wake_tx_queue ( struct ieee80211_local * local ,
struct txq_info * txq )
{
struct ieee80211_sub_if_data * sdata = vif_to_sdata ( txq - > txq . vif ) ;
if ( ! check_sdata_in_driver ( sdata ) )
return ;
trace_drv_wake_tx_queue ( local , sdata , txq ) ;
local - > ops - > wake_tx_queue ( & local - > hw , & txq - > txq ) ;
}
2009-04-23 20:52:52 +04:00
# endif /* __MAC80211_DRIVER_OPS */