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