linux/drivers/net/irda/smsc-ircc2.c
<<
>>
Prefs
   1/*********************************************************************
   2 *
   3 * Description:   Driver for the SMC Infrared Communications Controller
   4 * Status:        Experimental.
   5 * Author:        Daniele Peri (peri@csai.unipa.it)
   6 * Created at:
   7 * Modified at:
   8 * Modified by:
   9 *
  10 *     Copyright (c) 2002      Daniele Peri
  11 *     All Rights Reserved.
  12 *     Copyright (c) 2002      Jean Tourrilhes
  13 *     Copyright (c) 2006      Linus Walleij
  14 *
  15 *
  16 * Based on smc-ircc.c:
  17 *
  18 *     Copyright (c) 2001      Stefani Seibold
  19 *     Copyright (c) 1999-2001 Dag Brattli
  20 *     Copyright (c) 1998-1999 Thomas Davis,
  21 *
  22 *      and irport.c:
  23 *
  24 *     Copyright (c) 1997, 1998, 1999-2000 Dag Brattli, All Rights Reserved.
  25 *
  26 *
  27 *     This program is free software; you can redistribute it and/or
  28 *     modify it under the terms of the GNU General Public License as
  29 *     published by the Free Software Foundation; either version 2 of
  30 *     the License, or (at your option) any later version.
  31 *
  32 *     This program is distributed in the hope that it will be useful,
  33 *     but WITHOUT ANY WARRANTY; without even the implied warranty of
  34 *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  35 *     GNU General Public License for more details.
  36 *
  37 *     You should have received a copy of the GNU General Public License
  38 *     along with this program; if not, write to the Free Software
  39 *     Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  40 *     MA 02111-1307 USA
  41 *
  42 ********************************************************************/
  43
  44#include <linux/module.h>
  45#include <linux/kernel.h>
  46#include <linux/types.h>
  47#include <linux/skbuff.h>
  48#include <linux/netdevice.h>
  49#include <linux/ioport.h>
  50#include <linux/delay.h>
  51#include <linux/init.h>
  52#include <linux/interrupt.h>
  53#include <linux/rtnetlink.h>
  54#include <linux/serial_reg.h>
  55#include <linux/dma-mapping.h>
  56#include <linux/pnp.h>
  57#include <linux/platform_device.h>
  58#include <linux/gfp.h>
  59
  60#include <asm/io.h>
  61#include <asm/dma.h>
  62#include <asm/byteorder.h>
  63
  64#include <linux/spinlock.h>
  65#include <linux/pm.h>
  66#ifdef CONFIG_PCI
  67#include <linux/pci.h>
  68#endif
  69
  70#include <net/irda/wrapper.h>
  71#include <net/irda/irda.h>
  72#include <net/irda/irda_device.h>
  73
  74#include "smsc-ircc2.h"
  75#include "smsc-sio.h"
  76
  77
  78MODULE_AUTHOR("Daniele Peri <peri@csai.unipa.it>");
  79MODULE_DESCRIPTION("SMC IrCC SIR/FIR controller driver");
  80MODULE_LICENSE("GPL");
  81
  82static int smsc_nopnp = 1;
  83module_param_named(nopnp, smsc_nopnp, bool, 0);
  84MODULE_PARM_DESC(nopnp, "Do not use PNP to detect controller settings, defaults to true");
  85
  86#define DMA_INVAL 255
  87static int ircc_dma = DMA_INVAL;
  88module_param(ircc_dma, int, 0);
  89MODULE_PARM_DESC(ircc_dma, "DMA channel");
  90
  91#define IRQ_INVAL 255
  92static int ircc_irq = IRQ_INVAL;
  93module_param(ircc_irq, int, 0);
  94MODULE_PARM_DESC(ircc_irq, "IRQ line");
  95
  96static int ircc_fir;
  97module_param(ircc_fir, int, 0);
  98MODULE_PARM_DESC(ircc_fir, "FIR Base Address");
  99
 100static int ircc_sir;
 101module_param(ircc_sir, int, 0);
 102MODULE_PARM_DESC(ircc_sir, "SIR Base Address");
 103
 104static int ircc_cfg;
 105module_param(ircc_cfg, int, 0);
 106MODULE_PARM_DESC(ircc_cfg, "Configuration register base address");
 107
 108static int ircc_transceiver;
 109module_param(ircc_transceiver, int, 0);
 110MODULE_PARM_DESC(ircc_transceiver, "Transceiver type");
 111
 112/* Types */
 113
 114#ifdef CONFIG_PCI
 115struct smsc_ircc_subsystem_configuration {
 116        unsigned short vendor; /* PCI vendor ID */
 117        unsigned short device; /* PCI vendor ID */
 118        unsigned short subvendor; /* PCI subsystem vendor ID */
 119        unsigned short subdevice; /* PCI subsystem device ID */
 120        unsigned short sir_io; /* I/O port for SIR */
 121        unsigned short fir_io; /* I/O port for FIR */
 122        unsigned char  fir_irq; /* FIR IRQ */
 123        unsigned char  fir_dma; /* FIR DMA */
 124        unsigned short cfg_base; /* I/O port for chip configuration */
 125        int (*preconfigure)(struct pci_dev *dev, struct smsc_ircc_subsystem_configuration *conf); /* Preconfig function */
 126        const char *name;       /* name shown as info */
 127};
 128#endif
 129
 130struct smsc_transceiver {
 131        char *name;
 132        void (*set_for_speed)(int fir_base, u32 speed);
 133        int  (*probe)(int fir_base);
 134};
 135
 136struct smsc_chip {
 137        char *name;
 138        #if 0
 139        u8      type;
 140        #endif
 141        u16 flags;
 142        u8 devid;
 143        u8 rev;
 144};
 145
 146struct smsc_chip_address {
 147        unsigned int cfg_base;
 148        unsigned int type;
 149};
 150
 151/* Private data for each instance */
 152struct smsc_ircc_cb {
 153        struct net_device *netdev;     /* Yes! we are some kind of netdevice */
 154        struct irlap_cb    *irlap; /* The link layer we are binded to */
 155
 156        chipio_t io;               /* IrDA controller information */
 157        iobuff_t tx_buff;          /* Transmit buffer */
 158        iobuff_t rx_buff;          /* Receive buffer */
 159        dma_addr_t tx_buff_dma;
 160        dma_addr_t rx_buff_dma;
 161
 162        struct qos_info qos;       /* QoS capabilities for this device */
 163
 164        spinlock_t lock;           /* For serializing operations */
 165
 166        __u32 new_speed;
 167        __u32 flags;               /* Interface flags */
 168
 169        int tx_buff_offsets[10];   /* Offsets between frames in tx_buff */
 170        int tx_len;                /* Number of frames in tx_buff */
 171
 172        int transceiver;
 173        struct platform_device *pldev;
 174};
 175
 176/* Constants */
 177
 178#define SMSC_IRCC2_DRIVER_NAME                  "smsc-ircc2"
 179
 180#define SMSC_IRCC2_C_IRDA_FALLBACK_SPEED        9600
 181#define SMSC_IRCC2_C_DEFAULT_TRANSCEIVER        1
 182#define SMSC_IRCC2_C_NET_TIMEOUT                0
 183#define SMSC_IRCC2_C_SIR_STOP                   0
 184
 185static const char *driver_name = SMSC_IRCC2_DRIVER_NAME;
 186
 187/* Prototypes */
 188
 189static int smsc_ircc_open(unsigned int firbase, unsigned int sirbase, u8 dma, u8 irq);
 190static int smsc_ircc_present(unsigned int fir_base, unsigned int sir_base);
 191static void smsc_ircc_setup_io(struct smsc_ircc_cb *self, unsigned int fir_base, unsigned int sir_base, u8 dma, u8 irq);
 192static void smsc_ircc_setup_qos(struct smsc_ircc_cb *self);
 193static void smsc_ircc_init_chip(struct smsc_ircc_cb *self);
 194static int __exit smsc_ircc_close(struct smsc_ircc_cb *self);
 195static int  smsc_ircc_dma_receive(struct smsc_ircc_cb *self);
 196static void smsc_ircc_dma_receive_complete(struct smsc_ircc_cb *self);
 197static void smsc_ircc_sir_receive(struct smsc_ircc_cb *self);
 198static netdev_tx_t  smsc_ircc_hard_xmit_sir(struct sk_buff *skb,
 199                                                  struct net_device *dev);
 200static netdev_tx_t  smsc_ircc_hard_xmit_fir(struct sk_buff *skb,
 201                                                  struct net_device *dev);
 202static void smsc_ircc_dma_xmit(struct smsc_ircc_cb *self, int bofs);
 203static void smsc_ircc_dma_xmit_complete(struct smsc_ircc_cb *self);
 204static void smsc_ircc_change_speed(struct smsc_ircc_cb *self, u32 speed);
 205static void smsc_ircc_set_sir_speed(struct smsc_ircc_cb *self, u32 speed);
 206static irqreturn_t smsc_ircc_interrupt(int irq, void *dev_id);
 207static irqreturn_t smsc_ircc_interrupt_sir(struct net_device *dev);
 208static void smsc_ircc_sir_start(struct smsc_ircc_cb *self);
 209#if SMSC_IRCC2_C_SIR_STOP
 210static void smsc_ircc_sir_stop(struct smsc_ircc_cb *self);
 211#endif
 212static void smsc_ircc_sir_write_wakeup(struct smsc_ircc_cb *self);
 213static int  smsc_ircc_sir_write(int iobase, int fifo_size, __u8 *buf, int len);
 214static int  smsc_ircc_net_open(struct net_device *dev);
 215static int  smsc_ircc_net_close(struct net_device *dev);
 216static int  smsc_ircc_net_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
 217#if SMSC_IRCC2_C_NET_TIMEOUT
 218static void smsc_ircc_timeout(struct net_device *dev);
 219#endif
 220static int smsc_ircc_is_receiving(struct smsc_ircc_cb *self);
 221static void smsc_ircc_probe_transceiver(struct smsc_ircc_cb *self);
 222static void smsc_ircc_set_transceiver_for_speed(struct smsc_ircc_cb *self, u32 speed);
 223static void smsc_ircc_sir_wait_hw_transmitter_finish(struct smsc_ircc_cb *self);
 224
 225/* Probing */
 226static int __init smsc_ircc_look_for_chips(void);
 227static const struct smsc_chip * __init smsc_ircc_probe(unsigned short cfg_base, u8 reg, const struct smsc_chip *chip, char *type);
 228static int __init smsc_superio_flat(const struct smsc_chip *chips, unsigned short cfg_base, char *type);
 229static int __init smsc_superio_paged(const struct smsc_chip *chips, unsigned short cfg_base, char *type);
 230static int __init smsc_superio_fdc(unsigned short cfg_base);
 231static int __init smsc_superio_lpc(unsigned short cfg_base);
 232#ifdef CONFIG_PCI
 233static int __init preconfigure_smsc_chip(struct smsc_ircc_subsystem_configuration *conf);
 234static int __init preconfigure_through_82801(struct pci_dev *dev, struct smsc_ircc_subsystem_configuration *conf);
 235static void __init preconfigure_ali_port(struct pci_dev *dev,
 236                                         unsigned short port);
 237static int __init preconfigure_through_ali(struct pci_dev *dev, struct smsc_ircc_subsystem_configuration *conf);
 238static int __init smsc_ircc_preconfigure_subsystems(unsigned short ircc_cfg,
 239                                                    unsigned short ircc_fir,
 240                                                    unsigned short ircc_sir,
 241                                                    unsigned char ircc_dma,
 242                                                    unsigned char ircc_irq);
 243#endif
 244
 245/* Transceivers specific functions */
 246
 247static void smsc_ircc_set_transceiver_toshiba_sat1800(int fir_base, u32 speed);
 248static int  smsc_ircc_probe_transceiver_toshiba_sat1800(int fir_base);
 249static void smsc_ircc_set_transceiver_smsc_ircc_fast_pin_select(int fir_base, u32 speed);
 250static int  smsc_ircc_probe_transceiver_smsc_ircc_fast_pin_select(int fir_base);
 251static void smsc_ircc_set_transceiver_smsc_ircc_atc(int fir_base, u32 speed);
 252static int  smsc_ircc_probe_transceiver_smsc_ircc_atc(int fir_base);
 253
 254/* Power Management */
 255
 256static int smsc_ircc_suspend(struct platform_device *dev, pm_message_t state);
 257static int smsc_ircc_resume(struct platform_device *dev);
 258
 259static struct platform_driver smsc_ircc_driver = {
 260        .suspend        = smsc_ircc_suspend,
 261        .resume         = smsc_ircc_resume,
 262        .driver         = {
 263                .name   = SMSC_IRCC2_DRIVER_NAME,
 264        },
 265};
 266
 267/* Transceivers for SMSC-ircc */
 268
 269static struct smsc_transceiver smsc_transceivers[] =
 270{
 271        { "Toshiba Satellite 1800 (GP data pin select)", smsc_ircc_set_transceiver_toshiba_sat1800, smsc_ircc_probe_transceiver_toshiba_sat1800 },
 272        { "Fast pin select", smsc_ircc_set_transceiver_smsc_ircc_fast_pin_select, smsc_ircc_probe_transceiver_smsc_ircc_fast_pin_select },
 273        { "ATC IRMode", smsc_ircc_set_transceiver_smsc_ircc_atc, smsc_ircc_probe_transceiver_smsc_ircc_atc },
 274        { NULL, NULL }
 275};
 276#define SMSC_IRCC2_C_NUMBER_OF_TRANSCEIVERS (ARRAY_SIZE(smsc_transceivers) - 1)
 277
 278/*  SMC SuperIO chipsets definitions */
 279
 280#define KEY55_1 0       /* SuperIO Configuration mode with Key <0x55> */
 281#define KEY55_2 1       /* SuperIO Configuration mode with Key <0x55,0x55> */
 282#define NoIRDA  2       /* SuperIO Chip has no IRDA Port */
 283#define SIR     0       /* SuperIO Chip has only slow IRDA */
 284#define FIR     4       /* SuperIO Chip has fast IRDA */
 285#define SERx4   8       /* SuperIO Chip supports 115,2 KBaud * 4=460,8 KBaud */
 286
 287static struct smsc_chip __initdata fdc_chips_flat[] =
 288{
 289        /* Base address 0x3f0 or 0x370 */
 290        { "37C44",      KEY55_1|NoIRDA,         0x00, 0x00 }, /* This chip cannot be detected */
 291        { "37C665GT",   KEY55_2|NoIRDA,         0x65, 0x01 },
 292        { "37C665GT",   KEY55_2|NoIRDA,         0x66, 0x01 },
 293        { "37C669",     KEY55_2|SIR|SERx4,      0x03, 0x02 },
 294        { "37C669",     KEY55_2|SIR|SERx4,      0x04, 0x02 }, /* ID? */
 295        { "37C78",      KEY55_2|NoIRDA,         0x78, 0x00 },
 296        { "37N769",     KEY55_1|FIR|SERx4,      0x28, 0x00 },
 297        { "37N869",     KEY55_1|FIR|SERx4,      0x29, 0x00 },
 298        { NULL }
 299};
 300
 301static struct smsc_chip __initdata fdc_chips_paged[] =
 302{
 303        /* Base address 0x3f0 or 0x370 */
 304        { "37B72X",     KEY55_1|SIR|SERx4,      0x4c, 0x00 },
 305        { "37B77X",     KEY55_1|SIR|SERx4,      0x43, 0x00 },
 306        { "37B78X",     KEY55_1|SIR|SERx4,      0x44, 0x00 },
 307        { "37B80X",     KEY55_1|SIR|SERx4,      0x42, 0x00 },
 308        { "37C67X",     KEY55_1|FIR|SERx4,      0x40, 0x00 },
 309        { "37C93X",     KEY55_2|SIR|SERx4,      0x02, 0x01 },
 310        { "37C93XAPM",  KEY55_1|SIR|SERx4,      0x30, 0x01 },
 311        { "37C93XFR",   KEY55_2|FIR|SERx4,      0x03, 0x01 },
 312        { "37M707",     KEY55_1|SIR|SERx4,      0x42, 0x00 },
 313        { "37M81X",     KEY55_1|SIR|SERx4,      0x4d, 0x00 },
 314        { "37N958FR",   KEY55_1|FIR|SERx4,      0x09, 0x04 },
 315        { "37N971",     KEY55_1|FIR|SERx4,      0x0a, 0x00 },
 316        { "37N972",     KEY55_1|FIR|SERx4,      0x0b, 0x00 },
 317        { NULL }
 318};
 319
 320static struct smsc_chip __initdata lpc_chips_flat[] =
 321{
 322        /* Base address 0x2E or 0x4E */
 323        { "47N227",     KEY55_1|FIR|SERx4,      0x5a, 0x00 },
 324        { "47N227",     KEY55_1|FIR|SERx4,      0x7a, 0x00 },
 325        { "47N267",     KEY55_1|FIR|SERx4,      0x5e, 0x00 },
 326        { NULL }
 327};
 328
 329static struct smsc_chip __initdata lpc_chips_paged[] =
 330{
 331        /* Base address 0x2E or 0x4E */
 332        { "47B27X",     KEY55_1|SIR|SERx4,      0x51, 0x00 },
 333        { "47B37X",     KEY55_1|SIR|SERx4,      0x52, 0x00 },
 334        { "47M10X",     KEY55_1|SIR|SERx4,      0x59, 0x00 },
 335        { "47M120",     KEY55_1|NoIRDA|SERx4,   0x5c, 0x00 },
 336        { "47M13X",     KEY55_1|SIR|SERx4,      0x59, 0x00 },
 337        { "47M14X",     KEY55_1|SIR|SERx4,      0x5f, 0x00 },
 338        { "47N252",     KEY55_1|FIR|SERx4,      0x0e, 0x00 },
 339        { "47S42X",     KEY55_1|SIR|SERx4,      0x57, 0x00 },
 340        { NULL }
 341};
 342
 343#define SMSCSIO_TYPE_FDC        1
 344#define SMSCSIO_TYPE_LPC        2
 345#define SMSCSIO_TYPE_FLAT       4
 346#define SMSCSIO_TYPE_PAGED      8
 347
 348static struct smsc_chip_address __initdata possible_addresses[] =
 349{
 350        { 0x3f0, SMSCSIO_TYPE_FDC|SMSCSIO_TYPE_FLAT|SMSCSIO_TYPE_PAGED },
 351        { 0x370, SMSCSIO_TYPE_FDC|SMSCSIO_TYPE_FLAT|SMSCSIO_TYPE_PAGED },
 352        { 0xe0,  SMSCSIO_TYPE_FDC|SMSCSIO_TYPE_FLAT|SMSCSIO_TYPE_PAGED },
 353        { 0x2e,  SMSCSIO_TYPE_LPC|SMSCSIO_TYPE_FLAT|SMSCSIO_TYPE_PAGED },
 354        { 0x4e,  SMSCSIO_TYPE_LPC|SMSCSIO_TYPE_FLAT|SMSCSIO_TYPE_PAGED },
 355        { 0, 0 }
 356};
 357
 358/* Globals */
 359
 360static struct smsc_ircc_cb *dev_self[] = { NULL, NULL };
 361static unsigned short dev_count;
 362
 363static inline void register_bank(int iobase, int bank)
 364{
 365        outb(((inb(iobase + IRCC_MASTER) & 0xf0) | (bank & 0x07)),
 366               iobase + IRCC_MASTER);
 367}
 368
 369/* PNP hotplug support */
 370static const struct pnp_device_id smsc_ircc_pnp_table[] = {
 371        { .id = "SMCf010", .driver_data = 0 },
 372        /* and presumably others */
 373        { }
 374};
 375MODULE_DEVICE_TABLE(pnp, smsc_ircc_pnp_table);
 376
 377static int pnp_driver_registered;
 378
 379#ifdef CONFIG_PNP
 380static int __devinit smsc_ircc_pnp_probe(struct pnp_dev *dev,
 381                                      const struct pnp_device_id *dev_id)
 382{
 383        unsigned int firbase, sirbase;
 384        u8 dma, irq;
 385
 386        if (!(pnp_port_valid(dev, 0) && pnp_port_valid(dev, 1) &&
 387              pnp_dma_valid(dev, 0) && pnp_irq_valid(dev, 0)))
 388                return -EINVAL;
 389
 390        sirbase = pnp_port_start(dev, 0);
 391        firbase = pnp_port_start(dev, 1);
 392        dma = pnp_dma(dev, 0);
 393        irq = pnp_irq(dev, 0);
 394
 395        if (smsc_ircc_open(firbase, sirbase, dma, irq))
 396                return -ENODEV;
 397
 398        return 0;
 399}
 400
 401static struct pnp_driver smsc_ircc_pnp_driver = {
 402        .name           = "smsc-ircc2",
 403        .id_table       = smsc_ircc_pnp_table,
 404        .probe          = smsc_ircc_pnp_probe,
 405};
 406#else /* CONFIG_PNP */
 407static struct pnp_driver smsc_ircc_pnp_driver;
 408#endif
 409
 410/*******************************************************************************
 411 *
 412 *
 413 * SMSC-ircc stuff
 414 *
 415 *
 416 *******************************************************************************/
 417
 418static int __init smsc_ircc_legacy_probe(void)
 419{
 420        int ret = 0;
 421
 422#ifdef CONFIG_PCI
 423        if (smsc_ircc_preconfigure_subsystems(ircc_cfg, ircc_fir, ircc_sir, ircc_dma, ircc_irq) < 0) {
 424                /* Ignore errors from preconfiguration */
 425                IRDA_ERROR("%s, Preconfiguration failed !\n", driver_name);
 426        }
 427#endif
 428
 429        if (ircc_fir > 0 && ircc_sir > 0) {
 430                IRDA_MESSAGE(" Overriding FIR address 0x%04x\n", ircc_fir);
 431                IRDA_MESSAGE(" Overriding SIR address 0x%04x\n", ircc_sir);
 432
 433                if (smsc_ircc_open(ircc_fir, ircc_sir, ircc_dma, ircc_irq))
 434                        ret = -ENODEV;
 435        } else {
 436                ret = -ENODEV;
 437
 438                /* try user provided configuration register base address */
 439                if (ircc_cfg > 0) {
 440                        IRDA_MESSAGE(" Overriding configuration address "
 441                                     "0x%04x\n", ircc_cfg);
 442                        if (!smsc_superio_fdc(ircc_cfg))
 443                                ret = 0;
 444                        if (!smsc_superio_lpc(ircc_cfg))
 445                                ret = 0;
 446                }
 447
 448                if (smsc_ircc_look_for_chips() > 0)
 449                        ret = 0;
 450        }
 451        return ret;
 452}
 453
 454/*
 455 * Function smsc_ircc_init ()
 456 *
 457 *    Initialize chip. Just try to find out how many chips we are dealing with
 458 *    and where they are
 459 */
 460static int __init smsc_ircc_init(void)
 461{
 462        int ret;
 463
 464        IRDA_DEBUG(1, "%s\n", __func__);
 465
 466        ret = platform_driver_register(&smsc_ircc_driver);
 467        if (ret) {
 468                IRDA_ERROR("%s, Can't register driver!\n", driver_name);
 469                return ret;
 470        }
 471
 472        dev_count = 0;
 473
 474        if (smsc_nopnp || !pnp_platform_devices ||
 475            ircc_cfg || ircc_fir || ircc_sir ||
 476            ircc_dma != DMA_INVAL || ircc_irq != IRQ_INVAL) {
 477                ret = smsc_ircc_legacy_probe();
 478        } else {
 479                if (pnp_register_driver(&smsc_ircc_pnp_driver) == 0)
 480                        pnp_driver_registered = 1;
 481        }
 482
 483        if (ret) {
 484                if (pnp_driver_registered)
 485                        pnp_unregister_driver(&smsc_ircc_pnp_driver);
 486                platform_driver_unregister(&smsc_ircc_driver);
 487        }
 488
 489        return ret;
 490}
 491
 492static netdev_tx_t smsc_ircc_net_xmit(struct sk_buff *skb,
 493                                            struct net_device *dev)
 494{
 495        struct smsc_ircc_cb *self = netdev_priv(dev);
 496
 497        if (self->io.speed > 115200)
 498                return  smsc_ircc_hard_xmit_fir(skb, dev);
 499        else
 500                return  smsc_ircc_hard_xmit_sir(skb, dev);
 501}
 502
 503static const struct net_device_ops smsc_ircc_netdev_ops = {
 504        .ndo_open       = smsc_ircc_net_open,
 505        .ndo_stop       = smsc_ircc_net_close,
 506        .ndo_do_ioctl   = smsc_ircc_net_ioctl,
 507        .ndo_start_xmit = smsc_ircc_net_xmit,
 508#if SMSC_IRCC2_C_NET_TIMEOUT
 509        .ndo_tx_timeout = smsc_ircc_timeout,
 510#endif
 511};
 512
 513/*
 514 * Function smsc_ircc_open (firbase, sirbase, dma, irq)
 515 *
 516 *    Try to open driver instance
 517 *
 518 */
 519static int __devinit smsc_ircc_open(unsigned int fir_base, unsigned int sir_base, u8 dma, u8 irq)
 520{
 521        struct smsc_ircc_cb *self;
 522        struct net_device *dev;
 523        int err;
 524
 525        IRDA_DEBUG(1, "%s\n", __func__);
 526
 527        err = smsc_ircc_present(fir_base, sir_base);
 528        if (err)
 529                goto err_out;
 530
 531        err = -ENOMEM;
 532        if (dev_count >= ARRAY_SIZE(dev_self)) {
 533                IRDA_WARNING("%s(), too many devices!\n", __func__);
 534                goto err_out1;
 535        }
 536
 537        /*
 538         *  Allocate new instance of the driver
 539         */
 540        dev = alloc_irdadev(sizeof(struct smsc_ircc_cb));
 541        if (!dev) {
 542                IRDA_WARNING("%s() can't allocate net device\n", __func__);
 543                goto err_out1;
 544        }
 545
 546#if SMSC_IRCC2_C_NET_TIMEOUT
 547        dev->watchdog_timeo  = HZ * 2;  /* Allow enough time for speed change */
 548#endif
 549        dev->netdev_ops = &smsc_ircc_netdev_ops;
 550
 551        self = netdev_priv(dev);
 552        self->netdev = dev;
 553
 554        /* Make ifconfig display some details */
 555        dev->base_addr = self->io.fir_base = fir_base;
 556        dev->irq = self->io.irq = irq;
 557
 558        /* Need to store self somewhere */
 559        dev_self[dev_count] = self;
 560        spin_lock_init(&self->lock);
 561
 562        self->rx_buff.truesize = SMSC_IRCC2_RX_BUFF_TRUESIZE;
 563        self->tx_buff.truesize = SMSC_IRCC2_TX_BUFF_TRUESIZE;
 564
 565        self->rx_buff.head =
 566                dma_alloc_coherent(NULL, self->rx_buff.truesize,
 567                                   &self->rx_buff_dma, GFP_KERNEL);
 568        if (self->rx_buff.head == NULL) {
 569                IRDA_ERROR("%s, Can't allocate memory for receive buffer!\n",
 570                           driver_name);
 571                goto err_out2;
 572        }
 573
 574        self->tx_buff.head =
 575                dma_alloc_coherent(NULL, self->tx_buff.truesize,
 576                                   &self->tx_buff_dma, GFP_KERNEL);
 577        if (self->tx_buff.head == NULL) {
 578                IRDA_ERROR("%s, Can't allocate memory for transmit buffer!\n",
 579                           driver_name);
 580                goto err_out3;
 581        }
 582
 583        memset(self->rx_buff.head, 0, self->rx_buff.truesize);
 584        memset(self->tx_buff.head, 0, self->tx_buff.truesize);
 585
 586        self->rx_buff.in_frame = FALSE;
 587        self->rx_buff.state = OUTSIDE_FRAME;
 588        self->tx_buff.data = self->tx_buff.head;
 589        self->rx_buff.data = self->rx_buff.head;
 590
 591        smsc_ircc_setup_io(self, fir_base, sir_base, dma, irq);
 592        smsc_ircc_setup_qos(self);
 593        smsc_ircc_init_chip(self);
 594
 595        if (ircc_transceiver > 0  &&
 596            ircc_transceiver < SMSC_IRCC2_C_NUMBER_OF_TRANSCEIVERS)
 597                self->transceiver = ircc_transceiver;
 598        else
 599                smsc_ircc_probe_transceiver(self);
 600
 601        err = register_netdev(self->netdev);
 602        if (err) {
 603                IRDA_ERROR("%s, Network device registration failed!\n",
 604                           driver_name);
 605                goto err_out4;
 606        }
 607
 608        self->pldev = platform_device_register_simple(SMSC_IRCC2_DRIVER_NAME,
 609                                                      dev_count, NULL, 0);
 610        if (IS_ERR(self->pldev)) {
 611                err = PTR_ERR(self->pldev);
 612                goto err_out5;
 613        }
 614        platform_set_drvdata(self->pldev, self);
 615
 616        IRDA_MESSAGE("IrDA: Registered device %s\n", dev->name);
 617        dev_count++;
 618
 619        return 0;
 620
 621 err_out5:
 622        unregister_netdev(self->netdev);
 623
 624 err_out4:
 625        dma_free_coherent(NULL, self->tx_buff.truesize,
 626                          self->tx_buff.head, self->tx_buff_dma);
 627 err_out3:
 628        dma_free_coherent(NULL, self->rx_buff.truesize,
 629                          self->rx_buff.head, self->rx_buff_dma);
 630 err_out2:
 631        free_netdev(self->netdev);
 632        dev_self[dev_count] = NULL;
 633 err_out1:
 634        release_region(fir_base, SMSC_IRCC2_FIR_CHIP_IO_EXTENT);
 635        release_region(sir_base, SMSC_IRCC2_SIR_CHIP_IO_EXTENT);
 636 err_out:
 637        return err;
 638}
 639
 640/*
 641 * Function smsc_ircc_present(fir_base, sir_base)
 642 *
 643 *    Check the smsc-ircc chip presence
 644 *
 645 */
 646static int smsc_ircc_present(unsigned int fir_base, unsigned int sir_base)
 647{
 648        unsigned char low, high, chip, config, dma, irq, version;
 649
 650        if (!request_region(fir_base, SMSC_IRCC2_FIR_CHIP_IO_EXTENT,
 651                            driver_name)) {
 652                IRDA_WARNING("%s: can't get fir_base of 0x%03x\n",
 653                             __func__, fir_base);
 654                goto out1;
 655        }
 656
 657        if (!request_region(sir_base, SMSC_IRCC2_SIR_CHIP_IO_EXTENT,
 658                            driver_name)) {
 659                IRDA_WARNING("%s: can't get sir_base of 0x%03x\n",
 660                             __func__, sir_base);
 661                goto out2;
 662        }
 663
 664        register_bank(fir_base, 3);
 665
 666        high    = inb(fir_base + IRCC_ID_HIGH);
 667        low     = inb(fir_base + IRCC_ID_LOW);
 668        chip    = inb(fir_base + IRCC_CHIP_ID);
 669        version = inb(fir_base + IRCC_VERSION);
 670        config  = inb(fir_base + IRCC_INTERFACE);
 671        dma     = config & IRCC_INTERFACE_DMA_MASK;
 672        irq     = (config & IRCC_INTERFACE_IRQ_MASK) >> 4;
 673
 674        if (high != 0x10 || low != 0xb8 || (chip != 0xf1 && chip != 0xf2)) {
 675                IRDA_WARNING("%s(), addr 0x%04x - no device found!\n",
 676                             __func__, fir_base);
 677                goto out3;
 678        }
 679        IRDA_MESSAGE("SMsC IrDA Controller found\n IrCC version %d.%d, "
 680                     "firport 0x%03x, sirport 0x%03x dma=%d, irq=%d\n",
 681                     chip & 0x0f, version, fir_base, sir_base, dma, irq);
 682
 683        return 0;
 684
 685 out3:
 686        release_region(sir_base, SMSC_IRCC2_SIR_CHIP_IO_EXTENT);
 687 out2:
 688        release_region(fir_base, SMSC_IRCC2_FIR_CHIP_IO_EXTENT);
 689 out1:
 690        return -ENODEV;
 691}
 692
 693/*
 694 * Function smsc_ircc_setup_io(self, fir_base, sir_base, dma, irq)
 695 *
 696 *    Setup I/O
 697 *
 698 */
 699static void smsc_ircc_setup_io(struct smsc_ircc_cb *self,
 700                               unsigned int fir_base, unsigned int sir_base,
 701                               u8 dma, u8 irq)
 702{
 703        unsigned char config, chip_dma, chip_irq;
 704
 705        register_bank(fir_base, 3);
 706        config = inb(fir_base + IRCC_INTERFACE);
 707        chip_dma = config & IRCC_INTERFACE_DMA_MASK;
 708        chip_irq = (config & IRCC_INTERFACE_IRQ_MASK) >> 4;
 709
 710        self->io.fir_base  = fir_base;
 711        self->io.sir_base  = sir_base;
 712        self->io.fir_ext   = SMSC_IRCC2_FIR_CHIP_IO_EXTENT;
 713        self->io.sir_ext   = SMSC_IRCC2_SIR_CHIP_IO_EXTENT;
 714        self->io.fifo_size = SMSC_IRCC2_FIFO_SIZE;
 715        self->io.speed = SMSC_IRCC2_C_IRDA_FALLBACK_SPEED;
 716
 717        if (irq != IRQ_INVAL) {
 718                if (irq != chip_irq)
 719                        IRDA_MESSAGE("%s, Overriding IRQ - chip says %d, using %d\n",
 720                                     driver_name, chip_irq, irq);
 721                self->io.irq = irq;
 722        } else
 723                self->io.irq = chip_irq;
 724
 725        if (dma != DMA_INVAL) {
 726                if (dma != chip_dma)
 727                        IRDA_MESSAGE("%s, Overriding DMA - chip says %d, using %d\n",
 728                                     driver_name, chip_dma, dma);
 729                self->io.dma = dma;
 730        } else
 731                self->io.dma = chip_dma;
 732
 733}
 734
 735/*
 736 * Function smsc_ircc_setup_qos(self)
 737 *
 738 *    Setup qos
 739 *
 740 */
 741static void smsc_ircc_setup_qos(struct smsc_ircc_cb *self)
 742{
 743        /* Initialize QoS for this device */
 744        irda_init_max_qos_capabilies(&self->qos);
 745
 746        self->qos.baud_rate.bits = IR_9600|IR_19200|IR_38400|IR_57600|
 747                IR_115200|IR_576000|IR_1152000|(IR_4000000 << 8);
 748
 749        self->qos.min_turn_time.bits = SMSC_IRCC2_MIN_TURN_TIME;
 750        self->qos.window_size.bits = SMSC_IRCC2_WINDOW_SIZE;
 751        irda_qos_bits_to_value(&self->qos);
 752}
 753
 754/*
 755 * Function smsc_ircc_init_chip(self)
 756 *
 757 *    Init chip
 758 *
 759 */
 760static void smsc_ircc_init_chip(struct smsc_ircc_cb *self)
 761{
 762        int iobase = self->io.fir_base;
 763
 764        register_bank(iobase, 0);
 765        outb(IRCC_MASTER_RESET, iobase + IRCC_MASTER);
 766        outb(0x00, iobase + IRCC_MASTER);
 767
 768        register_bank(iobase, 1);
 769        outb(((inb(iobase + IRCC_SCE_CFGA) & 0x87) | IRCC_CFGA_IRDA_SIR_A),
 770             iobase + IRCC_SCE_CFGA);
 771
 772#ifdef smsc_669 /* Uses pin 88/89 for Rx/Tx */
 773        outb(((inb(iobase + IRCC_SCE_CFGB) & 0x3f) | IRCC_CFGB_MUX_COM),
 774             iobase + IRCC_SCE_CFGB);
 775#else
 776        outb(((inb(iobase + IRCC_SCE_CFGB) & 0x3f) | IRCC_CFGB_MUX_IR),
 777             iobase + IRCC_SCE_CFGB);
 778#endif
 779        (void) inb(iobase + IRCC_FIFO_THRESHOLD);
 780        outb(SMSC_IRCC2_FIFO_THRESHOLD, iobase + IRCC_FIFO_THRESHOLD);
 781
 782        register_bank(iobase, 4);
 783        outb((inb(iobase + IRCC_CONTROL) & 0x30), iobase + IRCC_CONTROL);
 784
 785        register_bank(iobase, 0);
 786        outb(0, iobase + IRCC_LCR_A);
 787
 788        smsc_ircc_set_sir_speed(self, SMSC_IRCC2_C_IRDA_FALLBACK_SPEED);
 789
 790        /* Power on device */
 791        outb(0x00, iobase + IRCC_MASTER);
 792}
 793
 794/*
 795 * Function smsc_ircc_net_ioctl (dev, rq, cmd)
 796 *
 797 *    Process IOCTL commands for this device
 798 *
 799 */
 800static int smsc_ircc_net_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
 801{
 802        struct if_irda_req *irq = (struct if_irda_req *) rq;
 803        struct smsc_ircc_cb *self;
 804        unsigned long flags;
 805        int ret = 0;
 806
 807        IRDA_ASSERT(dev != NULL, return -1;);
 808
 809        self = netdev_priv(dev);
 810
 811        IRDA_ASSERT(self != NULL, return -1;);
 812
 813        IRDA_DEBUG(2, "%s(), %s, (cmd=0x%X)\n", __func__, dev->name, cmd);
 814
 815        switch (cmd) {
 816        case SIOCSBANDWIDTH: /* Set bandwidth */
 817                if (!capable(CAP_NET_ADMIN))
 818                        ret = -EPERM;
 819                else {
 820                        /* Make sure we are the only one touching
 821                         * self->io.speed and the hardware - Jean II */
 822                        spin_lock_irqsave(&self->lock, flags);
 823                        smsc_ircc_change_speed(self, irq->ifr_baudrate);
 824                        spin_unlock_irqrestore(&self->lock, flags);
 825                }
 826                break;
 827        case SIOCSMEDIABUSY: /* Set media busy */
 828                if (!capable(CAP_NET_ADMIN)) {
 829                        ret = -EPERM;
 830                        break;
 831                }
 832
 833                irda_device_set_media_busy(self->netdev, TRUE);
 834                break;
 835        case SIOCGRECEIVING: /* Check if we are receiving right now */
 836                irq->ifr_receiving = smsc_ircc_is_receiving(self);
 837                break;
 838        #if 0
 839        case SIOCSDTRRTS:
 840                if (!capable(CAP_NET_ADMIN)) {
 841                        ret = -EPERM;
 842                        break;
 843                }
 844                smsc_ircc_sir_set_dtr_rts(dev, irq->ifr_dtr, irq->ifr_rts);
 845                break;
 846        #endif
 847        default:
 848                ret = -EOPNOTSUPP;
 849        }
 850
 851        return ret;
 852}
 853
 854#if SMSC_IRCC2_C_NET_TIMEOUT
 855/*
 856 * Function smsc_ircc_timeout (struct net_device *dev)
 857 *
 858 *    The networking timeout management.
 859 *
 860 */
 861
 862static void smsc_ircc_timeout(struct net_device *dev)
 863{
 864        struct smsc_ircc_cb *self = netdev_priv(dev);
 865        unsigned long flags;
 866
 867        IRDA_WARNING("%s: transmit timed out, changing speed to: %d\n",
 868                     dev->name, self->io.speed);
 869        spin_lock_irqsave(&self->lock, flags);
 870        smsc_ircc_sir_start(self);
 871        smsc_ircc_change_speed(self, self->io.speed);
 872        dev->trans_start = jiffies; /* prevent tx timeout */
 873        netif_wake_queue(dev);
 874        spin_unlock_irqrestore(&self->lock, flags);
 875}
 876#endif
 877
 878/*
 879 * Function smsc_ircc_hard_xmit_sir (struct sk_buff *skb, struct net_device *dev)
 880 *
 881 *    Transmits the current frame until FIFO is full, then
 882 *    waits until the next transmit interrupt, and continues until the
 883 *    frame is transmitted.
 884 */
 885static netdev_tx_t smsc_ircc_hard_xmit_sir(struct sk_buff *skb,
 886                                                 struct net_device *dev)
 887{
 888        struct smsc_ircc_cb *self;
 889        unsigned long flags;
 890        s32 speed;
 891
 892        IRDA_DEBUG(1, "%s\n", __func__);
 893
 894        IRDA_ASSERT(dev != NULL, return NETDEV_TX_OK;);
 895
 896        self = netdev_priv(dev);
 897        IRDA_ASSERT(self != NULL, return NETDEV_TX_OK;);
 898
 899        netif_stop_queue(dev);
 900
 901        /* Make sure test of self->io.speed & speed change are atomic */
 902        spin_lock_irqsave(&self->lock, flags);
 903
 904        /* Check if we need to change the speed */
 905        speed = irda_get_next_speed(skb);
 906        if (speed != self->io.speed && speed != -1) {
 907                /* Check for empty frame */
 908                if (!skb->len) {
 909                        /*
 910                         * We send frames one by one in SIR mode (no
 911                         * pipelining), so at this point, if we were sending
 912                         * a previous frame, we just received the interrupt
 913                         * telling us it is finished (UART_IIR_THRI).
 914                         * Therefore, waiting for the transmitter to really
 915                         * finish draining the fifo won't take too long.
 916                         * And the interrupt handler is not expected to run.
 917                         * - Jean II */
 918                        smsc_ircc_sir_wait_hw_transmitter_finish(self);
 919                        smsc_ircc_change_speed(self, speed);
 920                        spin_unlock_irqrestore(&self->lock, flags);
 921                        dev_kfree_skb(skb);
 922                        return NETDEV_TX_OK;
 923                }
 924                self->new_speed = speed;
 925        }
 926
 927        /* Init tx buffer */
 928        self->tx_buff.data = self->tx_buff.head;
 929
 930        /* Copy skb to tx_buff while wrapping, stuffing and making CRC */
 931        self->tx_buff.len = async_wrap_skb(skb, self->tx_buff.data,
 932                                           self->tx_buff.truesize);
 933
 934        dev->stats.tx_bytes += self->tx_buff.len;
 935
 936        /* Turn on transmit finished interrupt. Will fire immediately!  */
 937        outb(UART_IER_THRI, self->io.sir_base + UART_IER);
 938
 939        spin_unlock_irqrestore(&self->lock, flags);
 940
 941        dev_kfree_skb(skb);
 942
 943        return NETDEV_TX_OK;
 944}
 945
 946/*
 947 * Function smsc_ircc_set_fir_speed (self, baud)
 948 *
 949 *    Change the speed of the device
 950 *
 951 */
 952static void smsc_ircc_set_fir_speed(struct smsc_ircc_cb *self, u32 speed)
 953{
 954        int fir_base, ir_mode, ctrl, fast;
 955
 956        IRDA_ASSERT(self != NULL, return;);
 957        fir_base = self->io.fir_base;
 958
 959        self->io.speed = speed;
 960
 961        switch (speed) {
 962        default:
 963        case 576000:
 964                ir_mode = IRCC_CFGA_IRDA_HDLC;
 965                ctrl = IRCC_CRC;
 966                fast = 0;
 967                IRDA_DEBUG(0, "%s(), handling baud of 576000\n", __func__);
 968                break;
 969        case 1152000:
 970                ir_mode = IRCC_CFGA_IRDA_HDLC;
 971                ctrl = IRCC_1152 | IRCC_CRC;
 972                fast = IRCC_LCR_A_FAST | IRCC_LCR_A_GP_DATA;
 973                IRDA_DEBUG(0, "%s(), handling baud of 1152000\n",
 974                           __func__);
 975                break;
 976        case 4000000:
 977                ir_mode = IRCC_CFGA_IRDA_4PPM;
 978                ctrl = IRCC_CRC;
 979                fast = IRCC_LCR_A_FAST;
 980                IRDA_DEBUG(0, "%s(), handling baud of 4000000\n",
 981                           __func__);
 982                break;
 983        }
 984        #if 0
 985        Now in tranceiver!
 986        /* This causes an interrupt */
 987        register_bank(fir_base, 0);
 988        outb((inb(fir_base + IRCC_LCR_A) &  0xbf) | fast, fir_base + IRCC_LCR_A);
 989        #endif
 990
 991        register_bank(fir_base, 1);
 992        outb(((inb(fir_base + IRCC_SCE_CFGA) & IRCC_SCE_CFGA_BLOCK_CTRL_BITS_MASK) | ir_mode), fir_base + IRCC_SCE_CFGA);
 993
 994        register_bank(fir_base, 4);
 995        outb((inb(fir_base + IRCC_CONTROL) & 0x30) | ctrl, fir_base + IRCC_CONTROL);
 996}
 997
 998/*
 999 * Function smsc_ircc_fir_start(self)
1000 *
1001 *    Change the speed of the device
1002 *
1003 */
1004static void smsc_ircc_fir_start(struct smsc_ircc_cb *self)
1005{
1006        struct net_device *dev;
1007        int fir_base;
1008
1009        IRDA_DEBUG(1, "%s\n", __func__);
1010
1011        IRDA_ASSERT(self != NULL, return;);
1012        dev = self->netdev;
1013        IRDA_ASSERT(dev != NULL, return;);
1014
1015        fir_base = self->io.fir_base;
1016
1017        /* Reset everything */
1018
1019        /* Clear FIFO */
1020        outb(inb(fir_base + IRCC_LCR_A) | IRCC_LCR_A_FIFO_RESET, fir_base + IRCC_LCR_A);
1021
1022        /* Enable interrupt */
1023        /*outb(IRCC_IER_ACTIVE_FRAME|IRCC_IER_EOM, fir_base + IRCC_IER);*/
1024
1025        register_bank(fir_base, 1);
1026
1027        /* Select the TX/RX interface */
1028#ifdef SMSC_669 /* Uses pin 88/89 for Rx/Tx */
1029        outb(((inb(fir_base + IRCC_SCE_CFGB) & 0x3f) | IRCC_CFGB_MUX_COM),
1030             fir_base + IRCC_SCE_CFGB);
1031#else
1032        outb(((inb(fir_base + IRCC_SCE_CFGB) & 0x3f) | IRCC_CFGB_MUX_IR),
1033             fir_base + IRCC_SCE_CFGB);
1034#endif
1035        (void) inb(fir_base + IRCC_FIFO_THRESHOLD);
1036
1037        /* Enable SCE interrupts */
1038        outb(0, fir_base + IRCC_MASTER);
1039        register_bank(fir_base, 0);
1040        outb(IRCC_IER_ACTIVE_FRAME | IRCC_IER_EOM, fir_base + IRCC_IER);
1041        outb(IRCC_MASTER_INT_EN, fir_base + IRCC_MASTER);
1042}
1043
1044/*
1045 * Function smsc_ircc_fir_stop(self, baud)
1046 *
1047 *    Change the speed of the device
1048 *
1049 */
1050static void smsc_ircc_fir_stop(struct smsc_ircc_cb *self)
1051{
1052        int fir_base;
1053
1054        IRDA_DEBUG(1, "%s\n", __func__);
1055
1056        IRDA_ASSERT(self != NULL, return;);
1057
1058        fir_base = self->io.fir_base;
1059        register_bank(fir_base, 0);
1060        /*outb(IRCC_MASTER_RESET, fir_base + IRCC_MASTER);*/
1061        outb(inb(fir_base + IRCC_LCR_B) & IRCC_LCR_B_SIP_ENABLE, fir_base + IRCC_LCR_B);
1062}
1063
1064
1065/*
1066 * Function smsc_ircc_change_speed(self, baud)
1067 *
1068 *    Change the speed of the device
1069 *
1070 * This function *must* be called with spinlock held, because it may
1071 * be called from the irq handler. - Jean II
1072 */
1073static void smsc_ircc_change_speed(struct smsc_ircc_cb *self, u32 speed)
1074{
1075        struct net_device *dev;
1076        int last_speed_was_sir;
1077
1078        IRDA_DEBUG(0, "%s() changing speed to: %d\n", __func__, speed);
1079
1080        IRDA_ASSERT(self != NULL, return;);
1081        dev = self->netdev;
1082
1083        last_speed_was_sir = self->io.speed <= SMSC_IRCC2_MAX_SIR_SPEED;
1084
1085        #if 0
1086        /* Temp Hack */
1087        speed= 1152000;
1088        self->io.speed = speed;
1089        last_speed_was_sir = 0;
1090        smsc_ircc_fir_start(self);
1091        #endif
1092
1093        if (self->io.speed == 0)
1094                smsc_ircc_sir_start(self);
1095
1096        #if 0
1097        if (!last_speed_was_sir) speed = self->io.speed;
1098        #endif
1099
1100        if (self->io.speed != speed)
1101                smsc_ircc_set_transceiver_for_speed(self, speed);
1102
1103        self->io.speed = speed;
1104
1105        if (speed <= SMSC_IRCC2_MAX_SIR_SPEED) {
1106                if (!last_speed_was_sir) {
1107                        smsc_ircc_fir_stop(self);
1108                        smsc_ircc_sir_start(self);
1109                }
1110                smsc_ircc_set_sir_speed(self, speed);
1111        } else {
1112                if (last_speed_was_sir) {
1113                        #if SMSC_IRCC2_C_SIR_STOP
1114                        smsc_ircc_sir_stop(self);
1115                        #endif
1116                        smsc_ircc_fir_start(self);
1117                }
1118                smsc_ircc_set_fir_speed(self, speed);
1119
1120                #if 0
1121                self->tx_buff.len = 10;
1122                self->tx_buff.data = self->tx_buff.head;
1123
1124                smsc_ircc_dma_xmit(self, 4000);
1125                #endif
1126                /* Be ready for incoming frames */
1127                smsc_ircc_dma_receive(self);
1128        }
1129
1130        netif_wake_queue(dev);
1131}
1132
1133/*
1134 * Function smsc_ircc_set_sir_speed (self, speed)
1135 *
1136 *    Set speed of IrDA port to specified baudrate
1137 *
1138 */
1139static void smsc_ircc_set_sir_speed(struct smsc_ircc_cb *self, __u32 speed)
1140{
1141        int iobase;
1142        int fcr;    /* FIFO control reg */
1143        int lcr;    /* Line control reg */
1144        int divisor;
1145
1146        IRDA_DEBUG(0, "%s(), Setting speed to: %d\n", __func__, speed);
1147
1148        IRDA_ASSERT(self != NULL, return;);
1149        iobase = self->io.sir_base;
1150
1151        /* Update accounting for new speed */
1152        self->io.speed = speed;
1153
1154        /* Turn off interrupts */
1155        outb(0, iobase + UART_IER);
1156
1157        divisor = SMSC_IRCC2_MAX_SIR_SPEED / speed;
1158
1159        fcr = UART_FCR_ENABLE_FIFO;
1160
1161        /*
1162         * Use trigger level 1 to avoid 3 ms. timeout delay at 9600 bps, and
1163         * almost 1,7 ms at 19200 bps. At speeds above that we can just forget
1164         * about this timeout since it will always be fast enough.
1165         */
1166        fcr |= self->io.speed < 38400 ?
1167                UART_FCR_TRIGGER_1 : UART_FCR_TRIGGER_14;
1168
1169        /* IrDA ports use 8N1 */
1170        lcr = UART_LCR_WLEN8;
1171
1172        outb(UART_LCR_DLAB | lcr, iobase + UART_LCR); /* Set DLAB */
1173        outb(divisor & 0xff,      iobase + UART_DLL); /* Set speed */
1174        outb(divisor >> 8,        iobase + UART_DLM);
1175        outb(lcr,                 iobase + UART_LCR); /* Set 8N1 */
1176        outb(fcr,                 iobase + UART_FCR); /* Enable FIFO's */
1177
1178        /* Turn on interrups */
1179        outb(UART_IER_RLSI | UART_IER_RDI | UART_IER_THRI, iobase + UART_IER);
1180
1181        IRDA_DEBUG(2, "%s() speed changed to: %d\n", __func__, speed);
1182}
1183
1184
1185/*
1186 * Function smsc_ircc_hard_xmit_fir (skb, dev)
1187 *
1188 *    Transmit the frame!
1189 *
1190 */
1191static netdev_tx_t smsc_ircc_hard_xmit_fir(struct sk_buff *skb,
1192                                                 struct net_device *dev)
1193{
1194        struct smsc_ircc_cb *self;
1195        unsigned long flags;
1196        s32 speed;
1197        int mtt;
1198
1199        IRDA_ASSERT(dev != NULL, return NETDEV_TX_OK;);
1200        self = netdev_priv(dev);
1201        IRDA_ASSERT(self != NULL, return NETDEV_TX_OK;);
1202
1203        netif_stop_queue(dev);
1204
1205        /* Make sure test of self->io.speed & speed change are atomic */
1206        spin_lock_irqsave(&self->lock, flags);
1207
1208        /* Check if we need to change the speed after this frame */
1209        speed = irda_get_next_speed(skb);
1210        if (speed != self->io.speed && speed != -1) {
1211                /* Check for empty frame */
1212                if (!skb->len) {
1213                        /* Note : you should make sure that speed changes
1214                         * are not going to corrupt any outgoing frame.
1215                         * Look at nsc-ircc for the gory details - Jean II */
1216                        smsc_ircc_change_speed(self, speed);
1217                        spin_unlock_irqrestore(&self->lock, flags);
1218                        dev_kfree_skb(skb);
1219                        return NETDEV_TX_OK;
1220                }
1221
1222                self->new_speed = speed;
1223        }
1224
1225        skb_copy_from_linear_data(skb, self->tx_buff.head, skb->len);
1226
1227        self->tx_buff.len = skb->len;
1228        self->tx_buff.data = self->tx_buff.head;
1229
1230        mtt = irda_get_mtt(skb);
1231        if (mtt) {
1232                int bofs;
1233
1234                /*
1235                 * Compute how many BOFs (STA or PA's) we need to waste the
1236                 * min turn time given the speed of the link.
1237                 */
1238                bofs = mtt * (self->io.speed / 1000) / 8000;
1239                if (bofs > 4095)
1240                        bofs = 4095;
1241
1242                smsc_ircc_dma_xmit(self, bofs);
1243        } else {
1244                /* Transmit frame */
1245                smsc_ircc_dma_xmit(self, 0);
1246        }
1247
1248        spin_unlock_irqrestore(&self->lock, flags);
1249        dev_kfree_skb(skb);
1250
1251        return NETDEV_TX_OK;
1252}
1253
1254/*
1255 * Function smsc_ircc_dma_xmit (self, bofs)
1256 *
1257 *    Transmit data using DMA
1258 *
1259 */
1260static void smsc_ircc_dma_xmit(struct smsc_ircc_cb *self, int bofs)
1261{
1262        int iobase = self->io.fir_base;
1263        u8 ctrl;
1264
1265        IRDA_DEBUG(3, "%s\n", __func__);
1266#if 1
1267        /* Disable Rx */
1268        register_bank(iobase, 0);
1269        outb(0x00, iobase + IRCC_LCR_B);
1270#endif
1271        register_bank(iobase, 1);
1272        outb(inb(iobase + IRCC_SCE_CFGB) & ~IRCC_CFGB_DMA_ENABLE,
1273             iobase + IRCC_SCE_CFGB);
1274
1275        self->io.direction = IO_XMIT;
1276
1277        /* Set BOF additional count for generating the min turn time */
1278        register_bank(iobase, 4);
1279        outb(bofs & 0xff, iobase + IRCC_BOF_COUNT_LO);
1280        ctrl = inb(iobase + IRCC_CONTROL) & 0xf0;
1281        outb(ctrl | ((bofs >> 8) & 0x0f), iobase + IRCC_BOF_COUNT_HI);
1282
1283        /* Set max Tx frame size */
1284        outb(self->tx_buff.len >> 8, iobase + IRCC_TX_SIZE_HI);
1285        outb(self->tx_buff.len & 0xff, iobase + IRCC_TX_SIZE_LO);
1286
1287        /*outb(UART_MCR_OUT2, self->io.sir_base + UART_MCR);*/
1288
1289        /* Enable burst mode chip Tx DMA */
1290        register_bank(iobase, 1);
1291        outb(inb(iobase + IRCC_SCE_CFGB) | IRCC_CFGB_DMA_ENABLE |
1292             IRCC_CFGB_DMA_BURST, iobase + IRCC_SCE_CFGB);
1293
1294        /* Setup DMA controller (must be done after enabling chip DMA) */
1295        irda_setup_dma(self->io.dma, self->tx_buff_dma, self->tx_buff.len,
1296                       DMA_TX_MODE);
1297
1298        /* Enable interrupt */
1299
1300        register_bank(iobase, 0);
1301        outb(IRCC_IER_ACTIVE_FRAME | IRCC_IER_EOM, iobase + IRCC_IER);
1302        outb(IRCC_MASTER_INT_EN, iobase + IRCC_MASTER);
1303
1304        /* Enable transmit */
1305        outb(IRCC_LCR_B_SCE_TRANSMIT | IRCC_LCR_B_SIP_ENABLE, iobase + IRCC_LCR_B);
1306}
1307
1308/*
1309 * Function smsc_ircc_dma_xmit_complete (self)
1310 *
1311 *    The transfer of a frame in finished. This function will only be called
1312 *    by the interrupt handler
1313 *
1314 */
1315static void smsc_ircc_dma_xmit_complete(struct smsc_ircc_cb *self)
1316{
1317        int iobase = self->io.fir_base;
1318
1319        IRDA_DEBUG(3, "%s\n", __func__);
1320#if 0
1321        /* Disable Tx */
1322        register_bank(iobase, 0);
1323        outb(0x00, iobase + IRCC_LCR_B);
1324#endif
1325        register_bank(iobase, 1);
1326        outb(inb(iobase + IRCC_SCE_CFGB) & ~IRCC_CFGB_DMA_ENABLE,
1327             iobase + IRCC_SCE_CFGB);
1328
1329        /* Check for underrun! */
1330        register_bank(iobase, 0);
1331        if (inb(iobase + IRCC_LSR) & IRCC_LSR_UNDERRUN) {
1332                self->netdev->stats.tx_errors++;
1333                self->netdev->stats.tx_fifo_errors++;
1334
1335                /* Reset error condition */
1336                register_bank(iobase, 0);
1337                outb(IRCC_MASTER_ERROR_RESET, iobase + IRCC_MASTER);
1338                outb(0x00, iobase + IRCC_MASTER);
1339        } else {
1340                self->netdev->stats.tx_packets++;
1341                self->netdev->stats.tx_bytes += self->tx_buff.len;
1342        }
1343
1344        /* Check if it's time to change the speed */
1345        if (self->new_speed) {
1346                smsc_ircc_change_speed(self, self->new_speed);
1347                self->new_speed = 0;
1348        }
1349
1350        netif_wake_queue(self->netdev);
1351}
1352
1353/*
1354 * Function smsc_ircc_dma_receive(self)
1355 *
1356 *    Get ready for receiving a frame. The device will initiate a DMA
1357 *    if it starts to receive a frame.
1358 *
1359 */
1360static int smsc_ircc_dma_receive(struct smsc_ircc_cb *self)
1361{
1362        int iobase = self->io.fir_base;
1363#if 0
1364        /* Turn off chip DMA */
1365        register_bank(iobase, 1);
1366        outb(inb(iobase + IRCC_SCE_CFGB) & ~IRCC_CFGB_DMA_ENABLE,
1367             iobase + IRCC_SCE_CFGB);
1368#endif
1369
1370        /* Disable Tx */
1371        register_bank(iobase, 0);
1372        outb(0x00, iobase + IRCC_LCR_B);
1373
1374        /* Turn off chip DMA */
1375        register_bank(iobase, 1);
1376        outb(inb(iobase + IRCC_SCE_CFGB) & ~IRCC_CFGB_DMA_ENABLE,
1377             iobase + IRCC_SCE_CFGB);
1378
1379        self->io.direction = IO_RECV;
1380        self->rx_buff.data = self->rx_buff.head;
1381
1382        /* Set max Rx frame size */
1383        register_bank(iobase, 4);
1384        outb((2050 >> 8) & 0x0f, iobase + IRCC_RX_SIZE_HI);
1385        outb(2050 & 0xff, iobase + IRCC_RX_SIZE_LO);
1386
1387        /* Setup DMA controller */
1388        irda_setup_dma(self->io.dma, self->rx_buff_dma, self->rx_buff.truesize,
1389                       DMA_RX_MODE);
1390
1391        /* Enable burst mode chip Rx DMA */
1392        register_bank(iobase, 1);
1393        outb(inb(iobase + IRCC_SCE_CFGB) | IRCC_CFGB_DMA_ENABLE |
1394             IRCC_CFGB_DMA_BURST, iobase + IRCC_SCE_CFGB);
1395
1396        /* Enable interrupt */
1397        register_bank(iobase, 0);
1398        outb(IRCC_IER_ACTIVE_FRAME | IRCC_IER_EOM, iobase + IRCC_IER);
1399        outb(IRCC_MASTER_INT_EN, iobase + IRCC_MASTER);
1400
1401        /* Enable receiver */
1402        register_bank(iobase, 0);
1403        outb(IRCC_LCR_B_SCE_RECEIVE | IRCC_LCR_B_SIP_ENABLE,
1404             iobase + IRCC_LCR_B);
1405
1406        return 0;
1407}
1408
1409/*
1410 * Function smsc_ircc_dma_receive_complete(self)
1411 *
1412 *    Finished with receiving frames
1413 *
1414 */
1415static void smsc_ircc_dma_receive_complete(struct smsc_ircc_cb *self)
1416{
1417        struct sk_buff *skb;
1418        int len, msgcnt, lsr;
1419        int iobase = self->io.fir_base;
1420
1421        register_bank(iobase, 0);
1422
1423        IRDA_DEBUG(3, "%s\n", __func__);
1424#if 0
1425        /* Disable Rx */
1426        register_bank(iobase, 0);
1427        outb(0x00, iobase + IRCC_LCR_B);
1428#endif
1429        register_bank(iobase, 0);
1430        outb(inb(iobase + IRCC_LSAR) & ~IRCC_LSAR_ADDRESS_MASK, iobase + IRCC_LSAR);
1431        lsr= inb(iobase + IRCC_LSR);
1432        msgcnt = inb(iobase + IRCC_LCR_B) & 0x08;
1433
1434        IRDA_DEBUG(2, "%s: dma count = %d\n", __func__,
1435                   get_dma_residue(self->io.dma));
1436
1437        len = self->rx_buff.truesize - get_dma_residue(self->io.dma);
1438
1439        /* Look for errors */
1440        if (lsr & (IRCC_LSR_FRAME_ERROR | IRCC_LSR_CRC_ERROR | IRCC_LSR_SIZE_ERROR)) {
1441                self->netdev->stats.rx_errors++;
1442                if (lsr & IRCC_LSR_FRAME_ERROR)
1443                        self->netdev->stats.rx_frame_errors++;
1444                if (lsr & IRCC_LSR_CRC_ERROR)
1445                        self->netdev->stats.rx_crc_errors++;
1446                if (lsr & IRCC_LSR_SIZE_ERROR)
1447                        self->netdev->stats.rx_length_errors++;
1448                if (lsr & (IRCC_LSR_UNDERRUN | IRCC_LSR_OVERRUN))
1449                        self->netdev->stats.rx_length_errors++;
1450                return;
1451        }
1452
1453        /* Remove CRC */
1454        len -= self->io.speed < 4000000 ? 2 : 4;
1455
1456        if (len < 2 || len > 2050) {
1457                IRDA_WARNING("%s(), bogus len=%d\n", __func__, len);
1458                return;
1459        }
1460        IRDA_DEBUG(2, "%s: msgcnt = %d, len=%d\n", __func__, msgcnt, len);
1461
1462        skb = dev_alloc_skb(len + 1);
1463        if (!skb) {
1464                IRDA_WARNING("%s(), memory squeeze, dropping frame.\n",
1465                             __func__);
1466                return;
1467        }
1468        /* Make sure IP header gets aligned */
1469        skb_reserve(skb, 1);
1470
1471        memcpy(skb_put(skb, len), self->rx_buff.data, len);
1472        self->netdev->stats.rx_packets++;
1473        self->netdev->stats.rx_bytes += len;
1474
1475        skb->dev = self->netdev;
1476        skb_reset_mac_header(skb);
1477        skb->protocol = htons(ETH_P_IRDA);
1478        netif_rx(skb);
1479}
1480
1481/*
1482 * Function smsc_ircc_sir_receive (self)
1483 *
1484 *    Receive one frame from the infrared port
1485 *
1486 */
1487static void smsc_ircc_sir_receive(struct smsc_ircc_cb *self)
1488{
1489        int boguscount = 0;
1490        int iobase;
1491
1492        IRDA_ASSERT(self != NULL, return;);
1493
1494        iobase = self->io.sir_base;
1495
1496        /*
1497         * Receive all characters in Rx FIFO, unwrap and unstuff them.
1498         * async_unwrap_char will deliver all found frames
1499         */
1500        do {
1501                async_unwrap_char(self->netdev, &self->netdev->stats, &self->rx_buff,
1502                                  inb(iobase + UART_RX));
1503
1504                /* Make sure we don't stay here to long */
1505                if (boguscount++ > 32) {
1506                        IRDA_DEBUG(2, "%s(), breaking!\n", __func__);
1507                        break;
1508                }
1509        } while (inb(iobase + UART_LSR) & UART_LSR_DR);
1510}
1511
1512
1513/*
1514 * Function smsc_ircc_interrupt (irq, dev_id, regs)
1515 *
1516 *    An interrupt from the chip has arrived. Time to do some work
1517 *
1518 */
1519static irqreturn_t smsc_ircc_interrupt(int dummy, void *dev_id)
1520{
1521        struct net_device *dev = dev_id;
1522        struct smsc_ircc_cb *self = netdev_priv(dev);
1523        int iobase, iir, lcra, lsr;
1524        irqreturn_t ret = IRQ_NONE;
1525
1526        /* Serialise the interrupt handler in various CPUs, stop Tx path */
1527        spin_lock(&self->lock);
1528
1529        /* Check if we should use the SIR interrupt handler */
1530        if (self->io.speed <= SMSC_IRCC2_MAX_SIR_SPEED) {
1531                ret = smsc_ircc_interrupt_sir(dev);
1532                goto irq_ret_unlock;
1533        }
1534
1535        iobase = self->io.fir_base;
1536
1537        register_bank(iobase, 0);
1538        iir = inb(iobase + IRCC_IIR);
1539        if (iir == 0)
1540                goto irq_ret_unlock;
1541        ret = IRQ_HANDLED;
1542
1543        /* Disable interrupts */
1544        outb(0, iobase + IRCC_IER);
1545        lcra = inb(iobase + IRCC_LCR_A);
1546        lsr = inb(iobase + IRCC_LSR);
1547
1548        IRDA_DEBUG(2, "%s(), iir = 0x%02x\n", __func__, iir);
1549
1550        if (iir & IRCC_IIR_EOM) {
1551                if (self->io.direction == IO_RECV)
1552                        smsc_ircc_dma_receive_complete(self);
1553                else
1554                        smsc_ircc_dma_xmit_complete(self);
1555
1556                smsc_ircc_dma_receive(self);
1557        }
1558
1559        if (iir & IRCC_IIR_ACTIVE_FRAME) {
1560                /*printk(KERN_WARNING "%s(): Active Frame\n", __func__);*/
1561        }
1562
1563        /* Enable interrupts again */
1564
1565        register_bank(iobase, 0);
1566        outb(IRCC_IER_ACTIVE_FRAME | IRCC_IER_EOM, iobase + IRCC_IER);
1567
1568 irq_ret_unlock:
1569        spin_unlock(&self->lock);
1570
1571        return ret;
1572}
1573
1574/*
1575 * Function irport_interrupt_sir (irq, dev_id)
1576 *
1577 *    Interrupt handler for SIR modes
1578 */
1579static irqreturn_t smsc_ircc_interrupt_sir(struct net_device *dev)
1580{
1581        struct smsc_ircc_cb *self = netdev_priv(dev);
1582        int boguscount = 0;
1583        int iobase;
1584        int iir, lsr;
1585
1586        /* Already locked coming here in smsc_ircc_interrupt() */
1587        /*spin_lock(&self->lock);*/
1588
1589        iobase = self->io.sir_base;
1590
1591        iir = inb(iobase + UART_IIR) & UART_IIR_ID;
1592        if (iir == 0)
1593                return IRQ_NONE;
1594        while (iir) {
1595                /* Clear interrupt */
1596                lsr = inb(iobase + UART_LSR);
1597
1598                IRDA_DEBUG(4, "%s(), iir=%02x, lsr=%02x, iobase=%#x\n",
1599                            __func__, iir, lsr, iobase);
1600
1601                switch (iir) {
1602                case UART_IIR_RLSI:
1603                        IRDA_DEBUG(2, "%s(), RLSI\n", __func__);
1604                        break;
1605                case UART_IIR_RDI:
1606                        /* Receive interrupt */
1607                        smsc_ircc_sir_receive(self);
1608                        break;
1609                case UART_IIR_THRI:
1610                        if (lsr & UART_LSR_THRE)
1611                                /* Transmitter ready for data */
1612                                smsc_ircc_sir_write_wakeup(self);
1613                        break;
1614                default:
1615                        IRDA_DEBUG(0, "%s(), unhandled IIR=%#x\n",
1616                                   __func__, iir);
1617                        break;
1618                }
1619
1620                /* Make sure we don't stay here to long */
1621                if (boguscount++ > 100)
1622                        break;
1623
1624                iir = inb(iobase + UART_IIR) & UART_IIR_ID;
1625        }
1626        /*spin_unlock(&self->lock);*/
1627        return IRQ_HANDLED;
1628}
1629
1630
1631#if 0 /* unused */
1632/*
1633 * Function ircc_is_receiving (self)
1634 *
1635 *    Return TRUE is we are currently receiving a frame
1636 *
1637 */
1638static int ircc_is_receiving(struct smsc_ircc_cb *self)
1639{
1640        int status = FALSE;
1641        /* int iobase; */
1642
1643        IRDA_DEBUG(1, "%s\n", __func__);
1644
1645        IRDA_ASSERT(self != NULL, return FALSE;);
1646
1647        IRDA_DEBUG(0, "%s: dma count = %d\n", __func__,
1648                   get_dma_residue(self->io.dma));
1649
1650        status = (self->rx_buff.state != OUTSIDE_FRAME);
1651
1652        return status;
1653}
1654#endif /* unused */
1655
1656static int smsc_ircc_request_irq(struct smsc_ircc_cb *self)
1657{
1658        int error;
1659
1660        error = request_irq(self->io.irq, smsc_ircc_interrupt, 0,
1661                            self->netdev->name, self->netdev);
1662        if (error)
1663                IRDA_DEBUG(0, "%s(), unable to allocate irq=%d, err=%d\n",
1664                           __func__, self->io.irq, error);
1665
1666        return error;
1667}
1668
1669static void smsc_ircc_start_interrupts(struct smsc_ircc_cb *self)
1670{
1671        unsigned long flags;
1672
1673        spin_lock_irqsave(&self->lock, flags);
1674
1675        self->io.speed = 0;
1676        smsc_ircc_change_speed(self, SMSC_IRCC2_C_IRDA_FALLBACK_SPEED);
1677
1678        spin_unlock_irqrestore(&self->lock, flags);
1679}
1680
1681static void smsc_ircc_stop_interrupts(struct smsc_ircc_cb *self)
1682{
1683        int iobase = self->io.fir_base;
1684        unsigned long flags;
1685
1686        spin_lock_irqsave(&self->lock, flags);
1687
1688        register_bank(iobase, 0);
1689        outb(0, iobase + IRCC_IER);
1690        outb(IRCC_MASTER_RESET, iobase + IRCC_MASTER);
1691        outb(0x00, iobase + IRCC_MASTER);
1692
1693        spin_unlock_irqrestore(&self->lock, flags);
1694}
1695
1696
1697/*
1698 * Function smsc_ircc_net_open (dev)
1699 *
1700 *    Start the device
1701 *
1702 */
1703static int smsc_ircc_net_open(struct net_device *dev)
1704{
1705        struct smsc_ircc_cb *self;
1706        char hwname[16];
1707
1708        IRDA_DEBUG(1, "%s\n", __func__);
1709
1710        IRDA_ASSERT(dev != NULL, return -1;);
1711        self = netdev_priv(dev);
1712        IRDA_ASSERT(self != NULL, return 0;);
1713
1714        if (self->io.suspended) {
1715                IRDA_DEBUG(0, "%s(), device is suspended\n", __func__);
1716                return -EAGAIN;
1717        }
1718
1719        if (request_irq(self->io.irq, smsc_ircc_interrupt, 0, dev->name,
1720                        (void *) dev)) {
1721                IRDA_DEBUG(0, "%s(), unable to allocate irq=%d\n",
1722                           __func__, self->io.irq);
1723                return -EAGAIN;
1724        }
1725
1726        smsc_ircc_start_interrupts(self);
1727
1728        /* Give self a hardware name */
1729        /* It would be cool to offer the chip revision here - Jean II */
1730        sprintf(hwname, "SMSC @ 0x%03x", self->io.fir_base);
1731
1732        /*
1733         * Open new IrLAP layer instance, now that everything should be
1734         * initialized properly
1735         */
1736        self->irlap = irlap_open(dev, &self->qos, hwname);
1737
1738        /*
1739         * Always allocate the DMA channel after the IRQ,
1740         * and clean up on failure.
1741         */
1742        if (request_dma(self->io.dma, dev->name)) {
1743                smsc_ircc_net_close(dev);
1744
1745                IRDA_WARNING("%s(), unable to allocate DMA=%d\n",
1746                             __func__, self->io.dma);
1747                return -EAGAIN;
1748        }
1749
1750        netif_start_queue(dev);
1751
1752        return 0;
1753}
1754
1755/*
1756 * Function smsc_ircc_net_close (dev)
1757 *
1758 *    Stop the device
1759 *
1760 */
1761static int smsc_ircc_net_close(struct net_device *dev)
1762{
1763        struct smsc_ircc_cb *self;
1764
1765        IRDA_DEBUG(1, "%s\n", __func__);
1766
1767        IRDA_ASSERT(dev != NULL, return -1;);
1768        self = netdev_priv(dev);
1769        IRDA_ASSERT(self != NULL, return 0;);
1770
1771        /* Stop device */
1772        netif_stop_queue(dev);
1773
1774        /* Stop and remove instance of IrLAP */
1775        if (self->irlap)
1776                irlap_close(self->irlap);
1777        self->irlap = NULL;
1778
1779        smsc_ircc_stop_interrupts(self);
1780
1781        /* if we are called from smsc_ircc_resume we don't have IRQ reserved */
1782        if (!self->io.suspended)
1783                free_irq(self->io.irq, dev);
1784
1785        disable_dma(self->io.dma);
1786        free_dma(self->io.dma);
1787
1788        return 0;
1789}
1790
1791static int smsc_ircc_suspend(struct platform_device *dev, pm_message_t state)
1792{
1793        struct smsc_ircc_cb *self = platform_get_drvdata(dev);
1794
1795        if (!self->io.suspended) {
1796                IRDA_DEBUG(1, "%s, Suspending\n", driver_name);
1797
1798                rtnl_lock();
1799                if (netif_running(self->netdev)) {
1800                        netif_device_detach(self->netdev);
1801                        smsc_ircc_stop_interrupts(self);
1802                        free_irq(self->io.irq, self->netdev);
1803                        disable_dma(self->io.dma);
1804                }
1805                self->io.suspended = 1;
1806                rtnl_unlock();
1807        }
1808
1809        return 0;
1810}
1811
1812static int smsc_ircc_resume(struct platform_device *dev)
1813{
1814        struct smsc_ircc_cb *self = platform_get_drvdata(dev);
1815
1816        if (self->io.suspended) {
1817                IRDA_DEBUG(1, "%s, Waking up\n", driver_name);
1818
1819                rtnl_lock();
1820                smsc_ircc_init_chip(self);
1821                if (netif_running(self->netdev)) {
1822                        if (smsc_ircc_request_irq(self)) {
1823                                /*
1824                                 * Don't fail resume process, just kill this
1825                                 * network interface
1826                                 */
1827                                unregister_netdevice(self->netdev);
1828                        } else {
1829                                enable_dma(self->io.dma);
1830                                smsc_ircc_start_interrupts(self);
1831                                netif_device_attach(self->netdev);
1832                        }
1833                }
1834                self->io.suspended = 0;
1835                rtnl_unlock();
1836        }
1837        return 0;
1838}
1839
1840/*
1841 * Function smsc_ircc_close (self)
1842 *
1843 *    Close driver instance
1844 *
1845 */
1846static int __exit smsc_ircc_close(struct smsc_ircc_cb *self)
1847{
1848        IRDA_DEBUG(1, "%s\n", __func__);
1849
1850        IRDA_ASSERT(self != NULL, return -1;);
1851
1852        platform_device_unregister(self->pldev);
1853
1854        /* Remove netdevice */
1855        unregister_netdev(self->netdev);
1856
1857        smsc_ircc_stop_interrupts(self);
1858
1859        /* Release the PORTS that this driver is using */
1860        IRDA_DEBUG(0, "%s(), releasing 0x%03x\n",  __func__,
1861                   self->io.fir_base);
1862
1863        release_region(self->io.fir_base, self->io.fir_ext);
1864
1865        IRDA_DEBUG(0, "%s(), releasing 0x%03x\n", __func__,
1866                   self->io.sir_base);
1867
1868        release_region(self->io.sir_base, self->io.sir_ext);
1869
1870        if (self->tx_buff.head)
1871                dma_free_coherent(NULL, self->tx_buff.truesize,
1872                                  self->tx_buff.head, self->tx_buff_dma);
1873
1874        if (self->rx_buff.head)
1875                dma_free_coherent(NULL, self->rx_buff.truesize,
1876                                  self->rx_buff.head, self->rx_buff_dma);
1877
1878        free_netdev(self->netdev);
1879
1880        return 0;
1881}
1882
1883static void __exit smsc_ircc_cleanup(void)
1884{
1885        int i;
1886
1887        IRDA_DEBUG(1, "%s\n", __func__);
1888
1889        for (i = 0; i < 2; i++) {
1890                if (dev_self[i])
1891                        smsc_ircc_close(dev_self[i]);
1892        }
1893
1894        if (pnp_driver_registered)
1895                pnp_unregister_driver(&smsc_ircc_pnp_driver);
1896
1897        platform_driver_unregister(&smsc_ircc_driver);
1898}
1899
1900/*
1901 *      Start SIR operations
1902 *
1903 * This function *must* be called with spinlock held, because it may
1904 * be called from the irq handler (via smsc_ircc_change_speed()). - Jean II
1905 */
1906static void smsc_ircc_sir_start(struct smsc_ircc_cb *self)
1907{
1908        struct net_device *dev;
1909        int fir_base, sir_base;
1910
1911        IRDA_DEBUG(3, "%s\n", __func__);
1912
1913        IRDA_ASSERT(self != NULL, return;);
1914        dev = self->netdev;
1915        IRDA_ASSERT(dev != NULL, return;);
1916
1917        fir_base = self->io.fir_base;
1918        sir_base = self->io.sir_base;
1919
1920        /* Reset everything */
1921        outb(IRCC_MASTER_RESET, fir_base + IRCC_MASTER);
1922
1923        #if SMSC_IRCC2_C_SIR_STOP
1924        /*smsc_ircc_sir_stop(self);*/
1925        #endif
1926
1927        register_bank(fir_base, 1);
1928        outb(((inb(fir_base + IRCC_SCE_CFGA) & IRCC_SCE_CFGA_BLOCK_CTRL_BITS_MASK) | IRCC_CFGA_IRDA_SIR_A), fir_base + IRCC_SCE_CFGA);
1929
1930        /* Initialize UART */
1931        outb(UART_LCR_WLEN8, sir_base + UART_LCR);  /* Reset DLAB */
1932        outb((UART_MCR_DTR | UART_MCR_RTS | UART_MCR_OUT2), sir_base + UART_MCR);
1933
1934        /* Turn on interrups */
1935        outb(UART_IER_RLSI | UART_IER_RDI |UART_IER_THRI, sir_base + UART_IER);
1936
1937        IRDA_DEBUG(3, "%s() - exit\n", __func__);
1938
1939        outb(0x00, fir_base + IRCC_MASTER);
1940}
1941
1942#if SMSC_IRCC2_C_SIR_STOP
1943void smsc_ircc_sir_stop(struct smsc_ircc_cb *self)
1944{
1945        int iobase;
1946
1947        IRDA_DEBUG(3, "%s\n", __func__);
1948        iobase = self->io.sir_base;
1949
1950        /* Reset UART */
1951        outb(0, iobase + UART_MCR);
1952
1953        /* Turn off interrupts */
1954        outb(0, iobase + UART_IER);
1955}
1956#endif
1957
1958/*
1959 * Function smsc_sir_write_wakeup (self)
1960 *
1961 *    Called by the SIR interrupt handler when there's room for more data.
1962 *    If we have more packets to send, we send them here.
1963 *
1964 */
1965static void smsc_ircc_sir_write_wakeup(struct smsc_ircc_cb *self)
1966{
1967        int actual = 0;
1968        int iobase;
1969        int fcr;
1970
1971        IRDA_ASSERT(self != NULL, return;);
1972
1973        IRDA_DEBUG(4, "%s\n", __func__);
1974
1975        iobase = self->io.sir_base;
1976
1977        /* Finished with frame?  */
1978        if (self->tx_buff.len > 0)  {
1979                /* Write data left in transmit buffer */
1980                actual = smsc_ircc_sir_write(iobase, self->io.fifo_size,
1981                                      self->tx_buff.data, self->tx_buff.len);
1982                self->tx_buff.data += actual;
1983                self->tx_buff.len  -= actual;
1984        } else {
1985
1986        /*if (self->tx_buff.len ==0)  {*/
1987
1988                /*
1989                 *  Now serial buffer is almost free & we can start
1990                 *  transmission of another packet. But first we must check
1991                 *  if we need to change the speed of the hardware
1992                 */
1993                if (self->new_speed) {
1994                        IRDA_DEBUG(5, "%s(), Changing speed to %d.\n",
1995                                   __func__, self->new_speed);
1996                        smsc_ircc_sir_wait_hw_transmitter_finish(self);
1997                        smsc_ircc_change_speed(self, self->new_speed);
1998                        self->new_speed = 0;
1999                } else {
2000                        /* Tell network layer that we want more frames */
2001                        netif_wake_queue(self->netdev);
2002                }
2003                self->netdev->stats.tx_packets++;
2004
2005                if (self->io.speed <= 115200) {
2006                        /*
2007                         * Reset Rx FIFO to make sure that all reflected transmit data
2008                         * is discarded. This is needed for half duplex operation
2009                         */
2010                        fcr = UART_FCR_ENABLE_FIFO | UART_FCR_CLEAR_RCVR;
2011                        fcr |= self->io.speed < 38400 ?
2012                                        UART_FCR_TRIGGER_1 : UART_FCR_TRIGGER_14;
2013
2014                        outb(fcr, iobase + UART_FCR);
2015
2016                        /* Turn on receive interrupts */
2017                        outb(UART_IER_RDI, iobase + UART_IER);
2018                }
2019        }
2020}
2021
2022/*
2023 * Function smsc_ircc_sir_write (iobase, fifo_size, buf, len)
2024 *
2025 *    Fill Tx FIFO with transmit data
2026 *
2027 */
2028static int smsc_ircc_sir_write(int iobase, int fifo_size, __u8 *buf, int len)
2029{
2030        int actual = 0;
2031
2032        /* Tx FIFO should be empty! */
2033        if (!(inb(iobase + UART_LSR) & UART_LSR_THRE)) {
2034                IRDA_WARNING("%s(), failed, fifo not empty!\n", __func__);
2035                return 0;
2036        }
2037
2038        /* Fill FIFO with current frame */
2039        while (fifo_size-- > 0 && actual < len) {
2040                /* Transmit next byte */
2041                outb(buf[actual], iobase + UART_TX);
2042                actual++;
2043        }
2044        return actual;
2045}
2046
2047/*
2048 * Function smsc_ircc_is_receiving (self)
2049 *
2050 *    Returns true is we are currently receiving data
2051 *
2052 */
2053static int smsc_ircc_is_receiving(struct smsc_ircc_cb *self)
2054{
2055        return self->rx_buff.state != OUTSIDE_FRAME;
2056}
2057
2058
2059/*
2060 * Function smsc_ircc_probe_transceiver(self)
2061 *
2062 *    Tries to find the used Transceiver
2063 *
2064 */
2065static void smsc_ircc_probe_transceiver(struct smsc_ircc_cb *self)
2066{
2067        unsigned int    i;
2068
2069        IRDA_ASSERT(self != NULL, return;);
2070
2071        for (i = 0; smsc_transceivers[i].name != NULL; i++)
2072                if (smsc_transceivers[i].probe(self->io.fir_base)) {
2073                        IRDA_MESSAGE(" %s transceiver found\n",
2074                                     smsc_transceivers[i].name);
2075                        self->transceiver= i + 1;
2076                        return;
2077                }
2078
2079        IRDA_MESSAGE("No transceiver found. Defaulting to %s\n",
2080                     smsc_transceivers[SMSC_IRCC2_C_DEFAULT_TRANSCEIVER].name);
2081
2082        self->transceiver = SMSC_IRCC2_C_DEFAULT_TRANSCEIVER;
2083}
2084
2085
2086/*
2087 * Function smsc_ircc_set_transceiver_for_speed(self, speed)
2088 *
2089 *    Set the transceiver according to the speed
2090 *
2091 */
2092static void smsc_ircc_set_transceiver_for_speed(struct smsc_ircc_cb *self, u32 speed)
2093{
2094        unsigned int trx;
2095
2096        trx = self->transceiver;
2097        if (trx > 0)
2098                smsc_transceivers[trx - 1].set_for_speed(self->io.fir_base, speed);
2099}
2100
2101/*
2102 * Function smsc_ircc_wait_hw_transmitter_finish ()
2103 *
2104 *    Wait for the real end of HW transmission
2105 *
2106 * The UART is a strict FIFO, and we get called only when we have finished
2107 * pushing data to the FIFO, so the maximum amount of time we must wait
2108 * is only for the FIFO to drain out.
2109 *
2110 * We use a simple calibrated loop. We may need to adjust the loop
2111 * delay (udelay) to balance I/O traffic and latency. And we also need to
2112 * adjust the maximum timeout.
2113 * It would probably be better to wait for the proper interrupt,
2114 * but it doesn't seem to be available.
2115 *
2116 * We can't use jiffies or kernel timers because :
2117 * 1) We are called from the interrupt handler, which disable softirqs,
2118 * so jiffies won't be increased
2119 * 2) Jiffies granularity is usually very coarse (10ms), and we don't
2120 * want to wait that long to detect stuck hardware.
2121 * Jean II
2122 */
2123
2124static void smsc_ircc_sir_wait_hw_transmitter_finish(struct smsc_ircc_cb *self)
2125{
2126        int iobase = self->io.sir_base;
2127        int count = SMSC_IRCC2_HW_TRANSMITTER_TIMEOUT_US;
2128
2129        /* Calibrated busy loop */
2130        while (count-- > 0 && !(inb(iobase + UART_LSR) & UART_LSR_TEMT))
2131                udelay(1);
2132
2133        if (count < 0)
2134                IRDA_DEBUG(0, "%s(): stuck transmitter\n", __func__);
2135}
2136
2137
2138/* PROBING
2139 *
2140 * REVISIT we can be told about the device by PNP, and should use that info
2141 * instead of probing hardware and creating a platform_device ...
2142 */
2143
2144static int __init smsc_ircc_look_for_chips(void)
2145{
2146        struct smsc_chip_address *address;
2147        char *type;
2148        unsigned int cfg_base, found;
2149
2150        found = 0;
2151        address = possible_addresses;
2152
2153        while (address->cfg_base) {
2154                cfg_base = address->cfg_base;
2155
2156                /*printk(KERN_WARNING "%s(): probing: 0x%02x for: 0x%02x\n", __func__, cfg_base, address->type);*/
2157
2158                if (address->type & SMSCSIO_TYPE_FDC) {
2159                        type = "FDC";
2160                        if (address->type & SMSCSIO_TYPE_FLAT)
2161                                if (!smsc_superio_flat(fdc_chips_flat, cfg_base, type))
2162                                        found++;
2163
2164                        if (address->type & SMSCSIO_TYPE_PAGED)
2165                                if (!smsc_superio_paged(fdc_chips_paged, cfg_base, type))
2166                                        found++;
2167                }
2168                if (address->type & SMSCSIO_TYPE_LPC) {
2169                        type = "LPC";
2170                        if (address->type & SMSCSIO_TYPE_FLAT)
2171                                if (!smsc_superio_flat(lpc_chips_flat, cfg_base, type))
2172                                        found++;
2173
2174                        if (address->type & SMSCSIO_TYPE_PAGED)
2175                                if (!smsc_superio_paged(lpc_chips_paged, cfg_base, type))
2176                                        found++;
2177                }
2178                address++;
2179        }
2180        return found;
2181}
2182
2183/*
2184 * Function smsc_superio_flat (chip, base, type)
2185 *
2186 *    Try to get configuration of a smc SuperIO chip with flat register model
2187 *
2188 */
2189static int __init smsc_superio_flat(const struct smsc_chip *chips, unsigned short cfgbase, char *type)
2190{
2191        unsigned short firbase, sirbase;
2192        u8 mode, dma, irq;
2193        int ret = -ENODEV;
2194
2195        IRDA_DEBUG(1, "%s\n", __func__);
2196
2197        if (smsc_ircc_probe(cfgbase, SMSCSIOFLAT_DEVICEID_REG, chips, type) == NULL)
2198                return ret;
2199
2200        outb(SMSCSIOFLAT_UARTMODE0C_REG, cfgbase);
2201        mode = inb(cfgbase + 1);
2202
2203        /*printk(KERN_WARNING "%s(): mode: 0x%02x\n", __func__, mode);*/
2204
2205        if (!(mode & SMSCSIOFLAT_UART2MODE_VAL_IRDA))
2206                IRDA_WARNING("%s(): IrDA not enabled\n", __func__);
2207
2208        outb(SMSCSIOFLAT_UART2BASEADDR_REG, cfgbase);
2209        sirbase = inb(cfgbase + 1) << 2;
2210
2211        /* FIR iobase */
2212        outb(SMSCSIOFLAT_FIRBASEADDR_REG, cfgbase);
2213        firbase = inb(cfgbase + 1) << 3;
2214
2215        /* DMA */
2216        outb(SMSCSIOFLAT_FIRDMASELECT_REG, cfgbase);
2217        dma = inb(cfgbase + 1) & SMSCSIOFLAT_FIRDMASELECT_MASK;
2218
2219        /* IRQ */
2220        outb(SMSCSIOFLAT_UARTIRQSELECT_REG, cfgbase);
2221        irq = inb(cfgbase + 1) & SMSCSIOFLAT_UART2IRQSELECT_MASK;
2222
2223        IRDA_MESSAGE("%s(): fir: 0x%02x, sir: 0x%02x, dma: %02d, irq: %d, mode: 0x%02x\n", __func__, firbase, sirbase, dma, irq, mode);
2224
2225        if (firbase && smsc_ircc_open(firbase, sirbase, dma, irq) == 0)
2226                ret = 0;
2227
2228        /* Exit configuration */
2229        outb(SMSCSIO_CFGEXITKEY, cfgbase);
2230
2231        return ret;
2232}
2233
2234/*
2235 * Function smsc_superio_paged (chip, base, type)
2236 *
2237 *    Try  to get configuration of a smc SuperIO chip with paged register model
2238 *
2239 */
2240static int __init smsc_superio_paged(const struct smsc_chip *chips, unsigned short cfg_base, char *type)
2241{
2242        unsigned short fir_io, sir_io;
2243        int ret = -ENODEV;
2244
2245        IRDA_DEBUG(1, "%s\n", __func__);
2246
2247        if (smsc_ircc_probe(cfg_base, 0x20, chips, type) == NULL)
2248                return ret;
2249
2250        /* Select logical device (UART2) */
2251        outb(0x07, cfg_base);
2252        outb(0x05, cfg_base + 1);
2253
2254        /* SIR iobase */
2255        outb(0x60, cfg_base);
2256        sir_io = inb(cfg_base + 1) << 8;
2257        outb(0x61, cfg_base);
2258        sir_io |= inb(cfg_base + 1);
2259
2260        /* Read FIR base */
2261        outb(0x62, cfg_base);
2262        fir_io = inb(cfg_base + 1) << 8;
2263        outb(0x63, cfg_base);
2264        fir_io |= inb(cfg_base + 1);
2265        outb(0x2b, cfg_base); /* ??? */
2266
2267        if (fir_io && smsc_ircc_open(fir_io, sir_io, ircc_dma, ircc_irq) == 0)
2268                ret = 0;
2269
2270        /* Exit configuration */
2271        outb(SMSCSIO_CFGEXITKEY, cfg_base);
2272
2273        return ret;
2274}
2275
2276
2277static int __init smsc_access(unsigned short cfg_base, unsigned char reg)
2278{
2279        IRDA_DEBUG(1, "%s\n", __func__);
2280
2281        outb(reg, cfg_base);
2282        return inb(cfg_base) != reg ? -1 : 0;
2283}
2284
2285static const struct smsc_chip * __init smsc_ircc_probe(unsigned short cfg_base, u8 reg, const struct smsc_chip *chip, char *type)
2286{
2287        u8 devid, xdevid, rev;
2288
2289        IRDA_DEBUG(1, "%s\n", __func__);
2290
2291        /* Leave configuration */
2292
2293        outb(SMSCSIO_CFGEXITKEY, cfg_base);
2294
2295        if (inb(cfg_base) == SMSCSIO_CFGEXITKEY)        /* not a smc superio chip */
2296                return NULL;
2297
2298        outb(reg, cfg_base);
2299
2300        xdevid = inb(cfg_base + 1);
2301
2302        /* Enter configuration */
2303
2304        outb(SMSCSIO_CFGACCESSKEY, cfg_base);
2305
2306        #if 0
2307        if (smsc_access(cfg_base,0x55)) /* send second key and check */
2308                return NULL;
2309        #endif
2310
2311        /* probe device ID */
2312
2313        if (smsc_access(cfg_base, reg))
2314                return NULL;
2315
2316        devid = inb(cfg_base + 1);
2317
2318        if (devid == 0 || devid == 0xff)        /* typical values for unused port */
2319                return NULL;
2320
2321        /* probe revision ID */
2322
2323        if (smsc_access(cfg_base, reg + 1))
2324                return NULL;
2325
2326        rev = inb(cfg_base + 1);
2327
2328        if (rev >= 128)                 /* i think this will make no sense */
2329                return NULL;
2330
2331        if (devid == xdevid)            /* protection against false positives */
2332                return NULL;
2333
2334        /* Check for expected device ID; are there others? */
2335
2336        while (chip->devid != devid) {
2337
2338                chip++;
2339
2340                if (chip->name == NULL)
2341                        return NULL;
2342        }
2343
2344        IRDA_MESSAGE("found SMC SuperIO Chip (devid=0x%02x rev=%02X base=0x%04x): %s%s\n",
2345                     devid, rev, cfg_base, type, chip->name);
2346
2347        if (chip->rev > rev) {
2348                IRDA_MESSAGE("Revision higher than expected\n");
2349                return NULL;
2350        }
2351
2352        if (chip->flags & NoIRDA)
2353                IRDA_MESSAGE("chipset does not support IRDA\n");
2354
2355        return chip;
2356}
2357
2358static int __init smsc_superio_fdc(unsigned short cfg_base)
2359{
2360        int ret = -1;
2361
2362        if (!request_region(cfg_base, 2, driver_name)) {
2363                IRDA_WARNING("%s: can't get cfg_base of 0x%03x\n",
2364                             __func__, cfg_base);
2365        } else {
2366                if (!smsc_superio_flat(fdc_chips_flat, cfg_base, "FDC") ||
2367                    !smsc_superio_paged(fdc_chips_paged, cfg_base, "FDC"))
2368                        ret =  0;
2369
2370                release_region(cfg_base, 2);
2371        }
2372
2373        return ret;
2374}
2375
2376static int __init smsc_superio_lpc(unsigned short cfg_base)
2377{
2378        int ret = -1;
2379
2380        if (!request_region(cfg_base, 2, driver_name)) {
2381                IRDA_WARNING("%s: can't get cfg_base of 0x%03x\n",
2382                             __func__, cfg_base);
2383        } else {
2384                if (!smsc_superio_flat(lpc_chips_flat, cfg_base, "LPC") ||
2385                    !smsc_superio_paged(lpc_chips_paged, cfg_base, "LPC"))
2386                        ret = 0;
2387
2388                release_region(cfg_base, 2);
2389        }
2390        return ret;
2391}
2392
2393/*
2394 * Look for some specific subsystem setups that need
2395 * pre-configuration not properly done by the BIOS (especially laptops)
2396 * This code is based in part on smcinit.c, tosh1800-smcinit.c
2397 * and tosh2450-smcinit.c. The table lists the device entries
2398 * for ISA bridges with an LPC (Low Pin Count) controller which
2399 * handles the communication with the SMSC device. After the LPC
2400 * controller is initialized through PCI, the SMSC device is initialized
2401 * through a dedicated port in the ISA port-mapped I/O area, this latter
2402 * area is used to configure the SMSC device with default
2403 * SIR and FIR I/O ports, DMA and IRQ. Different vendors have
2404 * used different sets of parameters and different control port
2405 * addresses making a subsystem device table necessary.
2406 */
2407#ifdef CONFIG_PCI
2408static struct smsc_ircc_subsystem_configuration subsystem_configurations[] __initdata = {
2409        /*
2410         * Subsystems needing entries:
2411         * 0x10b9:0x1533 0x103c:0x0850 HP nx9010 family
2412         * 0x10b9:0x1533 0x0e11:0x005a Compaq nc4000 family
2413         * 0x8086:0x24cc 0x0e11:0x002a HP nx9000 family
2414         */
2415        {
2416                /* Guessed entry */
2417                .vendor = PCI_VENDOR_ID_INTEL, /* Intel 82801DBM LPC bridge */
2418                .device = 0x24cc,
2419                .subvendor = 0x103c,
2420                .subdevice = 0x08bc,
2421                .sir_io = 0x02f8,
2422                .fir_io = 0x0130,
2423                .fir_irq = 0x05,
2424                .fir_dma = 0x03,
2425                .cfg_base = 0x004e,
2426                .preconfigure = preconfigure_through_82801,
2427                .name = "HP nx5000 family",
2428        },
2429        {
2430                .vendor = PCI_VENDOR_ID_INTEL, /* Intel 82801DBM LPC bridge */
2431                .device = 0x24cc,
2432                .subvendor = 0x103c,
2433                .subdevice = 0x088c,
2434                /* Quite certain these are the same for nc8000 as for nc6000 */
2435                .sir_io = 0x02f8,
2436                .fir_io = 0x0130,
2437                .fir_irq = 0x05,
2438                .fir_dma = 0x03,
2439                .cfg_base = 0x004e,
2440                .preconfigure = preconfigure_through_82801,
2441                .name = "HP nc8000 family",
2442        },
2443        {
2444                .vendor = PCI_VENDOR_ID_INTEL, /* Intel 82801DBM LPC bridge */
2445                .device = 0x24cc,
2446                .subvendor = 0x103c,
2447                .subdevice = 0x0890,
2448                .sir_io = 0x02f8,
2449                .fir_io = 0x0130,
2450                .fir_irq = 0x05,
2451                .fir_dma = 0x03,
2452                .cfg_base = 0x004e,
2453                .preconfigure = preconfigure_through_82801,
2454                .name = "HP nc6000 family",
2455        },
2456        {
2457                .vendor = PCI_VENDOR_ID_INTEL, /* Intel 82801DBM LPC bridge */
2458                .device = 0x24cc,
2459                .subvendor = 0x0e11,
2460                .subdevice = 0x0860,
2461                /* I assume these are the same for x1000 as for the others */
2462                .sir_io = 0x02e8,
2463                .fir_io = 0x02f8,
2464                .fir_irq = 0x07,
2465                .fir_dma = 0x03,
2466                .cfg_base = 0x002e,
2467                .preconfigure = preconfigure_through_82801,
2468                .name = "Compaq x1000 family",
2469        },
2470        {
2471                /* Intel 82801DB/DBL (ICH4/ICH4-L) LPC Interface Bridge */
2472                .vendor = PCI_VENDOR_ID_INTEL,
2473                .device = 0x24c0,
2474                .subvendor = 0x1179,
2475                .subdevice = 0xffff, /* 0xffff is "any" */
2476                .sir_io = 0x03f8,
2477                .fir_io = 0x0130,
2478                .fir_irq = 0x07,
2479                .fir_dma = 0x01,
2480                .cfg_base = 0x002e,
2481                .preconfigure = preconfigure_through_82801,
2482                .name = "Toshiba laptop with Intel 82801DB/DBL LPC bridge",
2483        },
2484        {
2485                .vendor = PCI_VENDOR_ID_INTEL, /* Intel 82801CAM ISA bridge */
2486                .device = 0x248c,
2487                .subvendor = 0x1179,
2488                .subdevice = 0xffff, /* 0xffff is "any" */
2489                .sir_io = 0x03f8,
2490                .fir_io = 0x0130,
2491                .fir_irq = 0x03,
2492                .fir_dma = 0x03,
2493                .cfg_base = 0x002e,
2494                .preconfigure = preconfigure_through_82801,
2495                .name = "Toshiba laptop with Intel 82801CAM ISA bridge",
2496        },
2497        {
2498                /* 82801DBM (ICH4-M) LPC Interface Bridge */
2499                .vendor = PCI_VENDOR_ID_INTEL,
2500                .device = 0x24cc,
2501                .subvendor = 0x1179,
2502                .subdevice = 0xffff, /* 0xffff is "any" */
2503                .sir_io = 0x03f8,
2504                .fir_io = 0x0130,
2505                .fir_irq = 0x03,
2506                .fir_dma = 0x03,
2507                .cfg_base = 0x002e,
2508                .preconfigure = preconfigure_through_82801,
2509                .name = "Toshiba laptop with Intel 8281DBM LPC bridge",
2510        },
2511        {
2512                /* ALi M1533/M1535 PCI to ISA Bridge [Aladdin IV/V/V+] */
2513                .vendor = PCI_VENDOR_ID_AL,
2514                .device = 0x1533,
2515                .subvendor = 0x1179,
2516                .subdevice = 0xffff, /* 0xffff is "any" */
2517                .sir_io = 0x02e8,
2518                .fir_io = 0x02f8,
2519                .fir_irq = 0x07,
2520                .fir_dma = 0x03,
2521                .cfg_base = 0x002e,
2522                .preconfigure = preconfigure_through_ali,
2523                .name = "Toshiba laptop with ALi ISA bridge",
2524        },
2525        { } // Terminator
2526};
2527
2528
2529/*
2530 * This sets up the basic SMSC parameters
2531 * (FIR port, SIR port, FIR DMA, FIR IRQ)
2532 * through the chip configuration port.
2533 */
2534static int __init preconfigure_smsc_chip(struct
2535                                         smsc_ircc_subsystem_configuration
2536                                         *conf)
2537{
2538        unsigned short iobase = conf->cfg_base;
2539        unsigned char tmpbyte;
2540
2541        outb(LPC47N227_CFGACCESSKEY, iobase); // enter configuration state
2542        outb(SMSCSIOFLAT_DEVICEID_REG, iobase); // set for device ID
2543        tmpbyte = inb(iobase +1); // Read device ID
2544        IRDA_DEBUG(0,
2545                   "Detected Chip id: 0x%02x, setting up registers...\n",
2546                   tmpbyte);
2547
2548        /* Disable UART1 and set up SIR I/O port */
2549        outb(0x24, iobase);  // select CR24 - UART1 base addr
2550        outb(0x00, iobase + 1); // disable UART1
2551        outb(SMSCSIOFLAT_UART2BASEADDR_REG, iobase);  // select CR25 - UART2 base addr
2552        outb( (conf->sir_io >> 2), iobase + 1); // bits 2-9 of 0x3f8
2553        tmpbyte = inb(iobase + 1);
2554        if (tmpbyte != (conf->sir_io >> 2) ) {
2555                IRDA_WARNING("ERROR: could not configure SIR ioport.\n");
2556                IRDA_WARNING("Try to supply ircc_cfg argument.\n");
2557                return -ENXIO;
2558        }
2559
2560        /* Set up FIR IRQ channel for UART2 */
2561        outb(SMSCSIOFLAT_UARTIRQSELECT_REG, iobase); // select CR28 - UART1,2 IRQ select
2562        tmpbyte = inb(iobase + 1);
2563        tmpbyte &= SMSCSIOFLAT_UART1IRQSELECT_MASK; // Do not touch the UART1 portion
2564        tmpbyte |= (conf->fir_irq & SMSCSIOFLAT_UART2IRQSELECT_MASK);
2565        outb(tmpbyte, iobase + 1);
2566        tmpbyte = inb(iobase + 1) & SMSCSIOFLAT_UART2IRQSELECT_MASK;
2567        if (tmpbyte != conf->fir_irq) {
2568                IRDA_WARNING("ERROR: could not configure FIR IRQ channel.\n");
2569                return -ENXIO;
2570        }
2571
2572        /* Set up FIR I/O port */
2573        outb(SMSCSIOFLAT_FIRBASEADDR_REG, iobase);  // CR2B - SCE (FIR) base addr
2574        outb((conf->fir_io >> 3), iobase + 1);
2575        tmpbyte = inb(iobase + 1);
2576        if (tmpbyte != (conf->fir_io >> 3) ) {
2577                IRDA_WARNING("ERROR: could not configure FIR I/O port.\n");
2578                return -ENXIO;
2579        }
2580
2581        /* Set up FIR DMA channel */
2582        outb(SMSCSIOFLAT_FIRDMASELECT_REG, iobase);  // CR2C - SCE (FIR) DMA select
2583        outb((conf->fir_dma & LPC47N227_FIRDMASELECT_MASK), iobase + 1); // DMA
2584        tmpbyte = inb(iobase + 1) & LPC47N227_FIRDMASELECT_MASK;
2585        if (tmpbyte != (conf->fir_dma & LPC47N227_FIRDMASELECT_MASK)) {
2586                IRDA_WARNING("ERROR: could not configure FIR DMA channel.\n");
2587                return -ENXIO;
2588        }
2589
2590        outb(SMSCSIOFLAT_UARTMODE0C_REG, iobase);  // CR0C - UART mode
2591        tmpbyte = inb(iobase + 1);
2592        tmpbyte &= ~SMSCSIOFLAT_UART2MODE_MASK |
2593                SMSCSIOFLAT_UART2MODE_VAL_IRDA;
2594        outb(tmpbyte, iobase + 1); // enable IrDA (HPSIR) mode, high speed
2595
2596        outb(LPC47N227_APMBOOTDRIVE_REG, iobase);  // CR07 - Auto Pwr Mgt/boot drive sel
2597        tmpbyte = inb(iobase + 1);
2598        outb(tmpbyte | LPC47N227_UART2AUTOPWRDOWN_MASK, iobase + 1); // enable UART2 autopower down
2599
2600        /* This one was not part of tosh1800 */
2601        outb(0x0a, iobase);  // CR0a - ecp fifo / ir mux
2602        tmpbyte = inb(iobase + 1);
2603        outb(tmpbyte | 0x40, iobase + 1); // send active device to ir port
2604
2605        outb(LPC47N227_UART12POWER_REG, iobase);  // CR02 - UART 1,2 power
2606        tmpbyte = inb(iobase + 1);
2607        outb(tmpbyte | LPC47N227_UART2POWERDOWN_MASK, iobase + 1); // UART2 power up mode, UART1 power down
2608
2609        outb(LPC47N227_FDCPOWERVALIDCONF_REG, iobase);  // CR00 - FDC Power/valid config cycle
2610        tmpbyte = inb(iobase + 1);
2611        outb(tmpbyte | LPC47N227_VALID_MASK, iobase + 1); // valid config cycle done
2612
2613        outb(LPC47N227_CFGEXITKEY, iobase);  // Exit configuration
2614
2615        return 0;
2616}
2617
2618/* 82801CAM generic registers */
2619#define VID 0x00
2620#define DID 0x02
2621#define PIRQ_A_D_ROUT 0x60
2622#define SIRQ_CNTL 0x64
2623#define PIRQ_E_H_ROUT 0x68
2624#define PCI_DMA_C 0x90
2625/* LPC-specific registers */
2626#define COM_DEC 0xe0
2627#define GEN1_DEC 0xe4
2628#define LPC_EN 0xe6
2629#define GEN2_DEC 0xec
2630/*
2631 * Sets up the I/O range using the 82801CAM ISA bridge, 82801DBM LPC bridge
2632 * or Intel 82801DB/DBL (ICH4/ICH4-L) LPC Interface Bridge.
2633 * They all work the same way!
2634 */
2635static int __init preconfigure_through_82801(struct pci_dev *dev,
2636                                             struct
2637                                             smsc_ircc_subsystem_configuration
2638                                             *conf)
2639{
2640        unsigned short tmpword;
2641        unsigned char tmpbyte;
2642
2643        IRDA_MESSAGE("Setting up Intel 82801 controller and SMSC device\n");
2644        /*
2645         * Select the range for the COMA COM port (SIR)
2646         * Register COM_DEC:
2647         * Bit 7: reserved
2648         * Bit 6-4, COMB decode range
2649         * Bit 3: reserved
2650         * Bit 2-0, COMA decode range
2651         *
2652         * Decode ranges:
2653         *   000 = 0x3f8-0x3ff (COM1)
2654         *   001 = 0x2f8-0x2ff (COM2)
2655         *   010 = 0x220-0x227
2656         *   011 = 0x228-0x22f
2657         *   100 = 0x238-0x23f
2658         *   101 = 0x2e8-0x2ef (COM4)
2659         *   110 = 0x338-0x33f
2660         *   111 = 0x3e8-0x3ef (COM3)
2661         */
2662        pci_read_config_byte(dev, COM_DEC, &tmpbyte);
2663        tmpbyte &= 0xf8; /* mask COMA bits */
2664        switch(conf->sir_io) {
2665        case 0x3f8:
2666                tmpbyte |= 0x00;
2667                break;
2668        case 0x2f8:
2669                tmpbyte |= 0x01;
2670                break;
2671        case 0x220:
2672                tmpbyte |= 0x02;
2673                break;
2674        case 0x228:
2675                tmpbyte |= 0x03;
2676                break;
2677        case 0x238:
2678                tmpbyte |= 0x04;
2679                break;
2680        case 0x2e8:
2681                tmpbyte |= 0x05;
2682                break;
2683        case 0x338:
2684                tmpbyte |= 0x06;
2685                break;
2686        case 0x3e8:
2687                tmpbyte |= 0x07;
2688                break;
2689        default:
2690                tmpbyte |= 0x01; /* COM2 default */
2691        }
2692        IRDA_DEBUG(1, "COM_DEC (write): 0x%02x\n", tmpbyte);
2693        pci_write_config_byte(dev, COM_DEC, tmpbyte);
2694
2695        /* Enable Low Pin Count interface */
2696        pci_read_config_word(dev, LPC_EN, &tmpword);
2697        /* These seem to be set up at all times,
2698         * just make sure it is properly set.
2699         */
2700        switch(conf->cfg_base) {
2701        case 0x04e:
2702                tmpword |= 0x2000;
2703                break;
2704        case 0x02e:
2705                tmpword |= 0x1000;
2706                break;
2707        case 0x062:
2708                tmpword |= 0x0800;
2709                break;
2710        case 0x060:
2711                tmpword |= 0x0400;
2712                break;
2713        default:
2714                IRDA_WARNING("Uncommon I/O base address: 0x%04x\n",
2715                             conf->cfg_base);
2716                break;
2717        }
2718        tmpword &= 0xfffd; /* disable LPC COMB */
2719        tmpword |= 0x0001; /* set bit 0 : enable LPC COMA addr range (GEN2) */
2720        IRDA_DEBUG(1, "LPC_EN (write): 0x%04x\n", tmpword);
2721        pci_write_config_word(dev, LPC_EN, tmpword);
2722
2723        /*
2724         * Configure LPC DMA channel
2725         * PCI_DMA_C bits:
2726         * Bit 15-14: DMA channel 7 select
2727         * Bit 13-12: DMA channel 6 select
2728         * Bit 11-10: DMA channel 5 select
2729         * Bit 9-8:   Reserved
2730         * Bit 7-6:   DMA channel 3 select
2731         * Bit 5-4:   DMA channel 2 select
2732         * Bit 3-2:   DMA channel 1 select
2733         * Bit 1-0:   DMA channel 0 select
2734         *  00 = Reserved value
2735         *  01 = PC/PCI DMA
2736         *  10 = Reserved value
2737         *  11 = LPC I/F DMA
2738         */
2739        pci_read_config_word(dev, PCI_DMA_C, &tmpword);
2740        switch(conf->fir_dma) {
2741        case 0x07:
2742                tmpword |= 0xc000;
2743                break;
2744        case 0x06:
2745                tmpword |= 0x3000;
2746                break;
2747        case 0x05:
2748                tmpword |= 0x0c00;
2749                break;
2750        case 0x03:
2751                tmpword |= 0x00c0;
2752                break;
2753        case 0x02:
2754                tmpword |= 0x0030;
2755                break;
2756        case 0x01:
2757                tmpword |= 0x000c;
2758                break;
2759        case 0x00:
2760                tmpword |= 0x0003;
2761                break;
2762        default:
2763                break; /* do not change settings */
2764        }
2765        IRDA_DEBUG(1, "PCI_DMA_C (write): 0x%04x\n", tmpword);
2766        pci_write_config_word(dev, PCI_DMA_C, tmpword);
2767
2768        /*
2769         * GEN2_DEC bits:
2770         * Bit 15-4: Generic I/O range
2771         * Bit 3-1: reserved (read as 0)
2772         * Bit 0: enable GEN2 range on LPC I/F
2773         */
2774        tmpword = conf->fir_io & 0xfff8;
2775        tmpword |= 0x0001;
2776        IRDA_DEBUG(1, "GEN2_DEC (write): 0x%04x\n", tmpword);
2777        pci_write_config_word(dev, GEN2_DEC, tmpword);
2778
2779        /* Pre-configure chip */
2780        return preconfigure_smsc_chip(conf);
2781}
2782
2783/*
2784 * Pre-configure a certain port on the ALi 1533 bridge.
2785 * This is based on reverse-engineering since ALi does not
2786 * provide any data sheet for the 1533 chip.
2787 */
2788static void __init preconfigure_ali_port(struct pci_dev *dev,
2789                                         unsigned short port)
2790{
2791        unsigned char reg;
2792        /* These bits obviously control the different ports */
2793        unsigned char mask;
2794        unsigned char tmpbyte;
2795
2796        switch(port) {
2797        case 0x0130:
2798        case 0x0178:
2799                reg = 0xb0;
2800                mask = 0x80;
2801                break;
2802        case 0x03f8:
2803                reg = 0xb4;
2804                mask = 0x80;
2805                break;
2806        case 0x02f8:
2807                reg = 0xb4;
2808                mask = 0x30;
2809                break;
2810        case 0x02e8:
2811                reg = 0xb4;
2812                mask = 0x08;
2813                break;
2814        default:
2815                IRDA_ERROR("Failed to configure unsupported port on ALi 1533 bridge: 0x%04x\n", port);
2816                return;
2817        }
2818
2819        pci_read_config_byte(dev, reg, &tmpbyte);
2820        /* Turn on the right bits */
2821        tmpbyte |= mask;
2822        pci_write_config_byte(dev, reg, tmpbyte);
2823        IRDA_MESSAGE("Activated ALi 1533 ISA bridge port 0x%04x.\n", port);
2824}
2825
2826static int __init preconfigure_through_ali(struct pci_dev *dev,
2827                                           struct
2828                                           smsc_ircc_subsystem_configuration
2829                                           *conf)
2830{
2831        /* Configure the two ports on the ALi 1533 */
2832        preconfigure_ali_port(dev, conf->sir_io);
2833        preconfigure_ali_port(dev, conf->fir_io);
2834
2835        /* Pre-configure chip */
2836        return preconfigure_smsc_chip(conf);
2837}
2838
2839static int __init smsc_ircc_preconfigure_subsystems(unsigned short ircc_cfg,
2840                                                    unsigned short ircc_fir,
2841                                                    unsigned short ircc_sir,
2842                                                    unsigned char ircc_dma,
2843                                                    unsigned char ircc_irq)
2844{
2845        struct pci_dev *dev = NULL;
2846        unsigned short ss_vendor = 0x0000;
2847        unsigned short ss_device = 0x0000;
2848        int ret = 0;
2849
2850        for_each_pci_dev(dev) {
2851                struct smsc_ircc_subsystem_configuration *conf;
2852
2853                /*
2854                 * Cache the subsystem vendor/device:
2855                 * some manufacturers fail to set this for all components,
2856                 * so we save it in case there is just 0x0000 0x0000 on the
2857                 * device we want to check.
2858                 */
2859                if (dev->subsystem_vendor != 0x0000U) {
2860                        ss_vendor = dev->subsystem_vendor;
2861                        ss_device = dev->subsystem_device;
2862                }
2863                conf = subsystem_configurations;
2864                for( ; conf->subvendor; conf++) {
2865                        if(conf->vendor == dev->vendor &&
2866                           conf->device == dev->device &&
2867                           conf->subvendor == ss_vendor &&
2868                           /* Sometimes these are cached values */
2869                           (conf->subdevice == ss_device ||
2870                            conf->subdevice == 0xffff)) {
2871                                struct smsc_ircc_subsystem_configuration
2872                                        tmpconf;
2873
2874                                memcpy(&tmpconf, conf,
2875                                       sizeof(struct smsc_ircc_subsystem_configuration));
2876
2877                                /*
2878                                 * Override the default values with anything
2879                                 * passed in as parameter
2880                                 */
2881                                if (ircc_cfg != 0)
2882                                        tmpconf.cfg_base = ircc_cfg;
2883                                if (ircc_fir != 0)
2884                                        tmpconf.fir_io = ircc_fir;
2885                                if (ircc_sir != 0)
2886                                        tmpconf.sir_io = ircc_sir;
2887                                if (ircc_dma != DMA_INVAL)
2888                                        tmpconf.fir_dma = ircc_dma;
2889                                if (ircc_irq != IRQ_INVAL)
2890                                        tmpconf.fir_irq = ircc_irq;
2891
2892                                IRDA_MESSAGE("Detected unconfigured %s SMSC IrDA chip, pre-configuring device.\n", conf->name);
2893                                if (conf->preconfigure)
2894                                        ret = conf->preconfigure(dev, &tmpconf);
2895                                else
2896                                        ret = -ENODEV;
2897                        }
2898                }
2899        }
2900
2901        return ret;
2902}
2903#endif // CONFIG_PCI
2904
2905/************************************************
2906 *
2907 * Transceivers specific functions
2908 *
2909 ************************************************/
2910
2911
2912/*
2913 * Function smsc_ircc_set_transceiver_smsc_ircc_atc(fir_base, speed)
2914 *
2915 *    Program transceiver through smsc-ircc ATC circuitry
2916 *
2917 */
2918
2919static void smsc_ircc_set_transceiver_smsc_ircc_atc(int fir_base, u32 speed)
2920{
2921        unsigned long jiffies_now, jiffies_timeout;
2922        u8 val;
2923
2924        jiffies_now = jiffies;
2925        jiffies_timeout = jiffies + SMSC_IRCC2_ATC_PROGRAMMING_TIMEOUT_JIFFIES;
2926
2927        /* ATC */
2928        register_bank(fir_base, 4);
2929        outb((inb(fir_base + IRCC_ATC) & IRCC_ATC_MASK) | IRCC_ATC_nPROGREADY|IRCC_ATC_ENABLE,
2930             fir_base + IRCC_ATC);
2931
2932        while ((val = (inb(fir_base + IRCC_ATC) & IRCC_ATC_nPROGREADY)) &&
2933                !time_after(jiffies, jiffies_timeout))
2934                /* empty */;
2935
2936        if (val)
2937                IRDA_WARNING("%s(): ATC: 0x%02x\n", __func__,
2938                             inb(fir_base + IRCC_ATC));
2939}
2940
2941/*
2942 * Function smsc_ircc_probe_transceiver_smsc_ircc_atc(fir_base)
2943 *
2944 *    Probe transceiver smsc-ircc ATC circuitry
2945 *
2946 */
2947
2948static int smsc_ircc_probe_transceiver_smsc_ircc_atc(int fir_base)
2949{
2950        return 0;
2951}
2952
2953/*
2954 * Function smsc_ircc_set_transceiver_smsc_ircc_fast_pin_select(self, speed)
2955 *
2956 *    Set transceiver
2957 *
2958 */
2959
2960static void smsc_ircc_set_transceiver_smsc_ircc_fast_pin_select(int fir_base, u32 speed)
2961{
2962        u8 fast_mode;
2963
2964        switch (speed) {
2965        default:
2966        case 576000 :
2967                fast_mode = 0;
2968                break;
2969        case 1152000 :
2970        case 4000000 :
2971                fast_mode = IRCC_LCR_A_FAST;
2972                break;
2973        }
2974        register_bank(fir_base, 0);
2975        outb((inb(fir_base + IRCC_LCR_A) & 0xbf) | fast_mode, fir_base + IRCC_LCR_A);
2976}
2977
2978/*
2979 * Function smsc_ircc_probe_transceiver_smsc_ircc_fast_pin_select(fir_base)
2980 *
2981 *    Probe transceiver
2982 *
2983 */
2984
2985static int smsc_ircc_probe_transceiver_smsc_ircc_fast_pin_select(int fir_base)
2986{
2987        return 0;
2988}
2989
2990/*
2991 * Function smsc_ircc_set_transceiver_toshiba_sat1800(fir_base, speed)
2992 *
2993 *    Set transceiver
2994 *
2995 */
2996
2997static void smsc_ircc_set_transceiver_toshiba_sat1800(int fir_base, u32 speed)
2998{
2999        u8 fast_mode;
3000
3001        switch (speed) {
3002        default:
3003        case 576000 :
3004                fast_mode = 0;
3005                break;
3006        case 1152000 :
3007        case 4000000 :
3008                fast_mode = /*IRCC_LCR_A_FAST |*/ IRCC_LCR_A_GP_DATA;
3009                break;
3010
3011        }
3012        /* This causes an interrupt */
3013        register_bank(fir_base, 0);
3014        outb((inb(fir_base + IRCC_LCR_A) &  0xbf) | fast_mode, fir_base + IRCC_LCR_A);
3015}
3016
3017/*
3018 * Function smsc_ircc_probe_transceiver_toshiba_sat1800(fir_base)
3019 *
3020 *    Probe transceiver
3021 *
3022 */
3023
3024static int smsc_ircc_probe_transceiver_toshiba_sat1800(int fir_base)
3025{
3026        return 0;
3027}
3028
3029
3030module_init(smsc_ircc_init);
3031module_exit(smsc_ircc_cleanup);
3032
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.