.. | .. |
---|
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, |
---|