|
@@ -45,12 +45,10 @@ static rt_thread_t link_thread_tid = RT_NULL;
|
|
|
#define LINK_THREAD_PRIORITY (20)
|
|
#define LINK_THREAD_PRIORITY (20)
|
|
|
#define LINK_THREAD_TIMESLICE (10)
|
|
#define LINK_THREAD_TIMESLICE (10)
|
|
|
|
|
|
|
|
-
|
|
|
|
|
static rt_uint32_t tx_index = 0;
|
|
static rt_uint32_t tx_index = 0;
|
|
|
static rt_uint32_t rx_index = 0;
|
|
static rt_uint32_t rx_index = 0;
|
|
|
static rt_uint32_t index_flag = 0;
|
|
static rt_uint32_t index_flag = 0;
|
|
|
|
|
|
|
|
-
|
|
|
|
|
struct rt_eth_dev
|
|
struct rt_eth_dev
|
|
|
{
|
|
{
|
|
|
struct eth_device parent;
|
|
struct eth_device parent;
|
|
@@ -78,9 +76,6 @@ static inline void write32(void *addr, rt_uint32_t value)
|
|
|
(*((volatile unsigned int*)(addr))) = value;
|
|
(*((volatile unsigned int*)(addr))) = value;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
static void eth_rx_irq(int irq, void *param)
|
|
static void eth_rx_irq(int irq, void *param)
|
|
|
{
|
|
{
|
|
|
rt_uint32_t val = 0;
|
|
rt_uint32_t val = 0;
|
|
@@ -92,12 +87,12 @@ static void eth_rx_irq(int irq, void *param)
|
|
|
|
|
|
|
|
if (val & GENET_IRQ_RXDMA_DONE)
|
|
if (val & GENET_IRQ_RXDMA_DONE)
|
|
|
{
|
|
{
|
|
|
- eth_device_ready(ð_dev.parent);
|
|
|
|
|
|
|
+ eth_device_ready(ð_dev.parent);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (val & GENET_IRQ_TXDMA_DONE)
|
|
if (val & GENET_IRQ_TXDMA_DONE)
|
|
|
{
|
|
{
|
|
|
- rt_sem_release(&send_finsh_sem_lock);
|
|
|
|
|
|
|
+ rt_sem_release(&send_finsh_sem_lock);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -190,9 +185,9 @@ static int bcmgenet_mdio_write(rt_uint32_t addr, rt_uint32_t reg, rt_uint32_t va
|
|
|
write32(mac_reg_base_addr + MDIO_CMD, reg_val);
|
|
write32(mac_reg_base_addr + MDIO_CMD, reg_val);
|
|
|
|
|
|
|
|
while ((read32(mac_reg_base_addr + MDIO_CMD) & MDIO_START_BUSY) && (--count))
|
|
while ((read32(mac_reg_base_addr + MDIO_CMD) & MDIO_START_BUSY) && (--count))
|
|
|
- {
|
|
|
|
|
|
|
+ {
|
|
|
DELAY_MICROS(1);
|
|
DELAY_MICROS(1);
|
|
|
- }
|
|
|
|
|
|
|
+ }
|
|
|
reg_val = read32(mac_reg_base_addr + MDIO_CMD);
|
|
reg_val = read32(mac_reg_base_addr + MDIO_CMD);
|
|
|
|
|
|
|
|
return reg_val & 0xffff;
|
|
return reg_val & 0xffff;
|
|
@@ -212,9 +207,9 @@ static int bcmgenet_mdio_read(rt_uint32_t addr, rt_uint32_t reg)
|
|
|
write32(mac_reg_base_addr + MDIO_CMD, reg_val);
|
|
write32(mac_reg_base_addr + MDIO_CMD, reg_val);
|
|
|
|
|
|
|
|
while ((read32(mac_reg_base_addr + MDIO_CMD) & MDIO_START_BUSY) && (--count))
|
|
while ((read32(mac_reg_base_addr + MDIO_CMD) & MDIO_START_BUSY) && (--count))
|
|
|
- {
|
|
|
|
|
|
|
+ {
|
|
|
DELAY_MICROS(1);
|
|
DELAY_MICROS(1);
|
|
|
- }
|
|
|
|
|
|
|
+ }
|
|
|
reg_val = read32(mac_reg_base_addr + MDIO_CMD);
|
|
reg_val = read32(mac_reg_base_addr + MDIO_CMD);
|
|
|
|
|
|
|
|
return reg_val & 0xffff;
|
|
return reg_val & 0xffff;
|
|
@@ -449,9 +444,9 @@ static rt_uint32_t bcmgenet_gmac_eth_recv(rt_uint8_t **packetp)
|
|
|
* RBUF_ALIGN_2B
|
|
* RBUF_ALIGN_2B
|
|
|
*/
|
|
*/
|
|
|
|
|
|
|
|
- //Convert to memory address
|
|
|
|
|
- addr = addr + eth_recv_no_cache - RECV_DATA_NO_CACHE;
|
|
|
|
|
- rt_hw_cpu_dcache_invalidate(addr,length);
|
|
|
|
|
|
|
+ //Convert to memory address
|
|
|
|
|
+ addr = addr + eth_recv_no_cache - RECV_DATA_NO_CACHE;
|
|
|
|
|
+ rt_hw_cpu_dcache_invalidate(addr,length);
|
|
|
*packetp = (rt_uint8_t *)(addr + RX_BUF_OFFSET);
|
|
*packetp = (rt_uint8_t *)(addr + RX_BUF_OFFSET);
|
|
|
rx_index = rx_index + 1;
|
|
rx_index = rx_index + 1;
|
|
|
if(rx_index >= RX_DESCS)
|
|
if(rx_index >= RX_DESCS)
|
|
@@ -473,7 +468,6 @@ static rt_uint32_t bcmgenet_gmac_eth_recv(rt_uint8_t **packetp)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-
|
|
|
|
|
static int bcmgenet_gmac_eth_send(rt_uint32_t packet, int length,struct pbuf *p)
|
|
static int bcmgenet_gmac_eth_send(rt_uint32_t packet, int length,struct pbuf *p)
|
|
|
{
|
|
{
|
|
|
rt_ubase_t level;
|
|
rt_ubase_t level;
|
|
@@ -497,7 +491,7 @@ static int bcmgenet_gmac_eth_send(rt_uint32_t packet, int length,struct pbuf *p)
|
|
|
{
|
|
{
|
|
|
tx_index = 0;
|
|
tx_index = 0;
|
|
|
}
|
|
}
|
|
|
- prod_index = prod_index + 1;
|
|
|
|
|
|
|
+ prod_index = prod_index+1;
|
|
|
|
|
|
|
|
if (prod_index > 0xffff)
|
|
if (prod_index > 0xffff)
|
|
|
{
|
|
{
|
|
@@ -574,13 +568,13 @@ static rt_err_t bcmgenet_eth_init(rt_device_t device)
|
|
|
if (major != 6)
|
|
if (major != 6)
|
|
|
{
|
|
{
|
|
|
if (major == 5)
|
|
if (major == 5)
|
|
|
- {
|
|
|
|
|
- major = 4;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ {
|
|
|
|
|
+ major = 4;
|
|
|
|
|
+ }
|
|
|
else if (major == 0)
|
|
else if (major == 0)
|
|
|
- {
|
|
|
|
|
|
|
+ {
|
|
|
major = 1;
|
|
major = 1;
|
|
|
- }
|
|
|
|
|
|
|
+ }
|
|
|
rt_kprintf("Uns upported GENETv%d.%d\n", major, (hw_reg >> 16) & 0x0f);
|
|
rt_kprintf("Uns upported GENETv%d.%d\n", major, (hw_reg >> 16) & 0x0f);
|
|
|
return RT_ERROR;
|
|
return RT_ERROR;
|
|
|
}
|
|
}
|
|
@@ -603,9 +597,9 @@ static rt_err_t bcmgenet_eth_init(rt_device_t device)
|
|
|
LINK_THREAD_STACK_SIZE,
|
|
LINK_THREAD_STACK_SIZE,
|
|
|
LINK_THREAD_PRIORITY, LINK_THREAD_TIMESLICE);
|
|
LINK_THREAD_PRIORITY, LINK_THREAD_TIMESLICE);
|
|
|
if (link_thread_tid != RT_NULL)
|
|
if (link_thread_tid != RT_NULL)
|
|
|
- {
|
|
|
|
|
|
|
+ {
|
|
|
rt_thread_startup(link_thread_tid);
|
|
rt_thread_startup(link_thread_tid);
|
|
|
- }
|
|
|
|
|
|
|
+ }
|
|
|
return RT_EOK;
|
|
return RT_EOK;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -615,13 +609,13 @@ static rt_err_t bcmgenet_eth_control(rt_device_t dev, int cmd, void *args)
|
|
|
{
|
|
{
|
|
|
case NIOCTL_GADDR:
|
|
case NIOCTL_GADDR:
|
|
|
if (args)
|
|
if (args)
|
|
|
- {
|
|
|
|
|
- rt_memcpy(args, eth_dev.dev_addr, 6);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ {
|
|
|
|
|
+ rt_memcpy(args, eth_dev.dev_addr, 6);
|
|
|
|
|
+ }
|
|
|
else
|
|
else
|
|
|
- {
|
|
|
|
|
|
|
+ {
|
|
|
return -RT_ERROR;
|
|
return -RT_ERROR;
|
|
|
- }
|
|
|
|
|
|
|
+ }
|
|
|
break;
|
|
break;
|
|
|
default:
|
|
default:
|
|
|
break;
|
|
break;
|
|
@@ -634,9 +628,8 @@ rt_err_t rt_eth_tx(rt_device_t device, struct pbuf *p)
|
|
|
if (link_flag == 1)
|
|
if (link_flag == 1)
|
|
|
{
|
|
{
|
|
|
bcmgenet_gmac_eth_send((rt_uint32_t)eth_send_no_cache, p->tot_len,p);
|
|
bcmgenet_gmac_eth_send((rt_uint32_t)eth_send_no_cache, p->tot_len,p);
|
|
|
- rt_sem_take(&send_finsh_sem_lock,RT_WAITING_FOREVER);
|
|
|
|
|
|
|
+ rt_sem_take(&send_finsh_sem_lock,RT_WAITING_FOREVER);
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
return RT_EOK;
|
|
return RT_EOK;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -651,8 +644,8 @@ struct pbuf *rt_eth_rx(rt_device_t device)
|
|
|
if (recv_len > 0)
|
|
if (recv_len > 0)
|
|
|
{
|
|
{
|
|
|
pbuf = pbuf_alloc(PBUF_LINK, recv_len, PBUF_RAM);
|
|
pbuf = pbuf_alloc(PBUF_LINK, recv_len, PBUF_RAM);
|
|
|
- if(pbuf)
|
|
|
|
|
- rt_memcpy(pbuf->payload, addr_point, recv_len);
|
|
|
|
|
|
|
+ if(pbuf)
|
|
|
|
|
+ rt_memcpy(pbuf->payload, addr_point, recv_len);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
return pbuf;
|
|
return pbuf;
|