Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
fmvj18x_cs.c
Go to the documentation of this file.
1 /*======================================================================
2  fmvj18x_cs.c 2.8 2002/03/23
3 
4  A fmvj18x (and its compatibles) PCMCIA client driver
5 
6  Contributed by Shingo Fujimoto, [email protected]
7 
8  TDK LAK-CD021 and CONTEC C-NET(PC)C support added by
9  Nobuhiro Katayama, [email protected]
10 
11  The PCMCIA client code is based on code written by David Hinds.
12  Network code is based on the "FMV-18x driver" by Yutaka TAMIYA
13  but is actually largely Donald Becker's AT1700 driver, which
14  carries the following attribution:
15 
16  Written 1993-94 by Donald Becker.
17 
18  Copyright 1993 United States Government as represented by the
19  Director, National Security Agency.
20 
21  This software may be used and distributed according to the terms
22  of the GNU General Public License, incorporated herein by reference.
23 
24  The author may be reached as [email protected], or C/O
25  Scyld Computing Corporation
26  410 Severn Ave., Suite 210
27  Annapolis MD 21403
28 
29 ======================================================================*/
30 
31 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
32 
33 #define DRV_NAME "fmvj18x_cs"
34 #define DRV_VERSION "2.9"
35 
36 #include <linux/module.h>
37 #include <linux/kernel.h>
38 #include <linux/init.h>
39 #include <linux/ptrace.h>
40 #include <linux/slab.h>
41 #include <linux/string.h>
42 #include <linux/timer.h>
43 #include <linux/interrupt.h>
44 #include <linux/in.h>
45 #include <linux/delay.h>
46 #include <linux/ethtool.h>
47 #include <linux/netdevice.h>
48 #include <linux/etherdevice.h>
49 #include <linux/skbuff.h>
50 #include <linux/if_arp.h>
51 #include <linux/ioport.h>
52 #include <linux/crc32.h>
53 
54 #include <pcmcia/cistpl.h>
55 #include <pcmcia/ciscode.h>
56 #include <pcmcia/ds.h>
57 
58 #include <asm/uaccess.h>
59 #include <asm/io.h>
60 
61 /*====================================================================*/
62 
63 /* Module parameters */
64 
65 MODULE_DESCRIPTION("fmvj18x and compatible PCMCIA ethernet driver");
66 MODULE_LICENSE("GPL");
67 
68 #define INT_MODULE_PARM(n, v) static int n = v; module_param(n, int, 0)
69 
70 /* SRAM configuration */
71 /* 0:4KB*2 TX buffer else:8KB*2 TX buffer */
72 INT_MODULE_PARM(sram_config, 0);
73 
74 
75 /*====================================================================*/
76 /*
77  PCMCIA event handlers
78  */
79 static int fmvj18x_config(struct pcmcia_device *link);
80 static int fmvj18x_get_hwinfo(struct pcmcia_device *link, u_char *node_id);
81 static int fmvj18x_setup_mfc(struct pcmcia_device *link);
82 static void fmvj18x_release(struct pcmcia_device *link);
83 static void fmvj18x_detach(struct pcmcia_device *p_dev);
84 
85 /*
86  LAN controller(MBH86960A) specific routines
87  */
88 static int fjn_config(struct net_device *dev, struct ifmap *map);
89 static int fjn_open(struct net_device *dev);
90 static int fjn_close(struct net_device *dev);
91 static netdev_tx_t fjn_start_xmit(struct sk_buff *skb,
92  struct net_device *dev);
93 static irqreturn_t fjn_interrupt(int irq, void *dev_id);
94 static void fjn_rx(struct net_device *dev);
95 static void fjn_reset(struct net_device *dev);
96 static void set_rx_mode(struct net_device *dev);
97 static void fjn_tx_timeout(struct net_device *dev);
98 static const struct ethtool_ops netdev_ethtool_ops;
99 
100 /*
101  card type
102  */
103 typedef enum { MBH10302, MBH10304, TDK, CONTEC, LA501, UNGERMANN,
105 } cardtype_t;
106 
107 /*
108  driver specific data structure
109 */
110 typedef struct local_info_t {
111  struct pcmcia_device *p_dev;
112  long open_time;
119 } local_info_t;
120 
121 #define MC_FILTERBREAK 64
122 
123 /*====================================================================*/
124 /*
125  ioport offset from the base address
126  */
127 #define TX_STATUS 0 /* transmit status register */
128 #define RX_STATUS 1 /* receive status register */
129 #define TX_INTR 2 /* transmit interrupt mask register */
130 #define RX_INTR 3 /* receive interrupt mask register */
131 #define TX_MODE 4 /* transmit mode register */
132 #define RX_MODE 5 /* receive mode register */
133 #define CONFIG_0 6 /* configuration register 0 */
134 #define CONFIG_1 7 /* configuration register 1 */
135 
136 #define NODE_ID 8 /* node ID register (bank 0) */
137 #define MAR_ADR 8 /* multicast address registers (bank 1) */
138 
139 #define DATAPORT 8 /* buffer mem port registers (bank 2) */
140 #define TX_START 10 /* transmit start register */
141 #define COL_CTRL 11 /* 16 collision control register */
142 #define BMPR12 12 /* reserved */
143 #define BMPR13 13 /* reserved */
144 #define RX_SKIP 14 /* skip received packet register */
145 
146 #define LAN_CTRL 16 /* LAN card control register */
147 
148 #define MAC_ID 0x1a /* hardware address */
149 #define UNGERMANN_MAC_ID 0x18 /* UNGERMANN-BASS hardware address */
150 
151 /*
152  control bits
153  */
154 #define ENA_TMT_OK 0x80
155 #define ENA_TMT_REC 0x20
156 #define ENA_COL 0x04
157 #define ENA_16_COL 0x02
158 #define ENA_TBUS_ERR 0x01
159 
160 #define ENA_PKT_RDY 0x80
161 #define ENA_BUS_ERR 0x40
162 #define ENA_LEN_ERR 0x08
163 #define ENA_ALG_ERR 0x04
164 #define ENA_CRC_ERR 0x02
165 #define ENA_OVR_FLO 0x01
166 
167 /* flags */
168 #define F_TMT_RDY 0x80 /* can accept new packet */
169 #define F_NET_BSY 0x40 /* carrier is detected */
170 #define F_TMT_OK 0x20 /* send packet successfully */
171 #define F_SRT_PKT 0x10 /* short packet error */
172 #define F_COL_ERR 0x04 /* collision error */
173 #define F_16_COL 0x02 /* 16 collision error */
174 #define F_TBUS_ERR 0x01 /* bus read error */
175 
176 #define F_PKT_RDY 0x80 /* packet(s) in buffer */
177 #define F_BUS_ERR 0x40 /* bus read error */
178 #define F_LEN_ERR 0x08 /* short packet */
179 #define F_ALG_ERR 0x04 /* frame error */
180 #define F_CRC_ERR 0x02 /* CRC error */
181 #define F_OVR_FLO 0x01 /* overflow error */
182 
183 #define F_BUF_EMP 0x40 /* receive buffer is empty */
184 
185 #define F_SKP_PKT 0x05 /* drop packet in buffer */
186 
187 /* default bitmaps */
188 #define D_TX_INTR ( ENA_TMT_OK )
189 #define D_RX_INTR ( ENA_PKT_RDY | ENA_LEN_ERR \
190  | ENA_ALG_ERR | ENA_CRC_ERR | ENA_OVR_FLO )
191 #define TX_STAT_M ( F_TMT_RDY )
192 #define RX_STAT_M ( F_PKT_RDY | F_LEN_ERR \
193  | F_ALG_ERR | F_CRC_ERR | F_OVR_FLO )
194 
195 /* commands */
196 #define D_TX_MODE 0x06 /* no tests, detect carrier */
197 #define ID_MATCHED 0x02 /* (RX_MODE) */
198 #define RECV_ALL 0x03 /* (RX_MODE) */
199 #define CONFIG0_DFL 0x5a /* 16bit bus, 4K x 2 Tx queues */
200 #define CONFIG0_DFL_1 0x5e /* 16bit bus, 8K x 2 Tx queues */
201 #define CONFIG0_RST 0xda /* Data Link Controller off (CONFIG_0) */
202 #define CONFIG0_RST_1 0xde /* Data Link Controller off (CONFIG_0) */
203 #define BANK_0 0xa0 /* bank 0 (CONFIG_1) */
204 #define BANK_1 0xa4 /* bank 1 (CONFIG_1) */
205 #define BANK_2 0xa8 /* bank 2 (CONFIG_1) */
206 #define CHIP_OFF 0x80 /* contrl chip power off (CONFIG_1) */
207 #define DO_TX 0x80 /* do transmit packet */
208 #define SEND_PKT 0x81 /* send a packet */
209 #define AUTO_MODE 0x07 /* Auto skip packet on 16 col detected */
210 #define MANU_MODE 0x03 /* Stop and skip packet on 16 col */
211 #define TDK_AUTO_MODE 0x47 /* Auto skip packet on 16 col detected */
212 #define TDK_MANU_MODE 0x43 /* Stop and skip packet on 16 col */
213 #define INTR_OFF 0x0d /* LAN controller ignores interrupts */
214 #define INTR_ON 0x1d /* LAN controller will catch interrupts */
215 
216 #define TX_TIMEOUT ((400*HZ)/1000)
217 
218 #define BANK_0U 0x20 /* bank 0 (CONFIG_1) */
219 #define BANK_1U 0x24 /* bank 1 (CONFIG_1) */
220 #define BANK_2U 0x28 /* bank 2 (CONFIG_1) */
221 
222 static const struct net_device_ops fjn_netdev_ops = {
223  .ndo_open = fjn_open,
224  .ndo_stop = fjn_close,
225  .ndo_start_xmit = fjn_start_xmit,
226  .ndo_tx_timeout = fjn_tx_timeout,
227  .ndo_set_config = fjn_config,
228  .ndo_set_rx_mode = set_rx_mode,
229  .ndo_change_mtu = eth_change_mtu,
230  .ndo_set_mac_address = eth_mac_addr,
231  .ndo_validate_addr = eth_validate_addr,
232 };
233 
234 static int fmvj18x_probe(struct pcmcia_device *link)
235 {
236  local_info_t *lp;
237  struct net_device *dev;
238 
239  dev_dbg(&link->dev, "fmvj18x_attach()\n");
240 
241  /* Make up a FMVJ18x specific data structure */
242  dev = alloc_etherdev(sizeof(local_info_t));
243  if (!dev)
244  return -ENOMEM;
245  lp = netdev_priv(dev);
246  link->priv = dev;
247  lp->p_dev = link;
248  lp->base = NULL;
249 
250  /* The io structure describes IO port mapping */
251  link->resource[0]->end = 32;
252  link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
253 
254  /* General socket configuration */
255  link->config_flags |= CONF_ENABLE_IRQ;
256 
257  dev->netdev_ops = &fjn_netdev_ops;
258  dev->watchdog_timeo = TX_TIMEOUT;
259 
260  SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops);
261 
262  return fmvj18x_config(link);
263 } /* fmvj18x_attach */
264 
265 /*====================================================================*/
266 
267 static void fmvj18x_detach(struct pcmcia_device *link)
268 {
269  struct net_device *dev = link->priv;
270 
271  dev_dbg(&link->dev, "fmvj18x_detach\n");
272 
273  unregister_netdev(dev);
274 
275  fmvj18x_release(link);
276 
277  free_netdev(dev);
278 } /* fmvj18x_detach */
279 
280 /*====================================================================*/
281 
282 static int mfc_try_io_port(struct pcmcia_device *link)
283 {
284  int i, ret;
285  static const unsigned int serial_base[5] =
286  { 0x3f8, 0x2f8, 0x3e8, 0x2e8, 0x0 };
287 
288  for (i = 0; i < 5; i++) {
289  link->resource[1]->start = serial_base[i];
290  link->resource[1]->flags |= IO_DATA_PATH_WIDTH_8;
291  if (link->resource[1]->start == 0) {
292  link->resource[1]->end = 0;
293  pr_notice("out of resource for serial\n");
294  }
295  ret = pcmcia_request_io(link);
296  if (ret == 0)
297  return ret;
298  }
299  return ret;
300 }
301 
302 static int ungermann_try_io_port(struct pcmcia_device *link)
303 {
304  int ret;
305  unsigned int ioaddr;
306  /*
307  Ungermann-Bass Access/CARD accepts 0x300,0x320,0x340,0x360
308  0x380,0x3c0 only for ioport.
309  */
310  for (ioaddr = 0x300; ioaddr < 0x3e0; ioaddr += 0x20) {
311  link->resource[0]->start = ioaddr;
312  ret = pcmcia_request_io(link);
313  if (ret == 0) {
314  /* calculate ConfigIndex value */
315  link->config_index =
316  ((link->resource[0]->start & 0x0f0) >> 3) | 0x22;
317  return ret;
318  }
319  }
320  return ret; /* RequestIO failed */
321 }
322 
323 static int fmvj18x_ioprobe(struct pcmcia_device *p_dev, void *priv_data)
324 {
325  return 0; /* strange, but that's what the code did already before... */
326 }
327 
328 static int fmvj18x_config(struct pcmcia_device *link)
329 {
330  struct net_device *dev = link->priv;
331  local_info_t *lp = netdev_priv(dev);
332  int i, ret;
333  unsigned int ioaddr;
335  char *card_name = "unknown";
336  u8 *buf;
337  size_t len;
338  u_char buggybuf[32];
339 
340  dev_dbg(&link->dev, "fmvj18x_config\n");
341 
342  link->io_lines = 5;
343 
344  len = pcmcia_get_tuple(link, CISTPL_FUNCE, &buf);
345  kfree(buf);
346 
347  if (len) {
348  /* Yes, I have CISTPL_FUNCE. Let's check CISTPL_MANFID */
349  ret = pcmcia_loop_config(link, fmvj18x_ioprobe, NULL);
350  if (ret != 0)
351  goto failed;
352 
353  switch (link->manf_id) {
354  case MANFID_TDK:
355  cardtype = TDK;
356  if (link->card_id == PRODID_TDK_GN3410 ||
357  link->card_id == PRODID_TDK_NP9610 ||
358  link->card_id == PRODID_TDK_MN3200) {
359  /* MultiFunction Card */
360  link->config_base = 0x800;
361  link->config_index = 0x47;
362  link->resource[1]->end = 8;
363  }
364  break;
365  case MANFID_NEC:
366  cardtype = NEC; /* MultiFunction Card */
367  link->config_base = 0x800;
368  link->config_index = 0x47;
369  link->resource[1]->end = 8;
370  break;
371  case MANFID_KME:
372  cardtype = KME; /* MultiFunction Card */
373  link->config_base = 0x800;
374  link->config_index = 0x47;
375  link->resource[1]->end = 8;
376  break;
377  case MANFID_CONTEC:
378  cardtype = CONTEC;
379  break;
380  case MANFID_FUJITSU:
381  if (link->config_base == 0x0fe0)
382  cardtype = MBH10302;
383  else if (link->card_id == PRODID_FUJITSU_MBH10302)
384  /* RATOC REX-5588/9822/4886's PRODID are 0004(=MBH10302),
385  but these are MBH10304 based card. */
386  cardtype = MBH10304;
387  else if (link->card_id == PRODID_FUJITSU_MBH10304)
388  cardtype = MBH10304;
389  else
390  cardtype = LA501;
391  break;
392  default:
393  cardtype = MBH10304;
394  }
395  } else {
396  /* old type card */
397  switch (link->manf_id) {
398  case MANFID_FUJITSU:
399  if (link->card_id == PRODID_FUJITSU_MBH10304) {
400  cardtype = XXX10304; /* MBH10304 with buggy CIS */
401  link->config_index = 0x20;
402  } else {
403  cardtype = MBH10302; /* NextCom NC5310, etc. */
404  link->config_index = 1;
405  }
406  break;
407  case MANFID_UNGERMANN:
408  cardtype = UNGERMANN;
409  break;
410  default:
411  cardtype = MBH10302;
412  link->config_index = 1;
413  }
414  }
415 
416  if (link->resource[1]->end != 0) {
417  ret = mfc_try_io_port(link);
418  if (ret != 0) goto failed;
419  } else if (cardtype == UNGERMANN) {
420  ret = ungermann_try_io_port(link);
421  if (ret != 0) goto failed;
422  } else {
423  ret = pcmcia_request_io(link);
424  if (ret)
425  goto failed;
426  }
427  ret = pcmcia_request_irq(link, fjn_interrupt);
428  if (ret)
429  goto failed;
430  ret = pcmcia_enable_device(link);
431  if (ret)
432  goto failed;
433 
434  dev->irq = link->irq;
435  dev->base_addr = link->resource[0]->start;
436 
437  if (resource_size(link->resource[1]) != 0) {
438  ret = fmvj18x_setup_mfc(link);
439  if (ret != 0) goto failed;
440  }
441 
442  ioaddr = dev->base_addr;
443 
444  /* Reset controller */
445  if (sram_config == 0)
446  outb(CONFIG0_RST, ioaddr + CONFIG_0);
447  else
448  outb(CONFIG0_RST_1, ioaddr + CONFIG_0);
449 
450  /* Power On chip and select bank 0 */
451  if (cardtype == MBH10302)
452  outb(BANK_0, ioaddr + CONFIG_1);
453  else
454  outb(BANK_0U, ioaddr + CONFIG_1);
455 
456  /* Set hardware address */
457  switch (cardtype) {
458  case MBH10304:
459  case TDK:
460  case LA501:
461  case CONTEC:
462  case NEC:
463  case KME:
464  if (cardtype == MBH10304) {
465  card_name = "FMV-J182";
466 
467  len = pcmcia_get_tuple(link, CISTPL_FUNCE, &buf);
468  if (len < 11) {
469  kfree(buf);
470  goto failed;
471  }
472  /* Read MACID from CIS */
473  for (i = 5; i < 11; i++)
474  dev->dev_addr[i] = buf[i];
475  kfree(buf);
476  } else {
477  if (pcmcia_get_mac_from_cis(link, dev))
478  goto failed;
479  if( cardtype == TDK ) {
480  card_name = "TDK LAK-CD021";
481  } else if( cardtype == LA501 ) {
482  card_name = "LA501";
483  } else if( cardtype == NEC ) {
484  card_name = "PK-UG-J001";
485  } else if( cardtype == KME ) {
486  card_name = "Panasonic";
487  } else {
488  card_name = "C-NET(PC)C";
489  }
490  }
491  break;
492  case UNGERMANN:
493  /* Read MACID from register */
494  for (i = 0; i < 6; i++)
495  dev->dev_addr[i] = inb(ioaddr + UNGERMANN_MAC_ID + i);
496  card_name = "Access/CARD";
497  break;
498  case XXX10304:
499  /* Read MACID from Buggy CIS */
500  if (fmvj18x_get_hwinfo(link, buggybuf) == -1) {
501  pr_notice("unable to read hardware net address\n");
502  goto failed;
503  }
504  for (i = 0 ; i < 6; i++) {
505  dev->dev_addr[i] = buggybuf[i];
506  }
507  card_name = "FMV-J182";
508  break;
509  case MBH10302:
510  default:
511  /* Read MACID from register */
512  for (i = 0; i < 6; i++)
513  dev->dev_addr[i] = inb(ioaddr + MAC_ID + i);
514  card_name = "FMV-J181";
515  break;
516  }
517 
518  lp->cardtype = cardtype;
519  SET_NETDEV_DEV(dev, &link->dev);
520 
521  if (register_netdev(dev) != 0) {
522  pr_notice("register_netdev() failed\n");
523  goto failed;
524  }
525 
526  /* print current configuration */
527  netdev_info(dev, "%s, sram %s, port %#3lx, irq %d, hw_addr %pM\n",
528  card_name, sram_config == 0 ? "4K TX*2" : "8K TX*2",
529  dev->base_addr, dev->irq, dev->dev_addr);
530 
531  return 0;
532 
533 failed:
534  fmvj18x_release(link);
535  return -ENODEV;
536 } /* fmvj18x_config */
537 /*====================================================================*/
538 
539 static int fmvj18x_get_hwinfo(struct pcmcia_device *link, u_char *node_id)
540 {
542  int i, j;
543 
544  /* Allocate a small memory window */
545  link->resource[2]->flags |= WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE;
546  link->resource[2]->start = 0; link->resource[2]->end = 0;
547  i = pcmcia_request_window(link, link->resource[2], 0);
548  if (i != 0)
549  return -1;
550 
551  base = ioremap(link->resource[2]->start, resource_size(link->resource[2]));
552  pcmcia_map_mem_page(link, link->resource[2], 0);
553 
554  /*
555  * MBH10304 CISTPL_FUNCE_LAN_NODE_ID format
556  * 22 0d xx xx xx 04 06 yy yy yy yy yy yy ff
557  * 'xx' is garbage.
558  * 'yy' is MAC address.
559  */
560  for (i = 0; i < 0x200; i++) {
561  if (readb(base+i*2) == 0x22) {
562  if (readb(base+(i-1)*2) == 0xff &&
563  readb(base+(i+5)*2) == 0x04 &&
564  readb(base+(i+6)*2) == 0x06 &&
565  readb(base+(i+13)*2) == 0xff)
566  break;
567  }
568  }
569 
570  if (i != 0x200) {
571  for (j = 0 ; j < 6; j++,i++) {
572  node_id[j] = readb(base+(i+7)*2);
573  }
574  }
575 
576  iounmap(base);
577  j = pcmcia_release_window(link, link->resource[2]);
578  return (i != 0x200) ? 0 : -1;
579 
580 } /* fmvj18x_get_hwinfo */
581 /*====================================================================*/
582 
583 static int fmvj18x_setup_mfc(struct pcmcia_device *link)
584 {
585  int i;
586  struct net_device *dev = link->priv;
587  unsigned int ioaddr;
588  local_info_t *lp = netdev_priv(dev);
589 
590  /* Allocate a small memory window */
591  link->resource[3]->flags = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE;
592  link->resource[3]->start = link->resource[3]->end = 0;
593  i = pcmcia_request_window(link, link->resource[3], 0);
594  if (i != 0)
595  return -1;
596 
597  lp->base = ioremap(link->resource[3]->start,
598  resource_size(link->resource[3]));
599  if (lp->base == NULL) {
600  netdev_notice(dev, "ioremap failed\n");
601  return -1;
602  }
603 
604  i = pcmcia_map_mem_page(link, link->resource[3], 0);
605  if (i != 0) {
606  iounmap(lp->base);
607  lp->base = NULL;
608  return -1;
609  }
610 
611  ioaddr = dev->base_addr;
612  writeb(0x47, lp->base+0x800); /* Config Option Register of LAN */
613  writeb(0x0, lp->base+0x802); /* Config and Status Register */
614 
615  writeb(ioaddr & 0xff, lp->base+0x80a); /* I/O Base(Low) of LAN */
616  writeb((ioaddr >> 8) & 0xff, lp->base+0x80c); /* I/O Base(High) of LAN */
617 
618  writeb(0x45, lp->base+0x820); /* Config Option Register of Modem */
619  writeb(0x8, lp->base+0x822); /* Config and Status Register */
620 
621  return 0;
622 
623 }
624 /*====================================================================*/
625 
626 static void fmvj18x_release(struct pcmcia_device *link)
627 {
628 
629  struct net_device *dev = link->priv;
630  local_info_t *lp = netdev_priv(dev);
631  u_char __iomem *tmp;
632 
633  dev_dbg(&link->dev, "fmvj18x_release\n");
634 
635  if (lp->base != NULL) {
636  tmp = lp->base;
637  lp->base = NULL; /* set NULL before iounmap */
638  iounmap(tmp);
639  }
640 
641  pcmcia_disable_device(link);
642 
643 }
644 
645 static int fmvj18x_suspend(struct pcmcia_device *link)
646 {
647  struct net_device *dev = link->priv;
648 
649  if (link->open)
650  netif_device_detach(dev);
651 
652  return 0;
653 }
654 
655 static int fmvj18x_resume(struct pcmcia_device *link)
656 {
657  struct net_device *dev = link->priv;
658 
659  if (link->open) {
660  fjn_reset(dev);
661  netif_device_attach(dev);
662  }
663 
664  return 0;
665 }
666 
667 /*====================================================================*/
668 
669 static const struct pcmcia_device_id fmvj18x_ids[] = {
670  PCMCIA_DEVICE_MANF_CARD(0x0004, 0x0004),
671  PCMCIA_DEVICE_PROD_ID12("EAGLE Technology", "NE200 ETHERNET LAN MBH10302 04", 0x528c88c4, 0x74f91e59),
672  PCMCIA_DEVICE_PROD_ID12("Eiger Labs,Inc", "EPX-10BT PC Card Ethernet 10BT", 0x53af556e, 0x877f9922),
673  PCMCIA_DEVICE_PROD_ID12("Eiger labs,Inc.", "EPX-10BT PC Card Ethernet 10BT", 0xf47e6c66, 0x877f9922),
674  PCMCIA_DEVICE_PROD_ID12("FUJITSU", "LAN Card(FMV-J182)", 0x6ee5a3d8, 0x5baf31db),
675  PCMCIA_DEVICE_PROD_ID12("FUJITSU", "MBH10308", 0x6ee5a3d8, 0x3f04875e),
676  PCMCIA_DEVICE_PROD_ID12("FUJITSU TOWA", "LA501", 0xb8451188, 0x12939ba2),
677  PCMCIA_DEVICE_PROD_ID12("HITACHI", "HT-4840-11", 0xf4f43949, 0x773910f4),
678  PCMCIA_DEVICE_PROD_ID12("NextComK.K.", "NC5310B Ver1.0 ", 0x8cef4d3a, 0x075fc7b6),
679  PCMCIA_DEVICE_PROD_ID12("NextComK.K.", "NC5310 Ver1.0 ", 0x8cef4d3a, 0xbccf43e6),
680  PCMCIA_DEVICE_PROD_ID12("RATOC System Inc.", "10BASE_T CARD R280", 0x85c10e17, 0xd9413666),
681  PCMCIA_DEVICE_PROD_ID12("TDK", "LAC-CD02x", 0x1eae9475, 0x8fa0ee70),
682  PCMCIA_DEVICE_PROD_ID12("TDK", "LAC-CF010", 0x1eae9475, 0x7683bc9a),
683  PCMCIA_DEVICE_PROD_ID1("CONTEC Co.,Ltd.", 0x58d8fee2),
684  PCMCIA_DEVICE_PROD_ID1("PCMCIA LAN MBH10304 ES", 0x2599f454),
685  PCMCIA_DEVICE_PROD_ID1("PCMCIA MBH10302", 0x8f4005da),
686  PCMCIA_DEVICE_PROD_ID1("UBKK,V2.0", 0x90888080),
687  PCMCIA_PFC_DEVICE_PROD_ID12(0, "TDK", "GlobalNetworker 3410/3412", 0x1eae9475, 0xd9a93bed),
688  PCMCIA_PFC_DEVICE_PROD_ID12(0, "NEC", "PK-UG-J001" ,0x18df0ba0 ,0x831b1064),
689  PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0105, 0x0d0a),
690  PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0105, 0x0e0a),
691  PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0032, 0x0e01),
692  PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0032, 0x0a05),
693  PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0032, 0x0b05),
694  PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0032, 0x1101),
695  PCMCIA_DEVICE_NULL,
696 };
697 MODULE_DEVICE_TABLE(pcmcia, fmvj18x_ids);
698 
699 static struct pcmcia_driver fmvj18x_cs_driver = {
700  .owner = THIS_MODULE,
701  .name = "fmvj18x_cs",
702  .probe = fmvj18x_probe,
703  .remove = fmvj18x_detach,
704  .id_table = fmvj18x_ids,
705  .suspend = fmvj18x_suspend,
706  .resume = fmvj18x_resume,
707 };
708 
709 static int __init init_fmvj18x_cs(void)
710 {
711  return pcmcia_register_driver(&fmvj18x_cs_driver);
712 }
713 
714 static void __exit exit_fmvj18x_cs(void)
715 {
716  pcmcia_unregister_driver(&fmvj18x_cs_driver);
717 }
718 
719 module_init(init_fmvj18x_cs);
720 module_exit(exit_fmvj18x_cs);
721 
722 /*====================================================================*/
723 
724 static irqreturn_t fjn_interrupt(int dummy, void *dev_id)
725 {
726  struct net_device *dev = dev_id;
727  local_info_t *lp = netdev_priv(dev);
728  unsigned int ioaddr;
729  unsigned short tx_stat, rx_stat;
730 
731  ioaddr = dev->base_addr;
732 
733  /* avoid multiple interrupts */
734  outw(0x0000, ioaddr + TX_INTR);
735 
736  /* wait for a while */
737  udelay(1);
738 
739  /* get status */
740  tx_stat = inb(ioaddr + TX_STATUS);
741  rx_stat = inb(ioaddr + RX_STATUS);
742 
743  /* clear status */
744  outb(tx_stat, ioaddr + TX_STATUS);
745  outb(rx_stat, ioaddr + RX_STATUS);
746 
747  pr_debug("%s: interrupt, rx_status %02x.\n", dev->name, rx_stat);
748  pr_debug(" tx_status %02x.\n", tx_stat);
749 
750  if (rx_stat || (inb(ioaddr + RX_MODE) & F_BUF_EMP) == 0) {
751  /* there is packet(s) in rx buffer */
752  fjn_rx(dev);
753  }
754  if (tx_stat & F_TMT_RDY) {
755  dev->stats.tx_packets += lp->sent ;
756  lp->sent = 0 ;
757  if (lp->tx_queue) {
758  outb(DO_TX | lp->tx_queue, ioaddr + TX_START);
759  lp->sent = lp->tx_queue ;
760  lp->tx_queue = 0;
761  lp->tx_queue_len = 0;
762  dev->trans_start = jiffies;
763  } else {
764  lp->tx_started = 0;
765  }
766  netif_wake_queue(dev);
767  }
768  pr_debug("%s: exiting interrupt,\n", dev->name);
769  pr_debug(" tx_status %02x, rx_status %02x.\n", tx_stat, rx_stat);
770 
771  outb(D_TX_INTR, ioaddr + TX_INTR);
772  outb(D_RX_INTR, ioaddr + RX_INTR);
773 
774  if (lp->base != NULL) {
775  /* Ack interrupt for multifunction card */
776  writeb(0x01, lp->base+0x802);
777  writeb(0x09, lp->base+0x822);
778  }
779 
780  return IRQ_HANDLED;
781 
782 } /* fjn_interrupt */
783 
784 /*====================================================================*/
785 
786 static void fjn_tx_timeout(struct net_device *dev)
787 {
788  struct local_info_t *lp = netdev_priv(dev);
789  unsigned int ioaddr = dev->base_addr;
790 
791  netdev_notice(dev, "transmit timed out with status %04x, %s?\n",
792  htons(inw(ioaddr + TX_STATUS)),
793  inb(ioaddr + TX_STATUS) & F_TMT_RDY
794  ? "IRQ conflict" : "network cable problem");
795  netdev_notice(dev, "timeout registers: %04x %04x %04x "
796  "%04x %04x %04x %04x %04x.\n",
797  htons(inw(ioaddr + 0)), htons(inw(ioaddr + 2)),
798  htons(inw(ioaddr + 4)), htons(inw(ioaddr + 6)),
799  htons(inw(ioaddr + 8)), htons(inw(ioaddr + 10)),
800  htons(inw(ioaddr + 12)), htons(inw(ioaddr + 14)));
801  dev->stats.tx_errors++;
802  /* ToDo: We should try to restart the adaptor... */
804  fjn_reset(dev);
805 
806  lp->tx_started = 0;
807  lp->tx_queue = 0;
808  lp->tx_queue_len = 0;
809  lp->sent = 0;
810  lp->open_time = jiffies;
812  netif_wake_queue(dev);
813 }
814 
815 static netdev_tx_t fjn_start_xmit(struct sk_buff *skb,
816  struct net_device *dev)
817 {
818  struct local_info_t *lp = netdev_priv(dev);
819  unsigned int ioaddr = dev->base_addr;
820  short length = skb->len;
821 
822  if (length < ETH_ZLEN)
823  {
824  if (skb_padto(skb, ETH_ZLEN))
825  return NETDEV_TX_OK;
826  length = ETH_ZLEN;
827  }
828 
829  netif_stop_queue(dev);
830 
831  {
832  unsigned char *buf = skb->data;
833 
834  if (length > ETH_FRAME_LEN) {
835  netdev_notice(dev, "Attempting to send a large packet (%d bytes)\n",
836  length);
837  return NETDEV_TX_BUSY;
838  }
839 
840  netdev_dbg(dev, "Transmitting a packet of length %lu\n",
841  (unsigned long)skb->len);
842  dev->stats.tx_bytes += skb->len;
843 
844  /* Disable both interrupts. */
845  outw(0x0000, ioaddr + TX_INTR);
846 
847  /* wait for a while */
848  udelay(1);
849 
850  outw(length, ioaddr + DATAPORT);
851  outsw(ioaddr + DATAPORT, buf, (length + 1) >> 1);
852 
853  lp->tx_queue++;
854  lp->tx_queue_len += ((length+3) & ~1);
855 
856  if (lp->tx_started == 0) {
857  /* If the Tx is idle, always trigger a transmit. */
858  outb(DO_TX | lp->tx_queue, ioaddr + TX_START);
859  lp->sent = lp->tx_queue ;
860  lp->tx_queue = 0;
861  lp->tx_queue_len = 0;
862  lp->tx_started = 1;
863  netif_start_queue(dev);
864  } else {
865  if( sram_config == 0 ) {
866  if (lp->tx_queue_len < (4096 - (ETH_FRAME_LEN +2)) )
867  /* Yes, there is room for one more packet. */
868  netif_start_queue(dev);
869  } else {
870  if (lp->tx_queue_len < (8192 - (ETH_FRAME_LEN +2)) &&
871  lp->tx_queue < 127 )
872  /* Yes, there is room for one more packet. */
873  netif_start_queue(dev);
874  }
875  }
876 
877  /* Re-enable interrupts */
878  outb(D_TX_INTR, ioaddr + TX_INTR);
879  outb(D_RX_INTR, ioaddr + RX_INTR);
880  }
881  dev_kfree_skb (skb);
882 
883  return NETDEV_TX_OK;
884 } /* fjn_start_xmit */
885 
886 /*====================================================================*/
887 
888 static void fjn_reset(struct net_device *dev)
889 {
890  struct local_info_t *lp = netdev_priv(dev);
891  unsigned int ioaddr = dev->base_addr;
892  int i;
893 
894  netdev_dbg(dev, "fjn_reset() called\n");
895 
896  /* Reset controller */
897  if( sram_config == 0 )
898  outb(CONFIG0_RST, ioaddr + CONFIG_0);
899  else
900  outb(CONFIG0_RST_1, ioaddr + CONFIG_0);
901 
902  /* Power On chip and select bank 0 */
903  if (lp->cardtype == MBH10302)
904  outb(BANK_0, ioaddr + CONFIG_1);
905  else
906  outb(BANK_0U, ioaddr + CONFIG_1);
907 
908  /* Set Tx modes */
909  outb(D_TX_MODE, ioaddr + TX_MODE);
910  /* set Rx modes */
911  outb(ID_MATCHED, ioaddr + RX_MODE);
912 
913  /* Set hardware address */
914  for (i = 0; i < 6; i++)
915  outb(dev->dev_addr[i], ioaddr + NODE_ID + i);
916 
917  /* (re)initialize the multicast table */
918  set_rx_mode(dev);
919 
920  /* Switch to bank 2 (runtime mode) */
921  if (lp->cardtype == MBH10302)
922  outb(BANK_2, ioaddr + CONFIG_1);
923  else
924  outb(BANK_2U, ioaddr + CONFIG_1);
925 
926  /* set 16col ctrl bits */
927  if( lp->cardtype == TDK || lp->cardtype == CONTEC)
928  outb(TDK_AUTO_MODE, ioaddr + COL_CTRL);
929  else
930  outb(AUTO_MODE, ioaddr + COL_CTRL);
931 
932  /* clear Reserved Regs */
933  outb(0x00, ioaddr + BMPR12);
934  outb(0x00, ioaddr + BMPR13);
935 
936  /* reset Skip packet reg. */
937  outb(0x01, ioaddr + RX_SKIP);
938 
939  /* Enable Tx and Rx */
940  if( sram_config == 0 )
941  outb(CONFIG0_DFL, ioaddr + CONFIG_0);
942  else
943  outb(CONFIG0_DFL_1, ioaddr + CONFIG_0);
944 
945  /* Init receive pointer ? */
946  inw(ioaddr + DATAPORT);
947  inw(ioaddr + DATAPORT);
948 
949  /* Clear all status */
950  outb(0xff, ioaddr + TX_STATUS);
951  outb(0xff, ioaddr + RX_STATUS);
952 
953  if (lp->cardtype == MBH10302)
954  outb(INTR_OFF, ioaddr + LAN_CTRL);
955 
956  /* Turn on Rx interrupts */
957  outb(D_TX_INTR, ioaddr + TX_INTR);
958  outb(D_RX_INTR, ioaddr + RX_INTR);
959 
960  /* Turn on interrupts from LAN card controller */
961  if (lp->cardtype == MBH10302)
962  outb(INTR_ON, ioaddr + LAN_CTRL);
963 } /* fjn_reset */
964 
965 /*====================================================================*/
966 
967 static void fjn_rx(struct net_device *dev)
968 {
969  unsigned int ioaddr = dev->base_addr;
970  int boguscount = 10; /* 5 -> 10: by agy 19940922 */
971 
972  pr_debug("%s: in rx_packet(), rx_status %02x.\n",
973  dev->name, inb(ioaddr + RX_STATUS));
974 
975  while ((inb(ioaddr + RX_MODE) & F_BUF_EMP) == 0) {
976  u_short status = inw(ioaddr + DATAPORT);
977 
978  netdev_dbg(dev, "Rxing packet mode %02x status %04x.\n",
979  inb(ioaddr + RX_MODE), status);
980 #ifndef final_version
981  if (status == 0) {
982  outb(F_SKP_PKT, ioaddr + RX_SKIP);
983  break;
984  }
985 #endif
986  if ((status & 0xF0) != 0x20) { /* There was an error. */
987  dev->stats.rx_errors++;
988  if (status & F_LEN_ERR) dev->stats.rx_length_errors++;
989  if (status & F_ALG_ERR) dev->stats.rx_frame_errors++;
990  if (status & F_CRC_ERR) dev->stats.rx_crc_errors++;
991  if (status & F_OVR_FLO) dev->stats.rx_over_errors++;
992  } else {
993  u_short pkt_len = inw(ioaddr + DATAPORT);
994  /* Malloc up new buffer. */
995  struct sk_buff *skb;
996 
997  if (pkt_len > 1550) {
998  netdev_notice(dev, "The FMV-18x claimed a very large packet, size %d\n",
999  pkt_len);
1000  outb(F_SKP_PKT, ioaddr + RX_SKIP);
1001  dev->stats.rx_errors++;
1002  break;
1003  }
1004  skb = netdev_alloc_skb(dev, pkt_len + 2);
1005  if (skb == NULL) {
1006  netdev_notice(dev, "Memory squeeze, dropping packet (len %d)\n",
1007  pkt_len);
1008  outb(F_SKP_PKT, ioaddr + RX_SKIP);
1009  dev->stats.rx_dropped++;
1010  break;
1011  }
1012 
1013  skb_reserve(skb, 2);
1014  insw(ioaddr + DATAPORT, skb_put(skb, pkt_len),
1015  (pkt_len + 1) >> 1);
1016  skb->protocol = eth_type_trans(skb, dev);
1017 
1018  {
1019  int i;
1020  pr_debug("%s: Rxed packet of length %d: ",
1021  dev->name, pkt_len);
1022  for (i = 0; i < 14; i++)
1023  pr_debug(" %02x", skb->data[i]);
1024  pr_debug(".\n");
1025  }
1026 
1027  netif_rx(skb);
1028  dev->stats.rx_packets++;
1029  dev->stats.rx_bytes += pkt_len;
1030  }
1031  if (--boguscount <= 0)
1032  break;
1033  }
1034 
1035  /* If any worth-while packets have been received, dev_rint()
1036  has done a netif_wake_queue() for us and will work on them
1037  when we get to the bottom-half routine. */
1038 /*
1039  if (lp->cardtype != TDK) {
1040  int i;
1041  for (i = 0; i < 20; i++) {
1042  if ((inb(ioaddr + RX_MODE) & F_BUF_EMP) == F_BUF_EMP)
1043  break;
1044  (void)inw(ioaddr + DATAPORT); /+ dummy status read +/
1045  outb(F_SKP_PKT, ioaddr + RX_SKIP);
1046  }
1047 
1048  if (i > 0)
1049  pr_debug("%s: Exint Rx packet with mode %02x after "
1050  "%d ticks.\n", dev->name, inb(ioaddr + RX_MODE), i);
1051  }
1052 */
1053 } /* fjn_rx */
1054 
1055 /*====================================================================*/
1056 
1057 static void netdev_get_drvinfo(struct net_device *dev,
1058  struct ethtool_drvinfo *info)
1059 {
1060  strlcpy(info->driver, DRV_NAME, sizeof(info->driver));
1061  strlcpy(info->version, DRV_VERSION, sizeof(info->version));
1062  snprintf(info->bus_info, sizeof(info->bus_info),
1063  "PCMCIA 0x%lx", dev->base_addr);
1064 }
1065 
1066 static const struct ethtool_ops netdev_ethtool_ops = {
1067  .get_drvinfo = netdev_get_drvinfo,
1068 };
1069 
1070 static int fjn_config(struct net_device *dev, struct ifmap *map){
1071  return 0;
1072 }
1073 
1074 static int fjn_open(struct net_device *dev)
1075 {
1076  struct local_info_t *lp = netdev_priv(dev);
1077  struct pcmcia_device *link = lp->p_dev;
1078 
1079  pr_debug("fjn_open('%s').\n", dev->name);
1080 
1081  if (!pcmcia_dev_present(link))
1082  return -ENODEV;
1083 
1084  link->open++;
1085 
1086  fjn_reset(dev);
1087 
1088  lp->tx_started = 0;
1089  lp->tx_queue = 0;
1090  lp->tx_queue_len = 0;
1091  lp->open_time = jiffies;
1092  netif_start_queue(dev);
1093 
1094  return 0;
1095 } /* fjn_open */
1096 
1097 /*====================================================================*/
1098 
1099 static int fjn_close(struct net_device *dev)
1100 {
1101  struct local_info_t *lp = netdev_priv(dev);
1102  struct pcmcia_device *link = lp->p_dev;
1103  unsigned int ioaddr = dev->base_addr;
1104 
1105  pr_debug("fjn_close('%s').\n", dev->name);
1106 
1107  lp->open_time = 0;
1108  netif_stop_queue(dev);
1109 
1110  /* Set configuration register 0 to disable Tx and Rx. */
1111  if( sram_config == 0 )
1112  outb(CONFIG0_RST ,ioaddr + CONFIG_0);
1113  else
1114  outb(CONFIG0_RST_1 ,ioaddr + CONFIG_0);
1115 
1116  /* Update the statistics -- ToDo. */
1117 
1118  /* Power-down the chip. Green, green, green! */
1119  outb(CHIP_OFF ,ioaddr + CONFIG_1);
1120 
1121  /* Set the ethernet adaptor disable IRQ */
1122  if (lp->cardtype == MBH10302)
1123  outb(INTR_OFF, ioaddr + LAN_CTRL);
1124 
1125  link->open--;
1126 
1127  return 0;
1128 } /* fjn_close */
1129 
1130 /*====================================================================*/
1131 
1132 /*
1133  Set the multicast/promiscuous mode for this adaptor.
1134 */
1135 
1136 static void set_rx_mode(struct net_device *dev)
1137 {
1138  unsigned int ioaddr = dev->base_addr;
1139  u_char mc_filter[8]; /* Multicast hash filter */
1140  u_long flags;
1141  int i;
1142 
1143  int saved_bank;
1144  int saved_config_0 = inb(ioaddr + CONFIG_0);
1145 
1146  local_irq_save(flags);
1147 
1148  /* Disable Tx and Rx */
1149  if (sram_config == 0)
1150  outb(CONFIG0_RST, ioaddr + CONFIG_0);
1151  else
1152  outb(CONFIG0_RST_1, ioaddr + CONFIG_0);
1153 
1154  if (dev->flags & IFF_PROMISC) {
1155  memset(mc_filter, 0xff, sizeof(mc_filter));
1156  outb(3, ioaddr + RX_MODE); /* Enable promiscuous mode */
1157  } else if (netdev_mc_count(dev) > MC_FILTERBREAK ||
1158  (dev->flags & IFF_ALLMULTI)) {
1159  /* Too many to filter perfectly -- accept all multicasts. */
1160  memset(mc_filter, 0xff, sizeof(mc_filter));
1161  outb(2, ioaddr + RX_MODE); /* Use normal mode. */
1162  } else if (netdev_mc_empty(dev)) {
1163  memset(mc_filter, 0x00, sizeof(mc_filter));
1164  outb(1, ioaddr + RX_MODE); /* Ignore almost all multicasts. */
1165  } else {
1166  struct netdev_hw_addr *ha;
1167 
1168  memset(mc_filter, 0, sizeof(mc_filter));
1169  netdev_for_each_mc_addr(ha, dev) {
1170  unsigned int bit = ether_crc_le(ETH_ALEN, ha->addr) >> 26;
1171  mc_filter[bit >> 3] |= (1 << (bit & 7));
1172  }
1173  outb(2, ioaddr + RX_MODE); /* Use normal mode. */
1174  }
1175 
1176  /* Switch to bank 1 and set the multicast table. */
1177  saved_bank = inb(ioaddr + CONFIG_1);
1178  outb(0xe4, ioaddr + CONFIG_1);
1179 
1180  for (i = 0; i < 8; i++)
1181  outb(mc_filter[i], ioaddr + MAR_ADR + i);
1182  outb(saved_bank, ioaddr + CONFIG_1);
1183 
1184  outb(saved_config_0, ioaddr + CONFIG_0);
1185 
1186  local_irq_restore(flags);
1187 }