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