forked from M-Labs/artiq
lwip/liteethif: cleanup, drop frames above MTU (#398)
This commit is contained in:
parent
d365ce8de8
commit
18b6718d0c
|
@ -15,9 +15,6 @@
|
||||||
#include <hw/flags.h>
|
#include <hw/flags.h>
|
||||||
#include <hw/ethmac_mem.h>
|
#include <hw/ethmac_mem.h>
|
||||||
|
|
||||||
static unsigned int rxslot;
|
|
||||||
static unsigned int rxlen;
|
|
||||||
static char *rxbuffer;
|
|
||||||
static char *rxbuffer0;
|
static char *rxbuffer0;
|
||||||
static char *rxbuffer1;
|
static char *rxbuffer1;
|
||||||
static unsigned int txslot;
|
static unsigned int txslot;
|
||||||
|
@ -29,31 +26,6 @@ static char *txbuffer1;
|
||||||
#define IFNAME0 'e'
|
#define IFNAME0 'e'
|
||||||
#define IFNAME1 't'
|
#define IFNAME1 't'
|
||||||
|
|
||||||
static void liteeth_low_level_init(struct netif *netif)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
netif->hwaddr_len = 6;
|
|
||||||
for(i=0;i<netif->hwaddr_len;i++)
|
|
||||||
netif->hwaddr[i] = macadr[i];
|
|
||||||
netif->mtu = 1514;
|
|
||||||
netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP;
|
|
||||||
|
|
||||||
ethmac_sram_reader_ev_pending_write(ETHMAC_EV_SRAM_READER);
|
|
||||||
ethmac_sram_writer_ev_pending_write(ETHMAC_EV_SRAM_WRITER);
|
|
||||||
|
|
||||||
rxbuffer0 = (char *)ETHMAC_RX0_BASE;
|
|
||||||
rxbuffer1 = (char *)ETHMAC_RX1_BASE;
|
|
||||||
txbuffer0 = (char *)ETHMAC_TX0_BASE;
|
|
||||||
txbuffer1 = (char *)ETHMAC_TX1_BASE;
|
|
||||||
|
|
||||||
rxslot = 0;
|
|
||||||
txslot = 0;
|
|
||||||
|
|
||||||
rxbuffer = rxbuffer0;
|
|
||||||
txbuffer = txbuffer0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static err_t liteeth_low_level_output(struct netif *netif, struct pbuf *p)
|
static err_t liteeth_low_level_output(struct netif *netif, struct pbuf *p)
|
||||||
{
|
{
|
||||||
struct pbuf *q;
|
struct pbuf *q;
|
||||||
|
@ -86,26 +58,36 @@ static err_t liteeth_low_level_output(struct netif *netif, struct pbuf *p)
|
||||||
|
|
||||||
static struct pbuf *liteeth_low_level_input(struct netif *netif)
|
static struct pbuf *liteeth_low_level_input(struct netif *netif)
|
||||||
{
|
{
|
||||||
|
unsigned int rxslot;
|
||||||
|
unsigned int rxlen;
|
||||||
|
char *rxbuffer;
|
||||||
struct pbuf *p, *q;
|
struct pbuf *p, *q;
|
||||||
|
|
||||||
rxslot = ethmac_sram_writer_slot_read();
|
p = NULL;
|
||||||
rxlen = ethmac_sram_writer_length_read();
|
|
||||||
if(rxslot)
|
|
||||||
rxbuffer = rxbuffer1;
|
|
||||||
else
|
|
||||||
rxbuffer = rxbuffer0;
|
|
||||||
|
|
||||||
p = pbuf_alloc(PBUF_RAW, rxlen, PBUF_POOL);
|
if(ethmac_sram_writer_ev_pending_read() & ETHMAC_EV_SRAM_WRITER) {
|
||||||
q = p;
|
rxslot = ethmac_sram_writer_slot_read();
|
||||||
while(q) {
|
rxlen = ethmac_sram_writer_length_read();
|
||||||
memcpy(q->payload, rxbuffer, q->len);
|
/* dest MAC + source MAC + 802.1Q + ethertype + payload (MTU) */
|
||||||
rxbuffer += q->len;
|
if(rxlen <= (netif->mtu + 18)) {
|
||||||
if(q->tot_len != q->len)
|
if(rxslot)
|
||||||
q = q->next;
|
rxbuffer = rxbuffer1;
|
||||||
else
|
else
|
||||||
q = NULL;
|
rxbuffer = rxbuffer0;
|
||||||
|
|
||||||
|
p = pbuf_alloc(PBUF_RAW, rxlen, PBUF_POOL);
|
||||||
|
q = p;
|
||||||
|
while(q) {
|
||||||
|
memcpy(q->payload, rxbuffer, q->len);
|
||||||
|
rxbuffer += q->len;
|
||||||
|
if(q->tot_len != q->len)
|
||||||
|
q = q->next;
|
||||||
|
else
|
||||||
|
q = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ethmac_sram_writer_ev_pending_write(ETHMAC_EV_SRAM_WRITER);
|
||||||
}
|
}
|
||||||
|
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -119,23 +101,28 @@ void liteeth_input(struct netif *netif)
|
||||||
|
|
||||||
err_t liteeth_init(struct netif *netif)
|
err_t liteeth_init(struct netif *netif)
|
||||||
{
|
{
|
||||||
struct liteethif *liteethif;
|
int i;
|
||||||
|
|
||||||
liteethif = mem_malloc(sizeof(struct liteethif));
|
|
||||||
if(liteethif == NULL)
|
|
||||||
return ERR_MEM;
|
|
||||||
netif->state = liteethif;
|
|
||||||
|
|
||||||
netif->hwaddr_len = 6;
|
netif->hwaddr_len = 6;
|
||||||
|
for(i=0;i<netif->hwaddr_len;i++)
|
||||||
|
netif->hwaddr[i] = macadr[i];
|
||||||
netif->name[0] = IFNAME0;
|
netif->name[0] = IFNAME0;
|
||||||
netif->name[1] = IFNAME1;
|
netif->name[1] = IFNAME1;
|
||||||
netif->output = etharp_output;
|
netif->output = etharp_output;
|
||||||
netif->linkoutput = liteeth_low_level_output;
|
netif->linkoutput = liteeth_low_level_output;
|
||||||
netif->mtu = 1514;
|
netif->mtu = 1500;
|
||||||
|
netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP;
|
||||||
|
|
||||||
liteethif->ethaddr = (struct eth_addr *)&(netif->hwaddr[0]);
|
ethmac_sram_reader_ev_pending_write(ETHMAC_EV_SRAM_READER);
|
||||||
|
ethmac_sram_writer_ev_pending_write(ETHMAC_EV_SRAM_WRITER);
|
||||||
|
|
||||||
liteeth_low_level_init(netif);
|
rxbuffer0 = (char *)ETHMAC_RX0_BASE;
|
||||||
|
rxbuffer1 = (char *)ETHMAC_RX1_BASE;
|
||||||
|
txbuffer0 = (char *)ETHMAC_TX0_BASE;
|
||||||
|
txbuffer1 = (char *)ETHMAC_TX1_BASE;
|
||||||
|
|
||||||
|
txslot = 0;
|
||||||
|
txbuffer = txbuffer0;
|
||||||
|
|
||||||
return ERR_OK;
|
return ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,10 +7,6 @@
|
||||||
|
|
||||||
extern unsigned char macadr[];
|
extern unsigned char macadr[];
|
||||||
|
|
||||||
struct liteethif {
|
|
||||||
struct eth_addr *ethaddr;
|
|
||||||
};
|
|
||||||
|
|
||||||
void liteeth_input(struct netif *netif);
|
void liteeth_input(struct netif *netif);
|
||||||
err_t liteeth_init(struct netif *netif);
|
err_t liteeth_init(struct netif *netif);
|
||||||
|
|
||||||
|
|
|
@ -56,10 +56,7 @@ static void lwip_service(void)
|
||||||
{
|
{
|
||||||
sys_check_timeouts();
|
sys_check_timeouts();
|
||||||
#ifdef CSR_ETHMAC_BASE
|
#ifdef CSR_ETHMAC_BASE
|
||||||
if(ethmac_sram_writer_ev_pending_read() & ETHMAC_EV_SRAM_WRITER) {
|
liteeth_input(&netif);
|
||||||
liteeth_input(&netif);
|
|
||||||
ethmac_sram_writer_ev_pending_write(ETHMAC_EV_SRAM_WRITER);
|
|
||||||
}
|
|
||||||
#else
|
#else
|
||||||
if(uart_read_nonblock()) {
|
if(uart_read_nonblock()) {
|
||||||
u8_t c;
|
u8_t c;
|
||||||
|
|
Loading…
Reference in New Issue