Merge branch 'tracing-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[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|IRQ_FIRST_SHARED;
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, 0x0a05),
721         PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0032, 0x1101),
722         PCMCIA_DEVICE_NULL,
723 };
724 MODULE_DEVICE_TABLE(pcmcia, fmvj18x_ids);
725
726 static struct pcmcia_driver fmvj18x_cs_driver = {
727         .owner          = THIS_MODULE,
728         .drv            = {
729                 .name   = "fmvj18x_cs",
730         },
731         .probe          = fmvj18x_probe,
732         .remove         = fmvj18x_detach,
733         .id_table       = fmvj18x_ids,
734         .suspend        = fmvj18x_suspend,
735         .resume         = fmvj18x_resume,
736 };
737
738 static int __init init_fmvj18x_cs(void)
739 {
740         return pcmcia_register_driver(&fmvj18x_cs_driver);
741 }
742
743 static void __exit exit_fmvj18x_cs(void)
744 {
745         pcmcia_unregister_driver(&fmvj18x_cs_driver);
746 }
747
748 module_init(init_fmvj18x_cs);
749 module_exit(exit_fmvj18x_cs);
750
751 /*====================================================================*/
752
753 static irqreturn_t fjn_interrupt(int dummy, void *dev_id)
754 {
755     struct net_device *dev = dev_id;
756     local_info_t *lp = netdev_priv(dev);
757     unsigned int ioaddr;
758     unsigned short tx_stat, rx_stat;
759
760     ioaddr = dev->base_addr;
761
762     /* avoid multiple interrupts */
763     outw(0x0000, ioaddr + TX_INTR);
764
765     /* wait for a while */
766     udelay(1);
767
768     /* get status */
769     tx_stat = inb(ioaddr + TX_STATUS);
770     rx_stat = inb(ioaddr + RX_STATUS);
771
772     /* clear status */
773     outb(tx_stat, ioaddr + TX_STATUS);
774     outb(rx_stat, ioaddr + RX_STATUS);
775     
776     pr_debug("%s: interrupt, rx_status %02x.\n", dev->name, rx_stat);
777     pr_debug("               tx_status %02x.\n", tx_stat);
778     
779     if (rx_stat || (inb(ioaddr + RX_MODE) & F_BUF_EMP) == 0) {
780         /* there is packet(s) in rx buffer */
781         fjn_rx(dev);
782     }
783     if (tx_stat & F_TMT_RDY) {
784         dev->stats.tx_packets += lp->sent ;
785         lp->sent = 0 ;
786         if (lp->tx_queue) {
787             outb(DO_TX | lp->tx_queue, ioaddr + TX_START);
788             lp->sent = lp->tx_queue ;
789             lp->tx_queue = 0;
790             lp->tx_queue_len = 0;
791             dev->trans_start = jiffies;
792         } else {
793             lp->tx_started = 0;
794         }
795         netif_wake_queue(dev);
796     }
797     pr_debug("%s: exiting interrupt,\n", dev->name);
798     pr_debug("    tx_status %02x, rx_status %02x.\n", tx_stat, rx_stat);
799
800     outb(D_TX_INTR, ioaddr + TX_INTR);
801     outb(D_RX_INTR, ioaddr + RX_INTR);
802
803     if (lp->base != NULL) {
804         /* Ack interrupt for multifunction card */
805         writeb(0x01, lp->base+0x802);
806         writeb(0x09, lp->base+0x822);
807     }
808
809     return IRQ_HANDLED;
810
811 } /* fjn_interrupt */
812
813 /*====================================================================*/
814
815 static void fjn_tx_timeout(struct net_device *dev)
816 {
817     struct local_info_t *lp = netdev_priv(dev);
818     unsigned int ioaddr = dev->base_addr;
819
820     printk(KERN_NOTICE "%s: transmit timed out with status %04x, %s?\n",
821            dev->name, htons(inw(ioaddr + TX_STATUS)),
822            inb(ioaddr + TX_STATUS) & F_TMT_RDY
823            ? "IRQ conflict" : "network cable problem");
824     printk(KERN_NOTICE "%s: timeout registers: %04x %04x %04x "
825            "%04x %04x %04x %04x %04x.\n",
826            dev->name, htons(inw(ioaddr + 0)),
827            htons(inw(ioaddr + 2)), htons(inw(ioaddr + 4)),
828            htons(inw(ioaddr + 6)), htons(inw(ioaddr + 8)),
829            htons(inw(ioaddr +10)), htons(inw(ioaddr +12)),
830            htons(inw(ioaddr +14)));
831     dev->stats.tx_errors++;
832     /* ToDo: We should try to restart the adaptor... */
833     local_irq_disable();
834     fjn_reset(dev);
835
836     lp->tx_started = 0;
837     lp->tx_queue = 0;
838     lp->tx_queue_len = 0;
839     lp->sent = 0;
840     lp->open_time = jiffies;
841     local_irq_enable();
842     netif_wake_queue(dev);
843 }
844
845 static netdev_tx_t fjn_start_xmit(struct sk_buff *skb,
846                                         struct net_device *dev)
847 {
848     struct local_info_t *lp = netdev_priv(dev);
849     unsigned int ioaddr = dev->base_addr;
850     short length = skb->len;
851     
852     if (length < ETH_ZLEN)
853     {
854         if (skb_padto(skb, ETH_ZLEN))
855                 return NETDEV_TX_OK;
856         length = ETH_ZLEN;
857     }
858
859     netif_stop_queue(dev);
860
861     {
862         unsigned char *buf = skb->data;
863
864         if (length > ETH_FRAME_LEN) {
865             printk(KERN_NOTICE "%s: Attempting to send a large packet"
866                    " (%d bytes).\n", dev->name, length);
867             return NETDEV_TX_BUSY;
868         }
869
870         pr_debug("%s: Transmitting a packet of length %lu.\n",
871               dev->name, (unsigned long)skb->len);
872         dev->stats.tx_bytes += skb->len;
873
874         /* Disable both interrupts. */
875         outw(0x0000, ioaddr + TX_INTR);
876
877         /* wait for a while */
878         udelay(1);
879
880         outw(length, ioaddr + DATAPORT);
881         outsw(ioaddr + DATAPORT, buf, (length + 1) >> 1);
882
883         lp->tx_queue++;
884         lp->tx_queue_len += ((length+3) & ~1);
885
886         if (lp->tx_started == 0) {
887             /* If the Tx is idle, always trigger a transmit. */
888             outb(DO_TX | lp->tx_queue, ioaddr + TX_START);
889             lp->sent = lp->tx_queue ;
890             lp->tx_queue = 0;
891             lp->tx_queue_len = 0;
892             dev->trans_start = jiffies;
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
1085     return;
1086 } /* fjn_rx */
1087
1088 /*====================================================================*/
1089
1090 static void netdev_get_drvinfo(struct net_device *dev,
1091                                struct ethtool_drvinfo *info)
1092 {
1093         strcpy(info->driver, DRV_NAME);
1094         strcpy(info->version, DRV_VERSION);
1095         sprintf(info->bus_info, "PCMCIA 0x%lx", dev->base_addr);
1096 }
1097
1098 static const struct ethtool_ops netdev_ethtool_ops = {
1099         .get_drvinfo            = netdev_get_drvinfo,
1100 };
1101
1102 static int fjn_config(struct net_device *dev, struct ifmap *map){
1103     return 0;
1104 }
1105
1106 static int fjn_open(struct net_device *dev)
1107 {
1108     struct local_info_t *lp = netdev_priv(dev);
1109     struct pcmcia_device *link = lp->p_dev;
1110
1111     pr_debug("fjn_open('%s').\n", dev->name);
1112
1113     if (!pcmcia_dev_present(link))
1114         return -ENODEV;
1115     
1116     link->open++;
1117     
1118     fjn_reset(dev);
1119     
1120     lp->tx_started = 0;
1121     lp->tx_queue = 0;
1122     lp->tx_queue_len = 0;
1123     lp->open_time = jiffies;
1124     netif_start_queue(dev);
1125     
1126     return 0;
1127 } /* fjn_open */
1128
1129 /*====================================================================*/
1130
1131 static int fjn_close(struct net_device *dev)
1132 {
1133     struct local_info_t *lp = netdev_priv(dev);
1134     struct pcmcia_device *link = lp->p_dev;
1135     unsigned int ioaddr = dev->base_addr;
1136
1137     pr_debug("fjn_close('%s').\n", dev->name);
1138
1139     lp->open_time = 0;
1140     netif_stop_queue(dev);
1141
1142     /* Set configuration register 0 to disable Tx and Rx. */
1143     if( sram_config == 0 ) 
1144         outb(CONFIG0_RST ,ioaddr + CONFIG_0);
1145     else
1146         outb(CONFIG0_RST_1 ,ioaddr + CONFIG_0);
1147
1148     /* Update the statistics -- ToDo. */
1149
1150     /* Power-down the chip.  Green, green, green! */
1151     outb(CHIP_OFF ,ioaddr + CONFIG_1);
1152
1153     /* Set the ethernet adaptor disable IRQ */
1154     if (lp->cardtype == MBH10302)
1155         outb(INTR_OFF, ioaddr + LAN_CTRL);
1156
1157     link->open--;
1158
1159     return 0;
1160 } /* fjn_close */
1161
1162 /*====================================================================*/
1163
1164 /*
1165   Set the multicast/promiscuous mode for this adaptor.
1166 */
1167
1168 static void set_rx_mode(struct net_device *dev)
1169 {
1170     unsigned int ioaddr = dev->base_addr;
1171     u_char mc_filter[8];                 /* Multicast hash filter */
1172     u_long flags;
1173     int i;
1174     
1175     int saved_bank;
1176     int saved_config_0 = inb(ioaddr + CONFIG_0);
1177      
1178     local_irq_save(flags); 
1179
1180     /* Disable Tx and Rx */
1181     if (sram_config == 0) 
1182         outb(CONFIG0_RST, ioaddr + CONFIG_0);
1183     else
1184         outb(CONFIG0_RST_1, ioaddr + CONFIG_0);
1185
1186     if (dev->flags & IFF_PROMISC) {
1187         memset(mc_filter, 0xff, sizeof(mc_filter));
1188         outb(3, ioaddr + RX_MODE);      /* Enable promiscuous mode */
1189     } else if (dev->mc_count > MC_FILTERBREAK
1190                ||  (dev->flags & IFF_ALLMULTI)) {
1191         /* Too many to filter perfectly -- accept all multicasts. */
1192         memset(mc_filter, 0xff, sizeof(mc_filter));
1193         outb(2, ioaddr + RX_MODE);      /* Use normal mode. */
1194     } else if (dev->mc_count == 0) {
1195         memset(mc_filter, 0x00, sizeof(mc_filter));
1196         outb(1, ioaddr + RX_MODE);      /* Ignore almost all multicasts. */
1197     } else {
1198         struct dev_mc_list *mclist;
1199
1200         memset(mc_filter, 0, sizeof(mc_filter));
1201         for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count;
1202              i++, mclist = mclist->next) {
1203             unsigned int bit =
1204                 ether_crc_le(ETH_ALEN, mclist->dmi_addr) >> 26;
1205             mc_filter[bit >> 3] |= (1 << (bit & 7));
1206         }
1207         outb(2, ioaddr + RX_MODE);      /* Use normal mode. */
1208     }
1209
1210     /* Switch to bank 1 and set the multicast table. */
1211     saved_bank = inb(ioaddr + CONFIG_1);
1212     outb(0xe4, ioaddr + CONFIG_1);
1213
1214     for (i = 0; i < 8; i++)
1215         outb(mc_filter[i], ioaddr + MAR_ADR + i);
1216     outb(saved_bank, ioaddr + CONFIG_1);
1217
1218     outb(saved_config_0, ioaddr + CONFIG_0);
1219
1220     local_irq_restore(flags);
1221 }