private Packet MakePacketFromDescriptor(DmaMemory mem, ulong controlBits) { PacketFifo inDevPkts = rxPacketsInDevice.Acquire(); Packet packet = inDevPkts.Pop(); int length = (int)((controlBits & RxDescriptor.LENGTH_MASK) >> RxDescriptor.LENGTH_SHIFT); uint stat_err = (uint)((controlBits & RxDescriptor.ERR_STAT_MASK) >> RxDescriptor.ERR_STAT_SHIFT); // can't deal with fragments yet if ((stat_err & RxErrStatFields.END_OF_PACKET) == 0) { INucleusCalls.DebugPrintHex(40, 0xd0); DebugStub.Print("FRAGMENT\n"); throw new Exception(); } //DebugStub.Assert((stat_err & RxErrStatFields.END_OF_PACKET) != 0); //DebugStub.Assert(packet.GetFragmentVirtualAddress(0) == fragmentVirtAddr); packet.FromDeviceFlags = GetRecvPktFlags(stat_err); packet.SetFragment(0, mem.BytesRef(0, length)); rxPacketsInDevice.Release(inDevPkts); return(packet); }
private Packet MakePacketFromDescriptor(ulong controlBits) { PacketFifo inDevPkts = txPacketsInDevice.Acquire(); Packet packet = inDevPkts.Pop(); // int length = (int) ((controlBits & TxDescriptor.LENGTH_MASK) // >> TxDescriptor.LENGTH_SHIFT); int stat_err = (int)((controlBits & TxDescriptor.ERR_STAT_MASK) >> TxDescriptor.ERR_STAT_SHIFT); //DebugStub.Assert(packet.GetFragmentVirtualAddress(0) == fragmentVirtAddr); if (((TxStatErrFields.LATE_COLLISION | TxStatErrFields.EXCESS_COLLISIONS | TxStatErrFields.TRANSMIT_UNDERRUN) & stat_err) == 0) { packet.FromDeviceFlags = FromDeviceFlags.TransmitSuccess; } else { packet.FromDeviceFlags = FromDeviceFlags.TransmitError; } txPacketsInDevice.Release(inDevPkts); return(packet); }