2009-08-14 16:13:12 +04:00
/*
* Copyright ( C ) 2007 , 2008 , 2009 Siemens AG
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2
* as published by the Free Software Foundation .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* Written by :
* Dmitry Eremin - Solenikov < dbaryshkov @ gmail . com >
*/
2014-10-25 09:41:02 +02:00
# ifndef __NET_CFG802154_H
# define __NET_CFG802154_H
2009-08-14 16:13:12 +04:00
2014-11-17 08:20:54 +01:00
# include <linux/ieee802154.h>
2009-08-14 16:13:12 +04:00
# include <linux/netdevice.h>
# include <linux/mutex.h>
2011-11-23 20:12:59 -05:00
# include <linux/bug.h>
2009-08-14 16:13:12 +04:00
2014-11-17 08:20:51 +01:00
# include <net/nl802154.h>
2014-11-02 04:18:35 +01:00
struct wpan_phy ;
2014-12-10 15:33:13 +01:00
struct wpan_phy_cca ;
2014-11-02 04:18:35 +01:00
struct cfg802154_ops {
2014-11-02 04:18:38 +01:00
struct net_device * ( * add_virtual_intf_deprecated ) ( struct wpan_phy * wpan_phy ,
const char * name ,
2015-04-30 17:44:57 +02:00
unsigned char name_assign_type ,
2014-11-02 04:18:38 +01:00
int type ) ;
2014-11-12 03:36:54 +01:00
void ( * del_virtual_intf_deprecated ) ( struct wpan_phy * wpan_phy ,
struct net_device * dev ) ;
2014-11-17 08:20:51 +01:00
int ( * add_virtual_intf ) ( struct wpan_phy * wpan_phy ,
const char * name ,
2015-04-30 17:44:57 +02:00
unsigned char name_assign_type ,
2014-11-17 08:20:52 +01:00
enum nl802154_iftype type ,
__le64 extended_addr ) ;
2014-11-17 08:20:53 +01:00
int ( * del_virtual_intf ) ( struct wpan_phy * wpan_phy ,
struct wpan_dev * wpan_dev ) ;
2014-11-12 03:36:55 +01:00
int ( * set_channel ) ( struct wpan_phy * wpan_phy , u8 page , u8 channel ) ;
2014-12-10 15:33:13 +01:00
int ( * set_cca_mode ) ( struct wpan_phy * wpan_phy ,
const struct wpan_phy_cca * cca ) ;
2015-05-27 13:42:10 +02:00
int ( * set_cca_ed_level ) ( struct wpan_phy * wpan_phy , s32 ed_level ) ;
2015-05-27 09:10:54 +05:30
int ( * set_tx_power ) ( struct wpan_phy * wpan_phy , s32 power ) ;
2014-11-12 03:36:57 +01:00
int ( * set_pan_id ) ( struct wpan_phy * wpan_phy ,
2014-11-17 08:20:55 +01:00
struct wpan_dev * wpan_dev , __le16 pan_id ) ;
2014-11-12 03:36:58 +01:00
int ( * set_short_addr ) ( struct wpan_phy * wpan_phy ,
2014-11-17 08:20:55 +01:00
struct wpan_dev * wpan_dev , __le16 short_addr ) ;
2014-11-12 03:36:59 +01:00
int ( * set_backoff_exponent ) ( struct wpan_phy * wpan_phy ,
struct wpan_dev * wpan_dev , u8 min_be ,
u8 max_be ) ;
2014-11-12 03:37:01 +01:00
int ( * set_max_csma_backoffs ) ( struct wpan_phy * wpan_phy ,
struct wpan_dev * wpan_dev ,
u8 max_csma_backoffs ) ;
2014-11-12 03:37:03 +01:00
int ( * set_max_frame_retries ) ( struct wpan_phy * wpan_phy ,
struct wpan_dev * wpan_dev ,
s8 max_frame_retries ) ;
2014-11-12 03:37:05 +01:00
int ( * set_lbt_mode ) ( struct wpan_phy * wpan_phy ,
struct wpan_dev * wpan_dev , bool mode ) ;
2014-11-02 04:18:35 +01:00
} ;
2015-05-17 21:44:43 +02:00
static inline bool
wpan_phy_supported_bool ( bool b , enum nl802154_supported_bool_states st )
{
switch ( st ) {
case NL802154_SUPPORTED_BOOL_TRUE :
return b ;
case NL802154_SUPPORTED_BOOL_FALSE :
return ! b ;
case NL802154_SUPPORTED_BOOL_BOTH :
return true ;
default :
WARN_ON ( 1 ) ;
}
return false ;
}
2015-05-17 21:44:42 +02:00
struct wpan_phy_supported {
2015-05-17 21:44:43 +02:00
u32 channels [ IEEE802154_MAX_PAGE + 1 ] ,
2015-05-17 21:44:47 +02:00
cca_modes , cca_opts , iftypes ;
2015-05-17 21:44:43 +02:00
enum nl802154_supported_bool_states lbt ;
u8 min_minbe , max_minbe , min_maxbe , max_maxbe ,
min_csma_backoffs , max_csma_backoffs ;
s8 min_frame_retries , max_frame_retries ;
size_t tx_powers_size , cca_ed_levels_size ;
const s32 * tx_powers , * cca_ed_levels ;
2015-05-17 21:44:42 +02:00
} ;
2014-12-10 15:33:12 +01:00
struct wpan_phy_cca {
enum nl802154_cca_modes mode ;
enum nl802154_cca_opts opt ;
} ;
2015-05-17 21:44:44 +02:00
static inline bool
wpan_phy_cca_cmp ( const struct wpan_phy_cca * a , const struct wpan_phy_cca * b )
{
if ( a - > mode ! = b - > mode )
return false ;
if ( a - > mode = = NL802154_CCA_ENERGY_CARRIER )
return a - > opt = = b - > opt ;
return true ;
}
2015-05-17 21:44:46 +02:00
/**
* @ WPAN_PHY_FLAG_TRANSMIT_POWER : Indicates that transceiver will support
* transmit power setting .
* @ WPAN_PHY_FLAG_CCA_ED_LEVEL : Indicates that transceiver will support cca ed
* level setting .
* @ WPAN_PHY_FLAG_CCA_MODE : Indicates that transceiver will support cca mode
* setting .
*/
enum wpan_phy_flags {
WPAN_PHY_FLAG_TXPOWER = BIT ( 1 ) ,
WPAN_PHY_FLAG_CCA_ED_LEVEL = BIT ( 2 ) ,
WPAN_PHY_FLAG_CCA_MODE = BIT ( 3 ) ,
} ;
2009-08-14 16:13:12 +04:00
struct wpan_phy {
2014-11-12 03:36:51 +01:00
/* If multiple wpan_phys are registered and you're handed e.g.
* a regular netdev with assigned ieee802154_ptr , you won ' t
* know whether it points to a wpan_phy your driver has registered
* or not . Assign this to something global to your driver to
* help determine whether you own this wpan_phy or not .
*/
const void * privid ;
2015-05-17 21:44:46 +02:00
u32 flags ;
2009-08-14 16:13:12 +04:00
/*
2014-02-17 11:34:08 +01:00
* This is a PIB according to 802.15 .4 - 2011.
2009-08-14 16:13:12 +04:00
* We do not provide timing - related variables , as they
* aren ' t used outside of driver
*/
u8 current_channel ;
u8 current_page ;
2015-05-17 21:44:42 +02:00
struct wpan_phy_supported supported ;
2015-05-17 21:44:40 +02:00
/* current transmit_power in mBm */
2015-05-17 21:44:39 +02:00
s32 transmit_power ;
2014-12-10 15:33:12 +01:00
struct wpan_phy_cca cca ;
2014-11-05 20:51:25 +01:00
__le64 perm_extended_addr ;
2009-08-14 16:13:12 +04:00
2015-05-17 21:44:41 +02:00
/* current cca ed threshold in mBm */
2014-02-17 11:34:12 +01:00
s32 cca_ed_level ;
2014-02-17 11:34:10 +01:00
2014-11-12 19:51:56 +01:00
/* PHY depended MAC PIB values */
/* 802.15.4 acronym: Tdsym in usec */
u8 symbol_duration ;
/* lifs and sifs periods timing */
u16 lifs_period ;
u16 sifs_period ;
2009-08-14 16:13:12 +04:00
struct device dev ;
2014-10-25 05:25:10 +02:00
char priv [ 0 ] __aligned ( NETDEV_ALIGN ) ;
2009-08-14 16:13:12 +04:00
} ;
2014-11-05 20:51:17 +01:00
struct wpan_dev {
struct wpan_phy * wpan_phy ;
2014-11-09 08:36:49 +01:00
int iftype ;
2014-11-09 08:36:45 +01:00
2014-11-09 08:36:50 +01:00
/* the remainder of this struct should be private to cfg802154 */
struct list_head list ;
struct net_device * netdev ;
u32 identifier ;
2014-11-09 08:36:45 +01:00
/* MAC PIB */
__le16 pan_id ;
__le16 short_addr ;
__le64 extended_addr ;
/* MAC BSN field */
2015-05-22 17:43:53 +02:00
atomic_t bsn ;
2014-11-09 08:36:45 +01:00
/* MAC DSN field */
2015-05-22 17:43:53 +02:00
atomic_t dsn ;
2014-11-09 08:36:45 +01:00
u8 min_be ;
u8 max_be ;
u8 csma_retries ;
s8 frame_retries ;
bool lbt ;
bool promiscuous_mode ;
2014-11-05 20:51:17 +01:00
} ;
2009-11-04 17:53:23 +03:00
# define to_phy(_dev) container_of(_dev, struct wpan_phy, dev)
2014-11-02 04:18:35 +01:00
struct wpan_phy *
2014-11-09 08:36:47 +01:00
wpan_phy_new ( const struct cfg802154_ops * ops , size_t priv_size ) ;
2009-09-28 19:01:20 +04:00
static inline void wpan_phy_set_dev ( struct wpan_phy * phy , struct device * dev )
{
phy - > dev . parent = dev ;
}
2014-10-25 05:25:11 +02:00
2009-09-28 19:01:20 +04:00
int wpan_phy_register ( struct wpan_phy * phy ) ;
2009-08-14 16:13:12 +04:00
void wpan_phy_unregister ( struct wpan_phy * phy ) ;
void wpan_phy_free ( struct wpan_phy * phy ) ;
2009-09-15 16:57:04 +04:00
/* Same semantics as for class_for_each_device */
int wpan_phy_for_each ( int ( * fn ) ( struct wpan_phy * phy , void * data ) , void * data ) ;
2009-08-14 16:13:12 +04:00
static inline void * wpan_phy_priv ( struct wpan_phy * phy )
{
BUG_ON ( ! phy ) ;
return & phy - > priv ;
}
struct wpan_phy * wpan_phy_find ( const char * str ) ;
2009-09-14 18:11:03 +04:00
static inline void wpan_phy_put ( struct wpan_phy * phy )
{
put_device ( & phy - > dev ) ;
}
2009-08-14 16:13:12 +04:00
static inline const char * wpan_phy_name ( struct wpan_phy * phy )
{
return dev_name ( & phy - > dev ) ;
}
2014-10-25 09:41:02 +02:00
# endif /* __NET_CFG802154_H */