aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/tty/serial/8250_pci.c
diff options
context:
space:
mode:
authorDan Williams <dan.j.williams@intel.com>2011-11-22 16:41:24 -0500
committerGreg Kroah-Hartman <gregkh@suse.de>2011-11-26 23:11:20 -0500
commit448ac154c957c4580531fa0c8f2045816fe2f0e7 (patch)
tree45b5f8c1108baa78841b9fc59a9afdfd67a6c712 /drivers/tty/serial/8250_pci.c
parentd0758a285caaf86192cdb22136a5eb84ed72f276 (diff)
serial/8250_pci: setup-quirk workaround for the kt serial controller
Workaround dropped notifications in the iir register. Prevent reads coincident with new interrupt notifications by reading the iir at most once per interrupt. Reported-by: Nhan H Mai <nhan.h.mai@intel.com> Signed-off-by: Dan Williams <dan.j.williams@intel.com> Acked-by: Alan Cox <alan@linux.intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/tty/serial/8250_pci.c')
-rw-r--r--drivers/tty/serial/8250_pci.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/drivers/tty/serial/8250_pci.c b/drivers/tty/serial/8250_pci.c
index 825937a5f210..8742ef5be6ba 100644
--- a/drivers/tty/serial/8250_pci.c
+++ b/drivers/tty/serial/8250_pci.c
@@ -1092,6 +1092,14 @@ static int skip_tx_en_setup(struct serial_private *priv,
1092 return pci_default_setup(priv, board, port, idx); 1092 return pci_default_setup(priv, board, port, idx);
1093} 1093}
1094 1094
1095static int kt_serial_setup(struct serial_private *priv,
1096 const struct pciserial_board *board,
1097 struct uart_port *port, int idx)
1098{
1099 port->flags |= UPF_IIR_ONCE;
1100 return skip_tx_en_setup(priv, board, port, idx);
1101}
1102
1095static int pci_eg20t_init(struct pci_dev *dev) 1103static int pci_eg20t_init(struct pci_dev *dev)
1096{ 1104{
1097#if defined(CONFIG_SERIAL_PCH_UART) || defined(CONFIG_SERIAL_PCH_UART_MODULE) 1105#if defined(CONFIG_SERIAL_PCH_UART) || defined(CONFIG_SERIAL_PCH_UART_MODULE)
@@ -1110,7 +1118,6 @@ pci_xr17c154_setup(struct serial_private *priv,
1110 return pci_default_setup(priv, board, port, idx); 1118 return pci_default_setup(priv, board, port, idx);
1111} 1119}
1112 1120
1113/* This should be in linux/pci_ids.h */
1114#define PCI_VENDOR_ID_SBSMODULARIO 0x124B 1121#define PCI_VENDOR_ID_SBSMODULARIO 0x124B
1115#define PCI_SUBVENDOR_ID_SBSMODULARIO 0x124B 1122#define PCI_SUBVENDOR_ID_SBSMODULARIO 0x124B
1116#define PCI_DEVICE_ID_OCTPRO 0x0001 1123#define PCI_DEVICE_ID_OCTPRO 0x0001
@@ -1136,6 +1143,7 @@ pci_xr17c154_setup(struct serial_private *priv,
1136#define PCI_DEVICE_ID_OXSEMI_16PCI958 0x9538 1143#define PCI_DEVICE_ID_OXSEMI_16PCI958 0x9538
1137#define PCIE_DEVICE_ID_NEO_2_OX_IBM 0x00F6 1144#define PCIE_DEVICE_ID_NEO_2_OX_IBM 0x00F6
1138#define PCI_DEVICE_ID_PLX_CRONYX_OMEGA 0xc001 1145#define PCI_DEVICE_ID_PLX_CRONYX_OMEGA 0xc001
1146#define PCI_DEVICE_ID_INTEL_PATSBURG_KT 0x1d3d
1139 1147
1140/* Unknown vendors/cards - this should not be in linux/pci_ids.h */ 1148/* Unknown vendors/cards - this should not be in linux/pci_ids.h */
1141#define PCI_SUBDEVICE_ID_UNKNOWN_0x1584 0x1584 1149#define PCI_SUBDEVICE_ID_UNKNOWN_0x1584 0x1584
@@ -1220,6 +1228,13 @@ static struct pci_serial_quirk pci_serial_quirks[] __refdata = {
1220 .subdevice = PCI_ANY_ID, 1228 .subdevice = PCI_ANY_ID,
1221 .setup = ce4100_serial_setup, 1229 .setup = ce4100_serial_setup,
1222 }, 1230 },
1231 {
1232 .vendor = PCI_VENDOR_ID_INTEL,
1233 .device = PCI_DEVICE_ID_INTEL_PATSBURG_KT,
1234 .subvendor = PCI_ANY_ID,
1235 .subdevice = PCI_ANY_ID,
1236 .setup = kt_serial_setup,
1237 },
1223 /* 1238 /*
1224 * ITE 1239 * ITE
1225 */ 1240 */