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 233