Update to serial driver for Linux 2.3.99pre6-6

From: tytso@mit.edu
Date: Tue Apr 25 2000 - 22:43:35 EST


Hi Linus,

Enclosed please find an update to the serial driver; the patch is
against Linux-2.3.99pre6-6.

This patch makes the following improvements to the driver:

        * Fixed binary incompatibility problem introduced in 4.94 for
          64-bit platforms (i.e. Alpha, et. al)

        * Add a flag (ASYNC_BUGGY_UART) which skips some sanity checks
          in deference to buggy UARTs.

        * Add Andrew Panin's generic autodetection for ISA PnP modems.

        * Add support for a number of new cards:
                - Megawolf Romulus PCI
                - VS SPCOM800
                - EKF Intel i960 serial boards
                - A variety of PnP boards.

        * Use the new PCI resource macros defined in linux/pci.h

                                                        - Ted

Patch generated: on Tue Apr 25 22:52:46 EDT 2000 by tytso@snap.thunk.org
against Linux version 2.3.99
 
===================================================================
RCS file: drivers/char/RCS/serial.c,v
retrieving revision 1.1
diff -u -r1.1 drivers/char/serial.c
--- drivers/char/serial.c 2000/04/26 01:50:10 1.1
+++ drivers/char/serial.c 2000/04/26 02:52:38
@@ -48,8 +48,8 @@
  * int rs_init(void);
  */
 
-static char *serial_version = "4.93";
-static char *serial_revdate = "2000-03-20";
+static char *serial_version = "4.94";
+static char *serial_revdate = "2000-04-25";
 
 /*
  * Serial driver configuration section. Here are the various options:
@@ -293,11 +293,8 @@
 static struct pci_board_inst serial_pci_board[NR_PCI_BOARDS];
 static int serial_pci_board_idx = 0;
 #endif
-#ifndef PCI_BASE_ADDRESS
-#define PCI_BASE_ADDRESS(dev, r) ((dev)->resource[r].start)
-#define PCI_BASE_REGION_SIZE(dev, r) ((dev)->resource[r].end - \
- (dev)->resource[r].start)
-#define IS_PCI_REGION_IOPORT(dev, r) ((dev)->resource[r].flags & \
+#ifndef IS_PCI_REGION_IOPORT
+#define IS_PCI_REGION_IOPORT(dev, r) (pci_resource_flags((dev), (r)) & \
                                       IORESOURCE_IO)
 #endif
 #ifndef PCI_IRQ_RESOURCE
@@ -314,7 +311,8 @@
 #define ACTIVATE_FUNC(dev) (dev->activate)
 #define DEACTIVATE_FUNC(dev) (dev->deactivate)
 #endif
-
+
+#define HIGH_BITS_OFFSET ((sizeof(long)-sizeof(int))*8)
 
 static struct tty_struct *serial_table[NR_PORTS];
 static struct termios *serial_termios[NR_PORTS];
@@ -1199,7 +1197,8 @@
          * if it is, then bail out, because there's likely no UART
          * here.
          */
- if (serial_inp(info, UART_LSR) == 0xff) {
+ if (!(info->flags & ASYNC_BUGGY_UART) &&
+ (serial_inp(info, UART_LSR) == 0xff)) {
                 printk("LSR safety check engaged!\n");
                 if (capable(CAP_SYS_ADMIN)) {
                         if (info->tty)
@@ -1912,6 +1911,10 @@
         tmp.type = state->type;
         tmp.line = state->line;
         tmp.port = state->port;
+ if (HIGH_BITS_OFFSET)
+ tmp.port_high = state->port >> HIGH_BITS_OFFSET;
+ else
+ tmp.port_high = 0;
         tmp.irq = state->irq;
         tmp.flags = state->flags;
         tmp.xmit_fifo_size = state->xmit_fifo_size;
@@ -1933,14 +1936,19 @@
          struct serial_state old_state, *state;
         unsigned int i,change_irq,change_port;
         int retval = 0;
+ unsigned long new_port;
 
         if (copy_from_user(&new_serial,new_info,sizeof(new_serial)))
                 return -EFAULT;
         state = info->state;
         old_state = *state;
-
+
+ new_port = new_serial.port;
+ if (HIGH_BITS_OFFSET)
+ new_port += new_serial.port_high << HIGH_BITS_OFFSET;
+
         change_irq = new_serial.irq != state->irq;
- change_port = (new_serial.port != state->port) ||
+ change_port = (new_port != ((int) state->port)) ||
                 (new_serial.hub6 != state->hub6);
   
         if (!capable(CAP_SYS_ADMIN)) {
@@ -1978,7 +1986,7 @@
         if (new_serial.type) {
                 for (i = 0 ; i < NR_PORTS; i++)
                         if ((state != &rs_table[i]) &&
- (rs_table[i].port == new_serial.port) &&
+ (rs_table[i].port == new_port) &&
                             rs_table[i].type)
                                 return -EADDRINUSE;
         }
@@ -2015,7 +2023,7 @@
                  */
                 shutdown(info);
                 state->irq = new_serial.irq;
- info->port = state->port = new_serial.port;
+ info->port = state->port = new_port;
                 info->hub6 = state->hub6 = new_serial.hub6;
                 if (info->hub6)
                         info->io_type = state->io_type = SERIAL_IO_HUB6;
@@ -3348,6 +3356,16 @@
          * LSR register (which serial_icr_read does)
          */
         if (state->type == PORT_16550A) {
+ /*
+ * EFR [4] must be set else this test fails
+ *
+ * This shouldn't be necessary, but Mike Hudson
+ * (Exoray@isys.ca) claims that it's needed for 952
+ * dual UART's (which are not recommended for new designs).
+ */
+ serial_out(info, UART_LCR, 0xBF);
+ serial_out(info, UART_EFR, 0x10);
+ serial_out(info, UART_LCR, 0x00);
                 /* Check for Oxford Semiconductor 16C950 */
                 scratch = serial_icr_read(info, UART_ID1);
                 scratch2 = serial_icr_read(info, UART_ID2);
@@ -3434,7 +3452,8 @@
 
         save_flags(flags); cli();
         
- if (!state->iomem_base) {
+ if (!(state->flags & ASYNC_BUGGY_UART) &&
+ !state->iomem_base) {
                 /*
                  * Do a simple existence test first; if we fail this,
                  * there's no point trying anything else.
@@ -3626,18 +3645,22 @@
                 base_idx += idx;
 
         if (board->flags & SPCI_FL_REGION_SZ_CAP) {
- max_port = PCI_BASE_REGION_SIZE(dev, base_idx) / 8;
+ max_port = pci_resource_len(dev, base_idx) / 8;
                 if (idx >= max_port)
                         return 1;
         }
                         
- port = PCI_BASE_ADDRESS(dev, base_idx) + board->first_uart_offset;
+ port = pci_resource_start(dev, base_idx) + board->first_uart_offset;
 
         if ((board->flags & SPCI_FL_BASE_TABLE) == 0)
                 port += idx * (board->uart_offset ? board->uart_offset : 8);
 
         if (IS_PCI_REGION_IOPORT(dev, base_idx)) {
                 state->port = port;
+ if (HIGH_BITS_OFFSET)
+ state->port_high = port >> HIGH_BITS_OFFSET;
+ else
+ state->port_high = 0;
                 return 0;
         }
         state->io_type = SERIAL_IO_MEM;
@@ -3742,28 +3765,45 @@
 #endif
 pci_plx9050_fn(struct pci_dev *dev, struct pci_board *board, int enable)
 {
- u8 data, *p, scratch;
+ u8 data, *p, irq_config;
+ int pci_config;
 
+ irq_config = 0x41;
+ pci_config = PCI_COMMAND_MEMORY;
+ if (dev->vendor == PCI_VENDOR_ID_PANACOM)
+ irq_config = 0x43;
+ if ((dev->vendor == PCI_VENDOR_ID_PLX) &&
+ (dev->device == PCI_VENDOR_ID_PLX_ROMULUS)) {
+ /*
+ * As the megawolf cards have the int pins active
+ * high, and have 2 UART chips, both ints must be
+ * enabled on the 9050. Also, the UARTS are set in
+ * 16450 mode by default, so we have to enable the
+ * 16C950 'enhanced' mode so that we can use the deep
+ * FIFOs
+ */
+ irq_config = 0x5b;
+ pci_config = PCI_COMMAND_MEMORY | PCI_COMMAND_IO;
+ }
+
         pci_read_config_byte(dev, PCI_COMMAND, &data);
 
         if (enable)
                 pci_write_config_byte(dev, PCI_COMMAND,
- data | PCI_COMMAND_MEMORY);
+ data | pci_config);
         
         /* enable/disable interrupts */
- p = ioremap(PCI_BASE_ADDRESS(dev, 0), 0x80);
- scratch = 0x41;
- if (dev->vendor == PCI_VENDOR_ID_PANACOM)
- scratch = 0x43;
- writel(enable ? scratch : 0x00, (unsigned long)p + 0x4c);
+ p = ioremap(pci_resource_start(dev, 0), 0x80);
+ writel(enable ? irq_config : 0x00, (unsigned long)p + 0x4c);
         iounmap(p);
 
         if (!enable)
                 pci_write_config_byte(dev, PCI_COMMAND,
- data & ~PCI_COMMAND_MEMORY);
+ data & ~pci_config);
         return 0;
 }
 
+
 /*
  * SIIG serial cards have an PCI interface chip which also controls
  * the UART clocking frequency. Each UART can be clocked independently
@@ -3796,7 +3836,7 @@
 
        if (!enable) return 0;
 
- p = ioremap(PCI_BASE_ADDRESS(dev, 0), 0x80);
+ p = ioremap(pci_resource_start(dev, 0), 0x80);
 
        switch (dev->device & 0xfff8) {
                case PCI_DEVICE_ID_SIIG_1S_10x: /* 1S */
@@ -3841,6 +3881,36 @@
        return 0;
 }
 
+/* Added for EKF Intel i960 serial boards */
+static int
+#ifndef MODULE
+__init
+#endif
+pci_inteli960ni_fn(struct pci_dev *dev,
+ struct pci_board *board,
+ int enable)
+{
+ unsigned long oldval;
+
+ if (!(board->subdevice & 0x1000))
+ return(-1);
+
+ if (!enable) /* is there something to deinit? */
+ return(0);
+
+#ifdef SERIAL_DEBUG_PCI
+ printk(KERN_DEBUG " Subsystem ID %lx, at Address: %lx\n",
+ (unsigned long) board->subdevice, port);
+#endif
+ /* is firmware started? */
+ pci_read_config_dword(dev, 0x44, (void*) &oldval);
+ if (oldval == 0x00001000L) { /* RESET value */
+ printk(KERN_DEBUG "Local i960 firmware missing");
+ return(-1);
+ }
+ return(0);
+}
+
 
 /*
  * This is the configuration table for all of the PCI serial boards
@@ -3851,8 +3921,9 @@
          * Vendor ID, Device ID,
          * Subvendor ID, Subdevice ID,
          * PCI Flags, Number of Ports, Base (Maximum) Baud Rate,
- * Offset to get to next UART's registers
- * Register shift to use for memory-mapped I/O
+ * Offset to get to next UART's registers,
+ * Register shift to use for memory-mapped I/O,
+ * Initialization function, first UART offset
          */
         { PCI_VENDOR_ID_V3, PCI_DEVICE_ID_V3_V960,
                 PCI_SUBVENDOR_ID_CONNECT_TECH,
@@ -3942,6 +4013,10 @@
         { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_SPCOM200,
                 PCI_ANY_ID, PCI_ANY_ID,
                 SPCI_FL_BASE2 | SPCI_FL_BASE_TABLE, 2, 921600 },
+ /* VScom SPCOM800, from sl@s.pl */
+ { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_SPCOM800,
+ PCI_ANY_ID, PCI_ANY_ID,
+ SPCI_FL_BASE2, 8, 921600 },
         { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050,
                 PCI_SUBVENDOR_ID_KEYSPAN,
                 PCI_SUBDEVICE_ID_KEYSPAN_SX2,
@@ -3979,6 +4054,12 @@
                 PCI_SUBVENDOR_ID_CHASE_PCIRAS,
                 PCI_SUBDEVICE_ID_CHASE_PCIRAS8,
                 SPCI_FL_BASE2, 8, 460800 },
+ /* Megawolf Romulus PCI Serial Card, from Mike Hudson */
+ /* (Exoray@isys.ca) */
+ { PCI_VENDOR_ID_PLX, PCI_VENDOR_ID_PLX_ROMULUS,
+ 0x10b5, 0x106a,
+ SPCI_FL_BASE2, 4, 921600,
+ 0x20, 2, pci_plx9050_fn, 0x03 },
         { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_QSC100,
                 PCI_ANY_ID, PCI_ANY_ID,
                 SPCI_FL_BASE1, 4, 115200 },
@@ -4164,7 +4245,7 @@
                 PCI_ANY_ID, PCI_ANY_ID,
                 SPCI_FL_BASE0 | SPCI_FL_BASE_TABLE, 4, 921600,
                 0, 0, pci_siig20x_fn },
- /* Computone devices submitted by Doug McNash dougm@computone.com */
+ /* Computone devices submitted by Doug McNash dmcnash@computone.com */
         { PCI_VENDOR_ID_COMPUTONE, PCI_DEVICE_ID_COMPUTONE_PG,
                 PCI_SUBVENDOR_ID_COMPUTONE, PCI_SUBDEVICE_ID_COMPUTONE_PG4,
                 SPCI_FL_BASE0, 4, 921600, /* IOMEM */
@@ -4198,6 +4279,11 @@
         { PCI_VENDOR_ID_TITAN, PCI_DEVICE_ID_TITAN_800B,
                 PCI_ANY_ID, PCI_ANY_ID,
                 SPCI_FL_BASE0, 4, 921600 },
+ /* EKF addition for i960 Boards form EKF with serial port */
+ { PCI_VENDOR_ID_INTEL, 0x1960,
+ 0xE4BF, PCI_ANY_ID,
+ SPCI_FL_BASE0, 32, 921600, /* max 256 ports */
+ 8<<2, 2, pci_inteli960ni_fn, 0x10000},
         /*
          * Untested PCI modems, sent in from various folks...
          */
@@ -4221,12 +4307,12 @@
 };
 
 /*
- * Given a complete unknown PCI device, try to use some hueristics to
+ * Given a complete unknown PCI device, try to use some heuristics to
  * guess what the configuration might be, based on the pitiful PCI
  * serial specs. Returns 0 on success, 1 on failure.
  */
-static int _INLINE_ serial_guess_board(struct pci_dev *dev,
- struct pci_board *board)
+static int _INLINE_ serial_pci_guess_board(struct pci_dev *dev,
+ struct pci_board *board)
 {
         int num_iomem = 0, num_port = 0, first_port = -1;
         int i;
@@ -4305,7 +4391,7 @@
                         break;
                 }
         
- if (board->vendor == 0 && serial_guess_board(dev, board))
+ if (board->vendor == 0 && serial_pci_guess_board(dev, board))
                         continue;
                 
                 start_pci_pnp_board(dev, board);
@@ -4322,13 +4408,13 @@
 #ifdef ENABLE_SERIAL_PNP
 
 static struct pci_board pnp_devices[] __initdata = {
- /* Motorola VoiceSURFR 56K Modem */
- { ISAPNP_VENDOR('M', 'O', 'T'), ISAPNP_DEVICE(0x15F0), 0, 0,
- SPCI_FL_BASE0 | SPCI_FL_PNPDEFAULT, 1, 115200 },
         /* Rockwell 56K ACF II Fax+Data+Voice Modem */
         { ISAPNP_VENDOR('A', 'K', 'Y'), ISAPNP_DEVICE(0x1021), 0, 0,
                 SPCI_FL_BASE0 | SPCI_FL_NO_SHIRQ | SPCI_FL_PNPDEFAULT,
                 1, 115200 },
+ /* ASKEY 56K Plug&Play Modem */
+ { ISAPNP_VENDOR('A', 'S', 'K'), ISAPNP_DEVICE(0x0004), 0, 0,
+ SPCI_FL_BASE0 | SPCI_FL_PNPDEFAULT, 1, 115200 },
         /* AZT3005 PnP SOUND DEVICE */
         { ISAPNP_VENDOR('A', 'Z', 'T'), ISAPNP_DEVICE(0x4001), 0, 0,
                 SPCI_FL_BASE0 | SPCI_FL_PNPDEFAULT, 1, 115200 },
@@ -4338,12 +4424,18 @@
         /* Boca Research 33,600 ACF Modem */
         { ISAPNP_VENDOR('B', 'R', 'I'), ISAPNP_DEVICE(0x1400), 0, 0,
                 SPCI_FL_BASE0 | SPCI_FL_PNPDEFAULT, 1, 115200 },
+ /* Davicom 33.6 PNP Modem */
+ { ISAPNP_VENDOR('D', 'A', 'V'), ISAPNP_DEVICE(0x0336), 0, 0,
+ SPCI_FL_BASE0 | SPCI_FL_PNPDEFAULT, 1, 115200 },
         /* Creative Modem Blaster Flash56 DI5601-1 */
         { ISAPNP_VENDOR('D', 'M', 'B'), ISAPNP_DEVICE(0x1032), 0, 0,
                 SPCI_FL_BASE0 | SPCI_FL_PNPDEFAULT, 1, 115200 },
         /* Creative Modem Blaster V.90 DI5660 */
         { ISAPNP_VENDOR('D', 'M', 'B'), ISAPNP_DEVICE(0x2001), 0, 0,
                 SPCI_FL_BASE0 | SPCI_FL_PNPDEFAULT, 1, 115200 },
+ /* Motorola VoiceSURFR 56K Modem */
+ { ISAPNP_VENDOR('M', 'O', 'T'), ISAPNP_DEVICE(0x15F0), 0, 0,
+ SPCI_FL_BASE0 | SPCI_FL_PNPDEFAULT, 1, 115200 },
         /* Pace 56 Voice Internal Plug & Play Modem */
         { ISAPNP_VENDOR('P', 'M', 'C'), ISAPNP_DEVICE(0x2430), 0, 0,
                 SPCI_FL_BASE0 | SPCI_FL_PNPDEFAULT, 1, 115200 },
@@ -4356,6 +4448,9 @@
         /* U.S. Robotics 56K FAX INT */
         { ISAPNP_VENDOR('U', 'S', 'R'), ISAPNP_DEVICE(0x3031), 0, 0,
                 SPCI_FL_BASE0 | SPCI_FL_PNPDEFAULT, 1, 115200 },
+ /* U.S. Robotics 56k FAX INT */
+ { ISAPNP_VENDOR('U', 'S', 'R'), ISAPNP_DEVICE(0x3050), 0, 0,
+ SPCI_FL_BASE0 | SPCI_FL_PNPDEFAULT, 1, 115200 },
         /* Viking 56K FAX INT */
         { ISAPNP_VENDOR('R', 'S', 'S'), ISAPNP_DEVICE(0x0262), 0, 0,
                 SPCI_FL_BASE0 | SPCI_FL_PNPDEFAULT, 1, 115200 },
@@ -4373,6 +4468,10 @@
         /* Generic 16550A-compatible COM port */
         { ISAPNP_VENDOR('P', 'N', 'P'), ISAPNP_DEVICE(0x0501), 0, 0,
                 SPCI_FL_BASE0 | SPCI_FL_PNPDEFAULT, 1, 115200 },
+ /* Generic ISA PnP serial board */
+ { 0, 0, 0, 0,
+ SPCI_FL_BASE0 | SPCI_FL_NO_SHIRQ | SPCI_FL_PNPDEFAULT,
+ 1, 115200 },
         { 0, }
 };
 
@@ -4394,6 +4493,65 @@
                         irq->map = map;
 }
 
+static char *modem_names[] = {
+ "MODEM", "Modem", "modem", "FAX", "Fax", "fax",
+ "56K", "56k", "K56", "33.6", "28.8", "14.4",
+ "33,600", "28,800", "14,400", "33.600", "28.800", "14.400",
+ "33600", "28800", "14400", "V.90", "V.34", "V.32", 0
+};
+
+static int check_name(char *name)
+{
+ char **tmp = modem_names;
+
+ while (*tmp) {
+ if (strstr(name, *tmp))
+ return 1;
+ tmp++;
+ }
+ return 0;
+}
+
+/*
+ * Given a complete unknown ISA PnP device, try to use some heuristics to
+ * detect modems. Currently use such heuristic set:
+ * - dev->name or dev->bus->name must contain "modem" substring;
+ * - device must have only one IO region (8 byte long) with base adress
+ * 0x2e8, 0x3e8, 0x2f8 or 0x3f8.
+ *
+ * Such detection looks very ugly, but can detect at least some of numerous
+ * ISA PnP modems, alternatively we must hardcode all modems in pnp_devices[]
+ * table.
+ */
+static int _INLINE_ serial_pnp_guess_board(struct pci_dev *dev,
+ struct pci_board *board)
+{
+ struct isapnp_resources *res = (struct isapnp_resources *)dev->sysdata;
+ struct isapnp_resources *resa;
+
+ if (dev->active)
+ return 1;
+
+ if (!(check_name(dev->name) || check_name(dev->bus->name)))
+ return 1;
+
+ if (res->next)
+ return 1;
+
+ for (resa = res->alt; resa; resa = resa->alt) {
+ struct isapnp_port *port;
+ for (port = res->port; port; port = port->next)
+ if ((port->size == 8) &&
+ ((port->min == 0x2f8) ||
+ (port->min == 0x3f8) ||
+ (port->min == 0x2e8) ||
+ (port->min == 0x3e8)))
+ return 0;
+ }
+
+ return 1;
+}
+
 static void __init probe_serial_pnp(void)
 {
        struct pci_dev *dev = NULL;
@@ -4409,13 +4567,18 @@
                return;
        }
 
- for (board = pnp_devices; board->vendor; board++) {
- while ((dev = isapnp_find_dev(NULL, board->vendor,
- board->device, dev))) {
- if (board->flags & SPCI_FL_NO_SHIRQ)
- avoid_irq_share(dev);
- start_pci_pnp_board(dev, board);
- }
+ isapnp_for_each_dev(dev) {
+ for (board = pnp_devices; board->vendor; board++)
+ if ((dev->vendor == board->vendor) &&
+ (dev->device == board->device))
+ break;
+
+ if (board->vendor == 0 && serial_pnp_guess_board(dev, board))
+ continue;
+
+ if (board->flags & SPCI_FL_NO_SHIRQ)
+ avoid_irq_share(dev);
+ start_pci_pnp_board(dev, board);
        }
 
 #ifdef SERIAL_DEBUG_PNP
@@ -4615,10 +4778,15 @@
         unsigned long flags;
         struct serial_state *state;
         struct async_struct *info;
+ unsigned long port;
+
+ port = req->port;
+ if (HIGH_BITS_OFFSET)
+ port += req->port_high << HIGH_BITS_OFFSET;
 
         save_flags(flags); cli();
         for (i = 0; i < NR_PORTS; i++) {
- if ((rs_table[i].port == req->port) &&
+ if ((rs_table[i].port == port) &&
                     (rs_table[i].iomem_base == req->iomem_base))
                         break;
         }
@@ -4636,11 +4804,11 @@
         if (rs_table[i].count) {
                 restore_flags(flags);
                 printk("Couldn't configure serial #%d (port=%ld,irq=%d): "
- "device already open\n", i, req->port, req->irq);
+ "device already open\n", i, port, req->irq);
                 return -1;
         }
         state->irq = req->irq;
- state->port = req->port;
+ state->port = port;
         state->flags = req->flags;
         state->io_type = req->io_type;
         state->iomem_base = req->iomem_base;
@@ -4648,7 +4816,7 @@
         if (req->baud_base)
                 state->baud_base = req->baud_base;
         if ((info = state->info) != NULL) {
- info->port = req->port;
+ info->port = port;
                 info->flags = req->flags;
                 info->io_type = req->io_type;
                 info->iomem_base = req->iomem_base;
@@ -4951,6 +5119,8 @@
         info->magic = SERIAL_MAGIC;
         info->state = state;
         info->port = state->port;
+ if (HIGH_BITS_OFFSET)
+ info->port += state->port_high << HIGH_BITS_OFFSET;
         info->flags = state->flags;
 #ifdef CONFIG_HUB6
         info->hub6 = state->hub6;
@@ -5023,6 +5193,6 @@
 
 /*
   Local variables:
- compile-command: "gcc -D__KERNEL__ -I../../include -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -fno-strict-aliasing -pipe -fno-strength-reduce -march=i686 -DMODULE -DMODVERSIONS -include ../../include/linux/modversions.h -DEXPORT_SYMTAB -c serial.c"
+ compile-command: "gcc -D__KERNEL__ -I../../include -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -fno-strict-aliasing -D__SMP__ -pipe -fno-strength-reduce -march=i586 -DMODULE -DMODVERSIONS -include ../../include/linux/modversions.h -DEXPORT_SYMTAB -c serial.c"
   End:
 */
===================================================================
RCS file: include/linux/RCS/serial.h,v
retrieving revision 1.1
diff -u -r1.1 include/linux/serial.h
--- include/linux/serial.h 2000/04/26 01:50:10 1.1
+++ include/linux/serial.h 2000/04/26 02:52:38
@@ -30,7 +30,7 @@
 struct serial_struct {
         int type;
         int line;
- unsigned long port;
+ unsigned int port;
         int irq;
         int flags;
         int xmit_fifo_size;
@@ -44,7 +44,8 @@
         unsigned short closing_wait2; /* no longer used... */
         unsigned char *iomem_base;
         unsigned short iomem_reg_shift;
- int reserved[2];
+ unsigned int port_high;
+ int reserved[1];
 };
 
 /*
@@ -115,7 +116,10 @@
 
 #define ASYNC_LOW_LATENCY 0x2000 /* Request low latency behaviour */
 
-#define ASYNC_FLAGS 0x3FFF /* Possible legal async flags */
+#define ASYNC_BUGGY_UART 0x4000 /* This is a buggy UART, skip some safety
+ * checks. Note: can be dangerous! */
+
+#define ASYNC_FLAGS 0x7FFF /* Possible legal async flags */
 #define ASYNC_USR_MASK 0x3430 /* Legal flags that non-privileged
                                  * users can set or reset */
 
@@ -127,7 +131,8 @@
 #define ASYNC_CLOSING 0x08000000 /* Serial port is closing */
 #define ASYNC_CTS_FLOW 0x04000000 /* Do CTS flow control */
 #define ASYNC_CHECK_CD 0x02000000 /* i.e., CLOCAL */
-#define ASYNC_SHARE_IRQ 0x01000000 /* for multifunction cards */
+#define ASYNC_SHARE_IRQ 0x01000000 /* for multifunction cards
+ --- no longer used */
 
 #define ASYNC_INTERNAL_FLAGS 0xFF000000 /* Internal flags */
 
===================================================================
RCS file: include/linux/RCS/serialP.h,v
retrieving revision 1.1
diff -u -r1.1 include/linux/serialP.h
--- include/linux/serialP.h 2000/04/26 01:50:10 1.1
+++ include/linux/serialP.h 2000/04/26 01:59:41
@@ -24,6 +24,11 @@
 #include <linux/tqueue.h>
 #include <linux/circ_buf.h>
 #include <linux/wait.h>
+#if (LINUX_VERSION_CODE < 0x020300)
+/* Unfortunate, but Linux 2.2 needs async_icount defined here and
+ * it got moved in 2.3 */
+#include <linux/serial.h>
+#endif
 
 struct serial_state {
         int magic;
===================================================================
RCS file: include/linux/RCS/pci_ids.h,v
retrieving revision 1.1
diff -u -r1.1 include/linux/pci_ids.h
--- include/linux/pci_ids.h 2000/04/26 02:26:59 1.1
+++ include/linux/pci_ids.h 2000/04/26 02:31:36
@@ -541,6 +541,8 @@
 #define PCI_DEVICE_ID_DATABOOK_87144 0xb106
 
 #define PCI_VENDOR_ID_PLX 0x10b5
+#define PCI_VENDOR_ID_PLX_ROMULUS 0x106a
+#define PCI_DEVICE_ID_PLX_SPCOM800 0x1076
 #define PCI_DEVICE_ID_PLX_SPCOM200 0x1103
 #define PCI_DEVICE_ID_PLX_9050 0x9050
 #define PCI_DEVICE_ID_PLX_9060 0x9060

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.rutgers.edu
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Sun Apr 30 2000 - 21:00:10 EST