11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * tms380tr.h: TI TMS380 Token Ring driver for Linux 31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Authors: 51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * - Christoph Goos <cgoos@syskonnect.de> 6726a645913694619876dd20645f88aad25cfbcd5Joe Perches * - Adam Fritzler 71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef __LINUX_TMS380TR_H 101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define __LINUX_TMS380TR_H 111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef __KERNEL__ 131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/interrupt.h> 151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* module prototypes */ 17f1608f859a3fba95a3b0ae70f2528b81c6928d77Stephen Hemmingerextern const struct net_device_ops tms380tr_netdev_ops; 181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint tms380tr_open(struct net_device *dev); 191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint tms380tr_close(struct net_device *dev); 207d12e780e003f93433d49ce78cfedf4b4c52adc5David Howellsirqreturn_t tms380tr_interrupt(int irq, void *dev_id); 2184c3ea01d163a24323d827e1d280dc3346905972Jochen Friedrichint tmsdev_init(struct net_device *dev, struct device *pdev); 221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid tmsdev_term(struct net_device *dev); 231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid tms380tr_wait(unsigned long time); 241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TMS380TR_MAX_ADAPTERS 7 261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SEND_TIMEOUT 10*HZ 281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TR_RCF_LONGEST_FRAME_MASK 0x0070 301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TR_RCF_FRAME4K 0x0030 311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*------------------------------------------------------------------*/ 331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bit order for adapter communication with DMA */ 341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* -------------------------------------------------------------- */ 351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bit 8 | 9| 10| 11|| 12| 13| 14| 15|| 0| 1| 2| 3|| 4| 5| 6| 7| */ 361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* -------------------------------------------------------------- */ 371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* The bytes in a word must be byte swapped. Also, if a double */ 381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* word is used for storage, then the words, as well as the bytes, */ 391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* must be swapped. */ 401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bit order for adapter communication with DIO */ 411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* -------------------------------------------------------------- */ 421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bit 0 | 1| 2| 3|| 4| 5| 6| 7|| 8| 9| 10| 11|| 12| 13| 14| 15| */ 431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* -------------------------------------------------------------- */ 441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*------------------------------------------------------------------*/ 451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Swap words of a long. */ 471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SWAPW(x) (((x) << 16) | ((x) >> 16)) 481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Get the low byte of a word. */ 501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define LOBYTE(w) ((unsigned char)(w)) 511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Get the high byte of a word. */ 531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HIBYTE(w) ((unsigned char)((unsigned short)(w) >> 8)) 541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Get the low word of a long. */ 561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define LOWORD(l) ((unsigned short)(l)) 571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Get the high word of a long. */ 591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HIWORD(l) ((unsigned short)((unsigned long)(l) >> 16)) 601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Token ring adapter I/O addresses for normal mode. */ 641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * The SIF registers. Common to all adapters. 671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Basic SIF (SRSX = 0) */ 691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SIFDAT 0x00 /* SIF/DMA data. */ 701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SIFINC 0x02 /* IO Word data with auto increment. */ 711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SIFINH 0x03 /* IO Byte data with auto increment. */ 721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SIFADR 0x04 /* SIF/DMA Address. */ 731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SIFCMD 0x06 /* SIF Command. */ 741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SIFSTS 0x06 /* SIF Status. */ 751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* "Extended" SIF (SRSX = 1) */ 771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SIFACL 0x08 /* SIF Adapter Control Register. */ 781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SIFADD 0x0a /* SIF/DMA Address. -- 0x0a */ 791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SIFADX 0x0c /* 0x0c */ 801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DMALEN 0x0e /* SIF DMA length. -- 0x0e */ 811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * POS Registers. Only for ISA Adapters. 841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define POSREG 0x10 /* Adapter Program Option Select (POS) 861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Register: base IO address + 16 byte. 871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define POSREG_2 24L /* only for TR4/16+ adapter 891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * base IO address + 24 byte. -- 0x18 901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* SIFCMD command codes (high-low) */ 931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CMD_INTERRUPT_ADAPTER 0x8000 /* Cause internal adapter interrupt */ 941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CMD_ADAPTER_RESET 0x4000 /* Hardware reset of adapter */ 951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CMD_SSB_CLEAR 0x2000 /* Acknowledge to adapter to 961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * system interrupts. 971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CMD_EXECUTE 0x1000 /* Execute SCB command */ 991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CMD_SCB_REQUEST 0x0800 /* Request adapter to interrupt 1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * system when SCB is available for 1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * another command. 1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CMD_RX_CONTINUE 0x0400 /* Continue receive after odd pointer 1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * stop. (odd pointer receive method) 1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CMD_RX_VALID 0x0200 /* Now actual RPL is valid. */ 1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CMD_TX_VALID 0x0100 /* Now actual TPL is valid. (valid 1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * bit receive/transmit method) 1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CMD_SYSTEM_IRQ 0x0080 /* Adapter-to-attached-system 1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * interrupt is reset. 1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CMD_CLEAR_SYSTEM_IRQ 0x0080 /* Clear SYSTEM_INTERRUPT bit. 1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (write: 1=ignore, 0=reset) 1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define EXEC_SOFT_RESET 0xFF00 /* adapter soft reset. (restart 1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * adapter after hardware reset) 1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* ACL commands (high-low) */ 1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ACL_SWHLDA 0x0800 /* Software hold acknowledge. */ 1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ACL_SWDDIR 0x0400 /* Data transfer direction. */ 1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ACL_SWHRQ 0x0200 /* Pseudo DMA operation. */ 1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ACL_PSDMAEN 0x0100 /* Enable pseudo system DMA. */ 1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ACL_ARESET 0x0080 /* Adapter hardware reset command. 1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (held in reset condition as 1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * long as bit is set) 1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ACL_CPHALT 0x0040 /* Communication processor halt. 1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (can only be set while ACL_ARESET 1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * bit is set; prevents adapter 1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * processor from executing code while 1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * downloading firmware) 1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ACL_BOOT 0x0020 1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ACL_SINTEN 0x0008 /* System interrupt enable/disable 1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (1/0): can be written if ACL_ARESET 1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * is zero. 1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ACL_PEN 0x0004 1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ACL_NSELOUT0 0x0002 1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ACL_NSELOUT1 0x0001 /* NSELOUTx have a card-specific 1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * meaning for setting ring speed. 1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PS_DMA_MASK (ACL_SWHRQ | ACL_PSDMAEN) 1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* SIFSTS register return codes (high-low) */ 1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define STS_SYSTEM_IRQ 0x0080 /* Adapter-to-attached-system 1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * interrupt is valid. 1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define STS_INITIALIZE 0x0040 /* INITIALIZE status. (ready to 1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * initialize) 1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define STS_TEST 0x0020 /* TEST status. (BUD not completed) */ 1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define STS_ERROR 0x0010 /* ERROR status. (unrecoverable 1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * HW error occurred) 1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define STS_MASK 0x00F0 /* Mask interesting status bits. */ 1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define STS_ERROR_MASK 0x000F /* Get Error Code by masking the 1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * interrupt code bits. 1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ADAPTER_INT_PTRS 0x0A00 /* Address offset of adapter internal 1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * pointers 01:0a00 (high-low) have to 1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * be read after init and before open. 1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Interrupt Codes (only MAC IRQs) */ 1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define STS_IRQ_ADAPTER_CHECK 0x0000 /* unrecoverable hardware or 1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * software error. 1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define STS_IRQ_RING_STATUS 0x0004 /* SSB is updated with ring status. */ 1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define STS_IRQ_LLC_STATUS 0x0005 /* Not used in MAC-only microcode */ 1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define STS_IRQ_SCB_CLEAR 0x0006 /* SCB clear, following an 1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * SCB_REQUEST IRQ. 1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define STS_IRQ_TIMER 0x0007 /* Not normally used in MAC ucode */ 1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define STS_IRQ_COMMAND_STATUS 0x0008 /* SSB is updated with command 1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * status. 1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define STS_IRQ_RECEIVE_STATUS 0x000A /* SSB is updated with receive 1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * status. 1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define STS_IRQ_TRANSMIT_STATUS 0x000C /* SSB is updated with transmit 1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * status 1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define STS_IRQ_RECEIVE_PENDING 0x000E /* Not used in MAC-only microcode */ 1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define STS_IRQ_MASK 0x000F /* = STS_ERROR_MASK. */ 1931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* TRANSMIT_STATUS completion code: (SSB.Parm[0]) */ 1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define COMMAND_COMPLETE 0x0080 /* TRANSMIT command completed 1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (avoid this!) issue another transmit 1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * to send additional frames. 1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define FRAME_COMPLETE 0x0040 /* Frame has been transmitted; 2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * INTERRUPT_FRAME bit was set in the 2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * CSTAT request; indication of possibly 2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * more than one frame transmissions! 2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * SSB.Parm[0-1]: 32 bit pointer to 2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * TPL of last frame. 2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define LIST_ERROR 0x0020 /* Error in one of the TPLs that 2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * compose the frame; TRANSMIT 2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * terminated; Parm[1-2]: 32bit pointer 2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * to TPL which starts the error 2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * frame; error details in bits 8-13. 2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (14?) 2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define FRAME_SIZE_ERROR 0x8000 /* FRAME_SIZE does not equal the sum of 2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the valid DATA_COUNT fields; 2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FRAME_SIZE less than header plus 2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * information field. (15 bytes + 2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * routing field) Or if FRAME_SIZE 2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * was specified as zero in one list. 2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TX_THRESHOLD 0x4000 /* FRAME_SIZE greater than (BUFFER_SIZE 2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * - 9) * TX_BUF_MAX. 2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ODD_ADDRESS 0x2000 /* Odd forward pointer value is 2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * read on a list without END_FRAME 2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * indication. 2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define FRAME_ERROR 0x1000 /* START_FRAME bit (not) anticipated, 2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * but (not) set. 2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ACCESS_PRIORITY_ERROR 0x0800 /* Access priority requested has not 2321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * been allowed. 2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define UNENABLED_MAC_FRAME 0x0400 /* MAC frame has source class of zero 2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * or MAC frame PCF ATTN field is 2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * greater than one. 2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ILLEGAL_FRAME_FORMAT 0x0200 /* Bit 0 or FC field was set to one. */ 2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Since we need to support some functions even if the adapter is in a 2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * CLOSED state, we have a (pseudo-) command queue which holds commands 2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * that are outstandig to be executed. 2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Each time a command completes, an interrupt occurs and the next 2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * command is executed. The command queue is actually a simple word with 2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * a bit for each outstandig command. Therefore the commands will not be 2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * executed in the order they have been queued. 2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * The following defines the command code bits and the command queue: 2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OC_OPEN 0x0001 /* OPEN command */ 2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OC_TRANSMIT 0x0002 /* TRANSMIT command */ 2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OC_TRANSMIT_HALT 0x0004 /* TRANSMIT_HALT command */ 2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OC_RECEIVE 0x0008 /* RECEIVE command */ 2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OC_CLOSE 0x0010 /* CLOSE command */ 2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OC_SET_GROUP_ADDR 0x0020 /* SET_GROUP_ADDR command */ 2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OC_SET_FUNCT_ADDR 0x0040 /* SET_FUNCT_ADDR command */ 2601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OC_READ_ERROR_LOG 0x0080 /* READ_ERROR_LOG command */ 2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OC_READ_ADAPTER 0x0100 /* READ_ADAPTER command */ 2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OC_MODIFY_OPEN_PARMS 0x0400 /* MODIFY_OPEN_PARMS command */ 2631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OC_RESTORE_OPEN_PARMS 0x0800 /* RESTORE_OPEN_PARMS command */ 2641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OC_SET_FIRST_16_GROUP 0x1000 /* SET_FIRST_16_GROUP command */ 2651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OC_SET_BRIDGE_PARMS 0x2000 /* SET_BRIDGE_PARMS command */ 2661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OC_CONFIG_BRIDGE_PARMS 0x4000 /* CONFIG_BRIDGE_PARMS command */ 2671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OPEN 0x0300 /* C: open command. S: completion. */ 2691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TRANSMIT 0x0400 /* C: transmit command. S: completion 2701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * status. (reject: COMMAND_REJECT if 2711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * adapter not opened, TRANSMIT already 2721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * issued or address passed in the SCB 2731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * not word aligned) 2741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TRANSMIT_HALT 0x0500 /* C: interrupt TX TPL chain; if no 2761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * TRANSMIT command issued, the command 2771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * is ignored (completion with TRANSMIT 2781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * status (0x0400)!) 2791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RECEIVE 0x0600 /* C: receive command. S: completion 2811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * status. (reject: COMMAND_REJECT if 2821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * adapter not opened, RECEIVE already 2831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * issued or address passed in the SCB 2841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * not word aligned) 2851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CLOSE 0x0700 /* C: close adapter. S: completion. 2871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (COMMAND_REJECT if adapter not open) 2881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SET_GROUP_ADDR 0x0800 /* C: alter adapter group address after 2901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * OPEN. S: completion. (COMMAND_REJECT 2911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * if adapter not open) 2921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SET_FUNCT_ADDR 0x0900 /* C: alter adapter functional address 2941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * after OPEN. S: completion. 2951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (COMMAND_REJECT if adapter not open) 2961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define READ_ERROR_LOG 0x0A00 /* C: read adapter error counters. 2981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * S: completion. (command ignored 2991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * if adapter not open!) 3001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 3011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define READ_ADAPTER 0x0B00 /* C: read data from adapter memory. 3021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (important: after init and before 3031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * open!) S: completion. (ADAPTER_CHECK 3041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * interrupt if undefined storage area 3051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * read) 3061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 3071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MODIFY_OPEN_PARMS 0x0D00 /* C: modify some adapter operational 3081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * parameters. (bit correspondend to 3091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * WRAP_INTERFACE is ignored) 3101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * S: completion. (reject: 3111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * COMMAND_REJECT) 3121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 3131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RESTORE_OPEN_PARMS 0x0E00 /* C: modify some adapter operational 3141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * parameters. (bit correspondend 3151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * to WRAP_INTERFACE is ignored) 3161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * S: completion. (reject: 3171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * COMMAND_REJECT) 3181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 3191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SET_FIRST_16_GROUP 0x0F00 /* C: alter the first two bytes in 3201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * adapter group address. 3211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * S: completion. (reject: 3221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * COMMAND_REJECT) 3231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 3241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SET_BRIDGE_PARMS 0x1000 /* C: values and conditions for the 3251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * adapter hardware to use when frames 3261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * are copied for forwarding. 3271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * S: completion. (reject: 3281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * COMMAND_REJECT) 3291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 3301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CONFIG_BRIDGE_PARMS 0x1100 /* C: .. 3311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * S: completion. (reject: 3321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * COMMAND_REJECT) 3331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 3341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SPEED_4 4 3361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SPEED_16 16 /* Default transmission speed */ 3371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Initialization Parameter Block (IPB); word alignment necessary! */ 3401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define BURST_SIZE 0x0018 /* Default burst size */ 3411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define BURST_MODE 0x9F00 /* Burst mode enable */ 3421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DMA_RETRIES 0x0505 /* Magic DMA retry number... */ 3431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CYCLE_TIME 3 /* Default AT-bus cycle time: 500 ns 3451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (later adapter version: fix cycle time!) 3461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 3471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define LINE_SPEED_BIT 0x80 3481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Macro definition for the wait function. */ 3501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ONE_SECOND_TICKS 1000000 3511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HALF_SECOND (ONE_SECOND_TICKS / 2) 3521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ONE_SECOND (ONE_SECOND_TICKS) 3531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TWO_SECONDS (ONE_SECOND_TICKS * 2) 3541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define THREE_SECONDS (ONE_SECOND_TICKS * 3) 3551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define FOUR_SECONDS (ONE_SECOND_TICKS * 4) 3561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define FIVE_SECONDS (ONE_SECOND_TICKS * 5) 3571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define BUFFER_SIZE 2048 /* Buffers on Adapter */ 3591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#pragma pack(1) 3611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct { 3621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned short Init_Options; /* Initialize with burst mode; 3631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * LLC disabled. (MAC only) 3641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 3651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Interrupt vectors the adapter places on attached system bus. */ 3671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u_int8_t CMD_Status_IV; /* Interrupt vector: command status. */ 3681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u_int8_t TX_IV; /* Interrupt vector: transmit. */ 3691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u_int8_t RX_IV; /* Interrupt vector: receive. */ 3701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u_int8_t Ring_Status_IV; /* Interrupt vector: ring status. */ 3711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u_int8_t SCB_Clear_IV; /* Interrupt vector: SCB clear. */ 3721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u_int8_t Adapter_CHK_IV; /* Interrupt vector: adapter check. */ 3731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u_int16_t RX_Burst_Size; /* Max. number of transfer cycles. */ 3751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u_int16_t TX_Burst_Size; /* During DMA burst; even value! */ 3761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u_int16_t DMA_Abort_Thrhld; /* Number of DMA retries. */ 3771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u_int32_t SCB_Addr; /* SCB address: even, word aligned, high-low */ 3791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u_int32_t SSB_Addr; /* SSB address: even, word aligned, high-low */ 3801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} IPB, *IPB_Ptr; 3811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#pragma pack() 3821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 3841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * OPEN Command Parameter List (OCPL) (can be reused, if the adapter has to 3851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * be reopened) 3861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 3871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define BUFFER_SIZE 2048 /* Buffers on Adapter. */ 3881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TPL_SIZE 8+6*TX_FRAG_NUM /* Depending on fragments per TPL. */ 3891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RPL_SIZE 14 /* (with TI firmware v2.26 handling 3901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * up to nine fragments possible) 3911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 3921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TX_BUF_MIN 20 /* ??? (Stephan: calculation with */ 3931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TX_BUF_MAX 40 /* BUFFER_SIZE and MAX_FRAME_SIZE) ??? 3941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 3951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DISABLE_EARLY_TOKEN_RELEASE 0x1000 3961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* OPEN Options (high-low) */ 3981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define WRAP_INTERFACE 0x0080 /* Inserting omitted for test 3991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * purposes; transmit data appears 4001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * as receive data. (useful for 4011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * testing; change: CLOSE necessary) 4021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 4031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DISABLE_HARD_ERROR 0x0040 /* On HARD_ERROR & TRANSMIT_BEACON 4041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * no RING.STATUS interrupt. 4051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 4061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DISABLE_SOFT_ERROR 0x0020 /* On SOFT_ERROR, no RING.STATUS 4071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * interrupt. 4081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 4091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PASS_ADAPTER_MAC_FRAMES 0x0010 /* Passing unsupported MAC frames 4101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * to system. 4111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 4121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PASS_ATTENTION_FRAMES 0x0008 /* All changed attention MAC frames are 4131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * passed to the system. 4141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 4151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PAD_ROUTING_FIELD 0x0004 /* Routing field is padded to 18 4161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * bytes. 4171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 4181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define FRAME_HOLD 0x0002 /*Adapter waits for entire frame before 4191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * initiating DMA transfer; otherwise: 4201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DMA transfer initiation if internal 4211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * buffer filled. 4221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 4231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CONTENDER 0x0001 /* Adapter participates in the monitor 4241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * contention process. 4251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 4261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PASS_BEACON_MAC_FRAMES 0x8000 /* Adapter passes beacon MAC frames 4271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * to the system. 4281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 4291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define EARLY_TOKEN_RELEASE 0x1000 /* Only valid in 16 Mbps operation; 4301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 0 = ETR. (no effect in 4 Mbps 4311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * operation) 4321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 4331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define COPY_ALL_MAC_FRAMES 0x0400 /* All MAC frames are copied to 4341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the system. (after OPEN: duplicate 4351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * address test (DAT) MAC frame is 4361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * first received frame copied to the 4371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * system) 4381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 4391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define COPY_ALL_NON_MAC_FRAMES 0x0200 /* All non MAC frames are copied to 4401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the system. 4411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 4421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PASS_FIRST_BUF_ONLY 0x0100 /* Passes only first internal buffer 4431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * of each received frame; FrameSize 4441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * of RPLs must contain internal 44525985edcedea6396277003854657b5f3cb31a628Lucas De Marchi * BUFFER_SIZE bits for promiscuous mode. 4461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 4471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ENABLE_FULL_DUPLEX_SELECTION 0x2000 4481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Enable the use of full-duplex 4491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * settings with bits in byte 22 in 4501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * ocpl. (new feature in firmware 4511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * version 3.09) 4521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 4531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Full-duplex settings */ 4551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OPEN_FULL_DUPLEX_OFF 0x0000 4561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OPEN_FULL_DUPLEX_ON 0x00c0 4571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OPEN_FULL_DUPLEX_AUTO 0x0080 4581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PROD_ID_SIZE 18 /* Length of product ID. */ 4601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TX_FRAG_NUM 3 /* Number of fragments used in one TPL. */ 4621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TX_MORE_FRAGMENTS 0x8000 /* Bit set in DataCount to indicate more 4631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * fragments following. 4641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 4651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* XXX is there some better way to do this? */ 4671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ISA_MAX_ADDRESS 0x00ffffff 4681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PCI_MAX_ADDRESS 0xffffffff 4691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#pragma pack(1) 4711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct { 4721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u_int16_t OPENOptions; 4731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u_int8_t NodeAddr[6]; /* Adapter node address; use ROM 4741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * address 4751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 4761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u_int32_t GroupAddr; /* Multicast: high order 4771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * bytes = 0xC000 4781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 4791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u_int32_t FunctAddr; /* High order bytes = 0xC000 */ 4802929e7700fb64f58f9c501a293b98b6bf6c49403Al Viro __be16 RxListSize; /* RPL size: 0 (=26), 14, 20 or 4811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 26 bytes read by the adapter. 4821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (Depending on the number of 4831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * fragments/list) 4841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 4852929e7700fb64f58f9c501a293b98b6bf6c49403Al Viro __be16 TxListSize; /* TPL size */ 4862929e7700fb64f58f9c501a293b98b6bf6c49403Al Viro __be16 BufSize; /* Is automatically rounded up to the 4871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * nearest nK boundary. 4881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 4891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u_int16_t FullDuplex; 4901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u_int16_t Reserved; 4911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u_int8_t TXBufMin; /* Number of adapter buffers reserved 4921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * for transmission a minimum of 2 4931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * buffers must be allocated. 4941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 4951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u_int8_t TXBufMax; /* Maximum number of adapter buffers 4961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * for transmit; a minimum of 2 buffers 4971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * must be available for receive. 4981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Default: 6 4991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 5001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u_int16_t ProdIDAddr[2];/* Pointer to product ID. */ 5011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} OPB, *OPB_Ptr; 5021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#pragma pack() 5031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 5051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * SCB: adapter commands enabled by the host system started by writing 5061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * CMD_INTERRUPT_ADAPTER | CMD_EXECUTE (|SCB_REQUEST) to the SIFCMD IO 5071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * register. (special case: | CMD_SYSTEM_IRQ for initialization) 5081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 5091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#pragma pack(1) 5101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct { 5111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u_int16_t CMD; /* Command code */ 5121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u_int16_t Parm[2]; /* Pointer to Command Parameter Block */ 5131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} SCB; /* System Command Block (32 bit physical address; big endian)*/ 5141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#pragma pack() 5151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 5171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * SSB: adapter command return status can be evaluated after COMMAND_STATUS 5181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * adapter to system interrupt after reading SSB, the availability of the SSB 5191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * has to be told the adapter by writing CMD_INTERRUPT_ADAPTER | CMD_SSB_CLEAR 5201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * in the SIFCMD IO register. 5211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 5221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#pragma pack(1) 5231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct { 5241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u_int16_t STS; /* Status code */ 5251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u_int16_t Parm[3]; /* Parameter or pointer to Status Parameter 5261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Block. 5271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 5281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} SSB; /* System Status Block (big endian - physical address) */ 5291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#pragma pack() 5301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct { 5321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned short BurnedInAddrPtr; /* Pointer to adapter burned in 5331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * address. (BIA) 5341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 5351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned short SoftwareLevelPtr;/* Pointer to software level data. */ 5361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned short AdapterAddrPtr; /* Pointer to adapter addresses. */ 5371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned short AdapterParmsPtr; /* Pointer to adapter parameters. */ 5381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned short MACBufferPtr; /* Pointer to MAC buffer. (internal) */ 5391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned short LLCCountersPtr; /* Pointer to LLC counters. */ 5401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned short SpeedFlagPtr; /* Pointer to data rate flag. 5411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (4/16 Mbps) 5421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 5431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned short AdapterRAMPtr; /* Pointer to adapter RAM found. (KB) */ 5441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} INTPTRS; /* Adapter internal pointers */ 5451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#pragma pack(1) 5471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct { 5481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u_int8_t Line_Error; /* Line error: code violation in 5491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * frame or in a token, or FCS error. 5501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 5511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u_int8_t Internal_Error; /* IBM specific. (Reserved_1) */ 5521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u_int8_t Burst_Error; 5531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u_int8_t ARI_FCI_Error; /* ARI/FCI bit zero in AMP or 5541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * SMP MAC frame. 5551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 5561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u_int8_t AbortDelimeters; /* IBM specific. (Reserved_2) */ 5571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u_int8_t Reserved_3; 5581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u_int8_t Lost_Frame_Error; /* Receive of end of transmitted 5591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * frame failed. 5601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 5611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u_int8_t Rx_Congest_Error; /* Adapter in repeat mode has not 5621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * enough buffer space to copy incoming 5631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * frame. 5641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 5651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u_int8_t Frame_Copied_Error; /* ARI bit not zero in frame 5661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * addressed to adapter. 5671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 5681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u_int8_t Frequency_Error; /* IBM specific. (Reserved_4) */ 5691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u_int8_t Token_Error; /* (active only in monitor station) */ 5701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u_int8_t Reserved_5; 5711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u_int8_t DMA_Bus_Error; /* DMA bus errors not exceeding the 5721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * abort thresholds. 5731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 5741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u_int8_t DMA_Parity_Error; /* DMA parity errors not exceeding 5751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the abort thresholds. 5761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 5771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} ERRORTAB; /* Adapter error counters */ 5781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#pragma pack() 5791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*--------------------- Send and Receive definitions -------------------*/ 5821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#pragma pack(1) 5831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct { 5842929e7700fb64f58f9c501a293b98b6bf6c49403Al Viro __be16 DataCount; /* Value 0, even and odd values are 5851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * permitted; value is unaltered most 5861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * significant bit set: following 5871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * fragments last fragment: most 5881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * significant bit is not evaluated. 5891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (???) 5901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 5912929e7700fb64f58f9c501a293b98b6bf6c49403Al Viro __be32 DataAddr; /* Pointer to frame data fragment; 5921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * even or odd. 5931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 5941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} Fragment; 5951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#pragma pack() 5961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MAX_FRAG_NUMBERS 9 /* Maximal number of fragments possible to use 5981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * in one RPL/TPL. (depending on TI firmware 5991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * version) 6001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 6011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 6031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * AC (1), FC (1), Dst (6), Src (6), RIF (18), Data (4472) = 4504 6041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * The packet size can be one of the follows: 548, 1502, 2084, 4504, 8176, 6051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 11439, 17832. Refer to TMS380 Second Generation Token Ring User's Guide 6061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Page 2-27. 6071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 6081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HEADER_SIZE (1 + 1 + 6 + 6) 6091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SRC_SIZE 18 6101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MIN_DATA_SIZE 516 6111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_DATA_SIZE 4472 6121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MAX_DATA_SIZE 17800 6131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_PACKET_SIZE (HEADER_SIZE + SRC_SIZE + DEFAULT_DATA_SIZE) 6151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MIN_PACKET_SIZE (HEADER_SIZE + SRC_SIZE + MIN_DATA_SIZE) 6161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MAX_PACKET_SIZE (HEADER_SIZE + SRC_SIZE + MAX_DATA_SIZE) 6171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 6191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Macros to deal with the frame status field. 6201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 6211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AC_NOT_RECOGNIZED 0x00 6221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define GROUP_BIT 0x80 6231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define GET_TRANSMIT_STATUS_HIGH_BYTE(Ts) ((unsigned char)((Ts) >> 8)) 6241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define GET_FRAME_STATUS_HIGH_AC(Fs) ((unsigned char)(((Fs) & 0xC0) >> 6)) 6251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define GET_FRAME_STATUS_LOW_AC(Fs) ((unsigned char)(((Fs) & 0x0C) >> 2)) 6261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DIRECTED_FRAME(Context) (!((Context)->MData[2] & GROUP_BIT)) 6271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*--------------------- Send Functions ---------------------------------*/ 6301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* define TX_CSTAT _REQUEST (R) and _COMPLETE (C) values (high-low) */ 6311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TX_VALID 0x0080 /* R: set via TRANSMIT.VALID interrupt. 6331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * C: always reset to zero! 6341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 6351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TX_FRAME_COMPLETE 0x0040 /* R: must be reset to zero. 6361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * C: set to one. 6371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 6381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TX_START_FRAME 0x0020 /* R: start of a frame: 1 6391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * C: unchanged. 6401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 6411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TX_END_FRAME 0x0010 /* R: end of a frame: 1 6421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * C: unchanged. 6431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 6441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TX_FRAME_IRQ 0x0008 /* R: request interrupt generation 6451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * after transmission. 6461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * C: unchanged. 6471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 6481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TX_ERROR 0x0004 /* R: reserved. 6491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * C: set to one if Error occurred. 6501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 6511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TX_INTERFRAME_WAIT 0x0004 6521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TX_PASS_CRC 0x0002 /* R: set if CRC value is already 6531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * calculated. (valid only in 6541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FRAME_START TPL) 6551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * C: unchanged. 6561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 6571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TX_PASS_SRC_ADDR 0x0001 /* R: adapter uses explicit frame 6581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * source address and does not overwrite 6591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * with the adapter node address. 6601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (valid only in FRAME_START TPL) 6611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 6621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * C: unchanged. 6631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 6641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TX_STRIP_FS 0xFF00 /* R: reserved. 6651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * C: if no Transmission Error, 6661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * field contains copy of FS byte after 6671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * stripping of frame. 6681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 6691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 6711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Structure of Transmit Parameter Lists (TPLs) (only one frame every TPL, 6721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * but possibly multiple TPLs for one frame) the length of the TPLs has to be 6731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * initialized in the OPL. (OPEN parameter list) 6741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 6751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TPL_NUM 3 /* Number of Transmit Parameter Lists. 6761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * !! MUST BE >= 3 !! 6771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 6781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#pragma pack(1) 6801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct s_TPL TPL; 6811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct s_TPL { /* Transmit Parameter List (align on even word boundaries) */ 6832929e7700fb64f58f9c501a293b98b6bf6c49403Al Viro __be32 NextTPLAddr; /* Pointer to next TPL in chain; if 6841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * pointer is odd: this is the last 6851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * TPL. Pointing to itself can cause 6861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * problems! 6871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 6881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds volatile u_int16_t Status; /* Initialized by the adapter: 6891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * CSTAT_REQUEST important: update least 6901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * significant bit first! Set by the 6911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * adapter: CSTAT_COMPLETE status. 6921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 6932929e7700fb64f58f9c501a293b98b6bf6c49403Al Viro __be16 FrameSize; /* Number of bytes to be transmitted 6941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * as a frame including AC/FC, 6951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Destination, Source, Routing field 6961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * not including CRC, FS, End Delimiter 6971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (valid only if START_FRAME bit in 6981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * CSTAT nonzero) must not be zero in 6991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * any list; maximum value: (BUFFER_SIZE 7001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * - 8) * TX_BUF_MAX sum of DataCount 7011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * values in FragmentList must equal 7021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Frame_Size value in START_FRAME TPL! 7031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * frame data fragment list. 7041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 7051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* TPL/RPL size in OPEN parameter list depending on maximal 7071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * numbers of fragments used in one parameter list. 7081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 7091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds Fragment FragList[TX_FRAG_NUM]; /* Maximum: nine frame fragments in one 7101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * TPL actual version of firmware: 9 7111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * fragments possible. 7121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 7131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#pragma pack() 7141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Special proprietary data and precalculations */ 7161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds TPL *NextTPLPtr; /* Pointer to next TPL in chain. */ 7181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned char *MData; 7191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct sk_buff *Skb; 7201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned char TPLIndex; 7211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds volatile unsigned char BusyFlag;/* Flag: TPL busy? */ 722504ff16cecf2a788181eddc9d6e47d94ce50a9f6Jochen Friedrich dma_addr_t DMABuff; /* DMA IO bus address from dma_map */ 7231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 7241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* ---------------------Receive Functions-------------------------------* 7261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * define RECEIVE_CSTAT_REQUEST (R) and RECEIVE_CSTAT_COMPLETE (C) values. 7271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (high-low) 7281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 7291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RX_VALID 0x0080 /* R: set; tell adapter with 7301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RECEIVE.VALID interrupt. 7311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * C: reset to zero. 7321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 7331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RX_FRAME_COMPLETE 0x0040 /* R: must be reset to zero, 7341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * C: set to one. 7351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 7361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RX_START_FRAME 0x0020 /* R: must be reset to zero. 7371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * C: set to one on the list. 7381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 7391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RX_END_FRAME 0x0010 /* R: must be reset to zero. 7401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * C: set to one on the list 7411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * that ends the frame. 7421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 7431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RX_FRAME_IRQ 0x0008 /* R: request interrupt generation 7441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * after receive. 7451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * C: unchanged. 7461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 7471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RX_INTERFRAME_WAIT 0x0004 /* R: after receiving a frame: 7481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * interrupt and wait for a 7491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RECEIVE.CONTINUE. 7501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * C: unchanged. 7511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 7521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RX_PASS_CRC 0x0002 /* R: if set, the adapter includes 7531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the CRC in data passed. (last four 7541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * bytes; valid only if FRAME_START is 7551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * set) 7561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * C: set, if CRC is included in 7571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * received data. 7581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 7591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RX_PASS_SRC_ADDR 0x0001 /* R: adapter uses explicit frame 7601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * source address and does not 7611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * overwrite with the adapter node 7621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * address. (valid only if FRAME_START 7631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * is set) 7641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * C: unchanged. 7651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 7661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RX_RECEIVE_FS 0xFC00 /* R: reserved; must be reset to zero. 7671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * C: on lists with START_FRAME, field 7681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * contains frame status field from 7691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * received frame; otherwise cleared. 7701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 7711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RX_ADDR_MATCH 0x0300 /* R: reserved; must be reset to zero. 7721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * C: address match code mask. 7731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 7741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RX_STATUS_MASK 0x00FF /* Mask for receive status bits. */ 7751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RX_INTERN_ADDR_MATCH 0x0100 /* C: internally address match. */ 7771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RX_EXTERN_ADDR_MATCH 0x0200 /* C: externally matched via 7781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * XMATCH/XFAIL interface. 7791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 7801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RX_INTEXT_ADDR_MATCH 0x0300 /* C: internally and externally 7811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * matched. 7821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 7831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RX_READY (RX_VALID | RX_FRAME_IRQ) /* Ready for receive. */ 7841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Constants for Command Status Interrupt. 7861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * COMMAND_REJECT status field bit functions (SSB.Parm[0]) 7871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 7881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ILLEGAL_COMMAND 0x0080 /* Set if an unknown command 7891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * is issued to the adapter 7901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 7911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ADDRESS_ERROR 0x0040 /* Set if any address field in 7921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the SCB is odd. (not word aligned) 7931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 7941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ADAPTER_OPEN 0x0020 /* Command issued illegal with 7951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * open adapter. 7961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 7971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ADAPTER_CLOSE 0x0010 /* Command issued illegal with 7981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * closed adapter. 7991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 8001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SAME_COMMAND 0x0008 /* Command issued with same command 8011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * already executing. 8021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 8031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* OPEN_COMPLETION values (SSB.Parm[0], MSB) */ 8051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define NODE_ADDR_ERROR 0x0040 /* Wrong address or BIA read 8061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * zero address. 8071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 8081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define LIST_SIZE_ERROR 0x0020 /* If List_Size value not in 0, 8091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 14, 20, 26. 8101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 8111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define BUF_SIZE_ERROR 0x0010 /* Not enough available memory for 8121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * two buffers. 8131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 8141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TX_BUF_COUNT_ERROR 0x0004 /* Remaining receive buffers less than 8151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * two. 8161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 8171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OPEN_ERROR 0x0002 /* Error during ring insertion; more 8181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * information in bits 8-15. 8191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 8201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Standard return codes */ 8221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define GOOD_COMPLETION 0x0080 /* =OPEN_SUCCESSFULL */ 8231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define INVALID_OPEN_OPTION 0x0001 /* OPEN options are not supported by 8241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the adapter. 8251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 8261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* OPEN phases; details of OPEN_ERROR (SSB.Parm[0], LSB) */ 8281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OPEN_PHASES_MASK 0xF000 /* Check only the bits 8-11. */ 8291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define LOBE_MEDIA_TEST 0x1000 8301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PHYSICAL_INSERTION 0x2000 8311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ADDRESS_VERIFICATION 0x3000 8321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PARTICIPATION_IN_RING_POLL 0x4000 8331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define REQUEST_INITIALISATION 0x5000 8341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define FULLDUPLEX_CHECK 0x6000 8351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* OPEN error codes; details of OPEN_ERROR (SSB.Parm[0], LSB) */ 8371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OPEN_ERROR_CODES_MASK 0x0F00 /* Check only the bits 12-15. */ 8381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OPEN_FUNCTION_FAILURE 0x0100 /* Unable to transmit to itself or 8391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * frames received before insertion. 8401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 8411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OPEN_SIGNAL_LOSS 0x0200 /* Signal loss condition detected at 8421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * receiver. 8431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 8441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OPEN_TIMEOUT 0x0500 /* Insertion timer expired before 8451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * logical insertion. 8461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 8471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OPEN_RING_FAILURE 0x0600 /* Unable to receive own ring purge 8481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * MAC frames. 8491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 8501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OPEN_RING_BEACONING 0x0700 /* Beacon MAC frame received after 8511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * ring insertion. 8521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 8531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OPEN_DUPLICATE_NODEADDR 0x0800 /* Other station in ring found 8541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * with the same address. 8551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 8561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OPEN_REQUEST_INIT 0x0900 /* RPS present but does not respond. */ 8571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OPEN_REMOVE_RECEIVED 0x0A00 /* Adapter received a remove adapter 8581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * MAC frame. 8591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 8601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OPEN_FULLDUPLEX_SET 0x0D00 /* Got this with full duplex on when 8611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * trying to connect to a normal ring. 8621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 8631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* SET_BRIDGE_PARMS return codes: */ 8651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define BRIDGE_INVALID_MAX_LEN 0x4000 /* MAX_ROUTING_FIELD_LENGTH odd, 8661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * less than 6 or > 30. 8671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 8681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define BRIDGE_INVALID_SRC_RING 0x2000 /* SOURCE_RING number zero, too large 8691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * or = TARGET_RING. 8701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 8711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define BRIDGE_INVALID_TRG_RING 0x1000 /* TARGET_RING number zero, too large 8721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * or = SOURCE_RING. 8731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 8741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define BRIDGE_INVALID_BRDGE_NO 0x0800 /* BRIDGE_NUMBER too large. */ 8751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define BRIDGE_INVALID_OPTIONS 0x0400 /* Invalid bridge options. */ 8761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define BRIDGE_DIAGS_FAILED 0x0200 /* Diagnostics of TMS380SRA failed. */ 8771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define BRIDGE_NO_SRA 0x0100 /* The TMS380SRA does not exist in HW 8781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * configuration. 8791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 8801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 8821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Bring Up Diagnostics error codes. 8831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 8841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define BUD_INITIAL_ERROR 0x0 8851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define BUD_CHECKSUM_ERROR 0x1 8861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define BUD_ADAPTER_RAM_ERROR 0x2 8871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define BUD_INSTRUCTION_ERROR 0x3 8881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define BUD_CONTEXT_ERROR 0x4 8891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define BUD_PROTOCOL_ERROR 0x5 8901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define BUD_INTERFACE_ERROR 0x6 8911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* BUD constants */ 8931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define BUD_MAX_RETRIES 3 8941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define BUD_MAX_LOOPCNT 6 8951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define BUD_TIMEOUT 3000 8961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Initialization constants */ 8981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define INIT_MAX_RETRIES 3 /* Maximum three retries. */ 8991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define INIT_MAX_LOOPCNT 22 /* Maximum loop counts. */ 9001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* RING STATUS field values (high/low) */ 9021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SIGNAL_LOSS 0x0080 /* Loss of signal on the ring 9031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * detected. 9041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 9051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HARD_ERROR 0x0040 /* Transmitting or receiving beacon 9061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * frames. 9071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 9081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SOFT_ERROR 0x0020 /* Report error MAC frame 9091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * transmitted. 9101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 9111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TRANSMIT_BEACON 0x0010 /* Transmitting beacon frames on the 9121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * ring. 9131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 9141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define LOBE_WIRE_FAULT 0x0008 /* Open or short circuit in the 9151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * cable to concentrator; adapter 9161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * closed. 9171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 9181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AUTO_REMOVAL_ERROR 0x0004 /* Lobe wrap test failed, deinserted; 9191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * adapter closed. 9201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 9211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define REMOVE_RECEIVED 0x0001 /* Received a remove ring station MAC 9221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * MAC frame request; adapter closed. 9231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 9241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define COUNTER_OVERFLOW 0x8000 /* Overflow of one of the adapters 9251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * error counters; READ.ERROR.LOG. 9261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 9271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SINGLE_STATION 0x4000 /* Adapter is the only station on the 9281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * ring. 9291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 9301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RING_RECOVERY 0x2000 /* Claim token MAC frames on the ring; 9311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * reset after ring purge frame. 9321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 9331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ADAPTER_CLOSED (LOBE_WIRE_FAULT | AUTO_REMOVAL_ERROR |\ 9351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds REMOVE_RECEIVED) 9361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Adapter_check_block.Status field bit assignments: */ 9381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DIO_PARITY 0x8000 /* Adapter detects bad parity 9391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * through direct I/O access. 9401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 9411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DMA_READ_ABORT 0x4000 /* Aborting DMA read operation 9421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * from system Parm[0]: 0=timeout, 9431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1=parity error, 2=bus error; 9441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Parm[1]: 32 bit pointer to host 9451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * system address at failure. 9461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 9471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DMA_WRITE_ABORT 0x2000 /* Aborting DMA write operation 9481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * to system. (parameters analogous to 9491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DMA_READ_ABORT) 9501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 9511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ILLEGAL_OP_CODE 0x1000 /* Illegal operation code in the 9521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the adapters firmware Parm[0]-2: 9531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * communications processor registers 9541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * R13-R15. 9551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 9561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PARITY_ERRORS 0x0800 /* Adapter detects internal bus 9571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * parity error. 9581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 9591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RAM_DATA_ERROR 0x0080 /* Valid only during RAM testing; 9601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RAM data error Parm[0-1]: 32 bit 9611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * pointer to RAM location. 9621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 9631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RAM_PARITY_ERROR 0x0040 /* Valid only during RAM testing; 9641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RAM parity error Parm[0-1]: 32 bit 9651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * pointer to RAM location. 9661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 9671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RING_UNDERRUN 0x0020 /* Internal DMA underrun when 9681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * transmitting onto ring. 9691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 9701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define INVALID_IRQ 0x0008 /* Unrecognized interrupt generated 9711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * internal to adapter Parm[0-2]: 9721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * adapter register R13-R15. 9731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 9741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define INVALID_ERROR_IRQ 0x0004 /* Unrecognized error interrupt 9751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * generated Parm[0-2]: adapter register 9761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * R13-R15. 9771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 9781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define INVALID_XOP 0x0002 /* Unrecognized XOP request in 9791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * communication processor Parm[0-2]: 9801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * adapter register R13-R15. 9811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 9821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CHECKADDR 0x05E0 /* Adapter check status information 9831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * address offset. 9841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 9851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ROM_PAGE_0 0x0000 /* Adapter ROM page 0. */ 9861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 9881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RECEIVE.STATUS interrupt result SSB values: (high-low) 9891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (RECEIVE_COMPLETE field bit definitions in SSB.Parm[0]) 9901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 9911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RX_COMPLETE 0x0080 /* SSB.Parm[0]; SSB.Parm[1]: 32 9921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * bit pointer to last RPL. 9931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 9941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RX_SUSPENDED 0x0040 /* SSB.Parm[0]; SSB.Parm[1]: 32 9951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * bit pointer to RPL with odd 9961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * forward pointer. 9971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 9981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Valid receive CSTAT: */ 10001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RX_FRAME_CONTROL_BITS (RX_VALID | RX_START_FRAME | RX_END_FRAME | \ 10011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds RX_FRAME_COMPLETE) 10021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define VALID_SINGLE_BUFFER_FRAME (RX_START_FRAME | RX_END_FRAME | \ 10031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds RX_FRAME_COMPLETE) 10041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef enum SKB_STAT SKB_STAT; 10061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsenum SKB_STAT { 10071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SKB_UNAVAILABLE, 10081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SKB_DMA_DIRECT, 10091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SKB_DATA_COPY 10101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 10111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Receive Parameter List (RPL) The length of the RPLs has to be initialized 10131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * in the OPL. (OPEN parameter list) 10141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 10151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RPL_NUM 3 10161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RX_FRAG_NUM 1 /* Maximal number of used fragments in one RPL. 10181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (up to firmware v2.24: 3, now: up to 9) 10191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 10201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#pragma pack(1) 10221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct s_RPL RPL; 10231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct s_RPL { /* Receive Parameter List */ 10242929e7700fb64f58f9c501a293b98b6bf6c49403Al Viro __be32 NextRPLAddr; /* Pointer to next RPL in chain 10251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (normalized = physical 32 bit 10261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * address) if pointer is odd: this 10271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * is last RPL. Pointing to itself can 10281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * cause problems! 10291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 10301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds volatile u_int16_t Status; /* Set by creation of Receive Parameter 10311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * List RECEIVE_CSTAT_COMPLETE set by 10321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * adapter in lists that start or end 10331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * a frame. 10341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 10352929e7700fb64f58f9c501a293b98b6bf6c49403Al Viro volatile __be16 FrameSize; /* Number of bytes received as a 10361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * frame including AC/FC, Destination, 10371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Source, Routing field not including 10381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * CRC, FS (Frame Status), End Delimiter 10391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (valid only if START_FRAME bit in 10401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * CSTAT nonzero) must not be zero in 10411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * any list; maximum value: (BUFFER_SIZE 10421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * - 8) * TX_BUF_MAX sum of DataCount 10431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * values in FragmentList must equal 10441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Frame_Size value in START_FRAME TPL! 10451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * frame data fragment list 10461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 10471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* TPL/RPL size in OPEN parameter list depending on maximal numbers 10491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * of fragments used in one parameter list. 10501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 10511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds Fragment FragList[RX_FRAG_NUM]; /* Maximum: nine frame fragments in 10521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * one TPL. Actual version of firmware: 10531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 9 fragments possible. 10541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 10551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#pragma pack() 10561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Special proprietary data and precalculations. */ 10581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds RPL *NextRPLPtr; /* Logical pointer to next RPL in chain. */ 10591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned char *MData; 10601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct sk_buff *Skb; 10611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SKB_STAT SkbStat; 10621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int RPLIndex; 1063504ff16cecf2a788181eddc9d6e47d94ce50a9f6Jochen Friedrich dma_addr_t DMABuff; /* DMA IO bus address from dma_map */ 10641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 10651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Information that need to be kept for each board. */ 10671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct net_local { 10681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#pragma pack(1) 10691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds IPB ipb; /* Initialization Parameter Block. */ 10701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SCB scb; /* System Command Block: system to adapter 10711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * communication. 10721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 10731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SSB ssb; /* System Status Block: adapter to system 10741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * communication. 10751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 10761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds OPB ocpl; /* Open Options Parameter Block. */ 10771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ERRORTAB errorlogtable; /* Adapter statistic error counters. 10791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (read from adapter memory) 10801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 10811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned char ProductID[PROD_ID_SIZE + 1]; /* Product ID */ 10821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#pragma pack() 10831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds TPL Tpl[TPL_NUM]; 10851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds TPL *TplFree; 10861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds TPL *TplBusy; 10871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned char LocalTxBuffers[TPL_NUM][DEFAULT_PACKET_SIZE]; 10881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds RPL Rpl[RPL_NUM]; 10901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds RPL *RplHead; 10911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds RPL *RplTail; 10921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned char LocalRxBuffers[RPL_NUM][DEFAULT_PACKET_SIZE]; 10931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1094504ff16cecf2a788181eddc9d6e47d94ce50a9f6Jochen Friedrich struct device *pdev; 10951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int DataRate; 10961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned char ScbInUse; 10971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned short CMDqueue; 10981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long AdapterOpenFlag:1; 11001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long AdapterVirtOpenFlag:1; 11011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long OpenCommandIssued:1; 11021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long TransmitCommandActive:1; 11031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long TransmitHaltScheduled:1; 11041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long HaltInProgress:1; 11051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long LobeWireFaultLogged:1; 11061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long ReOpenInProgress:1; 11071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long Sleeping:1; 11081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 11091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long LastOpenStatus; 11101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned short CurrentRingStatus; 11111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long MaxPacketSize; 11121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 11131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long StartTime; 11141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long LastSendTime; 11151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 11161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct tr_statistics MacStat; /* MAC statistics structure */ 11171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 11181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long dmalimit; /* the max DMA address (ie, ISA) */ 11191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dma_addr_t dmabuffer; /* the DMA bus address corresponding to 11201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds priv. Might be different from virt_to_bus() 11211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for architectures with IO MMU (Alpha) */ 11221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 11231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct timer_list timer; 11241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 11251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds wait_queue_head_t wait_for_tok_int; 11261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 11271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds INTPTRS intptrs; /* Internal adapter pointer. Must be read 11281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * before OPEN command. 11291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 11301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned short (*setnselout)(struct net_device *); 11311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned short (*sifreadb)(struct net_device *, unsigned short); 11321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds void (*sifwriteb)(struct net_device *, unsigned short, unsigned short); 11331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned short (*sifreadw)(struct net_device *, unsigned short); 11341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds void (*sifwritew)(struct net_device *, unsigned short, unsigned short); 11351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 11361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds spinlock_t lock; /* SMP protection */ 11371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds void *tmspriv; 11381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} NET_LOCAL; 11391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 11401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif /* __KERNEL__ */ 11411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif /* __LINUX_TMS380TR_H */ 1142