~ubuntu-branches/ubuntu/precise/linux-lowlatency/precise

« back to all changes in this revision

Viewing changes to drivers/staging/ft1000/ft1000-pcmcia/ft1000_cs.c

  • Committer: Package Import Robot
  • Author(s): Alessio Igor Bogani
  • Date: 2011-10-26 11:13:05 UTC
  • Revision ID: package-import@ubuntu.com-20111026111305-tz023xykf0i6eosh
Tags: upstream-3.2.0
ImportĀ upstreamĀ versionĀ 3.2.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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
 
 
38
MODULE_AUTHOR("Wai Chan");
 
39
MODULE_DESCRIPTION("FT1000 PCMCIA driver");
 
40
MODULE_LICENSE("GPL");
 
41
 
 
42
/*====================================================================*/
 
43
 
 
44
static int ft1000_config(struct pcmcia_device *link);
 
45
static void ft1000_detach(struct pcmcia_device *link);
 
46
static int ft1000_attach(struct pcmcia_device *link);
 
47
 
 
48
#include "ft1000.h"
 
49
 
 
50
/*====================================================================*/
 
51
 
 
52
static void ft1000_reset(struct pcmcia_device *link)
 
53
{
 
54
        pcmcia_reset_card(link->socket);
 
55
}
 
56
 
 
57
static 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
 
 
65
static 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
 
 
76
static 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
 
 
89
static 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;
 
118
failed:
 
119
        pcmcia_disable_device(link);
 
120
        return -ENODEV;
 
121
}
 
122
 
 
123
static 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
 
 
132
static int ft1000_resume(struct pcmcia_device *link)
 
133
{
 
134
        return 0;
 
135
}
 
136
 
 
137
/*====================================================================*/
 
138
 
 
139
static 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
 
 
146
MODULE_DEVICE_TABLE(pcmcia, ft1000_ids);
 
147
 
 
148
static 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
 
 
158
static int __init init_ft1000_cs(void)
 
159
{
 
160
        return pcmcia_register_driver(&ft1000_cs_driver);
 
161
}
 
162
 
 
163
static void __exit exit_ft1000_cs(void)
 
164
{
 
165
        pcmcia_unregister_driver(&ft1000_cs_driver);
 
166
}
 
167
 
 
168
module_init(init_ft1000_cs);
 
169
module_exit(exit_ft1000_cs);