2008-09-17 19:34:06 +04:00
/*
* Ultra Wide Band
* Driver initialization , etc
*
* Copyright ( C ) 2005 - 2006 Intel Corporation
* Inaky Perez - Gonzalez < inaky . perez - gonzalez @ intel . com >
*
* 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 .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston , MA
* 02110 - 1301 , USA .
*
*
* FIXME : docs
*
* Life cycle : FIXME : explain
*
* UWB radio controller :
*
* 1. alloc a uwb_rc , zero it
* 2. call uwb_rc_init ( ) on it to set it up + ops ( won ' t do any
* kind of allocation )
* 3. register ( now it is owned by the UWB stack - - deregister before
* freeing / destroying ) .
* 4. It lives on it ' s own now ( UWB stack handles ) - - when it
* disconnects , call unregister ( )
* 5. free it .
*
* Make sure you have a reference to the uwb_rc before calling
* any of the UWB API functions .
*
* TODO :
*
* 1. Locking and life cycle management is crappy still . All entry
* points to the UWB HCD API assume you have a reference on the
* uwb_rc structure and that it won ' t go away . They mutex lock it
* before doing anything .
*/
# include <linux/kernel.h>
# include <linux/init.h>
# include <linux/module.h>
# include <linux/device.h>
# include <linux/err.h>
# include <linux/kdev_t.h>
# include <linux/random.h>
2008-12-22 21:30:29 +03:00
2008-09-17 19:34:06 +04:00
# include "uwb-internal.h"
/* UWB stack attributes (or 'global' constants) */
/**
2011-03-31 05:57:33 +04:00
* If a beacon disappears for longer than this , then we consider the
2008-09-17 19:34:06 +04:00
* device who was represented by that beacon to be gone .
*
* ECMA - 368 [ 17.2 .3 , last para ] establishes that a device must not
* consider a device to be its neighbour if he doesn ' t receive a beacon
* for more than mMaxLostBeacons . mMaxLostBeacons is defined in
* ECMA - 368 [ 17.16 ] as 3 ; because we can get only one beacon per
* superframe , that ' d be 3 * 65 ms = 195 ~ 200 ms . Let ' s give it time
* for jitter and stuff and make it 500 ms .
*/
unsigned long beacon_timeout_ms = 500 ;
static
2010-01-05 14:48:07 +03:00
ssize_t beacon_timeout_ms_show ( struct class * class ,
struct class_attribute * attr ,
char * buf )
2008-09-17 19:34:06 +04:00
{
return scnprintf ( buf , PAGE_SIZE , " %lu \n " , beacon_timeout_ms ) ;
}
static
ssize_t beacon_timeout_ms_store ( struct class * class ,
2010-01-05 14:48:07 +03:00
struct class_attribute * attr ,
2008-09-17 19:34:06 +04:00
const char * buf , size_t size )
{
unsigned long bt ;
ssize_t result ;
result = sscanf ( buf , " %lu " , & bt ) ;
if ( result ! = 1 )
return - EINVAL ;
beacon_timeout_ms = bt ;
return size ;
}
static struct class_attribute uwb_class_attrs [ ] = {
__ATTR ( beacon_timeout_ms , S_IWUSR | S_IRUGO ,
beacon_timeout_ms_show , beacon_timeout_ms_store ) ,
__ATTR_NULL ,
} ;
/** Device model classes */
struct class uwb_rc_class = {
. name = " uwb_rc " ,
. class_attrs = uwb_class_attrs ,
} ;
static int __init uwb_subsys_init ( void )
{
int result = 0 ;
result = uwb_est_create ( ) ;
if ( result < 0 ) {
printk ( KERN_ERR " uwb: Can't initialize EST subsystem \n " ) ;
goto error_est_init ;
}
result = class_register ( & uwb_rc_class ) ;
if ( result < 0 )
goto error_uwb_rc_class_register ;
2014-09-17 00:53:08 +04:00
/* Register the UWB bus */
result = bus_register ( & uwb_bus_type ) ;
if ( result ) {
pr_err ( " %s - registering bus driver failed \n " , __func__ ) ;
goto exit_bus ;
}
2008-09-17 19:34:34 +04:00
uwb_dbg_init ( ) ;
2008-09-17 19:34:06 +04:00
return 0 ;
2014-09-17 00:53:08 +04:00
exit_bus :
class_unregister ( & uwb_rc_class ) ;
2008-09-17 19:34:06 +04:00
error_uwb_rc_class_register :
uwb_est_destroy ( ) ;
error_est_init :
return result ;
}
module_init ( uwb_subsys_init ) ;
static void __exit uwb_subsys_exit ( void )
{
2008-09-17 19:34:34 +04:00
uwb_dbg_exit ( ) ;
2014-09-17 00:53:08 +04:00
bus_unregister ( & uwb_bus_type ) ;
2008-09-17 19:34:06 +04:00
class_unregister ( & uwb_rc_class ) ;
uwb_est_destroy ( ) ;
return ;
}
module_exit ( uwb_subsys_exit ) ;
MODULE_AUTHOR ( " Inaky Perez-Gonzalez <inaky.perez-gonzalez@intel.com> " ) ;
MODULE_DESCRIPTION ( " Ultra Wide Band core " ) ;
MODULE_LICENSE ( " GPL " ) ;