| 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. | ||
| − | == | + | == Initialisierung == |
| − | |||
| − | == | + | === PCI === |
| − | Die | + | 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> | + | === 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== | ||