Linux Audio

Check our new training course

Loading...
Note: File does not exist in v4.17.
  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#if 0
154static inline int sirdev_schedule_mode(struct sir_dev *dev, int mode)
155{
156	return sirdev_schedule_request(dev, SIRDEV_STATE_SET_MODE, mode);
157}
158#endif
159
160
161struct sir_dev {
162	struct net_device *netdev;
163
164	struct irlap_cb    *irlap;
165
166	struct qos_info qos;
167
168	char hwname[32];
169
170	struct sir_fsm fsm;
171	atomic_t enable_rx;
172	int raw_tx;
173	spinlock_t tx_lock;
174
175	u32 new_speed;
176 	u32 flags;
177
178	unsigned	speed;
179
180	iobuff_t tx_buff;          /* Transmit buffer */
181	iobuff_t rx_buff;          /* Receive buffer */
182	struct sk_buff *tx_skb;
183
184	const struct dongle_driver * dongle_drv;
185	const struct sir_driver * drv;
186	void *priv;
187
188};
189
190#endif	/* IRDA_SIR_H */