From 4ebc8e2c762f19e203fa30efe63cc8139251ee55 Mon Sep 17 00:00:00 2001 From: Scalpel_cp <165da7fc5536ee16440a98f161bfa866a8b94595G55xazV5> Date: Tue, 22 Apr 2008 20:33:47 +0000 Subject: [PATCH] RTL - several Transmit Status Descriptor changes --- .../Network/Devices/RTL8139/RTL8139.cs | 52 ++++++------ .../Register/TransmitStatusDescriptor.cs | 80 ++++++++++--------- .../RTL8139/Register/ValueTypeRegisters.cs | 46 ++++++++++- source/FrodeTest/Shell/Session.cs | 4 +- source/FrodeTest/Test/RTL8139Test.cs | 74 ++++++++--------- 5 files changed, 155 insertions(+), 101 deletions(-) diff --git a/source/Cosmos/Cosmos.Hardware/Network/Devices/RTL8139/RTL8139.cs b/source/Cosmos/Cosmos.Hardware/Network/Devices/RTL8139/RTL8139.cs index 6dc67314f..4dde31d77 100644 --- a/source/Cosmos/Cosmos.Hardware/Network/Devices/RTL8139/RTL8139.cs +++ b/source/Cosmos/Cosmos.Hardware/Network/Devices/RTL8139/RTL8139.cs @@ -4,6 +4,7 @@ using System.Text; using Cosmos.Hardware.Network; using Cosmos.Hardware.PC.Bus; using Cosmos.Hardware; +using Cosmos.Hardware.Extension.NumberSystem; namespace Cosmos.Hardware.Network.Devices.RTL8139 { @@ -312,6 +313,8 @@ namespace Cosmos.Hardware.Network.Devices.RTL8139 Console.WriteLine("Rx Configuration: " + Register.ReceiveConfigurationRegister.Load(mem).ToString()); Console.WriteLine("Tx Configuration: " + Register.TransmitConfigurationRegister.Load(mem).ToString()); Console.WriteLine("Tx Status Descr.: " + Register.TransmitStatusDescriptor.Load(mem).ToString()); + Console.WriteLine("Tx Start Address: " + valueReg.TransmitStartAddress); + Console.WriteLine("Current Descrip.: " + Register.TransmitStatusDescriptor.GetCurrentTSDescriptor()); } @@ -420,31 +423,31 @@ namespace Cosmos.Hardware.Network.Devices.RTL8139 /// Transmits the given Packet /// /// - [Obsolete] - public bool Transmit(Packet packet) - { - if (packet == null) - return false; - //Put the packet into the correct TxBuffer + //[Obsolete] + //public bool Transmit(Packet packet) + //{ + // if (packet == null) + // return false; + // //Put the packet into the correct TxBuffer - //TODO: Do NOT set all registers! This works, but is not efficient! - TxBuffer0 = packet.PacketBody; - TxBuffer1 = packet.PacketBody; - TxBuffer2 = packet.PacketBody; - TxBuffer3 = packet.PacketBody; - WriteAddressToPCI(ref TxBuffer0, pciCard.BaseAddress1 + (byte)Register.MainRegister.Bit.TSAD0); - WriteAddressToPCI(ref TxBuffer1, pciCard.BaseAddress1 + (byte)Register.MainRegister.Bit.TSAD1); - WriteAddressToPCI(ref TxBuffer2, pciCard.BaseAddress1 + (byte)Register.MainRegister.Bit.TSAD2); - WriteAddressToPCI(ref TxBuffer3, pciCard.BaseAddress1 + (byte)Register.MainRegister.Bit.TSAD3); + // //TODO: Do NOT set all registers! This works, but is not efficient! + // TxBuffer0 = packet.PacketBody; + // TxBuffer1 = packet.PacketBody; + // TxBuffer2 = packet.PacketBody; + // TxBuffer3 = packet.PacketBody; + // WriteAddressToPCI(ref TxBuffer0, pciCard.BaseAddress1 + (byte)Register.MainRegister.Bit.TSAD0); + // WriteAddressToPCI(ref TxBuffer1, pciCard.BaseAddress1 + (byte)Register.MainRegister.Bit.TSAD1); + // WriteAddressToPCI(ref TxBuffer2, pciCard.BaseAddress1 + (byte)Register.MainRegister.Bit.TSAD2); + // WriteAddressToPCI(ref TxBuffer3, pciCard.BaseAddress1 + (byte)Register.MainRegister.Bit.TSAD3); - var tsd = Register.TransmitStatusDescriptor.Load(mem); - tsd.Size = packet.PacketBody.Length; - Console.WriteLine("Told NIC to send " + tsd.Size + " bytes."); - tsd.OWN = false; //Begins sending - Register.TransmitStatusDescriptor.IncrementTSDescriptor(); + // var tsd = Register.TransmitStatusDescriptor.Load(mem); + // tsd.Size = packet.PacketBody.Length; + // Console.WriteLine("Told NIC to send " + tsd.Size + " bytes."); + // tsd.OWN = false; //Begins sending + // Register.TransmitStatusDescriptor.IncrementTSDescriptor(); - return true; - } + // return true; + //} public bool TransmitBytes(byte[] aData) { @@ -459,9 +462,12 @@ namespace Cosmos.Hardware.Network.Devices.RTL8139 WriteAddressToPCI(ref TxBuffer3, pciCard.BaseAddress1 + (byte)Register.MainRegister.Bit.TSAD3); var tsd = Register.TransmitStatusDescriptor.Load(mem); + Console.WriteLine("Telling NIC to send " + aData.Length + " bytes."); tsd.Size = aData.Length; - Console.WriteLine("Told NIC to send " + tsd.Size + " bytes."); + Console.WriteLine("TransmitStatusDescriptor contains size of" + tsd.Size + " bytes."); + Console.WriteLine("TDS : " + tsd.ToString()); tsd.OWN = false; //Begins sending + Console.WriteLine("TDS : " + tsd.ToString()); Register.TransmitStatusDescriptor.IncrementTSDescriptor(); return true; diff --git a/source/Cosmos/Cosmos.Hardware/Network/Devices/RTL8139/Register/TransmitStatusDescriptor.cs b/source/Cosmos/Cosmos.Hardware/Network/Devices/RTL8139/Register/TransmitStatusDescriptor.cs index a20809545..c5d64c980 100644 --- a/source/Cosmos/Cosmos.Hardware/Network/Devices/RTL8139/Register/TransmitStatusDescriptor.cs +++ b/source/Cosmos/Cosmos.Hardware/Network/Devices/RTL8139/Register/TransmitStatusDescriptor.cs @@ -17,36 +17,8 @@ namespace Cosmos.Hardware.Network.Devices.RTL8139.Register { #region Constructor -// private PCIDevice pci; -// private UInt32 tsdAddress; - private byte descriptorID = 0; private MemoryAddressSpace xMem; - //public static TransmitStatusDescriptor Load(PCIDevice pciCard) { - // //Retrieve the 32 bits from the PCI card - // //and create a TSD object - // UInt32 address = 0; - // switch (GetCurrentTSDescriptor()) - // { - // case 0: - // address = pciCard.BaseAddress1 + (byte)MainRegister.Bit.TSD0; - // break; - // case 1: - // address = pciCard.BaseAddress1 + (byte)MainRegister.Bit.TSD1; - // break; - // case 2: - // address = pciCard.BaseAddress1 + (byte)MainRegister.Bit.TSD2; - // break; - // case 3: - // address = pciCard.BaseAddress1 + (byte)MainRegister.Bit.TSD3; - // break; - // default: - // Console.WriteLine("Illegal TSDescriptor in RTL driver!"); - // break; - // } - - // return new TransmitStatusDescriptor(pciCard, address); - //} - + public static TransmitStatusDescriptor Load(MemoryAddressSpace aMem) { return new TransmitStatusDescriptor(aMem); @@ -57,12 +29,6 @@ namespace Cosmos.Hardware.Network.Devices.RTL8139.Register xMem = aMem; } - //private TransmitStatusDescriptor(PCIDevice hw, UInt32 adr) - //{ - // pci = hw; - // tsdAddress = adr; - //} - /// /// Used to get the 32 bit value stored in the TransmitStatusDescriptor. /// @@ -70,12 +36,50 @@ namespace Cosmos.Hardware.Network.Devices.RTL8139.Register { get { - //TODO: Use all FOUR Descriptors! - return xMem.Read32((UInt32)Register.MainRegister.Bit.TSD0); + UInt32 address; + switch (GetCurrentTSDescriptor()) + { + case 0: + address = (UInt32)Register.MainRegister.Bit.TSD0; + break; + case 1: + address = (UInt32)Register.MainRegister.Bit.TSD1; + break; + case 2: + address = (UInt32)Register.MainRegister.Bit.TSD2; + break; + case 3: + address = (UInt32)Register.MainRegister.Bit.TSD3; + break; + default: + throw new Exception("Problem with Transmit Status Descriptor"); + + } + + return xMem.Read32(address); } set { - xMem.Write32((UInt32)Register.MainRegister.Bit.TSD0, value); + UInt32 address; + switch (GetCurrentTSDescriptor()) + { + case 0: + address = (UInt32)Register.MainRegister.Bit.TSD0; + break; + case 1: + address = (UInt32)Register.MainRegister.Bit.TSD1; + break; + case 2: + address = (UInt32)Register.MainRegister.Bit.TSD2; + break; + case 3: + address = (UInt32)Register.MainRegister.Bit.TSD3; + break; + default: + throw new Exception("Problem with Transmit Status Descriptor"); + } + + xMem.Write32(address, value); } } diff --git a/source/Cosmos/Cosmos.Hardware/Network/Devices/RTL8139/Register/ValueTypeRegisters.cs b/source/Cosmos/Cosmos.Hardware/Network/Devices/RTL8139/Register/ValueTypeRegisters.cs index 76184d021..ab5f3e7a8 100644 --- a/source/Cosmos/Cosmos.Hardware/Network/Devices/RTL8139/Register/ValueTypeRegisters.cs +++ b/source/Cosmos/Cosmos.Hardware/Network/Devices/RTL8139/Register/ValueTypeRegisters.cs @@ -9,8 +9,8 @@ namespace Cosmos.Hardware.Network.Devices.RTL8139.Register { /// - /// The registers in the RTL 8139 can be divided in two types. The first type is the registers where each bit has - /// a meaning, and it is common to change specific bits. F.instance the CommandRegister where you have a Reset bit. + /// The registers in the RTL 8139 can be divided in two types. The first type are the registers where each bit has + /// a meaning, and where it is common to change specific bits. F.instance the CommandRegister where you have a Reset bit. /// /// The other type of registers are the ones who contain values. Like a 32-bit pointer to an address, or a counter /// of some sort. Here we never set individual bits, but treat the entire 8, 16 or 32 bits as one logical unit. @@ -85,6 +85,48 @@ namespace Cosmos.Hardware.Network.Devices.RTL8139.Register //TSAD + #region Transmit Start Address of Descriptors + + //public static byte CurrentDescriptor + //{ + // get { ;} + // set { ;} + //} + + /// + /// Returns the actual address in the current + /// + public UInt32 TransmitStartAddress + { + get + { + UInt32 address = 0; + switch (Register.TransmitStatusDescriptor.GetCurrentTSDescriptor()) + { + case 0: + address = (UInt32)MainRegister.Bit.TSAD0; + break; + case 1: + address = (UInt32)MainRegister.Bit.TSAD1; + break; + case 2: + address = (UInt32)MainRegister.Bit.TSAD2; + break; + case 3: + address = (UInt32)MainRegister.Bit.TSAD3; + break; + default: + throw new Exception("Illegal Transmit Status Descriptor"); + break; + } + + return xMem.Read32(address); + } + private set { ;} + + } + + #endregion //RBSTART diff --git a/source/FrodeTest/Shell/Session.cs b/source/FrodeTest/Shell/Session.cs index face0eec1..65a6a0dab 100644 --- a/source/FrodeTest/Shell/Session.cs +++ b/source/FrodeTest/Shell/Session.cs @@ -63,7 +63,9 @@ namespace FrodeTest.Shell var head = new PacketHeader(0xFF); byte[] data = FrodeTest.Test.Mock.FakeBroadcastPacket.GetFakePacket(); var packet = new Packet(head, data); - nic.Transmit(packet); + //nic.Transmit(packet); + nic.TransmitBytes(data); //TODO: Wrap data in physical packet with header. + //nic.TransmitBytes(data); } } else if (command.Equals("read")) diff --git a/source/FrodeTest/Test/RTL8139Test.cs b/source/FrodeTest/Test/RTL8139Test.cs index faf2c914d..9336927e8 100644 --- a/source/FrodeTest/Test/RTL8139Test.cs +++ b/source/FrodeTest/Test/RTL8139Test.cs @@ -1,43 +1,43 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Cosmos.Hardware.Network.Devices.RTL8139; +//using System; +//using System.Collections.Generic; +//using System.Text; +//using Cosmos.Hardware.Network.Devices.RTL8139; -namespace FrodeTest.Test -{ - public class RTL8139Test - { - [Obsolete] - public static void RunTest() - { - // Testing RTL8139 PCI networkcard - //Load card - var nics = RTL8139.FindAll(); +//namespace FrodeTest.Test +//{ +// public class RTL8139Test +// { +// [Obsolete] +// public static void RunTest() +// { +// // Testing RTL8139 PCI networkcard +// //Load card +// var nics = RTL8139.FindAll(); - if (nics.Count == 0) - { - Console.WriteLine("No Realtek 8139 network card found!!"); - return; - } +// if (nics.Count == 0) +// { +// Console.WriteLine("No Realtek 8139 network card found!!"); +// return; +// } - Console.WriteLine(nics.Count + " network cards found"); - var nic = (RTL8139)nics[0]; +// Console.WriteLine(nics.Count + " network cards found"); +// var nic = (RTL8139)nics[0]; - Console.WriteLine("Network card: " + nic.Name); - Console.WriteLine("HW Revision: " + nic.HardwareRevision); - Console.WriteLine("MAC address: " + nic.MACAddress.ToString()); +// Console.WriteLine("Network card: " + nic.Name); +// Console.WriteLine("HW Revision: " + nic.HardwareRevision); +// Console.WriteLine("MAC address: " + nic.MACAddress.ToString()); - //Console.WriteLine("BaseAddress0 is : " + pciNic.BaseAddress0); - Console.WriteLine("BaseAddress1 is : " + nic.PCICard.BaseAddress1); - Console.WriteLine("Enabling card..."); - nic.Enable(); - Console.WriteLine("Initializing driver..."); - nic.InitializeDriver(); +// //Console.WriteLine("BaseAddress0 is : " + pciNic.BaseAddress0); +// Console.WriteLine("BaseAddress1 is : " + nic.PCICard.BaseAddress1); +// Console.WriteLine("Enabling card..."); +// nic.Enable(); +// Console.WriteLine("Initializing driver..."); +// nic.InitializeDriver(); - var head = new PacketHeader(0xFF); - byte[] data = Mock.FakeBroadcastPacket.GetFakePacketAllHigh(); - var packet = new Packet(head, data); - nic.Transmit(packet); - } - } -} +// var head = new PacketHeader(0xFF); +// byte[] data = Mock.FakeBroadcastPacket.GetFakePacketAllHigh(); +// var packet = new Packet(head, data); +// nic.Transmit(packet); +// } +// } +//}