Bootlin logo

Elixir Cross Referencer

 *	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 <net/irda/irda.h>
#include <net/irda/irda_device.h>		// iobuff_t

/* FIXME: unify irda_request with sir_fsm! */

struct irda_request {
	struct list_head lh_request;
	unsigned long pending;
	void (*func)(void *);
	void *data;
	struct timer_list timer;

struct sir_fsm {
	struct semaphore	sem;
	struct irda_request	rq;
	unsigned		state, substate;
	int			param;
	int			result;


/* substates for wait_tx_complete */
#define SIRDEV_STATE_WAIT_XMIT		0x0101
#define SIRDEV_STATE_TX_DONE		0x0103


/* 0x0301-0x03ff reserved for individual dongle substates */


/* 0x0401-0x04ff reserved for individual dongle substates */

#define SIRDEV_STATE_SET_DTR_RTS		0x0500

#define SIRDEV_STATE_SET_SPEED		0x0700

/* 0x0901-0x09ff reserved for individual dongle substates */

/* 0x0a01-0x0aff reserved for individual dongle substates */

#define SIRDEV_STATE_DONE		0x0c00
#define SIRDEV_STATE_ERROR		0x0d00

#define SIRDEV_STATE_DEAD		0xffff

struct sir_dev;

struct dongle_driver {

	struct module *owner;

	const char *driver_name;


	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);
extern int __init irda_thread_create(void);
extern void __exit irda_thread_join(void);

/* 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);

struct sir_dev {
	struct net_device *netdev;
	struct net_device_stats stats;

	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 */