* [PATCH] Adds kernel parameter to ignore pci devices
[not found] <8b96e3d20609191447x77e284b1j904e4106942e040e@mail.gmail.com>
@ 2006-09-19 22:18 ` Luiz Angelo Daros de Luca
2006-09-20 0:01 ` Alan Cox
0 siblings, 1 reply; 7+ messages in thread
From: Luiz Angelo Daros de Luca @ 2006-09-19 22:18 UTC (permalink / raw)
To: linux-kernel; +Cc: torvalds
Hello,
Some time ago, I went to freenode IRC trying to solve a hardware
imcompatible problem in Linux. I have an old computer
(k6-200Mhz/chipset sis) and a USB 1.x and 2.0 expansion PCI Card
(LG/chipset sis). Usb 1.x works fine but if usb 2.0 (ehci) is set up,
the system freezes. This happens in Linux and win98. In windows I
managed to solve this simply disabling the device. But in Linux, I
can't do that, just disabling all pci with pci=off. I tried reserve=
stuff with no luck. As the help from the friends in IRC wasn't enough,
I decided to do it my self.
This is my first patch and so must have lots of problems. I think
I must also write a description for
Documentation/kernel-parameters.txt. I'm not sure about the "flag" in
dev struct to tell that it is to be ignored. Null can't be used as the
multifunction is detected by the current device. So, I assumed that
devices with bus==null are ignored. The only alternative that I though
to not use this hack is spliting and join some other functions.
Please, feed back me. BTW, this patch really solved my problem. lspci
doesn't show the device and so all the OS. Just scanpci was able to
list the ignored device.
Please, CC to my personal email as I'm not in kernel mail list.
Luiz Andelo Daros de Luca,
This patchs adds ignore_pci= parameter to disable a pci device as
windows control panel does. This solves some hardware incompatibily in
old computers that freezes the kernel just after the device gets
configured by pci driver.
Signed-off-by: Luiz Angelo Daros de Luca <luizluca@gmail.com>
---
--- linux-2.6.16.13-4/drivers/pci/probe.c.orig 2006-09-19
19:07:39.000000000 -0300
+++ linux-2.6.16.13-4/drivers/pci/probe.c 2006-09-19 19:09:21.000000000 -0300
@@ -753,6 +753,94 @@ static void pci_release_bus_bridge_dev(s
}
/*
+ * Max ignored devices
+ */
+#define MAX_IGNORED_DEVICES 10
+/*
+ * Vector with device/vendor numbers as (device<<16|vendor)
+ */
+static u32 ignore_device[MAX_IGNORED_DEVICES+1];
+
+/*
+ * Loops ignore_device checking if vendor_device matches one of the
+ * ignore_device[] elements.
+ */
+static inline u8 device_shouldbe_ignored(u32 vendor_device) {
+ u32 *device_ignored = ignore_device; //read static
+ u32 cur_ignored_device;
+
+ while ((cur_ignored_device=device_ignored[0])) {
+ if (vendor_device==cur_ignored_device)
+ return 1;
+ device_ignored++;
+ }
+ return 0;
+}
+
+/*
+ * Reads the kernel parameter ignore_device= and save
+ * the values in vector ignore_device
+ */
+static int __init ignore_device_setup (char *str)
+{
+ static int ignore_device_ptr;//=0
+ int id=0;
+
+ int vendor=0;
+ int device=0;
+
+ while (str && str[0]) {
+ /* Interpret first parameter as number */
+ if (!get_option (&str, &id)) {
+ printk(KERN_WARNING
+ "Warning: ignore_device parameter '%s' should be a number\n",
+ str);
+ return 0;
+ }
+
+ if (!vendor) {
+ vendor=id;
+ /* Check for device syntax */
+ if (str[0]==':') {
+ str++;
+ continue;
+ } else
+ break;
+ } else {
+ device=id;
+ /* Check for next entry */
+ if (str[0] == ',')
+ str++;
+ }
+
+ if (ignore_device_ptr < MAX_IGNORED_DEVICES) {
+ /* Save the ignored device information */
+ ignore_device[ignore_device_ptr++]=device<<16 | vendor;
+ /* Warns it */
+ printk(KERN_WARNING "Device %04X:%04X will be ignored\n",
+ vendor, device);
+ /* Reset vendor and device */
+ vendor=0;
+ device=0;
+ } else {
+ printk(KERN_WARNING
+ "Too many ignored devices. %04X:%04X will NOT be ignored\n",
+ vendor, device);
+ return 0;
+ }
+ }
+
+ if (vendor) {
+ printk(KERN_WARNING
+ "IGNORE_DEVICE: Invalid vendor:device parameter. Ignoring %d\n",
+ vendor);
+ return 0;
+ }
+
+ return 1;
+}
+
+/*
* Read the config data for a PCI device, sanity-check it
* and fill in the dev structure...
*/
@@ -805,6 +893,17 @@ pci_scan_device(struct pci_bus *bus, int
dev->multifunction = !!(hdr_type & 0x80);
dev->vendor = l & 0xffff;
dev->device = (l >> 16) & 0xffff;
+ /* Mark as ignored(dev->bus=NULL) and return. Do not allow any
+ further setups as some broken devices freezes the computer here.
+ It must return a dev to keep pci_scan_slot scanning for other
+ devices (dev->multifunction). */
+ if (device_shouldbe_ignored(l)) {
+ printk(KERN_WARNING
+ "PCI_IGNORE: Device %04X:%04X ignored as requested\n",
+ dev->vendor,dev->device);
+ dev->bus=NULL;
+ return dev;
+ }
dev->cfg_size = pci_cfg_space_size(dev);
/* Assume 32-bit PCI; let 64-bit PCI cards (which are far rarer)
@@ -849,8 +948,11 @@ pci_scan_single_device(struct pci_bus *b
if (!dev)
return NULL;
- pci_device_add(dev, bus);
- pci_scan_msi_device(dev);
+ /* Devices with dev->bus==NULL where set to be ignored by pci_scan_device. */
+ if (dev->bus) {
+ pci_device_add(dev, bus);
+ pci_scan_msi_device(dev);
+ }
return dev;
}
@@ -1036,6 +1138,8 @@ struct pci_bus * __devinit pci_scan_bus_
}
EXPORT_SYMBOL(pci_scan_bus_parented);
+__setup("ignore_device=", ignore_device_setup);
+
#ifdef CONFIG_HOTPLUG
EXPORT_SYMBOL(pci_add_new_bus);
EXPORT_SYMBOL(pci_do_scan_bus);
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] Adds kernel parameter to ignore pci devices
2006-09-19 22:18 ` [PATCH] Adds kernel parameter to ignore pci devices Luiz Angelo Daros de Luca
@ 2006-09-20 0:01 ` Alan Cox
2006-09-20 6:41 ` Jarek Poplawski
0 siblings, 1 reply; 7+ messages in thread
From: Alan Cox @ 2006-09-20 0:01 UTC (permalink / raw)
To: Luiz Angelo Daros de Luca; +Cc: linux-kernel, torvalds
Not sure its the way I'd approach it - in your specific case it should
be easier to just not compile in EHCI (USB 2.0) support.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] Adds kernel parameter to ignore pci devices
2006-09-20 0:01 ` Alan Cox
@ 2006-09-20 6:41 ` Jarek Poplawski
2006-09-20 10:38 ` Alan Cox
0 siblings, 1 reply; 7+ messages in thread
From: Jarek Poplawski @ 2006-09-20 6:41 UTC (permalink / raw)
To: Alan Cox; +Cc: linux-kernel, torvalds, luizluca
On 20-09-2006 02:01, Alan Cox wrote:
> Not sure its the way I'd approach it - in your specific case it should
> be easier to just not compile in EHCI (USB 2.0) support.
I'd dare to vote for this idea: it's good for testing
and very practical eg. for comparing performance of similar
devices like network or sound cards. Besides: ehci could
work for other devices.
Best regards,
Jarek P.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] Adds kernel parameter to ignore pci devices
2006-09-20 6:41 ` Jarek Poplawski
@ 2006-09-20 10:38 ` Alan Cox
2006-09-20 11:25 ` Jarek Poplawski
0 siblings, 1 reply; 7+ messages in thread
From: Alan Cox @ 2006-09-20 10:38 UTC (permalink / raw)
To: Jarek Poplawski; +Cc: linux-kernel, torvalds, luizluca
Ar Mer, 2006-09-20 am 08:41 +0200, ysgrifennodd Jarek Poplawski:
> On 20-09-2006 02:01, Alan Cox wrote:
> > Not sure its the way I'd approach it - in your specific case it should
> > be easier to just not compile in EHCI (USB 2.0) support.
>
> I'd dare to vote for this idea: it's good for testing
> and very practical eg. for comparing performance of similar
> devices like network or sound cards. Besides: ehci could
> work for other devices.
In which case you'd need to specify the device to ignore by its PCI bus
address so could ignore one device but not another of the same type. Eg
pci=ignore=0:4.5
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] Adds kernel parameter to ignore pci devices
2006-09-20 10:38 ` Alan Cox
@ 2006-09-20 11:25 ` Jarek Poplawski
2006-09-20 16:51 ` Luiz Angelo Daros de Luca
0 siblings, 1 reply; 7+ messages in thread
From: Jarek Poplawski @ 2006-09-20 11:25 UTC (permalink / raw)
To: Alan Cox; +Cc: linux-kernel, torvalds, luizluca
On Wed, Sep 20, 2006 at 11:38:53AM +0100, Alan Cox wrote:
> Ar Mer, 2006-09-20 am 08:41 +0200, ysgrifennodd Jarek Poplawski:
> > On 20-09-2006 02:01, Alan Cox wrote:
> > > Not sure its the way I'd approach it - in your specific case it should
> > > be easier to just not compile in EHCI (USB 2.0) support.
> >
> > I'd dare to vote for this idea: it's good for testing
> > and very practical eg. for comparing performance of similar
> > devices like network or sound cards. Besides: ehci could
> > work for other devices.
>
> In which case you'd need to specify the device to ignore by its PCI bus
> address so could ignore one device but not another of the same type. Eg
> pci=ignore=0:4.5
If I correctly understand this as a doubt I mean doing this in grub
or lilo as boot variants.
Jarek P.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] Adds kernel parameter to ignore pci devices
2006-09-20 11:25 ` Jarek Poplawski
@ 2006-09-20 16:51 ` Luiz Angelo Daros de Luca
2006-09-20 17:27 ` Alan Cox
0 siblings, 1 reply; 7+ messages in thread
From: Luiz Angelo Daros de Luca @ 2006-09-20 16:51 UTC (permalink / raw)
To: Jarek Poplawski; +Cc: Alan Cox, linux-kernel, torvalds
Allan, disabling EHCI in kernel won't solve it cause the kernel
freezes when linux is setting up pci. This is before any device
specific driver and it is done even without any driver for that
device.
I was going to implement a way to ignore using bus+board+function but
not at this time. BTW, are the parameters name, format and debug
messages adequated to kernel's principels?
2006/9/20, Jarek Poplawski <jarkao2@o2.pl>:
> On Wed, Sep 20, 2006 at 11:38:53AM +0100, Alan Cox wrote:
> > Ar Mer, 2006-09-20 am 08:41 +0200, ysgrifennodd Jarek Poplawski:
> > > On 20-09-2006 02:01, Alan Cox wrote:
> > > > Not sure its the way I'd approach it - in your specific case it should
> > > > be easier to just not compile in EHCI (USB 2.0) support.
> > >
> > > I'd dare to vote for this idea: it's good for testing
> > > and very practical eg. for comparing performance of similar
> > > devices like network or sound cards. Besides: ehci could
> > > work for other devices.
> >
> > In which case you'd need to specify the device to ignore by its PCI bus
> > address so could ignore one device but not another of the same type. Eg
> > pci=ignore=0:4.5
>
> If I correctly understand this as a doubt I mean doing this in grub
> or lilo as boot variants.
>
> Jarek P.
>
--
Luiz Angelo Daros de Luca
luizluca@gmail.com
ICQ: 19290419
I Know, "Where you wanted to go today",
but I decided to stop here instead!
MS Windows
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] Adds kernel parameter to ignore pci devices
2006-09-20 16:51 ` Luiz Angelo Daros de Luca
@ 2006-09-20 17:27 ` Alan Cox
0 siblings, 0 replies; 7+ messages in thread
From: Alan Cox @ 2006-09-20 17:27 UTC (permalink / raw)
To: Luiz Angelo Daros de Luca; +Cc: Jarek Poplawski, linux-kernel, torvalds
Ar Mer, 2006-09-20 am 13:51 -0300, ysgrifennodd Luiz Angelo Daros de
Luca:
> Allan, disabling EHCI in kernel won't solve it cause the kernel
> freezes when linux is setting up pci. This is before any device
> specific driver and it is done even without any driver for that
> device.
>
> I was going to implement a way to ignore using bus+board+function but
> not at this time. BTW, are the parameters name, format and debug
> messages adequated to kernel's principels?
I think so yes. The actual names used are a minor detail to worry about
once the code is working, neat and being submitted.
Alan
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2006-09-20 17:03 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <8b96e3d20609191447x77e284b1j904e4106942e040e@mail.gmail.com>
2006-09-19 22:18 ` [PATCH] Adds kernel parameter to ignore pci devices Luiz Angelo Daros de Luca
2006-09-20 0:01 ` Alan Cox
2006-09-20 6:41 ` Jarek Poplawski
2006-09-20 10:38 ` Alan Cox
2006-09-20 11:25 ` Jarek Poplawski
2006-09-20 16:51 ` Luiz Angelo Daros de Luca
2006-09-20 17:27 ` Alan Cox
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox