1/********************************************************************* 2 * 3 * sir.h: include file for irda-sir device abstraction layer 4 * 5 * Copyright (c) 2002 Martin Diehl 6 * 7 * This program is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU General Public License as 9 * published by the Free Software Foundation; either version 2 of 10 * the License, or (at your option) any later version. 11 * 12 ********************************************************************/ 13 14#ifndef IRDA_SIR_H 15#define IRDA_SIR_H 16 17#include <linux/netdevice.h> 18#include <linux/workqueue.h> 19 20#include <net/irda/irda.h> 21#include <net/irda/irda_device.h> // iobuff_t 22 23struct sir_fsm { 24 struct semaphore sem; 25 struct delayed_work work; 26 unsigned state, substate; 27 int param; 28 int result; 29}; 30 31#define SIRDEV_STATE_WAIT_TX_COMPLETE 0x0100 32 33/* substates for wait_tx_complete */ 34#define SIRDEV_STATE_WAIT_XMIT 0x0101 35#define SIRDEV_STATE_WAIT_UNTIL_SENT 0x0102 36#define SIRDEV_STATE_TX_DONE 0x0103 37 38#define SIRDEV_STATE_DONGLE_OPEN 0x0300 39 40/* 0x0301-0x03ff reserved for individual dongle substates */ 41 42#define SIRDEV_STATE_DONGLE_CLOSE 0x0400 43 44/* 0x0401-0x04ff reserved for individual dongle substates */ 45 46#define SIRDEV_STATE_SET_DTR_RTS 0x0500 47 48#define SIRDEV_STATE_SET_SPEED 0x0700 49#define SIRDEV_STATE_DONGLE_CHECK 0x0800 50#define SIRDEV_STATE_DONGLE_RESET 0x0900 51 52/* 0x0901-0x09ff reserved for individual dongle substates */ 53 54#define SIRDEV_STATE_DONGLE_SPEED 0x0a00 55/* 0x0a01-0x0aff reserved for individual dongle substates */ 56 57#define SIRDEV_STATE_PORT_SPEED 0x0b00 58#define SIRDEV_STATE_DONE 0x0c00 59#define SIRDEV_STATE_ERROR 0x0d00 60#define SIRDEV_STATE_COMPLETE 0x0e00 61 62#define SIRDEV_STATE_DEAD 0xffff 63 64 65struct sir_dev; 66 67struct dongle_driver { 68 69 struct module *owner; 70 71 const char *driver_name; 72 73 IRDA_DONGLE type; 74 75 int (*open)(struct sir_dev *dev); 76 int (*close)(struct sir_dev *dev); 77 int (*reset)(struct sir_dev *dev); 78 int (*set_speed)(struct sir_dev *dev, unsigned speed); 79 80 struct list_head dongle_list; 81}; 82 83struct sir_driver { 84 85 struct module *owner; 86 87 const char *driver_name; 88 89 int qos_mtt_bits; 90 91 int (*chars_in_buffer)(struct sir_dev *dev); 92 void (*wait_until_sent)(struct sir_dev *dev); 93 int (*set_speed)(struct sir_dev *dev, unsigned speed); 94 int (*set_dtr_rts)(struct sir_dev *dev, int dtr, int rts); 95 96 int (*do_write)(struct sir_dev *dev, const unsigned char *ptr, size_t len); 97 98 int (*start_dev)(struct sir_dev *dev); 99 int (*stop_dev)(struct sir_dev *dev); 100}; 101 102 103/* exported */ 104 105extern int irda_register_dongle(struct dongle_driver *new); 106extern int irda_unregister_dongle(struct dongle_driver *drv); 107 108extern struct sir_dev * sirdev_get_instance(const struct sir_driver *drv, const char *name); 109extern int sirdev_put_instance(struct sir_dev *self); 110 111extern int sirdev_set_dongle(struct sir_dev *dev, IRDA_DONGLE type); 112extern void sirdev_write_complete(struct sir_dev *dev); 113extern int sirdev_receive(struct sir_dev *dev, const unsigned char *cp, size_t count); 114 115/* low level helpers for SIR device/dongle setup */ 116extern int sirdev_raw_write(struct sir_dev *dev, const char *buf, int len); 117extern int sirdev_raw_read(struct sir_dev *dev, char *buf, int len); 118extern int sirdev_set_dtr_rts(struct sir_dev *dev, int dtr, int rts); 119 120/* not exported */ 121 122extern int sirdev_get_dongle(struct sir_dev *self, IRDA_DONGLE type); 123extern int sirdev_put_dongle(struct sir_dev *self); 124 125extern void sirdev_enable_rx(struct sir_dev *dev); 126extern int sirdev_schedule_request(struct sir_dev *dev, int state, unsigned param); 127 128/* inline helpers */ 129 130static inline int sirdev_schedule_speed(struct sir_dev *dev, unsigned speed) 131{ 132 return sirdev_schedule_request(dev, SIRDEV_STATE_SET_SPEED, speed); 133} 134 135static inline int sirdev_schedule_dongle_open(struct sir_dev *dev, int dongle_id) 136{ 137 return sirdev_schedule_request(dev, SIRDEV_STATE_DONGLE_OPEN, dongle_id); 138} 139 140static inline int sirdev_schedule_dongle_close(struct sir_dev *dev) 141{ 142 return sirdev_schedule_request(dev, SIRDEV_STATE_DONGLE_CLOSE, 0); 143} 144 145static inline int sirdev_schedule_dtr_rts(struct sir_dev *dev, int dtr, int rts) 146{ 147 int dtrrts; 148 149 dtrrts = ((dtr) ? 0x02 : 0x00) | ((rts) ? 0x01 : 0x00); 150 return sirdev_schedule_request(dev, SIRDEV_STATE_SET_DTR_RTS, dtrrts); 151} 152 153 154 155struct sir_dev { 156 struct net_device *netdev; 157 struct net_device_stats stats; 158 159 struct irlap_cb *irlap; 160 161 struct qos_info qos; 162 163 char hwname[32]; 164 165 struct sir_fsm fsm; 166 atomic_t enable_rx; 167 int raw_tx; 168 spinlock_t tx_lock; 169 170 u32 new_speed; 171 u32 flags; 172 173 unsigned speed; 174 175 iobuff_t tx_buff; /* Transmit buffer */ 176 iobuff_t rx_buff; /* Receive buffer */ 177 struct sk_buff *tx_skb; 178 179 const struct dongle_driver * dongle_drv; 180 const struct sir_driver * drv; 181 void *priv; 182 183}; 184 185#endif /* IRDA_SIR_H */ 186