]> nv-tegra.nvidia Code Review - linux-2.6.git/blob - drivers/bluetooth/bt3c_cs.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael...
[linux-2.6.git] / drivers / bluetooth / bt3c_cs.c
1 /*
2  *
3  *  Driver for the 3Com Bluetooth PCMCIA card
4  *
5  *  Copyright (C) 2001-2002  Marcel Holtmann <marcel@holtmann.org>
6  *                           Jose Orlando Pereira <jop@di.uminho.pt>
7  *
8  *
9  *  This program is free software; you can redistribute it and/or modify
10  *  it under the terms of the GNU General Public License version 2 as
11  *  published by the Free Software Foundation;
12  *
13  *  Software distributed under the License is distributed on an "AS
14  *  IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
15  *  implied. See the License for the specific language governing
16  *  rights and limitations under the License.
17  *
18  *  The initial developer of the original code is David A. Hinds
19  *  <dahinds@users.sourceforge.net>.  Portions created by David A. Hinds
20  *  are Copyright (C) 1999 David A. Hinds.  All Rights Reserved.
21  *
22  */
23
24 #include <linux/module.h>
25
26 #include <linux/kernel.h>
27 #include <linux/init.h>
28 #include <linux/slab.h>
29 #include <linux/types.h>
30 #include <linux/delay.h>
31 #include <linux/errno.h>
32 #include <linux/ptrace.h>
33 #include <linux/ioport.h>
34 #include <linux/spinlock.h>
35 #include <linux/moduleparam.h>
36
37 #include <linux/skbuff.h>
38 #include <linux/string.h>
39 #include <linux/serial.h>
40 #include <linux/serial_reg.h>
41 #include <linux/bitops.h>
42 #include <asm/system.h>
43 #include <asm/io.h>
44
45 #include <linux/device.h>
46 #include <linux/firmware.h>
47
48 #include <pcmcia/cs_types.h>
49 #include <pcmcia/cs.h>
50 #include <pcmcia/cistpl.h>
51 #include <pcmcia/ciscode.h>
52 #include <pcmcia/ds.h>
53 #include <pcmcia/cisreg.h>
54
55 #include <net/bluetooth/bluetooth.h>
56 #include <net/bluetooth/hci_core.h>
57
58
59
60 /* ======================== Module parameters ======================== */
61
62
63 MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
64 MODULE_DESCRIPTION("Bluetooth driver for the 3Com Bluetooth PCMCIA card");
65 MODULE_LICENSE("GPL");
66 MODULE_FIRMWARE("BT3CPCC.bin");
67
68
69
70 /* ======================== Local structures ======================== */
71
72
73 typedef struct bt3c_info_t {
74         struct pcmcia_device *p_dev;
75         dev_node_t node;
76
77         struct hci_dev *hdev;
78
79         spinlock_t lock;                /* For serializing operations */
80
81         struct sk_buff_head txq;
82         unsigned long tx_state;
83
84         unsigned long rx_state;
85         unsigned long rx_count;
86         struct sk_buff *rx_skb;
87 } bt3c_info_t;
88
89
90 static int bt3c_config(struct pcmcia_device *link);
91 static void bt3c_release(struct pcmcia_device *link);
92
93 static void bt3c_detach(struct pcmcia_device *p_dev);
94
95
96 /* Transmit states  */
97 #define XMIT_SENDING  1
98 #define XMIT_WAKEUP   2
99 #define XMIT_WAITING  8
100
101 /* Receiver states */
102 #define RECV_WAIT_PACKET_TYPE   0
103 #define RECV_WAIT_EVENT_HEADER  1
104 #define RECV_WAIT_ACL_HEADER    2
105 #define RECV_WAIT_SCO_HEADER    3
106 #define RECV_WAIT_DATA          4
107
108
109
110 /* ======================== Special I/O functions ======================== */
111
112
113 #define DATA_L   0
114 #define DATA_H   1
115 #define ADDR_L   2
116 #define ADDR_H   3
117 #define CONTROL  4
118
119
120 static inline void bt3c_address(unsigned int iobase, unsigned short addr)
121 {
122         outb(addr & 0xff, iobase + ADDR_L);
123         outb((addr >> 8) & 0xff, iobase + ADDR_H);
124 }
125
126
127 static inline void bt3c_put(unsigned int iobase, unsigned short value)
128 {
129         outb(value & 0xff, iobase + DATA_L);
130         outb((value >> 8) & 0xff, iobase + DATA_H);
131 }
132
133
134 static inline void bt3c_io_write(unsigned int iobase, unsigned short addr, unsigned short value)
135 {
136         bt3c_address(iobase, addr);
137         bt3c_put(iobase, value);
138 }
139
140
141 static inline unsigned short bt3c_get(unsigned int iobase)
142 {
143         unsigned short value = inb(iobase + DATA_L);
144
145         value |= inb(iobase + DATA_H) << 8;
146
147         return value;
148 }
149
150
151 static inline unsigned short bt3c_read(unsigned int iobase, unsigned short addr)
152 {
153         bt3c_address(iobase, addr);
154
155         return bt3c_get(iobase);
156 }
157
158
159
160 /* ======================== Interrupt handling ======================== */
161
162
163 static int bt3c_write(unsigned int iobase, int fifo_size, __u8 *buf, int len)
164 {
165         int actual = 0;
166
167         bt3c_address(iobase, 0x7080);
168
169         /* Fill FIFO with current frame */
170         while (actual < len) {
171                 /* Transmit next byte */
172                 bt3c_put(iobase, buf[actual]);
173                 actual++;
174         }
175
176         bt3c_io_write(iobase, 0x7005, actual);
177
178         return actual;
179 }
180
181
182 static void bt3c_write_wakeup(bt3c_info_t *info)
183 {
184         if (!info) {
185                 BT_ERR("Unknown device");
186                 return;
187         }
188
189         if (test_and_set_bit(XMIT_SENDING, &(info->tx_state)))
190                 return;
191
192         do {
193                 register unsigned int iobase = info->p_dev->io.BasePort1;
194                 register struct sk_buff *skb;
195                 register int len;
196
197                 if (!pcmcia_dev_present(info->p_dev))
198                         break;
199
200
201                 if (!(skb = skb_dequeue(&(info->txq)))) {
202                         clear_bit(XMIT_SENDING, &(info->tx_state));
203                         break;
204                 }
205
206                 /* Send frame */
207                 len = bt3c_write(iobase, 256, skb->data, skb->len);
208
209                 if (len != skb->len) {
210                         BT_ERR("Very strange");
211                 }
212
213                 kfree_skb(skb);
214
215                 info->hdev->stat.byte_tx += len;
216
217         } while (0);
218 }
219
220
221 static void bt3c_receive(bt3c_info_t *info)
222 {
223         unsigned int iobase;
224         int size = 0, avail;
225
226         if (!info) {
227                 BT_ERR("Unknown device");
228                 return;
229         }
230
231         iobase = info->p_dev->io.BasePort1;
232
233         avail = bt3c_read(iobase, 0x7006);
234         //printk("bt3c_cs: receiving %d bytes\n", avail);
235
236         bt3c_address(iobase, 0x7480);
237         while (size < avail) {
238                 size++;
239                 info->hdev->stat.byte_rx++;
240
241                 /* Allocate packet */
242                 if (info->rx_skb == NULL) {
243                         info->rx_state = RECV_WAIT_PACKET_TYPE;
244                         info->rx_count = 0;
245                         if (!(info->rx_skb = bt_skb_alloc(HCI_MAX_FRAME_SIZE, GFP_ATOMIC))) {
246                                 BT_ERR("Can't allocate mem for new packet");
247                                 return;
248                         }
249                 }
250
251
252                 if (info->rx_state == RECV_WAIT_PACKET_TYPE) {
253
254                         info->rx_skb->dev = (void *) info->hdev;
255                         bt_cb(info->rx_skb)->pkt_type = inb(iobase + DATA_L);
256                         inb(iobase + DATA_H);
257                         //printk("bt3c: PACKET_TYPE=%02x\n", bt_cb(info->rx_skb)->pkt_type);
258
259                         switch (bt_cb(info->rx_skb)->pkt_type) {
260
261                         case HCI_EVENT_PKT:
262                                 info->rx_state = RECV_WAIT_EVENT_HEADER;
263                                 info->rx_count = HCI_EVENT_HDR_SIZE;
264                                 break;
265
266                         case HCI_ACLDATA_PKT:
267                                 info->rx_state = RECV_WAIT_ACL_HEADER;
268                                 info->rx_count = HCI_ACL_HDR_SIZE;
269                                 break;
270
271                         case HCI_SCODATA_PKT:
272                                 info->rx_state = RECV_WAIT_SCO_HEADER;
273                                 info->rx_count = HCI_SCO_HDR_SIZE;
274                                 break;
275
276                         default:
277                                 /* Unknown packet */
278                                 BT_ERR("Unknown HCI packet with type 0x%02x received", bt_cb(info->rx_skb)->pkt_type);
279                                 info->hdev->stat.err_rx++;
280                                 clear_bit(HCI_RUNNING, &(info->hdev->flags));
281
282                                 kfree_skb(info->rx_skb);
283                                 info->rx_skb = NULL;
284                                 break;
285
286                         }
287
288                 } else {
289
290                         __u8 x = inb(iobase + DATA_L);
291
292                         *skb_put(info->rx_skb, 1) = x;
293                         inb(iobase + DATA_H);
294                         info->rx_count--;
295
296                         if (info->rx_count == 0) {
297
298                                 int dlen;
299                                 struct hci_event_hdr *eh;
300                                 struct hci_acl_hdr *ah;
301                                 struct hci_sco_hdr *sh;
302
303                                 switch (info->rx_state) {
304
305                                 case RECV_WAIT_EVENT_HEADER:
306                                         eh = hci_event_hdr(info->rx_skb);
307                                         info->rx_state = RECV_WAIT_DATA;
308                                         info->rx_count = eh->plen;
309                                         break;
310
311                                 case RECV_WAIT_ACL_HEADER:
312                                         ah = hci_acl_hdr(info->rx_skb);
313                                         dlen = __le16_to_cpu(ah->dlen);
314                                         info->rx_state = RECV_WAIT_DATA;
315                                         info->rx_count = dlen;
316                                         break;
317
318                                 case RECV_WAIT_SCO_HEADER:
319                                         sh = hci_sco_hdr(info->rx_skb);
320                                         info->rx_state = RECV_WAIT_DATA;
321                                         info->rx_count = sh->dlen;
322                                         break;
323
324                                 case RECV_WAIT_DATA:
325                                         hci_recv_frame(info->rx_skb);
326                                         info->rx_skb = NULL;
327                                         break;
328
329                                 }
330
331                         }
332
333                 }
334
335         }
336
337         bt3c_io_write(iobase, 0x7006, 0x0000);
338 }
339
340
341 static irqreturn_t bt3c_interrupt(int irq, void *dev_inst)
342 {
343         bt3c_info_t *info = dev_inst;
344         unsigned int iobase;
345         int iir;
346         irqreturn_t r = IRQ_NONE;
347
348         if (!info || !info->hdev)
349                 /* our irq handler is shared */
350                 return IRQ_NONE;
351
352         iobase = info->p_dev->io.BasePort1;
353
354         spin_lock(&(info->lock));
355
356         iir = inb(iobase + CONTROL);
357         if (iir & 0x80) {
358                 int stat = bt3c_read(iobase, 0x7001);
359
360                 if ((stat & 0xff) == 0x7f) {
361                         BT_ERR("Very strange (stat=0x%04x)", stat);
362                 } else if ((stat & 0xff) != 0xff) {
363                         if (stat & 0x0020) {
364                                 int status = bt3c_read(iobase, 0x7002) & 0x10;
365                                 BT_INFO("%s: Antenna %s", info->hdev->name,
366                                                         status ? "out" : "in");
367                         }
368                         if (stat & 0x0001)
369                                 bt3c_receive(info);
370                         if (stat & 0x0002) {
371                                 //BT_ERR("Ack (stat=0x%04x)", stat);
372                                 clear_bit(XMIT_SENDING, &(info->tx_state));
373                                 bt3c_write_wakeup(info);
374                         }
375
376                         bt3c_io_write(iobase, 0x7001, 0x0000);
377
378                         outb(iir, iobase + CONTROL);
379                 }
380                 r = IRQ_HANDLED;
381         }
382
383         spin_unlock(&(info->lock));
384
385         return r;
386 }
387
388
389
390 /* ======================== HCI interface ======================== */
391
392
393 static int bt3c_hci_flush(struct hci_dev *hdev)
394 {
395         bt3c_info_t *info = (bt3c_info_t *)(hdev->driver_data);
396
397         /* Drop TX queue */
398         skb_queue_purge(&(info->txq));
399
400         return 0;
401 }
402
403
404 static int bt3c_hci_open(struct hci_dev *hdev)
405 {
406         set_bit(HCI_RUNNING, &(hdev->flags));
407
408         return 0;
409 }
410
411
412 static int bt3c_hci_close(struct hci_dev *hdev)
413 {
414         if (!test_and_clear_bit(HCI_RUNNING, &(hdev->flags)))
415                 return 0;
416
417         bt3c_hci_flush(hdev);
418
419         return 0;
420 }
421
422
423 static int bt3c_hci_send_frame(struct sk_buff *skb)
424 {
425         bt3c_info_t *info;
426         struct hci_dev *hdev = (struct hci_dev *)(skb->dev);
427         unsigned long flags;
428
429         if (!hdev) {
430                 BT_ERR("Frame for unknown HCI device (hdev=NULL)");
431                 return -ENODEV;
432         }
433
434         info = (bt3c_info_t *) (hdev->driver_data);
435
436         switch (bt_cb(skb)->pkt_type) {
437         case HCI_COMMAND_PKT:
438                 hdev->stat.cmd_tx++;
439                 break;
440         case HCI_ACLDATA_PKT:
441                 hdev->stat.acl_tx++;
442                 break;
443         case HCI_SCODATA_PKT:
444                 hdev->stat.sco_tx++;
445                 break;
446         };
447
448         /* Prepend skb with frame type */
449         memcpy(skb_push(skb, 1), &bt_cb(skb)->pkt_type, 1);
450         skb_queue_tail(&(info->txq), skb);
451
452         spin_lock_irqsave(&(info->lock), flags);
453
454         bt3c_write_wakeup(info);
455
456         spin_unlock_irqrestore(&(info->lock), flags);
457
458         return 0;
459 }
460
461
462 static void bt3c_hci_destruct(struct hci_dev *hdev)
463 {
464 }
465
466
467 static int bt3c_hci_ioctl(struct hci_dev *hdev, unsigned int cmd, unsigned long arg)
468 {
469         return -ENOIOCTLCMD;
470 }
471
472
473
474 /* ======================== Card services HCI interaction ======================== */
475
476
477 static int bt3c_load_firmware(bt3c_info_t *info, const unsigned char *firmware,
478                               int count)
479 {
480         char *ptr = (char *) firmware;
481         char b[9];
482         unsigned int iobase, size, addr, fcs, tmp;
483         int i, err = 0;
484
485         iobase = info->p_dev->io.BasePort1;
486
487         /* Reset */
488         bt3c_io_write(iobase, 0x8040, 0x0404);
489         bt3c_io_write(iobase, 0x8040, 0x0400);
490
491         udelay(1);
492
493         bt3c_io_write(iobase, 0x8040, 0x0404);
494
495         udelay(17);
496
497         /* Load */
498         while (count) {
499                 if (ptr[0] != 'S') {
500                         BT_ERR("Bad address in firmware");
501                         err = -EFAULT;
502                         goto error;
503                 }
504
505                 memset(b, 0, sizeof(b));
506                 memcpy(b, ptr + 2, 2);
507                 size = simple_strtoul(b, NULL, 16);
508
509                 memset(b, 0, sizeof(b));
510                 memcpy(b, ptr + 4, 8);
511                 addr = simple_strtoul(b, NULL, 16);
512
513                 memset(b, 0, sizeof(b));
514                 memcpy(b, ptr + (size * 2) + 2, 2);
515                 fcs = simple_strtoul(b, NULL, 16);
516
517                 memset(b, 0, sizeof(b));
518                 for (tmp = 0, i = 0; i < size; i++) {
519                         memcpy(b, ptr + (i * 2) + 2, 2);
520                         tmp += simple_strtol(b, NULL, 16);
521                 }
522
523                 if (((tmp + fcs) & 0xff) != 0xff) {
524                         BT_ERR("Checksum error in firmware");
525                         err = -EILSEQ;
526                         goto error;
527                 }
528
529                 if (ptr[1] == '3') {
530                         bt3c_address(iobase, addr);
531
532                         memset(b, 0, sizeof(b));
533                         for (i = 0; i < (size - 4) / 2; i++) {
534                                 memcpy(b, ptr + (i * 4) + 12, 4);
535                                 tmp = simple_strtoul(b, NULL, 16);
536                                 bt3c_put(iobase, tmp);
537                         }
538                 }
539
540                 ptr   += (size * 2) + 6;
541                 count -= (size * 2) + 6;
542         }
543
544         udelay(17);
545
546         /* Boot */
547         bt3c_address(iobase, 0x3000);
548         outb(inb(iobase + CONTROL) | 0x40, iobase + CONTROL);
549
550 error:
551         udelay(17);
552
553         /* Clear */
554         bt3c_io_write(iobase, 0x7006, 0x0000);
555         bt3c_io_write(iobase, 0x7005, 0x0000);
556         bt3c_io_write(iobase, 0x7001, 0x0000);
557
558         return err;
559 }
560
561
562 static int bt3c_open(bt3c_info_t *info)
563 {
564         const struct firmware *firmware;
565         struct hci_dev *hdev;
566         int err;
567
568         spin_lock_init(&(info->lock));
569
570         skb_queue_head_init(&(info->txq));
571
572         info->rx_state = RECV_WAIT_PACKET_TYPE;
573         info->rx_count = 0;
574         info->rx_skb = NULL;
575
576         /* Initialize HCI device */
577         hdev = hci_alloc_dev();
578         if (!hdev) {
579                 BT_ERR("Can't allocate HCI device");
580                 return -ENOMEM;
581         }
582
583         info->hdev = hdev;
584
585         hdev->bus = HCI_PCCARD;
586         hdev->driver_data = info;
587         SET_HCIDEV_DEV(hdev, &info->p_dev->dev);
588
589         hdev->open     = bt3c_hci_open;
590         hdev->close    = bt3c_hci_close;
591         hdev->flush    = bt3c_hci_flush;
592         hdev->send     = bt3c_hci_send_frame;
593         hdev->destruct = bt3c_hci_destruct;
594         hdev->ioctl    = bt3c_hci_ioctl;
595
596         hdev->owner = THIS_MODULE;
597
598         /* Load firmware */
599         err = request_firmware(&firmware, "BT3CPCC.bin", &info->p_dev->dev);
600         if (err < 0) {
601                 BT_ERR("Firmware request failed");
602                 goto error;
603         }
604
605         err = bt3c_load_firmware(info, firmware->data, firmware->size);
606
607         release_firmware(firmware);
608
609         if (err < 0) {
610                 BT_ERR("Firmware loading failed");
611                 goto error;
612         }
613
614         /* Timeout before it is safe to send the first HCI packet */
615         msleep(1000);
616
617         /* Register HCI device */
618         err = hci_register_dev(hdev);
619         if (err < 0) {
620                 BT_ERR("Can't register HCI device");
621                 goto error;
622         }
623
624         return 0;
625
626 error:
627         info->hdev = NULL;
628         hci_free_dev(hdev);
629         return err;
630 }
631
632
633 static int bt3c_close(bt3c_info_t *info)
634 {
635         struct hci_dev *hdev = info->hdev;
636
637         if (!hdev)
638                 return -ENODEV;
639
640         bt3c_hci_close(hdev);
641
642         if (hci_unregister_dev(hdev) < 0)
643                 BT_ERR("Can't unregister HCI device %s", hdev->name);
644
645         hci_free_dev(hdev);
646
647         return 0;
648 }
649
650 static int bt3c_probe(struct pcmcia_device *link)
651 {
652         bt3c_info_t *info;
653
654         /* Create new info device */
655         info = kzalloc(sizeof(*info), GFP_KERNEL);
656         if (!info)
657                 return -ENOMEM;
658
659         info->p_dev = link;
660         link->priv = info;
661
662         link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
663         link->io.NumPorts1 = 8;
664         link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING;
665
666         link->irq.Handler = bt3c_interrupt;
667
668         link->conf.Attributes = CONF_ENABLE_IRQ;
669         link->conf.IntType = INT_MEMORY_AND_IO;
670
671         return bt3c_config(link);
672 }
673
674
675 static void bt3c_detach(struct pcmcia_device *link)
676 {
677         bt3c_info_t *info = link->priv;
678
679         bt3c_release(link);
680         kfree(info);
681 }
682
683 static int bt3c_check_config(struct pcmcia_device *p_dev,
684                              cistpl_cftable_entry_t *cf,
685                              cistpl_cftable_entry_t *dflt,
686                              unsigned int vcc,
687                              void *priv_data)
688 {
689         unsigned long try = (unsigned long) priv_data;
690
691         if (cf->vpp1.present & (1 << CISTPL_POWER_VNOM))
692                 p_dev->conf.Vpp = cf->vpp1.param[CISTPL_POWER_VNOM] / 10000;
693         if ((cf->io.nwin > 0) && (cf->io.win[0].len == 8) &&
694             (cf->io.win[0].base != 0)) {
695                 p_dev->io.BasePort1 = cf->io.win[0].base;
696                 p_dev->io.IOAddrLines = (try == 0) ? 16 :
697                         cf->io.flags & CISTPL_IO_LINES_MASK;
698                 if (!pcmcia_request_io(p_dev, &p_dev->io))
699                         return 0;
700         }
701         return -ENODEV;
702 }
703
704 static int bt3c_check_config_notpicky(struct pcmcia_device *p_dev,
705                                       cistpl_cftable_entry_t *cf,
706                                       cistpl_cftable_entry_t *dflt,
707                                       unsigned int vcc,
708                                       void *priv_data)
709 {
710         static unsigned int base[5] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8, 0x0 };
711         int j;
712
713         if ((cf->io.nwin > 0) && ((cf->io.flags & CISTPL_IO_LINES_MASK) <= 3)) {
714                 for (j = 0; j < 5; j++) {
715                         p_dev->io.BasePort1 = base[j];
716                         p_dev->io.IOAddrLines = base[j] ? 16 : 3;
717                         if (!pcmcia_request_io(p_dev, &p_dev->io))
718                                 return 0;
719                 }
720         }
721         return -ENODEV;
722 }
723
724 static int bt3c_config(struct pcmcia_device *link)
725 {
726         bt3c_info_t *info = link->priv;
727         int i;
728         unsigned long try;
729
730         /* First pass: look for a config entry that looks normal.
731            Two tries: without IO aliases, then with aliases */
732         for (try = 0; try < 2; try++)
733                 if (!pcmcia_loop_config(link, bt3c_check_config, (void *) try))
734                         goto found_port;
735
736         /* Second pass: try to find an entry that isn't picky about
737            its base address, then try to grab any standard serial port
738            address, and finally try to get any free port. */
739         if (!pcmcia_loop_config(link, bt3c_check_config_notpicky, NULL))
740                 goto found_port;
741
742         BT_ERR("No usable port range found");
743         goto failed;
744
745 found_port:
746         i = pcmcia_request_irq(link, &link->irq);
747         if (i != 0)
748                 link->irq.AssignedIRQ = 0;
749
750         i = pcmcia_request_configuration(link, &link->conf);
751         if (i != 0)
752                 goto failed;
753
754         if (bt3c_open(info) != 0)
755                 goto failed;
756
757         strcpy(info->node.dev_name, info->hdev->name);
758         link->dev_node = &info->node;
759
760         return 0;
761
762 failed:
763         bt3c_release(link);
764         return -ENODEV;
765 }
766
767
768 static void bt3c_release(struct pcmcia_device *link)
769 {
770         bt3c_info_t *info = link->priv;
771
772         bt3c_close(info);
773
774         pcmcia_disable_device(link);
775 }
776
777
778 static struct pcmcia_device_id bt3c_ids[] = {
779         PCMCIA_DEVICE_PROD_ID13("3COM", "Bluetooth PC Card", 0xefce0a31, 0xd4ce9b02),
780         PCMCIA_DEVICE_NULL
781 };
782 MODULE_DEVICE_TABLE(pcmcia, bt3c_ids);
783
784 static struct pcmcia_driver bt3c_driver = {
785         .owner          = THIS_MODULE,
786         .drv            = {
787                 .name   = "bt3c_cs",
788         },
789         .probe          = bt3c_probe,
790         .remove         = bt3c_detach,
791         .id_table       = bt3c_ids,
792 };
793
794 static int __init init_bt3c_cs(void)
795 {
796         return pcmcia_register_driver(&bt3c_driver);
797 }
798
799
800 static void __exit exit_bt3c_cs(void)
801 {
802         pcmcia_unregister_driver(&bt3c_driver);
803 }
804
805 module_init(init_bt3c_cs);
806 module_exit(exit_bt3c_cs);