~ubuntu-branches/debian/wheezy/linux-2.6/wheezy

« back to all changes in this revision

Viewing changes to drivers/staging/wlags49_h2/wl_cs.c

  • Committer: Bazaar Package Importer
  • Author(s): Ben Hutchings, Ben Hutchings, Aurelien Jarno, Martin Michlmayr
  • Date: 2011-04-06 13:53:30 UTC
  • mfrom: (43.1.5 sid)
  • Revision ID: james.westby@ubuntu.com-20110406135330-wjufxhd0tvn3zx4z
Tags: 2.6.38-3
[ Ben Hutchings ]
* [ppc64] Add to linux-tools package architectures (Closes: #620124)
* [amd64] Save cr4 to mmu_cr4_features at boot time (Closes: #620284)
* appletalk: Fix bugs introduced when removing use of BKL
* ALSA: Fix yet another race in disconnection
* cciss: Fix lost command issue
* ath9k: Fix kernel panic in AR2427
* ses: Avoid kernel panic when lun 0 is not mapped
* PCI/ACPI: Report ASPM support to BIOS if not disabled from command line

[ Aurelien Jarno ]
* rtlwifi: fix build when PCI is not enabled.

[ Martin Michlmayr ]
* rtlwifi: Eliminate udelay calls with too large values (Closes: #620204)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*******************************************************************************
 
2
 * Agere Systems Inc.
 
3
 * Wireless device driver for Linux (wlags49).
 
4
 *
 
5
 * Copyright (c) 1998-2003 Agere Systems Inc.
 
6
 * All rights reserved.
 
7
 *   http://www.agere.com
 
8
 *
 
9
 * Initially developed by TriplePoint, Inc.
 
10
 *   http://www.triplepoint.com
 
11
 *
 
12
 *------------------------------------------------------------------------------
 
13
 *
 
14
 *   This file contains processing and initialization specific to Card Services
 
15
 *   devices (PCMCIA, CF).
 
16
 *
 
17
 *------------------------------------------------------------------------------
 
18
 *
 
19
 * SOFTWARE LICENSE
 
20
 *
 
21
 * This software is provided subject to the following terms and conditions,
 
22
 * which you should read carefully before using the software.  Using this
 
23
 * software indicates your acceptance of these terms and conditions.  If you do
 
24
 * not agree with these terms and conditions, do not use the software.
 
25
 *
 
26
 * Copyright (c) 2003 Agere Systems Inc.
 
27
 * All rights reserved.
 
28
 *
 
29
 * Redistribution and use in source or binary forms, with or without
 
30
 * modifications, are permitted provided that the following conditions are met:
 
31
 *
 
32
 * . Redistributions of source code must retain the above copyright notice, this
 
33
 *    list of conditions and the following Disclaimer as comments in the code as
 
34
 *    well as in the documentation and/or other materials provided with the
 
35
 *    distribution.
 
36
 *
 
37
 * . Redistributions in binary form must reproduce the above copyright notice,
 
38
 *    this list of conditions and the following Disclaimer in the documentation
 
39
 *    and/or other materials provided with the distribution.
 
40
 *
 
41
 * . Neither the name of Agere Systems Inc. nor the names of the contributors
 
42
 *    may be used to endorse or promote products derived from this software
 
43
 *    without specific prior written permission.
 
44
 *
 
45
 * Disclaimer
 
46
 *
 
47
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
 
48
 * INCLUDING, BUT NOT LIMITED TO, INFRINGEMENT AND THE IMPLIED WARRANTIES OF
 
49
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  ANY
 
50
 * USE, MODIFICATION OR DISTRIBUTION OF THIS SOFTWARE IS SOLELY AT THE USERS OWN
 
51
 * RISK. IN NO EVENT SHALL AGERE SYSTEMS INC. OR CONTRIBUTORS BE LIABLE FOR ANY
 
52
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 
53
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 
54
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 
55
 * ON ANY THEORY OF LIABILITY, INCLUDING, BUT NOT LIMITED TO, CONTRACT, STRICT
 
56
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 
57
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
 
58
 * DAMAGE.
 
59
 *
 
60
 ******************************************************************************/
 
61
 
 
62
/*******************************************************************************
 
63
 *  include files
 
64
 ******************************************************************************/
 
65
#include <wl_version.h>
 
66
 
 
67
#include <linux/kernel.h>
 
68
#include <linux/sched.h>
 
69
#include <linux/ptrace.h>
 
70
#include <linux/ctype.h>
 
71
#include <linux/string.h>
 
72
#include <linux/timer.h>
 
73
#include <linux/interrupt.h>
 
74
#include <linux/in.h>
 
75
#include <linux/delay.h>
 
76
#include <asm/io.h>
 
77
#include <asm/system.h>
 
78
#include <asm/bitops.h>
 
79
 
 
80
#include <linux/netdevice.h>
 
81
#include <linux/etherdevice.h>
 
82
#include <linux/skbuff.h>
 
83
#include <linux/if_arp.h>
 
84
#include <linux/ioport.h>
 
85
 
 
86
#include <pcmcia/cistpl.h>
 
87
#include <pcmcia/cisreg.h>
 
88
#include <pcmcia/ciscode.h>
 
89
#include <pcmcia/ds.h>
 
90
#include <debug.h>
 
91
 
 
92
#include <hcf.h>
 
93
#include <dhf.h>
 
94
#include <hcfdef.h>
 
95
 
 
96
#include <wl_if.h>
 
97
#include <wl_internal.h>
 
98
#include <wl_util.h>
 
99
#include <wl_main.h>
 
100
#include <wl_netdev.h>
 
101
#include <wl_cs.h>
 
102
#include <wl_sysfs.h>
 
103
 
 
104
 
 
105
/*******************************************************************************
 
106
 *  global definitions
 
107
 ******************************************************************************/
 
108
#if DBG
 
109
extern dbg_info_t *DbgInfo;
 
110
#endif  /* DBG */
 
111
 
 
112
 
 
113
/*******************************************************************************
 
114
 *      wl_adapter_attach()
 
115
 *******************************************************************************
 
116
 *
 
117
 *  DESCRIPTION:
 
118
 *
 
119
 *      Creates an instance of the driver, allocating local data structures for
 
120
 *  one device. The device is registered with Card Services.
 
121
 *
 
122
 *  PARAMETERS:
 
123
 *
 
124
 *      none
 
125
 *
 
126
 *  RETURNS:
 
127
 *
 
128
 *      pointer to an allocated dev_link_t structure
 
129
 *      NULL on failure
 
130
 *
 
131
 ******************************************************************************/
 
132
static int wl_adapter_attach(struct pcmcia_device *link)
 
133
{
 
134
        struct net_device   *dev;
 
135
        struct wl_private   *lp;
 
136
        /*--------------------------------------------------------------------*/
 
137
 
 
138
        DBG_FUNC("wl_adapter_attach");
 
139
        DBG_ENTER(DbgInfo);
 
140
 
 
141
        dev = wl_device_alloc();
 
142
        if (dev == NULL) {
 
143
                DBG_ERROR(DbgInfo, "wl_device_alloc returned NULL\n");
 
144
                return -ENOMEM;
 
145
        }
 
146
 
 
147
        link->resource[0]->end  = HCF_NUM_IO_PORTS;
 
148
        link->resource[0]->flags= IO_DATA_PATH_WIDTH_16;
 
149
        link->config_flags     |= CONF_ENABLE_IRQ;
 
150
        link->config_index      = 5;
 
151
        link->config_regs       = PRESENT_OPTION;
 
152
 
 
153
        link->priv = dev;
 
154
        lp = wl_priv(dev);
 
155
        lp->link = link;
 
156
 
 
157
        wl_adapter_insert(link);
 
158
 
 
159
        DBG_LEAVE(DbgInfo);
 
160
        return 0;
 
161
} /* wl_adapter_attach */
 
162
/*============================================================================*/
 
163
 
 
164
 
 
165
 
 
166
static void wl_adapter_detach(struct pcmcia_device *link)
 
167
{
 
168
        struct net_device   *dev = link->priv;
 
169
        /*--------------------------------------------------------------------*/
 
170
 
 
171
        DBG_FUNC("wl_adapter_detach");
 
172
        DBG_ENTER(DbgInfo);
 
173
        DBG_PARAM(DbgInfo, "link", "0x%p", link);
 
174
 
 
175
        wl_adapter_release(link);
 
176
 
 
177
        if (dev) {
 
178
                unregister_wlags_sysfs(dev);
 
179
                unregister_netdev(dev);
 
180
        }
 
181
 
 
182
        wl_device_dealloc(dev);
 
183
 
 
184
        DBG_LEAVE(DbgInfo);
 
185
} /* wl_adapter_detach */
 
186
/*============================================================================*/
 
187
 
 
188
 
 
189
void wl_adapter_release(struct pcmcia_device *link)
 
190
{
 
191
        DBG_FUNC("wl_adapter_release");
 
192
        DBG_ENTER(DbgInfo);
 
193
        DBG_PARAM(DbgInfo, "link", "0x%p", link);
 
194
 
 
195
        /* Stop hardware */
 
196
        wl_remove(link->priv);
 
197
 
 
198
        pcmcia_disable_device(link);
 
199
 
 
200
        DBG_LEAVE(DbgInfo);
 
201
} /* wl_adapter_release */
 
202
/*============================================================================*/
 
203
 
 
204
static int wl_adapter_suspend(struct pcmcia_device *link)
 
205
{
 
206
        struct net_device *dev = link->priv;
 
207
 
 
208
        /* if (link->open) { */
 
209
        netif_device_detach(dev);
 
210
        wl_suspend(dev);
 
211
        /* CHECK! pcmcia_release_configuration(link->handle); */
 
212
        /* } */
 
213
 
 
214
        return 0;
 
215
} /* wl_adapter_suspend */
 
216
 
 
217
static int wl_adapter_resume(struct pcmcia_device *link)
 
218
{
 
219
        struct net_device *dev = link->priv;
 
220
 
 
221
        wl_resume(dev);
 
222
 
 
223
        netif_device_attach(dev);
 
224
 
 
225
        return 0;
 
226
} /* wl_adapter_resume */
 
227
 
 
228
void wl_adapter_insert(struct pcmcia_device *link)
 
229
{
 
230
        struct net_device *dev;
 
231
        int i;
 
232
        int ret;
 
233
        /*--------------------------------------------------------------------*/
 
234
 
 
235
        DBG_FUNC("wl_adapter_insert");
 
236
        DBG_ENTER(DbgInfo);
 
237
        DBG_PARAM(DbgInfo, "link", "0x%p", link);
 
238
 
 
239
        dev     = link->priv;
 
240
 
 
241
        /* Do we need to allocate an interrupt? */
 
242
        link->config_flags |= CONF_ENABLE_IRQ;
 
243
        link->io_lines = 6;
 
244
 
 
245
        ret = pcmcia_request_io(link);
 
246
        if (ret != 0)
 
247
                goto failed;
 
248
 
 
249
        ret = pcmcia_request_irq(link, (void *) wl_isr);
 
250
        if (ret != 0)
 
251
                goto failed;
 
252
 
 
253
        ret = pcmcia_enable_device(link);
 
254
        if (ret != 0)
 
255
                goto failed;
 
256
 
 
257
        dev->irq        = link->irq;
 
258
        dev->base_addr  = link->resource[0]->start;
 
259
 
 
260
        SET_NETDEV_DEV(dev, &link->dev);
 
261
        if (register_netdev(dev) != 0) {
 
262
                printk("%s: register_netdev() failed\n", MODULE_NAME);
 
263
                goto failed;
 
264
        }
 
265
 
 
266
        register_wlags_sysfs(dev);
 
267
 
 
268
        printk(KERN_INFO "%s: Wireless, io_addr %#03lx, irq %d, ""mac_address ",
 
269
                dev->name, dev->base_addr, dev->irq);
 
270
        for (i = 0; i < ETH_ALEN; i++)
 
271
                printk("%02X%c", dev->dev_addr[i], ((i < (ETH_ALEN-1)) ? ':' : '\n'));
 
272
 
 
273
        DBG_LEAVE(DbgInfo);
 
274
        return;
 
275
 
 
276
failed:
 
277
        wl_adapter_release(link);
 
278
 
 
279
        DBG_LEAVE(DbgInfo);
 
280
        return;
 
281
} /* wl_adapter_insert */
 
282
/*============================================================================*/
 
283
 
 
284
 
 
285
/*******************************************************************************
 
286
 *      wl_adapter_open()
 
287
 *******************************************************************************
 
288
 *
 
289
 *  DESCRIPTION:
 
290
 *
 
291
 *      Open the device.
 
292
 *
 
293
 *  PARAMETERS:
 
294
 *
 
295
 *      dev - a pointer to a net_device structure representing the network
 
296
 *            device to open.
 
297
 *
 
298
 *  RETURNS:
 
299
 *
 
300
 *      0 on success
 
301
 *      errno value otherwise
 
302
 *
 
303
 ******************************************************************************/
 
304
int wl_adapter_open(struct net_device *dev)
 
305
{
 
306
        struct wl_private *lp = wl_priv(dev);
 
307
        struct pcmcia_device *link = lp->link;
 
308
        int result = 0;
 
309
        int hcf_status = HCF_SUCCESS;
 
310
        /*--------------------------------------------------------------------*/
 
311
 
 
312
        DBG_FUNC("wl_adapter_open");
 
313
        DBG_ENTER(DbgInfo);
 
314
        DBG_PRINT("%s\n", VERSION_INFO);
 
315
        DBG_PARAM(DbgInfo, "dev", "%s (0x%p)", dev->name, dev);
 
316
 
 
317
        if (!pcmcia_dev_present(link)) {
 
318
                DBG_LEAVE(DbgInfo);
 
319
                return -ENODEV;
 
320
        }
 
321
 
 
322
        link->open++;
 
323
 
 
324
        hcf_status = wl_open(dev);
 
325
 
 
326
        if (hcf_status != HCF_SUCCESS) {
 
327
                link->open--;
 
328
                result = -ENODEV;
 
329
        }
 
330
 
 
331
        DBG_LEAVE(DbgInfo);
 
332
        return result;
 
333
} /* wl_adapter_open */
 
334
/*============================================================================*/
 
335
 
 
336
 
 
337
/*******************************************************************************
 
338
 *      wl_adapter_close()
 
339
 *******************************************************************************
 
340
 *
 
341
 *  DESCRIPTION:
 
342
 *
 
343
 *      Close the device.
 
344
 *
 
345
 *  PARAMETERS:
 
346
 *
 
347
 *      dev - a pointer to a net_device structure representing the network
 
348
 *            device to close.
 
349
 *
 
350
 *  RETURNS:
 
351
 *
 
352
 *      0 on success
 
353
 *      errno value otherwise
 
354
 *
 
355
 ******************************************************************************/
 
356
int wl_adapter_close(struct net_device *dev)
 
357
{
 
358
        struct wl_private *lp = wl_priv(dev);
 
359
        struct pcmcia_device *link = lp->link;
 
360
        /*--------------------------------------------------------------------*/
 
361
 
 
362
        DBG_FUNC("wl_adapter_close");
 
363
        DBG_ENTER(DbgInfo);
 
364
        DBG_PARAM(DbgInfo, "dev", "%s (0x%p)", dev->name, dev);
 
365
 
 
366
        if (link == NULL) {
 
367
                DBG_LEAVE(DbgInfo);
 
368
                return -ENODEV;
 
369
        }
 
370
 
 
371
        DBG_TRACE(DbgInfo, "%s: Shutting down adapter.\n", dev->name);
 
372
        wl_close(dev);
 
373
 
 
374
        link->open--;
 
375
 
 
376
        DBG_LEAVE(DbgInfo);
 
377
        return 0;
 
378
} /* wl_adapter_close */
 
379
/*============================================================================*/
 
380
 
 
381
static struct pcmcia_device_id wl_adapter_ids[] = {
 
382
#if !((HCF_TYPE) & HCF_TYPE_HII5)
 
383
        PCMCIA_DEVICE_MANF_CARD(0x0156, 0x0003),
 
384
        PCMCIA_DEVICE_PROD_ID12("Agere Systems", "Wireless PC Card Model 0110",
 
385
                                0x33103a9b, 0xe175b0dd),
 
386
#else
 
387
        PCMCIA_DEVICE_MANF_CARD(0x0156, 0x0004),
 
388
        PCMCIA_DEVICE_PROD_ID12("Linksys", "WCF54G_Wireless-G_CompactFlash_Card",
 
389
                                0x0733cc81, 0x98a599e1),
 
390
#endif  /* (HCF_TYPE) & HCF_TYPE_HII5 */
 
391
        PCMCIA_DEVICE_NULL,
 
392
};
 
393
MODULE_DEVICE_TABLE(pcmcia, wl_adapter_ids);
 
394
 
 
395
static struct pcmcia_driver wlags49_driver = {
 
396
        .owner      = THIS_MODULE,
 
397
        .name       = DRIVER_NAME,
 
398
        .probe      = wl_adapter_attach,
 
399
        .remove     = wl_adapter_detach,
 
400
        .id_table   = wl_adapter_ids,
 
401
        .suspend    = wl_adapter_suspend,
 
402
        .resume     = wl_adapter_resume,
 
403
};
 
404
 
 
405
 
 
406
 
 
407
/*******************************************************************************
 
408
 *      wl_adapter_init_module()
 
409
 *******************************************************************************
 
410
 *
 
411
 *  DESCRIPTION:
 
412
 *
 
413
 *      Called by init_module() to perform PCMCIA driver initialization.
 
414
 *
 
415
 *  PARAMETERS:
 
416
 *
 
417
 *      N/A
 
418
 *
 
419
 *  RETURNS:
 
420
 *
 
421
 *      0 on success
 
422
 *      -1 on error
 
423
 *
 
424
 ******************************************************************************/
 
425
int wl_adapter_init_module(void)
 
426
{
 
427
        int ret;
 
428
        /*--------------------------------------------------------------------*/
 
429
 
 
430
        DBG_FUNC("wl_adapter_init_module");
 
431
        DBG_ENTER(DbgInfo);
 
432
        DBG_TRACE(DbgInfo, "wl_adapter_init_module() -- PCMCIA\n");
 
433
 
 
434
        ret = pcmcia_register_driver(&wlags49_driver);
 
435
 
 
436
        DBG_LEAVE(DbgInfo);
 
437
        return ret;
 
438
} /* wl_adapter_init_module */
 
439
/*============================================================================*/
 
440
 
 
441
 
 
442
/*******************************************************************************
 
443
 *      wl_adapter_cleanup_module()
 
444
 *******************************************************************************
 
445
 *
 
446
 *  DESCRIPTION:
 
447
 *
 
448
 *      Called by cleanup_module() to perform driver uninitialization.
 
449
 *
 
450
 *  PARAMETERS:
 
451
 *
 
452
 *      N/A
 
453
 *
 
454
 *  RETURNS:
 
455
 *
 
456
 *      N/A
 
457
 *
 
458
 ******************************************************************************/
 
459
void wl_adapter_cleanup_module(void)
 
460
{
 
461
        DBG_FUNC("wl_adapter_cleanup_module");
 
462
        DBG_ENTER(DbgInfo);
 
463
        DBG_TRACE(DbgInfo, "wl_adapter_cleanup_module() -- PCMCIA\n");
 
464
 
 
465
 
 
466
        pcmcia_unregister_driver(&wlags49_driver);
 
467
 
 
468
        DBG_LEAVE(DbgInfo);
 
469
        return;
 
470
} /* wl_adapter_cleanup_module */
 
471
/*============================================================================*/
 
472
 
 
473
 
 
474
/*******************************************************************************
 
475
 *      wl_adapter_is_open()
 
476
 *******************************************************************************
 
477
 *
 
478
 *  DESCRIPTION:
 
479
 *
 
480
 *      Check with Card Services to determine if this device is open.
 
481
 *
 
482
 *  PARAMETERS:
 
483
 *
 
484
 *      dev - a pointer to the net_device structure whose open status will be
 
485
 *            checked
 
486
 *
 
487
 *  RETURNS:
 
488
 *
 
489
 *      nonzero if device is open
 
490
 *      0 otherwise
 
491
 *
 
492
 ******************************************************************************/
 
493
int wl_adapter_is_open(struct net_device *dev)
 
494
{
 
495
        struct wl_private *lp = wl_priv(dev);
 
496
        struct pcmcia_device *link = lp->link;
 
497
 
 
498
        if (!pcmcia_dev_present(link))
 
499
                return 0;
 
500
 
 
501
        return link->open;
 
502
} /* wl_adapter_is_open */
 
503
/*============================================================================*/
 
504
 
 
505
 
 
506
#if DBG
 
507
 
 
508
/*******************************************************************************
 
509
 *      DbgEvent()
 
510
 *******************************************************************************
 
511
 *
 
512
 *  DESCRIPTION:
 
513
 *
 
514
 *      Converts the card serivces events to text for debugging.
 
515
 *
 
516
 *  PARAMETERS:
 
517
 *
 
518
 *      mask    - a integer representing the error(s) being reported by Card
 
519
 *                Services.
 
520
 *
 
521
 *  RETURNS:
 
522
 *
 
523
 *      a pointer to a string describing the error(s)
 
524
 *
 
525
 ******************************************************************************/
 
526
const char *DbgEvent(int mask)
 
527
{
 
528
        static char DbgBuffer[256];
 
529
        char *pBuf;
 
530
        /*--------------------------------------------------------------------*/
 
531
 
 
532
        pBuf    = DbgBuffer;
 
533
        *pBuf   = '\0';
 
534
 
 
535
 
 
536
        if (mask & CS_EVENT_WRITE_PROTECT)
 
537
                strcat(pBuf, "WRITE_PROTECT ");
 
538
 
 
539
        if (mask & CS_EVENT_CARD_LOCK)
 
540
                strcat(pBuf, "CARD_LOCK ");
 
541
 
 
542
        if (mask & CS_EVENT_CARD_INSERTION)
 
543
                strcat(pBuf, "CARD_INSERTION ");
 
544
 
 
545
        if (mask & CS_EVENT_CARD_REMOVAL)
 
546
                strcat(pBuf, "CARD_REMOVAL ");
 
547
 
 
548
        if (mask & CS_EVENT_BATTERY_DEAD)
 
549
                strcat(pBuf, "BATTERY_DEAD ");
 
550
 
 
551
        if (mask & CS_EVENT_BATTERY_LOW)
 
552
                strcat(pBuf, "BATTERY_LOW ");
 
553
 
 
554
        if (mask & CS_EVENT_READY_CHANGE)
 
555
                strcat(pBuf, "READY_CHANGE ");
 
556
 
 
557
        if (mask & CS_EVENT_CARD_DETECT)
 
558
                strcat(pBuf, "CARD_DETECT ");
 
559
 
 
560
        if (mask & CS_EVENT_RESET_REQUEST)
 
561
                strcat(pBuf, "RESET_REQUEST ");
 
562
 
 
563
        if (mask & CS_EVENT_RESET_PHYSICAL)
 
564
                strcat(pBuf, "RESET_PHYSICAL ");
 
565
 
 
566
        if (mask & CS_EVENT_CARD_RESET)
 
567
                strcat(pBuf, "CARD_RESET ");
 
568
 
 
569
        if (mask & CS_EVENT_REGISTRATION_COMPLETE)
 
570
                strcat(pBuf, "REGISTRATION_COMPLETE ");
 
571
 
 
572
        /* if (mask & CS_EVENT_RESET_COMPLETE)
 
573
                strcat(pBuf, "RESET_COMPLETE "); */
 
574
 
 
575
        if (mask & CS_EVENT_PM_SUSPEND)
 
576
                strcat(pBuf, "PM_SUSPEND ");
 
577
 
 
578
        if (mask & CS_EVENT_PM_RESUME)
 
579
                strcat(pBuf, "PM_RESUME ");
 
580
 
 
581
        if (mask & CS_EVENT_INSERTION_REQUEST)
 
582
                strcat(pBuf, "INSERTION_REQUEST ");
 
583
 
 
584
        if (mask & CS_EVENT_EJECTION_REQUEST)
 
585
                strcat(pBuf, "EJECTION_REQUEST ");
 
586
 
 
587
        if (mask & CS_EVENT_MTD_REQUEST)
 
588
                strcat(pBuf, "MTD_REQUEST ");
 
589
 
 
590
        if (mask & CS_EVENT_ERASE_COMPLETE)
 
591
                strcat(pBuf, "ERASE_COMPLETE ");
 
592
 
 
593
        if (mask & CS_EVENT_REQUEST_ATTENTION)
 
594
                strcat(pBuf, "REQUEST_ATTENTION ");
 
595
 
 
596
        if (mask & CS_EVENT_CB_DETECT)
 
597
                strcat(pBuf, "CB_DETECT ");
 
598
 
 
599
        if (mask & CS_EVENT_3VCARD)
 
600
                strcat(pBuf, "3VCARD ");
 
601
 
 
602
        if (mask & CS_EVENT_XVCARD)
 
603
                strcat(pBuf, "XVCARD ");
 
604
 
 
605
 
 
606
        if (*pBuf) {
 
607
                pBuf[strlen(pBuf) - 1] = '\0';
 
608
        } else {
 
609
                if (mask != 0x0)
 
610
                        sprintf(pBuf, "<<0x%08x>>", mask);
 
611
        }
 
612
 
 
613
        return pBuf;
 
614
} /* DbgEvent */
 
615
/*============================================================================*/
 
616
 
 
617
#endif  /* DBG */