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 11:41:02 +04:00
# ifndef __NET_CFG802154_H
# define __NET_CFG802154_H
2009-08-14 16:13:12 +04:00
2014-11-17 10:20:54 +03:00
# include <linux/ieee802154.h>
2009-08-14 16:13:12 +04:00
# include <linux/netdevice.h>
# include <linux/mutex.h>
2011-11-24 05:12:59 +04:00
# include <linux/bug.h>
2009-08-14 16:13:12 +04:00
2014-11-17 10:20:51 +03:00
# include <net/nl802154.h>
2014-11-02 06:18:35 +03:00
struct wpan_phy ;
struct cfg802154_ops {
2014-11-02 06:18:38 +03:00
struct net_device * ( * add_virtual_intf_deprecated ) ( struct wpan_phy * wpan_phy ,
const char * name ,
int type ) ;
2014-11-12 05:36:54 +03:00
void ( * del_virtual_intf_deprecated ) ( struct wpan_phy * wpan_phy ,
struct net_device * dev ) ;
2014-11-17 10:20:51 +03:00
int ( * add_virtual_intf ) ( struct wpan_phy * wpan_phy ,
const char * name ,
2014-11-17 10:20:52 +03:00
enum nl802154_iftype type ,
__le64 extended_addr ) ;
2014-11-17 10:20:53 +03:00
int ( * del_virtual_intf ) ( struct wpan_phy * wpan_phy ,
struct wpan_dev * wpan_dev ) ;
2014-11-12 05:36:55 +03:00
int ( * set_channel ) ( struct wpan_phy * wpan_phy , u8 page , u8 channel ) ;
2014-11-12 05:36:57 +03:00
int ( * set_pan_id ) ( struct wpan_phy * wpan_phy ,
2014-11-17 10:20:55 +03:00
struct wpan_dev * wpan_dev , __le16 pan_id ) ;
2014-11-12 05:36:58 +03:00
int ( * set_short_addr ) ( struct wpan_phy * wpan_phy ,
2014-11-17 10:20:55 +03:00
struct wpan_dev * wpan_dev , __le16 short_addr ) ;
2014-11-12 05:36:59 +03:00
int ( * set_backoff_exponent ) ( struct wpan_phy * wpan_phy ,
struct wpan_dev * wpan_dev , u8 min_be ,
u8 max_be ) ;
2014-11-12 05:37:01 +03:00
int ( * set_max_csma_backoffs ) ( struct wpan_phy * wpan_phy ,
struct wpan_dev * wpan_dev ,
u8 max_csma_backoffs ) ;
2014-11-12 05:37:03 +03:00
int ( * set_max_frame_retries ) ( struct wpan_phy * wpan_phy ,
struct wpan_dev * wpan_dev ,
s8 max_frame_retries ) ;
2014-11-12 05:37:05 +03:00
int ( * set_lbt_mode ) ( struct wpan_phy * wpan_phy ,
struct wpan_dev * wpan_dev , bool mode ) ;
2014-11-02 06:18:35 +03:00
} ;
2009-08-14 16:13:12 +04:00
struct wpan_phy {
struct mutex pib_lock ;
2014-11-12 05:36:51 +03: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 ;
2009-08-14 16:13:12 +04:00
/*
2014-02-17 14:34:08 +04: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 ;
2014-11-17 10:20:54 +03:00
u32 channels_supported [ IEEE802154_MAX_PAGE + 1 ] ;
2014-02-17 14:34:08 +04:00
s8 transmit_power ;
2009-08-14 16:13:12 +04:00
u8 cca_mode ;
2014-11-05 22:51:25 +03:00
__le64 perm_extended_addr ;
2009-08-14 16:13:12 +04:00
2014-02-17 14:34:12 +04:00
s32 cca_ed_level ;
2014-02-17 14:34:10 +04:00
2014-11-12 21:51:56 +03: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 07:25:10 +04:00
char priv [ 0 ] __aligned ( NETDEV_ALIGN ) ;
2009-08-14 16:13:12 +04:00
} ;
2014-11-05 22:51:17 +03:00
struct wpan_dev {
struct wpan_phy * wpan_phy ;
2014-11-09 10:36:49 +03:00
int iftype ;
2014-11-09 10:36:45 +03:00
2014-11-09 10:36:50 +03:00
/* the remainder of this struct should be private to cfg802154 */
struct list_head list ;
struct net_device * netdev ;
u32 identifier ;
2014-11-09 10:36:45 +03:00
/* MAC PIB */
__le16 pan_id ;
__le16 short_addr ;
__le64 extended_addr ;
/* MAC BSN field */
u8 bsn ;
/* MAC DSN field */
u8 dsn ;
u8 min_be ;
u8 max_be ;
u8 csma_retries ;
s8 frame_retries ;
bool lbt ;
bool promiscuous_mode ;
2014-11-05 22:51:17 +03:00
} ;
2009-11-04 17:53:23 +03:00
# define to_phy(_dev) container_of(_dev, struct wpan_phy, dev)
2014-11-02 06:18:35 +03:00
struct wpan_phy *
2014-11-09 10:36:47 +03: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 07:25:11 +04: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 11:41:02 +04:00
# endif /* __NET_CFG802154_H */