00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048 FILE_LICENCE ( BSD2 );
00049
00050 #ifndef __3C90X_H_
00051 #define __3C90X_H_
00052
00053 static struct net_device_operations a3c90x_operations;
00054
00055 #define XCVR_MAGIC (0x5A00)
00056
00057
00058 enum Registers {
00059 regPowerMgmtCtrl_w = 0x7c,
00060 regUpMaxBurst_w = 0x7a,
00061 regDnMaxBurst_w = 0x78,
00062 regDebugControl_w = 0x74,
00063 regDebugData_l = 0x70,
00064 regRealTimeCnt_l = 0x40,
00065 regUpBurstThresh_b = 0x3e,
00066 regUpPoll_b = 0x3d,
00067 regUpPriorityThresh_b = 0x3c,
00068 regUpListPtr_l = 0x38,
00069 regCountdown_w = 0x36,
00070 regFreeTimer_w = 0x34,
00071 regUpPktStatus_l = 0x30,
00072 regTxFreeThresh_b = 0x2f,
00073 regDnPoll_b = 0x2d,
00074 regDnPriorityThresh_b = 0x2c,
00075 regDnBurstThresh_b = 0x2a,
00076 regDnListPtr_l = 0x24,
00077 regDmaCtrl_l = 0x20,
00078
00079 regIntStatusAuto_w = 0x1e,
00080 regTxStatus_b = 0x1b,
00081 regTimer_b = 0x1a,
00082 regTxPktId_b = 0x18,
00083 regCommandIntStatus_w = 0x0e,
00084 };
00085
00086
00087 enum Registers7 {
00088 regPowerMgmtEvent_7_w = 0x0c,
00089 regVlanEtherType_7_w = 0x04,
00090 regVlanMask_7_w = 0x00,
00091 };
00092
00093 enum Registers6 {
00094 regBytesXmittedOk_6_w = 0x0c,
00095 regBytesRcvdOk_6_w = 0x0a,
00096 regUpperFramesOk_6_b = 0x09,
00097 regFramesDeferred_6_b = 0x08,
00098 regFramesRecdOk_6_b = 0x07,
00099 regFramesXmittedOk_6_b = 0x06,
00100 regRxOverruns_6_b = 0x05,
00101 regLateCollisions_6_b = 0x04,
00102 regSingleCollisions_6_b = 0x03,
00103 regMultipleCollisions_6_b = 0x02,
00104 regSqeErrors_6_b = 0x01,
00105 regCarrierLost_6_b = 0x00,
00106 };
00107
00108 enum Registers5 {
00109 regIndicationEnable_5_w = 0x0c,
00110 regInterruptEnable_5_w = 0x0a,
00111 regTxReclaimThresh_5_b = 0x09,
00112 regRxFilter_5_b = 0x08,
00113 regRxEarlyThresh_5_w = 0x06,
00114 regTxStartThresh_5_w = 0x00,
00115 };
00116
00117 enum Registers4 {
00118 regUpperBytesOk_4_b = 0x0d,
00119 regBadSSD_4_b = 0x0c,
00120 regMediaStatus_4_w = 0x0a,
00121 regPhysicalMgmt_4_w = 0x08,
00122 regNetworkDiagnostic_4_w = 0x06,
00123 regFifoDiagnostic_4_w = 0x04,
00124 regVcoDiagnostic_4_w = 0x02,
00125 };
00126
00127 enum Registers3 {
00128 regTxFree_3_w = 0x0c,
00129 regRxFree_3_w = 0x0a,
00130 regResetMediaOptions_3_w = 0x08,
00131
00132 regMacControl_3_w = 0x06,
00133 regMaxPktSize_3_w = 0x04,
00134 regInternalConfig_3_l = 0x00,
00135
00136 };
00137
00138 enum Registers2 {
00139 regResetOptions_2_w = 0x0c,
00140 regStationMask_2_3w = 0x06,
00141 regStationAddress_2_3w = 0x00,
00142 };
00143
00144 enum Registers1 {
00145 regRxStatus_1_w = 0x0a,
00146 };
00147
00148 enum Registers0 {
00149 regEepromData_0_w = 0x0c,
00150 regEepromCommand_0_w = 0x0a,
00151 regBiosRomData_0_b = 0x08,
00152 regBiosRomAddr_0_l = 0x04,
00153 };
00154
00155
00156
00157 enum Windows {
00158 winNone = 0xff,
00159 winPowerVlan7 = 0x07,
00160 winStatistics6 = 0x06,
00161 winTxRxControl5 = 0x05,
00162 winDiagnostics4 = 0x04,
00163 winTxRxOptions3 = 0x03,
00164 winAddressing2 = 0x02,
00165 winUnused1 = 0x01,
00166 winEepromBios0 = 0x00,
00167 };
00168
00169
00170
00171 enum Commands {
00172 cmdGlobalReset = 0x00,
00173 cmdSelectRegisterWindow = 0x01,
00174 cmdEnableDcConverter = 0x02,
00175 cmdRxDisable = 0x03,
00176 cmdRxEnable = 0x04,
00177 cmdRxReset = 0x05,
00178 cmdStallCtl = 0x06,
00179 cmdTxEnable = 0x09,
00180 cmdTxDisable = 0x0A,
00181 cmdTxReset = 0x0B,
00182 cmdRequestInterrupt = 0x0C,
00183 cmdAcknowledgeInterrupt = 0x0D,
00184 cmdSetInterruptEnable = 0x0E,
00185 cmdSetIndicationEnable = 0x0F,
00186 cmdSetRxFilter = 0x10,
00187 cmdSetRxEarlyThresh = 0x11,
00188 cmdSetTxStartThresh = 0x13,
00189 cmdStatisticsEnable = 0x15,
00190 cmdStatisticsDisable = 0x16,
00191 cmdDisableDcConverter = 0x17,
00192 cmdSetTxReclaimThresh = 0x18,
00193 cmdSetHashFilterBit = 0x19,
00194 };
00195
00196 enum FrameStartHeader {
00197 fshTxIndicate = 0x8000,
00198 fshDnComplete = 0x10000,
00199 };
00200
00201 enum UpDownDesc {
00202 upLastFrag = (1 << 31),
00203 downLastFrag = (1 << 31),
00204 };
00205
00206 enum UpPktStatus {
00207 upComplete = (1 << 15),
00208 upError = (1 << 14),
00209 };
00210
00211 enum Stalls {
00212 upStall = 0x00,
00213 upUnStall = 0x01,
00214
00215 dnStall = 0x02,
00216 dnUnStall = 0x03,
00217 };
00218
00219 enum Resources {
00220 resRxRing = 0x00,
00221 resTxRing = 0x02,
00222 resRxIOBuf = 0x04
00223 };
00224
00225 enum eeprom {
00226 eepromBusy = (1 << 15),
00227 eepromRead = ((0x02) << 6),
00228 eepromRead_556 = 0x230,
00229 eepromHwAddrOffset = 0x0a,
00230 };
00231
00232
00233 enum linktype {
00234 link10BaseT = 0x00,
00235 linkAUI = 0x01,
00236 link10Base2 = 0x03,
00237 link100BaseFX = 0x05,
00238 linkMII = 0x06,
00239 linkAutoneg = 0x08,
00240 linkExternalMII = 0x09,
00241 };
00242
00243
00244 #define INT_INTERRUPTLATCH (1<<0)
00245 #define INT_HOSTERROR (1<<1)
00246 #define INT_TXCOMPLETE (1<<2)
00247 #define INT_RXCOMPLETE (1<<4)
00248 #define INT_RXEARLY (1<<5)
00249 #define INT_INTREQUESTED (1<<6)
00250 #define INT_UPDATESTATS (1<<7)
00251 #define INT_LINKEVENT (1<<8)
00252 #define INT_DNCOMPLETE (1<<9)
00253 #define INT_UPCOMPLETE (1<<10)
00254 #define INT_CMDINPROGRESS (1<<12)
00255 #define INT_WINDOWNUMBER (7<<13)
00256
00257
00258 #define TX_RING_SIZE 8
00259 #define RX_RING_SIZE 8
00260 #define TX_RING_ALIGN 16
00261 #define RX_RING_ALIGN 16
00262 #define RX_BUF_SIZE 1536
00263
00264
00265
00266 #define EEPROM_TIMEOUT 1 * 1000 * 1000
00267
00268
00269 struct TXD {
00270 volatile unsigned int DnNextPtr;
00271 volatile unsigned int FrameStartHeader;
00272 volatile unsigned int DataAddr;
00273 volatile unsigned int DataLength;
00274 } __attribute__ ((aligned(8)));
00275
00276
00277 struct RXD {
00278 volatile unsigned int UpNextPtr;
00279 volatile unsigned int UpPktStatus;
00280 volatile unsigned int DataAddr;
00281 volatile unsigned int DataLength;
00282 } __attribute__ ((aligned(8)));
00283
00284
00285 struct INF_3C90X {
00286 unsigned int is3c556;
00287 unsigned char isBrev;
00288 unsigned char CurrentWindow;
00289 unsigned int IOAddr;
00290 unsigned short eeprom[0x21];
00291 unsigned int tx_cur;
00292 unsigned int tx_cnt;
00293 unsigned int tx_tail;
00294 unsigned int rx_cur;
00295 struct TXD *tx_ring;
00296 struct RXD *rx_ring;
00297 struct io_buffer *tx_iobuf[TX_RING_SIZE];
00298 struct io_buffer *rx_iobuf[RX_RING_SIZE];
00299 struct nvs_device nvs;
00300 };
00301
00302 #endif