xref: /linux/drivers/bluetooth/bt3c_cs.c (revision 87c2ce3b9305b9b723faeedf6e32ef703ec9b33a)
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/config.h>
25 #include <linux/module.h>
26 
27 #include <linux/kernel.h>
28 #include <linux/init.h>
29 #include <linux/slab.h>
30 #include <linux/types.h>
31 #include <linux/sched.h>
32 #include <linux/delay.h>
33 #include <linux/errno.h>
34 #include <linux/ptrace.h>
35 #include <linux/ioport.h>
36 #include <linux/spinlock.h>
37 #include <linux/moduleparam.h>
38 
39 #include <linux/skbuff.h>
40 #include <linux/string.h>
41 #include <linux/serial.h>
42 #include <linux/serial_reg.h>
43 #include <linux/bitops.h>
44 #include <asm/system.h>
45 #include <asm/io.h>
46 
47 #include <linux/device.h>
48 #include <linux/firmware.h>
49 
50 #include <pcmcia/cs_types.h>
51 #include <pcmcia/cs.h>
52 #include <pcmcia/cistpl.h>
53 #include <pcmcia/ciscode.h>
54 #include <pcmcia/ds.h>
55 #include <pcmcia/cisreg.h>
56 
57 #include <net/bluetooth/bluetooth.h>
58 #include <net/bluetooth/hci_core.h>
59 
60 
61 
62 /* ======================== Module parameters ======================== */
63 
64 
65 MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>, Jose Orlando Pereira <jop@di.uminho.pt>");
66 MODULE_DESCRIPTION("Bluetooth driver for the 3Com Bluetooth PCMCIA card");
67 MODULE_LICENSE("GPL");
68 
69 
70 
71 /* ======================== Local structures ======================== */
72 
73 
74 typedef struct bt3c_info_t {
75 	dev_link_t link;
76 	dev_node_t node;
77 
78 	struct hci_dev *hdev;
79 
80 	spinlock_t lock;		/* For serializing operations */
81 
82 	struct sk_buff_head txq;
83 	unsigned long tx_state;
84 
85 	unsigned long rx_state;
86 	unsigned long rx_count;
87 	struct sk_buff *rx_skb;
88 } bt3c_info_t;
89 
90 
91 static void bt3c_config(dev_link_t *link);
92 static void bt3c_release(dev_link_t *link);
93 
94 static void bt3c_detach(struct pcmcia_device *p_dev);
95 
96 
97 /* Transmit states  */
98 #define XMIT_SENDING  1
99 #define XMIT_WAKEUP   2
100 #define XMIT_WAITING  8
101 
102 /* Receiver states */
103 #define RECV_WAIT_PACKET_TYPE   0
104 #define RECV_WAIT_EVENT_HEADER  1
105 #define RECV_WAIT_ACL_HEADER    2
106 #define RECV_WAIT_SCO_HEADER    3
107 #define RECV_WAIT_DATA          4
108 
109 
110 
111 /* ======================== Special I/O functions ======================== */
112 
113 
114 #define DATA_L   0
115 #define DATA_H   1
116 #define ADDR_L   2
117 #define ADDR_H   3
118 #define CONTROL  4
119 
120 
121 static inline void bt3c_address(unsigned int iobase, unsigned short addr)
122 {
123 	outb(addr & 0xff, iobase + ADDR_L);
124 	outb((addr >> 8) & 0xff, iobase + ADDR_H);
125 }
126 
127 
128 static inline void bt3c_put(unsigned int iobase, unsigned short value)
129 {
130 	outb(value & 0xff, iobase + DATA_L);
131 	outb((value >> 8) & 0xff, iobase + DATA_H);
132 }
133 
134 
135 static inline void bt3c_io_write(unsigned int iobase, unsigned short addr, unsigned short value)
136 {
137 	bt3c_address(iobase, addr);
138 	bt3c_put(iobase, value);
139 }
140 
141 
142 static inline unsigned short bt3c_get(unsigned int iobase)
143 {
144 	unsigned short value = inb(iobase + DATA_L);
145 
146 	value |= inb(iobase + DATA_H) << 8;
147 
148 	return value;
149 }
150 
151 
152 static inline unsigned short bt3c_read(unsigned int iobase, unsigned short addr)
153 {
154 	bt3c_address(iobase, addr);
155 
156 	return bt3c_get(iobase);
157 }
158 
159 
160 
161 /* ======================== Interrupt handling ======================== */
162 
163 
164 static int bt3c_write(unsigned int iobase, int fifo_size, __u8 *buf, int len)
165 {
166 	int actual = 0;
167 
168 	bt3c_address(iobase, 0x7080);
169 
170 	/* Fill FIFO with current frame */
171 	while (actual < len) {
172 		/* Transmit next byte */
173 		bt3c_put(iobase, buf[actual]);
174 		actual++;
175 	}
176 
177 	bt3c_io_write(iobase, 0x7005, actual);
178 
179 	return actual;
180 }
181 
182 
183 static void bt3c_write_wakeup(bt3c_info_t *info)
184 {
185 	if (!info) {
186 		BT_ERR("Unknown device");
187 		return;
188 	}
189 
190 	if (test_and_set_bit(XMIT_SENDING, &(info->tx_state)))
191 		return;
192 
193 	do {
194 		register unsigned int iobase = info->link.io.BasePort1;
195 		register struct sk_buff *skb;
196 		register int len;
197 
198 		if (!(info->link.state & DEV_PRESENT))
199 			break;
200 
201 
202 		if (!(skb = skb_dequeue(&(info->txq)))) {
203 			clear_bit(XMIT_SENDING, &(info->tx_state));
204 			break;
205 		}
206 
207 		/* Send frame */
208 		len = bt3c_write(iobase, 256, skb->data, skb->len);
209 
210 		if (len != skb->len) {
211 			BT_ERR("Very strange");
212 		}
213 
214 		kfree_skb(skb);
215 
216 		info->hdev->stat.byte_tx += len;
217 
218 	} while (0);
219 }
220 
221 
222 static void bt3c_receive(bt3c_info_t *info)
223 {
224 	unsigned int iobase;
225 	int size = 0, avail;
226 
227 	if (!info) {
228 		BT_ERR("Unknown device");
229 		return;
230 	}
231 
232 	iobase = info->link.io.BasePort1;
233 
234 	avail = bt3c_read(iobase, 0x7006);
235 	//printk("bt3c_cs: receiving %d bytes\n", avail);
236 
237 	bt3c_address(iobase, 0x7480);
238 	while (size < avail) {
239 		size++;
240 		info->hdev->stat.byte_rx++;
241 
242 		/* Allocate packet */
243 		if (info->rx_skb == NULL) {
244 			info->rx_state = RECV_WAIT_PACKET_TYPE;
245 			info->rx_count = 0;
246 			if (!(info->rx_skb = bt_skb_alloc(HCI_MAX_FRAME_SIZE, GFP_ATOMIC))) {
247 				BT_ERR("Can't allocate mem for new packet");
248 				return;
249 			}
250 		}
251 
252 
253 		if (info->rx_state == RECV_WAIT_PACKET_TYPE) {
254 
255 			info->rx_skb->dev = (void *) info->hdev;
256 			bt_cb(info->rx_skb)->pkt_type = inb(iobase + DATA_L);
257 			inb(iobase + DATA_H);
258 			//printk("bt3c: PACKET_TYPE=%02x\n", bt_cb(info->rx_skb)->pkt_type);
259 
260 			switch (bt_cb(info->rx_skb)->pkt_type) {
261 
262 			case HCI_EVENT_PKT:
263 				info->rx_state = RECV_WAIT_EVENT_HEADER;
264 				info->rx_count = HCI_EVENT_HDR_SIZE;
265 				break;
266 
267 			case HCI_ACLDATA_PKT:
268 				info->rx_state = RECV_WAIT_ACL_HEADER;
269 				info->rx_count = HCI_ACL_HDR_SIZE;
270 				break;
271 
272 			case HCI_SCODATA_PKT:
273 				info->rx_state = RECV_WAIT_SCO_HEADER;
274 				info->rx_count = HCI_SCO_HDR_SIZE;
275 				break;
276 
277 			default:
278 				/* Unknown packet */
279 				BT_ERR("Unknown HCI packet with type 0x%02x received", bt_cb(info->rx_skb)->pkt_type);
280 				info->hdev->stat.err_rx++;
281 				clear_bit(HCI_RUNNING, &(info->hdev->flags));
282 
283 				kfree_skb(info->rx_skb);
284 				info->rx_skb = NULL;
285 				break;
286 
287 			}
288 
289 		} else {
290 
291 			__u8 x = inb(iobase + DATA_L);
292 
293 			*skb_put(info->rx_skb, 1) = x;
294 			inb(iobase + DATA_H);
295 			info->rx_count--;
296 
297 			if (info->rx_count == 0) {
298 
299 				int dlen;
300 				struct hci_event_hdr *eh;
301 				struct hci_acl_hdr *ah;
302 				struct hci_sco_hdr *sh;
303 
304 				switch (info->rx_state) {
305 
306 				case RECV_WAIT_EVENT_HEADER:
307 					eh = (struct hci_event_hdr *)(info->rx_skb->data);
308 					info->rx_state = RECV_WAIT_DATA;
309 					info->rx_count = eh->plen;
310 					break;
311 
312 				case RECV_WAIT_ACL_HEADER:
313 					ah = (struct hci_acl_hdr *)(info->rx_skb->data);
314 					dlen = __le16_to_cpu(ah->dlen);
315 					info->rx_state = RECV_WAIT_DATA;
316 					info->rx_count = dlen;
317 					break;
318 
319 				case RECV_WAIT_SCO_HEADER:
320 					sh = (struct hci_sco_hdr *)(info->rx_skb->data);
321 					info->rx_state = RECV_WAIT_DATA;
322 					info->rx_count = sh->dlen;
323 					break;
324 
325 				case RECV_WAIT_DATA:
326 					hci_recv_frame(info->rx_skb);
327 					info->rx_skb = NULL;
328 					break;
329 
330 				}
331 
332 			}
333 
334 		}
335 
336 	}
337 
338 	bt3c_io_write(iobase, 0x7006, 0x0000);
339 }
340 
341 
342 static irqreturn_t bt3c_interrupt(int irq, void *dev_inst, struct pt_regs *regs)
343 {
344 	bt3c_info_t *info = dev_inst;
345 	unsigned int iobase;
346 	int iir;
347 
348 	if (!info || !info->hdev) {
349 		BT_ERR("Call of irq %d for unknown device", irq);
350 		return IRQ_NONE;
351 	}
352 
353 	iobase = info->link.io.BasePort1;
354 
355 	spin_lock(&(info->lock));
356 
357 	iir = inb(iobase + CONTROL);
358 	if (iir & 0x80) {
359 		int stat = bt3c_read(iobase, 0x7001);
360 
361 		if ((stat & 0xff) == 0x7f) {
362 			BT_ERR("Very strange (stat=0x%04x)", stat);
363 		} else if ((stat & 0xff) != 0xff) {
364 			if (stat & 0x0020) {
365 				int stat = bt3c_read(iobase, 0x7002) & 0x10;
366 				BT_INFO("%s: Antenna %s", info->hdev->name,
367 							stat ? "out" : "in");
368 			}
369 			if (stat & 0x0001)
370 				bt3c_receive(info);
371 			if (stat & 0x0002) {
372 				//BT_ERR("Ack (stat=0x%04x)", stat);
373 				clear_bit(XMIT_SENDING, &(info->tx_state));
374 				bt3c_write_wakeup(info);
375 			}
376 
377 			bt3c_io_write(iobase, 0x7001, 0x0000);
378 
379 			outb(iir, iobase + CONTROL);
380 		}
381 	}
382 
383 	spin_unlock(&(info->lock));
384 
385 	return IRQ_HANDLED;
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 struct device *bt3c_device(void)
478 {
479 	static struct device dev = {
480 		.bus_id = "pcmcia",
481 	};
482 	kobject_set_name(&dev.kobj, "bt3c");
483 	kobject_init(&dev.kobj);
484 
485 	return &dev;
486 }
487 
488 
489 static int bt3c_load_firmware(bt3c_info_t *info, unsigned char *firmware, int count)
490 {
491 	char *ptr = (char *) firmware;
492 	char b[9];
493 	unsigned int iobase, size, addr, fcs, tmp;
494 	int i, err = 0;
495 
496 	iobase = info->link.io.BasePort1;
497 
498 	/* Reset */
499 	bt3c_io_write(iobase, 0x8040, 0x0404);
500 	bt3c_io_write(iobase, 0x8040, 0x0400);
501 
502 	udelay(1);
503 
504 	bt3c_io_write(iobase, 0x8040, 0x0404);
505 
506 	udelay(17);
507 
508 	/* Load */
509 	while (count) {
510 		if (ptr[0] != 'S') {
511 			BT_ERR("Bad address in firmware");
512 			err = -EFAULT;
513 			goto error;
514 		}
515 
516 		memset(b, 0, sizeof(b));
517 		memcpy(b, ptr + 2, 2);
518 		size = simple_strtol(b, NULL, 16);
519 
520 		memset(b, 0, sizeof(b));
521 		memcpy(b, ptr + 4, 8);
522 		addr = simple_strtol(b, NULL, 16);
523 
524 		memset(b, 0, sizeof(b));
525 		memcpy(b, ptr + (size * 2) + 2, 2);
526 		fcs = simple_strtol(b, NULL, 16);
527 
528 		memset(b, 0, sizeof(b));
529 		for (tmp = 0, i = 0; i < size; i++) {
530 			memcpy(b, ptr + (i * 2) + 2, 2);
531 			tmp += simple_strtol(b, NULL, 16);
532 		}
533 
534 		if (((tmp + fcs) & 0xff) != 0xff) {
535 			BT_ERR("Checksum error in firmware");
536 			err = -EILSEQ;
537 			goto error;
538 		}
539 
540 		if (ptr[1] == '3') {
541 			bt3c_address(iobase, addr);
542 
543 			memset(b, 0, sizeof(b));
544 			for (i = 0; i < (size - 4) / 2; i++) {
545 				memcpy(b, ptr + (i * 4) + 12, 4);
546 				tmp = simple_strtol(b, NULL, 16);
547 				bt3c_put(iobase, tmp);
548 			}
549 		}
550 
551 		ptr   += (size * 2) + 6;
552 		count -= (size * 2) + 6;
553 	}
554 
555 	udelay(17);
556 
557 	/* Boot */
558 	bt3c_address(iobase, 0x3000);
559 	outb(inb(iobase + CONTROL) | 0x40, iobase + CONTROL);
560 
561 error:
562 	udelay(17);
563 
564 	/* Clear */
565 	bt3c_io_write(iobase, 0x7006, 0x0000);
566 	bt3c_io_write(iobase, 0x7005, 0x0000);
567 	bt3c_io_write(iobase, 0x7001, 0x0000);
568 
569 	return err;
570 }
571 
572 
573 static int bt3c_open(bt3c_info_t *info)
574 {
575 	const struct firmware *firmware;
576 	struct hci_dev *hdev;
577 	int err;
578 
579 	spin_lock_init(&(info->lock));
580 
581 	skb_queue_head_init(&(info->txq));
582 
583 	info->rx_state = RECV_WAIT_PACKET_TYPE;
584 	info->rx_count = 0;
585 	info->rx_skb = NULL;
586 
587 	/* Initialize HCI device */
588 	hdev = hci_alloc_dev();
589 	if (!hdev) {
590 		BT_ERR("Can't allocate HCI device");
591 		return -ENOMEM;
592 	}
593 
594 	info->hdev = hdev;
595 
596 	hdev->type = HCI_PCCARD;
597 	hdev->driver_data = info;
598 
599 	hdev->open     = bt3c_hci_open;
600 	hdev->close    = bt3c_hci_close;
601 	hdev->flush    = bt3c_hci_flush;
602 	hdev->send     = bt3c_hci_send_frame;
603 	hdev->destruct = bt3c_hci_destruct;
604 	hdev->ioctl    = bt3c_hci_ioctl;
605 
606 	hdev->owner = THIS_MODULE;
607 
608 	/* Load firmware */
609 	err = request_firmware(&firmware, "BT3CPCC.bin", bt3c_device());
610 	if (err < 0) {
611 		BT_ERR("Firmware request failed");
612 		goto error;
613 	}
614 
615 	err = bt3c_load_firmware(info, firmware->data, firmware->size);
616 
617 	release_firmware(firmware);
618 
619 	if (err < 0) {
620 		BT_ERR("Firmware loading failed");
621 		goto error;
622 	}
623 
624 	/* Timeout before it is safe to send the first HCI packet */
625 	msleep(1000);
626 
627 	/* Register HCI device */
628 	err = hci_register_dev(hdev);
629 	if (err < 0) {
630 		BT_ERR("Can't register HCI device");
631 		goto error;
632 	}
633 
634 	return 0;
635 
636 error:
637 	info->hdev = NULL;
638 	hci_free_dev(hdev);
639 	return err;
640 }
641 
642 
643 static int bt3c_close(bt3c_info_t *info)
644 {
645 	struct hci_dev *hdev = info->hdev;
646 
647 	if (!hdev)
648 		return -ENODEV;
649 
650 	bt3c_hci_close(hdev);
651 
652 	if (hci_unregister_dev(hdev) < 0)
653 		BT_ERR("Can't unregister HCI device %s", hdev->name);
654 
655 	hci_free_dev(hdev);
656 
657 	return 0;
658 }
659 
660 static int bt3c_attach(struct pcmcia_device *p_dev)
661 {
662 	bt3c_info_t *info;
663 	dev_link_t *link;
664 
665 	/* Create new info device */
666 	info = kzalloc(sizeof(*info), GFP_KERNEL);
667 	if (!info)
668 		return -ENOMEM;
669 
670 	link = &info->link;
671 	link->priv = info;
672 
673 	link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
674 	link->io.NumPorts1 = 8;
675 	link->irq.Attributes = IRQ_TYPE_EXCLUSIVE | IRQ_HANDLE_PRESENT;
676 	link->irq.IRQInfo1 = IRQ_LEVEL_ID;
677 
678 	link->irq.Handler = bt3c_interrupt;
679 	link->irq.Instance = info;
680 
681 	link->conf.Attributes = CONF_ENABLE_IRQ;
682 	link->conf.Vcc = 50;
683 	link->conf.IntType = INT_MEMORY_AND_IO;
684 
685 	link->handle = p_dev;
686 	p_dev->instance = link;
687 
688 	link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
689 	bt3c_config(link);
690 
691 	return 0;
692 }
693 
694 
695 static void bt3c_detach(struct pcmcia_device *p_dev)
696 {
697 	dev_link_t *link = dev_to_instance(p_dev);
698 	bt3c_info_t *info = link->priv;
699 
700 	if (link->state & DEV_CONFIG)
701 		bt3c_release(link);
702 
703 	kfree(info);
704 }
705 
706 static int get_tuple(client_handle_t handle, tuple_t *tuple, cisparse_t *parse)
707 {
708 	int i;
709 
710 	i = pcmcia_get_tuple_data(handle, tuple);
711 	if (i != CS_SUCCESS)
712 		return i;
713 
714 	return pcmcia_parse_tuple(handle, tuple, parse);
715 }
716 
717 static int first_tuple(client_handle_t handle, tuple_t *tuple, cisparse_t *parse)
718 {
719 	if (pcmcia_get_first_tuple(handle, tuple) != CS_SUCCESS)
720 		return CS_NO_MORE_ITEMS;
721 	return get_tuple(handle, tuple, parse);
722 }
723 
724 static int next_tuple(client_handle_t handle, tuple_t *tuple, cisparse_t *parse)
725 {
726 	if (pcmcia_get_next_tuple(handle, tuple) != CS_SUCCESS)
727 		return CS_NO_MORE_ITEMS;
728 	return get_tuple(handle, tuple, parse);
729 }
730 
731 static void bt3c_config(dev_link_t *link)
732 {
733 	static kio_addr_t base[5] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8, 0x0 };
734 	client_handle_t handle = link->handle;
735 	bt3c_info_t *info = link->priv;
736 	tuple_t tuple;
737 	u_short buf[256];
738 	cisparse_t parse;
739 	cistpl_cftable_entry_t *cf = &parse.cftable_entry;
740 	config_info_t config;
741 	int i, j, try, last_ret, last_fn;
742 
743 	tuple.TupleData = (cisdata_t *)buf;
744 	tuple.TupleOffset = 0;
745 	tuple.TupleDataMax = 255;
746 	tuple.Attributes = 0;
747 
748 	/* Get configuration register information */
749 	tuple.DesiredTuple = CISTPL_CONFIG;
750 	last_ret = first_tuple(handle, &tuple, &parse);
751 	if (last_ret != CS_SUCCESS) {
752 		last_fn = ParseTuple;
753 		goto cs_failed;
754 	}
755 	link->conf.ConfigBase = parse.config.base;
756 	link->conf.Present = parse.config.rmask[0];
757 
758 	/* Configure card */
759 	link->state |= DEV_CONFIG;
760 	i = pcmcia_get_configuration_info(handle, &config);
761 	link->conf.Vcc = config.Vcc;
762 
763 	/* First pass: look for a config entry that looks normal. */
764 	tuple.TupleData = (cisdata_t *)buf;
765 	tuple.TupleOffset = 0;
766 	tuple.TupleDataMax = 255;
767 	tuple.Attributes = 0;
768 	tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
769 	/* Two tries: without IO aliases, then with aliases */
770 	for (try = 0; try < 2; try++) {
771 		i = first_tuple(handle, &tuple, &parse);
772 		while (i != CS_NO_MORE_ITEMS) {
773 			if (i != CS_SUCCESS)
774 				goto next_entry;
775 			if (cf->vpp1.present & (1 << CISTPL_POWER_VNOM))
776 				link->conf.Vpp1 = link->conf.Vpp2 = cf->vpp1.param[CISTPL_POWER_VNOM] / 10000;
777 			if ((cf->io.nwin > 0) && (cf->io.win[0].len == 8) && (cf->io.win[0].base != 0)) {
778 				link->conf.ConfigIndex = cf->index;
779 				link->io.BasePort1 = cf->io.win[0].base;
780 				link->io.IOAddrLines = (try == 0) ? 16 : cf->io.flags & CISTPL_IO_LINES_MASK;
781 				i = pcmcia_request_io(link->handle, &link->io);
782 				if (i == CS_SUCCESS)
783 					goto found_port;
784 			}
785 next_entry:
786 			i = next_tuple(handle, &tuple, &parse);
787 		}
788 	}
789 
790 	/* Second pass: try to find an entry that isn't picky about
791 	   its base address, then try to grab any standard serial port
792 	   address, and finally try to get any free port. */
793 	i = first_tuple(handle, &tuple, &parse);
794 	while (i != CS_NO_MORE_ITEMS) {
795 		if ((i == CS_SUCCESS) && (cf->io.nwin > 0) && ((cf->io.flags & CISTPL_IO_LINES_MASK) <= 3)) {
796 			link->conf.ConfigIndex = cf->index;
797 			for (j = 0; j < 5; j++) {
798 				link->io.BasePort1 = base[j];
799 				link->io.IOAddrLines = base[j] ? 16 : 3;
800 				i = pcmcia_request_io(link->handle, &link->io);
801 				if (i == CS_SUCCESS)
802 					goto found_port;
803 			}
804 		}
805 		i = next_tuple(handle, &tuple, &parse);
806 	}
807 
808 found_port:
809 	if (i != CS_SUCCESS) {
810 		BT_ERR("No usable port range found");
811 		cs_error(link->handle, RequestIO, i);
812 		goto failed;
813 	}
814 
815 	i = pcmcia_request_irq(link->handle, &link->irq);
816 	if (i != CS_SUCCESS) {
817 		cs_error(link->handle, RequestIRQ, i);
818 		link->irq.AssignedIRQ = 0;
819 	}
820 
821 	i = pcmcia_request_configuration(link->handle, &link->conf);
822 	if (i != CS_SUCCESS) {
823 		cs_error(link->handle, RequestConfiguration, i);
824 		goto failed;
825 	}
826 
827 	if (bt3c_open(info) != 0)
828 		goto failed;
829 
830 	strcpy(info->node.dev_name, info->hdev->name);
831 	link->dev = &info->node;
832 	link->state &= ~DEV_CONFIG_PENDING;
833 
834 	return;
835 
836 cs_failed:
837 	cs_error(link->handle, last_fn, last_ret);
838 
839 failed:
840 	bt3c_release(link);
841 }
842 
843 
844 static void bt3c_release(dev_link_t *link)
845 {
846 	bt3c_info_t *info = link->priv;
847 
848 	if (link->state & DEV_PRESENT)
849 		bt3c_close(info);
850 
851 	link->dev = NULL;
852 
853 	pcmcia_release_configuration(link->handle);
854 	pcmcia_release_io(link->handle, &link->io);
855 	pcmcia_release_irq(link->handle, &link->irq);
856 
857 	link->state &= ~DEV_CONFIG;
858 }
859 
860 static int bt3c_suspend(struct pcmcia_device *dev)
861 {
862 	dev_link_t *link = dev_to_instance(dev);
863 
864 	link->state |= DEV_SUSPEND;
865 	if (link->state & DEV_CONFIG)
866 		pcmcia_release_configuration(link->handle);
867 
868 	return 0;
869 }
870 
871 static int bt3c_resume(struct pcmcia_device *dev)
872 {
873 	dev_link_t *link = dev_to_instance(dev);
874 
875 	link->state &= ~DEV_SUSPEND;
876 	if (DEV_OK(link))
877 		pcmcia_request_configuration(link->handle, &link->conf);
878 
879 	return 0;
880 }
881 
882 
883 static struct pcmcia_device_id bt3c_ids[] = {
884 	PCMCIA_DEVICE_PROD_ID13("3COM", "Bluetooth PC Card", 0xefce0a31, 0xd4ce9b02),
885 	PCMCIA_DEVICE_NULL
886 };
887 MODULE_DEVICE_TABLE(pcmcia, bt3c_ids);
888 
889 static struct pcmcia_driver bt3c_driver = {
890 	.owner		= THIS_MODULE,
891 	.drv		= {
892 		.name	= "bt3c_cs",
893 	},
894 	.probe		= bt3c_attach,
895 	.remove		= bt3c_detach,
896 	.id_table	= bt3c_ids,
897 	.suspend	= bt3c_suspend,
898 	.resume		= bt3c_resume,
899 };
900 
901 static int __init init_bt3c_cs(void)
902 {
903 	return pcmcia_register_driver(&bt3c_driver);
904 }
905 
906 
907 static void __exit exit_bt3c_cs(void)
908 {
909 	pcmcia_unregister_driver(&bt3c_driver);
910 }
911 
912 module_init(init_bt3c_cs);
913 module_exit(exit_bt3c_cs);
914