Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
cc918c7a
Commit
cc918c7a
authored
Jan 07, 2006
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge master.kernel.org:/home/rmk/linux-2.6-serial
parents
f9c5d045
dd68e88c
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
163 additions
and
46 deletions
+163
-46
drivers/serial/8250.c
drivers/serial/8250.c
+29
-31
drivers/serial/8250.h
drivers/serial/8250.h
+0
-6
drivers/serial/8250_pci.c
drivers/serial/8250_pci.c
+116
-8
drivers/serial/serial_core.c
drivers/serial/serial_core.c
+1
-1
include/linux/pci_ids.h
include/linux/pci_ids.h
+17
-0
No files found.
drivers/serial/8250.c
View file @
cc918c7a
...
...
@@ -296,7 +296,7 @@ static inline int map_8250_out_reg(struct uart_8250_port *up, int offset)
#endif
static
_INLINE_
unsigned
int
serial_in
(
struct
uart_8250_port
*
up
,
int
offset
)
static
unsigned
int
serial_in
(
struct
uart_8250_port
*
up
,
int
offset
)
{
offset
=
map_8250_in_reg
(
up
,
offset
)
<<
up
->
port
.
regshift
;
...
...
@@ -321,7 +321,7 @@ static _INLINE_ unsigned int serial_in(struct uart_8250_port *up, int offset)
}
}
static
_INLINE_
void
static
void
serial_out
(
struct
uart_8250_port
*
up
,
int
offset
,
int
value
)
{
offset
=
map_8250_out_reg
(
up
,
offset
)
<<
up
->
port
.
regshift
;
...
...
@@ -1131,7 +1131,7 @@ static void serial8250_enable_ms(struct uart_port *port)
serial_out
(
up
,
UART_IER
,
up
->
ier
);
}
static
_INLINE_
void
static
void
receive_chars
(
struct
uart_8250_port
*
up
,
int
*
status
,
struct
pt_regs
*
regs
)
{
struct
tty_struct
*
tty
=
up
->
port
.
info
->
tty
;
...
...
@@ -1217,7 +1217,7 @@ receive_chars(struct uart_8250_port *up, int *status, struct pt_regs *regs)
*
status
=
lsr
;
}
static
_INLINE_
void
transmit_chars
(
struct
uart_8250_port
*
up
)
static
void
transmit_chars
(
struct
uart_8250_port
*
up
)
{
struct
circ_buf
*
xmit
=
&
up
->
port
.
info
->
xmit
;
int
count
;
...
...
@@ -1255,25 +1255,24 @@ static _INLINE_ void transmit_chars(struct uart_8250_port *up)
__stop_tx
(
up
);
}
static
_INLINE_
void
check_modem_status
(
struct
uart_8250_port
*
up
)
static
unsigned
int
check_modem_status
(
struct
uart_8250_port
*
up
)
{
int
status
;
status
=
serial_in
(
up
,
UART_MSR
);
unsigned
int
status
=
serial_in
(
up
,
UART_MSR
);
if
((
status
&
UART_MSR_ANY_DELTA
)
==
0
)
return
;
if
(
status
&
UART_MSR_ANY_DELTA
&&
up
->
ier
&
UART_IER_MSI
)
{
if
(
status
&
UART_MSR_TERI
)
up
->
port
.
icount
.
rng
++
;
if
(
status
&
UART_MSR_DDSR
)
up
->
port
.
icount
.
dsr
++
;
if
(
status
&
UART_MSR_DDCD
)
uart_handle_dcd_change
(
&
up
->
port
,
status
&
UART_MSR_DCD
);
if
(
status
&
UART_MSR_DCTS
)
uart_handle_cts_change
(
&
up
->
port
,
status
&
UART_MSR_CTS
);
if
(
status
&
UART_MSR_TERI
)
up
->
port
.
icount
.
rng
++
;
if
(
status
&
UART_MSR_DDSR
)
up
->
port
.
icount
.
dsr
++
;
if
(
status
&
UART_MSR_DDCD
)
uart_handle_dcd_change
(
&
up
->
port
,
status
&
UART_MSR_DCD
);
if
(
status
&
UART_MSR_DCTS
)
uart_handle_cts_change
(
&
up
->
port
,
status
&
UART_MSR_CTS
);
wake_up_interruptible
(
&
up
->
port
.
info
->
delta_msr_wait
);
}
wake_up_interruptible
(
&
up
->
port
.
info
->
delta_msr_wait
)
;
return
status
;
}
/*
...
...
@@ -1282,7 +1281,11 @@ static _INLINE_ void check_modem_status(struct uart_8250_port *up)
static
inline
void
serial8250_handle_port
(
struct
uart_8250_port
*
up
,
struct
pt_regs
*
regs
)
{
unsigned
int
status
=
serial_inp
(
up
,
UART_LSR
);
unsigned
int
status
;
spin_lock
(
&
up
->
port
.
lock
);
status
=
serial_inp
(
up
,
UART_LSR
);
DEBUG_INTR
(
"status = %x..."
,
status
);
...
...
@@ -1291,6 +1294,8 @@ serial8250_handle_port(struct uart_8250_port *up, struct pt_regs *regs)
check_modem_status
(
up
);
if
(
status
&
UART_LSR_THRE
)
transmit_chars
(
up
);
spin_unlock
(
&
up
->
port
.
lock
);
}
/*
...
...
@@ -1326,9 +1331,7 @@ static irqreturn_t serial8250_interrupt(int irq, void *dev_id, struct pt_regs *r
iir
=
serial_in
(
up
,
UART_IIR
);
if
(
!
(
iir
&
UART_IIR_NO_INT
))
{
spin_lock
(
&
up
->
port
.
lock
);
serial8250_handle_port
(
up
,
regs
);
spin_unlock
(
&
up
->
port
.
lock
);
handled
=
1
;
...
...
@@ -1427,11 +1430,8 @@ static void serial8250_timeout(unsigned long data)
unsigned
int
iir
;
iir
=
serial_in
(
up
,
UART_IIR
);
if
(
!
(
iir
&
UART_IIR_NO_INT
))
{
spin_lock
(
&
up
->
port
.
lock
);
if
(
!
(
iir
&
UART_IIR_NO_INT
))
serial8250_handle_port
(
up
,
NULL
);
spin_unlock
(
&
up
->
port
.
lock
);
}
timeout
=
up
->
port
.
timeout
;
timeout
=
timeout
>
6
?
(
timeout
/
2
-
2
)
:
1
;
...
...
@@ -1454,10 +1454,10 @@ static unsigned int serial8250_tx_empty(struct uart_port *port)
static
unsigned
int
serial8250_get_mctrl
(
struct
uart_port
*
port
)
{
struct
uart_8250_port
*
up
=
(
struct
uart_8250_port
*
)
port
;
unsigned
char
status
;
unsigned
int
status
;
unsigned
int
ret
;
status
=
serial_in
(
up
,
UART_MSR
);
status
=
check_modem_status
(
up
);
ret
=
0
;
if
(
status
&
UART_MSR_DCD
)
...
...
@@ -2300,9 +2300,7 @@ static int __init find_port(struct uart_port *p)
for
(
line
=
0
;
line
<
UART_NR
;
line
++
)
{
port
=
&
serial8250_ports
[
line
].
port
;
if
(
p
->
iotype
==
port
->
iotype
&&
p
->
iobase
==
port
->
iobase
&&
p
->
membase
==
port
->
membase
)
if
(
uart_match_port
(
p
,
port
))
return
line
;
}
return
-
ENODEV
;
...
...
drivers/serial/8250.h
View file @
cc918c7a
...
...
@@ -51,12 +51,6 @@ struct serial8250_config {
#define UART_BUG_TXEN (1 << 1)
/* UART has buggy TX IIR status */
#define UART_BUG_NOMSR (1 << 2)
/* UART has buggy MSR status bits (Au1x00) */
#if defined(__i386__) && (defined(CONFIG_M386) || defined(CONFIG_M486))
#define _INLINE_ inline
#else
#define _INLINE_
#endif
#define PROBE_RSA (1 << 0)
#define PROBE_ANY (~0)
...
...
drivers/serial/8250_pci.c
View file @
cc918c7a
...
...
@@ -837,8 +837,8 @@ static struct pci_serial_quirk *find_quirk(struct pci_dev *dev)
return
quirk
;
}
static
_INLINE_
int
get_pci_irq
(
struct
pci_dev
*
dev
,
struct
pciserial_board
*
board
)
static
inline
int
get_pci_irq
(
struct
pci_dev
*
dev
,
struct
pciserial_board
*
board
)
{
if
(
board
->
flags
&
FL_NOIRQ
)
return
0
;
...
...
@@ -853,14 +853,15 @@ get_pci_irq(struct pci_dev *dev, struct pciserial_board *board)
* driver_data member.
*
* The makeup of these names are:
* pbn_bn{_bt}_n_baud
* pbn_bn{_bt}_n_baud
{_offsetinhex}
*
* bn = PCI BAR number
* bt = Index using PCI BARs
* n = number of serial ports
* baud = baud rate
* bn = PCI BAR number
* bt = Index using PCI BARs
* n = number of serial ports
* baud = baud rate
* offsetinhex = offset for each sequential port (in hex)
*
* This table is sorted by (in order): b
aud, bt, bn
, n.
* This table is sorted by (in order): b
n, bt, baud, offsetindex
, n.
*
* Please note: in theory if n = 1, _bt infix should make no difference.
* ie, pbn_b0_1_115200 is the same as pbn_b0_bt_1_115200
...
...
@@ -881,6 +882,13 @@ enum pci_board_num_t {
pbn_b0_4_1152000
,
pbn_b0_2_1843200
,
pbn_b0_4_1843200
,
pbn_b0_2_1843200_200
,
pbn_b0_4_1843200_200
,
pbn_b0_8_1843200_200
,
pbn_b0_bt_1_115200
,
pbn_b0_bt_2_115200
,
pbn_b0_bt_8_115200
,
...
...
@@ -904,6 +912,8 @@ enum pci_board_num_t {
pbn_b1_4_921600
,
pbn_b1_8_921600
,
pbn_b1_2_1250000
,
pbn_b1_bt_2_921600
,
pbn_b1_1_1382400
,
...
...
@@ -1029,6 +1039,38 @@ static struct pciserial_board pci_boards[] __devinitdata = {
.
uart_offset
=
8
,
},
[
pbn_b0_2_1843200
]
=
{
.
flags
=
FL_BASE0
,
.
num_ports
=
2
,
.
base_baud
=
1843200
,
.
uart_offset
=
8
,
},
[
pbn_b0_4_1843200
]
=
{
.
flags
=
FL_BASE0
,
.
num_ports
=
4
,
.
base_baud
=
1843200
,
.
uart_offset
=
8
,
},
[
pbn_b0_2_1843200_200
]
=
{
.
flags
=
FL_BASE0
,
.
num_ports
=
2
,
.
base_baud
=
1843200
,
.
uart_offset
=
0x200
,
},
[
pbn_b0_4_1843200_200
]
=
{
.
flags
=
FL_BASE0
,
.
num_ports
=
4
,
.
base_baud
=
1843200
,
.
uart_offset
=
0x200
,
},
[
pbn_b0_8_1843200_200
]
=
{
.
flags
=
FL_BASE0
,
.
num_ports
=
8
,
.
base_baud
=
1843200
,
.
uart_offset
=
0x200
,
},
[
pbn_b0_bt_1_115200
]
=
{
.
flags
=
FL_BASE0
|
FL_BASE_BARS
,
.
num_ports
=
1
,
...
...
@@ -1141,6 +1183,12 @@ static struct pciserial_board pci_boards[] __devinitdata = {
.
base_baud
=
921600
,
.
uart_offset
=
8
,
},
[
pbn_b1_2_1250000
]
=
{
.
flags
=
FL_BASE1
,
.
num_ports
=
2
,
.
base_baud
=
1250000
,
.
uart_offset
=
8
,
},
[
pbn_b1_bt_2_921600
]
=
{
.
flags
=
FL_BASE1
|
FL_BASE_BARS
,
...
...
@@ -1801,6 +1849,66 @@ static struct pci_device_id serial_pci_tbl[] = {
PCI_SUBVENDOR_ID_CONNECT_TECH
,
PCI_SUBDEVICE_ID_CONNECT_TECH_BH041101V1
,
0
,
0
,
pbn_b1_4_921600
},
{
PCI_VENDOR_ID_V3
,
PCI_DEVICE_ID_V3_V351
,
PCI_SUBVENDOR_ID_CONNECT_TECH
,
PCI_SUBDEVICE_ID_CONNECT_TECH_BH2_20MHZ
,
0
,
0
,
pbn_b1_2_1250000
},
{
PCI_VENDOR_ID_OXSEMI
,
PCI_DEVICE_ID_OXSEMI_16PCI954
,
PCI_SUBVENDOR_ID_CONNECT_TECH
,
PCI_SUBDEVICE_ID_CONNECT_TECH_TITAN_2
,
0
,
0
,
pbn_b0_2_1843200
},
{
PCI_VENDOR_ID_OXSEMI
,
PCI_DEVICE_ID_OXSEMI_16PCI954
,
PCI_SUBVENDOR_ID_CONNECT_TECH
,
PCI_SUBDEVICE_ID_CONNECT_TECH_TITAN_4
,
0
,
0
,
pbn_b0_4_1843200
},
{
PCI_VENDOR_ID_EXAR
,
PCI_DEVICE_ID_EXAR_XR17C152
,
PCI_SUBVENDOR_ID_CONNECT_TECH
,
PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_2_232
,
0
,
0
,
pbn_b0_2_1843200_200
},
{
PCI_VENDOR_ID_EXAR
,
PCI_DEVICE_ID_EXAR_XR17C154
,
PCI_SUBVENDOR_ID_CONNECT_TECH
,
PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_4_232
,
0
,
0
,
pbn_b0_4_1843200_200
},
{
PCI_VENDOR_ID_EXAR
,
PCI_DEVICE_ID_EXAR_XR17C158
,
PCI_SUBVENDOR_ID_CONNECT_TECH
,
PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_8_232
,
0
,
0
,
pbn_b0_8_1843200_200
},
{
PCI_VENDOR_ID_EXAR
,
PCI_DEVICE_ID_EXAR_XR17C152
,
PCI_SUBVENDOR_ID_CONNECT_TECH
,
PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_1_1
,
0
,
0
,
pbn_b0_2_1843200_200
},
{
PCI_VENDOR_ID_EXAR
,
PCI_DEVICE_ID_EXAR_XR17C154
,
PCI_SUBVENDOR_ID_CONNECT_TECH
,
PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_2_2
,
0
,
0
,
pbn_b0_4_1843200_200
},
{
PCI_VENDOR_ID_EXAR
,
PCI_DEVICE_ID_EXAR_XR17C158
,
PCI_SUBVENDOR_ID_CONNECT_TECH
,
PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_4_4
,
0
,
0
,
pbn_b0_8_1843200_200
},
{
PCI_VENDOR_ID_EXAR
,
PCI_DEVICE_ID_EXAR_XR17C152
,
PCI_SUBVENDOR_ID_CONNECT_TECH
,
PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_2
,
0
,
0
,
pbn_b0_2_1843200_200
},
{
PCI_VENDOR_ID_EXAR
,
PCI_DEVICE_ID_EXAR_XR17C154
,
PCI_SUBVENDOR_ID_CONNECT_TECH
,
PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_4
,
0
,
0
,
pbn_b0_4_1843200_200
},
{
PCI_VENDOR_ID_EXAR
,
PCI_DEVICE_ID_EXAR_XR17C158
,
PCI_SUBVENDOR_ID_CONNECT_TECH
,
PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_8
,
0
,
0
,
pbn_b0_8_1843200_200
},
{
PCI_VENDOR_ID_EXAR
,
PCI_DEVICE_ID_EXAR_XR17C152
,
PCI_SUBVENDOR_ID_CONNECT_TECH
,
PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_2_485
,
0
,
0
,
pbn_b0_2_1843200_200
},
{
PCI_VENDOR_ID_EXAR
,
PCI_DEVICE_ID_EXAR_XR17C154
,
PCI_SUBVENDOR_ID_CONNECT_TECH
,
PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_4_485
,
0
,
0
,
pbn_b0_4_1843200_200
},
{
PCI_VENDOR_ID_EXAR
,
PCI_DEVICE_ID_EXAR_XR17C158
,
PCI_SUBVENDOR_ID_CONNECT_TECH
,
PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_8_485
,
0
,
0
,
pbn_b0_8_1843200_200
},
{
PCI_VENDOR_ID_SEALEVEL
,
PCI_DEVICE_ID_SEALEVEL_U530
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
...
...
drivers/serial/serial_core.c
View file @
cc918c7a
...
...
@@ -2307,7 +2307,7 @@ int uart_match_port(struct uart_port *port1, struct uart_port *port2)
return
(
port1
->
iobase
==
port2
->
iobase
)
&&
(
port1
->
hub6
==
port2
->
hub6
);
case
UPIO_MEM
:
return
(
port1
->
m
embase
==
port2
->
mem
base
);
return
(
port1
->
m
apbase
==
port2
->
map
base
);
}
return
0
;
}
...
...
include/linux/pci_ids.h
View file @
cc918c7a
...
...
@@ -1583,6 +1583,23 @@
#define PCI_SUBDEVICE_ID_CONNECT_TECH_BH8_485_2_6 0x0009
#define PCI_SUBDEVICE_ID_CONNECT_TECH_BH081101V1 0x000A
#define PCI_SUBDEVICE_ID_CONNECT_TECH_BH041101V1 0x000B
#define PCI_SUBDEVICE_ID_CONNECT_TECH_BH2_20MHZ 0x000C
#define PCI_SUBDEVICE_ID_CONNECT_TECH_BH2_PTM 0x000D
#define PCI_SUBDEVICE_ID_CONNECT_TECH_NT960PCI 0x0100
#define PCI_SUBDEVICE_ID_CONNECT_TECH_TITAN_2 0x0201
#define PCI_SUBDEVICE_ID_CONNECT_TECH_TITAN_4 0x0202
#define PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_2_232 0x0300
#define PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_4_232 0x0301
#define PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_8_232 0x0302
#define PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_1_1 0x0310
#define PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_2_2 0x0311
#define PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_4_4 0x0312
#define PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_2 0x0320
#define PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_4 0x0321
#define PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_8 0x0322
#define PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_2_485 0x0330
#define PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_4_485 0x0331
#define PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_8_485 0x0332
#define PCI_VENDOR_ID_NVIDIA_SGS 0x12d2
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment