Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.36 2354 lines 64 kB view raw
1/* 2 * tms380tr.c: A network driver library for Texas Instruments TMS380-based 3 * Token Ring Adapters. 4 * 5 * Originally sktr.c: Written 1997 by Christoph Goos 6 * 7 * A fine result of the Linux Systems Network Architecture Project. 8 * http://www.linux-sna.org 9 * 10 * This software may be used and distributed according to the terms 11 * of the GNU General Public License, incorporated herein by reference. 12 * 13 * The following modules are currently available for card support: 14 * - tmspci (Generic PCI card support) 15 * - abyss (Madge PCI support) 16 * - tmsisa (SysKonnect TR4/16 ISA) 17 * 18 * Sources: 19 * - The hardware related parts of this driver are take from 20 * the SysKonnect Token Ring driver for Windows NT. 21 * - I used the IBM Token Ring driver 'ibmtr.c' as a base for this 22 * driver, as well as the 'skeleton.c' driver by Donald Becker. 23 * - Also various other drivers in the linux source tree were taken 24 * as samples for some tasks. 25 * - TI TMS380 Second-Generation Token Ring User's Guide 26 * - TI datasheets for respective chips 27 * - David Hein at Texas Instruments 28 * - Various Madge employees 29 * 30 * Maintainer(s): 31 * JS Jay Schulist jschlst@samba.org 32 * CG Christoph Goos cgoos@syskonnect.de 33 * AF Adam Fritzler 34 * MLP Mike Phillips phillim@amtrak.com 35 * JF Jochen Friedrich jochen@scram.de 36 * 37 * Modification History: 38 * 29-Aug-97 CG Created 39 * 04-Apr-98 CG Fixed problems caused by tok_timer_check 40 * 10-Apr-98 CG Fixed lockups at cable disconnection 41 * 27-May-98 JS Formated to Linux Kernel Format 42 * 31-May-98 JS Hacked in PCI support 43 * 16-Jun-98 JS Modulized for multiple cards with one driver 44 * Sep-99 AF Renamed to tms380tr (supports more than SK's) 45 * 23-Sep-99 AF Added Compaq and Thomas-Conrad PCI support 46 * Fixed a bug causing double copies on PCI 47 * Fixed for new multicast stuff (2.2/2.3) 48 * 25-Sep-99 AF Uped TPL_NUM from 3 to 9 49 * Removed extraneous 'No free TPL' 50 * 22-Dec-99 AF Added Madge PCI Mk2 support and generalized 51 * parts of the initilization procedure. 52 * 30-Dec-99 AF Turned tms380tr into a library ala 8390. 53 * Madge support is provided in the abyss module 54 * Generic PCI support is in the tmspci module. 55 * 30-Nov-00 JF Updated PCI code to support IO MMU via 56 * pci_map_static(). Alpha uses this MMU for ISA 57 * as well. 58 * 14-Jan-01 JF Fix DMA on ifdown/ifup sequences. Some 59 * cleanup. 60 * 13-Jan-02 JF Add spinlock to fix race condition. 61 * 09-Nov-02 JF Fixed printks to not SPAM the console during 62 * normal operation. 63 * 30-Dec-02 JF Removed incorrect __init from 64 * tms380tr_init_card. 65 * 22-Jul-05 JF Converted to dma-mapping. 66 * 67 * To do: 68 * 1. Multi/Broadcast packet handling (this may have fixed itself) 69 * 2. Write a sktrisa module that includes the old ISA support (done) 70 * 3. Allow modules to load their own microcode 71 * 4. Speed up the BUD process -- freezing the kernel for 3+sec is 72 * quite unacceptable. 73 * 5. Still a few remaining stalls when the cable is unplugged. 74 */ 75 76#ifdef MODULE 77static const char version[] = "tms380tr.c: v1.10 30/12/2002 by Christoph Goos, Adam Fritzler\n"; 78#endif 79 80#include <linux/module.h> 81#include <linux/kernel.h> 82#include <linux/types.h> 83#include <linux/fcntl.h> 84#include <linux/interrupt.h> 85#include <linux/ptrace.h> 86#include <linux/ioport.h> 87#include <linux/in.h> 88#include <linux/string.h> 89#include <linux/time.h> 90#include <linux/errno.h> 91#include <linux/init.h> 92#include <linux/dma-mapping.h> 93#include <linux/delay.h> 94#include <linux/netdevice.h> 95#include <linux/etherdevice.h> 96#include <linux/skbuff.h> 97#include <linux/trdevice.h> 98#include <linux/firmware.h> 99#include <linux/bitops.h> 100 101#include <asm/system.h> 102#include <asm/io.h> 103#include <asm/dma.h> 104#include <asm/irq.h> 105#include <asm/uaccess.h> 106 107#include "tms380tr.h" /* Our Stuff */ 108 109/* Use 0 for production, 1 for verification, 2 for debug, and 110 * 3 for very verbose debug. 111 */ 112#ifndef TMS380TR_DEBUG 113#define TMS380TR_DEBUG 0 114#endif 115static unsigned int tms380tr_debug = TMS380TR_DEBUG; 116 117/* Index to functions, as function prototypes. 118 * Alphabetical by function name. 119 */ 120 121/* "A" */ 122/* "B" */ 123static int tms380tr_bringup_diags(struct net_device *dev); 124/* "C" */ 125static void tms380tr_cancel_tx_queue(struct net_local* tp); 126static int tms380tr_chipset_init(struct net_device *dev); 127static void tms380tr_chk_irq(struct net_device *dev); 128static void tms380tr_chk_outstanding_cmds(struct net_device *dev); 129static void tms380tr_chk_src_addr(unsigned char *frame, unsigned char *hw_addr); 130static unsigned char tms380tr_chk_ssb(struct net_local *tp, unsigned short IrqType); 131int tms380tr_close(struct net_device *dev); 132static void tms380tr_cmd_status_irq(struct net_device *dev); 133/* "D" */ 134static void tms380tr_disable_interrupts(struct net_device *dev); 135#if TMS380TR_DEBUG > 0 136static void tms380tr_dump(unsigned char *Data, int length); 137#endif 138/* "E" */ 139static void tms380tr_enable_interrupts(struct net_device *dev); 140static void tms380tr_exec_cmd(struct net_device *dev, unsigned short Command); 141static void tms380tr_exec_sifcmd(struct net_device *dev, unsigned int WriteValue); 142/* "F" */ 143/* "G" */ 144static struct net_device_stats *tms380tr_get_stats(struct net_device *dev); 145/* "H" */ 146static netdev_tx_t tms380tr_hardware_send_packet(struct sk_buff *skb, 147 struct net_device *dev); 148/* "I" */ 149static int tms380tr_init_adapter(struct net_device *dev); 150static void tms380tr_init_ipb(struct net_local *tp); 151static void tms380tr_init_net_local(struct net_device *dev); 152static void tms380tr_init_opb(struct net_device *dev); 153/* "M" */ 154/* "O" */ 155int tms380tr_open(struct net_device *dev); 156static void tms380tr_open_adapter(struct net_device *dev); 157/* "P" */ 158/* "R" */ 159static void tms380tr_rcv_status_irq(struct net_device *dev); 160static int tms380tr_read_ptr(struct net_device *dev); 161static void tms380tr_read_ram(struct net_device *dev, unsigned char *Data, 162 unsigned short Address, int Length); 163static int tms380tr_reset_adapter(struct net_device *dev); 164static void tms380tr_reset_interrupt(struct net_device *dev); 165static void tms380tr_ring_status_irq(struct net_device *dev); 166/* "S" */ 167static netdev_tx_t tms380tr_send_packet(struct sk_buff *skb, 168 struct net_device *dev); 169static void tms380tr_set_multicast_list(struct net_device *dev); 170static int tms380tr_set_mac_address(struct net_device *dev, void *addr); 171/* "T" */ 172static void tms380tr_timer_chk(unsigned long data); 173static void tms380tr_timer_end_wait(unsigned long data); 174static void tms380tr_tx_status_irq(struct net_device *dev); 175/* "U" */ 176static void tms380tr_update_rcv_stats(struct net_local *tp, 177 unsigned char DataPtr[], unsigned int Length); 178/* "W" */ 179void tms380tr_wait(unsigned long time); 180static void tms380tr_write_rpl_status(RPL *rpl, unsigned int Status); 181static void tms380tr_write_tpl_status(TPL *tpl, unsigned int Status); 182 183#define SIFREADB(reg) \ 184 (((struct net_local *)netdev_priv(dev))->sifreadb(dev, reg)) 185#define SIFWRITEB(val, reg) \ 186 (((struct net_local *)netdev_priv(dev))->sifwriteb(dev, val, reg)) 187#define SIFREADW(reg) \ 188 (((struct net_local *)netdev_priv(dev))->sifreadw(dev, reg)) 189#define SIFWRITEW(val, reg) \ 190 (((struct net_local *)netdev_priv(dev))->sifwritew(dev, val, reg)) 191 192 193 194#if 0 /* TMS380TR_DEBUG > 0 */ 195static int madgemc_sifprobe(struct net_device *dev) 196{ 197 unsigned char old, chk1, chk2; 198 199 old = SIFREADB(SIFADR); /* Get the old SIFADR value */ 200 201 chk1 = 0; /* Begin with check value 0 */ 202 do { 203 madgemc_setregpage(dev, 0); 204 /* Write new SIFADR value */ 205 SIFWRITEB(chk1, SIFADR); 206 chk2 = SIFREADB(SIFADR); 207 if (chk2 != chk1) 208 return -1; 209 210 madgemc_setregpage(dev, 1); 211 /* Read, invert and write */ 212 chk2 = SIFREADB(SIFADD); 213 if (chk2 != chk1) 214 return -1; 215 216 madgemc_setregpage(dev, 0); 217 chk2 ^= 0x0FE; 218 SIFWRITEB(chk2, SIFADR); 219 220 /* Read, invert and compare */ 221 madgemc_setregpage(dev, 1); 222 chk2 = SIFREADB(SIFADD); 223 madgemc_setregpage(dev, 0); 224 chk2 ^= 0x0FE; 225 226 if(chk1 != chk2) 227 return (-1); /* No adapter */ 228 chk1 -= 2; 229 } while(chk1 != 0); /* Repeat 128 times (all byte values) */ 230 231 madgemc_setregpage(dev, 0); /* sanity */ 232 /* Restore the SIFADR value */ 233 SIFWRITEB(old, SIFADR); 234 235 return (0); 236} 237#endif 238 239/* 240 * Open/initialize the board. This is called sometime after 241 * booting when the 'ifconfig' program is run. 242 * 243 * This routine should set everything up anew at each open, even 244 * registers that "should" only need to be set once at boot, so that 245 * there is non-reboot way to recover if something goes wrong. 246 */ 247int tms380tr_open(struct net_device *dev) 248{ 249 struct net_local *tp = netdev_priv(dev); 250 int err; 251 252 /* init the spinlock */ 253 spin_lock_init(&tp->lock); 254 init_timer(&tp->timer); 255 256 /* Reset the hardware here. Don't forget to set the station address. */ 257 258#ifdef CONFIG_ISA 259 if(dev->dma > 0) 260 { 261 unsigned long flags=claim_dma_lock(); 262 disable_dma(dev->dma); 263 set_dma_mode(dev->dma, DMA_MODE_CASCADE); 264 enable_dma(dev->dma); 265 release_dma_lock(flags); 266 } 267#endif 268 269 err = tms380tr_chipset_init(dev); 270 if(err) 271 { 272 printk(KERN_INFO "%s: Chipset initialization error\n", 273 dev->name); 274 return (-1); 275 } 276 277 tp->timer.expires = jiffies + 30*HZ; 278 tp->timer.function = tms380tr_timer_end_wait; 279 tp->timer.data = (unsigned long)dev; 280 add_timer(&tp->timer); 281 282 printk(KERN_DEBUG "%s: Adapter RAM size: %dK\n", 283 dev->name, tms380tr_read_ptr(dev)); 284 285 tms380tr_enable_interrupts(dev); 286 tms380tr_open_adapter(dev); 287 288 netif_start_queue(dev); 289 290 /* Wait for interrupt from hardware. If interrupt does not come, 291 * there will be a timeout from the timer. 292 */ 293 tp->Sleeping = 1; 294 interruptible_sleep_on(&tp->wait_for_tok_int); 295 del_timer(&tp->timer); 296 297 /* If AdapterVirtOpenFlag is 1, the adapter is now open for use */ 298 if(tp->AdapterVirtOpenFlag == 0) 299 { 300 tms380tr_disable_interrupts(dev); 301 return (-1); 302 } 303 304 tp->StartTime = jiffies; 305 306 /* Start function control timer */ 307 tp->timer.expires = jiffies + 2*HZ; 308 tp->timer.function = tms380tr_timer_chk; 309 tp->timer.data = (unsigned long)dev; 310 add_timer(&tp->timer); 311 312 return (0); 313} 314 315/* 316 * Timeout function while waiting for event 317 */ 318static void tms380tr_timer_end_wait(unsigned long data) 319{ 320 struct net_device *dev = (struct net_device*)data; 321 struct net_local *tp = netdev_priv(dev); 322 323 if(tp->Sleeping) 324 { 325 tp->Sleeping = 0; 326 wake_up_interruptible(&tp->wait_for_tok_int); 327 } 328} 329 330/* 331 * Initialize the chipset 332 */ 333static int tms380tr_chipset_init(struct net_device *dev) 334{ 335 struct net_local *tp = netdev_priv(dev); 336 int err; 337 338 tms380tr_init_ipb(tp); 339 tms380tr_init_opb(dev); 340 tms380tr_init_net_local(dev); 341 342 if(tms380tr_debug > 3) 343 printk(KERN_DEBUG "%s: Resetting adapter...\n", dev->name); 344 err = tms380tr_reset_adapter(dev); 345 if(err < 0) 346 return (-1); 347 348 if(tms380tr_debug > 3) 349 printk(KERN_DEBUG "%s: Bringup diags...\n", dev->name); 350 err = tms380tr_bringup_diags(dev); 351 if(err < 0) 352 return (-1); 353 354 if(tms380tr_debug > 3) 355 printk(KERN_DEBUG "%s: Init adapter...\n", dev->name); 356 err = tms380tr_init_adapter(dev); 357 if(err < 0) 358 return (-1); 359 360 if(tms380tr_debug > 3) 361 printk(KERN_DEBUG "%s: Done!\n", dev->name); 362 return (0); 363} 364 365/* 366 * Initializes the net_local structure. 367 */ 368static void tms380tr_init_net_local(struct net_device *dev) 369{ 370 struct net_local *tp = netdev_priv(dev); 371 int i; 372 dma_addr_t dmabuf; 373 374 tp->scb.CMD = 0; 375 tp->scb.Parm[0] = 0; 376 tp->scb.Parm[1] = 0; 377 378 tp->ssb.STS = 0; 379 tp->ssb.Parm[0] = 0; 380 tp->ssb.Parm[1] = 0; 381 tp->ssb.Parm[2] = 0; 382 383 tp->CMDqueue = 0; 384 385 tp->AdapterOpenFlag = 0; 386 tp->AdapterVirtOpenFlag = 0; 387 tp->ScbInUse = 0; 388 tp->OpenCommandIssued = 0; 389 tp->ReOpenInProgress = 0; 390 tp->HaltInProgress = 0; 391 tp->TransmitHaltScheduled = 0; 392 tp->LobeWireFaultLogged = 0; 393 tp->LastOpenStatus = 0; 394 tp->MaxPacketSize = DEFAULT_PACKET_SIZE; 395 396 /* Create circular chain of transmit lists */ 397 for (i = 0; i < TPL_NUM; i++) 398 { 399 tp->Tpl[i].NextTPLAddr = htonl(((char *)(&tp->Tpl[(i+1) % TPL_NUM]) - (char *)tp) + tp->dmabuffer); /* DMA buffer may be MMU driven */ 400 tp->Tpl[i].Status = 0; 401 tp->Tpl[i].FrameSize = 0; 402 tp->Tpl[i].FragList[0].DataCount = 0; 403 tp->Tpl[i].FragList[0].DataAddr = 0; 404 tp->Tpl[i].NextTPLPtr = &tp->Tpl[(i+1) % TPL_NUM]; 405 tp->Tpl[i].MData = NULL; 406 tp->Tpl[i].TPLIndex = i; 407 tp->Tpl[i].DMABuff = 0; 408 tp->Tpl[i].BusyFlag = 0; 409 } 410 411 tp->TplFree = tp->TplBusy = &tp->Tpl[0]; 412 413 /* Create circular chain of receive lists */ 414 for (i = 0; i < RPL_NUM; i++) 415 { 416 tp->Rpl[i].NextRPLAddr = htonl(((char *)(&tp->Rpl[(i+1) % RPL_NUM]) - (char *)tp) + tp->dmabuffer); /* DMA buffer may be MMU driven */ 417 tp->Rpl[i].Status = (RX_VALID | RX_START_FRAME | RX_END_FRAME | RX_FRAME_IRQ); 418 tp->Rpl[i].FrameSize = 0; 419 tp->Rpl[i].FragList[0].DataCount = cpu_to_be16((unsigned short)tp->MaxPacketSize); 420 421 /* Alloc skb and point adapter to data area */ 422 tp->Rpl[i].Skb = dev_alloc_skb(tp->MaxPacketSize); 423 tp->Rpl[i].DMABuff = 0; 424 425 /* skb == NULL ? then use local buffer */ 426 if(tp->Rpl[i].Skb == NULL) 427 { 428 tp->Rpl[i].SkbStat = SKB_UNAVAILABLE; 429 tp->Rpl[i].FragList[0].DataAddr = htonl(((char *)tp->LocalRxBuffers[i] - (char *)tp) + tp->dmabuffer); 430 tp->Rpl[i].MData = tp->LocalRxBuffers[i]; 431 } 432 else /* SKB != NULL */ 433 { 434 tp->Rpl[i].Skb->dev = dev; 435 skb_put(tp->Rpl[i].Skb, tp->MaxPacketSize); 436 437 /* data unreachable for DMA ? then use local buffer */ 438 dmabuf = dma_map_single(tp->pdev, tp->Rpl[i].Skb->data, tp->MaxPacketSize, DMA_FROM_DEVICE); 439 if(tp->dmalimit && (dmabuf + tp->MaxPacketSize > tp->dmalimit)) 440 { 441 tp->Rpl[i].SkbStat = SKB_DATA_COPY; 442 tp->Rpl[i].FragList[0].DataAddr = htonl(((char *)tp->LocalRxBuffers[i] - (char *)tp) + tp->dmabuffer); 443 tp->Rpl[i].MData = tp->LocalRxBuffers[i]; 444 } 445 else /* DMA directly in skb->data */ 446 { 447 tp->Rpl[i].SkbStat = SKB_DMA_DIRECT; 448 tp->Rpl[i].FragList[0].DataAddr = htonl(dmabuf); 449 tp->Rpl[i].MData = tp->Rpl[i].Skb->data; 450 tp->Rpl[i].DMABuff = dmabuf; 451 } 452 } 453 454 tp->Rpl[i].NextRPLPtr = &tp->Rpl[(i+1) % RPL_NUM]; 455 tp->Rpl[i].RPLIndex = i; 456 } 457 458 tp->RplHead = &tp->Rpl[0]; 459 tp->RplTail = &tp->Rpl[RPL_NUM-1]; 460 tp->RplTail->Status = (RX_START_FRAME | RX_END_FRAME | RX_FRAME_IRQ); 461} 462 463/* 464 * Initializes the initialisation parameter block. 465 */ 466static void tms380tr_init_ipb(struct net_local *tp) 467{ 468 tp->ipb.Init_Options = BURST_MODE; 469 tp->ipb.CMD_Status_IV = 0; 470 tp->ipb.TX_IV = 0; 471 tp->ipb.RX_IV = 0; 472 tp->ipb.Ring_Status_IV = 0; 473 tp->ipb.SCB_Clear_IV = 0; 474 tp->ipb.Adapter_CHK_IV = 0; 475 tp->ipb.RX_Burst_Size = BURST_SIZE; 476 tp->ipb.TX_Burst_Size = BURST_SIZE; 477 tp->ipb.DMA_Abort_Thrhld = DMA_RETRIES; 478 tp->ipb.SCB_Addr = 0; 479 tp->ipb.SSB_Addr = 0; 480} 481 482/* 483 * Initializes the open parameter block. 484 */ 485static void tms380tr_init_opb(struct net_device *dev) 486{ 487 struct net_local *tp; 488 unsigned long Addr; 489 unsigned short RplSize = RPL_SIZE; 490 unsigned short TplSize = TPL_SIZE; 491 unsigned short BufferSize = BUFFER_SIZE; 492 int i; 493 494 tp = netdev_priv(dev); 495 496 tp->ocpl.OPENOptions = 0; 497 tp->ocpl.OPENOptions |= ENABLE_FULL_DUPLEX_SELECTION; 498 tp->ocpl.FullDuplex = 0; 499 tp->ocpl.FullDuplex |= OPEN_FULL_DUPLEX_OFF; 500 501 /* 502 * Set node address 503 * 504 * We go ahead and put it in the OPB even though on 505 * most of the generic adapters this isn't required. 506 * Its simpler this way. -- ASF 507 */ 508 for (i=0;i<6;i++) 509 tp->ocpl.NodeAddr[i] = ((unsigned char *)dev->dev_addr)[i]; 510 511 tp->ocpl.GroupAddr = 0; 512 tp->ocpl.FunctAddr = 0; 513 tp->ocpl.RxListSize = cpu_to_be16((unsigned short)RplSize); 514 tp->ocpl.TxListSize = cpu_to_be16((unsigned short)TplSize); 515 tp->ocpl.BufSize = cpu_to_be16((unsigned short)BufferSize); 516 tp->ocpl.Reserved = 0; 517 tp->ocpl.TXBufMin = TX_BUF_MIN; 518 tp->ocpl.TXBufMax = TX_BUF_MAX; 519 520 Addr = htonl(((char *)tp->ProductID - (char *)tp) + tp->dmabuffer); 521 522 tp->ocpl.ProdIDAddr[0] = LOWORD(Addr); 523 tp->ocpl.ProdIDAddr[1] = HIWORD(Addr); 524} 525 526/* 527 * Send OPEN command to adapter 528 */ 529static void tms380tr_open_adapter(struct net_device *dev) 530{ 531 struct net_local *tp = netdev_priv(dev); 532 533 if(tp->OpenCommandIssued) 534 return; 535 536 tp->OpenCommandIssued = 1; 537 tms380tr_exec_cmd(dev, OC_OPEN); 538} 539 540/* 541 * Clear the adapter's interrupt flag. Clear system interrupt enable 542 * (SINTEN): disable adapter to system interrupts. 543 */ 544static void tms380tr_disable_interrupts(struct net_device *dev) 545{ 546 SIFWRITEB(0, SIFACL); 547} 548 549/* 550 * Set the adapter's interrupt flag. Set system interrupt enable 551 * (SINTEN): enable adapter to system interrupts. 552 */ 553static void tms380tr_enable_interrupts(struct net_device *dev) 554{ 555 SIFWRITEB(ACL_SINTEN, SIFACL); 556} 557 558/* 559 * Put command in command queue, try to execute it. 560 */ 561static void tms380tr_exec_cmd(struct net_device *dev, unsigned short Command) 562{ 563 struct net_local *tp = netdev_priv(dev); 564 565 tp->CMDqueue |= Command; 566 tms380tr_chk_outstanding_cmds(dev); 567} 568 569static void tms380tr_timeout(struct net_device *dev) 570{ 571 /* 572 * If we get here, some higher level has decided we are broken. 573 * There should really be a "kick me" function call instead. 574 * 575 * Resetting the token ring adapter takes a long time so just 576 * fake transmission time and go on trying. Our own timeout 577 * routine is in tms380tr_timer_chk() 578 */ 579 dev->trans_start = jiffies; /* prevent tx timeout */ 580 netif_wake_queue(dev); 581} 582 583/* 584 * Gets skb from system, queues it and checks if it can be sent 585 */ 586static netdev_tx_t tms380tr_send_packet(struct sk_buff *skb, 587 struct net_device *dev) 588{ 589 struct net_local *tp = netdev_priv(dev); 590 netdev_tx_t rc; 591 592 rc = tms380tr_hardware_send_packet(skb, dev); 593 if(tp->TplFree->NextTPLPtr->BusyFlag) 594 netif_stop_queue(dev); 595 return rc; 596} 597 598/* 599 * Move frames into adapter tx queue 600 */ 601static netdev_tx_t tms380tr_hardware_send_packet(struct sk_buff *skb, 602 struct net_device *dev) 603{ 604 TPL *tpl; 605 short length; 606 unsigned char *buf; 607 unsigned long flags; 608 int i; 609 dma_addr_t dmabuf, newbuf; 610 struct net_local *tp = netdev_priv(dev); 611 612 /* Try to get a free TPL from the chain. 613 * 614 * NOTE: We *must* always leave one unused TPL in the chain, 615 * because otherwise the adapter might send frames twice. 616 */ 617 spin_lock_irqsave(&tp->lock, flags); 618 if(tp->TplFree->NextTPLPtr->BusyFlag) { /* No free TPL */ 619 if (tms380tr_debug > 0) 620 printk(KERN_DEBUG "%s: No free TPL\n", dev->name); 621 spin_unlock_irqrestore(&tp->lock, flags); 622 return NETDEV_TX_BUSY; 623 } 624 625 dmabuf = 0; 626 627 /* Is buffer reachable for Busmaster-DMA? */ 628 629 length = skb->len; 630 dmabuf = dma_map_single(tp->pdev, skb->data, length, DMA_TO_DEVICE); 631 if(tp->dmalimit && (dmabuf + length > tp->dmalimit)) { 632 /* Copy frame to local buffer */ 633 dma_unmap_single(tp->pdev, dmabuf, length, DMA_TO_DEVICE); 634 dmabuf = 0; 635 i = tp->TplFree->TPLIndex; 636 buf = tp->LocalTxBuffers[i]; 637 skb_copy_from_linear_data(skb, buf, length); 638 newbuf = ((char *)buf - (char *)tp) + tp->dmabuffer; 639 } 640 else { 641 /* Send direct from skb->data */ 642 newbuf = dmabuf; 643 buf = skb->data; 644 } 645 /* Source address in packet? */ 646 tms380tr_chk_src_addr(buf, dev->dev_addr); 647 tp->LastSendTime = jiffies; 648 tpl = tp->TplFree; /* Get the "free" TPL */ 649 tpl->BusyFlag = 1; /* Mark TPL as busy */ 650 tp->TplFree = tpl->NextTPLPtr; 651 652 /* Save the skb for delayed return of skb to system */ 653 tpl->Skb = skb; 654 tpl->DMABuff = dmabuf; 655 tpl->FragList[0].DataCount = cpu_to_be16((unsigned short)length); 656 tpl->FragList[0].DataAddr = htonl(newbuf); 657 658 /* Write the data length in the transmit list. */ 659 tpl->FrameSize = cpu_to_be16((unsigned short)length); 660 tpl->MData = buf; 661 662 /* Transmit the frame and set the status values. */ 663 tms380tr_write_tpl_status(tpl, TX_VALID | TX_START_FRAME 664 | TX_END_FRAME | TX_PASS_SRC_ADDR 665 | TX_FRAME_IRQ); 666 667 /* Let adapter send the frame. */ 668 tms380tr_exec_sifcmd(dev, CMD_TX_VALID); 669 spin_unlock_irqrestore(&tp->lock, flags); 670 671 return NETDEV_TX_OK; 672} 673 674/* 675 * Write the given value to the 'Status' field of the specified TPL. 676 * NOTE: This function should be used whenever the status of any TPL must be 677 * modified by the driver, because the compiler may otherwise change the 678 * order of instructions such that writing the TPL status may be executed at 679 * an undesirable time. When this function is used, the status is always 680 * written when the function is called. 681 */ 682static void tms380tr_write_tpl_status(TPL *tpl, unsigned int Status) 683{ 684 tpl->Status = Status; 685} 686 687static void tms380tr_chk_src_addr(unsigned char *frame, unsigned char *hw_addr) 688{ 689 unsigned char SRBit; 690 691 if((((unsigned long)frame[8]) & ~0x80) != 0) /* Compare 4 bytes */ 692 return; 693 if((unsigned short)frame[12] != 0) /* Compare 2 bytes */ 694 return; 695 696 SRBit = frame[8] & 0x80; 697 memcpy(&frame[8], hw_addr, 6); 698 frame[8] |= SRBit; 699} 700 701/* 702 * The timer routine: Check if adapter still open and working, reopen if not. 703 */ 704static void tms380tr_timer_chk(unsigned long data) 705{ 706 struct net_device *dev = (struct net_device*)data; 707 struct net_local *tp = netdev_priv(dev); 708 709 if(tp->HaltInProgress) 710 return; 711 712 tms380tr_chk_outstanding_cmds(dev); 713 if(time_before(tp->LastSendTime + SEND_TIMEOUT, jiffies) && 714 (tp->TplFree != tp->TplBusy)) 715 { 716 /* Anything to send, but stalled too long */ 717 tp->LastSendTime = jiffies; 718 tms380tr_exec_cmd(dev, OC_CLOSE); /* Does reopen automatically */ 719 } 720 721 tp->timer.expires = jiffies + 2*HZ; 722 add_timer(&tp->timer); 723 724 if(tp->AdapterOpenFlag || tp->ReOpenInProgress) 725 return; 726 tp->ReOpenInProgress = 1; 727 tms380tr_open_adapter(dev); 728} 729 730/* 731 * The typical workload of the driver: Handle the network interface interrupts. 732 */ 733irqreturn_t tms380tr_interrupt(int irq, void *dev_id) 734{ 735 struct net_device *dev = dev_id; 736 struct net_local *tp; 737 unsigned short irq_type; 738 int handled = 0; 739 740 tp = netdev_priv(dev); 741 742 irq_type = SIFREADW(SIFSTS); 743 744 while(irq_type & STS_SYSTEM_IRQ) { 745 handled = 1; 746 irq_type &= STS_IRQ_MASK; 747 748 if(!tms380tr_chk_ssb(tp, irq_type)) { 749 printk(KERN_DEBUG "%s: DATA LATE occurred\n", dev->name); 750 break; 751 } 752 753 switch(irq_type) { 754 case STS_IRQ_RECEIVE_STATUS: 755 tms380tr_reset_interrupt(dev); 756 tms380tr_rcv_status_irq(dev); 757 break; 758 759 case STS_IRQ_TRANSMIT_STATUS: 760 /* Check if TRANSMIT.HALT command is complete */ 761 if(tp->ssb.Parm[0] & COMMAND_COMPLETE) { 762 tp->TransmitCommandActive = 0; 763 tp->TransmitHaltScheduled = 0; 764 765 /* Issue a new transmit command. */ 766 tms380tr_exec_cmd(dev, OC_TRANSMIT); 767 } 768 769 tms380tr_reset_interrupt(dev); 770 tms380tr_tx_status_irq(dev); 771 break; 772 773 case STS_IRQ_COMMAND_STATUS: 774 /* The SSB contains status of last command 775 * other than receive/transmit. 776 */ 777 tms380tr_cmd_status_irq(dev); 778 break; 779 780 case STS_IRQ_SCB_CLEAR: 781 /* The SCB is free for another command. */ 782 tp->ScbInUse = 0; 783 tms380tr_chk_outstanding_cmds(dev); 784 break; 785 786 case STS_IRQ_RING_STATUS: 787 tms380tr_ring_status_irq(dev); 788 break; 789 790 case STS_IRQ_ADAPTER_CHECK: 791 tms380tr_chk_irq(dev); 792 break; 793 794 case STS_IRQ_LLC_STATUS: 795 printk(KERN_DEBUG "tms380tr: unexpected LLC status IRQ\n"); 796 break; 797 798 case STS_IRQ_TIMER: 799 printk(KERN_DEBUG "tms380tr: unexpected Timer IRQ\n"); 800 break; 801 802 case STS_IRQ_RECEIVE_PENDING: 803 printk(KERN_DEBUG "tms380tr: unexpected Receive Pending IRQ\n"); 804 break; 805 806 default: 807 printk(KERN_DEBUG "Unknown Token Ring IRQ (0x%04x)\n", irq_type); 808 break; 809 } 810 811 /* Reset system interrupt if not already done. */ 812 if(irq_type != STS_IRQ_TRANSMIT_STATUS && 813 irq_type != STS_IRQ_RECEIVE_STATUS) { 814 tms380tr_reset_interrupt(dev); 815 } 816 817 irq_type = SIFREADW(SIFSTS); 818 } 819 820 return IRQ_RETVAL(handled); 821} 822 823/* 824 * Reset the INTERRUPT SYSTEM bit and issue SSB CLEAR command. 825 */ 826static void tms380tr_reset_interrupt(struct net_device *dev) 827{ 828 struct net_local *tp = netdev_priv(dev); 829 SSB *ssb = &tp->ssb; 830 831 /* 832 * [Workaround for "Data Late"] 833 * Set all fields of the SSB to well-defined values so we can 834 * check if the adapter has written the SSB. 835 */ 836 837 ssb->STS = (unsigned short) -1; 838 ssb->Parm[0] = (unsigned short) -1; 839 ssb->Parm[1] = (unsigned short) -1; 840 ssb->Parm[2] = (unsigned short) -1; 841 842 /* Free SSB by issuing SSB_CLEAR command after reading IRQ code 843 * and clear STS_SYSTEM_IRQ bit: enable adapter for further interrupts. 844 */ 845 tms380tr_exec_sifcmd(dev, CMD_SSB_CLEAR | CMD_CLEAR_SYSTEM_IRQ); 846} 847 848/* 849 * Check if the SSB has actually been written by the adapter. 850 */ 851static unsigned char tms380tr_chk_ssb(struct net_local *tp, unsigned short IrqType) 852{ 853 SSB *ssb = &tp->ssb; /* The address of the SSB. */ 854 855 /* C 0 1 2 INTERRUPT CODE 856 * - - - - -------------- 857 * 1 1 1 1 TRANSMIT STATUS 858 * 1 1 1 1 RECEIVE STATUS 859 * 1 ? ? 0 COMMAND STATUS 860 * 0 0 0 0 SCB CLEAR 861 * 1 1 0 0 RING STATUS 862 * 0 0 0 0 ADAPTER CHECK 863 * 864 * 0 = SSB field not affected by interrupt 865 * 1 = SSB field is affected by interrupt 866 * 867 * C = SSB ADDRESS +0: COMMAND 868 * 0 = SSB ADDRESS +2: STATUS 0 869 * 1 = SSB ADDRESS +4: STATUS 1 870 * 2 = SSB ADDRESS +6: STATUS 2 871 */ 872 873 /* Check if this interrupt does use the SSB. */ 874 875 if(IrqType != STS_IRQ_TRANSMIT_STATUS && 876 IrqType != STS_IRQ_RECEIVE_STATUS && 877 IrqType != STS_IRQ_COMMAND_STATUS && 878 IrqType != STS_IRQ_RING_STATUS) 879 { 880 return (1); /* SSB not involved. */ 881 } 882 883 /* Note: All fields of the SSB have been set to all ones (-1) after it 884 * has last been used by the software (see DriverIsr()). 885 * 886 * Check if the affected SSB fields are still unchanged. 887 */ 888 889 if(ssb->STS == (unsigned short) -1) 890 return (0); /* Command field not yet available. */ 891 if(IrqType == STS_IRQ_COMMAND_STATUS) 892 return (1); /* Status fields not always affected. */ 893 if(ssb->Parm[0] == (unsigned short) -1) 894 return (0); /* Status 1 field not yet available. */ 895 if(IrqType == STS_IRQ_RING_STATUS) 896 return (1); /* Status 2 & 3 fields not affected. */ 897 898 /* Note: At this point, the interrupt is either TRANSMIT or RECEIVE. */ 899 if(ssb->Parm[1] == (unsigned short) -1) 900 return (0); /* Status 2 field not yet available. */ 901 if(ssb->Parm[2] == (unsigned short) -1) 902 return (0); /* Status 3 field not yet available. */ 903 904 return (1); /* All SSB fields have been written by the adapter. */ 905} 906 907/* 908 * Evaluates the command results status in the SSB status field. 909 */ 910static void tms380tr_cmd_status_irq(struct net_device *dev) 911{ 912 struct net_local *tp = netdev_priv(dev); 913 unsigned short ssb_cmd, ssb_parm_0; 914 unsigned short ssb_parm_1; 915 char *open_err = "Open error -"; 916 char *code_err = "Open code -"; 917 918 /* Copy the ssb values to local variables */ 919 ssb_cmd = tp->ssb.STS; 920 ssb_parm_0 = tp->ssb.Parm[0]; 921 ssb_parm_1 = tp->ssb.Parm[1]; 922 923 if(ssb_cmd == OPEN) 924 { 925 tp->Sleeping = 0; 926 if(!tp->ReOpenInProgress) 927 wake_up_interruptible(&tp->wait_for_tok_int); 928 929 tp->OpenCommandIssued = 0; 930 tp->ScbInUse = 0; 931 932 if((ssb_parm_0 & 0x00FF) == GOOD_COMPLETION) 933 { 934 /* Success, the adapter is open. */ 935 tp->LobeWireFaultLogged = 0; 936 tp->AdapterOpenFlag = 1; 937 tp->AdapterVirtOpenFlag = 1; 938 tp->TransmitCommandActive = 0; 939 tms380tr_exec_cmd(dev, OC_TRANSMIT); 940 tms380tr_exec_cmd(dev, OC_RECEIVE); 941 942 if(tp->ReOpenInProgress) 943 tp->ReOpenInProgress = 0; 944 945 return; 946 } 947 else /* The adapter did not open. */ 948 { 949 if(ssb_parm_0 & NODE_ADDR_ERROR) 950 printk(KERN_INFO "%s: Node address error\n", 951 dev->name); 952 if(ssb_parm_0 & LIST_SIZE_ERROR) 953 printk(KERN_INFO "%s: List size error\n", 954 dev->name); 955 if(ssb_parm_0 & BUF_SIZE_ERROR) 956 printk(KERN_INFO "%s: Buffer size error\n", 957 dev->name); 958 if(ssb_parm_0 & TX_BUF_COUNT_ERROR) 959 printk(KERN_INFO "%s: Tx buffer count error\n", 960 dev->name); 961 if(ssb_parm_0 & INVALID_OPEN_OPTION) 962 printk(KERN_INFO "%s: Invalid open option\n", 963 dev->name); 964 if(ssb_parm_0 & OPEN_ERROR) 965 { 966 /* Show the open phase. */ 967 switch(ssb_parm_0 & OPEN_PHASES_MASK) 968 { 969 case LOBE_MEDIA_TEST: 970 if(!tp->LobeWireFaultLogged) 971 { 972 tp->LobeWireFaultLogged = 1; 973 printk(KERN_INFO "%s: %s Lobe wire fault (check cable !).\n", dev->name, open_err); 974 } 975 tp->ReOpenInProgress = 1; 976 tp->AdapterOpenFlag = 0; 977 tp->AdapterVirtOpenFlag = 1; 978 tms380tr_open_adapter(dev); 979 return; 980 981 case PHYSICAL_INSERTION: 982 printk(KERN_INFO "%s: %s Physical insertion.\n", dev->name, open_err); 983 break; 984 985 case ADDRESS_VERIFICATION: 986 printk(KERN_INFO "%s: %s Address verification.\n", dev->name, open_err); 987 break; 988 989 case PARTICIPATION_IN_RING_POLL: 990 printk(KERN_INFO "%s: %s Participation in ring poll.\n", dev->name, open_err); 991 break; 992 993 case REQUEST_INITIALISATION: 994 printk(KERN_INFO "%s: %s Request initialisation.\n", dev->name, open_err); 995 break; 996 997 case FULLDUPLEX_CHECK: 998 printk(KERN_INFO "%s: %s Full duplex check.\n", dev->name, open_err); 999 break; 1000 1001 default: 1002 printk(KERN_INFO "%s: %s Unknown open phase\n", dev->name, open_err); 1003 break; 1004 } 1005 1006 /* Show the open errors. */ 1007 switch(ssb_parm_0 & OPEN_ERROR_CODES_MASK) 1008 { 1009 case OPEN_FUNCTION_FAILURE: 1010 printk(KERN_INFO "%s: %s OPEN_FUNCTION_FAILURE", dev->name, code_err); 1011 tp->LastOpenStatus = 1012 OPEN_FUNCTION_FAILURE; 1013 break; 1014 1015 case OPEN_SIGNAL_LOSS: 1016 printk(KERN_INFO "%s: %s OPEN_SIGNAL_LOSS\n", dev->name, code_err); 1017 tp->LastOpenStatus = 1018 OPEN_SIGNAL_LOSS; 1019 break; 1020 1021 case OPEN_TIMEOUT: 1022 printk(KERN_INFO "%s: %s OPEN_TIMEOUT\n", dev->name, code_err); 1023 tp->LastOpenStatus = 1024 OPEN_TIMEOUT; 1025 break; 1026 1027 case OPEN_RING_FAILURE: 1028 printk(KERN_INFO "%s: %s OPEN_RING_FAILURE\n", dev->name, code_err); 1029 tp->LastOpenStatus = 1030 OPEN_RING_FAILURE; 1031 break; 1032 1033 case OPEN_RING_BEACONING: 1034 printk(KERN_INFO "%s: %s OPEN_RING_BEACONING\n", dev->name, code_err); 1035 tp->LastOpenStatus = 1036 OPEN_RING_BEACONING; 1037 break; 1038 1039 case OPEN_DUPLICATE_NODEADDR: 1040 printk(KERN_INFO "%s: %s OPEN_DUPLICATE_NODEADDR\n", dev->name, code_err); 1041 tp->LastOpenStatus = 1042 OPEN_DUPLICATE_NODEADDR; 1043 break; 1044 1045 case OPEN_REQUEST_INIT: 1046 printk(KERN_INFO "%s: %s OPEN_REQUEST_INIT\n", dev->name, code_err); 1047 tp->LastOpenStatus = 1048 OPEN_REQUEST_INIT; 1049 break; 1050 1051 case OPEN_REMOVE_RECEIVED: 1052 printk(KERN_INFO "%s: %s OPEN_REMOVE_RECEIVED", dev->name, code_err); 1053 tp->LastOpenStatus = 1054 OPEN_REMOVE_RECEIVED; 1055 break; 1056 1057 case OPEN_FULLDUPLEX_SET: 1058 printk(KERN_INFO "%s: %s OPEN_FULLDUPLEX_SET\n", dev->name, code_err); 1059 tp->LastOpenStatus = 1060 OPEN_FULLDUPLEX_SET; 1061 break; 1062 1063 default: 1064 printk(KERN_INFO "%s: %s Unknown open err code", dev->name, code_err); 1065 tp->LastOpenStatus = 1066 OPEN_FUNCTION_FAILURE; 1067 break; 1068 } 1069 } 1070 1071 tp->AdapterOpenFlag = 0; 1072 tp->AdapterVirtOpenFlag = 0; 1073 1074 return; 1075 } 1076 } 1077 else 1078 { 1079 if(ssb_cmd != READ_ERROR_LOG) 1080 return; 1081 1082 /* Add values from the error log table to the MAC 1083 * statistics counters and update the errorlogtable 1084 * memory. 1085 */ 1086 tp->MacStat.line_errors += tp->errorlogtable.Line_Error; 1087 tp->MacStat.burst_errors += tp->errorlogtable.Burst_Error; 1088 tp->MacStat.A_C_errors += tp->errorlogtable.ARI_FCI_Error; 1089 tp->MacStat.lost_frames += tp->errorlogtable.Lost_Frame_Error; 1090 tp->MacStat.recv_congest_count += tp->errorlogtable.Rx_Congest_Error; 1091 tp->MacStat.rx_errors += tp->errorlogtable.Rx_Congest_Error; 1092 tp->MacStat.frame_copied_errors += tp->errorlogtable.Frame_Copied_Error; 1093 tp->MacStat.token_errors += tp->errorlogtable.Token_Error; 1094 tp->MacStat.dummy1 += tp->errorlogtable.DMA_Bus_Error; 1095 tp->MacStat.dummy1 += tp->errorlogtable.DMA_Parity_Error; 1096 tp->MacStat.abort_delimiters += tp->errorlogtable.AbortDelimeters; 1097 tp->MacStat.frequency_errors += tp->errorlogtable.Frequency_Error; 1098 tp->MacStat.internal_errors += tp->errorlogtable.Internal_Error; 1099 } 1100} 1101 1102/* 1103 * The inverse routine to tms380tr_open(). 1104 */ 1105int tms380tr_close(struct net_device *dev) 1106{ 1107 struct net_local *tp = netdev_priv(dev); 1108 netif_stop_queue(dev); 1109 1110 del_timer(&tp->timer); 1111 1112 /* Flush the Tx and disable Rx here. */ 1113 1114 tp->HaltInProgress = 1; 1115 tms380tr_exec_cmd(dev, OC_CLOSE); 1116 tp->timer.expires = jiffies + 1*HZ; 1117 tp->timer.function = tms380tr_timer_end_wait; 1118 tp->timer.data = (unsigned long)dev; 1119 add_timer(&tp->timer); 1120 1121 tms380tr_enable_interrupts(dev); 1122 1123 tp->Sleeping = 1; 1124 interruptible_sleep_on(&tp->wait_for_tok_int); 1125 tp->TransmitCommandActive = 0; 1126 1127 del_timer(&tp->timer); 1128 tms380tr_disable_interrupts(dev); 1129 1130#ifdef CONFIG_ISA 1131 if(dev->dma > 0) 1132 { 1133 unsigned long flags=claim_dma_lock(); 1134 disable_dma(dev->dma); 1135 release_dma_lock(flags); 1136 } 1137#endif 1138 1139 SIFWRITEW(0xFF00, SIFCMD); 1140#if 0 1141 if(dev->dma > 0) /* what the? */ 1142 SIFWRITEB(0xff, POSREG); 1143#endif 1144 tms380tr_cancel_tx_queue(tp); 1145 1146 return (0); 1147} 1148 1149/* 1150 * Get the current statistics. This may be called with the card open 1151 * or closed. 1152 */ 1153static struct net_device_stats *tms380tr_get_stats(struct net_device *dev) 1154{ 1155 struct net_local *tp = netdev_priv(dev); 1156 1157 return ((struct net_device_stats *)&tp->MacStat); 1158} 1159 1160/* 1161 * Set or clear the multicast filter for this adapter. 1162 */ 1163static void tms380tr_set_multicast_list(struct net_device *dev) 1164{ 1165 struct net_local *tp = netdev_priv(dev); 1166 unsigned int OpenOptions; 1167 1168 OpenOptions = tp->ocpl.OPENOptions & 1169 ~(PASS_ADAPTER_MAC_FRAMES 1170 | PASS_ATTENTION_FRAMES 1171 | PASS_BEACON_MAC_FRAMES 1172 | COPY_ALL_MAC_FRAMES 1173 | COPY_ALL_NON_MAC_FRAMES); 1174 1175 tp->ocpl.FunctAddr = 0; 1176 1177 if(dev->flags & IFF_PROMISC) 1178 /* Enable promiscuous mode */ 1179 OpenOptions |= COPY_ALL_NON_MAC_FRAMES | 1180 COPY_ALL_MAC_FRAMES; 1181 else 1182 { 1183 if(dev->flags & IFF_ALLMULTI) 1184 { 1185 /* Disable promiscuous mode, use normal mode. */ 1186 tp->ocpl.FunctAddr = 0xFFFFFFFF; 1187 } 1188 else 1189 { 1190 struct netdev_hw_addr *ha; 1191 1192 netdev_for_each_mc_addr(ha, dev) { 1193 ((char *)(&tp->ocpl.FunctAddr))[0] |= 1194 ha->addr[2]; 1195 ((char *)(&tp->ocpl.FunctAddr))[1] |= 1196 ha->addr[3]; 1197 ((char *)(&tp->ocpl.FunctAddr))[2] |= 1198 ha->addr[4]; 1199 ((char *)(&tp->ocpl.FunctAddr))[3] |= 1200 ha->addr[5]; 1201 } 1202 } 1203 tms380tr_exec_cmd(dev, OC_SET_FUNCT_ADDR); 1204 } 1205 1206 tp->ocpl.OPENOptions = OpenOptions; 1207 tms380tr_exec_cmd(dev, OC_MODIFY_OPEN_PARMS); 1208} 1209 1210/* 1211 * Wait for some time (microseconds) 1212 */ 1213void tms380tr_wait(unsigned long time) 1214{ 1215#if 0 1216 long tmp; 1217 1218 tmp = jiffies + time/(1000000/HZ); 1219 do { 1220 tmp = schedule_timeout_interruptible(tmp); 1221 } while(time_after(tmp, jiffies)); 1222#else 1223 udelay(time); 1224#endif 1225} 1226 1227/* 1228 * Write a command value to the SIFCMD register 1229 */ 1230static void tms380tr_exec_sifcmd(struct net_device *dev, unsigned int WriteValue) 1231{ 1232 unsigned short cmd; 1233 unsigned short SifStsValue; 1234 unsigned long loop_counter; 1235 1236 WriteValue = ((WriteValue ^ CMD_SYSTEM_IRQ) | CMD_INTERRUPT_ADAPTER); 1237 cmd = (unsigned short)WriteValue; 1238 loop_counter = 0,5 * 800000; 1239 do { 1240 SifStsValue = SIFREADW(SIFSTS); 1241 } while((SifStsValue & CMD_INTERRUPT_ADAPTER) && loop_counter--); 1242 SIFWRITEW(cmd, SIFCMD); 1243} 1244 1245/* 1246 * Processes adapter hardware reset, halts adapter and downloads firmware, 1247 * clears the halt bit. 1248 */ 1249static int tms380tr_reset_adapter(struct net_device *dev) 1250{ 1251 struct net_local *tp = netdev_priv(dev); 1252 unsigned short *fw_ptr; 1253 unsigned short count, c, count2; 1254 const struct firmware *fw_entry = NULL; 1255 1256 if (request_firmware(&fw_entry, "tms380tr.bin", tp->pdev) != 0) { 1257 printk(KERN_ALERT "%s: firmware %s is missing, cannot start.\n", 1258 dev->name, "tms380tr.bin"); 1259 return (-1); 1260 } 1261 1262 fw_ptr = (unsigned short *)fw_entry->data; 1263 count2 = fw_entry->size / 2; 1264 1265 /* Hardware adapter reset */ 1266 SIFWRITEW(ACL_ARESET, SIFACL); 1267 tms380tr_wait(40); 1268 1269 c = SIFREADW(SIFACL); 1270 tms380tr_wait(20); 1271 1272 if(dev->dma == 0) /* For PCI adapters */ 1273 { 1274 c &= ~(ACL_NSELOUT0 | ACL_NSELOUT1); /* Clear bits */ 1275 if(tp->setnselout) 1276 c |= (*tp->setnselout)(dev); 1277 } 1278 1279 /* In case a command is pending - forget it */ 1280 tp->ScbInUse = 0; 1281 1282 c &= ~ACL_ARESET; /* Clear adapter reset bit */ 1283 c |= ACL_CPHALT; /* Halt adapter CPU, allow download */ 1284 c |= ACL_BOOT; 1285 c |= ACL_SINTEN; 1286 c &= ~ACL_PSDMAEN; /* Clear pseudo dma bit */ 1287 SIFWRITEW(c, SIFACL); 1288 tms380tr_wait(40); 1289 1290 count = 0; 1291 /* Download firmware via DIO interface: */ 1292 do { 1293 if (count2 < 3) continue; 1294 1295 /* Download first address part */ 1296 SIFWRITEW(*fw_ptr, SIFADX); 1297 fw_ptr++; 1298 count2--; 1299 /* Download second address part */ 1300 SIFWRITEW(*fw_ptr, SIFADD); 1301 fw_ptr++; 1302 count2--; 1303 1304 if((count = *fw_ptr) != 0) /* Load loop counter */ 1305 { 1306 fw_ptr++; /* Download block data */ 1307 count2--; 1308 if (count > count2) continue; 1309 1310 for(; count > 0; count--) 1311 { 1312 SIFWRITEW(*fw_ptr, SIFINC); 1313 fw_ptr++; 1314 count2--; 1315 } 1316 } 1317 else /* Stop, if last block downloaded */ 1318 { 1319 c = SIFREADW(SIFACL); 1320 c &= (~ACL_CPHALT | ACL_SINTEN); 1321 1322 /* Clear CPHALT and start BUD */ 1323 SIFWRITEW(c, SIFACL); 1324 if (fw_entry) 1325 release_firmware(fw_entry); 1326 return (1); 1327 } 1328 } while(count == 0); 1329 1330 if (fw_entry) 1331 release_firmware(fw_entry); 1332 printk(KERN_INFO "%s: Adapter Download Failed\n", dev->name); 1333 return (-1); 1334} 1335 1336MODULE_FIRMWARE("tms380tr.bin"); 1337 1338/* 1339 * Starts bring up diagnostics of token ring adapter and evaluates 1340 * diagnostic results. 1341 */ 1342static int tms380tr_bringup_diags(struct net_device *dev) 1343{ 1344 int loop_cnt, retry_cnt; 1345 unsigned short Status; 1346 1347 tms380tr_wait(HALF_SECOND); 1348 tms380tr_exec_sifcmd(dev, EXEC_SOFT_RESET); 1349 tms380tr_wait(HALF_SECOND); 1350 1351 retry_cnt = BUD_MAX_RETRIES; /* maximal number of retrys */ 1352 1353 do { 1354 retry_cnt--; 1355 if(tms380tr_debug > 3) 1356 printk(KERN_DEBUG "BUD-Status: "); 1357 loop_cnt = BUD_MAX_LOOPCNT; /* maximum: three seconds*/ 1358 do { /* Inspect BUD results */ 1359 loop_cnt--; 1360 tms380tr_wait(HALF_SECOND); 1361 Status = SIFREADW(SIFSTS); 1362 Status &= STS_MASK; 1363 1364 if(tms380tr_debug > 3) 1365 printk(KERN_DEBUG " %04X\n", Status); 1366 /* BUD successfully completed */ 1367 if(Status == STS_INITIALIZE) 1368 return (1); 1369 /* Unrecoverable hardware error, BUD not completed? */ 1370 } while((loop_cnt > 0) && ((Status & (STS_ERROR | STS_TEST)) 1371 != (STS_ERROR | STS_TEST))); 1372 1373 /* Error preventing completion of BUD */ 1374 if(retry_cnt > 0) 1375 { 1376 printk(KERN_INFO "%s: Adapter Software Reset.\n", 1377 dev->name); 1378 tms380tr_exec_sifcmd(dev, EXEC_SOFT_RESET); 1379 tms380tr_wait(HALF_SECOND); 1380 } 1381 } while(retry_cnt > 0); 1382 1383 Status = SIFREADW(SIFSTS); 1384 1385 printk(KERN_INFO "%s: Hardware error\n", dev->name); 1386 /* Hardware error occurred! */ 1387 Status &= 0x001f; 1388 if (Status & 0x0010) 1389 printk(KERN_INFO "%s: BUD Error: Timeout\n", dev->name); 1390 else if ((Status & 0x000f) > 6) 1391 printk(KERN_INFO "%s: BUD Error: Illegal Failure\n", dev->name); 1392 else 1393 printk(KERN_INFO "%s: Bring Up Diagnostics Error (%04X) occurred\n", dev->name, Status & 0x000f); 1394 1395 return (-1); 1396} 1397 1398/* 1399 * Copy initialisation data to adapter memory, beginning at address 1400 * 1:0A00; Starting DMA test and evaluating result bits. 1401 */ 1402static int tms380tr_init_adapter(struct net_device *dev) 1403{ 1404 struct net_local *tp = netdev_priv(dev); 1405 1406 const unsigned char SCB_Test[6] = {0x00, 0x00, 0xC1, 0xE2, 0xD4, 0x8B}; 1407 const unsigned char SSB_Test[8] = {0xFF, 0xFF, 0xD1, 0xD7, 1408 0xC5, 0xD9, 0xC3, 0xD4}; 1409 void *ptr = (void *)&tp->ipb; 1410 unsigned short *ipb_ptr = (unsigned short *)ptr; 1411 unsigned char *cb_ptr = (unsigned char *) &tp->scb; 1412 unsigned char *sb_ptr = (unsigned char *) &tp->ssb; 1413 unsigned short Status; 1414 int i, loop_cnt, retry_cnt; 1415 1416 /* Normalize: byte order low/high, word order high/low! (only IPB!) */ 1417 tp->ipb.SCB_Addr = SWAPW(((char *)&tp->scb - (char *)tp) + tp->dmabuffer); 1418 tp->ipb.SSB_Addr = SWAPW(((char *)&tp->ssb - (char *)tp) + tp->dmabuffer); 1419 1420 if(tms380tr_debug > 3) 1421 { 1422 printk(KERN_DEBUG "%s: buffer (real): %lx\n", dev->name, (long) &tp->scb); 1423 printk(KERN_DEBUG "%s: buffer (virt): %lx\n", dev->name, (long) ((char *)&tp->scb - (char *)tp) + (long) tp->dmabuffer); 1424 printk(KERN_DEBUG "%s: buffer (DMA) : %lx\n", dev->name, (long) tp->dmabuffer); 1425 printk(KERN_DEBUG "%s: buffer (tp) : %lx\n", dev->name, (long) tp); 1426 } 1427 /* Maximum: three initialization retries */ 1428 retry_cnt = INIT_MAX_RETRIES; 1429 1430 do { 1431 retry_cnt--; 1432 1433 /* Transfer initialization block */ 1434 SIFWRITEW(0x0001, SIFADX); 1435 1436 /* To address 0001:0A00 of adapter RAM */ 1437 SIFWRITEW(0x0A00, SIFADD); 1438 1439 /* Write 11 words to adapter RAM */ 1440 for(i = 0; i < 11; i++) 1441 SIFWRITEW(ipb_ptr[i], SIFINC); 1442 1443 /* Execute SCB adapter command */ 1444 tms380tr_exec_sifcmd(dev, CMD_EXECUTE); 1445 1446 loop_cnt = INIT_MAX_LOOPCNT; /* Maximum: 11 seconds */ 1447 1448 /* While remaining retries, no error and not completed */ 1449 do { 1450 Status = 0; 1451 loop_cnt--; 1452 tms380tr_wait(HALF_SECOND); 1453 1454 /* Mask interesting status bits */ 1455 Status = SIFREADW(SIFSTS); 1456 Status &= STS_MASK; 1457 } while(((Status &(STS_INITIALIZE | STS_ERROR | STS_TEST)) != 0) && 1458 ((Status & STS_ERROR) == 0) && (loop_cnt != 0)); 1459 1460 if((Status & (STS_INITIALIZE | STS_ERROR | STS_TEST)) == 0) 1461 { 1462 /* Initialization completed without error */ 1463 i = 0; 1464 do { /* Test if contents of SCB is valid */ 1465 if(SCB_Test[i] != *(cb_ptr + i)) 1466 { 1467 printk(KERN_INFO "%s: DMA failed\n", dev->name); 1468 /* DMA data error: wrong data in SCB */ 1469 return (-1); 1470 } 1471 i++; 1472 } while(i < 6); 1473 1474 i = 0; 1475 do { /* Test if contents of SSB is valid */ 1476 if(SSB_Test[i] != *(sb_ptr + i)) 1477 /* DMA data error: wrong data in SSB */ 1478 return (-1); 1479 i++; 1480 } while (i < 8); 1481 1482 return (1); /* Adapter successfully initialized */ 1483 } 1484 else 1485 { 1486 if((Status & STS_ERROR) != 0) 1487 { 1488 /* Initialization error occurred */ 1489 Status = SIFREADW(SIFSTS); 1490 Status &= STS_ERROR_MASK; 1491 /* ShowInitialisationErrorCode(Status); */ 1492 printk(KERN_INFO "%s: Status error: %d\n", dev->name, Status); 1493 return (-1); /* Unrecoverable error */ 1494 } 1495 else 1496 { 1497 if(retry_cnt > 0) 1498 { 1499 /* Reset adapter and try init again */ 1500 tms380tr_exec_sifcmd(dev, EXEC_SOFT_RESET); 1501 tms380tr_wait(HALF_SECOND); 1502 } 1503 } 1504 } 1505 } while(retry_cnt > 0); 1506 1507 printk(KERN_INFO "%s: Retry exceeded\n", dev->name); 1508 return (-1); 1509} 1510 1511/* 1512 * Check for outstanding commands in command queue and tries to execute 1513 * command immediately. Corresponding command flag in command queue is cleared. 1514 */ 1515static void tms380tr_chk_outstanding_cmds(struct net_device *dev) 1516{ 1517 struct net_local *tp = netdev_priv(dev); 1518 unsigned long Addr = 0; 1519 1520 if(tp->CMDqueue == 0) 1521 return; /* No command execution */ 1522 1523 /* If SCB in use: no command */ 1524 if(tp->ScbInUse == 1) 1525 return; 1526 1527 /* Check if adapter is opened, avoiding COMMAND_REJECT 1528 * interrupt by the adapter! 1529 */ 1530 if(tp->AdapterOpenFlag == 0) 1531 { 1532 if(tp->CMDqueue & OC_OPEN) 1533 { 1534 /* Execute OPEN command */ 1535 tp->CMDqueue ^= OC_OPEN; 1536 1537 Addr = htonl(((char *)&tp->ocpl - (char *)tp) + tp->dmabuffer); 1538 tp->scb.Parm[0] = LOWORD(Addr); 1539 tp->scb.Parm[1] = HIWORD(Addr); 1540 tp->scb.CMD = OPEN; 1541 } 1542 else 1543 /* No OPEN command queued, but adapter closed. Note: 1544 * We'll try to re-open the adapter in DriverPoll() 1545 */ 1546 return; /* No adapter command issued */ 1547 } 1548 else 1549 { 1550 /* Adapter is open; evaluate command queue: try to execute 1551 * outstanding commands (depending on priority!) CLOSE 1552 * command queued 1553 */ 1554 if(tp->CMDqueue & OC_CLOSE) 1555 { 1556 tp->CMDqueue ^= OC_CLOSE; 1557 tp->AdapterOpenFlag = 0; 1558 tp->scb.Parm[0] = 0; /* Parm[0], Parm[1] are ignored */ 1559 tp->scb.Parm[1] = 0; /* but should be set to zero! */ 1560 tp->scb.CMD = CLOSE; 1561 if(!tp->HaltInProgress) 1562 tp->CMDqueue |= OC_OPEN; /* re-open adapter */ 1563 else 1564 tp->CMDqueue = 0; /* no more commands */ 1565 } 1566 else 1567 { 1568 if(tp->CMDqueue & OC_RECEIVE) 1569 { 1570 tp->CMDqueue ^= OC_RECEIVE; 1571 Addr = htonl(((char *)tp->RplHead - (char *)tp) + tp->dmabuffer); 1572 tp->scb.Parm[0] = LOWORD(Addr); 1573 tp->scb.Parm[1] = HIWORD(Addr); 1574 tp->scb.CMD = RECEIVE; 1575 } 1576 else 1577 { 1578 if(tp->CMDqueue & OC_TRANSMIT_HALT) 1579 { 1580 /* NOTE: TRANSMIT.HALT must be checked 1581 * before TRANSMIT. 1582 */ 1583 tp->CMDqueue ^= OC_TRANSMIT_HALT; 1584 tp->scb.CMD = TRANSMIT_HALT; 1585 1586 /* Parm[0] and Parm[1] are ignored 1587 * but should be set to zero! 1588 */ 1589 tp->scb.Parm[0] = 0; 1590 tp->scb.Parm[1] = 0; 1591 } 1592 else 1593 { 1594 if(tp->CMDqueue & OC_TRANSMIT) 1595 { 1596 /* NOTE: TRANSMIT must be 1597 * checked after TRANSMIT.HALT 1598 */ 1599 if(tp->TransmitCommandActive) 1600 { 1601 if(!tp->TransmitHaltScheduled) 1602 { 1603 tp->TransmitHaltScheduled = 1; 1604 tms380tr_exec_cmd(dev, OC_TRANSMIT_HALT) ; 1605 } 1606 tp->TransmitCommandActive = 0; 1607 return; 1608 } 1609 1610 tp->CMDqueue ^= OC_TRANSMIT; 1611 tms380tr_cancel_tx_queue(tp); 1612 Addr = htonl(((char *)tp->TplBusy - (char *)tp) + tp->dmabuffer); 1613 tp->scb.Parm[0] = LOWORD(Addr); 1614 tp->scb.Parm[1] = HIWORD(Addr); 1615 tp->scb.CMD = TRANSMIT; 1616 tp->TransmitCommandActive = 1; 1617 } 1618 else 1619 { 1620 if(tp->CMDqueue & OC_MODIFY_OPEN_PARMS) 1621 { 1622 tp->CMDqueue ^= OC_MODIFY_OPEN_PARMS; 1623 tp->scb.Parm[0] = tp->ocpl.OPENOptions; /* new OPEN options*/ 1624 tp->scb.Parm[0] |= ENABLE_FULL_DUPLEX_SELECTION; 1625 tp->scb.Parm[1] = 0; /* is ignored but should be zero */ 1626 tp->scb.CMD = MODIFY_OPEN_PARMS; 1627 } 1628 else 1629 { 1630 if(tp->CMDqueue & OC_SET_FUNCT_ADDR) 1631 { 1632 tp->CMDqueue ^= OC_SET_FUNCT_ADDR; 1633 tp->scb.Parm[0] = LOWORD(tp->ocpl.FunctAddr); 1634 tp->scb.Parm[1] = HIWORD(tp->ocpl.FunctAddr); 1635 tp->scb.CMD = SET_FUNCT_ADDR; 1636 } 1637 else 1638 { 1639 if(tp->CMDqueue & OC_SET_GROUP_ADDR) 1640 { 1641 tp->CMDqueue ^= OC_SET_GROUP_ADDR; 1642 tp->scb.Parm[0] = LOWORD(tp->ocpl.GroupAddr); 1643 tp->scb.Parm[1] = HIWORD(tp->ocpl.GroupAddr); 1644 tp->scb.CMD = SET_GROUP_ADDR; 1645 } 1646 else 1647 { 1648 if(tp->CMDqueue & OC_READ_ERROR_LOG) 1649 { 1650 tp->CMDqueue ^= OC_READ_ERROR_LOG; 1651 Addr = htonl(((char *)&tp->errorlogtable - (char *)tp) + tp->dmabuffer); 1652 tp->scb.Parm[0] = LOWORD(Addr); 1653 tp->scb.Parm[1] = HIWORD(Addr); 1654 tp->scb.CMD = READ_ERROR_LOG; 1655 } 1656 else 1657 { 1658 printk(KERN_WARNING "CheckForOutstandingCommand: unknown Command\n"); 1659 tp->CMDqueue = 0; 1660 return; 1661 } 1662 } 1663 } 1664 } 1665 } 1666 } 1667 } 1668 } 1669 } 1670 1671 tp->ScbInUse = 1; /* Set semaphore: SCB in use. */ 1672 1673 /* Execute SCB and generate IRQ when done. */ 1674 tms380tr_exec_sifcmd(dev, CMD_EXECUTE | CMD_SCB_REQUEST); 1675} 1676 1677/* 1678 * IRQ conditions: signal loss on the ring, transmit or receive of beacon 1679 * frames (disabled if bit 1 of OPEN option is set); report error MAC 1680 * frame transmit (disabled if bit 2 of OPEN option is set); open or short 1681 * circuit fault on the lobe is detected; remove MAC frame received; 1682 * error counter overflow (255); opened adapter is the only station in ring. 1683 * After some of the IRQs the adapter is closed! 1684 */ 1685static void tms380tr_ring_status_irq(struct net_device *dev) 1686{ 1687 struct net_local *tp = netdev_priv(dev); 1688 1689 tp->CurrentRingStatus = be16_to_cpu((unsigned short)tp->ssb.Parm[0]); 1690 1691 /* First: fill up statistics */ 1692 if(tp->ssb.Parm[0] & SIGNAL_LOSS) 1693 { 1694 printk(KERN_INFO "%s: Signal Loss\n", dev->name); 1695 tp->MacStat.line_errors++; 1696 } 1697 1698 /* Adapter is closed, but initialized */ 1699 if(tp->ssb.Parm[0] & LOBE_WIRE_FAULT) 1700 { 1701 printk(KERN_INFO "%s: Lobe Wire Fault, Reopen Adapter\n", 1702 dev->name); 1703 tp->MacStat.line_errors++; 1704 } 1705 1706 if(tp->ssb.Parm[0] & RING_RECOVERY) 1707 printk(KERN_INFO "%s: Ring Recovery\n", dev->name); 1708 1709 /* Counter overflow: read error log */ 1710 if(tp->ssb.Parm[0] & COUNTER_OVERFLOW) 1711 { 1712 printk(KERN_INFO "%s: Counter Overflow\n", dev->name); 1713 tms380tr_exec_cmd(dev, OC_READ_ERROR_LOG); 1714 } 1715 1716 /* Adapter is closed, but initialized */ 1717 if(tp->ssb.Parm[0] & REMOVE_RECEIVED) 1718 printk(KERN_INFO "%s: Remove Received, Reopen Adapter\n", 1719 dev->name); 1720 1721 /* Adapter is closed, but initialized */ 1722 if(tp->ssb.Parm[0] & AUTO_REMOVAL_ERROR) 1723 printk(KERN_INFO "%s: Auto Removal Error, Reopen Adapter\n", 1724 dev->name); 1725 1726 if(tp->ssb.Parm[0] & HARD_ERROR) 1727 printk(KERN_INFO "%s: Hard Error\n", dev->name); 1728 1729 if(tp->ssb.Parm[0] & SOFT_ERROR) 1730 printk(KERN_INFO "%s: Soft Error\n", dev->name); 1731 1732 if(tp->ssb.Parm[0] & TRANSMIT_BEACON) 1733 printk(KERN_INFO "%s: Transmit Beacon\n", dev->name); 1734 1735 if(tp->ssb.Parm[0] & SINGLE_STATION) 1736 printk(KERN_INFO "%s: Single Station\n", dev->name); 1737 1738 /* Check if adapter has been closed */ 1739 if(tp->ssb.Parm[0] & ADAPTER_CLOSED) 1740 { 1741 printk(KERN_INFO "%s: Adapter closed (Reopening)," 1742 "CurrentRingStat %x\n", 1743 dev->name, tp->CurrentRingStatus); 1744 tp->AdapterOpenFlag = 0; 1745 tms380tr_open_adapter(dev); 1746 } 1747} 1748 1749/* 1750 * Issued if adapter has encountered an unrecoverable hardware 1751 * or software error. 1752 */ 1753static void tms380tr_chk_irq(struct net_device *dev) 1754{ 1755 int i; 1756 unsigned short AdapterCheckBlock[4]; 1757 struct net_local *tp = netdev_priv(dev); 1758 1759 tp->AdapterOpenFlag = 0; /* Adapter closed now */ 1760 1761 /* Page number of adapter memory */ 1762 SIFWRITEW(0x0001, SIFADX); 1763 /* Address offset */ 1764 SIFWRITEW(CHECKADDR, SIFADR); 1765 1766 /* Reading 8 byte adapter check block. */ 1767 for(i = 0; i < 4; i++) 1768 AdapterCheckBlock[i] = SIFREADW(SIFINC); 1769 1770 if(tms380tr_debug > 3) 1771 { 1772 printk(KERN_DEBUG "%s: AdapterCheckBlock: ", dev->name); 1773 for (i = 0; i < 4; i++) 1774 printk("%04X", AdapterCheckBlock[i]); 1775 printk("\n"); 1776 } 1777 1778 switch(AdapterCheckBlock[0]) 1779 { 1780 case DIO_PARITY: 1781 printk(KERN_INFO "%s: DIO parity error\n", dev->name); 1782 break; 1783 1784 case DMA_READ_ABORT: 1785 printk(KERN_INFO "%s DMA read operation aborted:\n", 1786 dev->name); 1787 switch (AdapterCheckBlock[1]) 1788 { 1789 case 0: 1790 printk(KERN_INFO "Timeout\n"); 1791 printk(KERN_INFO "Address: %04X %04X\n", 1792 AdapterCheckBlock[2], 1793 AdapterCheckBlock[3]); 1794 break; 1795 1796 case 1: 1797 printk(KERN_INFO "Parity error\n"); 1798 printk(KERN_INFO "Address: %04X %04X\n", 1799 AdapterCheckBlock[2], 1800 AdapterCheckBlock[3]); 1801 break; 1802 1803 case 2: 1804 printk(KERN_INFO "Bus error\n"); 1805 printk(KERN_INFO "Address: %04X %04X\n", 1806 AdapterCheckBlock[2], 1807 AdapterCheckBlock[3]); 1808 break; 1809 1810 default: 1811 printk(KERN_INFO "Unknown error.\n"); 1812 break; 1813 } 1814 break; 1815 1816 case DMA_WRITE_ABORT: 1817 printk(KERN_INFO "%s: DMA write operation aborted:\n", 1818 dev->name); 1819 switch (AdapterCheckBlock[1]) 1820 { 1821 case 0: 1822 printk(KERN_INFO "Timeout\n"); 1823 printk(KERN_INFO "Address: %04X %04X\n", 1824 AdapterCheckBlock[2], 1825 AdapterCheckBlock[3]); 1826 break; 1827 1828 case 1: 1829 printk(KERN_INFO "Parity error\n"); 1830 printk(KERN_INFO "Address: %04X %04X\n", 1831 AdapterCheckBlock[2], 1832 AdapterCheckBlock[3]); 1833 break; 1834 1835 case 2: 1836 printk(KERN_INFO "Bus error\n"); 1837 printk(KERN_INFO "Address: %04X %04X\n", 1838 AdapterCheckBlock[2], 1839 AdapterCheckBlock[3]); 1840 break; 1841 1842 default: 1843 printk(KERN_INFO "Unknown error.\n"); 1844 break; 1845 } 1846 break; 1847 1848 case ILLEGAL_OP_CODE: 1849 printk(KERN_INFO "%s: Illegal operation code in firmware\n", 1850 dev->name); 1851 /* Parm[0-3]: adapter internal register R13-R15 */ 1852 break; 1853 1854 case PARITY_ERRORS: 1855 printk(KERN_INFO "%s: Adapter internal bus parity error\n", 1856 dev->name); 1857 /* Parm[0-3]: adapter internal register R13-R15 */ 1858 break; 1859 1860 case RAM_DATA_ERROR: 1861 printk(KERN_INFO "%s: RAM data error\n", dev->name); 1862 /* Parm[0-1]: MSW/LSW address of RAM location. */ 1863 break; 1864 1865 case RAM_PARITY_ERROR: 1866 printk(KERN_INFO "%s: RAM parity error\n", dev->name); 1867 /* Parm[0-1]: MSW/LSW address of RAM location. */ 1868 break; 1869 1870 case RING_UNDERRUN: 1871 printk(KERN_INFO "%s: Internal DMA underrun detected\n", 1872 dev->name); 1873 break; 1874 1875 case INVALID_IRQ: 1876 printk(KERN_INFO "%s: Unrecognized interrupt detected\n", 1877 dev->name); 1878 /* Parm[0-3]: adapter internal register R13-R15 */ 1879 break; 1880 1881 case INVALID_ERROR_IRQ: 1882 printk(KERN_INFO "%s: Unrecognized error interrupt detected\n", 1883 dev->name); 1884 /* Parm[0-3]: adapter internal register R13-R15 */ 1885 break; 1886 1887 case INVALID_XOP: 1888 printk(KERN_INFO "%s: Unrecognized XOP request detected\n", 1889 dev->name); 1890 /* Parm[0-3]: adapter internal register R13-R15 */ 1891 break; 1892 1893 default: 1894 printk(KERN_INFO "%s: Unknown status", dev->name); 1895 break; 1896 } 1897 1898 if(tms380tr_chipset_init(dev) == 1) 1899 { 1900 /* Restart of firmware successful */ 1901 tp->AdapterOpenFlag = 1; 1902 } 1903} 1904 1905/* 1906 * Internal adapter pointer to RAM data are copied from adapter into 1907 * host system. 1908 */ 1909static int tms380tr_read_ptr(struct net_device *dev) 1910{ 1911 struct net_local *tp = netdev_priv(dev); 1912 unsigned short adapterram; 1913 1914 tms380tr_read_ram(dev, (unsigned char *)&tp->intptrs.BurnedInAddrPtr, 1915 ADAPTER_INT_PTRS, 16); 1916 tms380tr_read_ram(dev, (unsigned char *)&adapterram, 1917 cpu_to_be16((unsigned short)tp->intptrs.AdapterRAMPtr), 2); 1918 return be16_to_cpu(adapterram); 1919} 1920 1921/* 1922 * Reads a number of bytes from adapter to system memory. 1923 */ 1924static void tms380tr_read_ram(struct net_device *dev, unsigned char *Data, 1925 unsigned short Address, int Length) 1926{ 1927 int i; 1928 unsigned short old_sifadx, old_sifadr, InWord; 1929 1930 /* Save the current values */ 1931 old_sifadx = SIFREADW(SIFADX); 1932 old_sifadr = SIFREADW(SIFADR); 1933 1934 /* Page number of adapter memory */ 1935 SIFWRITEW(0x0001, SIFADX); 1936 /* Address offset in adapter RAM */ 1937 SIFWRITEW(Address, SIFADR); 1938 1939 /* Copy len byte from adapter memory to system data area. */ 1940 i = 0; 1941 for(;;) 1942 { 1943 InWord = SIFREADW(SIFINC); 1944 1945 *(Data + i) = HIBYTE(InWord); /* Write first byte */ 1946 if(++i == Length) /* All is done break */ 1947 break; 1948 1949 *(Data + i) = LOBYTE(InWord); /* Write second byte */ 1950 if (++i == Length) /* All is done break */ 1951 break; 1952 } 1953 1954 /* Restore original values */ 1955 SIFWRITEW(old_sifadx, SIFADX); 1956 SIFWRITEW(old_sifadr, SIFADR); 1957} 1958 1959/* 1960 * Cancel all queued packets in the transmission queue. 1961 */ 1962static void tms380tr_cancel_tx_queue(struct net_local* tp) 1963{ 1964 TPL *tpl; 1965 1966 /* 1967 * NOTE: There must not be an active TRANSMIT command pending, when 1968 * this function is called. 1969 */ 1970 if(tp->TransmitCommandActive) 1971 return; 1972 1973 for(;;) 1974 { 1975 tpl = tp->TplBusy; 1976 if(!tpl->BusyFlag) 1977 break; 1978 /* "Remove" TPL from busy list. */ 1979 tp->TplBusy = tpl->NextTPLPtr; 1980 tms380tr_write_tpl_status(tpl, 0); /* Clear VALID bit */ 1981 tpl->BusyFlag = 0; /* "free" TPL */ 1982 1983 printk(KERN_INFO "Cancel tx (%08lXh).\n", (unsigned long)tpl); 1984 if (tpl->DMABuff) 1985 dma_unmap_single(tp->pdev, tpl->DMABuff, tpl->Skb->len, DMA_TO_DEVICE); 1986 dev_kfree_skb_any(tpl->Skb); 1987 } 1988} 1989 1990/* 1991 * This function is called whenever a transmit interrupt is generated by the 1992 * adapter. For a command complete interrupt, it is checked if we have to 1993 * issue a new transmit command or not. 1994 */ 1995static void tms380tr_tx_status_irq(struct net_device *dev) 1996{ 1997 struct net_local *tp = netdev_priv(dev); 1998 unsigned char HighByte, HighAc, LowAc; 1999 TPL *tpl; 2000 2001 /* NOTE: At this point the SSB from TRANSMIT STATUS is no longer 2002 * available, because the CLEAR SSB command has already been issued. 2003 * 2004 * Process all complete transmissions. 2005 */ 2006 2007 for(;;) 2008 { 2009 tpl = tp->TplBusy; 2010 if(!tpl->BusyFlag || (tpl->Status 2011 & (TX_VALID | TX_FRAME_COMPLETE)) 2012 != TX_FRAME_COMPLETE) 2013 { 2014 break; 2015 } 2016 2017 /* "Remove" TPL from busy list. */ 2018 tp->TplBusy = tpl->NextTPLPtr ; 2019 2020 /* Check the transmit status field only for directed frames*/ 2021 if(DIRECTED_FRAME(tpl) && (tpl->Status & TX_ERROR) == 0) 2022 { 2023 HighByte = GET_TRANSMIT_STATUS_HIGH_BYTE(tpl->Status); 2024 HighAc = GET_FRAME_STATUS_HIGH_AC(HighByte); 2025 LowAc = GET_FRAME_STATUS_LOW_AC(HighByte); 2026 2027 if((HighAc != LowAc) || (HighAc == AC_NOT_RECOGNIZED)) 2028 { 2029 printk(KERN_DEBUG "%s: (DA=%08lX not recognized)\n", 2030 dev->name, 2031 *(unsigned long *)&tpl->MData[2+2]); 2032 } 2033 else 2034 { 2035 if(tms380tr_debug > 3) 2036 printk(KERN_DEBUG "%s: Directed frame tx'd\n", 2037 dev->name); 2038 } 2039 } 2040 else 2041 { 2042 if(!DIRECTED_FRAME(tpl)) 2043 { 2044 if(tms380tr_debug > 3) 2045 printk(KERN_DEBUG "%s: Broadcast frame tx'd\n", 2046 dev->name); 2047 } 2048 } 2049 2050 tp->MacStat.tx_packets++; 2051 if (tpl->DMABuff) 2052 dma_unmap_single(tp->pdev, tpl->DMABuff, tpl->Skb->len, DMA_TO_DEVICE); 2053 dev_kfree_skb_irq(tpl->Skb); 2054 tpl->BusyFlag = 0; /* "free" TPL */ 2055 } 2056 2057 if(!tp->TplFree->NextTPLPtr->BusyFlag) 2058 netif_wake_queue(dev); 2059} 2060 2061/* 2062 * Called if a frame receive interrupt is generated by the adapter. 2063 * Check if the frame is valid and indicate it to system. 2064 */ 2065static void tms380tr_rcv_status_irq(struct net_device *dev) 2066{ 2067 struct net_local *tp = netdev_priv(dev); 2068 unsigned char *ReceiveDataPtr; 2069 struct sk_buff *skb; 2070 unsigned int Length, Length2; 2071 RPL *rpl; 2072 RPL *SaveHead; 2073 dma_addr_t dmabuf; 2074 2075 /* NOTE: At this point the SSB from RECEIVE STATUS is no longer 2076 * available, because the CLEAR SSB command has already been issued. 2077 * 2078 * Process all complete receives. 2079 */ 2080 2081 for(;;) 2082 { 2083 rpl = tp->RplHead; 2084 if(rpl->Status & RX_VALID) 2085 break; /* RPL still in use by adapter */ 2086 2087 /* Forward RPLHead pointer to next list. */ 2088 SaveHead = tp->RplHead; 2089 tp->RplHead = rpl->NextRPLPtr; 2090 2091 /* Get the frame size (Byte swap for Intel). 2092 * Do this early (see workaround comment below) 2093 */ 2094 Length = be16_to_cpu(rpl->FrameSize); 2095 2096 /* Check if the Frame_Start, Frame_End and 2097 * Frame_Complete bits are set. 2098 */ 2099 if((rpl->Status & VALID_SINGLE_BUFFER_FRAME) 2100 == VALID_SINGLE_BUFFER_FRAME) 2101 { 2102 ReceiveDataPtr = rpl->MData; 2103 2104 /* Workaround for delayed write of FrameSize on ISA 2105 * (FrameSize is false but valid-bit is reset) 2106 * Frame size is set to zero when the RPL is freed. 2107 * Length2 is there because there have also been 2108 * cases where the FrameSize was partially written 2109 */ 2110 Length2 = be16_to_cpu(rpl->FrameSize); 2111 2112 if(Length == 0 || Length != Length2) 2113 { 2114 tp->RplHead = SaveHead; 2115 break; /* Return to tms380tr_interrupt */ 2116 } 2117 tms380tr_update_rcv_stats(tp,ReceiveDataPtr,Length); 2118 2119 if(tms380tr_debug > 3) 2120 printk(KERN_DEBUG "%s: Packet Length %04X (%d)\n", 2121 dev->name, Length, Length); 2122 2123 /* Indicate the received frame to system the 2124 * adapter does the Source-Routing padding for 2125 * us. See: OpenOptions in tms380tr_init_opb() 2126 */ 2127 skb = rpl->Skb; 2128 if(rpl->SkbStat == SKB_UNAVAILABLE) 2129 { 2130 /* Try again to allocate skb */ 2131 skb = dev_alloc_skb(tp->MaxPacketSize); 2132 if(skb == NULL) 2133 { 2134 /* Update Stats ?? */ 2135 } 2136 else 2137 { 2138 skb_put(skb, tp->MaxPacketSize); 2139 rpl->SkbStat = SKB_DATA_COPY; 2140 ReceiveDataPtr = rpl->MData; 2141 } 2142 } 2143 2144 if(skb && (rpl->SkbStat == SKB_DATA_COPY || 2145 rpl->SkbStat == SKB_DMA_DIRECT)) 2146 { 2147 if(rpl->SkbStat == SKB_DATA_COPY) 2148 skb_copy_to_linear_data(skb, ReceiveDataPtr, 2149 Length); 2150 2151 /* Deliver frame to system */ 2152 rpl->Skb = NULL; 2153 skb_trim(skb,Length); 2154 skb->protocol = tr_type_trans(skb,dev); 2155 netif_rx(skb); 2156 } 2157 } 2158 else /* Invalid frame */ 2159 { 2160 if(rpl->Skb != NULL) 2161 dev_kfree_skb_irq(rpl->Skb); 2162 2163 /* Skip list. */ 2164 if(rpl->Status & RX_START_FRAME) 2165 /* Frame start bit is set -> overflow. */ 2166 tp->MacStat.rx_errors++; 2167 } 2168 if (rpl->DMABuff) 2169 dma_unmap_single(tp->pdev, rpl->DMABuff, tp->MaxPacketSize, DMA_TO_DEVICE); 2170 rpl->DMABuff = 0; 2171 2172 /* Allocate new skb for rpl */ 2173 rpl->Skb = dev_alloc_skb(tp->MaxPacketSize); 2174 /* skb == NULL ? then use local buffer */ 2175 if(rpl->Skb == NULL) 2176 { 2177 rpl->SkbStat = SKB_UNAVAILABLE; 2178 rpl->FragList[0].DataAddr = htonl(((char *)tp->LocalRxBuffers[rpl->RPLIndex] - (char *)tp) + tp->dmabuffer); 2179 rpl->MData = tp->LocalRxBuffers[rpl->RPLIndex]; 2180 } 2181 else /* skb != NULL */ 2182 { 2183 rpl->Skb->dev = dev; 2184 skb_put(rpl->Skb, tp->MaxPacketSize); 2185 2186 /* Data unreachable for DMA ? then use local buffer */ 2187 dmabuf = dma_map_single(tp->pdev, rpl->Skb->data, tp->MaxPacketSize, DMA_FROM_DEVICE); 2188 if(tp->dmalimit && (dmabuf + tp->MaxPacketSize > tp->dmalimit)) 2189 { 2190 rpl->SkbStat = SKB_DATA_COPY; 2191 rpl->FragList[0].DataAddr = htonl(((char *)tp->LocalRxBuffers[rpl->RPLIndex] - (char *)tp) + tp->dmabuffer); 2192 rpl->MData = tp->LocalRxBuffers[rpl->RPLIndex]; 2193 } 2194 else 2195 { 2196 /* DMA directly in skb->data */ 2197 rpl->SkbStat = SKB_DMA_DIRECT; 2198 rpl->FragList[0].DataAddr = htonl(dmabuf); 2199 rpl->MData = rpl->Skb->data; 2200 rpl->DMABuff = dmabuf; 2201 } 2202 } 2203 2204 rpl->FragList[0].DataCount = cpu_to_be16((unsigned short)tp->MaxPacketSize); 2205 rpl->FrameSize = 0; 2206 2207 /* Pass the last RPL back to the adapter */ 2208 tp->RplTail->FrameSize = 0; 2209 2210 /* Reset the CSTAT field in the list. */ 2211 tms380tr_write_rpl_status(tp->RplTail, RX_VALID | RX_FRAME_IRQ); 2212 2213 /* Current RPL becomes last one in list. */ 2214 tp->RplTail = tp->RplTail->NextRPLPtr; 2215 2216 /* Inform adapter about RPL valid. */ 2217 tms380tr_exec_sifcmd(dev, CMD_RX_VALID); 2218 } 2219} 2220 2221/* 2222 * This function should be used whenever the status of any RPL must be 2223 * modified by the driver, because the compiler may otherwise change the 2224 * order of instructions such that writing the RPL status may be executed 2225 * at an undesirable time. When this function is used, the status is 2226 * always written when the function is called. 2227 */ 2228static void tms380tr_write_rpl_status(RPL *rpl, unsigned int Status) 2229{ 2230 rpl->Status = Status; 2231} 2232 2233/* 2234 * The function updates the statistic counters in mac->MacStat. 2235 * It differtiates between directed and broadcast/multicast ( ==functional) 2236 * frames. 2237 */ 2238static void tms380tr_update_rcv_stats(struct net_local *tp, unsigned char DataPtr[], 2239 unsigned int Length) 2240{ 2241 tp->MacStat.rx_packets++; 2242 tp->MacStat.rx_bytes += Length; 2243 2244 /* Test functional bit */ 2245 if(DataPtr[2] & GROUP_BIT) 2246 tp->MacStat.multicast++; 2247} 2248 2249static int tms380tr_set_mac_address(struct net_device *dev, void *addr) 2250{ 2251 struct net_local *tp = netdev_priv(dev); 2252 struct sockaddr *saddr = addr; 2253 2254 if (tp->AdapterOpenFlag || tp->AdapterVirtOpenFlag) { 2255 printk(KERN_WARNING "%s: Cannot set MAC/LAA address while card is open\n", dev->name); 2256 return -EIO; 2257 } 2258 memcpy(dev->dev_addr, saddr->sa_data, dev->addr_len); 2259 return 0; 2260} 2261 2262#if TMS380TR_DEBUG > 0 2263/* 2264 * Dump Packet (data) 2265 */ 2266static void tms380tr_dump(unsigned char *Data, int length) 2267{ 2268 int i, j; 2269 2270 for (i = 0, j = 0; i < length / 8; i++, j += 8) 2271 { 2272 printk(KERN_DEBUG "%02x %02x %02x %02x %02x %02x %02x %02x\n", 2273 Data[j+0],Data[j+1],Data[j+2],Data[j+3], 2274 Data[j+4],Data[j+5],Data[j+6],Data[j+7]); 2275 } 2276} 2277#endif 2278 2279void tmsdev_term(struct net_device *dev) 2280{ 2281 struct net_local *tp; 2282 2283 tp = netdev_priv(dev); 2284 dma_unmap_single(tp->pdev, tp->dmabuffer, sizeof(struct net_local), 2285 DMA_BIDIRECTIONAL); 2286} 2287 2288const struct net_device_ops tms380tr_netdev_ops = { 2289 .ndo_open = tms380tr_open, 2290 .ndo_stop = tms380tr_close, 2291 .ndo_start_xmit = tms380tr_send_packet, 2292 .ndo_tx_timeout = tms380tr_timeout, 2293 .ndo_get_stats = tms380tr_get_stats, 2294 .ndo_set_multicast_list = tms380tr_set_multicast_list, 2295 .ndo_set_mac_address = tms380tr_set_mac_address, 2296}; 2297EXPORT_SYMBOL(tms380tr_netdev_ops); 2298 2299int tmsdev_init(struct net_device *dev, struct device *pdev) 2300{ 2301 struct net_local *tms_local; 2302 2303 memset(netdev_priv(dev), 0, sizeof(struct net_local)); 2304 tms_local = netdev_priv(dev); 2305 init_waitqueue_head(&tms_local->wait_for_tok_int); 2306 if (pdev->dma_mask) 2307 tms_local->dmalimit = *pdev->dma_mask; 2308 else 2309 return -ENOMEM; 2310 tms_local->pdev = pdev; 2311 tms_local->dmabuffer = dma_map_single(pdev, (void *)tms_local, 2312 sizeof(struct net_local), DMA_BIDIRECTIONAL); 2313 if (tms_local->dmabuffer + sizeof(struct net_local) > 2314 tms_local->dmalimit) 2315 { 2316 printk(KERN_INFO "%s: Memory not accessible for DMA\n", 2317 dev->name); 2318 tmsdev_term(dev); 2319 return -ENOMEM; 2320 } 2321 2322 dev->netdev_ops = &tms380tr_netdev_ops; 2323 dev->watchdog_timeo = HZ; 2324 2325 return 0; 2326} 2327 2328EXPORT_SYMBOL(tms380tr_open); 2329EXPORT_SYMBOL(tms380tr_close); 2330EXPORT_SYMBOL(tms380tr_interrupt); 2331EXPORT_SYMBOL(tmsdev_init); 2332EXPORT_SYMBOL(tmsdev_term); 2333EXPORT_SYMBOL(tms380tr_wait); 2334 2335#ifdef MODULE 2336 2337static struct module *TMS380_module = NULL; 2338 2339int init_module(void) 2340{ 2341 printk(KERN_DEBUG "%s", version); 2342 2343 TMS380_module = &__this_module; 2344 return 0; 2345} 2346 2347void cleanup_module(void) 2348{ 2349 TMS380_module = NULL; 2350} 2351#endif 2352 2353MODULE_LICENSE("GPL"); 2354