Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
pcnet_cs.c
Go to the documentation of this file.
1 /*======================================================================
2 
3  A PCMCIA ethernet driver for NS8390-based cards
4 
5  This driver supports the D-Link DE-650 and Linksys EthernetCard
6  cards, the newer D-Link and Linksys combo cards, Accton EN2212
7  cards, the RPTI EP400, and the PreMax PE-200 in non-shared-memory
8  mode, and the IBM Credit Card Adapter, the NE4100, the Thomas
9  Conrad ethernet card, and the Kingston KNE-PCM/x in shared-memory
10  mode. It will also handle the Socket EA card in either mode.
11 
12  Copyright (C) 1999 David A. Hinds -- [email protected]
13 
14  pcnet_cs.c 1.153 2003/11/09 18:53:09
15 
16  The network driver code is based on Donald Becker's NE2000 code:
17 
18  Written 1992,1993 by Donald Becker.
19  Copyright 1993 United States Government as represented by the
20  Director, National Security Agency. This software may be used and
21  distributed according to the terms of the GNU General Public License,
22  incorporated herein by reference.
23  Donald Becker may be reached at [email protected]
24 
25  Based also on Keith Moore's changes to Don Becker's code, for IBM
26  CCAE support. Drivers merged back together, and shared-memory
27  Socket EA support added, by Ken Raeburn, September 1995.
28 
29 ======================================================================*/
30 
31 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
32 
33 #include <linux/kernel.h>
34 #include <linux/module.h>
35 #include <linux/init.h>
36 #include <linux/ptrace.h>
37 #include <linux/string.h>
38 #include <linux/timer.h>
39 #include <linux/delay.h>
40 #include <linux/netdevice.h>
41 #include <linux/log2.h>
42 #include <linux/etherdevice.h>
43 #include <linux/mii.h>
44 #include "8390.h"
45 
46 #include <pcmcia/cistpl.h>
47 #include <pcmcia/ciscode.h>
48 #include <pcmcia/ds.h>
49 #include <pcmcia/cisreg.h>
50 
51 #include <asm/io.h>
52 #include <asm/byteorder.h>
53 #include <asm/uaccess.h>
54 
55 #define PCNET_CMD 0x00
56 #define PCNET_DATAPORT 0x10 /* NatSemi-defined port window offset. */
57 #define PCNET_RESET 0x1f /* Issue a read to reset, a write to clear. */
58 #define PCNET_MISC 0x18 /* For IBM CCAE and Socket EA cards */
59 
60 #define PCNET_START_PG 0x40 /* First page of TX buffer */
61 #define PCNET_STOP_PG 0x80 /* Last page +1 of RX ring */
62 
63 /* Socket EA cards have a larger packet buffer */
64 #define SOCKET_START_PG 0x01
65 #define SOCKET_STOP_PG 0xff
66 
67 #define PCNET_RDC_TIMEOUT (2*HZ/100) /* Max wait in jiffies for Tx RDC */
68 
69 static const char *if_names[] = { "auto", "10baseT", "10base2"};
70 
71 
72 /*====================================================================*/
73 
74 /* Module parameters */
75 
76 MODULE_AUTHOR("David Hinds <[email protected]>");
77 MODULE_DESCRIPTION("NE2000 compatible PCMCIA ethernet driver");
78 MODULE_LICENSE("GPL");
79 
80 #define INT_MODULE_PARM(n, v) static int n = v; module_param(n, int, 0)
81 
82 INT_MODULE_PARM(if_port, 1); /* Transceiver type */
83 INT_MODULE_PARM(use_big_buf, 1); /* use 64K packet buffer? */
84 INT_MODULE_PARM(mem_speed, 0); /* shared mem speed, in ns */
85 INT_MODULE_PARM(delay_output, 0); /* pause after xmit? */
86 INT_MODULE_PARM(delay_time, 4); /* in usec */
87 INT_MODULE_PARM(use_shmem, -1); /* use shared memory? */
88 INT_MODULE_PARM(full_duplex, 0); /* full duplex? */
89 
90 /* Ugh! Let the user hardwire the hardware address for queer cards */
91 static int hw_addr[6] = { 0, /* ... */ };
92 module_param_array(hw_addr, int, NULL, 0);
93 
94 /*====================================================================*/
95 
96 static void mii_phy_probe(struct net_device *dev);
97 static int pcnet_config(struct pcmcia_device *link);
98 static void pcnet_release(struct pcmcia_device *link);
99 static int pcnet_open(struct net_device *dev);
100 static int pcnet_close(struct net_device *dev);
101 static int ei_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
102 static irqreturn_t ei_irq_wrapper(int irq, void *dev_id);
103 static void ei_watchdog(u_long arg);
104 static void pcnet_reset_8390(struct net_device *dev);
105 static int set_config(struct net_device *dev, struct ifmap *map);
106 static int setup_shmem_window(struct pcmcia_device *link, int start_pg,
107  int stop_pg, int cm_offset);
108 static int setup_dma_config(struct pcmcia_device *link, int start_pg,
109  int stop_pg);
110 
111 static void pcnet_detach(struct pcmcia_device *p_dev);
112 
113 /*====================================================================*/
114 
115 typedef struct hw_info_t {
119 } hw_info_t;
120 
121 #define DELAY_OUTPUT 0x01
122 #define HAS_MISC_REG 0x02
123 #define USE_BIG_BUF 0x04
124 #define HAS_IBM_MISC 0x08
125 #define IS_DL10019 0x10
126 #define IS_DL10022 0x20
127 #define HAS_MII 0x40
128 #define USE_SHMEM 0x80 /* autodetected */
129 
130 #define AM79C9XX_HOME_PHY 0x00006B90 /* HomePNA PHY */
131 #define AM79C9XX_ETH_PHY 0x00006B70 /* 10baseT PHY */
132 #define MII_PHYID_REV_MASK 0xfffffff0
133 #define MII_PHYID_REG1 0x02
134 #define MII_PHYID_REG2 0x03
135 
136 static hw_info_t hw_info[] = {
137  { /* Accton EN2212 */ 0x0ff0, 0x00, 0x00, 0xe8, DELAY_OUTPUT },
138  { /* Allied Telesis LA-PCM */ 0x0ff0, 0x00, 0x00, 0xf4, 0 },
139  { /* APEX MultiCard */ 0x03f4, 0x00, 0x20, 0xe5, 0 },
140  { /* ASANTE FriendlyNet */ 0x4910, 0x00, 0x00, 0x94,
142  { /* Danpex EN-6200P2 */ 0x0110, 0x00, 0x40, 0xc7, 0 },
143  { /* DataTrek NetCard */ 0x0ff0, 0x00, 0x20, 0xe8, 0 },
144  { /* Dayna CommuniCard E */ 0x0110, 0x00, 0x80, 0x19, 0 },
145  { /* D-Link DE-650 */ 0x0040, 0x00, 0x80, 0xc8, 0 },
146  { /* EP-210 Ethernet */ 0x0110, 0x00, 0x40, 0x33, 0 },
147  { /* EP4000 Ethernet */ 0x01c0, 0x00, 0x00, 0xb4, 0 },
148  { /* Epson EEN10B */ 0x0ff0, 0x00, 0x00, 0x48,
150  { /* ELECOM Laneed LD-CDWA */ 0xb8, 0x08, 0x00, 0x42, 0 },
151  { /* Hypertec Ethernet */ 0x01c0, 0x00, 0x40, 0x4c, 0 },
152  { /* IBM CCAE */ 0x0ff0, 0x08, 0x00, 0x5a,
154  { /* IBM CCAE */ 0x0ff0, 0x00, 0x04, 0xac,
156  { /* IBM CCAE */ 0x0ff0, 0x00, 0x06, 0x29,
158  { /* IBM FME */ 0x0374, 0x08, 0x00, 0x5a,
160  { /* IBM FME */ 0x0374, 0x00, 0x04, 0xac,
162  { /* Kansai KLA-PCM/T */ 0x0ff0, 0x00, 0x60, 0x87,
164  { /* NSC DP83903 */ 0x0374, 0x08, 0x00, 0x17,
166  { /* NSC DP83903 */ 0x0374, 0x00, 0xc0, 0xa8,
168  { /* NSC DP83903 */ 0x0374, 0x00, 0xa0, 0xb0,
170  { /* NSC DP83903 */ 0x0198, 0x00, 0x20, 0xe0,
172  { /* I-O DATA PCLA/T */ 0x0ff0, 0x00, 0xa0, 0xb0, 0 },
173  { /* Katron PE-520 */ 0x0110, 0x00, 0x40, 0xf6, 0 },
174  { /* Kingston KNE-PCM/x */ 0x0ff0, 0x00, 0xc0, 0xf0,
176  { /* Kingston KNE-PCM/x */ 0x0ff0, 0xe2, 0x0c, 0x0f,
178  { /* Kingston KNE-PC2 */ 0x0180, 0x00, 0xc0, 0xf0, 0 },
179  { /* Maxtech PCN2000 */ 0x5000, 0x00, 0x00, 0xe8, 0 },
180  { /* NDC Instant-Link */ 0x003a, 0x00, 0x80, 0xc6, 0 },
181  { /* NE2000 Compatible */ 0x0ff0, 0x00, 0xa0, 0x0c, 0 },
182  { /* Network General Sniffer */ 0x0ff0, 0x00, 0x00, 0x65,
184  { /* Panasonic VEL211 */ 0x0ff0, 0x00, 0x80, 0x45,
186  { /* PreMax PE-200 */ 0x07f0, 0x00, 0x20, 0xe0, 0 },
187  { /* RPTI EP400 */ 0x0110, 0x00, 0x40, 0x95, 0 },
188  { /* SCM Ethernet */ 0x0ff0, 0x00, 0x20, 0xcb, 0 },
189  { /* Socket EA */ 0x4000, 0x00, 0xc0, 0x1b,
191  { /* Socket LP-E CF+ */ 0x01c0, 0x00, 0xc0, 0x1b, 0 },
192  { /* SuperSocket RE450T */ 0x0110, 0x00, 0xe0, 0x98, 0 },
193  { /* Volktek NPL-402CT */ 0x0060, 0x00, 0x40, 0x05, 0 },
194  { /* NEC PC-9801N-J12 */ 0x0ff0, 0x00, 0x00, 0x4c, 0 },
195  { /* PCMCIA Technology OEM */ 0x01c8, 0x00, 0xa0, 0x0c, 0 }
196 };
197 
198 #define NR_INFO ARRAY_SIZE(hw_info)
199 
200 static hw_info_t default_info = { 0, 0, 0, 0, 0 };
201 static hw_info_t dl10019_info = { 0, 0, 0, 0, IS_DL10019|HAS_MII };
202 static hw_info_t dl10022_info = { 0, 0, 0, 0, IS_DL10022|HAS_MII };
203 
204 typedef struct pcnet_dev_t {
205  struct pcmcia_device *p_dev;
207  void __iomem *base;
214 } pcnet_dev_t;
215 
216 static inline pcnet_dev_t *PRIV(struct net_device *dev)
217 {
218  char *p = netdev_priv(dev);
219  return (pcnet_dev_t *)(p + sizeof(struct ei_device));
220 }
221 
222 static const struct net_device_ops pcnet_netdev_ops = {
223  .ndo_open = pcnet_open,
224  .ndo_stop = pcnet_close,
225  .ndo_set_config = set_config,
226  .ndo_start_xmit = ei_start_xmit,
227  .ndo_get_stats = ei_get_stats,
228  .ndo_do_ioctl = ei_ioctl,
229  .ndo_set_rx_mode = ei_set_multicast_list,
230  .ndo_tx_timeout = ei_tx_timeout,
231  .ndo_change_mtu = eth_change_mtu,
232  .ndo_set_mac_address = eth_mac_addr,
233  .ndo_validate_addr = eth_validate_addr,
234 #ifdef CONFIG_NET_POLL_CONTROLLER
235  .ndo_poll_controller = ei_poll,
236 #endif
237 };
238 
239 static int pcnet_probe(struct pcmcia_device *link)
240 {
241  pcnet_dev_t *info;
242  struct net_device *dev;
243 
244  dev_dbg(&link->dev, "pcnet_attach()\n");
245 
246  /* Create new ethernet device */
247  dev = __alloc_ei_netdev(sizeof(pcnet_dev_t));
248  if (!dev) return -ENOMEM;
249  info = PRIV(dev);
250  info->p_dev = link;
251  link->priv = dev;
252 
253  link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_IO;
254 
255  dev->netdev_ops = &pcnet_netdev_ops;
256 
257  return pcnet_config(link);
258 } /* pcnet_attach */
259 
260 static void pcnet_detach(struct pcmcia_device *link)
261 {
262  struct net_device *dev = link->priv;
263 
264  dev_dbg(&link->dev, "pcnet_detach\n");
265 
266  unregister_netdev(dev);
267 
268  pcnet_release(link);
269 
270  free_netdev(dev);
271 } /* pcnet_detach */
272 
273 /*======================================================================
274 
275  This probes for a card's hardware address, for card types that
276  encode this information in their CIS.
277 
278 ======================================================================*/
279 
280 static hw_info_t *get_hwinfo(struct pcmcia_device *link)
281 {
282  struct net_device *dev = link->priv;
283  u_char __iomem *base, *virt;
284  int i, j;
285 
286  /* Allocate a small memory window */
287  link->resource[2]->flags |= WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE;
288  link->resource[2]->start = 0; link->resource[2]->end = 0;
289  i = pcmcia_request_window(link, link->resource[2], 0);
290  if (i != 0)
291  return NULL;
292 
293  virt = ioremap(link->resource[2]->start,
294  resource_size(link->resource[2]));
295  for (i = 0; i < NR_INFO; i++) {
296  pcmcia_map_mem_page(link, link->resource[2],
297  hw_info[i].offset & ~(resource_size(link->resource[2])-1));
298  base = &virt[hw_info[i].offset & (resource_size(link->resource[2])-1)];
299  if ((readb(base+0) == hw_info[i].a0) &&
300  (readb(base+2) == hw_info[i].a1) &&
301  (readb(base+4) == hw_info[i].a2)) {
302  for (j = 0; j < 6; j++)
303  dev->dev_addr[j] = readb(base + (j<<1));
304  break;
305  }
306  }
307 
308  iounmap(virt);
309  j = pcmcia_release_window(link, link->resource[2]);
310  return (i < NR_INFO) ? hw_info+i : NULL;
311 } /* get_hwinfo */
312 
313 /*======================================================================
314 
315  This probes for a card's hardware address by reading the PROM.
316  It checks the address against a list of known types, then falls
317  back to a simple NE2000 clone signature check.
318 
319 ======================================================================*/
320 
321 static hw_info_t *get_prom(struct pcmcia_device *link)
322 {
323  struct net_device *dev = link->priv;
324  unsigned int ioaddr = dev->base_addr;
325  u_char prom[32];
326  int i, j;
327 
328  /* This is lifted straight from drivers/net/ethernet/8390/ne.c */
329  struct {
331  } program_seq[] = {
332  {E8390_NODMA+E8390_PAGE0+E8390_STOP, E8390_CMD}, /* Select page 0*/
333  {0x48, EN0_DCFG}, /* Set byte-wide (0x48) access. */
334  {0x00, EN0_RCNTLO}, /* Clear the count regs. */
335  {0x00, EN0_RCNTHI},
336  {0x00, EN0_IMR}, /* Mask completion irq. */
337  {0xFF, EN0_ISR},
338  {E8390_RXOFF, EN0_RXCR}, /* 0x20 Set to monitor */
339  {E8390_TXOFF, EN0_TXCR}, /* 0x02 and loopback mode. */
340  {32, EN0_RCNTLO},
341  {0x00, EN0_RCNTHI},
342  {0x00, EN0_RSARLO}, /* DMA starting at 0x0000. */
343  {0x00, EN0_RSARHI},
345  };
346 
347  pcnet_reset_8390(dev);
348  mdelay(10);
349 
350  for (i = 0; i < ARRAY_SIZE(program_seq); i++)
351  outb_p(program_seq[i].value, ioaddr + program_seq[i].offset);
352 
353  for (i = 0; i < 32; i++)
354  prom[i] = inb(ioaddr + PCNET_DATAPORT);
355  for (i = 0; i < NR_INFO; i++) {
356  if ((prom[0] == hw_info[i].a0) &&
357  (prom[2] == hw_info[i].a1) &&
358  (prom[4] == hw_info[i].a2))
359  break;
360  }
361  if ((i < NR_INFO) || ((prom[28] == 0x57) && (prom[30] == 0x57))) {
362  for (j = 0; j < 6; j++)
363  dev->dev_addr[j] = prom[j<<1];
364  return (i < NR_INFO) ? hw_info+i : &default_info;
365  }
366  return NULL;
367 } /* get_prom */
368 
369 /*======================================================================
370 
371  For DL10019 based cards, like the Linksys EtherFast
372 
373 ======================================================================*/
374 
375 static hw_info_t *get_dl10019(struct pcmcia_device *link)
376 {
377  struct net_device *dev = link->priv;
378  int i;
379  u_char sum;
380 
381  for (sum = 0, i = 0x14; i < 0x1c; i++)
382  sum += inb_p(dev->base_addr + i);
383  if (sum != 0xff)
384  return NULL;
385  for (i = 0; i < 6; i++)
386  dev->dev_addr[i] = inb_p(dev->base_addr + 0x14 + i);
387  i = inb(dev->base_addr + 0x1f);
388  return ((i == 0x91)||(i == 0x99)) ? &dl10022_info : &dl10019_info;
389 }
390 
391 /*======================================================================
392 
393  For Asix AX88190 based cards
394 
395 ======================================================================*/
396 
397 static hw_info_t *get_ax88190(struct pcmcia_device *link)
398 {
399  struct net_device *dev = link->priv;
400  unsigned int ioaddr = dev->base_addr;
401  int i, j;
402 
403  /* Not much of a test, but the alternatives are messy */
404  if (link->config_base != 0x03c0)
405  return NULL;
406 
407  outb_p(0x01, ioaddr + EN0_DCFG); /* Set word-wide access. */
408  outb_p(0x00, ioaddr + EN0_RSARLO); /* DMA starting at 0x0400. */
409  outb_p(0x04, ioaddr + EN0_RSARHI);
411 
412  for (i = 0; i < 6; i += 2) {
413  j = inw(ioaddr + PCNET_DATAPORT);
414  dev->dev_addr[i] = j & 0xff;
415  dev->dev_addr[i+1] = j >> 8;
416  }
417  return NULL;
418 }
419 
420 /*======================================================================
421 
422  This should be totally unnecessary... but when we can't figure
423  out the hardware address any other way, we'll let the user hard
424  wire it when the module is initialized.
425 
426 ======================================================================*/
427 
428 static hw_info_t *get_hwired(struct pcmcia_device *link)
429 {
430  struct net_device *dev = link->priv;
431  int i;
432 
433  for (i = 0; i < 6; i++)
434  if (hw_addr[i] != 0) break;
435  if (i == 6)
436  return NULL;
437 
438  for (i = 0; i < 6; i++)
439  dev->dev_addr[i] = hw_addr[i];
440 
441  return &default_info;
442 } /* get_hwired */
443 
444 static int try_io_port(struct pcmcia_device *link)
445 {
446  int j, ret;
447  link->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
448  link->resource[1]->flags &= ~IO_DATA_PATH_WIDTH;
449  if (link->resource[0]->end == 32) {
450  link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
451  if (link->resource[1]->end > 0) {
452  /* for master/slave multifunction cards */
453  link->resource[1]->flags |= IO_DATA_PATH_WIDTH_8;
454  }
455  } else {
456  /* This should be two 16-port windows */
457  link->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
458  link->resource[1]->flags |= IO_DATA_PATH_WIDTH_16;
459  }
460  if (link->resource[0]->start == 0) {
461  for (j = 0; j < 0x400; j += 0x20) {
462  link->resource[0]->start = j ^ 0x300;
463  link->resource[1]->start = (j ^ 0x300) + 0x10;
464  link->io_lines = 16;
465  ret = pcmcia_request_io(link);
466  if (ret == 0)
467  return ret;
468  }
469  return ret;
470  } else {
471  return pcmcia_request_io(link);
472  }
473 }
474 
475 static int pcnet_confcheck(struct pcmcia_device *p_dev, void *priv_data)
476 {
477  int *priv = priv_data;
478  int try = (*priv & 0x1);
479 
480  *priv &= (p_dev->resource[2]->end >= 0x4000) ? 0x10 : ~0x10;
481 
482  if (p_dev->config_index == 0)
483  return -EINVAL;
484 
485  if (p_dev->resource[0]->end + p_dev->resource[1]->end < 32)
486  return -EINVAL;
487 
488  if (try)
489  p_dev->io_lines = 16;
490  return try_io_port(p_dev);
491 }
492 
493 static hw_info_t *pcnet_try_config(struct pcmcia_device *link,
494  int *has_shmem, int try)
495 {
496  struct net_device *dev = link->priv;
497  hw_info_t *local_hw_info;
498  pcnet_dev_t *info = PRIV(dev);
499  int priv = try;
500  int ret;
501 
502  ret = pcmcia_loop_config(link, pcnet_confcheck, &priv);
503  if (ret) {
504  dev_warn(&link->dev, "no useable port range found\n");
505  return NULL;
506  }
507  *has_shmem = (priv & 0x10);
508 
509  if (!link->irq)
510  return NULL;
511 
512  if (resource_size(link->resource[1]) == 8)
513  link->config_flags |= CONF_ENABLE_SPKR;
514 
515  if ((link->manf_id == MANFID_IBM) &&
516  (link->card_id == PRODID_IBM_HOME_AND_AWAY))
517  link->config_index |= 0x10;
518 
519  ret = pcmcia_enable_device(link);
520  if (ret)
521  return NULL;
522 
523  dev->irq = link->irq;
524  dev->base_addr = link->resource[0]->start;
525 
526  if (info->flags & HAS_MISC_REG) {
527  if ((if_port == 1) || (if_port == 2))
528  dev->if_port = if_port;
529  else
530  dev_notice(&link->dev, "invalid if_port requested\n");
531  } else
532  dev->if_port = 0;
533 
534  if ((link->config_base == 0x03c0) &&
535  (link->manf_id == 0x149) && (link->card_id == 0xc1ab)) {
536  dev_info(&link->dev,
537  "this is an AX88190 card - use axnet_cs instead.\n");
538  return NULL;
539  }
540 
541  local_hw_info = get_hwinfo(link);
542  if (!local_hw_info)
543  local_hw_info = get_prom(link);
544  if (!local_hw_info)
545  local_hw_info = get_dl10019(link);
546  if (!local_hw_info)
547  local_hw_info = get_ax88190(link);
548  if (!local_hw_info)
549  local_hw_info = get_hwired(link);
550 
551  return local_hw_info;
552 }
553 
554 static int pcnet_config(struct pcmcia_device *link)
555 {
556  struct net_device *dev = link->priv;
557  pcnet_dev_t *info = PRIV(dev);
558  int start_pg, stop_pg, cm_offset;
559  int has_shmem = 0;
560  hw_info_t *local_hw_info;
561 
562  dev_dbg(&link->dev, "pcnet_config\n");
563 
564  local_hw_info = pcnet_try_config(link, &has_shmem, 0);
565  if (!local_hw_info) {
566  /* check whether forcing io_lines to 16 helps... */
567  pcmcia_disable_device(link);
568  local_hw_info = pcnet_try_config(link, &has_shmem, 1);
569  if (local_hw_info == NULL) {
570  dev_notice(&link->dev, "unable to read hardware net"
571  " address for io base %#3lx\n", dev->base_addr);
572  goto failed;
573  }
574  }
575 
576  info->flags = local_hw_info->flags;
577  /* Check for user overrides */
578  info->flags |= (delay_output) ? DELAY_OUTPUT : 0;
579  if ((link->manf_id == MANFID_SOCKET) &&
580  ((link->card_id == PRODID_SOCKET_LPE) ||
581  (link->card_id == PRODID_SOCKET_LPE_CF) ||
582  (link->card_id == PRODID_SOCKET_EIO)))
583  info->flags &= ~USE_BIG_BUF;
584  if (!use_big_buf)
585  info->flags &= ~USE_BIG_BUF;
586 
587  if (info->flags & USE_BIG_BUF) {
588  start_pg = SOCKET_START_PG;
589  stop_pg = SOCKET_STOP_PG;
590  cm_offset = 0x10000;
591  } else {
592  start_pg = PCNET_START_PG;
593  stop_pg = PCNET_STOP_PG;
594  cm_offset = 0;
595  }
596 
597  /* has_shmem is ignored if use_shmem != -1 */
598  if ((use_shmem == 0) || (!has_shmem && (use_shmem == -1)) ||
599  (setup_shmem_window(link, start_pg, stop_pg, cm_offset) != 0))
600  setup_dma_config(link, start_pg, stop_pg);
601 
602  ei_status.name = "NE2000";
603  ei_status.word16 = 1;
604  ei_status.reset_8390 = pcnet_reset_8390;
605 
606  if (info->flags & (IS_DL10019|IS_DL10022))
607  mii_phy_probe(dev);
608 
609  SET_NETDEV_DEV(dev, &link->dev);
610 
611  if (register_netdev(dev) != 0) {
612  pr_notice("register_netdev() failed\n");
613  goto failed;
614  }
615 
616  if (info->flags & (IS_DL10019|IS_DL10022)) {
617  u_char id = inb(dev->base_addr + 0x1a);
618  netdev_info(dev, "NE2000 (DL100%d rev %02x): ",
619  (info->flags & IS_DL10022) ? 22 : 19, id);
620  if (info->pna_phy)
621  pr_cont("PNA, ");
622  } else {
623  netdev_info(dev, "NE2000 Compatible: ");
624  }
625  pr_cont("io %#3lx, irq %d,", dev->base_addr, dev->irq);
626  if (info->flags & USE_SHMEM)
627  pr_cont(" mem %#5lx,", dev->mem_start);
628  if (info->flags & HAS_MISC_REG)
629  pr_cont(" %s xcvr,", if_names[dev->if_port]);
630  pr_cont(" hw_addr %pM\n", dev->dev_addr);
631  return 0;
632 
633 failed:
634  pcnet_release(link);
635  return -ENODEV;
636 } /* pcnet_config */
637 
638 static void pcnet_release(struct pcmcia_device *link)
639 {
640  pcnet_dev_t *info = PRIV(link->priv);
641 
642  dev_dbg(&link->dev, "pcnet_release\n");
643 
644  if (info->flags & USE_SHMEM)
645  iounmap(info->base);
646 
647  pcmcia_disable_device(link);
648 }
649 
650 static int pcnet_suspend(struct pcmcia_device *link)
651 {
652  struct net_device *dev = link->priv;
653 
654  if (link->open)
655  netif_device_detach(dev);
656 
657  return 0;
658 }
659 
660 static int pcnet_resume(struct pcmcia_device *link)
661 {
662  struct net_device *dev = link->priv;
663 
664  if (link->open) {
665  pcnet_reset_8390(dev);
666  NS8390_init(dev, 1);
667  netif_device_attach(dev);
668  }
669 
670  return 0;
671 }
672 
673 
674 /*======================================================================
675 
676  MII interface support for DL10019 and DL10022 based cards
677 
678  On the DL10019, the MII IO direction bit is 0x10; on the DL10022
679  it is 0x20. Setting both bits seems to work on both card types.
680 
681 ======================================================================*/
682 
683 #define DLINK_GPIO 0x1c
684 #define DLINK_DIAG 0x1d
685 #define DLINK_EEPROM 0x1e
686 
687 #define MDIO_SHIFT_CLK 0x80
688 #define MDIO_DATA_OUT 0x40
689 #define MDIO_DIR_WRITE 0x30
690 #define MDIO_DATA_WRITE0 (MDIO_DIR_WRITE)
691 #define MDIO_DATA_WRITE1 (MDIO_DIR_WRITE | MDIO_DATA_OUT)
692 #define MDIO_DATA_READ 0x10
693 #define MDIO_MASK 0x0f
694 
695 static void mdio_sync(unsigned int addr)
696 {
697  int bits, mask = inb(addr) & MDIO_MASK;
698  for (bits = 0; bits < 32; bits++) {
699  outb(mask | MDIO_DATA_WRITE1, addr);
700  outb(mask | MDIO_DATA_WRITE1 | MDIO_SHIFT_CLK, addr);
701  }
702 }
703 
704 static int mdio_read(unsigned int addr, int phy_id, int loc)
705 {
706  u_int cmd = (0x06<<10)|(phy_id<<5)|loc;
707  int i, retval = 0, mask = inb(addr) & MDIO_MASK;
708 
709  mdio_sync(addr);
710  for (i = 13; i >= 0; i--) {
711  int dat = (cmd&(1<<i)) ? MDIO_DATA_WRITE1 : MDIO_DATA_WRITE0;
712  outb(mask | dat, addr);
713  outb(mask | dat | MDIO_SHIFT_CLK, addr);
714  }
715  for (i = 19; i > 0; i--) {
716  outb(mask, addr);
717  retval = (retval << 1) | ((inb(addr) & MDIO_DATA_READ) != 0);
718  outb(mask | MDIO_SHIFT_CLK, addr);
719  }
720  return (retval>>1) & 0xffff;
721 }
722 
723 static void mdio_write(unsigned int addr, int phy_id, int loc, int value)
724 {
725  u_int cmd = (0x05<<28)|(phy_id<<23)|(loc<<18)|(1<<17)|value;
726  int i, mask = inb(addr) & MDIO_MASK;
727 
728  mdio_sync(addr);
729  for (i = 31; i >= 0; i--) {
730  int dat = (cmd&(1<<i)) ? MDIO_DATA_WRITE1 : MDIO_DATA_WRITE0;
731  outb(mask | dat, addr);
732  outb(mask | dat | MDIO_SHIFT_CLK, addr);
733  }
734  for (i = 1; i >= 0; i--) {
735  outb(mask, addr);
736  outb(mask | MDIO_SHIFT_CLK, addr);
737  }
738 }
739 
740 /*======================================================================
741 
742  EEPROM access routines for DL10019 and DL10022 based cards
743 
744 ======================================================================*/
745 
746 #define EE_EEP 0x40
747 #define EE_ASIC 0x10
748 #define EE_CS 0x08
749 #define EE_CK 0x04
750 #define EE_DO 0x02
751 #define EE_DI 0x01
752 #define EE_ADOT 0x01 /* DataOut for ASIC */
753 #define EE_READ_CMD 0x06
754 
755 #define DL19FDUPLX 0x0400 /* DL10019 Full duplex mode */
756 
757 static int read_eeprom(unsigned int ioaddr, int location)
758 {
759  int i, retval = 0;
760  unsigned int ee_addr = ioaddr + DLINK_EEPROM;
761  int read_cmd = location | (EE_READ_CMD << 8);
762 
763  outb(0, ee_addr);
764  outb(EE_EEP|EE_CS, ee_addr);
765 
766  /* Shift the read command bits out. */
767  for (i = 10; i >= 0; i--) {
768  short dataval = (read_cmd & (1 << i)) ? EE_DO : 0;
769  outb_p(EE_EEP|EE_CS|dataval, ee_addr);
770  outb_p(EE_EEP|EE_CS|dataval|EE_CK, ee_addr);
771  }
772  outb(EE_EEP|EE_CS, ee_addr);
773 
774  for (i = 16; i > 0; i--) {
775  outb_p(EE_EEP|EE_CS | EE_CK, ee_addr);
776  retval = (retval << 1) | ((inb(ee_addr) & EE_DI) ? 1 : 0);
777  outb_p(EE_EEP|EE_CS, ee_addr);
778  }
779 
780  /* Terminate the EEPROM access. */
781  outb(0, ee_addr);
782  return retval;
783 }
784 
785 /*
786  The internal ASIC registers can be changed by EEPROM READ access
787  with EE_ASIC bit set.
788  In ASIC mode, EE_ADOT is used to output the data to the ASIC.
789 */
790 
791 static void write_asic(unsigned int ioaddr, int location, short asic_data)
792 {
793  int i;
794  unsigned int ee_addr = ioaddr + DLINK_EEPROM;
795  short dataval;
796  int read_cmd = location | (EE_READ_CMD << 8);
797 
798  asic_data |= read_eeprom(ioaddr, location);
799 
800  outb(0, ee_addr);
801  outb(EE_ASIC|EE_CS|EE_DI, ee_addr);
802 
803  read_cmd = read_cmd >> 1;
804 
805  /* Shift the read command bits out. */
806  for (i = 9; i >= 0; i--) {
807  dataval = (read_cmd & (1 << i)) ? EE_DO : 0;
808  outb_p(EE_ASIC|EE_CS|EE_DI|dataval, ee_addr);
809  outb_p(EE_ASIC|EE_CS|EE_DI|dataval|EE_CK, ee_addr);
810  outb_p(EE_ASIC|EE_CS|EE_DI|dataval, ee_addr);
811  }
812  // sync
813  outb(EE_ASIC|EE_CS, ee_addr);
814  outb(EE_ASIC|EE_CS|EE_CK, ee_addr);
815  outb(EE_ASIC|EE_CS, ee_addr);
816 
817  for (i = 15; i >= 0; i--) {
818  dataval = (asic_data & (1 << i)) ? EE_ADOT : 0;
819  outb_p(EE_ASIC|EE_CS|dataval, ee_addr);
820  outb_p(EE_ASIC|EE_CS|dataval|EE_CK, ee_addr);
821  outb_p(EE_ASIC|EE_CS|dataval, ee_addr);
822  }
823 
824  /* Terminate the ASIC access. */
825  outb(EE_ASIC|EE_DI, ee_addr);
826  outb(EE_ASIC|EE_DI| EE_CK, ee_addr);
827  outb(EE_ASIC|EE_DI, ee_addr);
828 
829  outb(0, ee_addr);
830 }
831 
832 /*====================================================================*/
833 
834 static void set_misc_reg(struct net_device *dev)
835 {
836  unsigned int nic_base = dev->base_addr;
837  pcnet_dev_t *info = PRIV(dev);
838  u_char tmp;
839 
840  if (info->flags & HAS_MISC_REG) {
841  tmp = inb_p(nic_base + PCNET_MISC) & ~3;
842  if (dev->if_port == 2)
843  tmp |= 1;
844  if (info->flags & USE_BIG_BUF)
845  tmp |= 2;
846  if (info->flags & HAS_IBM_MISC)
847  tmp |= 8;
848  outb_p(tmp, nic_base + PCNET_MISC);
849  }
850  if (info->flags & IS_DL10022) {
851  if (info->flags & HAS_MII) {
852  /* Advertise 100F, 100H, 10F, 10H */
853  mdio_write(nic_base + DLINK_GPIO, info->eth_phy, 4, 0x01e1);
854  /* Restart MII autonegotiation */
855  mdio_write(nic_base + DLINK_GPIO, info->eth_phy, 0, 0x0000);
856  mdio_write(nic_base + DLINK_GPIO, info->eth_phy, 0, 0x1200);
857  info->mii_reset = jiffies;
858  } else {
859  outb(full_duplex ? 4 : 0, nic_base + DLINK_DIAG);
860  }
861  } else if (info->flags & IS_DL10019) {
862  /* Advertise 100F, 100H, 10F, 10H */
863  mdio_write(nic_base + DLINK_GPIO, info->eth_phy, 4, 0x01e1);
864  /* Restart MII autonegotiation */
865  mdio_write(nic_base + DLINK_GPIO, info->eth_phy, 0, 0x0000);
866  mdio_write(nic_base + DLINK_GPIO, info->eth_phy, 0, 0x1200);
867  }
868 }
869 
870 /*====================================================================*/
871 
872 static void mii_phy_probe(struct net_device *dev)
873 {
874  pcnet_dev_t *info = PRIV(dev);
875  unsigned int mii_addr = dev->base_addr + DLINK_GPIO;
876  int i;
877  u_int tmp, phyid;
878 
879  for (i = 31; i >= 0; i--) {
880  tmp = mdio_read(mii_addr, i, 1);
881  if ((tmp == 0) || (tmp == 0xffff))
882  continue;
883  tmp = mdio_read(mii_addr, i, MII_PHYID_REG1);
884  phyid = tmp << 16;
885  phyid |= mdio_read(mii_addr, i, MII_PHYID_REG2);
886  phyid &= MII_PHYID_REV_MASK;
887  netdev_dbg(dev, "MII at %d is 0x%08x\n", i, phyid);
888  if (phyid == AM79C9XX_HOME_PHY) {
889  info->pna_phy = i;
890  } else if (phyid != AM79C9XX_ETH_PHY) {
891  info->eth_phy = i;
892  }
893  }
894 }
895 
896 static int pcnet_open(struct net_device *dev)
897 {
898  int ret;
899  pcnet_dev_t *info = PRIV(dev);
900  struct pcmcia_device *link = info->p_dev;
901  unsigned int nic_base = dev->base_addr;
902 
903  dev_dbg(&link->dev, "pcnet_open('%s')\n", dev->name);
904 
905  if (!pcmcia_dev_present(link))
906  return -ENODEV;
907 
908  set_misc_reg(dev);
909 
910  outb_p(0xFF, nic_base + EN0_ISR); /* Clear bogus intr. */
911  ret = request_irq(dev->irq, ei_irq_wrapper, IRQF_SHARED, dev->name, dev);
912  if (ret)
913  return ret;
914 
915  link->open++;
916 
917  info->phy_id = info->eth_phy;
918  info->link_status = 0x00;
919  init_timer(&info->watchdog);
920  info->watchdog.function = ei_watchdog;
921  info->watchdog.data = (u_long)dev;
922  info->watchdog.expires = jiffies + HZ;
923  add_timer(&info->watchdog);
924 
925  return ei_open(dev);
926 } /* pcnet_open */
927 
928 /*====================================================================*/
929 
930 static int pcnet_close(struct net_device *dev)
931 {
932  pcnet_dev_t *info = PRIV(dev);
933  struct pcmcia_device *link = info->p_dev;
934 
935  dev_dbg(&link->dev, "pcnet_close('%s')\n", dev->name);
936 
937  ei_close(dev);
938  free_irq(dev->irq, dev);
939 
940  link->open--;
941  netif_stop_queue(dev);
942  del_timer_sync(&info->watchdog);
943 
944  return 0;
945 } /* pcnet_close */
946 
947 /*======================================================================
948 
949  Hard reset the card. This used to pause for the same period that
950  a 8390 reset command required, but that shouldn't be necessary.
951 
952 ======================================================================*/
953 
954 static void pcnet_reset_8390(struct net_device *dev)
955 {
956  unsigned int nic_base = dev->base_addr;
957  int i;
958 
959  ei_status.txing = ei_status.dmaing = 0;
960 
962 
963  outb(inb(nic_base + PCNET_RESET), nic_base + PCNET_RESET);
964 
965  for (i = 0; i < 100; i++) {
966  if ((inb_p(nic_base+EN0_ISR) & ENISR_RESET) != 0)
967  break;
968  udelay(100);
969  }
970  outb_p(ENISR_RESET, nic_base + EN0_ISR); /* Ack intr. */
971 
972  if (i == 100)
973  netdev_err(dev, "pcnet_reset_8390() did not complete.\n");
974 
975  set_misc_reg(dev);
976 
977 } /* pcnet_reset_8390 */
978 
979 /*====================================================================*/
980 
981 static int set_config(struct net_device *dev, struct ifmap *map)
982 {
983  pcnet_dev_t *info = PRIV(dev);
984  if ((map->port != (u_char)(-1)) && (map->port != dev->if_port)) {
985  if (!(info->flags & HAS_MISC_REG))
986  return -EOPNOTSUPP;
987  else if ((map->port < 1) || (map->port > 2))
988  return -EINVAL;
989  dev->if_port = map->port;
990  netdev_info(dev, "switched to %s port\n", if_names[dev->if_port]);
991  NS8390_init(dev, 1);
992  }
993  return 0;
994 }
995 
996 /*====================================================================*/
997 
998 static irqreturn_t ei_irq_wrapper(int irq, void *dev_id)
999 {
1000  struct net_device *dev = dev_id;
1001  pcnet_dev_t *info;
1002  irqreturn_t ret = ei_interrupt(irq, dev_id);
1003 
1004  if (ret == IRQ_HANDLED) {
1005  info = PRIV(dev);
1006  info->stale = 0;
1007  }
1008  return ret;
1009 }
1010 
1011 static void ei_watchdog(u_long arg)
1012 {
1013  struct net_device *dev = (struct net_device *)arg;
1014  pcnet_dev_t *info = PRIV(dev);
1015  unsigned int nic_base = dev->base_addr;
1016  unsigned int mii_addr = nic_base + DLINK_GPIO;
1017  u_short link;
1018 
1019  if (!netif_device_present(dev)) goto reschedule;
1020 
1021  /* Check for pending interrupt with expired latency timer: with
1022  this, we can limp along even if the interrupt is blocked */
1023  if (info->stale++ && (inb_p(nic_base + EN0_ISR) & ENISR_ALL)) {
1024  if (!info->fast_poll)
1025  netdev_info(dev, "interrupt(s) dropped!\n");
1026  ei_irq_wrapper(dev->irq, dev);
1027  info->fast_poll = HZ;
1028  }
1029  if (info->fast_poll) {
1030  info->fast_poll--;
1031  info->watchdog.expires = jiffies + 1;
1032  add_timer(&info->watchdog);
1033  return;
1034  }
1035 
1036  if (!(info->flags & HAS_MII))
1037  goto reschedule;
1038 
1039  mdio_read(mii_addr, info->phy_id, 1);
1040  link = mdio_read(mii_addr, info->phy_id, 1);
1041  if (!link || (link == 0xffff)) {
1042  if (info->eth_phy) {
1043  info->phy_id = info->eth_phy = 0;
1044  } else {
1045  netdev_info(dev, "MII is missing!\n");
1046  info->flags &= ~HAS_MII;
1047  }
1048  goto reschedule;
1049  }
1050 
1051  link &= 0x0004;
1052  if (link != info->link_status) {
1053  u_short p = mdio_read(mii_addr, info->phy_id, 5);
1054  netdev_info(dev, "%s link beat\n", link ? "found" : "lost");
1055  if (link && (info->flags & IS_DL10022)) {
1056  /* Disable collision detection on full duplex links */
1057  outb((p & 0x0140) ? 4 : 0, nic_base + DLINK_DIAG);
1058  } else if (link && (info->flags & IS_DL10019)) {
1059  /* Disable collision detection on full duplex links */
1060  write_asic(dev->base_addr, 4, (p & 0x140) ? DL19FDUPLX : 0);
1061  }
1062  if (link) {
1063  if (info->phy_id == info->eth_phy) {
1064  if (p)
1065  netdev_info(dev, "autonegotiation complete: "
1066  "%sbaseT-%cD selected\n",
1067  ((p & 0x0180) ? "100" : "10"),
1068  ((p & 0x0140) ? 'F' : 'H'));
1069  else
1070  netdev_info(dev, "link partner did not autonegotiate\n");
1071  }
1072  NS8390_init(dev, 1);
1073  }
1074  info->link_status = link;
1075  }
1076  if (info->pna_phy && time_after(jiffies, info->mii_reset + 6*HZ)) {
1077  link = mdio_read(mii_addr, info->eth_phy, 1) & 0x0004;
1078  if (((info->phy_id == info->pna_phy) && link) ||
1079  ((info->phy_id != info->pna_phy) && !link)) {
1080  /* isolate this MII and try flipping to the other one */
1081  mdio_write(mii_addr, info->phy_id, 0, 0x0400);
1082  info->phy_id ^= info->pna_phy ^ info->eth_phy;
1083  netdev_info(dev, "switched to %s transceiver\n",
1084  (info->phy_id == info->eth_phy) ? "ethernet" : "PNA");
1085  mdio_write(mii_addr, info->phy_id, 0,
1086  (info->phy_id == info->eth_phy) ? 0x1000 : 0);
1087  info->link_status = 0;
1088  info->mii_reset = jiffies;
1089  }
1090  }
1091 
1092 reschedule:
1093  info->watchdog.expires = jiffies + HZ;
1094  add_timer(&info->watchdog);
1095 }
1096 
1097 /*====================================================================*/
1098 
1099 
1100 static int ei_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
1101 {
1102  pcnet_dev_t *info = PRIV(dev);
1103  struct mii_ioctl_data *data = if_mii(rq);
1104  unsigned int mii_addr = dev->base_addr + DLINK_GPIO;
1105 
1106  if (!(info->flags & (IS_DL10019|IS_DL10022)))
1107  return -EINVAL;
1108 
1109  switch (cmd) {
1110  case SIOCGMIIPHY:
1111  data->phy_id = info->phy_id;
1112  case SIOCGMIIREG: /* Read MII PHY register. */
1113  data->val_out = mdio_read(mii_addr, data->phy_id, data->reg_num & 0x1f);
1114  return 0;
1115  case SIOCSMIIREG: /* Write MII PHY register. */
1116  mdio_write(mii_addr, data->phy_id, data->reg_num & 0x1f, data->val_in);
1117  return 0;
1118  }
1119  return -EOPNOTSUPP;
1120 }
1121 
1122 /*====================================================================*/
1123 
1124 static void dma_get_8390_hdr(struct net_device *dev,
1125  struct e8390_pkt_hdr *hdr,
1126  int ring_page)
1127 {
1128  unsigned int nic_base = dev->base_addr;
1129 
1130  if (ei_status.dmaing) {
1131  netdev_notice(dev, "DMAing conflict in dma_block_input."
1132  "[DMAstat:%1x][irqlock:%1x]\n",
1133  ei_status.dmaing, ei_status.irqlock);
1134  return;
1135  }
1136 
1137  ei_status.dmaing |= 0x01;
1139  outb_p(sizeof(struct e8390_pkt_hdr), nic_base + EN0_RCNTLO);
1140  outb_p(0, nic_base + EN0_RCNTHI);
1141  outb_p(0, nic_base + EN0_RSARLO); /* On page boundary */
1142  outb_p(ring_page, nic_base + EN0_RSARHI);
1143  outb_p(E8390_RREAD+E8390_START, nic_base + PCNET_CMD);
1144 
1145  insw(nic_base + PCNET_DATAPORT, hdr,
1146  sizeof(struct e8390_pkt_hdr)>>1);
1147  /* Fix for big endian systems */
1148  hdr->count = le16_to_cpu(hdr->count);
1149 
1150  outb_p(ENISR_RDC, nic_base + EN0_ISR); /* Ack intr. */
1151  ei_status.dmaing &= ~0x01;
1152 }
1153 
1154 /*====================================================================*/
1155 
1156 static void dma_block_input(struct net_device *dev, int count,
1157  struct sk_buff *skb, int ring_offset)
1158 {
1159  unsigned int nic_base = dev->base_addr;
1160  int xfer_count = count;
1161  char *buf = skb->data;
1162 
1163  if ((ei_debug > 4) && (count != 4))
1164  netdev_dbg(dev, "[bi=%d]\n", count+4);
1165  if (ei_status.dmaing) {
1166  netdev_notice(dev, "DMAing conflict in dma_block_input."
1167  "[DMAstat:%1x][irqlock:%1x]\n",
1168  ei_status.dmaing, ei_status.irqlock);
1169  return;
1170  }
1171  ei_status.dmaing |= 0x01;
1173  outb_p(count & 0xff, nic_base + EN0_RCNTLO);
1174  outb_p(count >> 8, nic_base + EN0_RCNTHI);
1175  outb_p(ring_offset & 0xff, nic_base + EN0_RSARLO);
1176  outb_p(ring_offset >> 8, nic_base + EN0_RSARHI);
1177  outb_p(E8390_RREAD+E8390_START, nic_base + PCNET_CMD);
1178 
1179  insw(nic_base + PCNET_DATAPORT,buf,count>>1);
1180  if (count & 0x01)
1181  buf[count-1] = inb(nic_base + PCNET_DATAPORT), xfer_count++;
1182 
1183  /* This was for the ALPHA version only, but enough people have been
1184  encountering problems that it is still here. */
1185 #ifdef PCMCIA_DEBUG
1186  if (ei_debug > 4) { /* DMA termination address check... */
1187  int addr, tries = 20;
1188  do {
1189  /* DON'T check for 'inb_p(EN0_ISR) & ENISR_RDC' here
1190  -- it's broken for Rx on some cards! */
1191  int high = inb_p(nic_base + EN0_RSARHI);
1192  int low = inb_p(nic_base + EN0_RSARLO);
1193  addr = (high << 8) + low;
1194  if (((ring_offset + xfer_count) & 0xff) == (addr & 0xff))
1195  break;
1196  } while (--tries > 0);
1197  if (tries <= 0)
1198  netdev_notice(dev, "RX transfer address mismatch,"
1199  "%#4.4x (expected) vs. %#4.4x (actual).\n",
1200  ring_offset + xfer_count, addr);
1201  }
1202 #endif
1203  outb_p(ENISR_RDC, nic_base + EN0_ISR); /* Ack intr. */
1204  ei_status.dmaing &= ~0x01;
1205 } /* dma_block_input */
1206 
1207 /*====================================================================*/
1208 
1209 static void dma_block_output(struct net_device *dev, int count,
1210  const u_char *buf, const int start_page)
1211 {
1212  unsigned int nic_base = dev->base_addr;
1213  pcnet_dev_t *info = PRIV(dev);
1214 #ifdef PCMCIA_DEBUG
1215  int retries = 0;
1216 #endif
1217  u_long dma_start;
1218 
1219 #ifdef PCMCIA_DEBUG
1220  if (ei_debug > 4)
1221  netdev_dbg(dev, "[bo=%d]\n", count);
1222 #endif
1223 
1224  /* Round the count up for word writes. Do we need to do this?
1225  What effect will an odd byte count have on the 8390?
1226  I should check someday. */
1227  if (count & 0x01)
1228  count++;
1229  if (ei_status.dmaing) {
1230  netdev_notice(dev, "DMAing conflict in dma_block_output."
1231  "[DMAstat:%1x][irqlock:%1x]\n",
1232  ei_status.dmaing, ei_status.irqlock);
1233  return;
1234  }
1235  ei_status.dmaing |= 0x01;
1236  /* We should already be in page 0, but to be safe... */
1238 
1239 #ifdef PCMCIA_DEBUG
1240  retry:
1241 #endif
1242 
1243  outb_p(ENISR_RDC, nic_base + EN0_ISR);
1244 
1245  /* Now the normal output. */
1246  outb_p(count & 0xff, nic_base + EN0_RCNTLO);
1247  outb_p(count >> 8, nic_base + EN0_RCNTHI);
1248  outb_p(0x00, nic_base + EN0_RSARLO);
1249  outb_p(start_page, nic_base + EN0_RSARHI);
1250 
1252  outsw(nic_base + PCNET_DATAPORT, buf, count>>1);
1253 
1254  dma_start = jiffies;
1255 
1256 #ifdef PCMCIA_DEBUG
1257  /* This was for the ALPHA version only, but enough people have been
1258  encountering problems that it is still here. */
1259  if (ei_debug > 4) { /* DMA termination address check... */
1260  int addr, tries = 20;
1261  do {
1262  int high = inb_p(nic_base + EN0_RSARHI);
1263  int low = inb_p(nic_base + EN0_RSARLO);
1264  addr = (high << 8) + low;
1265  if ((start_page << 8) + count == addr)
1266  break;
1267  } while (--tries > 0);
1268  if (tries <= 0) {
1269  netdev_notice(dev, "Tx packet transfer address mismatch,"
1270  "%#4.4x (expected) vs. %#4.4x (actual).\n",
1271  (start_page << 8) + count, addr);
1272  if (retries++ == 0)
1273  goto retry;
1274  }
1275  }
1276 #endif
1277 
1278  while ((inb_p(nic_base + EN0_ISR) & ENISR_RDC) == 0)
1279  if (time_after(jiffies, dma_start + PCNET_RDC_TIMEOUT)) {
1280  netdev_notice(dev, "timeout waiting for Tx RDC.\n");
1281  pcnet_reset_8390(dev);
1282  NS8390_init(dev, 1);
1283  break;
1284  }
1285 
1286  outb_p(ENISR_RDC, nic_base + EN0_ISR); /* Ack intr. */
1287  if (info->flags & DELAY_OUTPUT)
1288  udelay((long)delay_time);
1289  ei_status.dmaing &= ~0x01;
1290 }
1291 
1292 /*====================================================================*/
1293 
1294 static int setup_dma_config(struct pcmcia_device *link, int start_pg,
1295  int stop_pg)
1296 {
1297  struct net_device *dev = link->priv;
1298 
1299  ei_status.tx_start_page = start_pg;
1300  ei_status.rx_start_page = start_pg + TX_PAGES;
1301  ei_status.stop_page = stop_pg;
1302 
1303  /* set up block i/o functions */
1304  ei_status.get_8390_hdr = dma_get_8390_hdr;
1305  ei_status.block_input = dma_block_input;
1306  ei_status.block_output = dma_block_output;
1307 
1308  return 0;
1309 }
1310 
1311 /*====================================================================*/
1312 
1313 static void copyin(void *dest, void __iomem *src, int c)
1314 {
1315  u_short *d = dest;
1316  u_short __iomem *s = src;
1317  int odd;
1318 
1319  if (c <= 0)
1320  return;
1321  odd = (c & 1); c >>= 1;
1322 
1323  if (c) {
1324  do { *d++ = __raw_readw(s++); } while (--c);
1325  }
1326  /* get last byte by fetching a word and masking */
1327  if (odd)
1328  *((u_char *)d) = readw(s) & 0xff;
1329 }
1330 
1331 static void copyout(void __iomem *dest, const void *src, int c)
1332 {
1333  u_short __iomem *d = dest;
1334  const u_short *s = src;
1335  int odd;
1336 
1337  if (c <= 0)
1338  return;
1339  odd = (c & 1); c >>= 1;
1340 
1341  if (c) {
1342  do { __raw_writew(*s++, d++); } while (--c);
1343  }
1344  /* copy last byte doing a read-modify-write */
1345  if (odd)
1346  writew((readw(d) & 0xff00) | *(u_char *)s, d);
1347 }
1348 
1349 /*====================================================================*/
1350 
1351 static void shmem_get_8390_hdr(struct net_device *dev,
1352  struct e8390_pkt_hdr *hdr,
1353  int ring_page)
1354 {
1355  void __iomem *xfer_start = ei_status.mem + (TX_PAGES<<8)
1356  + (ring_page << 8)
1357  - (ei_status.rx_start_page << 8);
1358 
1359  copyin(hdr, xfer_start, sizeof(struct e8390_pkt_hdr));
1360  /* Fix for big endian systems */
1361  hdr->count = le16_to_cpu(hdr->count);
1362 }
1363 
1364 /*====================================================================*/
1365 
1366 static void shmem_block_input(struct net_device *dev, int count,
1367  struct sk_buff *skb, int ring_offset)
1368 {
1369  void __iomem *base = ei_status.mem;
1370  unsigned long offset = (TX_PAGES<<8) + ring_offset
1371  - (ei_status.rx_start_page << 8);
1372  char *buf = skb->data;
1373 
1374  if (offset + count > ei_status.priv) {
1375  /* We must wrap the input move. */
1376  int semi_count = ei_status.priv - offset;
1377  copyin(buf, base + offset, semi_count);
1378  buf += semi_count;
1379  offset = TX_PAGES<<8;
1380  count -= semi_count;
1381  }
1382  copyin(buf, base + offset, count);
1383 }
1384 
1385 /*====================================================================*/
1386 
1387 static void shmem_block_output(struct net_device *dev, int count,
1388  const u_char *buf, const int start_page)
1389 {
1390  void __iomem *shmem = ei_status.mem + (start_page << 8);
1391  shmem -= ei_status.tx_start_page << 8;
1392  copyout(shmem, buf, count);
1393 }
1394 
1395 /*====================================================================*/
1396 
1397 static int setup_shmem_window(struct pcmcia_device *link, int start_pg,
1398  int stop_pg, int cm_offset)
1399 {
1400  struct net_device *dev = link->priv;
1401  pcnet_dev_t *info = PRIV(dev);
1402  int i, window_size, offset, ret;
1403 
1404  window_size = (stop_pg - start_pg) << 8;
1405  if (window_size > 32 * 1024)
1406  window_size = 32 * 1024;
1407 
1408  /* Make sure it's a power of two. */
1409  window_size = roundup_pow_of_two(window_size);
1410 
1411  /* Allocate a memory window */
1412  link->resource[3]->flags |= WIN_DATA_WIDTH_16|WIN_MEMORY_TYPE_CM|WIN_ENABLE;
1413  link->resource[3]->flags |= WIN_USE_WAIT;
1414  link->resource[3]->start = 0; link->resource[3]->end = window_size;
1415  ret = pcmcia_request_window(link, link->resource[3], mem_speed);
1416  if (ret)
1417  goto failed;
1418 
1419  offset = (start_pg << 8) + cm_offset;
1420  offset -= offset % window_size;
1421  ret = pcmcia_map_mem_page(link, link->resource[3], offset);
1422  if (ret)
1423  goto failed;
1424 
1425  /* Try scribbling on the buffer */
1426  info->base = ioremap(link->resource[3]->start,
1427  resource_size(link->resource[3]));
1428  for (i = 0; i < (TX_PAGES<<8); i += 2)
1429  __raw_writew((i>>1), info->base+offset+i);
1430  udelay(100);
1431  for (i = 0; i < (TX_PAGES<<8); i += 2)
1432  if (__raw_readw(info->base+offset+i) != (i>>1)) break;
1433  pcnet_reset_8390(dev);
1434  if (i != (TX_PAGES<<8)) {
1435  iounmap(info->base);
1436  pcmcia_release_window(link, link->resource[3]);
1437  info->base = NULL;
1438  goto failed;
1439  }
1440 
1441  ei_status.mem = info->base + offset;
1442  ei_status.priv = resource_size(link->resource[3]);
1443  dev->mem_start = (u_long)ei_status.mem;
1444  dev->mem_end = dev->mem_start + resource_size(link->resource[3]);
1445 
1446  ei_status.tx_start_page = start_pg;
1447  ei_status.rx_start_page = start_pg + TX_PAGES;
1448  ei_status.stop_page = start_pg + (
1449  (resource_size(link->resource[3]) - offset) >> 8);
1450 
1451  /* set up block i/o functions */
1452  ei_status.get_8390_hdr = shmem_get_8390_hdr;
1453  ei_status.block_input = shmem_block_input;
1454  ei_status.block_output = shmem_block_output;
1455 
1456  info->flags |= USE_SHMEM;
1457  return 0;
1458 
1459 failed:
1460  return 1;
1461 }
1462 
1463 /*====================================================================*/
1464 
1465 static const struct pcmcia_device_id pcnet_ids[] = {
1466  PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0057, 0x0021),
1467  PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0104, 0x000a),
1468  PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0105, 0xea15),
1469  PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0143, 0x3341),
1470  PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0143, 0xc0ab),
1471  PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x021b, 0x0101),
1472  PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x08a1, 0xc0ab),
1473  PCMCIA_PFC_DEVICE_PROD_ID12(0, "AnyCom", "Fast Ethernet + 56K COMBO", 0x578ba6e7, 0xb0ac62c4),
1474  PCMCIA_PFC_DEVICE_PROD_ID12(0, "ATKK", "LM33-PCM-T", 0xba9eb7e2, 0x077c174e),
1475  PCMCIA_PFC_DEVICE_PROD_ID12(0, "D-Link", "DME336T", 0x1a424a1c, 0xb23897ff),
1476  PCMCIA_PFC_DEVICE_PROD_ID12(0, "Grey Cell", "GCS3000", 0x2a151fac, 0x48b932ae),
1477  PCMCIA_PFC_DEVICE_PROD_ID12(0, "Linksys", "EtherFast 10&100 + 56K PC Card (PCMLM56)", 0x0733cc81, 0xb3765033),
1478  PCMCIA_PFC_DEVICE_PROD_ID12(0, "LINKSYS", "PCMLM336", 0xf7cb0b07, 0x7a821b58),
1479  PCMCIA_PFC_DEVICE_PROD_ID12(0, "MICRO RESEARCH", "COMBO-L/M-336", 0xb2ced065, 0x3ced0555),
1480  PCMCIA_PFC_DEVICE_PROD_ID12(0, "PCMCIAs", "ComboCard", 0xdcfe12d3, 0xcd8906cc),
1481  PCMCIA_PFC_DEVICE_PROD_ID12(0, "PCMCIAs", "LanModem", 0xdcfe12d3, 0xc67c648f),
1482  PCMCIA_MFC_DEVICE_PROD_ID12(0, "IBM", "Home and Away 28.8 PC Card ", 0xb569a6e5, 0x5bd4ff2c),
1483  PCMCIA_MFC_DEVICE_PROD_ID12(0, "IBM", "Home and Away Credit Card Adapter", 0xb569a6e5, 0x4bdf15c3),
1484  PCMCIA_MFC_DEVICE_PROD_ID12(0, "IBM", "w95 Home and Away Credit Card ", 0xb569a6e5, 0xae911c15),
1485  PCMCIA_MFC_DEVICE_PROD_ID123(0, "APEX DATA", "MULTICARD", "ETHERNET-MODEM", 0x11c2da09, 0x7289dc5d, 0xaad95e1f),
1486  PCMCIA_MFC_DEVICE_PROD_ID2(0, "FAX/Modem/Ethernet Combo Card ", 0x1ed59302),
1487  PCMCIA_DEVICE_MANF_CARD(0x0057, 0x1004),
1488  PCMCIA_DEVICE_MANF_CARD(0x0104, 0x000d),
1489  PCMCIA_DEVICE_MANF_CARD(0x0104, 0x0075),
1490  PCMCIA_DEVICE_MANF_CARD(0x0104, 0x0145),
1491  PCMCIA_DEVICE_MANF_CARD(0x0149, 0x0230),
1492  PCMCIA_DEVICE_MANF_CARD(0x0149, 0x4530),
1493  PCMCIA_DEVICE_MANF_CARD(0x0149, 0xc1ab),
1494  PCMCIA_DEVICE_MANF_CARD(0x0186, 0x0110),
1495  PCMCIA_DEVICE_MANF_CARD(0x01bf, 0x8041),
1496  PCMCIA_DEVICE_MANF_CARD(0x0213, 0x2452),
1497  PCMCIA_DEVICE_MANF_CARD(0x026f, 0x0300),
1498  PCMCIA_DEVICE_MANF_CARD(0x026f, 0x0307),
1499  PCMCIA_DEVICE_MANF_CARD(0x026f, 0x030a),
1500  PCMCIA_DEVICE_MANF_CARD(0x0274, 0x1103),
1501  PCMCIA_DEVICE_MANF_CARD(0x0274, 0x1121),
1502  PCMCIA_DEVICE_PROD_ID12("2408LAN", "Ethernet", 0x352fff7f, 0x00b2e941),
1503  PCMCIA_DEVICE_PROD_ID1234("Socket", "CF 10/100 Ethernet Card", "Revision B", "05/11/06", 0xb38bcc2e, 0x4de88352, 0xeaca6c8d, 0x7e57c22e),
1504  PCMCIA_DEVICE_PROD_ID123("Cardwell", "PCMCIA", "ETHERNET", 0x9533672e, 0x281f1c5d, 0x3ff7175b),
1505  PCMCIA_DEVICE_PROD_ID123("CNet ", "CN30BC", "ETHERNET", 0x9fe55d3d, 0x85601198, 0x3ff7175b),
1506  PCMCIA_DEVICE_PROD_ID123("Digital", "Ethernet", "Adapter", 0x9999ab35, 0x00b2e941, 0x4b0d829e),
1507  PCMCIA_DEVICE_PROD_ID123("Edimax Technology Inc.", "PCMCIA", "Ethernet Card", 0x738a0019, 0x281f1c5d, 0x5e9d92c0),
1508  PCMCIA_DEVICE_PROD_ID123("EFA ", "EFA207", "ETHERNET", 0x3d294be4, 0xeb9aab6c, 0x3ff7175b),
1509  PCMCIA_DEVICE_PROD_ID123("I-O DATA", "PCLA", "ETHERNET", 0x1d55d7ec, 0xe4c64d34, 0x3ff7175b),
1510  PCMCIA_DEVICE_PROD_ID123("IO DATA", "PCLATE", "ETHERNET", 0x547e66dc, 0x6b260753, 0x3ff7175b),
1511  PCMCIA_DEVICE_PROD_ID123("KingMax Technology Inc.", "EN10-T2", "PCMCIA Ethernet Card", 0x932b7189, 0x699e4436, 0x6f6652e0),
1512  PCMCIA_DEVICE_PROD_ID123("PCMCIA", "PCMCIA-ETHERNET-CARD", "UE2216", 0x281f1c5d, 0xd4cd2f20, 0xb87add82),
1513  PCMCIA_DEVICE_PROD_ID123("PCMCIA", "PCMCIA-ETHERNET-CARD", "UE2620", 0x281f1c5d, 0xd4cd2f20, 0x7d3d83a8),
1514  PCMCIA_DEVICE_PROD_ID1("2412LAN", 0x67f236ab),
1515  PCMCIA_DEVICE_PROD_ID12("ACCTON", "EN2212", 0xdfc6b5b2, 0xcb112a11),
1516  PCMCIA_DEVICE_PROD_ID12("ACCTON", "EN2216-PCMCIA-ETHERNET", 0xdfc6b5b2, 0x5542bfff),
1517  PCMCIA_DEVICE_PROD_ID12("Allied Telesis, K.K.", "CentreCOM LA100-PCM-T V2 100/10M LAN PC Card", 0xbb7fbdd7, 0xcd91cc68),
1518  PCMCIA_DEVICE_PROD_ID12("Allied Telesis K.K.", "LA100-PCM V2", 0x36634a66, 0xc6d05997),
1519  PCMCIA_DEVICE_PROD_ID12("Allied Telesis, K.K.", "CentreCOM LA-PCM_V2", 0xbb7fBdd7, 0x28e299f8),
1520  PCMCIA_DEVICE_PROD_ID12("Allied Telesis K.K.", "LA-PCM V3", 0x36634a66, 0x62241d96),
1521  PCMCIA_DEVICE_PROD_ID12("AmbiCom", "AMB8010", 0x5070a7f9, 0x82f96e96),
1522  PCMCIA_DEVICE_PROD_ID12("AmbiCom", "AMB8610", 0x5070a7f9, 0x86741224),
1523  PCMCIA_DEVICE_PROD_ID12("AmbiCom Inc", "AMB8002", 0x93b15570, 0x75ec3efb),
1524  PCMCIA_DEVICE_PROD_ID12("AmbiCom Inc", "AMB8002T", 0x93b15570, 0x461c5247),
1525  PCMCIA_DEVICE_PROD_ID12("AmbiCom Inc", "AMB8010", 0x93b15570, 0x82f96e96),
1526  PCMCIA_DEVICE_PROD_ID12("AnyCom", "ECO Ethernet", 0x578ba6e7, 0x0a9888c1),
1527  PCMCIA_DEVICE_PROD_ID12("AnyCom", "ECO Ethernet 10/100", 0x578ba6e7, 0x939fedbd),
1528  PCMCIA_DEVICE_PROD_ID12("AROWANA", "PCMCIA Ethernet LAN Card", 0x313adbc8, 0x08d9f190),
1529  PCMCIA_DEVICE_PROD_ID12("ASANTE", "FriendlyNet PC Card", 0x3a7ade0f, 0x41c64504),
1530  PCMCIA_DEVICE_PROD_ID12("Billionton", "LNT-10TB", 0x552ab682, 0xeeb1ba6a),
1531  PCMCIA_DEVICE_PROD_ID12("CF", "10Base-Ethernet", 0x44ebf863, 0x93ae4d79),
1532  PCMCIA_DEVICE_PROD_ID12("CNet", "CN40BC Ethernet", 0xbc477dde, 0xfba775a7),
1533  PCMCIA_DEVICE_PROD_ID12("COMPU-SHACK", "BASEline PCMCIA 10 MBit Ethernetadapter", 0xfa2e424d, 0xe9190d8a),
1534  PCMCIA_DEVICE_PROD_ID12("COMPU-SHACK", "FASTline PCMCIA 10/100 Fast-Ethernet", 0xfa2e424d, 0x3953d9b9),
1535  PCMCIA_DEVICE_PROD_ID12("CONTEC", "C-NET(PC)C-10L", 0x21cab552, 0xf6f90722),
1536  PCMCIA_DEVICE_PROD_ID12("corega", "FEther PCC-TXF", 0x0a21501a, 0xa51564a2),
1537  PCMCIA_DEVICE_PROD_ID12("corega", "Ether CF-TD", 0x0a21501a, 0x6589340a),
1538  PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega Ether CF-TD LAN Card", 0x5261440f, 0x8797663b),
1539  PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega EtherII PCC-T", 0x5261440f, 0xfa9d85bd),
1540  PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega EtherII PCC-TD", 0x5261440f, 0xc49bd73d),
1541  PCMCIA_DEVICE_PROD_ID12("Corega K.K.", "corega EtherII PCC-TD", 0xd4fdcbd8, 0xc49bd73d),
1542  PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega Ether PCC-T", 0x5261440f, 0x6705fcaa),
1543  PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega Ether PCC-TD", 0x5261440f, 0x47d5ca83),
1544  PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega FastEther PCC-TX", 0x5261440f, 0x485e85d9),
1545  PCMCIA_DEVICE_PROD_ID12("Corega,K.K.", "Ethernet LAN Card", 0x110d26d9, 0x9fd2f0a2),
1546  PCMCIA_DEVICE_PROD_ID12("corega,K.K.", "Ethernet LAN Card", 0x9791a90e, 0x9fd2f0a2),
1547  PCMCIA_DEVICE_PROD_ID12("corega K.K.", "(CG-LAPCCTXD)", 0x5261440f, 0x73ec0d88),
1548  PCMCIA_DEVICE_PROD_ID12("CouplerlessPCMCIA", "100BASE", 0xee5af0ad, 0x7c2add04),
1549  PCMCIA_DEVICE_PROD_ID12("CyQ've", "ELA-010", 0x77008979, 0x9d8d445d),
1550  PCMCIA_DEVICE_PROD_ID12("CyQ've", "ELA-110E 10/100M LAN Card", 0x77008979, 0xfd184814),
1551  PCMCIA_DEVICE_PROD_ID12("DataTrek.", "NetCard ", 0x5cd66d9d, 0x84697ce0),
1552  PCMCIA_DEVICE_PROD_ID12("Dayna Communications, Inc.", "CommuniCard E", 0x0c629325, 0xb4e7dbaf),
1553  PCMCIA_DEVICE_PROD_ID12("Digicom", "Palladio LAN 10/100", 0x697403d8, 0xe160b995),
1554  PCMCIA_DEVICE_PROD_ID12("Digicom", "Palladio LAN 10/100 Dongless", 0x697403d8, 0xa6d3b233),
1555  PCMCIA_DEVICE_PROD_ID12("DIGITAL", "DEPCM-XX", 0x69616cb3, 0xe600e76e),
1556  PCMCIA_DEVICE_PROD_ID12("D-Link", "DE-650", 0x1a424a1c, 0xf28c8398),
1557  PCMCIA_DEVICE_PROD_ID12("D-Link", "DE-660", 0x1a424a1c, 0xd9a1d05b),
1558  PCMCIA_DEVICE_PROD_ID12("D-Link", "DE-660+", 0x1a424a1c, 0x50dcd0ec),
1559  PCMCIA_DEVICE_PROD_ID12("D-Link", "DFE-650", 0x1a424a1c, 0x0f0073f9),
1560  PCMCIA_DEVICE_PROD_ID12("Dual Speed", "10/100 PC Card", 0x725b842d, 0xf1efee84),
1561  PCMCIA_DEVICE_PROD_ID12("Dual Speed", "10/100 Port Attached PC Card", 0x725b842d, 0x2db1f8e9),
1562  PCMCIA_DEVICE_PROD_ID12("Dynalink", "L10BC", 0x55632fd5, 0xdc65f2b1),
1563  PCMCIA_DEVICE_PROD_ID12("DYNALINK", "L10BC", 0x6a26d1cf, 0xdc65f2b1),
1564  PCMCIA_DEVICE_PROD_ID12("DYNALINK", "L10C", 0x6a26d1cf, 0xc4f84efb),
1565  PCMCIA_DEVICE_PROD_ID12("E-CARD", "E-CARD", 0x6701da11, 0x6701da11),
1566  PCMCIA_DEVICE_PROD_ID12("EIGER Labs Inc.", "Ethernet 10BaseT card", 0x53c864c6, 0xedd059f6),
1567  PCMCIA_DEVICE_PROD_ID12("EIGER Labs Inc.", "Ethernet Combo card", 0x53c864c6, 0x929c486c),
1568  PCMCIA_DEVICE_PROD_ID12("Ethernet", "Adapter", 0x00b2e941, 0x4b0d829e),
1569  PCMCIA_DEVICE_PROD_ID12("Ethernet Adapter", "E2000 PCMCIA Ethernet", 0x96767301, 0x71fbbc61),
1570  PCMCIA_DEVICE_PROD_ID12("Ethernet PCMCIA adapter", "EP-210", 0x8dd86181, 0xf2b52517),
1571  PCMCIA_DEVICE_PROD_ID12("Fast Ethernet", "Adapter", 0xb4be14e3, 0x4b0d829e),
1572  PCMCIA_DEVICE_PROD_ID12("Grey Cell", "GCS2000", 0x2a151fac, 0xf00555cb),
1573  PCMCIA_DEVICE_PROD_ID12("Grey Cell", "GCS2220", 0x2a151fac, 0xc1b7e327),
1574  PCMCIA_DEVICE_PROD_ID12("GVC", "NIC-2000p", 0x76e171bd, 0x6eb1c947),
1575  PCMCIA_DEVICE_PROD_ID12("IBM Corp.", "Ethernet", 0xe3736c88, 0x00b2e941),
1576  PCMCIA_DEVICE_PROD_ID12("IC-CARD", "IC-CARD", 0x60cb09a6, 0x60cb09a6),
1577  PCMCIA_DEVICE_PROD_ID12("IC-CARD+", "IC-CARD+", 0x93693494, 0x93693494),
1578  PCMCIA_DEVICE_PROD_ID12("IO DATA", "PCETTX", 0x547e66dc, 0x6fc5459b),
1579  PCMCIA_DEVICE_PROD_ID12("iPort", "10/100 Ethernet Card", 0x56c538d2, 0x11b0ffc0),
1580  PCMCIA_DEVICE_PROD_ID12("KANSAI ELECTRIC CO.,LTD", "KLA-PCM/T", 0xb18dc3b4, 0xcc51a956),
1581  PCMCIA_DEVICE_PROD_ID12("KENTRONICS", "KEP-230", 0xaf8144c9, 0x868f6616),
1582  PCMCIA_DEVICE_PROD_ID12("KCI", "PE520 PCMCIA Ethernet Adapter", 0xa89b87d3, 0x1eb88e64),
1583  PCMCIA_DEVICE_PROD_ID12("KINGMAX", "EN10T2T", 0x7bcb459a, 0xa5c81fa5),
1584  PCMCIA_DEVICE_PROD_ID12("Kingston", "KNE-PC2", 0x1128e633, 0xce2a89b3),
1585  PCMCIA_DEVICE_PROD_ID12("Kingston Technology Corp.", "EtheRx PC Card Ethernet Adapter", 0x313c7be3, 0x0afb54a2),
1586  PCMCIA_DEVICE_PROD_ID12("Laneed", "LD-10/100CD", 0x1b7827b2, 0xcda71d1c),
1587  PCMCIA_DEVICE_PROD_ID12("Laneed", "LD-CDF", 0x1b7827b2, 0xfec71e40),
1588  PCMCIA_DEVICE_PROD_ID12("Laneed", "LD-CDL/T", 0x1b7827b2, 0x79fba4f7),
1589  PCMCIA_DEVICE_PROD_ID12("Laneed", "LD-CDS", 0x1b7827b2, 0x931afaab),
1590  PCMCIA_DEVICE_PROD_ID12("LEMEL", "LM-N89TX PRO", 0xbbefb52f, 0xd2897a97),
1591  PCMCIA_DEVICE_PROD_ID12("Linksys", "Combo PCMCIA EthernetCard (EC2T)", 0x0733cc81, 0x32ee8c78),
1592  PCMCIA_DEVICE_PROD_ID12("LINKSYS", "E-CARD", 0xf7cb0b07, 0x6701da11),
1593  PCMCIA_DEVICE_PROD_ID12("Linksys", "EtherFast 10/100 Integrated PC Card (PCM100)", 0x0733cc81, 0x453c3f9d),
1594  PCMCIA_DEVICE_PROD_ID12("Linksys", "EtherFast 10/100 PC Card (PCMPC100)", 0x0733cc81, 0x66c5a389),
1595  PCMCIA_DEVICE_PROD_ID12("Linksys", "EtherFast 10/100 PC Card (PCMPC100 V2)", 0x0733cc81, 0x3a3b28e9),
1596  PCMCIA_DEVICE_PROD_ID12("Linksys", "HomeLink Phoneline + 10/100 Network PC Card (PCM100H1)", 0x733cc81, 0x7a3e5c3a),
1597  PCMCIA_DEVICE_PROD_ID12("Logitec", "LPM-LN100TX", 0x88fcdeda, 0x6d772737),
1598  PCMCIA_DEVICE_PROD_ID12("Logitec", "LPM-LN100TE", 0x88fcdeda, 0x0e714bee),
1599  PCMCIA_DEVICE_PROD_ID12("Logitec", "LPM-LN20T", 0x88fcdeda, 0x81090922),
1600  PCMCIA_DEVICE_PROD_ID12("Logitec", "LPM-LN10TE", 0x88fcdeda, 0xc1e2521c),
1601  PCMCIA_DEVICE_PROD_ID12("LONGSHINE", "PCMCIA Ethernet Card", 0xf866b0b0, 0x6f6652e0),
1602  PCMCIA_DEVICE_PROD_ID12("MACNICA", "ME1-JEIDA", 0x20841b68, 0xaf8a3578),
1603  PCMCIA_DEVICE_PROD_ID12("Macsense", "MPC-10", 0xd830297f, 0xd265c307),
1604  PCMCIA_DEVICE_PROD_ID12("Matsushita Electric Industrial Co.,LTD.", "CF-VEL211", 0x44445376, 0x8ded41d4),
1605  PCMCIA_DEVICE_PROD_ID12("MAXTECH", "PCN2000", 0x78d64bc0, 0xca0ca4b8),
1606  PCMCIA_DEVICE_PROD_ID12("MELCO", "LPC2-T", 0x481e0094, 0xa2eb0cf3),
1607  PCMCIA_DEVICE_PROD_ID12("MELCO", "LPC2-TX", 0x481e0094, 0x41a6916c),
1608  PCMCIA_DEVICE_PROD_ID12("Microcom C.E.", "Travel Card LAN 10/100", 0x4b91cec7, 0xe70220d6),
1609  PCMCIA_DEVICE_PROD_ID12("Microdyne", "NE4200", 0x2e6da59b, 0x0478e472),
1610  PCMCIA_DEVICE_PROD_ID12("MIDORI ELEC.", "LT-PCMT", 0x648d55c1, 0xbde526c7),
1611  PCMCIA_DEVICE_PROD_ID12("National Semiconductor", "InfoMover 4100", 0x36e1191f, 0x60c229b9),
1612  PCMCIA_DEVICE_PROD_ID12("National Semiconductor", "InfoMover NE4100", 0x36e1191f, 0xa6617ec8),
1613  PCMCIA_DEVICE_PROD_ID12("NEC", "PC-9801N-J12", 0x18df0ba0, 0xbc912d76),
1614  PCMCIA_DEVICE_PROD_ID12("NETGEAR", "FA410TX", 0x9aa79dc3, 0x60e5bc0e),
1615  PCMCIA_DEVICE_PROD_ID12("Network Everywhere", "Fast Ethernet 10/100 PC Card", 0x820a67b6, 0x31ed1a5f),
1616  PCMCIA_DEVICE_PROD_ID12("NextCom K.K.", "Next Hawk", 0xaedaec74, 0xad050ef1),
1617  PCMCIA_DEVICE_PROD_ID12("PCMCIA", "10/100Mbps Ethernet Card", 0x281f1c5d, 0x6e41773b),
1618  PCMCIA_DEVICE_PROD_ID12("PCMCIA", "Ethernet", 0x281f1c5d, 0x00b2e941),
1619  PCMCIA_DEVICE_PROD_ID12("PCMCIA", "ETHERNET", 0x281f1c5d, 0x3ff7175b),
1620  PCMCIA_DEVICE_PROD_ID12("PCMCIA", "Ethernet 10BaseT Card", 0x281f1c5d, 0x4de2f6c8),
1621  PCMCIA_DEVICE_PROD_ID12("PCMCIA", "Ethernet Card", 0x281f1c5d, 0x5e9d92c0),
1622  PCMCIA_DEVICE_PROD_ID12("PCMCIA", "Ethernet Combo card", 0x281f1c5d, 0x929c486c),
1623  PCMCIA_DEVICE_PROD_ID12("PCMCIA", "ETHERNET V1.0", 0x281f1c5d, 0x4d8817c8),
1624  PCMCIA_DEVICE_PROD_ID12("PCMCIA", "FastEthernet", 0x281f1c5d, 0xfe871eeb),
1625  PCMCIA_DEVICE_PROD_ID12("PCMCIA", "Fast-Ethernet", 0x281f1c5d, 0x45f1f3b4),
1626  PCMCIA_DEVICE_PROD_ID12("PCMCIA", "FAST ETHERNET CARD", 0x281f1c5d, 0xec5dbca7),
1627  PCMCIA_DEVICE_PROD_ID12("PCMCIA LAN", "Ethernet", 0x7500e246, 0x00b2e941),
1628  PCMCIA_DEVICE_PROD_ID12("PCMCIA", "LNT-10TN", 0x281f1c5d, 0xe707f641),
1629  PCMCIA_DEVICE_PROD_ID12("PCMCIAs", "ComboCard", 0xdcfe12d3, 0xcd8906cc),
1630  PCMCIA_DEVICE_PROD_ID12("PCMCIA", "UE2212", 0x281f1c5d, 0xbf17199b),
1631  PCMCIA_DEVICE_PROD_ID12("PCMCIA", " Ethernet NE2000 Compatible", 0x281f1c5d, 0x42d5d7e1),
1632  PCMCIA_DEVICE_PROD_ID12("PRETEC", "Ethernet CompactLAN 10baseT 3.3V", 0xebf91155, 0x30074c80),
1633  PCMCIA_DEVICE_PROD_ID12("PRETEC", "Ethernet CompactLAN 10BaseT 3.3V", 0xebf91155, 0x7f5a4f50),
1634  PCMCIA_DEVICE_PROD_ID12("Psion Dacom", "Gold Card Ethernet", 0xf5f025c2, 0x3a30e110),
1635  PCMCIA_DEVICE_PROD_ID12("=RELIA==", "Ethernet", 0xcdd0644a, 0x00b2e941),
1636  PCMCIA_DEVICE_PROD_ID12("RIOS Systems Co.", "PC CARD3 ETHERNET", 0x7dd33481, 0x10b41826),
1637  PCMCIA_DEVICE_PROD_ID12("RP", "1625B Ethernet NE2000 Compatible", 0xe3e66e22, 0xb96150df),
1638  PCMCIA_DEVICE_PROD_ID12("RPTI", "EP400 Ethernet NE2000 Compatible", 0xdc6f88fd, 0x4a7e2ae0),
1639  PCMCIA_DEVICE_PROD_ID12("RPTI", "EP401 Ethernet NE2000 Compatible", 0xdc6f88fd, 0x4bcbd7fd),
1640  PCMCIA_DEVICE_PROD_ID12("RPTI LTD.", "EP400", 0xc53ac515, 0x81e39388),
1641  PCMCIA_DEVICE_PROD_ID12("SCM", "Ethernet Combo card", 0xbdc3b102, 0x929c486c),
1642  PCMCIA_DEVICE_PROD_ID12("Seiko Epson Corp.", "Ethernet", 0x09928730, 0x00b2e941),
1643  PCMCIA_DEVICE_PROD_ID12("SMC", "EZCard-10-PCMCIA", 0xc4f8b18b, 0xfb21d265),
1644  PCMCIA_DEVICE_PROD_ID12("Socket Communications Inc", "Socket EA PCMCIA LAN Adapter Revision D", 0xc70a4760, 0x2ade483e),
1645  PCMCIA_DEVICE_PROD_ID12("Socket Communications Inc", "Socket EA PCMCIA LAN Adapter Revision E", 0xc70a4760, 0x5dd978a8),
1646  PCMCIA_DEVICE_PROD_ID12("TDK", "LAK-CD031 for PCMCIA", 0x1eae9475, 0x0ed386fa),
1647  PCMCIA_DEVICE_PROD_ID12("Telecom Device K.K.", "SuperSocket RE450T", 0x466b05f0, 0x8b74bc4f),
1648  PCMCIA_DEVICE_PROD_ID12("Telecom Device K.K.", "SuperSocket RE550T", 0x466b05f0, 0x33c8db2a),
1649  PCMCIA_DEVICE_PROD_ID13("Hypertec", "EP401", 0x8787bec7, 0xf6e4a31e),
1650  PCMCIA_DEVICE_PROD_ID13("KingMax Technology Inc.", "Ethernet Card", 0x932b7189, 0x5e9d92c0),
1651  PCMCIA_DEVICE_PROD_ID13("LONGSHINE", "EP401", 0xf866b0b0, 0xf6e4a31e),
1652  PCMCIA_DEVICE_PROD_ID13("Xircom", "CFE-10", 0x2e3ee845, 0x22a49f89),
1653  PCMCIA_DEVICE_PROD_ID1("CyQ've 10 Base-T LAN CARD", 0x94faf360),
1654  PCMCIA_DEVICE_PROD_ID1("EP-210 PCMCIA LAN CARD.", 0x8850b4de),
1655  PCMCIA_DEVICE_PROD_ID1("ETHER-C16", 0x06a8514f),
1656  PCMCIA_DEVICE_PROD_ID1("NE2000 Compatible", 0x75b8ad5a),
1657  PCMCIA_DEVICE_PROD_ID2("EN-6200P2", 0xa996d078),
1658  /* too generic! */
1659  /* PCMCIA_DEVICE_PROD_ID12("PCMCIA", "10/100 Ethernet Card", 0x281f1c5d, 0x11b0ffc0), */
1660  PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "PCMCIA", "EN2218-LAN/MODEM", 0x281f1c5d, 0x570f348e, "cis/PCMLM28.cis"),
1661  PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "PCMCIA", "UE2218-LAN/MODEM", 0x281f1c5d, 0x6fdcacee, "cis/PCMLM28.cis"),
1662  PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "Psion Dacom", "Gold Card V34 Ethernet", 0xf5f025c2, 0x338e8155, "cis/PCMLM28.cis"),
1663  PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "Psion Dacom", "Gold Card V34 Ethernet GSM", 0xf5f025c2, 0x4ae85d35, "cis/PCMLM28.cis"),
1664  PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "LINKSYS", "PCMLM28", 0xf7cb0b07, 0x66881874, "cis/PCMLM28.cis"),
1665  PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "TOSHIBA", "Modem/LAN Card", 0xb4585a1a, 0x53f922f8, "cis/PCMLM28.cis"),
1666  PCMCIA_MFC_DEVICE_CIS_PROD_ID12(0, "DAYNA COMMUNICATIONS", "LAN AND MODEM MULTIFUNCTION", 0x8fdf8f89, 0xdd5ed9e8, "cis/DP83903.cis"),
1667  PCMCIA_MFC_DEVICE_CIS_PROD_ID4(0, "NSC MF LAN/Modem", 0x58fc6056, "cis/DP83903.cis"),
1668  PCMCIA_MFC_DEVICE_CIS_MANF_CARD(0, 0x0175, 0x0000, "cis/DP83903.cis"),
1669  PCMCIA_DEVICE_CIS_PROD_ID12("Allied Telesis,K.K", "Ethernet LAN Card", 0x2ad62f3c, 0x9fd2f0a2, "cis/LA-PCM.cis"),
1670  PCMCIA_DEVICE_CIS_PROD_ID12("KTI", "PE520 PLUS", 0xad180345, 0x9d58d392, "cis/PE520.cis"),
1671  PCMCIA_DEVICE_CIS_PROD_ID12("NDC", "Ethernet", 0x01c43ae1, 0x00b2e941, "cis/NE2K.cis"),
1672  PCMCIA_DEVICE_CIS_PROD_ID12("PMX ", "PE-200", 0x34f3f1c8, 0x10b59f8c, "cis/PE-200.cis"),
1673  PCMCIA_DEVICE_CIS_PROD_ID12("TAMARACK", "Ethernet", 0xcf434fba, 0x00b2e941, "cis/tamarack.cis"),
1674  PCMCIA_DEVICE_PROD_ID12("Ethernet", "CF Size PC Card", 0x00b2e941, 0x43ac239b),
1675  PCMCIA_DEVICE_PROD_ID123("Fast Ethernet", "CF Size PC Card", "1.0",
1676  0xb4be14e3, 0x43ac239b, 0x0877b627),
1677  PCMCIA_DEVICE_NULL
1678 };
1679 MODULE_DEVICE_TABLE(pcmcia, pcnet_ids);
1680 MODULE_FIRMWARE("cis/PCMLM28.cis");
1681 MODULE_FIRMWARE("cis/DP83903.cis");
1682 MODULE_FIRMWARE("cis/LA-PCM.cis");
1683 MODULE_FIRMWARE("cis/PE520.cis");
1684 MODULE_FIRMWARE("cis/NE2K.cis");
1685 MODULE_FIRMWARE("cis/PE-200.cis");
1686 MODULE_FIRMWARE("cis/tamarack.cis");
1687 
1688 static struct pcmcia_driver pcnet_driver = {
1689  .name = "pcnet_cs",
1690  .probe = pcnet_probe,
1691  .remove = pcnet_detach,
1692  .owner = THIS_MODULE,
1693  .id_table = pcnet_ids,
1694  .suspend = pcnet_suspend,
1695  .resume = pcnet_resume,
1696 };
1697 
1698 static int __init init_pcnet_cs(void)
1699 {
1700  return pcmcia_register_driver(&pcnet_driver);
1701 }
1702 
1703 static void __exit exit_pcnet_cs(void)
1704 {
1705  pcmcia_unregister_driver(&pcnet_driver);
1706 }
1707 
1708 module_init(init_pcnet_cs);
1709 module_exit(exit_pcnet_cs);