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