Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]

Diff markup

Differences between /linux/drivers/net/wireless/atmel_cs.c (Version 2.6.11.8) and /linux/drivers/net/wireless/atmel_cs.c (Version 2.6.31.13)


  1 /*** -*- linux-c -*- *************************      1 /*** -*- linux-c -*- **********************************************************
  2                                                     2 
  3      Driver for Atmel at76c502 at76c504 and at      3      Driver for Atmel at76c502 at76c504 and at76c506 wireless cards.
  4                                                     4 
  5         Copyright 2000-2001 ATMEL Corporation.      5         Copyright 2000-2001 ATMEL Corporation.
  6         Copyright 2003 Simon Kelley.                6         Copyright 2003 Simon Kelley.
  7                                                     7 
  8     This code was developed from version 2.1.1 !!   8     This code was developed from version 2.1.1 of the Atmel drivers,
  9     released by Atmel corp. under the GPL in D !!   9     released by Atmel corp. under the GPL in December 2002. It also
 10     includes code from the Linux aironet drive !!  10     includes code from the Linux aironet drivers (C) Benjamin Reed,
 11     and the Linux PCMCIA package, (C) David Hi !!  11     and the Linux PCMCIA package, (C) David Hinds.
 12                                                    12 
 13     For all queries about this code, please co !!  13     For all queries about this code, please contact the current author,
 14     Simon Kelley <simon@thekelleys.org.uk> and     14     Simon Kelley <simon@thekelleys.org.uk> and not Atmel Corporation.
 15                                                    15 
 16     This program is free software; you can red     16     This program is free software; you can redistribute it and/or modify
 17     it under the terms of the GNU General Publ     17     it under the terms of the GNU General Public License as published by
 18     the Free Software Foundation; either versi     18     the Free Software Foundation; either version 2 of the License, or
 19     (at your option) any later version.            19     (at your option) any later version.
 20                                                    20 
 21     This software is distributed in the hope t     21     This software is distributed in the hope that it will be useful,
 22     but WITHOUT ANY WARRANTY; without even the     22     but WITHOUT ANY WARRANTY; without even the implied warranty of
 23     MERCHANTABILITY or FITNESS FOR A PARTICULA     23     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 24     GNU General Public License for more detail     24     GNU General Public License for more details.
 25                                                    25 
 26     You should have received a copy of the GNU     26     You should have received a copy of the GNU General Public License
 27     along with Atmel wireless lan drivers; if      27     along with Atmel wireless lan drivers; if not, write to the Free Software
 28     Foundation, Inc., 59 Temple Place, Suite 3     28     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 29                                                    29 
 30 **********************************************     30 ******************************************************************************/
 31                                                    31 
 32 #include <linux/config.h>                      << 
 33 #ifdef __IN_PCMCIA_PACKAGE__                       32 #ifdef __IN_PCMCIA_PACKAGE__
 34 #include <pcmcia/k_compat.h>                       33 #include <pcmcia/k_compat.h>
 35 #endif                                             34 #endif
 36 #include <linux/init.h>                            35 #include <linux/init.h>
 37 #include <linux/kernel.h>                          36 #include <linux/kernel.h>
 38 #include <linux/module.h>                          37 #include <linux/module.h>
 39 #include <linux/ptrace.h>                          38 #include <linux/ptrace.h>
 40 #include <linux/slab.h>                            39 #include <linux/slab.h>
 41 #include <linux/string.h>                          40 #include <linux/string.h>
 42 #include <linux/netdevice.h>                       41 #include <linux/netdevice.h>
 43 #include <linux/moduleparam.h>                     42 #include <linux/moduleparam.h>
 44 #include <linux/device.h>                          43 #include <linux/device.h>
 45                                                    44 
 46 #include <pcmcia/version.h>                    << 
 47 #include <pcmcia/cs_types.h>                       45 #include <pcmcia/cs_types.h>
 48 #include <pcmcia/cs.h>                             46 #include <pcmcia/cs.h>
 49 #include <pcmcia/cistpl.h>                         47 #include <pcmcia/cistpl.h>
 50 #include <pcmcia/cisreg.h>                         48 #include <pcmcia/cisreg.h>
 51 #include <pcmcia/ds.h>                             49 #include <pcmcia/ds.h>
 52 #include <pcmcia/ciscode.h>                        50 #include <pcmcia/ciscode.h>
 53                                                    51 
 54 #include <asm/io.h>                                52 #include <asm/io.h>
 55 #include <asm/system.h>                            53 #include <asm/system.h>
 56 #include <linux/wireless.h>                        54 #include <linux/wireless.h>
 57                                                    55 
                                                   >>  56 #include "atmel.h"
 58                                                    57 
 59 /*                                                 58 /*
 60    All the PCMCIA modules use PCMCIA_DEBUG to      59    All the PCMCIA modules use PCMCIA_DEBUG to control debugging.  If
 61    you do not define PCMCIA_DEBUG at all, all      60    you do not define PCMCIA_DEBUG at all, all the debug code will be
 62    left out.  If you compile with PCMCIA_DEBUG     61    left out.  If you compile with PCMCIA_DEBUG=0, the debug code will
 63    be present but disabled -- but it can then      62    be present but disabled -- but it can then be enabled for specific
 64    modules at load time with a 'pc_debug=#' op     63    modules at load time with a 'pc_debug=#' option to insmod.
 65 */                                                 64 */
                                                   >>  65 
 66 #ifdef PCMCIA_DEBUG                                66 #ifdef PCMCIA_DEBUG
 67 static int pc_debug = PCMCIA_DEBUG;                67 static int pc_debug = PCMCIA_DEBUG;
 68 module_param(pc_debug, int, 0);                    68 module_param(pc_debug, int, 0);
 69 static char *version = "$Revision: 1.2 $";         69 static char *version = "$Revision: 1.2 $";
 70 #define DEBUG(n, args...) if (pc_debug>(n)) pr     70 #define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args);
 71 #else                                              71 #else
 72 #define DEBUG(n, args...)                          72 #define DEBUG(n, args...)
 73 #endif                                             73 #endif
 74                                                    74 
 75 /*============================================     75 /*====================================================================*/
 76                                                    76 
 77 MODULE_AUTHOR("Simon Kelley");                     77 MODULE_AUTHOR("Simon Kelley");
 78 MODULE_DESCRIPTION("Support for Atmel at76c50x     78 MODULE_DESCRIPTION("Support for Atmel at76c50x 802.11 wireless ethernet cards.");
 79 MODULE_LICENSE("GPL");                             79 MODULE_LICENSE("GPL");
 80 MODULE_SUPPORTED_DEVICE("Atmel at76c50x PCMCIA     80 MODULE_SUPPORTED_DEVICE("Atmel at76c50x PCMCIA cards");
 81                                                    81 
 82 /*============================================     82 /*====================================================================*/
 83                                                    83 
 84 /*                                                 84 /*
 85    The event() function is this driver's Card      85    The event() function is this driver's Card Services event handler.
 86    It will be called by Card Services when an      86    It will be called by Card Services when an appropriate card status
 87    event is received.  The config() and releas     87    event is received.  The config() and release() entry points are
 88    used to configure or release a socket, in r     88    used to configure or release a socket, in response to card
 89    insertion and ejection events.  They are in     89    insertion and ejection events.  They are invoked from the atmel_cs
 90    event handler.                              !!  90    event handler.
 91 */                                                 91 */
 92                                                    92 
 93 struct net_device *init_atmel_card(int, int, c !!  93 static int atmel_config(struct pcmcia_device *link);
 94                                     int (*pres !!  94 static void atmel_release(struct pcmcia_device *link);
 95 void stop_atmel_card( struct net_device *, int << 
 96 int atmel_open( struct net_device * );         << 
 97                                                << 
 98 static void atmel_config(dev_link_t *link);    << 
 99 static void atmel_release(dev_link_t *link);   << 
100 static int atmel_event(event_t event, int prio << 
101                        event_callback_args_t * << 
102                                                    95 
103 /*                                                 96 /*
104    The attach() and detach() entry points are      97    The attach() and detach() entry points are used to create and destroy
105    "instances" of the driver, where each insta     98    "instances" of the driver, where each instance represents everything
106    needed to manage one actual PCMCIA card.        99    needed to manage one actual PCMCIA card.
107 */                                                100 */
108                                                   101 
109 static dev_link_t *atmel_attach(void);         !! 102 static void atmel_detach(struct pcmcia_device *p_dev);
110 static void atmel_detach(dev_link_t *);        << 
111                                                   103 
112 /*                                                104 /*
113    You'll also need to prototype all the funct    105    You'll also need to prototype all the functions that will actually
114    be used to talk to your device.  See 'pcmem    106    be used to talk to your device.  See 'pcmem_cs' for a good example
115    of a fully self-sufficient driver; the othe    107    of a fully self-sufficient driver; the other drivers rely more or
116    less on other parts of the kernel.             108    less on other parts of the kernel.
117 */                                                109 */
118                                                   110 
119 /*                                                111 /*
120    The dev_info variable is the "key" that is  << 
121    device driver with appropriate cards, throu << 
122    database.                                   << 
123 */                                             << 
124                                                << 
125 static dev_info_t dev_info = "atmel_cs";       << 
126                                                << 
127 /*                                             << 
128    A linked list of "instances" of the  atmeln    112    A linked list of "instances" of the  atmelnet device.  Each actual
129    PCMCIA card corresponds to one device insta    113    PCMCIA card corresponds to one device instance, and is described
130    by one dev_link_t structure (defined in ds. !! 114    by one struct pcmcia_device structure (defined in ds.h).
131                                                   115 
132    You may not want to use a linked list for t    116    You may not want to use a linked list for this -- for example, the
133    memory card driver uses an array of dev_lin !! 117    memory card driver uses an array of struct pcmcia_device pointers, where minor
134    device numbers are used to derive the corre    118    device numbers are used to derive the corresponding array index.
135 */                                                119 */
136                                                   120 
137 static dev_link_t *dev_list = NULL;            << 
138                                                << 
139 /*                                                121 /*
140    A dev_link_t structure has fields for most  << 
141    to keep track of a socket, but there will u << 
142    specific information that also needs to be  << 
143    'priv' pointer in a dev_link_t structure ca << 
144    a device-specific private data structure, l << 
145                                                << 
146    A driver needs to provide a dev_node_t stru    122    A driver needs to provide a dev_node_t structure for each device
147    on a card.  In some cases, there is only on    123    on a card.  In some cases, there is only one device per card (for
148    example, ethernet cards, modems).  In other    124    example, ethernet cards, modems).  In other cases, there may be
149    many actual or logical devices (SCSI adapte    125    many actual or logical devices (SCSI adapters, memory cards with
150    multiple partitions).  The dev_node_t struc    126    multiple partitions).  The dev_node_t structures need to be kept
151    in a linked list starting at the 'dev' fiel !! 127    in a linked list starting at the 'dev' field of a struct pcmcia_device
152    structure.  We allocate them in the card's     128    structure.  We allocate them in the card's private data structure,
153    because they generally shouldn't be allocat    129    because they generally shouldn't be allocated dynamically.
154                                                   130 
155    In this case, we also provide a flag to ind    131    In this case, we also provide a flag to indicate if a device is
156    "stopped" due to a power management event,     132    "stopped" due to a power management event, or card ejection.  The
157    device IO routines can use a flag like this    133    device IO routines can use a flag like this to throttle IO to a
158    card that is not ready to accept it.           134    card that is not ready to accept it.
159 */                                                135 */
160                                                !! 136 
161 typedef struct local_info_t {                     137 typedef struct local_info_t {
162         dev_node_t      node;                     138         dev_node_t      node;
163         struct net_device *eth_dev;               139         struct net_device *eth_dev;
164 } local_info_t;                                   140 } local_info_t;
165                                                   141 
166 /*============================================    142 /*======================================================================
167                                                !! 143 
168   atmel_attach() creates an "instance" of the     144   atmel_attach() creates an "instance" of the driver, allocating
169   local data structures for one device.  The d    145   local data structures for one device.  The device is registered
170   with Card Services.                             146   with Card Services.
171                                                !! 147 
172   The dev_link structure is initialized, but w    148   The dev_link structure is initialized, but we don't actually
173   configure the card at this point -- we wait     149   configure the card at this point -- we wait until we receive a
174   card insertion event.                           150   card insertion event.
175                                                !! 151 
176   ============================================    152   ======================================================================*/
177                                                   153 
178 static dev_link_t *atmel_attach(void)          !! 154 static int atmel_probe(struct pcmcia_device *p_dev)
179 {                                                 155 {
180         client_reg_t client_reg;               << 
181         dev_link_t *link;                      << 
182         local_info_t *local;                      156         local_info_t *local;
183         int ret;                               !! 157 
184                                                << 
185         DEBUG(0, "atmel_attach()\n");             158         DEBUG(0, "atmel_attach()\n");
186                                                   159 
187         /* Initialize the dev_link_t structure << 
188         link = kmalloc(sizeof(struct dev_link_ << 
189         if (!link) {                           << 
190                 printk(KERN_ERR "atmel_cs: no  << 
191                 return NULL;                   << 
192         }                                      << 
193         memset(link, 0, sizeof(struct dev_link << 
194                                                << 
195         /* Interrupt setup */                     160         /* Interrupt setup */
196         link->irq.Attributes = IRQ_TYPE_EXCLUS !! 161         p_dev->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING;
197         link->irq.IRQInfo1 = IRQ_LEVEL_ID;     !! 162         p_dev->irq.IRQInfo1 = IRQ_LEVEL_ID;
198         link->irq.Handler = NULL;              !! 163         p_dev->irq.Handler = NULL;
199                                                !! 164 
200         /*                                        165         /*
201           General socket configuration default    166           General socket configuration defaults can go here.  In this
202           client, we assume very little, and r    167           client, we assume very little, and rely on the CIS for almost
203           everything.  In most clients, many d    168           everything.  In most clients, many details (i.e., number, sizes,
204           and attributes of IO windows) are fi    169           and attributes of IO windows) are fixed by the nature of the
205           device, and can be hard-wired here.     170           device, and can be hard-wired here.
206         */                                        171         */
207         link->conf.Attributes = 0;             !! 172         p_dev->conf.Attributes = 0;
208         link->conf.Vcc = 50;                   !! 173         p_dev->conf.IntType = INT_MEMORY_AND_IO;
209         link->conf.IntType = INT_MEMORY_AND_IO !! 174 
210                                                << 
211         /* Allocate space for private device-s    175         /* Allocate space for private device-specific data */
212         local = kmalloc(sizeof(local_info_t),  !! 176         local = kzalloc(sizeof(local_info_t), GFP_KERNEL);
213         if (!local) {                             177         if (!local) {
214                 printk(KERN_ERR "atmel_cs: no     178                 printk(KERN_ERR "atmel_cs: no memory for new device\n");
215                 kfree (link);                  !! 179                 return -ENOMEM;
216                 return NULL;                   << 
217         }                                         180         }
218         memset(local, 0, sizeof(local_info_t)) !! 181         p_dev->priv = local;
219         link->priv = local;                    !! 182 
220                                                !! 183         return atmel_config(p_dev);
221         /* Register with Card Services */      << 
222         link->next = dev_list;                 << 
223         dev_list = link;                       << 
224         client_reg.dev_info = &dev_info;       << 
225         client_reg.EventMask =                 << 
226                 CS_EVENT_CARD_INSERTION | CS_E << 
227                 CS_EVENT_RESET_PHYSICAL | CS_E << 
228                 CS_EVENT_PM_SUSPEND | CS_EVENT << 
229         client_reg.event_handler = &atmel_even << 
230         client_reg.Version = 0x0210;           << 
231         client_reg.event_callback_args.client_ << 
232         ret = pcmcia_register_client(&link->ha << 
233         if (ret != 0) {                        << 
234                 cs_error(link->handle, Registe << 
235                 atmel_detach(link);            << 
236                 return NULL;                   << 
237         }                                      << 
238                                                << 
239         return link;                           << 
240 } /* atmel_attach */                              184 } /* atmel_attach */
241                                                   185 
242 /*============================================    186 /*======================================================================
243                                                !! 187 
244   This deletes a driver "instance".  The devic    188   This deletes a driver "instance".  The device is de-registered
245   with Card Services.  If it has been released    189   with Card Services.  If it has been released, all local data
246   structures are freed.  Otherwise, the struct    190   structures are freed.  Otherwise, the structures will be freed
247   when the device is released.                    191   when the device is released.
248                                                !! 192 
249   ============================================    193   ======================================================================*/
250                                                   194 
251 static void atmel_detach(dev_link_t *link)     !! 195 static void atmel_detach(struct pcmcia_device *link)
252 {                                                 196 {
253         dev_link_t **linkp;                    << 
254                                                << 
255         DEBUG(0, "atmel_detach(0x%p)\n", link)    197         DEBUG(0, "atmel_detach(0x%p)\n", link);
256                                                !! 198 
257         /* Locate device structure */          !! 199         atmel_release(link);
258         for (linkp = &dev_list; *linkp; linkp  !! 200 
259                 if (*linkp == link) break;     !! 201         kfree(link->priv);
260         if (*linkp == NULL)                    << 
261                 return;                        << 
262                                                << 
263         if (link->state & DEV_CONFIG)          << 
264                 atmel_release(link);           << 
265                                                << 
266         /* Break the link with Card Services * << 
267         if (link->handle)                      << 
268                 pcmcia_deregister_client(link- << 
269                                                << 
270         /* Unlink device structure, free piece << 
271         *linkp = link->next;                   << 
272         if (link->priv)                        << 
273                 kfree(link->priv);             << 
274         kfree(link);                           << 
275 }                                                 202 }
276                                                   203 
277 /*============================================    204 /*======================================================================
278                                                !! 205 
279   atmel_config() is scheduled to run after a C    206   atmel_config() is scheduled to run after a CARD_INSERTION event
280   is received, to configure the PCMCIA socket,    207   is received, to configure the PCMCIA socket, and to make the
281   device available to the system.                 208   device available to the system.
282                                                !! 209 
283   ============================================    210   ======================================================================*/
284                                                   211 
285 #define CS_CHECK(fn, ret) \                       212 #define CS_CHECK(fn, ret) \
286 do { last_fn = (fn); if ((last_ret = (ret)) !=    213 do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
287                                                   214 
288 /* Call-back function to interrogate PCMCIA-sp    215 /* Call-back function to interrogate PCMCIA-specific information
289    about the current existance of the card */     216    about the current existance of the card */
290 static int card_present(void *arg)                217 static int card_present(void *arg)
291 {                                              !! 218 {
292         dev_link_t *link = (dev_link_t *)arg;  !! 219         struct pcmcia_device *link = (struct pcmcia_device *)arg;
293         if (link->state & DEV_SUSPEND)         !! 220 
294                 return 0;                      !! 221         if (pcmcia_dev_present(link))
295         else if (link->state & DEV_PRESENT)    << 
296                 return 1;                         222                 return 1;
297                                                !! 223 
298         return 0;                                 224         return 0;
299 }                                                 225 }
300                                                   226 
301 /* list of cards we know about and their firmw !! 227 static int atmel_config_check(struct pcmcia_device *p_dev,
302    Go either by Manfid or version strings.     !! 228                               cistpl_cftable_entry_t *cfg,
303    Cards not in this list will need a firmware !! 229                               cistpl_cftable_entry_t *dflt,
304    in all probability. Note that the SMC 2632  !! 230                               unsigned int vcc,
305    manfids, so we ignore those and use the ver !! 231                               void *priv_data)
306                                                !! 232 {
307 static struct {                                !! 233         if (cfg->index == 0)
308         int manf, card;                        !! 234                 return -ENODEV;
309         char *ver1;                            !! 235 
310         char *firmware;                        !! 236         /* Does this card need audio output? */
311         char *name;                            !! 237         if (cfg->flags & CISTPL_CFTABLE_AUDIO) {
312 } card_table[] = {                             !! 238                 p_dev->conf.Attributes |= CONF_ENABLE_SPKR;
313         { 0, 0, "WLAN/802.11b PC CARD", "atmel !! 239                 p_dev->conf.Status = CCSR_AUDIO_ENA;
314         { 0, 0, "ATMEL/AT76C502AR", "atmel_at7 !! 240         }
315         { 0, 0, "ATMEL/AT76C502AR_D", "atmel_a << 
316         { 0, 0, "ATMEL/AT76C502AR_E", "atmel_a << 
317         { 0, 0, "ATMEL/AT76C504", "atmel_at76c << 
318         { 0, 0, "ATMEL/AT76C504A", "atmel_at76 << 
319         { 0, 0, "ATMEL/AT76C504_R", "atmel_at7 << 
320         { MANFID_3COM, 0x0620, NULL, "atmel_at << 
321         { MANFID_3COM, 0x0696, NULL, "atmel_at << 
322         { 0, 0, "SMC/2632W-V2", "atmel_at76c50 << 
323         { 0, 0, "SMC/2632W", "atmel_at76c502d% << 
324         { 0xd601, 0x0007, NULL, "atmel_at76c50 << 
325         { 0x01bf, 0x3302, NULL, "atmel_at76c50 << 
326         { 0, 0, "BT/Voyager 1020 Laptop Adapte << 
327         { 0, 0, "IEEE 802.11b/Wireless LAN PC  << 
328         { 0, 0, "CNet/CNWLC 11Mbps Wireless PC << 
329         { 0, 0, "Wireless/PC_CARD", "atmel_at7 << 
330         { 0, 0, "OEM/11Mbps Wireless LAN PC Ca << 
331         { 0, 0, "11WAVE/11WP611AL-E", "atmel_a << 
332 };                                             << 
333                                                   241 
334 static void atmel_config(dev_link_t *link)     !! 242         /* Use power settings for Vcc and Vpp if present */
                                                   >> 243         /*  Note that the CIS values need to be rescaled */
                                                   >> 244         if (cfg->vpp1.present & (1<<CISTPL_POWER_VNOM))
                                                   >> 245                 p_dev->conf.Vpp = cfg->vpp1.param[CISTPL_POWER_VNOM]/10000;
                                                   >> 246         else if (dflt->vpp1.present & (1<<CISTPL_POWER_VNOM))
                                                   >> 247                 p_dev->conf.Vpp = dflt->vpp1.param[CISTPL_POWER_VNOM]/10000;
                                                   >> 248 
                                                   >> 249         /* Do we need to allocate an interrupt? */
                                                   >> 250         if (cfg->irq.IRQInfo1 || dflt->irq.IRQInfo1)
                                                   >> 251                 p_dev->conf.Attributes |= CONF_ENABLE_IRQ;
                                                   >> 252 
                                                   >> 253         /* IO window settings */
                                                   >> 254         p_dev->io.NumPorts1 = p_dev->io.NumPorts2 = 0;
                                                   >> 255         if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
                                                   >> 256                 cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io;
                                                   >> 257                 p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
                                                   >> 258                 if (!(io->flags & CISTPL_IO_8BIT))
                                                   >> 259                         p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
                                                   >> 260                 if (!(io->flags & CISTPL_IO_16BIT))
                                                   >> 261                         p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
                                                   >> 262                 p_dev->io.BasePort1 = io->win[0].base;
                                                   >> 263                 p_dev->io.NumPorts1 = io->win[0].len;
                                                   >> 264                 if (io->nwin > 1) {
                                                   >> 265                         p_dev->io.Attributes2 = p_dev->io.Attributes1;
                                                   >> 266                         p_dev->io.BasePort2 = io->win[1].base;
                                                   >> 267                         p_dev->io.NumPorts2 = io->win[1].len;
                                                   >> 268                 }
                                                   >> 269         }
                                                   >> 270 
                                                   >> 271         /* This reserves IO space but doesn't actually enable it */
                                                   >> 272         return pcmcia_request_io(p_dev, &p_dev->io);
                                                   >> 273 }
                                                   >> 274 
                                                   >> 275 static int atmel_config(struct pcmcia_device *link)
335 {                                                 276 {
336         client_handle_t handle;                << 
337         tuple_t tuple;                         << 
338         cisparse_t parse;                      << 
339         local_info_t *dev;                        277         local_info_t *dev;
340         int last_fn, last_ret;                    278         int last_fn, last_ret;
341         u_char buf[64];                        !! 279         struct pcmcia_device_id *did;
342         int card_index = -1, done = 0;         !! 280 
343                                                << 
344         handle = link->handle;                 << 
345         dev = link->priv;                         281         dev = link->priv;
                                                   >> 282         did = dev_get_drvdata(&handle_to_dev(link));
346                                                   283 
347         DEBUG(0, "atmel_config(0x%p)\n", link)    284         DEBUG(0, "atmel_config(0x%p)\n", link);
348                                                << 
349         tuple.Attributes = 0;                  << 
350         tuple.TupleData = buf;                 << 
351         tuple.TupleDataMax = sizeof(buf);      << 
352         tuple.TupleOffset = 0;                 << 
353                                                << 
354         tuple.DesiredTuple = CISTPL_MANFID;    << 
355         if (pcmcia_get_first_tuple(handle, &tu << 
356                 int i;                         << 
357                 cistpl_manfid_t *manfid;       << 
358                 CS_CHECK(GetTupleData, pcmcia_ << 
359                 CS_CHECK(ParseTuple, pcmcia_pa << 
360                 manfid = &(parse.manfid);      << 
361                 for (i = 0; i < sizeof(card_ta << 
362                         if (!card_table[i].ver << 
363                             manfid->manf == ca << 
364                             manfid->card == ca << 
365                                 card_index = i << 
366                                 done = 1;      << 
367                         }                      << 
368                 }                              << 
369         }                                      << 
370                                                << 
371         tuple.DesiredTuple = CISTPL_VERS_1;    << 
372         if (!done && (pcmcia_get_first_tuple(h << 
373                 int i, j, k;                   << 
374                 cistpl_vers_1_t *ver1;         << 
375                 CS_CHECK(GetTupleData, pcmcia_ << 
376                 CS_CHECK(ParseTuple, pcmcia_pa << 
377                 ver1 = &(parse.version_1);     << 
378                                                << 
379                 for (i = 0; i < sizeof(card_ta << 
380                         for (j = 0; j < ver1-> << 
381                                 char *p = card << 
382                                 char *q = &ver << 
383                                 if (!p)        << 
384                                         goto m << 
385                                 for (k = 0; k  << 
386                                         while  << 
387                                         if (*p << 
388                                                << 
389                                                << 
390                                         } else << 
391                                                << 
392                                         }      << 
393                                 }              << 
394                                 while((*q != ' << 
395                                       (*p != ' << 
396                                 if (((*p != '\ << 
397                                         goto m << 
398                         }                      << 
399                         card_index = i;        << 
400                         break;  /* done */     << 
401                                                << 
402                 mismatch:                      << 
403                         j = 0; /* dummy stmt t << 
404                 }                              << 
405         }                                      << 
406                                                   285 
407         /*                                        286         /*
408           This reads the card's CONFIG tuple t << 
409           registers.                           << 
410         */                                     << 
411         tuple.DesiredTuple = CISTPL_CONFIG;    << 
412         CS_CHECK(GetFirstTuple, pcmcia_get_fir << 
413         CS_CHECK(GetTupleData, pcmcia_get_tupl << 
414         CS_CHECK(ParseTuple, pcmcia_parse_tupl << 
415         link->conf.ConfigBase = parse.config.b << 
416         link->conf.Present = parse.config.rmas << 
417                                                << 
418         /* Configure card */                   << 
419         link->state |= DEV_CONFIG;             << 
420                                                << 
421         /*                                     << 
422           In this loop, we scan the CIS for co    287           In this loop, we scan the CIS for configuration table entries,
423           each of which describes a valid card    288           each of which describes a valid card configuration, including
424           voltage, IO window, memory window, a    289           voltage, IO window, memory window, and interrupt settings.
425                                                !! 290 
426           We make no assumptions about the car    291           We make no assumptions about the card to be configured: we use
427           just the information available in th    292           just the information available in the CIS.  In an ideal world,
428           this would work for any PCMCIA card,    293           this would work for any PCMCIA card, but it requires a complete
429           and accurate CIS.  In practice, a dr    294           and accurate CIS.  In practice, a driver usually "knows" most of
430           these things without consulting the     295           these things without consulting the CIS, and most client drivers
431           will only use the CIS to fill in imp    296           will only use the CIS to fill in implementation-defined details.
432         */                                        297         */
433         tuple.DesiredTuple = CISTPL_CFTABLE_EN !! 298         if (pcmcia_loop_config(link, atmel_config_check, NULL))
434         CS_CHECK(GetFirstTuple, pcmcia_get_fir !! 299                 goto failed;
435         while (1) {                            !! 300 
436                 cistpl_cftable_entry_t dflt =  << 
437                 cistpl_cftable_entry_t *cfg =  << 
438                 if (pcmcia_get_tuple_data(hand << 
439                                 pcmcia_parse_t << 
440                         goto next_entry;       << 
441                                                << 
442                 if (cfg->flags & CISTPL_CFTABL << 
443                 if (cfg->index == 0) goto next << 
444                 link->conf.ConfigIndex = cfg-> << 
445                                                << 
446                 /* Does this card need audio o << 
447                 if (cfg->flags & CISTPL_CFTABL << 
448                         link->conf.Attributes  << 
449                         link->conf.Status = CC << 
450                 }                              << 
451                                                << 
452                 /* Use power settings for Vcc  << 
453                 /*  Note that the CIS values n << 
454                 if (cfg->vcc.present & (1<<CIS << 
455                         link->conf.Vcc = cfg-> << 
456                 else if (dflt.vcc.present & (1 << 
457                         link->conf.Vcc = dflt. << 
458                                                << 
459                 if (cfg->vpp1.present & (1<<CI << 
460                         link->conf.Vpp1 = link << 
461                                 cfg->vpp1.para << 
462                 else if (dflt.vpp1.present & ( << 
463                         link->conf.Vpp1 = link << 
464                                 dflt.vpp1.para << 
465                                                << 
466                 /* Do we need to allocate an i << 
467                 if (cfg->irq.IRQInfo1 || dflt. << 
468                         link->conf.Attributes  << 
469                                                << 
470                 /* IO window settings */       << 
471                 link->io.NumPorts1 = link->io. << 
472                 if ((cfg->io.nwin > 0) || (dfl << 
473                         cistpl_io_t *io = (cfg << 
474                         link->io.Attributes1 = << 
475                         if (!(io->flags & CIST << 
476                                 link->io.Attri << 
477                         if (!(io->flags & CIST << 
478                                 link->io.Attri << 
479                         link->io.BasePort1 = i << 
480                         link->io.NumPorts1 = i << 
481                         if (io->nwin > 1) {    << 
482                                 link->io.Attri << 
483                                 link->io.BaseP << 
484                                 link->io.NumPo << 
485                         }                      << 
486                 }                              << 
487                                                << 
488                 /* This reserves IO space but  << 
489                 if (pcmcia_request_io(link->ha << 
490                         goto next_entry;       << 
491                                                << 
492                 /* If we got this far, we're c << 
493                 break;                         << 
494                                                << 
495         next_entry:                            << 
496                 CS_CHECK(GetNextTuple, pcmcia_ << 
497         }                                      << 
498                                                << 
499         /*                                        301         /*
500           Allocate an interrupt line.  Note th    302           Allocate an interrupt line.  Note that this does not assign a
501           handler to the interrupt, unless the    303           handler to the interrupt, unless the 'Handler' member of the
502           irq structure is initialized.           304           irq structure is initialized.
503         */                                        305         */
504         if (link->conf.Attributes & CONF_ENABL    306         if (link->conf.Attributes & CONF_ENABLE_IRQ)
505                 CS_CHECK(RequestIRQ, pcmcia_re !! 307                 CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq));
506                                                !! 308 
507         /*                                        309         /*
508           This actually configures the PCMCIA     310           This actually configures the PCMCIA socket -- setting up
509           the I/O windows and the interrupt ma    311           the I/O windows and the interrupt mapping, and putting the
510           card and host interface into "Memory    312           card and host interface into "Memory and IO" mode.
511         */                                        313         */
512         CS_CHECK(RequestConfiguration, pcmcia_ !! 314         CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf));
513                                                !! 315 
514         if (link->irq.AssignedIRQ == 0) {         316         if (link->irq.AssignedIRQ == 0) {
515                 printk(KERN_ALERT              !! 317                 printk(KERN_ALERT
516                        "atmel: cannot assign I    318                        "atmel: cannot assign IRQ: check that CONFIG_ISA is set in kernel config.");
517                 goto cs_failed;                   319                 goto cs_failed;
518         }                                         320         }
519                                                !! 321 
520         ((local_info_t*)link->priv)->eth_dev = !! 322         ((local_info_t*)link->priv)->eth_dev =
521                 init_atmel_card(link->irq.Assi    323                 init_atmel_card(link->irq.AssignedIRQ,
522                                 link->io.BaseP    324                                 link->io.BasePort1,
523                                 card_index ==  !! 325                                 did ? did->driver_info : ATMEL_FW_TYPE_NONE,
524                                 &handle_to_dev !! 326                                 &handle_to_dev(link),
525                                 card_present,  !! 327                                 card_present,
526                                 link);            328                                 link);
527         if (!((local_info_t*)link->priv)->eth_ !! 329         if (!((local_info_t*)link->priv)->eth_dev)
528                 goto cs_failed;                !! 330                         goto cs_failed;
529                                                !! 331 
                                                   >> 332 
530         /*                                        333         /*
531           At this point, the dev_node_t struct    334           At this point, the dev_node_t structure(s) need to be
532           initialized and arranged in a linked !! 335           initialized and arranged in a linked list at link->dev_node.
533         */                                        336         */
534         strcpy(dev->node.dev_name, ((local_inf    337         strcpy(dev->node.dev_name, ((local_info_t*)link->priv)->eth_dev->name );
535         dev->node.major = dev->node.minor = 0;    338         dev->node.major = dev->node.minor = 0;
536         link->dev = &dev->node;                !! 339         link->dev_node = &dev->node;
537                                                !! 340 
538         /* Finally, report what we've done */  !! 341         return 0;
539         printk(KERN_INFO "%s: %s%sindex 0x%02x !! 342 
540                dev->node.dev_name,             << 
541                card_index == -1 ? "" :  card_t << 
542                card_index == -1 ? "" : " ",    << 
543                link->conf.ConfigIndex,         << 
544                link->conf.Vcc/10, link->conf.V << 
545         if (link->conf.Vpp1)                   << 
546                 printk(", Vpp %d.%d", link->co << 
547         if (link->conf.Attributes & CONF_ENABL << 
548                 printk(", irq %d", link->irq.A << 
549         if (link->io.NumPorts1)                << 
550                 printk(", io 0x%04x-0x%04x", l << 
551                        link->io.BasePort1+link << 
552         if (link->io.NumPorts2)                << 
553                 printk(" & 0x%04x-0x%04x", lin << 
554                        link->io.BasePort2+link << 
555         printk("\n");                          << 
556                                                << 
557         link->state &= ~DEV_CONFIG_PENDING;    << 
558         return;                                << 
559                                                << 
560  cs_failed:                                       343  cs_failed:
561         cs_error(link->handle, last_fn, last_r !! 344         cs_error(link, last_fn, last_ret);
                                                   >> 345  failed:
562         atmel_release(link);                      346         atmel_release(link);
                                                   >> 347         return -ENODEV;
563 }                                                 348 }
564                                                   349 
565 /*============================================    350 /*======================================================================
566                                                !! 351 
567   After a card is removed, atmel_release() wil    352   After a card is removed, atmel_release() will unregister the
568   device, and release the PCMCIA configuration    353   device, and release the PCMCIA configuration.  If the device is
569   still open, this will be postponed until it     354   still open, this will be postponed until it is closed.
570                                                !! 355 
571   ============================================    356   ======================================================================*/
572                                                   357 
573 static void atmel_release(dev_link_t *link)    !! 358 static void atmel_release(struct pcmcia_device *link)
574 {                                                 359 {
575         struct net_device *dev = ((local_info_    360         struct net_device *dev = ((local_info_t*)link->priv)->eth_dev;
576                                                !! 361 
577         DEBUG(0, "atmel_release(0x%p)\n", link    362         DEBUG(0, "atmel_release(0x%p)\n", link);
578                                                !! 363 
579         /* Unlink the device chain */          !! 364         if (dev)
580         link->dev = NULL;                      !! 365                 stop_atmel_card(dev);
581                                                !! 366         ((local_info_t*)link->priv)->eth_dev = NULL;
582         if (dev)                               !! 367 
583                 stop_atmel_card(dev, 0);       !! 368         pcmcia_disable_device(link);
584         ((local_info_t*)link->priv)->eth_dev = << 
585                                                << 
586         /* Don't bother checking to see if the << 
587         pcmcia_release_configuration(link->han << 
588         if (link->io.NumPorts1)                << 
589                 pcmcia_release_io(link->handle << 
590         if (link->irq.AssignedIRQ)             << 
591                 pcmcia_release_irq(link->handl << 
592         link->state &= ~DEV_CONFIG;            << 
593 }                                                 369 }
594                                                   370 
595 /*============================================ !! 371 static int atmel_suspend(struct pcmcia_device *link)
596                                                !! 372 {
597   The card status event handler.  Mostly, this !! 373         local_info_t *local = link->priv;
598   stuff to run after an event is received.     << 
599                                                << 
600   When a CARD_REMOVAL event is received, we im << 
601   private flag to block future accesses to thi << 
602   functions that actually access the device sh << 
603   to make sure the card is still present.      << 
604                                                << 
605   ============================================ << 
606                                                   374 
607 static int atmel_event(event_t event, int prio !! 375         netif_device_detach(local->eth_dev);
608                       event_callback_args_t *a !! 376 
                                                   >> 377         return 0;
                                                   >> 378 }
                                                   >> 379 
                                                   >> 380 static int atmel_resume(struct pcmcia_device *link)
609 {                                                 381 {
610         dev_link_t *link = args->client_data;  << 
611         local_info_t *local = link->priv;         382         local_info_t *local = link->priv;
612                                                !! 383 
613         DEBUG(1, "atmel_event(0x%06x)\n", even !! 384         atmel_open(local->eth_dev);
614                                                !! 385         netif_device_attach(local->eth_dev);
615         switch (event) {                       !! 386 
616         case CS_EVENT_CARD_REMOVAL:            << 
617                 link->state &= ~DEV_PRESENT;   << 
618                 if (link->state & DEV_CONFIG)  << 
619                         netif_device_detach(lo << 
620                         atmel_release(link);   << 
621                 }                              << 
622                 break;                         << 
623         case CS_EVENT_CARD_INSERTION:          << 
624                 link->state |= DEV_PRESENT | D << 
625                 atmel_config(link);            << 
626                 break;                         << 
627         case CS_EVENT_PM_SUSPEND:              << 
628                 link->state |= DEV_SUSPEND;    << 
629                 /* Fall through... */          << 
630         case CS_EVENT_RESET_PHYSICAL:          << 
631                 if (link->state & DEV_CONFIG)  << 
632                         netif_device_detach(lo << 
633                         pcmcia_release_configu << 
634                 }                              << 
635                 break;                         << 
636         case CS_EVENT_PM_RESUME:               << 
637                 link->state &= ~DEV_SUSPEND;   << 
638                 /* Fall through... */          << 
639         case CS_EVENT_CARD_RESET:              << 
640                 if (link->state & DEV_CONFIG)  << 
641                         pcmcia_request_configu << 
642                         atmel_open(local->eth_ << 
643                         netif_device_attach(lo << 
644                 }                              << 
645                 break;                         << 
646         }                                      << 
647         return 0;                                 387         return 0;
648 } /* atmel_event */                            !! 388 }
649                                                   389 
650 /*============================================    390 /*====================================================================*/
                                                   >> 391 /* We use the driver_info field to store the correct firmware type for a card. */
                                                   >> 392 
                                                   >> 393 #define PCMCIA_DEVICE_MANF_CARD_INFO(manf, card, info) { \
                                                   >> 394         .match_flags = PCMCIA_DEV_ID_MATCH_MANF_ID| \
                                                   >> 395                         PCMCIA_DEV_ID_MATCH_CARD_ID, \
                                                   >> 396         .manf_id = (manf), \
                                                   >> 397         .card_id = (card), \
                                                   >> 398         .driver_info = (kernel_ulong_t)(info), }
                                                   >> 399 
                                                   >> 400 #define PCMCIA_DEVICE_PROD_ID12_INFO(v1, v2, vh1, vh2, info) { \
                                                   >> 401         .match_flags = PCMCIA_DEV_ID_MATCH_PROD_ID1| \
                                                   >> 402                         PCMCIA_DEV_ID_MATCH_PROD_ID2, \
                                                   >> 403         .prod_id = { (v1), (v2), NULL, NULL }, \
                                                   >> 404         .prod_id_hash = { (vh1), (vh2), 0, 0 }, \
                                                   >> 405         .driver_info = (kernel_ulong_t)(info), }
                                                   >> 406 
                                                   >> 407 static struct pcmcia_device_id atmel_ids[] = {
                                                   >> 408         PCMCIA_DEVICE_MANF_CARD_INFO(0x0101, 0x0620, ATMEL_FW_TYPE_502_3COM),
                                                   >> 409         PCMCIA_DEVICE_MANF_CARD_INFO(0x0101, 0x0696, ATMEL_FW_TYPE_502_3COM),
                                                   >> 410         PCMCIA_DEVICE_MANF_CARD_INFO(0x01bf, 0x3302, ATMEL_FW_TYPE_502E),
                                                   >> 411         PCMCIA_DEVICE_MANF_CARD_INFO(0xd601, 0x0007, ATMEL_FW_TYPE_502),
                                                   >> 412         PCMCIA_DEVICE_PROD_ID12_INFO("11WAVE", "11WP611AL-E", 0x9eb2da1f, 0xc9a0d3f9, ATMEL_FW_TYPE_502E),
                                                   >> 413         PCMCIA_DEVICE_PROD_ID12_INFO("ATMEL", "AT76C502AR", 0xabda4164, 0x41b37e1f, ATMEL_FW_TYPE_502),
                                                   >> 414         PCMCIA_DEVICE_PROD_ID12_INFO("ATMEL", "AT76C502AR_D", 0xabda4164, 0x3675d704, ATMEL_FW_TYPE_502D),
                                                   >> 415         PCMCIA_DEVICE_PROD_ID12_INFO("ATMEL", "AT76C502AR_E", 0xabda4164, 0x4172e792, ATMEL_FW_TYPE_502E),
                                                   >> 416         PCMCIA_DEVICE_PROD_ID12_INFO("ATMEL", "AT76C504_R", 0xabda4164, 0x917f3d72, ATMEL_FW_TYPE_504_2958),
                                                   >> 417         PCMCIA_DEVICE_PROD_ID12_INFO("ATMEL", "AT76C504", 0xabda4164, 0x5040670a, ATMEL_FW_TYPE_504),
                                                   >> 418         PCMCIA_DEVICE_PROD_ID12_INFO("ATMEL", "AT76C504A", 0xabda4164, 0xe15ed87f, ATMEL_FW_TYPE_504A_2958),
                                                   >> 419         PCMCIA_DEVICE_PROD_ID12_INFO("BT", "Voyager 1020 Laptop Adapter", 0xae49b86a, 0x1e957cd5, ATMEL_FW_TYPE_502),
                                                   >> 420         PCMCIA_DEVICE_PROD_ID12_INFO("CNet", "CNWLC 11Mbps Wireless PC Card V-5", 0xbc477dde, 0x502fae6b, ATMEL_FW_TYPE_502E),
                                                   >> 421         PCMCIA_DEVICE_PROD_ID12_INFO("IEEE 802.11b", "Wireless LAN PC Card", 0x5b878724, 0x122f1df6, ATMEL_FW_TYPE_502),
                                                   >> 422         PCMCIA_DEVICE_PROD_ID12_INFO("IEEE 802.11b", "Wireless LAN Card S", 0x5b878724, 0x5fba533a, ATMEL_FW_TYPE_504_2958),
                                                   >> 423         PCMCIA_DEVICE_PROD_ID12_INFO("OEM", "11Mbps Wireless LAN PC Card V-3", 0xfea54c90, 0x1c5b0f68, ATMEL_FW_TYPE_502),
                                                   >> 424         PCMCIA_DEVICE_PROD_ID12_INFO("SMC", "2632W", 0xc4f8b18b, 0x30f38774, ATMEL_FW_TYPE_502D),
                                                   >> 425         PCMCIA_DEVICE_PROD_ID12_INFO("SMC", "2632W-V2", 0xc4f8b18b, 0x172d1377, ATMEL_FW_TYPE_502),
                                                   >> 426         PCMCIA_DEVICE_PROD_ID12_INFO("Wireless", "PC_CARD", 0xa407ecdd, 0x119f6314, ATMEL_FW_TYPE_502D),
                                                   >> 427         PCMCIA_DEVICE_PROD_ID12_INFO("WLAN", "802.11b PC CARD", 0x575c516c, 0xb1f6dbc4, ATMEL_FW_TYPE_502D),
                                                   >> 428         PCMCIA_DEVICE_PROD_ID12_INFO("LG", "LW2100N", 0xb474d43a, 0x6b1fec94, ATMEL_FW_TYPE_502E),
                                                   >> 429         PCMCIA_DEVICE_NULL
                                                   >> 430 };
                                                   >> 431 
                                                   >> 432 MODULE_DEVICE_TABLE(pcmcia, atmel_ids);
                                                   >> 433 
651 static struct pcmcia_driver atmel_driver = {      434 static struct pcmcia_driver atmel_driver = {
652         .owner          = THIS_MODULE,         !! 435         .owner          = THIS_MODULE,
653         .drv            = {                    !! 436         .drv            = {
654                 .name   = "atmel_cs",          !! 437                 .name   = "atmel_cs",
655         },                                        438         },
656         .attach         = atmel_attach,        !! 439         .probe          = atmel_probe,
657         .detach         = atmel_detach,        !! 440         .remove         = atmel_detach,
                                                   >> 441         .id_table       = atmel_ids,
                                                   >> 442         .suspend        = atmel_suspend,
                                                   >> 443         .resume         = atmel_resume,
658 };                                                444 };
659                                                   445 
660 static int atmel_cs_init(void)                    446 static int atmel_cs_init(void)
661 {                                                 447 {
662         return pcmcia_register_driver(&atmel_d    448         return pcmcia_register_driver(&atmel_driver);
663 }                                                 449 }
664                                                   450 
665 static void atmel_cs_cleanup(void)                451 static void atmel_cs_cleanup(void)
666 {                                                 452 {
667         pcmcia_unregister_driver(&atmel_driver    453         pcmcia_unregister_driver(&atmel_driver);
668         BUG_ON(dev_list != NULL);              << 
669 }                                                 454 }
670                                                   455 
671 /*                                                456 /*
672     This program is free software; you can red    457     This program is free software; you can redistribute it and/or
673     modify it under the terms of the GNU Gener    458     modify it under the terms of the GNU General Public License
674     as published by the Free Software Foundati    459     as published by the Free Software Foundation; either version 2
675     of the License, or (at your option) any la    460     of the License, or (at your option) any later version.
676                                                   461 
677     This program is distributed in the hope th    462     This program is distributed in the hope that it will be useful,
678     but WITHOUT ANY WARRANTY; without even the    463     but WITHOUT ANY WARRANTY; without even the implied warranty of
679     MERCHANTABILITY or FITNESS FOR A PARTICULA    464     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
680     GNU General Public License for more detail    465     GNU General Public License for more details.
681                                                   466 
682     In addition:                                  467     In addition:
683                                                   468 
684     Redistribution and use in source and binar    469     Redistribution and use in source and binary forms, with or without
685     modification, are permitted provided that     470     modification, are permitted provided that the following conditions
686     are met:                                      471     are met:
687                                                   472 
688     1. Redistributions of source code must ret    473     1. Redistributions of source code must retain the above copyright
689        notice, this list of conditions and the    474        notice, this list of conditions and the following disclaimer.
690     2. Redistributions in binary form must rep    475     2. Redistributions in binary form must reproduce the above copyright
691        notice, this list of conditions and the    476        notice, this list of conditions and the following disclaimer in the
692        documentation and/or other materials pr    477        documentation and/or other materials provided with the distribution.
693     3. The name of the author may not be used     478     3. The name of the author may not be used to endorse or promote
694        products derived from this software wit    479        products derived from this software without specific prior written
695        permission.                                480        permission.
696                                                   481 
697     THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``    482     THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
698     IMPLIED WARRANTIES, INCLUDING, BUT NOT LIM    483     IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
699     WARRANTIES OF MERCHANTABILITY AND FITNESS     484     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
700     ARE DISCLAIMED. IN NO EVENT SHALL THE AUTH    485     ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
701     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,     486     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
702     (INCLUDING, BUT NOT LIMITED TO, PROCUREMEN    487     (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
703     SERVICES; LOSS OF USE, DATA, OR PROFITS; O    488     SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
704     HOWEVER CAUSED AND ON ANY THEORY OF LIABIL    489     HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
705     STRICT LIABILITY, OR TORT (INCLUDING NEGLI    490     STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
706     IN ANY WAY OUT OF THE USE OF THIS SOFTWARE    491     IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
707     POSSIBILITY OF SUCH DAMAGE.                !! 492     POSSIBILITY OF SUCH DAMAGE.
708 */                                                493 */
709                                                   494 
710 module_init(atmel_cs_init);                       495 module_init(atmel_cs_init);
711 module_exit(atmel_cs_cleanup);                    496 module_exit(atmel_cs_cleanup);
712                                                   497 
  This page was automatically generated by the LXR engine.