| 95 | } |
| 96 | |
| 97 | void Intel8254x::OnInterrupt(){ |
| 98 | uint32_t status = ReadMem32(I8254_REGISTER_INT_READ); |
| 99 | Log::Info("Net Interrupt, Status: %x", status); |
| 100 | |
| 101 | if(status & 0x4){ |
| 102 | Log::Info("[i8254x] Initializing Link..."); |
| 103 | |
| 104 | WriteMem32(I8254_REGISTER_CTRL, ReadMem32(I8254_REGISTER_CTRL) | CTRL_SLU | CTRL_ASDE); |
| 105 | |
| 106 | UpdateLink(); |
| 107 | } else if(status & 0x80){ |
| 108 | do { |
| 109 | rxTail = ReadMem32(I8254_REGISTER_RDESC_TAIL); |
| 110 | if(rxTail == ReadMem32(I8254_REGISTER_RDESC_HEAD)) return; |
| 111 | rxTail = (rxTail + 1) % RX_DESC_COUNT; |
| 112 | |
| 113 | if(!(rxDescriptors[rxTail].status & 0x1)) break; |
| 114 | |
| 115 | Log::Info("Recieved Packet"); |
| 116 | |
| 117 | rxDescriptors[rxTail].status = 0; |
| 118 | |
| 119 | NetworkPacket pack; |
| 120 | pack.data = kmalloc(rxDescriptors[rxTail].length); |
| 121 | pack.length = rxDescriptors[rxTail].length; |
| 122 | memcpy(pack.data, rxDescriptorsVirt[rxTail], pack.length); |
| 123 | |
| 124 | queue.add_back(pack); |
| 125 | |
| 126 | Log::Info("Ethertype: %x", (*((uint16_t*)pack.data + 12))); |
| 127 | |
| 128 | WriteMem32(I8254_REGISTER_RDESC_TAIL, rxTail); |
| 129 | } while(1); |
| 130 | |
| 131 | for(auto& t : blocker.blocked){ |
| 132 | Scheduler::UnblockThread(t); |
| 133 | } |
| 134 | } |
| 135 | } |
| 136 | |
| 137 | int Intel8254x::GetSpeed(){ |
| 138 | int spd = ReadMem32(I8254_REGISTER_STATUS) & STATUS_SPEED; |
no test coverage detected