|
|
1.1 ! root 1: FILE_LICENCE ( GPL_ANY ); ! 2: ! 3: #define NATSEMI_HW_TIMEOUT 400 ! 4: ! 5: #define TX_RING_SIZE 4 ! 6: #define NUM_RX_DESC 4 ! 7: #define RX_BUF_SIZE 1536 ! 8: #define OWN 0x80000000 ! 9: #define DSIZE 0x00000FFF ! 10: #define CRC_SIZE 4 ! 11: ! 12: struct natsemi_tx { ! 13: uint32_t link; ! 14: uint32_t cmdsts; ! 15: uint32_t bufptr; ! 16: }; ! 17: ! 18: struct natsemi_rx { ! 19: uint32_t link; ! 20: uint32_t cmdsts; ! 21: uint32_t bufptr; ! 22: }; ! 23: ! 24: struct natsemi_private { ! 25: unsigned short ioaddr; ! 26: unsigned short tx_cur; ! 27: unsigned short tx_dirty; ! 28: unsigned short rx_cur; ! 29: struct natsemi_tx tx[TX_RING_SIZE]; ! 30: struct natsemi_rx rx[NUM_RX_DESC]; ! 31: ! 32: /* need to add iobuf as we cannot free iobuf->data in close without this ! 33: * alternatively substracting sizeof(head) and sizeof(list_head) can also ! 34: * give the same. ! 35: */ ! 36: struct io_buffer *iobuf[NUM_RX_DESC]; ! 37: ! 38: /* netdev_tx_complete needs pointer to the iobuf of the data so as to free ! 39: * it from the memory. ! 40: */ ! 41: struct io_buffer *tx_iobuf[TX_RING_SIZE]; ! 42: struct spi_bit_basher spibit; ! 43: struct spi_device eeprom; ! 44: struct nvo_block nvo; ! 45: }; ! 46: ! 47: /* ! 48: * Support for fibre connections on Am79C874: ! 49: * This phy needs a special setup when connected to a fibre cable. ! 50: * http://www.amd.com/files/connectivitysolutions/networking/archivednetworking/22235.pdf ! 51: */ ! 52: #define PHYID_AM79C874 0x0022561b ! 53: ! 54: enum { ! 55: MII_MCTRL = 0x15, /* mode control register */ ! 56: MII_FX_SEL = 0x0001, /* 100BASE-FX (fiber) */ ! 57: MII_EN_SCRM = 0x0004, /* enable scrambler (tp) */ ! 58: }; ! 59: ! 60: ! 61: ! 62: /* values we might find in the silicon revision register */ ! 63: #define SRR_DP83815_C 0x0302 ! 64: #define SRR_DP83815_D 0x0403 ! 65: #define SRR_DP83816_A4 0x0504 ! 66: #define SRR_DP83816_A5 0x0505 ! 67: ! 68: /* NATSEMI: Offsets to the device registers. ! 69: * Unlike software-only systems, device drivers interact with complex hardware. ! 70: * It's not useful to define symbolic names for every register bit in the ! 71: * device. ! 72: */ ! 73: enum register_offsets { ! 74: ChipCmd = 0x00, ! 75: ChipConfig = 0x04, ! 76: EECtrl = 0x08, ! 77: PCIBusCfg = 0x0C, ! 78: IntrStatus = 0x10, ! 79: IntrMask = 0x14, ! 80: IntrEnable = 0x18, ! 81: TxRingPtr = 0x20, ! 82: TxConfig = 0x24, ! 83: RxRingPtr = 0x30, ! 84: RxConfig = 0x34, ! 85: ClkRun = 0x3C, ! 86: WOLCmd = 0x40, ! 87: PauseCmd = 0x44, ! 88: RxFilterAddr = 0x48, ! 89: RxFilterData = 0x4C, ! 90: BootRomAddr = 0x50, ! 91: BootRomData = 0x54, ! 92: SiliconRev = 0x58, ! 93: StatsCtrl = 0x5C, ! 94: StatsData = 0x60, ! 95: RxPktErrs = 0x60, ! 96: RxMissed = 0x68, ! 97: RxCRCErrs = 0x64, ! 98: PCIPM = 0x44, ! 99: PhyStatus = 0xC0, ! 100: MIntrCtrl = 0xC4, ! 101: MIntrStatus = 0xC8, ! 102: ! 103: /* These are from the spec, around page 78... on a separate table. ! 104: */ ! 105: PGSEL = 0xCC, ! 106: PMDCSR = 0xE4, ! 107: TSTDAT = 0xFC, ! 108: DSPCFG = 0xF4, ! 109: SDCFG = 0x8C, ! 110: BasicControl = 0x80, ! 111: BasicStatus = 0x84 ! 112: ! 113: }; ! 114: ! 115: /* the values for the 'magic' registers above (PGSEL=1) */ ! 116: #define PMDCSR_VAL 0x189c /* enable preferred adaptation circuitry */ ! 117: #define TSTDAT_VAL 0x0 ! 118: #define DSPCFG_VAL 0x5040 ! 119: #define SDCFG_VAL 0x008c /* set voltage thresholds for Signal Detect */ ! 120: #define DSPCFG_LOCK 0x20 /* coefficient lock bit in DSPCFG */ ! 121: #define DSPCFG_COEF 0x1000 /* see coefficient (in TSTDAT) bit in DSPCFG */ ! 122: #define TSTDAT_FIXED 0xe8 /* magic number for bad coefficients */ ! 123: ! 124: /* Bit in ChipCmd. ! 125: */ ! 126: enum ChipCmdBits { ! 127: ChipReset = 0x100, ! 128: RxReset = 0x20, ! 129: TxReset = 0x10, ! 130: RxOff = 0x08, ! 131: RxOn = 0x04, ! 132: TxOff = 0x02, ! 133: TxOn = 0x01 ! 134: }; ! 135: ! 136: enum ChipConfig_bits { ! 137: CfgPhyDis = 0x200, ! 138: CfgPhyRst = 0x400, ! 139: CfgExtPhy = 0x1000, ! 140: CfgAnegEnable = 0x2000, ! 141: CfgAneg100 = 0x4000, ! 142: CfgAnegFull = 0x8000, ! 143: CfgAnegDone = 0x8000000, ! 144: CfgFullDuplex = 0x20000000, ! 145: CfgSpeed100 = 0x40000000, ! 146: CfgLink = 0x80000000, ! 147: }; ! 148: ! 149: ! 150: /* Bits in the RxMode register. ! 151: */ ! 152: enum rx_mode_bits { ! 153: AcceptErr = 0x20, ! 154: AcceptRunt = 0x10, ! 155: AcceptBroadcast = 0xC0000000, ! 156: AcceptMulticast = 0x00200000, ! 157: AcceptAllMulticast = 0x20000000, ! 158: AcceptAllPhys = 0x10000000, ! 159: AcceptMyPhys = 0x08000000, ! 160: RxFilterEnable = 0x80000000 ! 161: }; ! 162: ! 163: /* Bits in network_desc.status ! 164: */ ! 165: enum desc_status_bits { ! 166: DescOwn = 0x80000000, ! 167: DescMore = 0x40000000, ! 168: DescIntr = 0x20000000, ! 169: DescNoCRC = 0x10000000, ! 170: DescPktOK = 0x08000000, ! 171: RxTooLong = 0x00400000 ! 172: }; ! 173: ! 174: /*Bits in Interrupt Mask register ! 175: */ ! 176: enum Intr_mask_register_bits { ! 177: RxOk = 0x001, ! 178: RxErr = 0x004, ! 179: TxOk = 0x040, ! 180: TxErr = 0x100 ! 181: }; ! 182: ! 183: enum MIntrCtrl_bits { ! 184: MICRIntEn = 0x2, ! 185: }; ! 186: ! 187: /* CFG bits [13:16] [18:23] */ ! 188: #define CFG_RESET_SAVE 0xfde000 ! 189: /* WCSR bits [0:4] [9:10] */ ! 190: #define WCSR_RESET_SAVE 0x61f ! 191: /* RFCR bits [20] [22] [27:31] */ ! 192: #define RFCR_RESET_SAVE 0xf8500000; ! 193: ! 194: /* Delay between EEPROM clock transitions. ! 195: No extra delay is needed with 33Mhz PCI, but future 66Mhz access may need ! 196: a delay. */ ! 197: #define eeprom_delay(ee_addr) inl(ee_addr) ! 198: ! 199: enum EEPROM_Ctrl_Bits { ! 200: EE_ShiftClk = 0x04, ! 201: EE_DataIn = 0x01, ! 202: EE_ChipSelect = 0x08, ! 203: EE_DataOut = 0x02 ! 204: }; ! 205: ! 206: #define EE_Write0 (EE_ChipSelect) ! 207: #define EE_Write1 (EE_ChipSelect | EE_DataIn) ! 208: ! 209: /* The EEPROM commands include the alway-set leading bit. */ ! 210: enum EEPROM_Cmds { ! 211: EE_WriteCmd=(5 << 6), EE_ReadCmd=(6 << 6), EE_EraseCmd=(7 << 6), ! 212: }; ! 213: ! 214: /* EEPROM access , values are devices specific ! 215: */ ! 216: #define EE_CS 0x08 /* EEPROM chip select */ ! 217: #define EE_SK 0x04 /* EEPROM shift clock */ ! 218: #define EE_DI 0x01 /* Data in */ ! 219: #define EE_DO 0x02 /* Data out */ ! 220: ! 221: /* Offsets within EEPROM (these are word offsets) ! 222: */ ! 223: #define EE_MAC 7 ! 224: #define EE_REG EECtrl ! 225: ! 226: static const uint8_t natsemi_ee_bits[] = { ! 227: [SPI_BIT_SCLK] = EE_SK, ! 228: [SPI_BIT_MOSI] = EE_DI, ! 229: [SPI_BIT_MISO] = EE_DO, ! 230: [SPI_BIT_SS(0)] = EE_CS, ! 231: }; ! 232:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.