linux/drivers/net/irda/esi-sir.c
<<
>>
Prefs
   1/*********************************************************************
   2 *                
   3 * Filename:      esi.c
   4 * Version:       1.6
   5 * Description:   Driver for the Extended Systems JetEye PC dongle
   6 * Status:        Experimental.
   7 * Author:        Dag Brattli <dagb@cs.uit.no>
   8 * Created at:    Sat Feb 21 18:54:38 1998
   9 * Modified at:   Sun Oct 27 22:01:04 2002
  10 * Modified by:   Martin Diehl <mad@mdiehl.de>
  11 * 
  12 *     Copyright (c) 1999 Dag Brattli, <dagb@cs.uit.no>,
  13 *     Copyright (c) 1998 Thomas Davis, <ratbert@radiks.net>,
  14 *     Copyright (c) 2002 Martin Diehl, <mad@mdiehl.de>,
  15 *     All Rights Reserved.
  16 *     
  17 *     This program is free software; you can redistribute it and/or 
  18 *     modify it under the terms of the GNU General Public License as 
  19 *     published by the Free Software Foundation; either version 2 of 
  20 *     the License, or (at your option) any later version.
  21 * 
  22 *     This program is distributed in the hope that it will be useful,
  23 *     but WITHOUT ANY WARRANTY; without even the implied warranty of
  24 *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  25 *     GNU General Public License for more details.
  26 * 
  27 *     You should have received a copy of the GNU General Public License 
  28 *     along with this program; if not, write to the Free Software 
  29 *     Foundation, Inc., 59 Temple Place, Suite 330, Boston, 
  30 *     MA 02111-1307 USA
  31 *     
  32 ********************************************************************/
  33
  34#include <linux/module.h>
  35#include <linux/delay.h>
  36#include <linux/init.h>
  37
  38#include <net/irda/irda.h>
  39
  40#include "sir-dev.h"
  41
  42static int esi_open(struct sir_dev *);
  43static int esi_close(struct sir_dev *);
  44static int esi_change_speed(struct sir_dev *, unsigned);
  45static int esi_reset(struct sir_dev *);
  46
  47static struct dongle_driver esi = {
  48        .owner          = THIS_MODULE,
  49        .driver_name    = "JetEye PC ESI-9680 PC",
  50        .type           = IRDA_ESI_DONGLE,
  51        .open           = esi_open,
  52        .close          = esi_close,
  53        .reset          = esi_reset,
  54        .set_speed      = esi_change_speed,
  55};
  56
  57static int __init esi_sir_init(void)
  58{
  59        return irda_register_dongle(&esi);
  60}
  61
  62static void __exit esi_sir_cleanup(void)
  63{
  64        irda_unregister_dongle(&esi);
  65}
  66
  67static int esi_open(struct sir_dev *dev)
  68{
  69        struct qos_info *qos = &dev->qos;
  70
  71        /* Power up and set dongle to 9600 baud */
  72        sirdev_set_dtr_rts(dev, FALSE, TRUE);
  73
  74        qos->baud_rate.bits &= IR_9600|IR_19200|IR_115200;
  75        qos->min_turn_time.bits = 0x01; /* Needs at least 10 ms */
  76        irda_qos_bits_to_value(qos);
  77
  78        /* irda thread waits 50 msec for power settling */
  79
  80        return 0;
  81}
  82
  83static int esi_close(struct sir_dev *dev)
  84{
  85        /* Power off dongle */
  86        sirdev_set_dtr_rts(dev, FALSE, FALSE);
  87
  88        return 0;
  89}
  90
  91/*
  92 * Function esi_change_speed (task)
  93 *
  94 * Set the speed for the Extended Systems JetEye PC ESI-9680 type dongle
  95 * Apparently (see old esi-driver) no delays are needed here...
  96 *
  97 */
  98static int esi_change_speed(struct sir_dev *dev, unsigned speed)
  99{
 100        int ret = 0;
 101        int dtr, rts;
 102        
 103        switch (speed) {
 104        case 19200:
 105                dtr = TRUE;
 106                rts = FALSE;
 107                break;
 108        case 115200:
 109                dtr = rts = TRUE;
 110                break;
 111        default:
 112                ret = -EINVAL;
 113                speed = 9600;
 114                /* fall through */
 115        case 9600:
 116                dtr = FALSE;
 117                rts = TRUE;
 118                break;
 119        }
 120
 121        /* Change speed of dongle */
 122        sirdev_set_dtr_rts(dev, dtr, rts);
 123        dev->speed = speed;
 124
 125        return ret;
 126}
 127
 128/*
 129 * Function esi_reset (task)
 130 *
 131 *    Reset dongle;
 132 *
 133 */
 134static int esi_reset(struct sir_dev *dev)
 135{
 136        sirdev_set_dtr_rts(dev, FALSE, FALSE);
 137
 138        /* Hm, the old esi-driver left the dongle unpowered relying on
 139         * the following speed change to repower. This might work for
 140         * the esi because we only need the modem lines. However, now the
 141         * general rule is reset must bring the dongle to some working
 142         * well-known state because speed change might write to registers.
 143         * The old esi-driver didn't any delay here - let's hope it' fine.
 144         */
 145
 146        sirdev_set_dtr_rts(dev, FALSE, TRUE);
 147        dev->speed = 9600;
 148
 149        return 0;
 150}
 151
 152MODULE_AUTHOR("Dag Brattli <dagb@cs.uit.no>");
 153MODULE_DESCRIPTION("Extended Systems JetEye PC dongle driver");
 154MODULE_LICENSE("GPL");
 155MODULE_ALIAS("irda-dongle-1"); /* IRDA_ESI_DONGLE */
 156
 157module_init(esi_sir_init);
 158module_exit(esi_sir_cleanup);
 159
 160