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