[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[tyndur-devel] [PATCH] pci: Fix fuer Geraete ohne mehrere Funktionen



! pci: Von Geraeten, die das Bit 7 im Header-Type-Feld nich gesetzt
       haben, duerfen Funktionen nicht abgefragt werden. So wie das bis
       jetzt war, hatte ich 8 rtl8139, die erkannt wurde, was jetzt
       schief geht, da cdi einen IRQ nur noch einmal registrieren
       laesst.

Signed-off-by: Antoine Kaufmann <toni@xxxxxxxxxx>
---
 src/modules/pci/include/pcihw.h |    8 ++++++++
 src/modules/pci/pcihw.c         |   11 +++++++++++
 src/modules/pci/pciscan.c       |    4 ++++
 3 files changed, 23 insertions(+), 0 deletions(-)

diff --git a/src/modules/pci/include/pcihw.h b/src/modules/pci/include/pcihw.h
index f423660..d253c13 100644
--- a/src/modules/pci/include/pcihw.h
+++ b/src/modules/pci/include/pcihw.h
@@ -67,6 +67,14 @@ void pci_request_io_ports(void);
 struct bar* pci_get_bar(dword bus, dword device, dword func, dword bar_number);
 struct pci_device pci_get_device(dword bus, dword device, dword func);
 
+/**
+ * Prueft ob ein PCI-Geraet Funktionen unterstuetzt.
+ *
+ * @param bus Bus-Nummer des Geräts
+ * @param device Gerätenummer des Geräts
+ */
+bool pci_has_functions(dword bus, dword device);
+
 size_t pci_device_size(struct pci_device* device);
 
 extern list_t* pci_devices;
diff --git a/src/modules/pci/pcihw.c b/src/modules/pci/pcihw.c
index 536ad74..be61251 100644
--- a/src/modules/pci/pcihw.c
+++ b/src/modules/pci/pcihw.c
@@ -132,6 +132,17 @@ static void pci_config_write_dword
 }
 
 /**
+ * Prueft ob ein PCI-Geraet Funktionen unterstuetzt.
+ *
+ * @param bus Bus-Nummer des Geräts
+ * @param device Gerätenummer des Geräts
+ */
+bool pci_has_functions(dword bus, dword device)
+{
+    return pci_config_read_dword(bus, device, 0, PCI_HEADERTYPE) & (1 << 7);
+}
+
+/**
  * Liest ein BAR (Base Address Register) eines PCI-Geräts aus.
  *
  * Ein PCI-Gerät kann bis zu sechs BARs besitzen. Jedes BAR enthält die
diff --git a/src/modules/pci/pciscan.c b/src/modules/pci/pciscan.c
index c82aa28..0cf1770 100644
--- a/src/modules/pci/pciscan.c
+++ b/src/modules/pci/pciscan.c
@@ -60,6 +60,10 @@ static void add_device(dword bus, dword device, dword func)
     //dword header_type = 
     //  pci_config_read_dword(bus, device, func, PCI_HEADERTYPE);
 
+    if (func && !pci_has_functions(bus, device)) {
+        return;
+    }
+
     // Prüfen, ob das gewünschte Gerät überhaupt existiert
     // Nicht vorhandene Geräte haben als vendor_id entweder 0x0 oder 0xffff
     if ((pci_device.vendor_id != 0xffff) && pci_device.vendor_id) 
-- 
1.6.0.6