203 строки
5.1 KiB
C
203 строки
5.1 KiB
C
/*********************************************************************
|
|
*
|
|
* 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;
|
|
};
|
|
|
|
#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 */
|
|
|
|
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);
|
|
}
|
|
#endif
|
|
|
|
|
|
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 */
|