0001
0002 #define PRISM2_PCCARD
0003
0004 #include <linux/module.h>
0005 #include <linux/if.h>
0006 #include <linux/slab.h>
0007 #include <linux/wait.h>
0008 #include <linux/timer.h>
0009 #include <linux/skbuff.h>
0010 #include <linux/netdevice.h>
0011 #include <linux/workqueue.h>
0012 #include <linux/wireless.h>
0013 #include <net/iw_handler.h>
0014
0015 #include <pcmcia/cistpl.h>
0016 #include <pcmcia/cisreg.h>
0017 #include <pcmcia/ds.h>
0018
0019 #include <asm/io.h>
0020
0021 #include "hostap_wlan.h"
0022
0023
0024 static char *dev_info = "hostap_cs";
0025
0026 MODULE_AUTHOR("Jouni Malinen");
0027 MODULE_DESCRIPTION("Support for Intersil Prism2-based 802.11 wireless LAN "
0028 "cards (PC Card).");
0029 MODULE_LICENSE("GPL");
0030
0031
0032 static int ignore_cis_vcc;
0033 module_param(ignore_cis_vcc, int, 0444);
0034 MODULE_PARM_DESC(ignore_cis_vcc, "Ignore broken CIS VCC entry");
0035
0036
0037
0038 struct hostap_cs_priv {
0039 struct pcmcia_device *link;
0040 int sandisk_connectplus;
0041 };
0042
0043
0044 #ifdef PRISM2_IO_DEBUG
0045
0046 static inline void hfa384x_outb_debug(struct net_device *dev, int a, u8 v)
0047 {
0048 struct hostap_interface *iface;
0049 local_info_t *local;
0050 unsigned long flags;
0051
0052 iface = netdev_priv(dev);
0053 local = iface->local;
0054 spin_lock_irqsave(&local->lock, flags);
0055 prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_OUTB, a, v);
0056 outb(v, dev->base_addr + a);
0057 spin_unlock_irqrestore(&local->lock, flags);
0058 }
0059
0060 static inline u8 hfa384x_inb_debug(struct net_device *dev, int a)
0061 {
0062 struct hostap_interface *iface;
0063 local_info_t *local;
0064 unsigned long flags;
0065 u8 v;
0066
0067 iface = netdev_priv(dev);
0068 local = iface->local;
0069 spin_lock_irqsave(&local->lock, flags);
0070 v = inb(dev->base_addr + a);
0071 prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_INB, a, v);
0072 spin_unlock_irqrestore(&local->lock, flags);
0073 return v;
0074 }
0075
0076 static inline void hfa384x_outw_debug(struct net_device *dev, int a, u16 v)
0077 {
0078 struct hostap_interface *iface;
0079 local_info_t *local;
0080 unsigned long flags;
0081
0082 iface = netdev_priv(dev);
0083 local = iface->local;
0084 spin_lock_irqsave(&local->lock, flags);
0085 prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_OUTW, a, v);
0086 outw(v, dev->base_addr + a);
0087 spin_unlock_irqrestore(&local->lock, flags);
0088 }
0089
0090 static inline u16 hfa384x_inw_debug(struct net_device *dev, int a)
0091 {
0092 struct hostap_interface *iface;
0093 local_info_t *local;
0094 unsigned long flags;
0095 u16 v;
0096
0097 iface = netdev_priv(dev);
0098 local = iface->local;
0099 spin_lock_irqsave(&local->lock, flags);
0100 v = inw(dev->base_addr + a);
0101 prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_INW, a, v);
0102 spin_unlock_irqrestore(&local->lock, flags);
0103 return v;
0104 }
0105
0106 static inline void hfa384x_outsw_debug(struct net_device *dev, int a,
0107 u8 *buf, int wc)
0108 {
0109 struct hostap_interface *iface;
0110 local_info_t *local;
0111 unsigned long flags;
0112
0113 iface = netdev_priv(dev);
0114 local = iface->local;
0115 spin_lock_irqsave(&local->lock, flags);
0116 prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_OUTSW, a, wc);
0117 outsw(dev->base_addr + a, buf, wc);
0118 spin_unlock_irqrestore(&local->lock, flags);
0119 }
0120
0121 static inline void hfa384x_insw_debug(struct net_device *dev, int a,
0122 u8 *buf, int wc)
0123 {
0124 struct hostap_interface *iface;
0125 local_info_t *local;
0126 unsigned long flags;
0127
0128 iface = netdev_priv(dev);
0129 local = iface->local;
0130 spin_lock_irqsave(&local->lock, flags);
0131 prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_INSW, a, wc);
0132 insw(dev->base_addr + a, buf, wc);
0133 spin_unlock_irqrestore(&local->lock, flags);
0134 }
0135
0136 #define HFA384X_OUTB(v,a) hfa384x_outb_debug(dev, (a), (v))
0137 #define HFA384X_INB(a) hfa384x_inb_debug(dev, (a))
0138 #define HFA384X_OUTW(v,a) hfa384x_outw_debug(dev, (a), (v))
0139 #define HFA384X_INW(a) hfa384x_inw_debug(dev, (a))
0140 #define HFA384X_OUTSW(a, buf, wc) hfa384x_outsw_debug(dev, (a), (buf), (wc))
0141 #define HFA384X_INSW(a, buf, wc) hfa384x_insw_debug(dev, (a), (buf), (wc))
0142
0143 #else
0144
0145 #define HFA384X_OUTB(v,a) outb((v), dev->base_addr + (a))
0146 #define HFA384X_INB(a) inb(dev->base_addr + (a))
0147 #define HFA384X_OUTW(v,a) outw((v), dev->base_addr + (a))
0148 #define HFA384X_INW(a) inw(dev->base_addr + (a))
0149 #define HFA384X_INSW(a, buf, wc) insw(dev->base_addr + (a), buf, wc)
0150 #define HFA384X_OUTSW(a, buf, wc) outsw(dev->base_addr + (a), buf, wc)
0151
0152 #endif
0153
0154
0155 static int hfa384x_from_bap(struct net_device *dev, u16 bap, void *buf,
0156 int len)
0157 {
0158 u16 d_off;
0159 u16 *pos;
0160
0161 d_off = (bap == 1) ? HFA384X_DATA1_OFF : HFA384X_DATA0_OFF;
0162 pos = (u16 *) buf;
0163
0164 if (len / 2)
0165 HFA384X_INSW(d_off, buf, len / 2);
0166 pos += len / 2;
0167
0168 if (len & 1)
0169 *((char *) pos) = HFA384X_INB(d_off);
0170
0171 return 0;
0172 }
0173
0174
0175 static int hfa384x_to_bap(struct net_device *dev, u16 bap, void *buf, int len)
0176 {
0177 u16 d_off;
0178 u16 *pos;
0179
0180 d_off = (bap == 1) ? HFA384X_DATA1_OFF : HFA384X_DATA0_OFF;
0181 pos = (u16 *) buf;
0182
0183 if (len / 2)
0184 HFA384X_OUTSW(d_off, buf, len / 2);
0185 pos += len / 2;
0186
0187 if (len & 1)
0188 HFA384X_OUTB(*((char *) pos), d_off);
0189
0190 return 0;
0191 }
0192
0193
0194
0195 #include "hostap_hw.c"
0196
0197
0198
0199 static void prism2_detach(struct pcmcia_device *p_dev);
0200 static void prism2_release(u_long arg);
0201 static int prism2_config(struct pcmcia_device *link);
0202
0203
0204 static int prism2_pccard_card_present(local_info_t *local)
0205 {
0206 struct hostap_cs_priv *hw_priv = local->hw_priv;
0207 if (hw_priv != NULL && hw_priv->link != NULL && pcmcia_dev_present(hw_priv->link))
0208 return 1;
0209 return 0;
0210 }
0211
0212
0213
0214
0215
0216
0217
0218 #define SANDISK_WLAN_ACTIVATION_OFF 0x40
0219 #define SANDISK_HCR_OFF 0x42
0220
0221
0222 static void sandisk_set_iobase(local_info_t *local)
0223 {
0224 int res;
0225 struct hostap_cs_priv *hw_priv = local->hw_priv;
0226
0227 res = pcmcia_write_config_byte(hw_priv->link, 0x10,
0228 hw_priv->link->resource[0]->start & 0x00ff);
0229 if (res != 0) {
0230 printk(KERN_DEBUG "Prism3 SanDisk - failed to set I/O base 0 -"
0231 " res=%d\n", res);
0232 }
0233 udelay(10);
0234
0235 res = pcmcia_write_config_byte(hw_priv->link, 0x12,
0236 (hw_priv->link->resource[0]->start >> 8) & 0x00ff);
0237 if (res != 0) {
0238 printk(KERN_DEBUG "Prism3 SanDisk - failed to set I/O base 1 -"
0239 " res=%d\n", res);
0240 }
0241 }
0242
0243
0244 static void sandisk_write_hcr(local_info_t *local, int hcr)
0245 {
0246 struct net_device *dev = local->dev;
0247 int i;
0248
0249 HFA384X_OUTB(0x80, SANDISK_WLAN_ACTIVATION_OFF);
0250 udelay(50);
0251 for (i = 0; i < 10; i++) {
0252 HFA384X_OUTB(hcr, SANDISK_HCR_OFF);
0253 }
0254 udelay(55);
0255 HFA384X_OUTB(0x45, SANDISK_WLAN_ACTIVATION_OFF);
0256 }
0257
0258
0259 static int sandisk_enable_wireless(struct net_device *dev)
0260 {
0261 int res, ret = 0;
0262 struct hostap_interface *iface = netdev_priv(dev);
0263 local_info_t *local = iface->local;
0264 struct hostap_cs_priv *hw_priv = local->hw_priv;
0265
0266 if (resource_size(hw_priv->link->resource[0]) < 0x42) {
0267
0268 ret = -ENODEV;
0269 goto done;
0270 }
0271
0272 if (hw_priv->link->manf_id != 0xd601 || hw_priv->link->card_id != 0x0101) {
0273
0274 ret = -ENODEV;
0275 goto done;
0276 }
0277
0278 if (hw_priv->link->socket->functions < 2) {
0279
0280 ret = -ENODEV;
0281 goto done;
0282 }
0283
0284 printk(KERN_DEBUG "%s: Multi-function SanDisk ConnectPlus detected"
0285 " - using vendor-specific initialization\n", dev->name);
0286 hw_priv->sandisk_connectplus = 1;
0287
0288 res = pcmcia_write_config_byte(hw_priv->link, CISREG_COR,
0289 COR_SOFT_RESET);
0290 if (res != 0) {
0291 printk(KERN_DEBUG "%s: SanDisk - COR sreset failed (%d)\n",
0292 dev->name, res);
0293 goto done;
0294 }
0295 mdelay(5);
0296
0297
0298
0299
0300
0301 res = pcmcia_write_config_byte(hw_priv->link, CISREG_COR,
0302 (COR_LEVEL_REQ | 0x8 | COR_ADDR_DECODE |
0303 COR_FUNC_ENA));
0304 if (res != 0) {
0305 printk(KERN_DEBUG "%s: SanDisk - COR sreset failed (%d)\n",
0306 dev->name, res);
0307 goto done;
0308 }
0309 mdelay(5);
0310
0311 sandisk_set_iobase(local);
0312
0313 HFA384X_OUTB(0xc5, SANDISK_WLAN_ACTIVATION_OFF);
0314 udelay(10);
0315 HFA384X_OUTB(0x4b, SANDISK_WLAN_ACTIVATION_OFF);
0316 udelay(10);
0317
0318 done:
0319 return ret;
0320 }
0321
0322
0323 static void prism2_pccard_cor_sreset(local_info_t *local)
0324 {
0325 int res;
0326 u8 val;
0327 struct hostap_cs_priv *hw_priv = local->hw_priv;
0328
0329 if (!prism2_pccard_card_present(local))
0330 return;
0331
0332 res = pcmcia_read_config_byte(hw_priv->link, CISREG_COR, &val);
0333 if (res != 0) {
0334 printk(KERN_DEBUG "prism2_pccard_cor_sreset failed 1 (%d)\n",
0335 res);
0336 return;
0337 }
0338 printk(KERN_DEBUG "prism2_pccard_cor_sreset: original COR %02x\n",
0339 val);
0340
0341 val |= COR_SOFT_RESET;
0342 res = pcmcia_write_config_byte(hw_priv->link, CISREG_COR, val);
0343 if (res != 0) {
0344 printk(KERN_DEBUG "prism2_pccard_cor_sreset failed 2 (%d)\n",
0345 res);
0346 return;
0347 }
0348
0349 mdelay(hw_priv->sandisk_connectplus ? 5 : 2);
0350
0351 val &= ~COR_SOFT_RESET;
0352 if (hw_priv->sandisk_connectplus)
0353 val |= COR_IREQ_ENA;
0354 res = pcmcia_write_config_byte(hw_priv->link, CISREG_COR, val);
0355 if (res != 0) {
0356 printk(KERN_DEBUG "prism2_pccard_cor_sreset failed 3 (%d)\n",
0357 res);
0358 return;
0359 }
0360
0361 mdelay(hw_priv->sandisk_connectplus ? 5 : 2);
0362
0363 if (hw_priv->sandisk_connectplus)
0364 sandisk_set_iobase(local);
0365 }
0366
0367
0368 static void prism2_pccard_genesis_reset(local_info_t *local, int hcr)
0369 {
0370 int res;
0371 u8 old_cor;
0372 struct hostap_cs_priv *hw_priv = local->hw_priv;
0373
0374 if (!prism2_pccard_card_present(local))
0375 return;
0376
0377 if (hw_priv->sandisk_connectplus) {
0378 sandisk_write_hcr(local, hcr);
0379 return;
0380 }
0381
0382 res = pcmcia_read_config_byte(hw_priv->link, CISREG_COR, &old_cor);
0383 if (res != 0) {
0384 printk(KERN_DEBUG "%s failed 1 (%d)\n", __func__, res);
0385 return;
0386 }
0387 printk(KERN_DEBUG "%s: original COR %02x\n", __func__, old_cor);
0388
0389 res = pcmcia_write_config_byte(hw_priv->link, CISREG_COR,
0390 old_cor | COR_SOFT_RESET);
0391 if (res != 0) {
0392 printk(KERN_DEBUG "%s failed 2 (%d)\n", __func__, res);
0393 return;
0394 }
0395
0396 mdelay(10);
0397
0398
0399 res = pcmcia_write_config_byte(hw_priv->link, CISREG_CCSR, hcr);
0400 if (res != 0) {
0401 printk(KERN_DEBUG "%s failed 3 (%d)\n", __func__, res);
0402 return;
0403 }
0404 mdelay(10);
0405
0406 res = pcmcia_write_config_byte(hw_priv->link, CISREG_COR,
0407 old_cor & ~COR_SOFT_RESET);
0408 if (res != 0) {
0409 printk(KERN_DEBUG "%s failed 4 (%d)\n", __func__, res);
0410 return;
0411 }
0412
0413 mdelay(10);
0414 }
0415
0416
0417 static struct prism2_helper_functions prism2_pccard_funcs =
0418 {
0419 .card_present = prism2_pccard_card_present,
0420 .cor_sreset = prism2_pccard_cor_sreset,
0421 .genesis_reset = prism2_pccard_genesis_reset,
0422 .hw_type = HOSTAP_HW_PCCARD,
0423 };
0424
0425
0426
0427
0428 static int hostap_cs_probe(struct pcmcia_device *p_dev)
0429 {
0430 int ret;
0431
0432 PDEBUG(DEBUG_HW, "%s: setting Vcc=33 (constant)\n", dev_info);
0433
0434 ret = prism2_config(p_dev);
0435 if (ret) {
0436 PDEBUG(DEBUG_EXTRA, "prism2_config() failed\n");
0437 }
0438
0439 return ret;
0440 }
0441
0442
0443 static void prism2_detach(struct pcmcia_device *link)
0444 {
0445 PDEBUG(DEBUG_FLOW, "prism2_detach\n");
0446
0447 prism2_release((u_long)link);
0448
0449
0450 if (link->priv) {
0451 struct hostap_cs_priv *hw_priv;
0452 struct net_device *dev;
0453 struct hostap_interface *iface;
0454 dev = link->priv;
0455 iface = netdev_priv(dev);
0456 hw_priv = iface->local->hw_priv;
0457 prism2_free_local_data(dev);
0458 kfree(hw_priv);
0459 }
0460 }
0461
0462
0463 static int prism2_config_check(struct pcmcia_device *p_dev, void *priv_data)
0464 {
0465 if (p_dev->config_index == 0)
0466 return -EINVAL;
0467
0468 return pcmcia_request_io(p_dev);
0469 }
0470
0471 static int prism2_config(struct pcmcia_device *link)
0472 {
0473 struct net_device *dev;
0474 struct hostap_interface *iface;
0475 local_info_t *local;
0476 int ret;
0477 struct hostap_cs_priv *hw_priv;
0478 unsigned long flags;
0479
0480 PDEBUG(DEBUG_FLOW, "prism2_config()\n");
0481
0482 hw_priv = kzalloc(sizeof(*hw_priv), GFP_KERNEL);
0483 if (hw_priv == NULL) {
0484 ret = -ENOMEM;
0485 goto failed;
0486 }
0487
0488
0489 link->config_flags |= CONF_AUTO_SET_VPP | CONF_AUTO_AUDIO |
0490 CONF_AUTO_CHECK_VCC | CONF_AUTO_SET_IO | CONF_ENABLE_IRQ;
0491 if (ignore_cis_vcc)
0492 link->config_flags &= ~CONF_AUTO_CHECK_VCC;
0493 ret = pcmcia_loop_config(link, prism2_config_check, NULL);
0494 if (ret) {
0495 if (!ignore_cis_vcc)
0496 printk(KERN_ERR "GetNextTuple(): No matching "
0497 "CIS configuration. Maybe you need the "
0498 "ignore_cis_vcc=1 parameter.\n");
0499 goto failed;
0500 }
0501
0502
0503 dev = prism2_init_local_data(&prism2_pccard_funcs, 0,
0504 &link->dev);
0505 if (!dev) {
0506 ret = -ENOMEM;
0507 goto failed;
0508 }
0509 link->priv = dev;
0510
0511 iface = netdev_priv(dev);
0512 local = iface->local;
0513 local->hw_priv = hw_priv;
0514 hw_priv->link = link;
0515
0516
0517
0518
0519
0520
0521 ret = pcmcia_request_irq(link, prism2_interrupt);
0522 if (ret)
0523 goto failed;
0524
0525 ret = pcmcia_enable_device(link);
0526 if (ret)
0527 goto failed;
0528
0529 spin_lock_irqsave(&local->irq_init_lock, flags);
0530 dev->irq = link->irq;
0531 dev->base_addr = link->resource[0]->start;
0532 spin_unlock_irqrestore(&local->irq_init_lock, flags);
0533
0534 local->shutdown = 0;
0535
0536 sandisk_enable_wireless(dev);
0537
0538 ret = prism2_hw_config(dev, 1);
0539 if (!ret)
0540 ret = hostap_hw_ready(dev);
0541
0542 return ret;
0543
0544 failed:
0545 kfree(hw_priv);
0546 prism2_release((u_long)link);
0547 return ret;
0548 }
0549
0550
0551 static void prism2_release(u_long arg)
0552 {
0553 struct pcmcia_device *link = (struct pcmcia_device *)arg;
0554
0555 PDEBUG(DEBUG_FLOW, "prism2_release\n");
0556
0557 if (link->priv) {
0558 struct net_device *dev = link->priv;
0559 struct hostap_interface *iface;
0560
0561 iface = netdev_priv(dev);
0562 prism2_hw_shutdown(dev, 0);
0563 iface->local->shutdown = 1;
0564 }
0565
0566 pcmcia_disable_device(link);
0567 PDEBUG(DEBUG_FLOW, "release - done\n");
0568 }
0569
0570 static int hostap_cs_suspend(struct pcmcia_device *link)
0571 {
0572 struct net_device *dev = (struct net_device *) link->priv;
0573 int dev_open = 0;
0574 struct hostap_interface *iface = NULL;
0575
0576 if (!dev)
0577 return -ENODEV;
0578
0579 iface = netdev_priv(dev);
0580
0581 PDEBUG(DEBUG_EXTRA, "%s: CS_EVENT_PM_SUSPEND\n", dev_info);
0582 if (iface && iface->local)
0583 dev_open = iface->local->num_dev_open > 0;
0584 if (dev_open) {
0585 netif_stop_queue(dev);
0586 netif_device_detach(dev);
0587 }
0588 prism2_suspend(dev);
0589
0590 return 0;
0591 }
0592
0593 static int hostap_cs_resume(struct pcmcia_device *link)
0594 {
0595 struct net_device *dev = (struct net_device *) link->priv;
0596 int dev_open = 0;
0597 struct hostap_interface *iface = NULL;
0598
0599 if (!dev)
0600 return -ENODEV;
0601
0602 iface = netdev_priv(dev);
0603
0604 PDEBUG(DEBUG_EXTRA, "%s: CS_EVENT_PM_RESUME\n", dev_info);
0605
0606 if (iface && iface->local)
0607 dev_open = iface->local->num_dev_open > 0;
0608
0609 prism2_hw_shutdown(dev, 1);
0610 prism2_hw_config(dev, dev_open ? 0 : 1);
0611 if (dev_open) {
0612 netif_device_attach(dev);
0613 netif_start_queue(dev);
0614 }
0615
0616 return 0;
0617 }
0618
0619 static const struct pcmcia_device_id hostap_cs_ids[] = {
0620 PCMCIA_DEVICE_MANF_CARD(0x000b, 0x7100),
0621 PCMCIA_DEVICE_MANF_CARD(0x000b, 0x7300),
0622 PCMCIA_DEVICE_MANF_CARD(0x0101, 0x0777),
0623 PCMCIA_DEVICE_MANF_CARD(0x0126, 0x8000),
0624 PCMCIA_DEVICE_MANF_CARD(0x0138, 0x0002),
0625 PCMCIA_DEVICE_MANF_CARD(0x01bf, 0x3301),
0626 PCMCIA_DEVICE_MANF_CARD(0x0250, 0x0002),
0627 PCMCIA_DEVICE_MANF_CARD(0x026f, 0x030b),
0628 PCMCIA_DEVICE_MANF_CARD(0x0274, 0x1612),
0629 PCMCIA_DEVICE_MANF_CARD(0x0274, 0x1613),
0630 PCMCIA_DEVICE_MANF_CARD(0x028a, 0x0002),
0631 PCMCIA_DEVICE_MANF_CARD(0x02aa, 0x0002),
0632 PCMCIA_DEVICE_MANF_CARD(0x02d2, 0x0001),
0633 PCMCIA_DEVICE_MANF_CARD(0x50c2, 0x0001),
0634 PCMCIA_DEVICE_MANF_CARD(0x50c2, 0x7300),
0635
0636 PCMCIA_DEVICE_MANF_CARD(0xc250, 0x0002),
0637 PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0002),
0638 PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0005),
0639 PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0010),
0640 PCMCIA_DEVICE_MANF_CARD(0x0126, 0x0002),
0641 PCMCIA_DEVICE_MANF_CARD_PROD_ID1(0xd601, 0x0005, "ADLINK 345 CF",
0642 0x2d858104),
0643 PCMCIA_DEVICE_MANF_CARD_PROD_ID1(0x0156, 0x0002, "INTERSIL",
0644 0x74c5e40d),
0645 PCMCIA_DEVICE_MANF_CARD_PROD_ID1(0x0156, 0x0002, "Intersil",
0646 0x4b801a17),
0647 PCMCIA_DEVICE_MANF_CARD_PROD_ID3(0x0156, 0x0002, "Version 01.02",
0648 0x4b74baa0),
0649 PCMCIA_MFC_DEVICE_PROD_ID12(0, "SanDisk", "ConnectPlus",
0650 0x7a954bd9, 0x74be00c6),
0651 PCMCIA_DEVICE_PROD_ID123(
0652 "Addtron", "AWP-100 Wireless PCMCIA", "Version 01.02",
0653 0xe6ec52ce, 0x08649af2, 0x4b74baa0),
0654 PCMCIA_DEVICE_PROD_ID123(
0655 "Canon", "Wireless LAN CF Card K30225", "Version 01.00",
0656 0x96ef6fe2, 0x263fcbab, 0xa57adb8c),
0657 PCMCIA_DEVICE_PROD_ID123(
0658 "D", "Link DWL-650 11Mbps WLAN Card", "Version 01.02",
0659 0x71b18589, 0xb6f1b0ab, 0x4b74baa0),
0660 PCMCIA_DEVICE_PROD_ID123(
0661 "Instant Wireless ", " Network PC CARD", "Version 01.02",
0662 0x11d901af, 0x6e9bd926, 0x4b74baa0),
0663 PCMCIA_DEVICE_PROD_ID123(
0664 "SMC", "SMC2632W", "Version 01.02",
0665 0xc4f8b18b, 0x474a1f2a, 0x4b74baa0),
0666 PCMCIA_DEVICE_PROD_ID12("BUFFALO", "WLI-CF-S11G",
0667 0x2decece3, 0x82067c18),
0668 PCMCIA_DEVICE_PROD_ID12("Compaq", "WL200_11Mbps_Wireless_PCI_Card",
0669 0x54f7c49c, 0x15a75e5b),
0670 PCMCIA_DEVICE_PROD_ID12("INTERSIL", "HFA384x/IEEE",
0671 0x74c5e40d, 0xdb472a18),
0672 PCMCIA_DEVICE_PROD_ID12("Linksys", "Wireless CompactFlash Card",
0673 0x0733cc81, 0x0c52f395),
0674 PCMCIA_DEVICE_PROD_ID12(
0675 "ZoomAir 11Mbps High", "Rate wireless Networking",
0676 0x273fe3db, 0x32a1eaee),
0677 PCMCIA_DEVICE_PROD_ID12("NETGEAR MA401 Wireless PC", "Card",
0678 0xa37434e9, 0x9762e8f1),
0679 PCMCIA_DEVICE_PROD_ID123(
0680 "Pretec", "CompactWLAN Card 802.11b", "2.5",
0681 0x1cadd3e5, 0xe697636c, 0x7a5bfcf1),
0682 PCMCIA_DEVICE_PROD_ID123(
0683 "U.S. Robotics", "IEEE 802.11b PC-CARD", "Version 01.02",
0684 0xc7b8df9d, 0x1700d087, 0x4b74baa0),
0685 PCMCIA_DEVICE_PROD_ID123(
0686 "Allied Telesyn", "AT-WCL452 Wireless PCMCIA Radio",
0687 "Ver. 1.00",
0688 0x5cd01705, 0x4271660f, 0x9d08ee12),
0689 PCMCIA_DEVICE_PROD_ID123(
0690 "Wireless LAN" , "11Mbps PC Card", "Version 01.02",
0691 0x4b8870ff, 0x70e946d1, 0x4b74baa0),
0692 PCMCIA_DEVICE_PROD_ID3("HFA3863", 0x355cb092),
0693 PCMCIA_DEVICE_PROD_ID3("ISL37100P", 0x630d52b2),
0694 PCMCIA_DEVICE_PROD_ID3("ISL37101P-10", 0xdd97a26b),
0695 PCMCIA_DEVICE_PROD_ID3("ISL37300P", 0xc9049a39),
0696 PCMCIA_DEVICE_NULL
0697 };
0698 MODULE_DEVICE_TABLE(pcmcia, hostap_cs_ids);
0699
0700
0701 static struct pcmcia_driver hostap_driver = {
0702 .name = "hostap_cs",
0703 .probe = hostap_cs_probe,
0704 .remove = prism2_detach,
0705 .owner = THIS_MODULE,
0706 .id_table = hostap_cs_ids,
0707 .suspend = hostap_cs_suspend,
0708 .resume = hostap_cs_resume,
0709 };
0710 module_pcmcia_driver(hostap_driver);