1 /* seeq8005.c: A network driver for linux. */
4 Written 1993-94 by Donald Becker.
5 See the skeleton.c file for further copyright information.
7 This software may be used and distributed according to the terms
8 of the GNU Public License, incorporated herein by reference.
10 The author may be reached as hamish@zot.apana.org.au
12 This file is a network device driver for the SEEQ 8005 chipset and
13 the Linux operating system.
17 static const char *version
=
18 "seeq8005.c:v1.00 8/07/95 Hamish Coleman (hamish@zot.apana.org.au)\n";
25 1.00 Public release. cosmetic changes (no warnings now)
26 0.68 Turning per- packet,interrupt debug messages off - testing for release.
27 0.67 timing problems/bad buffer reads seem to be fixed now
28 0.63 *!@$ protocol=eth_type_trans -- now packets flow
33 #include <linux/kernel.h>
34 #include <linux/sched.h>
35 #include <linux/types.h>
36 #include <linux/fcntl.h>
37 #include <linux/interrupt.h>
38 #include <linux/ptrace.h>
39 #include <linux/ioport.h>
41 #include <linux/malloc.h>
42 #include <linux/string.h>
43 #include <linux/init.h>
44 #include <asm/system.h>
45 #include <asm/bitops.h>
48 #include <linux/errno.h>
50 #include <linux/netdevice.h>
51 #include <linux/etherdevice.h>
52 #include <linux/skbuff.h>
55 /* First, a few definitions that the brave might change. */
56 /* A zero-terminated list of I/O addresses to be probed. */
57 static unsigned int seeq8005_portlist
[] __initdata
=
58 { 0x300, 0x320, 0x340, 0x360, 0};
60 /* use 0 for production, 1 for verification, >2 for debug */
64 static unsigned int net_debug
= NET_DEBUG
;
66 /* Information that need to be kept for each board. */
68 struct net_device_stats stats
;
69 unsigned short receive_ptr
; /* What address in packet memory do we expect a recv_pkt_header? */
70 long open_time
; /* Useless example local info. */
73 /* The station (ethernet) address prefix, used for IDing the board. */
78 /* Index to functions, as function prototypes. */
80 extern int seeq8005_probe(struct device
*dev
);
82 static int seeq8005_probe1(struct device
*dev
, int ioaddr
);
83 static int seeq8005_open(struct device
*dev
);
84 static int seeq8005_send_packet(struct sk_buff
*skb
, struct device
*dev
);
85 static void seeq8005_interrupt(int irq
, void *dev_id
, struct pt_regs
*regs
);
86 static void seeq8005_rx(struct device
*dev
);
87 static int seeq8005_close(struct device
*dev
);
88 static struct net_device_stats
*seeq8005_get_stats(struct device
*dev
);
89 static void set_multicast_list(struct device
*dev
);
91 /* Example routines you must write ;->. */
92 #define tx_done(dev) (inw(SEEQ_STATUS) & SEEQSTAT_TX_ON)
93 static void hardware_send_packet(struct device
*dev
, char *buf
, int length
);
94 extern void seeq8005_init(struct device
*dev
, int startp
);
95 static inline void wait_for_buffer(struct device
*dev
);
98 /* Check for a network adaptor of this type, and return '0' iff one exists.
99 If dev->base_addr == 0, probe all likely locations.
100 If dev->base_addr == 1, always return failure.
101 If dev->base_addr == 2, allocate space for the device and return success
102 (detachable devices only).
105 /* Support for an alternate probe manager, which will eliminate the
106 boilerplate below. */
107 struct netdev_entry seeq8005_drv
=
108 {"seeq8005", seeq8005_probe1
, SEEQ8005_IO_EXTENT
, seeq8005_portlist
};
111 seeq8005_probe(struct device
*dev
))
114 int base_addr
= dev
? dev
->base_addr
: 0;
116 if (base_addr
> 0x1ff) /* Check a single specified location. */
117 return seeq8005_probe1(dev
, base_addr
);
118 else if (base_addr
!= 0) /* Don't probe at all. */
121 for (i
= 0; seeq8005_portlist
[i
]; i
++) {
122 int ioaddr
= seeq8005_portlist
[i
];
123 if (check_region(ioaddr
, SEEQ8005_IO_EXTENT
))
125 if (seeq8005_probe1(dev
, ioaddr
) == 0)
133 /* This is the real probe routine. Linux has a history of friendly device
134 probes on the ISA bus. A good device probes avoids doing writes, and
135 verifies that the correct device exists and functions. */
137 __initfunc(static int seeq8005_probe1(struct device
*dev
, int ioaddr
))
139 static unsigned version_printed
= 0;
141 unsigned char SA_prom
[32];
149 printk("seeq8005: probing at 0x%x\n",ioaddr
);
151 old_stat
= inw(SEEQ_STATUS
); /* read status register */
152 if (old_stat
== 0xffff)
153 return ENODEV
; /* assume that 0xffff == no device */
154 if ( (old_stat
& 0x1800) != 0x1800 ) { /* assume that unused bits are 1, as my manual says */
156 printk("seeq8005: reserved stat bits != 0x1800\n");
157 printk(" == 0x%04x\n",old_stat
);
162 old_rear
= inw(SEEQ_REA
);
163 if (old_rear
== 0xffff) {
165 if (inw(SEEQ_REA
) == 0xffff) { /* assume that 0xffff == no device */
168 } else if ((old_rear
& 0xff00) != 0xff00) { /* assume that unused bits are 1 */
170 printk("seeq8005: unused rear bits != 0xff00\n");
171 printk(" == 0x%04x\n",old_rear
);
176 old_cfg2
= inw(SEEQ_CFG2
); /* read CFG2 register */
177 old_cfg1
= inw(SEEQ_CFG1
);
178 old_dmaar
= inw(SEEQ_DMAAR
);
181 printk("seeq8005: stat = 0x%04x\n",old_stat
);
182 printk("seeq8005: cfg1 = 0x%04x\n",old_cfg1
);
183 printk("seeq8005: cfg2 = 0x%04x\n",old_cfg2
);
184 printk("seeq8005: raer = 0x%04x\n",old_rear
);
185 printk("seeq8005: dmaar= 0x%04x\n",old_dmaar
);
188 outw( SEEQCMD_FIFO_WRITE
| SEEQCMD_SET_ALL_OFF
, SEEQ_CMD
); /* setup for reading PROM */
189 outw( 0, SEEQ_DMAAR
); /* set starting PROM address */
190 outw( SEEQCFG1_BUFFER_PROM
, SEEQ_CFG1
); /* set buffer to look at PROM */
194 for(i
=0; i
<32; i
++) {
195 j
+= SA_prom
[i
] = inw(SEEQ_BUFFER
) & 0xff;
199 /* untested because I only have the one card */
200 if ( (j
&0xff) != 0 ) { /* checksum appears to be 8bit = 0 */
201 if (net_debug
>1) { /* check this before deciding that we have a card */
202 printk("seeq8005: prom sum error\n");
204 outw( old_stat
, SEEQ_STATUS
);
205 outw( old_dmaar
, SEEQ_DMAAR
);
206 outw( old_cfg1
, SEEQ_CFG1
);
211 outw( SEEQCFG2_RESET
, SEEQ_CFG2
); /* reset the card */
212 SLOW_DOWN_IO
; /* have to wait 4us after a reset - should be fixed */
216 outw( SEEQCMD_SET_ALL_OFF
, SEEQ_CMD
);
219 printk("seeq8005: prom sum = 0x%08x\n",j
);
220 for(j
=0; j
<32; j
+=16) {
221 printk("seeq8005: prom %02x: ",j
);
223 printk("%02x ",SA_prom
[j
|i
]);
227 if ((SA_prom
[j
|i
]>31)&&(SA_prom
[j
|i
]<127)) {
228 printk("%c", SA_prom
[j
|i
]);
239 * testing the packet buffer memory doesn't work yet
240 * but all other buffer accesses do
241 * - fixing is not a priority
243 if (net_debug
>1) { /* test packet buffer memory */
244 printk("seeq8005: testing packet buffer ... ");
245 outw( SEEQCFG1_BUFFER_BUFFER
, SEEQ_CFG1
);
246 outw( SEEQCMD_FIFO_WRITE
| SEEQCMD_SET_ALL_OFF
, SEEQ_CMD
);
247 outw( 0 , SEEQ_DMAAR
);
248 for(i
=0;i
<32768;i
++) {
249 outw(0x5a5a, SEEQ_BUFFER
);
252 while ( ((inw(SEEQ_STATUS
) & SEEQSTAT_FIFO_EMPTY
) != SEEQSTAT_FIFO_EMPTY
) && jiffies
< j
)
254 outw( 0 , SEEQ_DMAAR
);
255 while ( ((inw(SEEQ_STATUS
) & SEEQSTAT_WINDOW_INT
) != SEEQSTAT_WINDOW_INT
) && jiffies
< j
+HZ
)
257 if ( (inw(SEEQ_STATUS
) & SEEQSTAT_WINDOW_INT
) == SEEQSTAT_WINDOW_INT
)
258 outw( SEEQCMD_WINDOW_INT_ACK
| (inw(SEEQ_STATUS
)& SEEQCMD_INT_MASK
), SEEQ_CMD
);
259 outw( SEEQCMD_FIFO_READ
| SEEQCMD_SET_ALL_OFF
, SEEQ_CMD
);
261 for(i
=0;i
<32768;i
++) {
262 if (inw(SEEQ_BUFFER
) != 0x5a5a)
273 /* Allocate a new 'dev' if needed. */
275 dev
= init_etherdev(0, sizeof(struct net_local
));
277 if (net_debug
&& version_printed
++ == 0)
280 printk("%s: %s found at %#3x, ", dev
->name
, "seeq8005", ioaddr
);
282 /* Fill in the 'dev' fields. */
283 dev
->base_addr
= ioaddr
;
285 /* Retrieve and print the ethernet address. */
286 for (i
= 0; i
< 6; i
++)
287 printk(" %2.2x", dev
->dev_addr
[i
] = SA_prom
[i
+6]);
289 if (dev
->irq
== 0xff)
290 ; /* Do nothing: a user-level program will set it. */
291 else if (dev
->irq
< 2) { /* "Auto-IRQ" */
294 outw( SEEQCMD_RX_INT_EN
| SEEQCMD_SET_RX_ON
| SEEQCMD_SET_RX_OFF
, SEEQ_CMD
);
296 dev
->irq
= autoirq_report(0);
299 printk(" autoirq is %d\n", dev
->irq
);
300 } else if (dev
->irq
== 2)
301 /* Fixup for users that don't know that IRQ 2 is really IRQ 9,
302 * or don't know which one to set.
308 int irqval
= request_irq(dev
->irq
, &seeq8005_interrupt
, 0, "seeq8005", NULL
);
310 printk ("%s: unable to get IRQ %d (irqval=%d).\n", dev
->name
,
317 /* Grab the region so we can find another board if autoIRQ fails. */
318 request_region(ioaddr
, SEEQ8005_IO_EXTENT
,"seeq8005");
320 /* Initialize the device structure. */
321 dev
->priv
= kmalloc(sizeof(struct net_local
), GFP_KERNEL
);
322 if (dev
->priv
== NULL
)
324 memset(dev
->priv
, 0, sizeof(struct net_local
));
326 dev
->open
= seeq8005_open
;
327 dev
->stop
= seeq8005_close
;
328 dev
->hard_start_xmit
= seeq8005_send_packet
;
329 dev
->get_stats
= seeq8005_get_stats
;
330 dev
->set_multicast_list
= &set_multicast_list
;
332 /* Fill in the fields of the device structure with ethernet values. */
335 dev
->flags
&= ~IFF_MULTICAST
;
341 /* Open/initialize the board. This is called (in the current kernel)
342 sometime after booting when the 'ifconfig' program is run.
344 This routine should set everything up anew at each open, even
345 registers that "should" only need to be set once at boot, so that
346 there is non-reboot way to recover if something goes wrong.
349 seeq8005_open(struct device
*dev
)
351 struct net_local
*lp
= (struct net_local
*)dev
->priv
;
354 int irqval
= request_irq(dev
->irq
, &seeq8005_interrupt
, 0, "seeq8005", NULL
);
356 printk ("%s: unable to get IRQ %d (irqval=%d).\n", dev
->name
,
361 irq2dev_map
[dev
->irq
] = dev
;
363 /* Reset the hardware here. Don't forget to set the station address. */
364 seeq8005_init(dev
, 1);
366 lp
->open_time
= jiffies
;
375 seeq8005_send_packet(struct sk_buff
*skb
, struct device
*dev
)
377 int ioaddr
= dev
->base_addr
;
380 /* If we get here, some higher level has decided we are broken.
381 There should really be a "kick me" function call instead. */
382 int tickssofar
= jiffies
- dev
->trans_start
;
385 printk("%s: transmit timed out, %s?\n", dev
->name
,
386 tx_done(dev
) ? "IRQ conflict" : "network cable problem");
387 /* Try to restart the adaptor. */
388 seeq8005_init(dev
, 1);
390 dev
->trans_start
= jiffies
;
393 /* Block a timer-based transmit from overlapping. This could better be
394 done with atomic_swap(1, dev->tbusy), but set_bit() works as well. */
395 if (test_and_set_bit(0, (void*)&dev
->tbusy
) != 0)
396 printk("%s: Transmitter access conflict.\n", dev
->name
);
398 short length
= ETH_ZLEN
< skb
->len
? skb
->len
: ETH_ZLEN
;
399 unsigned char *buf
= skb
->data
;
401 hardware_send_packet(dev
, buf
, length
);
402 dev
->trans_start
= jiffies
;
404 dev_kfree_skb (skb
, FREE_WRITE
);
406 /* You might need to clean up and record Tx statistics here. */
411 /* The typical workload of the driver:
412 Handle the network interface interrupts. */
414 seeq8005_interrupt(int irq
, void *dev_id
, struct pt_regs
* regs
)
416 struct device
*dev
= (struct device
*)(irq2dev_map
[irq
]);
417 struct net_local
*lp
;
418 int ioaddr
, status
, boguscount
= 0;
421 printk ("net_interrupt(): irq %d for unknown device.\n", irq
);
426 printk ("%s: Re-entering the interrupt handler.\n", dev
->name
);
429 ioaddr
= dev
->base_addr
;
430 lp
= (struct net_local
*)dev
->priv
;
432 status
= inw(SEEQ_STATUS
);
435 printk("%s: int, status=0x%04x\n",dev
->name
,status
);
438 if (status
& SEEQSTAT_WINDOW_INT
) {
439 outw( SEEQCMD_WINDOW_INT_ACK
| (status
& SEEQCMD_INT_MASK
), SEEQ_CMD
);
441 printk("%s: window int!\n",dev
->name
);
444 if (status
& SEEQSTAT_TX_INT
) {
445 outw( SEEQCMD_TX_INT_ACK
| (status
& SEEQCMD_INT_MASK
), SEEQ_CMD
);
446 lp
->stats
.tx_packets
++;
448 mark_bh(NET_BH
); /* Inform upper layers. */
450 if (status
& SEEQSTAT_RX_INT
) {
451 /* Got a packet(s). */
454 status
= inw(SEEQ_STATUS
);
455 } while ( (++boguscount
< 10) && (status
& SEEQSTAT_ANY_INT
)) ;
458 printk("%s: eoi\n",dev
->name
);
464 /* We have a good packet(s), get it/them out of the buffers. */
466 seeq8005_rx(struct device
*dev
)
468 struct net_local
*lp
= (struct net_local
*)dev
->priv
;
471 int ioaddr
= dev
->base_addr
;
479 status
= inw(SEEQ_STATUS
);
480 outw( lp
->receive_ptr
, SEEQ_DMAAR
);
481 outw(SEEQCMD_FIFO_READ
| SEEQCMD_RX_INT_ACK
| (status
& SEEQCMD_INT_MASK
), SEEQ_CMD
);
482 wait_for_buffer(dev
);
483 next_packet
= ntohs(inw(SEEQ_BUFFER
));
484 pkt_hdr
= inw(SEEQ_BUFFER
);
487 printk("%s: 0x%04x recv next=0x%04x, hdr=0x%04x\n",dev
->name
,lp
->receive_ptr
,next_packet
,pkt_hdr
);
490 if ((next_packet
== 0) || ((pkt_hdr
& SEEQPKTH_CHAIN
)==0)) { /* Read all the frames? */
491 return; /* Done for now */
494 if ((pkt_hdr
& SEEQPKTS_DONE
)==0)
497 if (next_packet
< lp
->receive_ptr
) {
498 pkt_len
= (next_packet
+ 0x10000 - ((DEFAULT_TEA
+1)<<8)) - lp
->receive_ptr
- 4;
500 pkt_len
= next_packet
- lp
->receive_ptr
- 4;
503 if (next_packet
< ((DEFAULT_TEA
+1)<<8)) { /* is the next_packet address sane? */
504 printk("%s: recv packet ring corrupt, resetting board\n",dev
->name
);
505 seeq8005_init(dev
,1);
509 lp
->receive_ptr
= next_packet
;
512 printk("%s: recv len=0x%04x\n",dev
->name
,pkt_len
);
515 if (pkt_hdr
& SEEQPKTS_ANY_ERROR
) { /* There was an error. */
516 lp
->stats
.rx_errors
++;
517 if (pkt_hdr
& SEEQPKTS_SHORT
) lp
->stats
.rx_frame_errors
++;
518 if (pkt_hdr
& SEEQPKTS_DRIB
) lp
->stats
.rx_frame_errors
++;
519 if (pkt_hdr
& SEEQPKTS_OVERSIZE
) lp
->stats
.rx_over_errors
++;
520 if (pkt_hdr
& SEEQPKTS_CRC_ERR
) lp
->stats
.rx_crc_errors
++;
521 /* skip over this packet */
522 outw( SEEQCMD_FIFO_WRITE
| SEEQCMD_DMA_INT_ACK
| (status
& SEEQCMD_INT_MASK
), SEEQ_CMD
);
523 outw( (lp
->receive_ptr
& 0xff00)>>8, SEEQ_REA
);
525 /* Malloc up new buffer. */
529 skb
= dev_alloc_skb(pkt_len
);
531 printk("%s: Memory squeeze, dropping packet.\n", dev
->name
);
532 lp
->stats
.rx_dropped
++;
536 skb_reserve(skb
, 2); /* align data on 16 byte */
537 buf
= skb_put(skb
,pkt_len
);
539 insw(SEEQ_BUFFER
, buf
, (pkt_len
+ 1) >> 1);
543 printk("%s: recv ",dev
->name
);
545 printk("%02x ",*(p
++)&0xff);
550 skb
->protocol
=eth_type_trans(skb
,dev
);
552 lp
->stats
.rx_packets
++;
554 } while ((--boguscount
) && (pkt_hdr
& SEEQPKTH_CHAIN
));
556 /* If any worth-while packets have been received, netif_rx()
557 has done a mark_bh(NET_BH) for us and will work on them
558 when we get to the bottom-half routine. */
562 /* The inverse routine to net_open(). */
564 seeq8005_close(struct device
*dev
)
566 struct net_local
*lp
= (struct net_local
*)dev
->priv
;
567 int ioaddr
= dev
->base_addr
;
574 /* Flush the Tx and disable Rx here. */
575 outw( SEEQCMD_SET_ALL_OFF
, SEEQ_CMD
);
577 free_irq(dev
->irq
, NULL
);
579 irq2dev_map
[dev
->irq
] = 0;
581 /* Update the statistics here. */
587 /* Get the current statistics. This may be called with the card open or
589 static struct net_device_stats
*seeq8005_get_stats(struct device
*dev
)
591 struct net_local
*lp
= (struct net_local
*)dev
->priv
;
596 /* Set or clear the multicast filter for this adaptor.
597 num_addrs == -1 Promiscuous mode, receive all packets
598 num_addrs == 0 Normal mode, clear multicast list
599 num_addrs > 0 Multicast mode, receive normal and MC packets, and do
600 best-effort filtering.
603 set_multicast_list(struct device
*dev
)
606 * I _could_ do up to 6 addresses here, but won't (yet?)
610 int ioaddr
= dev
->base_addr
;
612 * hmm, not even sure if my matching works _anyway_ - seem to be receiving
616 if (num_addrs
) { /* Enable promiscuous mode */
617 outw( (inw(SEEQ_CFG1
) & ~SEEQCFG1_MATCH_MASK
)| SEEQCFG1_MATCH_ALL
, SEEQ_CFG1
);
618 dev
->flags
|=IFF_PROMISC
;
619 } else { /* Disable promiscuous mode, use normal mode */
620 outw( (inw(SEEQ_CFG1
) & ~SEEQCFG1_MATCH_MASK
)| SEEQCFG1_MATCH_BROAD
, SEEQ_CFG1
);
625 void seeq8005_init(struct device
*dev
, int startp
)
627 struct net_local
*lp
= (struct net_local
*)dev
->priv
;
628 int ioaddr
= dev
->base_addr
;
631 outw(SEEQCFG2_RESET
, SEEQ_CFG2
); /* reset device */
632 SLOW_DOWN_IO
; /* have to wait 4us after a reset - should be fixed */
637 outw( SEEQCMD_FIFO_WRITE
| SEEQCMD_SET_ALL_OFF
, SEEQ_CMD
);
638 outw( 0, SEEQ_DMAAR
); /* load start address into both low and high byte */
639 /* wait_for_buffer(dev); */ /* I think that you only need a wait for memory buffer */
640 outw( SEEQCFG1_BUFFER_MAC0
, SEEQ_CFG1
);
642 for(i
=0;i
<6;i
++) { /* set Station address */
643 outb(dev
->dev_addr
[i
], SEEQ_BUFFER
);
647 outw( SEEQCFG1_BUFFER_TEA
, SEEQ_CFG1
); /* set xmit end area pointer to 16K */
648 outb( DEFAULT_TEA
, SEEQ_BUFFER
); /* this gives us 16K of send buffer and 48K of recv buffer */
650 lp
->receive_ptr
= (DEFAULT_TEA
+1)<<8; /* so we can find our packet_header */
651 outw( lp
->receive_ptr
, SEEQ_RPR
); /* Receive Pointer Register is set to recv buffer memory */
653 outw( 0x00ff, SEEQ_REA
); /* Receive Area End */
656 printk("%s: SA0 = ",dev
->name
);
658 outw( SEEQCMD_FIFO_READ
| SEEQCMD_SET_ALL_OFF
, SEEQ_CMD
);
659 outw( 0, SEEQ_DMAAR
);
660 outw( SEEQCFG1_BUFFER_MAC0
, SEEQ_CFG1
);
663 printk("%02x ",inb(SEEQ_BUFFER
));
668 outw( SEEQCFG1_MAC0_EN
| SEEQCFG1_MATCH_BROAD
| SEEQCFG1_BUFFER_BUFFER
, SEEQ_CFG1
);
669 outw( SEEQCFG2_AUTO_REA
| SEEQCFG2_CTRLO
, SEEQ_CFG2
);
670 outw( SEEQCMD_SET_RX_ON
| SEEQCMD_TX_INT_EN
| SEEQCMD_RX_INT_EN
, SEEQ_CMD
);
674 old_cfg1
= inw(SEEQ_CFG1
);
675 printk("%s: stat = 0x%04x\n",dev
->name
,inw(SEEQ_STATUS
));
676 printk("%s: cfg1 = 0x%04x\n",dev
->name
,old_cfg1
);
677 printk("%s: cfg2 = 0x%04x\n",dev
->name
,inw(SEEQ_CFG2
));
678 printk("%s: raer = 0x%04x\n",dev
->name
,inw(SEEQ_REA
));
679 printk("%s: dmaar= 0x%04x\n",dev
->name
,inw(SEEQ_DMAAR
));
685 static void hardware_send_packet(struct device
* dev
, char *buf
, int length
)
687 int ioaddr
= dev
->base_addr
;
688 int status
= inw(SEEQ_STATUS
);
689 int transmit_ptr
= 0;
693 printk("%s: send 0x%04x\n",dev
->name
,length
);
696 /* Set FIFO to writemode and set packet-buffer address */
697 outw( SEEQCMD_FIFO_WRITE
| (status
& SEEQCMD_INT_MASK
), SEEQ_CMD
);
698 outw( transmit_ptr
, SEEQ_DMAAR
);
700 /* output SEEQ Packet header barfage */
701 outw( htons(length
+ 4), SEEQ_BUFFER
);
702 outw( SEEQPKTH_XMIT
| SEEQPKTH_DATA_FOLLOWS
| SEEQPKTH_XMIT_INT_EN
, SEEQ_BUFFER
);
704 /* blat the buffer */
705 outsw( SEEQ_BUFFER
, buf
, (length
+1) >> 1);
707 outw( 0, SEEQ_BUFFER
);
708 outw( 0, SEEQ_BUFFER
);
710 /* set address of start of transmit chain */
711 outw( transmit_ptr
, SEEQ_TPR
);
715 while ( (((status
=inw(SEEQ_STATUS
)) & SEEQSTAT_FIFO_EMPTY
) == 0) && (jiffies
< tmp
+ HZ
))
719 outw( SEEQCMD_WINDOW_INT_ACK
| SEEQCMD_SET_TX_ON
| (status
& SEEQCMD_INT_MASK
), SEEQ_CMD
);
727 * This routine waits for the SEEQ chip to assert that the FIFO is ready
728 * by checking for a window interrupt, and then clearing it
730 inline void wait_for_buffer(struct device
* dev
)
732 int ioaddr
= dev
->base_addr
;
737 while ( ( ((status
=inw(SEEQ_STATUS
)) & SEEQSTAT_WINDOW_INT
) != SEEQSTAT_WINDOW_INT
) && jiffies
< tmp
)
740 if ( (status
& SEEQSTAT_WINDOW_INT
) == SEEQSTAT_WINDOW_INT
)
741 outw( SEEQCMD_WINDOW_INT_ACK
| (status
& SEEQCMD_INT_MASK
), SEEQ_CMD
);
747 * compile-command: "gcc -D__KERNEL__ -I/usr/src/linux/net/inet -Wall -Wstrict-prototypes -O6 -m486 -c skeleton.c"
749 * kept-new-versions: 5