diff options
Diffstat (limited to 'drivers/usb/serial/io_ti.c')
-rw-r--r-- | drivers/usb/serial/io_ti.c | 109 |
1 files changed, 58 insertions, 51 deletions
diff --git a/drivers/usb/serial/io_ti.c b/drivers/usb/serial/io_ti.c index a58822a14a87..7cf383a2a556 100644 --- a/drivers/usb/serial/io_ti.c +++ b/drivers/usb/serial/io_ti.c | |||
@@ -243,9 +243,9 @@ static void edge_tty_recv(struct device *dev, struct tty_struct *tty, | |||
243 | static void stop_read(struct edgeport_port *edge_port); | 243 | static void stop_read(struct edgeport_port *edge_port); |
244 | static int restart_read(struct edgeport_port *edge_port); | 244 | static int restart_read(struct edgeport_port *edge_port); |
245 | 245 | ||
246 | static void edge_set_termios(struct usb_serial_port *port, | 246 | static void edge_set_termios(struct tty_struct *tty, |
247 | struct ktermios *old_termios); | 247 | struct usb_serial_port *port, struct ktermios *old_termios); |
248 | static void edge_send(struct usb_serial_port *port); | 248 | static void edge_send(struct tty_struct *tty); |
249 | 249 | ||
250 | /* sysfs attributes */ | 250 | /* sysfs attributes */ |
251 | static int edge_create_sysfs_attrs(struct usb_serial_port *port); | 251 | static int edge_create_sysfs_attrs(struct usb_serial_port *port); |
@@ -572,7 +572,7 @@ static void chase_port(struct edgeport_port *port, unsigned long timeout, | |||
572 | int flush) | 572 | int flush) |
573 | { | 573 | { |
574 | int baud_rate; | 574 | int baud_rate; |
575 | struct tty_struct *tty = port->port->tty; | 575 | struct tty_struct *tty = port->port->port.tty; |
576 | wait_queue_t wait; | 576 | wait_queue_t wait; |
577 | unsigned long flags; | 577 | unsigned long flags; |
578 | 578 | ||
@@ -1554,7 +1554,7 @@ static void handle_new_msr(struct edgeport_port *edge_port, __u8 msr) | |||
1554 | /* Save the new modem status */ | 1554 | /* Save the new modem status */ |
1555 | edge_port->shadow_msr = msr & 0xf0; | 1555 | edge_port->shadow_msr = msr & 0xf0; |
1556 | 1556 | ||
1557 | tty = edge_port->port->tty; | 1557 | tty = edge_port->port->port.tty; |
1558 | /* handle CTS flow control */ | 1558 | /* handle CTS flow control */ |
1559 | if (tty && C_CRTSCTS(tty)) { | 1559 | if (tty && C_CRTSCTS(tty)) { |
1560 | if (msr & EDGEPORT_MSR_CTS) { | 1560 | if (msr & EDGEPORT_MSR_CTS) { |
@@ -1587,9 +1587,8 @@ static void handle_new_lsr(struct edgeport_port *edge_port, int lsr_data, | |||
1587 | new_lsr &= (__u8)(LSR_OVER_ERR | LSR_BREAK); | 1587 | new_lsr &= (__u8)(LSR_OVER_ERR | LSR_BREAK); |
1588 | 1588 | ||
1589 | /* Place LSR data byte into Rx buffer */ | 1589 | /* Place LSR data byte into Rx buffer */ |
1590 | if (lsr_data && edge_port->port->tty) | 1590 | if (lsr_data && edge_port->port->port.tty) |
1591 | edge_tty_recv(&edge_port->port->dev, edge_port->port->tty, | 1591 | edge_tty_recv(&edge_port->port->dev, edge_port->port->port.tty, &data, 1); |
1592 | &data, 1); | ||
1593 | 1592 | ||
1594 | /* update input line counters */ | 1593 | /* update input line counters */ |
1595 | icount = &edge_port->icount; | 1594 | icount = &edge_port->icount; |
@@ -1750,7 +1749,7 @@ static void edge_bulk_in_callback(struct urb *urb) | |||
1750 | ++data; | 1749 | ++data; |
1751 | } | 1750 | } |
1752 | 1751 | ||
1753 | tty = edge_port->port->tty; | 1752 | tty = edge_port->port->port.tty; |
1754 | if (tty && urb->actual_length) { | 1753 | if (tty && urb->actual_length) { |
1755 | usb_serial_debug_data(debug, &edge_port->port->dev, | 1754 | usb_serial_debug_data(debug, &edge_port->port->dev, |
1756 | __func__, urb->actual_length, data); | 1755 | __func__, urb->actual_length, data); |
@@ -1819,10 +1818,11 @@ static void edge_bulk_out_callback(struct urb *urb) | |||
1819 | } | 1818 | } |
1820 | 1819 | ||
1821 | /* send any buffered data */ | 1820 | /* send any buffered data */ |
1822 | edge_send(port); | 1821 | edge_send(port->port.tty); |
1823 | } | 1822 | } |
1824 | 1823 | ||
1825 | static int edge_open(struct usb_serial_port *port, struct file *filp) | 1824 | static int edge_open(struct tty_struct *tty, |
1825 | struct usb_serial_port *port, struct file *filp) | ||
1826 | { | 1826 | { |
1827 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); | 1827 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); |
1828 | struct edgeport_serial *edge_serial; | 1828 | struct edgeport_serial *edge_serial; |
@@ -1838,7 +1838,8 @@ static int edge_open(struct usb_serial_port *port, struct file *filp) | |||
1838 | if (edge_port == NULL) | 1838 | if (edge_port == NULL) |
1839 | return -ENODEV; | 1839 | return -ENODEV; |
1840 | 1840 | ||
1841 | port->tty->low_latency = low_latency; | 1841 | if (tty) |
1842 | tty->low_latency = low_latency; | ||
1842 | 1843 | ||
1843 | port_number = port->number - port->serial->minor; | 1844 | port_number = port->number - port->serial->minor; |
1844 | switch (port_number) { | 1845 | switch (port_number) { |
@@ -1874,7 +1875,8 @@ static int edge_open(struct usb_serial_port *port, struct file *filp) | |||
1874 | } | 1875 | } |
1875 | 1876 | ||
1876 | /* set up the port settings */ | 1877 | /* set up the port settings */ |
1877 | edge_set_termios(port, port->tty->termios); | 1878 | if (tty) |
1879 | edge_set_termios(tty, port, port->port.tty->termios); | ||
1878 | 1880 | ||
1879 | /* open up the port */ | 1881 | /* open up the port */ |
1880 | 1882 | ||
@@ -2000,7 +2002,8 @@ release_es_lock: | |||
2000 | return status; | 2002 | return status; |
2001 | } | 2003 | } |
2002 | 2004 | ||
2003 | static void edge_close(struct usb_serial_port *port, struct file *filp) | 2005 | static void edge_close(struct tty_struct *tty, |
2006 | struct usb_serial_port *port, struct file *filp) | ||
2004 | { | 2007 | { |
2005 | struct edgeport_serial *edge_serial; | 2008 | struct edgeport_serial *edge_serial; |
2006 | struct edgeport_port *edge_port; | 2009 | struct edgeport_port *edge_port; |
@@ -2048,8 +2051,8 @@ static void edge_close(struct usb_serial_port *port, struct file *filp) | |||
2048 | dbg("%s - exited", __func__); | 2051 | dbg("%s - exited", __func__); |
2049 | } | 2052 | } |
2050 | 2053 | ||
2051 | static int edge_write(struct usb_serial_port *port, const unsigned char *data, | 2054 | static int edge_write(struct tty_struct *tty, struct usb_serial_port *port, |
2052 | int count) | 2055 | const unsigned char *data, int count) |
2053 | { | 2056 | { |
2054 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); | 2057 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); |
2055 | unsigned long flags; | 2058 | unsigned long flags; |
@@ -2070,16 +2073,16 @@ static int edge_write(struct usb_serial_port *port, const unsigned char *data, | |||
2070 | count = edge_buf_put(edge_port->ep_out_buf, data, count); | 2073 | count = edge_buf_put(edge_port->ep_out_buf, data, count); |
2071 | spin_unlock_irqrestore(&edge_port->ep_lock, flags); | 2074 | spin_unlock_irqrestore(&edge_port->ep_lock, flags); |
2072 | 2075 | ||
2073 | edge_send(port); | 2076 | edge_send(tty); |
2074 | 2077 | ||
2075 | return count; | 2078 | return count; |
2076 | } | 2079 | } |
2077 | 2080 | ||
2078 | static void edge_send(struct usb_serial_port *port) | 2081 | static void edge_send(struct tty_struct *tty) |
2079 | { | 2082 | { |
2083 | struct usb_serial_port *port = tty->driver_data; | ||
2080 | int count, result; | 2084 | int count, result; |
2081 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); | 2085 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); |
2082 | struct tty_struct *tty = port->tty; | ||
2083 | unsigned long flags; | 2086 | unsigned long flags; |
2084 | 2087 | ||
2085 | 2088 | ||
@@ -2133,8 +2136,9 @@ static void edge_send(struct usb_serial_port *port) | |||
2133 | tty_wakeup(tty); | 2136 | tty_wakeup(tty); |
2134 | } | 2137 | } |
2135 | 2138 | ||
2136 | static int edge_write_room(struct usb_serial_port *port) | 2139 | static int edge_write_room(struct tty_struct *tty) |
2137 | { | 2140 | { |
2141 | struct usb_serial_port *port = tty->driver_data; | ||
2138 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); | 2142 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); |
2139 | int room = 0; | 2143 | int room = 0; |
2140 | unsigned long flags; | 2144 | unsigned long flags; |
@@ -2154,8 +2158,9 @@ static int edge_write_room(struct usb_serial_port *port) | |||
2154 | return room; | 2158 | return room; |
2155 | } | 2159 | } |
2156 | 2160 | ||
2157 | static int edge_chars_in_buffer(struct usb_serial_port *port) | 2161 | static int edge_chars_in_buffer(struct tty_struct *tty) |
2158 | { | 2162 | { |
2163 | struct usb_serial_port *port = tty->driver_data; | ||
2159 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); | 2164 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); |
2160 | int chars = 0; | 2165 | int chars = 0; |
2161 | unsigned long flags; | 2166 | unsigned long flags; |
@@ -2175,10 +2180,10 @@ static int edge_chars_in_buffer(struct usb_serial_port *port) | |||
2175 | return chars; | 2180 | return chars; |
2176 | } | 2181 | } |
2177 | 2182 | ||
2178 | static void edge_throttle(struct usb_serial_port *port) | 2183 | static void edge_throttle(struct tty_struct *tty) |
2179 | { | 2184 | { |
2185 | struct usb_serial_port *port = tty->driver_data; | ||
2180 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); | 2186 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); |
2181 | struct tty_struct *tty = port->tty; | ||
2182 | int status; | 2187 | int status; |
2183 | 2188 | ||
2184 | dbg("%s - port %d", __func__, port->number); | 2189 | dbg("%s - port %d", __func__, port->number); |
@@ -2189,11 +2194,10 @@ static void edge_throttle(struct usb_serial_port *port) | |||
2189 | /* if we are implementing XON/XOFF, send the stop character */ | 2194 | /* if we are implementing XON/XOFF, send the stop character */ |
2190 | if (I_IXOFF(tty)) { | 2195 | if (I_IXOFF(tty)) { |
2191 | unsigned char stop_char = STOP_CHAR(tty); | 2196 | unsigned char stop_char = STOP_CHAR(tty); |
2192 | status = edge_write(port, &stop_char, 1); | 2197 | status = edge_write(tty, port, &stop_char, 1); |
2193 | if (status <= 0) | 2198 | if (status <= 0) { |
2194 | dev_err(&port->dev, | 2199 | dev_err(&port->dev, "%s - failed to write stop character, %d\n", __func__, status); |
2195 | "%s - failed to write stop character, %d\n", | 2200 | } |
2196 | __func__, status); | ||
2197 | } | 2201 | } |
2198 | 2202 | ||
2199 | /* if we are implementing RTS/CTS, stop reads */ | 2203 | /* if we are implementing RTS/CTS, stop reads */ |
@@ -2203,10 +2207,10 @@ static void edge_throttle(struct usb_serial_port *port) | |||
2203 | 2207 | ||
2204 | } | 2208 | } |
2205 | 2209 | ||
2206 | static void edge_unthrottle(struct usb_serial_port *port) | 2210 | static void edge_unthrottle(struct tty_struct *tty) |
2207 | { | 2211 | { |
2212 | struct usb_serial_port *port = tty->driver_data; | ||
2208 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); | 2213 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); |
2209 | struct tty_struct *tty = port->tty; | ||
2210 | int status; | 2214 | int status; |
2211 | 2215 | ||
2212 | dbg("%s - port %d", __func__, port->number); | 2216 | dbg("%s - port %d", __func__, port->number); |
@@ -2217,11 +2221,10 @@ static void edge_unthrottle(struct usb_serial_port *port) | |||
2217 | /* if we are implementing XON/XOFF, send the start character */ | 2221 | /* if we are implementing XON/XOFF, send the start character */ |
2218 | if (I_IXOFF(tty)) { | 2222 | if (I_IXOFF(tty)) { |
2219 | unsigned char start_char = START_CHAR(tty); | 2223 | unsigned char start_char = START_CHAR(tty); |
2220 | status = edge_write(port, &start_char, 1); | 2224 | status = edge_write(tty, port, &start_char, 1); |
2221 | if (status <= 0) | 2225 | if (status <= 0) { |
2222 | dev_err(&port->dev, | 2226 | dev_err(&port->dev, "%s - failed to write start character, %d\n", __func__, status); |
2223 | "%s - failed to write start character, %d\n", | 2227 | } |
2224 | __func__, status); | ||
2225 | } | 2228 | } |
2226 | /* if we are implementing RTS/CTS, restart reads */ | 2229 | /* if we are implementing RTS/CTS, restart reads */ |
2227 | /* are the Edgeport will assert the RTS line */ | 2230 | /* are the Edgeport will assert the RTS line */ |
@@ -2271,11 +2274,10 @@ static int restart_read(struct edgeport_port *edge_port) | |||
2271 | return status; | 2274 | return status; |
2272 | } | 2275 | } |
2273 | 2276 | ||
2274 | static void change_port_settings(struct edgeport_port *edge_port, | 2277 | static void change_port_settings(struct tty_struct *tty, |
2275 | struct ktermios *old_termios) | 2278 | struct edgeport_port *edge_port, struct ktermios *old_termios) |
2276 | { | 2279 | { |
2277 | struct ump_uart_config *config; | 2280 | struct ump_uart_config *config; |
2278 | struct tty_struct *tty; | ||
2279 | int baud; | 2281 | int baud; |
2280 | unsigned cflag; | 2282 | unsigned cflag; |
2281 | int status; | 2283 | int status; |
@@ -2284,9 +2286,7 @@ static void change_port_settings(struct edgeport_port *edge_port, | |||
2284 | 2286 | ||
2285 | dbg("%s - port %d", __func__, edge_port->port->number); | 2287 | dbg("%s - port %d", __func__, edge_port->port->number); |
2286 | 2288 | ||
2287 | tty = edge_port->port->tty; | 2289 | config = kmalloc (sizeof (*config), GFP_KERNEL); |
2288 | |||
2289 | config = kmalloc(sizeof(*config), GFP_KERNEL); | ||
2290 | if (!config) { | 2290 | if (!config) { |
2291 | *tty->termios = *old_termios; | 2291 | *tty->termios = *old_termios; |
2292 | dev_err(&edge_port->port->dev, "%s - out of memory\n", | 2292 | dev_err(&edge_port->port->dev, "%s - out of memory\n", |
@@ -2419,11 +2419,13 @@ static void change_port_settings(struct edgeport_port *edge_port, | |||
2419 | return; | 2419 | return; |
2420 | } | 2420 | } |
2421 | 2421 | ||
2422 | static void edge_set_termios(struct usb_serial_port *port, | 2422 | static void edge_set_termios(struct tty_struct *tty, |
2423 | struct ktermios *old_termios) | 2423 | struct usb_serial_port *port, struct ktermios *old_termios) |
2424 | { | 2424 | { |
2425 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); | 2425 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); |
2426 | struct tty_struct *tty = port->tty; | 2426 | unsigned int cflag; |
2427 | |||
2428 | cflag = tty->termios->c_cflag; | ||
2427 | 2429 | ||
2428 | dbg("%s - clfag %08x iflag %08x", __func__, | 2430 | dbg("%s - clfag %08x iflag %08x", __func__, |
2429 | tty->termios->c_cflag, tty->termios->c_iflag); | 2431 | tty->termios->c_cflag, tty->termios->c_iflag); |
@@ -2434,12 +2436,14 @@ static void edge_set_termios(struct usb_serial_port *port, | |||
2434 | if (edge_port == NULL) | 2436 | if (edge_port == NULL) |
2435 | return; | 2437 | return; |
2436 | /* change the port settings to the new ones specified */ | 2438 | /* change the port settings to the new ones specified */ |
2437 | change_port_settings(edge_port, old_termios); | 2439 | change_port_settings(tty, edge_port, old_termios); |
2440 | return; | ||
2438 | } | 2441 | } |
2439 | 2442 | ||
2440 | static int edge_tiocmset(struct usb_serial_port *port, struct file *file, | 2443 | static int edge_tiocmset(struct tty_struct *tty, struct file *file, |
2441 | unsigned int set, unsigned int clear) | 2444 | unsigned int set, unsigned int clear) |
2442 | { | 2445 | { |
2446 | struct usb_serial_port *port = tty->driver_data; | ||
2443 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); | 2447 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); |
2444 | unsigned int mcr; | 2448 | unsigned int mcr; |
2445 | unsigned long flags; | 2449 | unsigned long flags; |
@@ -2469,8 +2473,9 @@ static int edge_tiocmset(struct usb_serial_port *port, struct file *file, | |||
2469 | return 0; | 2473 | return 0; |
2470 | } | 2474 | } |
2471 | 2475 | ||
2472 | static int edge_tiocmget(struct usb_serial_port *port, struct file *file) | 2476 | static int edge_tiocmget(struct tty_struct *tty, struct file *file) |
2473 | { | 2477 | { |
2478 | struct usb_serial_port *port = tty->driver_data; | ||
2474 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); | 2479 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); |
2475 | unsigned int result = 0; | 2480 | unsigned int result = 0; |
2476 | unsigned int msr; | 2481 | unsigned int msr; |
@@ -2522,9 +2527,10 @@ static int get_serial_info(struct edgeport_port *edge_port, | |||
2522 | return 0; | 2527 | return 0; |
2523 | } | 2528 | } |
2524 | 2529 | ||
2525 | static int edge_ioctl(struct usb_serial_port *port, struct file *file, | 2530 | static int edge_ioctl(struct tty_struct *tty, struct file *file, |
2526 | unsigned int cmd, unsigned long arg) | 2531 | unsigned int cmd, unsigned long arg) |
2527 | { | 2532 | { |
2533 | struct usb_serial_port *port = tty->driver_data; | ||
2528 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); | 2534 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); |
2529 | struct async_icount cnow; | 2535 | struct async_icount cnow; |
2530 | struct async_icount cprev; | 2536 | struct async_icount cprev; |
@@ -2569,18 +2575,19 @@ static int edge_ioctl(struct usb_serial_port *port, struct file *file, | |||
2569 | return -ENOIOCTLCMD; | 2575 | return -ENOIOCTLCMD; |
2570 | } | 2576 | } |
2571 | 2577 | ||
2572 | static void edge_break(struct usb_serial_port *port, int on) | 2578 | static void edge_break(struct tty_struct *tty, int break_state) |
2573 | { | 2579 | { |
2580 | struct usb_serial_port *port = tty->driver_data; | ||
2574 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); | 2581 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); |
2575 | int status; | 2582 | int status; |
2576 | int bv = 0; /* Off */ | 2583 | int bv = 0; /* Off */ |
2577 | 2584 | ||
2578 | dbg("%s - state = %d", __func__, on); | 2585 | dbg("%s - state = %d", __func__, break_state); |
2579 | 2586 | ||
2580 | /* chase the port close */ | 2587 | /* chase the port close */ |
2581 | chase_port(edge_port, 0, 0); | 2588 | chase_port(edge_port, 0, 0); |
2582 | 2589 | ||
2583 | if (on == -1) | 2590 | if (break_state == -1) |
2584 | bv = 1; /* On */ | 2591 | bv = 1; /* On */ |
2585 | status = ti_do_config(edge_port, UMPC_SET_CLR_BREAK, bv); | 2592 | status = ti_do_config(edge_port, UMPC_SET_CLR_BREAK, bv); |
2586 | if (status) | 2593 | if (status) |