|
|
1.1 root 1: /* eth16i.c An ICL EtherTeam 16i and 32 EISA ethernet driver for Linux 1.1.1.2 ! root 2: 1.1 root 3: Written 1994-1998 by Mika Kuoppala 1.1.1.2 ! root 4: 1.1 root 5: Copyright (C) 1994-1998 by Mika Kuoppala 6: Based on skeleton.c and heavily on at1700.c by Donald Becker 7: 8: This software may be used and distributed according to the terms 9: of the GNU Public Licence, incorporated herein by reference. 10: 11: The author may be reached as [email protected] 12: 13: This driver supports following cards : 14: - ICL EtherTeam 16i 1.1.1.2 ! root 15: - ICL EtherTeam 32 EISA 1.1 root 16: (Uses true 32 bit transfers rather than 16i compability mode) 17: 18: Example Module usage: 19: insmod eth16i.o ioaddr=0x2a0 mediatype=bnc 20: 21: mediatype can be one of the following: bnc,tp,dix,auto,eprom 22: 23: 'auto' will try to autoprobe mediatype. 24: 'eprom' will use whatever type defined in eprom. 25: 26: I have benchmarked driver with PII/300Mhz as a ftp client 27: and 486/33Mhz as a ftp server. Top speed was 1128.37 kilobytes/sec. 1.1.1.2 ! root 28: 1.1 root 29: Sources: 30: - skeleton.c a sample network driver core for linux, 31: written by Donald Becker <[email protected]> 1.1.1.2 ! root 32: - at1700.c a driver for Allied Telesis AT1700, written 1.1 root 33: by Donald Becker. 34: - e16iSRV.asm a Netware 3.X Server Driver for ICL EtherTeam16i 35: written by Markku Viima 36: - The Fujitsu MB86965 databook. 1.1.1.2 ! root 37: ! 38: Author thanks following persons due to their valueble assistance: 1.1 root 39: Markku Viima (ICL) 1.1.1.2 ! root 40: Ari Valve (ICL) 1.1 root 41: Donald Becker 42: Kurt Huwig <[email protected]> 43: 44: Revision history: 45: 46: Version Date Description 1.1.1.2 ! root 47: 1.1 root 48: 0.01 15.12-94 Initial version (card detection) 49: 0.02 23.01-95 Interrupt is now hooked correctly 50: 0.03 01.02-95 Rewrote initialization part 51: 0.04 07.02-95 Base skeleton done... 52: Made a few changes to signature checking 53: to make it a bit reliable. 54: - fixed bug in tx_buf mapping 55: - fixed bug in initialization (DLC_EN 56: wasn't enabled when initialization 57: was done.) 58: 0.05 08.02-95 If there were more than one packet to send, 59: transmit was jammed due to invalid 60: register write...now fixed 1.1.1.2 ! root 61: 0.06 19.02-95 Rewrote interrupt handling 1.1 root 62: 0.07 13.04-95 Wrote EEPROM read routines 63: Card configuration now set according to 64: data read from EEPROM 65: 0.08 23.06-95 Wrote part that tries to probe used interface 66: port if AUTO is selected 67: 68: 0.09 01.09-95 Added module support 1.1.1.2 ! root 69: 1.1 root 70: 0.10 04.09-95 Fixed receive packet allocation to work 71: with kernels > 1.3.x 72: 1.1.1.2 ! root 73: 0.20 20.09-95 Added support for EtherTeam32 EISA ! 74: ! 75: 0.21 17.10-95 Removed the unnecessary extern 1.1 root 76: init_etherdev() declaration. Some 77: other cleanups. 1.1.1.2 ! root 78: 1.1 root 79: 0.22 22.02-96 Receive buffer was not flushed 80: correctly when faulty packet was 81: received. Now fixed. 82: 1.1.1.2 ! root 83: 0.23 26.02-96 Made resetting the adapter 1.1 root 84: more reliable. 1.1.1.2 ! root 85: 1.1 root 86: 0.24 27.02-96 Rewrote faulty packet handling in eth16i_rx 87: 88: 0.25 22.05-96 kfree() was missing from cleanup_module. 89: 1.1.1.2 ! root 90: 0.26 11.06-96 Sometimes card was not found by 1.1 root 91: check_signature(). Now made more reliable. 1.1.1.2 ! root 92: ! 93: 0.27 23.06-96 Oops. 16 consecutive collisions halted ! 94: adapter. Now will try to retransmit 1.1 root 95: MAX_COL_16 times before finally giving up. 1.1.1.2 ! root 96: 1.1 root 97: 0.28 28.10-97 Added dev_id parameter (NULL) for free_irq 98: 99: 0.29 29.10-97 Multiple card support for module users 100: 101: 0.30 30.10-97 Fixed irq allocation bug. 102: (request_irq moved from probe to open) 103: 104: 0.30a 21.08-98 Card detection made more relaxed. Driver 105: had problems with some TCP/IP-PROM boots 1.1.1.2 ! root 106: to find the card. Suggested by 1.1 root 107: Kurt Huwig <[email protected]> 108: 109: 0.31 28.08-98 Media interface port can now be selected 110: with module parameters or kernel 1.1.1.2 ! root 111: boot parameters. 1.1 root 112: 1.1.1.2 ! root 113: 0.32 31.08-98 IRQ was never freed if open/close 1.1 root 114: pair wasn't called. Now fixed. 1.1.1.2 ! root 115: 1.1 root 116: 0.33 10.09-98 When eth16i_open() was called after 117: eth16i_close() chip never recovered. 118: Now more shallow reset is made on 119: close. 120: 121: Bugs: 1.1.1.2 ! root 122: In some cases the media interface autoprobing code doesn't find ! 123: the correct interface type. In this case you can ! 124: manually choose the interface type in DOS with E16IC.EXE which is 1.1 root 125: configuration software for EtherTeam16i and EtherTeam32 cards. 126: This is also true for IRQ setting. You cannot use module 1.1.1.2 ! root 127: parameter to configure IRQ of the card (yet). 1.1 root 128: 129: To do: 130: - Real multicast support 131: - Rewrite the media interface autoprobing code. Its _horrible_ ! 132: - Possibly merge all the MB86965 specific code to external 133: module for use by eth16.c and Donald's at1700.c 134: - IRQ configuration with module parameter. I will do 135: this when i will get enough info about setting 136: irq without configuration utility. 137: */ 138: 1.1.1.2 ! root 139: static char *version = 1.1 root 140: "eth16i.c: v0.33 10-09-98 Mika Kuoppala ([email protected])\n"; 141: 142: #include <linux/module.h> 143: 144: #include <linux/kernel.h> 145: #include <linux/sched.h> 1.1.1.2 ! root 146: #include <linux/types.h> ! 147: #include <linux/fcntl.h> ! 148: #include <linux/interrupt.h> ! 149: #include <linux/ptrace.h> ! 150: #include <linux/ioport.h> ! 151: #include <linux/in.h> ! 152: #include <linux/malloc.h> ! 153: #include <linux/string.h> 1.1 root 154: #include <linux/errno.h> 155: 156: #include <linux/netdevice.h> 157: #include <linux/etherdevice.h> 158: #include <linux/skbuff.h> 159: 1.1.1.2 ! root 160: #include <asm/system.h> ! 161: #include <asm/bitops.h> ! 162: #include <asm/io.h> 1.1 root 163: #include <asm/dma.h> 164: 165: #ifndef LINUX_VERSION_CODE 166: #include <linux/version.h> 167: #endif 168: 169: #if LINUX_VERSION_CODE >= 0x20123 170: #include <linux/init.h> 171: #else 172: #define __init 173: #define __initdata 174: #define __initfunc(x) x 175: #endif 176: 177: #if LINUX_VERSION_CODE < 0x20138 178: #define test_and_set_bit(val,addr) set_bit(val,addr) 179: #endif 180: 181: #if LINUX_VERSION_CODE < 0x020100 182: typedef struct enet_statistics eth16i_stats_type; 183: #else 184: typedef struct net_device_stats eth16i_stats_type; 185: #endif 186: 187: /* Few macros */ 1.1.1.2 ! root 188: #define BIT(a) ( (1 << (a)) ) ! 189: #define BITSET(ioaddr, bnum) ((outb(((inb(ioaddr)) | (bnum)), ioaddr))) 1.1 root 190: #define BITCLR(ioaddr, bnum) ((outb(((inb(ioaddr)) & (~(bnum))), ioaddr))) 191: 192: /* This is the I/O address space for Etherteam 16i adapter. */ 193: #define ETH16I_IO_EXTENT 32 194: 195: /* Ticks before deciding that transmit has timed out */ 196: #define TX_TIMEOUT (400*HZ/1000) 197: 198: /* Maximum loop count when receiving packets */ 199: #define MAX_RX_LOOP 20 200: 201: /* Some interrupt masks */ 202: #define ETH16I_INTR_ON 0xef8a /* Higher is receive mask */ 203: #define ETH16I_INTR_OFF 0x0000 1.1.1.2 ! root 204: 1.1 root 205: /* Buffers header status byte meanings */ 206: #define PKT_GOOD BIT(5) 207: #define PKT_GOOD_RMT BIT(4) 208: #define PKT_SHORT BIT(3) 209: #define PKT_ALIGN_ERR BIT(2) 210: #define PKT_CRC_ERR BIT(1) 211: #define PKT_RX_BUF_OVERFLOW BIT(0) 212: 213: /* Transmit status register (DLCR0) */ 214: #define TX_STATUS_REG 0 215: #define TX_DONE BIT(7) 216: #define NET_BUSY BIT(6) 217: #define TX_PKT_RCD BIT(5) 218: #define CR_LOST BIT(4) 219: #define TX_JABBER_ERR BIT(3) 220: #define COLLISION BIT(2) 221: #define COLLISIONS_16 BIT(1) 222: 223: /* Receive status register (DLCR1) */ 224: #define RX_STATUS_REG 1 225: #define RX_PKT BIT(7) /* Packet received */ 226: #define BUS_RD_ERR BIT(6) 227: #define SHORT_PKT_ERR BIT(3) 228: #define ALIGN_ERR BIT(2) 229: #define CRC_ERR BIT(1) 230: #define RX_BUF_OVERFLOW BIT(0) 1.1.1.2 ! root 231: 1.1 root 232: /* Transmit Interrupt Enable Register (DLCR2) */ 233: #define TX_INTR_REG 2 234: #define TX_INTR_DONE BIT(7) 235: #define TX_INTR_COL BIT(2) 236: #define TX_INTR_16_COL BIT(1) 237: 238: /* Receive Interrupt Enable Register (DLCR3) */ 239: #define RX_INTR_REG 3 240: #define RX_INTR_RECEIVE BIT(7) 241: #define RX_INTR_SHORT_PKT BIT(3) 242: #define RX_INTR_CRC_ERR BIT(1) 243: #define RX_INTR_BUF_OVERFLOW BIT(0) 244: 245: /* Transmit Mode Register (DLCR4) */ 246: #define TRANSMIT_MODE_REG 4 247: #define LOOPBACK_CONTROL BIT(1) 248: #define CONTROL_OUTPUT BIT(2) 249: 250: /* Receive Mode Register (DLCR5) */ 251: #define RECEIVE_MODE_REG 5 252: #define RX_BUFFER_EMPTY BIT(6) 253: #define ACCEPT_BAD_PACKETS BIT(5) 254: #define RECEIVE_SHORT_ADDR BIT(4) 255: #define ACCEPT_SHORT_PACKETS BIT(3) 256: #define REMOTE_RESET BIT(2) 257: 258: #define ADDRESS_FILTER_MODE BIT(1) | BIT(0) 259: #define REJECT_ALL 0 260: #define ACCEPT_ALL 3 261: #define MODE_1 1 /* NODE ID, BC, MC, 2-24th bit */ 262: #define MODE_2 2 /* NODE ID, BC, MC, Hash Table */ 263: 264: /* Configuration Register 0 (DLCR6) */ 265: #define CONFIG_REG_0 6 266: #define DLC_EN BIT(7) 267: #define SRAM_CYCLE_TIME_100NS BIT(6) 268: #define SYSTEM_BUS_WIDTH_8 BIT(5) /* 1 = 8bit, 0 = 16bit */ 269: #define BUFFER_WIDTH_8 BIT(4) /* 1 = 8bit, 0 = 16bit */ 1.1.1.2 ! root 270: #define TBS1 BIT(3) 1.1 root 271: #define TBS0 BIT(2) 272: #define SRAM_BS1 BIT(1) /* 00=8kb, 01=16kb */ 273: #define SRAM_BS0 BIT(0) /* 10=32kb, 11=64kb */ 274: 1.1.1.2 ! root 275: #ifndef ETH16I_TX_BUF_SIZE /* 0 = 2kb, 1 = 4kb */ 1.1 root 276: #define ETH16I_TX_BUF_SIZE 3 /* 2 = 8kb, 3 = 16kb */ 1.1.1.2 ! root 277: #endif 1.1 root 278: #define TX_BUF_1x2048 0 279: #define TX_BUF_2x2048 1 280: #define TX_BUF_2x4098 2 281: #define TX_BUF_2x8192 3 282: 283: /* Configuration Register 1 (DLCR7) */ 284: #define CONFIG_REG_1 7 285: #define POWERUP BIT(5) 286: 287: /* Transmit start register */ 288: #define TRANSMIT_START_REG 10 289: #define TRANSMIT_START_RB 2 290: #define TX_START BIT(7) /* Rest of register bit indicate*/ 291: /* number of packets in tx buffer*/ 292: /* Node ID registers (DLCR8-13) */ 293: #define NODE_ID_0 8 294: #define NODE_ID_RB 0 295: 296: /* Hash Table registers (HT8-15) */ 297: #define HASH_TABLE_0 8 298: #define HASH_TABLE_RB 1 299: 300: /* Buffer memory ports */ 301: #define BUFFER_MEM_PORT_LB 8 302: #define DATAPORT BUFFER_MEM_PORT_LB 303: #define BUFFER_MEM_PORT_HB 9 304: 305: /* 16 Collision control register (BMPR11) */ 306: #define COL_16_REG 11 307: #define HALT_ON_16 0x00 308: #define RETRANS_AND_HALT_ON_16 0x02 309: 310: /* Maximum number of attempts to send after 16 concecutive collisions */ 311: #define MAX_COL_16 10 312: 313: /* DMA Burst and Transceiver Mode Register (BMPR13) */ 314: #define TRANSCEIVER_MODE_REG 13 1.1.1.2 ! root 315: #define TRANSCEIVER_MODE_RB 2 1.1 root 316: #define IO_BASE_UNLOCK BIT(7) 317: #define LOWER_SQUELCH_TRESH BIT(6) 318: #define LINK_TEST_DISABLE BIT(5) 319: #define AUI_SELECT BIT(4) 320: #define DIS_AUTO_PORT_SEL BIT(3) 321: 322: /* Filter Self Receive Register (BMPR14) */ 323: #define FILTER_SELF_RX_REG 14 324: #define SKIP_RX_PACKET BIT(2) 325: #define FILTER_SELF_RECEIVE BIT(0) 326: 327: /* EEPROM Control Register (BMPR 16) */ 328: #define EEPROM_CTRL_REG 16 329: 330: /* EEPROM Data Register (BMPR 17) */ 331: #define EEPROM_DATA_REG 17 332: 333: /* NMC93CSx6 EEPROM Control Bits */ 334: #define CS_0 0x00 335: #define CS_1 0x20 336: #define SK_0 0x00 337: #define SK_1 0x40 338: #define DI_0 0x00 339: #define DI_1 0x80 340: 341: /* NMC93CSx6 EEPROM Instructions */ 342: #define EEPROM_READ 0x80 343: 344: /* NMC93CSx6 EEPROM Addresses */ 345: #define E_NODEID_0 0x02 346: #define E_NODEID_1 0x03 347: #define E_NODEID_2 0x04 348: #define E_PORT_SELECT 0x14 349: #define E_PORT_BNC 0x00 350: #define E_PORT_DIX 0x01 351: #define E_PORT_TP 0x02 352: #define E_PORT_AUTO 0x03 353: #define E_PORT_FROM_EPROM 0x04 354: #define E_PRODUCT_CFG 0x30 1.1.1.2 ! root 355: 1.1 root 356: 357: /* Macro to slow down io between EEPROM clock transitions */ 358: #define eeprom_slow_io() do { int _i = 40; while(--_i > 0) { inb(0x80); }}while(0) 359: 360: /* Jumperless Configuration Register (BMPR19) */ 361: #define JUMPERLESS_CONFIG 19 362: 363: /* ID ROM registers, writing to them also resets some parts of chip */ 364: #define ID_ROM_0 24 365: #define ID_ROM_7 31 366: #define RESET ID_ROM_0 367: 368: /* This is the I/O address list to be probed when seeking the card */ 369: static unsigned int eth16i_portlist[] = 370: { 0x260, 0x280, 0x2A0, 0x240, 0x340, 0x320, 0x380, 0x300, 0 }; 371: 372: static unsigned int eth32i_portlist[] = 373: { 0x1000, 0x2000, 0x3000, 0x4000, 0x5000, 0x6000, 0x7000, 0x8000, 374: 0x9000, 0xA000, 0xB000, 0xC000, 0xD000, 0xE000, 0xF000, 0 }; 375: 376: /* This is the Interrupt lookup table for Eth16i card */ 377: static unsigned int eth16i_irqmap[] = { 9, 10, 5, 15, 0 }; 378: #define NUM_OF_ISA_IRQS 4 379: 380: /* This is the Interrupt lookup table for Eth32i card */ 1.1.1.2 ! root 381: static unsigned int eth32i_irqmap[] = { 3, 5, 7, 9, 10, 11, 12, 15, 0 }; 1.1 root 382: #define EISA_IRQ_REG 0xc89 383: #define NUM_OF_EISA_IRQS 8 384: 385: static unsigned int eth16i_tx_buf_map[] = { 2048, 2048, 4096, 8192 }; 386: static unsigned int boot = 1; 387: 388: /* Use 0 for production, 1 for verification, >2 for debug */ 389: #ifndef ETH16I_DEBUG 390: #define ETH16I_DEBUG 0 391: #endif 392: static unsigned int eth16i_debug = ETH16I_DEBUG; 393: 394: /* Information for each board */ 395: 396: struct eth16i_local { 397: eth16i_stats_type stats; 398: unsigned char tx_started; 399: unsigned char tx_buf_busy; 400: unsigned short tx_queue; /* Number of packets in transmit buffer */ 1.1.1.2 ! root 401: unsigned short tx_queue_len; 1.1 root 402: unsigned int tx_buf_size; 403: unsigned long open_time; 1.1.1.2 ! root 404: unsigned long tx_buffered_packets; 1.1 root 405: unsigned long col_16; 406: }; 407: 408: /* Function prototypes */ 409: 410: extern int eth16i_probe(struct device *dev); 411: 412: static int eth16i_probe1(struct device *dev, int ioaddr); 413: static int eth16i_check_signature(int ioaddr); 414: static int eth16i_probe_port(int ioaddr); 415: static void eth16i_set_port(int ioaddr, int porttype); 416: static int eth16i_send_probe_packet(int ioaddr, unsigned char *b, int l); 417: static int eth16i_receive_probe_packet(int ioaddr); 418: static int eth16i_get_irq(int ioaddr); 419: static int eth16i_read_eeprom(int ioaddr, int offset); 420: static int eth16i_read_eeprom_word(int ioaddr); 421: static void eth16i_eeprom_cmd(int ioaddr, unsigned char command); 422: static int eth16i_open(struct device *dev); 423: static int eth16i_close(struct device *dev); 424: static int eth16i_tx(struct sk_buff *skb, struct device *dev); 425: static void eth16i_rx(struct device *dev); 426: static void eth16i_interrupt(int irq, void *dev_id, struct pt_regs *regs); 427: static void eth16i_reset(struct device *dev); 428: static void eth16i_skip_packet(struct device *dev); 1.1.1.2 ! root 429: static void eth16i_multicast(struct device *dev); 1.1 root 430: static void eth16i_select_regbank(unsigned char regbank, int ioaddr); 431: static void eth16i_initialize(struct device *dev); 432: 433: #if 0 434: static int eth16i_set_irq(struct device *dev); 435: #endif 436: 437: #ifdef MODULE 438: static ushort eth16i_parse_mediatype(const char* s); 439: #endif 440: 441: static struct enet_statistics *eth16i_get_stats(struct device *dev); 442: 443: static char *cardname = "ICL EtherTeam 16i/32"; 444: 1.1.1.2 ! root 445: #ifdef HAVE_DEVLIST 1.1 root 446: 447: /* Support for alternate probe manager */ 1.1.1.2 ! root 448: /struct netdev_entry eth16i_drv = ! 449: {"eth16i", eth16i_probe1, ETH16I_IO_EXTENT, eth16i_probe_list}; 1.1 root 450: 451: #else /* Not HAVE_DEVLIST */ 452: 453: __initfunc(int eth16i_probe(struct device *dev)) 454: { 455: int i; 456: int ioaddr; 457: int base_addr = dev ? dev->base_addr : 0; 1.1.1.2 ! root 458: ! 459: if(eth16i_debug > 4) 1.1 root 460: printk(KERN_DEBUG "Probing started for %s\n", cardname); 461: 462: if(base_addr > 0x1ff) /* Check only single location */ 463: return eth16i_probe1(dev, base_addr); 464: else if(base_addr != 0) /* Don't probe at all */ 465: return ENXIO; 466: 467: /* Seek card from the ISA io address space */ 468: for(i = 0; (ioaddr = eth16i_portlist[i]) ; i++) { 469: if(check_region(ioaddr, ETH16I_IO_EXTENT)) 470: continue; 471: if(eth16i_probe1(dev, ioaddr) == 0) 472: return 0; 473: } 474: 475: /* Seek card from the EISA io address space */ 476: for(i = 0; (ioaddr = eth32i_portlist[i]) ; i++) { 477: if(check_region(ioaddr, ETH16I_IO_EXTENT)) 478: continue; 479: if(eth16i_probe1(dev, ioaddr) == 0) 480: return 0; 481: } 482: 483: return ENODEV; 484: } 485: #endif /* Not HAVE_DEVLIST */ 486: 487: __initfunc(static int eth16i_probe1(struct device *dev, int ioaddr)) 488: { 489: static unsigned version_printed = 0; 490: boot = 1; /* To inform initilization that we are in boot probe */ 491: 492: /* 1.1.1.2 ! root 493: The MB86985 chip has on register which holds information in which 1.1 root 494: io address the chip lies. First read this register and compare 495: it to our current io address and if match then this could 496: be our chip. 497: */ 498: 499: if(ioaddr < 0x1000) { 1.1.1.2 ! root 500: ! 501: if(eth16i_portlist[(inb(ioaddr + JUMPERLESS_CONFIG) & 0x07)] 1.1 root 502: != ioaddr) 503: return -ENODEV; 504: } 505: 506: /* Now we will go a bit deeper and try to find the chip's signature */ 507: 1.1.1.2 ! root 508: if(eth16i_check_signature(ioaddr) != 0) 1.1 root 509: return -ENODEV; 510: 1.1.1.2 ! root 511: /* 1.1 root 512: Now it seems that we have found a ethernet chip in this particular 1.1.1.2 ! root 513: ioaddr. The MB86985 chip has this feature, that when you read a 1.1 root 514: certain register it will increase it's io base address to next 515: configurable slot. Now when we have found the chip, first thing is 516: to make sure that the chip's ioaddr will hold still here. 517: */ 518: 519: eth16i_select_regbank(TRANSCEIVER_MODE_RB, ioaddr); 520: outb(0x00, ioaddr + TRANSCEIVER_MODE_REG); 521: 522: outb(0x00, ioaddr + RESET); /* Reset some parts of chip */ 523: BITSET(ioaddr + CONFIG_REG_0, BIT(7)); /* Disable the data link */ 524: 525: if(dev == NULL) 526: dev = init_etherdev(0, 0); 527: 528: if( (eth16i_debug & version_printed++) == 0) 529: printk(KERN_INFO "%s", version); 530: 531: dev->base_addr = ioaddr; 1.1.1.2 ! root 532: 1.1 root 533: #if 0 534: if(dev->irq) { 535: if(eth16i_set_irq(dev)) { 536: dev->irq = eth16i_get_irq(ioaddr); 537: } 538: 539: } 540: else { 541: #endif 542: 543: dev->irq = eth16i_get_irq(ioaddr); 544: 545: /* Try to obtain interrupt vector */ 546: 1.1.1.2 ! root 547: if (request_irq(dev->irq, (void *)ð16i_interrupt, 0, "eth16i", dev)) { ! 548: printk(KERN_WARNING "%s: %s at %#3x, but is unusable due conflicting IRQ %d.\n", 1.1 root 549: dev->name, cardname, ioaddr, dev->irq); 550: return -EAGAIN; 551: } 552: 553: #if 0 554: irq2dev_map[dev->irq] = dev; 555: #endif 556: 557: printk(KERN_INFO "%s: %s at %#3x, IRQ %d, ", 558: dev->name, cardname, ioaddr, dev->irq); 559: 560: /* Let's grab the region */ 561: request_region(ioaddr, ETH16I_IO_EXTENT, "eth16i"); 562: 563: /* Now we will have to lock the chip's io address */ 564: eth16i_select_regbank(TRANSCEIVER_MODE_RB, ioaddr); 1.1.1.2 ! root 565: outb(0x38, ioaddr + TRANSCEIVER_MODE_REG); 1.1 root 566: 567: eth16i_initialize(dev); /* Initialize rest of the chip's registers */ 568: 569: /* Now let's same some energy by shutting down the chip ;) */ 570: BITCLR(ioaddr + CONFIG_REG_1, POWERUP); 571: 572: /* Initialize the device structure */ 573: if(dev->priv == NULL) { 574: dev->priv = kmalloc(sizeof(struct eth16i_local), GFP_KERNEL); 575: if(dev->priv == NULL) 576: return -ENOMEM; 577: } 578: 579: memset(dev->priv, 0, sizeof(struct eth16i_local)); 580: 581: dev->open = eth16i_open; 582: dev->stop = eth16i_close; 583: dev->hard_start_xmit = eth16i_tx; 584: dev->get_stats = eth16i_get_stats; 585: dev->set_multicast_list = ð16i_multicast; 586: 587: /* Fill in the fields of the device structure with ethernet values. */ 588: ether_setup(dev); 589: 590: boot = 0; 591: 592: return 0; 593: } 594: 595: 596: static void eth16i_initialize(struct device *dev) 597: { 598: int ioaddr = dev->base_addr; 599: int i, node_w = 0; 600: unsigned char node_byte = 0; 601: 602: /* Setup station address */ 603: eth16i_select_regbank(NODE_ID_RB, ioaddr); 604: for(i = 0 ; i < 3 ; i++) { 605: unsigned short node_val = eth16i_read_eeprom(ioaddr, E_NODEID_0 + i); 606: ((unsigned short *)dev->dev_addr)[i] = ntohs(node_val); 607: } 608: 1.1.1.2 ! root 609: for(i = 0; i < 6; i++) { 1.1 root 610: outb( ((unsigned char *)dev->dev_addr)[i], ioaddr + NODE_ID_0 + i); 611: if(boot) { 612: printk("%02x", inb(ioaddr + NODE_ID_0 + i)); 613: if(i != 5) 614: printk(":"); 615: } 616: } 617: 618: /* Now we will set multicast addresses to accept none */ 619: eth16i_select_regbank(HASH_TABLE_RB, ioaddr); 1.1.1.2 ! root 620: for(i = 0; i < 8; i++) 1.1 root 621: outb(0x00, ioaddr + HASH_TABLE_0 + i); 622: 623: /* 1.1.1.2 ! root 624: Now let's disable the transmitter and receiver, set the buffer ram 1.1 root 625: cycle time, bus width and buffer data path width. Also we shall 626: set transmit buffer size and total buffer size. 627: */ 628: 629: eth16i_select_regbank(2, ioaddr); 630: 631: node_byte = 0; 632: node_w = eth16i_read_eeprom(ioaddr, E_PRODUCT_CFG); 633: 634: if( (node_w & 0xFF00) == 0x0800) 635: node_byte |= BUFFER_WIDTH_8; 636: 637: node_byte |= SRAM_BS1; 638: 639: if( (node_w & 0x00FF) == 64) 640: node_byte |= SRAM_BS0; 641: 642: node_byte |= DLC_EN | SRAM_CYCLE_TIME_100NS | (ETH16I_TX_BUF_SIZE << 2); 643: 644: outb(node_byte, ioaddr + CONFIG_REG_0); 645: 646: /* We shall halt the transmitting, if 16 collisions are detected */ 647: outb(HALT_ON_16, ioaddr + COL_16_REG); 648: 649: #ifdef MODULE 650: /* if_port already set by init_module() */ 651: #else 1.1.1.2 ! root 652: dev->if_port = (dev->mem_start < E_PORT_FROM_EPROM) ? 1.1 root 653: dev->mem_start : E_PORT_FROM_EPROM; 654: #endif 655: 656: /* Set interface port type */ 657: if(boot) { 658: char *porttype[] = {"BNC", "DIX", "TP", "AUTO", "FROM_EPROM" }; 659: 660: switch(dev->if_port) 661: { 662: 663: case E_PORT_FROM_EPROM: 664: dev->if_port = eth16i_read_eeprom(ioaddr, E_PORT_SELECT); 665: break; 666: 667: case E_PORT_AUTO: 668: dev->if_port = eth16i_probe_port(ioaddr); 669: break; 1.1.1.2 ! root 670: 1.1 root 671: case E_PORT_BNC: 672: case E_PORT_TP: 673: case E_PORT_DIX: 674: break; 675: } 676: 677: printk(" %s interface.\n", porttype[dev->if_port]); 678: 679: eth16i_set_port(ioaddr, dev->if_port); 680: } 681: 682: /* Set Receive Mode to normal operation */ 683: outb(MODE_2, ioaddr + RECEIVE_MODE_REG); 684: } 685: 686: static int eth16i_probe_port(int ioaddr) 687: { 688: int i; 689: int retcode; 690: unsigned char dummy_packet[64] = { 0 }; 691: 692: /* Powerup the chip */ 693: outb(0xc0 | POWERUP, ioaddr + CONFIG_REG_1); 694: 695: BITSET(ioaddr + CONFIG_REG_0, DLC_EN); 696: 697: eth16i_select_regbank(NODE_ID_RB, ioaddr); 698: 699: for(i = 0; i < 6; i++) { 700: dummy_packet[i] = inb(ioaddr + NODE_ID_0 + i); 701: dummy_packet[i+6] = inb(ioaddr + NODE_ID_0 + i); 702: } 703: 704: dummy_packet[12] = 0x00; 705: dummy_packet[13] = 0x04; 706: 707: eth16i_select_regbank(2, ioaddr); 708: 709: for(i = 0; i < 3; i++) { 710: BITSET(ioaddr + CONFIG_REG_0, DLC_EN); 711: BITCLR(ioaddr + CONFIG_REG_0, DLC_EN); 712: eth16i_set_port(ioaddr, i); 713: 714: if(eth16i_debug > 1) 715: printk(KERN_DEBUG "Set port number %d\n", i); 716: 717: retcode = eth16i_send_probe_packet(ioaddr, dummy_packet, 64); 718: if(retcode == 0) { 719: retcode = eth16i_receive_probe_packet(ioaddr); 720: if(retcode != -1) { 721: if(eth16i_debug > 1) 722: printk(KERN_DEBUG "Eth16i interface port found at %d\n", i); 723: return i; 724: } 725: } 726: else { 727: if(eth16i_debug > 1) 728: printk(KERN_DEBUG "TRANSMIT_DONE timeout when probing interface port\n"); 729: } 730: } 731: 732: if( eth16i_debug > 1) 733: printk(KERN_DEBUG "Using default port\n"); 734: 735: return E_PORT_BNC; 736: } 737: 738: static void eth16i_set_port(int ioaddr, int porttype) 1.1.1.2 ! root 739: { 1.1 root 740: unsigned short temp = 0; 741: 742: eth16i_select_regbank(TRANSCEIVER_MODE_RB, ioaddr); 743: outb(LOOPBACK_CONTROL, ioaddr + TRANSMIT_MODE_REG); 744: 745: temp |= DIS_AUTO_PORT_SEL; 746: 747: switch(porttype) { 748: 749: case E_PORT_BNC : 750: temp |= AUI_SELECT; 751: break; 752: 753: case E_PORT_TP : 754: break; 755: 756: case E_PORT_DIX : 757: temp |= AUI_SELECT; 758: BITSET(ioaddr + TRANSMIT_MODE_REG, CONTROL_OUTPUT); 759: break; 1.1.1.2 ! root 760: } 1.1 root 761: 762: outb(temp, ioaddr + TRANSCEIVER_MODE_REG); 763: 764: if(eth16i_debug > 1) { 765: printk(KERN_DEBUG "TRANSMIT_MODE_REG = %x\n", inb(ioaddr + TRANSMIT_MODE_REG)); 1.1.1.2 ! root 766: printk(KERN_DEBUG "TRANSCEIVER_MODE_REG = %x\n", 1.1 root 767: inb(ioaddr+TRANSCEIVER_MODE_REG)); 768: } 769: } 770: 771: static int eth16i_send_probe_packet(int ioaddr, unsigned char *b, int l) 772: { 773: int starttime; 774: 775: outb(0xff, ioaddr + TX_STATUS_REG); 776: 777: outw(l, ioaddr + DATAPORT); 1.1.1.2 ! root 778: outsw(ioaddr + DATAPORT, (unsigned short *)b, (l + 1) >> 1); 1.1 root 779: 780: starttime = jiffies; 1.1.1.2 ! root 781: outb(TX_START | 1, ioaddr + TRANSMIT_START_REG); 1.1 root 782: 783: while( (inb(ioaddr + TX_STATUS_REG) & 0x80) == 0) { 784: if( (jiffies - starttime) > TX_TIMEOUT) { 785: return -1; 786: } 787: } 788: 789: return 0; 790: } 791: 792: static int eth16i_receive_probe_packet(int ioaddr) 793: { 794: int starttime; 795: 796: starttime = jiffies; 797: 798: while((inb(ioaddr + TX_STATUS_REG) & 0x20) == 0) { 799: if( (jiffies - starttime) > TX_TIMEOUT) { 800: 801: if(eth16i_debug > 1) 802: printk(KERN_DEBUG "Timeout occured waiting transmit packet received\n"); 803: starttime = jiffies; 804: while((inb(ioaddr + RX_STATUS_REG) & 0x80) == 0) { 805: if( (jiffies - starttime) > TX_TIMEOUT) { 806: if(eth16i_debug > 1) 807: printk(KERN_DEBUG "Timeout occured waiting receive packet\n"); 808: return -1; 809: } 810: } 811: 812: if(eth16i_debug > 1) 813: printk(KERN_DEBUG "RECEIVE_PACKET\n"); 814: return(0); /* Found receive packet */ 815: } 816: } 817: 818: if(eth16i_debug > 1) { 819: printk(KERN_DEBUG "TRANSMIT_PACKET_RECEIVED %x\n", inb(ioaddr + TX_STATUS_REG)); 820: printk(KERN_DEBUG "RX_STATUS_REG = %x\n", inb(ioaddr + RX_STATUS_REG)); 821: } 822: 823: return(0); /* Return success */ 824: } 825: 826: #if 0 827: static int eth16i_set_irq(struct device* dev) 828: { 829: const int ioaddr = dev->base_addr; 830: const int irq = dev->irq; 831: int i = 0; 832: 1.1.1.2 ! root 833: if(ioaddr < 0x1000) { 1.1 root 834: while(eth16i_irqmap[i] && eth16i_irqmap[i] != irq) 835: i++; 1.1.1.2 ! root 836: 1.1 root 837: if(i < NUM_OF_ISA_IRQS) { 838: u8 cbyte = inb(ioaddr + JUMPERLESS_CONFIG); 839: cbyte = (cbyte & 0x3F) | (i << 6); 840: outb(cbyte, ioaddr + JUMPERLESS_CONFIG); 841: return 0; 842: } 843: } 844: else { 845: printk(KERN_NOTICE "%s: EISA Interrupt cannot be set. Use EISA Configuration utility.\n", dev->name); 846: } 1.1.1.2 ! root 847: 1.1 root 848: return -1; 849: 850: } 851: #endif 852: 853: static int eth16i_get_irq(int ioaddr) 854: { 855: unsigned char cbyte; 856: 857: if( ioaddr < 0x1000) { 858: cbyte = inb(ioaddr + JUMPERLESS_CONFIG); 859: return( eth16i_irqmap[ ((cbyte & 0xC0) >> 6) ] ); 860: } else { /* Oh..the card is EISA so method getting IRQ different */ 861: unsigned short index = 0; 862: cbyte = inb(ioaddr + EISA_IRQ_REG); 863: while( (cbyte & 0x01) == 0) { 864: cbyte = cbyte >> 1; 865: index++; 866: } 867: return( eth32i_irqmap[ index ] ); 868: } 869: } 870: 871: static int eth16i_check_signature(int ioaddr) 872: { 873: int i; 874: unsigned char creg[4] = { 0 }; 875: 876: for(i = 0; i < 4 ; i++) { 877: 878: creg[i] = inb(ioaddr + TRANSMIT_MODE_REG + i); 879: 880: if(eth16i_debug > 1) 1.1.1.2 ! root 881: printk("eth16i: read signature byte %x at %x\n", 1.1 root 882: creg[i], 883: ioaddr + TRANSMIT_MODE_REG + i); 884: } 885: 886: creg[0] &= 0x0F; /* Mask collision cnr */ 887: creg[2] &= 0x7F; /* Mask DCLEN bit */ 888: 1.1.1.2 ! root 889: #if 0 ! 890: /* 1.1 root 891: This was removed because the card was sometimes left to state 892: from which it couldn't be find anymore. If there is need 893: to more strict check still this have to be fixed. 894: */ 895: if( ! ((creg[0] == 0x06) && (creg[1] == 0x41)) ) { 896: if(creg[1] != 0x42) 897: return -1; 898: } 899: #endif 900: 901: if( !((creg[2] == 0x36) && (creg[3] == 0xE0)) ) { 902: creg[2] &= 0x40; 903: creg[3] &= 0x03; 1.1.1.2 ! root 904: 1.1 root 905: if( !((creg[2] == 0x40) && (creg[3] == 0x00)) ) 906: return -1; 907: } 1.1.1.2 ! root 908: 1.1 root 909: if(eth16i_read_eeprom(ioaddr, E_NODEID_0) != 0) 910: return -1; 1.1.1.2 ! root 911: 1.1 root 912: if((eth16i_read_eeprom(ioaddr, E_NODEID_1) & 0xFF00) != 0x4B00) 913: return -1; 914: 915: return 0; 916: } 917: 918: static int eth16i_read_eeprom(int ioaddr, int offset) 919: { 920: int data = 0; 921: 922: eth16i_eeprom_cmd(ioaddr, EEPROM_READ | offset); 923: outb(CS_1, ioaddr + EEPROM_CTRL_REG); 924: data = eth16i_read_eeprom_word(ioaddr); 925: outb(CS_0 | SK_0, ioaddr + EEPROM_CTRL_REG); 926: 1.1.1.2 ! root 927: return(data); 1.1 root 928: } 929: 930: static int eth16i_read_eeprom_word(int ioaddr) 931: { 932: int i; 933: int data = 0; 1.1.1.2 ! root 934: 1.1 root 935: for(i = 16; i > 0; i--) { 936: outb(CS_1 | SK_0, ioaddr + EEPROM_CTRL_REG); 937: eeprom_slow_io(); 938: outb(CS_1 | SK_1, ioaddr + EEPROM_CTRL_REG); 939: eeprom_slow_io(); 1.1.1.2 ! root 940: data = (data << 1) | 1.1 root 941: ((inb(ioaddr + EEPROM_DATA_REG) & DI_1) ? 1 : 0); 1.1.1.2 ! root 942: 1.1 root 943: eeprom_slow_io(); 944: } 945: 946: return(data); 947: } 948: 949: static void eth16i_eeprom_cmd(int ioaddr, unsigned char command) 950: { 951: int i; 952: 953: outb(CS_0 | SK_0, ioaddr + EEPROM_CTRL_REG); 954: outb(DI_0, ioaddr + EEPROM_DATA_REG); 955: outb(CS_1 | SK_0, ioaddr + EEPROM_CTRL_REG); 956: outb(DI_1, ioaddr + EEPROM_DATA_REG); 957: outb(CS_1 | SK_1, ioaddr + EEPROM_CTRL_REG); 958: 959: for(i = 7; i >= 0; i--) { 960: short cmd = ( (command & (1 << i)) ? DI_1 : DI_0 ); 961: outb(cmd, ioaddr + EEPROM_DATA_REG); 962: outb(CS_1 | SK_0, ioaddr + EEPROM_CTRL_REG); 963: eeprom_slow_io(); 964: outb(CS_1 | SK_1, ioaddr + EEPROM_CTRL_REG); 965: eeprom_slow_io(); 1.1.1.2 ! root 966: } 1.1 root 967: } 968: 969: static int eth16i_open(struct device *dev) 970: { 971: struct eth16i_local *lp = (struct eth16i_local *)dev->priv; 972: int ioaddr = dev->base_addr; 1.1.1.2 ! root 973: 1.1 root 974: /* Powerup the chip */ 975: outb(0xc0 | POWERUP, ioaddr + CONFIG_REG_1); 976: 977: /* Initialize the chip */ 1.1.1.2 ! root 978: eth16i_initialize(dev); 1.1 root 979: 980: /* Set the transmit buffer size */ 981: lp->tx_buf_size = eth16i_tx_buf_map[ETH16I_TX_BUF_SIZE & 0x03]; 982: 983: if(eth16i_debug > 0) 1.1.1.2 ! root 984: printk(KERN_DEBUG "%s: transmit buffer size %d\n", 1.1 root 985: dev->name, lp->tx_buf_size); 986: 987: /* Now enable Transmitter and Receiver sections */ 988: BITCLR(ioaddr + CONFIG_REG_0, DLC_EN); 989: 990: /* Now switch to register bank 2, for run time operation */ 991: eth16i_select_regbank(2, ioaddr); 992: 993: lp->open_time = jiffies; 994: lp->tx_started = 0; 995: lp->tx_queue = 0; 996: lp->tx_queue_len = 0; 997: 998: /* Turn on interrupts*/ 1.1.1.2 ! root 999: outw(ETH16I_INTR_ON, ioaddr + TX_INTR_REG); 1.1 root 1000: 1001: dev->tbusy = 0; 1002: dev->interrupt = 0; 1003: dev->start = 1; 1004: 1005: MOD_INC_USE_COUNT; 1006: 1007: return 0; 1008: } 1009: 1010: static int eth16i_close(struct device *dev) 1011: { 1012: struct eth16i_local *lp = (struct eth16i_local *)dev->priv; 1013: int ioaddr = dev->base_addr; 1014: 1015: eth16i_reset(dev); 1016: 1017: /* Turn off interrupts*/ 1.1.1.2 ! root 1018: outw(ETH16I_INTR_OFF, ioaddr + TX_INTR_REG); 1.1 root 1019: 1020: dev->start = 0; 1021: dev->tbusy = 1; 1022: 1023: lp->open_time = 0; 1024: 1025: /* Disable transmit and receive */ 1026: BITSET(ioaddr + CONFIG_REG_0, DLC_EN); 1027: 1028: /* Reset the chip */ 1029: /* outb(0xff, ioaddr + RESET); */ 1030: /* outw(0xffff, ioaddr + TX_STATUS_REG); */ 1.1.1.2 ! root 1031: 1.1 root 1032: outb(0x00, ioaddr + CONFIG_REG_1); 1033: 1034: MOD_DEC_USE_COUNT; 1035: 1036: return 0; 1037: } 1038: 1039: static int eth16i_tx(struct sk_buff *skb, struct device *dev) 1040: { 1041: struct eth16i_local *lp = (struct eth16i_local *)dev->priv; 1042: int ioaddr = dev->base_addr; 1043: int status = 0; 1044: 1045: if(dev->tbusy) { 1.1.1.2 ! root 1046: ! 1047: /* ! 1048: If we get here, some higher level has decided that ! 1049: we are broken. There should really be a "kick me" ! 1050: function call instead. 1.1 root 1051: */ 1052: 1053: int tickssofar = jiffies - dev->trans_start; 1.1.1.2 ! root 1054: if(tickssofar < TX_TIMEOUT) ! 1055: return 1; 1.1 root 1056: 1057: outw(ETH16I_INTR_OFF, ioaddr + TX_INTR_REG); 1058: 1.1.1.2 ! root 1059: printk(KERN_WARNING "%s: transmit timed out with status %04x, %s ?\n", 1.1 root 1060: dev->name, 1.1.1.2 ! root 1061: inw(ioaddr + TX_STATUS_REG), ! 1062: (inb(ioaddr + TX_STATUS_REG) & TX_DONE) ? 1.1 root 1063: "IRQ conflict" : "network cable problem"); 1064: 1065: dev->trans_start = jiffies; 1066: 1067: /* Let's dump all registers */ 1.1.1.2 ! root 1068: if(eth16i_debug > 0) { 1.1 root 1069: printk(KERN_DEBUG "%s: timeout: %02x %02x %02x %02x %02x %02x %02x %02x.\n", 1.1.1.2 ! root 1070: dev->name, inb(ioaddr + 0), ! 1071: inb(ioaddr + 1), inb(ioaddr + 2), ! 1072: inb(ioaddr + 3), inb(ioaddr + 4), 1.1 root 1073: inb(ioaddr + 5), 1074: inb(ioaddr + 6), inb(ioaddr + 7)); 1075: 1076: printk(KERN_DEBUG "%s: transmit start reg: %02x. collision reg %02x\n", 1077: dev->name, inb(ioaddr + TRANSMIT_START_REG), 1078: inb(ioaddr + COL_16_REG)); 1079: 1080: printk(KERN_DEBUG "lp->tx_queue = %d\n", lp->tx_queue); 1081: printk(KERN_DEBUG "lp->tx_queue_len = %d\n", lp->tx_queue_len); 1082: printk(KERN_DEBUG "lp->tx_started = %d\n", lp->tx_started); 1083: 1084: } 1085: 1086: lp->stats.tx_errors++; 1087: 1088: eth16i_reset(dev); 1089: 1090: dev->trans_start = jiffies; 1091: 1092: outw(ETH16I_INTR_ON, ioaddr + TX_INTR_REG); 1093: 1094: } 1095: 1.1.1.2 ! root 1096: /* 1.1 root 1097: If some higher layer thinks we've missed an tx-done interrupt 1098: we are passed NULL. Caution: dev_tint() handles the cli()/sti() 1.1.1.2 ! root 1099: itself 1.1 root 1100: */ 1.1.1.2 ! root 1101: 1.1 root 1102: if(skb == NULL) { 1103: #if LINUX_VERSION_CODE < 0x020100 1104: dev_tint(dev); 1105: #endif 1.1.1.2 ! root 1106: if(eth16i_debug > 0) 1.1 root 1107: printk(KERN_WARNING "%s: Missed tx-done interrupt.\n", dev->name); 1108: return 0; 1109: } 1110: 1.1.1.2 ! root 1111: /* Block a timer based transmitter from overlapping. ! 1112: This could better be done with atomic_swap(1, dev->tbusy), 1.1 root 1113: but set_bit() works as well. */ 1114: 1115: set_bit(0, (void *)&lp->tx_buf_busy); 1.1.1.2 ! root 1116: 1.1 root 1117: /* Turn off TX interrupts */ 1118: outw(ETH16I_INTR_OFF, ioaddr + TX_INTR_REG); 1119: 1120: if(test_and_set_bit(0, (void *)&dev->tbusy) != 0) { 1121: printk(KERN_WARNING "%s: Transmitter access conflict.\n", dev->name); 1122: status = -1; 1123: } 1124: else { 1125: ushort length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN; 1126: unsigned char *buf = skb->data; 1127: 1128: if( (length + 2) > (lp->tx_buf_size - lp->tx_queue_len)) { 1.1.1.2 ! root 1129: if(eth16i_debug > 0) ! 1130: printk(KERN_WARNING "%s: Transmit buffer full.\n", dev->name); ! 1131: } 1.1 root 1132: else { 1133: outw(length, ioaddr + DATAPORT); 1134: 1.1.1.2 ! root 1135: if( ioaddr < 0x1000 ) 1.1 root 1136: outsw(ioaddr + DATAPORT, buf, (length + 1) >> 1); 1137: else { 1138: unsigned char frag = length % 4; 1139: 1140: outsl(ioaddr + DATAPORT, buf, length >> 2); 1141: 1142: if( frag != 0 ) { 1143: outsw(ioaddr + DATAPORT, (buf + (length & 0xFFFC)), 1); 1.1.1.2 ! root 1144: if( frag == 3 ) ! 1145: outsw(ioaddr + DATAPORT, 1.1 root 1146: (buf + (length & 0xFFFC) + 2), 1); 1147: } 1148: } 1149: 1150: lp->tx_buffered_packets++; 1151: lp->tx_queue++; 1152: lp->tx_queue_len += length + 2; 1.1.1.2 ! root 1153: 1.1 root 1154: } 1.1.1.2 ! root 1155: 1.1 root 1156: lp->tx_buf_busy = 0; 1157: 1158: if(lp->tx_started == 0) { 1159: /* If the transmitter is idle..always trigger a transmit */ 1160: outb(TX_START | lp->tx_queue, ioaddr + TRANSMIT_START_REG); 1161: lp->tx_queue = 0; 1162: lp->tx_queue_len = 0; 1163: dev->trans_start = jiffies; 1164: lp->tx_started = 1; 1165: dev->tbusy = 0; 1166: } 1167: else if(lp->tx_queue_len < lp->tx_buf_size - (ETH_FRAME_LEN + 2)) { 1168: /* There is still more room for one more packet in tx buffer */ 1169: dev->tbusy = 0; 1170: } 1.1.1.2 ! root 1171: 1.1 root 1172: outw(ETH16I_INTR_ON, ioaddr + TX_INTR_REG); 1.1.1.2 ! root 1173: 1.1 root 1174: /* Turn TX interrupts back on */ 1175: /* outb(TX_INTR_DONE | TX_INTR_16_COL, ioaddr + TX_INTR_REG); */ 1176: status = 0; 1.1.1.2 ! root 1177: } 1.1 root 1178: 1179: #if LINUX_VERSION_CODE >= 0x020100 1180: dev_kfree_skb(skb); 1181: #else 1182: dev_kfree_skb(skb, FREE_WRITE); 1183: #endif 1184: 1185: return status; 1186: } 1187: 1188: static void eth16i_rx(struct device *dev) 1189: { 1190: struct eth16i_local *lp = (struct eth16i_local *)dev->priv; 1191: int ioaddr = dev->base_addr; 1192: int boguscount = MAX_RX_LOOP; 1193: 1194: /* Loop until all packets have been read */ 1195: while( (inb(ioaddr + RECEIVE_MODE_REG) & RX_BUFFER_EMPTY) == 0) { 1196: 1.1.1.2 ! root 1197: /* Read status byte from receive buffer */ 1.1 root 1198: ushort status = inw(ioaddr + DATAPORT); 1199: 1200: /* Get the size of the packet from receive buffer */ 1201: ushort pkt_len = inw(ioaddr + DATAPORT); 1202: 1203: if(eth16i_debug > 4) 1.1.1.2 ! root 1204: printk(KERN_DEBUG "%s: Receiving packet mode %02x status %04x.\n", ! 1205: dev->name, 1.1 root 1206: inb(ioaddr + RECEIVE_MODE_REG), status); 1.1.1.2 ! root 1207: 1.1 root 1208: if( !(status & PKT_GOOD) ) { 1209: lp->stats.rx_errors++; 1210: 1211: if( (pkt_len < ETH_ZLEN) || (pkt_len > ETH_FRAME_LEN) ) { 1212: lp->stats.rx_length_errors++; 1213: eth16i_reset(dev); 1.1.1.2 ! root 1214: return; 1.1 root 1215: } 1.1.1.2 ! root 1216: else { 1.1 root 1217: eth16i_skip_packet(dev); 1218: lp->stats.rx_dropped++; 1.1.1.2 ! root 1219: } 1.1 root 1220: } 1221: else { /* Ok so now we should have a good packet */ 1222: struct sk_buff *skb; 1223: 1224: skb = dev_alloc_skb(pkt_len + 3); 1225: if( skb == NULL ) { 1.1.1.2 ! root 1226: printk(KERN_WARNING "%s: Could'n allocate memory for packet (len %d)\n", 1.1 root 1227: dev->name, pkt_len); 1228: eth16i_skip_packet(dev); 1229: lp->stats.rx_dropped++; 1230: break; 1231: } 1232: 1233: skb->dev = dev; 1234: skb_reserve(skb,2); 1.1.1.2 ! root 1235: ! 1236: /* 1.1 root 1237: Now let's get the packet out of buffer. 1238: size is (pkt_len + 1) >> 1, cause we are now reading words 1239: and it have to be even aligned. 1.1.1.2 ! root 1240: */ ! 1241: ! 1242: if(ioaddr < 0x1000) ! 1243: insw(ioaddr + DATAPORT, skb_put(skb, pkt_len), 1.1 root 1244: (pkt_len + 1) >> 1); 1.1.1.2 ! root 1245: else { 1.1 root 1246: unsigned char *buf = skb_put(skb, pkt_len); 1247: unsigned char frag = pkt_len % 4; 1248: 1249: insl(ioaddr + DATAPORT, buf, pkt_len >> 2); 1250: 1251: if(frag != 0) { 1252: unsigned short rest[2]; 1253: rest[0] = inw( ioaddr + DATAPORT ); 1254: if(frag == 3) 1255: rest[1] = inw( ioaddr + DATAPORT ); 1256: 1257: memcpy(buf + (pkt_len & 0xfffc), (char *)rest, frag); 1258: } 1259: } 1260: 1261: skb->protocol=eth_type_trans(skb, dev); 1262: netif_rx(skb); 1263: lp->stats.rx_packets++; 1264: 1265: if( eth16i_debug > 5 ) { 1266: int i; 1.1.1.2 ! root 1267: printk(KERN_DEBUG "%s: Received packet of length %d.\n", 1.1 root 1268: dev->name, pkt_len); 1.1.1.2 ! root 1269: for(i = 0; i < 14; i++) 1.1 root 1270: printk(KERN_DEBUG " %02x", skb->data[i]); 1271: printk(KERN_DEBUG ".\n"); 1272: } 1273: 1274: } /* else */ 1275: 1276: if(--boguscount <= 0) 1277: break; 1278: 1279: } /* while */ 1280: 1281: #if 0 1282: { 1283: int i; 1284: 1285: for(i = 0; i < 20; i++) { 1.1.1.2 ! root 1286: if( (inb(ioaddr+RECEIVE_MODE_REG) & RX_BUFFER_EMPTY) == 1.1 root 1287: RX_BUFFER_EMPTY) 1288: break; 1289: inw(ioaddr + DATAPORT); 1290: outb(SKIP_RX_PACKET, ioaddr + FILTER_SELF_RX_REG); 1291: } 1292: 1293: if(eth16i_debug > 1) 1294: printk(KERN_DEBUG "%s: Flushed receive buffer.\n", dev->name); 1295: } 1296: #endif 1297: 1298: return; 1299: } 1300: 1301: static void eth16i_interrupt(int irq, void *dev_id, struct pt_regs *regs) 1302: { 1303: struct device *dev = dev_id; 1304: struct eth16i_local *lp; 1305: int ioaddr = 0, 1306: status; 1307: 1308: if(dev == NULL) { 1309: printk(KERN_WARNING "eth16i_interrupt(): irq %d for unknown device. \n", irq); 1310: return; 1311: } 1312: 1313: /* Turn off all interrupts from adapter */ 1314: outw(ETH16I_INTR_OFF, ioaddr + TX_INTR_REG); 1315: 1316: set_bit(0, (void *)&dev->tbusy); /* Set the device busy so that */ 1317: /* eth16i_tx wont be called */ 1318: 1319: if(dev->interrupt) 1320: printk(KERN_WARNING "%s: Re-entering the interrupt handler.\n", dev->name); 1321: dev->interrupt = 1; 1322: 1323: ioaddr = dev->base_addr; 1324: lp = (struct eth16i_local *)dev->priv; 1325: status = inw(ioaddr + TX_STATUS_REG); /* Get the status */ 1326: outw(status, ioaddr + TX_STATUS_REG); /* Clear status bits */ 1327: 1328: if(eth16i_debug > 3) 1329: printk(KERN_DEBUG "%s: Interrupt with status %04x.\n", dev->name, status); 1330: 1331: if( status & 0x7f00 ) { 1332: 1333: lp->stats.rx_errors++; 1334: 1.1.1.2 ! root 1335: if(status & (BUS_RD_ERR << 8) ) 1.1 root 1336: printk(KERN_WARNING "%s: Bus read error.\n",dev->name); 1337: if(status & (SHORT_PKT_ERR << 8) ) lp->stats.rx_length_errors++; 1338: if(status & (ALIGN_ERR << 8) ) lp->stats.rx_frame_errors++; 1339: if(status & (CRC_ERR << 8) ) lp->stats.rx_crc_errors++; 1340: if(status & (RX_BUF_OVERFLOW << 8) ) lp->stats.rx_over_errors++; 1341: } 1342: if( status & 0x001a) { 1343: 1344: lp->stats.tx_errors++; 1345: 1346: if(status & CR_LOST) lp->stats.tx_carrier_errors++; 1347: if(status & TX_JABBER_ERR) lp->stats.tx_window_errors++; 1348: 1.1.1.2 ! root 1349: #if 0 1.1 root 1350: if(status & COLLISION) { 1.1.1.2 ! root 1351: lp->stats.collisions += 1.1 root 1352: ((inb(ioaddr+TRANSMIT_MODE_REG) & 0xF0) >> 4); 1353: } 1354: #endif 1355: if(status & COLLISIONS_16) { 1.1.1.2 ! root 1356: if(lp->col_16 < MAX_COL_16) { 1.1 root 1357: lp->col_16++; 1358: lp->stats.collisions++; 1359: /* Resume transmitting, skip failed packet */ 1360: outb(0x02, ioaddr + COL_16_REG); 1361: } 1362: else { 1363: printk(KERN_WARNING "%s: bailing out due to many consecutive 16-in-a-row collisions. Network cable problem?\n", dev->name); 1364: } 1365: } 1366: } 1367: 1368: if( status & 0x00ff ) { /* Let's check the transmit status reg */ 1369: 1370: if(status & TX_DONE) { /* The transmit has been done */ 1371: lp->stats.tx_packets = lp->tx_buffered_packets; 1.1.1.2 ! root 1372: lp->col_16 = 0; 1.1 root 1373: 1374: if(lp->tx_queue) { /* Is there still packets ? */ 1375: /* There was packet(s) so start transmitting and write also 1376: how many packets there is to be sended */ 1377: outb(TX_START | lp->tx_queue, ioaddr + TRANSMIT_START_REG); 1378: lp->tx_queue = 0; 1379: lp->tx_queue_len = 0; 1380: lp->tx_started = 1; 1381: dev->trans_start = jiffies; 1.1.1.2 ! root 1382: mark_bh(NET_BH); 1.1 root 1383: } 1384: else { 1385: lp->tx_started = 0; 1386: mark_bh(NET_BH); 1387: } 1388: } 1389: } 1390: 1.1.1.2 ! root 1391: if( ( status & 0x8000 ) || 1.1 root 1392: ( (inb(ioaddr + RECEIVE_MODE_REG) & RX_BUFFER_EMPTY) == 0) ) { 1393: eth16i_rx(dev); /* We have packet in receive buffer */ 1.1.1.2 ! root 1394: } ! 1395: 1.1 root 1396: dev->interrupt = 0; 1.1.1.2 ! root 1397: 1.1 root 1398: /* Turn interrupts back on */ 1399: outw(ETH16I_INTR_ON, ioaddr + TX_INTR_REG); 1.1.1.2 ! root 1400: 1.1 root 1401: if(lp->tx_queue_len < lp->tx_buf_size - (ETH_FRAME_LEN + 2)) { 1402: /* There is still more room for one more packet in tx buffer */ 1403: dev->tbusy = 0; 1404: } 1.1.1.2 ! root 1405: 1.1 root 1406: return; 1407: } 1408: 1409: static void eth16i_skip_packet(struct device *dev) 1.1.1.2 ! root 1410: { 1.1 root 1411: int ioaddr = dev->base_addr; 1412: 1413: inw(ioaddr + DATAPORT); 1414: inw(ioaddr + DATAPORT); 1415: inw(ioaddr + DATAPORT); 1416: 1417: outb(SKIP_RX_PACKET, ioaddr + FILTER_SELF_RX_REG); 1418: while( inb( ioaddr + FILTER_SELF_RX_REG ) != 0); 1419: } 1420: 1421: static void eth16i_reset(struct device *dev) 1422: { 1423: struct eth16i_local *lp = (struct eth16i_local *)dev->priv; 1424: int ioaddr = dev->base_addr; 1425: 1.1.1.2 ! root 1426: if(eth16i_debug > 1) 1.1 root 1427: printk(KERN_DEBUG "%s: Resetting device.\n", dev->name); 1428: 1429: BITSET(ioaddr + CONFIG_REG_0, DLC_EN); 1.1.1.2 ! root 1430: outw(0xffff, ioaddr + TX_STATUS_REG); 1.1 root 1431: eth16i_select_regbank(2, ioaddr); 1432: 1433: lp->tx_started = 0; 1434: lp->tx_buf_busy = 0; 1435: lp->tx_queue = 0; 1.1.1.2 ! root 1436: lp->tx_queue_len = 0; 1.1 root 1437: 1438: dev->interrupt = 0; 1439: dev->start = 1; 1440: dev->tbusy = 0; 1441: BITCLR(ioaddr + CONFIG_REG_0, DLC_EN); 1442: } 1443: 1444: static void eth16i_multicast(struct device *dev) 1445: { 1446: int ioaddr = dev->base_addr; 1.1.1.2 ! root 1447: ! 1448: if(dev->mc_count || dev->flags&(IFF_ALLMULTI|IFF_PROMISC)) 1.1 root 1449: { 1450: dev->flags|=IFF_PROMISC; /* Must do this */ 1.1.1.2 ! root 1451: outb(3, ioaddr + RECEIVE_MODE_REG); 1.1 root 1452: } else { 1453: outb(2, ioaddr + RECEIVE_MODE_REG); 1454: } 1455: } 1456: 1457: static struct enet_statistics *eth16i_get_stats(struct device *dev) 1458: { 1459: struct eth16i_local *lp = (struct eth16i_local *)dev->priv; 1460: 1461: return &lp->stats; 1462: } 1463: 1464: static void eth16i_select_regbank(unsigned char banknbr, int ioaddr) 1465: { 1466: unsigned char data; 1467: 1468: data = inb(ioaddr + CONFIG_REG_1); 1.1.1.2 ! root 1469: outb( ((data & 0xF3) | ( (banknbr & 0x03) << 2)), ioaddr + CONFIG_REG_1); 1.1 root 1470: } 1471: 1472: #ifdef MODULE 1473: 1474: static ushort eth16i_parse_mediatype(const char* s) 1475: { 1476: if(!s) 1477: return E_PORT_FROM_EPROM; 1.1.1.2 ! root 1478: 1.1 root 1479: if (!strncmp(s, "bnc", 3)) 1480: return E_PORT_BNC; 1481: else if (!strncmp(s, "tp", 2)) 1482: return E_PORT_TP; 1483: else if (!strncmp(s, "dix", 3)) 1484: return E_PORT_DIX; 1485: else if (!strncmp(s, "auto", 4)) 1486: return E_PORT_AUTO; 1487: else 1488: return E_PORT_FROM_EPROM; 1489: } 1490: 1491: #define MAX_ETH16I_CARDS 4 /* Max number of Eth16i cards per module */ 1492: #define NAMELEN 8 /* number of chars for storing dev->name */ 1493: 1494: static char namelist[NAMELEN * MAX_ETH16I_CARDS] = { 0, }; 1495: static struct device dev_eth16i[MAX_ETH16I_CARDS] = { 1496: { 1497: NULL, 1498: 0, 0, 0, 0, 1499: 0, 0, 1500: 0, 0, 0, NULL, NULL 1501: }, 1502: }; 1503: 1504: static int ioaddr[MAX_ETH16I_CARDS] = { 0, }; 1505: #if 0 1506: static int irq[MAX_ETH16I_CARDS] = { 0, }; 1507: #endif 1508: static char* mediatype[MAX_ETH16I_CARDS] = { 0, }; 1509: static int debug = -1; 1510: 1.1.1.2 ! root 1511: #if (LINUX_VERSION_CODE >= 0x20115) 1.1 root 1512: MODULE_AUTHOR("Mika Kuoppala <[email protected]>"); 1513: MODULE_DESCRIPTION("ICL EtherTeam 16i/32 driver"); 1514: 1515: MODULE_PARM(ioaddr, "1-" __MODULE_STRING(MAX_ETH16I_CARDS) "i"); 1516: MODULE_PARM_DESC(ioaddr, "eth16i io base address"); 1517: 1518: #if 0 1519: MODULE_PARM(irq, "1-" __MODULE_STRING(MAX_ETH16I_CARDS) "i"); 1520: MODULE_PARM_DESC(irq, "eth16i interrupt request number"); 1521: #endif 1522: 1523: MODULE_PARM(mediatype, "1-" __MODULE_STRING(MAX_ETH16I_CARDS) "s"); 1524: MODULE_PARM_DESC(mediatype, "eth16i interfaceport mediatype"); 1525: 1526: MODULE_PARM(debug, "i"); 1527: MODULE_PARM_DESC(debug, "eth16i debug level (0-4)"); 1528: #endif 1529: 1530: int init_module(void) 1531: { 1532: int this_dev, found = 0; 1533: 1534: for(this_dev = 0; this_dev < MAX_ETH16I_CARDS; this_dev++) 1535: { 1536: struct device *dev = &dev_eth16i[this_dev]; 1.1.1.2 ! root 1537: 1.1 root 1538: dev->name = namelist + (NAMELEN*this_dev); 1539: dev->irq = 0; /* irq[this_dev]; */ 1540: dev->base_addr = ioaddr[this_dev]; 1541: dev->init = eth16i_probe; 1542: 1543: if(debug != -1) 1544: eth16i_debug = debug; 1545: 1546: if(eth16i_debug > 1) 1547: printk(KERN_NOTICE "eth16i(%d): interface type %s\n", this_dev, mediatype[this_dev] ? mediatype[this_dev] : "none" ); 1548: 1549: dev->if_port = eth16i_parse_mediatype(mediatype[this_dev]); 1550: 1551: if(ioaddr[this_dev] == 0) 1552: { 1553: if(this_dev != 0) break; /* Only autoprobe 1st one */ 1554: 1555: printk(KERN_NOTICE "eth16i.c: Presently autoprobing (not recommended) for a single card.\n"); 1556: } 1557: 1558: if(register_netdev(dev) != 0) 1559: { 1560: printk(KERN_WARNING "eth16i.c No Eth16i card found (i/o = 0x%x).\n", 1561: ioaddr[this_dev]); 1.1.1.2 ! root 1562: 1.1 root 1563: if(found != 0) return 0; 1564: return -ENXIO; 1565: } 1566: 1567: found++; 1568: } 1569: return 0; 1570: } 1.1.1.2 ! root 1571: 1.1 root 1572: void cleanup_module(void) 1573: { 1574: int this_dev; 1575: 1576: for(this_dev = 0; this_dev < MAX_ETH16I_CARDS; this_dev++) 1577: { 1578: struct device* dev = &dev_eth16i[this_dev]; 1.1.1.2 ! root 1579: 1.1 root 1580: if(dev->priv != NULL) 1581: { 1582: unregister_netdev(dev); 1583: kfree(dev->priv); 1584: dev->priv = NULL; 1.1.1.2 ! root 1585: 1.1 root 1586: free_irq(dev->irq, dev); 1587: release_region(dev->base_addr, ETH16I_IO_EXTENT); 1.1.1.2 ! root 1588: 1.1 root 1589: } 1590: } 1591: } 1592: #endif /* MODULE */ 1593: 1594: /* 1595: * Local variables: 1596: * compile-command: "gcc -DMODULE -D__KERNEL__ -Wall -Wstrict-prototypes -O6 -c eth16i.c" 1597: * alt-compile-command: "gcc -DMODVERSIONS -DMODULE -D__KERNEL__ -Wall -Wstrict -prototypes -O6 -c eth16i.c" 1598: * tab-width: 8 1599: * c-basic-offset: 8 1600: * c-indent-level: 8 1601: * End: 1602: */ 1603: 1604: /* End of file eth16i.c */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.