17#define TX_DESCRIPTOR_NUM 0x10
18#define RX_DESCRIPTOR_NUM 0x10
20#define MEM(x) (0x80000000|(long)(x))
35static int enet_open(
struct netif *ctx);
40static unsigned short phy_read(
int addr)
42 write32n(0xea001444, __builtin_bswap32((addr << 11) | 0x50));
43 do {
mdelay(1);}
while (__builtin_bswap32(read32n(0xea001444)) & 0x10);
44 return __builtin_bswap32(read32n(0xea001444)) >> 16;
47static void phy_write(
int addr,
unsigned short data)
49 write32n(0xea001444, __builtin_bswap32((addr << 11) | 0x70 | (
data << 16)));
50 do {
mdelay(1);}
while (__builtin_bswap32(read32n(0xea001444)) & 0x10);
59static inline int virt_to_phys(
volatile void *
ptr)
61 return ((
long)
ptr) & 0x7FFFFFFF;
66 wait_empty_tx(context);
74 descr[0] = __builtin_bswap32(
len);
75 descr[2] = __builtin_bswap32(virt_to_phys(
data));
77 descr[1] = __builtin_bswap32(0xc0230000);
85 write32n(0xea001400, read32n(0xea001400) | __builtin_bswap32(0x10));
92 write32n(0xea001410, __builtin_bswap32(0x00101c11));
120 write32n(0xea001400, __builtin_bswap32(0x00001c00));
122 write32n(0xea001400, __builtin_bswap32(0x00011c00));
124 write32n(0xea001400, __builtin_bswap32(0x00001c00));
147 write32n(0xea001440, 0x1100004);
148 write32n(0xea001450, 0);
163 if(context ==
NULL) {
164 printf(
"enet: Failed to allocate context memory.\n");
184#if LWIP_NETIF_HOSTNAME
185 netif->hostname =
"XeLL";
203 write32n(0xea001424, 0);
204 write32n(0xea001428, 0x01805508);
207 write32n(0xea001428, 0x01005508);
209 write32n(0xea001444, __builtin_bswap32(4));
211 write32n(0xea001444, __builtin_bswap32(0));
214 write32n(0xea001478, 0xf2050000);
217 write32n(0xea001450, 0x60230000);
227 write32n(0xea001468, 0);
228 write32n(0xea00146c, 0);
230 write32n(0xea001400, 0x001c0000);
231 write32n(0xea001410, __builtin_bswap32(0x00101c00));
233 write32n(0xea001440, 0x01190004);
235 void *
base = (
void*)memalign(0x10000,0x10000);
238 tx_init(context, (
void*)
MEM(
base));
240 rx_init(context, (
void*)
MEM(
base + 0x8000));
242 write32n(0xea001440, 0x01100004);
245 printf(
"Reinit PHY...\n");
251 phy_write(0, 0x9000);
253 while (phy_read(0) & 0x8000){
263 int linkstate = phy_read(1);
264 if (!(linkstate & 4))
268 printf(
"Waiting for link...");
269 while (!(phy_read(1) & 4)){
277 printf(
"link up!\n");
279 printf(
"link still down.\n");
284 write32n(0xea001428, 0x01005508);
285 write32n(0xea001410, __builtin_bswap32(0x00101c11));
286 write32n(0xea001400, __builtin_bswap32(0x00001c01));
295 if (__builtin_bswap32(d[1]) & 0x80000000)
308 int size = __builtin_bswap32(d[0]) & 0xFFFF;
320 for(q = p; q !=
NULL; q = q->next) {
324 memcpy(q->payload, phys_addr + rptr, q->len);
328 lwip_stats.link.recv++;
332 lwip_stats.link.memerr++;
333 lwip_stats.link.drop++;
340 d[0] = __builtin_bswap32(0);
341 d[1] = __builtin_bswap32(0xc0000000);
360 for(q = p; q !=
NULL; q = q->
next) {
366 tx_data(context, dstptr, p->
tot_len);
388 struct eth_hdr *ethhdr;
391 p = enet_linkinput(context);
397 lwip_stats.link.recv++;
421 write32n(0xea001400, 0);
422 write32n(0xea001410, 0);
void memdcbf(void *addr, int len)
void memdcbst(void *addr, int len)
void enet_poll(struct netif *netif)
err_t enet_init(struct netif *netif)
#define RX_DESCRIPTOR_NUM
#define TX_DESCRIPTOR_NUM
void * mem_malloc(mem_size_t size)
#define NETIF_FLAG_ETHARP
#define NETIF_FLAG_BROADCAST
struct pbuf * pbuf_alloc(pbuf_layer layer, u16_t length, pbuf_type type)
u8_t pbuf_free(struct pbuf *p)
struct eth_addr * ethaddr
volatile uint32_t * tx_descriptor_base
volatile uint32_t * rx_descriptor_base
u8_t hwaddr[NETIF_MAX_HWADDR_LEN]
netif_linkoutput_fn linkoutput
void xenon_config_get_mac_addr(unsigned char *hwaddr)
void xenon_gpio_control(uint32_t reg, uint32_t clear, uint32_t set)