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