linux/drivers/staging/ft1000/ft1000-pcmcia/ft1000_cs.c
<<
>>
Prefs
   1/*---------------------------------------------------------------------------
   2   FT1000 driver for Flarion Flash OFDM NIC Device
   3
   4   Copyright (C) 1999 David A. Hinds.  All Rights Reserved.
   5   Copyright (C) 2002 Flarion Technologies, All rights reserved.
   6   Copyright (C) 2006 Patrik Ostrihon, All rights reserved.
   7   Copyright (C) 2006 ProWeb Consulting, a.s, All rights reserved.
   8
   9   The initial developer of the original code is David A. Hinds
  10   <dahinds@users.sourceforge.net>.  Portions created by David A. Hinds.
  11
  12   This file was modified to support the Flarion Flash OFDM NIC Device
  13   by Wai Chan (w.chan@flarion.com).
  14
  15   Port for kernel 2.6 created by Patrik Ostrihon (patrik.ostrihon@pwc.sk)
  16
  17   This program is free software; you can redistribute it and/or modify it
  18   under the terms of the GNU General Public License as published by the Free
  19   Software Foundation; either version 2 of the License, or (at your option) any
  20   later version. This program is distributed in the hope that it will be useful,
  21   but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  22   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
  23   more details. You should have received a copy of the GNU General Public
  24   License along with this program; if not, write to the
  25   Free Software Foundation, Inc., 59 Temple Place -
  26   Suite 330, Boston, MA 02111-1307, USA.
  27-----------------------------------------------------------------------------*/
  28
  29#include <linux/kernel.h>
  30#include <linux/module.h>
  31#include <linux/init.h>
  32#include <linux/netdevice.h>
  33#include <pcmcia/cistpl.h>
  34#include <pcmcia/ds.h>
  35
  36/*====================================================================*/
  37
  38MODULE_AUTHOR("Wai Chan");
  39MODULE_DESCRIPTION("FT1000 PCMCIA driver");
  40MODULE_LICENSE("GPL");
  41
  42/*====================================================================*/
  43
  44static int ft1000_config(struct pcmcia_device *link);
  45static void ft1000_detach(struct pcmcia_device *link);
  46static int ft1000_attach(struct pcmcia_device *link);
  47
  48#include "ft1000.h"
  49
  50/*====================================================================*/
  51
  52static void ft1000_reset(struct pcmcia_device *link)
  53{
  54        pcmcia_reset_card(link->socket);
  55}
  56
  57static int ft1000_attach(struct pcmcia_device *link)
  58{
  59        link->priv = NULL;
  60        link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_IO;
  61
  62        return ft1000_config(link);
  63}
  64
  65static void ft1000_detach(struct pcmcia_device *link)
  66{
  67        struct net_device *dev = link->priv;
  68
  69        if (dev)
  70                stop_ft1000_card(dev);
  71
  72        pcmcia_disable_device(link);
  73        free_netdev(dev);
  74}
  75
  76static int ft1000_confcheck(struct pcmcia_device *link, void *priv_data)
  77{
  78        return pcmcia_request_io(link);
  79}
  80
  81/*======================================================================
  82
  83    ft1000_config() is scheduled to run after a CARD_INSERTION event
  84    is received, to configure the PCMCIA socket, and to make the
  85    device available to the system.
  86
  87======================================================================*/
  88
  89static int ft1000_config(struct pcmcia_device *link)
  90{
  91        int ret;
  92
  93        dev_dbg(&link->dev, "ft1000_cs: ft1000_config(0x%p)\n", link);
  94
  95        /* setup IO window */
  96        ret = pcmcia_loop_config(link, ft1000_confcheck, NULL);
  97        if (ret) {
  98                printk(KERN_INFO "ft1000: Could not configure pcmcia\n");
  99                return -ENODEV;
 100        }
 101
 102        /* configure device */
 103        ret = pcmcia_enable_device(link);
 104        if (ret) {
 105                printk(KERN_INFO "ft1000: could not enable pcmcia\n");
 106                goto failed;
 107        }
 108
 109        link->priv = init_ft1000_card(link, &ft1000_reset);
 110        if (!link->priv) {
 111                printk(KERN_INFO "ft1000: Could not register as network device\n");
 112                goto failed;
 113        }
 114
 115        /* Finally, report what we've done */
 116
 117        return 0;
 118failed:
 119        pcmcia_disable_device(link);
 120        return -ENODEV;
 121}
 122
 123static int ft1000_suspend(struct pcmcia_device *link)
 124{
 125        struct net_device *dev = link->priv;
 126
 127        if (link->open)
 128                netif_device_detach(dev);
 129        return 0;
 130}
 131
 132static int ft1000_resume(struct pcmcia_device *link)
 133{
 134        return 0;
 135}
 136
 137/*====================================================================*/
 138
 139static const struct pcmcia_device_id ft1000_ids[] = {
 140        PCMCIA_DEVICE_MANF_CARD(0x02cc, 0x0100),
 141        PCMCIA_DEVICE_MANF_CARD(0x02cc, 0x1000),
 142        PCMCIA_DEVICE_MANF_CARD(0x02cc, 0x1300),
 143        PCMCIA_DEVICE_NULL,
 144};
 145
 146MODULE_DEVICE_TABLE(pcmcia, ft1000_ids);
 147
 148static struct pcmcia_driver ft1000_cs_driver = {
 149        .owner          = THIS_MODULE,
 150        .name           = "ft1000_cs",
 151        .probe          = ft1000_attach,
 152        .remove         = ft1000_detach,
 153        .id_table       = ft1000_ids,
 154        .suspend        = ft1000_suspend,
 155        .resume         = ft1000_resume,
 156};
 157
 158static int __init init_ft1000_cs(void)
 159{
 160        return pcmcia_register_driver(&ft1000_cs_driver);
 161}
 162
 163static void __exit exit_ft1000_cs(void)
 164{
 165        pcmcia_unregister_driver(&ft1000_cs_driver);
 166}
 167
 168module_init(init_ft1000_cs);
 169module_exit(exit_ft1000_cs);
 170
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.