Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / drivers / net / irda / sir-dev.h
diff --git a/kernel/drivers/net/irda/sir-dev.h b/kernel/drivers/net/irda/sir-dev.h
new file mode 100644 (file)
index 0000000..f50b9c1
--- /dev/null
@@ -0,0 +1,191 @@
+/*********************************************************************
+ *
+ *     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>
+#include <linux/workqueue.h>
+
+#include <net/irda/irda.h>
+#include <net/irda/irda_device.h>              // iobuff_t
+
+struct sir_fsm {
+       struct semaphore        sem;
+       struct delayed_work     work;
+       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 */
+
+int irda_register_dongle(struct dongle_driver *new);
+int irda_unregister_dongle(struct dongle_driver *drv);
+
+struct sir_dev *sirdev_get_instance(const struct sir_driver *drv,
+                                   const char *name);
+int sirdev_put_instance(struct sir_dev *self);
+
+int sirdev_set_dongle(struct sir_dev *dev, IRDA_DONGLE type);
+void sirdev_write_complete(struct sir_dev *dev);
+int sirdev_receive(struct sir_dev *dev, const unsigned char *cp, size_t count);
+
+/* low level helpers for SIR device/dongle setup */
+int sirdev_raw_write(struct sir_dev *dev, const char *buf, int len);
+int sirdev_raw_read(struct sir_dev *dev, char *buf, int len);
+int sirdev_set_dtr_rts(struct sir_dev *dev, int dtr, int rts);
+
+/* not exported */
+
+int sirdev_get_dongle(struct sir_dev *self, IRDA_DONGLE type);
+int sirdev_put_dongle(struct sir_dev *self);
+
+void sirdev_enable_rx(struct sir_dev *dev);
+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 */