diff options
-rw-r--r-- | core/fs/pxe/isr.c | 3 | ||||
-rw-r--r-- | core/fs/pxe/pxe.c | 12 | ||||
-rw-r--r-- | core/lwip/src/include/lwipopts.h | 1 | ||||
-rw-r--r-- | core/lwip/src/netif/undiif.c | 59 |
4 files changed, 67 insertions, 8 deletions
diff --git a/core/fs/pxe/isr.c b/core/fs/pxe/isr.c index d645de2b..07990615 100644 --- a/core/fs/pxe/isr.c +++ b/core/fs/pxe/isr.c @@ -28,7 +28,8 @@ static void pm_return(void) if (pxe_irq_pending) { pxe_irq_pending = 0; - sem_up(&pxe_receive_thread_sem); + if (pxe_receive_thread_sem.count <= 0) + sem_up(&pxe_receive_thread_sem); } __schedule_lock--; diff --git a/core/fs/pxe/pxe.c b/core/fs/pxe/pxe.c index d655526e..b886ed35 100644 --- a/core/fs/pxe/pxe.c +++ b/core/fs/pxe/pxe.c @@ -6,6 +6,9 @@ #include <minmax.h> #include <sys/cpu.h> #include "pxe.h" +#if 1 +#include "lwip/api.h" +#endif static uint16_t real_base_mem; /* Amount of DOS memory after freeing */ @@ -1057,7 +1060,16 @@ static void network_init(void) if ((DHCPMagic & 1) == 0) DHCPMagic = 0; +#if 1 + extern err_t undi_tcpip_start(struct ip_addr *ipaddr, + struct ip_addr *netmask, + struct ip_addr *gw); + undi_tcpip_start((struct ip_addr *)&IPInfo.myip, + (struct ip_addr *)&IPInfo.netmask, + (struct ip_addr *)&IPInfo.gateway); +#else udp_init(); +#endif } /* diff --git a/core/lwip/src/include/lwipopts.h b/core/lwip/src/include/lwipopts.h index 0c679683..53d26e91 100644 --- a/core/lwip/src/include/lwipopts.h +++ b/core/lwip/src/include/lwipopts.h @@ -2,5 +2,6 @@ #define __LWIPOPTS_H__ #define SYS_LIGHTWEIGHT_PROT 1 +#define LWIP_NETIF_API 1 #endif /* __LWIPOPTS_H__ */ diff --git a/core/lwip/src/netif/undiif.c b/core/lwip/src/netif/undiif.c index 9ff004c9..4bfd48e7 100644 --- a/core/lwip/src/netif/undiif.c +++ b/core/lwip/src/netif/undiif.c @@ -55,9 +55,14 @@ #include <lwip/snmp.h> #include "netif/etharp.h" #include "netif/ppp_oe.h" +#include "lwip/netifapi.h" +#include "lwip/tcpip.h" -#include <syslinux/pxe_api.h> +#include <inttypes.h> #include <string.h> +#include <syslinux/pxe_api.h> +#include <core.h> +#include <dprintf.h> int pxe_call(int, void *); #define PKTBUF_SIZE 2048 @@ -66,7 +71,7 @@ int pxe_call(int, void *); #define IFNAME0 'u' #define IFNAME1 'n' -static struct netif *undi_netif; +static struct netif undi_netif; /** * In this function, the hardware should be initialized. @@ -292,7 +297,7 @@ void undiif_input(t_PXENV_UNDI_ISR *isr) case ETHTYPE_PPPOE: #endif /* PPPOE_SUPPORT */ /* full packet send to tcpip_thread to process */ - if (undi_netif->input(p, undi_netif)!=ERR_OK) + if (undi_netif.input(p, &undi_netif)!=ERR_OK) { LWIP_DEBUGF(NETIF_DEBUG, ("undiif_input: IP input error\n")); pbuf_free(p); p = NULL; @@ -318,18 +323,45 @@ void undiif_input(t_PXENV_UNDI_ISR *isr) * ERR_MEM if private data couldn't be allocated * any other err_t on error */ -err_t -undiif_init(struct netif *netif) +extern uint8_t pxe_irq_vector; +extern void pxe_isr(void); + +/* XXX: move this somewhere sensible */ +static void install_irq_vector(uint8_t irq, void (*isr)(void)) { - LWIP_ASSERT("netif != NULL", (netif != NULL)); + unsigned int vec; + + if (irq < 8) + vec = irq + 0x08; + else if (irq < 16) + vec = (irq - 8) + 0x70; + else + return; /* ERROR */ + + *(uint32_t *)(vec << 2) = (uint32_t)isr; +} - undi_netif = netif; +static err_t +undiif_init(struct netif *netif) +{ + static __lowmem t_PXENV_UNDI_GET_INFORMATION undi_info; + LWIP_ASSERT("netif != NULL", (netif != NULL)); #if LWIP_NETIF_HOSTNAME /* Initialize interface hostname */ netif->hostname = "undi"; #endif /* LWIP_NETIF_HOSTNAME */ + pxe_call(PXENV_UNDI_GET_INFORMATION, &undi_info); + + dprintf("UNDI: baseio %04x int %d MTU %d type %d\n", + undi_info.BaseIo, undi_info.IntNumber, undi_info.MaxTranUnit, + undi_info.HwType); + + /* Install the interrupt vector */ + pxe_irq_vector = undi_info.IntNumber; + install_irq_vector(pxe_irq_vector, pxe_isr); + /* * Initialize the snmp variables and counters inside the struct netif. * The last argument should be replaced with your link speed, in units @@ -352,3 +384,16 @@ undiif_init(struct netif *netif) return ERR_OK; } + +err_t undi_tcpip_start(struct ip_addr *ipaddr, + struct ip_addr *netmask, + struct ip_addr *gw) +{ + // Start the TCP/IP thread & init stuff + tcpip_init(NULL, NULL); + + // This should be done *after* the threading system and receive thread + // have both been started. + return netifapi_netif_add(&undi_netif, ipaddr, netmask, gw, NULL, + undiif_init, ethernet_input); +} |