HID: eliminate a double lock in debug code
[linux-2.6/btrfs-unstable.git] / drivers / bluetooth / bt3c_cs.c
blob21e05fdc912196d38f7ce5e73389338f9cd5b672
1 /*
3 * Driver for the 3Com Bluetooth PCMCIA card
5 * Copyright (C) 2001-2002 Marcel Holtmann <marcel@holtmann.org>
6 * Jose Orlando Pereira <jop@di.uminho.pt>
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;
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.
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.
24 #include <linux/module.h>
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>
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>
45 #include <linux/device.h>
46 #include <linux/firmware.h>
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>
55 #include <net/bluetooth/bluetooth.h>
56 #include <net/bluetooth/hci_core.h>
60 /* ======================== Module parameters ======================== */
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");
70 /* ======================== Local structures ======================== */
73 typedef struct bt3c_info_t {
74 struct pcmcia_device *p_dev;
76 struct hci_dev *hdev;
78 spinlock_t lock; /* For serializing operations */
80 struct sk_buff_head txq;
81 unsigned long tx_state;
83 unsigned long rx_state;
84 unsigned long rx_count;
85 struct sk_buff *rx_skb;
86 } bt3c_info_t;
89 static int bt3c_config(struct pcmcia_device *link);
90 static void bt3c_release(struct pcmcia_device *link);
92 static void bt3c_detach(struct pcmcia_device *p_dev);
95 /* Transmit states */
96 #define XMIT_SENDING 1
97 #define XMIT_WAKEUP 2
98 #define XMIT_WAITING 8
100 /* Receiver states */
101 #define RECV_WAIT_PACKET_TYPE 0
102 #define RECV_WAIT_EVENT_HEADER 1
103 #define RECV_WAIT_ACL_HEADER 2
104 #define RECV_WAIT_SCO_HEADER 3
105 #define RECV_WAIT_DATA 4
109 /* ======================== Special I/O functions ======================== */
112 #define DATA_L 0
113 #define DATA_H 1
114 #define ADDR_L 2
115 #define ADDR_H 3
116 #define CONTROL 4
119 static inline void bt3c_address(unsigned int iobase, unsigned short addr)
121 outb(addr & 0xff, iobase + ADDR_L);
122 outb((addr >> 8) & 0xff, iobase + ADDR_H);
126 static inline void bt3c_put(unsigned int iobase, unsigned short value)
128 outb(value & 0xff, iobase + DATA_L);
129 outb((value >> 8) & 0xff, iobase + DATA_H);
133 static inline void bt3c_io_write(unsigned int iobase, unsigned short addr, unsigned short value)
135 bt3c_address(iobase, addr);
136 bt3c_put(iobase, value);
140 static inline unsigned short bt3c_get(unsigned int iobase)
142 unsigned short value = inb(iobase + DATA_L);
144 value |= inb(iobase + DATA_H) << 8;
146 return value;
150 static inline unsigned short bt3c_read(unsigned int iobase, unsigned short addr)
152 bt3c_address(iobase, addr);
154 return bt3c_get(iobase);
159 /* ======================== Interrupt handling ======================== */
162 static int bt3c_write(unsigned int iobase, int fifo_size, __u8 *buf, int len)
164 int actual = 0;
166 bt3c_address(iobase, 0x7080);
168 /* Fill FIFO with current frame */
169 while (actual < len) {
170 /* Transmit next byte */
171 bt3c_put(iobase, buf[actual]);
172 actual++;
175 bt3c_io_write(iobase, 0x7005, actual);
177 return actual;
181 static void bt3c_write_wakeup(bt3c_info_t *info)
183 if (!info) {
184 BT_ERR("Unknown device");
185 return;
188 if (test_and_set_bit(XMIT_SENDING, &(info->tx_state)))
189 return;
191 do {
192 register unsigned int iobase = info->p_dev->io.BasePort1;
193 register struct sk_buff *skb;
194 register int len;
196 if (!pcmcia_dev_present(info->p_dev))
197 break;
200 if (!(skb = skb_dequeue(&(info->txq)))) {
201 clear_bit(XMIT_SENDING, &(info->tx_state));
202 break;
205 /* Send frame */
206 len = bt3c_write(iobase, 256, skb->data, skb->len);
208 if (len != skb->len) {
209 BT_ERR("Very strange");
212 kfree_skb(skb);
214 info->hdev->stat.byte_tx += len;
216 } while (0);
220 static void bt3c_receive(bt3c_info_t *info)
222 unsigned int iobase;
223 int size = 0, avail;
225 if (!info) {
226 BT_ERR("Unknown device");
227 return;
230 iobase = info->p_dev->io.BasePort1;
232 avail = bt3c_read(iobase, 0x7006);
233 //printk("bt3c_cs: receiving %d bytes\n", avail);
235 bt3c_address(iobase, 0x7480);
236 while (size < avail) {
237 size++;
238 info->hdev->stat.byte_rx++;
240 /* Allocate packet */
241 if (info->rx_skb == NULL) {
242 info->rx_state = RECV_WAIT_PACKET_TYPE;
243 info->rx_count = 0;
244 if (!(info->rx_skb = bt_skb_alloc(HCI_MAX_FRAME_SIZE, GFP_ATOMIC))) {
245 BT_ERR("Can't allocate mem for new packet");
246 return;
251 if (info->rx_state == RECV_WAIT_PACKET_TYPE) {
253 info->rx_skb->dev = (void *) info->hdev;
254 bt_cb(info->rx_skb)->pkt_type = inb(iobase + DATA_L);
255 inb(iobase + DATA_H);
256 //printk("bt3c: PACKET_TYPE=%02x\n", bt_cb(info->rx_skb)->pkt_type);
258 switch (bt_cb(info->rx_skb)->pkt_type) {
260 case HCI_EVENT_PKT:
261 info->rx_state = RECV_WAIT_EVENT_HEADER;
262 info->rx_count = HCI_EVENT_HDR_SIZE;
263 break;
265 case HCI_ACLDATA_PKT:
266 info->rx_state = RECV_WAIT_ACL_HEADER;
267 info->rx_count = HCI_ACL_HDR_SIZE;
268 break;
270 case HCI_SCODATA_PKT:
271 info->rx_state = RECV_WAIT_SCO_HEADER;
272 info->rx_count = HCI_SCO_HDR_SIZE;
273 break;
275 default:
276 /* Unknown packet */
277 BT_ERR("Unknown HCI packet with type 0x%02x received", bt_cb(info->rx_skb)->pkt_type);
278 info->hdev->stat.err_rx++;
279 clear_bit(HCI_RUNNING, &(info->hdev->flags));
281 kfree_skb(info->rx_skb);
282 info->rx_skb = NULL;
283 break;
287 } else {
289 __u8 x = inb(iobase + DATA_L);
291 *skb_put(info->rx_skb, 1) = x;
292 inb(iobase + DATA_H);
293 info->rx_count--;
295 if (info->rx_count == 0) {
297 int dlen;
298 struct hci_event_hdr *eh;
299 struct hci_acl_hdr *ah;
300 struct hci_sco_hdr *sh;
302 switch (info->rx_state) {
304 case RECV_WAIT_EVENT_HEADER:
305 eh = hci_event_hdr(info->rx_skb);
306 info->rx_state = RECV_WAIT_DATA;
307 info->rx_count = eh->plen;
308 break;
310 case RECV_WAIT_ACL_HEADER:
311 ah = hci_acl_hdr(info->rx_skb);
312 dlen = __le16_to_cpu(ah->dlen);
313 info->rx_state = RECV_WAIT_DATA;
314 info->rx_count = dlen;
315 break;
317 case RECV_WAIT_SCO_HEADER:
318 sh = hci_sco_hdr(info->rx_skb);
319 info->rx_state = RECV_WAIT_DATA;
320 info->rx_count = sh->dlen;
321 break;
323 case RECV_WAIT_DATA:
324 hci_recv_frame(info->rx_skb);
325 info->rx_skb = NULL;
326 break;
336 bt3c_io_write(iobase, 0x7006, 0x0000);
340 static irqreturn_t bt3c_interrupt(int irq, void *dev_inst)
342 bt3c_info_t *info = dev_inst;
343 unsigned int iobase;
344 int iir;
345 irqreturn_t r = IRQ_NONE;
347 if (!info || !info->hdev)
348 /* our irq handler is shared */
349 return IRQ_NONE;
351 iobase = info->p_dev->io.BasePort1;
353 spin_lock(&(info->lock));
355 iir = inb(iobase + CONTROL);
356 if (iir & 0x80) {
357 int stat = bt3c_read(iobase, 0x7001);
359 if ((stat & 0xff) == 0x7f) {
360 BT_ERR("Very strange (stat=0x%04x)", stat);
361 } else if ((stat & 0xff) != 0xff) {
362 if (stat & 0x0020) {
363 int status = bt3c_read(iobase, 0x7002) & 0x10;
364 BT_INFO("%s: Antenna %s", info->hdev->name,
365 status ? "out" : "in");
367 if (stat & 0x0001)
368 bt3c_receive(info);
369 if (stat & 0x0002) {
370 //BT_ERR("Ack (stat=0x%04x)", stat);
371 clear_bit(XMIT_SENDING, &(info->tx_state));
372 bt3c_write_wakeup(info);
375 bt3c_io_write(iobase, 0x7001, 0x0000);
377 outb(iir, iobase + CONTROL);
379 r = IRQ_HANDLED;
382 spin_unlock(&(info->lock));
384 return r;
389 /* ======================== HCI interface ======================== */
392 static int bt3c_hci_flush(struct hci_dev *hdev)
394 bt3c_info_t *info = (bt3c_info_t *)(hdev->driver_data);
396 /* Drop TX queue */
397 skb_queue_purge(&(info->txq));
399 return 0;
403 static int bt3c_hci_open(struct hci_dev *hdev)
405 set_bit(HCI_RUNNING, &(hdev->flags));
407 return 0;
411 static int bt3c_hci_close(struct hci_dev *hdev)
413 if (!test_and_clear_bit(HCI_RUNNING, &(hdev->flags)))
414 return 0;
416 bt3c_hci_flush(hdev);
418 return 0;
422 static int bt3c_hci_send_frame(struct sk_buff *skb)
424 bt3c_info_t *info;
425 struct hci_dev *hdev = (struct hci_dev *)(skb->dev);
426 unsigned long flags;
428 if (!hdev) {
429 BT_ERR("Frame for unknown HCI device (hdev=NULL)");
430 return -ENODEV;
433 info = (bt3c_info_t *) (hdev->driver_data);
435 switch (bt_cb(skb)->pkt_type) {
436 case HCI_COMMAND_PKT:
437 hdev->stat.cmd_tx++;
438 break;
439 case HCI_ACLDATA_PKT:
440 hdev->stat.acl_tx++;
441 break;
442 case HCI_SCODATA_PKT:
443 hdev->stat.sco_tx++;
444 break;
447 /* Prepend skb with frame type */
448 memcpy(skb_push(skb, 1), &bt_cb(skb)->pkt_type, 1);
449 skb_queue_tail(&(info->txq), skb);
451 spin_lock_irqsave(&(info->lock), flags);
453 bt3c_write_wakeup(info);
455 spin_unlock_irqrestore(&(info->lock), flags);
457 return 0;
461 static void bt3c_hci_destruct(struct hci_dev *hdev)
466 static int bt3c_hci_ioctl(struct hci_dev *hdev, unsigned int cmd, unsigned long arg)
468 return -ENOIOCTLCMD;
473 /* ======================== Card services HCI interaction ======================== */
476 static int bt3c_load_firmware(bt3c_info_t *info, const unsigned char *firmware,
477 int count)
479 char *ptr = (char *) firmware;
480 char b[9];
481 unsigned int iobase, size, addr, fcs, tmp;
482 int i, err = 0;
484 iobase = info->p_dev->io.BasePort1;
486 /* Reset */
487 bt3c_io_write(iobase, 0x8040, 0x0404);
488 bt3c_io_write(iobase, 0x8040, 0x0400);
490 udelay(1);
492 bt3c_io_write(iobase, 0x8040, 0x0404);
494 udelay(17);
496 /* Load */
497 while (count) {
498 if (ptr[0] != 'S') {
499 BT_ERR("Bad address in firmware");
500 err = -EFAULT;
501 goto error;
504 memset(b, 0, sizeof(b));
505 memcpy(b, ptr + 2, 2);
506 size = simple_strtoul(b, NULL, 16);
508 memset(b, 0, sizeof(b));
509 memcpy(b, ptr + 4, 8);
510 addr = simple_strtoul(b, NULL, 16);
512 memset(b, 0, sizeof(b));
513 memcpy(b, ptr + (size * 2) + 2, 2);
514 fcs = simple_strtoul(b, NULL, 16);
516 memset(b, 0, sizeof(b));
517 for (tmp = 0, i = 0; i < size; i++) {
518 memcpy(b, ptr + (i * 2) + 2, 2);
519 tmp += simple_strtol(b, NULL, 16);
522 if (((tmp + fcs) & 0xff) != 0xff) {
523 BT_ERR("Checksum error in firmware");
524 err = -EILSEQ;
525 goto error;
528 if (ptr[1] == '3') {
529 bt3c_address(iobase, addr);
531 memset(b, 0, sizeof(b));
532 for (i = 0; i < (size - 4) / 2; i++) {
533 memcpy(b, ptr + (i * 4) + 12, 4);
534 tmp = simple_strtoul(b, NULL, 16);
535 bt3c_put(iobase, tmp);
539 ptr += (size * 2) + 6;
540 count -= (size * 2) + 6;
543 udelay(17);
545 /* Boot */
546 bt3c_address(iobase, 0x3000);
547 outb(inb(iobase + CONTROL) | 0x40, iobase + CONTROL);
549 error:
550 udelay(17);
552 /* Clear */
553 bt3c_io_write(iobase, 0x7006, 0x0000);
554 bt3c_io_write(iobase, 0x7005, 0x0000);
555 bt3c_io_write(iobase, 0x7001, 0x0000);
557 return err;
561 static int bt3c_open(bt3c_info_t *info)
563 const struct firmware *firmware;
564 struct hci_dev *hdev;
565 int err;
567 spin_lock_init(&(info->lock));
569 skb_queue_head_init(&(info->txq));
571 info->rx_state = RECV_WAIT_PACKET_TYPE;
572 info->rx_count = 0;
573 info->rx_skb = NULL;
575 /* Initialize HCI device */
576 hdev = hci_alloc_dev();
577 if (!hdev) {
578 BT_ERR("Can't allocate HCI device");
579 return -ENOMEM;
582 info->hdev = hdev;
584 hdev->bus = HCI_PCCARD;
585 hdev->driver_data = info;
586 SET_HCIDEV_DEV(hdev, &info->p_dev->dev);
588 hdev->open = bt3c_hci_open;
589 hdev->close = bt3c_hci_close;
590 hdev->flush = bt3c_hci_flush;
591 hdev->send = bt3c_hci_send_frame;
592 hdev->destruct = bt3c_hci_destruct;
593 hdev->ioctl = bt3c_hci_ioctl;
595 hdev->owner = THIS_MODULE;
597 /* Load firmware */
598 err = request_firmware(&firmware, "BT3CPCC.bin", &info->p_dev->dev);
599 if (err < 0) {
600 BT_ERR("Firmware request failed");
601 goto error;
604 err = bt3c_load_firmware(info, firmware->data, firmware->size);
606 release_firmware(firmware);
608 if (err < 0) {
609 BT_ERR("Firmware loading failed");
610 goto error;
613 /* Timeout before it is safe to send the first HCI packet */
614 msleep(1000);
616 /* Register HCI device */
617 err = hci_register_dev(hdev);
618 if (err < 0) {
619 BT_ERR("Can't register HCI device");
620 goto error;
623 return 0;
625 error:
626 info->hdev = NULL;
627 hci_free_dev(hdev);
628 return err;
632 static int bt3c_close(bt3c_info_t *info)
634 struct hci_dev *hdev = info->hdev;
636 if (!hdev)
637 return -ENODEV;
639 bt3c_hci_close(hdev);
641 if (hci_unregister_dev(hdev) < 0)
642 BT_ERR("Can't unregister HCI device %s", hdev->name);
644 hci_free_dev(hdev);
646 return 0;
649 static int bt3c_probe(struct pcmcia_device *link)
651 bt3c_info_t *info;
653 /* Create new info device */
654 info = kzalloc(sizeof(*info), GFP_KERNEL);
655 if (!info)
656 return -ENOMEM;
658 info->p_dev = link;
659 link->priv = info;
661 link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
662 link->io.NumPorts1 = 8;
664 link->conf.Attributes = CONF_ENABLE_IRQ;
665 link->conf.IntType = INT_MEMORY_AND_IO;
667 return bt3c_config(link);
671 static void bt3c_detach(struct pcmcia_device *link)
673 bt3c_info_t *info = link->priv;
675 bt3c_release(link);
676 kfree(info);
679 static int bt3c_check_config(struct pcmcia_device *p_dev,
680 cistpl_cftable_entry_t *cf,
681 cistpl_cftable_entry_t *dflt,
682 unsigned int vcc,
683 void *priv_data)
685 unsigned long try = (unsigned long) priv_data;
687 if (cf->vpp1.present & (1 << CISTPL_POWER_VNOM))
688 p_dev->conf.Vpp = cf->vpp1.param[CISTPL_POWER_VNOM] / 10000;
689 if ((cf->io.nwin > 0) && (cf->io.win[0].len == 8) &&
690 (cf->io.win[0].base != 0)) {
691 p_dev->io.BasePort1 = cf->io.win[0].base;
692 p_dev->io.IOAddrLines = (try == 0) ? 16 :
693 cf->io.flags & CISTPL_IO_LINES_MASK;
694 if (!pcmcia_request_io(p_dev, &p_dev->io))
695 return 0;
697 return -ENODEV;
700 static int bt3c_check_config_notpicky(struct pcmcia_device *p_dev,
701 cistpl_cftable_entry_t *cf,
702 cistpl_cftable_entry_t *dflt,
703 unsigned int vcc,
704 void *priv_data)
706 static unsigned int base[5] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8, 0x0 };
707 int j;
709 if ((cf->io.nwin > 0) && ((cf->io.flags & CISTPL_IO_LINES_MASK) <= 3)) {
710 for (j = 0; j < 5; j++) {
711 p_dev->io.BasePort1 = base[j];
712 p_dev->io.IOAddrLines = base[j] ? 16 : 3;
713 if (!pcmcia_request_io(p_dev, &p_dev->io))
714 return 0;
717 return -ENODEV;
720 static int bt3c_config(struct pcmcia_device *link)
722 bt3c_info_t *info = link->priv;
723 int i;
724 unsigned long try;
726 /* First pass: look for a config entry that looks normal.
727 Two tries: without IO aliases, then with aliases */
728 for (try = 0; try < 2; try++)
729 if (!pcmcia_loop_config(link, bt3c_check_config, (void *) try))
730 goto found_port;
732 /* Second pass: try to find an entry that isn't picky about
733 its base address, then try to grab any standard serial port
734 address, and finally try to get any free port. */
735 if (!pcmcia_loop_config(link, bt3c_check_config_notpicky, NULL))
736 goto found_port;
738 BT_ERR("No usable port range found");
739 goto failed;
741 found_port:
742 i = pcmcia_request_irq(link, &bt3c_interrupt);
743 if (i != 0)
744 goto failed;
746 i = pcmcia_request_configuration(link, &link->conf);
747 if (i != 0)
748 goto failed;
750 if (bt3c_open(info) != 0)
751 goto failed;
753 return 0;
755 failed:
756 bt3c_release(link);
757 return -ENODEV;
761 static void bt3c_release(struct pcmcia_device *link)
763 bt3c_info_t *info = link->priv;
765 bt3c_close(info);
767 pcmcia_disable_device(link);
771 static struct pcmcia_device_id bt3c_ids[] = {
772 PCMCIA_DEVICE_PROD_ID13("3COM", "Bluetooth PC Card", 0xefce0a31, 0xd4ce9b02),
773 PCMCIA_DEVICE_NULL
775 MODULE_DEVICE_TABLE(pcmcia, bt3c_ids);
777 static struct pcmcia_driver bt3c_driver = {
778 .owner = THIS_MODULE,
779 .drv = {
780 .name = "bt3c_cs",
782 .probe = bt3c_probe,
783 .remove = bt3c_detach,
784 .id_table = bt3c_ids,
787 static int __init init_bt3c_cs(void)
789 return pcmcia_register_driver(&bt3c_driver);
793 static void __exit exit_bt3c_cs(void)
795 pcmcia_unregister_driver(&bt3c_driver);
798 module_init(init_bt3c_cs);
799 module_exit(exit_bt3c_cs);