Abwärtskompatibilität

Die derzeitige PCI-Unterstützung stand in der Version 2.0 nicht zur Verfügung. Die API war damals deutlich roher, denn sie enthielt nicht die diversen in diesem Kapitel beschriebenen Objekte.

Die sechs Funktionen für den Zugriff auf den Konfigurationsraum erwarteten als Argumente den 16-Bit-PCI-Schlüssel des Geräts anstelle eines Zeigers auf eine struct pci_dev. Außerdem mußten Sie <asm/pcibios.h> einbinden, bevor Sie in den Konfigurationsraum schreiben oder daraus lesen konnten.

Glücklicherweise kann man die Unterschiede leicht abhandeln, und wenn Sie sysdep.h einbinden, dann können Sie die 2.4-Semantik auch beim Kompilieren für 2.0 verwenden. Eine PCI-Unterstützung für Version 2.0 ist in der Header-Datei pci-compat.h enthalten, die automatisch von sysdep.h eingebunden wird, wenn Sie unter 2.0 kompilieren. Die Header-Datei implementiert die wichtigsten Funktionen für die Arbeit mit dem PCI-Bus.

Wenn Sie pci-compat.h verwenden, um Treiber zu schreiben, die mit allen Versionen von 2.0 bis 2.4 funktionieren, dann müssen Sie pci_release_device aufrufen, wenn Sie mit dem pci_dev-Element fertig sind. Dies ist notwendig, weil die von der Header-Datei erzeugten falschen pci_dev-Strukturen mit kmalloc alloziert werden, während die echten Strukturen aus 2.2 und 2.4 statische Ressourcen im Kernel selbst sind. Die zusätzliche Funktion ist in sysdep.h als leer definiert, wenn für 2.2 oder 2.4 kompiliert wird, so daß sie keinen Schaden anrichten kann. Wenn Sie portablen Code in Aktion sehen wollen, sollten Sie einen Blick auf pciregions.c oder pcidata.c werfen.

Ein weiterer wichtiger Unterschied in 2.0 ist die /proc-Unterstützung für PCI. Es gab keine /proc/bus/pci-Hierarchie (und übrigens überhaupt kein /proc/bus), nur eine einzige Datei namens /proc/pci. Diese war mehr für Menschen als Computer gedacht, aber trotzdem nicht besonders lesbar. Unter 2.2 konnte man beim Kompilieren ein “abwärtskompatibles /proc/pci” auswählen, aber in Version 2.4 wurde diese veraltete Datei vollständig entfernt.

Das Konzept der Hot-Plug-PCI-Treiber (und struct pci_driver) wurde in Version 2.4 neu eingeführt. Wir bieten keine abwärtskompatiblen Makros an, um dieses Feature mit älteren Kerneln verwenden zu können.