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
fba0a9a3
Commit
fba0a9a3
authored
Dec 01, 2002
by
James Bottomley
Browse files
Options
Browse Files
Download
Plain Diff
Merge
ssh://mulgrave-w/BK/scsi-misc-2.5
into raven.il.steeleye.com:/home/jejb/BK/scsi-for-linus-2.5
parents
3e0bb0d1
493c6685
Changes
15
Hide whitespace changes
Inline
Side-by-side
Showing
15 changed files
with
225 additions
and
128 deletions
+225
-128
drivers/acorn/scsi/acornscsi.c
drivers/acorn/scsi/acornscsi.c
+2
-2
drivers/acorn/scsi/arxescsi.c
drivers/acorn/scsi/arxescsi.c
+1
-1
drivers/acorn/scsi/cumana_2.c
drivers/acorn/scsi/cumana_2.c
+1
-1
drivers/acorn/scsi/eesox.c
drivers/acorn/scsi/eesox.c
+1
-1
drivers/acorn/scsi/fas216.c
drivers/acorn/scsi/fas216.c
+1
-1
drivers/acorn/scsi/powertec.c
drivers/acorn/scsi/powertec.c
+1
-1
drivers/char/tty_io.c
drivers/char/tty_io.c
+31
-13
drivers/serial/8250.c
drivers/serial/8250.c
+10
-10
drivers/serial/8250_pci.c
drivers/serial/8250_pci.c
+9
-2
drivers/serial/Makefile
drivers/serial/Makefile
+1
-1
drivers/serial/core.c
drivers/serial/core.c
+164
-88
include/linux/serial.h
include/linux/serial.h
+1
-0
include/linux/serial_core.h
include/linux/serial_core.h
+1
-2
include/linux/tty.h
include/linux/tty.h
+1
-0
kernel/ksyms.c
kernel/ksyms.c
+0
-5
No files found.
drivers/acorn/scsi/acornscsi.c
View file @
fba0a9a3
...
...
@@ -2935,9 +2935,9 @@ int acornscsi_proc_info(char *buffer, char **start, off_t offset,
}
}
p
+=
sprintf
(
p
,
"
\n
Attached devices:
%s
\n
"
,
instance
->
host_queue
?
""
:
" none
"
);
p
+=
sprintf
(
p
,
"
\n
Attached devices:
\n
"
);
for
(
scd
=
instance
->
host_queue
;
scd
;
scd
=
scd
->
next
)
{
list_for_each_entry
(
scd
,
&
instance
->
my_devices
,
siblings
)
{
int
len
;
proc_print_scsidevice
(
scd
,
p
,
&
len
,
0
);
...
...
drivers/acorn/scsi/arxescsi.c
View file @
fba0a9a3
...
...
@@ -311,7 +311,7 @@ int arxescsi_proc_info(char *buffer, char **start, off_t offset,
pos
+=
sprintf
(
buffer
+
pos
,
"
\n
Attached devices:
\n
"
);
for
(
scd
=
host
->
host_queue
;
scd
;
scd
=
scd
->
next
)
{
list_for_each_entry
(
scd
,
&
host
->
my_devices
,
siblings
)
{
pos
+=
fas216_print_device
(
&
info
->
info
,
scd
,
buffer
+
pos
);
if
(
pos
+
begin
<
offset
)
{
...
...
drivers/acorn/scsi/cumana_2.c
View file @
fba0a9a3
...
...
@@ -387,7 +387,7 @@ int cumanascsi_2_proc_info (char *buffer, char **start, off_t offset,
pos
+=
sprintf
(
buffer
+
pos
,
"
\n
Attached devices:
\n
"
);
for
(
scd
=
host
->
host_queue
;
scd
;
scd
=
scd
->
next
)
{
list_for_each_entry
(
scd
,
&
host
->
my_devices
,
siblings
)
{
int
len
;
proc_print_scsidevice
(
scd
,
buffer
,
&
len
,
pos
);
...
...
drivers/acorn/scsi/eesox.c
View file @
fba0a9a3
...
...
@@ -390,7 +390,7 @@ int eesoxscsi_proc_info(char *buffer, char **start, off_t offset,
pos
+=
sprintf
(
buffer
+
pos
,
"
\n
Attached devices:
\n
"
);
for
(
scd
=
host
->
host_queue
;
scd
;
scd
=
scd
->
next
)
{
list_for_each_entry
(
scd
,
&
host
->
my_devices
,
siblings
)
{
int
len
;
proc_print_scsidevice
(
scd
,
buffer
,
&
len
,
pos
);
...
...
drivers/acorn/scsi/fas216.c
View file @
fba0a9a3
...
...
@@ -2631,7 +2631,7 @@ int fas216_eh_bus_reset(Scsi_Cmnd *SCpnt)
* all command structures. Leave the running
* command in place.
*/
for
(
SDpnt
=
info
->
host
->
host_queue
;
SDpnt
;
SDpnt
=
SDpnt
->
next
)
{
list_for_each_entry
(
SDpnt
,
&
info
->
host
->
my_devices
,
siblings
)
{
int
i
;
if
(
SDpnt
->
soft_reset
)
...
...
drivers/acorn/scsi/powertec.c
View file @
fba0a9a3
...
...
@@ -269,7 +269,7 @@ int powertecscsi_proc_info(char *buffer, char **start, off_t offset,
pos
+=
sprintf
(
buffer
+
pos
,
"
\n
Attached devices:
\n
"
);
for
(
scd
=
host
->
host_queue
;
scd
;
scd
=
scd
->
next
)
{
list_for_each_entry
(
scd
,
&
host
->
my_devices
,
siblings
)
{
pos
+=
fas216_print_device
(
&
info
->
info
,
scd
,
buffer
+
pos
);
if
(
pos
+
begin
<
offset
)
{
...
...
drivers/char/tty_io.c
View file @
fba0a9a3
...
...
@@ -372,6 +372,8 @@ int tty_check_change(struct tty_struct * tty)
return
-
ERESTARTSYS
;
}
EXPORT_SYMBOL
(
tty_check_change
);
static
ssize_t
hung_up_tty_read
(
struct
file
*
file
,
char
*
buf
,
size_t
count
,
loff_t
*
ppos
)
{
...
...
@@ -540,6 +542,8 @@ void tty_hangup(struct tty_struct * tty)
schedule_work
(
&
tty
->
hangup_work
);
}
EXPORT_SYMBOL
(
tty_hangup
);
void
tty_vhangup
(
struct
tty_struct
*
tty
)
{
#ifdef TTY_DEBUG_HANGUP
...
...
@@ -556,6 +560,8 @@ int tty_hung_up_p(struct file * filp)
return
(
filp
->
f_op
==
&
hung_up_tty_fops
);
}
EXPORT_SYMBOL
(
tty_hung_up_p
);
/*
* This function is typically called only by the session leader, when
* it wants to disassociate itself from its controlling tty.
...
...
@@ -1886,6 +1892,8 @@ void do_SAK(struct tty_struct *tty)
schedule_work
(
&
tty
->
SAK_work
);
}
EXPORT_SYMBOL
(
do_SAK
);
/*
* This routine is called out of the software interrupt to flush data
* from the flip buffer to the line discipline.
...
...
@@ -1946,34 +1954,44 @@ static int baud_table[] = {
#endif
};
static
int
n_baud_table
=
sizeof
(
baud_table
)
/
sizeof
(
int
);
static
int
n_baud_table
=
ARRAY_SIZE
(
baud_table
);
int
tty_
get_baud_rate
(
struct
tty_struct
*
tty
)
int
tty_
termios_baud_rate
(
struct
termios
*
termios
)
{
unsigned
int
c
flag
,
i
;
unsigned
int
c
baud
=
termios
->
c_cflag
&
CBAUD
;
cflag
=
tty
->
termios
->
c_cflag
;
if
(
cbaud
&
CBAUDEX
)
{
cbaud
&=
~
CBAUDEX
;
i
=
cflag
&
CBAUD
;
if
(
i
&
CBAUDEX
)
{
i
&=
~
CBAUDEX
;
if
(
i
<
1
||
i
+
15
>=
n_baud_table
)
tty
->
termios
->
c_cflag
&=
~
CBAUDEX
;
if
(
cbaud
<
1
||
cbaud
+
15
>
n_baud_table
)
termios
->
c_cflag
&=
~
CBAUDEX
;
else
i
+=
15
;
cbaud
+=
15
;
}
if
(
i
==
15
&&
tty
->
alt_speed
)
{
return
baud_table
[
cbaud
];
}
EXPORT_SYMBOL
(
tty_termios_baud_rate
);
int
tty_get_baud_rate
(
struct
tty_struct
*
tty
)
{
int
baud
=
tty_termios_baud_rate
(
tty
->
termios
);
if
(
baud
==
38400
&&
tty
->
alt_speed
)
{
if
(
!
tty
->
warned
)
{
printk
(
KERN_WARNING
"Use of setserial/setrocket to "
"set SPD_* flags is deprecated
\n
"
);
tty
->
warned
=
1
;
}
return
(
tty
->
alt_speed
)
;
baud
=
tty
->
alt_speed
;
}
return
baud
_table
[
i
]
;
return
baud
;
}
EXPORT_SYMBOL
(
tty_get_baud_rate
);
void
tty_flip_buffer_push
(
struct
tty_struct
*
tty
)
{
if
(
tty
->
low_latency
)
...
...
drivers/serial/8250.c
View file @
fba0a9a3
...
...
@@ -517,7 +517,7 @@ static void autoconfig(struct uart_8250_port *up, unsigned int probeflags)
unsigned
char
save_lcr
,
save_mcr
;
unsigned
long
flags
;
if
(
!
up
->
port
.
iobase
&&
!
up
->
port
.
membase
)
if
(
!
up
->
port
.
iobase
&&
!
up
->
port
.
m
apbase
&&
!
up
->
port
.
m
embase
)
return
;
DEBUG_AUTOCONF
(
"ttyS%d: autoconf (0x%04x, 0x%08lx): "
,
...
...
@@ -1031,7 +1031,7 @@ static int serial_link_irq_chain(struct uart_8250_port *up)
ret
=
request_irq
(
up
->
port
.
irq
,
serial8250_interrupt
,
irq_flags
,
"serial"
,
i
);
if
(
ret
)
if
(
ret
<
0
)
serial_do_unlink
(
i
,
up
);
}
...
...
@@ -1623,7 +1623,7 @@ static int serial8250_request_port(struct uart_port *port)
if
(
up
->
port
.
flags
&
UPF_RESOURCES
)
{
if
(
up
->
port
.
type
==
PORT_RSA
)
{
ret
=
serial8250_request_rsa_resource
(
up
,
&
res_rsa
);
if
(
ret
)
if
(
ret
<
0
)
return
ret
;
}
...
...
@@ -1641,7 +1641,7 @@ static int serial8250_request_port(struct uart_port *port)
ret
=
-
ENOMEM
;
}
if
(
ret
)
{
if
(
ret
<
0
)
{
if
(
res_rsa
)
release_resource
(
res_rsa
);
if
(
res
)
...
...
@@ -1671,11 +1671,11 @@ static void serial8250_config_port(struct uart_port *port, int flags)
*/
if
(
up
->
port
.
flags
&
UPF_RESOURCES
)
{
ret
=
serial8250_request_std_resource
(
up
,
&
res_std
);
if
(
ret
)
if
(
ret
<
0
)
return
;
ret
=
serial8250_request_rsa_resource
(
up
,
&
res_rsa
);
if
(
ret
)
if
(
ret
<
0
)
probeflags
&=
~
PROBE_RSA
;
}
else
{
probeflags
&=
~
PROBE_RSA
;
...
...
@@ -1950,6 +1950,7 @@ static int __register_serial(struct serial_struct *req, int line)
port
.
regshift
=
req
->
iomem_reg_shift
;
port
.
iotype
=
req
->
io_type
;
port
.
flags
=
req
->
flags
|
UPF_BOOT_AUTOCONF
;
port
.
mapbase
=
req
->
iomap_base
;
port
.
line
=
line
;
if
(
share_irqs
)
...
...
@@ -2029,11 +2030,10 @@ static int __init serial8250_init(void)
spin_lock_init
(
&
irq_lists
[
i
].
lock
);
ret
=
uart_register_driver
(
&
serial8250_reg
);
if
(
ret
)
return
ret
;
if
(
ret
>=
0
)
serial8250_register_ports
(
&
serial8250_reg
)
;
serial8250_register_ports
(
&
serial8250_reg
);
return
0
;
return
ret
;
}
static
void
__exit
serial8250_exit
(
void
)
...
...
drivers/serial/8250_pci.c
View file @
fba0a9a3
...
...
@@ -176,6 +176,7 @@ get_pci_port(struct pci_dev *dev, struct pci_board *board,
return
0
;
}
req
->
io_type
=
SERIAL_IO_MEM
;
req
->
iomap_base
=
port
;
req
->
iomem_base
=
ioremap
(
port
,
board
->
uart_offset
);
if
(
req
->
iomem_base
==
NULL
)
return
-
ENOMEM
;
...
...
@@ -262,12 +263,14 @@ static int __devinit pci_plx9050_fn(struct pci_dev *dev, int enable)
* interface chip and different configuration methods:
* - 10x cards have control registers in IO and/or memory space;
* - 20x cards have control registers in standard PCI configuration space.
*
* Note: some SIIG cards are probed by the parport_serial object.
*/
#define PCI_DEVICE_ID_SIIG_1S_10x (PCI_DEVICE_ID_SIIG_1S_10x_550 & 0xfffc)
#define PCI_DEVICE_ID_SIIG_2S_10x (PCI_DEVICE_ID_SIIG_2S_10x_550 & 0xfff8)
static
int
__devini
t
pci_siig10x_fn
(
struct
pci_dev
*
dev
,
int
enable
)
in
t
pci_siig10x_fn
(
struct
pci_dev
*
dev
,
int
enable
)
{
u16
data
,
*
p
;
...
...
@@ -295,10 +298,12 @@ static int __devinit pci_siig10x_fn(struct pci_dev *dev, int enable)
return
0
;
}
EXPORT_SYMBOL
(
pci_siig10x_fn
);
#define PCI_DEVICE_ID_SIIG_2S_20x (PCI_DEVICE_ID_SIIG_2S_20x_550 & 0xfffc)
#define PCI_DEVICE_ID_SIIG_2S1P_20x (PCI_DEVICE_ID_SIIG_2S1P_20x_550 & 0xfffc)
static
int
__devini
t
pci_siig20x_fn
(
struct
pci_dev
*
dev
,
int
enable
)
in
t
pci_siig20x_fn
(
struct
pci_dev
*
dev
,
int
enable
)
{
u8
data
;
...
...
@@ -318,6 +323,8 @@ static int __devinit pci_siig20x_fn(struct pci_dev *dev, int enable)
return
0
;
}
EXPORT_SYMBOL
(
pci_siig20x_fn
);
/* Added for EKF Intel i960 serial boards */
static
int
__devinit
pci_inteli960ni_fn
(
struct
pci_dev
*
dev
,
int
enable
)
{
...
...
drivers/serial/Makefile
View file @
fba0a9a3
...
...
@@ -4,7 +4,7 @@
# $Id: Makefile,v 1.8 2002/07/21 21:32:30 rmk Exp $
#
export-objs
:=
core.o 8250.o suncore.o
export-objs
:=
core.o 8250.o
8250_pci.o
suncore.o
serial-8250-y
:=
serial-8250-$(CONFIG_GSC)
+=
8250_gsc.o
...
...
drivers/serial/core.c
View file @
fba0a9a3
...
...
@@ -135,20 +135,6 @@ uart_update_mctrl(struct uart_port *port, unsigned int set, unsigned int clear)
#define uart_set_mctrl(port,set) uart_update_mctrl(port,set,0)
#define uart_clear_mctrl(port,clear) uart_update_mctrl(port,0,clear)
static
inline
void
uart_update_altspeed
(
struct
uart_info
*
info
)
{
unsigned
int
flags
=
info
->
port
->
flags
&
UPF_SPD_MASK
;
if
(
flags
==
UPF_SPD_HI
)
info
->
tty
->
alt_speed
=
57600
;
if
(
flags
==
UPF_SPD_VHI
)
info
->
tty
->
alt_speed
=
115200
;
if
(
flags
==
UPF_SPD_SHI
)
info
->
tty
->
alt_speed
=
230400
;
if
(
flags
==
UPF_SPD_WARP
)
info
->
tty
->
alt_speed
=
460800
;
}
/*
* Startup the port. This will be called once per open. All calls
* will be serialised by the global port semaphore.
...
...
@@ -167,10 +153,8 @@ static int uart_startup(struct uart_info *info, int init_hw)
* once we have successfully opened the port. Also set
* up the tty->alt_speed kludge
*/
if
(
info
->
tty
)
{
if
(
info
->
tty
)
set_bit
(
TTY_IO_ERROR
,
&
info
->
tty
->
flags
);
uart_update_altspeed
(
info
);
}
if
(
port
->
type
==
PORT_UNKNOWN
)
return
0
;
...
...
@@ -276,43 +260,20 @@ static void uart_shutdown(struct uart_info *info)
info
->
flags
&=
~
UIF_INITIALIZED
;
}
static
inline
unsigned
int
uart_calculate_quot
(
struct
uart_info
*
info
,
unsigned
int
baud
)
{
struct
uart_port
*
port
=
info
->
port
;
unsigned
int
quot
;
/* Special case: B0 rate */
if
(
baud
==
0
)
baud
=
9600
;
/* Old HI/VHI/custom speed handling */
if
(
baud
==
38400
&&
((
port
->
flags
&
UPF_SPD_MASK
)
==
UPF_SPD_CUST
))
quot
=
info
->
state
->
custom_divisor
;
else
quot
=
port
->
uartclk
/
(
16
*
baud
);
return
quot
;
}
static
void
uart_change_speed
(
struct
uart_info
*
info
,
struct
termios
*
old_termios
)
/**
* uart_update_timeout - update per-port FIFO timeout.
* @port: uart_port structure describing the port.
* @cflag: termios cflag value
* @quot: uart clock divisor quotient
*
* Set the port FIFO timeout value. The @cflag value should
* reflect the actual hardware settings.
*/
void
uart_update_timeout
(
struct
uart_port
*
port
,
unsigned
int
cflag
,
unsigned
int
quot
)
{
struct
uart_port
*
port
=
info
->
port
;
unsigned
int
quot
,
cflag
,
bits
,
try
;
/*
* If we have no tty, termios, or the port does not exist,
* then we can't set the parameters for this port.
*/
if
(
!
info
->
tty
||
!
info
->
tty
->
termios
||
port
->
type
==
PORT_UNKNOWN
)
return
;
/*
* Set flags based on termios cflag
*/
cflag
=
info
->
tty
->
termios
->
c_cflag
;
unsigned
int
bits
;
/* byte size and parity */
switch
(
cflag
&
CSIZE
)
{
...
...
@@ -335,12 +296,105 @@ uart_change_speed(struct uart_info *info, struct termios *old_termios)
if
(
cflag
&
PARENB
)
bits
++
;
/*
* The total number of bits to be transmitted in the fifo.
*/
bits
=
bits
*
port
->
fifosize
;
/*
* Figure the timeout to send the above number of bits.
* Add .02 seconds of slop
*/
port
->
timeout
=
(
HZ
*
bits
)
/
(
port
->
uartclk
/
(
16
*
quot
))
+
HZ
/
50
;
}
EXPORT_SYMBOL
(
uart_update_timeout
);
/**
* uart_get_baud_rate - return baud rate for a particular port
* @port: uart_port structure describing the port in question.
* @termios: desired termios settings.
*
* Decode the termios structure into a numeric baud rate,
* taking account of the magic 38400 baud rate (with spd_*
* flags), and mapping the %B0 rate to 9600 baud.
*/
unsigned
int
uart_get_baud_rate
(
struct
uart_port
*
port
,
struct
termios
*
termios
)
{
unsigned
int
baud
=
tty_termios_baud_rate
(
termios
);
/*
* The spd_hi, spd_vhi, spd_shi, spd_warp kludge...
* Die! Die! Die!
*/
if
(
baud
==
38400
)
{
unsigned
int
flags
=
port
->
flags
&
UPF_SPD_MASK
;
if
(
flags
==
UPF_SPD_HI
)
baud
=
57600
;
if
(
flags
==
UPF_SPD_VHI
)
baud
=
115200
;
if
(
flags
==
UPF_SPD_SHI
)
baud
=
230400
;
if
(
flags
==
UPF_SPD_WARP
)
baud
=
460800
;
}
/*
* Special case: B0 rate.
*/
if
(
baud
==
0
)
baud
=
9600
;
return
baud
;
}
EXPORT_SYMBOL
(
uart_get_baud_rate
);
static
inline
unsigned
int
uart_calculate_quot
(
struct
uart_port
*
port
,
unsigned
int
baud
)
{
unsigned
int
quot
;
/*
* Old custom speed handling.
*/
if
(
baud
==
38400
&&
(
port
->
flags
&
UPF_SPD_MASK
)
==
UPF_SPD_CUST
)
quot
=
port
->
custom_divisor
;
else
quot
=
port
->
uartclk
/
(
16
*
baud
);
return
quot
;
}
/**
* uart_get_divisor - return uart clock divisor
* @port: uart_port structure describing the port.
* @termios: desired termios settings
* @old_termios: the original port settings, or NULL
*
* Calculate the uart clock divisor for the port. If the
* divisor is invalid, try the old termios setting. If
* the divisor is still invalid, we try 9600 baud.
*
* Update the @termios structure to reflect the baud rate
* we're actually going to be using.
*
* If 9600 baud fails, we return a zero divisor.
*/
unsigned
int
uart_get_divisor
(
struct
uart_port
*
port
,
struct
termios
*
termios
,
struct
termios
*
old_termios
)
{
unsigned
int
quot
,
try
;
for
(
try
=
0
;
try
<
3
;
try
++
)
{
unsigned
int
baud
;
/* Determine divisor based on baud rate */
baud
=
tty_get_baud_rate
(
info
->
tty
);
quot
=
uart_calculate_quot
(
info
,
baud
);
baud
=
uart_get_baud_rate
(
port
,
termios
);
quot
=
uart_calculate_quot
(
port
,
baud
);
if
(
quot
)
break
;
...
...
@@ -348,10 +402,9 @@ uart_change_speed(struct uart_info *info, struct termios *old_termios)
* Oops, the quotient was zero. Try again with
* the old baud rate if possible.
*/
info
->
tty
->
termios
->
c_cflag
&=
~
CBAUD
;
termios
->
c_cflag
&=
~
CBAUD
;
if
(
old_termios
)
{
info
->
tty
->
termios
->
c_cflag
|=
(
old_termios
->
c_cflag
&
CBAUD
);
termios
->
c_cflag
|=
old_termios
->
c_cflag
&
CBAUD
;
old_termios
=
NULL
;
continue
;
}
...
...
@@ -360,30 +413,48 @@ uart_change_speed(struct uart_info *info, struct termios *old_termios)
* As a last resort, if the quotient is zero,
* default to 9600 bps
*/
info
->
tty
->
termios
->
c_cflag
|=
B9600
;
termios
->
c_cflag
|=
B9600
;
}
return
quot
;
}
EXPORT_SYMBOL
(
uart_get_divisor
);
static
void
uart_change_speed
(
struct
uart_info
*
info
,
struct
termios
*
old_termios
)
{
struct
tty_struct
*
tty
=
info
->
tty
;
struct
uart_port
*
port
=
info
->
port
;
struct
termios
*
termios
;
unsigned
int
quot
;
/*
* The total number of bits to be transmitted in the fifo.
* If we have no tty, termios, or the port does not exist,
* then we can't set the parameters for this port.
*/
bits
=
bits
*
port
->
fifosize
;
if
(
!
tty
||
!
tty
->
termios
||
port
->
type
==
PORT_UNKNOWN
)
return
;
termios
=
tty
->
termios
;
/*
* Figure the timeout to send the above number of bits.
* Add .02 seconds of slop
* Set flags based on termios cflag
*/
port
->
timeout
=
(
HZ
*
bits
)
/
(
port
->
uartclk
/
(
16
*
quot
))
+
HZ
/
50
;
if
(
cflag
&
CRTSCTS
)
if
(
termios
->
c_cflag
&
CRTSCTS
)
info
->
flags
|=
UIF_CTS_FLOW
;
else
info
->
flags
&=
~
UIF_CTS_FLOW
;
if
(
cflag
&
CLOCAL
)
if
(
termios
->
c_cflag
&
CLOCAL
)
info
->
flags
&=
~
UIF_CHECK_CD
;
else
info
->
flags
|=
UIF_CHECK_CD
;
port
->
ops
->
change_speed
(
port
,
cflag
,
info
->
tty
->
termios
->
c_iflag
,
quot
);
quot
=
uart_get_divisor
(
port
,
termios
,
old_termios
);
uart_update_timeout
(
port
,
termios
->
c_cflag
,
quot
);
port
->
ops
->
change_speed
(
port
,
termios
->
c_cflag
,
termios
->
c_iflag
,
quot
);
}
static
inline
void
...
...
@@ -597,7 +668,7 @@ static int uart_get_info(struct uart_info *info, struct serial_struct *retinfo)
tmp
.
baud_base
=
port
->
uartclk
/
16
;
tmp
.
close_delay
=
state
->
close_delay
;
tmp
.
closing_wait
=
state
->
closing_wait
;
tmp
.
custom_divisor
=
state
->
custom_divisor
;
tmp
.
custom_divisor
=
port
->
custom_divisor
;
tmp
.
hub6
=
port
->
hub6
;
tmp
.
io_type
=
port
->
iotype
;
tmp
.
iomem_reg_shift
=
port
->
regshift
;
...
...
@@ -652,7 +723,7 @@ uart_set_info(struct uart_info *info, struct serial_struct *newinfo)
new_serial
.
type
!=
port
->
type
;
old_flags
=
port
->
flags
;
old_custom_divisor
=
state
->
custom_divisor
;
old_custom_divisor
=
port
->
custom_divisor
;
if
(
!
capable
(
CAP_SYS_ADMIN
))
{
retval
=
-
EPERM
;
...
...
@@ -665,7 +736,7 @@ uart_set_info(struct uart_info *info, struct serial_struct *newinfo)
goto
exit
;
port
->
flags
=
((
port
->
flags
&
~
UPF_USR_MASK
)
|
(
new_serial
.
flags
&
UPF_USR_MASK
));
state
->
custom_divisor
=
new_serial
.
custom_divisor
;
port
->
custom_divisor
=
new_serial
.
custom_divisor
;
goto
check_and_exit
;
}
...
...
@@ -757,7 +828,7 @@ uart_set_info(struct uart_info *info, struct serial_struct *newinfo)
port
->
irq
=
new_serial
.
irq
;
port
->
uartclk
=
new_serial
.
baud_base
*
16
;
port
->
flags
=
new_serial
.
flags
&
UPF_FLAGS
;
state
->
custom_divisor
=
new_serial
.
custom_divisor
;
port
->
custom_divisor
=
new_serial
.
custom_divisor
;
state
->
close_delay
=
new_serial
.
close_delay
*
HZ
/
100
;
state
->
closing_wait
=
new_serial
.
closing_wait
*
HZ
/
100
;
port
->
fifosize
=
new_serial
.
xmit_fifo_size
;
...
...
@@ -769,10 +840,8 @@ uart_set_info(struct uart_info *info, struct serial_struct *newinfo)
goto
exit
;
if
(
info
->
flags
&
UIF_INITIALIZED
)
{
if
(((
old_flags
^
port
->
flags
)
&
UPF_SPD_MASK
)
||
old_custom_divisor
!=
state
->
custom_divisor
)
{
uart_update_altspeed
(
info
);
old_custom_divisor
!=
port
->
custom_divisor
)
uart_change_speed
(
info
,
NULL
);
}
}
else
retval
=
uart_startup
(
info
,
1
);
exit:
...
...
@@ -1540,8 +1609,9 @@ static int uart_open(struct tty_struct *tty, struct file *filp)
* Any failures from here onwards should not touch the count.
*/
tty
->
driver_data
=
info
;
tty
->
low_latency
=
(
info
->
port
->
flags
&
UPF_LOW_LATENCY
)
?
1
:
0
;
tty
->
alt_speed
=
0
;
info
->
tty
=
tty
;
info
->
tty
->
low_latency
=
(
info
->
port
->
flags
&
UPF_LOW_LATENCY
)
?
1
:
0
;
/*
* If the port is in the middle of closing, bail out now.
...
...
@@ -2009,7 +2079,7 @@ __uart_register_port(struct uart_driver *drv, struct uart_state *state,
/*
* If there isn't a port here, don't do anything further.
*/
if
(
!
port
->
iobase
&&
!
port
->
mapbase
)
if
(
!
port
->
iobase
&&
!
port
->
mapbase
&&
!
port
->
membase
)
return
;
/*
...
...
@@ -2405,17 +2475,23 @@ int uart_register_port(struct uart_driver *drv, struct uart_port *port)
goto
out
;
}
state
->
port
->
iobase
=
port
->
iobase
;
state
->
port
->
membase
=
port
->
membase
;
state
->
port
->
irq
=
port
->
irq
;
state
->
port
->
uartclk
=
port
->
uartclk
;
state
->
port
->
fifosize
=
port
->
fifosize
;
state
->
port
->
regshift
=
port
->
regshift
;
state
->
port
->
iotype
=
port
->
iotype
;
state
->
port
->
flags
=
port
->
flags
;
state
->
port
->
line
=
state
-
drv
->
state
;
__uart_register_port
(
drv
,
state
,
state
->
port
);
/*
* If the port is already initialised, don't touch it.
*/
if
(
state
->
port
->
type
==
PORT_UNKNOWN
)
{
state
->
port
->
iobase
=
port
->
iobase
;
state
->
port
->
membase
=
port
->
membase
;
state
->
port
->
irq
=
port
->
irq
;
state
->
port
->
uartclk
=
port
->
uartclk
;
state
->
port
->
fifosize
=
port
->
fifosize
;
state
->
port
->
regshift
=
port
->
regshift
;
state
->
port
->
iotype
=
port
->
iotype
;
state
->
port
->
flags
=
port
->
flags
;
state
->
port
->
line
=
state
-
drv
->
state
;
state
->
port
->
mapbase
=
port
->
mapbase
;
__uart_register_port
(
drv
,
state
,
state
->
port
);
}
ret
=
state
->
port
->
line
;
}
else
...
...
include/linux/serial.h
View file @
fba0a9a3
...
...
@@ -48,6 +48,7 @@ struct serial_struct {
unsigned
char
*
iomem_base
;
unsigned
short
iomem_reg_shift
;
unsigned
int
port_high
;
unsigned
long
iomap_base
;
/* cookie passed into ioremap */
int
reserved
[
1
];
};
...
...
include/linux/serial_core.h
View file @
fba0a9a3
...
...
@@ -186,6 +186,7 @@ struct uart_port {
unsigned
int
timeout
;
/* character-based timeout */
unsigned
int
type
;
/* port type */
struct
uart_ops
*
ops
;
unsigned
int
custom_divisor
;
unsigned
int
line
;
/* port index */
unsigned
long
mapbase
;
/* for ioremap */
unsigned
char
hub6
;
/* this should be in the 8250 driver */
...
...
@@ -204,8 +205,6 @@ struct uart_state {
#define USF_CLOSING_WAIT_INF (0)
#define USF_CLOSING_WAIT_NONE (65535)
unsigned
int
custom_divisor
;
int
count
;
struct
uart_info
*
info
;
struct
uart_port
*
port
;
...
...
include/linux/tty.h
View file @
fba0a9a3
...
...
@@ -397,6 +397,7 @@ extern void do_SAK(struct tty_struct *tty);
extern
void
disassociate_ctty
(
int
priv
);
extern
void
tty_flip_buffer_push
(
struct
tty_struct
*
tty
);
extern
int
tty_get_baud_rate
(
struct
tty_struct
*
tty
);
extern
int
tty_termios_baud_rate
(
struct
termios
*
termios
);
/* n_tty.c */
extern
struct
tty_ldisc
tty_ldisc_N_TTY
;
...
...
kernel/ksyms.c
View file @
fba0a9a3
...
...
@@ -353,13 +353,8 @@ EXPORT_SYMBOL(generic_file_writev);
EXPORT_SYMBOL
(
iov_shorten
);
/* tty routines */
EXPORT_SYMBOL
(
tty_hangup
);
EXPORT_SYMBOL
(
tty_wait_until_sent
);
EXPORT_SYMBOL
(
tty_check_change
);
EXPORT_SYMBOL
(
tty_hung_up_p
);
EXPORT_SYMBOL
(
tty_flip_buffer_push
);
EXPORT_SYMBOL
(
tty_get_baud_rate
);
EXPORT_SYMBOL
(
do_SAK
);
/* filesystem registration */
EXPORT_SYMBOL
(
register_filesystem
);
...
...
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