cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

bluecard_cs.c (20201B)


      1/*
      2 *
      3 *  Bluetooth driver for the Anycom BlueCard (LSE039/LSE041)
      4 *
      5 *  Copyright (C) 2001-2002  Marcel Holtmann <marcel@holtmann.org>
      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 *  <dahinds@users.sourceforge.net>.  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/sched.h>
     30#include <linux/delay.h>
     31#include <linux/timer.h>
     32#include <linux/errno.h>
     33#include <linux/ptrace.h>
     34#include <linux/ioport.h>
     35#include <linux/spinlock.h>
     36#include <linux/moduleparam.h>
     37#include <linux/wait.h>
     38
     39#include <linux/skbuff.h>
     40#include <linux/io.h>
     41
     42#include <pcmcia/cistpl.h>
     43#include <pcmcia/ciscode.h>
     44#include <pcmcia/ds.h>
     45#include <pcmcia/cisreg.h>
     46
     47#include <net/bluetooth/bluetooth.h>
     48#include <net/bluetooth/hci_core.h>
     49
     50
     51
     52/* ======================== Module parameters ======================== */
     53
     54
     55MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
     56MODULE_DESCRIPTION("Bluetooth driver for the Anycom BlueCard (LSE039/LSE041)");
     57MODULE_LICENSE("GPL");
     58
     59
     60
     61/* ======================== Local structures ======================== */
     62
     63
     64struct bluecard_info {
     65	struct pcmcia_device *p_dev;
     66
     67	struct hci_dev *hdev;
     68
     69	spinlock_t lock;		/* For serializing operations */
     70	struct timer_list timer;	/* For LED control */
     71
     72	struct sk_buff_head txq;
     73	unsigned long tx_state;
     74
     75	unsigned long rx_state;
     76	unsigned long rx_count;
     77	struct sk_buff *rx_skb;
     78
     79	unsigned char ctrl_reg;
     80	unsigned long hw_state;		/* Status of the hardware and LED control */
     81};
     82
     83
     84static int bluecard_config(struct pcmcia_device *link);
     85static void bluecard_release(struct pcmcia_device *link);
     86
     87static void bluecard_detach(struct pcmcia_device *p_dev);
     88
     89
     90/* Default baud rate: 57600, 115200, 230400 or 460800 */
     91#define DEFAULT_BAUD_RATE  230400
     92
     93
     94/* Hardware states */
     95#define CARD_READY             1
     96#define CARD_ACTIVITY	       2
     97#define CARD_HAS_PCCARD_ID     4
     98#define CARD_HAS_POWER_LED     5
     99#define CARD_HAS_ACTIVITY_LED  6
    100
    101/* Transmit states  */
    102#define XMIT_SENDING         1
    103#define XMIT_WAKEUP          2
    104#define XMIT_BUFFER_NUMBER   5	/* unset = buffer one, set = buffer two */
    105#define XMIT_BUF_ONE_READY   6
    106#define XMIT_BUF_TWO_READY   7
    107#define XMIT_SENDING_READY   8
    108
    109/* Receiver states */
    110#define RECV_WAIT_PACKET_TYPE   0
    111#define RECV_WAIT_EVENT_HEADER  1
    112#define RECV_WAIT_ACL_HEADER    2
    113#define RECV_WAIT_SCO_HEADER    3
    114#define RECV_WAIT_DATA          4
    115
    116/* Special packet types */
    117#define PKT_BAUD_RATE_57600   0x80
    118#define PKT_BAUD_RATE_115200  0x81
    119#define PKT_BAUD_RATE_230400  0x82
    120#define PKT_BAUD_RATE_460800  0x83
    121
    122
    123/* These are the register offsets */
    124#define REG_COMMAND     0x20
    125#define REG_INTERRUPT   0x21
    126#define REG_CONTROL     0x22
    127#define REG_RX_CONTROL  0x24
    128#define REG_CARD_RESET  0x30
    129#define REG_LED_CTRL    0x30
    130
    131/* REG_COMMAND */
    132#define REG_COMMAND_TX_BUF_ONE  0x01
    133#define REG_COMMAND_TX_BUF_TWO  0x02
    134#define REG_COMMAND_RX_BUF_ONE  0x04
    135#define REG_COMMAND_RX_BUF_TWO  0x08
    136#define REG_COMMAND_RX_WIN_ONE  0x00
    137#define REG_COMMAND_RX_WIN_TWO  0x10
    138
    139/* REG_CONTROL */
    140#define REG_CONTROL_BAUD_RATE_57600   0x00
    141#define REG_CONTROL_BAUD_RATE_115200  0x01
    142#define REG_CONTROL_BAUD_RATE_230400  0x02
    143#define REG_CONTROL_BAUD_RATE_460800  0x03
    144#define REG_CONTROL_RTS               0x04
    145#define REG_CONTROL_BT_ON             0x08
    146#define REG_CONTROL_BT_RESET          0x10
    147#define REG_CONTROL_BT_RES_PU         0x20
    148#define REG_CONTROL_INTERRUPT         0x40
    149#define REG_CONTROL_CARD_RESET        0x80
    150
    151/* REG_RX_CONTROL */
    152#define RTS_LEVEL_SHIFT_BITS  0x02
    153
    154
    155
    156/* ======================== LED handling routines ======================== */
    157
    158
    159static void bluecard_activity_led_timeout(struct timer_list *t)
    160{
    161	struct bluecard_info *info = from_timer(info, t, timer);
    162	unsigned int iobase = info->p_dev->resource[0]->start;
    163
    164	if (test_bit(CARD_ACTIVITY, &(info->hw_state))) {
    165		/* leave LED in inactive state for HZ/10 for blink effect */
    166		clear_bit(CARD_ACTIVITY, &(info->hw_state));
    167		mod_timer(&(info->timer), jiffies + HZ / 10);
    168	}
    169
    170	/* Disable activity LED, enable power LED */
    171	outb(0x08 | 0x20, iobase + 0x30);
    172}
    173
    174
    175static void bluecard_enable_activity_led(struct bluecard_info *info)
    176{
    177	unsigned int iobase = info->p_dev->resource[0]->start;
    178
    179	/* don't disturb running blink timer */
    180	if (timer_pending(&(info->timer)))
    181		return;
    182
    183	set_bit(CARD_ACTIVITY, &(info->hw_state));
    184
    185	if (test_bit(CARD_HAS_ACTIVITY_LED, &(info->hw_state))) {
    186		/* Enable activity LED, keep power LED enabled */
    187		outb(0x18 | 0x60, iobase + 0x30);
    188	} else {
    189		/* Disable power LED */
    190		outb(0x00, iobase + 0x30);
    191	}
    192
    193	/* Stop the LED after HZ/10 */
    194	mod_timer(&(info->timer), jiffies + HZ / 10);
    195}
    196
    197
    198
    199/* ======================== Interrupt handling ======================== */
    200
    201
    202static int bluecard_write(unsigned int iobase, unsigned int offset, __u8 *buf, int len)
    203{
    204	int i, actual;
    205
    206	actual = (len > 15) ? 15 : len;
    207
    208	outb_p(actual, iobase + offset);
    209
    210	for (i = 0; i < actual; i++)
    211		outb_p(buf[i], iobase + offset + i + 1);
    212
    213	return actual;
    214}
    215
    216
    217static void bluecard_write_wakeup(struct bluecard_info *info)
    218{
    219	if (!info) {
    220		BT_ERR("Unknown device");
    221		return;
    222	}
    223
    224	if (!test_bit(XMIT_SENDING_READY, &(info->tx_state)))
    225		return;
    226
    227	if (test_and_set_bit(XMIT_SENDING, &(info->tx_state))) {
    228		set_bit(XMIT_WAKEUP, &(info->tx_state));
    229		return;
    230	}
    231
    232	do {
    233		unsigned int iobase = info->p_dev->resource[0]->start;
    234		unsigned int offset;
    235		unsigned char command;
    236		unsigned long ready_bit;
    237		register struct sk_buff *skb;
    238		int len;
    239
    240		clear_bit(XMIT_WAKEUP, &(info->tx_state));
    241
    242		if (!pcmcia_dev_present(info->p_dev))
    243			return;
    244
    245		if (test_bit(XMIT_BUFFER_NUMBER, &(info->tx_state))) {
    246			if (!test_bit(XMIT_BUF_TWO_READY, &(info->tx_state)))
    247				break;
    248			offset = 0x10;
    249			command = REG_COMMAND_TX_BUF_TWO;
    250			ready_bit = XMIT_BUF_TWO_READY;
    251		} else {
    252			if (!test_bit(XMIT_BUF_ONE_READY, &(info->tx_state)))
    253				break;
    254			offset = 0x00;
    255			command = REG_COMMAND_TX_BUF_ONE;
    256			ready_bit = XMIT_BUF_ONE_READY;
    257		}
    258
    259		skb = skb_dequeue(&(info->txq));
    260		if (!skb)
    261			break;
    262
    263		if (hci_skb_pkt_type(skb) & 0x80) {
    264			/* Disable RTS */
    265			info->ctrl_reg |= REG_CONTROL_RTS;
    266			outb(info->ctrl_reg, iobase + REG_CONTROL);
    267		}
    268
    269		/* Activate LED */
    270		bluecard_enable_activity_led(info);
    271
    272		/* Send frame */
    273		len = bluecard_write(iobase, offset, skb->data, skb->len);
    274
    275		/* Tell the FPGA to send the data */
    276		outb_p(command, iobase + REG_COMMAND);
    277
    278		/* Mark the buffer as dirty */
    279		clear_bit(ready_bit, &(info->tx_state));
    280
    281		if (hci_skb_pkt_type(skb) & 0x80) {
    282			DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq);
    283			DEFINE_WAIT(wait);
    284
    285			unsigned char baud_reg;
    286
    287			switch (hci_skb_pkt_type(skb)) {
    288			case PKT_BAUD_RATE_460800:
    289				baud_reg = REG_CONTROL_BAUD_RATE_460800;
    290				break;
    291			case PKT_BAUD_RATE_230400:
    292				baud_reg = REG_CONTROL_BAUD_RATE_230400;
    293				break;
    294			case PKT_BAUD_RATE_115200:
    295				baud_reg = REG_CONTROL_BAUD_RATE_115200;
    296				break;
    297			case PKT_BAUD_RATE_57600:
    298			default:
    299				baud_reg = REG_CONTROL_BAUD_RATE_57600;
    300				break;
    301			}
    302
    303			/* Wait until the command reaches the baseband */
    304			mdelay(100);
    305
    306			/* Set baud on baseband */
    307			info->ctrl_reg &= ~0x03;
    308			info->ctrl_reg |= baud_reg;
    309			outb(info->ctrl_reg, iobase + REG_CONTROL);
    310
    311			/* Enable RTS */
    312			info->ctrl_reg &= ~REG_CONTROL_RTS;
    313			outb(info->ctrl_reg, iobase + REG_CONTROL);
    314
    315			/* Wait before the next HCI packet can be send */
    316			mdelay(1000);
    317		}
    318
    319		if (len == skb->len) {
    320			kfree_skb(skb);
    321		} else {
    322			skb_pull(skb, len);
    323			skb_queue_head(&(info->txq), skb);
    324		}
    325
    326		info->hdev->stat.byte_tx += len;
    327
    328		/* Change buffer */
    329		change_bit(XMIT_BUFFER_NUMBER, &(info->tx_state));
    330
    331	} while (test_bit(XMIT_WAKEUP, &(info->tx_state)));
    332
    333	clear_bit(XMIT_SENDING, &(info->tx_state));
    334}
    335
    336
    337static int bluecard_read(unsigned int iobase, unsigned int offset, __u8 *buf, int size)
    338{
    339	int i, n, len;
    340
    341	outb(REG_COMMAND_RX_WIN_ONE, iobase + REG_COMMAND);
    342
    343	len = inb(iobase + offset);
    344	n = 0;
    345	i = 1;
    346
    347	while (n < len) {
    348
    349		if (i == 16) {
    350			outb(REG_COMMAND_RX_WIN_TWO, iobase + REG_COMMAND);
    351			i = 0;
    352		}
    353
    354		buf[n] = inb(iobase + offset + i);
    355
    356		n++;
    357		i++;
    358
    359	}
    360
    361	return len;
    362}
    363
    364
    365static void bluecard_receive(struct bluecard_info *info,
    366			     unsigned int offset)
    367{
    368	unsigned int iobase;
    369	unsigned char buf[31];
    370	int i, len;
    371
    372	if (!info) {
    373		BT_ERR("Unknown device");
    374		return;
    375	}
    376
    377	iobase = info->p_dev->resource[0]->start;
    378
    379	if (test_bit(XMIT_SENDING_READY, &(info->tx_state)))
    380		bluecard_enable_activity_led(info);
    381
    382	len = bluecard_read(iobase, offset, buf, sizeof(buf));
    383
    384	for (i = 0; i < len; i++) {
    385
    386		/* Allocate packet */
    387		if (!info->rx_skb) {
    388			info->rx_state = RECV_WAIT_PACKET_TYPE;
    389			info->rx_count = 0;
    390			info->rx_skb = bt_skb_alloc(HCI_MAX_FRAME_SIZE, GFP_ATOMIC);
    391			if (!info->rx_skb) {
    392				BT_ERR("Can't allocate mem for new packet");
    393				return;
    394			}
    395		}
    396
    397		if (info->rx_state == RECV_WAIT_PACKET_TYPE) {
    398
    399			hci_skb_pkt_type(info->rx_skb) = buf[i];
    400
    401			switch (hci_skb_pkt_type(info->rx_skb)) {
    402
    403			case 0x00:
    404				/* init packet */
    405				if (offset != 0x00) {
    406					set_bit(XMIT_BUF_ONE_READY, &(info->tx_state));
    407					set_bit(XMIT_BUF_TWO_READY, &(info->tx_state));
    408					set_bit(XMIT_SENDING_READY, &(info->tx_state));
    409					bluecard_write_wakeup(info);
    410				}
    411
    412				kfree_skb(info->rx_skb);
    413				info->rx_skb = NULL;
    414				break;
    415
    416			case HCI_EVENT_PKT:
    417				info->rx_state = RECV_WAIT_EVENT_HEADER;
    418				info->rx_count = HCI_EVENT_HDR_SIZE;
    419				break;
    420
    421			case HCI_ACLDATA_PKT:
    422				info->rx_state = RECV_WAIT_ACL_HEADER;
    423				info->rx_count = HCI_ACL_HDR_SIZE;
    424				break;
    425
    426			case HCI_SCODATA_PKT:
    427				info->rx_state = RECV_WAIT_SCO_HEADER;
    428				info->rx_count = HCI_SCO_HDR_SIZE;
    429				break;
    430
    431			default:
    432				/* unknown packet */
    433				BT_ERR("Unknown HCI packet with type 0x%02x received",
    434				       hci_skb_pkt_type(info->rx_skb));
    435				info->hdev->stat.err_rx++;
    436
    437				kfree_skb(info->rx_skb);
    438				info->rx_skb = NULL;
    439				break;
    440
    441			}
    442
    443		} else {
    444
    445			skb_put_u8(info->rx_skb, buf[i]);
    446			info->rx_count--;
    447
    448			if (info->rx_count == 0) {
    449
    450				int dlen;
    451				struct hci_event_hdr *eh;
    452				struct hci_acl_hdr *ah;
    453				struct hci_sco_hdr *sh;
    454
    455				switch (info->rx_state) {
    456
    457				case RECV_WAIT_EVENT_HEADER:
    458					eh = hci_event_hdr(info->rx_skb);
    459					info->rx_state = RECV_WAIT_DATA;
    460					info->rx_count = eh->plen;
    461					break;
    462
    463				case RECV_WAIT_ACL_HEADER:
    464					ah = hci_acl_hdr(info->rx_skb);
    465					dlen = __le16_to_cpu(ah->dlen);
    466					info->rx_state = RECV_WAIT_DATA;
    467					info->rx_count = dlen;
    468					break;
    469
    470				case RECV_WAIT_SCO_HEADER:
    471					sh = hci_sco_hdr(info->rx_skb);
    472					info->rx_state = RECV_WAIT_DATA;
    473					info->rx_count = sh->dlen;
    474					break;
    475
    476				case RECV_WAIT_DATA:
    477					hci_recv_frame(info->hdev, info->rx_skb);
    478					info->rx_skb = NULL;
    479					break;
    480
    481				}
    482
    483			}
    484
    485		}
    486
    487
    488	}
    489
    490	info->hdev->stat.byte_rx += len;
    491}
    492
    493
    494static irqreturn_t bluecard_interrupt(int irq, void *dev_inst)
    495{
    496	struct bluecard_info *info = dev_inst;
    497	unsigned int iobase;
    498	unsigned char reg;
    499
    500	if (!info || !info->hdev)
    501		/* our irq handler is shared */
    502		return IRQ_NONE;
    503
    504	if (!test_bit(CARD_READY, &(info->hw_state)))
    505		return IRQ_HANDLED;
    506
    507	iobase = info->p_dev->resource[0]->start;
    508
    509	spin_lock(&(info->lock));
    510
    511	/* Disable interrupt */
    512	info->ctrl_reg &= ~REG_CONTROL_INTERRUPT;
    513	outb(info->ctrl_reg, iobase + REG_CONTROL);
    514
    515	reg = inb(iobase + REG_INTERRUPT);
    516
    517	if ((reg != 0x00) && (reg != 0xff)) {
    518
    519		if (reg & 0x04) {
    520			bluecard_receive(info, 0x00);
    521			outb(0x04, iobase + REG_INTERRUPT);
    522			outb(REG_COMMAND_RX_BUF_ONE, iobase + REG_COMMAND);
    523		}
    524
    525		if (reg & 0x08) {
    526			bluecard_receive(info, 0x10);
    527			outb(0x08, iobase + REG_INTERRUPT);
    528			outb(REG_COMMAND_RX_BUF_TWO, iobase + REG_COMMAND);
    529		}
    530
    531		if (reg & 0x01) {
    532			set_bit(XMIT_BUF_ONE_READY, &(info->tx_state));
    533			outb(0x01, iobase + REG_INTERRUPT);
    534			bluecard_write_wakeup(info);
    535		}
    536
    537		if (reg & 0x02) {
    538			set_bit(XMIT_BUF_TWO_READY, &(info->tx_state));
    539			outb(0x02, iobase + REG_INTERRUPT);
    540			bluecard_write_wakeup(info);
    541		}
    542
    543	}
    544
    545	/* Enable interrupt */
    546	info->ctrl_reg |= REG_CONTROL_INTERRUPT;
    547	outb(info->ctrl_reg, iobase + REG_CONTROL);
    548
    549	spin_unlock(&(info->lock));
    550
    551	return IRQ_HANDLED;
    552}
    553
    554
    555
    556/* ======================== Device specific HCI commands ======================== */
    557
    558
    559static int bluecard_hci_set_baud_rate(struct hci_dev *hdev, int baud)
    560{
    561	struct bluecard_info *info = hci_get_drvdata(hdev);
    562	struct sk_buff *skb;
    563
    564	/* Ericsson baud rate command */
    565	unsigned char cmd[] = { HCI_COMMAND_PKT, 0x09, 0xfc, 0x01, 0x03 };
    566
    567	skb = bt_skb_alloc(HCI_MAX_FRAME_SIZE, GFP_KERNEL);
    568	if (!skb) {
    569		BT_ERR("Can't allocate mem for new packet");
    570		return -1;
    571	}
    572
    573	switch (baud) {
    574	case 460800:
    575		cmd[4] = 0x00;
    576		hci_skb_pkt_type(skb) = PKT_BAUD_RATE_460800;
    577		break;
    578	case 230400:
    579		cmd[4] = 0x01;
    580		hci_skb_pkt_type(skb) = PKT_BAUD_RATE_230400;
    581		break;
    582	case 115200:
    583		cmd[4] = 0x02;
    584		hci_skb_pkt_type(skb) = PKT_BAUD_RATE_115200;
    585		break;
    586	case 57600:
    587	default:
    588		cmd[4] = 0x03;
    589		hci_skb_pkt_type(skb) = PKT_BAUD_RATE_57600;
    590		break;
    591	}
    592
    593	skb_put_data(skb, cmd, sizeof(cmd));
    594
    595	skb_queue_tail(&(info->txq), skb);
    596
    597	bluecard_write_wakeup(info);
    598
    599	return 0;
    600}
    601
    602
    603
    604/* ======================== HCI interface ======================== */
    605
    606
    607static int bluecard_hci_flush(struct hci_dev *hdev)
    608{
    609	struct bluecard_info *info = hci_get_drvdata(hdev);
    610
    611	/* Drop TX queue */
    612	skb_queue_purge(&(info->txq));
    613
    614	return 0;
    615}
    616
    617
    618static int bluecard_hci_open(struct hci_dev *hdev)
    619{
    620	struct bluecard_info *info = hci_get_drvdata(hdev);
    621	unsigned int iobase = info->p_dev->resource[0]->start;
    622
    623	if (test_bit(CARD_HAS_PCCARD_ID, &(info->hw_state)))
    624		bluecard_hci_set_baud_rate(hdev, DEFAULT_BAUD_RATE);
    625
    626	/* Enable power LED */
    627	outb(0x08 | 0x20, iobase + 0x30);
    628
    629	return 0;
    630}
    631
    632
    633static int bluecard_hci_close(struct hci_dev *hdev)
    634{
    635	struct bluecard_info *info = hci_get_drvdata(hdev);
    636	unsigned int iobase = info->p_dev->resource[0]->start;
    637
    638	bluecard_hci_flush(hdev);
    639
    640	/* Stop LED timer */
    641	del_timer_sync(&(info->timer));
    642
    643	/* Disable power LED */
    644	outb(0x00, iobase + 0x30);
    645
    646	return 0;
    647}
    648
    649
    650static int bluecard_hci_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
    651{
    652	struct bluecard_info *info = hci_get_drvdata(hdev);
    653
    654	switch (hci_skb_pkt_type(skb)) {
    655	case HCI_COMMAND_PKT:
    656		hdev->stat.cmd_tx++;
    657		break;
    658	case HCI_ACLDATA_PKT:
    659		hdev->stat.acl_tx++;
    660		break;
    661	case HCI_SCODATA_PKT:
    662		hdev->stat.sco_tx++;
    663		break;
    664	}
    665
    666	/* Prepend skb with frame type */
    667	memcpy(skb_push(skb, 1), &hci_skb_pkt_type(skb), 1);
    668	skb_queue_tail(&(info->txq), skb);
    669
    670	bluecard_write_wakeup(info);
    671
    672	return 0;
    673}
    674
    675
    676
    677/* ======================== Card services HCI interaction ======================== */
    678
    679
    680static int bluecard_open(struct bluecard_info *info)
    681{
    682	unsigned int iobase = info->p_dev->resource[0]->start;
    683	struct hci_dev *hdev;
    684	unsigned char id;
    685
    686	spin_lock_init(&(info->lock));
    687
    688	timer_setup(&info->timer, bluecard_activity_led_timeout, 0);
    689
    690	skb_queue_head_init(&(info->txq));
    691
    692	info->rx_state = RECV_WAIT_PACKET_TYPE;
    693	info->rx_count = 0;
    694	info->rx_skb = NULL;
    695
    696	/* Initialize HCI device */
    697	hdev = hci_alloc_dev();
    698	if (!hdev) {
    699		BT_ERR("Can't allocate HCI device");
    700		return -ENOMEM;
    701	}
    702
    703	info->hdev = hdev;
    704
    705	hdev->bus = HCI_PCCARD;
    706	hci_set_drvdata(hdev, info);
    707	SET_HCIDEV_DEV(hdev, &info->p_dev->dev);
    708
    709	hdev->open  = bluecard_hci_open;
    710	hdev->close = bluecard_hci_close;
    711	hdev->flush = bluecard_hci_flush;
    712	hdev->send  = bluecard_hci_send_frame;
    713
    714	id = inb(iobase + 0x30);
    715
    716	if ((id & 0x0f) == 0x02)
    717		set_bit(CARD_HAS_PCCARD_ID, &(info->hw_state));
    718
    719	if (id & 0x10)
    720		set_bit(CARD_HAS_POWER_LED, &(info->hw_state));
    721
    722	if (id & 0x20)
    723		set_bit(CARD_HAS_ACTIVITY_LED, &(info->hw_state));
    724
    725	/* Reset card */
    726	info->ctrl_reg = REG_CONTROL_BT_RESET | REG_CONTROL_CARD_RESET;
    727	outb(info->ctrl_reg, iobase + REG_CONTROL);
    728
    729	/* Turn FPGA off */
    730	outb(0x80, iobase + 0x30);
    731
    732	/* Wait some time */
    733	msleep(10);
    734
    735	/* Turn FPGA on */
    736	outb(0x00, iobase + 0x30);
    737
    738	/* Activate card */
    739	info->ctrl_reg = REG_CONTROL_BT_ON | REG_CONTROL_BT_RES_PU;
    740	outb(info->ctrl_reg, iobase + REG_CONTROL);
    741
    742	/* Enable interrupt */
    743	outb(0xff, iobase + REG_INTERRUPT);
    744	info->ctrl_reg |= REG_CONTROL_INTERRUPT;
    745	outb(info->ctrl_reg, iobase + REG_CONTROL);
    746
    747	if ((id & 0x0f) == 0x03) {
    748		/* Disable RTS */
    749		info->ctrl_reg |= REG_CONTROL_RTS;
    750		outb(info->ctrl_reg, iobase + REG_CONTROL);
    751
    752		/* Set baud rate */
    753		info->ctrl_reg |= 0x03;
    754		outb(info->ctrl_reg, iobase + REG_CONTROL);
    755
    756		/* Enable RTS */
    757		info->ctrl_reg &= ~REG_CONTROL_RTS;
    758		outb(info->ctrl_reg, iobase + REG_CONTROL);
    759
    760		set_bit(XMIT_BUF_ONE_READY, &(info->tx_state));
    761		set_bit(XMIT_BUF_TWO_READY, &(info->tx_state));
    762		set_bit(XMIT_SENDING_READY, &(info->tx_state));
    763	}
    764
    765	/* Start the RX buffers */
    766	outb(REG_COMMAND_RX_BUF_ONE, iobase + REG_COMMAND);
    767	outb(REG_COMMAND_RX_BUF_TWO, iobase + REG_COMMAND);
    768
    769	/* Signal that the hardware is ready */
    770	set_bit(CARD_READY, &(info->hw_state));
    771
    772	/* Drop TX queue */
    773	skb_queue_purge(&(info->txq));
    774
    775	/* Control the point at which RTS is enabled */
    776	outb((0x0f << RTS_LEVEL_SHIFT_BITS) | 1, iobase + REG_RX_CONTROL);
    777
    778	/* Timeout before it is safe to send the first HCI packet */
    779	msleep(1250);
    780
    781	/* Register HCI device */
    782	if (hci_register_dev(hdev) < 0) {
    783		BT_ERR("Can't register HCI device");
    784		info->hdev = NULL;
    785		hci_free_dev(hdev);
    786		return -ENODEV;
    787	}
    788
    789	return 0;
    790}
    791
    792
    793static int bluecard_close(struct bluecard_info *info)
    794{
    795	unsigned int iobase = info->p_dev->resource[0]->start;
    796	struct hci_dev *hdev = info->hdev;
    797
    798	if (!hdev)
    799		return -ENODEV;
    800
    801	bluecard_hci_close(hdev);
    802
    803	clear_bit(CARD_READY, &(info->hw_state));
    804
    805	/* Reset card */
    806	info->ctrl_reg = REG_CONTROL_BT_RESET | REG_CONTROL_CARD_RESET;
    807	outb(info->ctrl_reg, iobase + REG_CONTROL);
    808
    809	/* Turn FPGA off */
    810	outb(0x80, iobase + 0x30);
    811
    812	hci_unregister_dev(hdev);
    813	hci_free_dev(hdev);
    814
    815	return 0;
    816}
    817
    818static int bluecard_probe(struct pcmcia_device *link)
    819{
    820	struct bluecard_info *info;
    821
    822	/* Create new info device */
    823	info = devm_kzalloc(&link->dev, sizeof(*info), GFP_KERNEL);
    824	if (!info)
    825		return -ENOMEM;
    826
    827	info->p_dev = link;
    828	link->priv = info;
    829
    830	link->config_flags |= CONF_ENABLE_IRQ;
    831
    832	return bluecard_config(link);
    833}
    834
    835
    836static void bluecard_detach(struct pcmcia_device *link)
    837{
    838	bluecard_release(link);
    839}
    840
    841
    842static int bluecard_config(struct pcmcia_device *link)
    843{
    844	struct bluecard_info *info = link->priv;
    845	int i, n;
    846
    847	link->config_index = 0x20;
    848
    849	link->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
    850	link->resource[0]->end = 64;
    851	link->io_lines = 6;
    852
    853	for (n = 0; n < 0x400; n += 0x40) {
    854		link->resource[0]->start = n ^ 0x300;
    855		i = pcmcia_request_io(link);
    856		if (i == 0)
    857			break;
    858	}
    859
    860	if (i != 0)
    861		goto failed;
    862
    863	i = pcmcia_request_irq(link, bluecard_interrupt);
    864	if (i != 0)
    865		goto failed;
    866
    867	i = pcmcia_enable_device(link);
    868	if (i != 0)
    869		goto failed;
    870
    871	if (bluecard_open(info) != 0)
    872		goto failed;
    873
    874	return 0;
    875
    876failed:
    877	bluecard_release(link);
    878	return -ENODEV;
    879}
    880
    881
    882static void bluecard_release(struct pcmcia_device *link)
    883{
    884	struct bluecard_info *info = link->priv;
    885
    886	bluecard_close(info);
    887
    888	del_timer_sync(&(info->timer));
    889
    890	pcmcia_disable_device(link);
    891}
    892
    893static const struct pcmcia_device_id bluecard_ids[] = {
    894	PCMCIA_DEVICE_PROD_ID12("BlueCard", "LSE041", 0xbaf16fbf, 0x657cc15e),
    895	PCMCIA_DEVICE_PROD_ID12("BTCFCARD", "LSE139", 0xe3987764, 0x2524b59c),
    896	PCMCIA_DEVICE_PROD_ID12("WSS", "LSE039", 0x0a0736ec, 0x24e6dfab),
    897	PCMCIA_DEVICE_NULL
    898};
    899MODULE_DEVICE_TABLE(pcmcia, bluecard_ids);
    900
    901static struct pcmcia_driver bluecard_driver = {
    902	.owner		= THIS_MODULE,
    903	.name		= "bluecard_cs",
    904	.probe		= bluecard_probe,
    905	.remove		= bluecard_detach,
    906	.id_table	= bluecard_ids,
    907};
    908module_pcmcia_driver(bluecard_driver);