source: bootcd/isolinux/syslinux-6.03/gpxe/src/drivers/net/natsemi.h @ 26ffad7

Last change on this file since 26ffad7 was e16e8f2, checked in by Edwin Eefting <edwin@datux.nl>, 3 years ago

bootstuff

  • Property mode set to 100644
File size: 5.6 KB
Line 
1FILE_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
12struct natsemi_tx {
13        uint32_t link;
14        uint32_t cmdsts;
15        uint32_t bufptr;
16};
17
18struct natsemi_rx {
19        uint32_t link;
20        uint32_t cmdsts;
21        uint32_t bufptr;
22};
23
24struct 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
54enum {
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 */
73enum 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 */
126enum ChipCmdBits {
127    ChipReset = 0x100,
128    RxReset   = 0x20,
129    TxReset   = 0x10,
130    RxOff     = 0x08,
131    RxOn      = 0x04,
132    TxOff     = 0x02,
133    TxOn      = 0x01
134};
135
136enum 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 */
152enum 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 */
165enum 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 */
176enum Intr_mask_register_bits {
177    RxOk       = 0x001,
178    RxErr      = 0x004,
179    TxOk       = 0x040,
180    TxErr      = 0x100
181};     
182
183enum 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
199enum 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. */
210enum 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
226static 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
Note: See TracBrowser for help on using the repository browser.