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
e1127c36
Commit
e1127c36
authored
Mar 21, 2002
by
Greg Kroah-Hartman
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
USB serial drivers
changes due to open_count being handled by the usb-serial core code.
parent
9fb1cce0
Changes
16
Hide whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
732 additions
and
987 deletions
+732
-987
drivers/usb/serial/belkin_sa.c
drivers/usb/serial/belkin_sa.c
+20
-32
drivers/usb/serial/cyberjack.c
drivers/usb/serial/cyberjack.c
+23
-36
drivers/usb/serial/digi_acceleport.c
drivers/usb/serial/digi_acceleport.c
+0
-32
drivers/usb/serial/empeg.c
drivers/usb/serial/empeg.c
+21
-43
drivers/usb/serial/ftdi_sio.c
drivers/usb/serial/ftdi_sio.c
+55
-75
drivers/usb/serial/io_edgeport.c
drivers/usb/serial/io_edgeport.c
+132
-147
drivers/usb/serial/ipaq.c
drivers/usb/serial/ipaq.c
+82
-101
drivers/usb/serial/ir-usb.c
drivers/usb/serial/ir-usb.c
+37
-46
drivers/usb/serial/keyspan.c
drivers/usb/serial/keyspan.c
+9
-21
drivers/usb/serial/keyspan_pda.c
drivers/usb/serial/keyspan_pda.c
+42
-57
drivers/usb/serial/kl5kusb105.c
drivers/usb/serial/kl5kusb105.c
+86
-98
drivers/usb/serial/mct_u232.c
drivers/usb/serial/mct_u232.c
+48
-61
drivers/usb/serial/omninet.c
drivers/usb/serial/omninet.c
+25
-39
drivers/usb/serial/pl2303.c
drivers/usb/serial/pl2303.c
+72
-84
drivers/usb/serial/visor.c
drivers/usb/serial/visor.c
+37
-50
drivers/usb/serial/whiteheat.c
drivers/usb/serial/whiteheat.c
+43
-65
No files found.
drivers/usb/serial/belkin_sa.c
View file @
e1127c36
...
...
@@ -191,9 +191,6 @@ static void belkin_sa_shutdown (struct usb_serial *serial)
/* stop reads and writes on all ports */
for
(
i
=
0
;
i
<
serial
->
num_ports
;
++
i
)
{
while
(
serial
->
port
[
i
].
open_count
>
0
)
{
belkin_sa_close
(
&
serial
->
port
[
i
],
NULL
);
}
/* My special items, the standard routines free my urbs */
if
(
serial
->
port
[
i
].
private
)
kfree
(
serial
->
port
[
i
].
private
);
...
...
@@ -207,26 +204,22 @@ static int belkin_sa_open (struct usb_serial_port *port, struct file *filp)
dbg
(
__FUNCTION__
" port %d"
,
port
->
number
);
++
port
->
open_count
;
if
(
port
->
open_count
==
1
)
{
/*Start reading from the device*/
/* TODO: Look at possibility of submitting mulitple URBs to device to
* enhance buffering. Win trace shows 16 initial read URBs.
*/
port
->
read_urb
->
dev
=
port
->
serial
->
dev
;
retval
=
usb_submit_urb
(
port
->
read_urb
,
GFP_KERNEL
);
if
(
retval
)
{
err
(
"usb_submit_urb(read bulk) failed"
);
goto
exit
;
}
port
->
interrupt_in_urb
->
dev
=
port
->
serial
->
dev
;
retval
=
usb_submit_urb
(
port
->
interrupt_in_urb
,
GFP_KERNEL
);
if
(
retval
)
err
(
" usb_submit_urb(read int) failed"
);
/*Start reading from the device*/
/* TODO: Look at possibility of submitting mulitple URBs to device to
* enhance buffering. Win trace shows 16 initial read URBs.
*/
port
->
read_urb
->
dev
=
port
->
serial
->
dev
;
retval
=
usb_submit_urb
(
port
->
read_urb
,
GFP_KERNEL
);
if
(
retval
)
{
err
(
"usb_submit_urb(read bulk) failed"
);
goto
exit
;
}
port
->
interrupt_in_urb
->
dev
=
port
->
serial
->
dev
;
retval
=
usb_submit_urb
(
port
->
interrupt_in_urb
,
GFP_KERNEL
);
if
(
retval
)
err
(
" usb_submit_urb(read int) failed"
);
exit:
return
retval
;
}
/* belkin_sa_open */
...
...
@@ -245,16 +238,11 @@ static void belkin_sa_close (struct usb_serial_port *port, struct file *filp)
dbg
(
__FUNCTION__
" port %d"
,
port
->
number
);
--
port
->
open_count
;
if
(
port
->
open_count
<=
0
)
{
if
(
serial
->
dev
)
{
/* shutdown our bulk reads and writes */
usb_unlink_urb
(
port
->
write_urb
);
usb_unlink_urb
(
port
->
read_urb
);
usb_unlink_urb
(
port
->
interrupt_in_urb
);
}
port
->
open_count
=
0
;
if
(
serial
->
dev
)
{
/* shutdown our bulk reads and writes */
usb_unlink_urb
(
port
->
write_urb
);
usb_unlink_urb
(
port
->
read_urb
);
usb_unlink_urb
(
port
->
interrupt_in_urb
);
}
}
/* belkin_sa_close */
...
...
drivers/usb/serial/cyberjack.c
View file @
e1127c36
...
...
@@ -130,11 +130,7 @@ static void cyberjack_shutdown (struct usb_serial *serial)
dbg
(
__FUNCTION__
);
/* stop reads and writes on all ports */
for
(
i
=
0
;
i
<
serial
->
num_ports
;
++
i
)
{
while
(
serial
->
port
[
i
].
open_count
>
0
)
{
cyberjack_close
(
&
serial
->
port
[
i
],
NULL
);
}
/* My special items, the standard routines free my urbs */
if
(
serial
->
port
[
i
].
private
)
kfree
(
serial
->
port
[
i
].
private
);
...
...
@@ -151,31 +147,27 @@ static int cyberjack_open (struct usb_serial_port *port, struct file *filp)
dbg
(
__FUNCTION__
" - port %d"
,
port
->
number
);
++
port
->
open_count
;
/* force low_latency on so that our tty_push actually forces
* the data through, otherwise it is scheduled, and with high
* data rates (like with OHCI) data can get lost.
*/
port
->
tty
->
low_latency
=
1
;
if
(
port
->
open_count
==
1
)
{
/* force low_latency on so that our tty_push actually forces
* the data through, otherwise it is scheduled, and with high
* data rates (like with OHCI) data can get lost.
*/
port
->
tty
->
low_latency
=
1
;
priv
=
(
struct
cyberjack_private
*
)
port
->
private
;
priv
->
rdtodo
=
0
;
priv
->
wrfilled
=
0
;
priv
->
wrsent
=
0
;
priv
=
(
struct
cyberjack_private
*
)
port
->
private
;
priv
->
rdtodo
=
0
;
priv
->
wrfilled
=
0
;
priv
->
wrsent
=
0
;
/* shutdown any bulk reads that might be going on */
usb_unlink_urb
(
port
->
write_urb
)
;
usb_unlink_urb
(
port
->
read_urb
)
;
usb_unlink_urb
(
port
->
interrupt_in_urb
)
;
/* shutdown any bulk reads that might be going on */
usb_unlink_urb
(
port
->
write_urb
);
usb_unlink_urb
(
port
->
read_urb
);
usb_unlink_urb
(
port
->
interrupt_in_urb
);
port
->
interrupt_in_urb
->
dev
=
port
->
serial
->
dev
;
result
=
usb_submit_urb
(
port
->
interrupt_in_urb
,
GFP_KERNEL
);
if
(
result
)
err
(
" usb_submit_urb(read int) failed"
);
dbg
(
__FUNCTION__
" - usb_submit_urb(int urb)"
);
}
port
->
interrupt_in_urb
->
dev
=
port
->
serial
->
dev
;
result
=
usb_submit_urb
(
port
->
interrupt_in_urb
,
GFP_KERNEL
);
if
(
result
)
err
(
" usb_submit_urb(read int) failed"
);
dbg
(
__FUNCTION__
" - usb_submit_urb(int urb)"
);
return
result
;
}
...
...
@@ -184,16 +176,11 @@ static void cyberjack_close (struct usb_serial_port *port, struct file *filp)
{
dbg
(
__FUNCTION__
" - port %d"
,
port
->
number
);
--
port
->
open_count
;
if
(
port
->
open_count
<=
0
)
{
if
(
port
->
serial
->
dev
)
{
/* shutdown any bulk reads that might be going on */
usb_unlink_urb
(
port
->
write_urb
);
usb_unlink_urb
(
port
->
read_urb
);
usb_unlink_urb
(
port
->
interrupt_in_urb
);
}
port
->
open_count
=
0
;
if
(
port
->
serial
->
dev
)
{
/* shutdown any bulk reads that might be going on */
usb_unlink_urb
(
port
->
write_urb
);
usb_unlink_urb
(
port
->
read_urb
);
usb_unlink_urb
(
port
->
interrupt_in_urb
);
}
}
...
...
drivers/usb/serial/digi_acceleport.c
View file @
e1127c36
...
...
@@ -1490,28 +1490,17 @@ dbg( "digi_open: TOP: port=%d, open_count=%d", priv->dp_port_num, port->open_cou
return
(
-
EAGAIN
);
}
/* inc module use count before sleeping to wait for closes */
++
port
->
open_count
;
/* wait for a close in progress to finish */
while
(
priv
->
dp_in_close
)
{
cond_wait_interruptible_timeout_irqrestore
(
&
priv
->
dp_close_wait
,
DIGI_RETRY_TIMEOUT
,
&
priv
->
dp_port_lock
,
flags
);
if
(
signal_pending
(
current
)
)
{
--
port
->
open_count
;
return
(
-
EINTR
);
}
spin_lock_irqsave
(
&
priv
->
dp_port_lock
,
flags
);
}
/* if port is already open, just return */
/* be sure exactly one open proceeds */
if
(
port
->
open_count
!=
1
)
{
spin_unlock_irqrestore
(
&
priv
->
dp_port_lock
,
flags
);
return
(
0
);
}
spin_unlock_irqrestore
(
&
priv
->
dp_port_lock
,
flags
);
/* read modem signals automatically whenever they change */
...
...
@@ -1557,14 +1546,6 @@ dbg( "digi_close: TOP: port=%d, open_count=%d", priv->dp_port_num, port->open_co
/* do cleanup only after final close on this port */
spin_lock_irqsave
(
&
priv
->
dp_port_lock
,
flags
);
if
(
port
->
open_count
>
1
)
{
--
port
->
open_count
;
spin_unlock_irqrestore
(
&
priv
->
dp_port_lock
,
flags
);
return
;
}
else
if
(
port
->
open_count
<=
0
)
{
spin_unlock_irqrestore
(
&
priv
->
dp_port_lock
,
flags
);
return
;
}
priv
->
dp_in_close
=
1
;
spin_unlock_irqrestore
(
&
priv
->
dp_port_lock
,
flags
);
...
...
@@ -1637,7 +1618,6 @@ dbg( "digi_close: TOP: port=%d, open_count=%d", priv->dp_port_num, port->open_co
spin_lock_irqsave
(
&
priv
->
dp_port_lock
,
flags
);
priv
->
dp_write_urb_in_use
=
0
;
priv
->
dp_in_close
=
0
;
--
port
->
open_count
;
wake_up_interruptible
(
&
priv
->
dp_close_wait
);
spin_unlock_irqrestore
(
&
priv
->
dp_port_lock
,
flags
);
...
...
@@ -1765,8 +1745,6 @@ static void digi_shutdown( struct usb_serial *serial )
{
int
i
;
struct
digi_port
*
priv
;
unsigned
long
flags
;
dbg
(
"digi_shutdown: TOP, in_interrupt()=%d"
,
in_interrupt
()
);
...
...
@@ -1777,16 +1755,6 @@ dbg( "digi_shutdown: TOP, in_interrupt()=%d", in_interrupt() );
usb_unlink_urb
(
serial
->
port
[
i
].
write_urb
);
}
/* dec module use count */
for
(
i
=
0
;
i
<
serial
->
type
->
num_ports
;
i
++
)
{
priv
=
serial
->
port
[
i
].
private
;
spin_lock_irqsave
(
&
priv
->
dp_port_lock
,
flags
);
while
(
serial
->
port
[
i
].
open_count
>
0
)
{
--
serial
->
port
[
i
].
open_count
;
}
spin_unlock_irqrestore
(
&
priv
->
dp_port_lock
,
flags
);
}
/* free the private data structures for all ports */
/* number of regular ports + 1 for the out-of-band port */
for
(
i
=
0
;
i
<
serial
->
type
->
num_ports
+
1
;
i
++
)
...
...
drivers/usb/serial/empeg.c
View file @
e1127c36
...
...
@@ -157,35 +157,29 @@ static int empeg_open (struct usb_serial_port *port, struct file *filp)
dbg
(
__FUNCTION__
" - port %d"
,
port
->
number
);
++
port
->
open_count
;
/* Force default termio settings */
empeg_set_termios
(
port
,
NULL
)
;
if
(
port
->
open_count
==
1
)
{
bytes_in
=
0
;
bytes_out
=
0
;
/* Force default termio settings */
empeg_set_termios
(
port
,
NULL
)
;
bytes_in
=
0
;
bytes_out
=
0
;
/* Start reading from the device */
FILL_BULK_URB
(
port
->
read_urb
,
serial
->
dev
,
usb_rcvbulkpipe
(
serial
->
dev
,
port
->
bulk_in_endpointAddress
),
port
->
read_urb
->
transfer_buffer
,
port
->
read_urb
->
transfer_buffer_length
,
empeg_read_bulk_callback
,
port
);
port
->
read_urb
->
transfer_flags
|=
USB_QUEUE_BULK
;
/* Start reading from the device */
FILL_BULK_URB
(
port
->
read_urb
,
serial
->
dev
,
usb_rcvbulkpipe
(
serial
->
dev
,
port
->
bulk_in_endpointAddress
),
port
->
read_urb
->
transfer_buffer
,
port
->
read_urb
->
transfer_buffer_length
,
empeg_read_bulk_callback
,
port
);
result
=
usb_submit_urb
(
port
->
read_urb
,
GFP_KERNEL
)
;
port
->
read_urb
->
transfer_flags
|=
USB_QUEUE_BULK
;
if
(
result
)
err
(
__FUNCTION__
" - failed submitting read urb, error %d"
,
result
);
result
=
usb_submit_urb
(
port
->
read_urb
,
GFP_KERNEL
);
}
if
(
result
)
err
(
__FUNCTION__
" - failed submitting read urb, error %d"
,
result
);
return
result
;
}
...
...
@@ -204,16 +198,10 @@ static void empeg_close (struct usb_serial_port *port, struct file * filp)
if
(
!
serial
)
return
;
--
port
->
open_count
;
if
(
port
->
open_count
<=
0
)
{
if
(
serial
->
dev
)
{
/* shutdown our bulk read */
usb_unlink_urb
(
port
->
read_urb
);
}
port
->
open_count
=
0
;
if
(
serial
->
dev
)
{
/* shutdown our bulk read */
usb_unlink_urb
(
port
->
read_urb
);
}
/* Uncomment the following line if you want to see some statistics in your syslog */
/* info ("Bytes In = %d Bytes Out = %d", bytes_in, bytes_out); */
}
...
...
@@ -491,17 +479,7 @@ static int empeg_startup (struct usb_serial *serial)
static
void
empeg_shutdown
(
struct
usb_serial
*
serial
)
{
int
i
;
dbg
(
__FUNCTION__
);
/* stop reads and writes on all ports */
for
(
i
=
0
;
i
<
serial
->
num_ports
;
++
i
)
{
while
(
serial
->
port
[
i
].
open_count
>
0
)
{
empeg_close
(
&
serial
->
port
[
i
],
NULL
);
}
}
}
...
...
drivers/usb/serial/ftdi_sio.c
View file @
e1127c36
...
...
@@ -294,14 +294,8 @@ static int ftdi_8U232AM_startup (struct usb_serial *serial)
static
void
ftdi_sio_shutdown
(
struct
usb_serial
*
serial
)
{
dbg
(
__FUNCTION__
);
/* stop reads and writes on all ports */
while
(
serial
->
port
[
0
].
open_count
>
0
)
{
ftdi_sio_close
(
&
serial
->
port
[
0
],
NULL
);
}
if
(
serial
->
port
[
0
].
private
){
kfree
(
serial
->
port
[
0
].
private
);
serial
->
port
[
0
].
private
=
NULL
;
...
...
@@ -319,45 +313,41 @@ static int ftdi_sio_open (struct usb_serial_port *port, struct file *filp)
dbg
(
__FUNCTION__
);
++
port
->
open_count
;
/* This will push the characters through immediately rather
than queue a task to deliver them */
port
->
tty
->
low_latency
=
1
;
if
(
port
->
open_count
==
1
){
/* This will push the characters through immediately rather
than queue a task to deliver them */
port
->
tty
->
low_latency
=
1
;
/* No error checking for this (will get errors later anyway) */
/* See ftdi_sio.h for description of what is reset */
usb_control_msg
(
serial
->
dev
,
usb_sndctrlpipe
(
serial
->
dev
,
0
),
FTDI_SIO_RESET_REQUEST
,
FTDI_SIO_RESET_REQUEST_TYPE
,
FTDI_SIO_RESET_SIO
,
0
,
buf
,
0
,
WDR_TIMEOUT
);
/* No error checking for this (will get errors later anyway) */
/* See ftdi_sio.h for description of what is reset */
usb_control_msg
(
serial
->
dev
,
usb_sndctrlpipe
(
serial
->
dev
,
0
),
FTDI_SIO_RESET_REQUEST
,
FTDI_SIO_RESET_REQUEST_TYPE
,
FTDI_SIO_RESET_SIO
,
0
,
buf
,
0
,
WDR_TIMEOUT
);
/* Setup termios defaults. According to tty_io.c the
settings are driver specific */
port
->
tty
->
termios
->
c_cflag
=
B9600
|
CS8
|
CREAD
|
HUPCL
|
CLOCAL
;
/* Setup termios defaults. According to tty_io.c the
settings are driver specific */
port
->
tty
->
termios
->
c_cflag
=
B9600
|
CS8
|
CREAD
|
HUPCL
|
CLOCAL
;
/* ftdi_sio_set_termios will send usb control messages */
ftdi_sio_set_termios
(
port
,
&
tmp_termios
);
/* ftdi_sio_set_termios will send usb control messages */
ftdi_sio_set_termios
(
port
,
&
tmp_termios
);
/* Turn on RTS and DTR since we are not flow controlling by default */
if
(
set_dtr
(
serial
->
dev
,
usb_sndctrlpipe
(
serial
->
dev
,
0
),
HIGH
)
<
0
)
{
err
(
__FUNCTION__
" Error from DTR HIGH urb"
);
}
if
(
set_rts
(
serial
->
dev
,
usb_sndctrlpipe
(
serial
->
dev
,
0
),
HIGH
)
<
0
){
err
(
__FUNCTION__
" Error from RTS HIGH urb"
);
}
/* Start reading from the device */
FILL_BULK_URB
(
port
->
read_urb
,
serial
->
dev
,
usb_rcvbulkpipe
(
serial
->
dev
,
port
->
bulk_in_endpointAddress
),
port
->
read_urb
->
transfer_buffer
,
port
->
read_urb
->
transfer_buffer_length
,
ftdi_sio_read_bulk_callback
,
port
);
result
=
usb_submit_urb
(
port
->
read_urb
,
GFP_KERNEL
);
if
(
result
)
err
(
__FUNCTION__
" - failed submitting read urb, error %d"
,
result
);
/* Turn on RTS and DTR since we are not flow controlling by default */
if
(
set_dtr
(
serial
->
dev
,
usb_sndctrlpipe
(
serial
->
dev
,
0
),
HIGH
)
<
0
)
{
err
(
__FUNCTION__
" Error from DTR HIGH urb"
);
}
if
(
set_rts
(
serial
->
dev
,
usb_sndctrlpipe
(
serial
->
dev
,
0
),
HIGH
)
<
0
){
err
(
__FUNCTION__
" Error from RTS HIGH urb"
);
}
/* Start reading from the device */
FILL_BULK_URB
(
port
->
read_urb
,
serial
->
dev
,
usb_rcvbulkpipe
(
serial
->
dev
,
port
->
bulk_in_endpointAddress
),
port
->
read_urb
->
transfer_buffer
,
port
->
read_urb
->
transfer_buffer_length
,
ftdi_sio_read_bulk_callback
,
port
);
result
=
usb_submit_urb
(
port
->
read_urb
,
GFP_KERNEL
);
if
(
result
)
err
(
__FUNCTION__
" - failed submitting read urb, error %d"
,
result
);
return
result
;
}
/* ftdi_sio_open */
...
...
@@ -371,41 +361,31 @@ static void ftdi_sio_close (struct usb_serial_port *port, struct file *filp)
dbg
(
__FUNCTION__
);
--
port
->
open_count
;
if
(
port
->
open_count
<=
0
)
{
if
(
serial
->
dev
)
{
if
(
c_cflag
&
HUPCL
){
/* Disable flow control */
if
(
usb_control_msg
(
serial
->
dev
,
usb_sndctrlpipe
(
serial
->
dev
,
0
),
FTDI_SIO_SET_FLOW_CTRL_REQUEST
,
FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE
,
0
,
0
,
buf
,
0
,
WDR_TIMEOUT
)
<
0
)
{
err
(
"error from flowcontrol urb"
);
}
/* drop DTR */
if
(
set_dtr
(
serial
->
dev
,
usb_sndctrlpipe
(
serial
->
dev
,
0
),
LOW
)
<
0
){
err
(
"Error from DTR LOW urb"
);
}
/* drop RTS */
if
(
set_rts
(
serial
->
dev
,
usb_sndctrlpipe
(
serial
->
dev
,
0
),
LOW
)
<
0
)
{
err
(
"Error from RTS LOW urb"
);
}
}
/* Note change no line is hupcl is off */
/* shutdown our bulk reads and writes */
/* ***CHECK*** behaviour when there is nothing queued */
usb_unlink_urb
(
port
->
write_urb
);
usb_unlink_urb
(
port
->
read_urb
);
}
port
->
open_count
=
0
;
}
else
{
/* Send a HUP if necessary */
if
(
!
(
port
->
tty
->
termios
->
c_cflag
&
CLOCAL
)){
tty_hangup
(
port
->
tty
);
}
if
(
serial
->
dev
)
{
if
(
c_cflag
&
HUPCL
){
/* Disable flow control */
if
(
usb_control_msg
(
serial
->
dev
,
usb_sndctrlpipe
(
serial
->
dev
,
0
),
FTDI_SIO_SET_FLOW_CTRL_REQUEST
,
FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE
,
0
,
0
,
buf
,
0
,
WDR_TIMEOUT
)
<
0
)
{
err
(
"error from flowcontrol urb"
);
}
/* drop DTR */
if
(
set_dtr
(
serial
->
dev
,
usb_sndctrlpipe
(
serial
->
dev
,
0
),
LOW
)
<
0
){
err
(
"Error from DTR LOW urb"
);
}
/* drop RTS */
if
(
set_rts
(
serial
->
dev
,
usb_sndctrlpipe
(
serial
->
dev
,
0
),
LOW
)
<
0
)
{
err
(
"Error from RTS LOW urb"
);
}
}
/* Note change no line is hupcl is off */
/* shutdown our bulk reads and writes */
/* ***CHECK*** behaviour when there is nothing queued */
usb_unlink_urb
(
port
->
write_urb
);
usb_unlink_urb
(
port
->
read_urb
);
}
}
/* ftdi_sio_close */
...
...
drivers/usb/serial/io_edgeport.c
View file @
e1127c36
...
...
@@ -987,124 +987,117 @@ static int edge_open (struct usb_serial_port *port, struct file * filp)
if
(
edge_port
==
NULL
)
return
-
ENODEV
;
++
port
->
open_count
;
if
(
port
->
open_count
==
1
)
{
/* force low_latency on so that our tty_push actually forces the data through,
otherwise it is scheduled, and with high data rates (like with OHCI) data
can get lost. */
port
->
tty
->
low_latency
=
1
;
/* see if we've set up our endpoint info yet (can't set it up in edge_startup
as the structures were not set up at that time.) */
serial
=
port
->
serial
;
edge_serial
=
(
struct
edgeport_serial
*
)
serial
->
private
;
if
(
edge_serial
==
NULL
)
{
port
->
open_count
=
0
;
return
-
ENODEV
;
}
if
(
edge_serial
->
interrupt_in_buffer
==
NULL
)
{
struct
usb_serial_port
*
port0
=
&
serial
->
port
[
0
];
/* not set up yet, so do it now */
edge_serial
->
interrupt_in_buffer
=
port0
->
interrupt_in_buffer
;
edge_serial
->
interrupt_in_endpoint
=
port0
->
interrupt_in_endpointAddress
;
edge_serial
->
interrupt_read_urb
=
port0
->
interrupt_in_urb
;
edge_serial
->
bulk_in_buffer
=
port0
->
bulk_in_buffer
;
edge_serial
->
bulk_in_endpoint
=
port0
->
bulk_in_endpointAddress
;
edge_serial
->
read_urb
=
port0
->
read_urb
;
edge_serial
->
bulk_out_endpoint
=
port0
->
bulk_out_endpointAddress
;
/* force low_latency on so that our tty_push actually forces the data through,
otherwise it is scheduled, and with high data rates (like with OHCI) data
can get lost. */
port
->
tty
->
low_latency
=
1
;
/* see if we've set up our endpoint info yet (can't set it up in edge_startup
as the structures were not set up at that time.) */
serial
=
port
->
serial
;
edge_serial
=
(
struct
edgeport_serial
*
)
serial
->
private
;
if
(
edge_serial
==
NULL
)
{
return
-
ENODEV
;
}
if
(
edge_serial
->
interrupt_in_buffer
==
NULL
)
{
struct
usb_serial_port
*
port0
=
&
serial
->
port
[
0
];
/* set up our interrupt urb */
FILL_INT_URB
(
edge_serial
->
interrupt_read_urb
,
serial
->
dev
,
usb_rcvintpipe
(
serial
->
dev
,
port0
->
interrupt_in_endpointAddress
),
port0
->
interrupt_in_buffer
,
edge_serial
->
interrupt_read_urb
->
transfer_buffer_length
,
edge_interrupt_callback
,
edge_serial
,
edge_serial
->
interrupt_read_urb
->
interval
);
/* set up our bulk in urb */
FILL_BULK_URB
(
edge_serial
->
read_urb
,
serial
->
dev
,
usb_rcvbulkpipe
(
serial
->
dev
,
port0
->
bulk_in_endpointAddress
),
port0
->
bulk_in_buffer
,
edge_serial
->
read_urb
->
transfer_buffer_length
,
edge_bulk_in_callback
,
edge_serial
);
/* start interrupt read for this edgeport
* this interrupt will continue as long as the edgeport is connected */
response
=
usb_submit_urb
(
edge_serial
->
interrupt_read_urb
,
GFP_KERNEL
);
if
(
response
)
{
err
(
__FUNCTION__
" - Error %d submitting control urb"
,
response
);
}
}
/* not set up yet, so do it now */
edge_serial
->
interrupt_in_buffer
=
port0
->
interrupt_in_buffer
;
edge_serial
->
interrupt_in_endpoint
=
port0
->
interrupt_in_endpointAddress
;
edge_serial
->
interrupt_read_urb
=
port0
->
interrupt_in_urb
;
edge_serial
->
bulk_in_buffer
=
port0
->
bulk_in_buffer
;
edge_serial
->
bulk_in_endpoint
=
port0
->
bulk_in_endpointAddress
;
edge_serial
->
read_urb
=
port0
->
read_urb
;
edge_serial
->
bulk_out_endpoint
=
port0
->
bulk_out_endpointAddress
;
/* set up our interrupt urb */
FILL_INT_URB
(
edge_serial
->
interrupt_read_urb
,
serial
->
dev
,
usb_rcvintpipe
(
serial
->
dev
,
port0
->
interrupt_in_endpointAddress
),
port0
->
interrupt_in_buffer
,
edge_serial
->
interrupt_read_urb
->
transfer_buffer_length
,
edge_interrupt_callback
,
edge_serial
,
edge_serial
->
interrupt_read_urb
->
interval
);
/* initialize our wait queues */
init_waitqueue_head
(
&
edge_port
->
wait_open
);
init_waitqueue_head
(
&
edge_port
->
wait_chase
);
init_waitqueue_head
(
&
edge_port
->
delta_msr_wait
);
init_waitqueue_head
(
&
edge_port
->
wait_command
);
/* initialize our icount structure */
memset
(
&
(
edge_port
->
icount
),
0x00
,
sizeof
(
edge_port
->
icount
));
/* initialize our port settings */
edge_port
->
txCredits
=
0
;
/* Can't send any data yet */
edge_port
->
shadowMCR
=
MCR_MASTER_IE
;
/* Must always set this bit to enable ints! */
edge_port
->
chaseResponsePending
=
FALSE
;
/* send a open port command */
edge_port
->
openPending
=
TRUE
;
edge_port
->
open
=
FALSE
;
response
=
send_iosp_ext_cmd
(
edge_port
,
IOSP_CMD_OPEN_PORT
,
0
);
if
(
response
<
0
)
{
err
(
__FUNCTION__
" - error sending open port command"
);
edge_port
->
openPending
=
FALSE
;
port
->
open_count
=
0
;
return
-
ENODEV
;
}
/* now wait for the port to be completly opened */
timeout
=
OPEN_TIMEOUT
;
while
(
timeout
&&
edge_port
->
openPending
==
TRUE
)
{
timeout
=
interruptible_sleep_on_timeout
(
&
edge_port
->
wait_open
,
timeout
);
/* set up our bulk in urb */
FILL_BULK_URB
(
edge_serial
->
read_urb
,
serial
->
dev
,
usb_rcvbulkpipe
(
serial
->
dev
,
port0
->
bulk_in_endpointAddress
),
port0
->
bulk_in_buffer
,
edge_serial
->
read_urb
->
transfer_buffer_length
,
edge_bulk_in_callback
,
edge_serial
);
/* start interrupt read for this edgeport
* this interrupt will continue as long as the edgeport is connected */
response
=
usb_submit_urb
(
edge_serial
->
interrupt_read_urb
,
GFP_KERNEL
);
if
(
response
)
{
err
(
__FUNCTION__
" - Error %d submitting control urb"
,
response
);
}
}
/* initialize our wait queues */
init_waitqueue_head
(
&
edge_port
->
wait_open
);
init_waitqueue_head
(
&
edge_port
->
wait_chase
);
init_waitqueue_head
(
&
edge_port
->
delta_msr_wait
);
init_waitqueue_head
(
&
edge_port
->
wait_command
);
/* initialize our icount structure */
memset
(
&
(
edge_port
->
icount
),
0x00
,
sizeof
(
edge_port
->
icount
));
/* initialize our port settings */
edge_port
->
txCredits
=
0
;
/* Can't send any data yet */
edge_port
->
shadowMCR
=
MCR_MASTER_IE
;
/* Must always set this bit to enable ints! */
edge_port
->
chaseResponsePending
=
FALSE
;
/* send a open port command */
edge_port
->
openPending
=
TRUE
;
edge_port
->
open
=
FALSE
;
response
=
send_iosp_ext_cmd
(
edge_port
,
IOSP_CMD_OPEN_PORT
,
0
);
if
(
response
<
0
)
{
err
(
__FUNCTION__
" - error sending open port command"
);
edge_port
->
openPending
=
FALSE
;
return
-
ENODEV
;
}
if
(
edge_port
->
open
==
FALSE
)
{
/* open timed out */
dbg
(
__FUNCTION__
" - open timedout"
);
edge_port
->
openPending
=
FALSE
;
port
->
open_count
=
0
;
return
-
ENODEV
;
}
/* now wait for the port to be completly opened */
timeout
=
OPEN_TIMEOUT
;
while
(
timeout
&&
edge_port
->
openPending
==
TRUE
)
{
timeout
=
interruptible_sleep_on_timeout
(
&
edge_port
->
wait_open
,
timeout
);
}
/* create the txfifo */
edge_port
->
txfifo
.
head
=
0
;
edge_port
->
txfifo
.
tail
=
0
;
edge_port
->
txfifo
.
count
=
0
;
edge_port
->
txfifo
.
size
=
edge_port
->
maxTxCredits
;
edge_port
->
txfifo
.
fifo
=
kmalloc
(
edge_port
->
maxTxCredits
,
GFP_KERNEL
);
if
(
edge_port
->
open
==
FALSE
)
{
/* open timed out */
dbg
(
__FUNCTION__
" - open timedout"
)
;
edge_port
->
openPending
=
FALSE
;
return
-
ENODEV
;
}
if
(
!
edge_port
->
txfifo
.
fifo
)
{
dbg
(
__FUNCTION__
" - no memory"
);
edge_close
(
port
,
filp
);
return
-
ENOMEM
;
}
/* create the txfifo */
edge_port
->
txfifo
.
head
=
0
;
edge_port
->
txfifo
.
tail
=
0
;
edge_port
->
txfifo
.
count
=
0
;
edge_port
->
txfifo
.
size
=
edge_port
->
maxTxCredits
;
edge_port
->
txfifo
.
fifo
=
kmalloc
(
edge_port
->
maxTxCredits
,
GFP_KERNEL
);
/* Allocate a URB for the write */
edge_port
->
write_urb
=
usb_alloc_urb
(
0
,
GFP_KERNEL
);
if
(
!
edge_port
->
txfifo
.
fifo
)
{
dbg
(
__FUNCTION__
" - no memory"
);
edge_close
(
port
,
filp
);
return
-
ENOMEM
;
}
if
(
!
edge_port
->
write_urb
)
{
dbg
(
__FUNCTION__
" - no memory"
);
edge_close
(
port
,
filp
);
return
-
ENOMEM
;
}
/* Allocate a URB for the write */
edge_port
->
write_urb
=
usb_alloc_urb
(
0
,
GFP_KERNEL
);
dbg
(
__FUNCTION__
"(%d) - Initialize TX fifo to %d bytes"
,
port
->
number
,
edge_port
->
maxTxCredits
);
if
(
!
edge_port
->
write_urb
)
{
dbg
(
__FUNCTION__
" - no memory"
);
edge_close
(
port
,
filp
);
return
-
ENOMEM
;
}
dbg
(
__FUNCTION__
"(%d) - Initialize TX fifo to %d bytes"
,
port
->
number
,
edge_port
->
maxTxCredits
);
dbg
(
__FUNCTION__
" exited"
);
return
0
;
...
...
@@ -1234,52 +1227,47 @@ static void edge_close (struct usb_serial_port *port, struct file * filp)
if
((
edge_serial
==
NULL
)
||
(
edge_port
==
NULL
))
return
;
--
port
->
open_count
;
if
(
port
->
open_count
<=
0
)
{
if
(
serial
->
dev
)
{
// block until tx is empty
block_until_tx_empty
(
edge_port
);
if
(
serial
->
dev
)
{
// block until tx is empty
block_until_tx_empty
(
edge_port
);
edge_port
->
closePending
=
TRUE
;
edge_port
->
closePending
=
TRUE
;
/* flush and chase */
edge_port
->
chaseResponsePending
=
TRUE
;
/* flush and chase */
edge_port
->
chaseResponsePending
=
TRUE
;
dbg
(
__FUNCTION__
" - Sending IOSP_CMD_CHASE_PORT"
);
status
=
send_iosp_ext_cmd
(
edge_port
,
IOSP_CMD_CHASE_PORT
,
0
);
if
(
status
==
0
)
{
// block until chase finished
block_until_chase_response
(
edge_port
);
}
else
{
edge_port
->
chaseResponsePending
=
FALSE
;
}
dbg
(
__FUNCTION__
" - Sending IOSP_CMD_CHASE_PORT"
);
status
=
send_iosp_ext_cmd
(
edge_port
,
IOSP_CMD_CHASE_PORT
,
0
);
if
(
status
==
0
)
{
// block until chase finished
block_until_chase_response
(
edge_port
);
}
else
{
edge_port
->
chaseResponsePending
=
FALSE
;
}
/* close the port */
dbg
(
__FUNCTION__
" - Sending IOSP_CMD_CLOSE_PORT"
);
send_iosp_ext_cmd
(
edge_port
,
IOSP_CMD_CLOSE_PORT
,
0
);
/* close the port */
dbg
(
__FUNCTION__
" - Sending IOSP_CMD_CLOSE_PORT"
);
send_iosp_ext_cmd
(
edge_port
,
IOSP_CMD_CLOSE_PORT
,
0
);
//port->close = TRUE;
edge_port
->
closePending
=
FALSE
;
edge_port
->
open
=
FALSE
;
edge_port
->
openPending
=
FALSE
;
//port->close = TRUE;
edge_port
->
closePending
=
FALSE
;
edge_port
->
open
=
FALSE
;
edge_port
->
openPending
=
FALSE
;
if
(
edge_port
->
write_urb
)
{
usb_unlink_urb
(
edge_port
->
write_urb
);
}
}
if
(
edge_port
->
write_urb
)
{
/* if this urb had a transfer buffer already (old transfer) free it */
if
(
edge_port
->
write_urb
->
transfer_buffer
!=
NULL
)
{
kfree
(
edge_port
->
write_urb
->
transfer_buffer
);
}
usb_free_urb
(
edge_port
->
write_urb
);
usb_unlink_urb
(
edge_port
->
write_urb
);
}
if
(
edge_port
->
txfifo
.
fifo
)
{
kfree
(
edge_port
->
txfifo
.
fifo
);
}
if
(
edge_port
->
write_urb
)
{
/* if this urb had a transfer buffer already (old transfer) free it */
if
(
edge_port
->
write_urb
->
transfer_buffer
!=
NULL
)
{
kfree
(
edge_port
->
write_urb
->
transfer_buffer
);
}
port
->
open_count
=
0
;
usb_free_urb
(
edge_port
->
write_urb
);
}
if
(
edge_port
->
txfifo
.
fifo
)
{
kfree
(
edge_port
->
txfifo
.
fifo
);
}
dbg
(
__FUNCTION__
" exited"
);
...
...
@@ -3027,9 +3015,6 @@ static void edge_shutdown (struct usb_serial *serial)
/* stop reads and writes on all ports */
for
(
i
=
0
;
i
<
serial
->
num_ports
;
++
i
)
{
while
(
serial
->
port
[
i
].
open_count
>
0
)
{
edge_close
(
&
serial
->
port
[
i
],
NULL
);
}
kfree
(
serial
->
port
[
i
].
private
);
serial
->
port
[
i
].
private
=
NULL
;
}
...
...
drivers/usb/serial/ipaq.c
View file @
e1127c36
...
...
@@ -123,93 +123,89 @@ static int ipaq_open(struct usb_serial_port *port, struct file *filp)
dbg
(
__FUNCTION__
" - port %d"
,
port
->
number
);
++
port
->
open_count
;
if
(
port
->
open_count
==
1
)
{
bytes_in
=
0
;
bytes_out
=
0
;
priv
=
(
struct
ipaq_private
*
)
kmalloc
(
sizeof
(
struct
ipaq_private
),
GFP_KERNEL
);
if
(
priv
==
NULL
)
{
err
(
__FUNCTION__
" - Out of memory"
);
return
-
ENOMEM
;
bytes_in
=
0
;
bytes_out
=
0
;
priv
=
(
struct
ipaq_private
*
)
kmalloc
(
sizeof
(
struct
ipaq_private
),
GFP_KERNEL
);
if
(
priv
==
NULL
)
{
err
(
__FUNCTION__
" - Out of memory"
);
return
-
ENOMEM
;
}
port
->
private
=
(
void
*
)
priv
;
priv
->
active
=
0
;
priv
->
queue_len
=
0
;
INIT_LIST_HEAD
(
&
priv
->
queue
);
INIT_LIST_HEAD
(
&
priv
->
freelist
);
for
(
i
=
0
;
i
<
URBDATA_QUEUE_MAX
/
PACKET_SIZE
;
i
++
)
{
pkt
=
kmalloc
(
sizeof
(
struct
ipaq_packet
),
GFP_KERNEL
);
if
(
pkt
==
NULL
)
{
goto
enomem
;
}
port
->
private
=
(
void
*
)
priv
;
priv
->
active
=
0
;
priv
->
queue_len
=
0
;
INIT_LIST_HEAD
(
&
priv
->
queue
);
INIT_LIST_HEAD
(
&
priv
->
freelist
);
for
(
i
=
0
;
i
<
URBDATA_QUEUE_MAX
/
PACKET_SIZE
;
i
++
)
{
pkt
=
kmalloc
(
sizeof
(
struct
ipaq_packet
),
GFP_KERNEL
);
if
(
pkt
==
NULL
)
{
goto
enomem
;
}
pkt
->
data
=
kmalloc
(
PACKET_SIZE
,
GFP_KERNEL
);
if
(
pkt
->
data
==
NULL
)
{
kfree
(
pkt
);
goto
enomem
;
}
pkt
->
len
=
0
;
pkt
->
written
=
0
;
INIT_LIST_HEAD
(
&
pkt
->
list
);
list_add
(
&
pkt
->
list
,
&
priv
->
freelist
);
priv
->
free_len
+=
PACKET_SIZE
;
pkt
->
data
=
kmalloc
(
PACKET_SIZE
,
GFP_KERNEL
);
if
(
pkt
->
data
==
NULL
)
{
kfree
(
pkt
);
goto
enomem
;
}
pkt
->
len
=
0
;
pkt
->
written
=
0
;
INIT_LIST_HEAD
(
&
pkt
->
list
);
list_add
(
&
pkt
->
list
,
&
priv
->
freelist
);
priv
->
free_len
+=
PACKET_SIZE
;
}
/*
* Force low latency on. This will immediately push data to the line
* discipline instead of queueing.
*/
/*
* Force low latency on. This will immediately push data to the line
* discipline instead of queueing.
*/
port
->
tty
->
low_latency
=
1
;
port
->
tty
->
raw
=
1
;
port
->
tty
->
real_raw
=
1
;
port
->
tty
->
low_latency
=
1
;
port
->
tty
->
raw
=
1
;
port
->
tty
->
real_raw
=
1
;
/*
* Lose the small buffers usbserial provides. Make larger ones.
*/
/*
* Lose the small buffers usbserial provides. Make larger ones.
*/
kfree
(
port
->
bulk_in_buffer
);
kfree
(
port
->
bulk_out_buffer
);
port
->
bulk_in_buffer
=
kmalloc
(
URBDATA_SIZE
,
GFP_KERNEL
);
if
(
port
->
bulk_in_buffer
==
NULL
)
{
goto
enomem
;
}
port
->
bulk_out_buffer
=
kmalloc
(
URBDATA_SIZE
,
GFP_KERNEL
);
if
(
port
->
bulk_out_buffer
==
NULL
)
{
kfree
(
port
->
bulk_in_buffer
);
kfree
(
port
->
bulk_out_buffer
);
port
->
bulk_in_buffer
=
kmalloc
(
URBDATA_SIZE
,
GFP_KERNEL
);
if
(
port
->
bulk_in_buffer
==
NULL
)
{
goto
enomem
;
}
port
->
bulk_out_buffer
=
kmalloc
(
URBDATA_SIZE
,
GFP_KERNEL
);
if
(
port
->
bulk_out_buffer
==
NULL
)
{
kfree
(
port
->
bulk_in_buffer
);
goto
enomem
;
}
port
->
read_urb
->
transfer_buffer
=
port
->
bulk_in_buffer
;
port
->
write_urb
->
transfer_buffer
=
port
->
bulk_out_buffer
;
port
->
read_urb
->
transfer_buffer_length
=
URBDATA_SIZE
;
port
->
bulk_out_size
=
port
->
write_urb
->
transfer_buffer_length
=
URBDATA_SIZE
;
/* Start reading from the device */
FILL_BULK_URB
(
port
->
read_urb
,
serial
->
dev
,
usb_rcvbulkpipe
(
serial
->
dev
,
port
->
bulk_in_endpointAddress
),
port
->
read_urb
->
transfer_buffer
,
port
->
read_urb
->
transfer_buffer_length
,
ipaq_read_bulk_callback
,
port
);
result
=
usb_submit_urb
(
port
->
read_urb
,
GFP_KERNEL
);
if
(
result
)
{
err
(
__FUNCTION__
" - failed submitting read urb, error %d"
,
result
);
}
goto
enomem
;
}
port
->
read_urb
->
transfer_buffer
=
port
->
bulk_in_buffer
;
port
->
write_urb
->
transfer_buffer
=
port
->
bulk_out_buffer
;
port
->
read_urb
->
transfer_buffer_length
=
URBDATA_SIZE
;
port
->
bulk_out_size
=
port
->
write_urb
->
transfer_buffer_length
=
URBDATA_SIZE
;
/* Start reading from the device */
FILL_BULK_URB
(
port
->
read_urb
,
serial
->
dev
,
usb_rcvbulkpipe
(
serial
->
dev
,
port
->
bulk_in_endpointAddress
),
port
->
read_urb
->
transfer_buffer
,
port
->
read_urb
->
transfer_buffer_length
,
ipaq_read_bulk_callback
,
port
);
result
=
usb_submit_urb
(
port
->
read_urb
,
GFP_KERNEL
);
if
(
result
)
{
err
(
__FUNCTION__
" - failed submitting read urb, error %d"
,
result
);
}
/*
* Send out two control messages observed in win98 sniffs. Not sure what
* they do.
*/
/*
* Send out two control messages observed in win98 sniffs. Not sure what
* they do.
*/
result
=
usb_control_msg
(
serial
->
dev
,
usb_sndctrlpipe
(
serial
->
dev
,
0
),
0x22
,
0x21
,
0x1
,
0
,
NULL
,
0
,
5
*
HZ
);
if
(
result
<
0
)
{
err
(
__FUNCTION__
" - failed doing control urb, error %d"
,
result
);
}
result
=
usb_control_msg
(
serial
->
dev
,
usb_sndctrlpipe
(
serial
->
dev
,
0
),
0x22
,
0x21
,
0x1
,
0
,
NULL
,
0
,
5
*
HZ
);
if
(
result
<
0
)
{
err
(
__FUNCTION__
" - failed doing control urb, error %d"
,
result
);
}
result
=
usb_control_msg
(
serial
->
dev
,
usb_sndctrlpipe
(
serial
->
dev
,
0
),
0x22
,
0x21
,
0x1
,
0
,
NULL
,
0
,
5
*
HZ
);
if
(
result
<
0
)
{
err
(
__FUNCTION__
" - failed doing control urb, error %d"
,
result
);
}
result
=
usb_control_msg
(
serial
->
dev
,
usb_sndctrlpipe
(
serial
->
dev
,
0
),
0x22
,
0x21
,
0x1
,
0
,
NULL
,
0
,
5
*
HZ
);
if
(
result
<
0
)
{
err
(
__FUNCTION__
" - failed doing control urb, error %d"
,
result
);
}
return
result
;
...
...
@@ -237,22 +233,16 @@ static void ipaq_close(struct usb_serial_port *port, struct file *filp)
if
(
!
serial
)
return
;
--
port
->
open_count
;
/*
* shut down bulk read and write
*/
if
(
port
->
open_count
<=
0
)
{
/*
* shut down bulk read and write
*/
usb_unlink_urb
(
port
->
write_urb
);
usb_unlink_urb
(
port
->
read_urb
);
ipaq_destroy_lists
(
port
);
kfree
(
priv
);
port
->
private
=
NULL
;
port
->
open_count
=
0
;
usb_unlink_urb
(
port
->
write_urb
);
usb_unlink_urb
(
port
->
read_urb
);
ipaq_destroy_lists
(
port
);
kfree
(
priv
);
port
->
private
=
NULL
;
}
/* Uncomment the following line if you want to see some statistics in your syslog */
/* info ("Bytes In = %d Bytes Out = %d", bytes_in, bytes_out); */
}
...
...
@@ -507,16 +497,7 @@ static int ipaq_startup(struct usb_serial *serial)
static
void
ipaq_shutdown
(
struct
usb_serial
*
serial
)
{
int
i
;
dbg
(
__FUNCTION__
);
/* stop reads and writes on all ports */
for
(
i
=
0
;
i
<
serial
->
num_ports
;
++
i
)
{
while
(
serial
->
port
[
i
].
open_count
>
0
)
{
ipaq_close
(
&
serial
->
port
[
i
],
NULL
);
}
}
}
static
int
__init
ipaq_init
(
void
)
...
...
drivers/usb/serial/ir-usb.c
View file @
e1127c36
...
...
@@ -283,45 +283,42 @@ static int ir_open (struct usb_serial_port *port, struct file *filp)
dbg
(
"%s - port %d"
,
__FUNCTION__
,
port
->
number
);
++
port
->
open_count
;
if
(
port
->
open_count
==
1
)
{
if
(
buffer_size
)
{
/* override the default buffer sizes */
buffer
=
kmalloc
(
buffer_size
,
GFP_KERNEL
);
if
(
!
buffer
)
{
err
(
"%s - out of memory."
,
__FUNCTION__
);
return
-
ENOMEM
;
}
kfree
(
port
->
read_urb
->
transfer_buffer
);
port
->
read_urb
->
transfer_buffer
=
buffer
;
port
->
read_urb
->
transfer_buffer_length
=
buffer_size
;
buffer
=
kmalloc
(
buffer_size
,
GFP_KERNEL
);
if
(
!
buffer
)
{
err
(
"%s - out of memory."
,
__FUNCTION__
);
return
-
ENOMEM
;
}
kfree
(
port
->
write_urb
->
transfer_buffer
);
port
->
write_urb
->
transfer_buffer
=
buffer
;
port
->
write_urb
->
transfer_buffer_length
=
buffer_size
;
port
->
bulk_out_size
=
buffer_size
;
if
(
buffer_size
)
{
/* override the default buffer sizes */
buffer
=
kmalloc
(
buffer_size
,
GFP_KERNEL
);
if
(
!
buffer
)
{
err
(
"%s - out of memory."
,
__FUNCTION__
);
return
-
ENOMEM
;
}
/* Start reading from the device */
usb_fill_bulk_urb
(
port
->
read_urb
,
serial
->
dev
,
usb_rcvbulkpipe
(
serial
->
dev
,
port
->
bulk_in_endpointAddress
),
port
->
read_urb
->
transfer_buffer
,
port
->
read_urb
->
transfer_buffer_length
,
ir_read_bulk_callback
,
port
);
port
->
read_urb
->
transfer_flags
=
USB_QUEUE_BULK
;
result
=
usb_submit_urb
(
port
->
read_urb
,
GFP_KERNEL
);
if
(
result
)
err
(
"%s - failed submitting read urb, error %d"
,
__FUNCTION__
,
result
);
kfree
(
port
->
read_urb
->
transfer_buffer
);
port
->
read_urb
->
transfer_buffer
=
buffer
;
port
->
read_urb
->
transfer_buffer_length
=
buffer_size
;
buffer
=
kmalloc
(
buffer_size
,
GFP_KERNEL
);
if
(
!
buffer
)
{
err
(
"%s - out of memory."
,
__FUNCTION__
);
return
-
ENOMEM
;
}
kfree
(
port
->
write_urb
->
transfer_buffer
);
port
->
write_urb
->
transfer_buffer
=
buffer
;
port
->
write_urb
->
transfer_buffer_length
=
buffer_size
;
port
->
bulk_out_size
=
buffer_size
;
}
/* Start reading from the device */
usb_fill_bulk_urb
(
port
->
read_urb
,
serial
->
dev
,
usb_rcvbulkpipe
(
serial
->
dev
,
port
->
bulk_in_endpointAddress
),
port
->
read_urb
->
transfer_buffer
,
port
->
read_urb
->
transfer_buffer_length
,
ir_read_bulk_callback
,
port
);
port
->
read_urb
->
transfer_flags
=
USB_QUEUE_BULK
;
result
=
usb_submit_urb
(
port
->
read_urb
,
GFP_KERNEL
);
if
(
result
)
err
(
"%s - failed submitting read urb, error %d"
,
__FUNCTION__
,
result
);
return
result
;
}
...
...
@@ -338,15 +335,9 @@ static void ir_close (struct usb_serial_port *port, struct file * filp)
if
(
!
serial
)
return
;
--
port
->
open_count
;
if
(
port
->
open_count
<=
0
)
{
if
(
serial
->
dev
)
{
/* shutdown our bulk read */
usb_unlink_urb
(
port
->
read_urb
);
}
port
->
open_count
=
0
;
if
(
serial
->
dev
)
{
/* shutdown our bulk read */
usb_unlink_urb
(
port
->
read_urb
);
}
}
...
...
drivers/usb/serial/keyspan.c
View file @
e1127c36
...
...
@@ -852,7 +852,7 @@ static int keyspan_open (struct usb_serial_port *port, struct file *filp)
struct
keyspan_serial_private
*
s_priv
;
struct
usb_serial
*
serial
=
port
->
serial
;
const
struct
keyspan_device_details
*
d_details
;
int
i
,
already_active
,
err
;
int
i
,
err
;
struct
urb
*
urb
;
s_priv
=
(
struct
keyspan_serial_private
*
)(
serial
->
private
);
...
...
@@ -861,12 +861,6 @@ static int keyspan_open (struct usb_serial_port *port, struct file *filp)
dbg
(
"keyspan_open called for port%d.
\n
"
,
port
->
number
);
already_active
=
port
->
open_count
;
++
port
->
open_count
;
if
(
already_active
)
return
0
;
p_priv
=
(
struct
keyspan_port_private
*
)(
port
->
private
);
/* Set some sane defaults */
...
...
@@ -924,19 +918,16 @@ static void keyspan_close(struct usb_serial_port *port, struct file *filp)
p_priv
->
out_flip
=
0
;
p_priv
->
in_flip
=
0
;
if
(
--
port
->
open_count
<=
0
)
{
if
(
serial
->
dev
)
{
/* Stop reading/writing urbs */
stop_urb
(
p_priv
->
inack_urb
);
stop_urb
(
p_priv
->
outcont_urb
);
for
(
i
=
0
;
i
<
2
;
i
++
)
{
stop_urb
(
p_priv
->
in_urbs
[
i
]);
stop_urb
(
p_priv
->
out_urbs
[
i
]);
}
if
(
serial
->
dev
)
{
/* Stop reading/writing urbs */
stop_urb
(
p_priv
->
inack_urb
);
stop_urb
(
p_priv
->
outcont_urb
);
for
(
i
=
0
;
i
<
2
;
i
++
)
{
stop_urb
(
p_priv
->
in_urbs
[
i
]);
stop_urb
(
p_priv
->
out_urbs
[
i
]);
}
port
->
open_count
=
0
;
port
->
tty
=
0
;
}
port
->
tty
=
0
;
}
...
...
@@ -1762,9 +1753,6 @@ static void keyspan_shutdown (struct usb_serial *serial)
/* Now free per port private data */
for
(
i
=
0
;
i
<
serial
->
num_ports
;
i
++
)
{
port
=
&
serial
->
port
[
i
];
while
(
port
->
open_count
>
0
)
{
--
port
->
open_count
;
}
kfree
(
port
->
private
);
}
}
...
...
drivers/usb/serial/keyspan_pda.c
View file @
e1127c36
...
...
@@ -662,52 +662,45 @@ static int keyspan_pda_open (struct usb_serial_port *port, struct file *filp)
int
rc
=
0
;
struct
keyspan_pda_private
*
priv
;
++
port
->
open_count
;
if
(
port
->
open_count
==
1
)
{
/* find out how much room is in the Tx ring */
rc
=
usb_control_msg
(
serial
->
dev
,
usb_rcvctrlpipe
(
serial
->
dev
,
0
),
6
,
/* write_room */
USB_TYPE_VENDOR
|
USB_RECIP_INTERFACE
|
USB_DIR_IN
,
0
,
/* value */
0
,
/* index */
&
room
,
1
,
2
*
HZ
);
if
(
rc
<
0
)
{
dbg
(
__FUNCTION__
" - roomquery failed"
);
goto
error
;
}
if
(
rc
==
0
)
{
dbg
(
__FUNCTION__
" - roomquery returned 0 bytes"
);
rc
=
-
EIO
;
goto
error
;
}
priv
=
(
struct
keyspan_pda_private
*
)(
port
->
private
);
priv
->
tx_room
=
room
;
priv
->
tx_throttled
=
room
?
0
:
1
;
/* the normal serial device seems to always turn on DTR and RTS here,
so do the same */
if
(
port
->
tty
->
termios
->
c_cflag
&
CBAUD
)
keyspan_pda_set_modem_info
(
serial
,
(
1
<<
7
)
|
(
1
<<
2
)
);
else
keyspan_pda_set_modem_info
(
serial
,
0
);
/*Start reading from the device*/
port
->
interrupt_in_urb
->
dev
=
serial
->
dev
;
rc
=
usb_submit_urb
(
port
->
interrupt_in_urb
,
GFP_KERNEL
);
if
(
rc
)
{
dbg
(
__FUNCTION__
" - usb_submit_urb(read int) failed"
);
goto
error
;
}
/* find out how much room is in the Tx ring */
rc
=
usb_control_msg
(
serial
->
dev
,
usb_rcvctrlpipe
(
serial
->
dev
,
0
),
6
,
/* write_room */
USB_TYPE_VENDOR
|
USB_RECIP_INTERFACE
|
USB_DIR_IN
,
0
,
/* value */
0
,
/* index */
&
room
,
1
,
2
*
HZ
);
if
(
rc
<
0
)
{
dbg
(
__FUNCTION__
" - roomquery failed"
);
goto
error
;
}
if
(
rc
==
0
)
{
dbg
(
__FUNCTION__
" - roomquery returned 0 bytes"
);
rc
=
-
EIO
;
goto
error
;
}
priv
=
(
struct
keyspan_pda_private
*
)(
port
->
private
);
priv
->
tx_room
=
room
;
priv
->
tx_throttled
=
room
?
0
:
1
;
/* the normal serial device seems to always turn on DTR and RTS here,
so do the same */
if
(
port
->
tty
->
termios
->
c_cflag
&
CBAUD
)
keyspan_pda_set_modem_info
(
serial
,
(
1
<<
7
)
|
(
1
<<
2
)
);
else
keyspan_pda_set_modem_info
(
serial
,
0
);
/*Start reading from the device*/
port
->
interrupt_in_urb
->
dev
=
serial
->
dev
;
rc
=
usb_submit_urb
(
port
->
interrupt_in_urb
,
GFP_KERNEL
);
if
(
rc
)
{
dbg
(
__FUNCTION__
" - usb_submit_urb(read int) failed"
);
goto
error
;
}
return
rc
;
error:
--
port
->
open_count
;
return
rc
;
}
...
...
@@ -716,19 +709,14 @@ static void keyspan_pda_close(struct usb_serial_port *port, struct file *filp)
{
struct
usb_serial
*
serial
=
port
->
serial
;
--
port
->
open_count
;
if
(
port
->
open_count
<=
0
)
{
if
(
serial
->
dev
)
{
/* the normal serial device seems to always shut off DTR and RTS now */
if
(
port
->
tty
->
termios
->
c_cflag
&
HUPCL
)
keyspan_pda_set_modem_info
(
serial
,
0
);
if
(
serial
->
dev
)
{
/* the normal serial device seems to always shut off DTR and RTS now */
if
(
port
->
tty
->
termios
->
c_cflag
&
HUPCL
)
keyspan_pda_set_modem_info
(
serial
,
0
);
/* shutdown our bulk reads and writes */
usb_unlink_urb
(
port
->
write_urb
);
usb_unlink_urb
(
port
->
interrupt_in_urb
);
}
port
->
open_count
=
0
;
/* shutdown our bulk reads and writes */
usb_unlink_urb
(
port
->
write_urb
);
usb_unlink_urb
(
port
->
interrupt_in_urb
);
}
}
...
...
@@ -805,9 +793,6 @@ static void keyspan_pda_shutdown (struct usb_serial *serial)
{
dbg
(
__FUNCTION__
);
while
(
serial
->
port
[
0
].
open_count
>
0
)
{
keyspan_pda_close
(
&
serial
->
port
[
0
],
NULL
);
}
kfree
(
serial
->
port
[
0
].
private
);
}
...
...
drivers/usb/serial/kl5kusb105.c
View file @
e1127c36
...
...
@@ -317,9 +317,6 @@ static void klsi_105_shutdown (struct usb_serial *serial)
struct
klsi_105_private
*
priv
=
(
struct
klsi_105_private
*
)
serial
->
port
[
i
].
private
;
unsigned
long
flags
;
while
(
serial
->
port
[
i
].
open_count
>
0
)
{
klsi_105_close
(
&
serial
->
port
[
i
],
NULL
);
}
if
(
priv
)
{
/* kill our write urb pool */
...
...
@@ -355,85 +352,80 @@ static int klsi_105_open (struct usb_serial_port *port, struct file *filp)
struct
usb_serial
*
serial
=
port
->
serial
;
struct
klsi_105_private
*
priv
=
(
struct
klsi_105_private
*
)
port
->
private
;
int
retval
=
0
;
int
rc
;
int
i
;
unsigned
long
line_state
;
dbg
(
__FUNCTION__
" port %d"
,
port
->
number
);
++
port
->
open_count
;
/* force low_latency on so that our tty_push actually forces
* the data through
* port->tty->low_latency = 1; */
if
(
port
->
open_count
==
1
)
{
int
rc
;
int
i
;
unsigned
long
line_state
;
/* force low_latency on so that our tty_push actually forces
* the data through
* port->tty->low_latency = 1; */
/* Do a defined restart:
* Set up sane default baud rate and send the 'READ_ON'
* vendor command.
* FIXME: set modem line control (how?)
* Then read the modem line control and store values in
* priv->line_state.
*/
priv
->
cfg
.
pktlen
=
5
;
priv
->
cfg
.
baudrate
=
kl5kusb105a_sio_b9600
;
priv
->
cfg
.
databits
=
kl5kusb105a_dtb_8
;
priv
->
cfg
.
unknown1
=
0
;
priv
->
cfg
.
unknown2
=
1
;
klsi_105_chg_port_settings
(
serial
,
&
(
priv
->
cfg
));
/* set up termios structure */
priv
->
termios
.
c_iflag
=
port
->
tty
->
termios
->
c_iflag
;
priv
->
termios
.
c_oflag
=
port
->
tty
->
termios
->
c_oflag
;
priv
->
termios
.
c_cflag
=
port
->
tty
->
termios
->
c_cflag
;
priv
->
termios
.
c_lflag
=
port
->
tty
->
termios
->
c_lflag
;
for
(
i
=
0
;
i
<
NCCS
;
i
++
)
priv
->
termios
.
c_cc
[
i
]
=
port
->
tty
->
termios
->
c_cc
[
i
];
/* READ_ON and urb submission */
FILL_BULK_URB
(
port
->
read_urb
,
serial
->
dev
,
usb_rcvbulkpipe
(
serial
->
dev
,
port
->
bulk_in_endpointAddress
),
port
->
read_urb
->
transfer_buffer
,
port
->
read_urb
->
transfer_buffer_length
,
klsi_105_read_bulk_callback
,
port
);
port
->
read_urb
->
transfer_flags
|=
USB_QUEUE_BULK
;
/* Do a defined restart:
* Set up sane default baud rate and send the 'READ_ON'
* vendor command.
* FIXME: set modem line control (how?)
* Then read the modem line control and store values in
* priv->line_state.
*/
priv
->
cfg
.
pktlen
=
5
;
priv
->
cfg
.
baudrate
=
kl5kusb105a_sio_b9600
;
priv
->
cfg
.
databits
=
kl5kusb105a_dtb_8
;
priv
->
cfg
.
unknown1
=
0
;
priv
->
cfg
.
unknown2
=
1
;
klsi_105_chg_port_settings
(
serial
,
&
(
priv
->
cfg
));
/* set up termios structure */
priv
->
termios
.
c_iflag
=
port
->
tty
->
termios
->
c_iflag
;
priv
->
termios
.
c_oflag
=
port
->
tty
->
termios
->
c_oflag
;
priv
->
termios
.
c_cflag
=
port
->
tty
->
termios
->
c_cflag
;
priv
->
termios
.
c_lflag
=
port
->
tty
->
termios
->
c_lflag
;
for
(
i
=
0
;
i
<
NCCS
;
i
++
)
priv
->
termios
.
c_cc
[
i
]
=
port
->
tty
->
termios
->
c_cc
[
i
];
rc
=
usb_submit_urb
(
port
->
read_urb
,
GFP_KERNEL
);
if
(
rc
)
{
err
(
__FUNCTION__
" - failed submitting read urb, error %d"
,
rc
);
retval
=
rc
;
goto
exit
;
}
rc
=
usb_control_msg
(
serial
->
dev
,
usb_sndctrlpipe
(
serial
->
dev
,
0
),
KL5KUSB105A_SIO_CONFIGURE
,
USB_TYPE_VENDOR
|
USB_DIR_OUT
|
USB_RECIP_INTERFACE
,
KL5KUSB105A_SIO_CONFIGURE_READ_ON
,
0
,
/* index */
NULL
,
0
,
KLSI_TIMEOUT
);
if
(
rc
<
0
)
{
err
(
"Enabling read failed (error = %d)"
,
rc
);
retval
=
rc
;
}
else
dbg
(
__FUNCTION__
" - enabled reading"
);
/* READ_ON and urb submission */
FILL_BULK_URB
(
port
->
read_urb
,
serial
->
dev
,
usb_rcvbulkpipe
(
serial
->
dev
,
port
->
bulk_in_endpointAddress
),
port
->
read_urb
->
transfer_buffer
,
port
->
read_urb
->
transfer_buffer_length
,
klsi_105_read_bulk_callback
,
port
);
port
->
read_urb
->
transfer_flags
|=
USB_QUEUE_BULK
;
rc
=
klsi_105_get_line_state
(
serial
,
&
line_state
);
if
(
rc
>=
0
)
{
priv
->
line_state
=
line_state
;
dbg
(
__FUNCTION__
" - read line state 0x%lx"
,
line_state
);
retval
=
0
;
}
else
retval
=
rc
;
rc
=
usb_submit_urb
(
port
->
read_urb
,
GFP_KERNEL
);
if
(
rc
)
{
err
(
__FUNCTION__
" - failed submitting read urb, error %d"
,
rc
);
retval
=
rc
;
goto
exit
;
}
rc
=
usb_control_msg
(
serial
->
dev
,
usb_sndctrlpipe
(
serial
->
dev
,
0
),
KL5KUSB105A_SIO_CONFIGURE
,
USB_TYPE_VENDOR
|
USB_DIR_OUT
|
USB_RECIP_INTERFACE
,
KL5KUSB105A_SIO_CONFIGURE_READ_ON
,
0
,
/* index */
NULL
,
0
,
KLSI_TIMEOUT
);
if
(
rc
<
0
)
{
err
(
"Enabling read failed (error = %d)"
,
rc
);
retval
=
rc
;
}
else
dbg
(
__FUNCTION__
" - enabled reading"
);
rc
=
klsi_105_get_line_state
(
serial
,
&
line_state
);
if
(
rc
>=
0
)
{
priv
->
line_state
=
line_state
;
dbg
(
__FUNCTION__
" - read line state 0x%lx"
,
line_state
);
retval
=
0
;
}
else
retval
=
rc
;
exit:
return
retval
;
}
/* klsi_105_open */
...
...
@@ -444,6 +436,7 @@ static void klsi_105_close (struct usb_serial_port *port, struct file *filp)
struct
usb_serial
*
serial
;
struct
klsi_105_private
*
priv
=
(
struct
klsi_105_private
*
)
port
->
private
;
int
rc
;
dbg
(
__FUNCTION__
" port %d"
,
port
->
number
);
serial
=
get_usb_serial
(
port
,
__FUNCTION__
);
...
...
@@ -451,31 +444,26 @@ static void klsi_105_close (struct usb_serial_port *port, struct file *filp)
if
(
!
serial
)
return
;
--
port
->
open_count
;
if
(
port
->
open_count
<=
0
)
{
/* send READ_OFF */
int
rc
=
usb_control_msg
(
serial
->
dev
,
usb_sndctrlpipe
(
serial
->
dev
,
0
),
KL5KUSB105A_SIO_CONFIGURE
,
USB_TYPE_VENDOR
|
USB_DIR_OUT
,
KL5KUSB105A_SIO_CONFIGURE_READ_OFF
,
0
,
/* index */
NULL
,
0
,
KLSI_TIMEOUT
);
if
(
rc
<
0
)
err
(
"Disabling read failed (error = %d)"
,
rc
);
/* shutdown our bulk reads and writes */
usb_unlink_urb
(
port
->
write_urb
);
usb_unlink_urb
(
port
->
read_urb
);
/* unlink our write pool */
/* FIXME */
/* wgg - do I need this? I think so. */
usb_unlink_urb
(
port
->
interrupt_in_urb
);
port
->
open_count
=
0
;
info
(
"kl5kusb105 port stats: %ld bytes in, %ld bytes out"
,
priv
->
bytes_in
,
priv
->
bytes_out
);
}
/* send READ_OFF */
rc
=
usb_control_msg
(
serial
->
dev
,
usb_sndctrlpipe
(
serial
->
dev
,
0
),
KL5KUSB105A_SIO_CONFIGURE
,
USB_TYPE_VENDOR
|
USB_DIR_OUT
,
KL5KUSB105A_SIO_CONFIGURE_READ_OFF
,
0
,
/* index */
NULL
,
0
,
KLSI_TIMEOUT
);
if
(
rc
<
0
)
err
(
"Disabling read failed (error = %d)"
,
rc
);
/* shutdown our bulk reads and writes */
usb_unlink_urb
(
port
->
write_urb
);
usb_unlink_urb
(
port
->
read_urb
);
/* unlink our write pool */
/* FIXME */
/* wgg - do I need this? I think so. */
usb_unlink_urb
(
port
->
interrupt_in_urb
);
info
(
"kl5kusb105 port stats: %ld bytes in, %ld bytes out"
,
priv
->
bytes_in
,
priv
->
bytes_out
);
}
/* klsi_105_close */
...
...
drivers/usb/serial/mct_u232.c
View file @
e1127c36
...
...
@@ -324,9 +324,6 @@ static void mct_u232_shutdown (struct usb_serial *serial)
/* stop reads and writes on all ports */
for
(
i
=
0
;
i
<
serial
->
num_ports
;
++
i
)
{
while
(
serial
->
port
[
i
].
open_count
>
0
)
{
mct_u232_close
(
&
serial
->
port
[
i
],
NULL
);
}
/* My special items, the standard routines free my urbs */
if
(
serial
->
port
[
i
].
private
)
kfree
(
serial
->
port
[
i
].
private
);
...
...
@@ -341,60 +338,55 @@ static int mct_u232_open (struct usb_serial_port *port, struct file *filp)
dbg
(
__FUNCTION__
" port %d"
,
port
->
number
);
++
port
->
open_count
;
if
(
port
->
open_count
==
1
)
{
/* Compensate for a hardware bug: although the Sitecom U232-P25
* device reports a maximum output packet size of 32 bytes,
* it seems to be able to accept only 16 bytes (and that's what
* SniffUSB says too...)
*/
if
(
serial
->
dev
->
descriptor
.
idProduct
==
MCT_U232_SITECOM_PID
)
port
->
bulk_out_size
=
16
;
/* Do a defined restart: the normal serial device seems to
* always turn on DTR and RTS here, so do the same. I'm not
* sure if this is really necessary. But it should not harm
* either.
*/
if
(
port
->
tty
->
termios
->
c_cflag
&
CBAUD
)
priv
->
control_state
=
TIOCM_DTR
|
TIOCM_RTS
;
else
priv
->
control_state
=
0
;
mct_u232_set_modem_ctrl
(
serial
,
priv
->
control_state
);
priv
->
last_lcr
=
(
MCT_U232_DATA_BITS_8
|
MCT_U232_PARITY_NONE
|
MCT_U232_STOP_BITS_1
);
mct_u232_set_line_ctrl
(
serial
,
priv
->
last_lcr
);
/* Compensate for a hardware bug: although the Sitecom U232-P25
* device reports a maximum output packet size of 32 bytes,
* it seems to be able to accept only 16 bytes (and that's what
* SniffUSB says too...)
*/
if
(
serial
->
dev
->
descriptor
.
idProduct
==
MCT_U232_SITECOM_PID
)
port
->
bulk_out_size
=
16
;
/* Read modem status and update control state */
mct_u232_get_modem_stat
(
serial
,
&
priv
->
last_msr
);
mct_u232_msr_to_state
(
&
priv
->
control_state
,
priv
->
last_msr
);
{
/* Puh, that's dirty */
struct
usb_serial_port
*
rport
;
rport
=
&
serial
->
port
[
1
];
rport
->
tty
=
port
->
tty
;
rport
->
private
=
port
->
private
;
port
->
read_urb
=
rport
->
interrupt_in_urb
;
}
/* Do a defined restart: the normal serial device seems to
* always turn on DTR and RTS here, so do the same. I'm not
* sure if this is really necessary. But it should not harm
* either.
*/
if
(
port
->
tty
->
termios
->
c_cflag
&
CBAUD
)
priv
->
control_state
=
TIOCM_DTR
|
TIOCM_RTS
;
else
priv
->
control_state
=
0
;
mct_u232_set_modem_ctrl
(
serial
,
priv
->
control_state
);
priv
->
last_lcr
=
(
MCT_U232_DATA_BITS_8
|
MCT_U232_PARITY_NONE
|
MCT_U232_STOP_BITS_1
);
mct_u232_set_line_ctrl
(
serial
,
priv
->
last_lcr
);
port
->
read_urb
->
dev
=
port
->
serial
->
dev
;
retval
=
usb_submit_urb
(
port
->
read_urb
,
GFP_KERNEL
);
if
(
retval
)
{
err
(
"usb_submit_urb(read bulk) failed"
);
goto
exit
;
}
/* Read modem status and update control state */
mct_u232_get_modem_stat
(
serial
,
&
priv
->
last_msr
);
mct_u232_msr_to_state
(
&
priv
->
control_state
,
priv
->
last_msr
);
port
->
interrupt_in_urb
->
dev
=
port
->
serial
->
dev
;
retval
=
usb_submit_urb
(
port
->
interrupt_in_urb
,
GFP_KERNEL
);
if
(
retval
)
err
(
" usb_submit_urb(read int) failed"
);
{
/* Puh, that's dirty */
struct
usb_serial_port
*
rport
;
rport
=
&
serial
->
port
[
1
];
rport
->
tty
=
port
->
tty
;
rport
->
private
=
port
->
private
;
port
->
read_urb
=
rport
->
interrupt_in_urb
;
}
port
->
read_urb
->
dev
=
port
->
serial
->
dev
;
retval
=
usb_submit_urb
(
port
->
read_urb
,
GFP_KERNEL
);
if
(
retval
)
{
err
(
"usb_submit_urb(read bulk) failed"
);
goto
exit
;
}
port
->
interrupt_in_urb
->
dev
=
port
->
serial
->
dev
;
retval
=
usb_submit_urb
(
port
->
interrupt_in_urb
,
GFP_KERNEL
);
if
(
retval
)
err
(
" usb_submit_urb(read int) failed"
);
exit:
return
0
;
}
/* mct_u232_open */
...
...
@@ -404,16 +396,11 @@ static void mct_u232_close (struct usb_serial_port *port, struct file *filp)
{
dbg
(
__FUNCTION__
" port %d"
,
port
->
number
);
--
port
->
open_count
;
if
(
port
->
open_count
<=
0
)
{
if
(
port
->
serial
->
dev
)
{
/* shutdown our urbs */
usb_unlink_urb
(
port
->
write_urb
);
usb_unlink_urb
(
port
->
read_urb
);
usb_unlink_urb
(
port
->
interrupt_in_urb
);
}
port
->
open_count
=
0
;
if
(
port
->
serial
->
dev
)
{
/* shutdown our urbs */
usb_unlink_urb
(
port
->
write_urb
);
usb_unlink_urb
(
port
->
read_urb
);
usb_unlink_urb
(
port
->
interrupt_in_urb
);
}
}
/* mct_u232_close */
...
...
drivers/usb/serial/omninet.c
View file @
e1127c36
...
...
@@ -157,30 +157,25 @@ static int omninet_open (struct usb_serial_port *port, struct file *filp)
if
(
!
serial
)
return
-
ENODEV
;
++
port
->
open_count
;
if
(
port
->
open_count
==
1
)
{
od
=
kmalloc
(
sizeof
(
struct
omninet_data
),
GFP_KERNEL
);
if
(
!
od
)
{
err
(
__FUNCTION__
"- kmalloc(%Zd) failed."
,
sizeof
(
struct
omninet_data
));
port
->
open_count
=
0
;
return
-
ENOMEM
;
}
port
->
private
=
od
;
wport
=
&
serial
->
port
[
1
];
wport
->
tty
=
port
->
tty
;
/* Start reading from the device */
FILL_BULK_URB
(
port
->
read_urb
,
serial
->
dev
,
usb_rcvbulkpipe
(
serial
->
dev
,
port
->
bulk_in_endpointAddress
),
port
->
read_urb
->
transfer_buffer
,
port
->
read_urb
->
transfer_buffer_length
,
omninet_read_bulk_callback
,
port
);
result
=
usb_submit_urb
(
port
->
read_urb
,
GFP_KERNEL
);
if
(
result
)
err
(
__FUNCTION__
" - failed submitting read urb, error %d"
,
result
);
od
=
kmalloc
(
sizeof
(
struct
omninet_data
),
GFP_KERNEL
);
if
(
!
od
)
{
err
(
__FUNCTION__
"- kmalloc(%Zd) failed."
,
sizeof
(
struct
omninet_data
));
return
-
ENOMEM
;
}
port
->
private
=
od
;
wport
=
&
serial
->
port
[
1
];
wport
->
tty
=
port
->
tty
;
/* Start reading from the device */
FILL_BULK_URB
(
port
->
read_urb
,
serial
->
dev
,
usb_rcvbulkpipe
(
serial
->
dev
,
port
->
bulk_in_endpointAddress
),
port
->
read_urb
->
transfer_buffer
,
port
->
read_urb
->
transfer_buffer_length
,
omninet_read_bulk_callback
,
port
);
result
=
usb_submit_urb
(
port
->
read_urb
,
GFP_KERNEL
);
if
(
result
)
err
(
__FUNCTION__
" - failed submitting read urb, error %d"
,
result
);
return
result
;
}
...
...
@@ -199,20 +194,15 @@ static void omninet_close (struct usb_serial_port *port, struct file * filp)
if
(
!
serial
)
return
;
--
port
->
open_count
;
if
(
port
->
open_count
<=
0
)
{
if
(
serial
->
dev
)
{
wport
=
&
serial
->
port
[
1
];
usb_unlink_urb
(
wport
->
write_urb
);
usb_unlink_urb
(
port
->
read_urb
);
}
port
->
open_count
=
0
;
od
=
(
struct
omninet_data
*
)
port
->
private
;
if
(
od
)
kfree
(
od
);
if
(
serial
->
dev
)
{
wport
=
&
serial
->
port
[
1
];
usb_unlink_urb
(
wport
->
write_urb
);
usb_unlink_urb
(
port
->
read_urb
);
}
od
=
(
struct
omninet_data
*
)
port
->
private
;
if
(
od
)
kfree
(
od
);
}
...
...
@@ -377,10 +367,6 @@ static void omninet_write_bulk_callback (struct urb *urb)
static
void
omninet_shutdown
(
struct
usb_serial
*
serial
)
{
dbg
(
__FUNCTION__
);
while
(
serial
->
port
[
0
].
open_count
>
0
)
{
omninet_close
(
&
serial
->
port
[
0
],
NULL
);
}
}
...
...
drivers/usb/serial/pl2303.c
View file @
e1127c36
...
...
@@ -367,56 +367,52 @@ static int pl2303_open (struct usb_serial_port *port, struct file *filp)
dbg
(
__FUNCTION__
" - port %d"
,
port
->
number
);
++
port
->
open_count
;
if
(
port
->
open_count
==
1
)
{
#define FISH(a,b,c,d) \
result=usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev,0), \
b, a, c, d, buf, 1, 100); \
dbg("0x%x:0x%x:0x%x:0x%x %d - %x",a,b,c,d,result,buf[0]);
#define SOUP(a,b,c,d) \
result=usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev,0), \
b, a, c, d, NULL, 0, 100); \
dbg("0x%x:0x%x:0x%x:0x%x %d",a,b,c,d,result);
FISH
(
VENDOR_READ_REQUEST_TYPE
,
VENDOR_READ_REQUEST
,
0x8484
,
0
);
SOUP
(
VENDOR_WRITE_REQUEST_TYPE
,
VENDOR_WRITE_REQUEST
,
0x0404
,
0
);
FISH
(
VENDOR_READ_REQUEST_TYPE
,
VENDOR_READ_REQUEST
,
0x8484
,
0
);
FISH
(
VENDOR_READ_REQUEST_TYPE
,
VENDOR_READ_REQUEST
,
0x8383
,
0
);
FISH
(
VENDOR_READ_REQUEST_TYPE
,
VENDOR_READ_REQUEST
,
0x8484
,
0
);
SOUP
(
VENDOR_WRITE_REQUEST_TYPE
,
VENDOR_WRITE_REQUEST
,
0x0404
,
1
);
FISH
(
VENDOR_READ_REQUEST_TYPE
,
VENDOR_READ_REQUEST
,
0x8484
,
0
);
FISH
(
VENDOR_READ_REQUEST_TYPE
,
VENDOR_READ_REQUEST
,
0x8383
,
0
);
SOUP
(
VENDOR_WRITE_REQUEST_TYPE
,
VENDOR_WRITE_REQUEST
,
0
,
1
);
SOUP
(
VENDOR_WRITE_REQUEST_TYPE
,
VENDOR_WRITE_REQUEST
,
1
,
0xc0
);
SOUP
(
VENDOR_WRITE_REQUEST_TYPE
,
VENDOR_WRITE_REQUEST
,
2
,
4
);
/* Setup termios */
*
(
port
->
tty
->
termios
)
=
tty_std_termios
;
port
->
tty
->
termios
->
c_cflag
=
B9600
|
CS8
|
CREAD
|
HUPCL
|
CLOCAL
;
pl2303_set_termios
(
port
,
&
tmp_termios
);
//FIXME: need to assert RTS and DTR if CRTSCTS off
dbg
(
__FUNCTION__
" - submitting read urb"
);
port
->
read_urb
->
dev
=
serial
->
dev
;
result
=
usb_submit_urb
(
port
->
read_urb
,
GFP_KERNEL
);
if
(
result
)
{
err
(
__FUNCTION__
" - failed submitting read urb, error %d"
,
result
);
pl2303_close
(
port
,
NULL
);
return
-
EPROTO
;
}
#define FISH(a,b,c,d) \
result=usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev,0), \
b, a, c, d, buf, 1, 100); \
dbg("0x%x:0x%x:0x%x:0x%x %d - %x",a,b,c,d,result,buf[0]);
#define SOUP(a,b,c,d) \
result=usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev,0), \
b, a, c, d, NULL, 0, 100); \
dbg("0x%x:0x%x:0x%x:0x%x %d",a,b,c,d,result);
FISH
(
VENDOR_READ_REQUEST_TYPE
,
VENDOR_READ_REQUEST
,
0x8484
,
0
);
SOUP
(
VENDOR_WRITE_REQUEST_TYPE
,
VENDOR_WRITE_REQUEST
,
0x0404
,
0
);
FISH
(
VENDOR_READ_REQUEST_TYPE
,
VENDOR_READ_REQUEST
,
0x8484
,
0
);
FISH
(
VENDOR_READ_REQUEST_TYPE
,
VENDOR_READ_REQUEST
,
0x8383
,
0
);
FISH
(
VENDOR_READ_REQUEST_TYPE
,
VENDOR_READ_REQUEST
,
0x8484
,
0
);
SOUP
(
VENDOR_WRITE_REQUEST_TYPE
,
VENDOR_WRITE_REQUEST
,
0x0404
,
1
);
FISH
(
VENDOR_READ_REQUEST_TYPE
,
VENDOR_READ_REQUEST
,
0x8484
,
0
);
FISH
(
VENDOR_READ_REQUEST_TYPE
,
VENDOR_READ_REQUEST
,
0x8383
,
0
);
SOUP
(
VENDOR_WRITE_REQUEST_TYPE
,
VENDOR_WRITE_REQUEST
,
0
,
1
);
SOUP
(
VENDOR_WRITE_REQUEST_TYPE
,
VENDOR_WRITE_REQUEST
,
1
,
0xc0
);
SOUP
(
VENDOR_WRITE_REQUEST_TYPE
,
VENDOR_WRITE_REQUEST
,
2
,
4
);
/* Setup termios */
*
(
port
->
tty
->
termios
)
=
tty_std_termios
;
port
->
tty
->
termios
->
c_cflag
=
B9600
|
CS8
|
CREAD
|
HUPCL
|
CLOCAL
;
pl2303_set_termios
(
port
,
&
tmp_termios
);
//FIXME: need to assert RTS and DTR if CRTSCTS off
dbg
(
__FUNCTION__
" - submitting read urb"
);
port
->
read_urb
->
dev
=
serial
->
dev
;
result
=
usb_submit_urb
(
port
->
read_urb
,
GFP_KERNEL
);
if
(
result
)
{
err
(
__FUNCTION__
" - failed submitting read urb, error %d"
,
result
);
pl2303_close
(
port
,
NULL
);
return
-
EPROTO
;
}
dbg
(
__FUNCTION__
" - submitting interrupt urb"
);
port
->
interrupt_in_urb
->
dev
=
serial
->
dev
;
result
=
usb_submit_urb
(
port
->
interrupt_in_urb
,
GFP_KERNEL
);
if
(
result
)
{
err
(
__FUNCTION__
" - failed submitting interrupt urb, error %d"
,
result
);
pl2303_close
(
port
,
NULL
);
return
-
EPROTO
;
}
dbg
(
__FUNCTION__
" - submitting interrupt urb"
);
port
->
interrupt_in_urb
->
dev
=
serial
->
dev
;
result
=
usb_submit_urb
(
port
->
interrupt_in_urb
,
GFP_KERNEL
);
if
(
result
)
{
err
(
__FUNCTION__
" - failed submitting interrupt urb, error %d"
,
result
);
pl2303_close
(
port
,
NULL
);
return
-
EPROTO
;
}
return
0
;
}
...
...
@@ -437,39 +433,35 @@ static void pl2303_close (struct usb_serial_port *port, struct file *filp)
dbg
(
__FUNCTION__
" - port %d"
,
port
->
number
);
--
port
->
open_count
;
if
(
port
->
open_count
<=
0
)
{
if
(
serial
->
dev
)
{
c_cflag
=
port
->
tty
->
termios
->
c_cflag
;
if
(
c_cflag
&
HUPCL
)
{
/* drop DTR and RTS */
priv
=
port
->
private
;
priv
->
line_control
=
0
;
set_control_lines
(
port
->
serial
->
dev
,
priv
->
line_control
);
}
if
(
serial
->
dev
)
{
c_cflag
=
port
->
tty
->
termios
->
c_cflag
;
if
(
c_cflag
&
HUPCL
)
{
/* drop DTR and RTS */
priv
=
port
->
private
;
priv
->
line_control
=
0
;
set_control_lines
(
port
->
serial
->
dev
,
priv
->
line_control
);
}
/* shutdown our urbs */
dbg
(
__FUNCTION__
" - shutting down urbs"
);
result
=
usb_unlink_urb
(
port
->
write_urb
);
if
(
result
)
dbg
(
__FUNCTION__
" - usb_unlink_urb "
"(write_urb) failed with reason: %d"
,
result
);
/* shutdown our urbs */
dbg
(
__FUNCTION__
" - shutting down urbs"
);
result
=
usb_unlink_urb
(
port
->
write_urb
);
if
(
result
)
dbg
(
__FUNCTION__
" - usb_unlink_urb "
"(write_urb) failed with reason: %d"
,
result
);
result
=
usb_unlink_urb
(
port
->
read_urb
);
if
(
result
)
dbg
(
__FUNCTION__
" - usb_unlink_urb "
"(read_urb) failed with reason: %d"
,
result
);
result
=
usb_unlink_urb
(
port
->
read_urb
);
if
(
result
)
dbg
(
__FUNCTION__
" - usb_unlink_urb "
"(read_urb) failed with reason: %d"
,
result
);
result
=
usb_unlink_urb
(
port
->
interrupt_in_urb
);
if
(
result
)
dbg
(
__FUNCTION__
" - usb_unlink_urb "
"(interrupt_in_urb) failed with reason: %d"
,
result
);
}
port
->
open_count
=
0
;
result
=
usb_unlink_urb
(
port
->
interrupt_in_urb
);
if
(
result
)
dbg
(
__FUNCTION__
" - usb_unlink_urb "
"(interrupt_in_urb) failed with reason: %d"
,
result
);
}
}
...
...
@@ -577,12 +569,8 @@ static void pl2303_shutdown (struct usb_serial *serial)
dbg
(
__FUNCTION__
);
/* stop everything on all ports */
for
(
i
=
0
;
i
<
serial
->
num_ports
;
++
i
)
while
(
serial
->
port
[
i
].
open_count
>
0
)
{
pl2303_close
(
&
serial
->
port
[
i
],
NULL
);
kfree
(
serial
->
port
[
i
].
private
);
}
kfree
(
serial
->
port
[
i
].
private
);
}
...
...
drivers/usb/serial/visor.c
View file @
e1127c36
...
...
@@ -268,32 +268,31 @@ static int visor_open (struct usb_serial_port *port, struct file *filp)
dbg
(
__FUNCTION__
" - port %d"
,
port
->
number
);
if
(
!
port
->
read_urb
)
{
/* this is needed for some brain dead Sony devices */
err
(
"Device lied about number of ports, please use a lower one."
);
return
-
ENODEV
;
}
++
port
->
open_count
;
bytes_in
=
0
;
bytes_out
=
0
;
/*
* Force low_latency on so that our tty_push actually forces the data
* through, otherwise it is scheduled, and with high data rates (like
* with OHCI) data can get lost.
*/
port
->
tty
->
low_latency
=
1
;
if
(
port
->
open_count
==
1
)
{
bytes_in
=
0
;
bytes_out
=
0
;
/* force low_latency on so that our tty_push actually forces the data through,
otherwise it is scheduled, and with high data rates (like with OHCI) data
can get lost. */
port
->
tty
->
low_latency
=
1
;
/* Start reading from the device */
usb_fill_bulk_urb
(
port
->
read_urb
,
serial
->
dev
,
usb_rcvbulkpipe
(
serial
->
dev
,
port
->
bulk_in_endpointAddress
),
port
->
read_urb
->
transfer_buffer
,
port
->
read_urb
->
transfer_buffer_length
,
visor_read_bulk_callback
,
port
);
result
=
usb_submit_urb
(
port
->
read_urb
,
GFP_KERNEL
);
if
(
result
)
err
(
__FUNCTION__
" - failed submitting read urb, error %d"
,
result
);
}
/* Start reading from the device */
usb_fill_bulk_urb
(
port
->
read_urb
,
serial
->
dev
,
usb_rcvbulkpipe
(
serial
->
dev
,
port
->
bulk_in_endpointAddress
),
port
->
read_urb
->
transfer_buffer
,
port
->
read_urb
->
transfer_buffer_length
,
visor_read_bulk_callback
,
port
);
result
=
usb_submit_urb
(
port
->
read_urb
,
GFP_KERNEL
);
if
(
result
)
err
(
__FUNCTION__
" - failed submitting read urb, error %d"
,
result
);
return
result
;
}
...
...
@@ -313,28 +312,23 @@ static void visor_close (struct usb_serial_port *port, struct file * filp)
if
(
!
serial
)
return
;
--
port
->
open_count
;
if
(
port
->
open_count
<=
0
)
{
if
(
serial
->
dev
)
{
/* only send a shutdown message if the
* device is still here */
transfer_buffer
=
kmalloc
(
0x12
,
GFP_KERNEL
);
if
(
!
transfer_buffer
)
{
err
(
__FUNCTION__
" - kmalloc(%d) failed."
,
0x12
);
}
else
{
/* send a shutdown message to the device */
usb_control_msg
(
serial
->
dev
,
usb_rcvctrlpipe
(
serial
->
dev
,
0
),
VISOR_CLOSE_NOTIFICATION
,
0xc2
,
0x0000
,
0x0000
,
transfer_buffer
,
0x12
,
300
);
kfree
(
transfer_buffer
);
}
/* shutdown our bulk read */
usb_unlink_urb
(
port
->
read_urb
);
if
(
serial
->
dev
)
{
/* only send a shutdown message if the
* device is still here */
transfer_buffer
=
kmalloc
(
0x12
,
GFP_KERNEL
);
if
(
!
transfer_buffer
)
{
err
(
__FUNCTION__
" - kmalloc(%d) failed."
,
0x12
);
}
else
{
/* send a shutdown message to the device */
usb_control_msg
(
serial
->
dev
,
usb_rcvctrlpipe
(
serial
->
dev
,
0
),
VISOR_CLOSE_NOTIFICATION
,
0xc2
,
0x0000
,
0x0000
,
transfer_buffer
,
0x12
,
300
);
kfree
(
transfer_buffer
);
}
port
->
open_count
=
0
;
/* shutdown our bulk read */
usb_unlink_urb
(
port
->
read_urb
);
}
/* Uncomment the following line if you want to see some statistics in your syslog */
/* info ("Bytes In = %d Bytes Out = %d", bytes_in, bytes_out); */
...
...
@@ -396,7 +390,7 @@ static int visor_write (struct usb_serial_port *port, int from_user, const unsig
usb_free_urb
(
urb
);
return
count
;
}
}
static
int
visor_write_room
(
struct
usb_serial_port
*
port
)
...
...
@@ -655,16 +649,9 @@ static int clie_3_5_startup (struct usb_serial *serial)
static
void
visor_shutdown
(
struct
usb_serial
*
serial
)
{
int
i
;
dbg
(
__FUNCTION__
);
/* stop reads and writes on all ports */
for
(
i
=
0
;
i
<
serial
->
num_ports
;
++
i
)
serial
->
port
[
i
].
open_count
=
0
;
}
static
int
visor_ioctl
(
struct
usb_serial_port
*
port
,
struct
file
*
file
,
unsigned
int
cmd
,
unsigned
long
arg
)
{
dbg
(
__FUNCTION__
" - port %d, cmd 0x%.4x"
,
port
->
number
,
cmd
);
...
...
drivers/usb/serial/whiteheat.c
View file @
e1127c36
...
...
@@ -306,58 +306,49 @@ static int whiteheat_open (struct usb_serial_port *port, struct file *filp)
dbg
(
__FUNCTION__
" - port %d"
,
port
->
number
);
++
port
->
open_count
;
if
(
port
->
open_count
==
1
)
{
/* set up some stuff for our command port */
command_port
=
&
port
->
serial
->
port
[
COMMAND_PORT
];
if
(
command_port
->
private
==
NULL
)
{
info
=
(
struct
whiteheat_private
*
)
kmalloc
(
sizeof
(
struct
whiteheat_private
),
GFP_KERNEL
);
if
(
info
==
NULL
)
{
err
(
__FUNCTION__
" - out of memory"
);
retval
=
-
ENOMEM
;
goto
error_exit
;
}
init_waitqueue_head
(
&
info
->
wait_command
);
command_port
->
private
=
info
;
command_port
->
write_urb
->
complete
=
command_port_write_callback
;
command_port
->
read_urb
->
complete
=
command_port_read_callback
;
command_port
->
read_urb
->
dev
=
port
->
serial
->
dev
;
command_port
->
tty
=
port
->
tty
;
/* need this to "fake" our our sanity check macros */
retval
=
usb_submit_urb
(
command_port
->
read_urb
,
GFP_KERNEL
);
if
(
retval
)
{
err
(
__FUNCTION__
" - failed submitting read urb, error %d"
,
retval
);
goto
error_exit
;
}
/* set up some stuff for our command port */
command_port
=
&
port
->
serial
->
port
[
COMMAND_PORT
];
if
(
command_port
->
private
==
NULL
)
{
info
=
(
struct
whiteheat_private
*
)
kmalloc
(
sizeof
(
struct
whiteheat_private
),
GFP_KERNEL
);
if
(
info
==
NULL
)
{
err
(
__FUNCTION__
" - out of memory"
);
retval
=
-
ENOMEM
;
goto
exit
;
}
/* Start reading from the device */
port
->
read_urb
->
dev
=
port
->
serial
->
dev
;
retval
=
usb_submit_urb
(
port
->
read_urb
,
GFP_KERNEL
);
init_waitqueue_head
(
&
info
->
wait_command
);
command_port
->
private
=
info
;
command_port
->
write_urb
->
complete
=
command_port_write_callback
;
command_port
->
read_urb
->
complete
=
command_port_read_callback
;
command_port
->
read_urb
->
dev
=
port
->
serial
->
dev
;
command_port
->
tty
=
port
->
tty
;
/* need this to "fake" our our sanity check macros */
retval
=
usb_submit_urb
(
command_port
->
read_urb
,
GFP_KERNEL
);
if
(
retval
)
{
err
(
__FUNCTION__
" - failed submitting read urb, error %d"
,
retval
);
goto
e
rror_e
xit
;
goto
exit
;
}
}
/* send an open port command */
/* firmware uses 1 based port numbering */
open_command
.
port
=
port
->
number
-
port
->
serial
->
minor
+
1
;
retval
=
whiteheat_send_cmd
(
port
->
serial
,
WHITEHEAT_OPEN
,
(
__u8
*
)
&
open_command
,
sizeof
(
open_command
));
if
(
retval
)
goto
error_exit
;
/* Need to do device specific setup here (control lines, baud rate, etc.) */
/* FIXME!!! */
/* Start reading from the device */
port
->
read_urb
->
dev
=
port
->
serial
->
dev
;
retval
=
usb_submit_urb
(
port
->
read_urb
,
GFP_KERNEL
);
if
(
retval
)
{
err
(
__FUNCTION__
" - failed submitting read urb, error %d"
,
retval
);
goto
exit
;
}
dbg
(
__FUNCTION__
" - exit"
);
return
retval
;
/* send an open port command */
/* firmware uses 1 based port numbering */
open_command
.
port
=
port
->
number
-
port
->
serial
->
minor
+
1
;
retval
=
whiteheat_send_cmd
(
port
->
serial
,
WHITEHEAT_OPEN
,
(
__u8
*
)
&
open_command
,
sizeof
(
open_command
));
if
(
retval
)
goto
exit
;
error_exit:
--
port
->
open_count
;
/* Need to do device specific setup here (control lines, baud rate, etc.) */
/* FIXME!!! */
dbg
(
__FUNCTION__
" - error_exit"
);
exit:
dbg
(
__FUNCTION__
" - exit, retval = %d"
,
retval
);
return
retval
;
}
...
...
@@ -368,22 +359,17 @@ static void whiteheat_close(struct usb_serial_port *port, struct file * filp)
dbg
(
__FUNCTION__
" - port %d"
,
port
->
number
);
--
port
->
open_count
;
/* send a close command to the port */
/* firmware uses 1 based port numbering */
close_command
.
port
=
port
->
number
-
port
->
serial
->
minor
+
1
;
whiteheat_send_cmd
(
port
->
serial
,
WHITEHEAT_CLOSE
,
(
__u8
*
)
&
close_command
,
sizeof
(
close_command
));
if
(
port
->
open_count
<=
0
)
{
/* send a close command to the port */
/* firmware uses 1 based port numbering */
close_command
.
port
=
port
->
number
-
port
->
serial
->
minor
+
1
;
whiteheat_send_cmd
(
port
->
serial
,
WHITEHEAT_CLOSE
,
(
__u8
*
)
&
close_command
,
sizeof
(
close_command
));
/* Need to change the control lines here */
/* FIXME */
/* Need to change the control lines here */
/* FIXME */
/* shutdown our bulk reads and writes */
usb_unlink_urb
(
port
->
write_urb
);
usb_unlink_urb
(
port
->
read_urb
);
port
->
open_count
=
0
;
}
/* shutdown our bulk reads and writes */
usb_unlink_urb
(
port
->
write_urb
);
usb_unlink_urb
(
port
->
read_urb
);
}
...
...
@@ -641,18 +627,10 @@ static int whiteheat_real_startup (struct usb_serial *serial)
static
void
whiteheat_real_shutdown
(
struct
usb_serial
*
serial
)
{
struct
usb_serial_port
*
command_port
;
int
i
;
struct
usb_serial_port
*
command_port
;
dbg
(
__FUNCTION__
);
/* stop reads and writes on all ports */
for
(
i
=
0
;
i
<
serial
->
num_ports
;
++
i
)
{
while
(
serial
->
port
[
i
].
open_count
>
0
)
{
whiteheat_close
(
&
serial
->
port
[
i
],
NULL
);
}
}
/* free up our private data for our command port */
command_port
=
&
serial
->
port
[
COMMAND_PORT
];
if
(
command_port
->
private
!=
NULL
)
{
...
...
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