RTL8169 — Änderungen 11240 → 11246

Zeile 3: Zeile 3:
 
Der RTL8169 ist neben dem [[RTL8139]] ein weiterer Netzwerkchip der Firma Realtek. Er kann Daten im Bereich von 10/100/1000 Megabits pro Sekunde übertragen. Der Chip RTL8168 ist als PCI-Express-Version nahezu identisch anzusteuern.
 
Der RTL8169 ist neben dem [[RTL8139]] ein weiterer Netzwerkchip der Firma Realtek. Er kann Daten im Bereich von 10/100/1000 Megabits pro Sekunde übertragen. Der Chip RTL8168 ist als PCI-Express-Version nahezu identisch anzusteuern.
  
−
== IO/MMIO ==
+
== Initialisierung ==
−
RTL8168 und RTL8169 unterstützen MMIO. Die Basisadresse kann über die [[PCI]]-BARs ausgelesen werden. Sollten mehrere MMIO-BARs angegeben sein, ist die erste zu nutzen.
 
  
−
== MAC-Adresse herausfinden ==
+
=== PCI ===
−
Die 6 Bytes lange MAC-Adresse des Geräts kann aus den ersten 6 Registern (ausgehend von der o.g. Basisadresse) ausgelesen werden. Folgender Code implementiert dies über die IO-Ports, für MMIO kann analog vorgegangen werden:
+
Die Karte unterstützt die PCI-Funktionen Fast Back-to-Back Transactions sowie Memory Write and Invalidate. Diese können im PCI-Command-Register aktiviert werden. Die RTL8168 kann Message Signaled Interrupts (MSI) unterstützen. Die entsprechenden Informationen stehen dann in der PCI-Capabilities-Liste.
  
−
<c>int i;
+
=== IO/MMIO ===
−
char mac_addr[6];
+
RTL8168 und RTL8169 unterstützen MMIO. Die Basisadresse kann über die [[PCI]]-BARs ausgelesen werden. Sollten mehrere MMIO-BARs angegeben sein, ist die erste zu nutzen. Im Folgenden wird die Karte über IO-Ports angesteuert, für eine Ansteuerung über MMIO kann analog vorgegangen werden.
−
for(i = 0; i < 6; ++i)
+
 
 +
=== MAC-Adresse herausfinden ===
 +
Die 6 Bytes lange MAC-Adresse des Geräts kann aus den ersten 6 Registern (ausgehend von der o.g. Basisadresse) ausgelesen werden:
 +
 
 +
<c>char mac_addr[6];
 +
for(int i = 0; i < 6; ++i)
 
{
 
{
 
     mac_addr[i] = inb(pci_port + i); // Funktion zum Einlesen eines Bytes vom angegebenen Port
 
     mac_addr[i] = inb(pci_port + i); // Funktion zum Einlesen eines Bytes vom angegebenen Port
 
}
 
}
 
</c>
 
</c>
 +
 +
=== Reset ===
 +
Durch das Setzen von Bit 8 im Command-Register (0x37) wird ein Reset der Karte ausgelöst. Der Abschluss des Vorgangs wird von der Karte mit dem Löschen dieses Bits quittiert.
 +
 +
=== Transfer-Deskriptoren ===
 +
Sende- und Empfangsdeskriptoren sind wie folgt definiert:
 +
<c>
 +
typedef struct
 +
{
 +
    uint32_t command;  // command/status dword
 +
    uint32_t vlan;
 +
    uint32_t low_buf;  // low 32-bits of physical buffer address
 +
    uint32_t high_buf; // high 32-bits of physical buffer address
 +
} __attribute__((packed)) RTL8168_Desc;
 +
</c>
 +
 +
Die Deskriptoren sind an 256-Bytes-Grenzen auszurichten und bilden einen Ring, dessen Ende durch das Setzen von Bit 30 des command-Felds indiziert wird. In dieses Feld werden außerdem die Länge des Puffers (Bits 0-15) so wie das OWN-Bit (Bit 31) geschrieben. Die Sende- bzw. Empfangspuffer können maximal 64 KiB groß sein, ihre physische Adresse wird in low_buf und high_buf gespeichert. Die Puffer sind an 8-Bytes-Grenzen auszurichten.
 +
 +
Die Karte verfügt über drei Ringe von je maximal 1024 Deskriptoren, einen Empfangsring, einen Sendering mit normaler und einen Sendering mit hoher Priorität.
 +
  
 
==Weblinks==
 
==Weblinks==