3 #include <linux/module.h>
6 #include <linux/slab.h>
7 #include <linux/wait.h>
10 #include <linux/netdevice.h>
12 #include <linux/wireless.h>
33 static int ignore_cis_vcc;
40 struct pcmcia_device *
link;
45 #ifdef PRISM2_IO_DEBUG
49 struct hostap_interface *iface;
53 iface = netdev_priv(dev);
56 prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_OUTB, a, v);
58 spin_unlock_irqrestore(&local->lock, flags);
63 struct hostap_interface *iface;
68 iface = netdev_priv(dev);
72 prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_INB, a, v);
73 spin_unlock_irqrestore(&local->lock, flags);
79 struct hostap_interface *iface;
83 iface = netdev_priv(dev);
86 prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_OUTW, a, v);
88 spin_unlock_irqrestore(&local->lock, flags);
93 struct hostap_interface *iface;
98 iface = netdev_priv(dev);
102 prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_INW, a, v);
103 spin_unlock_irqrestore(&local->lock, flags);
107 static inline void hfa384x_outsw_debug(
struct net_device *
dev,
int a,
110 struct hostap_interface *iface;
114 iface = netdev_priv(dev);
115 local = iface->local;
117 prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_OUTSW, a, wc);
119 spin_unlock_irqrestore(&local->lock, flags);
122 static inline void hfa384x_insw_debug(
struct net_device *
dev,
int a,
125 struct hostap_interface *iface;
129 iface = netdev_priv(dev);
130 local = iface->local;
132 prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_INSW, a, wc);
134 spin_unlock_irqrestore(&local->lock, flags);
137 #define HFA384X_OUTB(v,a) hfa384x_outb_debug(dev, (a), (v))
138 #define HFA384X_INB(a) hfa384x_inb_debug(dev, (a))
139 #define HFA384X_OUTW(v,a) hfa384x_outw_debug(dev, (a), (v))
140 #define HFA384X_INW(a) hfa384x_inw_debug(dev, (a))
141 #define HFA384X_OUTSW(a, buf, wc) hfa384x_outsw_debug(dev, (a), (buf), (wc))
142 #define HFA384X_INSW(a, buf, wc) hfa384x_insw_debug(dev, (a), (buf), (wc))
146 #define HFA384X_OUTB(v,a) outb((v), dev->base_addr + (a))
147 #define HFA384X_INB(a) inb(dev->base_addr + (a))
148 #define HFA384X_OUTW(v,a) outw((v), dev->base_addr + (a))
149 #define HFA384X_INW(a) inw(dev->base_addr + (a))
150 #define HFA384X_INSW(a, buf, wc) insw(dev->base_addr + (a), buf, wc)
151 #define HFA384X_OUTSW(a, buf, wc) outsw(dev->base_addr + (a), buf, wc)
162 d_off = (bap == 1) ? HFA384X_DATA1_OFF : HFA384X_DATA0_OFF;
181 d_off = (bap == 1) ? HFA384X_DATA1_OFF : HFA384X_DATA0_OFF;
200 static void prism2_detach(
struct pcmcia_device *p_dev);
202 static int prism2_config(
struct pcmcia_device *
link);
205 static int prism2_pccard_card_present(
local_info_t *local)
219 #define SANDISK_WLAN_ACTIVATION_OFF 0x40
220 #define SANDISK_HCR_OFF 0x42
229 hw_priv->
link->resource[0]->start & 0x00ff);
237 (hw_priv->
link->resource[0]->start >> 8) & 0x00ff);
245 static void sandisk_write_hcr(
local_info_t *local,
int hcr)
252 for (i = 0; i < 10; i++) {
260 static int sandisk_enable_wireless(
struct net_device *dev)
263 struct hostap_interface *iface = netdev_priv(dev);
267 if (resource_size(hw_priv->
link->resource[0]) < 0x42) {
273 if (hw_priv->
link->manf_id != 0xd601 || hw_priv->
link->card_id != 0x0101) {
279 if (hw_priv->
link->socket->functions < 2) {
286 " - using vendor-specific initialization\n", dev->
name);
312 sandisk_set_iobase(local);
324 static void prism2_pccard_cor_sreset(
local_info_t *local)
330 if (!prism2_pccard_card_present(local))
365 sandisk_set_iobase(local);
369 static void prism2_pccard_genesis_reset(
local_info_t *local,
int hcr)
375 if (!prism2_pccard_card_present(local))
379 sandisk_write_hcr(local, hcr);
423 static struct prism2_helper_functions prism2_pccard_funcs =
425 .card_present = prism2_pccard_card_present,
426 .cor_sreset = prism2_pccard_cor_sreset,
427 .genesis_reset = prism2_pccard_genesis_reset,
428 .hw_type = HOSTAP_HW_PCCARD,
434 static int hostap_cs_probe(
struct pcmcia_device *p_dev)
440 ret = prism2_config(p_dev);
442 PDEBUG(DEBUG_EXTRA,
"prism2_config() failed\n");
449 static void prism2_detach(
struct pcmcia_device *
link)
451 PDEBUG(DEBUG_FLOW,
"prism2_detach\n");
453 prism2_release((
u_long)link);
459 struct hostap_interface *iface;
461 iface = netdev_priv(dev);
462 hw_priv = iface->local->hw_priv;
463 prism2_free_local_data(dev);
469 static int prism2_config_check(
struct pcmcia_device *p_dev,
void *priv_data)
471 if (p_dev->config_index == 0)
477 static int prism2_config(
struct pcmcia_device *link)
480 struct hostap_interface *iface;
486 PDEBUG(DEBUG_FLOW,
"prism2_config()\n");
488 hw_priv = kzalloc(
sizeof(*hw_priv),
GFP_KERNEL);
489 if (hw_priv ==
NULL) {
495 link->config_flags |= CONF_AUTO_SET_VPP | CONF_AUTO_AUDIO |
496 CONF_AUTO_CHECK_VCC | CONF_AUTO_SET_IO | CONF_ENABLE_IRQ;
498 link->config_flags &= ~CONF_AUTO_CHECK_VCC;
499 ret = pcmcia_loop_config(link, prism2_config_check,
NULL);
503 "CIS configuration. Maybe you need the "
504 "ignore_cis_vcc=1 parameter.\n");
509 dev = prism2_init_local_data(&prism2_pccard_funcs, 0,
515 iface = netdev_priv(dev);
516 local = iface->local;
517 local->hw_priv = hw_priv;
534 dev->
irq = link->irq;
535 dev->
base_addr = link->resource[0]->start;
536 spin_unlock_irqrestore(&local->irq_init_lock, flags);
540 sandisk_enable_wireless(dev);
542 ret = prism2_hw_config(dev, 1);
544 ret = hostap_hw_ready(dev);
550 prism2_release((
u_long)link);
557 struct pcmcia_device *link = (
struct pcmcia_device *)arg;
559 PDEBUG(DEBUG_FLOW,
"prism2_release\n");
563 struct hostap_interface *iface;
565 iface = netdev_priv(dev);
566 prism2_hw_shutdown(dev, 0);
567 iface->local->shutdown = 1;
571 PDEBUG(DEBUG_FLOW,
"release - done\n");
574 static int hostap_cs_suspend(
struct pcmcia_device *link)
578 struct hostap_interface *iface =
NULL;
583 iface = netdev_priv(dev);
586 if (iface && iface->local)
587 dev_open = iface->local->num_dev_open > 0;
589 netif_stop_queue(dev);
597 static int hostap_cs_resume(
struct pcmcia_device *link)
601 struct hostap_interface *iface =
NULL;
606 iface = netdev_priv(dev);
610 if (iface && iface->local)
611 dev_open = iface->local->num_dev_open > 0;
613 prism2_hw_shutdown(dev, 1);
614 prism2_hw_config(dev, dev_open ? 0 : 1);
617 netif_start_queue(dev);
624 PCMCIA_DEVICE_MANF_CARD(0x000b, 0x7100),
625 PCMCIA_DEVICE_MANF_CARD(0x000b, 0x7300),
626 PCMCIA_DEVICE_MANF_CARD(0x0101, 0x0777),
627 PCMCIA_DEVICE_MANF_CARD(0x0126, 0x8000),
628 PCMCIA_DEVICE_MANF_CARD(0x0138, 0x0002),
629 PCMCIA_DEVICE_MANF_CARD(0x01bf, 0x3301),
630 PCMCIA_DEVICE_MANF_CARD(0x0250, 0x0002),
631 PCMCIA_DEVICE_MANF_CARD(0x026f, 0x030b),
632 PCMCIA_DEVICE_MANF_CARD(0x0274, 0x1612),
633 PCMCIA_DEVICE_MANF_CARD(0x0274, 0x1613),
634 PCMCIA_DEVICE_MANF_CARD(0x028a, 0x0002),
635 PCMCIA_DEVICE_MANF_CARD(0x02aa, 0x0002),
636 PCMCIA_DEVICE_MANF_CARD(0x02d2, 0x0001),
637 PCMCIA_DEVICE_MANF_CARD(0x50c2, 0x0001),
638 PCMCIA_DEVICE_MANF_CARD(0x50c2, 0x7300),
640 PCMCIA_DEVICE_MANF_CARD(0xc250, 0x0002),
641 PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0002),
642 PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0005),
643 PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0010),
644 PCMCIA_DEVICE_MANF_CARD(0x0126, 0x0002),
645 PCMCIA_DEVICE_MANF_CARD_PROD_ID1(0xd601, 0x0005,
"ADLINK 345 CF",
647 PCMCIA_DEVICE_MANF_CARD_PROD_ID1(0x0156, 0x0002,
"INTERSIL",
649 PCMCIA_DEVICE_MANF_CARD_PROD_ID1(0x0156, 0x0002,
"Intersil",
651 PCMCIA_DEVICE_MANF_CARD_PROD_ID3(0x0156, 0x0002,
"Version 01.02",
653 PCMCIA_MFC_DEVICE_PROD_ID12(0,
"SanDisk",
"ConnectPlus",
654 0x7a954bd9, 0x74be00c6),
655 PCMCIA_DEVICE_PROD_ID123(
656 "Addtron",
"AWP-100 Wireless PCMCIA",
"Version 01.02",
657 0xe6ec52ce, 0x08649af2, 0x4b74baa0),
658 PCMCIA_DEVICE_PROD_ID123(
659 "Canon",
"Wireless LAN CF Card K30225",
"Version 01.00",
660 0x96ef6fe2, 0x263fcbab, 0xa57adb8c),
661 PCMCIA_DEVICE_PROD_ID123(
662 "D",
"Link DWL-650 11Mbps WLAN Card",
"Version 01.02",
663 0x71b18589, 0xb6f1b0ab, 0x4b74baa0),
664 PCMCIA_DEVICE_PROD_ID123(
665 "Instant Wireless ",
" Network PC CARD",
"Version 01.02",
666 0x11d901af, 0x6e9bd926, 0x4b74baa0),
667 PCMCIA_DEVICE_PROD_ID123(
668 "SMC",
"SMC2632W",
"Version 01.02",
669 0xc4f8b18b, 0x474a1f2a, 0x4b74baa0),
670 PCMCIA_DEVICE_PROD_ID12(
"BUFFALO",
"WLI-CF-S11G",
671 0x2decece3, 0x82067c18),
672 PCMCIA_DEVICE_PROD_ID12(
"Compaq",
"WL200_11Mbps_Wireless_PCI_Card",
673 0x54f7c49c, 0x15a75e5b),
674 PCMCIA_DEVICE_PROD_ID12(
"INTERSIL",
"HFA384x/IEEE",
675 0x74c5e40d, 0xdb472a18),
676 PCMCIA_DEVICE_PROD_ID12(
"Linksys",
"Wireless CompactFlash Card",
677 0x0733cc81, 0x0c52f395),
678 PCMCIA_DEVICE_PROD_ID12(
679 "ZoomAir 11Mbps High",
"Rate wireless Networking",
680 0x273fe3db, 0x32a1eaee),
681 PCMCIA_DEVICE_PROD_ID123(
682 "Pretec",
"CompactWLAN Card 802.11b",
"2.5",
683 0x1cadd3e5, 0xe697636c, 0x7a5bfcf1),
684 PCMCIA_DEVICE_PROD_ID123(
685 "U.S. Robotics",
"IEEE 802.11b PC-CARD",
"Version 01.02",
686 0xc7b8df9d, 0x1700d087, 0x4b74baa0),
687 PCMCIA_DEVICE_PROD_ID123(
688 "Allied Telesyn",
"AT-WCL452 Wireless PCMCIA Radio",
690 0x5cd01705, 0x4271660f, 0x9d08ee12),
691 PCMCIA_DEVICE_PROD_ID123(
692 "Wireless LAN" ,
"11Mbps PC Card",
"Version 01.02",
693 0x4b8870ff, 0x70e946d1, 0x4b74baa0),
694 PCMCIA_DEVICE_PROD_ID3(
"HFA3863", 0x355cb092),
695 PCMCIA_DEVICE_PROD_ID3(
"ISL37100P", 0x630d52b2),
696 PCMCIA_DEVICE_PROD_ID3(
"ISL37101P-10", 0xdd97a26b),
697 PCMCIA_DEVICE_PROD_ID3(
"ISL37300P", 0xc9049a39),
703 static struct pcmcia_driver hostap_driver = {
705 .probe = hostap_cs_probe,
706 .remove = prism2_detach,
708 .id_table = hostap_cs_ids,
709 .suspend = hostap_cs_suspend,
710 .resume = hostap_cs_resume,
713 static int __init init_prism2_pccard(
void)
718 static void __exit exit_prism2_pccard(
void)