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

Re: resolve "device xxx is grabbed by another driver"



On 10:55 Sun 10 Apr     , Jacques Goldberg wrote:
> 
>    Obtaining the same effect with a loadable module will be better because
> it will not require compilation of the kernel, just of the module. But
> when?
>    Any TRAINED user who wants the patched routine 8250_pci.c can obtain it
> individually from me and rebuild her/his kernel. Including the patched
> routine in a distro is not desirable because, very quickly, nobody will
> know which version she/he uses, and forget to compile again the kernel
> after the next kernel upgrade.

After all, the loadable module workaround for "untrained" users is available
on linmodems site http://linmodems.technion.ac.il .

Here is (bit updated) 8250_pci.c patch below. Hope no objections now.

Best Regards,
Sasha.

Date: Wed, 20 Apr 2005 02:56:08 +0300
From: Sasha Khapyorsky <sashak@smlink.com>
To: rmk+serial@arm.linux.org
Cc: linux-serial@vger.kernel.org
Subject: [2.6 patch] drivers/serial/8250_pci.c: don't probe non-serial softmodems

Hello Russel,

Some soft modem pci devices (known list in the patch) claim to have 
'communication' class, and as result they are grabbed by serial driver.
Actually those devices are useless for serial drivers (it is not "real"
modem and doesn't have serial interface), but this prevents probing from
soft modem drivers (there are few in ALSA).

The patch below makes it possible to define ids of such known non-serial
devices and don't probe it by 8250_pci driver.

Thanks,
Sasha.


Signed-off-by: Sasha Khapyorsky <sashak@smlink.com>

diff -wru linux-2.6.12-rc1_orig/drivers/serial/8250_pci.c linux-2.6.12-rc1/drivers/serial/8250_pci.c
--- linux-2.6.12-rc1_orig/drivers/serial/8250_pci.c	2005-03-28 17:26:38.000000000 +0200
+++ linux-2.6.12-rc1/drivers/serial/8250_pci.c	2005-04-12 18:07:27.000000000 +0300
@@ -1605,6 +1605,22 @@
 }
 
 /*
+ * pci devices with appropriate class declared, but known as
+ * non modems or serial
+ */
+static struct pci_device_id __devinitdata non_serial_pci_tbl[] = {
+	{	0x163c, 0x3052,   /* smartlink softmodem */
+		PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
+	{	0x134d, 0x2189,   /* HSP1688 softmodem */
+		PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
+	{	PCI_VENDOR_ID_AL, 0x5457,
+		PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
+	{	PCI_VENDOR_ID_AL, 0x5459,
+		PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
+	{ 0, }
+};
+
+/*
  * Probe one serial board.  Unfortunately, there is no rhyme nor reason
  * to the arrangement of serial ports on a PCI card.
  */
@@ -1616,6 +1632,9 @@
 	struct pci_serial_quirk *quirk;
 	int rc, nr_ports, i;
 
+	if (pci_match_device(non_serial_pci_tbl, dev))
+		return -ENODEV;
+
 	if (ent->driver_data >= ARRAY_SIZE(pci_boards)) {
 		printk(KERN_ERR "pci_init_one: invalid driver_data: %ld\n",
 			ent->driver_data);



Reply to: