Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.5.6.
   1/*
   2 *   lanstreamer.c -- driver for the IBM Auto LANStreamer PCI Adapter
   3 *
   4 *  Written By: Mike Sullivan, IBM Corporation
   5 *
   6 *  Copyright (C) 1999 IBM Corporation
   7 *
   8 *  Linux driver for IBM PCI tokenring cards based on the LanStreamer MPC
   9 *  chipset. 
  10 *
  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)
  15 *
  16 *  Base Driver Skeleton:
  17 *      Written 1993-94 by Donald Becker.
  18 *
  19 *      Copyright 1993 United States Government as represented by the
  20 *      Director, National Security Agency.
  21 *
  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.                                       
  26 *                                                                           
  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.                              
  31 *                                                                           
  32 * NO WARRANTY                                                               
  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.  
  42 *                                                                           
  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             
  51 *                                                                           
  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 
  55 *                                                                           
  56 * 
  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
  62 *  03/08/01 - Added support for module_init() and module_exit()
  63 *  08/15/01 - Added ioctl() functionality for debugging, changed netif_*_queue
  64 *             calls and other incorrectness - Kent Yoder <yoder1@us.ibm.com>
  65 *  11/05/01 - Restructured the interrupt function, added delays, reduced the 
  66 *             the number of TX descriptors to 1, which together can prevent 
  67 *             the card from locking up the box - <yoder1@us.ibm.com>
  68 *  09/27/02 - New PCI interface + bug fix. - <yoder1@us.ibm.com>
  69 *  11/13/02 - Removed free_irq calls which could cause a hang, added
  70 *	       netif_carrier_{on|off} - <yoder1@us.ibm.com>
  71 *  
  72 *  To Do:
  73 *
  74 *
  75 *  If Problems do Occur
  76 *  Most problems can be rectified by either closing and opening the interface
  77 *  (ifconfig down and up) or rmmod and insmod'ing the driver (a bit difficult
  78 *  if compiled into the kernel).
  79 */
  80
  81/* Change STREAMER_DEBUG to 1 to get verbose, and I mean really verbose, messages */
  82
  83#define STREAMER_DEBUG 0
  84#define STREAMER_DEBUG_PACKETS 0
  85
  86/* Change STREAMER_NETWORK_MONITOR to receive mac frames through the arb channel.
  87 * Will also create a /proc/net/streamer_tr entry if proc_fs is compiled into the
  88 * kernel.
  89 * Intended to be used to create a ring-error reporting network module 
  90 * i.e. it will give you the source address of beaconers on the ring 
  91 */
  92
  93#define STREAMER_NETWORK_MONITOR 0
  94
  95/* #define CONFIG_PROC_FS */
  96
  97/*
  98 *  Allow or disallow ioctl's for debugging
  99 */
 100
 101#define STREAMER_IOCTL 0
 102
 103#include <linux/module.h>
 104#include <linux/kernel.h>
 105#include <linux/errno.h>
 106#include <linux/timer.h>
 107#include <linux/in.h>
 108#include <linux/ioport.h>
 109#include <linux/string.h>
 110#include <linux/proc_fs.h>
 111#include <linux/ptrace.h>
 112#include <linux/skbuff.h>
 113#include <linux/interrupt.h>
 114#include <linux/delay.h>
 115#include <linux/netdevice.h>
 116#include <linux/trdevice.h>
 117#include <linux/stddef.h>
 118#include <linux/init.h>
 119#include <linux/pci.h>
 120#include <linux/dma-mapping.h>
 121#include <linux/spinlock.h>
 122#include <linux/bitops.h>
 123#include <linux/jiffies.h>
 124#include <linux/slab.h>
 125
 126#include <net/net_namespace.h>
 127#include <net/checksum.h>
 128
 129#include <asm/io.h>
 130#include <asm/system.h>
 131
 132#include "lanstreamer.h"
 133
 134#if (BITS_PER_LONG == 64)
 135#error broken on 64-bit: stores pointer to rx_ring->buffer in 32-bit int
 136#endif
 137
 138
 139/* I've got to put some intelligence into the version number so that Peter and I know
 140 * which version of the code somebody has got. 
 141 * Version Number = a.b.c.d  where a.b.c is the level of code and d is the latest author.
 142 * So 0.0.1.pds = Peter, 0.0.1.mlp = Mike
 143 * 
 144 * Official releases will only have an a.b.c version number format.
 145 */
 146
 147static char version[] = "LanStreamer.c v0.4.0 03/08/01 - Mike Sullivan\n"
 148                        "              v0.5.3 11/13/02 - Kent Yoder";
 149
 150static DEFINE_PCI_DEVICE_TABLE(streamer_pci_tbl) = {
 151	{ PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_TR, PCI_ANY_ID, PCI_ANY_ID,},
 152	{}	/* terminating entry */
 153};
 154MODULE_DEVICE_TABLE(pci,streamer_pci_tbl);
 155
 156
 157static char *open_maj_error[] = {
 158	"No error", "Lobe Media Test", "Physical Insertion",
 159	"Address Verification", "Neighbor Notification (Ring Poll)",
 160	"Request Parameters", "FDX Registration Request",
 161	"FDX Lobe Media Test", "FDX Duplicate Address Check",
 162	"Unknown stage"
 163};
 164
 165static char *open_min_error[] = {
 166	"No error", "Function Failure", "Signal Lost", "Wire Fault",
 167	"Ring Speed Mismatch", "Timeout", "Ring Failure", "Ring Beaconing",
 168	"Duplicate Node Address", "Request Parameters", "Remove Received",
 169	"Reserved", "Reserved", "No Monitor Detected for RPL",
 170	"Monitor Contention failer for RPL", "FDX Protocol Error"
 171};
 172
 173/* Module parameters */
 174
 175/* Ring Speed 0,4,16
 176 * 0 = Autosense         
 177 * 4,16 = Selected speed only, no autosense
 178 * This allows the card to be the first on the ring
 179 * and become the active monitor.
 180 *
 181 * WARNING: Some hubs will allow you to insert
 182 * at the wrong speed
 183 */
 184
 185static int ringspeed[STREAMER_MAX_ADAPTERS] = { 0, };
 186
 187module_param_array(ringspeed, int, NULL, 0);
 188
 189/* Packet buffer size */
 190
 191static int pkt_buf_sz[STREAMER_MAX_ADAPTERS] = { 0, };
 192
 193module_param_array(pkt_buf_sz, int, NULL, 0);
 194
 195/* Message Level */
 196
 197static int message_level[STREAMER_MAX_ADAPTERS] = { 1, };
 198
 199module_param_array(message_level, int, NULL, 0);
 200
 201#if STREAMER_IOCTL
 202static int streamer_ioctl(struct net_device *, struct ifreq *, int);
 203#endif
 204
 205static int streamer_reset(struct net_device *dev);
 206static int streamer_open(struct net_device *dev);
 207static netdev_tx_t streamer_xmit(struct sk_buff *skb,
 208				       struct net_device *dev);
 209static int streamer_close(struct net_device *dev);
 210static void streamer_set_rx_mode(struct net_device *dev);
 211static irqreturn_t streamer_interrupt(int irq, void *dev_id);
 212static int streamer_set_mac_address(struct net_device *dev, void *addr);
 213static void streamer_arb_cmd(struct net_device *dev);
 214static int streamer_change_mtu(struct net_device *dev, int mtu);
 215static void streamer_srb_bh(struct net_device *dev);
 216static void streamer_asb_bh(struct net_device *dev);
 217#if STREAMER_NETWORK_MONITOR
 218#ifdef CONFIG_PROC_FS
 219static int streamer_proc_info(char *buffer, char **start, off_t offset,
 220			      int length, int *eof, void *data);
 221static int sprintf_info(char *buffer, struct net_device *dev);
 222struct streamer_private *dev_streamer=NULL;
 223#endif
 224#endif
 225
 226static const struct net_device_ops streamer_netdev_ops = {
 227	.ndo_open		= streamer_open,
 228	.ndo_stop		= streamer_close,
 229	.ndo_start_xmit		= streamer_xmit,
 230	.ndo_change_mtu		= streamer_change_mtu,
 231#if STREAMER_IOCTL
 232	.ndo_do_ioctl		= streamer_ioctl,
 233#endif
 234	.ndo_set_multicast_list = streamer_set_rx_mode,
 235	.ndo_set_mac_address	= streamer_set_mac_address,
 236};
 237
 238static int __devinit streamer_init_one(struct pci_dev *pdev,
 239				       const struct pci_device_id *ent)
 240{
 241	struct net_device *dev;
 242	struct streamer_private *streamer_priv;
 243	unsigned long pio_start, pio_end, pio_flags, pio_len;
 244	unsigned long mmio_start, mmio_end, mmio_flags, mmio_len;
 245	int rc = 0;
 246	static int card_no=-1;
 247	u16 pcr;
 248
 249#if STREAMER_DEBUG
 250	printk("lanstreamer::streamer_init_one, entry pdev %p\n",pdev);
 251#endif
 252
 253	card_no++;
 254	dev = alloc_trdev(sizeof(*streamer_priv));
 255	if (dev==NULL) {
 256		printk(KERN_ERR "lanstreamer: out of memory.\n");
 257		return -ENOMEM;
 258	}
 259
 260	streamer_priv = netdev_priv(dev);
 261
 262#if STREAMER_NETWORK_MONITOR
 263#ifdef CONFIG_PROC_FS
 264	if (!dev_streamer)
 265		create_proc_read_entry("streamer_tr", 0, init_net.proc_net,
 266					streamer_proc_info, NULL); 
 267	streamer_priv->next = dev_streamer;
 268	dev_streamer = streamer_priv;
 269#endif
 270#endif
 271
 272	rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
 273	if (rc) {
 274		printk(KERN_ERR "%s: No suitable PCI mapping available.\n",
 275				dev->name);
 276		rc = -ENODEV;
 277		goto err_out;
 278	}
 279
 280	rc = pci_enable_device(pdev);
 281	if (rc) {
 282		printk(KERN_ERR "lanstreamer: unable to enable pci device\n");
 283		rc=-EIO;
 284		goto err_out;
 285	}
 286
 287	pci_set_master(pdev);
 288
 289	rc = pci_set_mwi(pdev);
 290	if (rc) {
 291		printk(KERN_ERR "lanstreamer: unable to enable MWI on pci device\n");
 292		goto err_out_disable;
 293	}
 294
 295	pio_start = pci_resource_start(pdev, 0);
 296	pio_end = pci_resource_end(pdev, 0);
 297	pio_flags = pci_resource_flags(pdev, 0);
 298	pio_len = pci_resource_len(pdev, 0);
 299
 300	mmio_start = pci_resource_start(pdev, 1);
 301	mmio_end = pci_resource_end(pdev, 1);
 302	mmio_flags = pci_resource_flags(pdev, 1);
 303	mmio_len = pci_resource_len(pdev, 1);
 304
 305#if STREAMER_DEBUG
 306	printk("lanstreamer: pio_start %x pio_end %x pio_len %x pio_flags %x\n",
 307		pio_start, pio_end, pio_len, pio_flags);
 308	printk("lanstreamer: mmio_start %x mmio_end %x mmio_len %x mmio_flags %x\n",
 309		mmio_start, mmio_end, mmio_flags, mmio_len);
 310#endif
 311
 312	if (!request_region(pio_start, pio_len, "lanstreamer")) {
 313		printk(KERN_ERR "lanstreamer: unable to get pci io addr %lx\n",
 314			pio_start);
 315		rc= -EBUSY;
 316		goto err_out_mwi;
 317	}
 318
 319	if (!request_mem_region(mmio_start, mmio_len, "lanstreamer")) {
 320		printk(KERN_ERR "lanstreamer: unable to get pci mmio addr %lx\n",
 321			mmio_start);
 322		rc= -EBUSY;
 323		goto err_out_free_pio;
 324	}
 325
 326	streamer_priv->streamer_mmio=ioremap(mmio_start, mmio_len);
 327	if (streamer_priv->streamer_mmio == NULL) {
 328		printk(KERN_ERR "lanstreamer: unable to remap MMIO %lx\n",
 329			mmio_start);
 330		rc= -EIO;
 331		goto err_out_free_mmio;
 332	}
 333
 334	init_waitqueue_head(&streamer_priv->srb_wait);
 335	init_waitqueue_head(&streamer_priv->trb_wait);
 336
 337	dev->netdev_ops = &streamer_netdev_ops;
 338	dev->irq = pdev->irq;
 339	dev->base_addr=pio_start;
 340	SET_NETDEV_DEV(dev, &pdev->dev);
 341
 342	streamer_priv->streamer_card_name = (char *)pdev->resource[0].name;
 343	streamer_priv->pci_dev = pdev;
 344
 345	if ((pkt_buf_sz[card_no] < 100) || (pkt_buf_sz[card_no] > 18000))
 346		streamer_priv->pkt_buf_sz = PKT_BUF_SZ;
 347	else
 348		streamer_priv->pkt_buf_sz = pkt_buf_sz[card_no];
 349
 350	streamer_priv->streamer_ring_speed = ringspeed[card_no];
 351	streamer_priv->streamer_message_level = message_level[card_no];
 352
 353	pci_set_drvdata(pdev, dev);
 354
 355	spin_lock_init(&streamer_priv->streamer_lock);
 356
 357	pci_read_config_word (pdev, PCI_COMMAND, &pcr);
 358	pcr |= PCI_COMMAND_SERR;
 359	pci_write_config_word (pdev, PCI_COMMAND, pcr);
 360
 361	printk("%s\n", version);
 362	printk("%s: %s. I/O at %hx, MMIO at %p, using irq %d\n",dev->name,
 363		streamer_priv->streamer_card_name,
 364		(unsigned int) dev->base_addr,
 365		streamer_priv->streamer_mmio, 
 366		dev->irq);
 367
 368	if (streamer_reset(dev))
 369		goto err_out_unmap;
 370
 371	rc = register_netdev(dev);
 372	if (rc)
 373		goto err_out_unmap;
 374	return 0;
 375
 376err_out_unmap:
 377	iounmap(streamer_priv->streamer_mmio);
 378err_out_free_mmio:
 379	release_mem_region(mmio_start, mmio_len);
 380err_out_free_pio:
 381	release_region(pio_start, pio_len);
 382err_out_mwi:
 383	pci_clear_mwi(pdev);
 384err_out_disable:
 385	pci_disable_device(pdev);
 386err_out:
 387	free_netdev(dev);
 388#if STREAMER_DEBUG
 389	printk("lanstreamer: Exit error %x\n",rc);
 390#endif
 391	return rc;
 392}
 393
 394static void __devexit streamer_remove_one(struct pci_dev *pdev)
 395{
 396	struct net_device *dev=pci_get_drvdata(pdev);
 397	struct streamer_private *streamer_priv;
 398
 399#if STREAMER_DEBUG
 400	printk("lanstreamer::streamer_remove_one entry pdev %p\n",pdev);
 401#endif
 402
 403	if (dev == NULL) {
 404		printk(KERN_ERR "lanstreamer::streamer_remove_one, ERROR dev is NULL\n");
 405		return;
 406	}
 407
 408	streamer_priv=netdev_priv(dev);
 409	if (streamer_priv == NULL) {
 410		printk(KERN_ERR "lanstreamer::streamer_remove_one, ERROR dev->priv is NULL\n");
 411		return;
 412	}
 413
 414#if STREAMER_NETWORK_MONITOR
 415#ifdef CONFIG_PROC_FS
 416	{
 417		struct streamer_private **p, **next;
 418
 419		for (p = &dev_streamer; *p; p = next) {
 420			next = &(*p)->next;
 421			if (*p == streamer_priv) {
 422				*p = *next;
 423				break;
 424			}
 425		}
 426		if (!dev_streamer)
 427			remove_proc_entry("streamer_tr", init_net.proc_net);
 428	}
 429#endif
 430#endif
 431
 432	unregister_netdev(dev);
 433	iounmap(streamer_priv->streamer_mmio);
 434	release_mem_region(pci_resource_start(pdev, 1), pci_resource_len(pdev,1));
 435	release_region(pci_resource_start(pdev, 0), pci_resource_len(pdev,0));
 436	pci_clear_mwi(pdev);
 437	pci_disable_device(pdev);
 438	free_netdev(dev);
 439	pci_set_drvdata(pdev, NULL);
 440}
 441
 442
 443static int streamer_reset(struct net_device *dev)
 444{
 445	struct streamer_private *streamer_priv;
 446	__u8 __iomem *streamer_mmio;
 447	unsigned long t;
 448	unsigned int uaa_addr;
 449	struct sk_buff *skb = NULL;
 450	__u16 misr;
 451
 452	streamer_priv = netdev_priv(dev);
 453	streamer_mmio = streamer_priv->streamer_mmio;
 454
 455	writew(readw(streamer_mmio + BCTL) | BCTL_SOFTRESET, streamer_mmio + BCTL);
 456	t = jiffies;
 457	/* Hold soft reset bit for a while */
 458	ssleep(1);
 459	
 460	writew(readw(streamer_mmio + BCTL) & ~BCTL_SOFTRESET,
 461	       streamer_mmio + BCTL);
 462
 463#if STREAMER_DEBUG
 464	printk("BCTL: %x\n", readw(streamer_mmio + BCTL));
 465	printk("GPR: %x\n", readw(streamer_mmio + GPR));
 466	printk("SISRMASK: %x\n", readw(streamer_mmio + SISR_MASK));
 467#endif
 468	writew(readw(streamer_mmio + BCTL) | (BCTL_RX_FIFO_8 | BCTL_TX_FIFO_8), streamer_mmio + BCTL );
 469
 470	if (streamer_priv->streamer_ring_speed == 0) {	/* Autosense */
 471		writew(readw(streamer_mmio + GPR) | GPR_AUTOSENSE,
 472		       streamer_mmio + GPR);
 473		if (streamer_priv->streamer_message_level)
 474			printk(KERN_INFO "%s: Ringspeed autosense mode on\n",
 475			       dev->name);
 476	} else if (streamer_priv->streamer_ring_speed == 16) {
 477		if (streamer_priv->streamer_message_level)
 478			printk(KERN_INFO "%s: Trying to open at 16 Mbps as requested\n",
 479			       dev->name);
 480		writew(GPR_16MBPS, streamer_mmio + GPR);
 481	} else if (streamer_priv->streamer_ring_speed == 4) {
 482		if (streamer_priv->streamer_message_level)
 483			printk(KERN_INFO "%s: Trying to open at 4 Mbps as requested\n",
 484			       dev->name);
 485		writew(0, streamer_mmio + GPR);
 486	}
 487
 488	skb = dev_alloc_skb(streamer_priv->pkt_buf_sz);
 489	if (!skb) {
 490		printk(KERN_INFO "%s: skb allocation for diagnostics failed...proceeding\n",
 491		       dev->name);
 492	} else {
 493	        struct streamer_rx_desc *rx_ring;
 494                u8 *data;
 495
 496		rx_ring=(struct streamer_rx_desc *)skb->data;
 497		data=((u8 *)skb->data)+sizeof(struct streamer_rx_desc);
 498		rx_ring->forward=0;
 499		rx_ring->status=0;
 500		rx_ring->buffer=cpu_to_le32(pci_map_single(streamer_priv->pci_dev, data, 
 501							512, PCI_DMA_FROMDEVICE));
 502		rx_ring->framelen_buflen=512; 
 503		writel(cpu_to_le32(pci_map_single(streamer_priv->pci_dev, rx_ring, 512, PCI_DMA_FROMDEVICE)),
 504			streamer_mmio+RXBDA);
 505	}
 506
 507#if STREAMER_DEBUG
 508	printk("GPR = %x\n", readw(streamer_mmio + GPR));
 509#endif
 510	/* start solo init */
 511	writew(SISR_MI, streamer_mmio + SISR_MASK_SUM);
 512
 513	while (!((readw(streamer_mmio + SISR)) & SISR_SRB_REPLY)) {
 514		msleep_interruptible(100);
 515		if (time_after(jiffies, t + 40 * HZ)) {
 516			printk(KERN_ERR
 517			       "IBM PCI tokenring card not responding\n");
 518			release_region(dev->base_addr, STREAMER_IO_SPACE);
 519			if (skb)
 520				dev_kfree_skb(skb);
 521			return -1;
 522		}
 523	}
 524	writew(~SISR_SRB_REPLY, streamer_mmio + SISR_RUM);
 525	misr = readw(streamer_mmio + MISR_RUM);
 526	writew(~misr, streamer_mmio + MISR_RUM);
 527
 528	if (skb)
 529		dev_kfree_skb(skb);	/* release skb used for diagnostics */
 530
 531#if STREAMER_DEBUG
 532	printk("LAPWWO: %x, LAPA: %x LAPE:  %x\n",
 533	       readw(streamer_mmio + LAPWWO), readw(streamer_mmio + LAPA),
 534	       readw(streamer_mmio + LAPE));
 535#endif
 536
 537#if STREAMER_DEBUG
 538	{
 539		int i;
 540		writew(readw(streamer_mmio + LAPWWO),
 541		       streamer_mmio + LAPA);
 542		printk("initialization response srb dump: ");
 543		for (i = 0; i < 10; i++)
 544			printk("%x:",
 545			       ntohs(readw(streamer_mmio + LAPDINC)));
 546		printk("\n");
 547	}
 548#endif
 549
 550	writew(readw(streamer_mmio + LAPWWO) + 6, streamer_mmio + LAPA);
 551	if (readw(streamer_mmio + LAPD)) {
 552		printk(KERN_INFO "tokenring card initialization failed. errorcode : %x\n",
 553		       ntohs(readw(streamer_mmio + LAPD)));
 554		release_region(dev->base_addr, STREAMER_IO_SPACE);
 555		return -1;
 556	}
 557
 558	writew(readw(streamer_mmio + LAPWWO) + 8, streamer_mmio + LAPA);
 559	uaa_addr = ntohs(readw(streamer_mmio + LAPDINC));
 560	readw(streamer_mmio + LAPDINC);	/* skip over Level.Addr field */
 561	streamer_priv->streamer_addr_table_addr = ntohs(readw(streamer_mmio + LAPDINC));
 562	streamer_priv->streamer_parms_addr = ntohs(readw(streamer_mmio + LAPDINC));
 563
 564#if STREAMER_DEBUG
 565	printk("UAA resides at %x\n", uaa_addr);
 566#endif
 567
 568	/* setup uaa area for access with LAPD */
 569	{
 570		int i;
 571		__u16 addr;
 572		writew(uaa_addr, streamer_mmio + LAPA);
 573		for (i = 0; i < 6; i += 2) {
 574		        addr=ntohs(readw(streamer_mmio+LAPDINC));
 575			dev->dev_addr[i]= (addr >> 8) & 0xff;
 576			dev->dev_addr[i+1]= addr & 0xff;
 577		}
 578#if STREAMER_DEBUG
 579		printk("Adapter address: %pM\n", dev->dev_addr);
 580#endif
 581	}
 582	return 0;
 583}
 584
 585static int streamer_open(struct net_device *dev)
 586{
 587	struct streamer_private *streamer_priv = netdev_priv(dev);
 588	__u8 __iomem *streamer_mmio = streamer_priv->streamer_mmio;
 589	unsigned long flags;
 590	char open_error[255];
 591	int i, open_finished = 1;
 592	__u16 srb_word;
 593	__u16 srb_open;
 594	int rc;
 595
 596	if (readw(streamer_mmio+BMCTL_SUM) & BMCTL_RX_ENABLED) {
 597	        rc=streamer_reset(dev);
 598	}
 599
 600	if (request_irq(dev->irq, streamer_interrupt, IRQF_SHARED, "lanstreamer", dev)) {
 601		return -EAGAIN;
 602	}
 603#if STREAMER_DEBUG
 604	printk("BMCTL: %x\n", readw(streamer_mmio + BMCTL_SUM));
 605	printk("pending ints: %x\n", readw(streamer_mmio + SISR));
 606#endif
 607
 608	writew(SISR_MI | SISR_SRB_REPLY, streamer_mmio + SISR_MASK);	/* more ints later, doesn't stop arb cmd interrupt */
 609	writew(LISR_LIE, streamer_mmio + LISR);	/* more ints later */
 610
 611	/* adapter is closed, so SRB is pointed to by LAPWWO */
 612	writew(readw(streamer_mmio + LAPWWO), streamer_mmio + LAPA);
 613
 614#if STREAMER_DEBUG
 615	printk("LAPWWO: %x, LAPA: %x\n", readw(streamer_mmio + LAPWWO),
 616	       readw(streamer_mmio + LAPA));
 617	printk("LAPE: %x\n", readw(streamer_mmio + LAPE));
 618	printk("SISR Mask = %04x\n", readw(streamer_mmio + SISR_MASK));
 619#endif
 620	do {
 621		for (i = 0; i < SRB_COMMAND_SIZE; i += 2) {
 622			writew(0, streamer_mmio + LAPDINC);
 623		}
 624
 625		writew(readw(streamer_mmio+LAPWWO),streamer_mmio+LAPA);
 626		writew(htons(SRB_OPEN_ADAPTER<<8),streamer_mmio+LAPDINC) ; 	/* open */
 627		writew(htons(STREAMER_CLEAR_RET_CODE<<8),streamer_mmio+LAPDINC);
 628		writew(STREAMER_CLEAR_RET_CODE, streamer_mmio + LAPDINC);
 629
 630		writew(readw(streamer_mmio + LAPWWO) + 8, streamer_mmio + LAPA);
 631#if STREAMER_NETWORK_MONITOR
 632		/* If Network Monitor, instruct card to copy MAC frames through the ARB */
 633		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 */
 634#else
 635		writew(htons(OPEN_ADAPTER_ENABLE_FDX), streamer_mmio + LAPDINC);	/* Offset 8 word contains Open.Options */
 636#endif
 637
 638		if (streamer_priv->streamer_laa[0]) {
 639			writew(readw(streamer_mmio + LAPWWO) + 12, streamer_mmio + LAPA);
 640			writew(htons((streamer_priv->streamer_laa[0] << 8) | 
 641				     streamer_priv->streamer_laa[1]),streamer_mmio+LAPDINC);
 642			writew(htons((streamer_priv->streamer_laa[2] << 8) | 
 643				     streamer_priv->streamer_laa[3]),streamer_mmio+LAPDINC);
 644			writew(htons((streamer_priv->streamer_laa[4] << 8) | 
 645				     streamer_priv->streamer_laa[5]),streamer_mmio+LAPDINC);
 646			memcpy(dev->dev_addr, streamer_priv->streamer_laa, dev->addr_len);
 647		}
 648
 649		/* save off srb open offset */
 650		srb_open = readw(streamer_mmio + LAPWWO);
 651#if STREAMER_DEBUG
 652		writew(readw(streamer_mmio + LAPWWO),
 653		       streamer_mmio + LAPA);
 654		printk("srb open request:\n");
 655		for (i = 0; i < 16; i++) {
 656			printk("%x:", ntohs(readw(streamer_mmio + LAPDINC)));
 657		}
 658		printk("\n");
 659#endif
 660		spin_lock_irqsave(&streamer_priv->streamer_lock, flags);
 661		streamer_priv->srb_queued = 1;
 662
 663		/* signal solo that SRB command has been issued */
 664		writew(LISR_SRB_CMD, streamer_mmio + LISR_SUM);
 665		spin_unlock_irqrestore(&streamer_priv->streamer_lock, flags);
 666
 667		while (streamer_priv->srb_queued) {
 668			interruptible_sleep_on_timeout(&streamer_priv->srb_wait, 5 * HZ);
 669			if (signal_pending(current)) {
 670				printk(KERN_WARNING "%s: SRB timed out.\n", dev->name);
 671				printk(KERN_WARNING "SISR=%x MISR=%x, LISR=%x\n",
 672				       readw(streamer_mmio + SISR),
 673				       readw(streamer_mmio + MISR_RUM),
 674				       readw(streamer_mmio + LISR));
 675				streamer_priv->srb_queued = 0;
 676				break;
 677			}
 678		}
 679
 680#if STREAMER_DEBUG
 681		printk("SISR_MASK: %x\n", readw(streamer_mmio + SISR_MASK));
 682		printk("srb open response:\n");
 683		writew(srb_open, streamer_mmio + LAPA);
 684		for (i = 0; i < 10; i++) {
 685			printk("%x:",
 686			       ntohs(readw(streamer_mmio + LAPDINC)));
 687		}
 688#endif
 689
 690		/* If we get the same return response as we set, the interrupt wasn't raised and the open
 691		 * timed out.
 692		 */
 693		writew(srb_open + 2, streamer_mmio + LAPA);
 694		srb_word = ntohs(readw(streamer_mmio + LAPD)) >> 8;
 695		if (srb_word == STREAMER_CLEAR_RET_CODE) {
 696			printk(KERN_WARNING "%s: Adapter Open time out or error.\n",
 697			       dev->name);
 698			return -EIO;
 699		}
 700
 701		if (srb_word != 0) {
 702			if (srb_word == 0x07) {
 703				if (!streamer_priv->streamer_ring_speed && open_finished) {	/* Autosense , first time around */
 704					printk(KERN_WARNING "%s: Retrying at different ring speed\n",
 705					       dev->name);
 706					open_finished = 0;
 707				} else {
 708					__u16 error_code;
 709
 710					writew(srb_open + 6, streamer_mmio + LAPA);
 711					error_code = ntohs(readw(streamer_mmio + LAPD));
 712					strcpy(open_error, open_maj_error[(error_code & 0xf0) >> 4]);
 713					strcat(open_error, " - ");
 714					strcat(open_error, open_min_error[(error_code & 0x0f)]);
 715
 716					if (!streamer_priv->streamer_ring_speed &&
 717					    ((error_code & 0x0f) == 0x0d))
 718					{
 719						printk(KERN_WARNING "%s: Tried to autosense ring speed with no monitors present\n", dev->name);
 720						printk(KERN_WARNING "%s: Please try again with a specified ring speed\n", dev->name);
 721						free_irq(dev->irq, dev);
 722						return -EIO;
 723					}
 724
 725					printk(KERN_WARNING "%s: %s\n",
 726					       dev->name, open_error);
 727					free_irq(dev->irq, dev);
 728					return -EIO;
 729
 730				}	/* if autosense && open_finished */
 731			} else {
 732				printk(KERN_WARNING "%s: Bad OPEN response: %x\n",
 733				       dev->name, srb_word);
 734				free_irq(dev->irq, dev);
 735				return -EIO;
 736			}
 737		} else
 738			open_finished = 1;
 739	} while (!(open_finished));	/* Will only loop if ring speed mismatch re-open attempted && autosense is on */
 740
 741	writew(srb_open + 18, streamer_mmio + LAPA);
 742	srb_word=ntohs(readw(streamer_mmio+LAPD)) >> 8;
 743	if (srb_word & (1 << 3))
 744		if (streamer_priv->streamer_message_level)
 745			printk(KERN_INFO "%s: Opened in FDX Mode\n", dev->name);
 746
 747	if (srb_word & 1)
 748		streamer_priv->streamer_ring_speed = 16;
 749	else
 750		streamer_priv->streamer_ring_speed = 4;
 751
 752	if (streamer_priv->streamer_message_level)
 753		printk(KERN_INFO "%s: Opened in %d Mbps mode\n", 
 754			dev->name,
 755			streamer_priv->streamer_ring_speed);
 756
 757	writew(srb_open + 8, streamer_mmio + LAPA);
 758	streamer_priv->asb = ntohs(readw(streamer_mmio + LAPDINC));
 759	streamer_priv->srb = ntohs(readw(streamer_mmio + LAPDINC));
 760	streamer_priv->arb = ntohs(readw(streamer_mmio + LAPDINC));
 761	readw(streamer_mmio + LAPDINC);	/* offset 14 word is rsvd */
 762	streamer_priv->trb = ntohs(readw(streamer_mmio + LAPDINC));
 763
 764	streamer_priv->streamer_receive_options = 0x00;
 765	streamer_priv->streamer_copy_all_options = 0;
 766
 767	/* setup rx ring */
 768	/* enable rx channel */
 769	writew(~BMCTL_RX_DIS, streamer_mmio + BMCTL_RUM);
 770
 771	/* setup rx descriptors */
 772	streamer_priv->streamer_rx_ring=
 773	    kmalloc( sizeof(struct streamer_rx_desc)*
 774		     STREAMER_RX_RING_SIZE,GFP_KERNEL);
 775	if (!streamer_priv->streamer_rx_ring) {
 776	    printk(KERN_WARNING "%s ALLOC of streamer rx ring FAILED!!\n",dev->name);
 777	    return -EIO;
 778	}
 779
 780	for (i = 0; i < STREAMER_RX_RING_SIZE; i++) {
 781		struct sk_buff *skb;
 782
 783		skb = dev_alloc_skb(streamer_priv->pkt_buf_sz);
 784		if (skb == NULL)
 785			break;
 786
 787		skb->dev = dev;
 788
 789		streamer_priv->streamer_rx_ring[i].forward = 
 790			cpu_to_le32(pci_map_single(streamer_priv->pci_dev, &streamer_priv->streamer_rx_ring[i + 1],
 791					sizeof(struct streamer_rx_desc), PCI_DMA_FROMDEVICE));
 792		streamer_priv->streamer_rx_ring[i].status = 0;
 793		streamer_priv->streamer_rx_ring[i].buffer = 
 794			cpu_to_le32(pci_map_single(streamer_priv->pci_dev, skb->data,
 795					      streamer_priv->pkt_buf_sz, PCI_DMA_FROMDEVICE));
 796		streamer_priv->streamer_rx_ring[i].framelen_buflen = streamer_priv->pkt_buf_sz;
 797		streamer_priv->rx_ring_skb[i] = skb;
 798	}
 799	streamer_priv->streamer_rx_ring[STREAMER_RX_RING_SIZE - 1].forward =
 800				cpu_to_le32(pci_map_single(streamer_priv->pci_dev, &streamer_priv->streamer_rx_ring[0],
 801						sizeof(struct streamer_rx_desc), PCI_DMA_FROMDEVICE));
 802
 803	if (i == 0) {
 804		printk(KERN_WARNING "%s: Not enough memory to allocate rx buffers. Adapter disabled\n", dev->name);
 805		free_irq(dev->irq, dev);
 806		return -EIO;
 807	}
 808
 809	streamer_priv->rx_ring_last_received = STREAMER_RX_RING_SIZE - 1;	/* last processed rx status */
 810
 811	writel(cpu_to_le32(pci_map_single(streamer_priv->pci_dev, &streamer_priv->streamer_rx_ring[0],
 812				sizeof(struct streamer_rx_desc), PCI_DMA_TODEVICE)), 
 813		streamer_mmio + RXBDA);
 814	writel(cpu_to_le32(pci_map_single(streamer_priv->pci_dev, &streamer_priv->streamer_rx_ring[STREAMER_RX_RING_SIZE - 1],
 815				sizeof(struct streamer_rx_desc), PCI_DMA_TODEVICE)), 
 816		streamer_mmio + RXLBDA);
 817
 818	/* set bus master interrupt event mask */
 819	writew(MISR_RX_NOBUF | MISR_RX_EOF, streamer_mmio + MISR_MASK);
 820
 821
 822	/* setup tx ring */
 823	streamer_priv->streamer_tx_ring=kmalloc(sizeof(struct streamer_tx_desc)*
 824						STREAMER_TX_RING_SIZE,GFP_KERNEL);
 825	if (!streamer_priv->streamer_tx_ring) {
 826	    printk(KERN_WARNING "%s ALLOC of streamer_tx_ring FAILED\n",dev->name);
 827	    return -EIO;
 828	}
 829
 830	writew(~BMCTL_TX2_DIS, streamer_mmio + BMCTL_RUM);	/* Enables TX channel 2 */
 831	for (i = 0; i < STREAMER_TX_RING_SIZE; i++) {
 832		streamer_priv->streamer_tx_ring[i].forward = cpu_to_le32(pci_map_single(streamer_priv->pci_dev, 
 833										&streamer_priv->streamer_tx_ring[i + 1],
 834										sizeof(struct streamer_tx_desc),
 835										PCI_DMA_TODEVICE));
 836		streamer_priv->streamer_tx_ring[i].status = 0;
 837		streamer_priv->streamer_tx_ring[i].bufcnt_framelen = 0;
 838		streamer_priv->streamer_tx_ring[i].buffer = 0;
 839		streamer_priv->streamer_tx_ring[i].buflen = 0;
 840		streamer_priv->streamer_tx_ring[i].rsvd1 = 0;
 841		streamer_priv->streamer_tx_ring[i].rsvd2 = 0;
 842		streamer_priv->streamer_tx_ring[i].rsvd3 = 0;
 843	}
 844	streamer_priv->streamer_tx_ring[STREAMER_TX_RING_SIZE - 1].forward =
 845					cpu_to_le32(pci_map_single(streamer_priv->pci_dev, &streamer_priv->streamer_tx_ring[0],
 846							sizeof(struct streamer_tx_desc), PCI_DMA_TODEVICE));
 847
 848	streamer_priv->free_tx_ring_entries = STREAMER_TX_RING_SIZE;
 849	streamer_priv->tx_ring_free = 0;	/* next entry in tx ring to use */
 850	streamer_priv->tx_ring_last_status = STREAMER_TX_RING_SIZE - 1;
 851
 852	/* set Busmaster interrupt event mask (handle receives on interrupt only */
 853	writew(MISR_TX2_EOF | MISR_RX_NOBUF | MISR_RX_EOF, streamer_mmio + MISR_MASK);
 854	/* set system event interrupt mask */
 855	writew(SISR_ADAPTER_CHECK | SISR_ARB_CMD | SISR_TRB_REPLY | SISR_ASB_FREE, streamer_mmio + SISR_MASK_SUM);
 856
 857#if STREAMER_DEBUG
 858	printk("BMCTL: %x\n", readw(streamer_mmio + BMCTL_SUM));
 859	printk("SISR MASK: %x\n", readw(streamer_mmio + SISR_MASK));
 860#endif
 861
 862#if STREAMER_NETWORK_MONITOR
 863
 864	writew(streamer_priv->streamer_addr_table_addr, streamer_mmio + LAPA);
 865	printk("%s: Node Address: %04x:%04x:%04x\n", dev->name,
 866		ntohs(readw(streamer_mmio + LAPDINC)),
 867		ntohs(readw(streamer_mmio + LAPDINC)),
 868		ntohs(readw(streamer_mmio + LAPDINC)));
 869	readw(streamer_mmio + LAPDINC);
 870	readw(streamer_mmio + LAPDINC);
 871	printk("%s: Functional Address: %04x:%04x\n", dev->name,
 872		ntohs(readw(streamer_mmio + LAPDINC)),
 873		ntohs(readw(streamer_mmio + LAPDINC)));
 874
 875	writew(streamer_priv->streamer_parms_addr + 4,
 876		streamer_mmio + LAPA);
 877	printk("%s: NAUN Address: %04x:%04x:%04x\n", dev->name,
 878		ntohs(readw(streamer_mmio + LAPDINC)),
 879		ntohs(readw(streamer_mmio + LAPDINC)),
 880		ntohs(readw(streamer_mmio + LAPDINC)));
 881#endif
 882
 883	netif_start_queue(dev);
 884	netif_carrier_on(dev);
 885	return 0;
 886}
 887
 888/*
 889 *	When we enter the rx routine we do not know how many frames have been 
 890 *	queued on the rx channel.  Therefore we start at the next rx status
 891 *	position and travel around the receive ring until we have completed
 892 *	all the frames.
 893 *
 894 *	This means that we may process the frame before we receive the end
 895 *	of frame interrupt. This is why we always test the status instead
 896 *	of blindly processing the next frame.
 897 *	
 898 */
 899static void streamer_rx(struct net_device *dev)
 900{
 901	struct streamer_private *streamer_priv =
 902	    netdev_priv(dev);
 903	__u8 __iomem *streamer_mmio = streamer_priv->streamer_mmio;
 904	struct streamer_rx_desc *rx_desc;
 905	int rx_ring_last_received, length, frame_length, buffer_cnt = 0;
 906	struct sk_buff *skb, *skb2;
 907
 908	/* setup the next rx descriptor to be received */
 909	rx_desc = &streamer_priv->streamer_rx_ring[(streamer_priv->rx_ring_last_received + 1) & (STREAMER_RX_RING_SIZE - 1)];
 910	rx_ring_last_received = streamer_priv->rx_ring_last_received;
 911
 912	while (rx_desc->status & 0x01000000) {	/* While processed descriptors are available */
 913		if (rx_ring_last_received != streamer_priv->rx_ring_last_received) 
 914		{
 915			printk(KERN_WARNING "RX Error 1 rx_ring_last_received not the same %x %x\n",
 916				rx_ring_last_received, streamer_priv->rx_ring_last_received);
 917		}
 918		streamer_priv->rx_ring_last_received = (streamer_priv->rx_ring_last_received + 1) & (STREAMER_RX_RING_SIZE - 1);
 919		rx_ring_last_received = streamer_priv->rx_ring_last_received;
 920
 921		length = rx_desc->framelen_buflen & 0xffff;	/* buffer length */
 922		frame_length = (rx_desc->framelen_buflen >> 16) & 0xffff;
 923
 924		if (rx_desc->status & 0x7E830000) {	/* errors */
 925			if (streamer_priv->streamer_message_level) {
 926				printk(KERN_WARNING "%s: Rx Error %x\n",
 927				       dev->name, rx_desc->status);
 928			}
 929		} else {	/* received without errors */
 930			if (rx_desc->status & 0x80000000) {	/* frame complete */
 931				buffer_cnt = 1;
 932				skb = dev_alloc_skb(streamer_priv->pkt_buf_sz);
 933			} else {
 934				skb = dev_alloc_skb(frame_length);
 935			}
 936
 937			if (skb == NULL) 
 938			{
 939				printk(KERN_WARNING "%s: Not enough memory to copy packet to upper layers.\n",	dev->name);
 940				dev->stats.rx_dropped++;
 941			} else {	/* we allocated an skb OK */
 942				if (buffer_cnt == 1) {
 943					/* release the DMA mapping */
 944					pci_unmap_single(streamer_priv->pci_dev, 
 945						le32_to_cpu(streamer_priv->streamer_rx_ring[rx_ring_last_received].buffer),
 946						streamer_priv->pkt_buf_sz, 
 947						PCI_DMA_FROMDEVICE);
 948					skb2 = streamer_priv->rx_ring_skb[rx_ring_last_received];
 949#if STREAMER_DEBUG_PACKETS
 950					{
 951						int i;
 952						printk("streamer_rx packet print: skb->data2 %p  skb->head %p\n", skb2->data, skb2->head);
 953						for (i = 0; i < frame_length; i++) 
 954						{
 955							printk("%x:", skb2->data[i]);
 956							if (((i + 1) % 16) == 0)
 957								printk("\n");
 958						}
 959						printk("\n");
 960					}
 961#endif
 962					skb_put(skb2, length);
 963					skb2->protocol = tr_type_trans(skb2, dev);
 964					/* recycle this descriptor */
 965					streamer_priv->streamer_rx_ring[rx_ring_last_received].status = 0;
 966					streamer_priv->streamer_rx_ring[rx_ring_last_received].framelen_buflen = streamer_priv->pkt_buf_sz;
 967					streamer_priv->streamer_rx_ring[rx_ring_last_received].buffer = 
 968						cpu_to_le32(pci_map_single(streamer_priv->pci_dev, skb->data, streamer_priv->pkt_buf_sz,
 969								PCI_DMA_FROMDEVICE));
 970					streamer_priv->rx_ring_skb[rx_ring_last_received] = skb;
 971					/* place recycled descriptor back on the adapter */
 972					writel(cpu_to_le32(pci_map_single(streamer_priv->pci_dev, 
 973									&streamer_priv->streamer_rx_ring[rx_ring_last_received],
 974									sizeof(struct streamer_rx_desc), PCI_DMA_FROMDEVICE)),
 975						streamer_mmio + RXLBDA);
 976					/* pass the received skb up to the protocol */
 977					netif_rx(skb2);
 978				} else {
 979					do {	/* Walk the buffers */
 980						pci_unmap_single(streamer_priv->pci_dev, le32_to_cpu(rx_desc->buffer), length, PCI_DMA_FROMDEVICE), 
 981						memcpy(skb_put(skb, length), (void *)rx_desc->buffer, length);	/* copy this fragment */
 982						streamer_priv->streamer_rx_ring[rx_ring_last_received].status = 0;
 983						streamer_priv->streamer_rx_ring[rx_ring_last_received].framelen_buflen = streamer_priv->pkt_buf_sz;
 984						
 985						/* give descriptor back to the adapter */
 986						writel(cpu_to_le32(pci_map_single(streamer_priv->pci_dev, 
 987									&streamer_priv->streamer_rx_ring[rx_ring_last_received],
 988									length, PCI_DMA_FROMDEVICE)), 
 989							streamer_mmio + RXLBDA);
 990
 991						if (rx_desc->status & 0x80000000)
 992							break;	/* this descriptor completes the frame */
 993
 994						/* else get the next pending descriptor */
 995						if (rx_ring_last_received!= streamer_priv->rx_ring_last_received)
 996						{
 997							printk("RX Error rx_ring_last_received not the same %x %x\n",
 998								rx_ring_last_received,
 999								streamer_priv->rx_ring_last_received);
1000						}
1001						rx_desc = &streamer_priv->streamer_rx_ring[(streamer_priv->rx_ring_last_received+1) & (STREAMER_RX_RING_SIZE-1)];
1002
1003						length = rx_desc->framelen_buflen & 0xffff;	/* buffer length */
1004						streamer_priv->rx_ring_last_received =	(streamer_priv->rx_ring_last_received+1) & (STREAMER_RX_RING_SIZE - 1);
1005						rx_ring_last_received = streamer_priv->rx_ring_last_received;
1006					} while (1);
1007
1008					skb->protocol = tr_type_trans(skb, dev);
1009					/* send up to the protocol */
1010					netif_rx(skb);
1011				}
1012				dev->stats.rx_packets++;
1013				dev->stats.rx_bytes += length;
1014			}	/* if skb == null */
1015		}		/* end received without errors */
1016
1017		/* try the next one */
1018		rx_desc = &streamer_priv->streamer_rx_ring[(rx_ring_last_received + 1) & (STREAMER_RX_RING_SIZE - 1)];
1019	}			/* end for all completed rx descriptors */
1020}
1021
1022static irqreturn_t streamer_interrupt(int irq, void *dev_id)
1023{
1024	struct net_device *dev = (struct net_device *) dev_id;
1025	struct streamer_private *streamer_priv =
1026	    netdev_priv(dev);
1027	__u8 __iomem *streamer_mmio = streamer_priv->streamer_mmio;
1028	__u16 sisr;
1029	__u16 misr;
1030	u8 max_intr = MAX_INTR;
1031
1032	spin_lock(&streamer_priv->streamer_lock);
1033	sisr = readw(streamer_mmio + SISR);
1034
1035	while((sisr & (SISR_MI | SISR_SRB_REPLY | SISR_ADAPTER_CHECK | SISR_ASB_FREE | 
1036		       SISR_ARB_CMD | SISR_TRB_REPLY | SISR_PAR_ERR | SISR_SERR_ERR)) &&
1037	      (max_intr > 0)) {
1038
1039		if(sisr & SISR_PAR_ERR) {
1040			writew(~SISR_PAR_ERR, streamer_mmio + SISR_RUM);
1041			(void)readw(streamer_mmio + SISR_RUM);
1042		}
1043
1044		else if(sisr & SISR_SERR_ERR) {
1045			writew(~SISR_SERR_ERR, streamer_mmio + SISR_RUM);
1046			(void)readw(streamer_mmio + SISR_RUM);
1047		}
1048
1049		else if(sisr & SISR_MI) {
1050			misr = readw(streamer_mmio + MISR_RUM);
1051
1052		if (misr & MISR_TX2_EOF) {
1053				while(streamer_priv->streamer_tx_ring[(streamer_priv->tx_ring_last_status + 1) & (STREAMER_TX_RING_SIZE - 1)].status) {
1054				streamer_priv->tx_ring_last_status = (streamer_priv->tx_ring_last_status + 1) & (STREAMER_TX_RING_SIZE - 1);
1055				streamer_priv->free_tx_ring_entries++;
1056				dev->stats.tx_bytes += streamer_priv->tx_ring_skb[streamer_priv->tx_ring_last_status]->len;
1057				dev->stats.tx_packets++;
1058				dev_kfree_skb_irq(streamer_priv->tx_ring_skb[streamer_priv->tx_ring_last_status]);
1059				streamer_priv->streamer_tx_ring[streamer_priv->tx_ring_last_status].buffer = 0xdeadbeef;
1060				streamer_priv->streamer_tx_ring[streamer_priv->tx_ring_last_status].status = 0;
1061				streamer_priv->streamer_tx_ring[streamer_priv->tx_ring_last_status].bufcnt_framelen = 0;
1062				streamer_priv->streamer_tx_ring[streamer_priv->tx_ring_last_status].buflen = 0;
1063				streamer_priv->streamer_tx_ring[streamer_priv->tx_ring_last_status].rsvd1 = 0;
1064				streamer_priv->streamer_tx_ring[streamer_priv->tx_ring_last_status].rsvd2 = 0;
1065				streamer_priv->streamer_tx_ring[streamer_priv->tx_ring_last_status].rsvd3 = 0;
1066			}
1067			netif_wake_queue(dev);
1068		}
1069
1070		if (misr & MISR_RX_EOF) {
1071			streamer_rx(dev);
1072		}
1073		/* MISR_RX_EOF */
1074
1075			if (misr & MISR_RX_NOBUF) {
1076				/* According to the documentation, we don't have to do anything,  
1077                                 * but trapping it keeps it out of /var/log/messages.  
1078                                 */
1079			}		/* SISR_RX_NOBUF */
1080
1081			writew(~misr, streamer_mmio + MISR_RUM);
1082			(void)readw(streamer_mmio + MISR_RUM);
1083		}
1084
1085		else if (sisr & SISR_SRB_REPLY) {
1086			if (streamer_priv->srb_queued == 1) {
1087				wake_up_interruptible(&streamer_priv->srb_wait);
1088			} else if (streamer_priv->srb_queued == 2) {
1089				streamer_srb_bh(dev);
1090			}
1091			streamer_priv->srb_queued = 0;
1092
1093			writew(~SISR_SRB_REPLY, streamer_mmio + SISR_RUM);
1094			(void)readw(streamer_mmio + SISR_RUM);
1095		}
1096
1097		else if (sisr & SISR_ADAPTER_CHECK) {
1098			printk(KERN_WARNING "%s: Adapter Check Interrupt Raised, 8 bytes of information follow:\n", dev->name);
1099			writel(readl(streamer_mmio + LAPWWO), streamer_mmio + LAPA);
1100			printk(KERN_WARNING "%s: Words %x:%x:%x:%x:\n",
1101			       dev->name, readw(streamer_mmio + LAPDINC),
1102			       ntohs(readw(streamer_mmio + LAPDINC)),
1103			       ntohs(readw(streamer_mmio + LAPDINC)),
1104			       ntohs(readw(streamer_mmio + LAPDINC)));
1105			netif_stop_queue(dev);
1106			netif_carrier_off(dev);
1107			printk(KERN_WARNING "%s: Adapter must be manually reset.\n", dev->name);
1108		}
1109
1110		/* SISR_ADAPTER_CHECK */
1111		else if (sisr & SISR_ASB_FREE) {
1112			/* Wake up anything that is waiting for the asb response */
1113			if (streamer_priv->asb_queued) {
1114				streamer_asb_bh(dev);
1115			}
1116			writew(~SISR_ASB_FREE, streamer_mmio + SISR_RUM);
1117			(void)readw(streamer_mmio + SISR_RUM);
1118		}
1119		/* SISR_ASB_FREE */
1120		else if (sisr & SISR_ARB_CMD) {
1121			streamer_arb_cmd(dev);
1122			writew(~SISR_ARB_CMD, streamer_mmio + SISR_RUM);
1123			(void)readw(streamer_mmio + SISR_RUM);
1124		}
1125		/* SISR_ARB_CMD */
1126		else if (sisr & SISR_TRB_REPLY) {
1127			/* Wake up anything that is waiting for the trb response */
1128			if (streamer_priv->trb_queued) {
1129				wake_up_interruptible(&streamer_priv->
1130						      trb_wait);
1131			}
1132			streamer_priv->trb_queued = 0;
1133			writew(~SISR_TRB_REPLY, streamer_mmio + SISR_RUM);
1134			(void)readw(streamer_mmio + SISR_RUM);
1135		}
1136		/* SISR_TRB_REPLY */
1137
1138		sisr = readw(streamer_mmio + SISR);
1139		max_intr--;
1140	} /* while() */		
1141
1142	spin_unlock(&streamer_priv->streamer_lock) ; 
1143	return IRQ_HANDLED;
1144}
1145
1146static netdev_tx_t streamer_xmit(struct sk_buff *skb,
1147				       struct net_device *dev)
1148{
1149	struct streamer_private *streamer_priv =
1150	    netdev_priv(dev);
1151	__u8 __iomem *streamer_mmio = streamer_priv->streamer_mmio;
1152	unsigned long flags ;
1153
1154	spin_lock_irqsave(&streamer_priv->streamer_lock, flags);
1155
1156	if (streamer_priv->free_tx_ring_entries) {
1157		streamer_priv->streamer_tx_ring[streamer_priv->tx_ring_free].status = 0;
1158		streamer_priv->streamer_tx_ring[streamer_priv->tx_ring_free].bufcnt_framelen = 0x00020000 | skb->len;
1159		streamer_priv->streamer_tx_ring[streamer_priv->tx_ring_free].buffer = 
1160			cpu_to_le32(pci_map_single(streamer_priv->pci_dev, skb->data, skb->len, PCI_DMA_TODEVICE));
1161		streamer_priv->streamer_tx_ring[streamer_priv->tx_ring_free].rsvd1 = skb->len;
1162		streamer_priv->streamer_tx_ring[streamer_priv->tx_ring_free].rsvd2 = 0;
1163		streamer_priv->streamer_tx_ring[streamer_priv->tx_ring_free].rsvd3 = 0;
1164		streamer_priv->streamer_tx_ring[streamer_priv->tx_ring_free].buflen = skb->len;
1165
1166		streamer_priv->tx_ring_skb[streamer_priv->tx_ring_free] = skb;
1167		streamer_priv->free_tx_ring_entries--;
1168#if STREAMER_DEBUG_PACKETS
1169		{
1170			int i;
1171			printk("streamer_xmit packet print:\n");
1172			for (i = 0; i < skb->len; i++) {
1173				printk("%x:", skb->data[i]);
1174				if (((i + 1) % 16) == 0)
1175					printk("\n");
1176			}
1177			printk("\n");
1178		}
1179#endif
1180
1181		writel(cpu_to_le32(pci_map_single(streamer_priv->pci_dev, 
1182					&streamer_priv->streamer_tx_ring[streamer_priv->tx_ring_free],
1183					sizeof(struct streamer_tx_desc), PCI_DMA_TODEVICE)),
1184			streamer_mmio + TX2LFDA);
1185		(void)readl(streamer_mmio + TX2LFDA);
1186
1187		streamer_priv->tx_ring_free = (streamer_priv->tx_ring_free + 1) & (STREAMER_TX_RING_SIZE - 1);
1188		spin_unlock_irqrestore(&streamer_priv->streamer_lock,flags);
1189		return NETDEV_TX_OK;
1190	} else {
1191	        netif_stop_queue(dev);
1192	        spin_unlock_irqrestore(&streamer_priv->streamer_lock,flags);
1193		return NETDEV_TX_BUSY;
1194	}
1195}
1196
1197
1198static int streamer_close(struct net_device *dev)
1199{
1200	struct streamer_private *streamer_priv =
1201	    netdev_priv(dev);
1202	__u8 __iomem *streamer_mmio = streamer_priv->streamer_mmio;
1203	unsigned long flags;
1204	int i;
1205
1206	netif_stop_queue(dev);
1207	netif_carrier_off(dev);
1208	writew(streamer_priv->srb, streamer_mmio + LAPA);
1209	writew(htons(SRB_CLOSE_ADAPTER << 8),streamer_mmio+LAPDINC);
1210	writew(htons(STREAMER_CLEAR_RET_CODE << 8), streamer_mmio+LAPDINC);
1211
1212	spin_lock_irqsave(&streamer_priv->streamer_lock, flags);
1213
1214	streamer_priv->srb_queued = 1;
1215	writew(LISR_SRB_CMD, streamer_mmio + LISR_SUM);
1216
1217	spin_unlock_irqrestore(&streamer_priv->streamer_lock, flags);
1218
1219	while (streamer_priv->srb_queued) 
1220	{
1221		interruptible_sleep_on_timeout(&streamer_priv->srb_wait,
1222					       jiffies + 60 * HZ);
1223		if (signal_pending(current)) 
1224		{
1225			printk(KERN_WARNING "%s: SRB timed out.\n", dev->name);
1226			printk(KERN_WARNING "SISR=%x MISR=%x LISR=%x\n",
1227			       readw(streamer_mmio + SISR),
1228			       readw(streamer_mmio + MISR_RUM),
1229			       readw(streamer_mmio + LISR));
1230			streamer_priv->srb_queued = 0;
1231			break;
1232		}
1233	}
1234
1235	streamer_priv->rx_ring_last_received = (streamer_priv->rx_ring_last_received + 1) & (STREAMER_RX_RING_SIZE - 1);
1236
1237	for (i = 0; i < STREAMER_RX_RING_SIZE; i++) {
1238	        if (streamer_priv->rx_ring_skb[streamer_priv->rx_ring_last_received]) {
1239		        dev_kfree_skb(streamer_priv->rx_ring_skb[streamer_priv->rx_ring_last_received]);
1240		} 
1241		streamer_priv->rx_ring_last_received = (streamer_priv->rx_ring_last_received + 1) & (STREAMER_RX_RING_SIZE - 1);
1242	}
1243
1244	/* reset tx/rx fifo's and busmaster logic */
1245
1246	/* TBD. Add graceful way to reset the LLC channel without doing a soft reset. 
1247	   writel(readl(streamer_mmio+BCTL)|(3<<13),streamer_mmio+BCTL);
1248	   udelay(1);
1249	   writel(readl(streamer_mmio+BCTL)&~(3<<13),streamer_mmio+BCTL);
1250	 */
1251
1252#if STREAMER_DEBUG
1253	writew(streamer_priv->srb, streamer_mmio + LAPA);
1254	printk("srb): ");
1255	for (i = 0; i < 2; i++) {
1256		printk("%x ", ntohs(readw(streamer_mmio + LAPDINC)));
1257	}
1258	printk("\n");
1259#endif
1260	free_irq(dev->irq, dev);
1261	return 0;
1262}
1263
1264static void streamer_set_rx_mode(struct net_device *dev)
1265{
1266	struct streamer_private *streamer_priv =
1267	    netdev_priv(dev);
1268	__u8 __iomem *streamer_mmio = streamer_priv->streamer_mmio;
1269	__u8 options = 0;
1270	struct netdev_hw_addr *ha;
1271	unsigned char dev_mc_address[5];
1272
1273	writel(streamer_priv->srb, streamer_mmio + LAPA);
1274	options = streamer_priv->streamer_copy_all_options;
1275
1276	if (dev->flags & IFF_PROMISC)
1277		options |= (3 << 5);	/* All LLC and MAC frames, all through the main rx channel */
1278	else
1279		options &= ~(3 << 5);
1280
1281	/* Only issue the srb if there is a change in options */
1282
1283	if ((options ^ streamer_priv->streamer_copy_all_options)) 
1284	{
1285		/* Now to issue the srb command to alter the copy.all.options */
1286		writew(htons(SRB_MODIFY_RECEIVE_OPTIONS << 8), streamer_mmio+LAPDINC);
1287		writew(htons(STREAMER_CLEAR_RET_CODE << 8), streamer_mmio+LAPDINC);
1288		writew(htons((streamer_priv->streamer_receive_options << 8) | options),streamer_mmio+LAPDINC);
1289		writew(htons(0x4a41),streamer_mmio+LAPDINC);
1290		writew(htons(0x4d45),streamer_mmio+LAPDINC);
1291		writew(htons(0x5320),streamer_mmio+LAPDINC);
1292		writew(0x2020, streamer_mmio + LAPDINC);
1293
1294		streamer_priv->srb_queued = 2;	/* Can't sleep, use srb_bh */
1295
1296		writel(LISR_SRB_CMD, streamer_mmio + LISR_SUM);
1297
1298		streamer_priv->streamer_copy_all_options = options;
1299		return;
1300	}
1301
1302	/* Set the functional addresses we need for multicast */
1303	writel(streamer_priv->srb,streamer_mmio+LAPA);
1304	dev_mc_address[0] = dev_mc_address[1] = dev_mc_address[2] = dev_mc_address[3] = 0 ; 
1305  
1306	netdev_for_each_mc_addr(ha, dev) {
1307		dev_mc_address[0] |= ha->addr[2];
1308		dev_mc_address[1] |= ha->addr[3];
1309		dev_mc_address[2] |= ha->addr[4];
1310		dev_mc_address[3] |= ha->addr[5];
1311	}
1312  
1313	writew(htons(SRB_SET_FUNC_ADDRESS << 8),streamer_mmio+LAPDINC);
1314	writew(htons(STREAMER_CLEAR_RET_CODE << 8), streamer_mmio+LAPDINC);
1315	writew(0,streamer_mmio+LAPDINC);
1316	writew(htons( (dev_mc_address[0] << 8) | dev_mc_address[1]),streamer_mmio+LAPDINC);
1317	writew(htons( (dev_mc_address[2] << 8) | dev_mc_address[3]),streamer_mmio+LAPDINC);
1318	streamer_priv->srb_queued = 2 ; 
1319	writel(LISR_SRB_CMD,streamer_mmio+LISR_SUM);
1320}
1321
1322static void streamer_srb_bh(struct net_device *dev)
1323{
1324	struct streamer_private *streamer_priv = netdev_priv(dev);
1325	__u8 __iomem *streamer_mmio = streamer_priv->streamer_mmio;
1326	__u16 srb_word;
1327
1328	writew(streamer_priv->srb, streamer_mmio + LAPA);
1329	srb_word=ntohs(readw(streamer_mmio+LAPDINC)) >> 8;
1330
1331	switch (srb_word) {
1332
1333		/* SRB_MODIFY_RECEIVE_OPTIONS i.e. set_multicast_list options (promiscuous) 
1334		 * At some point we should do something if we get an error, such as
1335		 * resetting the IFF_PROMISC flag in dev
1336		 */
1337
1338	case SRB_MODIFY_RECEIVE_OPTIONS:
1339	        srb_word=ntohs(readw(streamer_mmio+LAPDINC)) >> 8;
1340
1341		switch (srb_word) {
1342		case 0x01:
1343			printk(KERN_WARNING "%s: Unrecognized srb command\n", dev->name);
1344			break;
1345		case 0x04:
1346			printk(KERN_WARNING "%s: Adapter must be open for this operation, doh!!\n", dev->name);
1347			break;
1348		default:
1349			if (streamer_priv->streamer_message_level)
1350				printk(KERN_WARNING "%s: Receive Options Modified to %x,%x\n",
1351				       dev->name,
1352				       streamer_priv->streamer_copy_all_options,
1353				       streamer_priv->streamer_receive_options);
1354			break;
1355		}		/* switch srb[2] */
1356		break;
1357
1358
1359		/* SRB_SET_GROUP_ADDRESS - Multicast group setting 
1360		 */
1361	case SRB_SET_GROUP_ADDRESS:
1362	        srb_word=ntohs(readw(streamer_mmio+LAPDINC)) >> 8;
1363		switch (srb_word) {
1364		case 0x00:
1365		        break;
1366		case 0x01:
1367			printk(KERN_WARNING "%s: Unrecognized srb command\n",dev->name);
1368			break;
1369		case 0x04:
1370			printk(KERN_WARNING "%s: Adapter must be open for this operation, doh!!\n", dev->name);
1371			break;
1372		case 0x3c:
1373			printk(KERN_WARNING "%s: Group/Functional address indicator bits not set correctly\n", dev->name);
1374			break;
1375		case 0x3e:	/* If we ever implement individual multicast addresses, will need to deal with this */
1376			printk(KERN_WARNING "%s: Group address registers full\n", dev->name);
1377			break;
1378		case 0x55:
1379			printk(KERN_INFO "%s: Group Address already set.\n", dev->name);
1380			break;
1381		default:
1382			break;
1383		}		/* switch srb[2] */
1384		break;
1385
1386
1387		/* SRB_RESET_GROUP_ADDRESS - Remove a multicast address from group list
1388		 */
1389	case SRB_RESET_GROUP_ADDRESS:
1390	        srb_word=ntohs(readw(streamer_mmio+LAPDINC)) >> 8;
1391		switch (srb_word) {
1392		case 0x00:
1393		        break;
1394		case 0x01:
1395			printk(KERN_WARNING "%s: Unrecognized srb command\n", dev->name);
1396			break;
1397		case 0x04:
1398			printk(KERN_WARNING "%s: Adapter must be open for this operation, doh!!\n", dev->name);
1399			break;
1400		case 0x39:	/* Must deal with this if individual multicast addresses used */
1401			printk(KERN_INFO "%s: Group address not found\n", dev->name);
1402			break;
1403		default:
1404			break;
1405		}		/* switch srb[2] */
1406		break;
1407
1408
1409		/* SRB_SET_FUNC_ADDRESS - Called by the set_rx_mode 
1410		 */
1411
1412	case SRB_SET_FUNC_ADDRESS:
1413	        srb_word=ntohs(readw(streamer_mmio+LAPDINC)) >> 8;
1414		switch (srb_word) {
1415		case 0x00:
1416			if (streamer_priv->streamer_message_level)
1417				printk(KERN_INFO "%s: Functional Address Mask Set\n", dev->name);
1418			break;
1419		case 0x01:
1420			printk(KERN_WARNING "%s: Unrecognized srb command\n", dev->name);
1421			break;
1422		case 0x04:
1423			printk(KERN_WARNING "%s: Adapter must be open for this operation, doh!!\n", dev->name);
1424			break;
1425		default:
1426			break;
1427		}		/* switch srb[2] */
1428		break;
1429
1430		/* SRB_READ_LOG - Read and reset the adapter error counters
1431		 */
1432
1433	case SRB_READ_LOG:
1434	        srb_word=ntohs(readw(streamer_mmio+LAPDINC)) >> 8;
1435		switch (srb_word) {
1436		case 0x00:
1437			{
1438				int i;
1439				if (streamer_priv->streamer_message_level)
1440					printk(KERN_INFO "%s: Read Log command complete\n", dev->name);
1441				printk("Read Log statistics: ");
1442				writew(streamer_priv->srb + 6,
1443				       streamer_mmio + LAPA);
1444				for (i = 0; i < 5; i++) {
1445					printk("%x:", ntohs(readw(streamer_mmio + LAPDINC)));
1446				}
1447				printk("\n");
1448			}
1449			break;
1450		case 0x01:
1451			printk(KERN_WARNING "%s: Unrecognized srb command\n", dev->name);
1452			break;
1453		case 0x04:
1454			printk(KERN_WARNING "%s: Adapter must be open for this operation, doh!!\n", dev->name);
1455			break;
1456
1457		}		/* switch srb[2] */
1458		break;
1459
1460		/* SRB_READ_SR_COUNTERS - Read and reset the source routing bridge related counters */
1461
1462	case SRB_READ_SR_COUNTERS:
1463	        srb_word=ntohs(readw(streamer_mmio+LAPDINC)) >> 8;
1464		switch (srb_word) {
1465		case 0x00:
1466			if (streamer_priv->streamer_message_level)
1467				printk(KERN_INFO "%s: Read Source Routing Counters issued\n", dev->name);
1468			break;
1469		case 0x01:
1470			printk(KERN_WARNING "%s: Unrecognized srb command\n", dev->name);
1471			break;
1472		case 0x04:
1473			printk(KERN_WARNING "%s: Adapter must be open for this operation, doh!!\n", dev->name);
1474			break;
1475		default:
1476			break;
1477		}		/* switch srb[2] */
1478		break;
1479
1480	default:
1481		printk(KERN_WARNING "%s: Unrecognized srb bh return value.\n", dev->name);
1482		break;
1483	}			/* switch srb[0] */
1484}
1485
1486static int streamer_set_mac_address(struct net_device *dev, void *addr)
1487{
1488	struct sockaddr *saddr = addr;
1489	struct streamer_private *streamer_priv = netdev_priv(dev);
1490
1491	if (netif_running(dev)) 
1492	{
1493		printk(KERN_WARNING "%s: Cannot set mac/laa address while card is open\n", dev->name);
1494		return -EIO;
1495	}
1496
1497	memcpy(streamer_priv->streamer_laa, saddr->sa_data, dev->addr_len);
1498
1499	if (streamer_priv->streamer_message_level) {
1500		printk(KERN_INFO "%s: MAC/LAA Set to  = %x.%x.%x.%x.%x.%x\n",
1501		       dev->name, streamer_priv->streamer_laa[0],
1502		       streamer_priv->streamer_laa[1],
1503		       streamer_priv->streamer_laa[2],
1504		       streamer_priv->streamer_laa[3],
1505		       streamer_priv->streamer_laa[4],
1506		       streamer_priv->streamer_laa[5]);
1507	}
1508	return 0;
1509}
1510
1511static void streamer_arb_cmd(struct net_device *dev)
1512{
1513	struct streamer_private *streamer_priv =
1514	    netdev_priv(dev);
1515	__u8 __iomem *streamer_mmio = streamer_priv->streamer_mmio;
1516	__u8 header_len;
1517	__u16 frame_len, buffer_len;
1518	struct sk_buff *mac_frame;
1519	__u8 frame_data[256];
1520	__u16 buff_off;
1521	__u16 lan_status = 0, lan_status_diff;	/* Initialize to stop compiler warning */
1522	__u8 fdx_prot_error;
1523	__u16 next_ptr;
1524	__u16 arb_word;
1525
1526#if STREAMER_NETWORK_MONITOR
1527	struct trh_hdr *mac_hdr;
1528#endif
1529
1530	writew(streamer_priv->arb, streamer_mmio + LAPA);
1531	arb_word=ntohs(readw(streamer_mmio+LAPD)) >> 8;
1532	
1533	if (arb_word == ARB_RECEIVE_DATA) {	/* Receive.data, MAC frames */
1534		writew(streamer_priv->arb + 6, streamer_mmio + LAPA);
1535		streamer_priv->mac_rx_buffer = buff_off = ntohs(readw(streamer_mmio + LAPDINC));
1536		header_len=ntohs(readw(streamer_mmio+LAPDINC)) >> 8; /* 802.5 Token-Ring Header Length */
1537		frame_len = ntohs(readw(streamer_mmio + LAPDINC));
1538
1539#if STREAMER_DEBUG
1540		{
1541			int i;
1542			__u16 next;
1543			__u8 status;
1544			__u16 len;
1545
1546			writew(ntohs(buff_off), streamer_mmio + LAPA);	/*setup window to frame data */
1547			next = htons(readw(streamer_mmio + LAPDINC));
1548			status =
1549			    ntohs(readw(streamer_mmio + LAPDINC)) & 0xff;
1550			len = ntohs(readw(streamer_mmio + LAPDINC));
1551
1552			/* print out 1st 14 bytes of frame data */
1553			for (i = 0; i < 7; i++) {
1554				printk("Loc %d = %04x\n", i,
1555				       ntohs(readw
1556					     (streamer_mmio + LAPDINC)));
1557			}
1558
1559			printk("next %04x, fs %02x, len %04x\n", next,
1560			       status, len);
1561		}
1562#endif
1563		if (!(mac_frame = dev_alloc_skb(frame_len))) {
1564			printk(KERN_WARNING "%s: Memory squeeze, dropping frame.\n",
1565			       dev->name);
1566			goto drop_frame;
1567		}
1568		/* Walk the buffer chain, creating the frame */
1569
1570		do {
1571			int i;
1572			__u16 rx_word;
1573
1574			writew(htons(buff_off), streamer_mmio + LAPA);	/* setup window to frame data */
1575			next_ptr = ntohs(readw(streamer_mmio + LAPDINC));
1576			readw(streamer_mmio + LAPDINC);	/* read thru status word */
1577			buffer_len = ntohs(readw(streamer_mmio + LAPDINC));
1578
1579			if (buffer_len > 256)
1580				break;
1581
1582			i = 0;
1583			while (i < buffer_len) {
1584				rx_word=ntohs(readw(streamer_mmio+LAPDINC));
1585				frame_data[i]=rx_word >> 8;
1586				frame_data[i+1]=rx_word & 0xff;
1587				i += 2;
1588			}
1589
1590			memcpy(skb_put(mac_frame, buffer_len),
1591				      frame_data, buffer_len);
1592		} while (next_ptr && (buff_off = next_ptr));
1593
1594		mac_frame->protocol = tr_type_trans(mac_frame, dev);
1595#if STREAMER_NETWORK_MONITOR
1596		printk(KERN_WARNING "%s: Received MAC Frame, details:\n",
1597		       dev->name);
1598		mac_hdr = tr_hdr(mac_frame);
1599		printk(KERN_WARNING
1600		       "%s: MAC Frame Dest. Addr: %pM\n",
1601		       dev->name, mac_hdr->daddr);
1602		printk(KERN_WARNING
1603		       "%s: MAC Frame Srce. Addr: %pM\n",
1604		       dev->name, mac_hdr->saddr);
1605#endif
1606		netif_rx(mac_frame);
1607
1608		/* Now tell the card we have dealt with the received frame */
1609drop_frame:
1610		/* Set LISR Bit 1 */
1611		writel(LISR_ARB_FREE, streamer_priv->streamer_mmio + LISR_SUM);
1612
1613		/* Is the ASB free ? */
1614
1615		if (!(readl(streamer_priv->streamer_mmio + SISR) & SISR_ASB_FREE)) 
1616		{
1617			streamer_priv->asb_queued = 1;
1618			writel(LISR_ASB_FREE_REQ, streamer_priv->streamer_mmio + LISR_SUM);
1619			return;
1620			/* Drop out and wait for the bottom half to be run */
1621		}
1622
1623
1624		writew(streamer_priv->asb, streamer_mmio + LAPA);
1625		writew(htons(ASB_RECEIVE_DATA << 8), streamer_mmio+LAPDINC);
1626		writew(htons(STREAMER_CLEAR_RET_CODE << 8), streamer_mmio+LAPDINC);
1627		writew(0, streamer_mmio + LAPDINC);
1628		writew(htons(streamer_priv->mac_rx_buffer), streamer_mmio + LAPD);
1629
1630		writel(LISR_ASB_REPLY | LISR_ASB_FREE_REQ, streamer_priv->streamer_mmio + LISR_SUM);
1631
1632		streamer_priv->asb_queued = 2;
1633		return;
1634
1635	} else if (arb_word == ARB_LAN_CHANGE_STATUS) {	/* Lan.change.status */
1636		writew(streamer_priv->arb + 6, streamer_mmio + LAPA);
1637		lan_status = ntohs(readw(streamer_mmio + LAPDINC));
1638		fdx_prot_error = ntohs(readw(streamer_mmio+LAPD)) >> 8;
1639		
1640		/* Issue ARB Free */
1641		writew(LISR_ARB_FREE, streamer_priv->streamer_mmio + LISR_SUM);
1642
1643		lan_status_diff = (streamer_priv->streamer_lan_status ^ lan_status) & 
1644		    lan_status; 
1645
1646		if (lan_status_diff & (LSC_LWF | LSC_ARW | LSC_FPE | LSC_RR)) 
1647		{
1648			if (lan_status_diff & LSC_LWF)
1649				printk(KERN_WARNING "%s: Short circuit detected on the lobe\n", dev->name);
1650			if (lan_status_diff & LSC_ARW)
1651				printk(KERN_WARNING "%s: Auto removal error\n", dev->name);
1652			if (lan_status_diff & LSC_FPE)
1653				printk(KERN_WARNING "%s: FDX Protocol Error\n", dev->name);
1654			if (lan_status_diff & LSC_RR)
1655				printk(KERN_WARNING "%s: Force remove MAC frame received\n", dev->name);
1656
1657			/* Adapter has been closed by the hardware */
1658
1659			/* reset tx/rx fifo's and busmaster logic */
1660
1661			/* @TBD. no llc reset on autostreamer writel(readl(streamer_mmio+BCTL)|(3<<13),streamer_mmio+BCTL);
1662			   udelay(1);
1663			   writel(readl(streamer_mmio+BCTL)&~(3<<13),streamer_mmio+BCTL); */
1664
1665			netif_stop_queue(dev);
1666			netif_carrier_off(dev);
1667			printk(KERN_WARNING "%s: Adapter must be manually reset.\n", dev->name);
1668		}
1669		/* If serious error */
1670		if (streamer_priv->streamer_message_level) {
1671			if (lan_status_diff & LSC_SIG_LOSS)
1672				printk(KERN_WARNING "%s: No receive signal detected\n", dev->name);
1673			if (lan_status_diff & LSC_HARD_ERR) 
1674				printk(KERN_INFO "%s: Beaconing\n", dev->name);
1675			if (lan_status_diff & LSC_SOFT_ERR)
1676				printk(KERN_WARNING "%s: Adapter transmitted Soft Error Report Mac Frame\n", dev->name);
1677			if (lan_status_diff & LSC_TRAN_BCN)
1678				printk(KERN_INFO "%s: We are transmitting the beacon, aaah\n", dev->name);
1679			if (lan_status_diff & LSC_SS)
1680				printk(KERN_INFO "%s: Single Station on the ring\n", dev->name);
1681			if (lan_status_diff & LSC_RING_REC)
1682				printk(KERN_INFO "%s: Ring recovery ongoing\n", dev->name);
1683			if (lan_status_diff & LSC_FDX_MODE)
1684				printk(KERN_INFO "%s: Operating in FDX mode\n", dev->name);
1685		}
1686
1687		if (lan_status_diff & LSC_CO) {
1688			if (streamer_priv->streamer_message_level)
1689				printk(KERN_INFO "%s: Counter Overflow\n", dev->name);
1690
1691			/* Issue READ.LOG command */
1692
1693			writew(streamer_priv->srb, streamer_mmio + LAPA);
1694			writew(htons(SRB_READ_LOG << 8),streamer_mmio+LAPDINC);
1695			writew(htons(STREAMER_CLEAR_RET_CODE << 8), streamer_mmio+LAPDINC);
1696			writew(0, streamer_mmio + LAPDINC);
1697			streamer_priv->srb_queued = 2;	/* Can't sleep, use srb_bh */
1698
1699			writew(LISR_SRB_CMD, streamer_mmio + LISR_SUM);
1700		}
1701
1702		if (lan_status_diff & LSC_SR_CO) {
1703			if (streamer_priv->streamer_message_level)
1704				printk(KERN_INFO "%s: Source routing counters overflow\n", dev->name);
1705
1706			/* Issue a READ.SR.COUNTERS */
1707			writew(streamer_priv->srb, streamer_mmio + LAPA);
1708			writew(htons(SRB_READ_SR_COUNTERS << 8),
1709			       streamer_mmio+LAPDINC);
1710			writew(htons(STREAMER_CLEAR_RET_CODE << 8),
1711			       streamer_mmio+LAPDINC);
1712			streamer_priv->srb_queued = 2;	/* Can't sleep, use srb_bh */
1713			writew(LISR_SRB_CMD, streamer_mmio + LISR_SUM);
1714
1715		}
1716		streamer_priv->streamer_lan_status = lan_status;
1717	} /* Lan.change.status */
1718	else
1719		printk(KERN_WARNING "%s: Unknown arb command\n", dev->name);
1720}
1721
1722static void streamer_asb_bh(struct net_device *dev)
1723{
1724	struct streamer_private *streamer_priv =
1725	    netdev_priv(dev);
1726	__u8 __iomem *streamer_mmio = streamer_priv->streamer_mmio;
1727
1728	if (streamer_priv->asb_queued == 1) 
1729	{
1730		/* Dropped through the first time */
1731
1732		writew(streamer_priv->asb, streamer_mmio + LAPA);
1733		writew(htons(ASB_RECEIVE_DATA << 8),streamer_mmio+LAPDINC);
1734		writew(htons(STREAMER_CLEAR_RET_CODE << 8), streamer_mmio+LAPDINC);
1735		writew(0, streamer_mmio + LAPDINC);
1736		writew(htons(streamer_priv->mac_rx_buffer), streamer_mmio + LAPD);
1737
1738		writel(LISR_ASB_REPLY | LISR_ASB_FREE_REQ, streamer_priv->streamer_mmio + LISR_SUM);
1739		streamer_priv->asb_queued = 2;
1740
1741		return;
1742	}
1743
1744	if (streamer_priv->asb_queued == 2) {
1745		__u8 rc;
1746		writew(streamer_priv->asb + 2, streamer_mmio + LAPA);
1747		rc=ntohs(readw(streamer_mmio+LAPD)) >> 8;
1748		switch (rc) {
1749		case 0x01:
1750			printk(KERN_WARNING "%s: Unrecognized command code\n", dev->name);
1751			break;
1752		case 0x26:
1753			printk(KERN_WARNING "%s: Unrecognized buffer address\n", dev->name);
1754			break;
1755		case 0xFF:
1756			/* Valid response, everything should be ok again */
1757			break;
1758		default:
1759			printk(KERN_WARNING "%s: Invalid return code in asb\n", dev->name);
1760			break;
1761		}
1762	}
1763	streamer_priv->asb_queued = 0;
1764}
1765
1766static int streamer_change_mtu(struct net_device *dev, int mtu)
1767{
1768	struct streamer_private *streamer_priv =
1769	    netdev_priv(dev);
1770	__u16 max_mtu;
1771
1772	if (streamer_priv->streamer_ring_speed == 4)
1773		max_mtu = 4500;
1774	else
1775		max_mtu = 18000;
1776
1777	if (mtu > max_mtu)
1778		return -EINVAL;
1779	if (mtu < 100)
1780		return -EINVAL;
1781
1782	dev->mtu = mtu;
1783	streamer_priv->pkt_buf_sz = mtu + TR_HLEN;
1784
1785	return 0;
1786}
1787
1788#if STREAMER_NETWORK_MONITOR
1789#ifdef CONFIG_PROC_FS
1790static int streamer_proc_info(char *buffer, char **start, off_t offset,
1791			      int length, int *eof, void *data)
1792{
1793  struct streamer_private *sdev=NULL;
1794	struct pci_dev *pci_device = NULL;
1795	int len = 0;
1796	off_t begin = 0;
1797	off_t pos = 0;
1798	int size;
1799
1800  struct net_device *dev;
1801
1802	size = sprintf(buffer, "IBM LanStreamer/MPC Chipset Token Ring Adapters\n");
1803
1804	pos += size;
1805	len += size;
1806
1807  for(sdev=dev_streamer; sdev; sdev=sdev->next) {
1808    pci_device=sdev->pci_dev;
1809    dev=pci_get_drvdata(pci_device);
1810
1811				size = sprintf_info(buffer + len, dev);
1812				len += size;
1813				pos = begin + len;
1814
1815				if (pos < offset) {
1816					len = 0;
1817					begin = pos;
1818				}
1819				if (pos > offset + length)
1820					break;
1821		}		/* for */
1822
1823	*start = buffer + (offset - begin);	/* Start of wanted data */
1824	len -= (offset - begin);	/* Start slop */
1825	if (len > length)
1826		len = length;	/* Ending slop */
1827	return len;
1828}
1829
1830static int sprintf_info(char *buffer, struct net_device *dev)
1831{
1832	struct streamer_private *streamer_priv =
1833	    netdev_priv(dev);
1834	__u8 __iomem *streamer_mmio = streamer_priv->streamer_mmio;
1835	struct streamer_adapter_addr_table sat;
1836	struct streamer_parameters_table spt;
1837	int size = 0;
1838	int i;
1839
1840	writew(streamer_priv->streamer_addr_table_addr, streamer_mmio + LAPA);
1841	for (i = 0; i < 14; i += 2) {
1842		__u16 io_word;
1843		__u8 *datap = (__u8 *) & sat;
1844		io_word=ntohs(readw(streamer_mmio+LAPDINC));
1845		datap[size]=io_word >> 8;
1846		datap[size+1]=io_word & 0xff;
1847	}
1848	writew(streamer_priv->streamer_parms_addr, streamer_mmio + LAPA);
1849	for (i = 0; i < 68; i += 2) {
1850		__u16 io_word;
1851		__u8 *datap = (__u8 *) & spt;
1852		io_word=ntohs(readw(streamer_mmio+LAPDINC));
1853		datap[size]=io_word >> 8;
1854		datap[size+1]=io_word & 0xff;
1855	}
1856
1857	size = sprintf(buffer, "\n%6s: Adapter Address   : Node Address      : Functional Addr\n", dev->name);
1858
1859	size += sprintf(buffer + size,
1860			"%6s: %pM : %pM : %02x:%02x:%02x:%02x\n",
1861			dev->name, dev->dev_addr, sat.node_addr,
1862			sat.func_addr[0], sat.func_addr[1],
1863			sat.func_addr[2], sat.func_addr[3]);
1864
1865	size += sprintf(buffer + size, "\n%6s: Token Ring Parameters Table:\n", dev->name);
1866
1867	size += sprintf(buffer + size, "%6s: Physical Addr : Up Node Address   : Poll Address      : AccPri : Auth Src : Att Code :\n", dev->name);
1868
1869	size += sprintf(buffer + size,
1870		    "%6s: %02x:%02x:%02x:%02x   : %pM : %pM : %04x   : %04x     :  %04x    :\n",
1871		    dev->name, spt.phys_addr[0], spt.phys_addr[1],
1872		    spt.phys_addr[2], spt.phys_addr[3],
1873		    spt.up_node_addr, spt.poll_addr,
1874		    ntohs(spt.acc_priority), ntohs(spt.auth_source_class),
1875		    ntohs(spt.att_code));
1876
1877	size += sprintf(buffer + size, "%6s: Source Address    : Bcn T : Maj. V : Lan St : Lcl Rg : Mon Err : Frame Correl : \n", dev->name);
1878
1879	size += sprintf(buffer + size,
1880		    "%6s: %pM : %04x  : %04x   : %04x   : %04x   : %04x    :     %04x     : \n",
1881		    dev->name, spt.source_addr,
1882		    ntohs(spt.beacon_type), ntohs(spt.major_vector),
1883		    ntohs(spt.lan_status), ntohs(spt.local_ring),
1884		    ntohs(spt.mon_error), ntohs(spt.frame_correl));
1885
1886	size += sprintf(buffer + size, "%6s: Beacon Details :  Tx  :  Rx  : NAUN Node Address : NAUN Node Phys : \n",
1887		    dev->name);
1888
1889	size += sprintf(buffer + size,
1890		    "%6s:                :  %02x  :  %02x  : %pM : %02x:%02x:%02x:%02x    : \n",
1891		    dev->name, ntohs(spt.beacon_transmit),
1892		    ntohs(spt.beacon_receive),
1893		    spt.beacon_naun,
1894		    spt.beacon_phys[0], spt.beacon_phys[1],
1895		    spt.beacon_phys[2], spt.beacon_phys[3]);
1896	return size;
1897}
1898#endif
1899#endif
1900
1901static struct pci_driver streamer_pci_driver = {
1902  .name     = "lanstreamer",
1903  .id_table = streamer_pci_tbl,
1904  .probe    = streamer_init_one,
1905  .remove   = __devexit_p(streamer_remove_one),
1906};
1907
1908static int __init streamer_init_module(void) {
1909  return pci_register_driver(&streamer_pci_driver);
1910}
1911
1912static void __exit streamer_cleanup_module(void) {
1913  pci_unregister_driver(&streamer_pci_driver);
1914}
1915
1916module_init(streamer_init_module);
1917module_exit(streamer_cleanup_module);
1918MODULE_LICENSE("GPL");