[PATCH] pcmcia: embed dev_link_t into struct pcmcia_device
[linux-3.10.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(dev_link_t *link);
88 static int fmvj18x_get_hwinfo(dev_link_t *link, u_char *node_id);
89 static int fmvj18x_setup_mfc(dev_link_t *link);
90 static void fmvj18x_release(dev_link_t *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 *p_dev)
232 {
233     local_info_t *lp;
234     struct net_device *dev;
235     dev_link_t *link = dev_to_instance(p_dev);
236
237     DEBUG(0, "fmvj18x_attach()\n");
238
239     /* Make up a FMVJ18x specific data structure */
240     dev = alloc_etherdev(sizeof(local_info_t));
241     if (!dev)
242         return -ENOMEM;
243     lp = netdev_priv(dev);
244     link->priv = dev;
245     lp->p_dev = p_dev;
246
247     /* The io structure describes IO port mapping */
248     link->io.NumPorts1 = 32;
249     link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
250     link->io.IOAddrLines = 5;
251
252     /* Interrupt setup */
253     link->irq.Attributes = IRQ_TYPE_EXCLUSIVE | IRQ_HANDLE_PRESENT;
254     link->irq.IRQInfo1 = IRQ_LEVEL_ID;
255     link->irq.Handler = &fjn_interrupt;
256     link->irq.Instance = dev;
257
258     /* General socket configuration */
259     link->conf.Attributes = CONF_ENABLE_IRQ;
260     link->conf.IntType = INT_MEMORY_AND_IO;
261
262     /* The FMVJ18x specific entries in the device structure. */
263     SET_MODULE_OWNER(dev);
264     dev->hard_start_xmit = &fjn_start_xmit;
265     dev->set_config = &fjn_config;
266     dev->get_stats = &fjn_get_stats;
267     dev->set_multicast_list = &set_rx_mode;
268     dev->open = &fjn_open;
269     dev->stop = &fjn_close;
270 #ifdef HAVE_TX_TIMEOUT
271     dev->tx_timeout = fjn_tx_timeout;
272     dev->watchdog_timeo = TX_TIMEOUT;
273 #endif
274     SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops);
275
276     link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
277     fmvj18x_config(link);
278
279     return 0;
280 } /* fmvj18x_attach */
281
282 /*====================================================================*/
283
284 static void fmvj18x_detach(struct pcmcia_device *p_dev)
285 {
286     dev_link_t *link = dev_to_instance(p_dev);
287     struct net_device *dev = link->priv;
288
289     DEBUG(0, "fmvj18x_detach(0x%p)\n", link);
290
291     if (link->dev_node)
292         unregister_netdev(dev);
293
294     if (link->state & DEV_CONFIG)
295         fmvj18x_release(link);
296
297     free_netdev(dev);
298 } /* fmvj18x_detach */
299
300 /*====================================================================*/
301
302 #define CS_CHECK(fn, ret) \
303 do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
304
305 static int mfc_try_io_port(dev_link_t *link)
306 {
307     int i, ret;
308     static const kio_addr_t serial_base[5] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8, 0x0 };
309
310     for (i = 0; i < 5; i++) {
311         link->io.BasePort2 = serial_base[i];
312         link->io.Attributes2 = IO_DATA_PATH_WIDTH_8;
313         if (link->io.BasePort2 == 0) {
314             link->io.NumPorts2 = 0;
315             printk(KERN_NOTICE "fmvj18x_cs: out of resource for serial\n");
316         }
317         ret = pcmcia_request_io(link->handle, &link->io);
318         if (ret == CS_SUCCESS) return ret;
319     }
320     return ret;
321 }
322
323 static int ungermann_try_io_port(dev_link_t *link)
324 {
325     int ret;
326     kio_addr_t ioaddr;
327     /*
328         Ungermann-Bass Access/CARD accepts 0x300,0x320,0x340,0x360
329         0x380,0x3c0 only for ioport.
330     */
331     for (ioaddr = 0x300; ioaddr < 0x3e0; ioaddr += 0x20) {
332         link->io.BasePort1 = ioaddr;
333         ret = pcmcia_request_io(link->handle, &link->io);
334         if (ret == CS_SUCCESS) {
335             /* calculate ConfigIndex value */
336             link->conf.ConfigIndex = 
337                 ((link->io.BasePort1 & 0x0f0) >> 3) | 0x22;
338             return ret;
339         }
340     }
341     return ret; /* RequestIO failed */
342 }
343
344 static void fmvj18x_config(dev_link_t *link)
345 {
346     client_handle_t handle = link->handle;
347     struct net_device *dev = link->priv;
348     local_info_t *lp = netdev_priv(dev);
349     tuple_t tuple;
350     cisparse_t parse;
351     u_short buf[32];
352     int i, last_fn, last_ret, ret;
353     kio_addr_t ioaddr;
354     cardtype_t cardtype;
355     char *card_name = "unknown";
356     u_char *node_id;
357
358     DEBUG(0, "fmvj18x_config(0x%p)\n", link);
359
360     /*
361        This reads the card's CONFIG tuple to find its configuration
362        registers.
363     */
364     tuple.DesiredTuple = CISTPL_CONFIG;
365     CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
366     tuple.TupleData = (u_char *)buf;
367     tuple.TupleDataMax = 64;
368     tuple.TupleOffset = 0;
369     CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
370     CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse));
371     
372     /* Configure card */
373     link->state |= DEV_CONFIG;
374
375     link->conf.ConfigBase = parse.config.base; 
376     link->conf.Present = parse.config.rmask[0];
377
378     tuple.DesiredTuple = CISTPL_FUNCE;
379     tuple.TupleOffset = 0;
380     if (pcmcia_get_first_tuple(handle, &tuple) == CS_SUCCESS) {
381         /* Yes, I have CISTPL_FUNCE. Let's check CISTPL_MANFID */
382         tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
383         CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
384         CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
385         CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse));
386         link->conf.ConfigIndex = parse.cftable_entry.index;
387         tuple.DesiredTuple = CISTPL_MANFID;
388         if (pcmcia_get_first_tuple(handle, &tuple) == CS_SUCCESS)
389             CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
390         else
391             buf[0] = 0xffff;
392         switch (le16_to_cpu(buf[0])) {
393         case MANFID_TDK:
394             cardtype = TDK;
395             if (le16_to_cpu(buf[1]) == PRODID_TDK_GN3410
396                         || le16_to_cpu(buf[1]) == PRODID_TDK_NP9610
397                         || le16_to_cpu(buf[1]) == PRODID_TDK_MN3200) {
398                 /* MultiFunction Card */
399                 link->conf.ConfigBase = 0x800;
400                 link->conf.ConfigIndex = 0x47;
401                 link->io.NumPorts2 = 8;
402             }
403             break;
404         case MANFID_CONTEC:
405             cardtype = CONTEC;
406             break;
407         case MANFID_FUJITSU:
408             if (le16_to_cpu(buf[1]) == PRODID_FUJITSU_MBH10302)
409                 /* RATOC REX-5588/9822/4886's PRODID are 0004(=MBH10302),
410                    but these are MBH10304 based card. */ 
411                 cardtype = MBH10304;
412             else if (le16_to_cpu(buf[1]) == PRODID_FUJITSU_MBH10304)
413                 cardtype = MBH10304;
414             else
415                 cardtype = LA501;
416             break;
417         default:
418             cardtype = MBH10304;
419         }
420     } else {
421         /* old type card */
422         tuple.DesiredTuple = CISTPL_MANFID;
423         if (pcmcia_get_first_tuple(handle, &tuple) == CS_SUCCESS)
424             CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
425         else
426             buf[0] = 0xffff;
427         switch (le16_to_cpu(buf[0])) {
428         case MANFID_FUJITSU:
429             if (le16_to_cpu(buf[1]) == PRODID_FUJITSU_MBH10304) {
430                 cardtype = XXX10304;    /* MBH10304 with buggy CIS */
431                 link->conf.ConfigIndex = 0x20;
432             } else {
433                 cardtype = MBH10302;    /* NextCom NC5310, etc. */
434                 link->conf.ConfigIndex = 1;
435             }
436             break;
437         case MANFID_UNGERMANN:
438             cardtype = UNGERMANN;
439             break;
440         default:
441             cardtype = MBH10302;
442             link->conf.ConfigIndex = 1;
443         }
444     }
445
446     if (link->io.NumPorts2 != 0) {
447         link->irq.Attributes =
448                 IRQ_TYPE_DYNAMIC_SHARING|IRQ_FIRST_SHARED|IRQ_HANDLE_PRESENT;
449         ret = mfc_try_io_port(link);
450         if (ret != CS_SUCCESS) goto cs_failed;
451     } else if (cardtype == UNGERMANN) {
452         ret = ungermann_try_io_port(link);
453         if (ret != CS_SUCCESS) goto cs_failed;
454     } else { 
455         CS_CHECK(RequestIO, pcmcia_request_io(link->handle, &link->io));
456     }
457     CS_CHECK(RequestIRQ, pcmcia_request_irq(link->handle, &link->irq));
458     CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link->handle, &link->conf));
459     dev->irq = link->irq.AssignedIRQ;
460     dev->base_addr = link->io.BasePort1;
461
462     if (link->io.BasePort2 != 0)
463         fmvj18x_setup_mfc(link);
464
465     ioaddr = dev->base_addr;
466
467     /* Reset controller */
468     if (sram_config == 0) 
469         outb(CONFIG0_RST, ioaddr + CONFIG_0);
470     else
471         outb(CONFIG0_RST_1, ioaddr + CONFIG_0);
472
473     /* Power On chip and select bank 0 */
474     if (cardtype == MBH10302)
475         outb(BANK_0, ioaddr + CONFIG_1);
476     else
477         outb(BANK_0U, ioaddr + CONFIG_1);
478     
479     /* Set hardware address */
480     switch (cardtype) {
481     case MBH10304:
482     case TDK:
483     case LA501:
484     case CONTEC:
485         tuple.DesiredTuple = CISTPL_FUNCE;
486         tuple.TupleOffset = 0;
487         CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
488         tuple.TupleOffset = 0;
489         CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
490         if (cardtype == MBH10304) {
491             /* MBH10304's CIS_FUNCE is corrupted */
492             node_id = &(tuple.TupleData[5]);
493             card_name = "FMV-J182";
494         } else {
495             while (tuple.TupleData[0] != CISTPL_FUNCE_LAN_NODE_ID ) {
496                 CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(handle, &tuple));
497                 CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
498             }
499             node_id = &(tuple.TupleData[2]);
500             if( cardtype == TDK ) {
501                 card_name = "TDK LAK-CD021";
502             } else if( cardtype == LA501 ) {
503                 card_name = "LA501";
504             } else {
505                 card_name = "C-NET(PC)C";
506             }
507         }
508         /* Read MACID from CIS */
509         for (i = 0; i < 6; i++)
510             dev->dev_addr[i] = node_id[i];
511         break;
512     case UNGERMANN:
513         /* Read MACID from register */
514         for (i = 0; i < 6; i++) 
515             dev->dev_addr[i] = inb(ioaddr + UNGERMANN_MAC_ID + i);
516         card_name = "Access/CARD";
517         break;
518     case XXX10304:
519         /* Read MACID from Buggy CIS */
520         if (fmvj18x_get_hwinfo(link, tuple.TupleData) == -1) {
521             printk(KERN_NOTICE "fmvj18x_cs: unable to read hardware net address.\n");
522             goto failed;
523         }
524         for (i = 0 ; i < 6; i++) {
525             dev->dev_addr[i] = tuple.TupleData[i];
526         }
527         card_name = "FMV-J182";
528         break;
529     case MBH10302:
530     default:
531         /* Read MACID from register */
532         for (i = 0; i < 6; i++) 
533             dev->dev_addr[i] = inb(ioaddr + MAC_ID + i);
534         card_name = "FMV-J181";
535         break;
536     }
537
538     lp->cardtype = cardtype;
539     link->dev_node = &lp->node;
540     link->state &= ~DEV_CONFIG_PENDING;
541     SET_NETDEV_DEV(dev, &handle_to_dev(handle));
542
543     if (register_netdev(dev) != 0) {
544         printk(KERN_NOTICE "fmvj18x_cs: register_netdev() failed\n");
545         link->dev_node = NULL;
546         goto failed;
547     }
548
549     strcpy(lp->node.dev_name, dev->name);
550
551     /* print current configuration */
552     printk(KERN_INFO "%s: %s, sram %s, port %#3lx, irq %d, hw_addr ", 
553            dev->name, card_name, sram_config == 0 ? "4K TX*2" : "8K TX*2", 
554            dev->base_addr, dev->irq);
555     for (i = 0; i < 6; i++)
556         printk("%02X%s", dev->dev_addr[i], ((i<5) ? ":" : "\n"));
557
558     return;
559     
560 cs_failed:
561     /* All Card Services errors end up here */
562     cs_error(link->handle, last_fn, last_ret);
563 failed:
564     fmvj18x_release(link);
565     link->state &= ~DEV_CONFIG_PENDING;
566
567 } /* fmvj18x_config */
568 /*====================================================================*/
569
570 static int fmvj18x_get_hwinfo(dev_link_t *link, u_char *node_id)
571 {
572     win_req_t req;
573     memreq_t mem;
574     u_char __iomem *base;
575     int i, j;
576
577     /* Allocate a small memory window */
578     req.Attributes = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE;
579     req.Base = 0; req.Size = 0;
580     req.AccessSpeed = 0;
581     i = pcmcia_request_window(&link->handle, &req, &link->win);
582     if (i != CS_SUCCESS) {
583         cs_error(link->handle, RequestWindow, i);
584         return -1;
585     }
586
587     base = ioremap(req.Base, req.Size);
588     mem.Page = 0;
589     mem.CardOffset = 0;
590     pcmcia_map_mem_page(link->win, &mem);
591
592     /*
593      *  MBH10304 CISTPL_FUNCE_LAN_NODE_ID format
594      *  22 0d xx xx xx 04 06 yy yy yy yy yy yy ff
595      *  'xx' is garbage.
596      *  'yy' is MAC address.
597     */ 
598     for (i = 0; i < 0x200; i++) {
599         if (readb(base+i*2) == 0x22) {  
600             if (readb(base+(i-1)*2) == 0xff
601              && readb(base+(i+5)*2) == 0x04
602              && readb(base+(i+6)*2) == 0x06
603              && readb(base+(i+13)*2) == 0xff) 
604                 break;
605         }
606     }
607
608     if (i != 0x200) {
609         for (j = 0 ; j < 6; j++,i++) {
610             node_id[j] = readb(base+(i+7)*2);
611         }
612     }
613
614     iounmap(base);
615     j = pcmcia_release_window(link->win);
616     if (j != CS_SUCCESS)
617         cs_error(link->handle, ReleaseWindow, j);
618     return (i != 0x200) ? 0 : -1;
619
620 } /* fmvj18x_get_hwinfo */
621 /*====================================================================*/
622
623 static int fmvj18x_setup_mfc(dev_link_t *link)
624 {
625     win_req_t req;
626     memreq_t mem;
627     u_char __iomem *base;
628     int i, j;
629     struct net_device *dev = link->priv;
630     kio_addr_t ioaddr;
631
632     /* Allocate a small memory window */
633     req.Attributes = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE;
634     req.Base = 0; req.Size = 0;
635     req.AccessSpeed = 0;
636     i = pcmcia_request_window(&link->handle, &req, &link->win);
637     if (i != CS_SUCCESS) {
638         cs_error(link->handle, RequestWindow, i);
639         return -1;
640     }
641
642     base = ioremap(req.Base, req.Size);
643     mem.Page = 0;
644     mem.CardOffset = 0;
645     pcmcia_map_mem_page(link->win, &mem);
646
647     ioaddr = dev->base_addr;
648     writeb(0x47, base+0x800);   /* Config Option Register of LAN */
649     writeb(0x0, base+0x802);    /* Config and Status Register */
650
651     writeb(ioaddr & 0xff, base+0x80a);          /* I/O Base(Low) of LAN */
652     writeb((ioaddr >> 8) & 0xff, base+0x80c);   /* I/O Base(High) of LAN */
653    
654     writeb(0x45, base+0x820);   /* Config Option Register of Modem */
655     writeb(0x8, base+0x822);    /* Config and Status Register */
656
657     iounmap(base);
658     j = pcmcia_release_window(link->win);
659     if (j != CS_SUCCESS)
660         cs_error(link->handle, ReleaseWindow, j);
661     return 0;
662
663 }
664 /*====================================================================*/
665
666 static void fmvj18x_release(dev_link_t *link)
667 {
668         DEBUG(0, "fmvj18x_release(0x%p)\n", link);
669         pcmcia_disable_device(link->handle);
670 }
671
672 static int fmvj18x_suspend(struct pcmcia_device *p_dev)
673 {
674         dev_link_t *link = dev_to_instance(p_dev);
675         struct net_device *dev = link->priv;
676
677         if ((link->state & DEV_CONFIG) && (link->open))
678                 netif_device_detach(dev);
679
680         return 0;
681 }
682
683 static int fmvj18x_resume(struct pcmcia_device *p_dev)
684 {
685         dev_link_t *link = dev_to_instance(p_dev);
686         struct net_device *dev = link->priv;
687
688         if ((link->state & DEV_CONFIG) && (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_MANF_CARD(0, 0x0105, 0x0d0a),
718         PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0105, 0x0e0a),
719         PCMCIA_DEVICE_NULL,
720 };
721 MODULE_DEVICE_TABLE(pcmcia, fmvj18x_ids);
722
723 static struct pcmcia_driver fmvj18x_cs_driver = {
724         .owner          = THIS_MODULE,
725         .drv            = {
726                 .name   = "fmvj18x_cs",
727         },
728         .probe          = fmvj18x_attach,
729         .remove         = fmvj18x_detach,
730         .id_table       = fmvj18x_ids,
731         .suspend        = fmvj18x_suspend,
732         .resume         = fmvj18x_resume,
733 };
734
735 static int __init init_fmvj18x_cs(void)
736 {
737         return pcmcia_register_driver(&fmvj18x_cs_driver);
738 }
739
740 static void __exit exit_fmvj18x_cs(void)
741 {
742         pcmcia_unregister_driver(&fmvj18x_cs_driver);
743 }
744
745 module_init(init_fmvj18x_cs);
746 module_exit(exit_fmvj18x_cs);
747
748 /*====================================================================*/
749
750 static irqreturn_t fjn_interrupt(int irq, void *dev_id, struct pt_regs *regs)
751 {
752     struct net_device *dev = dev_id;
753     local_info_t *lp = netdev_priv(dev);
754     kio_addr_t ioaddr;
755     unsigned short tx_stat, rx_stat;
756
757     if (lp == NULL) {
758         printk(KERN_NOTICE "fjn_interrupt(): irq %d for "
759                "unknown device.\n", irq);
760         return IRQ_NONE;
761     }
762     ioaddr = dev->base_addr;
763
764     /* avoid multiple interrupts */
765     outw(0x0000, ioaddr + TX_INTR);
766
767     /* wait for a while */
768     udelay(1);
769
770     /* get status */
771     tx_stat = inb(ioaddr + TX_STATUS);
772     rx_stat = inb(ioaddr + RX_STATUS);
773
774     /* clear status */
775     outb(tx_stat, ioaddr + TX_STATUS);
776     outb(rx_stat, ioaddr + RX_STATUS);
777     
778     DEBUG(4, "%s: interrupt, rx_status %02x.\n", dev->name, rx_stat);
779     DEBUG(4, "               tx_status %02x.\n", tx_stat);
780     
781     if (rx_stat || (inb(ioaddr + RX_MODE) & F_BUF_EMP) == 0) {
782         /* there is packet(s) in rx buffer */
783         fjn_rx(dev);
784     }
785     if (tx_stat & F_TMT_RDY) {
786         lp->stats.tx_packets += lp->sent ;
787         lp->sent = 0 ;
788         if (lp->tx_queue) {
789             outb(DO_TX | lp->tx_queue, ioaddr + TX_START);
790             lp->sent = lp->tx_queue ;
791             lp->tx_queue = 0;
792             lp->tx_queue_len = 0;
793             dev->trans_start = jiffies;
794         } else {
795             lp->tx_started = 0;
796         }
797         netif_wake_queue(dev);
798     }
799     DEBUG(4, "%s: exiting interrupt,\n", dev->name);
800     DEBUG(4, "    tx_status %02x, rx_status %02x.\n", tx_stat, rx_stat);
801
802     outb(D_TX_INTR, ioaddr + TX_INTR);
803     outb(D_RX_INTR, ioaddr + RX_INTR);
804     return IRQ_HANDLED;
805
806 } /* fjn_interrupt */
807
808 /*====================================================================*/
809
810 static void fjn_tx_timeout(struct net_device *dev)
811 {
812     struct local_info_t *lp = netdev_priv(dev);
813     kio_addr_t ioaddr = dev->base_addr;
814
815     printk(KERN_NOTICE "%s: transmit timed out with status %04x, %s?\n",
816            dev->name, htons(inw(ioaddr + TX_STATUS)),
817            inb(ioaddr + TX_STATUS) & F_TMT_RDY
818            ? "IRQ conflict" : "network cable problem");
819     printk(KERN_NOTICE "%s: timeout registers: %04x %04x %04x "
820            "%04x %04x %04x %04x %04x.\n",
821            dev->name, htons(inw(ioaddr + 0)),
822            htons(inw(ioaddr + 2)), htons(inw(ioaddr + 4)),
823            htons(inw(ioaddr + 6)), htons(inw(ioaddr + 8)),
824            htons(inw(ioaddr +10)), htons(inw(ioaddr +12)),
825            htons(inw(ioaddr +14)));
826     lp->stats.tx_errors++;
827     /* ToDo: We should try to restart the adaptor... */
828     local_irq_disable();
829     fjn_reset(dev);
830
831     lp->tx_started = 0;
832     lp->tx_queue = 0;
833     lp->tx_queue_len = 0;
834     lp->sent = 0;
835     lp->open_time = jiffies;
836     local_irq_enable();
837     netif_wake_queue(dev);
838 }
839
840 static int fjn_start_xmit(struct sk_buff *skb, struct net_device *dev)
841 {
842     struct local_info_t *lp = netdev_priv(dev);
843     kio_addr_t ioaddr = dev->base_addr;
844     short length = skb->len;
845     
846     if (length < ETH_ZLEN)
847     {
848         skb = skb_padto(skb, ETH_ZLEN);
849         if (skb == NULL)
850                 return 0;
851         length = ETH_ZLEN;
852     }
853
854     netif_stop_queue(dev);
855
856     {
857         unsigned char *buf = skb->data;
858
859         if (length > ETH_FRAME_LEN) {
860             printk(KERN_NOTICE "%s: Attempting to send a large packet"
861                    " (%d bytes).\n", dev->name, length);
862             return 1;
863         }
864
865         DEBUG(4, "%s: Transmitting a packet of length %lu.\n",
866               dev->name, (unsigned long)skb->len);
867         lp->stats.tx_bytes += skb->len;
868
869         /* Disable both interrupts. */
870         outw(0x0000, ioaddr + TX_INTR);
871
872         /* wait for a while */
873         udelay(1);
874
875         outw(length, ioaddr + DATAPORT);
876         outsw(ioaddr + DATAPORT, buf, (length + 1) >> 1);
877
878         lp->tx_queue++;
879         lp->tx_queue_len += ((length+3) & ~1);
880
881         if (lp->tx_started == 0) {
882             /* If the Tx is idle, always trigger a transmit. */
883             outb(DO_TX | lp->tx_queue, ioaddr + TX_START);
884             lp->sent = lp->tx_queue ;
885             lp->tx_queue = 0;
886             lp->tx_queue_len = 0;
887             dev->trans_start = jiffies;
888             lp->tx_started = 1;
889             netif_start_queue(dev);
890         } else {
891             if( sram_config == 0 ) {
892                 if (lp->tx_queue_len < (4096 - (ETH_FRAME_LEN +2)) )
893                     /* Yes, there is room for one more packet. */
894                     netif_start_queue(dev);
895             } else {
896                 if (lp->tx_queue_len < (8192 - (ETH_FRAME_LEN +2)) && 
897                                                 lp->tx_queue < 127 )
898                     /* Yes, there is room for one more packet. */
899                     netif_start_queue(dev);
900             }
901         }
902
903         /* Re-enable interrupts */
904         outb(D_TX_INTR, ioaddr + TX_INTR);
905         outb(D_RX_INTR, ioaddr + RX_INTR);
906     }
907     dev_kfree_skb (skb);
908
909     return 0;
910 } /* fjn_start_xmit */
911
912 /*====================================================================*/
913
914 static void fjn_reset(struct net_device *dev)
915 {
916     struct local_info_t *lp = netdev_priv(dev);
917     kio_addr_t ioaddr = dev->base_addr;
918     int i;
919
920     DEBUG(4, "fjn_reset(%s) called.\n",dev->name);
921
922     /* Reset controller */
923     if( sram_config == 0 ) 
924         outb(CONFIG0_RST, ioaddr + CONFIG_0);
925     else
926         outb(CONFIG0_RST_1, ioaddr + CONFIG_0);
927
928     /* Power On chip and select bank 0 */
929     if (lp->cardtype == MBH10302)
930         outb(BANK_0, ioaddr + CONFIG_1);
931     else
932         outb(BANK_0U, ioaddr + CONFIG_1);
933
934     /* Set Tx modes */
935     outb(D_TX_MODE, ioaddr + TX_MODE);
936     /* set Rx modes */
937     outb(ID_MATCHED, ioaddr + RX_MODE);
938
939     /* Set hardware address */
940     for (i = 0; i < 6; i++) 
941         outb(dev->dev_addr[i], ioaddr + NODE_ID + i);
942
943     /* (re)initialize the multicast table */
944     set_rx_mode(dev);
945
946     /* Switch to bank 2 (runtime mode) */
947     if (lp->cardtype == MBH10302)
948         outb(BANK_2, ioaddr + CONFIG_1);
949     else
950         outb(BANK_2U, ioaddr + CONFIG_1);
951
952     /* set 16col ctrl bits */
953     if( lp->cardtype == TDK || lp->cardtype == CONTEC) 
954         outb(TDK_AUTO_MODE, ioaddr + COL_CTRL);
955     else
956         outb(AUTO_MODE, ioaddr + COL_CTRL);
957
958     /* clear Reserved Regs */
959     outb(0x00, ioaddr + BMPR12);
960     outb(0x00, ioaddr + BMPR13);
961
962     /* reset Skip packet reg. */
963     outb(0x01, ioaddr + RX_SKIP);
964
965     /* Enable Tx and Rx */
966     if( sram_config == 0 )
967         outb(CONFIG0_DFL, ioaddr + CONFIG_0);
968     else
969         outb(CONFIG0_DFL_1, ioaddr + CONFIG_0);
970
971     /* Init receive pointer ? */
972     inw(ioaddr + DATAPORT);
973     inw(ioaddr + DATAPORT);
974
975     /* Clear all status */
976     outb(0xff, ioaddr + TX_STATUS);
977     outb(0xff, ioaddr + RX_STATUS);
978
979     if (lp->cardtype == MBH10302)
980         outb(INTR_OFF, ioaddr + LAN_CTRL);
981
982     /* Turn on Rx interrupts */
983     outb(D_TX_INTR, ioaddr + TX_INTR);
984     outb(D_RX_INTR, ioaddr + RX_INTR);
985
986     /* Turn on interrupts from LAN card controller */
987     if (lp->cardtype == MBH10302)
988         outb(INTR_ON, ioaddr + LAN_CTRL);
989 } /* fjn_reset */
990
991 /*====================================================================*/
992
993 static void fjn_rx(struct net_device *dev)
994 {
995     struct local_info_t *lp = netdev_priv(dev);
996     kio_addr_t ioaddr = dev->base_addr;
997     int boguscount = 10;        /* 5 -> 10: by agy 19940922 */
998
999     DEBUG(4, "%s: in rx_packet(), rx_status %02x.\n",
1000           dev->name, inb(ioaddr + RX_STATUS));
1001
1002     while ((inb(ioaddr + RX_MODE) & F_BUF_EMP) == 0) {
1003         u_short status = inw(ioaddr + DATAPORT);
1004
1005         DEBUG(4, "%s: Rxing packet mode %02x status %04x.\n",
1006               dev->name, inb(ioaddr + RX_MODE), status);
1007 #ifndef final_version
1008         if (status == 0) {
1009             outb(F_SKP_PKT, ioaddr + RX_SKIP);
1010             break;
1011         }
1012 #endif
1013         if ((status & 0xF0) != 0x20) {  /* There was an error. */
1014             lp->stats.rx_errors++;
1015             if (status & F_LEN_ERR) lp->stats.rx_length_errors++;
1016             if (status & F_ALG_ERR) lp->stats.rx_frame_errors++;
1017             if (status & F_CRC_ERR) lp->stats.rx_crc_errors++;
1018             if (status & F_OVR_FLO) lp->stats.rx_over_errors++;
1019         } else {
1020             u_short pkt_len = inw(ioaddr + DATAPORT);
1021             /* Malloc up new buffer. */
1022             struct sk_buff *skb;
1023
1024             if (pkt_len > 1550) {
1025                 printk(KERN_NOTICE "%s: The FMV-18x claimed a very "
1026                        "large packet, size %d.\n", dev->name, pkt_len);
1027                 outb(F_SKP_PKT, ioaddr + RX_SKIP);
1028                 lp->stats.rx_errors++;
1029                 break;
1030             }
1031             skb = dev_alloc_skb(pkt_len+2);
1032             if (skb == NULL) {
1033                 printk(KERN_NOTICE "%s: Memory squeeze, dropping "
1034                        "packet (len %d).\n", dev->name, pkt_len);
1035                 outb(F_SKP_PKT, ioaddr + RX_SKIP);
1036                 lp->stats.rx_dropped++;
1037                 break;
1038             }
1039             skb->dev = dev;
1040
1041             skb_reserve(skb, 2);
1042             insw(ioaddr + DATAPORT, skb_put(skb, pkt_len),
1043                  (pkt_len + 1) >> 1);
1044             skb->protocol = eth_type_trans(skb, dev);
1045
1046 #ifdef PCMCIA_DEBUG
1047             if (pc_debug > 5) {
1048                 int i;
1049                 printk(KERN_DEBUG "%s: Rxed packet of length %d: ",
1050                        dev->name, pkt_len);
1051                 for (i = 0; i < 14; i++)
1052                     printk(" %02x", skb->data[i]);
1053                 printk(".\n");
1054             }
1055 #endif
1056
1057             netif_rx(skb);
1058             dev->last_rx = jiffies;
1059             lp->stats.rx_packets++;
1060             lp->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             DEBUG(5, "%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 #ifdef PCMCIA_DEBUG
1099 static u32 netdev_get_msglevel(struct net_device *dev)
1100 {
1101         return pc_debug;
1102 }
1103
1104 static void netdev_set_msglevel(struct net_device *dev, u32 level)
1105 {
1106         pc_debug = level;
1107 }
1108 #endif /* PCMCIA_DEBUG */
1109
1110 static struct ethtool_ops netdev_ethtool_ops = {
1111         .get_drvinfo            = netdev_get_drvinfo,
1112 #ifdef PCMCIA_DEBUG
1113         .get_msglevel           = netdev_get_msglevel,
1114         .set_msglevel           = netdev_set_msglevel,
1115 #endif /* PCMCIA_DEBUG */
1116 };
1117
1118 static int fjn_config(struct net_device *dev, struct ifmap *map){
1119     return 0;
1120 }
1121
1122 static int fjn_open(struct net_device *dev)
1123 {
1124     struct local_info_t *lp = netdev_priv(dev);
1125     dev_link_t *link = lp->p_dev;
1126
1127     DEBUG(4, "fjn_open('%s').\n", dev->name);
1128
1129     if (!DEV_OK(link))
1130         return -ENODEV;
1131     
1132     link->open++;
1133     
1134     fjn_reset(dev);
1135     
1136     lp->tx_started = 0;
1137     lp->tx_queue = 0;
1138     lp->tx_queue_len = 0;
1139     lp->open_time = jiffies;
1140     netif_start_queue(dev);
1141     
1142     return 0;
1143 } /* fjn_open */
1144
1145 /*====================================================================*/
1146
1147 static int fjn_close(struct net_device *dev)
1148 {
1149     struct local_info_t *lp = netdev_priv(dev);
1150     dev_link_t *link = lp->p_dev;
1151     kio_addr_t ioaddr = dev->base_addr;
1152
1153     DEBUG(4, "fjn_close('%s').\n", dev->name);
1154
1155     lp->open_time = 0;
1156     netif_stop_queue(dev);
1157
1158     /* Set configuration register 0 to disable Tx and Rx. */
1159     if( sram_config == 0 ) 
1160         outb(CONFIG0_RST ,ioaddr + CONFIG_0);
1161     else
1162         outb(CONFIG0_RST_1 ,ioaddr + CONFIG_0);
1163
1164     /* Update the statistics -- ToDo. */
1165
1166     /* Power-down the chip.  Green, green, green! */
1167     outb(CHIP_OFF ,ioaddr + CONFIG_1);
1168
1169     /* Set the ethernet adaptor disable IRQ */
1170     if (lp->cardtype == MBH10302)
1171         outb(INTR_OFF, ioaddr + LAN_CTRL);
1172
1173     link->open--;
1174
1175     return 0;
1176 } /* fjn_close */
1177
1178 /*====================================================================*/
1179
1180 static struct net_device_stats *fjn_get_stats(struct net_device *dev)
1181 {
1182     local_info_t *lp = netdev_priv(dev);
1183     return &lp->stats;
1184 } /* fjn_get_stats */
1185
1186 /*====================================================================*/
1187
1188 /*
1189   Set the multicast/promiscuous mode for this adaptor.
1190 */
1191
1192 static void set_rx_mode(struct net_device *dev)
1193 {
1194     kio_addr_t ioaddr = dev->base_addr;
1195     u_char mc_filter[8];                 /* Multicast hash filter */
1196     u_long flags;
1197     int i;
1198     
1199     int saved_bank;
1200     int saved_config_0 = inb(ioaddr + CONFIG_0);
1201      
1202     local_irq_save(flags); 
1203
1204     /* Disable Tx and Rx */
1205     if (sram_config == 0) 
1206         outb(CONFIG0_RST, ioaddr + CONFIG_0);
1207     else
1208         outb(CONFIG0_RST_1, ioaddr + CONFIG_0);
1209
1210     if (dev->flags & IFF_PROMISC) {
1211         /* Unconditionally log net taps. */
1212         printk("%s: Promiscuous mode enabled.\n", dev->name);
1213         memset(mc_filter, 0xff, sizeof(mc_filter));
1214         outb(3, ioaddr + RX_MODE);      /* Enable promiscuous mode */
1215     } else if (dev->mc_count > MC_FILTERBREAK
1216                ||  (dev->flags & IFF_ALLMULTI)) {
1217         /* Too many to filter perfectly -- accept all multicasts. */
1218         memset(mc_filter, 0xff, sizeof(mc_filter));
1219         outb(2, ioaddr + RX_MODE);      /* Use normal mode. */
1220     } else if (dev->mc_count == 0) {
1221         memset(mc_filter, 0x00, sizeof(mc_filter));
1222         outb(1, ioaddr + RX_MODE);      /* Ignore almost all multicasts. */
1223     } else {
1224         struct dev_mc_list *mclist;
1225         int i;
1226         
1227         memset(mc_filter, 0, sizeof(mc_filter));
1228         for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count;
1229              i++, mclist = mclist->next) {
1230             unsigned int bit =
1231                 ether_crc_le(ETH_ALEN, mclist->dmi_addr) >> 26;
1232             mc_filter[bit >> 3] |= (1 << (bit & 7));
1233         }
1234         outb(2, ioaddr + RX_MODE);      /* Use normal mode. */
1235     }
1236
1237     /* Switch to bank 1 and set the multicast table. */
1238     saved_bank = inb(ioaddr + CONFIG_1);
1239     outb(0xe4, ioaddr + CONFIG_1);
1240
1241     for (i = 0; i < 8; i++)
1242         outb(mc_filter[i], ioaddr + MAR_ADR + i);
1243     outb(saved_bank, ioaddr + CONFIG_1);
1244
1245     outb(saved_config_0, ioaddr + CONFIG_0);
1246
1247     local_irq_restore(flags);
1248 }