Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/drivers/bluetooth/dtl1_cs.c
15109 views
1
/*
2
*
3
* A driver for Nokia Connectivity Card DTL-1 devices
4
*
5
* Copyright (C) 2001-2002 Marcel Holtmann <[email protected]>
6
*
7
*
8
* This program is free software; you can redistribute it and/or modify
9
* it under the terms of the GNU General Public License version 2 as
10
* published by the Free Software Foundation;
11
*
12
* Software distributed under the License is distributed on an "AS
13
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
14
* implied. See the License for the specific language governing
15
* rights and limitations under the License.
16
*
17
* The initial developer of the original code is David A. Hinds
18
* <[email protected]>. Portions created by David A. Hinds
19
* are Copyright (C) 1999 David A. Hinds. All Rights Reserved.
20
*
21
*/
22
23
#include <linux/module.h>
24
25
#include <linux/kernel.h>
26
#include <linux/init.h>
27
#include <linux/slab.h>
28
#include <linux/types.h>
29
#include <linux/delay.h>
30
#include <linux/errno.h>
31
#include <linux/ptrace.h>
32
#include <linux/ioport.h>
33
#include <linux/spinlock.h>
34
#include <linux/moduleparam.h>
35
36
#include <linux/skbuff.h>
37
#include <linux/string.h>
38
#include <linux/serial.h>
39
#include <linux/serial_reg.h>
40
#include <linux/bitops.h>
41
#include <asm/system.h>
42
#include <asm/io.h>
43
44
#include <pcmcia/cistpl.h>
45
#include <pcmcia/ciscode.h>
46
#include <pcmcia/ds.h>
47
#include <pcmcia/cisreg.h>
48
49
#include <net/bluetooth/bluetooth.h>
50
#include <net/bluetooth/hci_core.h>
51
52
53
54
/* ======================== Module parameters ======================== */
55
56
57
MODULE_AUTHOR("Marcel Holtmann <[email protected]>");
58
MODULE_DESCRIPTION("Bluetooth driver for Nokia Connectivity Card DTL-1");
59
MODULE_LICENSE("GPL");
60
61
62
63
/* ======================== Local structures ======================== */
64
65
66
typedef struct dtl1_info_t {
67
struct pcmcia_device *p_dev;
68
69
struct hci_dev *hdev;
70
71
spinlock_t lock; /* For serializing operations */
72
73
unsigned long flowmask; /* HCI flow mask */
74
int ri_latch;
75
76
struct sk_buff_head txq;
77
unsigned long tx_state;
78
79
unsigned long rx_state;
80
unsigned long rx_count;
81
struct sk_buff *rx_skb;
82
} dtl1_info_t;
83
84
85
static int dtl1_config(struct pcmcia_device *link);
86
static void dtl1_release(struct pcmcia_device *link);
87
88
static void dtl1_detach(struct pcmcia_device *p_dev);
89
90
91
/* Transmit states */
92
#define XMIT_SENDING 1
93
#define XMIT_WAKEUP 2
94
#define XMIT_WAITING 8
95
96
/* Receiver States */
97
#define RECV_WAIT_NSH 0
98
#define RECV_WAIT_DATA 1
99
100
101
typedef struct {
102
u8 type;
103
u8 zero;
104
u16 len;
105
} __packed nsh_t; /* Nokia Specific Header */
106
107
#define NSHL 4 /* Nokia Specific Header Length */
108
109
110
111
/* ======================== Interrupt handling ======================== */
112
113
114
static int dtl1_write(unsigned int iobase, int fifo_size, __u8 *buf, int len)
115
{
116
int actual = 0;
117
118
/* Tx FIFO should be empty */
119
if (!(inb(iobase + UART_LSR) & UART_LSR_THRE))
120
return 0;
121
122
/* Fill FIFO with current frame */
123
while ((fifo_size-- > 0) && (actual < len)) {
124
/* Transmit next byte */
125
outb(buf[actual], iobase + UART_TX);
126
actual++;
127
}
128
129
return actual;
130
}
131
132
133
static void dtl1_write_wakeup(dtl1_info_t *info)
134
{
135
if (!info) {
136
BT_ERR("Unknown device");
137
return;
138
}
139
140
if (test_bit(XMIT_WAITING, &(info->tx_state))) {
141
set_bit(XMIT_WAKEUP, &(info->tx_state));
142
return;
143
}
144
145
if (test_and_set_bit(XMIT_SENDING, &(info->tx_state))) {
146
set_bit(XMIT_WAKEUP, &(info->tx_state));
147
return;
148
}
149
150
do {
151
register unsigned int iobase = info->p_dev->resource[0]->start;
152
register struct sk_buff *skb;
153
register int len;
154
155
clear_bit(XMIT_WAKEUP, &(info->tx_state));
156
157
if (!pcmcia_dev_present(info->p_dev))
158
return;
159
160
if (!(skb = skb_dequeue(&(info->txq))))
161
break;
162
163
/* Send frame */
164
len = dtl1_write(iobase, 32, skb->data, skb->len);
165
166
if (len == skb->len) {
167
set_bit(XMIT_WAITING, &(info->tx_state));
168
kfree_skb(skb);
169
} else {
170
skb_pull(skb, len);
171
skb_queue_head(&(info->txq), skb);
172
}
173
174
info->hdev->stat.byte_tx += len;
175
176
} while (test_bit(XMIT_WAKEUP, &(info->tx_state)));
177
178
clear_bit(XMIT_SENDING, &(info->tx_state));
179
}
180
181
182
static void dtl1_control(dtl1_info_t *info, struct sk_buff *skb)
183
{
184
u8 flowmask = *(u8 *)skb->data;
185
int i;
186
187
printk(KERN_INFO "Bluetooth: Nokia control data =");
188
for (i = 0; i < skb->len; i++) {
189
printk(" %02x", skb->data[i]);
190
}
191
printk("\n");
192
193
/* transition to active state */
194
if (((info->flowmask & 0x07) == 0) && ((flowmask & 0x07) != 0)) {
195
clear_bit(XMIT_WAITING, &(info->tx_state));
196
dtl1_write_wakeup(info);
197
}
198
199
info->flowmask = flowmask;
200
201
kfree_skb(skb);
202
}
203
204
205
static void dtl1_receive(dtl1_info_t *info)
206
{
207
unsigned int iobase;
208
nsh_t *nsh;
209
int boguscount = 0;
210
211
if (!info) {
212
BT_ERR("Unknown device");
213
return;
214
}
215
216
iobase = info->p_dev->resource[0]->start;
217
218
do {
219
info->hdev->stat.byte_rx++;
220
221
/* Allocate packet */
222
if (info->rx_skb == NULL)
223
if (!(info->rx_skb = bt_skb_alloc(HCI_MAX_FRAME_SIZE, GFP_ATOMIC))) {
224
BT_ERR("Can't allocate mem for new packet");
225
info->rx_state = RECV_WAIT_NSH;
226
info->rx_count = NSHL;
227
return;
228
}
229
230
*skb_put(info->rx_skb, 1) = inb(iobase + UART_RX);
231
nsh = (nsh_t *)info->rx_skb->data;
232
233
info->rx_count--;
234
235
if (info->rx_count == 0) {
236
237
switch (info->rx_state) {
238
case RECV_WAIT_NSH:
239
info->rx_state = RECV_WAIT_DATA;
240
info->rx_count = nsh->len + (nsh->len & 0x0001);
241
break;
242
case RECV_WAIT_DATA:
243
bt_cb(info->rx_skb)->pkt_type = nsh->type;
244
245
/* remove PAD byte if it exists */
246
if (nsh->len & 0x0001) {
247
info->rx_skb->tail--;
248
info->rx_skb->len--;
249
}
250
251
/* remove NSH */
252
skb_pull(info->rx_skb, NSHL);
253
254
switch (bt_cb(info->rx_skb)->pkt_type) {
255
case 0x80:
256
/* control data for the Nokia Card */
257
dtl1_control(info, info->rx_skb);
258
break;
259
case 0x82:
260
case 0x83:
261
case 0x84:
262
/* send frame to the HCI layer */
263
info->rx_skb->dev = (void *) info->hdev;
264
bt_cb(info->rx_skb)->pkt_type &= 0x0f;
265
hci_recv_frame(info->rx_skb);
266
break;
267
default:
268
/* unknown packet */
269
BT_ERR("Unknown HCI packet with type 0x%02x received", bt_cb(info->rx_skb)->pkt_type);
270
kfree_skb(info->rx_skb);
271
break;
272
}
273
274
info->rx_state = RECV_WAIT_NSH;
275
info->rx_count = NSHL;
276
info->rx_skb = NULL;
277
break;
278
}
279
280
}
281
282
/* Make sure we don't stay here too long */
283
if (boguscount++ > 32)
284
break;
285
286
} while (inb(iobase + UART_LSR) & UART_LSR_DR);
287
}
288
289
290
static irqreturn_t dtl1_interrupt(int irq, void *dev_inst)
291
{
292
dtl1_info_t *info = dev_inst;
293
unsigned int iobase;
294
unsigned char msr;
295
int boguscount = 0;
296
int iir, lsr;
297
irqreturn_t r = IRQ_NONE;
298
299
if (!info || !info->hdev)
300
/* our irq handler is shared */
301
return IRQ_NONE;
302
303
iobase = info->p_dev->resource[0]->start;
304
305
spin_lock(&(info->lock));
306
307
iir = inb(iobase + UART_IIR) & UART_IIR_ID;
308
while (iir) {
309
310
r = IRQ_HANDLED;
311
/* Clear interrupt */
312
lsr = inb(iobase + UART_LSR);
313
314
switch (iir) {
315
case UART_IIR_RLSI:
316
BT_ERR("RLSI");
317
break;
318
case UART_IIR_RDI:
319
/* Receive interrupt */
320
dtl1_receive(info);
321
break;
322
case UART_IIR_THRI:
323
if (lsr & UART_LSR_THRE) {
324
/* Transmitter ready for data */
325
dtl1_write_wakeup(info);
326
}
327
break;
328
default:
329
BT_ERR("Unhandled IIR=%#x", iir);
330
break;
331
}
332
333
/* Make sure we don't stay here too long */
334
if (boguscount++ > 100)
335
break;
336
337
iir = inb(iobase + UART_IIR) & UART_IIR_ID;
338
339
}
340
341
msr = inb(iobase + UART_MSR);
342
343
if (info->ri_latch ^ (msr & UART_MSR_RI)) {
344
info->ri_latch = msr & UART_MSR_RI;
345
clear_bit(XMIT_WAITING, &(info->tx_state));
346
dtl1_write_wakeup(info);
347
r = IRQ_HANDLED;
348
}
349
350
spin_unlock(&(info->lock));
351
352
return r;
353
}
354
355
356
357
/* ======================== HCI interface ======================== */
358
359
360
static int dtl1_hci_open(struct hci_dev *hdev)
361
{
362
set_bit(HCI_RUNNING, &(hdev->flags));
363
364
return 0;
365
}
366
367
368
static int dtl1_hci_flush(struct hci_dev *hdev)
369
{
370
dtl1_info_t *info = (dtl1_info_t *)(hdev->driver_data);
371
372
/* Drop TX queue */
373
skb_queue_purge(&(info->txq));
374
375
return 0;
376
}
377
378
379
static int dtl1_hci_close(struct hci_dev *hdev)
380
{
381
if (!test_and_clear_bit(HCI_RUNNING, &(hdev->flags)))
382
return 0;
383
384
dtl1_hci_flush(hdev);
385
386
return 0;
387
}
388
389
390
static int dtl1_hci_send_frame(struct sk_buff *skb)
391
{
392
dtl1_info_t *info;
393
struct hci_dev *hdev = (struct hci_dev *)(skb->dev);
394
struct sk_buff *s;
395
nsh_t nsh;
396
397
if (!hdev) {
398
BT_ERR("Frame for unknown HCI device (hdev=NULL)");
399
return -ENODEV;
400
}
401
402
info = (dtl1_info_t *)(hdev->driver_data);
403
404
switch (bt_cb(skb)->pkt_type) {
405
case HCI_COMMAND_PKT:
406
hdev->stat.cmd_tx++;
407
nsh.type = 0x81;
408
break;
409
case HCI_ACLDATA_PKT:
410
hdev->stat.acl_tx++;
411
nsh.type = 0x82;
412
break;
413
case HCI_SCODATA_PKT:
414
hdev->stat.sco_tx++;
415
nsh.type = 0x83;
416
break;
417
default:
418
return -EILSEQ;
419
};
420
421
nsh.zero = 0;
422
nsh.len = skb->len;
423
424
s = bt_skb_alloc(NSHL + skb->len + 1, GFP_ATOMIC);
425
if (!s)
426
return -ENOMEM;
427
428
skb_reserve(s, NSHL);
429
skb_copy_from_linear_data(skb, skb_put(s, skb->len), skb->len);
430
if (skb->len & 0x0001)
431
*skb_put(s, 1) = 0; /* PAD */
432
433
/* Prepend skb with Nokia frame header and queue */
434
memcpy(skb_push(s, NSHL), &nsh, NSHL);
435
skb_queue_tail(&(info->txq), s);
436
437
dtl1_write_wakeup(info);
438
439
kfree_skb(skb);
440
441
return 0;
442
}
443
444
445
static void dtl1_hci_destruct(struct hci_dev *hdev)
446
{
447
}
448
449
450
static int dtl1_hci_ioctl(struct hci_dev *hdev, unsigned int cmd, unsigned long arg)
451
{
452
return -ENOIOCTLCMD;
453
}
454
455
456
457
/* ======================== Card services HCI interaction ======================== */
458
459
460
static int dtl1_open(dtl1_info_t *info)
461
{
462
unsigned long flags;
463
unsigned int iobase = info->p_dev->resource[0]->start;
464
struct hci_dev *hdev;
465
466
spin_lock_init(&(info->lock));
467
468
skb_queue_head_init(&(info->txq));
469
470
info->rx_state = RECV_WAIT_NSH;
471
info->rx_count = NSHL;
472
info->rx_skb = NULL;
473
474
set_bit(XMIT_WAITING, &(info->tx_state));
475
476
/* Initialize HCI device */
477
hdev = hci_alloc_dev();
478
if (!hdev) {
479
BT_ERR("Can't allocate HCI device");
480
return -ENOMEM;
481
}
482
483
info->hdev = hdev;
484
485
hdev->bus = HCI_PCCARD;
486
hdev->driver_data = info;
487
SET_HCIDEV_DEV(hdev, &info->p_dev->dev);
488
489
hdev->open = dtl1_hci_open;
490
hdev->close = dtl1_hci_close;
491
hdev->flush = dtl1_hci_flush;
492
hdev->send = dtl1_hci_send_frame;
493
hdev->destruct = dtl1_hci_destruct;
494
hdev->ioctl = dtl1_hci_ioctl;
495
496
hdev->owner = THIS_MODULE;
497
498
spin_lock_irqsave(&(info->lock), flags);
499
500
/* Reset UART */
501
outb(0, iobase + UART_MCR);
502
503
/* Turn off interrupts */
504
outb(0, iobase + UART_IER);
505
506
/* Initialize UART */
507
outb(UART_LCR_WLEN8, iobase + UART_LCR); /* Reset DLAB */
508
outb((UART_MCR_DTR | UART_MCR_RTS | UART_MCR_OUT2), iobase + UART_MCR);
509
510
info->ri_latch = inb(info->p_dev->resource[0]->start + UART_MSR)
511
& UART_MSR_RI;
512
513
/* Turn on interrupts */
514
outb(UART_IER_RLSI | UART_IER_RDI | UART_IER_THRI, iobase + UART_IER);
515
516
spin_unlock_irqrestore(&(info->lock), flags);
517
518
/* Timeout before it is safe to send the first HCI packet */
519
msleep(2000);
520
521
/* Register HCI device */
522
if (hci_register_dev(hdev) < 0) {
523
BT_ERR("Can't register HCI device");
524
info->hdev = NULL;
525
hci_free_dev(hdev);
526
return -ENODEV;
527
}
528
529
return 0;
530
}
531
532
533
static int dtl1_close(dtl1_info_t *info)
534
{
535
unsigned long flags;
536
unsigned int iobase = info->p_dev->resource[0]->start;
537
struct hci_dev *hdev = info->hdev;
538
539
if (!hdev)
540
return -ENODEV;
541
542
dtl1_hci_close(hdev);
543
544
spin_lock_irqsave(&(info->lock), flags);
545
546
/* Reset UART */
547
outb(0, iobase + UART_MCR);
548
549
/* Turn off interrupts */
550
outb(0, iobase + UART_IER);
551
552
spin_unlock_irqrestore(&(info->lock), flags);
553
554
if (hci_unregister_dev(hdev) < 0)
555
BT_ERR("Can't unregister HCI device %s", hdev->name);
556
557
hci_free_dev(hdev);
558
559
return 0;
560
}
561
562
static int dtl1_probe(struct pcmcia_device *link)
563
{
564
dtl1_info_t *info;
565
566
/* Create new info device */
567
info = kzalloc(sizeof(*info), GFP_KERNEL);
568
if (!info)
569
return -ENOMEM;
570
571
info->p_dev = link;
572
link->priv = info;
573
574
link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_IO;
575
576
return dtl1_config(link);
577
}
578
579
580
static void dtl1_detach(struct pcmcia_device *link)
581
{
582
dtl1_info_t *info = link->priv;
583
584
dtl1_release(link);
585
586
kfree(info);
587
}
588
589
static int dtl1_confcheck(struct pcmcia_device *p_dev, void *priv_data)
590
{
591
if ((p_dev->resource[1]->end) || (p_dev->resource[1]->end < 8))
592
return -ENODEV;
593
594
p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
595
p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
596
597
return pcmcia_request_io(p_dev);
598
}
599
600
static int dtl1_config(struct pcmcia_device *link)
601
{
602
dtl1_info_t *info = link->priv;
603
int i;
604
605
/* Look for a generic full-sized window */
606
link->resource[0]->end = 8;
607
if (pcmcia_loop_config(link, dtl1_confcheck, NULL) < 0)
608
goto failed;
609
610
i = pcmcia_request_irq(link, dtl1_interrupt);
611
if (i != 0)
612
goto failed;
613
614
i = pcmcia_enable_device(link);
615
if (i != 0)
616
goto failed;
617
618
if (dtl1_open(info) != 0)
619
goto failed;
620
621
return 0;
622
623
failed:
624
dtl1_release(link);
625
return -ENODEV;
626
}
627
628
629
static void dtl1_release(struct pcmcia_device *link)
630
{
631
dtl1_info_t *info = link->priv;
632
633
dtl1_close(info);
634
635
pcmcia_disable_device(link);
636
}
637
638
639
static const struct pcmcia_device_id dtl1_ids[] = {
640
PCMCIA_DEVICE_PROD_ID12("Nokia Mobile Phones", "DTL-1", 0xe1bfdd64, 0xe168480d),
641
PCMCIA_DEVICE_PROD_ID12("Nokia Mobile Phones", "DTL-4", 0xe1bfdd64, 0x9102bc82),
642
PCMCIA_DEVICE_PROD_ID12("Socket", "CF", 0xb38bcc2e, 0x44ebf863),
643
PCMCIA_DEVICE_PROD_ID12("Socket", "CF+ Personal Network Card", 0xb38bcc2e, 0xe732bae3),
644
PCMCIA_DEVICE_NULL
645
};
646
MODULE_DEVICE_TABLE(pcmcia, dtl1_ids);
647
648
static struct pcmcia_driver dtl1_driver = {
649
.owner = THIS_MODULE,
650
.name = "dtl1_cs",
651
.probe = dtl1_probe,
652
.remove = dtl1_detach,
653
.id_table = dtl1_ids,
654
};
655
656
static int __init init_dtl1_cs(void)
657
{
658
return pcmcia_register_driver(&dtl1_driver);
659
}
660
661
662
static void __exit exit_dtl1_cs(void)
663
{
664
pcmcia_unregister_driver(&dtl1_driver);
665
}
666
667
module_init(init_dtl1_cs);
668
module_exit(exit_dtl1_cs);
669
670