at v2.6.25-rc2 1425 lines 43 kB view raw
1/********************************************************************* 2 * 3 * Filename: netwave_cs.c 4 * Version: 0.4.1 5 * Description: Netwave AirSurfer Wireless LAN PC Card driver 6 * Status: Experimental. 7 * Authors: John Markus Bjørndalen <johnm@cs.uit.no> 8 * Dag Brattli <dagb@cs.uit.no> 9 * David Hinds <dahinds@users.sourceforge.net> 10 * Created at: A long time ago! 11 * Modified at: Mon Nov 10 11:54:37 1997 12 * Modified by: Dag Brattli <dagb@cs.uit.no> 13 * 14 * Copyright (c) 1997 University of Tromsø, Norway 15 * 16 * Revision History: 17 * 18 * 08-Nov-97 15:14:47 John Markus Bjørndalen <johnm@cs.uit.no> 19 * - Fixed some bugs in netwave_rx and cleaned it up a bit. 20 * (One of the bugs would have destroyed packets when receiving 21 * multiple packets per interrupt). 22 * - Cleaned up parts of newave_hw_xmit. 23 * - A few general cleanups. 24 * 24-Oct-97 13:17:36 Dag Brattli <dagb@cs.uit.no> 25 * - Fixed netwave_rx receive function (got updated docs) 26 * Others: 27 * - Changed name from xircnw to netwave, take a look at 28 * http://www.netwave-wireless.com 29 * - Some reorganizing of the code 30 * - Removed possible race condition between interrupt handler and transmit 31 * function 32 * - Started to add wireless extensions, but still needs some coding 33 * - Added watchdog for better handling of transmission timeouts 34 * (hopefully this works better) 35 ********************************************************************/ 36 37/* To have statistics (just packets sent) define this */ 38#undef NETWAVE_STATS 39 40#include <linux/module.h> 41#include <linux/kernel.h> 42#include <linux/init.h> 43#include <linux/types.h> 44#include <linux/fcntl.h> 45#include <linux/interrupt.h> 46#include <linux/ptrace.h> 47#include <linux/ioport.h> 48#include <linux/in.h> 49#include <linux/slab.h> 50#include <linux/string.h> 51#include <linux/timer.h> 52#include <linux/errno.h> 53#include <linux/netdevice.h> 54#include <linux/etherdevice.h> 55#include <linux/skbuff.h> 56#include <linux/bitops.h> 57#include <linux/wireless.h> 58#include <net/iw_handler.h> 59 60#include <pcmcia/cs_types.h> 61#include <pcmcia/cs.h> 62#include <pcmcia/cistpl.h> 63#include <pcmcia/cisreg.h> 64#include <pcmcia/ds.h> 65#include <pcmcia/mem_op.h> 66 67#include <asm/system.h> 68#include <asm/io.h> 69#include <asm/dma.h> 70 71#define NETWAVE_REGOFF 0x8000 72/* The Netwave IO registers, offsets to iobase */ 73#define NETWAVE_REG_COR 0x0 74#define NETWAVE_REG_CCSR 0x2 75#define NETWAVE_REG_ASR 0x4 76#define NETWAVE_REG_IMR 0xa 77#define NETWAVE_REG_PMR 0xc 78#define NETWAVE_REG_IOLOW 0x6 79#define NETWAVE_REG_IOHI 0x7 80#define NETWAVE_REG_IOCONTROL 0x8 81#define NETWAVE_REG_DATA 0xf 82/* The Netwave Extended IO registers, offsets to RamBase */ 83#define NETWAVE_EREG_ASCC 0x114 84#define NETWAVE_EREG_RSER 0x120 85#define NETWAVE_EREG_RSERW 0x124 86#define NETWAVE_EREG_TSER 0x130 87#define NETWAVE_EREG_TSERW 0x134 88#define NETWAVE_EREG_CB 0x100 89#define NETWAVE_EREG_SPCQ 0x154 90#define NETWAVE_EREG_SPU 0x155 91#define NETWAVE_EREG_LIF 0x14e 92#define NETWAVE_EREG_ISPLQ 0x156 93#define NETWAVE_EREG_HHC 0x158 94#define NETWAVE_EREG_NI 0x16e 95#define NETWAVE_EREG_MHS 0x16b 96#define NETWAVE_EREG_TDP 0x140 97#define NETWAVE_EREG_RDP 0x150 98#define NETWAVE_EREG_PA 0x160 99#define NETWAVE_EREG_EC 0x180 100#define NETWAVE_EREG_CRBP 0x17a 101#define NETWAVE_EREG_ARW 0x166 102 103/* 104 * Commands used in the extended command buffer 105 * NETWAVE_EREG_CB (0x100-0x10F) 106 */ 107#define NETWAVE_CMD_NOP 0x00 108#define NETWAVE_CMD_SRC 0x01 109#define NETWAVE_CMD_STC 0x02 110#define NETWAVE_CMD_AMA 0x03 111#define NETWAVE_CMD_DMA 0x04 112#define NETWAVE_CMD_SAMA 0x05 113#define NETWAVE_CMD_ER 0x06 114#define NETWAVE_CMD_DR 0x07 115#define NETWAVE_CMD_TL 0x08 116#define NETWAVE_CMD_SRP 0x09 117#define NETWAVE_CMD_SSK 0x0a 118#define NETWAVE_CMD_SMD 0x0b 119#define NETWAVE_CMD_SAPD 0x0c 120#define NETWAVE_CMD_SSS 0x11 121/* End of Command marker */ 122#define NETWAVE_CMD_EOC 0x00 123 124/* ASR register bits */ 125#define NETWAVE_ASR_RXRDY 0x80 126#define NETWAVE_ASR_TXBA 0x01 127 128#define TX_TIMEOUT ((32*HZ)/100) 129 130static const unsigned int imrConfRFU1 = 0x10; /* RFU interrupt mask, keep high */ 131static const unsigned int imrConfIENA = 0x02; /* Interrupt enable */ 132 133static const unsigned int corConfIENA = 0x01; /* Interrupt enable */ 134static const unsigned int corConfLVLREQ = 0x40; /* Keep high */ 135 136static const unsigned int rxConfRxEna = 0x80; /* Receive Enable */ 137static const unsigned int rxConfMAC = 0x20; /* MAC host receive mode*/ 138static const unsigned int rxConfPro = 0x10; /* Promiscuous */ 139static const unsigned int rxConfAMP = 0x08; /* Accept Multicast Packets */ 140static const unsigned int rxConfBcast = 0x04; /* Accept Broadcast Packets */ 141 142static const unsigned int txConfTxEna = 0x80; /* Transmit Enable */ 143static const unsigned int txConfMAC = 0x20; /* Host sends MAC mode */ 144static const unsigned int txConfEUD = 0x10; /* Enable Uni-Data packets */ 145static const unsigned int txConfKey = 0x02; /* Scramble data packets */ 146static const unsigned int txConfLoop = 0x01; /* Loopback mode */ 147 148/* 149 All the PCMCIA modules use PCMCIA_DEBUG to control debugging. If 150 you do not define PCMCIA_DEBUG at all, all the debug code will be 151 left out. If you compile with PCMCIA_DEBUG=0, the debug code will 152 be present but disabled -- but it can then be enabled for specific 153 modules at load time with a 'pc_debug=#' option to insmod. 154*/ 155 156#ifdef PCMCIA_DEBUG 157static int pc_debug = PCMCIA_DEBUG; 158module_param(pc_debug, int, 0); 159#define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args) 160static char *version = 161"netwave_cs.c 0.3.0 Thu Jul 17 14:36:02 1997 (John Markus Bjørndalen)\n"; 162#else 163#define DEBUG(n, args...) 164#endif 165 166/*====================================================================*/ 167 168/* Parameters that can be set with 'insmod' */ 169 170/* Choose the domain, default is 0x100 */ 171static u_int domain = 0x100; 172 173/* Scramble key, range from 0x0 to 0xffff. 174 * 0x0 is no scrambling. 175 */ 176static u_int scramble_key = 0x0; 177 178/* Shared memory speed, in ns. The documentation states that 179 * the card should not be read faster than every 400ns. 180 * This timing should be provided by the HBA. If it becomes a 181 * problem, try setting mem_speed to 400. 182 */ 183static int mem_speed; 184 185module_param(domain, int, 0); 186module_param(scramble_key, int, 0); 187module_param(mem_speed, int, 0); 188 189/*====================================================================*/ 190 191/* PCMCIA (Card Services) related functions */ 192static void netwave_release(struct pcmcia_device *link); /* Card removal */ 193static int netwave_pcmcia_config(struct pcmcia_device *arg); /* Runs after card 194 insertion */ 195static void netwave_detach(struct pcmcia_device *p_dev); /* Destroy instance */ 196 197/* Hardware configuration */ 198static void netwave_doreset(unsigned int iobase, u_char __iomem *ramBase); 199static void netwave_reset(struct net_device *dev); 200 201/* Misc device stuff */ 202static int netwave_open(struct net_device *dev); /* Open the device */ 203static int netwave_close(struct net_device *dev); /* Close the device */ 204 205/* Packet transmission and Packet reception */ 206static int netwave_start_xmit( struct sk_buff *skb, struct net_device *dev); 207static int netwave_rx( struct net_device *dev); 208 209/* Interrupt routines */ 210static irqreturn_t netwave_interrupt(int irq, void *dev_id); 211static void netwave_watchdog(struct net_device *); 212 213/* Statistics */ 214static void update_stats(struct net_device *dev); 215static struct net_device_stats *netwave_get_stats(struct net_device *dev); 216 217/* Wireless extensions */ 218static struct iw_statistics* netwave_get_wireless_stats(struct net_device *dev); 219 220static void set_multicast_list(struct net_device *dev); 221 222/* 223 A struct pcmcia_device structure has fields for most things that are needed 224 to keep track of a socket, but there will usually be some device 225 specific information that also needs to be kept track of. The 226 'priv' pointer in a struct pcmcia_device structure can be used to point to 227 a device-specific private data structure, like this. 228 229 A driver needs to provide a dev_node_t structure for each device 230 on a card. In some cases, there is only one device per card (for 231 example, ethernet cards, modems). In other cases, there may be 232 many actual or logical devices (SCSI adapters, memory cards with 233 multiple partitions). The dev_node_t structures need to be kept 234 in a linked list starting at the 'dev' field of a struct pcmcia_device 235 structure. We allocate them in the card's private data structure, 236 because they generally can't be allocated dynamically. 237*/ 238 239static const struct iw_handler_def netwave_handler_def; 240 241#define SIOCGIPSNAP SIOCIWFIRSTPRIV + 1 /* Site Survey Snapshot */ 242 243#define MAX_ESA 10 244 245typedef struct net_addr { 246 u_char addr48[6]; 247} net_addr; 248 249struct site_survey { 250 u_short length; 251 u_char struct_revision; 252 u_char roaming_state; 253 254 u_char sp_existsFlag; 255 u_char sp_link_quality; 256 u_char sp_max_link_quality; 257 u_char linkQualityGoodFairBoundary; 258 u_char linkQualityFairPoorBoundary; 259 u_char sp_utilization; 260 u_char sp_goodness; 261 u_char sp_hotheadcount; 262 u_char roaming_condition; 263 264 net_addr sp; 265 u_char numAPs; 266 net_addr nearByAccessPoints[MAX_ESA]; 267}; 268 269typedef struct netwave_private { 270 struct pcmcia_device *p_dev; 271 spinlock_t spinlock; /* Serialize access to the hardware (SMP) */ 272 dev_node_t node; 273 u_char __iomem *ramBase; 274 int timeoutCounter; 275 int lastExec; 276 struct timer_list watchdog; /* To avoid blocking state */ 277 struct site_survey nss; 278 struct net_device_stats stats; 279 struct iw_statistics iw_stats; /* Wireless stats */ 280} netwave_private; 281 282#ifdef NETWAVE_STATS 283static struct net_device_stats *netwave_get_stats(struct net_device *dev); 284#endif 285 286/* 287 * The Netwave card is little-endian, so won't work for big endian 288 * systems. 289 */ 290static inline unsigned short get_uint16(u_char __iomem *staddr) 291{ 292 return readw(staddr); /* Return only 16 bits */ 293} 294 295static inline short get_int16(u_char __iomem * staddr) 296{ 297 return readw(staddr); 298} 299 300/* 301 * Wait until the WOC (Write Operation Complete) bit in the 302 * ASR (Adapter Status Register) is asserted. 303 * This should have aborted if it takes too long time. 304 */ 305static inline void wait_WOC(unsigned int iobase) 306{ 307 /* Spin lock */ 308 while ((inb(iobase + NETWAVE_REG_ASR) & 0x8) != 0x8) ; 309} 310 311static void netwave_snapshot(netwave_private *priv, u_char __iomem *ramBase, 312 unsigned int iobase) { 313 u_short resultBuffer; 314 315 /* if time since last snapshot is > 1 sec. (100 jiffies?) then take 316 * new snapshot, else return cached data. This is the recommended rate. 317 */ 318 if ( jiffies - priv->lastExec > 100) { 319 /* Take site survey snapshot */ 320 /*printk( KERN_DEBUG "Taking new snapshot. %ld\n", jiffies - 321 priv->lastExec); */ 322 wait_WOC(iobase); 323 writeb(NETWAVE_CMD_SSS, ramBase + NETWAVE_EREG_CB + 0); 324 writeb(NETWAVE_CMD_EOC, ramBase + NETWAVE_EREG_CB + 1); 325 wait_WOC(iobase); 326 327 /* Get result and copy to cach */ 328 resultBuffer = readw(ramBase + NETWAVE_EREG_CRBP); 329 copy_from_pc( &priv->nss, ramBase+resultBuffer, 330 sizeof(struct site_survey)); 331 } 332} 333 334/* 335 * Function netwave_get_wireless_stats (dev) 336 * 337 * Wireless extensions statistics 338 * 339 */ 340static struct iw_statistics *netwave_get_wireless_stats(struct net_device *dev) 341{ 342 unsigned long flags; 343 unsigned int iobase = dev->base_addr; 344 netwave_private *priv = netdev_priv(dev); 345 u_char __iomem *ramBase = priv->ramBase; 346 struct iw_statistics* wstats; 347 348 wstats = &priv->iw_stats; 349 350 spin_lock_irqsave(&priv->spinlock, flags); 351 352 netwave_snapshot( priv, ramBase, iobase); 353 354 wstats->status = priv->nss.roaming_state; 355 wstats->qual.qual = readb( ramBase + NETWAVE_EREG_SPCQ); 356 wstats->qual.level = readb( ramBase + NETWAVE_EREG_ISPLQ); 357 wstats->qual.noise = readb( ramBase + NETWAVE_EREG_SPU) & 0x3f; 358 wstats->discard.nwid = 0L; 359 wstats->discard.code = 0L; 360 wstats->discard.misc = 0L; 361 362 spin_unlock_irqrestore(&priv->spinlock, flags); 363 364 return &priv->iw_stats; 365} 366 367/* 368 * Function netwave_attach (void) 369 * 370 * Creates an "instance" of the driver, allocating local data 371 * structures for one device. The device is registered with Card 372 * Services. 373 * 374 * The dev_link structure is initialized, but we don't actually 375 * configure the card at this point -- we wait until we receive a 376 * card insertion event. 377 */ 378static int netwave_probe(struct pcmcia_device *link) 379{ 380 struct net_device *dev; 381 netwave_private *priv; 382 383 DEBUG(0, "netwave_attach()\n"); 384 385 /* Initialize the struct pcmcia_device structure */ 386 dev = alloc_etherdev(sizeof(netwave_private)); 387 if (!dev) 388 return -ENOMEM; 389 priv = netdev_priv(dev); 390 priv->p_dev = link; 391 link->priv = dev; 392 393 /* The io structure describes IO port mapping */ 394 link->io.NumPorts1 = 16; 395 link->io.Attributes1 = IO_DATA_PATH_WIDTH_16; 396 /* link->io.NumPorts2 = 16; 397 link->io.Attributes2 = IO_DATA_PATH_WIDTH_16; */ 398 link->io.IOAddrLines = 5; 399 400 /* Interrupt setup */ 401 link->irq.Attributes = IRQ_TYPE_EXCLUSIVE | IRQ_HANDLE_PRESENT; 402 link->irq.IRQInfo1 = IRQ_LEVEL_ID; 403 link->irq.Handler = &netwave_interrupt; 404 405 /* General socket configuration */ 406 link->conf.Attributes = CONF_ENABLE_IRQ; 407 link->conf.IntType = INT_MEMORY_AND_IO; 408 link->conf.ConfigIndex = 1; 409 410 /* Netwave private struct init. link/dev/node already taken care of, 411 * other stuff zero'd - Jean II */ 412 spin_lock_init(&priv->spinlock); 413 414 /* Netwave specific entries in the device structure */ 415 dev->hard_start_xmit = &netwave_start_xmit; 416 dev->get_stats = &netwave_get_stats; 417 dev->set_multicast_list = &set_multicast_list; 418 /* wireless extensions */ 419 dev->wireless_handlers = (struct iw_handler_def *)&netwave_handler_def; 420 421 dev->tx_timeout = &netwave_watchdog; 422 dev->watchdog_timeo = TX_TIMEOUT; 423 424 dev->open = &netwave_open; 425 dev->stop = &netwave_close; 426 link->irq.Instance = dev; 427 428 return netwave_pcmcia_config( link); 429} /* netwave_attach */ 430 431/* 432 * Function netwave_detach (link) 433 * 434 * This deletes a driver "instance". The device is de-registered 435 * with Card Services. If it has been released, all local data 436 * structures are freed. Otherwise, the structures will be freed 437 * when the device is released. 438 */ 439static void netwave_detach(struct pcmcia_device *link) 440{ 441 struct net_device *dev = link->priv; 442 443 DEBUG(0, "netwave_detach(0x%p)\n", link); 444 445 netwave_release(link); 446 447 if (link->dev_node) 448 unregister_netdev(dev); 449 450 free_netdev(dev); 451} /* netwave_detach */ 452 453/* 454 * Wireless Handler : get protocol name 455 */ 456static int netwave_get_name(struct net_device *dev, 457 struct iw_request_info *info, 458 union iwreq_data *wrqu, 459 char *extra) 460{ 461 strcpy(wrqu->name, "Netwave"); 462 return 0; 463} 464 465/* 466 * Wireless Handler : set Network ID 467 */ 468static int netwave_set_nwid(struct net_device *dev, 469 struct iw_request_info *info, 470 union iwreq_data *wrqu, 471 char *extra) 472{ 473 unsigned long flags; 474 unsigned int iobase = dev->base_addr; 475 netwave_private *priv = netdev_priv(dev); 476 u_char __iomem *ramBase = priv->ramBase; 477 478 /* Disable interrupts & save flags */ 479 spin_lock_irqsave(&priv->spinlock, flags); 480 481 if(!wrqu->nwid.disabled) { 482 domain = wrqu->nwid.value; 483 printk( KERN_DEBUG "Setting domain to 0x%x%02x\n", 484 (domain >> 8) & 0x01, domain & 0xff); 485 wait_WOC(iobase); 486 writeb(NETWAVE_CMD_SMD, ramBase + NETWAVE_EREG_CB + 0); 487 writeb( domain & 0xff, ramBase + NETWAVE_EREG_CB + 1); 488 writeb((domain >>8 ) & 0x01,ramBase + NETWAVE_EREG_CB+2); 489 writeb(NETWAVE_CMD_EOC, ramBase + NETWAVE_EREG_CB + 3); 490 } 491 492 /* ReEnable interrupts & restore flags */ 493 spin_unlock_irqrestore(&priv->spinlock, flags); 494 495 return 0; 496} 497 498/* 499 * Wireless Handler : get Network ID 500 */ 501static int netwave_get_nwid(struct net_device *dev, 502 struct iw_request_info *info, 503 union iwreq_data *wrqu, 504 char *extra) 505{ 506 wrqu->nwid.value = domain; 507 wrqu->nwid.disabled = 0; 508 wrqu->nwid.fixed = 1; 509 return 0; 510} 511 512/* 513 * Wireless Handler : set scramble key 514 */ 515static int netwave_set_scramble(struct net_device *dev, 516 struct iw_request_info *info, 517 union iwreq_data *wrqu, 518 char *key) 519{ 520 unsigned long flags; 521 unsigned int iobase = dev->base_addr; 522 netwave_private *priv = netdev_priv(dev); 523 u_char __iomem *ramBase = priv->ramBase; 524 525 /* Disable interrupts & save flags */ 526 spin_lock_irqsave(&priv->spinlock, flags); 527 528 scramble_key = (key[0] << 8) | key[1]; 529 wait_WOC(iobase); 530 writeb(NETWAVE_CMD_SSK, ramBase + NETWAVE_EREG_CB + 0); 531 writeb(scramble_key & 0xff, ramBase + NETWAVE_EREG_CB + 1); 532 writeb((scramble_key>>8) & 0xff, ramBase + NETWAVE_EREG_CB + 2); 533 writeb(NETWAVE_CMD_EOC, ramBase + NETWAVE_EREG_CB + 3); 534 535 /* ReEnable interrupts & restore flags */ 536 spin_unlock_irqrestore(&priv->spinlock, flags); 537 538 return 0; 539} 540 541/* 542 * Wireless Handler : get scramble key 543 */ 544static int netwave_get_scramble(struct net_device *dev, 545 struct iw_request_info *info, 546 union iwreq_data *wrqu, 547 char *key) 548{ 549 key[1] = scramble_key & 0xff; 550 key[0] = (scramble_key>>8) & 0xff; 551 wrqu->encoding.flags = IW_ENCODE_ENABLED; 552 wrqu->encoding.length = 2; 553 return 0; 554} 555 556/* 557 * Wireless Handler : get mode 558 */ 559static int netwave_get_mode(struct net_device *dev, 560 struct iw_request_info *info, 561 union iwreq_data *wrqu, 562 char *extra) 563{ 564 if(domain & 0x100) 565 wrqu->mode = IW_MODE_INFRA; 566 else 567 wrqu->mode = IW_MODE_ADHOC; 568 569 return 0; 570} 571 572/* 573 * Wireless Handler : get range info 574 */ 575static int netwave_get_range(struct net_device *dev, 576 struct iw_request_info *info, 577 union iwreq_data *wrqu, 578 char *extra) 579{ 580 struct iw_range *range = (struct iw_range *) extra; 581 int ret = 0; 582 583 /* Set the length (very important for backward compatibility) */ 584 wrqu->data.length = sizeof(struct iw_range); 585 586 /* Set all the info we don't care or don't know about to zero */ 587 memset(range, 0, sizeof(struct iw_range)); 588 589 /* Set the Wireless Extension versions */ 590 range->we_version_compiled = WIRELESS_EXT; 591 range->we_version_source = 9; /* Nothing for us in v10 and v11 */ 592 593 /* Set information in the range struct */ 594 range->throughput = 450 * 1000; /* don't argue on this ! */ 595 range->min_nwid = 0x0000; 596 range->max_nwid = 0x01FF; 597 598 range->num_channels = range->num_frequency = 0; 599 600 range->sensitivity = 0x3F; 601 range->max_qual.qual = 255; 602 range->max_qual.level = 255; 603 range->max_qual.noise = 0; 604 605 range->num_bitrates = 1; 606 range->bitrate[0] = 1000000; /* 1 Mb/s */ 607 608 range->encoding_size[0] = 2; /* 16 bits scrambling */ 609 range->num_encoding_sizes = 1; 610 range->max_encoding_tokens = 1; /* Only one key possible */ 611 612 return ret; 613} 614 615/* 616 * Wireless Private Handler : get snapshot 617 */ 618static int netwave_get_snap(struct net_device *dev, 619 struct iw_request_info *info, 620 union iwreq_data *wrqu, 621 char *extra) 622{ 623 unsigned long flags; 624 unsigned int iobase = dev->base_addr; 625 netwave_private *priv = netdev_priv(dev); 626 u_char __iomem *ramBase = priv->ramBase; 627 628 /* Disable interrupts & save flags */ 629 spin_lock_irqsave(&priv->spinlock, flags); 630 631 /* Take snapshot of environment */ 632 netwave_snapshot( priv, ramBase, iobase); 633 wrqu->data.length = priv->nss.length; 634 memcpy(extra, (u_char *) &priv->nss, sizeof( struct site_survey)); 635 636 priv->lastExec = jiffies; 637 638 /* ReEnable interrupts & restore flags */ 639 spin_unlock_irqrestore(&priv->spinlock, flags); 640 641 return(0); 642} 643 644/* 645 * Structures to export the Wireless Handlers 646 * This is the stuff that are treated the wireless extensions (iwconfig) 647 */ 648 649static const struct iw_priv_args netwave_private_args[] = { 650/*{ cmd, set_args, get_args, name } */ 651 { SIOCGIPSNAP, 0, 652 IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | sizeof(struct site_survey), 653 "getsitesurvey" }, 654}; 655 656static const iw_handler netwave_handler[] = 657{ 658 NULL, /* SIOCSIWNAME */ 659 netwave_get_name, /* SIOCGIWNAME */ 660 netwave_set_nwid, /* SIOCSIWNWID */ 661 netwave_get_nwid, /* SIOCGIWNWID */ 662 NULL, /* SIOCSIWFREQ */ 663 NULL, /* SIOCGIWFREQ */ 664 NULL, /* SIOCSIWMODE */ 665 netwave_get_mode, /* SIOCGIWMODE */ 666 NULL, /* SIOCSIWSENS */ 667 NULL, /* SIOCGIWSENS */ 668 NULL, /* SIOCSIWRANGE */ 669 netwave_get_range, /* SIOCGIWRANGE */ 670 NULL, /* SIOCSIWPRIV */ 671 NULL, /* SIOCGIWPRIV */ 672 NULL, /* SIOCSIWSTATS */ 673 NULL, /* SIOCGIWSTATS */ 674 NULL, /* SIOCSIWSPY */ 675 NULL, /* SIOCGIWSPY */ 676 NULL, /* -- hole -- */ 677 NULL, /* -- hole -- */ 678 NULL, /* SIOCSIWAP */ 679 NULL, /* SIOCGIWAP */ 680 NULL, /* -- hole -- */ 681 NULL, /* SIOCGIWAPLIST */ 682 NULL, /* -- hole -- */ 683 NULL, /* -- hole -- */ 684 NULL, /* SIOCSIWESSID */ 685 NULL, /* SIOCGIWESSID */ 686 NULL, /* SIOCSIWNICKN */ 687 NULL, /* SIOCGIWNICKN */ 688 NULL, /* -- hole -- */ 689 NULL, /* -- hole -- */ 690 NULL, /* SIOCSIWRATE */ 691 NULL, /* SIOCGIWRATE */ 692 NULL, /* SIOCSIWRTS */ 693 NULL, /* SIOCGIWRTS */ 694 NULL, /* SIOCSIWFRAG */ 695 NULL, /* SIOCGIWFRAG */ 696 NULL, /* SIOCSIWTXPOW */ 697 NULL, /* SIOCGIWTXPOW */ 698 NULL, /* SIOCSIWRETRY */ 699 NULL, /* SIOCGIWRETRY */ 700 netwave_set_scramble, /* SIOCSIWENCODE */ 701 netwave_get_scramble, /* SIOCGIWENCODE */ 702}; 703 704static const iw_handler netwave_private_handler[] = 705{ 706 NULL, /* SIOCIWFIRSTPRIV */ 707 netwave_get_snap, /* SIOCIWFIRSTPRIV + 1 */ 708}; 709 710static const struct iw_handler_def netwave_handler_def = 711{ 712 .num_standard = ARRAY_SIZE(netwave_handler), 713 .num_private = ARRAY_SIZE(netwave_private_handler), 714 .num_private_args = ARRAY_SIZE(netwave_private_args), 715 .standard = (iw_handler *) netwave_handler, 716 .private = (iw_handler *) netwave_private_handler, 717 .private_args = (struct iw_priv_args *) netwave_private_args, 718 .get_wireless_stats = netwave_get_wireless_stats, 719}; 720 721/* 722 * Function netwave_pcmcia_config (link) 723 * 724 * netwave_pcmcia_config() is scheduled to run after a CARD_INSERTION 725 * event is received, to configure the PCMCIA socket, and to make the 726 * device available to the system. 727 * 728 */ 729 730#define CS_CHECK(fn, ret) \ 731do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) 732 733static int netwave_pcmcia_config(struct pcmcia_device *link) { 734 struct net_device *dev = link->priv; 735 netwave_private *priv = netdev_priv(dev); 736 int i, j, last_ret, last_fn; 737 win_req_t req; 738 memreq_t mem; 739 u_char __iomem *ramBase = NULL; 740 DECLARE_MAC_BUF(mac); 741 742 DEBUG(0, "netwave_pcmcia_config(0x%p)\n", link); 743 744 /* 745 * Try allocating IO ports. This tries a few fixed addresses. 746 * If you want, you can also read the card's config table to 747 * pick addresses -- see the serial driver for an example. 748 */ 749 for (i = j = 0x0; j < 0x400; j += 0x20) { 750 link->io.BasePort1 = j ^ 0x300; 751 i = pcmcia_request_io(link, &link->io); 752 if (i == CS_SUCCESS) break; 753 } 754 if (i != CS_SUCCESS) { 755 cs_error(link, RequestIO, i); 756 goto failed; 757 } 758 759 /* 760 * Now allocate an interrupt line. Note that this does not 761 * actually assign a handler to the interrupt. 762 */ 763 CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq)); 764 765 /* 766 * This actually configures the PCMCIA socket -- setting up 767 * the I/O windows and the interrupt mapping. 768 */ 769 CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf)); 770 771 /* 772 * Allocate a 32K memory window. Note that the struct pcmcia_device 773 * structure provides space for one window handle -- if your 774 * device needs several windows, you'll need to keep track of 775 * the handles in your private data structure, dev->priv. 776 */ 777 DEBUG(1, "Setting mem speed of %d\n", mem_speed); 778 779 req.Attributes = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_CM|WIN_ENABLE; 780 req.Base = 0; req.Size = 0x8000; 781 req.AccessSpeed = mem_speed; 782 CS_CHECK(RequestWindow, pcmcia_request_window(&link, &req, &link->win)); 783 mem.CardOffset = 0x20000; mem.Page = 0; 784 CS_CHECK(MapMemPage, pcmcia_map_mem_page(link->win, &mem)); 785 786 /* Store base address of the common window frame */ 787 ramBase = ioremap(req.Base, 0x8000); 788 priv->ramBase = ramBase; 789 790 dev->irq = link->irq.AssignedIRQ; 791 dev->base_addr = link->io.BasePort1; 792 SET_NETDEV_DEV(dev, &handle_to_dev(link)); 793 794 if (register_netdev(dev) != 0) { 795 printk(KERN_DEBUG "netwave_cs: register_netdev() failed\n"); 796 goto failed; 797 } 798 799 strcpy(priv->node.dev_name, dev->name); 800 link->dev_node = &priv->node; 801 802 /* Reset card before reading physical address */ 803 netwave_doreset(dev->base_addr, ramBase); 804 805 /* Read the ethernet address and fill in the Netwave registers. */ 806 for (i = 0; i < 6; i++) 807 dev->dev_addr[i] = readb(ramBase + NETWAVE_EREG_PA + i); 808 809 printk(KERN_INFO "%s: Netwave: port %#3lx, irq %d, mem %lx, " 810 "id %c%c, hw_addr %s\n", 811 dev->name, dev->base_addr, dev->irq, 812 (u_long) ramBase, 813 (int) readb(ramBase+NETWAVE_EREG_NI), 814 (int) readb(ramBase+NETWAVE_EREG_NI+1), 815 print_mac(mac, dev->dev_addr)); 816 817 /* get revision words */ 818 printk(KERN_DEBUG "Netwave_reset: revision %04x %04x\n", 819 get_uint16(ramBase + NETWAVE_EREG_ARW), 820 get_uint16(ramBase + NETWAVE_EREG_ARW+2)); 821 return 0; 822 823cs_failed: 824 cs_error(link, last_fn, last_ret); 825failed: 826 netwave_release(link); 827 return -ENODEV; 828} /* netwave_pcmcia_config */ 829 830/* 831 * Function netwave_release (arg) 832 * 833 * After a card is removed, netwave_release() will unregister the net 834 * device, and release the PCMCIA configuration. If the device is 835 * still open, this will be postponed until it is closed. 836 */ 837static void netwave_release(struct pcmcia_device *link) 838{ 839 struct net_device *dev = link->priv; 840 netwave_private *priv = netdev_priv(dev); 841 842 DEBUG(0, "netwave_release(0x%p)\n", link); 843 844 pcmcia_disable_device(link); 845 if (link->win) 846 iounmap(priv->ramBase); 847} 848 849static int netwave_suspend(struct pcmcia_device *link) 850{ 851 struct net_device *dev = link->priv; 852 853 if (link->open) 854 netif_device_detach(dev); 855 856 return 0; 857} 858 859static int netwave_resume(struct pcmcia_device *link) 860{ 861 struct net_device *dev = link->priv; 862 863 if (link->open) { 864 netwave_reset(dev); 865 netif_device_attach(dev); 866 } 867 868 return 0; 869} 870 871 872/* 873 * Function netwave_doreset (ioBase, ramBase) 874 * 875 * Proper hardware reset of the card. 876 */ 877static void netwave_doreset(unsigned int ioBase, u_char __iomem *ramBase) 878{ 879 /* Reset card */ 880 wait_WOC(ioBase); 881 outb(0x80, ioBase + NETWAVE_REG_PMR); 882 writeb(0x08, ramBase + NETWAVE_EREG_ASCC); /* Bit 3 is WOC */ 883 outb(0x0, ioBase + NETWAVE_REG_PMR); /* release reset */ 884} 885 886/* 887 * Function netwave_reset (dev) 888 * 889 * Reset and restore all of the netwave registers 890 */ 891static void netwave_reset(struct net_device *dev) { 892 /* u_char state; */ 893 netwave_private *priv = netdev_priv(dev); 894 u_char __iomem *ramBase = priv->ramBase; 895 unsigned int iobase = dev->base_addr; 896 897 DEBUG(0, "netwave_reset: Done with hardware reset\n"); 898 899 priv->timeoutCounter = 0; 900 901 /* Reset card */ 902 netwave_doreset(iobase, ramBase); 903 printk(KERN_DEBUG "netwave_reset: Done with hardware reset\n"); 904 905 /* Write a NOP to check the card */ 906 wait_WOC(iobase); 907 writeb(NETWAVE_CMD_NOP, ramBase + NETWAVE_EREG_CB + 0); 908 writeb(NETWAVE_CMD_EOC, ramBase + NETWAVE_EREG_CB + 1); 909 910 /* Set receive conf */ 911 wait_WOC(iobase); 912 writeb(NETWAVE_CMD_SRC, ramBase + NETWAVE_EREG_CB + 0); 913 writeb(rxConfRxEna + rxConfBcast, ramBase + NETWAVE_EREG_CB + 1); 914 writeb(NETWAVE_CMD_EOC, ramBase + NETWAVE_EREG_CB + 2); 915 916 /* Set transmit conf */ 917 wait_WOC(iobase); 918 writeb(NETWAVE_CMD_STC, ramBase + NETWAVE_EREG_CB + 0); 919 writeb(txConfTxEna, ramBase + NETWAVE_EREG_CB + 1); 920 writeb(NETWAVE_CMD_EOC, ramBase + NETWAVE_EREG_CB + 2); 921 922 /* Now set the MU Domain */ 923 printk(KERN_DEBUG "Setting domain to 0x%x%02x\n", (domain >> 8) & 0x01, domain & 0xff); 924 wait_WOC(iobase); 925 writeb(NETWAVE_CMD_SMD, ramBase + NETWAVE_EREG_CB + 0); 926 writeb(domain & 0xff, ramBase + NETWAVE_EREG_CB + 1); 927 writeb((domain>>8) & 0x01, ramBase + NETWAVE_EREG_CB + 2); 928 writeb(NETWAVE_CMD_EOC, ramBase + NETWAVE_EREG_CB + 3); 929 930 /* Set scramble key */ 931 printk(KERN_DEBUG "Setting scramble key to 0x%x\n", scramble_key); 932 wait_WOC(iobase); 933 writeb(NETWAVE_CMD_SSK, ramBase + NETWAVE_EREG_CB + 0); 934 writeb(scramble_key & 0xff, ramBase + NETWAVE_EREG_CB + 1); 935 writeb((scramble_key>>8) & 0xff, ramBase + NETWAVE_EREG_CB + 2); 936 writeb(NETWAVE_CMD_EOC, ramBase + NETWAVE_EREG_CB + 3); 937 938 /* Enable interrupts, bit 4 high to keep unused 939 * source from interrupting us, bit 2 high to 940 * set interrupt enable, 567 to enable TxDN, 941 * RxErr and RxRdy 942 */ 943 wait_WOC(iobase); 944 outb(imrConfIENA+imrConfRFU1, iobase + NETWAVE_REG_IMR); 945 946 /* Hent 4 bytes fra 0x170. Skal vaere 0a,29,88,36 947 * waitWOC 948 * skriv 80 til d000:3688 949 * sjekk om det ble 80 950 */ 951 952 /* Enable Receiver */ 953 wait_WOC(iobase); 954 writeb(NETWAVE_CMD_ER, ramBase + NETWAVE_EREG_CB + 0); 955 writeb(NETWAVE_CMD_EOC, ramBase + NETWAVE_EREG_CB + 1); 956 957 /* Set the IENA bit in COR */ 958 wait_WOC(iobase); 959 outb(corConfIENA + corConfLVLREQ, iobase + NETWAVE_REG_COR); 960} 961 962/* 963 * Function netwave_hw_xmit (data, len, dev) 964 */ 965static int netwave_hw_xmit(unsigned char* data, int len, 966 struct net_device* dev) { 967 unsigned long flags; 968 unsigned int TxFreeList, 969 curBuff, 970 MaxData, 971 DataOffset; 972 int tmpcount; 973 974 netwave_private *priv = netdev_priv(dev); 975 u_char __iomem * ramBase = priv->ramBase; 976 unsigned int iobase = dev->base_addr; 977 978 /* Disable interrupts & save flags */ 979 spin_lock_irqsave(&priv->spinlock, flags); 980 981 /* Check if there are transmit buffers available */ 982 wait_WOC(iobase); 983 if ((inb(iobase+NETWAVE_REG_ASR) & NETWAVE_ASR_TXBA) == 0) { 984 /* No buffers available */ 985 printk(KERN_DEBUG "netwave_hw_xmit: %s - no xmit buffers available.\n", 986 dev->name); 987 spin_unlock_irqrestore(&priv->spinlock, flags); 988 return 1; 989 } 990 991 priv->stats.tx_bytes += len; 992 993 DEBUG(3, "Transmitting with SPCQ %x SPU %x LIF %x ISPLQ %x\n", 994 readb(ramBase + NETWAVE_EREG_SPCQ), 995 readb(ramBase + NETWAVE_EREG_SPU), 996 readb(ramBase + NETWAVE_EREG_LIF), 997 readb(ramBase + NETWAVE_EREG_ISPLQ)); 998 999 /* Now try to insert it into the adapters free memory */ 1000 wait_WOC(iobase); 1001 TxFreeList = get_uint16(ramBase + NETWAVE_EREG_TDP); 1002 MaxData = get_uint16(ramBase + NETWAVE_EREG_TDP+2); 1003 DataOffset = get_uint16(ramBase + NETWAVE_EREG_TDP+4); 1004 1005 DEBUG(3, "TxFreeList %x, MaxData %x, DataOffset %x\n", 1006 TxFreeList, MaxData, DataOffset); 1007 1008 /* Copy packet to the adapter fragment buffers */ 1009 curBuff = TxFreeList; 1010 tmpcount = 0; 1011 while (tmpcount < len) { 1012 int tmplen = len - tmpcount; 1013 copy_to_pc(ramBase + curBuff + DataOffset, data + tmpcount, 1014 (tmplen < MaxData) ? tmplen : MaxData); 1015 tmpcount += MaxData; 1016 1017 /* Advance to next buffer */ 1018 curBuff = get_uint16(ramBase + curBuff); 1019 } 1020 1021 /* Now issue transmit list */ 1022 wait_WOC(iobase); 1023 writeb(NETWAVE_CMD_TL, ramBase + NETWAVE_EREG_CB + 0); 1024 writeb(len & 0xff, ramBase + NETWAVE_EREG_CB + 1); 1025 writeb((len>>8) & 0xff, ramBase + NETWAVE_EREG_CB + 2); 1026 writeb(NETWAVE_CMD_EOC, ramBase + NETWAVE_EREG_CB + 3); 1027 1028 spin_unlock_irqrestore(&priv->spinlock, flags); 1029 return 0; 1030} 1031 1032static int netwave_start_xmit(struct sk_buff *skb, struct net_device *dev) { 1033 /* This flag indicate that the hardware can't perform a transmission. 1034 * Theoritically, NET3 check it before sending a packet to the driver, 1035 * but in fact it never do that and pool continuously. 1036 * As the watchdog will abort too long transmissions, we are quite safe... 1037 */ 1038 1039 netif_stop_queue(dev); 1040 1041 { 1042 short length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN; 1043 unsigned char* buf = skb->data; 1044 1045 if (netwave_hw_xmit( buf, length, dev) == 1) { 1046 /* Some error, let's make them call us another time? */ 1047 netif_start_queue(dev); 1048 } 1049 dev->trans_start = jiffies; 1050 } 1051 dev_kfree_skb(skb); 1052 1053 return 0; 1054} /* netwave_start_xmit */ 1055 1056/* 1057 * Function netwave_interrupt (irq, dev_id) 1058 * 1059 * This function is the interrupt handler for the Netwave card. This 1060 * routine will be called whenever: 1061 * 1. A packet is received. 1062 * 2. A packet has successfully been transferred and the unit is 1063 * ready to transmit another packet. 1064 * 3. A command has completed execution. 1065 */ 1066static irqreturn_t netwave_interrupt(int irq, void* dev_id) 1067{ 1068 unsigned int iobase; 1069 u_char __iomem *ramBase; 1070 struct net_device *dev = (struct net_device *)dev_id; 1071 struct netwave_private *priv = netdev_priv(dev); 1072 struct pcmcia_device *link = priv->p_dev; 1073 int i; 1074 1075 if (!netif_device_present(dev)) 1076 return IRQ_NONE; 1077 1078 iobase = dev->base_addr; 1079 ramBase = priv->ramBase; 1080 1081 /* Now find what caused the interrupt, check while interrupts ready */ 1082 for (i = 0; i < 10; i++) { 1083 u_char status; 1084 1085 wait_WOC(iobase); 1086 if (!(inb(iobase+NETWAVE_REG_CCSR) & 0x02)) 1087 break; /* None of the interrupt sources asserted (normal exit) */ 1088 1089 status = inb(iobase + NETWAVE_REG_ASR); 1090 1091 if (!pcmcia_dev_present(link)) { 1092 DEBUG(1, "netwave_interrupt: Interrupt with status 0x%x " 1093 "from removed or suspended card!\n", status); 1094 break; 1095 } 1096 1097 /* RxRdy */ 1098 if (status & 0x80) { 1099 netwave_rx(dev); 1100 /* wait_WOC(iobase); */ 1101 /* RxRdy cannot be reset directly by the host */ 1102 } 1103 /* RxErr */ 1104 if (status & 0x40) { 1105 u_char rser; 1106 1107 rser = readb(ramBase + NETWAVE_EREG_RSER); 1108 1109 if (rser & 0x04) { 1110 ++priv->stats.rx_dropped; 1111 ++priv->stats.rx_crc_errors; 1112 } 1113 if (rser & 0x02) 1114 ++priv->stats.rx_frame_errors; 1115 1116 /* Clear the RxErr bit in RSER. RSER+4 is the 1117 * write part. Also clear the RxCRC (0x04) and 1118 * RxBig (0x02) bits if present */ 1119 wait_WOC(iobase); 1120 writeb(0x40 | (rser & 0x06), ramBase + NETWAVE_EREG_RSER + 4); 1121 1122 /* Write bit 6 high to ASCC to clear RxErr in ASR, 1123 * WOC must be set first! 1124 */ 1125 wait_WOC(iobase); 1126 writeb(0x40, ramBase + NETWAVE_EREG_ASCC); 1127 1128 /* Remember to count up priv->stats on error packets */ 1129 ++priv->stats.rx_errors; 1130 } 1131 /* TxDN */ 1132 if (status & 0x20) { 1133 int txStatus; 1134 1135 txStatus = readb(ramBase + NETWAVE_EREG_TSER); 1136 DEBUG(3, "Transmit done. TSER = %x id %x\n", 1137 txStatus, readb(ramBase + NETWAVE_EREG_TSER + 1)); 1138 1139 if (txStatus & 0x20) { 1140 /* Transmitting was okay, clear bits */ 1141 wait_WOC(iobase); 1142 writeb(0x2f, ramBase + NETWAVE_EREG_TSER + 4); 1143 ++priv->stats.tx_packets; 1144 } 1145 1146 if (txStatus & 0xd0) { 1147 if (txStatus & 0x80) { 1148 ++priv->stats.collisions; /* Because of /proc/net/dev*/ 1149 /* ++priv->stats.tx_aborted_errors; */ 1150 /* printk("Collision. %ld\n", jiffies - dev->trans_start); */ 1151 } 1152 if (txStatus & 0x40) 1153 ++priv->stats.tx_carrier_errors; 1154 /* 0x80 TxGU Transmit giveup - nine times and no luck 1155 * 0x40 TxNOAP No access point. Discarded packet. 1156 * 0x10 TxErr Transmit error. Always set when 1157 * TxGU and TxNOAP is set. (Those are the only ones 1158 * to set TxErr). 1159 */ 1160 DEBUG(3, "netwave_interrupt: TxDN with error status %x\n", 1161 txStatus); 1162 1163 /* Clear out TxGU, TxNOAP, TxErr and TxTrys */ 1164 wait_WOC(iobase); 1165 writeb(0xdf & txStatus, ramBase+NETWAVE_EREG_TSER+4); 1166 ++priv->stats.tx_errors; 1167 } 1168 DEBUG(3, "New status is TSER %x ASR %x\n", 1169 readb(ramBase + NETWAVE_EREG_TSER), 1170 inb(iobase + NETWAVE_REG_ASR)); 1171 1172 netif_wake_queue(dev); 1173 } 1174 /* TxBA, this would trigger on all error packets received */ 1175 /* if (status & 0x01) { 1176 DEBUG(4, "Transmit buffers available, %x\n", status); 1177 } 1178 */ 1179 } 1180 /* Handled if we looped at least one time - Jean II */ 1181 return IRQ_RETVAL(i); 1182} /* netwave_interrupt */ 1183 1184/* 1185 * Function netwave_watchdog (a) 1186 * 1187 * Watchdog : when we start a transmission, we set a timer in the 1188 * kernel. If the transmission complete, this timer is disabled. If 1189 * it expire, we reset the card. 1190 * 1191 */ 1192static void netwave_watchdog(struct net_device *dev) { 1193 1194 DEBUG(1, "%s: netwave_watchdog: watchdog timer expired\n", dev->name); 1195 netwave_reset(dev); 1196 dev->trans_start = jiffies; 1197 netif_wake_queue(dev); 1198} /* netwave_watchdog */ 1199 1200static struct net_device_stats *netwave_get_stats(struct net_device *dev) { 1201 netwave_private *priv = netdev_priv(dev); 1202 1203 update_stats(dev); 1204 1205 DEBUG(2, "netwave: SPCQ %x SPU %x LIF %x ISPLQ %x MHS %x rxtx %x" 1206 " %x tx %x %x %x %x\n", 1207 readb(priv->ramBase + NETWAVE_EREG_SPCQ), 1208 readb(priv->ramBase + NETWAVE_EREG_SPU), 1209 readb(priv->ramBase + NETWAVE_EREG_LIF), 1210 readb(priv->ramBase + NETWAVE_EREG_ISPLQ), 1211 readb(priv->ramBase + NETWAVE_EREG_MHS), 1212 readb(priv->ramBase + NETWAVE_EREG_EC + 0xe), 1213 readb(priv->ramBase + NETWAVE_EREG_EC + 0xf), 1214 readb(priv->ramBase + NETWAVE_EREG_EC + 0x18), 1215 readb(priv->ramBase + NETWAVE_EREG_EC + 0x19), 1216 readb(priv->ramBase + NETWAVE_EREG_EC + 0x1a), 1217 readb(priv->ramBase + NETWAVE_EREG_EC + 0x1b)); 1218 1219 return &priv->stats; 1220} 1221 1222static void update_stats(struct net_device *dev) { 1223 //unsigned long flags; 1224/* netwave_private *priv = netdev_priv(dev); */ 1225 1226 //spin_lock_irqsave(&priv->spinlock, flags); 1227 1228/* priv->stats.rx_packets = readb(priv->ramBase + 0x18e); 1229 priv->stats.tx_packets = readb(priv->ramBase + 0x18f); */ 1230 1231 //spin_unlock_irqrestore(&priv->spinlock, flags); 1232} 1233 1234static int netwave_rx(struct net_device *dev) 1235{ 1236 netwave_private *priv = netdev_priv(dev); 1237 u_char __iomem *ramBase = priv->ramBase; 1238 unsigned int iobase = dev->base_addr; 1239 u_char rxStatus; 1240 struct sk_buff *skb = NULL; 1241 unsigned int curBuffer, 1242 rcvList; 1243 int rcvLen; 1244 int tmpcount = 0; 1245 int dataCount, dataOffset; 1246 int i; 1247 u_char *ptr; 1248 1249 DEBUG(3, "xinw_rx: Receiving ... \n"); 1250 1251 /* Receive max 10 packets for now. */ 1252 for (i = 0; i < 10; i++) { 1253 /* Any packets? */ 1254 wait_WOC(iobase); 1255 rxStatus = readb(ramBase + NETWAVE_EREG_RSER); 1256 if ( !( rxStatus & 0x80)) /* No more packets */ 1257 break; 1258 1259 /* Check if multicast/broadcast or other */ 1260 /* multicast = (rxStatus & 0x20); */ 1261 1262 /* The receive list pointer and length of the packet */ 1263 wait_WOC(iobase); 1264 rcvLen = get_int16( ramBase + NETWAVE_EREG_RDP); 1265 rcvList = get_uint16( ramBase + NETWAVE_EREG_RDP + 2); 1266 1267 if (rcvLen < 0) { 1268 printk(KERN_DEBUG "netwave_rx: Receive packet with len %d\n", 1269 rcvLen); 1270 return 0; 1271 } 1272 1273 skb = dev_alloc_skb(rcvLen+5); 1274 if (skb == NULL) { 1275 DEBUG(1, "netwave_rx: Could not allocate an sk_buff of " 1276 "length %d\n", rcvLen); 1277 ++priv->stats.rx_dropped; 1278 /* Tell the adapter to skip the packet */ 1279 wait_WOC(iobase); 1280 writeb(NETWAVE_CMD_SRP, ramBase + NETWAVE_EREG_CB + 0); 1281 writeb(NETWAVE_CMD_EOC, ramBase + NETWAVE_EREG_CB + 1); 1282 return 0; 1283 } 1284 1285 skb_reserve( skb, 2); /* Align IP on 16 byte */ 1286 skb_put( skb, rcvLen); 1287 1288 /* Copy packet fragments to the skb data area */ 1289 ptr = (u_char*) skb->data; 1290 curBuffer = rcvList; 1291 tmpcount = 0; 1292 while ( tmpcount < rcvLen) { 1293 /* Get length and offset of current buffer */ 1294 dataCount = get_uint16( ramBase+curBuffer+2); 1295 dataOffset = get_uint16( ramBase+curBuffer+4); 1296 1297 copy_from_pc( ptr + tmpcount, 1298 ramBase+curBuffer+dataOffset, dataCount); 1299 1300 tmpcount += dataCount; 1301 1302 /* Point to next buffer */ 1303 curBuffer = get_uint16(ramBase + curBuffer); 1304 } 1305 1306 skb->protocol = eth_type_trans(skb,dev); 1307 /* Queue packet for network layer */ 1308 netif_rx(skb); 1309 1310 dev->last_rx = jiffies; 1311 priv->stats.rx_packets++; 1312 priv->stats.rx_bytes += rcvLen; 1313 1314 /* Got the packet, tell the adapter to skip it */ 1315 wait_WOC(iobase); 1316 writeb(NETWAVE_CMD_SRP, ramBase + NETWAVE_EREG_CB + 0); 1317 writeb(NETWAVE_CMD_EOC, ramBase + NETWAVE_EREG_CB + 1); 1318 DEBUG(3, "Packet reception ok\n"); 1319 } 1320 return 0; 1321} 1322 1323static int netwave_open(struct net_device *dev) { 1324 netwave_private *priv = netdev_priv(dev); 1325 struct pcmcia_device *link = priv->p_dev; 1326 1327 DEBUG(1, "netwave_open: starting.\n"); 1328 1329 if (!pcmcia_dev_present(link)) 1330 return -ENODEV; 1331 1332 link->open++; 1333 1334 netif_start_queue(dev); 1335 netwave_reset(dev); 1336 1337 return 0; 1338} 1339 1340static int netwave_close(struct net_device *dev) { 1341 netwave_private *priv = netdev_priv(dev); 1342 struct pcmcia_device *link = priv->p_dev; 1343 1344 DEBUG(1, "netwave_close: finishing.\n"); 1345 1346 link->open--; 1347 netif_stop_queue(dev); 1348 1349 return 0; 1350} 1351 1352static struct pcmcia_device_id netwave_ids[] = { 1353 PCMCIA_DEVICE_PROD_ID12("Xircom", "CreditCard Netwave", 0x2e3ee845, 0x54e28a28), 1354 PCMCIA_DEVICE_NULL, 1355}; 1356MODULE_DEVICE_TABLE(pcmcia, netwave_ids); 1357 1358static struct pcmcia_driver netwave_driver = { 1359 .owner = THIS_MODULE, 1360 .drv = { 1361 .name = "netwave_cs", 1362 }, 1363 .probe = netwave_probe, 1364 .remove = netwave_detach, 1365 .id_table = netwave_ids, 1366 .suspend = netwave_suspend, 1367 .resume = netwave_resume, 1368}; 1369 1370static int __init init_netwave_cs(void) 1371{ 1372 return pcmcia_register_driver(&netwave_driver); 1373} 1374 1375static void __exit exit_netwave_cs(void) 1376{ 1377 pcmcia_unregister_driver(&netwave_driver); 1378} 1379 1380module_init(init_netwave_cs); 1381module_exit(exit_netwave_cs); 1382 1383/* Set or clear the multicast filter for this adaptor. 1384 num_addrs == -1 Promiscuous mode, receive all packets 1385 num_addrs == 0 Normal mode, clear multicast list 1386 num_addrs > 0 Multicast mode, receive normal and MC packets, and do 1387 best-effort filtering. 1388 */ 1389static void set_multicast_list(struct net_device *dev) 1390{ 1391 unsigned int iobase = dev->base_addr; 1392 netwave_private *priv = netdev_priv(dev); 1393 u_char __iomem * ramBase = priv->ramBase; 1394 u_char rcvMode = 0; 1395 1396#ifdef PCMCIA_DEBUG 1397 if (pc_debug > 2) { 1398 static int old; 1399 if (old != dev->mc_count) { 1400 old = dev->mc_count; 1401 DEBUG(0, "%s: setting Rx mode to %d addresses.\n", 1402 dev->name, dev->mc_count); 1403 } 1404 } 1405#endif 1406 1407 if (dev->mc_count || (dev->flags & IFF_ALLMULTI)) { 1408 /* Multicast Mode */ 1409 rcvMode = rxConfRxEna + rxConfAMP + rxConfBcast; 1410 } else if (dev->flags & IFF_PROMISC) { 1411 /* Promiscous mode */ 1412 rcvMode = rxConfRxEna + rxConfPro + rxConfAMP + rxConfBcast; 1413 } else { 1414 /* Normal mode */ 1415 rcvMode = rxConfRxEna + rxConfBcast; 1416 } 1417 1418 /* printk("netwave set_multicast_list: rcvMode to %x\n", rcvMode);*/ 1419 /* Now set receive mode */ 1420 wait_WOC(iobase); 1421 writeb(NETWAVE_CMD_SRC, ramBase + NETWAVE_EREG_CB + 0); 1422 writeb(rcvMode, ramBase + NETWAVE_EREG_CB + 1); 1423 writeb(NETWAVE_CMD_EOC, ramBase + NETWAVE_EREG_CB + 2); 1424} 1425MODULE_LICENSE("GPL");