2 * lanstreamer.c -- driver for the IBM Auto LANStreamer PCI Adapter
4 * Written By: Mike Sullivan, IBM Corporation
6 * Copyright (C) 1999 IBM Corporation
8 * Linux driver for IBM PCI tokenring cards based on the LanStreamer MPC
11 * This driver is based on the olympic driver for IBM PCI TokenRing cards (Pit/Pit-Phy/Olympic
12 * chipsets) written by:
13 * 1999 Peter De Schrijver All Rights Reserved
14 * 1999 Mike Phillips (phillim@amtrak.com)
16 * Base Driver Skeleton:
17 * Written 1993-94 by Donald Becker.
19 * Copyright 1993 United States Government as represented by the
20 * Director, National Security Agency.
22 * This program is free software; you can redistribute it and/or modify
23 * it under the terms of the GNU General Public License as published by
24 * the Free Software Foundation; either version 2 of the License, or
25 * (at your option) any later version.
27 * This program is distributed in the hope that it will be useful,
28 * but WITHOUT ANY WARRANTY; without even the implied warranty of
29 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
30 * GNU General Public License for more details.
33 * THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR
34 * CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT
35 * LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
36 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is
37 * solely responsible for determining the appropriateness of using and
38 * distributing the Program and assumes all risks associated with its
39 * exercise of rights under this Agreement, including but not limited to
40 * the risks and costs of program errors, damage to or loss of data,
41 * programs or equipment, and unavailability or interruption of operations.
43 * DISCLAIMER OF LIABILITY
44 * NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY
45 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND
47 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
48 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
49 * USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
50 * HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES
52 * You should have received a copy of the GNU General Public License
53 * along with this program; if not, write to the Free Software
54 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
57 * 12/10/99 - Alpha Release 0.1.0
58 * First release to the public
59 * 03/03/00 - Merged to kernel, indented -kr -i8 -bri0, fixed some missing
60 * malloc free checks, reviewed code. <alan@redhat.com>
61 * 03/13/00 - Added spinlocks for smp
65 * 1) Test Network Monitor Mode
66 * 2) Add auto reset logic on adapter errors
67 * 3) Test with varying options
69 * If Problems do Occur
70 * Most problems can be rectified by either closing and opening the interface
71 * (ifconfig down and up) or rmmod and insmod'ing the driver (a bit difficult
72 * if compiled into the kernel).
75 /* Change STREAMER_DEBUG to 1 to get verbose, and I mean really verbose, messages */
77 #define STREAMER_DEBUG 0
78 #define STREAMER_DEBUG_PACKETS 0
80 /* Change STREAMER_NETWORK_MONITOR to receive mac frames through the arb channel.
81 * Will also create a /proc/net/streamer_tr entry if proc_fs is compiled into the
83 * Intended to be used to create a ring-error reporting network module
84 * i.e. it will give you the source address of beaconers on the ring
87 #define STREAMER_NETWORK_MONITOR 0
89 #include <linux/config.h>
90 #include <linux/module.h>
92 #include <linux/kernel.h>
93 #include <linux/sched.h>
94 #include <linux/errno.h>
95 #include <linux/timer.h>
97 #include <linux/ioport.h>
98 #include <linux/string.h>
99 #include <linux/proc_fs.h>
100 #include <linux/ptrace.h>
101 #include <linux/skbuff.h>
102 #include <linux/interrupt.h>
103 #include <linux/delay.h>
104 #include <linux/netdevice.h>
105 #include <linux/trdevice.h>
106 #include <linux/stddef.h>
107 #include <linux/init.h>
108 #include <linux/pci.h>
109 #include <linux/spinlock.h>
110 #include <net/checksum.h>
113 #include <asm/system.h>
114 #include <asm/bitops.h>
116 #include "lanstreamer.h"
118 /* I've got to put some intelligence into the version number so that Peter and I know
119 * which version of the code somebody has got.
120 * Version Number = a.b.c.d where a.b.c is the level of code and d is the latest author.
121 * So 0.0.1.pds = Peter, 0.0.1.mlp = Mike
123 * Official releases will only have an a.b.c version number format.
126 static char *version
= "LanStreamer.c v0.3.1 03/13/99 - Mike Sullivan";
128 static char *open_maj_error
[] = {
129 "No error", "Lobe Media Test", "Physical Insertion",
130 "Address Verification", "Neighbor Notification (Ring Poll)",
131 "Request Parameters", "FDX Registration Request",
132 "FDX Lobe Media Test", "FDX Duplicate Address Check",
136 static char *open_min_error
[] = {
137 "No error", "Function Failure", "Signal Lost", "Wire Fault",
138 "Ring Speed Mismatch", "Timeout", "Ring Failure", "Ring Beaconing",
139 "Duplicate Node Address", "Request Parameters", "Remove Received",
140 "Reserved", "Reserved", "No Monitor Detected for RPL",
141 "Monitor Contention failer for RPL", "FDX Protocol Error"
144 /* Module paramters */
148 * 4,16 = Selected speed only, no autosense
149 * This allows the card to be the first on the ring
150 * and become the active monitor.
152 * WARNING: Some hubs will allow you to insert
156 static int ringspeed
[STREAMER_MAX_ADAPTERS
] = { 0, };
158 MODULE_PARM(ringspeed
, "1-" __MODULE_STRING(STREAMER_MAX_ADAPTERS
) "i");
160 /* Packet buffer size */
162 static int pkt_buf_sz
[STREAMER_MAX_ADAPTERS
] = { 0, };
164 MODULE_PARM(pkt_buf_sz
, "1-" __MODULE_STRING(STREAMER_MAX_ADAPTERS
) "i");
168 static int message_level
[STREAMER_MAX_ADAPTERS
] = { 1, };
170 MODULE_PARM(message_level
,
171 "1-" __MODULE_STRING(STREAMER_MAX_ADAPTERS
) "i");
173 static int streamer_scan(struct net_device
*dev
);
174 static int streamer_init(struct net_device
*dev
);
175 static int streamer_open(struct net_device
*dev
);
176 static int streamer_xmit(struct sk_buff
*skb
, struct net_device
*dev
);
177 static int streamer_close(struct net_device
*dev
);
178 static void streamer_set_rx_mode(struct net_device
*dev
);
179 static void streamer_interrupt(int irq
, void *dev_id
,
180 struct pt_regs
*regs
);
181 static struct net_device_stats
*streamer_get_stats(struct net_device
*dev
);
182 static int streamer_set_mac_address(struct net_device
*dev
, void *addr
);
183 static void streamer_arb_cmd(struct net_device
*dev
);
184 static int streamer_change_mtu(struct net_device
*dev
, int mtu
);
185 static void streamer_srb_bh(struct net_device
*dev
);
186 static void streamer_asb_bh(struct net_device
*dev
);
187 #if STREAMER_NETWORK_MONITOR
188 #ifdef CONFIG_PROC_FS
189 static int sprintf_info(char *buffer
, struct net_device
*dev
);
193 int __init
streamer_probe(struct net_device
*dev
)
197 cards_found
= streamer_scan(dev
);
198 return cards_found
? 0 : -ENODEV
;
201 static int __init
streamer_scan(struct net_device
*dev
)
203 struct pci_dev
*pci_device
= NULL
;
204 struct streamer_private
*streamer_priv
;
208 while ((pci_device
= pci_find_device(PCI_VENDOR_ID_IBM
, PCI_DEVICE_ID_IBM_TR
, pci_device
)))
210 if (pci_enable_device(pci_device
))
212 pci_set_master(pci_device
);
214 /* Check to see if io has been allocated, if so, we've already done this card,
215 so continue on the card discovery loop */
217 if (check_region(pci_resource_start(pci_device
,0), STREAMER_IO_SPACE
))
223 streamer_priv
= kmalloc(sizeof(struct streamer_private
), GFP_KERNEL
);
224 if(streamer_priv
==NULL
)
226 printk(KERN_ERR
"lanstreamer: out of memory.\n");
229 memset(streamer_priv
, 0, sizeof(struct streamer_private
));
230 init_waitqueue_head(&streamer_priv
->srb_wait
);
231 init_waitqueue_head(&streamer_priv
->trb_wait
);
233 dev
= init_trdev(dev
, 0);
236 kfree(streamer_priv
);
237 printk(KERN_ERR
"lanstreamer: out of memory.\n");
241 dev
->priv
= (void *) streamer_priv
;
243 printk("pci_device: %p, dev:%p, dev->priv: %p\n",
244 pci_device
, dev
, dev
->priv
);
246 dev
->irq
= pci_device
->irq
;
247 dev
->base_addr
= pci_resource_start(pci_device
, 0);
248 dev
->init
= &streamer_init
;
249 streamer_priv
->streamer_card_name
= (char *)pci_device
->resource
[0].name
;
250 streamer_priv
->streamer_mmio
=
251 ioremap(pci_resource_start(pci_device
, 1), 256);
253 if ((pkt_buf_sz
[card_no
] < 100) || (pkt_buf_sz
[card_no
] > 18000))
254 streamer_priv
->pkt_buf_sz
= PKT_BUF_SZ
;
256 streamer_priv
->pkt_buf_sz
= pkt_buf_sz
[card_no
];
258 streamer_priv
->streamer_ring_speed
= ringspeed
[card_no
];
259 streamer_priv
->streamer_message_level
= message_level
[card_no
];
261 if (streamer_init(dev
) == -1) {
262 unregister_netdevice(dev
);
267 dev
->open
= &streamer_open
;
268 dev
->hard_start_xmit
= &streamer_xmit
;
269 dev
->change_mtu
= &streamer_change_mtu
;
271 dev
->stop
= &streamer_close
;
272 dev
->do_ioctl
= NULL
;
273 dev
->set_multicast_list
= &streamer_set_rx_mode
;
274 dev
->get_stats
= &streamer_get_stats
;
275 dev
->set_mac_address
= &streamer_set_mac_address
;
283 static int streamer_reset(struct net_device
*dev
)
285 struct streamer_private
*streamer_priv
;
288 unsigned int uaa_addr
;
289 struct sk_buff
*skb
= 0;
292 streamer_priv
= (struct streamer_private
*) dev
->priv
;
293 streamer_mmio
= streamer_priv
->streamer_mmio
;
295 writew(readw(streamer_mmio
+ BCTL
) | BCTL_SOFTRESET
, streamer_mmio
+ BCTL
);
297 /* Hold soft reset bit for a while */
298 current
->state
= TASK_UNINTERRUPTIBLE
;
299 schedule_timeout(HZ
);
301 writew(readw(streamer_mmio
+ BCTL
) & ~BCTL_SOFTRESET
,
302 streamer_mmio
+ BCTL
);
305 printk("BCTL: %x\n", readw(streamer_mmio
+ BCTL
));
306 printk("GPR: %x\n", readw(streamer_mmio
+ GPR
));
307 printk("SISRMASK: %x\n", readw(streamer_mmio
+ SISR_MASK
));
310 if (streamer_priv
->streamer_ring_speed
== 0) { /* Autosense */
311 writew(readw(streamer_mmio
+ GPR
) | GPR_AUTOSENSE
,
312 streamer_mmio
+ GPR
);
313 if (streamer_priv
->streamer_message_level
)
314 printk(KERN_INFO
"%s: Ringspeed autosense mode on\n",
316 } else if (streamer_priv
->streamer_ring_speed
== 16) {
317 if (streamer_priv
->streamer_message_level
)
318 printk(KERN_INFO
"%s: Trying to open at 16 Mbps as requested\n",
320 writew(GPR_16MBPS
, streamer_mmio
+ GPR
);
321 } else if (streamer_priv
->streamer_ring_speed
== 4) {
322 if (streamer_priv
->streamer_message_level
)
323 printk(KERN_INFO
"%s: Trying to open at 4 Mbps as requested\n",
325 writew(0, streamer_mmio
+ GPR
);
328 skb
= dev_alloc_skb(streamer_priv
->pkt_buf_sz
);
330 printk(KERN_INFO
"%s: skb allocation for diagnostics failed...proceeding\n",
333 struct streamer_rx_desc
*rx_ring
;
336 rx_ring
=(struct streamer_rx_desc
*)skb
->data
;
337 data
=((u8
*)skb
->data
)+sizeof(struct streamer_rx_desc
);
340 rx_ring
->buffer
=virt_to_bus(data
);
341 rx_ring
->framelen_buflen
=512;
342 writel(virt_to_bus(rx_ring
),streamer_mmio
+RXBDA
);
346 printk("GPR = %x\n", readw(streamer_mmio
+ GPR
));
348 /* start solo init */
349 writew(SISR_MI
, streamer_mmio
+ SISR_MASK_SUM
);
351 while (!((readw(streamer_mmio
+ SISR
)) & SISR_SRB_REPLY
)) {
352 current
->state
= TASK_INTERRUPTIBLE
;
353 schedule_timeout(HZ
/10);
354 if (jiffies
- t
> 40 * HZ
) {
356 "IBM PCI tokenring card not responding\n");
357 release_region(dev
->base_addr
, STREAMER_IO_SPACE
);
361 writew(~SISR_SRB_REPLY
, streamer_mmio
+ SISR_RUM
);
362 misr
= readw(streamer_mmio
+ MISR_RUM
);
363 writew(~misr
, streamer_mmio
+ MISR_RUM
);
366 dev_kfree_skb(skb
); /* release skb used for diagnostics */
369 printk("LAPWWO: %x, LAPA: %x LAPE: %x\n",
370 readw(streamer_mmio
+ LAPWWO
), readw(streamer_mmio
+ LAPA
),
371 readw(streamer_mmio
+ LAPE
));
377 writew(readw(streamer_mmio
+ LAPWWO
),
378 streamer_mmio
+ LAPA
);
379 printk("initialization response srb dump: ");
380 for (i
= 0; i
< 10; i
++)
382 ntohs(readw(streamer_mmio
+ LAPDINC
)));
387 writew(readw(streamer_mmio
+ LAPWWO
) + 6, streamer_mmio
+ LAPA
);
388 if (readw(streamer_mmio
+ LAPD
)) {
389 printk(KERN_INFO
"tokenring card intialization failed. errorcode : %x\n",
390 ntohs(readw(streamer_mmio
+ LAPD
)));
391 release_region(dev
->base_addr
, STREAMER_IO_SPACE
);
395 writew(readw(streamer_mmio
+ LAPWWO
) + 8, streamer_mmio
+ LAPA
);
396 uaa_addr
= ntohs(readw(streamer_mmio
+ LAPDINC
));
397 readw(streamer_mmio
+ LAPDINC
); /* skip over Level.Addr field */
398 streamer_priv
->streamer_addr_table_addr
= ntohs(readw(streamer_mmio
+ LAPDINC
));
399 streamer_priv
->streamer_parms_addr
= ntohs(readw(streamer_mmio
+ LAPDINC
));
402 printk("UAA resides at %x\n", uaa_addr
);
405 /* setup uaa area for access with LAPD */
409 writew(uaa_addr
, streamer_mmio
+ LAPA
);
410 for (i
= 0; i
< 6; i
+= 2) {
411 addr
=ntohs(readw(streamer_mmio
+LAPDINC
));
412 dev
->dev_addr
[i
]= (addr
>> 8) & 0xff;
413 dev
->dev_addr
[i
+1]= addr
& 0xff;
416 printk("Adapter address: ");
417 for (i
= 0; i
< 6; i
++) {
418 printk("%02x:", dev
->dev_addr
[i
]);
426 static int __init
streamer_init(struct net_device
*dev
)
428 struct streamer_private
*streamer_priv
;
432 streamer_priv
=(struct streamer_private
*)dev
->priv
;
433 streamer_mmio
=streamer_priv
->streamer_mmio
;
435 spin_lock_init(&streamer_priv
->streamer_lock
);
437 printk("%s \n", version
);
438 printk("%s: %s. I/O at %hx, MMIO at %p, using irq %d\n",dev
->name
,
439 streamer_priv
->streamer_card_name
,
440 (unsigned int) dev
->base_addr
,
441 streamer_priv
->streamer_mmio
,
444 request_region(dev
->base_addr
, STREAMER_IO_SPACE
, "streamer");
446 rc
=streamer_reset(dev
);
452 static int streamer_open(struct net_device
*dev
)
454 struct streamer_private
*streamer_priv
= (struct streamer_private
*) dev
->priv
;
455 __u8
*streamer_mmio
= streamer_priv
->streamer_mmio
;
457 char open_error
[255];
458 int i
, open_finished
= 1;
463 if (readw(streamer_mmio
+BMCTL_SUM
) & BMCTL_RX_ENABLED
) {
464 rc
=streamer_reset(dev
);
467 if (request_irq(dev
->irq
, &streamer_interrupt
, SA_SHIRQ
, "streamer", dev
)) {
471 printk("BMCTL: %x\n", readw(streamer_mmio
+ BMCTL_SUM
));
472 printk("pending ints: %x\n", readw(streamer_mmio
+ SISR
));
475 writew(SISR_MI
| SISR_SRB_REPLY
, streamer_mmio
+ SISR_MASK
); /* more ints later, doesn't stop arb cmd interrupt */
476 writew(LISR_LIE
, streamer_mmio
+ LISR
); /* more ints later */
478 /* adapter is closed, so SRB is pointed to by LAPWWO */
479 writew(readw(streamer_mmio
+ LAPWWO
), streamer_mmio
+ LAPA
);
482 printk("LAPWWO: %x, LAPA: %x\n", readw(streamer_mmio
+ LAPWWO
),
483 readw(streamer_mmio
+ LAPA
));
484 printk("LAPE: %x\n", readw(streamer_mmio
+ LAPE
));
485 printk("SISR Mask = %04x\n", readw(streamer_mmio
+ SISR_MASK
));
492 for (i
= 0; i
< SRB_COMMAND_SIZE
; i
+= 2) {
493 writew(0, streamer_mmio
+ LAPDINC
);
496 writew(readw(streamer_mmio
+LAPWWO
),streamer_mmio
+LAPA
);
497 writew(htons(SRB_OPEN_ADAPTER
<<8),streamer_mmio
+LAPDINC
) ; /* open */
498 writew(htons(STREAMER_CLEAR_RET_CODE
<<8),streamer_mmio
+LAPDINC
);
499 writew(STREAMER_CLEAR_RET_CODE
, streamer_mmio
+ LAPDINC
);
501 writew(readw(streamer_mmio
+ LAPWWO
) + 8, streamer_mmio
+ LAPA
);
502 #if STREAMER_NETWORK_MONITOR
503 /* If Network Monitor, instruct card to copy MAC frames through the ARB */
504 writew(htons(OPEN_ADAPTER_ENABLE_FDX
| OPEN_ADAPTER_PASS_ADC_MAC
| OPEN_ADAPTER_PASS_ATT_MAC
| OPEN_ADAPTER_PASS_BEACON
), streamer_mmio
+ LAPDINC
); /* offset 8 word contains open options */
506 writew(htons(OPEN_ADAPTER_ENABLE_FDX
), streamer_mmio
+ LAPDINC
); /* Offset 8 word contains Open.Options */
509 if (streamer_priv
->streamer_laa
[0]) {
510 writew(readw(streamer_mmio
+ LAPWWO
) + 12, streamer_mmio
+ LAPA
);
511 writew(htons((streamer_priv
->streamer_laa
[0] << 8) |
512 streamer_priv
->streamer_laa
[1]),streamer_mmio
+LAPDINC
);
513 writew(htons((streamer_priv
->streamer_laa
[2] << 8) |
514 streamer_priv
->streamer_laa
[3]),streamer_mmio
+LAPDINC
);
515 writew(htons((streamer_priv
->streamer_laa
[4] << 8) |
516 streamer_priv
->streamer_laa
[5]),streamer_mmio
+LAPDINC
);
517 memcpy(dev
->dev_addr
, streamer_priv
->streamer_laa
, dev
->addr_len
);
520 /* save off srb open offset */
521 srb_open
= readw(streamer_mmio
+ LAPWWO
);
523 writew(readw(streamer_mmio
+ LAPWWO
),
524 streamer_mmio
+ LAPA
);
525 printk("srb open request: \n");
526 for (i
= 0; i
< 16; i
++) {
527 printk("%x:", ntohs(readw(streamer_mmio
+ LAPDINC
)));
532 streamer_priv
->srb_queued
= 1;
534 /* signal solo that SRB command has been issued */
535 writew(LISR_SRB_CMD
, streamer_mmio
+ LISR_SUM
);
537 while (streamer_priv
->srb_queued
) {
538 interruptible_sleep_on_timeout(&streamer_priv
->srb_wait
, 5 * HZ
);
539 if (signal_pending(current
)) {
540 printk(KERN_WARNING
"%s: SRB timed out.\n", dev
->name
);
541 printk(KERN_WARNING
"SISR=%x MISR=%x, LISR=%x\n",
542 readw(streamer_mmio
+ SISR
),
543 readw(streamer_mmio
+ MISR_RUM
),
544 readw(streamer_mmio
+ LISR
));
545 streamer_priv
->srb_queued
= 0;
549 restore_flags(flags
);
552 printk("SISR_MASK: %x\n", readw(streamer_mmio
+ SISR_MASK
));
553 printk("srb open response:\n");
554 writew(srb_open
, streamer_mmio
+ LAPA
);
555 for (i
= 0; i
< 10; i
++) {
557 ntohs(readw(streamer_mmio
+ LAPDINC
)));
561 /* If we get the same return response as we set, the interrupt wasn't raised and the open
564 writew(srb_open
+ 2, streamer_mmio
+ LAPA
);
565 srb_word
= ntohs(readw(streamer_mmio
+ LAPD
)) & 0xFF;
566 if (srb_word
== STREAMER_CLEAR_RET_CODE
) {
567 printk(KERN_WARNING
"%s: Adapter Open time out or error.\n",
573 if (srb_word
== 0x07) {
574 if (!streamer_priv
->streamer_ring_speed
&& open_finished
) { /* Autosense , first time around */
575 printk(KERN_WARNING
"%s: Retrying at different ring speed \n",
581 writew(srb_open
+ 6, streamer_mmio
+ LAPA
);
582 error_code
= ntohs(readw(streamer_mmio
+ LAPD
));
583 strcpy(open_error
, open_maj_error
[(error_code
& 0xf0) >> 4]);
584 strcat(open_error
, " - ");
585 strcat(open_error
, open_min_error
[(error_code
& 0x0f)]);
587 if (!streamer_priv
->streamer_ring_speed
588 && ((error_code
& 0x0f) == 0x0d))
590 printk(KERN_WARNING
"%s: Tried to autosense ring speed with no monitors present\n", dev
->name
);
591 printk(KERN_WARNING
"%s: Please try again with a specified ring speed \n", dev
->name
);
592 free_irq(dev
->irq
, dev
);
596 printk(KERN_WARNING
"%s: %s\n",
597 dev
->name
, open_error
);
598 free_irq(dev
->irq
, dev
);
601 } /* if autosense && open_finished */
603 printk(KERN_WARNING
"%s: Bad OPEN response: %x\n",
604 dev
->name
, srb_word
);
605 free_irq(dev
->irq
, dev
);
610 } while (!(open_finished
)); /* Will only loop if ring speed mismatch re-open attempted && autosense is on */
612 writew(srb_open
+ 18, streamer_mmio
+ LAPA
);
613 srb_word
=ntohs(readw(streamer_mmio
+LAPD
)) >> 8;
614 if (srb_word
& (1 << 3))
615 if (streamer_priv
->streamer_message_level
)
616 printk(KERN_INFO
"%s: Opened in FDX Mode\n", dev
->name
);
619 streamer_priv
->streamer_ring_speed
= 16;
621 streamer_priv
->streamer_ring_speed
= 4;
623 if (streamer_priv
->streamer_message_level
)
624 printk(KERN_INFO
"%s: Opened in %d Mbps mode\n",
626 streamer_priv
->streamer_ring_speed
);
628 writew(srb_open
+ 8, streamer_mmio
+ LAPA
);
629 streamer_priv
->asb
= ntohs(readw(streamer_mmio
+ LAPDINC
));
630 streamer_priv
->srb
= ntohs(readw(streamer_mmio
+ LAPDINC
));
631 streamer_priv
->arb
= ntohs(readw(streamer_mmio
+ LAPDINC
));
632 readw(streamer_mmio
+ LAPDINC
); /* offset 14 word is rsvd */
633 streamer_priv
->trb
= ntohs(readw(streamer_mmio
+ LAPDINC
));
635 streamer_priv
->streamer_receive_options
= 0x00;
636 streamer_priv
->streamer_copy_all_options
= 0;
639 /* enable rx channel */
640 writew(~BMCTL_RX_DIS
, streamer_mmio
+ BMCTL_RUM
);
642 /* setup rx descriptors */
643 streamer_priv
->streamer_rx_ring
=
644 kmalloc( sizeof(struct streamer_rx_desc
)*
645 STREAMER_RX_RING_SIZE
,GFP_KERNEL
);
646 if (!streamer_priv
->streamer_rx_ring
) {
647 printk(KERN_WARNING
"%s ALLOC of streamer rx ring FAILED!!\n",dev
->name
);
651 for (i
= 0; i
< STREAMER_RX_RING_SIZE
; i
++) {
654 skb
= dev_alloc_skb(streamer_priv
->pkt_buf_sz
);
660 streamer_priv
->streamer_rx_ring
[i
].forward
= virt_to_bus(&streamer_priv
->streamer_rx_ring
[i
+ 1]);
661 streamer_priv
->streamer_rx_ring
[i
].status
= 0;
662 streamer_priv
->streamer_rx_ring
[i
].buffer
= virt_to_bus(skb
->data
);
663 streamer_priv
->streamer_rx_ring
[i
].framelen_buflen
= streamer_priv
->pkt_buf_sz
;
664 streamer_priv
->rx_ring_skb
[i
] = skb
;
666 streamer_priv
->streamer_rx_ring
[STREAMER_RX_RING_SIZE
- 1].forward
=
667 virt_to_bus(&streamer_priv
->streamer_rx_ring
[0]);
670 printk(KERN_WARNING
"%s: Not enough memory to allocate rx buffers. Adapter disabled\n", dev
->name
);
671 free_irq(dev
->irq
, dev
);
675 streamer_priv
->rx_ring_last_received
= STREAMER_RX_RING_SIZE
- 1; /* last processed rx status */
677 writel(virt_to_bus(&streamer_priv
->streamer_rx_ring
[0]), streamer_mmio
+ RXBDA
);
678 writel(virt_to_bus(&streamer_priv
->streamer_rx_ring
[STREAMER_RX_RING_SIZE
- 1]), streamer_mmio
+ RXLBDA
);
680 /* set bus master interrupt event mask */
681 writew(MISR_RX_NOBUF
| MISR_RX_EOF
, streamer_mmio
+ MISR_MASK
);
685 streamer_priv
->streamer_tx_ring
=kmalloc(sizeof(struct streamer_tx_desc
)*
686 STREAMER_TX_RING_SIZE
,GFP_KERNEL
);
687 if (!streamer_priv
->streamer_tx_ring
) {
688 printk(KERN_WARNING
"%s ALLOC of streamer_tx_ring FAILED\n",dev
->name
);
692 writew(~BMCTL_TX2_DIS
, streamer_mmio
+ BMCTL_RUM
); /* Enables TX channel 2 */
693 for (i
= 0; i
< STREAMER_TX_RING_SIZE
; i
++) {
694 streamer_priv
->streamer_tx_ring
[i
].forward
= virt_to_bus(&streamer_priv
->streamer_tx_ring
[i
+ 1]);
695 streamer_priv
->streamer_tx_ring
[i
].status
= 0;
696 streamer_priv
->streamer_tx_ring
[i
].bufcnt_framelen
= 0;
697 streamer_priv
->streamer_tx_ring
[i
].buffer
= 0;
698 streamer_priv
->streamer_tx_ring
[i
].buflen
= 0;
700 streamer_priv
->streamer_tx_ring
[STREAMER_TX_RING_SIZE
- 1].forward
=
701 virt_to_bus(&streamer_priv
->streamer_tx_ring
[0]);;
703 streamer_priv
->free_tx_ring_entries
= STREAMER_TX_RING_SIZE
;
704 streamer_priv
->tx_ring_free
= 0; /* next entry in tx ring to use */
705 streamer_priv
->tx_ring_last_status
= STREAMER_TX_RING_SIZE
- 1;
707 /* set Busmaster interrupt event mask (handle receives on interrupt only */
708 writew(MISR_TX2_EOF
| MISR_RX_NOBUF
| MISR_RX_EOF
, streamer_mmio
+ MISR_MASK
);
709 /* set system event interrupt mask */
710 writew(SISR_ADAPTER_CHECK
| SISR_ARB_CMD
| SISR_TRB_REPLY
| SISR_ASB_FREE
, streamer_mmio
+ SISR_MASK_SUM
);
713 printk("BMCTL: %x\n", readw(streamer_mmio
+ BMCTL_SUM
));
714 printk("SISR MASK: %x\n", readw(streamer_mmio
+ SISR_MASK
));
717 #if STREAMER_NETWORK_MONITOR
719 writew(streamer_priv
->streamer_addr_table_addr
, streamer_mmio
+ LAPA
);
720 printk("%s: Node Address: %04x:%04x:%04x\n", dev
->name
,
721 ntohs(readw(streamer_mmio
+ LAPDINC
)),
722 ntohs(readw(streamer_mmio
+ LAPDINC
)),
723 ntohs(readw(streamer_mmio
+ LAPDINC
)));
724 readw(streamer_mmio
+ LAPDINC
);
725 readw(streamer_mmio
+ LAPDINC
);
726 printk("%s: Functional Address: %04x:%04x\n", dev
->name
,
727 ntohs(readw(streamer_mmio
+ LAPDINC
)),
728 ntohs(readw(streamer_mmio
+ LAPDINC
)));
730 writew(streamer_priv
->streamer_parms_addr
+ 4,
731 streamer_mmio
+ LAPA
);
732 printk("%s: NAUN Address: %04x:%04x:%04x\n", dev
->name
,
733 ntohs(readw(streamer_mmio
+ LAPDINC
)),
734 ntohs(readw(streamer_mmio
+ LAPDINC
)),
735 ntohs(readw(streamer_mmio
+ LAPDINC
)));
738 netif_start_queue(dev
);
744 * When we enter the rx routine we do not know how many frames have been
745 * queued on the rx channel. Therefore we start at the next rx status
746 * position and travel around the receive ring until we have completed
749 * This means that we may process the frame before we receive the end
750 * of frame interrupt. This is why we always test the status instead
751 * of blindly processing the next frame.
754 static void streamer_rx(struct net_device
*dev
)
756 struct streamer_private
*streamer_priv
=
757 (struct streamer_private
*) dev
->priv
;
758 __u8
*streamer_mmio
= streamer_priv
->streamer_mmio
;
759 struct streamer_rx_desc
*rx_desc
;
760 int rx_ring_last_received
, length
, frame_length
, buffer_cnt
= 0;
761 struct sk_buff
*skb
, *skb2
;
763 /* setup the next rx descriptor to be received */
764 rx_desc
= &streamer_priv
->streamer_rx_ring
[(streamer_priv
->rx_ring_last_received
+ 1) & (STREAMER_RX_RING_SIZE
- 1)];
765 rx_ring_last_received
= streamer_priv
->rx_ring_last_received
;
767 while (rx_desc
->status
& 0x01000000) { /* While processed descriptors are available */
768 if (rx_ring_last_received
!= streamer_priv
->rx_ring_last_received
)
770 printk(KERN_WARNING
"RX Error 1 rx_ring_last_received not the same %x %x\n",
771 rx_ring_last_received
, streamer_priv
->rx_ring_last_received
);
773 streamer_priv
->rx_ring_last_received
= (streamer_priv
->rx_ring_last_received
+ 1) & (STREAMER_RX_RING_SIZE
- 1);
774 rx_ring_last_received
= streamer_priv
->rx_ring_last_received
;
776 length
= rx_desc
->framelen_buflen
& 0xffff; /* buffer length */
777 frame_length
= (rx_desc
->framelen_buflen
>> 16) & 0xffff;
779 if (rx_desc
->status
& 0x7E830000) { /* errors */
780 if (streamer_priv
->streamer_message_level
) {
781 printk(KERN_WARNING
"%s: Rx Error %x \n",
782 dev
->name
, rx_desc
->status
);
784 } else { /* received without errors */
785 if (rx_desc
->status
& 0x80000000) { /* frame complete */
787 skb
= dev_alloc_skb(streamer_priv
->pkt_buf_sz
);
789 skb
= dev_alloc_skb(frame_length
);
794 printk(KERN_WARNING
"%s: Not enough memory to copy packet to upper layers. \n", dev
->name
);
795 streamer_priv
->streamer_stats
.rx_dropped
++;
796 } else { /* we allocated an skb OK */
799 if (buffer_cnt
== 1) {
800 skb2
= streamer_priv
->rx_ring_skb
[rx_ring_last_received
];
801 #if STREAMER_DEBUG_PACKETS
804 printk("streamer_rx packet print: skb->data2 %p skb->head %p\n", skb2
->data
, skb2
->head
);
805 for (i
= 0; i
< frame_length
; i
++)
807 printk("%x:", skb2
->data
[i
]);
808 if (((i
+ 1) % 16) == 0)
814 skb_put(skb2
, length
);
815 skb2
->protocol
= tr_type_trans(skb2
, dev
);
816 /* recycle this descriptor */
817 streamer_priv
->streamer_rx_ring
[rx_ring_last_received
].status
= 0;
818 streamer_priv
->streamer_rx_ring
[rx_ring_last_received
].framelen_buflen
= streamer_priv
->pkt_buf_sz
;
819 streamer_priv
->streamer_rx_ring
[rx_ring_last_received
].buffer
= virt_to_bus(skb
->data
);
820 streamer_priv
-> rx_ring_skb
[rx_ring_last_received
] = skb
;
821 /* place recycled descriptor back on the adapter */
822 writel(virt_to_bus(&streamer_priv
->streamer_rx_ring
[rx_ring_last_received
]),streamer_mmio
+ RXLBDA
);
823 /* pass the received skb up to the protocol */
826 do { /* Walk the buffers */
827 memcpy(skb_put(skb
, length
),bus_to_virt(rx_desc
->buffer
), length
); /* copy this fragment */
828 streamer_priv
->streamer_rx_ring
[rx_ring_last_received
].status
= 0;
829 streamer_priv
->streamer_rx_ring
[rx_ring_last_received
].framelen_buflen
= streamer_priv
->pkt_buf_sz
;
831 /* give descriptor back to the adapter */
832 writel(virt_to_bus(&streamer_priv
->streamer_rx_ring
[rx_ring_last_received
]), streamer_mmio
+ RXLBDA
);
834 if (rx_desc
->status
& 0x80000000)
835 break; /* this descriptor completes the frame */
837 /* else get the next pending descriptor */
838 if (rx_ring_last_received
!= streamer_priv
->rx_ring_last_received
)
840 printk("RX Error rx_ring_last_received not the same %x %x\n",
841 rx_ring_last_received
,
842 streamer_priv
->rx_ring_last_received
);
844 rx_desc
= &streamer_priv
->streamer_rx_ring
[(streamer_priv
->rx_ring_last_received
+1) & (STREAMER_RX_RING_SIZE
-1)];
846 length
= rx_desc
->framelen_buflen
& 0xffff; /* buffer length */
847 streamer_priv
->rx_ring_last_received
= (streamer_priv
->rx_ring_last_received
+1) & (STREAMER_RX_RING_SIZE
- 1);
848 rx_ring_last_received
= streamer_priv
->rx_ring_last_received
;
851 skb
->protocol
= tr_type_trans(skb
, dev
);
852 /* send up to the protocol */
855 streamer_priv
->streamer_stats
.rx_packets
++;
856 streamer_priv
->streamer_stats
.rx_bytes
+= length
;
857 } /* if skb == null */
858 } /* end received without errors */
860 /* try the next one */
861 rx_desc
= &streamer_priv
->streamer_rx_ring
[(rx_ring_last_received
+ 1) & (STREAMER_RX_RING_SIZE
- 1)];
862 } /* end for all completed rx descriptors */
865 static void streamer_interrupt(int irq
, void *dev_id
, struct pt_regs
*regs
)
867 struct net_device
*dev
= (struct net_device
*) dev_id
;
868 struct streamer_private
*streamer_priv
=
869 (struct streamer_private
*) dev
->priv
;
870 __u8
*streamer_mmio
= streamer_priv
->streamer_mmio
;
876 writew(~sisrmask
, streamer_mmio
+ SISR_MASK_RUM
);
877 sisr
= readw(streamer_mmio
+ SISR
);
878 writew(~sisr
, streamer_mmio
+ SISR_RUM
);
879 misr
= readw(streamer_mmio
+ MISR_RUM
);
880 writew(~misr
, streamer_mmio
+ MISR_RUM
);
883 { /* Interrupt isn't for us */
884 writew(~misr
,streamer_mmio
+MISR_RUM
);
888 spin_lock(&streamer_priv
->streamer_lock
);
890 if ((sisr
& (SISR_SRB_REPLY
| SISR_ADAPTER_CHECK
| SISR_ASB_FREE
| SISR_ARB_CMD
| SISR_TRB_REPLY
))
891 || (misr
& (MISR_TX2_EOF
| MISR_RX_NOBUF
| MISR_RX_EOF
))) {
892 if (sisr
& SISR_SRB_REPLY
) {
893 if (streamer_priv
->srb_queued
== 1) {
894 wake_up_interruptible(&streamer_priv
->srb_wait
);
895 } else if (streamer_priv
->srb_queued
== 2) {
896 streamer_srb_bh(dev
);
898 streamer_priv
->srb_queued
= 0;
901 if (misr
& MISR_TX2_EOF
) {
902 while (streamer_priv
->streamer_tx_ring
[(streamer_priv
->tx_ring_last_status
+ 1) & (STREAMER_TX_RING_SIZE
- 1)].status
)
904 streamer_priv
->tx_ring_last_status
= (streamer_priv
->tx_ring_last_status
+ 1) & (STREAMER_TX_RING_SIZE
- 1);
905 streamer_priv
->free_tx_ring_entries
++;
906 streamer_priv
->streamer_stats
.tx_bytes
+= streamer_priv
->tx_ring_skb
[streamer_priv
->tx_ring_last_status
]->len
;
907 streamer_priv
->streamer_stats
.tx_packets
++;
908 dev_kfree_skb_irq(streamer_priv
->tx_ring_skb
[streamer_priv
->tx_ring_last_status
]);
909 streamer_priv
-> streamer_tx_ring
[streamer_priv
->tx_ring_last_status
].buffer
= 0xdeadbeef;
910 streamer_priv
->streamer_tx_ring
[streamer_priv
->tx_ring_last_status
].status
= 0;
911 streamer_priv
->streamer_tx_ring
[streamer_priv
->tx_ring_last_status
].bufcnt_framelen
= 0;
912 streamer_priv
->streamer_tx_ring
[streamer_priv
->tx_ring_last_status
].buflen
= 0;
914 netif_wake_queue(dev
);
917 if (misr
& MISR_RX_EOF
) {
921 if (sisr
& SISR_ADAPTER_CHECK
) {
922 printk(KERN_WARNING
"%s: Adapter Check Interrupt Raised, 8 bytes of information follow:\n", dev
->name
);
923 writel(readl(streamer_mmio
+ LAPWWO
), streamer_mmio
+ LAPA
);
924 printk(KERN_WARNING
"%s: Words %x:%x:%x:%x:\n",
925 dev
->name
, readw(streamer_mmio
+ LAPDINC
),
926 ntohs(readw(streamer_mmio
+ LAPDINC
)),
927 ntohs(readw(streamer_mmio
+ LAPDINC
)),
928 ntohs(readw(streamer_mmio
+ LAPDINC
)));
929 free_irq(dev
->irq
, dev
);
932 /* SISR_ADAPTER_CHECK */
933 if (sisr
& SISR_ASB_FREE
) {
934 /* Wake up anything that is waiting for the asb response */
935 if (streamer_priv
->asb_queued
) {
936 streamer_asb_bh(dev
);
940 if (sisr
& SISR_ARB_CMD
) {
941 streamer_arb_cmd(dev
);
944 if (sisr
& SISR_TRB_REPLY
) {
945 /* Wake up anything that is waiting for the trb response */
946 if (streamer_priv
->trb_queued
) {
947 wake_up_interruptible(&streamer_priv
->
950 streamer_priv
->trb_queued
= 0;
953 if (misr
& MISR_RX_NOBUF
) {
954 /* According to the documentation, we don't have to do anything, but trapping it keeps it out of
955 /var/log/messages. */
956 } /* SISR_RX_NOBUF */
958 printk(KERN_WARNING
"%s: Unexpected interrupt: %x\n",
960 printk(KERN_WARNING
"%s: SISR_MASK: %x\n", dev
->name
,
961 readw(streamer_mmio
+ SISR_MASK
));
962 } /* One if the interrupts we want */
964 writew(SISR_MI
, streamer_mmio
+ SISR_MASK_SUM
);
965 spin_unlock(&streamer_priv
->streamer_lock
) ;
968 static int streamer_xmit(struct sk_buff
*skb
, struct net_device
*dev
)
970 struct streamer_private
*streamer_priv
=
971 (struct streamer_private
*) dev
->priv
;
972 __u8
*streamer_mmio
= streamer_priv
->streamer_mmio
;
973 unsigned long flags
;
975 spin_lock_irqsave(&streamer_priv
->streamer_lock
, flags
);
976 netif_stop_queue(dev
);
978 if (streamer_priv
->free_tx_ring_entries
) {
979 streamer_priv
->streamer_tx_ring
[streamer_priv
->tx_ring_free
].status
= 0;
980 streamer_priv
->streamer_tx_ring
[streamer_priv
->tx_ring_free
].bufcnt_framelen
= 0x00010000 | skb
->len
;
981 streamer_priv
->streamer_tx_ring
[streamer_priv
->tx_ring_free
].buffer
= virt_to_bus(skb
->data
);
982 streamer_priv
->streamer_tx_ring
[streamer_priv
->tx_ring_free
].buflen
= skb
->len
;
983 streamer_priv
->tx_ring_skb
[streamer_priv
->tx_ring_free
] = skb
;
984 streamer_priv
->free_tx_ring_entries
--;
985 #if STREAMER_DEBUG_PACKETS
988 printk("streamer_xmit packet print:\n");
989 for (i
= 0; i
< skb
->len
; i
++) {
990 printk("%x:", skb
->data
[i
]);
991 if (((i
+ 1) % 16) == 0)
998 writel(virt_to_bus (&streamer_priv
->streamer_tx_ring
[streamer_priv
->tx_ring_free
]),streamer_mmio
+ TX2LFDA
);
1000 streamer_priv
->tx_ring_free
= (streamer_priv
->tx_ring_free
+ 1) & (STREAMER_TX_RING_SIZE
- 1);
1001 netif_wake_queue(dev
);
1002 spin_unlock_irqrestore(&streamer_priv
->streamer_lock
,flags
);
1005 spin_unlock_irqrestore(&streamer_priv
->streamer_lock
,flags
);
1011 static int streamer_close(struct net_device
*dev
)
1013 struct streamer_private
*streamer_priv
=
1014 (struct streamer_private
*) dev
->priv
;
1015 __u8
*streamer_mmio
= streamer_priv
->streamer_mmio
;
1016 unsigned long flags
;
1019 netif_stop_queue(dev
);
1020 writew(streamer_priv
->srb
, streamer_mmio
+ LAPA
);
1021 writew(htons(SRB_CLOSE_ADAPTER
<< 8),streamer_mmio
+LAPDINC
);
1022 writew(htons(STREAMER_CLEAR_RET_CODE
<< 8), streamer_mmio
+LAPDINC
);
1027 streamer_priv
->srb_queued
= 1;
1028 writew(LISR_SRB_CMD
, streamer_mmio
+ LISR_SUM
);
1030 while (streamer_priv
->srb_queued
)
1032 interruptible_sleep_on_timeout(&streamer_priv
->srb_wait
,
1034 if (signal_pending(current
))
1036 printk(KERN_WARNING
"%s: SRB timed out.\n", dev
->name
);
1037 printk(KERN_WARNING
"SISR=%x MISR=%x LISR=%x\n",
1038 readw(streamer_mmio
+ SISR
),
1039 readw(streamer_mmio
+ MISR_RUM
),
1040 readw(streamer_mmio
+ LISR
));
1041 streamer_priv
->srb_queued
= 0;
1046 restore_flags(flags
);
1047 streamer_priv
->rx_ring_last_received
= (streamer_priv
->rx_ring_last_received
+ 1) & (STREAMER_RX_RING_SIZE
- 1);
1049 for (i
= 0; i
< STREAMER_RX_RING_SIZE
; i
++) {
1050 if (streamer_priv
->rx_ring_skb
[streamer_priv
->rx_ring_last_received
]) {
1051 dev_kfree_skb(streamer_priv
->rx_ring_skb
[streamer_priv
->rx_ring_last_received
]);
1053 streamer_priv
->rx_ring_last_received
= (streamer_priv
->rx_ring_last_received
+ 1) & (STREAMER_RX_RING_SIZE
- 1);
1056 /* reset tx/rx fifo's and busmaster logic */
1058 /* TBD. Add graceful way to reset the LLC channel without doing a soft reset.
1059 writel(readl(streamer_mmio+BCTL)|(3<<13),streamer_mmio+BCTL);
1061 writel(readl(streamer_mmio+BCTL)&~(3<<13),streamer_mmio+BCTL);
1065 writew(streamer_priv
->srb
, streamer_mmio
+ LAPA
);
1067 for (i
= 0; i
< 2; i
++) {
1068 printk("%x ", ntohs(readw(streamer_mmio
+ LAPDINC
)));
1072 free_irq(dev
->irq
, dev
);
1078 static void streamer_set_rx_mode(struct net_device
*dev
)
1080 struct streamer_private
*streamer_priv
=
1081 (struct streamer_private
*) dev
->priv
;
1082 __u8
*streamer_mmio
= streamer_priv
->streamer_mmio
;
1084 struct dev_mc_list
*dmi
;
1085 unsigned char dev_mc_address
[5];
1088 writel(streamer_priv
->srb
, streamer_mmio
+ LAPA
);
1089 options
= streamer_priv
->streamer_copy_all_options
;
1091 if (dev
->flags
& IFF_PROMISC
)
1092 options
|= (3 << 5); /* All LLC and MAC frames, all through the main rx channel */
1094 options
&= ~(3 << 5);
1096 /* Only issue the srb if there is a change in options */
1098 if ((options
^ streamer_priv
->streamer_copy_all_options
))
1100 /* Now to issue the srb command to alter the copy.all.options */
1101 writew(htons(SRB_MODIFY_RECEIVE_OPTIONS
<< 8), streamer_mmio
+LAPDINC
);
1102 writew(htons(STREAMER_CLEAR_RET_CODE
<< 8), streamer_mmio
+LAPDINC
);
1103 writew(htons((streamer_priv
->streamer_receive_options
<< 8) | options
),streamer_mmio
+LAPDINC
);
1104 writew(htons(0x4a41),streamer_mmio
+LAPDINC
);
1105 writew(htons(0x4d45),streamer_mmio
+LAPDINC
);
1106 writew(htons(0x5320),streamer_mmio
+LAPDINC
);
1107 writew(0x2020, streamer_mmio
+ LAPDINC
);
1109 streamer_priv
->srb_queued
= 2; /* Can't sleep, use srb_bh */
1111 writel(LISR_SRB_CMD
, streamer_mmio
+ LISR_SUM
);
1113 streamer_priv
->streamer_copy_all_options
= options
;
1117 /* Set the functional addresses we need for multicast */
1118 writel(streamer_priv
->srb
,streamer_mmio
+LAPA
);
1119 dev_mc_address
[0] = dev_mc_address
[1] = dev_mc_address
[2] = dev_mc_address
[3] = 0 ;
1121 for (i
=0,dmi
=dev
->mc_list
;i
< dev
->mc_count
; i
++,dmi
= dmi
->next
)
1123 dev_mc_address
[0] |= dmi
->dmi_addr
[2] ;
1124 dev_mc_address
[1] |= dmi
->dmi_addr
[3] ;
1125 dev_mc_address
[2] |= dmi
->dmi_addr
[4] ;
1126 dev_mc_address
[3] |= dmi
->dmi_addr
[5] ;
1129 writew(htons(SRB_SET_FUNC_ADDRESS
<< 8),streamer_mmio
+LAPDINC
);
1130 writew(htons(STREAMER_CLEAR_RET_CODE
<< 8), streamer_mmio
+LAPDINC
);
1131 writew(0,streamer_mmio
+LAPDINC
);
1132 writew(htons( (dev_mc_address
[0] << 8) | dev_mc_address
[1]),streamer_mmio
+LAPDINC
);
1133 writew(htons( (dev_mc_address
[2] << 8) | dev_mc_address
[3]),streamer_mmio
+LAPDINC
);
1134 streamer_priv
->srb_queued
= 2 ;
1135 writel(LISR_SRB_CMD
,streamer_mmio
+LISR_SUM
);
1138 static void streamer_srb_bh(struct net_device
*dev
)
1140 struct streamer_private
*streamer_priv
= (struct streamer_private
*) dev
->priv
;
1141 __u8
*streamer_mmio
= streamer_priv
->streamer_mmio
;
1144 writew(streamer_priv
->srb
, streamer_mmio
+ LAPA
);
1145 srb_word
=ntohs(readw(streamer_mmio
+LAPDINC
)) >> 8;
1149 /* SRB_MODIFY_RECEIVE_OPTIONS i.e. set_multicast_list options (promiscuous)
1150 * At some point we should do something if we get an error, such as
1151 * resetting the IFF_PROMISC flag in dev
1154 case SRB_MODIFY_RECEIVE_OPTIONS
:
1155 srb_word
=ntohs(readw(streamer_mmio
+LAPDINC
)) >> 8;
1159 printk(KERN_WARNING
"%s: Unrecognized srb command\n", dev
->name
);
1162 printk(KERN_WARNING
"%s: Adapter must be open for this operation, doh!!\n", dev
->name
);
1165 if (streamer_priv
->streamer_message_level
)
1166 printk(KERN_WARNING
"%s: Receive Options Modified to %x,%x\n",
1168 streamer_priv
->streamer_copy_all_options
,
1169 streamer_priv
->streamer_receive_options
);
1171 } /* switch srb[2] */
1175 /* SRB_SET_GROUP_ADDRESS - Multicast group setting
1177 case SRB_SET_GROUP_ADDRESS
:
1178 srb_word
=ntohs(readw(streamer_mmio
+LAPDINC
)) >> 8;
1183 printk(KERN_WARNING
"%s: Unrecognized srb command \n",dev
->name
);
1186 printk(KERN_WARNING
"%s: Adapter must be open for this operation, doh!!\n", dev
->name
);
1189 printk(KERN_WARNING
"%s: Group/Functional address indicator bits not set correctly\n", dev
->name
);
1191 case 0x3e: /* If we ever implement individual multicast addresses, will need to deal with this */
1192 printk(KERN_WARNING
"%s: Group address registers full\n", dev
->name
);
1195 printk(KERN_INFO
"%s: Group Address already set.\n", dev
->name
);
1199 } /* switch srb[2] */
1203 /* SRB_RESET_GROUP_ADDRESS - Remove a multicast address from group list
1205 case SRB_RESET_GROUP_ADDRESS
:
1206 srb_word
=ntohs(readw(streamer_mmio
+LAPDINC
)) >> 8;
1211 printk(KERN_WARNING
"%s: Unrecognized srb command \n", dev
->name
);
1214 printk(KERN_WARNING
"%s: Adapter must be open for this operation, doh!!\n", dev
->name
);
1216 case 0x39: /* Must deal with this if individual multicast addresses used */
1217 printk(KERN_INFO
"%s: Group address not found \n", dev
->name
);
1221 } /* switch srb[2] */
1225 /* SRB_SET_FUNC_ADDRESS - Called by the set_rx_mode
1228 case SRB_SET_FUNC_ADDRESS
:
1229 srb_word
=ntohs(readw(streamer_mmio
+LAPDINC
)) >> 8;
1232 if (streamer_priv
->streamer_message_level
)
1233 printk(KERN_INFO
"%s: Functional Address Mask Set \n", dev
->name
);
1236 printk(KERN_WARNING
"%s: Unrecognized srb command \n", dev
->name
);
1239 printk(KERN_WARNING
"%s: Adapter must be open for this operation, doh!!\n", dev
->name
);
1243 } /* switch srb[2] */
1246 /* SRB_READ_LOG - Read and reset the adapter error counters
1250 srb_word
=ntohs(readw(streamer_mmio
+LAPDINC
)) >> 8;
1255 if (streamer_priv
->streamer_message_level
)
1256 printk(KERN_INFO
"%s: Read Log command complete\n", dev
->name
);
1257 printk("Read Log statistics: ");
1258 writew(streamer_priv
->srb
+ 6,
1259 streamer_mmio
+ LAPA
);
1260 for (i
= 0; i
< 5; i
++) {
1261 printk("%x:", ntohs(readw(streamer_mmio
+ LAPDINC
)));
1267 printk(KERN_WARNING
"%s: Unrecognized srb command \n", dev
->name
);
1270 printk(KERN_WARNING
"%s: Adapter must be open for this operation, doh!!\n", dev
->name
);
1273 } /* switch srb[2] */
1276 /* SRB_READ_SR_COUNTERS - Read and reset the source routing bridge related counters */
1278 case SRB_READ_SR_COUNTERS
:
1279 srb_word
=ntohs(readw(streamer_mmio
+LAPDINC
)) >> 8;
1282 if (streamer_priv
->streamer_message_level
)
1283 printk(KERN_INFO
"%s: Read Source Routing Counters issued\n", dev
->name
);
1286 printk(KERN_WARNING
"%s: Unrecognized srb command \n", dev
->name
);
1289 printk(KERN_WARNING
"%s: Adapter must be open for this operation, doh!!\n", dev
->name
);
1293 } /* switch srb[2] */
1297 printk(KERN_WARNING
"%s: Unrecognized srb bh return value.\n", dev
->name
);
1299 } /* switch srb[0] */
1302 static struct net_device_stats
*streamer_get_stats(struct net_device
*dev
)
1304 struct streamer_private
*streamer_priv
;
1305 streamer_priv
= (struct streamer_private
*) dev
->priv
;
1306 return (struct net_device_stats
*) &streamer_priv
->streamer_stats
;
1309 static int streamer_set_mac_address(struct net_device
*dev
, void *addr
)
1311 struct sockaddr
*saddr
= addr
;
1312 struct streamer_private
*streamer_priv
= (struct streamer_private
*) dev
->priv
;
1314 if (netif_running(dev
))
1316 printk(KERN_WARNING
"%s: Cannot set mac/laa address while card is open\n", dev
->name
);
1320 memcpy(streamer_priv
->streamer_laa
, saddr
->sa_data
, dev
->addr_len
);
1322 if (streamer_priv
->streamer_message_level
) {
1323 printk(KERN_INFO
"%s: MAC/LAA Set to = %x.%x.%x.%x.%x.%x\n",
1324 dev
->name
, streamer_priv
->streamer_laa
[0],
1325 streamer_priv
->streamer_laa
[1],
1326 streamer_priv
->streamer_laa
[2],
1327 streamer_priv
->streamer_laa
[3],
1328 streamer_priv
->streamer_laa
[4],
1329 streamer_priv
->streamer_laa
[5]);
1334 static void streamer_arb_cmd(struct net_device
*dev
)
1336 struct streamer_private
*streamer_priv
=
1337 (struct streamer_private
*) dev
->priv
;
1338 __u8
*streamer_mmio
= streamer_priv
->streamer_mmio
;
1340 __u16 frame_len
, buffer_len
;
1341 struct sk_buff
*mac_frame
;
1342 __u8 frame_data
[256];
1344 __u16 lan_status
= 0, lan_status_diff
; /* Initialize to stop compiler warning */
1345 __u8 fdx_prot_error
;
1349 #if STREAMER_NETWORK_MONITOR
1350 struct trh_hdr
*mac_hdr
;
1353 writew(streamer_priv
->arb
, streamer_mmio
+ LAPA
);
1354 arb_word
=ntohs(readw(streamer_mmio
+LAPD
)) >> 8;
1356 if (arb_word
== ARB_RECEIVE_DATA
) { /* Receive.data, MAC frames */
1357 writew(streamer_priv
->arb
+ 6, streamer_mmio
+ LAPA
);
1358 streamer_priv
->mac_rx_buffer
= buff_off
= ntohs(readw(streamer_mmio
+ LAPDINC
));
1359 header_len
=ntohs(readw(streamer_mmio
+LAPDINC
)) >> 8; /* 802.5 Token-Ring Header Length */
1360 frame_len
= ntohs(readw(streamer_mmio
+ LAPDINC
));
1369 writew(ntohs(buff_off
), streamer_mmio
+ LAPA
); /*setup window to frame data */
1370 next
= htons(readw(streamer_mmio
+ LAPDINC
));
1372 ntohs(readw(streamer_mmio
+ LAPDINC
)) & 0xff;
1373 len
= ntohs(readw(streamer_mmio
+ LAPDINC
));
1375 /* print out 1st 14 bytes of frame data */
1376 for (i
= 0; i
< 7; i
++) {
1377 printk("Loc %d = %04x\n", i
,
1379 (streamer_mmio
+ LAPDINC
)));
1382 printk("next %04x, fs %02x, len %04x \n", next
,
1386 mac_frame
= dev_alloc_skb(frame_len
);
1388 /* Walk the buffer chain, creating the frame */
1394 writew(htons(buff_off
), streamer_mmio
+ LAPA
); /* setup window to frame data */
1395 next_ptr
= ntohs(readw(streamer_mmio
+ LAPDINC
));
1396 readw(streamer_mmio
+ LAPDINC
); /* read thru status word */
1397 buffer_len
= ntohs(readw(streamer_mmio
+ LAPDINC
));
1399 if (buffer_len
> 256)
1403 while (i
< buffer_len
) {
1404 rx_word
=ntohs(readw(streamer_mmio
+LAPDINC
));
1405 frame_data
[i
]=rx_word
>> 8;
1406 frame_data
[i
+1]=rx_word
& 0xff;
1410 memcpy_fromio(skb_put(mac_frame
, buffer_len
),
1411 frame_data
, buffer_len
);
1412 } while (next_ptr
&& (buff_off
= next_ptr
));
1414 #if STREAMER_NETWORK_MONITOR
1415 printk(KERN_WARNING
"%s: Received MAC Frame, details: \n",
1417 mac_hdr
= (struct trh_hdr
*) mac_frame
->data
;
1419 "%s: MAC Frame Dest. Addr: %02x:%02x:%02x:%02x:%02x:%02x \n",
1420 dev
->name
, mac_hdr
->daddr
[0], mac_hdr
->daddr
[1],
1421 mac_hdr
->daddr
[2], mac_hdr
->daddr
[3],
1422 mac_hdr
->daddr
[4], mac_hdr
->daddr
[5]);
1424 "%s: MAC Frame Srce. Addr: %02x:%02x:%02x:%02x:%02x:%02x \n",
1425 dev
->name
, mac_hdr
->saddr
[0], mac_hdr
->saddr
[1],
1426 mac_hdr
->saddr
[2], mac_hdr
->saddr
[3],
1427 mac_hdr
->saddr
[4], mac_hdr
->saddr
[5]);
1429 mac_frame
->dev
= dev
;
1430 mac_frame
->protocol
= tr_type_trans(mac_frame
, dev
);
1431 netif_rx(mac_frame
);
1433 /* Now tell the card we have dealt with the received frame */
1435 /* Set LISR Bit 1 */
1436 writel(LISR_ARB_FREE
, streamer_priv
->streamer_mmio
+ LISR_SUM
);
1438 /* Is the ASB free ? */
1440 if (!(readl(streamer_priv
->streamer_mmio
+ SISR
) & SISR_ASB_FREE
))
1442 streamer_priv
->asb_queued
= 1;
1443 writel(LISR_ASB_FREE_REQ
, streamer_priv
->streamer_mmio
+ LISR_SUM
);
1445 /* Drop out and wait for the bottom half to be run */
1449 writew(streamer_priv
->asb
, streamer_mmio
+ LAPA
);
1450 writew(htons(ASB_RECEIVE_DATA
<< 8), streamer_mmio
+LAPDINC
);
1451 writew(htons(STREAMER_CLEAR_RET_CODE
<< 8), streamer_mmio
+LAPDINC
);
1452 writew(0, streamer_mmio
+ LAPDINC
);
1453 writew(htons(streamer_priv
->mac_rx_buffer
), streamer_mmio
+ LAPD
);
1455 writel(LISR_ASB_REPLY
| LISR_ASB_FREE_REQ
, streamer_priv
->streamer_mmio
+ LISR_SUM
);
1457 streamer_priv
->asb_queued
= 2;
1460 } else if (arb_word
== ARB_LAN_CHANGE_STATUS
) { /* Lan.change.status */
1461 writew(streamer_priv
->arb
+ 6, streamer_mmio
+ LAPA
);
1462 lan_status
= ntohs(readw(streamer_mmio
+ LAPDINC
));
1463 fdx_prot_error
= ntohs(readw(streamer_mmio
+LAPD
)) >> 8;
1465 /* Issue ARB Free */
1466 writew(LISR_ARB_FREE
, streamer_priv
->streamer_mmio
+ LISR_SUM
);
1468 lan_status_diff
= (streamer_priv
->streamer_lan_status
^ lan_status
) &
1471 if (lan_status_diff
& (LSC_LWF
| LSC_ARW
| LSC_FPE
| LSC_RR
))
1473 if (lan_status_diff
& LSC_LWF
)
1474 printk(KERN_WARNING
"%s: Short circuit detected on the lobe\n", dev
->name
);
1475 if (lan_status_diff
& LSC_ARW
)
1476 printk(KERN_WARNING
"%s: Auto removal error\n", dev
->name
);
1477 if (lan_status_diff
& LSC_FPE
)
1478 printk(KERN_WARNING
"%s: FDX Protocol Error\n", dev
->name
);
1479 if (lan_status_diff
& LSC_RR
)
1480 printk(KERN_WARNING
"%s: Force remove MAC frame received\n", dev
->name
);
1482 /* Adapter has been closed by the hardware */
1484 /* reset tx/rx fifo's and busmaster logic */
1486 /* @TBD. no llc reset on autostreamer writel(readl(streamer_mmio+BCTL)|(3<<13),streamer_mmio+BCTL);
1488 writel(readl(streamer_mmio+BCTL)&~(3<<13),streamer_mmio+BCTL); */
1489 netif_stop_queue(dev
);
1490 free_irq(dev
->irq
, dev
);
1492 printk(KERN_WARNING
"%s: Adapter has been closed \n", dev
->name
);
1495 /* If serious error */
1496 if (streamer_priv
->streamer_message_level
) {
1497 if (lan_status_diff
& LSC_SIG_LOSS
)
1498 printk(KERN_WARNING
"%s: No receive signal detected \n", dev
->name
);
1499 if (lan_status_diff
& LSC_HARD_ERR
)
1500 printk(KERN_INFO
"%s: Beaconing \n", dev
->name
);
1501 if (lan_status_diff
& LSC_SOFT_ERR
)
1502 printk(KERN_WARNING
"%s: Adapter transmitted Soft Error Report Mac Frame \n", dev
->name
);
1503 if (lan_status_diff
& LSC_TRAN_BCN
)
1504 printk(KERN_INFO
"%s: We are tranmitting the beacon, aaah\n", dev
->name
);
1505 if (lan_status_diff
& LSC_SS
)
1506 printk(KERN_INFO
"%s: Single Station on the ring \n", dev
->name
);
1507 if (lan_status_diff
& LSC_RING_REC
)
1508 printk(KERN_INFO
"%s: Ring recovery ongoing\n", dev
->name
);
1509 if (lan_status_diff
& LSC_FDX_MODE
)
1510 printk(KERN_INFO
"%s: Operating in FDX mode\n", dev
->name
);
1513 if (lan_status_diff
& LSC_CO
) {
1514 if (streamer_priv
->streamer_message_level
)
1515 printk(KERN_INFO
"%s: Counter Overflow \n", dev
->name
);
1517 /* Issue READ.LOG command */
1519 writew(streamer_priv
->srb
, streamer_mmio
+ LAPA
);
1520 writew(htons(SRB_READ_LOG
<< 8),streamer_mmio
+LAPDINC
);
1521 writew(htons(STREAMER_CLEAR_RET_CODE
<< 8), streamer_mmio
+LAPDINC
);
1522 writew(0, streamer_mmio
+ LAPDINC
);
1523 streamer_priv
->srb_queued
= 2; /* Can't sleep, use srb_bh */
1525 writew(LISR_SRB_CMD
, streamer_mmio
+ LISR_SUM
);
1528 if (lan_status_diff
& LSC_SR_CO
) {
1529 if (streamer_priv
->streamer_message_level
)
1530 printk(KERN_INFO
"%s: Source routing counters overflow\n", dev
->name
);
1532 /* Issue a READ.SR.COUNTERS */
1533 writew(streamer_priv
->srb
, streamer_mmio
+ LAPA
);
1534 writew(htons(SRB_READ_SR_COUNTERS
<< 8),
1535 streamer_mmio
+LAPDINC
);
1536 writew(htons(STREAMER_CLEAR_RET_CODE
<< 8),
1537 streamer_mmio
+LAPDINC
);
1538 streamer_priv
->srb_queued
= 2; /* Can't sleep, use srb_bh */
1539 writew(LISR_SRB_CMD
, streamer_mmio
+ LISR_SUM
);
1542 streamer_priv
->streamer_lan_status
= lan_status
;
1543 } /* Lan.change.status */
1545 printk(KERN_WARNING
"%s: Unknown arb command \n", dev
->name
);
1548 static void streamer_asb_bh(struct net_device
*dev
)
1550 struct streamer_private
*streamer_priv
=
1551 (struct streamer_private
*) dev
->priv
;
1552 __u8
*streamer_mmio
= streamer_priv
->streamer_mmio
;
1554 if (streamer_priv
->asb_queued
== 1)
1556 /* Dropped through the first time */
1558 writew(streamer_priv
->asb
, streamer_mmio
+ LAPA
);
1559 writew(htons(ASB_RECEIVE_DATA
<< 8),streamer_mmio
+LAPDINC
);
1560 writew(htons(STREAMER_CLEAR_RET_CODE
<< 8), streamer_mmio
+LAPDINC
);
1561 writew(0, streamer_mmio
+ LAPDINC
);
1562 writew(htons(streamer_priv
->mac_rx_buffer
), streamer_mmio
+ LAPD
);
1564 writel(LISR_ASB_REPLY
| LISR_ASB_FREE_REQ
, streamer_priv
->streamer_mmio
+ LISR_SUM
);
1565 streamer_priv
->asb_queued
= 2;
1570 if (streamer_priv
->asb_queued
== 2) {
1572 writew(streamer_priv
->asb
+ 2, streamer_mmio
+ LAPA
);
1573 rc
=ntohs(readw(streamer_mmio
+LAPD
)) >> 8;
1576 printk(KERN_WARNING
"%s: Unrecognized command code \n", dev
->name
);
1579 printk(KERN_WARNING
"%s: Unrecognized buffer address \n", dev
->name
);
1582 /* Valid response, everything should be ok again */
1585 printk(KERN_WARNING
"%s: Invalid return code in asb\n", dev
->name
);
1589 streamer_priv
->asb_queued
= 0;
1592 static int streamer_change_mtu(struct net_device
*dev
, int mtu
)
1594 struct streamer_private
*streamer_priv
=
1595 (struct streamer_private
*) dev
->priv
;
1598 if (streamer_priv
->streamer_ring_speed
== 4)
1609 streamer_priv
->pkt_buf_sz
= mtu
+ TR_HLEN
;
1614 #if STREAMER_NETWORK_MONITOR
1615 #ifdef CONFIG_PROC_FS
1616 static int streamer_proc_info(char *buffer
, char **start
, off_t offset
,
1617 int length
, int *eof
, void *data
)
1619 struct pci_dev
*pci_device
= NULL
;
1628 size
= sprintf(buffer
, "IBM LanStreamer/MPC Chipset Token Ring Adapters\n");
1633 while ((pci_device
= pci_find_device(PCI_VENDOR_ID_IBM
, PCI_DEVICE_ID_IBM_TR
, pci_device
)))
1636 for (dev
= dev_base
; dev
!= NULL
; dev
= dev
->next
)
1638 if (dev
->base_addr
== pci_device
->resource
[0].start
)
1639 { /* Yep, a Streamer device */
1640 size
= sprintf_info(buffer
+ len
, dev
);
1648 if (pos
> offset
+ length
)
1654 *start
= buffer
+ (offset
- begin
); /* Start of wanted data */
1655 len
-= (offset
- begin
); /* Start slop */
1657 len
= length
; /* Ending slop */
1661 static int sprintf_info(char *buffer
, struct net_device
*dev
)
1663 struct streamer_private
*streamer_priv
=
1664 (struct streamer_private
*) dev
->priv
;
1665 __u8
*streamer_mmio
= streamer_priv
->streamer_mmio
;
1666 struct streamer_adapter_addr_table sat
;
1667 struct streamer_parameters_table spt
;
1671 writew(streamer_priv
->streamer_addr_table_addr
, streamer_mmio
+ LAPA
);
1672 for (i
= 0; i
< 14; i
+= 2) {
1674 __u8
*datap
= (__u8
*) & sat
;
1675 io_word
=ntohs(readw(streamer_mmio
+LAPDINC
));
1676 datap
[size
]=io_word
>> 8;
1677 datap
[size
+1]=io_word
& 0xff;
1679 writew(streamer_priv
->streamer_parms_addr
, streamer_mmio
+ LAPA
);
1680 for (i
= 0; i
< 68; i
+= 2) {
1682 __u8
*datap
= (__u8
*) & spt
;
1683 io_word
=ntohs(readw(streamer_mmio
+LAPDINC
));
1684 datap
[size
]=io_word
>> 8;
1685 datap
[size
+1]=io_word
& 0xff;
1689 size
= sprintf(buffer
, "\n%6s: Adapter Address : Node Address : Functional Addr\n", dev
->name
);
1691 size
+= sprintf(buffer
+ size
,
1692 "%6s: %02x:%02x:%02x:%02x:%02x:%02x : %02x:%02x:%02x:%02x:%02x:%02x : %02x:%02x:%02x:%02x\n",
1693 dev
->name
, dev
->dev_addr
[0], dev
->dev_addr
[1],
1694 dev
->dev_addr
[2], dev
->dev_addr
[3], dev
->dev_addr
[4],
1695 dev
->dev_addr
[5], sat
.node_addr
[0], sat
.node_addr
[1],
1696 sat
.node_addr
[2], sat
.node_addr
[3], sat
.node_addr
[4],
1697 sat
.node_addr
[5], sat
.func_addr
[0], sat
.func_addr
[1],
1698 sat
.func_addr
[2], sat
.func_addr
[3]);
1700 size
+= sprintf(buffer
+ size
, "\n%6s: Token Ring Parameters Table:\n", dev
->name
);
1702 size
+= sprintf(buffer
+ size
, "%6s: Physical Addr : Up Node Address : Poll Address : AccPri : Auth Src : Att Code :\n", dev
->name
);
1704 size
+= sprintf(buffer
+ size
,
1705 "%6s: %02x:%02x:%02x:%02x : %02x:%02x:%02x:%02x:%02x:%02x : %02x:%02x:%02x:%02x:%02x:%02x : %04x : %04x : %04x :\n",
1706 dev
->name
, spt
.phys_addr
[0], spt
.phys_addr
[1],
1707 spt
.phys_addr
[2], spt
.phys_addr
[3],
1708 spt
.up_node_addr
[0], spt
.up_node_addr
[1],
1709 spt
.up_node_addr
[2], spt
.up_node_addr
[3],
1710 spt
.up_node_addr
[4], spt
.up_node_addr
[4],
1711 spt
.poll_addr
[0], spt
.poll_addr
[1], spt
.poll_addr
[2],
1712 spt
.poll_addr
[3], spt
.poll_addr
[4], spt
.poll_addr
[5],
1713 ntohs(spt
.acc_priority
), ntohs(spt
.auth_source_class
),
1714 ntohs(spt
.att_code
));
1716 size
+= sprintf(buffer
+ size
, "%6s: Source Address : Bcn T : Maj. V : Lan St : Lcl Rg : Mon Err : Frame Correl : \n", dev
->name
);
1718 size
+= sprintf(buffer
+ size
,
1719 "%6s: %02x:%02x:%02x:%02x:%02x:%02x : %04x : %04x : %04x : %04x : %04x : %04x : \n",
1720 dev
->name
, spt
.source_addr
[0], spt
.source_addr
[1],
1721 spt
.source_addr
[2], spt
.source_addr
[3],
1722 spt
.source_addr
[4], spt
.source_addr
[5],
1723 ntohs(spt
.beacon_type
), ntohs(spt
.major_vector
),
1724 ntohs(spt
.lan_status
), ntohs(spt
.local_ring
),
1725 ntohs(spt
.mon_error
), ntohs(spt
.frame_correl
));
1727 size
+= sprintf(buffer
+ size
, "%6s: Beacon Details : Tx : Rx : NAUN Node Address : NAUN Node Phys : \n",
1730 size
+= sprintf(buffer
+ size
,
1731 "%6s: : %02x : %02x : %02x:%02x:%02x:%02x:%02x:%02x : %02x:%02x:%02x:%02x : \n",
1732 dev
->name
, ntohs(spt
.beacon_transmit
),
1733 ntohs(spt
.beacon_receive
), spt
.beacon_naun
[0],
1734 spt
.beacon_naun
[1], spt
.beacon_naun
[2],
1735 spt
.beacon_naun
[3], spt
.beacon_naun
[4],
1736 spt
.beacon_naun
[5], spt
.beacon_phys
[0],
1737 spt
.beacon_phys
[1], spt
.beacon_phys
[2],
1738 spt
.beacon_phys
[3]);
1746 static struct net_device
*dev_streamer
[STREAMER_MAX_ADAPTERS
];
1748 int init_module(void)
1752 #if STREAMER_NETWORK_MONITOR
1753 #ifdef CONFIG_PROC_FS
1754 create_proc_read_entry("net/streamer_tr",0,0,streamer_proc_info
,NULL
);
1757 for (i
= 0; (i
< STREAMER_MAX_ADAPTERS
); i
++)
1759 dev_streamer
[i
] = NULL
;
1760 dev_streamer
[i
] = init_trdev(dev_streamer
[i
], 0);
1761 if (dev_streamer
[i
] == NULL
)
1764 dev_streamer
[i
]->init
= &streamer_probe
;
1766 if (register_trdev(dev_streamer
[i
]) != 0) {
1767 kfree(dev_streamer
[i
]);
1768 dev_streamer
[i
] = NULL
;
1771 printk(KERN_INFO
"Streamer: No IBM LanStreamer PCI Token Ring cards found in system.\n");
1774 printk(KERN_INFO
"Streamer: %d IBM LanStreamer PCI Token Ring card(s) found in system.\n", i
);
1783 void cleanup_module(void)
1786 struct streamer_private
*streamer_priv
;
1788 for (i
= 0; i
< STREAMER_MAX_ADAPTERS
; i
++)
1789 if (dev_streamer
[i
]) {
1790 unregister_trdev(dev_streamer
[i
]);
1791 release_region(dev_streamer
[i
]->base_addr
, STREAMER_IO_SPACE
);
1792 streamer_priv
=(struct streamer_private
*)dev_streamer
[i
]->priv
;
1793 kfree(streamer_priv
->streamer_rx_ring
);
1794 kfree(streamer_priv
->streamer_tx_ring
);
1795 kfree(dev_streamer
[i
]->priv
);
1796 kfree(dev_streamer
[i
]);
1797 dev_streamer
[i
] = NULL
;
1799 #if STREAMER_NETWORK_MONITOR
1800 #ifdef CONFIG_PROC_FS
1801 remove_proc_entry("net/streamer_tr", NULL
);