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