diff options
Diffstat (limited to 'include/net/irda/irda_device.h')
-rw-r--r-- | include/net/irda/irda_device.h | 101 |
1 files changed, 60 insertions, 41 deletions
diff --git a/include/net/irda/irda_device.h b/include/net/irda/irda_device.h index d8e546bb5..a3dcf2d6e 100644 --- a/include/net/irda/irda_device.h +++ b/include/net/irda/irda_device.h @@ -6,7 +6,7 @@ * Status: Experimental. * Author: Haris Zukanovic <haris@stud.cs.uit.no> * Created at: Tue Apr 14 12:41:42 1998 - * Modified at: Mon Jan 18 10:52:10 1999 + * Modified at: Tue Apr 20 11:06:28 1999 * Modified by: Dag Brattli <dagb@cs.uit.no> * * Copyright (c) 1998 Haris Zukanovic, <haris@stud.cs.uit.no> @@ -31,15 +31,23 @@ #include <linux/tty.h> #include <linux/netdevice.h> +#include <asm/spinlock.h> + #include <net/irda/irda.h> #include <net/irda/qos.h> #include <net/irda/irqueue.h> - -#define SIR_MODE 0x01 -#define MIR_MODE 0x02 -#define FIR_MODE 0x04 -#define IO_PIO 0x08 -#define IO_DMA 0x10 +#include <net/irda/irlap_frame.h> + +/* Some non-standard interface flags (should not conflict with any in if.h) */ +#define IFF_SIR 0x0001 /* Supports SIR speeds */ +#define IFF_MIR 0x0002 /* Supports MIR speeds */ +#define IFF_FIR 0x0004 /* Supports FIR speeds */ +#define IFF_VFIR 0x0008 /* Supports VFIR speeds */ +#define IFF_PIO 0x0010 /* Supports PIO transfer of data */ +#define IFF_DMA 0x0020 /* Supports DMA transfer of data */ +#define IFF_SHM 0x0040 /* Supports shared memory data transfers */ +#define IFF_DONGLE 0x0080 /* Interface has a dongle attached */ +#define IFF_AIR 0x0100 /* Supports A(dvanced)IR standards */ #define IO_XMIT 0x01 #define IO_RECV 0x02 @@ -48,29 +56,29 @@ struct chipio_t { int iobase, iobase2; /* IO base */ int io_ext, io_ext2; /* Length of iobase */ + int membase; /* Shared memory base */ int irq, irq2; /* Interrupts used */ int fifo_size; /* FIFO size */ int dma, dma2; /* DMA channel used */ int irqflags; /* interrupt flags (ie, SA_SHIRQ|SA_INTERRUPT) */ - int direction; /* Used by some FIR drivers */ + int direction; /* Link direction, used by some FIR drivers */ int baudrate; /* Currently used baudrate */ int dongle_id; /* Dongle or transceiver currently used */ }; -/* Buffer specific info */ +/* IO buffer specific info (inspired by struct sk_buff) */ struct iobuff_t { int state; /* Receiving state (transmit state not used) */ int in_frame; /* True if receiving frame */ - __u8 *data; /* the buffer */ - __u8 *head; /* start of data in buffer */ + __u8 *head; /* start of buffer */ + __u8 *data; /* start of data in buffer */ __u8 *tail; /* end of data in buffer */ - int offset; /* Usually data + offset = head */ - int len; /* currently used bytes in buffer */ - int truesize; /* total size of the data area */ + int len; /* length of data */ + int truesize; /* total size of buffer */ __u16 fcs; int flags; /* Allocation flags (GFP_KERNEL | GFP_DMA ) */ @@ -83,7 +91,7 @@ struct iobuff_t { * stuff from IrDA port implementations. */ struct irda_device { - QUEUE q; /* Must be first */ + QUEUE q; /* Must be first */ int magic; /* Our magic bullet */ char name[16]; /* Name of device "irda0" */ @@ -93,7 +101,7 @@ struct irda_device { struct device netdev; /* Yes! we are some kind of netdevice */ struct enet_statistics stats; -/* int flags; */ + int flags; /* Interface flags (see defs above) */ void *priv; /* Pointer to low level implementation */ @@ -103,51 +111,62 @@ struct irda_device { struct iobuff_t tx_buff; struct iobuff_t rx_buff; - int media_busy; + /* spinlock_t lock; */ /* For serializing operations */ /* Media busy stuff */ + int media_busy; struct timer_list media_busy_timer; - struct timer_list todo_timer; - int (*hard_xmit)( struct sk_buff *skb, struct device *dev); - void (*change_speed)( struct irda_device *driver, int baud); - - int (*is_receiving)(struct irda_device *); /* receiving? */ + /* Callbacks for driver specific implementation */ + void (*change_speed)(struct irda_device *driver, int baud); + int (*is_receiving)(struct irda_device *); /* receiving? */ /* int (*is_tbusy)(struct irda_device *); */ /* transmitting? */ void (*wait_until_sent)(struct irda_device *); - - int new_speed; /* Will be removed in future */ + void (*set_caddr)(struct irda_device *); /* Set connection addr */ }; extern hashbin_t *irda_device; /* Function prototypes */ -int irda_device_init( void); -void irda_device_cleanup( void); +int irda_device_init(void); +void irda_device_cleanup(void); -int irda_device_open( struct irda_device *, char *name, void *priv); -void irda_device_close( struct irda_device *); +int irda_device_open(struct irda_device *, char *name, void *priv); +void irda_device_close(struct irda_device *); /* Interface to be uses by IrLAP */ -inline void irda_device_set_media_busy( struct irda_device *, int status); -inline int irda_device_is_media_busy( struct irda_device *); -inline int irda_device_is_receiving( struct irda_device *); -inline void irda_device_change_speed( struct irda_device *, int); - -inline struct qos_info *irda_device_get_qos( struct irda_device *self); -int irda_device_txqueue_empty( struct irda_device *self); +inline void irda_device_set_media_busy(struct irda_device *, int status); +inline int irda_device_is_media_busy(struct irda_device *); +inline int irda_device_is_receiving(struct irda_device *); +inline void irda_device_change_speed(struct irda_device *, int); -int irda_device_setup( struct device *dev); +inline struct qos_info *irda_device_get_qos(struct irda_device *self); +int irda_device_txqueue_empty(struct irda_device *self); -__inline__ int irda_get_mtt( struct sk_buff *skb); - -void setup_dma( int channel, char *buffer, int count, int mode); - -#endif +int irda_device_setup(struct device *dev); +void setup_dma(int channel, char *buffer, int count, int mode); +/* + * Function irda_get_mtt (skb) + * + * Utility function for getting the minimum turnaround time out of + * the skb, where it has been hidden in the cb field. + */ +inline static __u16 irda_get_mtt(struct sk_buff *skb) +{ + __u16 mtt; + if (((struct irlap_skb_cb *)(skb->cb))->magic != LAP_MAGIC) + mtt = 10000; + else + mtt = ((struct irlap_skb_cb *)(skb->cb))->mtt; + ASSERT(mtt <= 10000, return 10000;); + + return mtt; +} +#endif |