diff --git a/src/sys/net/api/tcpip.c b/src/sys/net/api/tcpip.c index d29a8d1..d043faa 100644 --- a/src/sys/net/api/tcpip.c +++ b/src/sys/net/api/tcpip.c @@ -187,20 +187,21 @@ if (msg == NULL) { return ERR_MEM; } -//kprintf("INPKT %i\n", __LINE__); +kprintf("INPKT %i\n", __LINE__); msg->type = TCPIP_MSG_INPKT; msg->msg.inp.p = p; msg->msg.inp.netif = inp; msg->msg.inp.input_fn = input_fn; -//kprintf("%s:%i\n", __FILE__, __LINE__); +kprintf("%s:%i\n", __FILE__, __LINE__); if (sys_mbox_trypost(&mbox, msg) != ERR_OK) { -//kprintf("INPKT %i\n", __LINE__); +kprintf("INPKT %i\n", __LINE__); memp_free(MEMP_TCPIP_MSG_INPKT, msg); -//kprintf("INPKT %i\n", __LINE__); +kprintf("INPKT %i\n", __LINE__); return ERR_MEM; } -//kprintf("INPKT %i\n", __LINE__); +kprintf("INPKT %i\n", __LINE__); + return ERR_OK; #endif /* LWIP_TCPIP_CORE_LOCKING_INPUT */ } diff --git a/src/sys/net/core/mem.c b/src/sys/net/core/mem.c index 7aa3eb9..1736ecf 100644 --- a/src/sys/net/core/mem.c +++ b/src/sys/net/core/mem.c @@ -627,14 +627,17 @@ } /* protect the heap from concurrent access */ -kprintf("SML: [0x%i]"); +kprintf("SML: [0x%i]", __LINE__); sys_mutex_lock(&mem_mutex); +kprintf("SML: [0x%i]", __LINE__); LWIP_MEM_ALLOC_PROTECT(); +kprintf("SML: [0x%i]", __LINE__); #if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT /* run as long as a mem_free disturbed mem_malloc or mem_trim */ do { local_mem_free_count = 0; #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */ +kprintf("SML: [0x%i]", __LINE__); /* Scan through the heap searching for a free block that is big enough, * beginning with the lowest free block. @@ -653,12 +656,15 @@ local_mem_free_count = 1; break; } +kprintf("SML: [0x%i]", __LINE__); #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */ +kprintf("SML: [0x%i]", __LINE__); if ((!mem->used) && (mem->next - (ptr + SIZEOF_STRUCT_MEM)) >= size) { /* mem is not used and at least perfect fit is possible: * mem->next - (ptr + SIZEOF_STRUCT_MEM) gives us the 'user data size' of mem */ +kprintf("SML: [0x%i]", __LINE__); if (mem->next - (ptr + SIZEOF_STRUCT_MEM) >= (size + SIZEOF_STRUCT_MEM + MIN_SIZE_ALIGNED)) { /* (in addition to the above, we test if another struct mem (SIZEOF_STRUCT_MEM) containing @@ -680,6 +686,7 @@ /* and insert it between mem and mem->next */ mem->next = ptr2; mem->used = 1; +kprintf("SML: [0x%i]", __LINE__); if (mem2->next != MEM_SIZE_ALIGNED) { ((struct mem *)(void *)&ram[mem2->next])->prev = ptr2; @@ -693,6 +700,7 @@ * also can't move mem->next directly behind mem, since mem->next * will always be used at this point! */ +kprintf("SML: [0x%i]", __LINE__); mem->used = 1; MEM_STATS_INC_USED(used, mem->next - (mem_size_t)((u8_t *)mem - ram)); } @@ -701,6 +709,7 @@ #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */ if (mem == lfree) { struct mem *cur = lfree; +kprintf("SML: [0x%i]", __LINE__); /* Find next free block after mem and update lowest free pointer */ while (cur->used && cur != ram_end) { #if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT @@ -716,11 +725,14 @@ #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */ cur = (struct mem *)(void *)&ram[cur->next]; } +kprintf("SML: [0x%i]", __LINE__); lfree = cur; LWIP_ASSERT("mem_malloc: !lfree->used", ((lfree == ram_end) || (!lfree->used))); +kprintf("SML: [0x%i]", __LINE__); } LWIP_MEM_ALLOC_UNPROTECT(); sys_mutex_unlock(&mem_mutex); +kprintf("SML: [0x%i]", __LINE__); LWIP_ASSERT("mem_malloc: allocated memory not above ram_end.", (mem_ptr_t)mem + SIZEOF_STRUCT_MEM + size <= (mem_ptr_t)ram_end); LWIP_ASSERT("mem_malloc: allocated memory properly aligned.", @@ -728,9 +740,11 @@ LWIP_ASSERT("mem_malloc: sanity check alignment", (((mem_ptr_t)mem) & (MEM_ALIGNMENT-1)) == 0); +kprintf("SML: [0x%i]", __LINE__); return (u8_t *)mem + SIZEOF_STRUCT_MEM; } } +kprintf("SML: [0x%i]", __LINE__); #if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT /* if we got interrupted by a mem_free, try again */ } while (local_mem_free_count != 0); @@ -738,7 +752,9 @@ LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("mem_malloc: could not allocate %"S16_F" bytes\n", (s16_t)size)); MEM_STATS_INC(err); LWIP_MEM_ALLOC_UNPROTECT(); +kprintf("SML: [0x%i]]\n", __LINE__); sys_mutex_unlock(&mem_mutex); +kprintf("SML: [0x%i]]\n", __LINE__); return NULL; } diff --git a/src/sys/net/net/init.c b/src/sys/net/net/init.c index f60fa5e..3a47c2c 100644 --- a/src/sys/net/net/init.c +++ b/src/sys/net/net/init.c @@ -44,6 +44,8 @@ #include #include +void lnc_thread(); + //void netMainThread(); //static void tcpip_init_done(void *arg); @@ -61,7 +63,8 @@ netif_set_default(&netif); //netif_set_default(netif_add(&ipaddr, &netmask, &gw, ethernetif_init, tcpip_input)); - irqEnable(0x9); + //irqEnable(0x9); + sys_thread_new("lncThread", (void *) lnc_thread, 0x0, 0x1000, 0x0); return(0x0); } @@ -73,7 +76,6 @@ memp_init(); pbuf_init(); - sys_thread_new("mainThread", (void *) (netMainThread), 0x0, 0x1000, 0x0); return (0x0); } diff --git a/src/sys/net/net/sys_arch.c b/src/sys/net/net/sys_arch.c index 8f5cf99..0c3cf39 100644 --- a/src/sys/net/net/sys_arch.c +++ b/src/sys/net/net/sys_arch.c @@ -116,8 +116,9 @@ } void sys_mutex_lock(sys_mutex_t *mutex) { - kprintf("L4"); + kprintf("L4.0"); ubthread_mutex_lock(&(mutex->mutex)) ; + kprintf("L4.1"); } void sys_mutex_unlock(sys_mutex_t *mutex) { @@ -255,7 +256,7 @@ //void sys_thread_new(void (*function)(void), void *arg) { struct sys_thread *new_thread = 0x0; //struct thread_start_param *thread_param; - + prio = 1; LWIP_ASSERT("Non-positive prio", prio > 0); LWIP_ASSERT("Prio is too big", prio < 20); diff --git a/src/sys/pci/lnc.c b/src/sys/pci/lnc.c index e34378f..e09c060 100644 --- a/src/sys/pci/lnc.c +++ b/src/sys/pci/lnc.c @@ -248,55 +248,30 @@ void lnc_INT() { uint16_t csr0 = 0x0; - //irqDisable(9); - //asm("sti"); - - //kprintf("\nINTR\n"); - while ((csr0 = lnc_readCSR32(lnc, CSR0)) & INTR) { +// kprintf("\nINTR\n"); +// while ((csr0 = lnc_readCSR32(lnc, CSR0)) & INTR) { //kprintf("CSR0: [0x%X]\n", csr0); if (csr0 & ERR) { kprintf("Error: [0x%X]\n", csr0); } if (csr0 & RINT) { - lnc_rxINT(); -/* -asm( - " mov $0xA0,%dx \n" - " mov $0x20,%ax \n" - " outb %al,%dx \n" - " mov $0x20,%dx \n" - " mov $0x20,%ax \n" - " outb %al,%dx \n" -); -*/ + asm("nop"); + //lnc_rxINT(); } if (csr0 & TINT) { asm("nop"); //kprintf("TINT"); //lnc_txINT(); -/* -asm( - " mov $0xA0,%dx \n" - " mov $0x20,%ax \n" - " outb %al,%dx \n" - " mov $0x20,%dx \n" - " mov $0x20,%ax \n" - " outb %al,%dx \n" -); -*/ } - lnc_writeCSR32(lnc, CSR0, 0x7940);//csr0); - //kprintf("CSR0.1: [0x%X]\n", lnc_readCSR32(lnc, CSR0)); - } - //irqEnable(9); - kprintf("INT DONE"); + // kprintf("CSR0.1: [0x%X]\n", lnc_readCSR32(lnc, CSR0)); +// } + lnc_writeCSR32(lnc, CSR0, 0x7940);//csr0); +// kprintf("INT DONE"); } -void lnc_rxINT() { +void lnc_thread() { int i = 0; - kprintf("RINT0\n"); - if (tmpBuf == 0x0) { tmpBuf = (struct nicBuffer *)kmalloc(sizeof(struct nicBuffer)); memset(tmpBuf,0x0,sizeof(struct nicBuffer)); @@ -304,7 +279,44 @@ else { memset(tmpBuf,0x0,sizeof(struct nicBuffer)); } - kprintf("RINT1\n"); +kprintf("STARTING THREAD LNC"); + while (1) { + while (lnc_driverOwnsRX(lnc)) { + //uint16_t plen = 0 + (uint16_t)lnc->rxRing[lnc->rxPtr].md[2]; + int plen = (lnc->rxRing[lnc->rxPtr].md[2] & 0x0fff ) - 4; +/* + if (plen > 0) + kprintf("plen.0: [0x%X]", plen); +*/ + + tmpBuf->length = plen; + tmpBuf->buffer = (void *)(lnc->rxBuffer + (lnc->rxPtr * lnc->bufferSize)); //(char *)kmalloc(length); + + // kprintf("RINT2\n"); + //ethernetif_input(netif_default); + //kprintf("RINT3\n"); + //kprintf("RINT-LOOP[%i][0x%X][0x%X]", lnc->rxPtr,lnc->rxRing[lnc->rxPtr].md[1],plen); + lnc->rxRing[lnc->rxPtr].md[1] = 0x80; + //kprintf("RINT-LOOP[%i][0x%X][0x%X]", lnc->rxPtr,lnc->rxRing[lnc->rxPtr].md[1],plen); + lnc_nextRxPtr(lnc); + //kprintf("RINT-LOOP[%i][0x%X][0x%X]\n", lnc->rxPtr,lnc->rxRing[lnc->rxPtr].md[1],plen); + } + kprintf("RINT-DONE[%i][0x%X]\n", lnc->rxPtr,lnc->rxRing[lnc->rxPtr].md[1]); + sched_yield(); + } +} + + +void lnc_rxINT() { + int i = 0; + + if (tmpBuf == 0x0) { + tmpBuf = (struct nicBuffer *)kmalloc(sizeof(struct nicBuffer)); + memset(tmpBuf,0x0,sizeof(struct nicBuffer)); + } + else { + memset(tmpBuf,0x0,sizeof(struct nicBuffer)); + } while (lnc_driverOwnsRX(lnc)) { //uint16_t plen = 0 + (uint16_t)lnc->rxRing[lnc->rxPtr].md[2]; @@ -317,14 +329,17 @@ tmpBuf->length = plen; tmpBuf->buffer = (void *)(lnc->rxBuffer + (lnc->rxPtr * lnc->bufferSize)); //(char *)kmalloc(length); - kprintf("RINT2\n"); - ethernetif_input(netif_default); - kprintf("RINT3\n"); + // kprintf("RINT2\n"); + //ethernetif_input(netif_default); + //kprintf("RINT3\n"); + //kprintf("RINT-LOOP[%i][0x%X][0x%X]", lnc->rxPtr,lnc->rxRing[lnc->rxPtr].md[1],plen); lnc->rxRing[lnc->rxPtr].md[1] = 0x80; + //kprintf("RINT-LOOP[%i][0x%X][0x%X]", lnc->rxPtr,lnc->rxRing[lnc->rxPtr].md[1],plen); lnc_nextRxPtr(lnc); + //kprintf("RINT-LOOP[%i][0x%X][0x%X]\n", lnc->rxPtr,lnc->rxRing[lnc->rxPtr].md[1],plen); } - kprintf("RINT-DONE[%i][0x%X]\n", lnc->rxPtr,lnc->rxRing[lnc->rxPtr].md[1]); -while(1); + // kprintf("RINT-DONE[%i][0x%X]\n", lnc->rxPtr,lnc->rxRing[lnc->rxPtr].md[1]); +//while(1); } @@ -380,7 +395,7 @@ " push %es \n" " push %fs \n" " push %gs \n" - " call lnc_INT \n" + " call lnc_INT \n" " mov $0xA0,%dx \n" " mov $0x20,%ax \n" " outb %al,%dx \n"