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>
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
;
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
;
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
);
96 #define XMIT_SENDING 1
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 ======================== */
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;
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
)
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
]);
175 bt3c_io_write(iobase
, 0x7005, actual
);
181 static void bt3c_write_wakeup(bt3c_info_t
*info
)
184 BT_ERR("Unknown device");
188 if (test_and_set_bit(XMIT_SENDING
, &(info
->tx_state
)))
192 register unsigned int iobase
= info
->p_dev
->io
.BasePort1
;
193 register struct sk_buff
*skb
;
196 if (!pcmcia_dev_present(info
->p_dev
))
200 if (!(skb
= skb_dequeue(&(info
->txq
)))) {
201 clear_bit(XMIT_SENDING
, &(info
->tx_state
));
206 len
= bt3c_write(iobase
, 256, skb
->data
, skb
->len
);
208 if (len
!= skb
->len
) {
209 BT_ERR("Very strange");
214 info
->hdev
->stat
.byte_tx
+= len
;
220 static void bt3c_receive(bt3c_info_t
*info
)
226 BT_ERR("Unknown device");
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
) {
238 info
->hdev
->stat
.byte_rx
++;
240 /* Allocate packet */
241 if (info
->rx_skb
== NULL
) {
242 info
->rx_state
= RECV_WAIT_PACKET_TYPE
;
244 if (!(info
->rx_skb
= bt_skb_alloc(HCI_MAX_FRAME_SIZE
, GFP_ATOMIC
))) {
245 BT_ERR("Can't allocate mem for new packet");
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
) {
261 info
->rx_state
= RECV_WAIT_EVENT_HEADER
;
262 info
->rx_count
= HCI_EVENT_HDR_SIZE
;
265 case HCI_ACLDATA_PKT
:
266 info
->rx_state
= RECV_WAIT_ACL_HEADER
;
267 info
->rx_count
= HCI_ACL_HDR_SIZE
;
270 case HCI_SCODATA_PKT
:
271 info
->rx_state
= RECV_WAIT_SCO_HEADER
;
272 info
->rx_count
= HCI_SCO_HDR_SIZE
;
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
);
289 __u8 x
= inb(iobase
+ DATA_L
);
291 *skb_put(info
->rx_skb
, 1) = x
;
292 inb(iobase
+ DATA_H
);
295 if (info
->rx_count
== 0) {
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
;
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
;
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
;
324 hci_recv_frame(info
->rx_skb
);
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
;
345 irqreturn_t r
= IRQ_NONE
;
347 if (!info
|| !info
->hdev
)
348 /* our irq handler is shared */
351 iobase
= info
->p_dev
->io
.BasePort1
;
353 spin_lock(&(info
->lock
));
355 iir
= inb(iobase
+ CONTROL
);
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) {
363 int status
= bt3c_read(iobase
, 0x7002) & 0x10;
364 BT_INFO("%s: Antenna %s", info
->hdev
->name
,
365 status
? "out" : "in");
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
);
382 spin_unlock(&(info
->lock
));
389 /* ======================== HCI interface ======================== */
392 static int bt3c_hci_flush(struct hci_dev
*hdev
)
394 bt3c_info_t
*info
= (bt3c_info_t
*)(hdev
->driver_data
);
397 skb_queue_purge(&(info
->txq
));
403 static int bt3c_hci_open(struct hci_dev
*hdev
)
405 set_bit(HCI_RUNNING
, &(hdev
->flags
));
411 static int bt3c_hci_close(struct hci_dev
*hdev
)
413 if (!test_and_clear_bit(HCI_RUNNING
, &(hdev
->flags
)))
416 bt3c_hci_flush(hdev
);
422 static int bt3c_hci_send_frame(struct sk_buff
*skb
)
425 struct hci_dev
*hdev
= (struct hci_dev
*)(skb
->dev
);
429 BT_ERR("Frame for unknown HCI device (hdev=NULL)");
433 info
= (bt3c_info_t
*) (hdev
->driver_data
);
435 switch (bt_cb(skb
)->pkt_type
) {
436 case HCI_COMMAND_PKT
:
439 case HCI_ACLDATA_PKT
:
442 case HCI_SCODATA_PKT
:
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
);
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
)
473 /* ======================== Card services HCI interaction ======================== */
476 static int bt3c_load_firmware(bt3c_info_t
*info
, const unsigned char *firmware
,
479 char *ptr
= (char *) firmware
;
481 unsigned int iobase
, size
, addr
, fcs
, tmp
;
484 iobase
= info
->p_dev
->io
.BasePort1
;
487 bt3c_io_write(iobase
, 0x8040, 0x0404);
488 bt3c_io_write(iobase
, 0x8040, 0x0400);
492 bt3c_io_write(iobase
, 0x8040, 0x0404);
499 BT_ERR("Bad address in firmware");
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");
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;
546 bt3c_address(iobase
, 0x3000);
547 outb(inb(iobase
+ CONTROL
) | 0x40, iobase
+ CONTROL
);
553 bt3c_io_write(iobase
, 0x7006, 0x0000);
554 bt3c_io_write(iobase
, 0x7005, 0x0000);
555 bt3c_io_write(iobase
, 0x7001, 0x0000);
561 static int bt3c_open(bt3c_info_t
*info
)
563 const struct firmware
*firmware
;
564 struct hci_dev
*hdev
;
567 spin_lock_init(&(info
->lock
));
569 skb_queue_head_init(&(info
->txq
));
571 info
->rx_state
= RECV_WAIT_PACKET_TYPE
;
575 /* Initialize HCI device */
576 hdev
= hci_alloc_dev();
578 BT_ERR("Can't allocate HCI device");
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
;
598 err
= request_firmware(&firmware
, "BT3CPCC.bin", &info
->p_dev
->dev
);
600 BT_ERR("Firmware request failed");
604 err
= bt3c_load_firmware(info
, firmware
->data
, firmware
->size
);
606 release_firmware(firmware
);
609 BT_ERR("Firmware loading failed");
613 /* Timeout before it is safe to send the first HCI packet */
616 /* Register HCI device */
617 err
= hci_register_dev(hdev
);
619 BT_ERR("Can't register HCI device");
632 static int bt3c_close(bt3c_info_t
*info
)
634 struct hci_dev
*hdev
= info
->hdev
;
639 bt3c_hci_close(hdev
);
641 if (hci_unregister_dev(hdev
) < 0)
642 BT_ERR("Can't unregister HCI device %s", hdev
->name
);
649 static int bt3c_probe(struct pcmcia_device
*link
)
653 /* Create new info device */
654 info
= kzalloc(sizeof(*info
), GFP_KERNEL
);
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
;
679 static int bt3c_check_config(struct pcmcia_device
*p_dev
,
680 cistpl_cftable_entry_t
*cf
,
681 cistpl_cftable_entry_t
*dflt
,
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
))
700 static int bt3c_check_config_notpicky(struct pcmcia_device
*p_dev
,
701 cistpl_cftable_entry_t
*cf
,
702 cistpl_cftable_entry_t
*dflt
,
706 static unsigned int base
[5] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8, 0x0 };
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
))
720 static int bt3c_config(struct pcmcia_device
*link
)
722 bt3c_info_t
*info
= link
->priv
;
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))
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
))
738 BT_ERR("No usable port range found");
742 i
= pcmcia_request_irq(link
, &bt3c_interrupt
);
746 i
= pcmcia_request_configuration(link
, &link
->conf
);
750 if (bt3c_open(info
) != 0)
761 static void bt3c_release(struct pcmcia_device
*link
)
763 bt3c_info_t
*info
= link
->priv
;
767 pcmcia_disable_device(link
);
771 static struct pcmcia_device_id bt3c_ids
[] = {
772 PCMCIA_DEVICE_PROD_ID13("3COM", "Bluetooth PC Card", 0xefce0a31, 0xd4ce9b02),
775 MODULE_DEVICE_TABLE(pcmcia
, bt3c_ids
);
777 static struct pcmcia_driver bt3c_driver
= {
778 .owner
= THIS_MODULE
,
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
);