Re: Syba 8-Port Serial Card Unidentified By Kernel

!MAILaRCHIVE_VOTE_RePLACE
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
To: Chris Bergeron <chris@...>
Cc: <linux-kernel@...>
Date: Sunday, October 28, 2007 - 11:42 am

--CE+1k2dSO48ffgeK
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

On 295, 10 22, 2007 at 01:14:14 -0400, Chris Bergeron wrote:
nt=20
=20

Can you test an attached patch against 2.6.24-rc1 ?

--=20
Andrey Panin		| Linux and UNIX system administrator
pazke@donpac.ru		| PGP key: wwwkeys.pgp.net

--CE+1k2dSO48ffgeK
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename=patch-syba-2
Content-Transfer-Encoding: quoted-printable

diff -urdpNX dontdiff linux-2.6.24.vanilla/drivers/serial/8250_pci.c linux-=
2.6.24/drivers/serial/8250_pci.c
--- linux-2.6.24.vanilla/drivers/serial/8250_pci.c	2007-10-28 13:00:14.0000=
00000 +0300
+++ linux-2.6.24/drivers/serial/8250_pci.c	2007-10-28 18:15:12.000000000 +0=
300
@@ -610,45 +610,49 @@ static int pci_netmos_init(struct pci_de
 /* enable IO_Space bit */
 #define ITE_887x_POSIO_ENABLE		(1 << 31)
=20
-static int pci_ite887x_init(struct pci_dev *dev)
+static int pci_ite_887x_allocate_io(struct pci_dev *dev)
 {
-	/* inta_addr are the configuration addresses of the ITE */
-	static const short inta_addr[] =3D { 0x2a0, 0x2c0, 0x220, 0x240, 0x1e0,
-							0x200, 0x280, 0 };
-	int ret, i, type;
-	struct resource *iobase =3D NULL;
-	u32 miscr, uartbar, ioport;
+	static const short inta_addr[] =3D {
+		0x2a0, 0x2c0, 0x220, 0x240, 0x1e0, 0x200, 0x280, 0
+	};
+	int ret, i;
=20
-	/* search for the base-ioport */
-	i =3D 0;
-	while (inta_addr[i] && iobase =3D=3D NULL) {
-		iobase =3D request_region(inta_addr[i], ITE_887x_IOSIZE,
-								"ite887x");
-		if (iobase !=3D NULL) {
+	for (i =3D 0; i < ARRAY_SIZE(inta_addr); i++) {
+		int iobase =3D inta_addr[i];
+
+		if (request_region(iobase, ITE_887x_IOSIZE, "ite887x")) {
 			/* write POSIO0R - speed | size | ioport */
 			pci_write_config_dword(dev, ITE_887x_POSIO0,
 				ITE_887x_POSIO_ENABLE | ITE_887x_POSIO_SPEED |
-				ITE_887x_POSIO_IOSIZE_32 | inta_addr[i]);
+				ITE_887x_POSIO_IOSIZE_32 | iobase);
+
 			/* write INTCBAR - ioport */
-			pci_write_config_dword(dev, ITE_887x_INTCBAR, inta_addr[i]);
-			ret =3D inb(inta_addr[i]);
+			pci_write_config_dword(dev, ITE_887x_INTCBAR, iobase);
+			ret =3D inb(iobase);
 			if (ret !=3D 0xff) {
 				/* ioport connected */
-				break;
+				return iobase;
 			}
-			release_region(iobase->start, ITE_887x_IOSIZE);
-			iobase =3D NULL;
+			release_region(iobase, ITE_887x_IOSIZE);
 		}
-		i++;
 	}
=20
-	if (!inta_addr[i]) {
+	return 0;
+}
+
+static int pci_ite887x_init(struct pci_dev *dev)
+{
+	int i, ret, type, iobase;
+	u32 miscr, uartbar, ioport;
+
+	iobase =3D pci_ite_887x_allocate_io(dev);
+	if (!iobase) {
 		printk(KERN_ERR "ite887x: could not find iobase\n");
 		return -ENODEV;
 	}
=20
 	/* start of undocumented type checking (see parport_pc.c) */
-	type =3D inb(iobase->start + 0x18) & 0x0f;
+	type =3D inb(iobase + 0x18) & 0x0f;
=20
 	switch (type) {
 	case 0x2:	/* ITE8871 (1P) */
@@ -697,7 +701,7 @@ static int pci_ite887x_init(struct pci_d
=20
 	if (ret <=3D 0) {
 		/* the device has no UARTs if we get here */
-		release_region(iobase->start, ITE_887x_IOSIZE);
+		release_region(iobase, ITE_887x_IOSIZE);
 	}
=20
 	return ret;
@@ -712,6 +716,57 @@ static void __devexit pci_ite887x_exit(s
 	release_region(ioport, ITE_887x_IOSIZE);
 }
=20
+#define ITE_887x_IRR0	0
+#define ITE_887x_IRR1	1
+#define ITE_887x_IRR2	2
+#define ITE_887x_IMR0	4
+#define ITE_887x_IMR1	5
+#define ITE_887x_IMR2	6
+#define ITE_887x_IER0	8
+#define ITE_887x_IER1	9
+#define ITE_887x_IER2	10
+#define ITE_887x_ITR0	12
+#define ITE_887x_ITR1	13
+#define ITE_887x_ITR2	14
+
+static int pci_syba_ite887x_init(struct pci_dev *dev)
+{
+	int iobase =3D pci_ite_887x_allocate_io(dev);
+
+	if (!iobase) {
+		printk(KERN_ERR "ite887x: could not find iobase\n");
+		return -ENODEV;
+	}
+
+	/* DEBUG */
+	printk(KERN_INFO "ite887x: io base at %#x\n", iobase);
+	printk(KERN_INFO "ite887x: IRR0=3D%02x IMR0=3D%02x IER0=3D%02x\n",=20
+		inb(iobase + ITE_887x_IRR0), inb(iobase + ITE_887x_IMR0), inb(iobase + I=
TE_887x_IER0));
+	printk(KERN_INFO "ite887x: IRR1=3D%02x IMR1=3D%02x IER1=3D%02x\n",=20
+		inb(iobase + ITE_887x_IRR1), inb(iobase + ITE_887x_IMR1), inb(iobase + I=
TE_887x_IER1));
+	printk(KERN_INFO "ite887x: IRR2=3D%02x IMR2=3D%02x IER2=3D%02x\n",=20
+		inb(iobase + ITE_887x_IRR2), inb(iobase + ITE_887x_IMR2), inb(iobase + I=
TE_887x_IER2));
+
+	/* Clear s/w interrupt genaration register (just in case) */
+	outb(0, iobase + ITE_887x_IER0);
+	outb(0, iobase + ITE_887x_IER1);
+	outb(0, iobase + ITE_887x_IER2);
+
+	/* Clear IRQ latches */
+	outb(0, iobase + ITE_887x_IRR0);
+	outb(0, iobase + ITE_887x_IRR1);
+	outb(0, iobase + ITE_887x_IRR2);
+
+	/* Mask interrupts from on-chip devices (unused on this card) */
+	outb(0xf, iobase + ITE_887x_IMR2);
+
+	/* Set external IRQ mode to level-triggered */
+	outb(0xff, iobase + ITE_887x_IER0);
+	outb(0xff, iobase + ITE_887x_IER1);
+
+	return 8;
+}
+
 static int
 pci_default_setup(struct serial_private *priv, struct pciserial_board *boa=
rd,
 		  struct uart_port *port, int idx)
@@ -797,6 +852,18 @@ static struct pci_serial_quirk pci_seria
 		.exit		=3D __devexit_p(pci_ite887x_exit),
 	},
 	/*
+	 * Syba
+	 */
+	{
+		.vendor		=3D PCI_VENDOR_ID_PLX,
+		.device		=3D 0x9016,
+		.subvendor	=3D 0x544e,
+		.subdevice	=3D 0x0008,
+		.init		=3D pci_syba_ite887x_init,
+		.setup		=3D pci_default_setup,
+		.exit		=3D __devexit_p(pci_ite887x_exit),
+	},
+	/*
 	 * Panacom
 	 */
 	{
@@ -2527,6 +2594,11 @@ static struct pci_device_id serial_pci_t
 		PCI_ANY_ID, PCI_ANY_ID, 0, 0,
 		pbn_b3_8_115200 },
=20
+	/* Syba PCI8871-PR8 8-port serial card */
+	{	PCI_VENDOR_ID_PLX, 0x9016,
+		0x544e, 0x0008, 0, 0,
+		pbn_b0_8_115200 },
+
 	/*
 	 * Exar Corp. XR17C15[248] Dual/Quad/Octal UART
 	 */

--CE+1k2dSO48ffgeK--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
Syba 8-Port Serial Card Unidentified By Kernel, Chris Bergeron, (Fri Oct 5, 5:31 pm)
Re: Syba 8-Port Serial Card Unidentified By Kernel, Andrey Panin, (Wed Oct 10, 5:54 am)
Re: Syba 8-Port Serial Card Unidentified By Kernel, Chris Bergeron, (Thu Oct 11, 1:02 pm)
Re: Syba 8-Port Serial Card Unidentified By Kernel, Andrey Panin, (Fri Oct 12, 8:08 am)
Re: Syba 8-Port Serial Card Unidentified By Kernel, Chris Bergeron, (Tue Oct 16, 3:03 pm)
Re: Syba 8-Port Serial Card Unidentified By Kernel, Andrey Panin, (Wed Oct 17, 2:42 am)
Re: Syba 8-Port Serial Card Unidentified By Kernel, Chris Bergeron, (Wed Oct 17, 6:16 pm)
Re: Syba 8-Port Serial Card Unidentified By Kernel, Andrey Panin, (Thu Oct 18, 1:57 am)
Re: Syba 8-Port Serial Card Unidentified By Kernel, Chris Bergeron, (Thu Oct 18, 1:00 pm)
Re: Syba 8-Port Serial Card Unidentified By Kernel, Andrey Panin, (Mon Oct 22, 11:33 am)
Re: Syba 8-Port Serial Card Unidentified By Kernel, Chris Bergeron, (Mon Oct 22, 1:14 pm)
Re: Syba 8-Port Serial Card Unidentified By Kernel, Andrey Panin, (Sun Oct 28, 11:42 am)
Re: Syba 8-Port Serial Card Unidentified By Kernel, Bjorn Helgaas, (Wed Sep 3, 11:59 pm)
Re: Syba 8-Port Serial Card Unidentified By Kernel, Bjorn Helgaas, (Wed Sep 10, 3:26 pm)
Re: Syba 8-Port Serial Card Unidentified By Kernel, Lennart Sorensen, (Mon Oct 22, 12:18 pm)
Re: Syba 8-Port Serial Card Unidentified By Kernel, Andrey Panin, (Fri Oct 26, 7:35 am)
Re: Syba 8-Port Serial Card Unidentified By Kernel, Lennart Sorensen, (Thu Oct 11, 3:01 pm)
Re: Syba 8-Port Serial Card Unidentified By Kernel, Chris Bergeron, (Thu Oct 11, 4:48 pm)
Re: Syba 8-Port Serial Card Unidentified By Kernel, Lennart Sorensen, (Tue Oct 9, 2:14 pm)
Re: Syba 8-Port Serial Card Unidentified By Kernel, Chris Bergeron, (Tue Oct 9, 3:25 pm)
Re: Syba 8-Port Serial Card Unidentified By Kernel, Nicholas Miell, (Fri Oct 5, 6:43 pm)