|
|
|
@ -24,6 +24,8 @@ |
|
|
|
|
* MA 02111-1307 USA |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
/* #define DEBUG */ |
|
|
|
|
|
|
|
|
|
#include <common.h> |
|
|
|
|
#include <command.h> |
|
|
|
|
#include <net.h> |
|
|
|
@ -33,8 +35,6 @@ |
|
|
|
|
#include <ambapp.h> |
|
|
|
|
#include <asm/leon.h> |
|
|
|
|
|
|
|
|
|
/* #define DEBUG */ |
|
|
|
|
|
|
|
|
|
#include "greth.h" |
|
|
|
|
|
|
|
|
|
/* Default to 3s timeout on autonegotiation */ |
|
|
|
@ -142,9 +142,8 @@ int greth_init(struct eth_device *dev, bd_t * bis) |
|
|
|
|
|
|
|
|
|
greth_priv *greth = dev->priv; |
|
|
|
|
greth_regs *regs = greth->regs; |
|
|
|
|
#ifdef DEBUG |
|
|
|
|
printf("greth_init\n"); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
debug("greth_init\n"); |
|
|
|
|
|
|
|
|
|
if (!greth->rxbd_base) { |
|
|
|
|
|
|
|
|
@ -199,9 +198,7 @@ int greth_init(struct eth_device *dev, bd_t * bis) |
|
|
|
|
|
|
|
|
|
/* Enable Transmitter, GRETH will now scan descriptors for packets
|
|
|
|
|
* to transmitt */ |
|
|
|
|
#ifdef DEBUG |
|
|
|
|
printf("greth_init: enabling receiver\n"); |
|
|
|
|
#endif |
|
|
|
|
debug("greth_init: enabling receiver\n"); |
|
|
|
|
GRETH_REGORIN(®s->control, GRETH_RXEN); |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
@ -306,10 +303,8 @@ int greth_init_phy(greth_priv * dev, bd_t * bis) |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
auto_neg_done: |
|
|
|
|
#ifdef DEBUG |
|
|
|
|
printf("%s GRETH Ethermac at [0x%x] irq %d. Running \
|
|
|
|
|
debug("%s GRETH Ethermac at [0x%x] irq %d. Running \
|
|
|
|
|
%d Mbps %s duplex\n", dev->gbit_mac ? "10/100/1000" : "10/100", (unsigned int)(regs), (unsigned int)(dev->irq), dev->gb ? 1000 : (dev->sp ? 100 : 10), dev->fd ? "full" : "half"); |
|
|
|
|
#endif |
|
|
|
|
/* Read out PHY info if extended registers are available */ |
|
|
|
|
if (tmp & 1) { |
|
|
|
|
tmp1 = read_mii(2, regs); |
|
|
|
@ -318,10 +313,8 @@ int greth_init_phy(greth_priv * dev, bd_t * bis) |
|
|
|
|
tmp = tmp2 & 0xF; |
|
|
|
|
|
|
|
|
|
tmp2 = (tmp2 >> 4) & 0x3F; |
|
|
|
|
#ifdef DEBUG |
|
|
|
|
printf("PHY: Vendor %x Device %x Revision %d\n", tmp1, |
|
|
|
|
debug("PHY: Vendor %x Device %x Revision %d\n", tmp1, |
|
|
|
|
tmp2, tmp); |
|
|
|
|
#endif |
|
|
|
|
} else { |
|
|
|
|
printf("PHY info not available\n"); |
|
|
|
|
} |
|
|
|
@ -338,9 +331,9 @@ void greth_halt(struct eth_device *dev) |
|
|
|
|
greth_priv *greth; |
|
|
|
|
greth_regs *regs; |
|
|
|
|
int i; |
|
|
|
|
#ifdef DEBUG |
|
|
|
|
printf("greth_halt\n"); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
debug("greth_halt\n"); |
|
|
|
|
|
|
|
|
|
if (!dev || !dev->priv) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
@ -376,9 +369,9 @@ int greth_send(struct eth_device *dev, volatile void *eth_data, int data_length) |
|
|
|
|
greth_bd *txbd; |
|
|
|
|
void *txbuf; |
|
|
|
|
unsigned int status; |
|
|
|
|
#ifdef DEBUG |
|
|
|
|
printf("greth_send\n"); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
debug("greth_send\n"); |
|
|
|
|
|
|
|
|
|
/* send data, wait for data to be sent, then return */ |
|
|
|
|
if (((unsigned int)eth_data & (GRETH_BUF_ALIGN - 1)) |
|
|
|
|
&& !greth->gbit_mac) { |
|
|
|
@ -387,9 +380,6 @@ int greth_send(struct eth_device *dev, volatile void *eth_data, int data_length) |
|
|
|
|
*/ |
|
|
|
|
if (!greth->txbuf) { |
|
|
|
|
greth->txbuf = malloc(GRETH_RXBUF_SIZE); |
|
|
|
|
#ifdef DEBUG |
|
|
|
|
printf("GRETH: allocated aligned tx-buf\n"); |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
txbuf = greth->txbuf; |
|
|
|
@ -455,9 +445,7 @@ int greth_recv(struct eth_device *dev) |
|
|
|
|
unsigned char *d; |
|
|
|
|
int enable = 0; |
|
|
|
|
int i; |
|
|
|
|
#ifdef DEBUG |
|
|
|
|
/* printf("greth_recv\n"); */ |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
/* Receive One packet only, but clear as many error packets as there are
|
|
|
|
|
* available. |
|
|
|
|
*/ |
|
|
|
@ -474,10 +462,9 @@ int greth_recv(struct eth_device *dev) |
|
|
|
|
if (status & GRETH_BD_EN) { |
|
|
|
|
goto done; |
|
|
|
|
} |
|
|
|
|
#ifdef DEBUG |
|
|
|
|
printf("greth_recv: packet 0x%lx, 0x%lx, len: %d\n", |
|
|
|
|
|
|
|
|
|
debug("greth_recv: packet 0x%lx, 0x%lx, len: %d\n", |
|
|
|
|
(unsigned int)rxbd, status, status & GRETH_BD_LEN); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
/* Check status for errors.
|
|
|
|
|
*/ |
|
|
|
@ -512,12 +499,12 @@ int greth_recv(struct eth_device *dev) |
|
|
|
|
/* Process the incoming packet. */ |
|
|
|
|
len = status & GRETH_BD_LEN; |
|
|
|
|
d = (char *)rxbd->addr; |
|
|
|
|
#ifdef DEBUG |
|
|
|
|
printf |
|
|
|
|
|
|
|
|
|
debug |
|
|
|
|
("greth_recv: new packet, length: %d. data: %x %x %x %x %x %x %x %x\n", |
|
|
|
|
len, d[0], d[1], d[2], d[3], d[4], d[5], d[6], |
|
|
|
|
d[7]); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
/* flush all data cache to make sure we're not reading old packet data */ |
|
|
|
|
sparc_dcache_flush_all(); |
|
|
|
|
|
|
|
|
@ -565,10 +552,9 @@ void greth_set_hwaddr(greth_priv * greth, unsigned char *mac) |
|
|
|
|
greth->regs->esa_msb = (mac[0] << 8) | mac[1]; |
|
|
|
|
greth->regs->esa_lsb = |
|
|
|
|
(mac[2] << 24) | (mac[3] << 16) | (mac[4] << 8) | mac[5]; |
|
|
|
|
#ifdef DEBUG |
|
|
|
|
printf("GRETH: New MAC address: %02x:%02x:%02x:%02x:%02x:%02x\n", |
|
|
|
|
|
|
|
|
|
debug("GRETH: New MAC address: %02x:%02x:%02x:%02x:%02x:%02x\n", |
|
|
|
|
mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int greth_initialize(bd_t * bis) |
|
|
|
@ -579,9 +565,9 @@ int greth_initialize(bd_t * bis) |
|
|
|
|
int i; |
|
|
|
|
char *addr_str, *end; |
|
|
|
|
unsigned char addr[6]; |
|
|
|
|
#ifdef DEBUG |
|
|
|
|
printf("Scanning for GRETH\n"); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
debug("Scanning for GRETH\n"); |
|
|
|
|
|
|
|
|
|
/* Find Device & IRQ via AMBA Plug&Play information */ |
|
|
|
|
if (ambapp_apb_first(VENDOR_GAISLER, GAISLER_ETHMAC, &apbdev) != 1) { |
|
|
|
|
return -1; /* GRETH not found */ |
|
|
|
@ -594,9 +580,7 @@ int greth_initialize(bd_t * bis) |
|
|
|
|
|
|
|
|
|
greth->regs = (greth_regs *) apbdev.address; |
|
|
|
|
greth->irq = apbdev.irq; |
|
|
|
|
#ifdef DEBUG |
|
|
|
|
printf("Found GRETH at 0x%lx, irq %d\n", greth->regs, greth->irq); |
|
|
|
|
#endif |
|
|
|
|
debug("Found GRETH at 0x%lx, irq %d\n", greth->regs, greth->irq); |
|
|
|
|
dev->priv = (void *)greth; |
|
|
|
|
dev->iobase = (unsigned int)greth->regs; |
|
|
|
|
dev->init = greth_init; |
|
|
|
|