+ sys-bus-pci-drivers-driver-new_id-search-dynamics-ids-first.patch added to -mm tree

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

 



The patch titled
     /sys/bus/pci/drivers/<driver>/new_id: search dynamics ids first
has been added to the -mm tree.  Its filename is
     sys-bus-pci-drivers-driver-new_id-search-dynamics-ids-first.patch

See http://www.zip.com.au/~akpm/linux/patches/stuff/added-to-mm.txt to find
out what to do about this

------------------------------------------------------
Subject: /sys/bus/pci/drivers/<driver>/new_id: search dynamics ids first
From: Russell King <rmk+lkml@xxxxxxxxxxxxxxxx>

Unfortunately, the .../new_id feature does not work with the 8250_pci
driver.

The reason for this comes down to the way .../new_id is implemented.  When
PCI tries to match a driver to a device, it checks the modules static
device ID tables _before_ checking the dynamic new_id tables.

When a driver is capable of matching by ID, and falls back to matching by
class (as 8250_pci does), this makes it absolutely impossible to specify a
board by ID, and as such the correct driver_data value to use with it.

Let's say you have a serial board with vendor 0x1234 and device 0x5678. 
It's class is set to PCI_CLASS_COMMUNICATION_SERIAL.

On boot, this card is matched to the 8250_pci driver, which tries to probe
it because it matched using the class entry.  The driver finds that it is
unable to automatically detect the correct settings to use, so it returns
-ENODEV.

You know that the information the driver needs is to match this card using
a device_data value of '7'.  So you echo 1234 5678 0 0 0 0 7 into new_id.

The kernel attempts to re-bind 8250_pci to this device.  However, because
it scans the PCI driver tables, it _again_ matches the class entry which
has the wrong device_data.  It fails.

End of story.  You can't support the card without rebuilding the kernel (or
writing a specific PCI probe module to support it.)

So, can we make new_id override the driver-internal PCI ID tables?
IOW, like this:

Cc: Greg KH <greg@xxxxxxxxx>
Signed-off-by: Andrew Morton <akpm@xxxxxxxx>
---

 drivers/pci/pci-driver.c |    7 ++-----
 1 files changed, 2 insertions(+), 5 deletions(-)

diff -puN drivers/pci/pci-driver.c~sys-bus-pci-drivers-driver-new_id-search-dynamics-ids-first drivers/pci/pci-driver.c
--- a/drivers/pci/pci-driver.c~sys-bus-pci-drivers-driver-new_id-search-dynamics-ids-first
+++ a/drivers/pci/pci-driver.c
@@ -165,10 +165,6 @@ const struct pci_device_id *pci_match_de
 	const struct pci_device_id *id;
 	struct pci_dynid *dynid;
 
-	id = pci_match_id(drv->id_table, dev);
-	if (id)
-		return id;
-
 	/* static ids didn't match, lets look at the dynamic ones */
 	spin_lock(&drv->dynids.lock);
 	list_for_each_entry(dynid, &drv->dynids.list, node) {
@@ -178,7 +174,8 @@ const struct pci_device_id *pci_match_de
 		}
 	}
 	spin_unlock(&drv->dynids.lock);
-	return NULL;
+
+	return pci_match_id(drv->id_table, dev);
 }
 
 static int pci_call_probe(struct pci_driver *drv, struct pci_dev *dev,
_

Patches currently in -mm which might be from rmk+lkml@xxxxxxxxxxxxxxxx are

sys-bus-pci-drivers-driver-new_id-search-dynamics-ids-first.patch

-
To unsubscribe from this list: send the line "unsubscribe mm-commits" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Kernel Newbies FAQ]     [Kernel Archive]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [Bugtraq]     [Photo]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]

  Powered by Linux