RTL driver changes.

Set size of packet to send.
Initialize RxBuffer.
Packet sending is still VERY unstable.
This commit is contained in:
Scalpel_cp 2008-03-20 18:42:45 +00:00
parent f4c9709932
commit 6d287c9681
6 changed files with 78 additions and 47 deletions

View file

@ -20,9 +20,12 @@ namespace Cosmos.Driver.RTL8139
body = data; body = data;
} }
public byte[] PacketBody() public byte[] PacketBody
{
get
{ {
return body; return body;
}
//return new byte[10]; //TODO: Redo this completely! Hardcoded to some bogus value now. //return new byte[10]; //TODO: Redo this completely! Hardcoded to some bogus value now.
} }
} }

View file

@ -227,16 +227,18 @@ namespace Cosmos.Driver.RTL8139
/// Initialize the Receive Buffer. The RBSTART register consists of 4 bytes (0x30h to 0x33h) which should contain /// Initialize the Receive Buffer. The RBSTART register consists of 4 bytes (0x30h to 0x33h) which should contain
/// the address of a buffer to save incoming data to. /// the address of a buffer to save incoming data to.
/// </summary> /// </summary>
private void InitReceiveBuffer() public void InitReceiveBuffer()
{ {
//TODO: Really unsure of the types and math here...
//char[] rx_buffer = new char[8192+16]; //8k + header
//pciCard.Write8(RTL8139Register.RxBuf, (byte)rx_buffer);
//byte[] rxbuffer = new byte(
//Prepare a buffer area //Prepare a buffer area
byte[] rxbuffer = new byte[2048];
UInt32 address = pciCard.BaseAddress1 + (byte)MainRegister.Bit.RxBuf;
//Write the address of the buffer area to the RBSTART //Write the address of the buffer area to the RBSTART
WriteAddressToPCI(ref rxbuffer, address);
Console.WriteLine("RxBuffer contains address: " + IOSpace.Read32(address));
} }
/// <summary> /// <summary>
@ -245,12 +247,13 @@ namespace Cosmos.Driver.RTL8139
/// </summary> /// </summary>
/// <param name="bytearray"></param> /// <param name="bytearray"></param>
/// <param name="address"></param> /// <param name="address"></param>
private unsafe void WriteBufferToPCI(byte[] bytearray, uint address) private unsafe void WriteAddressToPCI(ref byte[] bytearray, uint address)
{ {
/*fixed (byte* bodystart = &bytearray[0])
{ /* The data in the bytearray contains the actual bytes we want to transfer to the network.
IOSpace.Write32(address, (uint)bodystart); * This bytearray must be in a continous memoryarea on the computer.
} * We then write the address of this memoryarea to the network card.
* The address is stored in the Transmit Start Address which corresponds to the Transmit Status Descriptor we are currently using (0-3).
*/ */
@ -258,7 +261,7 @@ namespace Cosmos.Driver.RTL8139
{ {
IntPtr bodyAddress = (IntPtr)bodystart; IntPtr bodyAddress = (IntPtr)bodystart;
IOSpace.Write32(address, (uint)bodyAddress); IOSpace.Write32(address, (uint)bodyAddress);
Console.WriteLine("Address: + " + (uint)bodyAddress); Console.WriteLine("Address where packet body is stored: " + (uint)bodyAddress);
} }
} }
@ -271,37 +274,27 @@ namespace Cosmos.Driver.RTL8139
//Tell the PCI card the address of body of the Packet. //Tell the PCI card the address of body of the Packet.
UInt32 address = UInt32 address =
pciCard.BaseAddress1 + pciCard.BaseAddress1 +
(byte)MainRegister.Bit.TSD0 + (byte)MainRegister.Bit.TSD0 + //I think this should be TSAD0, but then no packet is sent...
TransmitStatusDescriptor.GetCurrentTSDescriptor(); TransmitStatusDescriptor.GetCurrentTSDescriptor();
byte[] body = packet.PacketBody(); Console.WriteLine("Address of TSAD0: " + address);
Console.WriteLine("Packet to send: "); byte[] body = packet.PacketBody;
foreach (byte item in body)
{
Console.Write(item + ":");
}
Console.WriteLine();
this.WriteBufferToPCI(body, address); WriteAddressToPCI(ref body, address);
Console.WriteLine("Data in TSD0:"); Console.Write("Data in Transmit Status Descriptor " + TransmitStatusDescriptor.GetCurrentTSDescriptor() + ":");
Console.WriteLine(IOSpace.Read32(address)); Console.WriteLine(IOSpace.Read32(address));
//At this point the TSDA0 should contain the address of the data.
//Console.WriteLine("Address of packet: " + (string)(&body[0])); Console.WriteLine("The Data pointed to: " + IOSpace.Read32(IOSpace.Read32(address)));
//Set the transmit status - which enables the transmit. //Set the transmit status - which enables the transmit.
TransmitStatusDescriptor tsd = TransmitStatusDescriptor.Load(pciCard); TransmitStatusDescriptor tsd = TransmitStatusDescriptor.Load(pciCard);
this.SetEarlyTxThreshold(1024); tsd.Size = body.Length;
Console.WriteLine("Told NIC to send " + tsd.Size + " bytes.");
SetEarlyTxThreshold(1024);
Console.WriteLine("Sending..."); Console.WriteLine("Sending...");
tsd.ClearOWNBit(); tsd.ClearOWNBit();
TransmitStatusDescriptor.IncrementTSDescriptor(); TransmitStatusDescriptor.IncrementTSDescriptor();
} }
} }
} }

View file

@ -52,6 +52,25 @@ namespace Cosmos.Driver.RTL8139.Register
IOSpace.Write8(tdsAddress + offset, data); IOSpace.Write8(tdsAddress + offset, data);
} }
/// <summary>
/// The total size in bytes of the data in the descriptor. Must not be longer then 1792 bytes (0x700h), this
/// will set Tx queue invalid.
/// </summary>
public int Size
{
get
{
byte offset = 0;
return (int)IOSpace.Read8(tds + offset);
}
set
{
//TODO: Check this - the register contains 12 bits. We only write 8 bits here.
byte offset = 0;
IOSpace.Write8(tds + offset, (byte)value);
}
}
public UInt32 TSD() public UInt32 TSD()
{ {
return IOSpace.Read32(tdsAddress); return IOSpace.Read32(tdsAddress);

View file

@ -33,7 +33,7 @@ namespace FrodeTest
//Test.SwitchTest.RunTest(); //Test.SwitchTest.RunTest();
Test.RTL8139Test.RunTest(); Test.RTL8139Test.RunTest();
//Test.BinaryHelperTest.RunTest(); //Test.BinaryHelperTest.RunTest();
Test.TransmitStatusDescriptorTest.RunTest(); //Test.TransmitStatusDescriptorTest.RunTest();
//Test.PacketHeaderTest.RunTest(); //Test.PacketHeaderTest.RunTest();
//Test.RAMBusTest.RunTest(); //Test.RAMBusTest.RunTest();
//Test.BoolTest.RunTest(); //Test.BoolTest.RunTest();

View file

@ -30,14 +30,32 @@ namespace FrodeTest.Shell
nic.Enable(); nic.Enable();
Console.WriteLine("Enabled Network card"); Console.WriteLine("Enabled Network card");
} }
else if (command.Equals("timer")) else if (command.Equals("send"))
{ {
Console.WriteLine("NIC TimerCount: " + nic.TimerCount); //Console.WriteLine("NIC TimerCount: " + nic.TimerCount);
//Cosmos.Hardware.PC.Bus.PCIDevice pciNic = Cosmos.Hardware.PC.Bus.PCIBus.GetPCIDevice(0, 3, 0);
Cosmos.Driver.RTL8139.PacketHeader head = new Cosmos.Driver.RTL8139.PacketHeader(0xFF);
byte[] data = FrodeTest.Test.Mock.FakeBroadcastPacket.GetFakePacketAllHigh();
Cosmos.Driver.RTL8139.Packet packet = new Cosmos.Driver.RTL8139.Packet(head, data);
//nic = new Cosmos.Driver.RTL8139.RTL8139(pciNic);
if (nic == null)
{
Console.WriteLine("Enable NIC with command nic first");
return;
}
nic.Enable();
nic.EnableRecieve();
nic.EnableTransmit();
nic.Transmit(packet);
} }
else if (command.Equals("reset")) else if (command.Equals("reset"))
{ {
nic.TimerCount = 1; //nic.TimerCount = 1;
Console.WriteLine("NIC TimerCount: " + nic.TimerCount); nic.SoftReset();
nic.EnableTransmit();
nic.EnableRecieve();
Console.WriteLine("NIC reset");
} }
else else
Console.WriteLine("No such systemcommand or application: " + command); Console.WriteLine("No such systemcommand or application: " + command);

View file

@ -15,7 +15,7 @@ namespace FrodeTest.Test
//Console.WriteLine("PCI Command: " + pciNic.Command); //Console.WriteLine("PCI Command: " + pciNic.Command);
//pciNic.EnableDevice(); //pciNic.EnableDevice();
Console.WriteLine("PCI Command: " + pciNic.Command); //Console.WriteLine("PCI Command: " + pciNic.Command);
if (!pciNic.DeviceExists) if (!pciNic.DeviceExists)
Console.WriteLine("Unable to find PCI device for Network card"); Console.WriteLine("Unable to find PCI device for Network card");
@ -31,18 +31,16 @@ namespace FrodeTest.Test
Console.WriteLine("BaseAddress1 is : " + pciNic.BaseAddress1); Console.WriteLine("BaseAddress1 is : " + pciNic.BaseAddress1);
Console.WriteLine("Enabling card..."); Console.WriteLine("Enabling card...");
nic.Enable(); nic.Enable();
//nic.InitReceiveBuffer();
//nic.SoftReset();
nic.EnableRecieve(); nic.EnableRecieve();
nic.EnableTransmit(); nic.EnableTransmit();
Cosmos.Hardware.PC.Global.Sleep(50); //Cosmos.Hardware.PC.Global.Sleep(50);
Console.WriteLine("Timer: " + nic.TimerCount); //Console.WriteLine("Timer: " + nic.TimerCount);
Cosmos.Driver.RTL8139.PacketHeader head = new Cosmos.Driver.RTL8139.PacketHeader(0x77); Cosmos.Driver.RTL8139.PacketHeader head = new Cosmos.Driver.RTL8139.PacketHeader(0x77);
byte[] data = Mock.FakeBroadcastPacket.GetFakePacket(); byte[] data = Mock.FakeBroadcastPacket.GetFakePacketAllHigh();
Cosmos.Driver.RTL8139.Packet packet = new Cosmos.Driver.RTL8139.Packet(head, data); Cosmos.Driver.RTL8139.Packet packet = new Cosmos.Driver.RTL8139.Packet(head, data);
nic.Transmit(packet); nic.Transmit(packet);
Console.WriteLine("Transmit called");
} }
} }
} }