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);
+// }
+// }
+//}