bt3c_cs.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:20k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  *
  3.  *  Driver for the 3Com Bluetooth PCMCIA card
  4.  *
  5.  *  Copyright (C) 2001-2002  Marcel Holtmann <marcel@holtmann.org>
  6.  *                           Jose Orlando Pereira <jop@di.uminho.pt>
  7.  *
  8.  *
  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;
  12.  *
  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.
  17.  *
  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.
  21.  *
  22.  */
  23. #include <linux/config.h>
  24. #include <linux/module.h>
  25. #define __KERNEL_SYSCALLS__
  26. #include <linux/kernel.h>
  27. #include <linux/kmod.h>
  28. #include <linux/init.h>
  29. #include <linux/slab.h>
  30. #include <linux/types.h>
  31. #include <linux/sched.h>
  32. #include <linux/delay.h>
  33. #include <linux/timer.h>
  34. #include <linux/errno.h>
  35. #include <linux/unistd.h>
  36. #include <linux/ptrace.h>
  37. #include <linux/ioport.h>
  38. #include <linux/spinlock.h>
  39. #include <linux/skbuff.h>
  40. #include <linux/string.h>
  41. #include <linux/serial.h>
  42. #include <linux/serial_reg.h>
  43. #include <asm/system.h>
  44. #include <asm/bitops.h>
  45. #include <asm/io.h>
  46. #include <pcmcia/version.h>
  47. #include <pcmcia/cs_types.h>
  48. #include <pcmcia/cs.h>
  49. #include <pcmcia/cistpl.h>
  50. #include <pcmcia/ciscode.h>
  51. #include <pcmcia/ds.h>
  52. #include <pcmcia/cisreg.h>
  53. #include <net/bluetooth/bluetooth.h>
  54. #include <net/bluetooth/hci_core.h>
  55. /* ======================== Module parameters ======================== */
  56. /* Bit map of interrupts to choose from */
  57. static u_int irq_mask = 0xffff;
  58. static int irq_list[4] = { -1 };
  59. MODULE_PARM(irq_mask, "i");
  60. MODULE_PARM(irq_list, "1-4i");
  61. MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>, Jose Orlando Pereira <jop@di.uminho.pt>");
  62. MODULE_DESCRIPTION("BlueZ driver for the 3Com Bluetooth PCMCIA card");
  63. MODULE_LICENSE("GPL");
  64. /* ======================== Local structures ======================== */
  65. typedef struct bt3c_info_t {
  66. dev_link_t link;
  67. dev_node_t node;
  68. struct hci_dev hdev;
  69. spinlock_t lock; /* For serializing operations */
  70. struct sk_buff_head txq;
  71. unsigned long tx_state;
  72. unsigned long rx_state;
  73. unsigned long rx_count;
  74. struct sk_buff *rx_skb;
  75. } bt3c_info_t;
  76. void bt3c_config(dev_link_t *link);
  77. void bt3c_release(u_long arg);
  78. int bt3c_event(event_t event, int priority, event_callback_args_t *args);
  79. static dev_info_t dev_info = "bt3c_cs";
  80. dev_link_t *bt3c_attach(void);
  81. void bt3c_detach(dev_link_t *);
  82. static dev_link_t *dev_list = NULL;
  83. /* Transmit states  */
  84. #define XMIT_SENDING  1
  85. #define XMIT_WAKEUP   2
  86. #define XMIT_WAITING  8
  87. /* Receiver states */
  88. #define RECV_WAIT_PACKET_TYPE   0
  89. #define RECV_WAIT_EVENT_HEADER  1
  90. #define RECV_WAIT_ACL_HEADER    2
  91. #define RECV_WAIT_SCO_HEADER    3
  92. #define RECV_WAIT_DATA          4
  93. /* ======================== Special I/O functions ======================== */
  94. #define DATA_L   0
  95. #define DATA_H   1
  96. #define ADDR_L   2
  97. #define ADDR_H   3
  98. #define CONTROL  4
  99. inline void bt3c_address(unsigned int iobase, unsigned short addr)
  100. {
  101. outb(addr & 0xff, iobase + ADDR_L);
  102. outb((addr >> 8) & 0xff, iobase + ADDR_H);
  103. }
  104. inline void bt3c_put(unsigned int iobase, unsigned short value)
  105. {
  106. outb(value & 0xff, iobase + DATA_L);
  107. outb((value >> 8) & 0xff, iobase + DATA_H);
  108. }
  109. inline void bt3c_io_write(unsigned int iobase, unsigned short addr, unsigned short value)
  110. {
  111. bt3c_address(iobase, addr);
  112. bt3c_put(iobase, value);
  113. }
  114. inline unsigned short bt3c_get(unsigned int iobase)
  115. {
  116. unsigned short value = inb(iobase + DATA_L);
  117. value |= inb(iobase + DATA_H) << 8;
  118. return value;
  119. }
  120. inline unsigned short bt3c_read(unsigned int iobase, unsigned short addr)
  121. {
  122. bt3c_address(iobase, addr);
  123. return bt3c_get(iobase);
  124. }
  125. /* ======================== Interrupt handling ======================== */
  126. static int bt3c_write(unsigned int iobase, int fifo_size, __u8 *buf, int len)
  127. {
  128. int actual = 0;
  129. bt3c_address(iobase, 0x7080);
  130. /* Fill FIFO with current frame */
  131. while (actual < len) {
  132. /* Transmit next byte */
  133. bt3c_put(iobase, buf[actual]);
  134. actual++;
  135. }
  136. bt3c_io_write(iobase, 0x7005, actual);
  137. return actual;
  138. }
  139. static void bt3c_write_wakeup(bt3c_info_t *info, int from)
  140. {
  141. unsigned long flags;
  142. if (!info) {
  143. printk(KERN_WARNING "bt3c_cs: Call of write_wakeup for unknown device.n");
  144. return;
  145. }
  146. if (test_and_set_bit(XMIT_SENDING, &(info->tx_state)))
  147. return;
  148. spin_lock_irqsave(&(info->lock), flags);
  149. do {
  150. register unsigned int iobase = info->link.io.BasePort1;
  151. register struct sk_buff *skb;
  152. register int len;
  153. if (!(info->link.state & DEV_PRESENT))
  154. break;
  155. if (!(skb = skb_dequeue(&(info->txq)))) {
  156. clear_bit(XMIT_SENDING, &(info->tx_state));
  157. break;
  158. }
  159. /* Send frame */
  160. len = bt3c_write(iobase, 256, skb->data, skb->len);
  161. if (len != skb->len) {
  162. printk(KERN_WARNING "bt3c_cs: very strangen");
  163. }
  164. kfree_skb(skb);
  165. info->hdev.stat.byte_tx += len;
  166. } while (0);
  167. spin_unlock_irqrestore(&(info->lock), flags);
  168. }
  169. static void bt3c_receive(bt3c_info_t *info)
  170. {
  171. unsigned int iobase;
  172. int size = 0, avail;
  173. if (!info) {
  174. printk(KERN_WARNING "bt3c_cs: Call of receive for unknown device.n");
  175. return;
  176. }
  177. iobase = info->link.io.BasePort1;
  178. avail = bt3c_read(iobase, 0x7006);
  179. //printk("bt3c_cs: receiving %d bytesn", avail);
  180. bt3c_address(iobase, 0x7480);
  181. while (size < avail) {
  182. size++;
  183. info->hdev.stat.byte_rx++;
  184. /* Allocate packet */
  185. if (info->rx_skb == NULL) {
  186. info->rx_state = RECV_WAIT_PACKET_TYPE;
  187. info->rx_count = 0;
  188. if (!(info->rx_skb = bluez_skb_alloc(HCI_MAX_FRAME_SIZE, GFP_ATOMIC))) {
  189. printk(KERN_WARNING "bt3c_cs: Can't allocate mem for new packet.n");
  190. return;
  191. }
  192. }
  193. if (info->rx_state == RECV_WAIT_PACKET_TYPE) {
  194. info->rx_skb->dev = (void *)&(info->hdev);
  195. info->rx_skb->pkt_type = inb(iobase + DATA_L);
  196. inb(iobase + DATA_H);
  197. //printk("bt3c: PACKET_TYPE=%02xn", info->rx_skb->pkt_type);
  198. switch (info->rx_skb->pkt_type) {
  199. case HCI_EVENT_PKT:
  200. info->rx_state = RECV_WAIT_EVENT_HEADER;
  201. info->rx_count = HCI_EVENT_HDR_SIZE;
  202. break;
  203. case HCI_ACLDATA_PKT:
  204. info->rx_state = RECV_WAIT_ACL_HEADER;
  205. info->rx_count = HCI_ACL_HDR_SIZE;
  206. break;
  207. case HCI_SCODATA_PKT:
  208. info->rx_state = RECV_WAIT_SCO_HEADER;
  209. info->rx_count = HCI_SCO_HDR_SIZE;
  210. break;
  211. default:
  212. /* Unknown packet */
  213. printk(KERN_WARNING "bt3c_cs: Unknown HCI packet with type 0x%02x received.n", info->rx_skb->pkt_type);
  214. info->hdev.stat.err_rx++;
  215. clear_bit(HCI_RUNNING, &(info->hdev.flags));
  216. kfree_skb(info->rx_skb);
  217. info->rx_skb = NULL;
  218. break;
  219. }
  220. } else {
  221. __u8 x = inb(iobase + DATA_L);
  222. *skb_put(info->rx_skb, 1) = x;
  223. inb(iobase + DATA_H);
  224. info->rx_count--;
  225. if (info->rx_count == 0) {
  226. int dlen;
  227. hci_event_hdr *eh;
  228. hci_acl_hdr *ah;
  229. hci_sco_hdr *sh;
  230. switch (info->rx_state) {
  231. case RECV_WAIT_EVENT_HEADER:
  232. eh = (hci_event_hdr *)(info->rx_skb->data);
  233. info->rx_state = RECV_WAIT_DATA;
  234. info->rx_count = eh->plen;
  235. break;
  236. case RECV_WAIT_ACL_HEADER:
  237. ah = (hci_acl_hdr *)(info->rx_skb->data);
  238. dlen = __le16_to_cpu(ah->dlen);
  239. info->rx_state = RECV_WAIT_DATA;
  240. info->rx_count = dlen;
  241. break;
  242. case RECV_WAIT_SCO_HEADER:
  243. sh = (hci_sco_hdr *)(info->rx_skb->data);
  244. info->rx_state = RECV_WAIT_DATA;
  245. info->rx_count = sh->dlen;
  246. break;
  247. case RECV_WAIT_DATA:
  248. hci_recv_frame(info->rx_skb);
  249. info->rx_skb = NULL;
  250. break;
  251. }
  252. }
  253. }
  254. }
  255. bt3c_io_write(iobase, 0x7006, 0x0000);
  256. }
  257. void bt3c_interrupt(int irq, void *dev_inst, struct pt_regs *regs)
  258. {
  259. bt3c_info_t *info = dev_inst;
  260. unsigned int iobase;
  261. int iir;
  262. if (!info) {
  263. printk(KERN_WARNING "bt3c_cs: Call of irq %d for unknown device.n", irq);
  264. return;
  265. }
  266. iobase = info->link.io.BasePort1;
  267. spin_lock(&(info->lock));
  268. iir = inb(iobase + CONTROL);
  269. if (iir & 0x80) {
  270. int stat = bt3c_read(iobase, 0x7001);
  271. if ((stat & 0xff) == 0x7f) {
  272. printk(KERN_WARNING "bt3c_cs: STRANGE stat=%04xn", stat);
  273. } else if ((stat & 0xff) != 0xff) {
  274. if (stat & 0x0020) {
  275. int stat = bt3c_read(iobase, 0x7002) & 0x10;
  276. printk(KERN_WARNING "bt3c_cs: antena %sn", stat ? "OUT" : "IN");
  277. }
  278. if (stat & 0x0001)
  279. bt3c_receive(info);
  280. if (stat & 0x0002) {
  281. //printk("bt3c_cs: ACK %04xn", stat);
  282. clear_bit(XMIT_SENDING, &(info->tx_state));
  283. bt3c_write_wakeup(info, 1);
  284. }
  285. bt3c_io_write(iobase, 0x7001, 0x0000);
  286. outb(iir, iobase + CONTROL);
  287. }
  288. }
  289. spin_unlock(&(info->lock));
  290. }
  291. /* ======================== HCI interface ======================== */
  292. static int bt3c_hci_flush(struct hci_dev *hdev)
  293. {
  294. bt3c_info_t *info = (bt3c_info_t *)(hdev->driver_data);
  295. /* Drop TX queue */
  296. skb_queue_purge(&(info->txq));
  297. return 0;
  298. }
  299. static int bt3c_hci_open(struct hci_dev *hdev)
  300. {
  301. set_bit(HCI_RUNNING, &(hdev->flags));
  302. return 0;
  303. }
  304. static int bt3c_hci_close(struct hci_dev *hdev)
  305. {
  306. if (!test_and_clear_bit(HCI_RUNNING, &(hdev->flags)))
  307. return 0;
  308. bt3c_hci_flush(hdev);
  309. return 0;
  310. }
  311. static int bt3c_hci_send_frame(struct sk_buff *skb)
  312. {
  313. bt3c_info_t *info;
  314. struct hci_dev *hdev = (struct hci_dev *)(skb->dev);
  315. if (!hdev) {
  316. printk(KERN_WARNING "bt3c_cs: Frame for unknown HCI device (hdev=NULL).");
  317. return -ENODEV;
  318. }
  319. info = (bt3c_info_t *) (hdev->driver_data);
  320. switch (skb->pkt_type) {
  321. case HCI_COMMAND_PKT:
  322. hdev->stat.cmd_tx++;
  323. break;
  324. case HCI_ACLDATA_PKT:
  325. hdev->stat.acl_tx++;
  326. break;
  327. case HCI_SCODATA_PKT:
  328. hdev->stat.sco_tx++;
  329. break;
  330. };
  331. /* Prepend skb with frame type */
  332. memcpy(skb_push(skb, 1), &(skb->pkt_type), 1);
  333. skb_queue_tail(&(info->txq), skb);
  334. bt3c_write_wakeup(info, 0);
  335. return 0;
  336. }
  337. static void bt3c_hci_destruct(struct hci_dev *hdev)
  338. {
  339. }
  340. static int bt3c_hci_ioctl(struct hci_dev *hdev, unsigned int cmd, unsigned long arg)
  341. {
  342. return -ENOIOCTLCMD;
  343. }
  344. /* ======================== User mode firmware loader ======================== */
  345. #define FW_LOADER  "/sbin/bluefw"
  346. static int errno;
  347. static int bt3c_fw_loader_exec(void *dev)
  348. {
  349. char *argv[] = { FW_LOADER, "pccard", dev, NULL };
  350. char *envp[] = { "HOME=/", "TERM=linux", "PATH=/sbin:/usr/sbin:/bin:/usr/bin", NULL };
  351. int err;
  352. err = exec_usermodehelper(FW_LOADER, argv, envp);
  353. if (err)
  354. printk(KERN_WARNING "bt3c_cs: Failed to exec "%s pccard %s".n", FW_LOADER, (char *)dev);
  355. return err;
  356. }
  357. static int bt3c_firmware_load(bt3c_info_t *info)
  358. {
  359. sigset_t tmpsig;
  360. char dev[16];
  361. pid_t pid;
  362. int result;
  363. /* Check if root fs is mounted */
  364. if (!current->fs->root) {
  365. printk(KERN_WARNING "bt3c_cs: Root filesystem is not mounted.n");
  366. return -EPERM;
  367. }
  368. sprintf(dev, "%04x", info->link.io.BasePort1);
  369. pid = kernel_thread(bt3c_fw_loader_exec, (void *)dev, 0);
  370. if (pid < 0) {
  371. printk(KERN_WARNING "bt3c_cs: Forking of kernel thread failed (errno=%d).n", -pid);
  372. return pid;
  373. }
  374. /* Block signals, everything but SIGKILL/SIGSTOP */
  375. spin_lock_irq(&current->sigmask_lock);
  376. tmpsig = current->blocked;
  377. siginitsetinv(&current->blocked, sigmask(SIGKILL) | sigmask(SIGSTOP));
  378. recalc_sigpending(current);
  379. spin_unlock_irq(&current->sigmask_lock);
  380. result = waitpid(pid, NULL, __WCLONE);
  381. /* Allow signals again */
  382. spin_lock_irq(&current->sigmask_lock);
  383. current->blocked = tmpsig;
  384. recalc_sigpending(current);
  385. spin_unlock_irq(&current->sigmask_lock);
  386. if (result != pid) {
  387. printk(KERN_WARNING "bt3c_cs: Waiting for pid %d failed (errno=%d).n", pid, -result);
  388. return -result;
  389. }
  390. return 0;
  391. }
  392. /* ======================== Card services HCI interaction ======================== */
  393. int bt3c_open(bt3c_info_t *info)
  394. {
  395. struct hci_dev *hdev;
  396. int err;
  397. spin_lock_init(&(info->lock));
  398. skb_queue_head_init(&(info->txq));
  399. info->rx_state = RECV_WAIT_PACKET_TYPE;
  400. info->rx_count = 0;
  401. info->rx_skb = NULL;
  402. /* Load firmware */
  403. if ((err = bt3c_firmware_load(info)) < 0)
  404. return err;
  405. /* Timeout before it is safe to send the first HCI packet */
  406. set_current_state(TASK_INTERRUPTIBLE);
  407. schedule_timeout(HZ);
  408. /* Initialize and register HCI device */
  409. hdev = &(info->hdev);
  410. hdev->type = HCI_PCCARD;
  411. hdev->driver_data = info;
  412. hdev->open = bt3c_hci_open;
  413. hdev->close = bt3c_hci_close;
  414. hdev->flush = bt3c_hci_flush;
  415. hdev->send = bt3c_hci_send_frame;
  416. hdev->destruct = bt3c_hci_destruct;
  417. hdev->ioctl = bt3c_hci_ioctl;
  418. if (hci_register_dev(hdev) < 0) {
  419. printk(KERN_WARNING "bt3c_cs: Can't register HCI device %s.n", hdev->name);
  420. return -ENODEV;
  421. }
  422. return 0;
  423. }
  424. int bt3c_close(bt3c_info_t *info)
  425. {
  426. struct hci_dev *hdev = &(info->hdev);
  427. bt3c_hci_close(hdev);
  428. if (hci_unregister_dev(hdev) < 0)
  429. printk(KERN_WARNING "bt3c_cs: Can't unregister HCI device %s.n", hdev->name);
  430. return 0;
  431. }
  432. /* ======================== Card services ======================== */
  433. static void cs_error(client_handle_t handle, int func, int ret)
  434. {
  435. error_info_t err = { func, ret };
  436. CardServices(ReportError, handle, &err);
  437. }
  438. dev_link_t *bt3c_attach(void)
  439. {
  440. bt3c_info_t *info;
  441. client_reg_t client_reg;
  442. dev_link_t *link;
  443. int i, ret;
  444. /* Create new info device */
  445. info = kmalloc(sizeof(*info), GFP_KERNEL);
  446. if (!info)
  447. return NULL;
  448. memset(info, 0, sizeof(*info));
  449. link = &info->link;
  450. link->priv = info;
  451. link->release.function = &bt3c_release;
  452. link->release.data = (u_long)link;
  453. link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
  454. link->io.NumPorts1 = 8;
  455. link->irq.Attributes = IRQ_TYPE_EXCLUSIVE | IRQ_HANDLE_PRESENT;
  456. link->irq.IRQInfo1 = IRQ_INFO2_VALID | IRQ_LEVEL_ID;
  457. if (irq_list[0] == -1)
  458. link->irq.IRQInfo2 = irq_mask;
  459. else
  460. for (i = 0; i < 4; i++)
  461. link->irq.IRQInfo2 |= 1 << irq_list[i];
  462. link->irq.Handler = bt3c_interrupt;
  463. link->irq.Instance = info;
  464. link->conf.Attributes = CONF_ENABLE_IRQ;
  465. link->conf.Vcc = 50;
  466. link->conf.IntType = INT_MEMORY_AND_IO;
  467. /* Register with Card Services */
  468. link->next = dev_list;
  469. dev_list = link;
  470. client_reg.dev_info = &dev_info;
  471. client_reg.Attributes = INFO_IO_CLIENT | INFO_CARD_SHARE;
  472. client_reg.EventMask =
  473.     CS_EVENT_CARD_INSERTION | CS_EVENT_CARD_REMOVAL |
  474.     CS_EVENT_RESET_PHYSICAL | CS_EVENT_CARD_RESET |
  475.     CS_EVENT_PM_SUSPEND | CS_EVENT_PM_RESUME;
  476. client_reg.event_handler = &bt3c_event;
  477. client_reg.Version = 0x0210;
  478. client_reg.event_callback_args.client_data = link;
  479. ret = CardServices(RegisterClient, &link->handle, &client_reg);
  480. if (ret != CS_SUCCESS) {
  481. cs_error(link->handle, RegisterClient, ret);
  482. bt3c_detach(link);
  483. return NULL;
  484. }
  485. return link;
  486. }
  487. void bt3c_detach(dev_link_t *link)
  488. {
  489. bt3c_info_t *info = link->priv;
  490. dev_link_t **linkp;
  491. int ret;
  492. /* Locate device structure */
  493. for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next)
  494. if (*linkp == link)
  495. break;
  496. if (*linkp == NULL)
  497. return;
  498. del_timer(&link->release);
  499. if (link->state & DEV_CONFIG)
  500. bt3c_release((u_long)link);
  501. if (link->handle) {
  502. ret = CardServices(DeregisterClient, link->handle);
  503. if (ret != CS_SUCCESS)
  504. cs_error(link->handle, DeregisterClient, ret);
  505. }
  506. /* Unlink device structure, free bits */
  507. *linkp = link->next;
  508. kfree(info);
  509. }
  510. static int get_tuple(int fn, client_handle_t handle, tuple_t *tuple, cisparse_t *parse)
  511. {
  512. int i;
  513. i = CardServices(fn, handle, tuple);
  514. if (i != CS_SUCCESS)
  515. return CS_NO_MORE_ITEMS;
  516. i = CardServices(GetTupleData, handle, tuple);
  517. if (i != CS_SUCCESS)
  518. return i;
  519. return CardServices(ParseTuple, handle, tuple, parse);
  520. }
  521. #define first_tuple(a, b, c) get_tuple(GetFirstTuple, a, b, c)
  522. #define next_tuple(a, b, c) get_tuple(GetNextTuple, a, b, c)
  523. void bt3c_config(dev_link_t *link)
  524. {
  525. static ioaddr_t base[5] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8, 0x0 };
  526. client_handle_t handle = link->handle;
  527. bt3c_info_t *info = link->priv;
  528. tuple_t tuple;
  529. u_short buf[256];
  530. cisparse_t parse;
  531. cistpl_cftable_entry_t *cf = &parse.cftable_entry;
  532. config_info_t config;
  533. int i, j, try, last_ret, last_fn;
  534. tuple.TupleData = (cisdata_t *)buf;
  535. tuple.TupleOffset = 0;
  536. tuple.TupleDataMax = 255;
  537. tuple.Attributes = 0;
  538. /* Get configuration register information */
  539. tuple.DesiredTuple = CISTPL_CONFIG;
  540. last_ret = first_tuple(handle, &tuple, &parse);
  541. if (last_ret != CS_SUCCESS) {
  542. last_fn = ParseTuple;
  543. goto cs_failed;
  544. }
  545. link->conf.ConfigBase = parse.config.base;
  546. link->conf.Present = parse.config.rmask[0];
  547. /* Configure card */
  548. link->state |= DEV_CONFIG;
  549. i = CardServices(GetConfigurationInfo, handle, &config);
  550. link->conf.Vcc = config.Vcc;
  551. /* First pass: look for a config entry that looks normal. */
  552. tuple.TupleData = (cisdata_t *)buf;
  553. tuple.TupleOffset = 0;
  554. tuple.TupleDataMax = 255;
  555. tuple.Attributes = 0;
  556. tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
  557. /* Two tries: without IO aliases, then with aliases */
  558. for (try = 0; try < 2; try++) {
  559. i = first_tuple(handle, &tuple, &parse);
  560. while (i != CS_NO_MORE_ITEMS) {
  561. if (i != CS_SUCCESS)
  562. goto next_entry;
  563. if (cf->vpp1.present & (1 << CISTPL_POWER_VNOM))
  564. link->conf.Vpp1 = link->conf.Vpp2 = cf->vpp1.param[CISTPL_POWER_VNOM] / 10000;
  565. if ((cf->io.nwin > 0) && (cf->io.win[0].len == 8) && (cf->io.win[0].base != 0)) {
  566. link->conf.ConfigIndex = cf->index;
  567. link->io.BasePort1 = cf->io.win[0].base;
  568. link->io.IOAddrLines = (try == 0) ? 16 : cf->io.flags & CISTPL_IO_LINES_MASK;
  569. i = CardServices(RequestIO, link->handle, &link->io);
  570. if (i == CS_SUCCESS)
  571. goto found_port;
  572. }
  573. next_entry:
  574. i = next_tuple(handle, &tuple, &parse);
  575. }
  576. }
  577. /* Second pass: try to find an entry that isn't picky about
  578.    its base address, then try to grab any standard serial port
  579.    address, and finally try to get any free port. */
  580. i = first_tuple(handle, &tuple, &parse);
  581. while (i != CS_NO_MORE_ITEMS) {
  582. if ((i == CS_SUCCESS) && (cf->io.nwin > 0) && ((cf->io.flags & CISTPL_IO_LINES_MASK) <= 3)) {
  583. link->conf.ConfigIndex = cf->index;
  584. for (j = 0; j < 5; j++) {
  585. link->io.BasePort1 = base[j];
  586. link->io.IOAddrLines = base[j] ? 16 : 3;
  587. i = CardServices(RequestIO, link->handle, &link->io);
  588. if (i == CS_SUCCESS)
  589. goto found_port;
  590. }
  591. }
  592. i = next_tuple(handle, &tuple, &parse);
  593. }
  594. found_port:
  595. if (i != CS_SUCCESS) {
  596. printk(KERN_NOTICE "bt3c_cs: No usable port range found. Giving up.n");
  597. cs_error(link->handle, RequestIO, i);
  598. goto failed;
  599. }
  600. i = CardServices(RequestIRQ, link->handle, &link->irq);
  601. if (i != CS_SUCCESS) {
  602. cs_error(link->handle, RequestIRQ, i);
  603. link->irq.AssignedIRQ = 0;
  604. }
  605. i = CardServices(RequestConfiguration, link->handle, &link->conf);
  606. if (i != CS_SUCCESS) {
  607. cs_error(link->handle, RequestConfiguration, i);
  608. goto failed;
  609. }
  610. MOD_INC_USE_COUNT;
  611. if (bt3c_open(info) != 0)
  612. goto failed;
  613. strcpy(info->node.dev_name, info->hdev.name);
  614. link->dev = &info->node;
  615. link->state &= ~DEV_CONFIG_PENDING;
  616. return;
  617. cs_failed:
  618. cs_error(link->handle, last_fn, last_ret);
  619. failed:
  620. bt3c_release((u_long)link);
  621. }
  622. void bt3c_release(u_long arg)
  623. {
  624. dev_link_t *link = (dev_link_t *)arg;
  625. bt3c_info_t *info = link->priv;
  626. if (link->state & DEV_PRESENT)
  627. bt3c_close(info);
  628. MOD_DEC_USE_COUNT;
  629. link->dev = NULL;
  630. CardServices(ReleaseConfiguration, link->handle);
  631. CardServices(ReleaseIO, link->handle, &link->io);
  632. CardServices(ReleaseIRQ, link->handle, &link->irq);
  633. link->state &= ~DEV_CONFIG;
  634. }
  635. int bt3c_event(event_t event, int priority, event_callback_args_t *args)
  636. {
  637. dev_link_t *link = args->client_data;
  638. bt3c_info_t *info = link->priv;
  639. switch (event) {
  640. case CS_EVENT_CARD_REMOVAL:
  641. link->state &= ~DEV_PRESENT;
  642. if (link->state & DEV_CONFIG) {
  643. bt3c_close(info);
  644. mod_timer(&link->release, jiffies + HZ / 20);
  645. }
  646. break;
  647. case CS_EVENT_CARD_INSERTION:
  648. link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
  649. bt3c_config(link);
  650. break;
  651. case CS_EVENT_PM_SUSPEND:
  652. link->state |= DEV_SUSPEND;
  653. /* Fall through... */
  654. case CS_EVENT_RESET_PHYSICAL:
  655. if (link->state & DEV_CONFIG)
  656. CardServices(ReleaseConfiguration, link->handle);
  657. break;
  658. case CS_EVENT_PM_RESUME:
  659. link->state &= ~DEV_SUSPEND;
  660. /* Fall through... */
  661. case CS_EVENT_CARD_RESET:
  662. if (DEV_OK(link))
  663. CardServices(RequestConfiguration, link->handle, &link->conf);
  664. break;
  665. }
  666. return 0;
  667. }
  668. /* ======================== Module initialization ======================== */
  669. int __init init_bt3c_cs(void)
  670. {
  671. servinfo_t serv;
  672. int err;
  673. CardServices(GetCardServicesInfo, &serv);
  674. if (serv.Revision != CS_RELEASE_CODE) {
  675. printk(KERN_NOTICE "bt3c_cs: Card Services release does not match!n");
  676. return -1;
  677. }
  678. err = register_pccard_driver(&dev_info, &bt3c_attach, &bt3c_detach);
  679. return err;
  680. }
  681. void __exit exit_bt3c_cs(void)
  682. {
  683. unregister_pccard_driver(&dev_info);
  684. while (dev_list != NULL)
  685. bt3c_detach(dev_list);
  686. }
  687. module_init(init_bt3c_cs);
  688. module_exit(exit_bt3c_cs);
  689. EXPORT_NO_SYMBOLS;