Re: [PATCH] serial: add ADDI-DATA GmbH Communication cards in8250_pci.c and pci_ids.h.
From: Andrey Panin
Date: Wed Nov 28 2007 - 05:49:32 EST
On 332, 11 28, 2007 at 10:57:02AM +0100, Krauth.Julien wrote:
> From: Krauth Julien <krauth.julien@xxxxxxxxxxxxx>
>
> Add ADDI-DATA GmbH communication cards to 8250_pci driver.
> Supported cards are:
>
> APCI-7300, APCI-7420, APCI-7500, APCI-7800
> APCI-7300-2, APCI-7420-2, APCI-7500-2
> APCI-7300-3, APCI-7420-3, APCI-7500-3, APCI-7800-3
>
> 8250_pci.c.patch
> ================
> Add ADDI-DATA GmbH communication cards to 8250_pci.c.
>
> pci_ids.h.patch
> ===============
> Add ADDI-DATA GmbH communication cards Vendor and Device IDs to
> pci_ids.h.
>
> WARNING:
> ========
> 8250_pci.c.patch depend on pci_ids.h.patch.
> 8250_pci.c is using Vendor and Device ID defined in pci_ids.h.
>
>
> Signed-off-by: Krauth J. <krauth.julien@xxxxxxxxxxxxx>
> ---
>
> This patch applies to kernel 2.6.23.9.
>
> --- linux-2.6.23.9-vanilla/include/linux/pci_ids.h 2007-11-26
> 18:51:43.000000000 +0100
> +++ linux-2.6.23.9/include/linux/pci_ids.h 2007-11-27
> 10:55:12.000000000 +0100
> @@ -2019,6 +2019,23 @@
> #define PCI_VENDOR_ID_QUICKNET 0x15e2
> #define PCI_DEVICE_ID_QUICKNET_XJ 0x0500
>
> +/*
> + * ADDI-DATA GmbH communication cards <info@xxxxxxxxxxxxx>
> + */
> +#define PCI_VENDOR_ID_ADDIDATA_OLD 0x10E8
> +#define PCI_VENDOR_ID_ADDIDATA 0x15B8
> +#define PCI_DEVICE_ID_ADDIDATA_APCI7500 0x7000
> +#define PCI_DEVICE_ID_ADDIDATA_APCI7420 0x7001
> +#define PCI_DEVICE_ID_ADDIDATA_APCI7300 0x7002
> +#define PCI_DEVICE_ID_ADDIDATA_APCI7800 0x818E
> +#define PCI_DEVICE_ID_ADDIDATA_APCI7500_2 0x7009
> +#define PCI_DEVICE_ID_ADDIDATA_APCI7420_2 0x700A
> +#define PCI_DEVICE_ID_ADDIDATA_APCI7300_2 0x700B
> +#define PCI_DEVICE_ID_ADDIDATA_APCI7500_3 0x700C
> +#define PCI_DEVICE_ID_ADDIDATA_APCI7420_3 0x700D
> +#define PCI_DEVICE_ID_ADDIDATA_APCI7300_3 0x700E
> +#define PCI_DEVICE_ID_ADDIDATA_APCI7800_3 0x700F
> +
> #define PCI_VENDOR_ID_PDC 0x15e9
>
> #define PCI_VENDOR_ID_FARSITE 0x1619
>
> --- linux-2.6.23.9-vanilla/drivers/serial/8250_pci.c 2007-11-26
> 18:51:43.000000000 +0100
> +++ linux-2.6.23.9/drivers/serial/8250_pci.c 2007-11-27
> 10:53:09.000000000 +0100
> @@ -106,6 +106,51 @@ setup_port(struct serial_private *priv,
> }
>
> /*
> + * ADDI-DATA GmbH communication cards <info@xxxxxxxxxxxxx>
> + */
> +static int
> +addidata_setup(struct serial_private *priv, struct pciserial_board
> *board,
> + struct uart_port *port, int idx)
> +{
> + unsigned int bar = 0, offset = board->first_offset;
> + bar = FL_GET_BASE(board->flags);
> +
> + switch (priv->dev->device) {
> + case PCI_DEVICE_ID_ADDIDATA_APCI7500:
> + case PCI_DEVICE_ID_ADDIDATA_APCI7420:
> + case PCI_DEVICE_ID_ADDIDATA_APCI7300:
> + case PCI_DEVICE_ID_ADDIDATA_APCI7500_2:
> + case PCI_DEVICE_ID_ADDIDATA_APCI7420_2:
> + case PCI_DEVICE_ID_ADDIDATA_APCI7300_2:
> + case PCI_DEVICE_ID_ADDIDATA_APCI7500_3:
> + case PCI_DEVICE_ID_ADDIDATA_APCI7420_3:
> + case PCI_DEVICE_ID_ADDIDATA_APCI7300_3:
> + case PCI_DEVICE_ID_ADDIDATA_APCI7800_3:
> + offset += idx * board->uart_offset;
> + break;
Why do you need this ? Looks like you can use pci_default_setup()
for all cards except PCI_DEVICE_ID_ADDIDATA_APCI7800.
> + case PCI_DEVICE_ID_ADDIDATA_APCI7800:
> + if (idx < 2 ) {
> + bar += 0;
Ughmm, this line looks especially useful :)
> + offset += idx * board->uart_offset;
> + } else if ((idx >= 2) && (idx < 4)) {
> + bar += 1;
> + offset += ((idx - 2) * board->uart_offset);
> + } else if ((idx >= 4) && (idx < 6 )) {
> + bar += 2;
> + offset += ((idx - 4) * board->uart_offset);
> + } else if (idx >= 6) {
> + bar += 3;
> + offset += ((idx - 6) * board->uart_offset);
> + }
> +
> + break;
> + }
> +
> + return setup_port(priv, port, bar, offset, board->reg_shift);
> +}
> +
> +/*
> * AFAVLAB uses a different mixture of BARs and offsets
> * Not that ugly ;) -- HW
> */
> @@ -752,6 +797,86 @@ pci_default_setup(struct serial_private
> */
> static struct pci_serial_quirk pci_serial_quirks[] = {
> /*
> + * ADDI-DATA GmbH communication cards <info@xxxxxxxxxxxxx>
> + */
> + {
> + .vendor = PCI_VENDOR_ID_ADDIDATA,
> + .device = PCI_DEVICE_ID_ADDIDATA_APCI7500,
> + .subvendor = PCI_ANY_ID,
> + .subdevice = PCI_ANY_ID,
> + .setup = addidata_setup,
> + },
> + {
> + .vendor = PCI_VENDOR_ID_ADDIDATA,
> + .device = PCI_DEVICE_ID_ADDIDATA_APCI7420,
> + .subvendor = PCI_ANY_ID,
> + .subdevice = PCI_ANY_ID,
> + .setup = addidata_setup,
> + },
> + {
> + .vendor = PCI_VENDOR_ID_ADDIDATA,
> + .device = PCI_DEVICE_ID_ADDIDATA_APCI7300,
> + .subvendor = PCI_ANY_ID,
> + .subdevice = PCI_ANY_ID,
> + .setup = addidata_setup,
> + },
> + {
> + .vendor = PCI_VENDOR_ID_ADDIDATA_OLD,
> + .device = PCI_DEVICE_ID_ADDIDATA_APCI7800,
> + .subvendor = PCI_ANY_ID,
> + .subdevice = PCI_ANY_ID,
> + .setup = addidata_setup,
> + },
> + {
> + .vendor = PCI_VENDOR_ID_ADDIDATA,
> + .device = PCI_DEVICE_ID_ADDIDATA_APCI7500_2,
> + .subvendor = PCI_ANY_ID,
> + .subdevice = PCI_ANY_ID,
> + .setup = addidata_setup,
> + },
> + {
> + .vendor = PCI_VENDOR_ID_ADDIDATA,
> + .device = PCI_DEVICE_ID_ADDIDATA_APCI7420_2,
> + .subvendor = PCI_ANY_ID,
> + .subdevice = PCI_ANY_ID,
> + .setup = addidata_setup,
> + },
> + {
> + .vendor = PCI_VENDOR_ID_ADDIDATA,
> + .device = PCI_DEVICE_ID_ADDIDATA_APCI7300_2,
> + .subvendor = PCI_ANY_ID,
> + .subdevice = PCI_ANY_ID,
> + .setup = addidata_setup,
> + },
> + {
> + .vendor = PCI_VENDOR_ID_ADDIDATA,
> + .device = PCI_DEVICE_ID_ADDIDATA_APCI7500_3,
> + .subvendor = PCI_ANY_ID,
> + .subdevice = PCI_ANY_ID,
> + .setup = addidata_setup,
> + },
> + {
> + .vendor = PCI_VENDOR_ID_ADDIDATA,
> + .device = PCI_DEVICE_ID_ADDIDATA_APCI7420_3,
> + .subvendor = PCI_ANY_ID,
> + .subdevice = PCI_ANY_ID,
> + .setup = addidata_setup,
> + },
> + {
> + .vendor = PCI_VENDOR_ID_ADDIDATA,
> + .device = PCI_DEVICE_ID_ADDIDATA_APCI7300_3,
> + .subvendor = PCI_ANY_ID,
> + .subdevice = PCI_ANY_ID,
> + .setup = addidata_setup,
> + },
> + {
> + .vendor = PCI_VENDOR_ID_ADDIDATA,
> + .device = PCI_DEVICE_ID_ADDIDATA_APCI7800_3,
> + .subvendor = PCI_ANY_ID,
> + .subdevice = PCI_ANY_ID,
> + .setup = addidata_setup,
> + },
All these entries except PCI_DEVICE_ID_ADDIDATA_APCI7800 are unnecessary too.
> + /*
> * AFAVLAB cards - these may be called via parport_serial
> * It is not clear whether this applies to all products.
> */
> @@ -2574,6 +2699,97 @@ static struct pci_device_id serial_pci_t
> pbn_pasemi_1682M },
>
> /*
> + * ADDI-DATA GmbH communication cards <info@xxxxxxxxxxxxx>
> + */
> + { PCI_VENDOR_ID_ADDIDATA,
> + PCI_DEVICE_ID_ADDIDATA_APCI7500,
> + PCI_ANY_ID,
> + PCI_ANY_ID,
> + 0,
> + 0,
> + pbn_b0_4_115200 },
> +
> + { PCI_VENDOR_ID_ADDIDATA,
> + PCI_DEVICE_ID_ADDIDATA_APCI7420,
> + PCI_ANY_ID,
> + PCI_ANY_ID,
> + 0,
> + 0,
> + pbn_b0_2_115200 },
> +
> + { PCI_VENDOR_ID_ADDIDATA,
> + PCI_DEVICE_ID_ADDIDATA_APCI7300,
> + PCI_ANY_ID,
> + PCI_ANY_ID,
> + 0,
> + 0,
> + pbn_b0_1_115200 },
> +
> + { PCI_VENDOR_ID_ADDIDATA_OLD,
> + PCI_DEVICE_ID_ADDIDATA_APCI7800,
> + PCI_ANY_ID,
> + PCI_ANY_ID,
> + 0,
> + 0,
> + pbn_b1_8_115200 },
> +
> + { PCI_VENDOR_ID_ADDIDATA,
> + PCI_DEVICE_ID_ADDIDATA_APCI7500_2,
> + PCI_ANY_ID,
> + PCI_ANY_ID,
> + 0,
> + 0,
> + pbn_b0_4_115200 },
> +
> + { PCI_VENDOR_ID_ADDIDATA,
> + PCI_DEVICE_ID_ADDIDATA_APCI7420_2,
> + PCI_ANY_ID,
> + PCI_ANY_ID,
> + 0,
> + 0,
> + pbn_b0_2_115200 },
> +
> + { PCI_VENDOR_ID_ADDIDATA,
> + PCI_DEVICE_ID_ADDIDATA_APCI7300_2,
> + PCI_ANY_ID,
> + PCI_ANY_ID,
> + 0,
> + 0,
> + pbn_b0_1_115200 },
> +
> + { PCI_VENDOR_ID_ADDIDATA,
> + PCI_DEVICE_ID_ADDIDATA_APCI7500_3,
> + PCI_ANY_ID,
> + PCI_ANY_ID,
> + 0,
> + 0,
> + pbn_b0_4_115200 },
> +
> + { PCI_VENDOR_ID_ADDIDATA,
> + PCI_DEVICE_ID_ADDIDATA_APCI7420_3,
> + PCI_ANY_ID,
> + PCI_ANY_ID,
> + 0,
> + 0,
> + pbn_b0_2_115200 },
> +
> + { PCI_VENDOR_ID_ADDIDATA,
> + PCI_DEVICE_ID_ADDIDATA_APCI7300_3,
> + PCI_ANY_ID,
> + PCI_ANY_ID,
> + 0,
> + 0,
> + pbn_b0_1_115200 },
> +
> + { PCI_VENDOR_ID_ADDIDATA,
> + PCI_DEVICE_ID_ADDIDATA_APCI7800_3,
> + PCI_ANY_ID,
> + PCI_ANY_ID,
> + 0,
> + 0,
> + pbn_b0_bt_8_115200 },
> +
> + /*
> * These entries match devices with class COMMUNICATION_SERIAL,
> * COMMUNICATION_MODEM or COMMUNICATION_MULTISERIAL
> */
Otherwise patch looks good.
--
Andrey Panin | Linux and UNIX system administrator
pazke@xxxxxxxxx | PGP key: wwwkeys.pgp.net
Attachment:
signature.asc
Description: Digital signature