2005-04-16 15:20:36 -07:00
/*********************************************************************
*
* sir . h : include file for irda - sir device abstraction layer
*
* Copyright ( c ) 2002 Martin Diehl
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation ; either version 2 of
* the License , or ( at your option ) any later version .
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# ifndef IRDA_SIR_H
# define IRDA_SIR_H
# include <linux/netdevice.h>
2006-05-09 15:27:04 -07:00
# include <linux/workqueue.h>
2005-04-16 15:20:36 -07:00
# include <net/irda/irda.h>
# include <net/irda/irda_device.h> // iobuff_t
struct sir_fsm {
struct semaphore sem ;
2006-11-22 14:57:56 +00:00
struct delayed_work work ;
2005-04-16 15:20:36 -07:00
unsigned state , substate ;
int param ;
int result ;
} ;
# define SIRDEV_STATE_WAIT_TX_COMPLETE 0x0100
/* substates for wait_tx_complete */
# define SIRDEV_STATE_WAIT_XMIT 0x0101
# define SIRDEV_STATE_WAIT_UNTIL_SENT 0x0102
# define SIRDEV_STATE_TX_DONE 0x0103
# define SIRDEV_STATE_DONGLE_OPEN 0x0300
/* 0x0301-0x03ff reserved for individual dongle substates */
# define SIRDEV_STATE_DONGLE_CLOSE 0x0400
/* 0x0401-0x04ff reserved for individual dongle substates */
# define SIRDEV_STATE_SET_DTR_RTS 0x0500
# define SIRDEV_STATE_SET_SPEED 0x0700
# define SIRDEV_STATE_DONGLE_CHECK 0x0800
# define SIRDEV_STATE_DONGLE_RESET 0x0900
/* 0x0901-0x09ff reserved for individual dongle substates */
# define SIRDEV_STATE_DONGLE_SPEED 0x0a00
/* 0x0a01-0x0aff reserved for individual dongle substates */
# define SIRDEV_STATE_PORT_SPEED 0x0b00
# define SIRDEV_STATE_DONE 0x0c00
# define SIRDEV_STATE_ERROR 0x0d00
# define SIRDEV_STATE_COMPLETE 0x0e00
# define SIRDEV_STATE_DEAD 0xffff
struct sir_dev ;
struct dongle_driver {
struct module * owner ;
const char * driver_name ;
IRDA_DONGLE type ;
int ( * open ) ( struct sir_dev * dev ) ;
int ( * close ) ( struct sir_dev * dev ) ;
int ( * reset ) ( struct sir_dev * dev ) ;
int ( * set_speed ) ( struct sir_dev * dev , unsigned speed ) ;
struct list_head dongle_list ;
} ;
struct sir_driver {
struct module * owner ;
const char * driver_name ;
int qos_mtt_bits ;
int ( * chars_in_buffer ) ( struct sir_dev * dev ) ;
void ( * wait_until_sent ) ( struct sir_dev * dev ) ;
int ( * set_speed ) ( struct sir_dev * dev , unsigned speed ) ;
int ( * set_dtr_rts ) ( struct sir_dev * dev , int dtr , int rts ) ;
int ( * do_write ) ( struct sir_dev * dev , const unsigned char * ptr , size_t len ) ;
int ( * start_dev ) ( struct sir_dev * dev ) ;
int ( * stop_dev ) ( struct sir_dev * dev ) ;
} ;
/* exported */
extern int irda_register_dongle ( struct dongle_driver * new ) ;
extern int irda_unregister_dongle ( struct dongle_driver * drv ) ;
extern struct sir_dev * sirdev_get_instance ( const struct sir_driver * drv , const char * name ) ;
extern int sirdev_put_instance ( struct sir_dev * self ) ;
extern int sirdev_set_dongle ( struct sir_dev * dev , IRDA_DONGLE type ) ;
extern void sirdev_write_complete ( struct sir_dev * dev ) ;
extern int sirdev_receive ( struct sir_dev * dev , const unsigned char * cp , size_t count ) ;
/* low level helpers for SIR device/dongle setup */
extern int sirdev_raw_write ( struct sir_dev * dev , const char * buf , int len ) ;
extern int sirdev_raw_read ( struct sir_dev * dev , char * buf , int len ) ;
extern int sirdev_set_dtr_rts ( struct sir_dev * dev , int dtr , int rts ) ;
/* not exported */
extern int sirdev_get_dongle ( struct sir_dev * self , IRDA_DONGLE type ) ;
extern int sirdev_put_dongle ( struct sir_dev * self ) ;
extern void sirdev_enable_rx ( struct sir_dev * dev ) ;
extern int sirdev_schedule_request ( struct sir_dev * dev , int state , unsigned param ) ;
/* inline helpers */
static inline int sirdev_schedule_speed ( struct sir_dev * dev , unsigned speed )
{
return sirdev_schedule_request ( dev , SIRDEV_STATE_SET_SPEED , speed ) ;
}
static inline int sirdev_schedule_dongle_open ( struct sir_dev * dev , int dongle_id )
{
return sirdev_schedule_request ( dev , SIRDEV_STATE_DONGLE_OPEN , dongle_id ) ;
}
static inline int sirdev_schedule_dongle_close ( struct sir_dev * dev )
{
return sirdev_schedule_request ( dev , SIRDEV_STATE_DONGLE_CLOSE , 0 ) ;
}
static inline int sirdev_schedule_dtr_rts ( struct sir_dev * dev , int dtr , int rts )
{
int dtrrts ;
dtrrts = ( ( dtr ) ? 0x02 : 0x00 ) | ( ( rts ) ? 0x01 : 0x00 ) ;
return sirdev_schedule_request ( dev , SIRDEV_STATE_SET_DTR_RTS , dtrrts ) ;
}
#if 0
static inline int sirdev_schedule_mode ( struct sir_dev * dev , int mode )
{
return sirdev_schedule_request ( dev , SIRDEV_STATE_SET_MODE , mode ) ;
}
# endif
struct sir_dev {
struct net_device * netdev ;
struct irlap_cb * irlap ;
struct qos_info qos ;
char hwname [ 32 ] ;
struct sir_fsm fsm ;
atomic_t enable_rx ;
int raw_tx ;
spinlock_t tx_lock ;
u32 new_speed ;
u32 flags ;
unsigned speed ;
iobuff_t tx_buff ; /* Transmit buffer */
iobuff_t rx_buff ; /* Receive buffer */
struct sk_buff * tx_skb ;
const struct dongle_driver * dongle_drv ;
const struct sir_driver * drv ;
void * priv ;
} ;
# endif /* IRDA_SIR_H */