| .. | .. |
|---|
| 538 | 538 | |
|---|
| 539 | 539 | static u32 f81534_calc_baud_divisor(u32 baudrate, u32 clockrate) |
|---|
| 540 | 540 | { |
|---|
| 541 | | - if (!baudrate) |
|---|
| 542 | | - return 0; |
|---|
| 543 | | - |
|---|
| 544 | 541 | /* Round to nearest divisor */ |
|---|
| 545 | 542 | return DIV_ROUND_CLOSEST(clockrate, baudrate); |
|---|
| 546 | 543 | } |
|---|
| .. | .. |
|---|
| 570 | 567 | u32 baud_list[] = {baudrate, old_baudrate, F81534_DEFAULT_BAUD_RATE}; |
|---|
| 571 | 568 | |
|---|
| 572 | 569 | for (i = 0; i < ARRAY_SIZE(baud_list); ++i) { |
|---|
| 573 | | - idx = f81534_find_clk(baud_list[i]); |
|---|
| 570 | + baudrate = baud_list[i]; |
|---|
| 571 | + if (baudrate == 0) { |
|---|
| 572 | + tty_encode_baud_rate(tty, 0, 0); |
|---|
| 573 | + return 0; |
|---|
| 574 | + } |
|---|
| 575 | + |
|---|
| 576 | + idx = f81534_find_clk(baudrate); |
|---|
| 574 | 577 | if (idx >= 0) { |
|---|
| 575 | | - baudrate = baud_list[i]; |
|---|
| 576 | 578 | tty_encode_baud_rate(tty, baudrate, baudrate); |
|---|
| 577 | 579 | break; |
|---|
| 578 | 580 | } |
|---|
| .. | .. |
|---|
| 1142 | 1144 | mutex_unlock(&serial_priv->urb_mutex); |
|---|
| 1143 | 1145 | } |
|---|
| 1144 | 1146 | |
|---|
| 1145 | | -static int f81534_get_serial_info(struct usb_serial_port *port, |
|---|
| 1146 | | - struct serial_struct __user *retinfo) |
|---|
| 1147 | +static int f81534_get_serial_info(struct tty_struct *tty, |
|---|
| 1148 | + struct serial_struct *ss) |
|---|
| 1147 | 1149 | { |
|---|
| 1150 | + struct usb_serial_port *port = tty->driver_data; |
|---|
| 1148 | 1151 | struct f81534_port_private *port_priv; |
|---|
| 1149 | | - struct serial_struct tmp; |
|---|
| 1150 | 1152 | |
|---|
| 1151 | 1153 | port_priv = usb_get_serial_port_data(port); |
|---|
| 1152 | 1154 | |
|---|
| 1153 | | - memset(&tmp, 0, sizeof(tmp)); |
|---|
| 1154 | | - |
|---|
| 1155 | | - tmp.type = PORT_16550A; |
|---|
| 1156 | | - tmp.port = port->port_number; |
|---|
| 1157 | | - tmp.line = port->minor; |
|---|
| 1158 | | - tmp.baud_base = port_priv->baud_base; |
|---|
| 1159 | | - |
|---|
| 1160 | | - if (copy_to_user(retinfo, &tmp, sizeof(*retinfo))) |
|---|
| 1161 | | - return -EFAULT; |
|---|
| 1162 | | - |
|---|
| 1155 | + ss->type = PORT_16550A; |
|---|
| 1156 | + ss->port = port->port_number; |
|---|
| 1157 | + ss->line = port->minor; |
|---|
| 1158 | + ss->baud_base = port_priv->baud_base; |
|---|
| 1163 | 1159 | return 0; |
|---|
| 1164 | | -} |
|---|
| 1165 | | - |
|---|
| 1166 | | -static int f81534_ioctl(struct tty_struct *tty, unsigned int cmd, |
|---|
| 1167 | | - unsigned long arg) |
|---|
| 1168 | | -{ |
|---|
| 1169 | | - struct usb_serial_port *port = tty->driver_data; |
|---|
| 1170 | | - struct serial_struct __user *buf = (struct serial_struct __user *)arg; |
|---|
| 1171 | | - |
|---|
| 1172 | | - switch (cmd) { |
|---|
| 1173 | | - case TIOCGSERIAL: |
|---|
| 1174 | | - return f81534_get_serial_info(port, buf); |
|---|
| 1175 | | - default: |
|---|
| 1176 | | - break; |
|---|
| 1177 | | - } |
|---|
| 1178 | | - |
|---|
| 1179 | | - return -ENOIOCTLCMD; |
|---|
| 1180 | 1160 | } |
|---|
| 1181 | 1161 | |
|---|
| 1182 | 1162 | static void f81534_process_per_serial_block(struct usb_serial_port *port, |
|---|
| .. | .. |
|---|
| 1260 | 1240 | schedule_work(&port_priv->lsr_work); |
|---|
| 1261 | 1241 | } |
|---|
| 1262 | 1242 | |
|---|
| 1263 | | - if (port->port.console && port->sysrq) { |
|---|
| 1243 | + if (port->sysrq) { |
|---|
| 1264 | 1244 | if (usb_serial_handle_sysrq_char(port, data[i])) |
|---|
| 1265 | 1245 | continue; |
|---|
| 1266 | 1246 | } |
|---|
| .. | .. |
|---|
| 1595 | 1575 | .break_ctl = f81534_break_ctl, |
|---|
| 1596 | 1576 | .dtr_rts = f81534_dtr_rts, |
|---|
| 1597 | 1577 | .process_read_urb = f81534_process_read_urb, |
|---|
| 1598 | | - .ioctl = f81534_ioctl, |
|---|
| 1578 | + .get_serial = f81534_get_serial_info, |
|---|
| 1599 | 1579 | .tiocmget = f81534_tiocmget, |
|---|
| 1600 | 1580 | .tiocmset = f81534_tiocmset, |
|---|
| 1601 | 1581 | .write_bulk_callback = f81534_write_usb_callback, |
|---|