private void ReceiveFrameInner(EthernetFrame frame) { lock (sync) { this.Log(LogLevel.Noisy, "Received packet len {0}", frame.Bytes.Length); if ((registers.Control & (1u << 2)) == 0) { this.Log(LogLevel.Debug, "Receiver not enabled, dropping frame."); return; } if (!registers.IgnoreFCS && !EthernetFrame.CheckCRC(frame.Bytes)) { this.Log(LogLevel.Info, "Invalid CRC, packet discarded"); return; } bool interrupt = false; rxBufferDescriptor rxBD = new rxBufferDescriptor(machine.SystemBus); rxBD.Fetch(registers.RxQueueBaseAddr); if (!rxBD.Ownership)//if we could write data to this BD { interrupt = false; rxBD.Ownership = true; rxBD.StartOfFrame = true; rxBD.EndOfFrame = true; rxBD.Length = (ushort)frame.Bytes.Length; machine.SystemBus.WriteBytes(frame.Bytes, rxBD.BufferAddress); rxBD.WriteBack(); if (rxBD.Wrap) { registers.RxQueueBaseAddr = rxBufferBase; } else { registers.RxQueueBaseAddr += 8; } registers.RxStatus |= 1u << 1; if ((registers.InterruptMask & (1u << 1)) == 0) { registers.InterruptStatus |= 1u << 1; interrupt = true; } if (interrupt) { IRQ.Set(); } } } }
private void ReceiveFrameInner(EthernetFrame frame) { lock(sync) { this.Log(LogLevel.Noisy, "Received packet len {0}", frame.Length); if((registers.Control & (1u << 2)) == 0) { this.Log(LogLevel.Debug, "Receiver not enabled, dropping frame."); return; } bool interrupt = false; rxBufferDescriptor rxBD = new rxBufferDescriptor(machine.SystemBus); rxBD.Fetch(registers.RxQueueBaseAddr); if(!rxBD.Ownership)//if we could write data to this BD { interrupt = false; rxBD.Ownership = true; rxBD.StartOfFrame = true; rxBD.EndOfFrame = true; rxBD.Length = (ushort)frame.Length; machine.SystemBus.WriteBytes(frame.Bytes, rxBD.BufferAddress); rxBD.WriteBack(); if(rxBD.Wrap) { registers.RxQueueBaseAddr = rxBufferBase; } else { registers.RxQueueBaseAddr += 8; } registers.RxStatus |= 1u << 1; if((registers.InterruptMask & (1u << 1)) == 0) { registers.InterruptStatus |= 1u << 1; interrupt = true; } if(interrupt) { IRQ.Set(); } } } }