|
|
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.