~pmdj/ubuntu/trusty/qemu/2.9+applesmc+fadtv3

« back to all changes in this revision

Viewing changes to roms/ipxe/src/drivers/net/smsc95xx.h

  • Committer: Phil Dennis-Jordan
  • Date: 2017-07-21 08:03:43 UTC
  • mfrom: (1.1.1)
  • Revision ID: phil@philjordan.eu-20170721080343-2yr2vdj7713czahv
New upstream release 2.9.0.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#ifndef _SMSC95XX_H
 
2
#define _SMSC95XX_H
 
3
 
 
4
/** @file
 
5
 *
 
6
 * SMSC LAN95xx USB Ethernet driver
 
7
 *
 
8
 */
 
9
 
 
10
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
 
11
 
 
12
#include <ipxe/usb.h>
 
13
#include <ipxe/usbnet.h>
 
14
#include <ipxe/if_ether.h>
 
15
#include <ipxe/mii.h>
 
16
 
 
17
/** Register write command */
 
18
#define SMSC95XX_REGISTER_WRITE                                 \
 
19
        ( USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE |    \
 
20
          USB_REQUEST_TYPE ( 0xa0 ) )
 
21
 
 
22
/** Register read command */
 
23
#define SMSC95XX_REGISTER_READ                                  \
 
24
        ( USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE |     \
 
25
          USB_REQUEST_TYPE ( 0xa1 ) )
 
26
 
 
27
/** Get statistics command */
 
28
#define SMSC95XX_GET_STATISTICS                                 \
 
29
        ( USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE |     \
 
30
          USB_REQUEST_TYPE ( 0xa2 ) )
 
31
 
 
32
/** Interrupt status register */
 
33
#define SMSC95XX_INT_STS 0x008
 
34
#define SMSC95XX_INT_STS_RXDF_INT       0x00000800UL    /**< RX FIFO overflow */
 
35
#define SMSC95XX_INT_STS_PHY_INT        0x00008000UL    /**< PHY interrupt */
 
36
 
 
37
/** Transmit configuration register */
 
38
#define SMSC95XX_TX_CFG 0x010
 
39
#define SMSC95XX_TX_CFG_ON              0x00000004UL    /**< TX enable */
 
40
 
 
41
/** Hardware configuration register */
 
42
#define SMSC95XX_HW_CFG 0x014
 
43
#define SMSC95XX_HW_CFG_BIR             0x00001000UL    /**< Bulk IN use NAK */
 
44
#define SMSC95XX_HW_CFG_LRST            0x00000008UL    /**< Soft lite reset */
 
45
 
 
46
/** LED GPIO configuration register */
 
47
#define SMSC95XX_LED_GPIO_CFG 0x024
 
48
#define SMSC95XX_LED_GPIO_CFG_GPCTL2(x) ( (x) << 24 )   /**< GPIO 2 control */
 
49
#define SMSC95XX_LED_GPIO_CFG_GPCTL2_NSPD_LED \
 
50
        SMSC95XX_LED_GPIO_CFG_GPCTL2 ( 1 )              /**< Link speed LED */
 
51
#define SMSC95XX_LED_GPIO_CFG_GPCTL1(x) ( (x) << 20 )   /**< GPIO 1 control */
 
52
#define SMSC95XX_LED_GPIO_CFG_GPCTL1_NLNKA_LED \
 
53
        SMSC95XX_LED_GPIO_CFG_GPCTL1 ( 1 )              /**< Activity LED */
 
54
#define SMSC95XX_LED_GPIO_CFG_GPCTL0(x) ( (x) << 16 )   /**< GPIO 0 control */
 
55
#define SMSC95XX_LED_GPIO_CFG_GPCTL0_NFDX_LED \
 
56
        SMSC95XX_LED_GPIO_CFG_GPCTL0 ( 1 )              /**< Full-duplex LED */
 
57
 
 
58
/** EEPROM command register */
 
59
#define SMSC95XX_E2P_CMD 0x030
 
60
#define SMSC95XX_E2P_CMD_EPC_BSY        0x80000000UL    /**< EPC busy */
 
61
#define SMSC95XX_E2P_CMD_EPC_CMD_READ   0x00000000UL    /**< READ command */
 
62
#define SMSC95XX_E2P_CMD_EPC_ADDR(addr) ( (addr) << 0 ) /**< EPC address */
 
63
 
 
64
/** EEPROM data register */
 
65
#define SMSC95XX_E2P_DATA 0x034
 
66
#define SMSC95XX_E2P_DATA_GET(e2p_data) \
 
67
        ( ( (e2p_data) >> 0 ) & 0xff )                  /**< EEPROM data */
 
68
 
 
69
/** MAC address EEPROM address */
 
70
#define SMSC95XX_EEPROM_MAC 0x01
 
71
 
 
72
/** Interrupt endpoint control register */
 
73
#define SMSC95XX_INT_EP_CTL 0x068
 
74
#define SMSC95XX_INT_EP_CTL_RXDF_EN     0x00000800UL    /**< RX FIFO overflow */
 
75
#define SMSC95XX_INT_EP_CTL_PHY_EN      0x00008000UL    /**< PHY interrupt */
 
76
 
 
77
/** Bulk IN delay register */
 
78
#define SMSC95XX_BULK_IN_DLY 0x06c
 
79
#define SMSC95XX_BULK_IN_DLY_SET(ticks) ( (ticks) << 0 ) /**< Delay / 16.7ns */
 
80
 
 
81
/** MAC control register */
 
82
#define SMSC95XX_MAC_CR 0x100
 
83
#define SMSC95XX_MAC_CR_RXALL           0x80000000UL    /**< Receive all */
 
84
#define SMSC95XX_MAC_CR_FDPX            0x00100000UL    /**< Full duplex */
 
85
#define SMSC95XX_MAC_CR_MCPAS           0x00080000UL    /**< All multicast */
 
86
#define SMSC95XX_MAC_CR_PRMS            0x00040000UL    /**< Promiscuous */
 
87
#define SMSC95XX_MAC_CR_PASSBAD         0x00010000UL    /**< Pass bad frames */
 
88
#define SMSC95XX_MAC_CR_TXEN            0x00000008UL    /**< TX enabled */
 
89
#define SMSC95XX_MAC_CR_RXEN            0x00000004UL    /**< RX enabled */
 
90
 
 
91
/** MAC address high register */
 
92
#define SMSC95XX_ADDRH 0x104
 
93
 
 
94
/** MAC address low register */
 
95
#define SMSC95XX_ADDRL 0x108
 
96
 
 
97
/** MII access register */
 
98
#define SMSC95XX_MII_ACCESS 0x114
 
99
#define SMSC95XX_MII_ACCESS_PHY_ADDRESS 0x00000800UL    /**< PHY address */
 
100
#define SMSC95XX_MII_ACCESS_MIIRINDA(addr) ( (addr) << 6 ) /**< MII register */
 
101
#define SMSC95XX_MII_ACCESS_MIIWNR      0x00000002UL    /**< MII write */
 
102
#define SMSC95XX_MII_ACCESS_MIIBZY      0x00000001UL    /**< MII busy */
 
103
 
 
104
/** MII data register */
 
105
#define SMSC95XX_MII_DATA 0x118
 
106
#define SMSC95XX_MII_DATA_SET(data)     ( (data) << 0 ) /**< Set data */
 
107
#define SMSC95XX_MII_DATA_GET(mii_data) \
 
108
        ( ( (mii_data) >> 0 ) & 0xffff )                /**< Get data */
 
109
 
 
110
/** PHY interrupt source MII register */
 
111
#define SMSC95XX_MII_PHY_INTR_SOURCE 29
 
112
 
 
113
/** PHY interrupt mask MII register */
 
114
#define SMSC95XX_MII_PHY_INTR_MASK 30
 
115
 
 
116
/** PHY interrupt: auto-negotiation complete */
 
117
#define SMSC95XX_PHY_INTR_ANEG_DONE     0x0040
 
118
 
 
119
/** PHY interrupt: link down */
 
120
#define SMSC95XX_PHY_INTR_LINK_DOWN     0x0010
 
121
 
 
122
/** MAC address */
 
123
union smsc95xx_mac {
 
124
        /** MAC receive address registers */
 
125
        struct {
 
126
                /** MAC receive address low register */
 
127
                uint32_t l;
 
128
                /** MAC receive address high register */
 
129
                uint32_t h;
 
130
        } __attribute__ (( packed )) addr;
 
131
        /** Raw MAC address */
 
132
        uint8_t raw[ETH_ALEN];
 
133
};
 
134
 
 
135
/** Receive packet header */
 
136
struct smsc95xx_rx_header {
 
137
        /** Command word */
 
138
        uint32_t command;
 
139
} __attribute__ (( packed ));
 
140
 
 
141
/** Runt frame */
 
142
#define SMSC95XX_RX_RUNT 0x00004000UL
 
143
 
 
144
/** Late collision */
 
145
#define SMSC95XX_RX_LATE 0x00000040UL
 
146
 
 
147
/** CRC error */
 
148
#define SMSC95XX_RX_CRC 0x00000002UL
 
149
 
 
150
/** Transmit packet header */
 
151
struct smsc95xx_tx_header {
 
152
        /** Command word */
 
153
        uint32_t command;
 
154
        /** Frame length */
 
155
        uint32_t len;
 
156
} __attribute__ (( packed ));
 
157
 
 
158
/** First segment */
 
159
#define SMSC95XX_TX_FIRST 0x00002000UL
 
160
 
 
161
/** Last segment */
 
162
#define SMSC95XX_TX_LAST 0x00001000UL
 
163
 
 
164
/** Buffer size */
 
165
#define SMSC95XX_TX_LEN(len) ( (len) << 0 )
 
166
 
 
167
/** Interrupt packet format */
 
168
struct smsc95xx_interrupt {
 
169
        /** Current value of INT_STS register */
 
170
        uint32_t int_sts;
 
171
} __attribute__ (( packed ));
 
172
 
 
173
/** Receive statistics */
 
174
struct smsc95xx_rx_statistics {
 
175
        /** Good frames */
 
176
        uint32_t good;
 
177
        /** CRC errors */
 
178
        uint32_t crc;
 
179
        /** Runt frame errors */
 
180
        uint32_t undersize;
 
181
        /** Alignment errors */
 
182
        uint32_t alignment;
 
183
        /** Frame too long errors */
 
184
        uint32_t oversize;
 
185
        /** Later collision errors */
 
186
        uint32_t late;
 
187
        /** Bad frames */
 
188
        uint32_t bad;
 
189
        /** Dropped frames */
 
190
        uint32_t dropped;
 
191
} __attribute__ (( packed ));
 
192
 
 
193
/** Receive statistics */
 
194
#define SMSC95XX_RX_STATISTICS 0
 
195
 
 
196
/** Transmit statistics */
 
197
struct smsc95xx_tx_statistics {
 
198
        /** Good frames */
 
199
        uint32_t good;
 
200
        /** Pause frames */
 
201
        uint32_t pause;
 
202
        /** Single collisions */
 
203
        uint32_t single;
 
204
        /** Multiple collisions */
 
205
        uint32_t multiple;
 
206
        /** Excessive collisions */
 
207
        uint32_t excessive;
 
208
        /** Late collisions */
 
209
        uint32_t late;
 
210
        /** Buffer underruns */
 
211
        uint32_t underrun;
 
212
        /** Excessive deferrals */
 
213
        uint32_t deferred;
 
214
        /** Carrier errors */
 
215
        uint32_t carrier;
 
216
        /** Bad frames */
 
217
        uint32_t bad;
 
218
} __attribute__ (( packed ));
 
219
 
 
220
/** Transmit statistics */
 
221
#define SMSC95XX_TX_STATISTICS 1
 
222
 
 
223
/** A SMSC95xx network device */
 
224
struct smsc95xx_device {
 
225
        /** USB device */
 
226
        struct usb_device *usb;
 
227
        /** USB bus */
 
228
        struct usb_bus *bus;
 
229
        /** Network device */
 
230
        struct net_device *netdev;
 
231
        /** USB network device */
 
232
        struct usbnet_device usbnet;
 
233
        /** MII interface */
 
234
        struct mii_interface mii;
 
235
        /** Interrupt status */
 
236
        uint32_t int_sts;
 
237
};
 
238
 
 
239
/** Reset delay (in microseconds) */
 
240
#define SMSC95XX_RESET_DELAY_US 2
 
241
 
 
242
/** Maximum time to wait for EEPROM (in milliseconds) */
 
243
#define SMSC95XX_EEPROM_MAX_WAIT_MS 100
 
244
 
 
245
/** Maximum time to wait for MII (in milliseconds) */
 
246
#define SMSC95XX_MII_MAX_WAIT_MS 100
 
247
 
 
248
/** Interrupt maximum fill level
 
249
 *
 
250
 * This is a policy decision.
 
251
 */
 
252
#define SMSC95XX_INTR_MAX_FILL 2
 
253
 
 
254
/** Bulk IN maximum fill level
 
255
 *
 
256
 * This is a policy decision.
 
257
 */
 
258
#define SMSC95XX_IN_MAX_FILL 8
 
259
 
 
260
/** Bulk IN buffer size */
 
261
#define SMSC95XX_IN_MTU                                         \
 
262
        ( sizeof ( struct smsc95xx_rx_header ) +                \
 
263
          ETH_FRAME_LEN + 4 /* possible VLAN header */          \
 
264
          + 4 /* CRC */ )
 
265
 
 
266
/** Honeywell VM3 MAC address OEM string index */
 
267
#define SMSC95XX_VM3_OEM_STRING_MAC 2
 
268
 
 
269
#endif /* _SMSC95XX_H */