This source file includes following definitions.
- seeq8005_probe
- seeq8005_probe1
- seeq8005_open
- seeq8005_send_packet
- seeq8005_interrupt
- seeq8005_rx
- seeq8005_close
- seeq8005_get_stats
- set_multicast_list
- seeq8005_init
- hardware_send_packet
- wait_for_buffer
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 static char *version =
18 "seeq8005.c:v1.00 8/07/95 Hamish Coleman (hamish@zot.apana.org.au)\n";
19
20
21
22 #include <linux/config.h>
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 #include <linux/kernel.h>
38 #include <linux/sched.h>
39 #include <linux/types.h>
40 #include <linux/fcntl.h>
41 #include <linux/interrupt.h>
42 #include <linux/ptrace.h>
43 #include <linux/ioport.h>
44 #include <linux/in.h>
45 #include <linux/malloc.h>
46 #include <linux/string.h>
47 #include <asm/system.h>
48 #include <asm/bitops.h>
49 #include <asm/io.h>
50 #include <asm/dma.h>
51 #include <linux/errno.h>
52
53 #include <linux/netdevice.h>
54 #include <linux/etherdevice.h>
55 #include <linux/skbuff.h>
56 #include "seeq8005.h"
57 extern struct device *init_etherdev(struct device *dev, int sizeof_private,
58 unsigned long *mem_startp);
59
60
61
62 static unsigned int seeq8005_portlist[] =
63 { 0x300, 0x320, 0x340, 0x360, 0};
64
65
66 #ifndef NET_DEBUG
67 #define NET_DEBUG 1
68 #endif
69 static unsigned int net_debug = NET_DEBUG;
70
71
72 struct net_local {
73 struct enet_statistics stats;
74 unsigned short receive_ptr;
75 long open_time;
76 };
77
78
79 #define SA_ADDR0 0x00
80 #define SA_ADDR1 0x80
81 #define SA_ADDR2 0x4b
82
83
84
85 extern int seeq8005_probe(struct device *dev);
86
87 static int seeq8005_probe1(struct device *dev, int ioaddr);
88 static int seeq8005_open(struct device *dev);
89 static int seeq8005_send_packet(struct sk_buff *skb, struct device *dev);
90 static void seeq8005_interrupt(int irq, struct pt_regs *regs);
91 static void seeq8005_rx(struct device *dev);
92 static int seeq8005_close(struct device *dev);
93 static struct enet_statistics *seeq8005_get_stats(struct device *dev);
94 static void set_multicast_list(struct device *dev, int num_addrs, void *addrs);
95
96
97 #define tx_done(dev) (inw(SEEQ_STATUS) & SEEQSTAT_TX_ON)
98 extern void hardware_send_packet(struct device *dev, char *buf, int length);
99 extern void seeq8005_init(struct device *dev, int startp);
100 inline void wait_for_buffer(struct device *dev);
101
102
103
104
105
106
107
108
109 #ifdef HAVE_DEVLIST
110
111
112 struct netdev_entry seeq8005_drv =
113 {"seeq8005", seeq8005_probe1, SEEQ8005_IO_EXTENT, seeq8005_portlist};
114 #else
115 int
116 seeq8005_probe(struct device *dev)
117 {
118 int i;
119 int base_addr = dev ? dev->base_addr : 0;
120
121 if (base_addr > 0x1ff)
122 return seeq8005_probe1(dev, base_addr);
123 else if (base_addr != 0)
124 return ENXIO;
125
126 for (i = 0; seeq8005_portlist[i]; i++) {
127 int ioaddr = seeq8005_portlist[i];
128 if (check_region(ioaddr, SEEQ8005_IO_EXTENT))
129 continue;
130 if (seeq8005_probe1(dev, ioaddr) == 0)
131 return 0;
132 }
133
134 return ENODEV;
135 }
136 #endif
137
138
139
140
141
142 static int seeq8005_probe1(struct device *dev, int ioaddr)
143 {
144 static unsigned version_printed = 0;
145 int i,j;
146 unsigned char SA_prom[32];
147 int old_cfg1;
148 int old_cfg2;
149 int old_stat;
150 int old_dmaar;
151 int old_rear;
152
153 if (net_debug>1)
154 printk("seeq8005: probing at 0x%x\n",ioaddr);
155
156 old_stat = inw(SEEQ_STATUS);
157 if (old_stat == 0xffff)
158 return ENODEV;
159 if ( (old_stat & 0x1800) != 0x1800 ) {
160 if (net_debug>1) {
161 printk("seeq8005: reserved stat bits != 0x1800\n");
162 printk(" == 0x%04x\n",old_stat);
163 }
164 return ENODEV;
165 }
166
167 old_rear = inw(SEEQ_REA);
168 if (old_rear == 0xffff) {
169 outw(0,SEEQ_REA);
170 if (inw(SEEQ_REA) == 0xffff) {
171 return ENODEV;
172 }
173 } else if ((old_rear & 0xff00) != 0xff00) {
174 if (net_debug>1) {
175 printk("seeq8005: unused rear bits != 0xff00\n");
176 printk(" == 0x%04x\n",old_rear);
177 }
178 return ENODEV;
179 }
180
181 old_cfg2 = inw(SEEQ_CFG2);
182 old_cfg1 = inw(SEEQ_CFG1);
183 old_dmaar = inw(SEEQ_DMAAR);
184
185 if (net_debug>4) {
186 printk("seeq8005: stat = 0x%04x\n",old_stat);
187 printk("seeq8005: cfg1 = 0x%04x\n",old_cfg1);
188 printk("seeq8005: cfg2 = 0x%04x\n",old_cfg2);
189 printk("seeq8005: raer = 0x%04x\n",old_rear);
190 printk("seeq8005: dmaar= 0x%04x\n",old_dmaar);
191 }
192
193 outw( SEEQCMD_FIFO_WRITE | SEEQCMD_SET_ALL_OFF, SEEQ_CMD);
194 outw( 0, SEEQ_DMAAR);
195 outw( SEEQCFG1_BUFFER_PROM, SEEQ_CFG1);
196
197
198 j=0;
199 for(i=0; i <32; i++) {
200 j+= SA_prom[i] = inw(SEEQ_BUFFER) & 0xff;
201 }
202
203 #if 0
204
205 if ( (j&0xff) != 0 ) {
206 if (net_debug>1) {
207 printk("seeq8005: prom sum error\n");
208 }
209 outw( old_stat, SEEQ_STATUS);
210 outw( old_dmaar, SEEQ_DMAAR);
211 outw( old_cfg1, SEEQ_CFG1);
212 return ENODEV;
213 }
214 #endif
215
216 outw( SEEQCFG2_RESET, SEEQ_CFG2);
217 SLOW_DOWN_IO;
218 SLOW_DOWN_IO;
219 SLOW_DOWN_IO;
220 SLOW_DOWN_IO;
221 outw( SEEQCMD_SET_ALL_OFF, SEEQ_CMD);
222
223 if (net_debug) {
224 printk("seeq8005: prom sum = 0x%08x\n",j);
225 for(j=0; j<32; j+=16) {
226 printk("seeq8005: prom %02x: ",j);
227 for(i=0;i<16;i++) {
228 printk("%02x ",SA_prom[j|i]);
229 }
230 printk(" ");
231 for(i=0;i<16;i++) {
232 if ((SA_prom[j|i]>31)&&(SA_prom[j|i]<127)) {
233 printk("%c", SA_prom[j|i]);
234 } else {
235 printk(" ");
236 }
237 }
238 printk("\n");
239 }
240 }
241
242 #if 0
243
244
245
246
247
248 if (net_debug>1) {
249 printk("seeq8005: testing packet buffer ... ");
250 outw( SEEQCFG1_BUFFER_BUFFER, SEEQ_CFG1);
251 outw( SEEQCMD_FIFO_WRITE | SEEQCMD_SET_ALL_OFF, SEEQ_CMD);
252 outw( 0 , SEEQ_DMAAR);
253 for(i=0;i<32768;i++) {
254 outw(0x5a5a, SEEQ_BUFFER);
255 }
256 j=jiffies+HZ;
257 while ( ((inw(SEEQ_STATUS) & SEEQSTAT_FIFO_EMPTY) != SEEQSTAT_FIFO_EMPTY) && jiffies < j )
258 mb();
259 outw( 0 , SEEQ_DMAAR);
260 while ( ((inw(SEEQ_STATUS) & SEEQSTAT_WINDOW_INT) != SEEQSTAT_WINDOW_INT) && jiffies < j+HZ)
261 mb();
262 if ( (inw(SEEQ_STATUS) & SEEQSTAT_WINDOW_INT) == SEEQSTAT_WINDOW_INT)
263 outw( SEEQCMD_WINDOW_INT_ACK | (inw(SEEQ_STATUS)& SEEQCMD_INT_MASK), SEEQ_CMD);
264 outw( SEEQCMD_FIFO_READ | SEEQCMD_SET_ALL_OFF, SEEQ_CMD);
265 j=0;
266 for(i=0;i<32768;i++) {
267 if (inw(SEEQ_BUFFER) != 0x5a5a)
268 j++;
269 }
270 if (j) {
271 printk("%i\n",j);
272 } else {
273 printk("ok.\n");
274 }
275 }
276 #endif
277
278
279 if (dev == NULL)
280 dev = init_etherdev(0, sizeof(struct net_local), 0);
281
282 if (net_debug && version_printed++ == 0)
283 printk(version);
284
285 printk("%s: %s found at %#3x, ", dev->name, "seeq8005", ioaddr);
286
287
288 dev->base_addr = ioaddr;
289
290
291 for (i = 0; i < 6; i++)
292 printk(" %2.2x", dev->dev_addr[i] = SA_prom[i+6]);
293
294 if (dev->irq == 0xff)
295 ;
296 else if (dev->irq < 2) {
297 autoirq_setup(0);
298
299 outw( SEEQCMD_RX_INT_EN | SEEQCMD_SET_RX_ON | SEEQCMD_SET_RX_OFF, SEEQ_CMD );
300
301 dev->irq = autoirq_report(0);
302
303 if (net_debug >= 2)
304 printk(" autoirq is %d\n", dev->irq);
305 } else if (dev->irq == 2)
306
307
308
309 dev->irq = 9;
310
311 #if 0
312 {
313 int irqval = request_irq(dev->irq, &seeq8005_interrupt, 0, "seeq8005");
314 if (irqval) {
315 printk ("%s: unable to get IRQ %d (irqval=%d).\n", dev->name,
316 dev->irq, irqval);
317 return EAGAIN;
318 }
319 }
320 #endif
321
322
323 request_region(ioaddr, SEEQ8005_IO_EXTENT,"seeq8005");
324
325
326 if (dev->priv == NULL)
327 dev->priv = kmalloc(sizeof(struct net_local), GFP_KERNEL);
328 memset(dev->priv, 0, sizeof(struct net_local));
329
330 dev->open = seeq8005_open;
331 dev->stop = seeq8005_close;
332 dev->hard_start_xmit = seeq8005_send_packet;
333 dev->get_stats = seeq8005_get_stats;
334 dev->set_multicast_list = &set_multicast_list;
335
336
337 ether_setup(dev);
338
339 return 0;
340 }
341
342
343
344
345
346
347
348
349
350 static int
351 seeq8005_open(struct device *dev)
352 {
353 struct net_local *lp = (struct net_local *)dev->priv;
354
355 {
356 int irqval = request_irq(dev->irq, &seeq8005_interrupt, 0, "seeq8005");
357 if (irqval) {
358 printk ("%s: unable to get IRQ %d (irqval=%d).\n", dev->name,
359 dev->irq, irqval);
360 return EAGAIN;
361 }
362 }
363 irq2dev_map[dev->irq] = dev;
364
365
366 seeq8005_init(dev, 1);
367
368 lp->open_time = jiffies;
369
370 dev->tbusy = 0;
371 dev->interrupt = 0;
372 dev->start = 1;
373 return 0;
374 }
375
376 static int
377 seeq8005_send_packet(struct sk_buff *skb, struct device *dev)
378 {
379 int ioaddr = dev->base_addr;
380
381 if (dev->tbusy) {
382
383
384 int tickssofar = jiffies - dev->trans_start;
385 if (tickssofar < 5)
386 return 1;
387 printk("%s: transmit timed out, %s?\n", dev->name,
388 tx_done(dev) ? "IRQ conflict" : "network cable problem");
389
390 seeq8005_init(dev, 1);
391 dev->tbusy=0;
392 dev->trans_start = jiffies;
393 }
394
395
396
397
398 if (skb == NULL) {
399 dev_tint(dev);
400 return 0;
401 }
402
403
404
405 if (set_bit(0, (void*)&dev->tbusy) != 0)
406 printk("%s: Transmitter access conflict.\n", dev->name);
407 else {
408 short length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN;
409 unsigned char *buf = skb->data;
410
411 hardware_send_packet(dev, buf, length);
412 dev->trans_start = jiffies;
413 }
414 dev_kfree_skb (skb, FREE_WRITE);
415
416
417
418 return 0;
419 }
420
421
422
423 static void
424 seeq8005_interrupt(int irq, struct pt_regs * regs)
425 {
426 struct device *dev = (struct device *)(irq2dev_map[irq]);
427 struct net_local *lp;
428 int ioaddr, status, boguscount = 0;
429
430 if (dev == NULL) {
431 printk ("net_interrupt(): irq %d for unknown device.\n", irq);
432 return;
433 }
434
435 if (dev->interrupt)
436 printk ("%s: Re-entering the interrupt handler.\n", dev->name);
437 dev->interrupt = 1;
438
439 ioaddr = dev->base_addr;
440 lp = (struct net_local *)dev->priv;
441
442 status = inw(SEEQ_STATUS);
443 do {
444 if (net_debug >2) {
445 printk("%s: int, status=0x%04x\n",dev->name,status);
446 }
447
448 if (status & SEEQSTAT_WINDOW_INT) {
449 outw( SEEQCMD_WINDOW_INT_ACK | (status & SEEQCMD_INT_MASK), SEEQ_CMD);
450 if (net_debug) {
451 printk("%s: window int!\n",dev->name);
452 }
453 }
454 if (status & SEEQSTAT_TX_INT) {
455 outw( SEEQCMD_TX_INT_ACK | (status & SEEQCMD_INT_MASK), SEEQ_CMD);
456 lp->stats.tx_packets++;
457 dev->tbusy = 0;
458 mark_bh(NET_BH);
459 }
460 if (status & SEEQSTAT_RX_INT) {
461
462 seeq8005_rx(dev);
463 }
464 status = inw(SEEQ_STATUS);
465 } while ( (++boguscount < 10) && (status & SEEQSTAT_ANY_INT)) ;
466
467 if(net_debug>2) {
468 printk("%s: eoi\n",dev->name);
469 }
470 dev->interrupt = 0;
471 return;
472 }
473
474
475 static void
476 seeq8005_rx(struct device *dev)
477 {
478 struct net_local *lp = (struct net_local *)dev->priv;
479 int boguscount = 10;
480 int pkt_hdr;
481 int ioaddr = dev->base_addr;
482
483 do {
484 int next_packet;
485 int pkt_len;
486 int i;
487 int status;
488
489 status = inw(SEEQ_STATUS);
490 outw( lp->receive_ptr, SEEQ_DMAAR);
491 outw(SEEQCMD_FIFO_READ | SEEQCMD_RX_INT_ACK | (status & SEEQCMD_INT_MASK), SEEQ_CMD);
492 wait_for_buffer(dev);
493 next_packet = ntohs(inw(SEEQ_BUFFER));
494 pkt_hdr = inw(SEEQ_BUFFER);
495
496 if (net_debug>2) {
497 printk("%s: 0x%04x recv next=0x%04x, hdr=0x%04x\n",dev->name,lp->receive_ptr,next_packet,pkt_hdr);
498 }
499
500 if ((next_packet == 0) || ((pkt_hdr & SEEQPKTH_CHAIN)==0)) {
501 return;
502 }
503
504 if ((pkt_hdr & SEEQPKTS_DONE)==0)
505 break;
506
507 if (next_packet < lp->receive_ptr) {
508 pkt_len = (next_packet + 0x10000 - ((DEFAULT_TEA+1)<<8)) - lp->receive_ptr - 4;
509 } else {
510 pkt_len = next_packet - lp->receive_ptr - 4;
511 }
512
513 if (next_packet < ((DEFAULT_TEA+1)<<8)) {
514 printk("%s: recv packet ring corrupt, resetting board\n",dev->name);
515 seeq8005_init(dev,1);
516 return;
517 }
518
519 lp->receive_ptr = next_packet;
520
521 if (net_debug>2) {
522 printk("%s: recv len=0x%04x\n",dev->name,pkt_len);
523 }
524
525 if (pkt_hdr & SEEQPKTS_ANY_ERROR) {
526 lp->stats.rx_errors++;
527 if (pkt_hdr & SEEQPKTS_SHORT) lp->stats.rx_frame_errors++;
528 if (pkt_hdr & SEEQPKTS_DRIB) lp->stats.rx_frame_errors++;
529 if (pkt_hdr & SEEQPKTS_OVERSIZE) lp->stats.rx_over_errors++;
530 if (pkt_hdr & SEEQPKTS_CRC_ERR) lp->stats.rx_crc_errors++;
531
532 outw( SEEQCMD_FIFO_WRITE | SEEQCMD_DMA_INT_ACK | (status & SEEQCMD_INT_MASK), SEEQ_CMD);
533 outw( (lp->receive_ptr & 0xff00)>>8, SEEQ_REA);
534 } else {
535
536 struct sk_buff *skb;
537 unsigned char *buf;
538
539 skb = dev_alloc_skb(pkt_len);
540 if (skb == NULL) {
541 printk("%s: Memory squeeze, dropping packet.\n", dev->name);
542 lp->stats.rx_dropped++;
543 break;
544 }
545 skb->dev = dev;
546 skb_reserve(skb, 2);
547 buf = skb_put(skb,pkt_len);
548
549 insw(SEEQ_BUFFER, buf, (pkt_len + 1) >> 1);
550
551 if (net_debug>2) {
552 char * p = buf;
553 printk("%s: recv ",dev->name);
554 for(i=0;i<14;i++) {
555 printk("%02x ",*(p++)&0xff);
556 }
557 printk("\n");
558 }
559
560 skb->protocol=eth_type_trans(skb,dev);
561 netif_rx(skb);
562 lp->stats.rx_packets++;
563 }
564 } while ((--boguscount) && (pkt_hdr & SEEQPKTH_CHAIN));
565
566
567
568
569 return;
570 }
571
572
573 static int
574 seeq8005_close(struct device *dev)
575 {
576 struct net_local *lp = (struct net_local *)dev->priv;
577 int ioaddr = dev->base_addr;
578
579 lp->open_time = 0;
580
581 dev->tbusy = 1;
582 dev->start = 0;
583
584
585 outw( SEEQCMD_SET_ALL_OFF, SEEQ_CMD);
586
587 free_irq(dev->irq);
588
589 irq2dev_map[dev->irq] = 0;
590
591
592
593 return 0;
594
595 }
596
597
598
599 static struct enet_statistics *
600 seeq8005_get_stats(struct device *dev)
601 {
602 struct net_local *lp = (struct net_local *)dev->priv;
603
604 return &lp->stats;
605 }
606
607
608
609
610
611
612
613 static void
614 set_multicast_list(struct device *dev, int num_addrs, void *addrs)
615 {
616
617
618
619
620 #if 0
621 int ioaddr = dev->base_addr;
622
623
624
625
626
627 if (num_addrs) {
628 outw( (inw(SEEQ_CFG1) & ~SEEQCFG1_MATCH_MASK)| SEEQCFG1_MATCH_ALL, SEEQ_CFG1);
629 } else {
630 outw( (inw(SEEQ_CFG1) & ~SEEQCFG1_MATCH_MASK)| SEEQCFG1_MATCH_BROAD, SEEQ_CFG1);
631 }
632 #endif
633 }
634
635 void seeq8005_init(struct device *dev, int startp)
636 {
637 struct net_local *lp = (struct net_local *)dev->priv;
638 int ioaddr = dev->base_addr;
639 int i;
640
641 outw(SEEQCFG2_RESET, SEEQ_CFG2);
642 SLOW_DOWN_IO;
643 SLOW_DOWN_IO;
644 SLOW_DOWN_IO;
645 SLOW_DOWN_IO;
646
647 outw( SEEQCMD_FIFO_WRITE | SEEQCMD_SET_ALL_OFF, SEEQ_CMD);
648 outw( 0, SEEQ_DMAAR);
649
650 outw( SEEQCFG1_BUFFER_MAC0, SEEQ_CFG1);
651
652 for(i=0;i<6;i++) {
653 outb(dev->dev_addr[i], SEEQ_BUFFER);
654 SLOW_DOWN_IO;
655 }
656
657 outw( SEEQCFG1_BUFFER_TEA, SEEQ_CFG1);
658 outb( DEFAULT_TEA, SEEQ_BUFFER);
659
660 lp->receive_ptr = (DEFAULT_TEA+1)<<8;
661 outw( lp->receive_ptr, SEEQ_RPR);
662
663 outw( 0x00ff, SEEQ_REA);
664
665 if (net_debug>4) {
666 printk("%s: SA0 = ",dev->name);
667
668 outw( SEEQCMD_FIFO_READ | SEEQCMD_SET_ALL_OFF, SEEQ_CMD);
669 outw( 0, SEEQ_DMAAR);
670 outw( SEEQCFG1_BUFFER_MAC0, SEEQ_CFG1);
671
672 for(i=0;i<6;i++) {
673 printk("%02x ",inb(SEEQ_BUFFER));
674 }
675 printk("\n");
676 }
677
678 outw( SEEQCFG1_MAC0_EN | SEEQCFG1_MATCH_BROAD | SEEQCFG1_BUFFER_BUFFER, SEEQ_CFG1);
679 outw( SEEQCFG2_AUTO_REA | SEEQCFG2_CTRLO, SEEQ_CFG2);
680 outw( SEEQCMD_SET_RX_ON | SEEQCMD_TX_INT_EN | SEEQCMD_RX_INT_EN, SEEQ_CMD);
681
682 if (net_debug>4) {
683 int old_cfg1;
684 old_cfg1 = inw(SEEQ_CFG1);
685 printk("%s: stat = 0x%04x\n",dev->name,inw(SEEQ_STATUS));
686 printk("%s: cfg1 = 0x%04x\n",dev->name,old_cfg1);
687 printk("%s: cfg2 = 0x%04x\n",dev->name,inw(SEEQ_CFG2));
688 printk("%s: raer = 0x%04x\n",dev->name,inw(SEEQ_REA));
689 printk("%s: dmaar= 0x%04x\n",dev->name,inw(SEEQ_DMAAR));
690
691 }
692 }
693
694
695 void hardware_send_packet(struct device * dev, char *buf, int length)
696 {
697 int ioaddr = dev->base_addr;
698 int status = inw(SEEQ_STATUS);
699 int transmit_ptr = 0;
700 int tmp;
701
702 if (net_debug>4) {
703 printk("%s: send 0x%04x\n",dev->name,length);
704 }
705
706
707 outw( SEEQCMD_FIFO_WRITE | (status & SEEQCMD_INT_MASK), SEEQ_CMD);
708 outw( transmit_ptr, SEEQ_DMAAR);
709
710
711 outw( htons(length + 4), SEEQ_BUFFER);
712 outw( SEEQPKTH_XMIT | SEEQPKTH_DATA_FOLLOWS | SEEQPKTH_XMIT_INT_EN, SEEQ_BUFFER );
713
714
715 outsw( SEEQ_BUFFER, buf, (length +1) >> 1);
716
717 outw( 0, SEEQ_BUFFER);
718 outw( 0, SEEQ_BUFFER);
719
720
721 outw( transmit_ptr, SEEQ_TPR);
722
723
724 tmp = jiffies;
725 while ( (((status=inw(SEEQ_STATUS)) & SEEQSTAT_FIFO_EMPTY) == 0) && (jiffies < tmp + HZ))
726 mb();
727
728
729 outw( SEEQCMD_WINDOW_INT_ACK | SEEQCMD_SET_TX_ON | (status & SEEQCMD_INT_MASK), SEEQ_CMD);
730
731 }
732
733
734
735
736
737
738
739
740 inline void wait_for_buffer(struct device * dev)
741 {
742 int ioaddr = dev->base_addr;
743 int tmp;
744 int status;
745
746 tmp = jiffies + HZ;
747 while ( ( ((status=inw(SEEQ_STATUS)) & SEEQSTAT_WINDOW_INT) != SEEQSTAT_WINDOW_INT) && jiffies < tmp)
748 mb();
749
750 if ( (status & SEEQSTAT_WINDOW_INT) == SEEQSTAT_WINDOW_INT)
751 outw( SEEQCMD_WINDOW_INT_ACK | (status & SEEQCMD_INT_MASK), SEEQ_CMD);
752 }
753
754
755
756
757
758
759
760
761
762