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>
44 #include <linux/device.h>
45 #include <linux/firmware.h>
47 #include <pcmcia/cistpl.h>
48 #include <pcmcia/ciscode.h>
49 #include <pcmcia/ds.h>
50 #include <pcmcia/cisreg.h>
52 #include <net/bluetooth/bluetooth.h>
53 #include <net/bluetooth/hci_core.h>
57 /* ======================== Module parameters ======================== */
60 MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
61 MODULE_DESCRIPTION("Bluetooth driver for the 3Com Bluetooth PCMCIA card");
62 MODULE_LICENSE("GPL");
63 MODULE_FIRMWARE("BT3CPCC.bin");
67 /* ======================== Local structures ======================== */
71 struct pcmcia_device
*p_dev
;
75 spinlock_t lock
; /* For serializing operations */
77 struct sk_buff_head txq
;
78 unsigned long tx_state
;
80 unsigned long rx_state
;
81 unsigned long rx_count
;
82 struct sk_buff
*rx_skb
;
86 static int bt3c_config(struct pcmcia_device
*link
);
87 static void bt3c_release(struct pcmcia_device
*link
);
89 static void bt3c_detach(struct pcmcia_device
*p_dev
);
93 #define XMIT_SENDING 1
95 #define XMIT_WAITING 8
98 #define RECV_WAIT_PACKET_TYPE 0
99 #define RECV_WAIT_EVENT_HEADER 1
100 #define RECV_WAIT_ACL_HEADER 2
101 #define RECV_WAIT_SCO_HEADER 3
102 #define RECV_WAIT_DATA 4
106 /* ======================== Special I/O functions ======================== */
116 static inline void bt3c_address(unsigned int iobase
, unsigned short addr
)
118 outb(addr
& 0xff, iobase
+ ADDR_L
);
119 outb((addr
>> 8) & 0xff, iobase
+ ADDR_H
);
123 static inline void bt3c_put(unsigned int iobase
, unsigned short value
)
125 outb(value
& 0xff, iobase
+ DATA_L
);
126 outb((value
>> 8) & 0xff, iobase
+ DATA_H
);
130 static inline void bt3c_io_write(unsigned int iobase
, unsigned short addr
, unsigned short value
)
132 bt3c_address(iobase
, addr
);
133 bt3c_put(iobase
, value
);
137 static inline unsigned short bt3c_get(unsigned int iobase
)
139 unsigned short value
= inb(iobase
+ DATA_L
);
141 value
|= inb(iobase
+ DATA_H
) << 8;
147 static inline unsigned short bt3c_read(unsigned int iobase
, unsigned short addr
)
149 bt3c_address(iobase
, addr
);
151 return bt3c_get(iobase
);
156 /* ======================== Interrupt handling ======================== */
159 static int bt3c_write(unsigned int iobase
, int fifo_size
, __u8
*buf
, int len
)
163 bt3c_address(iobase
, 0x7080);
165 /* Fill FIFO with current frame */
166 while (actual
< len
) {
167 /* Transmit next byte */
168 bt3c_put(iobase
, buf
[actual
]);
172 bt3c_io_write(iobase
, 0x7005, actual
);
178 static void bt3c_write_wakeup(struct bt3c_info
*info
)
181 BT_ERR("Unknown device");
185 if (test_and_set_bit(XMIT_SENDING
, &(info
->tx_state
)))
189 unsigned int iobase
= info
->p_dev
->resource
[0]->start
;
190 register struct sk_buff
*skb
;
193 if (!pcmcia_dev_present(info
->p_dev
))
196 skb
= skb_dequeue(&(info
->txq
));
198 clear_bit(XMIT_SENDING
, &(info
->tx_state
));
203 len
= bt3c_write(iobase
, 256, skb
->data
, skb
->len
);
205 if (len
!= skb
->len
) {
206 BT_ERR("Very strange");
211 info
->hdev
->stat
.byte_tx
+= len
;
217 static void bt3c_receive(struct bt3c_info
*info
)
223 BT_ERR("Unknown device");
227 iobase
= info
->p_dev
->resource
[0]->start
;
229 avail
= bt3c_read(iobase
, 0x7006);
231 bt3c_address(iobase
, 0x7480);
232 while (size
< avail
) {
234 info
->hdev
->stat
.byte_rx
++;
236 /* Allocate packet */
237 if (info
->rx_skb
== NULL
) {
238 info
->rx_state
= RECV_WAIT_PACKET_TYPE
;
240 info
->rx_skb
= bt_skb_alloc(HCI_MAX_FRAME_SIZE
, GFP_ATOMIC
);
242 BT_ERR("Can't allocate mem for new packet");
248 if (info
->rx_state
== RECV_WAIT_PACKET_TYPE
) {
250 bt_cb(info
->rx_skb
)->pkt_type
= inb(iobase
+ DATA_L
);
251 inb(iobase
+ DATA_H
);
253 switch (bt_cb(info
->rx_skb
)->pkt_type
) {
256 info
->rx_state
= RECV_WAIT_EVENT_HEADER
;
257 info
->rx_count
= HCI_EVENT_HDR_SIZE
;
260 case HCI_ACLDATA_PKT
:
261 info
->rx_state
= RECV_WAIT_ACL_HEADER
;
262 info
->rx_count
= HCI_ACL_HDR_SIZE
;
265 case HCI_SCODATA_PKT
:
266 info
->rx_state
= RECV_WAIT_SCO_HEADER
;
267 info
->rx_count
= HCI_SCO_HDR_SIZE
;
272 BT_ERR("Unknown HCI packet with type 0x%02x received", bt_cb(info
->rx_skb
)->pkt_type
);
273 info
->hdev
->stat
.err_rx
++;
274 clear_bit(HCI_RUNNING
, &(info
->hdev
->flags
));
276 kfree_skb(info
->rx_skb
);
284 __u8 x
= inb(iobase
+ DATA_L
);
286 *skb_put(info
->rx_skb
, 1) = x
;
287 inb(iobase
+ DATA_H
);
290 if (info
->rx_count
== 0) {
293 struct hci_event_hdr
*eh
;
294 struct hci_acl_hdr
*ah
;
295 struct hci_sco_hdr
*sh
;
297 switch (info
->rx_state
) {
299 case RECV_WAIT_EVENT_HEADER
:
300 eh
= hci_event_hdr(info
->rx_skb
);
301 info
->rx_state
= RECV_WAIT_DATA
;
302 info
->rx_count
= eh
->plen
;
305 case RECV_WAIT_ACL_HEADER
:
306 ah
= hci_acl_hdr(info
->rx_skb
);
307 dlen
= __le16_to_cpu(ah
->dlen
);
308 info
->rx_state
= RECV_WAIT_DATA
;
309 info
->rx_count
= dlen
;
312 case RECV_WAIT_SCO_HEADER
:
313 sh
= hci_sco_hdr(info
->rx_skb
);
314 info
->rx_state
= RECV_WAIT_DATA
;
315 info
->rx_count
= sh
->dlen
;
319 hci_recv_frame(info
->hdev
, info
->rx_skb
);
331 bt3c_io_write(iobase
, 0x7006, 0x0000);
335 static irqreturn_t
bt3c_interrupt(int irq
, void *dev_inst
)
337 struct bt3c_info
*info
= dev_inst
;
340 irqreturn_t r
= IRQ_NONE
;
342 if (!info
|| !info
->hdev
)
343 /* our irq handler is shared */
346 iobase
= info
->p_dev
->resource
[0]->start
;
348 spin_lock(&(info
->lock
));
350 iir
= inb(iobase
+ CONTROL
);
352 int stat
= bt3c_read(iobase
, 0x7001);
354 if ((stat
& 0xff) == 0x7f) {
355 BT_ERR("Very strange (stat=0x%04x)", stat
);
356 } else if ((stat
& 0xff) != 0xff) {
358 int status
= bt3c_read(iobase
, 0x7002) & 0x10;
359 BT_INFO("%s: Antenna %s", info
->hdev
->name
,
360 status
? "out" : "in");
365 clear_bit(XMIT_SENDING
, &(info
->tx_state
));
366 bt3c_write_wakeup(info
);
369 bt3c_io_write(iobase
, 0x7001, 0x0000);
371 outb(iir
, iobase
+ CONTROL
);
376 spin_unlock(&(info
->lock
));
383 /* ======================== HCI interface ======================== */
386 static int bt3c_hci_flush(struct hci_dev
*hdev
)
388 struct bt3c_info
*info
= hci_get_drvdata(hdev
);
391 skb_queue_purge(&(info
->txq
));
397 static int bt3c_hci_open(struct hci_dev
*hdev
)
399 set_bit(HCI_RUNNING
, &(hdev
->flags
));
405 static int bt3c_hci_close(struct hci_dev
*hdev
)
407 if (!test_and_clear_bit(HCI_RUNNING
, &(hdev
->flags
)))
410 bt3c_hci_flush(hdev
);
416 static int bt3c_hci_send_frame(struct hci_dev
*hdev
, struct sk_buff
*skb
)
418 struct bt3c_info
*info
= hci_get_drvdata(hdev
);
421 switch (bt_cb(skb
)->pkt_type
) {
422 case HCI_COMMAND_PKT
:
425 case HCI_ACLDATA_PKT
:
428 case HCI_SCODATA_PKT
:
433 /* Prepend skb with frame type */
434 memcpy(skb_push(skb
, 1), &bt_cb(skb
)->pkt_type
, 1);
435 skb_queue_tail(&(info
->txq
), skb
);
437 spin_lock_irqsave(&(info
->lock
), flags
);
439 bt3c_write_wakeup(info
);
441 spin_unlock_irqrestore(&(info
->lock
), flags
);
448 /* ======================== Card services HCI interaction ======================== */
451 static int bt3c_load_firmware(struct bt3c_info
*info
,
452 const unsigned char *firmware
,
455 char *ptr
= (char *) firmware
;
457 unsigned int iobase
, size
, addr
, fcs
, tmp
;
460 iobase
= info
->p_dev
->resource
[0]->start
;
463 bt3c_io_write(iobase
, 0x8040, 0x0404);
464 bt3c_io_write(iobase
, 0x8040, 0x0400);
468 bt3c_io_write(iobase
, 0x8040, 0x0404);
475 BT_ERR("Bad address in firmware");
480 memset(b
, 0, sizeof(b
));
481 memcpy(b
, ptr
+ 2, 2);
482 size
= simple_strtoul(b
, NULL
, 16);
484 memset(b
, 0, sizeof(b
));
485 memcpy(b
, ptr
+ 4, 8);
486 addr
= simple_strtoul(b
, NULL
, 16);
488 memset(b
, 0, sizeof(b
));
489 memcpy(b
, ptr
+ (size
* 2) + 2, 2);
490 fcs
= simple_strtoul(b
, NULL
, 16);
492 memset(b
, 0, sizeof(b
));
493 for (tmp
= 0, i
= 0; i
< size
; i
++) {
494 memcpy(b
, ptr
+ (i
* 2) + 2, 2);
495 tmp
+= simple_strtol(b
, NULL
, 16);
498 if (((tmp
+ fcs
) & 0xff) != 0xff) {
499 BT_ERR("Checksum error in firmware");
505 bt3c_address(iobase
, addr
);
507 memset(b
, 0, sizeof(b
));
508 for (i
= 0; i
< (size
- 4) / 2; i
++) {
509 memcpy(b
, ptr
+ (i
* 4) + 12, 4);
510 tmp
= simple_strtoul(b
, NULL
, 16);
511 bt3c_put(iobase
, tmp
);
515 ptr
+= (size
* 2) + 6;
516 count
-= (size
* 2) + 6;
522 bt3c_address(iobase
, 0x3000);
523 outb(inb(iobase
+ CONTROL
) | 0x40, iobase
+ CONTROL
);
529 bt3c_io_write(iobase
, 0x7006, 0x0000);
530 bt3c_io_write(iobase
, 0x7005, 0x0000);
531 bt3c_io_write(iobase
, 0x7001, 0x0000);
537 static int bt3c_open(struct bt3c_info
*info
)
539 const struct firmware
*firmware
;
540 struct hci_dev
*hdev
;
543 spin_lock_init(&(info
->lock
));
545 skb_queue_head_init(&(info
->txq
));
547 info
->rx_state
= RECV_WAIT_PACKET_TYPE
;
551 /* Initialize HCI device */
552 hdev
= hci_alloc_dev();
554 BT_ERR("Can't allocate HCI device");
560 hdev
->bus
= HCI_PCCARD
;
561 hci_set_drvdata(hdev
, info
);
562 SET_HCIDEV_DEV(hdev
, &info
->p_dev
->dev
);
564 hdev
->open
= bt3c_hci_open
;
565 hdev
->close
= bt3c_hci_close
;
566 hdev
->flush
= bt3c_hci_flush
;
567 hdev
->send
= bt3c_hci_send_frame
;
570 err
= request_firmware(&firmware
, "BT3CPCC.bin", &info
->p_dev
->dev
);
572 BT_ERR("Firmware request failed");
576 err
= bt3c_load_firmware(info
, firmware
->data
, firmware
->size
);
578 release_firmware(firmware
);
581 BT_ERR("Firmware loading failed");
585 /* Timeout before it is safe to send the first HCI packet */
588 /* Register HCI device */
589 err
= hci_register_dev(hdev
);
591 BT_ERR("Can't register HCI device");
604 static int bt3c_close(struct bt3c_info
*info
)
606 struct hci_dev
*hdev
= info
->hdev
;
611 bt3c_hci_close(hdev
);
613 hci_unregister_dev(hdev
);
619 static int bt3c_probe(struct pcmcia_device
*link
)
621 struct bt3c_info
*info
;
623 /* Create new info device */
624 info
= devm_kzalloc(&link
->dev
, sizeof(*info
), GFP_KERNEL
);
631 link
->config_flags
|= CONF_ENABLE_IRQ
| CONF_AUTO_SET_VPP
|
634 return bt3c_config(link
);
638 static void bt3c_detach(struct pcmcia_device
*link
)
643 static int bt3c_check_config(struct pcmcia_device
*p_dev
, void *priv_data
)
645 int *try = priv_data
;
648 p_dev
->io_lines
= 16;
650 if ((p_dev
->resource
[0]->end
!= 8) || (p_dev
->resource
[0]->start
== 0))
653 p_dev
->resource
[0]->end
= 8;
654 p_dev
->resource
[0]->flags
&= ~IO_DATA_PATH_WIDTH
;
655 p_dev
->resource
[0]->flags
|= IO_DATA_PATH_WIDTH_8
;
657 return pcmcia_request_io(p_dev
);
660 static int bt3c_check_config_notpicky(struct pcmcia_device
*p_dev
,
663 static unsigned int base
[5] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8, 0x0 };
666 if (p_dev
->io_lines
> 3)
669 p_dev
->resource
[0]->flags
&= ~IO_DATA_PATH_WIDTH
;
670 p_dev
->resource
[0]->flags
|= IO_DATA_PATH_WIDTH_8
;
671 p_dev
->resource
[0]->end
= 8;
673 for (j
= 0; j
< 5; j
++) {
674 p_dev
->resource
[0]->start
= base
[j
];
675 p_dev
->io_lines
= base
[j
] ? 16 : 3;
676 if (!pcmcia_request_io(p_dev
))
682 static int bt3c_config(struct pcmcia_device
*link
)
684 struct bt3c_info
*info
= link
->priv
;
688 /* First pass: look for a config entry that looks normal.
689 Two tries: without IO aliases, then with aliases */
690 for (try = 0; try < 2; try++)
691 if (!pcmcia_loop_config(link
, bt3c_check_config
, (void *) try))
694 /* Second pass: try to find an entry that isn't picky about
695 its base address, then try to grab any standard serial port
696 address, and finally try to get any free port. */
697 if (!pcmcia_loop_config(link
, bt3c_check_config_notpicky
, NULL
))
700 BT_ERR("No usable port range found");
704 i
= pcmcia_request_irq(link
, &bt3c_interrupt
);
708 i
= pcmcia_enable_device(link
);
712 if (bt3c_open(info
) != 0)
723 static void bt3c_release(struct pcmcia_device
*link
)
725 struct bt3c_info
*info
= link
->priv
;
729 pcmcia_disable_device(link
);
733 static const struct pcmcia_device_id bt3c_ids
[] = {
734 PCMCIA_DEVICE_PROD_ID13("3COM", "Bluetooth PC Card", 0xefce0a31, 0xd4ce9b02),
737 MODULE_DEVICE_TABLE(pcmcia
, bt3c_ids
);
739 static struct pcmcia_driver bt3c_driver
= {
740 .owner
= THIS_MODULE
,
743 .remove
= bt3c_detach
,
744 .id_table
= bt3c_ids
,
746 module_pcmcia_driver(bt3c_driver
);