linux/drivers/net/irda/mcs7780.h
<<
>>
Prefs
   1/*****************************************************************************
   2*
   3* Filename:      mcs7780.h
   4* Version:       0.2-alpha
   5* Description:   Irda MosChip USB Dongle
   6* Status:        Experimental
   7* Authors:       Lukasz Stelmach <stlman@poczta.fm>
   8*                Brian Pugh <bpugh@cs.pdx.edu>
   9*
  10*       Copyright (C) 2005, Lukasz Stelmach <stlman@poczta.fm>
  11*       Copyright (C) 2005, Brian Pugh <bpugh@cs.pdx.edu>
  12*
  13*       This program is free software; you can redistribute it and/or modify
  14*       it under the terms of the GNU General Public License as published by
  15*       the Free Software Foundation; either version 2 of the License, or
  16*       (at your option) any later version.
  17*
  18*       This program is distributed in the hope that it will be useful,
  19*       but WITHOUT ANY WARRANTY; without even the implied warranty of
  20*       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  21*       GNU General Public License for more details.
  22*
  23*       You should have received a copy of the GNU General Public License
  24*       along with this program; if not, write to the Free Software
  25*       Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  26*
  27*****************************************************************************/
  28#ifndef _MCS7780_H
  29#define _MCS7780_H
  30
  31#define MCS_MODE_SIR            0
  32#define MCS_MODE_MIR            1
  33#define MCS_MODE_FIR            2
  34
  35#define MCS_CTRL_TIMEOUT        500
  36#define MCS_XMIT_TIMEOUT        500
  37/* Possible transceiver types */
  38#define MCS_TSC_VISHAY          0       /* Vishay TFD, default choice */
  39#define MCS_TSC_AGILENT         1       /* Agilent 3602/3600 */
  40#define MCS_TSC_SHARP           2       /* Sharp GP2W1000YP */
  41
  42/* Requests */
  43#define MCS_RD_RTYPE 0xC0
  44#define MCS_WR_RTYPE 0x40
  45#define MCS_RDREQ    0x0F
  46#define MCS_WRREQ    0x0E
  47
  48/* Register 0x00 */
  49#define MCS_MODE_REG    0
  50#define MCS_FIR         ((__u16)0x0001)
  51#define MCS_SIR16US     ((__u16)0x0002)
  52#define MCS_BBTG        ((__u16)0x0004)
  53#define MCS_ASK         ((__u16)0x0008)
  54#define MCS_PARITY      ((__u16)0x0010)
  55
  56/* SIR/MIR speed constants */
  57#define MCS_SPEED_SHIFT     5
  58#define MCS_SPEED_MASK      ((__u16)0x00E0)
  59#define MCS_SPEED(x)        ((x & MCS_SPEED_MASK) >> MCS_SPEED_SHIFT)
  60#define MCS_SPEED_2400      ((0 << MCS_SPEED_SHIFT) & MCS_SPEED_MASK)
  61#define MCS_SPEED_9600      ((1 << MCS_SPEED_SHIFT) & MCS_SPEED_MASK)
  62#define MCS_SPEED_19200     ((2 << MCS_SPEED_SHIFT) & MCS_SPEED_MASK)
  63#define MCS_SPEED_38400     ((3 << MCS_SPEED_SHIFT) & MCS_SPEED_MASK)
  64#define MCS_SPEED_57600     ((4 << MCS_SPEED_SHIFT) & MCS_SPEED_MASK)
  65#define MCS_SPEED_115200    ((5 << MCS_SPEED_SHIFT) & MCS_SPEED_MASK)
  66#define MCS_SPEED_576000    ((6 << MCS_SPEED_SHIFT) & MCS_SPEED_MASK)
  67#define MCS_SPEED_1152000   ((7 << MCS_SPEED_SHIFT) & MCS_SPEED_MASK)
  68
  69#define MCS_PLLPWDN     ((__u16)0x0100)
  70#define MCS_DRIVER      ((__u16)0x0200)
  71#define MCS_DTD         ((__u16)0x0400)
  72#define MCS_DIR         ((__u16)0x0800)
  73#define MCS_SIPEN       ((__u16)0x1000)
  74#define MCS_SENDSIP     ((__u16)0x2000)
  75#define MCS_CHGDIR      ((__u16)0x4000)
  76#define MCS_RESET       ((__u16)0x8000)
  77
  78/* Register 0x02 */
  79#define MCS_XCVR_REG    2
  80#define MCS_MODE0       ((__u16)0x0001)
  81#define MCS_STFIR       ((__u16)0x0002)
  82#define MCS_XCVR_CONF   ((__u16)0x0004)
  83#define MCS_RXFAST      ((__u16)0x0008)
  84/* TXCUR [6:4] */
  85#define MCS_TXCUR_SHIFT 4
  86#define MCS_TXCUR_MASK  ((__u16)0x0070)
  87#define MCS_TXCUR(x)    ((x & MCS_TXCUR_MASK) >> MCS_TXCUR_SHIFT)
  88#define MCS_SETTXCUR(x,y) \
  89        ((x & ~MCS_TXCUR_MASK) | (y << MCS_TXCUR_SHIFT) & MCS_TXCUR_MASK)
  90
  91#define MCS_MODE1       ((__u16)0x0080)
  92#define MCS_SMODE0      ((__u16)0x0100)
  93#define MCS_SMODE1      ((__u16)0x0200)
  94#define MCS_INVTX       ((__u16)0x0400)
  95#define MCS_INVRX       ((__u16)0x0800)
  96
  97#define MCS_MINRXPW_REG 4
  98
  99#define MCS_RESV_REG 7
 100#define MCS_IRINTX      ((__u16)0x0001)
 101#define MCS_IRINRX      ((__u16)0x0002)
 102
 103struct mcs_cb {
 104        struct usb_device *usbdev;      /* init: probe_irda */
 105        struct net_device *netdev;      /* network layer */
 106        struct irlap_cb *irlap; /* The link layer we are binded to */
 107        struct qos_info qos;
 108        unsigned int speed;     /* Current speed */
 109        unsigned int new_speed; /* new speed */
 110
 111        struct work_struct work; /* Change speed work */
 112
 113        struct sk_buff *tx_pending;
 114        char in_buf[4096];      /* transmit/receive buffer */
 115        char out_buf[4096];     /* transmit/receive buffer */
 116        __u8 *fifo_status;
 117
 118        iobuff_t rx_buff;       /* receive unwrap state machine */
 119        spinlock_t lock;
 120        int receiving;
 121
 122        __u8 ep_in;
 123        __u8 ep_out;
 124
 125        struct urb *rx_urb;
 126        struct urb *tx_urb;
 127
 128        int transceiver_type;
 129        int sir_tweak;
 130        int receive_mode;
 131};
 132
 133static int mcs_set_reg(struct mcs_cb *mcs, __u16 reg, __u16 val);
 134static int mcs_get_reg(struct mcs_cb *mcs, __u16 reg, __u16 * val);
 135
 136static inline int mcs_setup_transceiver_vishay(struct mcs_cb *mcs);
 137static inline int mcs_setup_transceiver_agilent(struct mcs_cb *mcs);
 138static inline int mcs_setup_transceiver_sharp(struct mcs_cb *mcs);
 139static inline int mcs_setup_transceiver(struct mcs_cb *mcs);
 140static inline int mcs_wrap_sir_skb(struct sk_buff *skb, __u8 * buf);
 141static unsigned mcs_wrap_fir_skb(const struct sk_buff *skb, __u8 *buf);
 142static unsigned mcs_wrap_mir_skb(const struct sk_buff *skb, __u8 *buf);
 143static void mcs_unwrap_mir(struct mcs_cb *mcs, __u8 *buf, int len);
 144static void mcs_unwrap_fir(struct mcs_cb *mcs, __u8 *buf, int len);
 145static inline int mcs_setup_urbs(struct mcs_cb *mcs);
 146static inline int mcs_receive_start(struct mcs_cb *mcs);
 147static inline int mcs_find_endpoints(struct mcs_cb *mcs,
 148                                     struct usb_host_endpoint *ep, int epnum);
 149
 150static int mcs_speed_change(struct mcs_cb *mcs);
 151
 152static int mcs_net_ioctl(struct net_device *netdev, struct ifreq *rq, int cmd);
 153static int mcs_net_close(struct net_device *netdev);
 154static int mcs_net_open(struct net_device *netdev);
 155
 156static void mcs_receive_irq(struct urb *urb);
 157static void mcs_send_irq(struct urb *urb);
 158static netdev_tx_t mcs_hard_xmit(struct sk_buff *skb,
 159                                       struct net_device *netdev);
 160
 161static int mcs_probe(struct usb_interface *intf,
 162                     const struct usb_device_id *id);
 163static void mcs_disconnect(struct usb_interface *intf);
 164
 165#endif                          /* _MCS7780_H */
 166