summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/powerpc/virtex/network/xiltemac.h
blob: 177d67b02a8c10e97844cc7f1f2757c3a9574cb8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
/*
 * Driver for plb inteface of the xilinx temac 3.00a
 *
 * Author: Keith Robertson <kjrobert@alumni.uwaterloo.ca>
 * Copyright (c) 2007 Linn Products Ltd, Scotland.
 *
 * The license and distribution terms for this file may be
 * found in the file LICENSE in this distribution or at
 * http://www.rtems.com/license/LICENSE.
 *
 */

#ifndef _XILINX_TEMAC_
#define _XILINX_TEMAC_
#include <rtems/irq.h>


#define XILTEMAC_DRIVER_PREFIX   "xiltemac"

#define DRIVER_PREFIX XILTEMAC_DRIVER_PREFIX


/** IPIF interrupt and reset registers
 */
#define XTE_DISR_OFFSET  0x00000000  /**< Device interrupt status */
#define XTE_DIPR_OFFSET  0x00000004  /**< Device interrupt pending */
#define XTE_DIER_OFFSET  0x00000008  /**< Device interrupt enable */
#define XTE_DIIR_OFFSET  0x00000018  /**< Device interrupt ID */
#define XTE_DGIE_OFFSET  0x0000001C  /**< Device global interrupt enable */
#define XTE_IPISR_OFFSET 0x00000020  /**< IP interrupt status */
#define XTE_IPIER_OFFSET 0x00000028  /**< IP interrupt enable */
#define XTE_DSR_OFFSET   0x00000040  /**< Device software reset (write) */

/** IPIF transmit fifo
 */
#define XTE_PFIFO_TX_BASE_OFFSET    0x00002000  /**< Packet FIFO Tx channel */
#define XTE_PFIFO_TX_VACANCY_OFFSET 0x00002004  /**< Packet Fifo Tx Vacancy */
#define XTE_PFIFO_TX_DATA_OFFSET    0x00002100  /**< IPIF Tx packet fifo port */

/** IPIF receive fifo
 */
#define XTE_PFIFO_RX_BASE_OFFSET    0x00002010  /**< Packet FIFO Rx channel */
#define XTE_PFIFO_RX_VACANCY_OFFSET 0x00002014  /**< Packet Fifo Rx Vacancy */
#define XTE_PFIFO_RX_DATA_OFFSET    0x00002200  /**< IPIF Rx packet fifo port */

/** IPIF fifo masks
 */
#define XTE_PFIFO_COUNT_MASK     0x00FFFFFF

/** IPIF transmit and recieve DMA offsets
 */
#define XTE_DMA_SEND_OFFSET      0x00002300  /**< DMA Tx channel */
#define XTE_DMA_RECV_OFFSET      0x00002340  /**< DMA Rx channel */

/** IPIF IPIC_TO_TEMAC Core Registers
 */
#define XTE_CR_OFFSET           0x00001000  /**< Control */
#define XTE_TPLR_OFFSET         0x00001004  /**< Tx packet length (FIFO) */
#define XTE_TSR_OFFSET          0x00001008  /**< Tx status (FIFO) */
#define XTE_RPLR_OFFSET         0x0000100C  /**< Rx packet length (FIFO) */
#define XTE_RSR_OFFSET          0x00001010  /**< Receive status */
#define XTE_IFGP_OFFSET         0x00001014  /**< Interframe gap */
#define XTE_TPPR_OFFSET         0x00001018  /**< Tx pause packet */

/** TEMAC Core Registers
 * These are registers defined within the device's hard core located in the
 * processor block. They are accessed with the host interface. These registers
 * are addressed offset by XTE_HOST_IPIF_OFFSET or by the DCR base address
 * if so configured.
 */
#define XTE_HOST_IPIF_OFFSET    0x00003000  /**< Offset of host registers when
                                                 memory mapped into IPIF */
#define XTE_ERXC0_OFFSET        (XTE_HOST_IPIF_OFFSET + 0x00000200)  /**< Rx configuration word 0 */
#define XTE_ERXC1_OFFSET        (XTE_HOST_IPIF_OFFSET + 0x00000240)  /**< Rx configuration word 1 */
#define XTE_ETXC_OFFSET         (XTE_HOST_IPIF_OFFSET + 0x00000280)  /**< Tx configuration */
#define XTE_EFCC_OFFSET         (XTE_HOST_IPIF_OFFSET + 0x000002C0)  /**< Flow control configuration */
#define XTE_ECFG_OFFSET         (XTE_HOST_IPIF_OFFSET + 0x00000300)  /**< EMAC configuration */
#define XTE_EGMIC_OFFSET        (XTE_HOST_IPIF_OFFSET + 0x00000320)  /**< RGMII/SGMII configuration */
#define XTE_EMC_OFFSET          (XTE_HOST_IPIF_OFFSET + 0x00000340)  /**< Management configuration */
#define XTE_EUAW0_OFFSET        (XTE_HOST_IPIF_OFFSET + 0x00000380)  /**< Unicast address word 0 */
#define XTE_EUAW1_OFFSET        (XTE_HOST_IPIF_OFFSET + 0x00000384)  /**< Unicast address word 1 */
#define XTE_EMAW0_OFFSET        (XTE_HOST_IPIF_OFFSET + 0x00000388)  /**< Multicast address word 0 */
#define XTE_EMAW1_OFFSET        (XTE_HOST_IPIF_OFFSET + 0x0000038C)  /**< Multicast address word 1 */
#define XTE_EAFM_OFFSET         (XTE_HOST_IPIF_OFFSET + 0x00000390)  /**< Promisciuous mode */
#define XTE_EIRS_OFFSET         (XTE_HOST_IPIF_OFFSET + 0x000003A0)  /**< IRstatus */
#define XTE_EIREN_OFFSET        (XTE_HOST_IPIF_OFFSET + 0x000003A4)  /**< IRenable */
#define XTE_EMIID_OFFSET        (XTE_HOST_IPIF_OFFSET + 0x000003B0)  /**< MIIMwrData */
#define XTE_EMIIC_OFFSET        (XTE_HOST_IPIF_OFFSET + 0x000003B4)  /**< MiiMcnt */

/* Register masks. The following constants define bit locations of various
 * control bits in the registers. Constants are not defined for those registers
 * that have a single bit field representing all 32 bits. For further
 * information on the meaning of the various bit masks, refer to the HW spec.
 */

/** Interrupt status bits for top level interrupts
 *  These bits are associated with the XTE_DISR_OFFSET, XTE_DIPR_OFFSET,
 *  and XTE_DIER_OFFSET registers.
 */
#define XTE_DXR_SEND_FIFO_MASK          0x00000040 /**< Send FIFO channel */
#define XTE_DXR_RECV_FIFO_MASK          0x00000020 /**< Receive FIFO channel */
#define XTE_DXR_RECV_DMA_MASK           0x00000010 /**< Receive DMA channel */
#define XTE_DXR_SEND_DMA_MASK           0x00000008 /**< Send DMA channel */
#define XTE_DXR_CORE_MASK               0x00000004 /**< Core */
#define XTE_DXR_DPTO_MASK               0x00000002 /**< Data phase timeout */
#define XTE_DXR_TERR_MASK               0x00000001 /**< Transaction error */

/** Interrupt status bits for MAC interrupts
 *  These bits are associated with XTE_IPISR_OFFSET and XTE_IPIER_OFFSET
 *  registers.
 */
#define XTE_IPXR_XMIT_DONE_MASK         0x00000001 /**< Tx complete */
#define XTE_IPXR_RECV_DONE_MASK         0x00000002 /**< Rx complete */
#define XTE_IPXR_AUTO_NEG_MASK          0x00000004 /**< Auto negotiation complete */
#define XTE_IPXR_RECV_REJECT_MASK       0x00000008 /**< Rx packet rejected */
#define XTE_IPXR_XMIT_SFIFO_EMPTY_MASK  0x00000010 /**< Tx status fifo empty */
#define XTE_IPXR_RECV_LFIFO_EMPTY_MASK  0x00000020 /**< Rx length fifo empty */
#define XTE_IPXR_XMIT_LFIFO_FULL_MASK   0x00000040 /**< Tx length fifo full */
#define XTE_IPXR_RECV_LFIFO_OVER_MASK   0x00000080 /**< Rx length fifo overrun
                                                        Note that this signal is
                                                        no longer asserted by HW
                                                        */
#define XTE_IPXR_RECV_LFIFO_UNDER_MASK  0x00000100 /**< Rx length fifo underrun */
#define XTE_IPXR_XMIT_SFIFO_OVER_MASK   0x00000200 /**< Tx status fifo overrun */
#define XTE_IPXR_XMIT_SFIFO_UNDER_MASK  0x00000400 /**< Tx status fifo underrun */
#define XTE_IPXR_XMIT_LFIFO_OVER_MASK   0x00000800 /**< Tx length fifo overrun */
#define XTE_IPXR_XMIT_LFIFO_UNDER_MASK  0x00001000 /**< Tx length fifo underrun */
#define XTE_IPXR_RECV_PFIFO_ABORT_MASK  0x00002000 /**< Rx packet rejected due to
                                                        full packet FIFO */
#define XTE_IPXR_RECV_LFIFO_ABORT_MASK  0x00004000 /**< Rx packet rejected due to
                                                        full length FIFO */

#define XTE_IPXR_RECV_DROPPED_MASK                                      \
    (XTE_IPXR_RECV_REJECT_MASK |                                        \
     XTE_IPXR_RECV_PFIFO_ABORT_MASK |                                   \
     XTE_IPXR_RECV_LFIFO_ABORT_MASK)    /**< IPXR bits that indicate a dropped
                                             receive frame */
#define XTE_IPXR_XMIT_ERROR_MASK                                        \
    (XTE_IPXR_XMIT_SFIFO_OVER_MASK |                                    \
     XTE_IPXR_XMIT_SFIFO_UNDER_MASK |                                   \
     XTE_IPXR_XMIT_LFIFO_OVER_MASK |                                    \
     XTE_IPXR_XMIT_LFIFO_UNDER_MASK)    /**< IPXR bits that indicate transmit
                                             errors */

#define XTE_IPXR_RECV_ERROR_MASK                                        \
    (XTE_IPXR_RECV_DROPPED_MASK |                                       \
     XTE_IPXR_RECV_LFIFO_UNDER_MASK)    /**< IPXR bits that indicate receive
                                             errors */

#define XTE_IPXR_FIFO_FATAL_ERROR_MASK          \
    (XTE_IPXR_XMIT_SFIFO_OVER_MASK |            \
     XTE_IPXR_XMIT_SFIFO_UNDER_MASK |           \
     XTE_IPXR_XMIT_LFIFO_OVER_MASK |            \
     XTE_IPXR_XMIT_LFIFO_UNDER_MASK |           \
     XTE_IPXR_RECV_LFIFO_UNDER_MASK)    /**< IPXR bits that indicate errors with
                                             one of the length or status FIFOs
                                             that is fatal in nature. These bits
                                             can only be cleared by a device
                                             reset */

/** Software reset register (DSR)
 */
#define XTE_DSR_RESET_MASK      0x0000000A  /**< Write this value to DSR to
                                                 reset entire core */


/** Global interrupt enable register (DGIE)
 */
#define XTE_DGIE_ENABLE_MASK    0x80000000  /**< Write this value to DGIE to
                                                 enable interrupts from this
                                                 device */

/** Control Register (CR)
 */
#define XTE_CR_HTRST_MASK       0x00000008   /**< Reset hard temac */
#define XTE_CR_BCREJ_MASK       0x00000004   /**< Disable broadcast address
                                                  filtering */
#define XTE_CR_MCREJ_MASK       0x00000002   /**< Disable multicast address
                                                  filtering */
#define XTE_CR_HDUPLEX_MASK     0x00000001   /**< Enable half duplex operation */


/** Transmit Packet Length Register (TPLR)
 */
#define XTE_TPLR_TXPL_MASK      0x00003FFF   /**< Tx packet length in bytes */


/** Transmit Status Register (TSR)
 */
#define XTE_TSR_TXED_MASK       0x80000000   /**< Excess deferral error */
#define XTE_TSR_PFIFOU_MASK     0x40000000   /**< Packet FIFO underrun */
#define XTE_TSR_TXA_MASK        0x3E000000   /**< Transmission attempts */
#define XTE_TSR_TXLC_MASK       0x01000000   /**< Late collision error */
#define XTE_TSR_TPCF_MASK       0x00000001   /**< Transmit packet complete
                                                  flag */

#define XTE_TSR_ERROR_MASK                 \
    (XTE_TSR_TXED_MASK |                   \
     XTE_TSR_PFIFOU_MASK |                 \
     XTE_TSR_TXLC_MASK)                      /**< TSR bits that indicate an
                                                  error */


/** Receive Packet Length Register (RPLR)
 */
#define XTE_RPLR_RXPL_MASK      0x00003FFF   /**< Rx packet length in bytes */


/** Receive Status Register (RSR)
 */
#define XTE_RSR_RPCF_MASK       0x00000001   /**< Receive packet complete
                                                  flag */

/** Interframe Gap Register (IFG)
 */
#define XTE_IFG_IFGD_MASK       0x000000FF   /**< IFG delay */


/** Transmit Pause Packet Register (TPPR)
 */
#define XTE_TPPR_TPPD_MASK      0x0000FFFF   /**< Tx pause packet data */


/** Receiver Configuration Word 1 (ERXC1)
 */
#define XTE_ERXC1_RXRST_MASK    0x80000000   /**< Receiver reset */
#define XTE_ERXC1_RXJMBO_MASK   0x40000000   /**< Jumbo frame enable */
#define XTE_ERXC1_RXFCS_MASK    0x20000000   /**< FCS not stripped */
#define XTE_ERXC1_RXEN_MASK     0x10000000   /**< Receiver enable */
#define XTE_ERXC1_RXVLAN_MASK   0x08000000   /**< VLAN enable */
#define XTE_ERXC1_RXHD_MASK     0x04000000   /**< Half duplex */
#define XTE_ERXC1_RXLT_MASK     0x02000000   /**< Length/type check disable */
#define XTE_ERXC1_ERXC1_MASK    0x0000FFFF   /**< Pause frame source address
                                                  bits [47:32]. Bits [31:0]
                                                  are stored in register
                                                  ERXC0 */


/** Transmitter Configuration (ETXC)
 */
#define XTE_ETXC_TXRST_MASK     0x80000000   /**< Transmitter reset */
#define XTE_ETXC_TXJMBO_MASK    0x40000000   /**< Jumbo frame enable */
#define XTE_ETXC_TXFCS_MASK     0x20000000   /**< Generate FCS */
#define XTE_ETXC_TXEN_MASK      0x10000000   /**< Transmitter enable */
#define XTE_ETXC_TXVLAN_MASK    0x08000000   /**< VLAN enable */
#define XTE_ETXC_TXHD_MASK      0x04000000   /**< Half duplex */
#define XTE_ETXC_TXIFG_MASK     0x02000000   /**< IFG adjust enable */


/** Flow Control Configuration (EFCC)
 */
#define XTE_EFCC_TXFLO_MASK     0x40000000   /**< Tx flow control enable */
#define XTE_EFCC_RXFLO_MASK     0x20000000   /**< Rx flow control enable */


/** EMAC Configuration (ECFG)
 */
#define XTE_ECFG_LINKSPD_MASK   0xC0000000   /**< Link speed */
#define XTE_ECFG_RGMII_MASK     0x20000000   /**< RGMII mode enable */
#define XTE_ECFG_SGMII_MASK     0x10000000   /**< SGMII mode enable */
#define XTE_ECFG_1000BASEX_MASK 0x08000000   /**< 1000BaseX mode enable */
#define XTE_ECFG_HOSTEN_MASK    0x04000000   /**< Host interface enable */
#define XTE_ECFG_TX16BIT        0x02000000   /**< 16 bit Tx client enable */
#define XTE_ECFG_RX16BIT        0x01000000   /**< 16 bit Rx client enable */

#define XTE_ECFG_LINKSPD_10     0x00000000   /**< XTE_ECFG_LINKSPD_MASK for
                                                  10 Mbit */
#define XTE_ECFG_LINKSPD_100    0x40000000   /**< XTE_ECFG_LINKSPD_MASK for
                                                  100 Mbit */
#define XTE_ECFG_LINKSPD_1000   0x80000000   /**< XTE_ECFG_LINKSPD_MASK for
                                                  1000 Mbit */

/** EMAC RGMII/SGMII Configuration (EGMIC)
 */
#define XTE_EGMIC_RGLINKSPD_MASK    0xC0000000   /**< RGMII link speed */
#define XTE_EGMIC_SGLINKSPD_MASK    0x0000000C   /**< SGMII link speed */
#define XTE_EGMIC_RGSTATUS_MASK     0x00000002   /**< RGMII link status */
#define XTE_EGMIC_RGHALFDUPLEX_MASK 0x00000001   /**< RGMII half duplex */

#define XTE_EGMIC_RGLINKSPD_10      0x00000000   /**< XTE_EGMIC_RGLINKSPD_MASK
                                                      for 10 Mbit */
#define XTE_EGMIC_RGLINKSPD_100     0x40000000   /**< XTE_EGMIC_RGLINKSPD_MASK
                                                      for 100 Mbit */
#define XTE_EGMIC_RGLINKSPD_1000    0x80000000   /**< XTE_EGMIC_RGLINKSPD_MASK
                                                      for 1000 Mbit */
#define XTE_EGMIC_SGLINKSPD_10      0x00000000   /**< XTE_SGMIC_RGLINKSPD_MASK
                                                      for 10 Mbit */
#define XTE_EGMIC_SGLINKSPD_100     0x00000004   /**< XTE_SGMIC_RGLINKSPD_MASK
                                                      for 100 Mbit */
#define XTE_EGMIC_SGLINKSPD_1000    0x00000008   /**< XTE_SGMIC_RGLINKSPD_MASK
                                                      for 1000 Mbit */

/** EMAC Management Configuration (EMC)
 */
#define XTE_EMC_MDIO_MASK       0x00000040   /**< MII management enable */
#define XTE_EMC_CLK_DVD_MAX     0x3F         /**< Maximum MDIO divisor */


/** EMAC Unicast Address Register Word 1 (EUAW1)
 */
#define XTE_EUAW1_MASK          0x0000FFFF   /**< Station address bits [47:32]
                                                  Station address bits [31:0]
                                                  are stored in register
                                                  EUAW0 */


/** EMAC Multicast Address Register Word 1 (EMAW1)
 */
#define XTE_EMAW1_CAMRNW_MASK   0x00800000   /**< CAM read/write control */
#define XTE_EMAW1_CAMADDR_MASK  0x00030000   /**< CAM address mask */
#define XTE_EUAW1_MASK          0x0000FFFF   /**< Multicast address bits [47:32]
                                                  Multicast address bits [31:0]
                                                  are stored in register
                                                  EMAW0 */
#define XTE_EMAW1_CAMMADDR_SHIFT_MASK 16     /**< Number of bits to shift right
                                                  to align with
                                                  XTE_EMAW1_CAMADDR_MASK */


/** EMAC Address Filter Mode (EAFM)
 */
#define XTE_EAFM_EPPRM_MASK         0x80000000   /**< Promiscuous mode enable */


/** EMAC MII Management Write Data (EMIID)
 */
#define XTE_EMIID_MIIMWRDATA_MASK   0x0000FFFF   /**< Data port */


/** EMAC MII Management Control (EMIIC)
 */
#define XTE_EMIID_MIIMDECADDR_MASK  0x0000FFFF   /**< Address port */


struct XilTemacStats
{
  volatile uint32_t iInterrupts;

  volatile uint32_t iRxInterrupts;
  volatile uint32_t iRxRejectedInterrupts;
  volatile uint32_t iRxRejectedInvalidFrame;
  volatile uint32_t iRxRejectedDataFifoFull;
  volatile uint32_t iRxRejectedLengthFifoFull;
  volatile uint32_t iRxMaxDrained;
  volatile uint32_t iRxStrayEvents;

  volatile uint32_t iTxInterrupts;
  volatile uint32_t iTxMaxDrained;
};

#define MAX_UNIT_BYTES 50

struct XilTemac
{
  struct arpcom         iArpcom;
  struct XilTemacStats  iStats;
  struct ifnet*         iIfp;

  char                  iUnitName[MAX_UNIT_BYTES];

  uint32_t              iAddr;
  rtems_event_set       iIoEvent;

  int                   iIsrVector;

#if PPC_HAS_CLASSIC_EXCEPTIONS
  rtems_isr_entry       iOldHandler;
#else
  rtems_irq_connect_data iOldHandler;
#endif
  int                   iIsPresent;
};


#endif /* _XILINX_EMAC_*/