Merge branch 'master' of /home/davem/src/GIT/linux-2.6/
[safe/jmp/linux-2.6] / 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             lp->tx_started = 1;
894             netif_start_queue(dev);
895         } else {
896             if( sram_config == 0 ) {
897                 if (lp->tx_queue_len < (4096 - (ETH_FRAME_LEN +2)) )
898                     /* Yes, there is room for one more packet. */
899                     netif_start_queue(dev);
900             } else {
901                 if (lp->tx_queue_len < (8192 - (ETH_FRAME_LEN +2)) && 
902                                                 lp->tx_queue < 127 )
903                     /* Yes, there is room for one more packet. */
904                     netif_start_queue(dev);
905             }
906         }
907
908         /* Re-enable interrupts */
909         outb(D_TX_INTR, ioaddr + TX_INTR);
910         outb(D_RX_INTR, ioaddr + RX_INTR);
911     }
912     dev_kfree_skb (skb);
913
914     return NETDEV_TX_OK;
915 } /* fjn_start_xmit */
916
917 /*====================================================================*/
918
919 static void fjn_reset(struct net_device *dev)
920 {
921     struct local_info_t *lp = netdev_priv(dev);
922     unsigned int ioaddr = dev->base_addr;
923     int i;
924
925     pr_debug("fjn_reset(%s) called.\n",dev->name);
926
927     /* Reset controller */
928     if( sram_config == 0 ) 
929         outb(CONFIG0_RST, ioaddr + CONFIG_0);
930     else
931         outb(CONFIG0_RST_1, ioaddr + CONFIG_0);
932
933     /* Power On chip and select bank 0 */
934     if (lp->cardtype == MBH10302)
935         outb(BANK_0, ioaddr + CONFIG_1);
936     else
937         outb(BANK_0U, ioaddr + CONFIG_1);
938
939     /* Set Tx modes */
940     outb(D_TX_MODE, ioaddr + TX_MODE);
941     /* set Rx modes */
942     outb(ID_MATCHED, ioaddr + RX_MODE);
943
944     /* Set hardware address */
945     for (i = 0; i < 6; i++) 
946         outb(dev->dev_addr[i], ioaddr + NODE_ID + i);
947
948     /* (re)initialize the multicast table */
949     set_rx_mode(dev);
950
951     /* Switch to bank 2 (runtime mode) */
952     if (lp->cardtype == MBH10302)
953         outb(BANK_2, ioaddr + CONFIG_1);
954     else
955         outb(BANK_2U, ioaddr + CONFIG_1);
956
957     /* set 16col ctrl bits */
958     if( lp->cardtype == TDK || lp->cardtype == CONTEC) 
959         outb(TDK_AUTO_MODE, ioaddr + COL_CTRL);
960     else
961         outb(AUTO_MODE, ioaddr + COL_CTRL);
962
963     /* clear Reserved Regs */
964     outb(0x00, ioaddr + BMPR12);
965     outb(0x00, ioaddr + BMPR13);
966
967     /* reset Skip packet reg. */
968     outb(0x01, ioaddr + RX_SKIP);
969
970     /* Enable Tx and Rx */
971     if( sram_config == 0 )
972         outb(CONFIG0_DFL, ioaddr + CONFIG_0);
973     else
974         outb(CONFIG0_DFL_1, ioaddr + CONFIG_0);
975
976     /* Init receive pointer ? */
977     inw(ioaddr + DATAPORT);
978     inw(ioaddr + DATAPORT);
979
980     /* Clear all status */
981     outb(0xff, ioaddr + TX_STATUS);
982     outb(0xff, ioaddr + RX_STATUS);
983
984     if (lp->cardtype == MBH10302)
985         outb(INTR_OFF, ioaddr + LAN_CTRL);
986
987     /* Turn on Rx interrupts */
988     outb(D_TX_INTR, ioaddr + TX_INTR);
989     outb(D_RX_INTR, ioaddr + RX_INTR);
990
991     /* Turn on interrupts from LAN card controller */
992     if (lp->cardtype == MBH10302)
993         outb(INTR_ON, ioaddr + LAN_CTRL);
994 } /* fjn_reset */
995
996 /*====================================================================*/
997
998 static void fjn_rx(struct net_device *dev)
999 {
1000     unsigned int ioaddr = dev->base_addr;
1001     int boguscount = 10;        /* 5 -> 10: by agy 19940922 */
1002
1003     pr_debug("%s: in rx_packet(), rx_status %02x.\n",
1004           dev->name, inb(ioaddr + RX_STATUS));
1005
1006     while ((inb(ioaddr + RX_MODE) & F_BUF_EMP) == 0) {
1007         u_short status = inw(ioaddr + DATAPORT);
1008
1009         pr_debug("%s: Rxing packet mode %02x status %04x.\n",
1010               dev->name, inb(ioaddr + RX_MODE), status);
1011 #ifndef final_version
1012         if (status == 0) {
1013             outb(F_SKP_PKT, ioaddr + RX_SKIP);
1014             break;
1015         }
1016 #endif
1017         if ((status & 0xF0) != 0x20) {  /* There was an error. */
1018             dev->stats.rx_errors++;
1019             if (status & F_LEN_ERR) dev->stats.rx_length_errors++;
1020             if (status & F_ALG_ERR) dev->stats.rx_frame_errors++;
1021             if (status & F_CRC_ERR) dev->stats.rx_crc_errors++;
1022             if (status & F_OVR_FLO) dev->stats.rx_over_errors++;
1023         } else {
1024             u_short pkt_len = inw(ioaddr + DATAPORT);
1025             /* Malloc up new buffer. */
1026             struct sk_buff *skb;
1027
1028             if (pkt_len > 1550) {
1029                 printk(KERN_NOTICE "%s: The FMV-18x claimed a very "
1030                        "large packet, size %d.\n", dev->name, pkt_len);
1031                 outb(F_SKP_PKT, ioaddr + RX_SKIP);
1032                 dev->stats.rx_errors++;
1033                 break;
1034             }
1035             skb = dev_alloc_skb(pkt_len+2);
1036             if (skb == NULL) {
1037                 printk(KERN_NOTICE "%s: Memory squeeze, dropping "
1038                        "packet (len %d).\n", dev->name, pkt_len);
1039                 outb(F_SKP_PKT, ioaddr + RX_SKIP);
1040                 dev->stats.rx_dropped++;
1041                 break;
1042             }
1043
1044             skb_reserve(skb, 2);
1045             insw(ioaddr + DATAPORT, skb_put(skb, pkt_len),
1046                  (pkt_len + 1) >> 1);
1047             skb->protocol = eth_type_trans(skb, dev);
1048
1049             {
1050                 int i;
1051                 pr_debug("%s: Rxed packet of length %d: ",
1052                         dev->name, pkt_len);
1053                 for (i = 0; i < 14; i++)
1054                         pr_debug(" %02x", skb->data[i]);
1055                 pr_debug(".\n");
1056             }
1057
1058             netif_rx(skb);
1059             dev->stats.rx_packets++;
1060             dev->stats.rx_bytes += pkt_len;
1061         }
1062         if (--boguscount <= 0)
1063             break;
1064     }
1065
1066     /* If any worth-while packets have been received, dev_rint()
1067            has done a netif_wake_queue() for us and will work on them
1068            when we get to the bottom-half routine. */
1069 /*
1070     if (lp->cardtype != TDK) {
1071         int i;
1072         for (i = 0; i < 20; i++) {
1073             if ((inb(ioaddr + RX_MODE) & F_BUF_EMP) == F_BUF_EMP)
1074                 break;
1075             (void)inw(ioaddr + DATAPORT);  /+ dummy status read +/
1076             outb(F_SKP_PKT, ioaddr + RX_SKIP);
1077         }
1078
1079         if (i > 0)
1080             pr_debug("%s: Exint Rx packet with mode %02x after "
1081                   "%d ticks.\n", dev->name, inb(ioaddr + RX_MODE), i);
1082     }
1083 */
1084 } /* fjn_rx */
1085
1086 /*====================================================================*/
1087
1088 static void netdev_get_drvinfo(struct net_device *dev,
1089                                struct ethtool_drvinfo *info)
1090 {
1091         strcpy(info->driver, DRV_NAME);
1092         strcpy(info->version, DRV_VERSION);
1093         sprintf(info->bus_info, "PCMCIA 0x%lx", dev->base_addr);
1094 }
1095
1096 static const struct ethtool_ops netdev_ethtool_ops = {
1097         .get_drvinfo            = netdev_get_drvinfo,
1098 };
1099
1100 static int fjn_config(struct net_device *dev, struct ifmap *map){
1101     return 0;
1102 }
1103
1104 static int fjn_open(struct net_device *dev)
1105 {
1106     struct local_info_t *lp = netdev_priv(dev);
1107     struct pcmcia_device *link = lp->p_dev;
1108
1109     pr_debug("fjn_open('%s').\n", dev->name);
1110
1111     if (!pcmcia_dev_present(link))
1112         return -ENODEV;
1113     
1114     link->open++;
1115     
1116     fjn_reset(dev);
1117     
1118     lp->tx_started = 0;
1119     lp->tx_queue = 0;
1120     lp->tx_queue_len = 0;
1121     lp->open_time = jiffies;
1122     netif_start_queue(dev);
1123     
1124     return 0;
1125 } /* fjn_open */
1126
1127 /*====================================================================*/
1128
1129 static int fjn_close(struct net_device *dev)
1130 {
1131     struct local_info_t *lp = netdev_priv(dev);
1132     struct pcmcia_device *link = lp->p_dev;
1133     unsigned int ioaddr = dev->base_addr;
1134
1135     pr_debug("fjn_close('%s').\n", dev->name);
1136
1137     lp->open_time = 0;
1138     netif_stop_queue(dev);
1139
1140     /* Set configuration register 0 to disable Tx and Rx. */
1141     if( sram_config == 0 ) 
1142         outb(CONFIG0_RST ,ioaddr + CONFIG_0);
1143     else
1144         outb(CONFIG0_RST_1 ,ioaddr + CONFIG_0);
1145
1146     /* Update the statistics -- ToDo. */
1147
1148     /* Power-down the chip.  Green, green, green! */
1149     outb(CHIP_OFF ,ioaddr + CONFIG_1);
1150
1151     /* Set the ethernet adaptor disable IRQ */
1152     if (lp->cardtype == MBH10302)
1153         outb(INTR_OFF, ioaddr + LAN_CTRL);
1154
1155     link->open--;
1156
1157     return 0;
1158 } /* fjn_close */
1159
1160 /*====================================================================*/
1161
1162 /*
1163   Set the multicast/promiscuous mode for this adaptor.
1164 */
1165
1166 static void set_rx_mode(struct net_device *dev)
1167 {
1168     unsigned int ioaddr = dev->base_addr;
1169     u_char mc_filter[8];                 /* Multicast hash filter */
1170     u_long flags;
1171     int i;
1172     
1173     int saved_bank;
1174     int saved_config_0 = inb(ioaddr + CONFIG_0);
1175      
1176     local_irq_save(flags); 
1177
1178     /* Disable Tx and Rx */
1179     if (sram_config == 0) 
1180         outb(CONFIG0_RST, ioaddr + CONFIG_0);
1181     else
1182         outb(CONFIG0_RST_1, ioaddr + CONFIG_0);
1183
1184     if (dev->flags & IFF_PROMISC) {
1185         memset(mc_filter, 0xff, sizeof(mc_filter));
1186         outb(3, ioaddr + RX_MODE);      /* Enable promiscuous mode */
1187     } else if (netdev_mc_count(dev) > MC_FILTERBREAK ||
1188                (dev->flags & IFF_ALLMULTI)) {
1189         /* Too many to filter perfectly -- accept all multicasts. */
1190         memset(mc_filter, 0xff, sizeof(mc_filter));
1191         outb(2, ioaddr + RX_MODE);      /* Use normal mode. */
1192     } else if (netdev_mc_empty(dev)) {
1193         memset(mc_filter, 0x00, sizeof(mc_filter));
1194         outb(1, ioaddr + RX_MODE);      /* Ignore almost all multicasts. */
1195     } else {
1196         struct netdev_hw_addr *ha;
1197
1198         memset(mc_filter, 0, sizeof(mc_filter));
1199         netdev_for_each_mc_addr(ha, dev) {
1200             unsigned int bit = ether_crc_le(ETH_ALEN, ha->addr) >> 26;
1201             mc_filter[bit >> 3] |= (1 << (bit & 7));
1202         }
1203         outb(2, ioaddr + RX_MODE);      /* Use normal mode. */
1204     }
1205
1206     /* Switch to bank 1 and set the multicast table. */
1207     saved_bank = inb(ioaddr + CONFIG_1);
1208     outb(0xe4, ioaddr + CONFIG_1);
1209
1210     for (i = 0; i < 8; i++)
1211         outb(mc_filter[i], ioaddr + MAR_ADR + i);
1212     outb(saved_bank, ioaddr + CONFIG_1);
1213
1214     outb(saved_config_0, ioaddr + CONFIG_0);
1215
1216     local_irq_restore(flags);
1217 }