1 /* fmv18x.c: A network device driver for the Fujitsu FMV-181/182/183/184.
3 Original: at1700.c (1993-94 by Donald Becker).
4 Copyright 1993 United States Government as represented by the
5 Director, National Security Agency.
6 The author may be reached as becker@scyld.com, or C/O
7 Scyld Computing Corporation
8 410 Severn Ave., Suite 210
11 Modified by Yutaka TAMIYA (tamy@flab.fujitsu.co.jp)
12 Copyright 1994 Fujitsu Laboratories Ltd.
14 Masayoshi UTAKA (utaka@ace.yk.fujitsu.co.jp)
15 for testing this driver.
16 H. NEGISHI (agy, negishi@sun45.psd.cs.fujitsu.co.jp)
17 for suggestion of some program modification.
18 Masahiro SEKIGUCHI <seki@sysrap.cs.fujitsu.co.jp>
19 for suggestion of some program modification.
20 Kazutoshi MORIOKA (morioka@aurora.oaks.cs.fujitsu.co.jp)
21 for testing this driver.
23 This software may be used and distributed according to the terms
24 of the GNU General Public License, incorporated herein by reference.
26 This is a device driver for the Fujitsu FMV-181/182/183/184, which
27 is a straight-forward Fujitsu MB86965 implementation.
31 The Fujitsu MB86965 datasheet.
32 The Fujitsu FMV-181/182 user's guide
35 static const char version
[] =
36 "fmv18x.c:v2.2.0 09/24/98 Yutaka TAMIYA (tamy@flab.fujitsu.co.jp)\n";
38 #include <linux/module.h>
39 #include <linux/kernel.h>
40 #include <linux/types.h>
41 #include <linux/fcntl.h>
42 #include <linux/interrupt.h>
43 #include <linux/ioport.h>
45 #include <linux/slab.h>
46 #include <linux/string.h>
47 #include <linux/init.h>
48 #include <linux/errno.h>
49 #include <linux/spinlock.h>
50 #include <linux/netdevice.h>
51 #include <linux/etherdevice.h>
52 #include <linux/skbuff.h>
53 #include <linux/delay.h>
54 #include <linux/bitops.h>
56 #include <asm/system.h>
60 #define DRV_NAME "fmv18x"
62 static unsigned fmv18x_probe_list
[] __initdata
= {
63 0x220, 0x240, 0x260, 0x280, 0x2a0, 0x2c0, 0x300, 0x340, 0
66 /* use 0 for production, 1 for verification, >2 for debug */
70 static unsigned int net_debug
= NET_DEBUG
;
72 typedef unsigned char uchar
;
74 /* Information that need to be kept for each board. */
76 struct net_device_stats stats
;
77 long open_time
; /* Useless example local info. */
78 uint tx_started
:1; /* Number of packet on the Tx queue. */
79 uint tx_queue_ready
:1; /* Tx queue is ready to be sent. */
80 uint rx_started
:1; /* Packets are Rxing. */
81 uchar tx_queue
; /* Number of packet on the Tx queue. */
82 ushort tx_queue_len
; /* Current length of the Tx queue. */
87 /* Offsets from the base address. */
91 #define TX_INTR 2 /* Bit-mapped interrupt enable registers. */
95 #define CONFIG_0 6 /* Misc. configuration settings. */
97 /* Run-time register bank 2 definitions. */
98 #define DATAPORT 8 /* Word-wide DMA or programmed-I/O dataport. */
100 #define COL16CNTL 11 /* Controll Reg for 16 collisions */
102 /* Fujitsu FMV-18x Card Configuration */
103 #define FJ_STATUS0 0x10
104 #define FJ_STATUS1 0x11
105 #define FJ_CONFIG0 0x12
106 #define FJ_CONFIG1 0x13
107 #define FJ_MACADDR 0x14 /* 0x14 - 0x19 */
108 #define FJ_BUFCNTL 0x1A
109 #define FJ_BUFDATA 0x1C
110 #define FMV18X_IO_EXTENT 32
112 /* Index to functions, as function prototypes. */
114 static int fmv18x_probe1(struct net_device
*dev
, short ioaddr
);
115 static int net_open(struct net_device
*dev
);
116 static int net_send_packet(struct sk_buff
*skb
, struct net_device
*dev
);
117 static irqreturn_t
net_interrupt(int irq
, void *dev_id
, struct pt_regs
*regs
);
118 static void net_rx(struct net_device
*dev
);
119 static void net_timeout(struct net_device
*dev
);
120 static int net_close(struct net_device
*dev
);
121 static struct net_device_stats
*net_get_stats(struct net_device
*dev
);
122 static void set_multicast_list(struct net_device
*dev
);
125 /* Check for a network adaptor of this type, and return '0' iff one exists.
126 If dev->base_addr == 0, probe all likely locations.
127 If dev->base_addr == 1, always return failure.
128 If dev->base_addr == 2, allocate space for the device and return success
129 (detachable devices only).
132 static int io
= 0x220;
135 struct net_device
* __init
fmv18x_probe(int unit
)
137 struct net_device
*dev
= alloc_etherdev(sizeof(struct net_local
));
142 return ERR_PTR(-ENODEV
);
145 sprintf(dev
->name
, "eth%d", unit
);
146 netdev_boot_setup_check(dev
);
151 SET_MODULE_OWNER(dev
);
153 if (io
> 0x1ff) { /* Check a single specified location. */
154 err
= fmv18x_probe1(dev
, io
);
155 } else if (io
!= 0) { /* Don't probe at all. */
158 for (port
= fmv18x_probe_list
; *port
; port
++)
159 if (fmv18x_probe1(dev
, *port
) == 0)
166 err
= register_netdev(dev
);
171 free_irq(dev
->irq
, dev
);
172 release_region(dev
->base_addr
, FMV18X_IO_EXTENT
);
178 /* The Fujitsu datasheet suggests that the NIC be probed for by checking its
179 "signature", the default bit pattern after a reset. This *doesn't* work --
180 there is no way to reset the bus interface without a complete power-cycle!
182 It turns out that ATI came to the same conclusion I did: the only thing
183 that can be done is checking a few bits and then diving right into MAC
186 static int __init
fmv18x_probe1(struct net_device
*dev
, short ioaddr
)
188 char irqmap
[4] = {3, 7, 10, 15};
189 char irqmap_pnp
[8] = {3, 4, 5, 7, 9, 10, 11, 15};
190 unsigned int i
, retval
;
191 struct net_local
*lp
;
193 /* Resetting the chip doesn't reset the ISA interface, so don't bother.
194 That means we have to be careful with the register values we probe for.
197 if (!request_region(ioaddr
, FMV18X_IO_EXTENT
, DRV_NAME
))
201 dev
->base_addr
= ioaddr
;
203 /* Check I/O address configuration and Fujitsu vendor code */
204 if (inb(ioaddr
+FJ_MACADDR
) != 0x00
205 || inb(ioaddr
+FJ_MACADDR
+1) != 0x00
206 || inb(ioaddr
+FJ_MACADDR
+2) != 0x0e) {
211 /* Check PnP mode for FMV-183/184/183A/184A. */
212 /* This PnP routine is very poor. IO and IRQ should be known. */
213 if (inb(ioaddr
+ FJ_STATUS1
) & 0x20) {
214 for (i
= 0; i
< 8; i
++) {
215 if (dev
->irq
== irqmap_pnp
[i
])
223 if (fmv18x_probe_list
[inb(ioaddr
+ FJ_CONFIG0
) & 0x07] != ioaddr
)
225 dev
->irq
= irqmap
[(inb(ioaddr
+ FJ_CONFIG0
)>>6) & 0x03];
228 /* Snarf the interrupt vector now. */
229 retval
= request_irq(dev
->irq
, &net_interrupt
, 0, DRV_NAME
, dev
);
231 printk ("FMV-18x found at %#3x, but it's unusable due to a conflict on"
232 "IRQ %d.\n", ioaddr
, dev
->irq
);
236 printk("%s: FMV-18x found at %#3x, IRQ %d, address ", dev
->name
,
239 for(i
= 0; i
< 6; i
++) {
240 unsigned char val
= inb(ioaddr
+ FJ_MACADDR
+ i
);
242 dev
->dev_addr
[i
] = val
;
245 /* "FJ_STATUS0" 12 bit 0x0400 means use regular 100 ohm 10baseT signals,
246 rather than 150 ohm shielded twisted pair compensation.
247 0x0000 == auto-sense the interface
248 0x0800 == use TP interface
249 0x1800 == use coax interface
252 const char *porttype
[] = {"auto-sense", "10baseT", "auto-sense", "10base2/5"};
253 ushort setup_value
= inb(ioaddr
+ FJ_STATUS0
);
255 switch( setup_value
& 0x07 ){
256 case 0x01 /* 10base5 */:
257 case 0x02 /* 10base2 */: dev
->if_port
= 0x18; break;
258 case 0x04 /* 10baseT */: dev
->if_port
= 0x08; break;
259 default /* auto-sense*/: dev
->if_port
= 0x00; break;
261 printk(" %s interface.\n", porttype
[(dev
->if_port
>>3) & 3]);
264 /* Initialize LAN Controller and LAN Card */
265 outb(0xda, ioaddr
+ CONFIG_0
); /* Initialize LAN Controller */
266 outb(0x00, ioaddr
+ CONFIG_1
); /* Stand by mode */
267 outb(0x00, ioaddr
+ FJ_CONFIG1
); /* Disable IRQ of LAN Card */
268 outb(0x00, ioaddr
+ FJ_BUFCNTL
); /* Reset ? I'm not sure (TAMIYA) */
270 /* wait for a while */
273 /* Set the station address in bank zero. */
274 outb(0x00, ioaddr
+ CONFIG_1
);
275 for (i
= 0; i
< 6; i
++)
276 outb(dev
->dev_addr
[i
], ioaddr
+ 8 + i
);
278 /* Switch to bank 1 and set the multicast table to accept none. */
279 outb(0x04, ioaddr
+ CONFIG_1
);
280 for (i
= 0; i
< 8; i
++)
281 outb(0x00, ioaddr
+ 8 + i
);
283 /* Switch to bank 2 and lock our I/O address. */
284 outb(0x08, ioaddr
+ CONFIG_1
);
285 outb(dev
->if_port
, ioaddr
+ MODE13
);
286 outb(0x00, ioaddr
+ COL16CNTL
);
291 /* Initialize the device structure. */
292 dev
->priv
= kmalloc(sizeof(struct net_local
), GFP_KERNEL
);
297 memset(dev
->priv
, 0, sizeof(struct net_local
));
299 spin_lock_init(&lp
->lock
);
301 dev
->open
= net_open
;
302 dev
->stop
= net_close
;
303 dev
->hard_start_xmit
= net_send_packet
;
304 dev
->tx_timeout
= net_timeout
;
305 dev
->watchdog_timeo
= HZ
/10;
306 dev
->get_stats
= net_get_stats
;
307 dev
->set_multicast_list
= set_multicast_list
;
311 free_irq(dev
->irq
, dev
);
313 release_region(ioaddr
, FMV18X_IO_EXTENT
);
318 static int net_open(struct net_device
*dev
)
320 struct net_local
*lp
= dev
->priv
;
321 int ioaddr
= dev
->base_addr
;
323 /* Set the configuration register 0 to 32K 100ns. byte-wide memory,
324 16 bit bus access, and two 4K Tx, enable the Rx and Tx. */
325 outb(0x5a, ioaddr
+ CONFIG_0
);
327 /* Powerup and switch to register bank 2 for the run-time registers. */
328 outb(0xe8, ioaddr
+ CONFIG_1
);
331 lp
->tx_queue_ready
= 1;
334 lp
->tx_queue_len
= 0;
336 /* Clear Tx and Rx Status */
337 outb(0xff, ioaddr
+ TX_STATUS
);
338 outb(0xff, ioaddr
+ RX_STATUS
);
339 lp
->open_time
= jiffies
;
341 netif_start_queue(dev
);
343 /* Enable the IRQ of the LAN Card */
344 outb(0x80, ioaddr
+ FJ_CONFIG1
);
346 /* Enable both Tx and Rx interrupts */
347 outw(0x8182, ioaddr
+TX_INTR
);
352 static void net_timeout(struct net_device
*dev
)
354 struct net_local
*lp
= dev
->priv
;
355 int ioaddr
= dev
->base_addr
;
359 printk(KERN_WARNING
"%s: transmit timed out with status %04x, %s?\n", dev
->name
,
360 htons(inw(ioaddr
+ TX_STATUS
)),
361 inb(ioaddr
+ TX_STATUS
) & 0x80
362 ? "IRQ conflict" : "network cable problem");
363 printk(KERN_WARNING
"%s: timeout registers: %04x %04x %04x %04x %04x %04x %04x %04x.\n",
364 dev
->name
, htons(inw(ioaddr
+ 0)),
365 htons(inw(ioaddr
+ 2)), htons(inw(ioaddr
+ 4)),
366 htons(inw(ioaddr
+ 6)), htons(inw(ioaddr
+ 8)),
367 htons(inw(ioaddr
+10)), htons(inw(ioaddr
+12)),
368 htons(inw(ioaddr
+14)));
369 printk(KERN_WARNING
"eth card: %04x %04x\n",
370 htons(inw(ioaddr
+FJ_STATUS0
)),
371 htons(inw(ioaddr
+FJ_CONFIG0
)));
372 lp
->stats
.tx_errors
++;
373 /* ToDo: We should try to restart the adaptor... */
374 spin_lock_irqsave(&lp
->lock
, flags
);
376 /* Initialize LAN Controller and LAN Card */
377 outb(0xda, ioaddr
+ CONFIG_0
); /* Initialize LAN Controller */
378 outb(0x00, ioaddr
+ CONFIG_1
); /* Stand by mode */
379 outb(0x00, ioaddr
+ FJ_CONFIG1
); /* Disable IRQ of LAN Card */
380 outb(0x00, ioaddr
+ FJ_BUFCNTL
); /* Reset ? I'm not sure */
382 spin_unlock_irqrestore(&lp
->lock
, flags
);
384 netif_wake_queue(dev
);
387 static int net_send_packet(struct sk_buff
*skb
, struct net_device
*dev
)
389 struct net_local
*lp
= dev
->priv
;
390 int ioaddr
= dev
->base_addr
;
391 short length
= skb
->len
;
395 /* Block a transmit from overlapping. */
397 if (length
> ETH_FRAME_LEN
) {
399 printk("%s: Attempting to send a large packet (%d bytes).\n",
404 if (length
< ETH_ZLEN
) {
405 skb
= skb_padto(skb
, ETH_ZLEN
);
413 printk("%s: Transmitting a packet of length %lu.\n", dev
->name
,
414 (unsigned long)skb
->len
);
415 /* We may not start transmitting unless we finish transferring
416 a packet into the Tx queue. During executing the following
417 codes we possibly catch a Tx interrupt. Thus we flag off
418 tx_queue_ready, so that we prevent the interrupt routine
419 (net_interrupt) to start transmitting. */
420 spin_lock_irqsave(&lp
->lock
, flags
);
421 lp
->tx_queue_ready
= 0;
423 outw(length
, ioaddr
+ DATAPORT
);
424 outsw(ioaddr
+ DATAPORT
, buf
, (length
+ 1) >> 1);
426 lp
->tx_queue_len
+= length
+ 2;
428 lp
->tx_queue_ready
= 1;
429 spin_unlock_irqrestore(&lp
->lock
, flags
);
431 if (lp
->tx_started
== 0) {
432 /* If the Tx is idle, always trigger a transmit. */
433 outb(0x80 | lp
->tx_queue
, ioaddr
+ TX_START
);
435 lp
->tx_queue_len
= 0;
436 dev
->trans_start
= jiffies
;
438 } else if (lp
->tx_queue_len
>= 4096 - 1502) /* No room for a packet */
439 netif_stop_queue(dev
);
445 /* The typical workload of the driver:
446 Handle the network interface interrupts. */
448 net_interrupt(int irq
, void *dev_id
, struct pt_regs
*regs
)
450 struct net_device
*dev
= dev_id
;
451 struct net_local
*lp
;
454 ioaddr
= dev
->base_addr
;
456 status
= inw(ioaddr
+ TX_STATUS
);
457 outw(status
, ioaddr
+ TX_STATUS
);
460 printk("%s: Interrupt with status %04x.\n", dev
->name
, status
);
461 if (lp
->rx_started
== 0 &&
462 (status
& 0xff00 || (inb(ioaddr
+ RX_MODE
) & 0x40) == 0)) {
464 We cannot execute net_rx more than once at the same time for
465 the same device. During executing net_rx, we possibly catch a
466 Tx interrupt. Thus we flag on rx_started, so that we prevent
467 the interrupt routine (net_interrupt) to dive into net_rx
470 outb(0x00, ioaddr
+ RX_INTR
); /* Disable RX intr. */
472 outb(0x81, ioaddr
+ RX_INTR
); /* Enable RX intr. */
475 if (status
& 0x00ff) {
477 /* More than 16 collisions occurred */
479 printk("%s: 16 Collision occur during Txing.\n", dev
->name
);
480 /* Cancel sending a packet. */
481 outb(0x03, ioaddr
+ COL16CNTL
);
482 lp
->stats
.collisions
++;
485 spin_lock(&lp
->lock
);
486 lp
->stats
.tx_packets
++;
487 if (lp
->tx_queue
&& lp
->tx_queue_ready
) {
488 outb(0x80 | lp
->tx_queue
, ioaddr
+ TX_START
);
490 lp
->tx_queue_len
= 0;
491 dev
->trans_start
= jiffies
;
492 netif_wake_queue(dev
); /* Inform upper layers. */
495 netif_wake_queue(dev
); /* Inform upper layers. */
497 spin_unlock(&lp
->lock
);
500 return IRQ_RETVAL(status
);
503 /* We have a good packet(s), get it/them out of the buffers. */
504 static void net_rx(struct net_device
*dev
)
506 struct net_local
*lp
= dev
->priv
;
507 int ioaddr
= dev
->base_addr
;
510 while ((inb(ioaddr
+ RX_MODE
) & 0x40) == 0) {
511 /* Clear PKT_RDY bit: by agy 19940922 */
512 /* outb(0x80, ioaddr + RX_STATUS); */
513 ushort status
= inw(ioaddr
+ DATAPORT
);
516 printk("%s: Rxing packet mode %02x status %04x.\n",
517 dev
->name
, inb(ioaddr
+ RX_MODE
), status
);
518 #ifndef final_version
520 outb(0x05, ioaddr
+ 14);
525 if ((status
& 0xF0) != 0x20) { /* There was an error. */
526 lp
->stats
.rx_errors
++;
527 if (status
& 0x08) lp
->stats
.rx_length_errors
++;
528 if (status
& 0x04) lp
->stats
.rx_frame_errors
++;
529 if (status
& 0x02) lp
->stats
.rx_crc_errors
++;
530 if (status
& 0x01) lp
->stats
.rx_over_errors
++;
532 ushort pkt_len
= inw(ioaddr
+ DATAPORT
);
533 /* Malloc up new buffer. */
536 if (pkt_len
> 1550) {
537 printk("%s: The FMV-18x claimed a very large packet, size %d.\n",
539 outb(0x05, ioaddr
+ 14);
540 lp
->stats
.rx_errors
++;
543 skb
= dev_alloc_skb(pkt_len
+3);
545 printk("%s: Memory squeeze, dropping packet (len %d).\n",
547 outb(0x05, ioaddr
+ 14);
548 lp
->stats
.rx_dropped
++;
554 insw(ioaddr
+ DATAPORT
, skb_put(skb
,pkt_len
), (pkt_len
+ 1) >> 1);
558 printk("%s: Rxed packet of length %d: ", dev
->name
, pkt_len
);
559 for (i
= 0; i
< 14; i
++)
560 printk(" %02x", skb
->data
[i
]);
564 skb
->protocol
=eth_type_trans(skb
, dev
);
566 dev
->last_rx
= jiffies
;
567 lp
->stats
.rx_packets
++;
568 lp
->stats
.rx_bytes
+= pkt_len
;
570 if (--boguscount
<= 0)
574 /* If any worth-while packets have been received, dev_rint()
575 has done a mark_bh(NET_BH) for us and will work on them
576 when we get to the bottom-half routine. */
579 for (i
= 0; i
< 20; i
++) {
580 if ((inb(ioaddr
+ RX_MODE
) & 0x40) == 0x40)
582 (void)inw(ioaddr
+ DATAPORT
); /* dummy status read */
583 outb(0x05, ioaddr
+ 14);
586 if (net_debug
> 5 && i
> 0)
587 printk("%s: Exint Rx packet with mode %02x after %d ticks.\n",
588 dev
->name
, inb(ioaddr
+ RX_MODE
), i
);
594 /* The inverse routine to net_open(). */
595 static int net_close(struct net_device
*dev
)
597 int ioaddr
= dev
->base_addr
;
599 ((struct net_local
*)dev
->priv
)->open_time
= 0;
601 netif_stop_queue(dev
);
603 /* Set configuration register 0 to disable Tx and Rx. */
604 outb(0xda, ioaddr
+ CONFIG_0
);
606 /* Update the statistics -- ToDo. */
608 /* Power-down the chip. Green, green, green! */
609 outb(0x00, ioaddr
+ CONFIG_1
);
611 /* Set the ethernet adaptor disable IRQ */
612 outb(0x00, ioaddr
+ FJ_CONFIG1
);
617 /* Get the current statistics. This may be called with the card open or
619 static struct net_device_stats
*net_get_stats(struct net_device
*dev
)
621 struct net_local
*lp
= dev
->priv
;
625 /* Set or clear the multicast filter for this adaptor.
626 num_addrs == -1 Promiscuous mode, receive all packets
627 num_addrs == 0 Normal mode, clear multicast list
628 num_addrs > 0 Multicast mode, receive normal and MC packets, and do
629 best-effort filtering.
632 static void set_multicast_list(struct net_device
*dev
)
634 short ioaddr
= dev
->base_addr
;
635 if (dev
->mc_count
|| dev
->flags
&(IFF_PROMISC
|IFF_ALLMULTI
))
638 * We must make the kernel realise we had to move
639 * into promisc mode or we start all out war on
642 dev
->flags
|=IFF_PROMISC
;
644 outb(3, ioaddr
+ RX_MODE
); /* Enable promiscuous mode */
647 outb(2, ioaddr
+ RX_MODE
); /* Disable promiscuous, use normal mode */
651 static struct net_device
*dev_fmv18x
;
653 MODULE_PARM(io
, "i");
654 MODULE_PARM(irq
, "i");
655 MODULE_PARM(net_debug
, "i");
656 MODULE_PARM_DESC(io
, "FMV-18X I/O address");
657 MODULE_PARM_DESC(irq
, "FMV-18X IRQ number");
658 MODULE_PARM_DESC(net_debug
, "FMV-18X debug level (0-1,5-6)");
659 MODULE_LICENSE("GPL");
661 int init_module(void)
664 printk("fmv18x: You should not use auto-probing with insmod!\n");
665 dev_fmv18x
= fmv18x_probe(-1);
666 if (IS_ERR(dev_fmv18x
))
667 return PTR_ERR(dev_fmv18x
);
674 unregister_netdev(dev_fmv18x
);
675 free_irq(dev_fmv18x
->irq
, dev_fmv18x
);
676 release_region(dev_fmv18x
->base_addr
, FMV18X_IO_EXTENT
);
677 free_netdev(dev_fmv18x
);
683 * compile-command: "gcc -D__KERNEL__ -I/usr/src/linux/net/inet -Wall -Wstrict-prototypes -O6 -m486 -c fmv18x.c"
685 * kept-new-versions: 5