diff --git a/src/sys/isa/ne2k.c b/src/sys/isa/ne2k.c index 35c0c41..a4b85ca 100644 --- a/src/sys/isa/ne2k.c +++ b/src/sys/isa/ne2k.c @@ -37,9 +37,12 @@ #include #include #include +#include #include +static spinLock_t ne2k_spinLock = SPIN_LOCK_INITIALIZER; + static int dp_pkt2user(struct device *dev,int page,int length); static void getblock(struct device *dev,int page,size_t offset,size_t size,void *dst); static int dp_recv(struct device *); @@ -68,7 +71,7 @@ mDev = (struct device *)kmalloc(sizeof(struct device)); mDev->ioAddr = 0x280; mDev->irq = 10; - setVector(&ne2kISR, mVec+10, dPresent + dInt + dDpl3); + setVector(&ne2kISR, mVec+10, dPresent + dInt + dDpl0); irqEnable(10); // kprintf("ne0 - irq: %i, ioAddr: 0x%X MAC: %X:%X:%X:%X:%X:%X\n",dev->irq,dev->ioAddr,dev->net->mac[0] & 0xFF,dev->net->mac[1] & 0xFF,dev->net->mac[2] & 0xFF,dev->net->mac[3] & 0xFF,dev->net->mac[4] & 0xFF,dev->net->mac[5] & 0xFF); @@ -180,12 +183,7 @@ for(i=0;iioAddr + NE_DATAPORT); } - /* - for (i = 0;i<=100;i++) { - if ((inportByte(dev->ioAddr+EN0_ISR) & 0x40) == 0x40) - break; - } - */ + outportByte(dev->ioAddr+EN0_ISR,0x40); return(length); } @@ -193,6 +191,12 @@ void ne2kHandler() { uInt16 isr = 0x0; uInt16 status = 0x0; + + irqDisable(10); + outportByte(mPic, eoi); + outportByte(sPic, eoi); + + asm("sti"); isr = inportByte(mDev->ioAddr + NE_ISR); @@ -208,9 +212,10 @@ } outportByte(mDev->ioAddr + NE_IMR,0x0); outportByte(mDev->ioAddr + NE_IMR,0x0B); + + asm("cli"); + irqEnable(10); - outportByte(mPic, eoi); - outportByte(sPic,eoi); return; } @@ -295,7 +300,7 @@ last = page + (length - 1) / DP_PAGESIZE; if (last >= stopPage) { - kprintf("A"); + kprintf("FOOK STOP PAGE!!!"); } else { tmpBuf = ne2kAllocBuffer(length); @@ -306,11 +311,15 @@ struct nicBuffer *ne2kAllocBuffer(int length) { struct nicBuffer *tmpBuf = 0x0; + + spinLock(&ne2k_spinLock); + if (ne2kBuffer == 0x0) { ne2kBuffer = (struct nicBuffer *)kmalloc(sizeof(struct nicBuffer)); ne2kBuffer->next = 0x0; ne2kBuffer->length = length; ne2kBuffer->buffer = (char *)kmalloc(length); + spinUnlock(&ne2k_spinLock); return(ne2kBuffer); } else { @@ -321,13 +330,19 @@ tmpBuf->next = 0x0; tmpBuf->length = length; tmpBuf->buffer = (char *)kmalloc(length); + spinUnlock(&ne2k_spinLock); return(tmpBuf); } + spinUnlock(&ne2k_spinLock); return(0x0); } struct nicBuffer *ne2kGetBuffer() { struct nicBuffer *tmpBuf = 0x0; + + if (ne2k_spinLock == 0x1) + return(0x0); + tmpBuf = ne2kBuffer; if (ne2kBuffer != 0x0) ne2kBuffer = ne2kBuffer->next; @@ -343,6 +358,9 @@ /*** $Log$ + Revision 1.21 2004/09/11 19:15:37 reddawg + here you go irq 10 io 240 for your ne2k nic + Revision 1.20 2004/09/07 22:26:04 reddawg synced in diff --git a/src/sys/kernel/sched.c b/src/sys/kernel/sched.c index c67a9fe..919a22a 100644 --- a/src/sys/kernel/sched.c +++ b/src/sys/kernel/sched.c @@ -72,7 +72,7 @@ taskList->id = nextID++; /* Print out information on scheduler */ - kprintf("sched0 - Address: [0x%X]\n", taskList); + kprint("sched0 - Address: [0x%X]\n", taskList); /* Return so we know everything went well */ return(0x0); @@ -88,6 +88,7 @@ return; tmpTask = _current->next; + //outportByte(0xE9,_current->id + '0'); schedStart: /* Yield the next task from the current prio queue */ for (;tmpTask != 0x0; tmpTask = tmpTask->next) { @@ -117,7 +118,6 @@ if (_current->state > 0x0) { if (_current->oInfo.v86Task == 0x1) irqDisable(0x0); - asm("cli"); memAddr = (uInt32)&(_current->tss); ubixGDT[4].descriptor.baseLow = (memAddr & 0xFFFF); ubixGDT[4].descriptor.baseMed = ((memAddr >> 16) & 0xFF); @@ -125,7 +125,6 @@ ubixGDT[4].descriptor.access = '\x89'; spinUnlock(&schedulerSpinLock); asm("ljmp $0x20,$0\n"); - asm("sti"); } else { @@ -276,6 +275,9 @@ /*** $Log$ + Revision 1.60 2004/09/11 22:21:11 reddawg + oInfo.cwd is now an array no longer a pointer.. + Revision 1.59 2004/09/11 22:17:52 reddawg hmm.. diff --git a/src/sys/kernel/ubthread.c b/src/sys/kernel/ubthread.c index b648d21..a544337 100644 --- a/src/sys/kernel/ubthread.c +++ b/src/sys/kernel/ubthread.c @@ -116,7 +116,7 @@ int ubthread_cond_wait(ubthread_cond_t *cond, ubthread_mutex_t *mutex) { ubthread_cond_t ubcond = *cond; ubthread_mutex_t ubmutex = *mutex; - while (ubcond->locked == LOCKED); + while (ubcond->locked == LOCKED) sched_yield(); ubmutex->locked = UNLOCKED; return(0x0); } @@ -129,6 +129,9 @@ /*** $Log$ + Revision 1.12 2004/09/07 21:54:38 reddawg + ok reverted back to old scheduling for now.... + Revision 1.11 2004/09/07 20:58:35 reddawg time to roll back i can't think straight by friday