Example #1
0
        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();
                    }
                }
            }
        }
Example #2
0
 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();
             }
         }
     }
 }