private void ReceiveFrameInner(EthernetFrame frame) { if ((registers.Control & (1u << 1)) == 0) { //if receiving is disabled discard packet return; } var rd = new receiveDescriptor(machine.SystemBus); if (!EthernetFrame.CheckCRC(frame.Bytes)) { rd.CRCError = true; this.Log(LogLevel.Info, "Invalid CRC, packet discarded"); return; } rd.Fetch(receiveDescriptorBase | receiveDescriptorOffset); if (!rd.Enable) { //if receive descritptor disabled discard packet return; } machine.SystemBus.WriteBytes(frame.Bytes, (long)rd.PacketAddress); registers.Status = 1u << 2; if (rd.Wrap) { receiveDescriptorOffset = 0; } else { if (receiveDescriptorOffset != 0x3f8) { receiveDescriptorOffset += 8; } else { receiveDescriptorOffset = 0; } } if (rd.InterruptEnable && ((registers.Control & (1u << 3)) != 0)) { registers.Status |= 1u << 2; this.IRQ.Set(); this.IRQ.Unset(); } rd.Length = (uint)frame.Bytes.Length; rd.Enable = false; rd.Wrap = false; rd.WriteBack(); }
private void ReceiveFrameInner(EthernetFrame frame) { if((registers.Control & (1u << 1)) == 0) { //if receiving is disabled discard packet return; } var rd = new receiveDescriptor(machine.SystemBus); rd.Fetch(receiveDescriptorBase | receiveDescriptorOffset); if(!rd.Enable) { //if receive descritptor disabled discard packet return; } machine.SystemBus.WriteBytes(frame.Bytes, (long)rd.PacketAddress); registers.Status = 1u << 2; if(rd.Wrap) { receiveDescriptorOffset = 0; } else { if(receiveDescriptorOffset != 0x3f8) { receiveDescriptorOffset += 8; } else { receiveDescriptorOffset = 0; } } if(rd.InterruptEnable && ((registers.Control & (1u << 3)) != 0)) { registers.Status |= 1u << 2; this.IRQ.Set(); this.IRQ.Unset(); } rd.Length = (uint)frame.Length; rd.Enable = false; rd.Wrap = false; rd.WriteBack(); }