MCPcopy Create free account
hub / github.com/LemonOSProject/LemonOS / OnInterrupt

Method OnInterrupt

Kernel/src/net/8254x.cpp:97–135  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

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;

Callers 1

InterruptHandlerMethod · 0.45

Calls 5

InfoFunction · 0.85
kmallocFunction · 0.85
memcpyFunction · 0.85
UnblockThreadFunction · 0.85
add_backMethod · 0.45

Tested by

no test coverage detected