bna: remove oper_state_cbfn from struct bna_rxf
[linux/fpc-iii.git] / drivers / bluetooth / bt3c_cs.c
blob6de97b3871b0f8cffe4d2c9b2b78eb5e87c48247
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/io.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 ======================== */
70 struct bt3c_info {
71 struct pcmcia_device *p_dev;
73 struct hci_dev *hdev;
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);
92 /* Transmit states */
93 #define XMIT_SENDING 1
94 #define XMIT_WAKEUP 2
95 #define XMIT_WAITING 8
97 /* Receiver states */
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 ======================== */
109 #define DATA_L 0
110 #define DATA_H 1
111 #define ADDR_L 2
112 #define ADDR_H 3
113 #define CONTROL 4
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;
143 return value;
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)
161 int actual = 0;
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]);
169 actual++;
172 bt3c_io_write(iobase, 0x7005, actual);
174 return actual;
178 static void bt3c_write_wakeup(struct bt3c_info *info)
180 if (!info) {
181 BT_ERR("Unknown device");
182 return;
185 if (test_and_set_bit(XMIT_SENDING, &(info->tx_state)))
186 return;
188 do {
189 unsigned int iobase = info->p_dev->resource[0]->start;
190 register struct sk_buff *skb;
191 int len;
193 if (!pcmcia_dev_present(info->p_dev))
194 break;
196 skb = skb_dequeue(&(info->txq));
197 if (!skb) {
198 clear_bit(XMIT_SENDING, &(info->tx_state));
199 break;
202 /* Send frame */
203 len = bt3c_write(iobase, 256, skb->data, skb->len);
205 if (len != skb->len) {
206 BT_ERR("Very strange");
209 kfree_skb(skb);
211 info->hdev->stat.byte_tx += len;
213 } while (0);
217 static void bt3c_receive(struct bt3c_info *info)
219 unsigned int iobase;
220 int size = 0, avail;
222 if (!info) {
223 BT_ERR("Unknown device");
224 return;
227 iobase = info->p_dev->resource[0]->start;
229 avail = bt3c_read(iobase, 0x7006);
231 bt3c_address(iobase, 0x7480);
232 while (size < avail) {
233 size++;
234 info->hdev->stat.byte_rx++;
236 /* Allocate packet */
237 if (info->rx_skb == NULL) {
238 info->rx_state = RECV_WAIT_PACKET_TYPE;
239 info->rx_count = 0;
240 info->rx_skb = bt_skb_alloc(HCI_MAX_FRAME_SIZE, GFP_ATOMIC);
241 if (!info->rx_skb) {
242 BT_ERR("Can't allocate mem for new packet");
243 return;
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) {
255 case HCI_EVENT_PKT:
256 info->rx_state = RECV_WAIT_EVENT_HEADER;
257 info->rx_count = HCI_EVENT_HDR_SIZE;
258 break;
260 case HCI_ACLDATA_PKT:
261 info->rx_state = RECV_WAIT_ACL_HEADER;
262 info->rx_count = HCI_ACL_HDR_SIZE;
263 break;
265 case HCI_SCODATA_PKT:
266 info->rx_state = RECV_WAIT_SCO_HEADER;
267 info->rx_count = HCI_SCO_HDR_SIZE;
268 break;
270 default:
271 /* Unknown packet */
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);
277 info->rx_skb = NULL;
278 break;
282 } else {
284 __u8 x = inb(iobase + DATA_L);
286 *skb_put(info->rx_skb, 1) = x;
287 inb(iobase + DATA_H);
288 info->rx_count--;
290 if (info->rx_count == 0) {
292 int dlen;
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;
303 break;
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;
310 break;
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;
316 break;
318 case RECV_WAIT_DATA:
319 hci_recv_frame(info->hdev, info->rx_skb);
320 info->rx_skb = NULL;
321 break;
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;
338 unsigned int iobase;
339 int iir;
340 irqreturn_t r = IRQ_NONE;
342 if (!info || !info->hdev)
343 /* our irq handler is shared */
344 return IRQ_NONE;
346 iobase = info->p_dev->resource[0]->start;
348 spin_lock(&(info->lock));
350 iir = inb(iobase + CONTROL);
351 if (iir & 0x80) {
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) {
357 if (stat & 0x0020) {
358 int status = bt3c_read(iobase, 0x7002) & 0x10;
359 BT_INFO("%s: Antenna %s", info->hdev->name,
360 status ? "out" : "in");
362 if (stat & 0x0001)
363 bt3c_receive(info);
364 if (stat & 0x0002) {
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);
373 r = IRQ_HANDLED;
376 spin_unlock(&(info->lock));
378 return r;
383 /* ======================== HCI interface ======================== */
386 static int bt3c_hci_flush(struct hci_dev *hdev)
388 struct bt3c_info *info = hci_get_drvdata(hdev);
390 /* Drop TX queue */
391 skb_queue_purge(&(info->txq));
393 return 0;
397 static int bt3c_hci_open(struct hci_dev *hdev)
399 set_bit(HCI_RUNNING, &(hdev->flags));
401 return 0;
405 static int bt3c_hci_close(struct hci_dev *hdev)
407 if (!test_and_clear_bit(HCI_RUNNING, &(hdev->flags)))
408 return 0;
410 bt3c_hci_flush(hdev);
412 return 0;
416 static int bt3c_hci_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
418 struct bt3c_info *info = hci_get_drvdata(hdev);
419 unsigned long flags;
421 switch (bt_cb(skb)->pkt_type) {
422 case HCI_COMMAND_PKT:
423 hdev->stat.cmd_tx++;
424 break;
425 case HCI_ACLDATA_PKT:
426 hdev->stat.acl_tx++;
427 break;
428 case HCI_SCODATA_PKT:
429 hdev->stat.sco_tx++;
430 break;
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);
443 return 0;
448 /* ======================== Card services HCI interaction ======================== */
451 static int bt3c_load_firmware(struct bt3c_info *info,
452 const unsigned char *firmware,
453 int count)
455 char *ptr = (char *) firmware;
456 char b[9];
457 unsigned int iobase, size, addr, fcs, tmp;
458 int i, err = 0;
460 iobase = info->p_dev->resource[0]->start;
462 /* Reset */
463 bt3c_io_write(iobase, 0x8040, 0x0404);
464 bt3c_io_write(iobase, 0x8040, 0x0400);
466 udelay(1);
468 bt3c_io_write(iobase, 0x8040, 0x0404);
470 udelay(17);
472 /* Load */
473 while (count) {
474 if (ptr[0] != 'S') {
475 BT_ERR("Bad address in firmware");
476 err = -EFAULT;
477 goto error;
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");
500 err = -EILSEQ;
501 goto error;
504 if (ptr[1] == '3') {
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;
519 udelay(17);
521 /* Boot */
522 bt3c_address(iobase, 0x3000);
523 outb(inb(iobase + CONTROL) | 0x40, iobase + CONTROL);
525 error:
526 udelay(17);
528 /* Clear */
529 bt3c_io_write(iobase, 0x7006, 0x0000);
530 bt3c_io_write(iobase, 0x7005, 0x0000);
531 bt3c_io_write(iobase, 0x7001, 0x0000);
533 return err;
537 static int bt3c_open(struct bt3c_info *info)
539 const struct firmware *firmware;
540 struct hci_dev *hdev;
541 int err;
543 spin_lock_init(&(info->lock));
545 skb_queue_head_init(&(info->txq));
547 info->rx_state = RECV_WAIT_PACKET_TYPE;
548 info->rx_count = 0;
549 info->rx_skb = NULL;
551 /* Initialize HCI device */
552 hdev = hci_alloc_dev();
553 if (!hdev) {
554 BT_ERR("Can't allocate HCI device");
555 return -ENOMEM;
558 info->hdev = hdev;
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;
569 /* Load firmware */
570 err = request_firmware(&firmware, "BT3CPCC.bin", &info->p_dev->dev);
571 if (err < 0) {
572 BT_ERR("Firmware request failed");
573 goto error;
576 err = bt3c_load_firmware(info, firmware->data, firmware->size);
578 release_firmware(firmware);
580 if (err < 0) {
581 BT_ERR("Firmware loading failed");
582 goto error;
585 /* Timeout before it is safe to send the first HCI packet */
586 msleep(1000);
588 /* Register HCI device */
589 err = hci_register_dev(hdev);
590 if (err < 0) {
591 BT_ERR("Can't register HCI device");
592 goto error;
595 return 0;
597 error:
598 info->hdev = NULL;
599 hci_free_dev(hdev);
600 return err;
604 static int bt3c_close(struct bt3c_info *info)
606 struct hci_dev *hdev = info->hdev;
608 if (!hdev)
609 return -ENODEV;
611 bt3c_hci_close(hdev);
613 hci_unregister_dev(hdev);
614 hci_free_dev(hdev);
616 return 0;
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);
625 if (!info)
626 return -ENOMEM;
628 info->p_dev = link;
629 link->priv = info;
631 link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_VPP |
632 CONF_AUTO_SET_IO;
634 return bt3c_config(link);
638 static void bt3c_detach(struct pcmcia_device *link)
640 bt3c_release(link);
643 static int bt3c_check_config(struct pcmcia_device *p_dev, void *priv_data)
645 int *try = priv_data;
647 if (!try)
648 p_dev->io_lines = 16;
650 if ((p_dev->resource[0]->end != 8) || (p_dev->resource[0]->start == 0))
651 return -EINVAL;
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,
661 void *priv_data)
663 static unsigned int base[5] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8, 0x0 };
664 int j;
666 if (p_dev->io_lines > 3)
667 return -ENODEV;
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))
677 return 0;
679 return -ENODEV;
682 static int bt3c_config(struct pcmcia_device *link)
684 struct bt3c_info *info = link->priv;
685 int i;
686 unsigned long try;
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))
692 goto found_port;
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))
698 goto found_port;
700 BT_ERR("No usable port range found");
701 goto failed;
703 found_port:
704 i = pcmcia_request_irq(link, &bt3c_interrupt);
705 if (i != 0)
706 goto failed;
708 i = pcmcia_enable_device(link);
709 if (i != 0)
710 goto failed;
712 if (bt3c_open(info) != 0)
713 goto failed;
715 return 0;
717 failed:
718 bt3c_release(link);
719 return -ENODEV;
723 static void bt3c_release(struct pcmcia_device *link)
725 struct bt3c_info *info = link->priv;
727 bt3c_close(info);
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),
735 PCMCIA_DEVICE_NULL
737 MODULE_DEVICE_TABLE(pcmcia, bt3c_ids);
739 static struct pcmcia_driver bt3c_driver = {
740 .owner = THIS_MODULE,
741 .name = "bt3c_cs",
742 .probe = bt3c_probe,
743 .remove = bt3c_detach,
744 .id_table = bt3c_ids,
746 module_pcmcia_driver(bt3c_driver);