blob: 285527f115dd72a45ba6e723d68a146c4d0a1626 [file] [log] [blame]
rjw1f884582022-01-06 17:20:42 +08001/*
2 * This program is free software; you can redistribute it and/or modify
3 * it under the terms of the GNU General Public License as published by
4 * the Free Software Foundation; either version 2 of the License, or
5 * (at your option) any later version.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 *
12 * You should have received a copy of the GNU General Public License
13 * along with this program; if not, write to the Free Software
14 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
15 *
16 * Clean ups from Moschip version and a few ioctl implementations by:
17 * Paul B Schroeder <pschroeder "at" uplogix "dot" com>
18 *
19 * Originally based on drivers/usb/serial/io_edgeport.c which is:
20 * Copyright (C) 2000 Inside Out Networks, All rights reserved.
21 * Copyright (C) 2001-2002 Greg Kroah-Hartman <greg@kroah.com>
22 *
23 */
24
25#include <linux/kernel.h>
26#include <linux/errno.h>
27#include <linux/slab.h>
28#include <linux/tty.h>
29#include <linux/tty_driver.h>
30#include <linux/tty_flip.h>
31#include <linux/module.h>
32#include <linux/serial.h>
33#include <linux/usb.h>
34#include <linux/usb/serial.h>
35#include <linux/uaccess.h>
36
37#define DRIVER_DESC "Moschip 7840/7820 USB Serial Driver"
38
39/*
40 * 16C50 UART register defines
41 */
42
43#define LCR_BITS_5 0x00 /* 5 bits/char */
44#define LCR_BITS_6 0x01 /* 6 bits/char */
45#define LCR_BITS_7 0x02 /* 7 bits/char */
46#define LCR_BITS_8 0x03 /* 8 bits/char */
47#define LCR_BITS_MASK 0x03 /* Mask for bits/char field */
48
49#define LCR_STOP_1 0x00 /* 1 stop bit */
50#define LCR_STOP_1_5 0x04 /* 1.5 stop bits (if 5 bits/char) */
51#define LCR_STOP_2 0x04 /* 2 stop bits (if 6-8 bits/char) */
52#define LCR_STOP_MASK 0x04 /* Mask for stop bits field */
53
54#define LCR_PAR_NONE 0x00 /* No parity */
55#define LCR_PAR_ODD 0x08 /* Odd parity */
56#define LCR_PAR_EVEN 0x18 /* Even parity */
57#define LCR_PAR_MARK 0x28 /* Force parity bit to 1 */
58#define LCR_PAR_SPACE 0x38 /* Force parity bit to 0 */
59#define LCR_PAR_MASK 0x38 /* Mask for parity field */
60
61#define LCR_SET_BREAK 0x40 /* Set Break condition */
62#define LCR_DL_ENABLE 0x80 /* Enable access to divisor latch */
63
64#define MCR_DTR 0x01 /* Assert DTR */
65#define MCR_RTS 0x02 /* Assert RTS */
66#define MCR_OUT1 0x04 /* Loopback only: Sets state of RI */
67#define MCR_MASTER_IE 0x08 /* Enable interrupt outputs */
68#define MCR_LOOPBACK 0x10 /* Set internal (digital) loopback mode */
69#define MCR_XON_ANY 0x20 /* Enable any char to exit XOFF mode */
70
71#define MOS7840_MSR_CTS 0x10 /* Current state of CTS */
72#define MOS7840_MSR_DSR 0x20 /* Current state of DSR */
73#define MOS7840_MSR_RI 0x40 /* Current state of RI */
74#define MOS7840_MSR_CD 0x80 /* Current state of CD */
75
76/*
77 * Defines used for sending commands to port
78 */
79
80#define MOS_WDR_TIMEOUT 5000 /* default urb timeout */
81
82#define MOS_PORT1 0x0200
83#define MOS_PORT2 0x0300
84#define MOS_VENREG 0x0000
85#define MOS_MAX_PORT 0x02
86#define MOS_WRITE 0x0E
87#define MOS_READ 0x0D
88
89/* Requests */
90#define MCS_RD_RTYPE 0xC0
91#define MCS_WR_RTYPE 0x40
92#define MCS_RDREQ 0x0D
93#define MCS_WRREQ 0x0E
94#define MCS_CTRL_TIMEOUT 500
95#define VENDOR_READ_LENGTH (0x01)
96
97#define MAX_NAME_LEN 64
98
99#define ZLP_REG1 0x3A /* Zero_Flag_Reg1 58 */
100#define ZLP_REG5 0x3E /* Zero_Flag_Reg5 62 */
101
102/* For higher baud Rates use TIOCEXBAUD */
103#define TIOCEXBAUD 0x5462
104
105/* vendor id and device id defines */
106
107/* The native mos7840/7820 component */
108#define USB_VENDOR_ID_MOSCHIP 0x9710
109#define MOSCHIP_DEVICE_ID_7840 0x7840
110#define MOSCHIP_DEVICE_ID_7820 0x7820
111#define MOSCHIP_DEVICE_ID_7810 0x7810
112/* The native component can have its vendor/device id's overridden
113 * in vendor-specific implementations. Such devices can be handled
114 * by making a change here, in id_table.
115 */
116#define USB_VENDOR_ID_BANDB 0x0856
117#define BANDB_DEVICE_ID_USO9ML2_2 0xAC22
118#define BANDB_DEVICE_ID_USO9ML2_2P 0xBC00
119#define BANDB_DEVICE_ID_USO9ML2_4 0xAC24
120#define BANDB_DEVICE_ID_USO9ML2_4P 0xBC01
121#define BANDB_DEVICE_ID_US9ML2_2 0xAC29
122#define BANDB_DEVICE_ID_US9ML2_4 0xAC30
123#define BANDB_DEVICE_ID_USPTL4_2 0xAC31
124#define BANDB_DEVICE_ID_USPTL4_4 0xAC32
125#define BANDB_DEVICE_ID_USOPTL4_2 0xAC42
126#define BANDB_DEVICE_ID_USOPTL4_2P 0xBC02
127#define BANDB_DEVICE_ID_USOPTL4_4 0xAC44
128#define BANDB_DEVICE_ID_USOPTL4_4P 0xBC03
129#define BANDB_DEVICE_ID_USOPTL2_4 0xAC24
130
131/* This driver also supports
132 * ATEN UC2324 device using Moschip MCS7840
133 * ATEN UC2322 device using Moschip MCS7820
134 * MOXA UPort 2210 device using Moschip MCS7820
135 */
136#define USB_VENDOR_ID_ATENINTL 0x0557
137#define ATENINTL_DEVICE_ID_UC2324 0x2011
138#define ATENINTL_DEVICE_ID_UC2322 0x7820
139
140#define USB_VENDOR_ID_MOXA 0x110a
141#define MOXA_DEVICE_ID_2210 0x2210
142
143/* Interrupt Routine Defines */
144
145#define SERIAL_IIR_RLS 0x06
146#define SERIAL_IIR_MS 0x00
147
148/*
149 * Emulation of the bit mask on the LINE STATUS REGISTER.
150 */
151#define SERIAL_LSR_DR 0x0001
152#define SERIAL_LSR_OE 0x0002
153#define SERIAL_LSR_PE 0x0004
154#define SERIAL_LSR_FE 0x0008
155#define SERIAL_LSR_BI 0x0010
156
157#define MOS_MSR_DELTA_CTS 0x10
158#define MOS_MSR_DELTA_DSR 0x20
159#define MOS_MSR_DELTA_RI 0x40
160#define MOS_MSR_DELTA_CD 0x80
161
162/* Serial Port register Address */
163#define INTERRUPT_ENABLE_REGISTER ((__u16)(0x01))
164#define FIFO_CONTROL_REGISTER ((__u16)(0x02))
165#define LINE_CONTROL_REGISTER ((__u16)(0x03))
166#define MODEM_CONTROL_REGISTER ((__u16)(0x04))
167#define LINE_STATUS_REGISTER ((__u16)(0x05))
168#define MODEM_STATUS_REGISTER ((__u16)(0x06))
169#define SCRATCH_PAD_REGISTER ((__u16)(0x07))
170#define DIVISOR_LATCH_LSB ((__u16)(0x00))
171#define DIVISOR_LATCH_MSB ((__u16)(0x01))
172
173#define CLK_MULTI_REGISTER ((__u16)(0x02))
174#define CLK_START_VALUE_REGISTER ((__u16)(0x03))
175#define GPIO_REGISTER ((__u16)(0x07))
176
177#define SERIAL_LCR_DLAB ((__u16)(0x0080))
178
179/*
180 * URB POOL related defines
181 */
182#define NUM_URBS 16 /* URB Count */
183#define URB_TRANSFER_BUFFER_SIZE 32 /* URB Size */
184
185/* LED on/off milliseconds*/
186#define LED_ON_MS 500
187#define LED_OFF_MS 500
188
189enum mos7840_flag {
190 MOS7840_FLAG_CTRL_BUSY,
191 MOS7840_FLAG_LED_BUSY,
192};
193
194static const struct usb_device_id id_table[] = {
195 {USB_DEVICE(USB_VENDOR_ID_MOSCHIP, MOSCHIP_DEVICE_ID_7840)},
196 {USB_DEVICE(USB_VENDOR_ID_MOSCHIP, MOSCHIP_DEVICE_ID_7820)},
197 {USB_DEVICE(USB_VENDOR_ID_MOSCHIP, MOSCHIP_DEVICE_ID_7810)},
198 {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USO9ML2_2)},
199 {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USO9ML2_2P)},
200 {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USO9ML2_4)},
201 {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USO9ML2_4P)},
202 {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_US9ML2_2)},
203 {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_US9ML2_4)},
204 {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USPTL4_2)},
205 {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USPTL4_4)},
206 {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_2)},
207 {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_2P)},
208 {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_4)},
209 {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_4P)},
210 {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL2_4)},
211 {USB_DEVICE(USB_VENDOR_ID_ATENINTL, ATENINTL_DEVICE_ID_UC2324)},
212 {USB_DEVICE(USB_VENDOR_ID_ATENINTL, ATENINTL_DEVICE_ID_UC2322)},
213 {USB_DEVICE(USB_VENDOR_ID_MOXA, MOXA_DEVICE_ID_2210)},
214 {} /* terminating entry */
215};
216MODULE_DEVICE_TABLE(usb, id_table);
217
218/* This structure holds all of the local port information */
219
220struct moschip_port {
221 int port_num; /*Actual port number in the device(1,2,etc) */
222 struct urb *read_urb; /* read URB for this port */
223 __u8 shadowLCR; /* last LCR value received */
224 __u8 shadowMCR; /* last MCR value received */
225 char open;
226 char open_ports;
227 struct usb_serial_port *port; /* loop back to the owner of this object */
228
229 /* Offsets */
230 __u8 SpRegOffset;
231 __u8 ControlRegOffset;
232 __u8 DcrRegOffset;
233 /* for processing control URBS in interrupt context */
234 struct urb *control_urb;
235 struct usb_ctrlrequest *dr;
236 char *ctrl_buf;
237 int MsrLsr;
238
239 spinlock_t pool_lock;
240 struct urb *write_urb_pool[NUM_URBS];
241 char busy[NUM_URBS];
242 bool read_urb_busy;
243
244 /* For device(s) with LED indicator */
245 bool has_led;
246 struct timer_list led_timer1; /* Timer for LED on */
247 struct timer_list led_timer2; /* Timer for LED off */
248 struct urb *led_urb;
249 struct usb_ctrlrequest *led_dr;
250
251 unsigned long flags;
252};
253
254/*
255 * mos7840_set_reg_sync
256 * To set the Control register by calling usb_fill_control_urb function
257 * by passing usb_sndctrlpipe function as parameter.
258 */
259
260static int mos7840_set_reg_sync(struct usb_serial_port *port, __u16 reg,
261 __u16 val)
262{
263 struct usb_device *dev = port->serial->dev;
264 val = val & 0x00ff;
265 dev_dbg(&port->dev, "mos7840_set_reg_sync offset is %x, value %x\n", reg, val);
266
267 return usb_control_msg(dev, usb_sndctrlpipe(dev, 0), MCS_WRREQ,
268 MCS_WR_RTYPE, val, reg, NULL, 0,
269 MOS_WDR_TIMEOUT);
270}
271
272/*
273 * mos7840_get_reg_sync
274 * To set the Uart register by calling usb_fill_control_urb function by
275 * passing usb_rcvctrlpipe function as parameter.
276 */
277
278static int mos7840_get_reg_sync(struct usb_serial_port *port, __u16 reg,
279 __u16 *val)
280{
281 struct usb_device *dev = port->serial->dev;
282 int ret = 0;
283 u8 *buf;
284
285 buf = kmalloc(VENDOR_READ_LENGTH, GFP_KERNEL);
286 if (!buf)
287 return -ENOMEM;
288
289 ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), MCS_RDREQ,
290 MCS_RD_RTYPE, 0, reg, buf, VENDOR_READ_LENGTH,
291 MOS_WDR_TIMEOUT);
292 if (ret < VENDOR_READ_LENGTH) {
293 if (ret >= 0)
294 ret = -EIO;
295 goto out;
296 }
297
298 *val = buf[0];
299 dev_dbg(&port->dev, "%s offset is %x, return val %x\n", __func__, reg, *val);
300out:
301 kfree(buf);
302 return ret;
303}
304
305/*
306 * mos7840_set_uart_reg
307 * To set the Uart register by calling usb_fill_control_urb function by
308 * passing usb_sndctrlpipe function as parameter.
309 */
310
311static int mos7840_set_uart_reg(struct usb_serial_port *port, __u16 reg,
312 __u16 val)
313{
314
315 struct usb_device *dev = port->serial->dev;
316 val = val & 0x00ff;
317 /* For the UART control registers, the application number need
318 to be Or'ed */
319 if (port->serial->num_ports == 4) {
320 val |= ((__u16)port->port_number + 1) << 8;
321 } else {
322 if (port->port_number == 0) {
323 val |= ((__u16)port->port_number + 1) << 8;
324 } else {
325 val |= ((__u16)port->port_number + 2) << 8;
326 }
327 }
328 dev_dbg(&port->dev, "%s application number is %x\n", __func__, val);
329 return usb_control_msg(dev, usb_sndctrlpipe(dev, 0), MCS_WRREQ,
330 MCS_WR_RTYPE, val, reg, NULL, 0,
331 MOS_WDR_TIMEOUT);
332
333}
334
335/*
336 * mos7840_get_uart_reg
337 * To set the Control register by calling usb_fill_control_urb function
338 * by passing usb_rcvctrlpipe function as parameter.
339 */
340static int mos7840_get_uart_reg(struct usb_serial_port *port, __u16 reg,
341 __u16 *val)
342{
343 struct usb_device *dev = port->serial->dev;
344 int ret = 0;
345 __u16 Wval;
346 u8 *buf;
347
348 buf = kmalloc(VENDOR_READ_LENGTH, GFP_KERNEL);
349 if (!buf)
350 return -ENOMEM;
351
352 /* Wval is same as application number */
353 if (port->serial->num_ports == 4) {
354 Wval = ((__u16)port->port_number + 1) << 8;
355 } else {
356 if (port->port_number == 0) {
357 Wval = ((__u16)port->port_number + 1) << 8;
358 } else {
359 Wval = ((__u16)port->port_number + 2) << 8;
360 }
361 }
362 dev_dbg(&port->dev, "%s application number is %x\n", __func__, Wval);
363 ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), MCS_RDREQ,
364 MCS_RD_RTYPE, Wval, reg, buf, VENDOR_READ_LENGTH,
365 MOS_WDR_TIMEOUT);
366 if (ret < VENDOR_READ_LENGTH) {
367 if (ret >= 0)
368 ret = -EIO;
369 goto out;
370 }
371 *val = buf[0];
372out:
373 kfree(buf);
374 return ret;
375}
376
377static void mos7840_dump_serial_port(struct usb_serial_port *port,
378 struct moschip_port *mos7840_port)
379{
380
381 dev_dbg(&port->dev, "SpRegOffset is %2x\n", mos7840_port->SpRegOffset);
382 dev_dbg(&port->dev, "ControlRegOffset is %2x\n", mos7840_port->ControlRegOffset);
383 dev_dbg(&port->dev, "DCRRegOffset is %2x\n", mos7840_port->DcrRegOffset);
384
385}
386
387/************************************************************************/
388/************************************************************************/
389/* I N T E R F A C E F U N C T I O N S */
390/* I N T E R F A C E F U N C T I O N S */
391/************************************************************************/
392/************************************************************************/
393
394static inline void mos7840_set_port_private(struct usb_serial_port *port,
395 struct moschip_port *data)
396{
397 usb_set_serial_port_data(port, (void *)data);
398}
399
400static inline struct moschip_port *mos7840_get_port_private(struct
401 usb_serial_port
402 *port)
403{
404 return (struct moschip_port *)usb_get_serial_port_data(port);
405}
406
407static void mos7840_handle_new_msr(struct moschip_port *port, __u8 new_msr)
408{
409 struct moschip_port *mos7840_port;
410 struct async_icount *icount;
411 mos7840_port = port;
412 if (new_msr &
413 (MOS_MSR_DELTA_CTS | MOS_MSR_DELTA_DSR | MOS_MSR_DELTA_RI |
414 MOS_MSR_DELTA_CD)) {
415 icount = &mos7840_port->port->icount;
416
417 /* update input line counters */
418 if (new_msr & MOS_MSR_DELTA_CTS)
419 icount->cts++;
420 if (new_msr & MOS_MSR_DELTA_DSR)
421 icount->dsr++;
422 if (new_msr & MOS_MSR_DELTA_CD)
423 icount->dcd++;
424 if (new_msr & MOS_MSR_DELTA_RI)
425 icount->rng++;
426
427 wake_up_interruptible(&port->port->port.delta_msr_wait);
428 }
429}
430
431static void mos7840_handle_new_lsr(struct moschip_port *port, __u8 new_lsr)
432{
433 struct async_icount *icount;
434
435 if (new_lsr & SERIAL_LSR_BI) {
436 /*
437 * Parity and Framing errors only count if they
438 * occur exclusive of a break being
439 * received.
440 */
441 new_lsr &= (__u8) (SERIAL_LSR_OE | SERIAL_LSR_BI);
442 }
443
444 /* update input line counters */
445 icount = &port->port->icount;
446 if (new_lsr & SERIAL_LSR_BI)
447 icount->brk++;
448 if (new_lsr & SERIAL_LSR_OE)
449 icount->overrun++;
450 if (new_lsr & SERIAL_LSR_PE)
451 icount->parity++;
452 if (new_lsr & SERIAL_LSR_FE)
453 icount->frame++;
454}
455
456/************************************************************************/
457/************************************************************************/
458/* U S B C A L L B A C K F U N C T I O N S */
459/* U S B C A L L B A C K F U N C T I O N S */
460/************************************************************************/
461/************************************************************************/
462
463static void mos7840_control_callback(struct urb *urb)
464{
465 unsigned char *data;
466 struct moschip_port *mos7840_port;
467 struct device *dev = &urb->dev->dev;
468 __u8 regval = 0x0;
469 int status = urb->status;
470
471 mos7840_port = urb->context;
472
473 switch (status) {
474 case 0:
475 /* success */
476 break;
477 case -ECONNRESET:
478 case -ENOENT:
479 case -ESHUTDOWN:
480 /* this urb is terminated, clean up */
481 dev_dbg(dev, "%s - urb shutting down with status: %d\n", __func__, status);
482 goto out;
483 default:
484 dev_dbg(dev, "%s - nonzero urb status received: %d\n", __func__, status);
485 goto out;
486 }
487
488 dev_dbg(dev, "%s urb buffer size is %d\n", __func__, urb->actual_length);
489 if (urb->actual_length < 1)
490 goto out;
491
492 dev_dbg(dev, "%s mos7840_port->MsrLsr is %d port %d\n", __func__,
493 mos7840_port->MsrLsr, mos7840_port->port_num);
494 data = urb->transfer_buffer;
495 regval = (__u8) data[0];
496 dev_dbg(dev, "%s data is %x\n", __func__, regval);
497 if (mos7840_port->MsrLsr == 0)
498 mos7840_handle_new_msr(mos7840_port, regval);
499 else if (mos7840_port->MsrLsr == 1)
500 mos7840_handle_new_lsr(mos7840_port, regval);
501out:
502 clear_bit_unlock(MOS7840_FLAG_CTRL_BUSY, &mos7840_port->flags);
503}
504
505static int mos7840_get_reg(struct moschip_port *mcs, __u16 Wval, __u16 reg,
506 __u16 *val)
507{
508 struct usb_device *dev = mcs->port->serial->dev;
509 struct usb_ctrlrequest *dr = mcs->dr;
510 unsigned char *buffer = mcs->ctrl_buf;
511 int ret;
512
513 if (test_and_set_bit_lock(MOS7840_FLAG_CTRL_BUSY, &mcs->flags))
514 return -EBUSY;
515
516 dr->bRequestType = MCS_RD_RTYPE;
517 dr->bRequest = MCS_RDREQ;
518 dr->wValue = cpu_to_le16(Wval); /* 0 */
519 dr->wIndex = cpu_to_le16(reg);
520 dr->wLength = cpu_to_le16(2);
521
522 usb_fill_control_urb(mcs->control_urb, dev, usb_rcvctrlpipe(dev, 0),
523 (unsigned char *)dr, buffer, 2,
524 mos7840_control_callback, mcs);
525 mcs->control_urb->transfer_buffer_length = 2;
526 ret = usb_submit_urb(mcs->control_urb, GFP_ATOMIC);
527 if (ret)
528 clear_bit_unlock(MOS7840_FLAG_CTRL_BUSY, &mcs->flags);
529
530 return ret;
531}
532
533static void mos7840_set_led_callback(struct urb *urb)
534{
535 switch (urb->status) {
536 case 0:
537 /* Success */
538 break;
539 case -ECONNRESET:
540 case -ENOENT:
541 case -ESHUTDOWN:
542 /* This urb is terminated, clean up */
543 dev_dbg(&urb->dev->dev, "%s - urb shutting down: %d\n",
544 __func__, urb->status);
545 break;
546 default:
547 dev_dbg(&urb->dev->dev, "%s - nonzero urb status: %d\n",
548 __func__, urb->status);
549 }
550}
551
552static void mos7840_set_led_async(struct moschip_port *mcs, __u16 wval,
553 __u16 reg)
554{
555 struct usb_device *dev = mcs->port->serial->dev;
556 struct usb_ctrlrequest *dr = mcs->led_dr;
557
558 dr->bRequestType = MCS_WR_RTYPE;
559 dr->bRequest = MCS_WRREQ;
560 dr->wValue = cpu_to_le16(wval);
561 dr->wIndex = cpu_to_le16(reg);
562 dr->wLength = cpu_to_le16(0);
563
564 usb_fill_control_urb(mcs->led_urb, dev, usb_sndctrlpipe(dev, 0),
565 (unsigned char *)dr, NULL, 0, mos7840_set_led_callback, NULL);
566
567 usb_submit_urb(mcs->led_urb, GFP_ATOMIC);
568}
569
570static void mos7840_set_led_sync(struct usb_serial_port *port, __u16 reg,
571 __u16 val)
572{
573 struct usb_device *dev = port->serial->dev;
574
575 usb_control_msg(dev, usb_sndctrlpipe(dev, 0), MCS_WRREQ, MCS_WR_RTYPE,
576 val, reg, NULL, 0, MOS_WDR_TIMEOUT);
577}
578
579static void mos7840_led_off(unsigned long arg)
580{
581 struct moschip_port *mcs = (struct moschip_port *) arg;
582
583 /* Turn off LED */
584 mos7840_set_led_async(mcs, 0x0300, MODEM_CONTROL_REGISTER);
585 mod_timer(&mcs->led_timer2,
586 jiffies + msecs_to_jiffies(LED_OFF_MS));
587}
588
589static void mos7840_led_flag_off(unsigned long arg)
590{
591 struct moschip_port *mcs = (struct moschip_port *) arg;
592
593 clear_bit_unlock(MOS7840_FLAG_LED_BUSY, &mcs->flags);
594}
595
596static void mos7840_led_activity(struct usb_serial_port *port)
597{
598 struct moschip_port *mos7840_port = usb_get_serial_port_data(port);
599
600 if (test_and_set_bit_lock(MOS7840_FLAG_LED_BUSY, &mos7840_port->flags))
601 return;
602
603 mos7840_set_led_async(mos7840_port, 0x0301, MODEM_CONTROL_REGISTER);
604 mod_timer(&mos7840_port->led_timer1,
605 jiffies + msecs_to_jiffies(LED_ON_MS));
606}
607
608/*****************************************************************************
609 * mos7840_interrupt_callback
610 * this is the callback function for when we have received data on the
611 * interrupt endpoint.
612 *****************************************************************************/
613
614static void mos7840_interrupt_callback(struct urb *urb)
615{
616 int result;
617 int length;
618 struct moschip_port *mos7840_port;
619 struct usb_serial *serial;
620 __u16 Data;
621 unsigned char *data;
622 __u8 sp[5], st;
623 int i, rv = 0;
624 __u16 wval, wreg = 0;
625 int status = urb->status;
626
627 switch (status) {
628 case 0:
629 /* success */
630 break;
631 case -ECONNRESET:
632 case -ENOENT:
633 case -ESHUTDOWN:
634 /* this urb is terminated, clean up */
635 dev_dbg(&urb->dev->dev, "%s - urb shutting down with status: %d\n",
636 __func__, status);
637 return;
638 default:
639 dev_dbg(&urb->dev->dev, "%s - nonzero urb status received: %d\n",
640 __func__, status);
641 goto exit;
642 }
643
644 length = urb->actual_length;
645 data = urb->transfer_buffer;
646
647 serial = urb->context;
648
649 /* Moschip get 5 bytes
650 * Byte 1 IIR Port 1 (port.number is 0)
651 * Byte 2 IIR Port 2 (port.number is 1)
652 * Byte 3 IIR Port 3 (port.number is 2)
653 * Byte 4 IIR Port 4 (port.number is 3)
654 * Byte 5 FIFO status for both */
655
656 if (length > 5) {
657 dev_dbg(&urb->dev->dev, "%s", "Wrong data !!!\n");
658 return;
659 }
660
661 sp[0] = (__u8) data[0];
662 sp[1] = (__u8) data[1];
663 sp[2] = (__u8) data[2];
664 sp[3] = (__u8) data[3];
665 st = (__u8) data[4];
666
667 for (i = 0; i < serial->num_ports; i++) {
668 mos7840_port = mos7840_get_port_private(serial->port[i]);
669 wval = ((__u16)serial->port[i]->port_number + 1) << 8;
670 if (mos7840_port->open) {
671 if (sp[i] & 0x01) {
672 dev_dbg(&urb->dev->dev, "SP%d No Interrupt !!!\n", i);
673 } else {
674 switch (sp[i] & 0x0f) {
675 case SERIAL_IIR_RLS:
676 dev_dbg(&urb->dev->dev, "Serial Port %d: Receiver status error or \n", i);
677 dev_dbg(&urb->dev->dev, "address bit detected in 9-bit mode\n");
678 mos7840_port->MsrLsr = 1;
679 wreg = LINE_STATUS_REGISTER;
680 break;
681 case SERIAL_IIR_MS:
682 dev_dbg(&urb->dev->dev, "Serial Port %d: Modem status change\n", i);
683 mos7840_port->MsrLsr = 0;
684 wreg = MODEM_STATUS_REGISTER;
685 break;
686 }
687 rv = mos7840_get_reg(mos7840_port, wval, wreg, &Data);
688 }
689 }
690 }
691 if (!(rv < 0))
692 /* the completion handler for the control urb will resubmit */
693 return;
694exit:
695 result = usb_submit_urb(urb, GFP_ATOMIC);
696 if (result) {
697 dev_err(&urb->dev->dev,
698 "%s - Error %d submitting interrupt urb\n",
699 __func__, result);
700 }
701}
702
703static int mos7840_port_paranoia_check(struct usb_serial_port *port,
704 const char *function)
705{
706 if (!port) {
707 pr_debug("%s - port == NULL\n", function);
708 return -1;
709 }
710 if (!port->serial) {
711 pr_debug("%s - port->serial == NULL\n", function);
712 return -1;
713 }
714
715 return 0;
716}
717
718/* Inline functions to check the sanity of a pointer that is passed to us */
719static int mos7840_serial_paranoia_check(struct usb_serial *serial,
720 const char *function)
721{
722 if (!serial) {
723 pr_debug("%s - serial == NULL\n", function);
724 return -1;
725 }
726 if (!serial->type) {
727 pr_debug("%s - serial->type == NULL!\n", function);
728 return -1;
729 }
730
731 return 0;
732}
733
734static struct usb_serial *mos7840_get_usb_serial(struct usb_serial_port *port,
735 const char *function)
736{
737 /* if no port was specified, or it fails a paranoia check */
738 if (!port ||
739 mos7840_port_paranoia_check(port, function) ||
740 mos7840_serial_paranoia_check(port->serial, function)) {
741 /* then say that we don't have a valid usb_serial thing,
742 * which will end up genrating -ENODEV return values */
743 return NULL;
744 }
745
746 return port->serial;
747}
748
749/*****************************************************************************
750 * mos7840_bulk_in_callback
751 * this is the callback function for when we have received data on the
752 * bulk in endpoint.
753 *****************************************************************************/
754
755static void mos7840_bulk_in_callback(struct urb *urb)
756{
757 int retval;
758 unsigned char *data;
759 struct usb_serial *serial;
760 struct usb_serial_port *port;
761 struct moschip_port *mos7840_port;
762 int status = urb->status;
763
764 mos7840_port = urb->context;
765 if (!mos7840_port)
766 return;
767
768 if (status) {
769 dev_dbg(&urb->dev->dev, "nonzero read bulk status received: %d\n", status);
770 mos7840_port->read_urb_busy = false;
771 return;
772 }
773
774 port = mos7840_port->port;
775 if (mos7840_port_paranoia_check(port, __func__)) {
776 mos7840_port->read_urb_busy = false;
777 return;
778 }
779
780 serial = mos7840_get_usb_serial(port, __func__);
781 if (!serial) {
782 mos7840_port->read_urb_busy = false;
783 return;
784 }
785
786 data = urb->transfer_buffer;
787 usb_serial_debug_data(&port->dev, __func__, urb->actual_length, data);
788
789 if (urb->actual_length) {
790 struct tty_port *tport = &mos7840_port->port->port;
791 tty_insert_flip_string(tport, data, urb->actual_length);
792 tty_flip_buffer_push(tport);
793 port->icount.rx += urb->actual_length;
794 dev_dbg(&port->dev, "icount.rx is %d:\n", port->icount.rx);
795 }
796
797 if (!mos7840_port->read_urb) {
798 dev_dbg(&port->dev, "%s", "URB KILLED !!!\n");
799 mos7840_port->read_urb_busy = false;
800 return;
801 }
802
803 if (mos7840_port->has_led)
804 mos7840_led_activity(port);
805
806 mos7840_port->read_urb_busy = true;
807 retval = usb_submit_urb(mos7840_port->read_urb, GFP_ATOMIC);
808
809 if (retval) {
810 dev_dbg(&port->dev, "usb_submit_urb(read bulk) failed, retval = %d\n", retval);
811 mos7840_port->read_urb_busy = false;
812 }
813}
814
815/*****************************************************************************
816 * mos7840_bulk_out_data_callback
817 * this is the callback function for when we have finished sending
818 * serial data on the bulk out endpoint.
819 *****************************************************************************/
820
821static void mos7840_bulk_out_data_callback(struct urb *urb)
822{
823 struct moschip_port *mos7840_port;
824 struct usb_serial_port *port;
825 int status = urb->status;
826 int i;
827
828 mos7840_port = urb->context;
829 port = mos7840_port->port;
830 spin_lock(&mos7840_port->pool_lock);
831 for (i = 0; i < NUM_URBS; i++) {
832 if (urb == mos7840_port->write_urb_pool[i]) {
833 mos7840_port->busy[i] = 0;
834 break;
835 }
836 }
837 spin_unlock(&mos7840_port->pool_lock);
838
839 if (status) {
840 dev_dbg(&port->dev, "nonzero write bulk status received:%d\n", status);
841 return;
842 }
843
844 if (mos7840_port_paranoia_check(port, __func__))
845 return;
846
847 if (mos7840_port->open)
848 tty_port_tty_wakeup(&port->port);
849
850}
851
852/************************************************************************/
853/* D R I V E R T T Y I N T E R F A C E F U N C T I O N S */
854/************************************************************************/
855
856/*****************************************************************************
857 * mos7840_open
858 * this function is called by the tty driver when a port is opened
859 * If successful, we return 0
860 * Otherwise we return a negative error number.
861 *****************************************************************************/
862
863static int mos7840_open(struct tty_struct *tty, struct usb_serial_port *port)
864{
865 int response;
866 int j;
867 struct usb_serial *serial;
868 struct urb *urb;
869 __u16 Data;
870 int status;
871 struct moschip_port *mos7840_port;
872 struct moschip_port *port0;
873
874 if (mos7840_port_paranoia_check(port, __func__))
875 return -ENODEV;
876
877 serial = port->serial;
878
879 if (mos7840_serial_paranoia_check(serial, __func__))
880 return -ENODEV;
881
882 mos7840_port = mos7840_get_port_private(port);
883 port0 = mos7840_get_port_private(serial->port[0]);
884
885 if (mos7840_port == NULL || port0 == NULL)
886 return -ENODEV;
887
888 usb_clear_halt(serial->dev, port->write_urb->pipe);
889 usb_clear_halt(serial->dev, port->read_urb->pipe);
890 port0->open_ports++;
891
892 /* Initialising the write urb pool */
893 for (j = 0; j < NUM_URBS; ++j) {
894 urb = usb_alloc_urb(0, GFP_KERNEL);
895 mos7840_port->write_urb_pool[j] = urb;
896 if (!urb)
897 continue;
898
899 urb->transfer_buffer = kmalloc(URB_TRANSFER_BUFFER_SIZE,
900 GFP_KERNEL);
901 if (!urb->transfer_buffer) {
902 usb_free_urb(urb);
903 mos7840_port->write_urb_pool[j] = NULL;
904 continue;
905 }
906 }
907
908/*****************************************************************************
909 * Initialize MCS7840 -- Write Init values to corresponding Registers
910 *
911 * Register Index
912 * 1 : IER
913 * 2 : FCR
914 * 3 : LCR
915 * 4 : MCR
916 *
917 * 0x08 : SP1/2 Control Reg
918 *****************************************************************************/
919
920 /* NEED to check the following Block */
921
922 Data = 0x0;
923 status = mos7840_get_reg_sync(port, mos7840_port->SpRegOffset, &Data);
924 if (status < 0) {
925 dev_dbg(&port->dev, "Reading Spreg failed\n");
926 goto err;
927 }
928 Data |= 0x80;
929 status = mos7840_set_reg_sync(port, mos7840_port->SpRegOffset, Data);
930 if (status < 0) {
931 dev_dbg(&port->dev, "writing Spreg failed\n");
932 goto err;
933 }
934
935 Data &= ~0x80;
936 status = mos7840_set_reg_sync(port, mos7840_port->SpRegOffset, Data);
937 if (status < 0) {
938 dev_dbg(&port->dev, "writing Spreg failed\n");
939 goto err;
940 }
941 /* End of block to be checked */
942
943 Data = 0x0;
944 status = mos7840_get_reg_sync(port, mos7840_port->ControlRegOffset,
945 &Data);
946 if (status < 0) {
947 dev_dbg(&port->dev, "Reading Controlreg failed\n");
948 goto err;
949 }
950 Data |= 0x08; /* Driver done bit */
951 Data |= 0x20; /* rx_disable */
952 status = mos7840_set_reg_sync(port,
953 mos7840_port->ControlRegOffset, Data);
954 if (status < 0) {
955 dev_dbg(&port->dev, "writing Controlreg failed\n");
956 goto err;
957 }
958 /* do register settings here */
959 /* Set all regs to the device default values. */
960 /***********************************
961 * First Disable all interrupts.
962 ***********************************/
963 Data = 0x00;
964 status = mos7840_set_uart_reg(port, INTERRUPT_ENABLE_REGISTER, Data);
965 if (status < 0) {
966 dev_dbg(&port->dev, "disabling interrupts failed\n");
967 goto err;
968 }
969 /* Set FIFO_CONTROL_REGISTER to the default value */
970 Data = 0x00;
971 status = mos7840_set_uart_reg(port, FIFO_CONTROL_REGISTER, Data);
972 if (status < 0) {
973 dev_dbg(&port->dev, "Writing FIFO_CONTROL_REGISTER failed\n");
974 goto err;
975 }
976
977 Data = 0xcf;
978 status = mos7840_set_uart_reg(port, FIFO_CONTROL_REGISTER, Data);
979 if (status < 0) {
980 dev_dbg(&port->dev, "Writing FIFO_CONTROL_REGISTER failed\n");
981 goto err;
982 }
983
984 Data = 0x03;
985 status = mos7840_set_uart_reg(port, LINE_CONTROL_REGISTER, Data);
986 mos7840_port->shadowLCR = Data;
987
988 Data = 0x0b;
989 status = mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, Data);
990 mos7840_port->shadowMCR = Data;
991
992 Data = 0x00;
993 status = mos7840_get_uart_reg(port, LINE_CONTROL_REGISTER, &Data);
994 mos7840_port->shadowLCR = Data;
995
996 Data |= SERIAL_LCR_DLAB; /* data latch enable in LCR 0x80 */
997 status = mos7840_set_uart_reg(port, LINE_CONTROL_REGISTER, Data);
998
999 Data = 0x0c;
1000 status = mos7840_set_uart_reg(port, DIVISOR_LATCH_LSB, Data);
1001
1002 Data = 0x0;
1003 status = mos7840_set_uart_reg(port, DIVISOR_LATCH_MSB, Data);
1004
1005 Data = 0x00;
1006 status = mos7840_get_uart_reg(port, LINE_CONTROL_REGISTER, &Data);
1007
1008 Data = Data & ~SERIAL_LCR_DLAB;
1009 status = mos7840_set_uart_reg(port, LINE_CONTROL_REGISTER, Data);
1010 mos7840_port->shadowLCR = Data;
1011
1012 /* clearing Bulkin and Bulkout Fifo */
1013 Data = 0x0;
1014 status = mos7840_get_reg_sync(port, mos7840_port->SpRegOffset, &Data);
1015
1016 Data = Data | 0x0c;
1017 status = mos7840_set_reg_sync(port, mos7840_port->SpRegOffset, Data);
1018
1019 Data = Data & ~0x0c;
1020 status = mos7840_set_reg_sync(port, mos7840_port->SpRegOffset, Data);
1021 /* Finally enable all interrupts */
1022 Data = 0x0c;
1023 status = mos7840_set_uart_reg(port, INTERRUPT_ENABLE_REGISTER, Data);
1024
1025 /* clearing rx_disable */
1026 Data = 0x0;
1027 status = mos7840_get_reg_sync(port, mos7840_port->ControlRegOffset,
1028 &Data);
1029 Data = Data & ~0x20;
1030 status = mos7840_set_reg_sync(port, mos7840_port->ControlRegOffset,
1031 Data);
1032
1033 /* rx_negate */
1034 Data = 0x0;
1035 status = mos7840_get_reg_sync(port, mos7840_port->ControlRegOffset,
1036 &Data);
1037 Data = Data | 0x10;
1038 status = mos7840_set_reg_sync(port, mos7840_port->ControlRegOffset,
1039 Data);
1040
1041 /* Check to see if we've set up our endpoint info yet *
1042 * (can't set it up in mos7840_startup as the structures *
1043 * were not set up at that time.) */
1044 if (port0->open_ports == 1) {
1045 /* FIXME: Buffer never NULL, so URB is not submitted. */
1046 if (serial->port[0]->interrupt_in_buffer == NULL) {
1047 /* set up interrupt urb */
1048 usb_fill_int_urb(serial->port[0]->interrupt_in_urb,
1049 serial->dev,
1050 usb_rcvintpipe(serial->dev,
1051 serial->port[0]->interrupt_in_endpointAddress),
1052 serial->port[0]->interrupt_in_buffer,
1053 serial->port[0]->interrupt_in_urb->
1054 transfer_buffer_length,
1055 mos7840_interrupt_callback,
1056 serial,
1057 serial->port[0]->interrupt_in_urb->interval);
1058
1059 /* start interrupt read for mos7840 */
1060 response =
1061 usb_submit_urb(serial->port[0]->interrupt_in_urb,
1062 GFP_KERNEL);
1063 if (response) {
1064 dev_err(&port->dev, "%s - Error %d submitting "
1065 "interrupt urb\n", __func__, response);
1066 }
1067
1068 }
1069
1070 }
1071
1072 /* see if we've set up our endpoint info yet *
1073 * (can't set it up in mos7840_startup as the *
1074 * structures were not set up at that time.) */
1075
1076 dev_dbg(&port->dev, "port number is %d\n", port->port_number);
1077 dev_dbg(&port->dev, "minor number is %d\n", port->minor);
1078 dev_dbg(&port->dev, "Bulkin endpoint is %d\n", port->bulk_in_endpointAddress);
1079 dev_dbg(&port->dev, "BulkOut endpoint is %d\n", port->bulk_out_endpointAddress);
1080 dev_dbg(&port->dev, "Interrupt endpoint is %d\n", port->interrupt_in_endpointAddress);
1081 dev_dbg(&port->dev, "port's number in the device is %d\n", mos7840_port->port_num);
1082 mos7840_port->read_urb = port->read_urb;
1083
1084 /* set up our bulk in urb */
1085 if ((serial->num_ports == 2) && (((__u16)port->port_number % 2) != 0)) {
1086 usb_fill_bulk_urb(mos7840_port->read_urb,
1087 serial->dev,
1088 usb_rcvbulkpipe(serial->dev,
1089 (port->bulk_in_endpointAddress) + 2),
1090 port->bulk_in_buffer,
1091 mos7840_port->read_urb->transfer_buffer_length,
1092 mos7840_bulk_in_callback, mos7840_port);
1093 } else {
1094 usb_fill_bulk_urb(mos7840_port->read_urb,
1095 serial->dev,
1096 usb_rcvbulkpipe(serial->dev,
1097 port->bulk_in_endpointAddress),
1098 port->bulk_in_buffer,
1099 mos7840_port->read_urb->transfer_buffer_length,
1100 mos7840_bulk_in_callback, mos7840_port);
1101 }
1102
1103 dev_dbg(&port->dev, "%s: bulkin endpoint is %d\n", __func__, port->bulk_in_endpointAddress);
1104 mos7840_port->read_urb_busy = true;
1105 response = usb_submit_urb(mos7840_port->read_urb, GFP_KERNEL);
1106 if (response) {
1107 dev_err(&port->dev, "%s - Error %d submitting control urb\n",
1108 __func__, response);
1109 mos7840_port->read_urb_busy = false;
1110 }
1111
1112 /* initialize our port settings */
1113 /* Must set to enable ints! */
1114 mos7840_port->shadowMCR = MCR_MASTER_IE;
1115 /* send a open port command */
1116 mos7840_port->open = 1;
1117 /* mos7840_change_port_settings(mos7840_port,old_termios); */
1118
1119 return 0;
1120err:
1121 for (j = 0; j < NUM_URBS; ++j) {
1122 urb = mos7840_port->write_urb_pool[j];
1123 if (!urb)
1124 continue;
1125 kfree(urb->transfer_buffer);
1126 usb_free_urb(urb);
1127 }
1128 return status;
1129}
1130
1131/*****************************************************************************
1132 * mos7840_chars_in_buffer
1133 * this function is called by the tty driver when it wants to know how many
1134 * bytes of data we currently have outstanding in the port (data that has
1135 * been written, but hasn't made it out the port yet)
1136 * If successful, we return the number of bytes left to be written in the
1137 * system,
1138 * Otherwise we return zero.
1139 *****************************************************************************/
1140
1141static int mos7840_chars_in_buffer(struct tty_struct *tty)
1142{
1143 struct usb_serial_port *port = tty->driver_data;
1144 int i;
1145 int chars = 0;
1146 unsigned long flags;
1147 struct moschip_port *mos7840_port;
1148
1149 if (mos7840_port_paranoia_check(port, __func__))
1150 return 0;
1151
1152 mos7840_port = mos7840_get_port_private(port);
1153 if (mos7840_port == NULL)
1154 return 0;
1155
1156 spin_lock_irqsave(&mos7840_port->pool_lock, flags);
1157 for (i = 0; i < NUM_URBS; ++i) {
1158 if (mos7840_port->busy[i]) {
1159 struct urb *urb = mos7840_port->write_urb_pool[i];
1160 chars += urb->transfer_buffer_length;
1161 }
1162 }
1163 spin_unlock_irqrestore(&mos7840_port->pool_lock, flags);
1164 dev_dbg(&port->dev, "%s - returns %d\n", __func__, chars);
1165 return chars;
1166
1167}
1168
1169/*****************************************************************************
1170 * mos7840_close
1171 * this function is called by the tty driver when a port is closed
1172 *****************************************************************************/
1173
1174static void mos7840_close(struct usb_serial_port *port)
1175{
1176 struct usb_serial *serial;
1177 struct moschip_port *mos7840_port;
1178 struct moschip_port *port0;
1179 int j;
1180 __u16 Data;
1181
1182 if (mos7840_port_paranoia_check(port, __func__))
1183 return;
1184
1185 serial = mos7840_get_usb_serial(port, __func__);
1186 if (!serial)
1187 return;
1188
1189 mos7840_port = mos7840_get_port_private(port);
1190 port0 = mos7840_get_port_private(serial->port[0]);
1191
1192 if (mos7840_port == NULL || port0 == NULL)
1193 return;
1194
1195 for (j = 0; j < NUM_URBS; ++j)
1196 usb_kill_urb(mos7840_port->write_urb_pool[j]);
1197
1198 /* Freeing Write URBs */
1199 for (j = 0; j < NUM_URBS; ++j) {
1200 if (mos7840_port->write_urb_pool[j]) {
1201 kfree(mos7840_port->write_urb_pool[j]->transfer_buffer);
1202 usb_free_urb(mos7840_port->write_urb_pool[j]);
1203 }
1204 }
1205
1206 usb_kill_urb(mos7840_port->read_urb);
1207 mos7840_port->read_urb_busy = false;
1208
1209 port0->open_ports--;
1210 dev_dbg(&port->dev, "%s in close%d\n", __func__, port0->open_ports);
1211 if (port0->open_ports == 0) {
1212 if (serial->port[0]->interrupt_in_urb) {
1213 dev_dbg(&port->dev, "Shutdown interrupt_in_urb\n");
1214 usb_kill_urb(serial->port[0]->interrupt_in_urb);
1215 }
1216 }
1217
1218 Data = 0x0;
1219 mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, Data);
1220
1221 Data = 0x00;
1222 mos7840_set_uart_reg(port, INTERRUPT_ENABLE_REGISTER, Data);
1223
1224 mos7840_port->open = 0;
1225}
1226
1227/*****************************************************************************
1228 * mos7840_break
1229 * this function sends a break to the port
1230 *****************************************************************************/
1231static void mos7840_break(struct tty_struct *tty, int break_state)
1232{
1233 struct usb_serial_port *port = tty->driver_data;
1234 unsigned char data;
1235 struct usb_serial *serial;
1236 struct moschip_port *mos7840_port;
1237
1238 if (mos7840_port_paranoia_check(port, __func__))
1239 return;
1240
1241 serial = mos7840_get_usb_serial(port, __func__);
1242 if (!serial)
1243 return;
1244
1245 mos7840_port = mos7840_get_port_private(port);
1246
1247 if (mos7840_port == NULL)
1248 return;
1249
1250 if (break_state == -1)
1251 data = mos7840_port->shadowLCR | LCR_SET_BREAK;
1252 else
1253 data = mos7840_port->shadowLCR & ~LCR_SET_BREAK;
1254
1255 /* FIXME: no locking on shadowLCR anywhere in driver */
1256 mos7840_port->shadowLCR = data;
1257 dev_dbg(&port->dev, "%s mos7840_port->shadowLCR is %x\n", __func__, mos7840_port->shadowLCR);
1258 mos7840_set_uart_reg(port, LINE_CONTROL_REGISTER,
1259 mos7840_port->shadowLCR);
1260}
1261
1262/*****************************************************************************
1263 * mos7840_write_room
1264 * this function is called by the tty driver when it wants to know how many
1265 * bytes of data we can accept for a specific port.
1266 * If successful, we return the amount of room that we have for this port
1267 * Otherwise we return a negative error number.
1268 *****************************************************************************/
1269
1270static int mos7840_write_room(struct tty_struct *tty)
1271{
1272 struct usb_serial_port *port = tty->driver_data;
1273 int i;
1274 int room = 0;
1275 unsigned long flags;
1276 struct moschip_port *mos7840_port;
1277
1278 if (mos7840_port_paranoia_check(port, __func__))
1279 return -1;
1280
1281 mos7840_port = mos7840_get_port_private(port);
1282 if (mos7840_port == NULL)
1283 return -1;
1284
1285 spin_lock_irqsave(&mos7840_port->pool_lock, flags);
1286 for (i = 0; i < NUM_URBS; ++i) {
1287 if (!mos7840_port->busy[i])
1288 room += URB_TRANSFER_BUFFER_SIZE;
1289 }
1290 spin_unlock_irqrestore(&mos7840_port->pool_lock, flags);
1291
1292 room = (room == 0) ? 0 : room - URB_TRANSFER_BUFFER_SIZE + 1;
1293 dev_dbg(&mos7840_port->port->dev, "%s - returns %d\n", __func__, room);
1294 return room;
1295
1296}
1297
1298/*****************************************************************************
1299 * mos7840_write
1300 * this function is called by the tty driver when data should be written to
1301 * the port.
1302 * If successful, we return the number of bytes written, otherwise we
1303 * return a negative error number.
1304 *****************************************************************************/
1305
1306static int mos7840_write(struct tty_struct *tty, struct usb_serial_port *port,
1307 const unsigned char *data, int count)
1308{
1309 int status;
1310 int i;
1311 int bytes_sent = 0;
1312 int transfer_size;
1313 unsigned long flags;
1314
1315 struct moschip_port *mos7840_port;
1316 struct usb_serial *serial;
1317 struct urb *urb;
1318 /* __u16 Data; */
1319 const unsigned char *current_position = data;
1320 unsigned char *data1;
1321
1322 if (mos7840_port_paranoia_check(port, __func__))
1323 return -1;
1324
1325 serial = port->serial;
1326 if (mos7840_serial_paranoia_check(serial, __func__))
1327 return -1;
1328
1329 mos7840_port = mos7840_get_port_private(port);
1330 if (mos7840_port == NULL)
1331 return -1;
1332
1333 /* try to find a free urb in the list */
1334 urb = NULL;
1335
1336 spin_lock_irqsave(&mos7840_port->pool_lock, flags);
1337 for (i = 0; i < NUM_URBS; ++i) {
1338 if (!mos7840_port->busy[i]) {
1339 mos7840_port->busy[i] = 1;
1340 urb = mos7840_port->write_urb_pool[i];
1341 dev_dbg(&port->dev, "URB:%d\n", i);
1342 break;
1343 }
1344 }
1345 spin_unlock_irqrestore(&mos7840_port->pool_lock, flags);
1346
1347 if (urb == NULL) {
1348 dev_dbg(&port->dev, "%s - no more free urbs\n", __func__);
1349 goto exit;
1350 }
1351
1352 if (urb->transfer_buffer == NULL) {
1353 urb->transfer_buffer = kmalloc(URB_TRANSFER_BUFFER_SIZE,
1354 GFP_ATOMIC);
1355 if (!urb->transfer_buffer)
1356 goto exit;
1357 }
1358 transfer_size = min(count, URB_TRANSFER_BUFFER_SIZE);
1359
1360 memcpy(urb->transfer_buffer, current_position, transfer_size);
1361
1362 /* fill urb with data and submit */
1363 if ((serial->num_ports == 2) && (((__u16)port->port_number % 2) != 0)) {
1364 usb_fill_bulk_urb(urb,
1365 serial->dev,
1366 usb_sndbulkpipe(serial->dev,
1367 (port->bulk_out_endpointAddress) + 2),
1368 urb->transfer_buffer,
1369 transfer_size,
1370 mos7840_bulk_out_data_callback, mos7840_port);
1371 } else {
1372 usb_fill_bulk_urb(urb,
1373 serial->dev,
1374 usb_sndbulkpipe(serial->dev,
1375 port->bulk_out_endpointAddress),
1376 urb->transfer_buffer,
1377 transfer_size,
1378 mos7840_bulk_out_data_callback, mos7840_port);
1379 }
1380
1381 data1 = urb->transfer_buffer;
1382 dev_dbg(&port->dev, "bulkout endpoint is %d\n", port->bulk_out_endpointAddress);
1383
1384 if (mos7840_port->has_led)
1385 mos7840_led_activity(port);
1386
1387 /* send it down the pipe */
1388 status = usb_submit_urb(urb, GFP_ATOMIC);
1389
1390 if (status) {
1391 mos7840_port->busy[i] = 0;
1392 dev_err_console(port, "%s - usb_submit_urb(write bulk) failed "
1393 "with status = %d\n", __func__, status);
1394 bytes_sent = status;
1395 goto exit;
1396 }
1397 bytes_sent = transfer_size;
1398 port->icount.tx += transfer_size;
1399 dev_dbg(&port->dev, "icount.tx is %d:\n", port->icount.tx);
1400exit:
1401 return bytes_sent;
1402
1403}
1404
1405/*****************************************************************************
1406 * mos7840_throttle
1407 * this function is called by the tty driver when it wants to stop the data
1408 * being read from the port.
1409 *****************************************************************************/
1410
1411static void mos7840_throttle(struct tty_struct *tty)
1412{
1413 struct usb_serial_port *port = tty->driver_data;
1414 struct moschip_port *mos7840_port;
1415 int status;
1416
1417 if (mos7840_port_paranoia_check(port, __func__))
1418 return;
1419
1420 mos7840_port = mos7840_get_port_private(port);
1421
1422 if (mos7840_port == NULL)
1423 return;
1424
1425 if (!mos7840_port->open) {
1426 dev_dbg(&port->dev, "%s", "port not opened\n");
1427 return;
1428 }
1429
1430 /* if we are implementing XON/XOFF, send the stop character */
1431 if (I_IXOFF(tty)) {
1432 unsigned char stop_char = STOP_CHAR(tty);
1433 status = mos7840_write(tty, port, &stop_char, 1);
1434 if (status <= 0)
1435 return;
1436 }
1437 /* if we are implementing RTS/CTS, toggle that line */
1438 if (C_CRTSCTS(tty)) {
1439 mos7840_port->shadowMCR &= ~MCR_RTS;
1440 status = mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER,
1441 mos7840_port->shadowMCR);
1442 if (status < 0)
1443 return;
1444 }
1445}
1446
1447/*****************************************************************************
1448 * mos7840_unthrottle
1449 * this function is called by the tty driver when it wants to resume
1450 * the data being read from the port (called after mos7840_throttle is
1451 * called)
1452 *****************************************************************************/
1453static void mos7840_unthrottle(struct tty_struct *tty)
1454{
1455 struct usb_serial_port *port = tty->driver_data;
1456 int status;
1457 struct moschip_port *mos7840_port = mos7840_get_port_private(port);
1458
1459 if (mos7840_port_paranoia_check(port, __func__))
1460 return;
1461
1462 if (mos7840_port == NULL)
1463 return;
1464
1465 if (!mos7840_port->open) {
1466 dev_dbg(&port->dev, "%s - port not opened\n", __func__);
1467 return;
1468 }
1469
1470 /* if we are implementing XON/XOFF, send the start character */
1471 if (I_IXOFF(tty)) {
1472 unsigned char start_char = START_CHAR(tty);
1473 status = mos7840_write(tty, port, &start_char, 1);
1474 if (status <= 0)
1475 return;
1476 }
1477
1478 /* if we are implementing RTS/CTS, toggle that line */
1479 if (C_CRTSCTS(tty)) {
1480 mos7840_port->shadowMCR |= MCR_RTS;
1481 status = mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER,
1482 mos7840_port->shadowMCR);
1483 if (status < 0)
1484 return;
1485 }
1486}
1487
1488static int mos7840_tiocmget(struct tty_struct *tty)
1489{
1490 struct usb_serial_port *port = tty->driver_data;
1491 struct moschip_port *mos7840_port;
1492 unsigned int result;
1493 __u16 msr;
1494 __u16 mcr;
1495 int status;
1496 mos7840_port = mos7840_get_port_private(port);
1497
1498 if (mos7840_port == NULL)
1499 return -ENODEV;
1500
1501 status = mos7840_get_uart_reg(port, MODEM_STATUS_REGISTER, &msr);
1502 if (status < 0)
1503 return -EIO;
1504 status = mos7840_get_uart_reg(port, MODEM_CONTROL_REGISTER, &mcr);
1505 if (status < 0)
1506 return -EIO;
1507 result = ((mcr & MCR_DTR) ? TIOCM_DTR : 0)
1508 | ((mcr & MCR_RTS) ? TIOCM_RTS : 0)
1509 | ((mcr & MCR_LOOPBACK) ? TIOCM_LOOP : 0)
1510 | ((msr & MOS7840_MSR_CTS) ? TIOCM_CTS : 0)
1511 | ((msr & MOS7840_MSR_CD) ? TIOCM_CAR : 0)
1512 | ((msr & MOS7840_MSR_RI) ? TIOCM_RI : 0)
1513 | ((msr & MOS7840_MSR_DSR) ? TIOCM_DSR : 0);
1514
1515 dev_dbg(&port->dev, "%s - 0x%04X\n", __func__, result);
1516
1517 return result;
1518}
1519
1520static int mos7840_tiocmset(struct tty_struct *tty,
1521 unsigned int set, unsigned int clear)
1522{
1523 struct usb_serial_port *port = tty->driver_data;
1524 struct moschip_port *mos7840_port;
1525 unsigned int mcr;
1526 int status;
1527
1528 mos7840_port = mos7840_get_port_private(port);
1529
1530 if (mos7840_port == NULL)
1531 return -ENODEV;
1532
1533 /* FIXME: What locks the port registers ? */
1534 mcr = mos7840_port->shadowMCR;
1535 if (clear & TIOCM_RTS)
1536 mcr &= ~MCR_RTS;
1537 if (clear & TIOCM_DTR)
1538 mcr &= ~MCR_DTR;
1539 if (clear & TIOCM_LOOP)
1540 mcr &= ~MCR_LOOPBACK;
1541
1542 if (set & TIOCM_RTS)
1543 mcr |= MCR_RTS;
1544 if (set & TIOCM_DTR)
1545 mcr |= MCR_DTR;
1546 if (set & TIOCM_LOOP)
1547 mcr |= MCR_LOOPBACK;
1548
1549 mos7840_port->shadowMCR = mcr;
1550
1551 status = mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, mcr);
1552 if (status < 0) {
1553 dev_dbg(&port->dev, "setting MODEM_CONTROL_REGISTER Failed\n");
1554 return status;
1555 }
1556
1557 return 0;
1558}
1559
1560/*****************************************************************************
1561 * mos7840_calc_baud_rate_divisor
1562 * this function calculates the proper baud rate divisor for the specified
1563 * baud rate.
1564 *****************************************************************************/
1565static int mos7840_calc_baud_rate_divisor(struct usb_serial_port *port,
1566 int baudRate, int *divisor,
1567 __u16 *clk_sel_val)
1568{
1569 dev_dbg(&port->dev, "%s - %d\n", __func__, baudRate);
1570
1571 if (baudRate <= 115200) {
1572 *divisor = 115200 / baudRate;
1573 *clk_sel_val = 0x0;
1574 }
1575 if ((baudRate > 115200) && (baudRate <= 230400)) {
1576 *divisor = 230400 / baudRate;
1577 *clk_sel_val = 0x10;
1578 } else if ((baudRate > 230400) && (baudRate <= 403200)) {
1579 *divisor = 403200 / baudRate;
1580 *clk_sel_val = 0x20;
1581 } else if ((baudRate > 403200) && (baudRate <= 460800)) {
1582 *divisor = 460800 / baudRate;
1583 *clk_sel_val = 0x30;
1584 } else if ((baudRate > 460800) && (baudRate <= 806400)) {
1585 *divisor = 806400 / baudRate;
1586 *clk_sel_val = 0x40;
1587 } else if ((baudRate > 806400) && (baudRate <= 921600)) {
1588 *divisor = 921600 / baudRate;
1589 *clk_sel_val = 0x50;
1590 } else if ((baudRate > 921600) && (baudRate <= 1572864)) {
1591 *divisor = 1572864 / baudRate;
1592 *clk_sel_val = 0x60;
1593 } else if ((baudRate > 1572864) && (baudRate <= 3145728)) {
1594 *divisor = 3145728 / baudRate;
1595 *clk_sel_val = 0x70;
1596 }
1597 return 0;
1598}
1599
1600/*****************************************************************************
1601 * mos7840_send_cmd_write_baud_rate
1602 * this function sends the proper command to change the baud rate of the
1603 * specified port.
1604 *****************************************************************************/
1605
1606static int mos7840_send_cmd_write_baud_rate(struct moschip_port *mos7840_port,
1607 int baudRate)
1608{
1609 int divisor = 0;
1610 int status;
1611 __u16 Data;
1612 unsigned char number;
1613 __u16 clk_sel_val;
1614 struct usb_serial_port *port;
1615
1616 if (mos7840_port == NULL)
1617 return -1;
1618
1619 port = mos7840_port->port;
1620 if (mos7840_port_paranoia_check(port, __func__))
1621 return -1;
1622
1623 if (mos7840_serial_paranoia_check(port->serial, __func__))
1624 return -1;
1625
1626 number = mos7840_port->port->port_number;
1627
1628 dev_dbg(&port->dev, "%s - baud = %d\n", __func__, baudRate);
1629 /* reset clk_uart_sel in spregOffset */
1630 if (baudRate > 115200) {
1631#ifdef HW_flow_control
1632 /* NOTE: need to see the pther register to modify */
1633 /* setting h/w flow control bit to 1 */
1634 Data = 0x2b;
1635 mos7840_port->shadowMCR = Data;
1636 status = mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER,
1637 Data);
1638 if (status < 0) {
1639 dev_dbg(&port->dev, "Writing spreg failed in set_serial_baud\n");
1640 return -1;
1641 }
1642#endif
1643
1644 } else {
1645#ifdef HW_flow_control
1646 /* setting h/w flow control bit to 0 */
1647 Data = 0xb;
1648 mos7840_port->shadowMCR = Data;
1649 status = mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER,
1650 Data);
1651 if (status < 0) {
1652 dev_dbg(&port->dev, "Writing spreg failed in set_serial_baud\n");
1653 return -1;
1654 }
1655#endif
1656
1657 }
1658
1659 if (1) { /* baudRate <= 115200) */
1660 clk_sel_val = 0x0;
1661 Data = 0x0;
1662 status = mos7840_calc_baud_rate_divisor(port, baudRate, &divisor,
1663 &clk_sel_val);
1664 status = mos7840_get_reg_sync(port, mos7840_port->SpRegOffset,
1665 &Data);
1666 if (status < 0) {
1667 dev_dbg(&port->dev, "reading spreg failed in set_serial_baud\n");
1668 return -1;
1669 }
1670 Data = (Data & 0x8f) | clk_sel_val;
1671 status = mos7840_set_reg_sync(port, mos7840_port->SpRegOffset,
1672 Data);
1673 if (status < 0) {
1674 dev_dbg(&port->dev, "Writing spreg failed in set_serial_baud\n");
1675 return -1;
1676 }
1677 /* Calculate the Divisor */
1678
1679 if (status) {
1680 dev_err(&port->dev, "%s - bad baud rate\n", __func__);
1681 return status;
1682 }
1683 /* Enable access to divisor latch */
1684 Data = mos7840_port->shadowLCR | SERIAL_LCR_DLAB;
1685 mos7840_port->shadowLCR = Data;
1686 mos7840_set_uart_reg(port, LINE_CONTROL_REGISTER, Data);
1687
1688 /* Write the divisor */
1689 Data = (unsigned char)(divisor & 0xff);
1690 dev_dbg(&port->dev, "set_serial_baud Value to write DLL is %x\n", Data);
1691 mos7840_set_uart_reg(port, DIVISOR_LATCH_LSB, Data);
1692
1693 Data = (unsigned char)((divisor & 0xff00) >> 8);
1694 dev_dbg(&port->dev, "set_serial_baud Value to write DLM is %x\n", Data);
1695 mos7840_set_uart_reg(port, DIVISOR_LATCH_MSB, Data);
1696
1697 /* Disable access to divisor latch */
1698 Data = mos7840_port->shadowLCR & ~SERIAL_LCR_DLAB;
1699 mos7840_port->shadowLCR = Data;
1700 mos7840_set_uart_reg(port, LINE_CONTROL_REGISTER, Data);
1701
1702 }
1703 return status;
1704}
1705
1706/*****************************************************************************
1707 * mos7840_change_port_settings
1708 * This routine is called to set the UART on the device to match
1709 * the specified new settings.
1710 *****************************************************************************/
1711
1712static void mos7840_change_port_settings(struct tty_struct *tty,
1713 struct moschip_port *mos7840_port, struct ktermios *old_termios)
1714{
1715 int baud;
1716 unsigned cflag;
1717 unsigned iflag;
1718 __u8 lData;
1719 __u8 lParity;
1720 __u8 lStop;
1721 int status;
1722 __u16 Data;
1723 struct usb_serial_port *port;
1724 struct usb_serial *serial;
1725
1726 if (mos7840_port == NULL)
1727 return;
1728
1729 port = mos7840_port->port;
1730
1731 if (mos7840_port_paranoia_check(port, __func__))
1732 return;
1733
1734 if (mos7840_serial_paranoia_check(port->serial, __func__))
1735 return;
1736
1737 serial = port->serial;
1738
1739 if (!mos7840_port->open) {
1740 dev_dbg(&port->dev, "%s - port not opened\n", __func__);
1741 return;
1742 }
1743
1744 lData = LCR_BITS_8;
1745 lStop = LCR_STOP_1;
1746 lParity = LCR_PAR_NONE;
1747
1748 cflag = tty->termios.c_cflag;
1749 iflag = tty->termios.c_iflag;
1750
1751 /* Change the number of bits */
1752 switch (cflag & CSIZE) {
1753 case CS5:
1754 lData = LCR_BITS_5;
1755 break;
1756
1757 case CS6:
1758 lData = LCR_BITS_6;
1759 break;
1760
1761 case CS7:
1762 lData = LCR_BITS_7;
1763 break;
1764
1765 default:
1766 case CS8:
1767 lData = LCR_BITS_8;
1768 break;
1769 }
1770
1771 /* Change the Parity bit */
1772 if (cflag & PARENB) {
1773 if (cflag & PARODD) {
1774 lParity = LCR_PAR_ODD;
1775 dev_dbg(&port->dev, "%s - parity = odd\n", __func__);
1776 } else {
1777 lParity = LCR_PAR_EVEN;
1778 dev_dbg(&port->dev, "%s - parity = even\n", __func__);
1779 }
1780
1781 } else {
1782 dev_dbg(&port->dev, "%s - parity = none\n", __func__);
1783 }
1784
1785 if (cflag & CMSPAR)
1786 lParity = lParity | 0x20;
1787
1788 /* Change the Stop bit */
1789 if (cflag & CSTOPB) {
1790 lStop = LCR_STOP_2;
1791 dev_dbg(&port->dev, "%s - stop bits = 2\n", __func__);
1792 } else {
1793 lStop = LCR_STOP_1;
1794 dev_dbg(&port->dev, "%s - stop bits = 1\n", __func__);
1795 }
1796
1797 /* Update the LCR with the correct value */
1798 mos7840_port->shadowLCR &=
1799 ~(LCR_BITS_MASK | LCR_STOP_MASK | LCR_PAR_MASK);
1800 mos7840_port->shadowLCR |= (lData | lParity | lStop);
1801
1802 dev_dbg(&port->dev, "%s - mos7840_port->shadowLCR is %x\n", __func__,
1803 mos7840_port->shadowLCR);
1804 /* Disable Interrupts */
1805 Data = 0x00;
1806 mos7840_set_uart_reg(port, INTERRUPT_ENABLE_REGISTER, Data);
1807
1808 Data = 0x00;
1809 mos7840_set_uart_reg(port, FIFO_CONTROL_REGISTER, Data);
1810
1811 Data = 0xcf;
1812 mos7840_set_uart_reg(port, FIFO_CONTROL_REGISTER, Data);
1813
1814 /* Send the updated LCR value to the mos7840 */
1815 Data = mos7840_port->shadowLCR;
1816
1817 mos7840_set_uart_reg(port, LINE_CONTROL_REGISTER, Data);
1818
1819 Data = 0x00b;
1820 mos7840_port->shadowMCR = Data;
1821 mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, Data);
1822 Data = 0x00b;
1823 mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, Data);
1824
1825 /* set up the MCR register and send it to the mos7840 */
1826
1827 mos7840_port->shadowMCR = MCR_MASTER_IE;
1828 if (cflag & CBAUD)
1829 mos7840_port->shadowMCR |= (MCR_DTR | MCR_RTS);
1830
1831 if (cflag & CRTSCTS)
1832 mos7840_port->shadowMCR |= (MCR_XON_ANY);
1833 else
1834 mos7840_port->shadowMCR &= ~(MCR_XON_ANY);
1835
1836 Data = mos7840_port->shadowMCR;
1837 mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, Data);
1838
1839 /* Determine divisor based on baud rate */
1840 baud = tty_get_baud_rate(tty);
1841
1842 if (!baud) {
1843 /* pick a default, any default... */
1844 dev_dbg(&port->dev, "%s", "Picked default baud...\n");
1845 baud = 9600;
1846 }
1847
1848 dev_dbg(&port->dev, "%s - baud rate = %d\n", __func__, baud);
1849 status = mos7840_send_cmd_write_baud_rate(mos7840_port, baud);
1850
1851 /* Enable Interrupts */
1852 Data = 0x0c;
1853 mos7840_set_uart_reg(port, INTERRUPT_ENABLE_REGISTER, Data);
1854
1855 if (!mos7840_port->read_urb_busy) {
1856 mos7840_port->read_urb_busy = true;
1857 status = usb_submit_urb(mos7840_port->read_urb, GFP_KERNEL);
1858 if (status) {
1859 dev_dbg(&port->dev, "usb_submit_urb(read bulk) failed, status = %d\n",
1860 status);
1861 mos7840_port->read_urb_busy = false;
1862 }
1863 }
1864 dev_dbg(&port->dev, "%s - mos7840_port->shadowLCR is End %x\n", __func__,
1865 mos7840_port->shadowLCR);
1866}
1867
1868/*****************************************************************************
1869 * mos7840_set_termios
1870 * this function is called by the tty driver when it wants to change
1871 * the termios structure
1872 *****************************************************************************/
1873
1874static void mos7840_set_termios(struct tty_struct *tty,
1875 struct usb_serial_port *port,
1876 struct ktermios *old_termios)
1877{
1878 int status;
1879 struct usb_serial *serial;
1880 struct moschip_port *mos7840_port;
1881
1882 if (mos7840_port_paranoia_check(port, __func__))
1883 return;
1884
1885 serial = port->serial;
1886
1887 if (mos7840_serial_paranoia_check(serial, __func__))
1888 return;
1889
1890 mos7840_port = mos7840_get_port_private(port);
1891
1892 if (mos7840_port == NULL)
1893 return;
1894
1895 if (!mos7840_port->open) {
1896 dev_dbg(&port->dev, "%s - port not opened\n", __func__);
1897 return;
1898 }
1899
1900 /* change the port settings to the new ones specified */
1901
1902 mos7840_change_port_settings(tty, mos7840_port, old_termios);
1903
1904 if (!mos7840_port->read_urb) {
1905 dev_dbg(&port->dev, "%s", "URB KILLED !!!!!\n");
1906 return;
1907 }
1908
1909 if (!mos7840_port->read_urb_busy) {
1910 mos7840_port->read_urb_busy = true;
1911 status = usb_submit_urb(mos7840_port->read_urb, GFP_KERNEL);
1912 if (status) {
1913 dev_dbg(&port->dev, "usb_submit_urb(read bulk) failed, status = %d\n",
1914 status);
1915 mos7840_port->read_urb_busy = false;
1916 }
1917 }
1918}
1919
1920/*****************************************************************************
1921 * mos7840_get_lsr_info - get line status register info
1922 *
1923 * Purpose: Let user call ioctl() to get info when the UART physically
1924 * is emptied. On bus types like RS485, the transmitter must
1925 * release the bus after transmitting. This must be done when
1926 * the transmit shift register is empty, not be done when the
1927 * transmit holding register is empty. This functionality
1928 * allows an RS485 driver to be written in user space.
1929 *****************************************************************************/
1930
1931static int mos7840_get_lsr_info(struct tty_struct *tty,
1932 unsigned int __user *value)
1933{
1934 int count;
1935 unsigned int result = 0;
1936
1937 count = mos7840_chars_in_buffer(tty);
1938 if (count == 0)
1939 result = TIOCSER_TEMT;
1940
1941 if (copy_to_user(value, &result, sizeof(int)))
1942 return -EFAULT;
1943 return 0;
1944}
1945
1946/*****************************************************************************
1947 * mos7840_get_serial_info
1948 * function to get information about serial port
1949 *****************************************************************************/
1950
1951static int mos7840_get_serial_info(struct moschip_port *mos7840_port,
1952 struct serial_struct __user *retinfo)
1953{
1954 struct serial_struct tmp;
1955
1956 if (mos7840_port == NULL)
1957 return -1;
1958
1959 memset(&tmp, 0, sizeof(tmp));
1960
1961 tmp.type = PORT_16550A;
1962 tmp.line = mos7840_port->port->minor;
1963 tmp.port = mos7840_port->port->port_number;
1964 tmp.irq = 0;
1965 tmp.xmit_fifo_size = NUM_URBS * URB_TRANSFER_BUFFER_SIZE;
1966 tmp.baud_base = 9600;
1967 tmp.close_delay = 5 * HZ;
1968 tmp.closing_wait = 30 * HZ;
1969
1970 if (copy_to_user(retinfo, &tmp, sizeof(*retinfo)))
1971 return -EFAULT;
1972 return 0;
1973}
1974
1975/*****************************************************************************
1976 * SerialIoctl
1977 * this function handles any ioctl calls to the driver
1978 *****************************************************************************/
1979
1980static int mos7840_ioctl(struct tty_struct *tty,
1981 unsigned int cmd, unsigned long arg)
1982{
1983 struct usb_serial_port *port = tty->driver_data;
1984 void __user *argp = (void __user *)arg;
1985 struct moschip_port *mos7840_port;
1986
1987 if (mos7840_port_paranoia_check(port, __func__))
1988 return -1;
1989
1990 mos7840_port = mos7840_get_port_private(port);
1991
1992 if (mos7840_port == NULL)
1993 return -1;
1994
1995 switch (cmd) {
1996 /* return number of bytes available */
1997
1998 case TIOCSERGETLSR:
1999 dev_dbg(&port->dev, "%s TIOCSERGETLSR\n", __func__);
2000 return mos7840_get_lsr_info(tty, argp);
2001
2002 case TIOCGSERIAL:
2003 dev_dbg(&port->dev, "%s TIOCGSERIAL\n", __func__);
2004 return mos7840_get_serial_info(mos7840_port, argp);
2005
2006 case TIOCSSERIAL:
2007 dev_dbg(&port->dev, "%s TIOCSSERIAL\n", __func__);
2008 break;
2009 default:
2010 break;
2011 }
2012 return -ENOIOCTLCMD;
2013}
2014
2015static int mos7810_check(struct usb_serial *serial)
2016{
2017 int i, pass_count = 0;
2018 u8 *buf;
2019 __u16 data = 0, mcr_data = 0;
2020 __u16 test_pattern = 0x55AA;
2021 int res;
2022
2023 buf = kmalloc(VENDOR_READ_LENGTH, GFP_KERNEL);
2024 if (!buf)
2025 return 0; /* failed to identify 7810 */
2026
2027 /* Store MCR setting */
2028 res = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
2029 MCS_RDREQ, MCS_RD_RTYPE, 0x0300, MODEM_CONTROL_REGISTER,
2030 buf, VENDOR_READ_LENGTH, MOS_WDR_TIMEOUT);
2031 if (res == VENDOR_READ_LENGTH)
2032 mcr_data = *buf;
2033
2034 for (i = 0; i < 16; i++) {
2035 /* Send the 1-bit test pattern out to MCS7810 test pin */
2036 usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
2037 MCS_WRREQ, MCS_WR_RTYPE,
2038 (0x0300 | (((test_pattern >> i) & 0x0001) << 1)),
2039 MODEM_CONTROL_REGISTER, NULL, 0, MOS_WDR_TIMEOUT);
2040
2041 /* Read the test pattern back */
2042 res = usb_control_msg(serial->dev,
2043 usb_rcvctrlpipe(serial->dev, 0), MCS_RDREQ,
2044 MCS_RD_RTYPE, 0, GPIO_REGISTER, buf,
2045 VENDOR_READ_LENGTH, MOS_WDR_TIMEOUT);
2046 if (res == VENDOR_READ_LENGTH)
2047 data = *buf;
2048
2049 /* If this is a MCS7810 device, both test patterns must match */
2050 if (((test_pattern >> i) ^ (~data >> 1)) & 0x0001)
2051 break;
2052
2053 pass_count++;
2054 }
2055
2056 /* Restore MCR setting */
2057 usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0), MCS_WRREQ,
2058 MCS_WR_RTYPE, 0x0300 | mcr_data, MODEM_CONTROL_REGISTER, NULL,
2059 0, MOS_WDR_TIMEOUT);
2060
2061 kfree(buf);
2062
2063 if (pass_count == 16)
2064 return 1;
2065
2066 return 0;
2067}
2068
2069static int mos7840_probe(struct usb_serial *serial,
2070 const struct usb_device_id *id)
2071{
2072 u16 product = le16_to_cpu(serial->dev->descriptor.idProduct);
2073 u16 vid = le16_to_cpu(serial->dev->descriptor.idVendor);
2074 u8 *buf;
2075 int device_type;
2076
2077 if (product == MOSCHIP_DEVICE_ID_7810 ||
2078 product == MOSCHIP_DEVICE_ID_7820) {
2079 device_type = product;
2080 goto out;
2081 }
2082
2083 if (vid == USB_VENDOR_ID_MOXA && product == MOXA_DEVICE_ID_2210) {
2084 device_type = MOSCHIP_DEVICE_ID_7820;
2085 goto out;
2086 }
2087
2088 buf = kzalloc(VENDOR_READ_LENGTH, GFP_KERNEL);
2089 if (!buf)
2090 return -ENOMEM;
2091
2092 usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
2093 MCS_RDREQ, MCS_RD_RTYPE, 0, GPIO_REGISTER, buf,
2094 VENDOR_READ_LENGTH, MOS_WDR_TIMEOUT);
2095
2096 /* For a MCS7840 device GPIO0 must be set to 1 */
2097 if (buf[0] & 0x01)
2098 device_type = MOSCHIP_DEVICE_ID_7840;
2099 else if (mos7810_check(serial))
2100 device_type = MOSCHIP_DEVICE_ID_7810;
2101 else
2102 device_type = MOSCHIP_DEVICE_ID_7820;
2103
2104 kfree(buf);
2105out:
2106 usb_set_serial_data(serial, (void *)(unsigned long)device_type);
2107
2108 return 0;
2109}
2110
2111static int mos7840_calc_num_ports(struct usb_serial *serial,
2112 struct usb_serial_endpoints *epds)
2113{
2114 int device_type = (unsigned long)usb_get_serial_data(serial);
2115 int num_ports;
2116
2117 num_ports = (device_type >> 4) & 0x000F;
2118
2119 /*
2120 * num_ports is currently never zero as device_type is one of
2121 * MOSCHIP_DEVICE_ID_78{1,2,4}0.
2122 */
2123 if (num_ports == 0)
2124 return -ENODEV;
2125
2126 if (epds->num_bulk_in < num_ports || epds->num_bulk_out < num_ports) {
2127 dev_err(&serial->interface->dev, "missing endpoints\n");
2128 return -ENODEV;
2129 }
2130
2131 return num_ports;
2132}
2133
2134static int mos7840_port_probe(struct usb_serial_port *port)
2135{
2136 struct usb_serial *serial = port->serial;
2137 int device_type = (unsigned long)usb_get_serial_data(serial);
2138 struct moschip_port *mos7840_port;
2139 int status;
2140 int pnum;
2141 __u16 Data;
2142
2143 /* we set up the pointers to the endpoints in the mos7840_open *
2144 * function, as the structures aren't created yet. */
2145
2146 pnum = port->port_number;
2147
2148 dev_dbg(&port->dev, "mos7840_startup: configuring port %d\n", pnum);
2149 mos7840_port = kzalloc(sizeof(struct moschip_port), GFP_KERNEL);
2150 if (!mos7840_port)
2151 return -ENOMEM;
2152
2153 /* Initialize all port interrupt end point to port 0 int
2154 * endpoint. Our device has only one interrupt end point
2155 * common to all port */
2156
2157 mos7840_port->port = port;
2158 mos7840_set_port_private(port, mos7840_port);
2159 spin_lock_init(&mos7840_port->pool_lock);
2160
2161 /* minor is not initialised until later by
2162 * usb-serial.c:get_free_serial() and cannot therefore be used
2163 * to index device instances */
2164 mos7840_port->port_num = pnum + 1;
2165 dev_dbg(&port->dev, "port->minor = %d\n", port->minor);
2166 dev_dbg(&port->dev, "mos7840_port->port_num = %d\n", mos7840_port->port_num);
2167
2168 if (mos7840_port->port_num == 1) {
2169 mos7840_port->SpRegOffset = 0x0;
2170 mos7840_port->ControlRegOffset = 0x1;
2171 mos7840_port->DcrRegOffset = 0x4;
2172 } else if ((mos7840_port->port_num == 2) && (serial->num_ports == 4)) {
2173 mos7840_port->SpRegOffset = 0x8;
2174 mos7840_port->ControlRegOffset = 0x9;
2175 mos7840_port->DcrRegOffset = 0x16;
2176 } else if ((mos7840_port->port_num == 2) && (serial->num_ports == 2)) {
2177 mos7840_port->SpRegOffset = 0xa;
2178 mos7840_port->ControlRegOffset = 0xb;
2179 mos7840_port->DcrRegOffset = 0x19;
2180 } else if ((mos7840_port->port_num == 3) && (serial->num_ports == 4)) {
2181 mos7840_port->SpRegOffset = 0xa;
2182 mos7840_port->ControlRegOffset = 0xb;
2183 mos7840_port->DcrRegOffset = 0x19;
2184 } else if ((mos7840_port->port_num == 4) && (serial->num_ports == 4)) {
2185 mos7840_port->SpRegOffset = 0xc;
2186 mos7840_port->ControlRegOffset = 0xd;
2187 mos7840_port->DcrRegOffset = 0x1c;
2188 }
2189 mos7840_dump_serial_port(port, mos7840_port);
2190 mos7840_set_port_private(port, mos7840_port);
2191
2192 /* enable rx_disable bit in control register */
2193 status = mos7840_get_reg_sync(port,
2194 mos7840_port->ControlRegOffset, &Data);
2195 if (status < 0) {
2196 dev_dbg(&port->dev, "Reading ControlReg failed status-0x%x\n", status);
2197 goto out;
2198 } else
2199 dev_dbg(&port->dev, "ControlReg Reading success val is %x, status%d\n", Data, status);
2200 Data |= 0x08; /* setting driver done bit */
2201 Data |= 0x04; /* sp1_bit to have cts change reflect in
2202 modem status reg */
2203
2204 /* Data |= 0x20; //rx_disable bit */
2205 status = mos7840_set_reg_sync(port,
2206 mos7840_port->ControlRegOffset, Data);
2207 if (status < 0) {
2208 dev_dbg(&port->dev, "Writing ControlReg failed(rx_disable) status-0x%x\n", status);
2209 goto out;
2210 } else
2211 dev_dbg(&port->dev, "ControlReg Writing success(rx_disable) status%d\n", status);
2212
2213 /* Write default values in DCR (i.e 0x01 in DCR0, 0x05 in DCR2
2214 and 0x24 in DCR3 */
2215 Data = 0x01;
2216 status = mos7840_set_reg_sync(port,
2217 (__u16) (mos7840_port->DcrRegOffset + 0), Data);
2218 if (status < 0) {
2219 dev_dbg(&port->dev, "Writing DCR0 failed status-0x%x\n", status);
2220 goto out;
2221 } else
2222 dev_dbg(&port->dev, "DCR0 Writing success status%d\n", status);
2223
2224 Data = 0x05;
2225 status = mos7840_set_reg_sync(port,
2226 (__u16) (mos7840_port->DcrRegOffset + 1), Data);
2227 if (status < 0) {
2228 dev_dbg(&port->dev, "Writing DCR1 failed status-0x%x\n", status);
2229 goto out;
2230 } else
2231 dev_dbg(&port->dev, "DCR1 Writing success status%d\n", status);
2232
2233 Data = 0x24;
2234 status = mos7840_set_reg_sync(port,
2235 (__u16) (mos7840_port->DcrRegOffset + 2), Data);
2236 if (status < 0) {
2237 dev_dbg(&port->dev, "Writing DCR2 failed status-0x%x\n", status);
2238 goto out;
2239 } else
2240 dev_dbg(&port->dev, "DCR2 Writing success status%d\n", status);
2241
2242 /* write values in clkstart0x0 and clkmulti 0x20 */
2243 Data = 0x0;
2244 status = mos7840_set_reg_sync(port, CLK_START_VALUE_REGISTER, Data);
2245 if (status < 0) {
2246 dev_dbg(&port->dev, "Writing CLK_START_VALUE_REGISTER failed status-0x%x\n", status);
2247 goto out;
2248 } else
2249 dev_dbg(&port->dev, "CLK_START_VALUE_REGISTER Writing success status%d\n", status);
2250
2251 Data = 0x20;
2252 status = mos7840_set_reg_sync(port, CLK_MULTI_REGISTER, Data);
2253 if (status < 0) {
2254 dev_dbg(&port->dev, "Writing CLK_MULTI_REGISTER failed status-0x%x\n", status);
2255 goto error;
2256 } else
2257 dev_dbg(&port->dev, "CLK_MULTI_REGISTER Writing success status%d\n", status);
2258
2259 /* write value 0x0 to scratchpad register */
2260 Data = 0x00;
2261 status = mos7840_set_uart_reg(port, SCRATCH_PAD_REGISTER, Data);
2262 if (status < 0) {
2263 dev_dbg(&port->dev, "Writing SCRATCH_PAD_REGISTER failed status-0x%x\n", status);
2264 goto out;
2265 } else
2266 dev_dbg(&port->dev, "SCRATCH_PAD_REGISTER Writing success status%d\n", status);
2267
2268 /* Zero Length flag register */
2269 if ((mos7840_port->port_num != 1) && (serial->num_ports == 2)) {
2270 Data = 0xff;
2271 status = mos7840_set_reg_sync(port,
2272 (__u16) (ZLP_REG1 +
2273 ((__u16)mos7840_port->port_num)), Data);
2274 dev_dbg(&port->dev, "ZLIP offset %x\n",
2275 (__u16)(ZLP_REG1 + ((__u16) mos7840_port->port_num)));
2276 if (status < 0) {
2277 dev_dbg(&port->dev, "Writing ZLP_REG%d failed status-0x%x\n", pnum + 2, status);
2278 goto out;
2279 } else
2280 dev_dbg(&port->dev, "ZLP_REG%d Writing success status%d\n", pnum + 2, status);
2281 } else {
2282 Data = 0xff;
2283 status = mos7840_set_reg_sync(port,
2284 (__u16) (ZLP_REG1 +
2285 ((__u16)mos7840_port->port_num) - 0x1), Data);
2286 dev_dbg(&port->dev, "ZLIP offset %x\n",
2287 (__u16)(ZLP_REG1 + ((__u16) mos7840_port->port_num) - 0x1));
2288 if (status < 0) {
2289 dev_dbg(&port->dev, "Writing ZLP_REG%d failed status-0x%x\n", pnum + 1, status);
2290 goto out;
2291 } else
2292 dev_dbg(&port->dev, "ZLP_REG%d Writing success status%d\n", pnum + 1, status);
2293
2294 }
2295 mos7840_port->control_urb = usb_alloc_urb(0, GFP_KERNEL);
2296 mos7840_port->ctrl_buf = kmalloc(16, GFP_KERNEL);
2297 mos7840_port->dr = kmalloc(sizeof(struct usb_ctrlrequest),
2298 GFP_KERNEL);
2299 if (!mos7840_port->control_urb || !mos7840_port->ctrl_buf ||
2300 !mos7840_port->dr) {
2301 status = -ENOMEM;
2302 goto error;
2303 }
2304
2305 mos7840_port->has_led = false;
2306
2307 /* Initialize LED timers */
2308 if (device_type == MOSCHIP_DEVICE_ID_7810) {
2309 mos7840_port->has_led = true;
2310
2311 mos7840_port->led_urb = usb_alloc_urb(0, GFP_KERNEL);
2312 mos7840_port->led_dr = kmalloc(sizeof(*mos7840_port->led_dr),
2313 GFP_KERNEL);
2314 if (!mos7840_port->led_urb || !mos7840_port->led_dr) {
2315 status = -ENOMEM;
2316 goto error;
2317 }
2318
2319 setup_timer(&mos7840_port->led_timer1, mos7840_led_off,
2320 (unsigned long)mos7840_port);
2321 mos7840_port->led_timer1.expires =
2322 jiffies + msecs_to_jiffies(LED_ON_MS);
2323 setup_timer(&mos7840_port->led_timer2, mos7840_led_flag_off,
2324 (unsigned long)mos7840_port);
2325 mos7840_port->led_timer2.expires =
2326 jiffies + msecs_to_jiffies(LED_OFF_MS);
2327
2328 /* Turn off LED */
2329 mos7840_set_led_sync(port, MODEM_CONTROL_REGISTER, 0x0300);
2330 }
2331out:
2332 if (pnum == serial->num_ports - 1) {
2333 /* Zero Length flag enable */
2334 Data = 0x0f;
2335 status = mos7840_set_reg_sync(serial->port[0], ZLP_REG5, Data);
2336 if (status < 0) {
2337 dev_dbg(&port->dev, "Writing ZLP_REG5 failed status-0x%x\n", status);
2338 goto error;
2339 } else
2340 dev_dbg(&port->dev, "ZLP_REG5 Writing success status%d\n", status);
2341 }
2342 return 0;
2343error:
2344 kfree(mos7840_port->led_dr);
2345 usb_free_urb(mos7840_port->led_urb);
2346 kfree(mos7840_port->dr);
2347 kfree(mos7840_port->ctrl_buf);
2348 usb_free_urb(mos7840_port->control_urb);
2349 kfree(mos7840_port);
2350
2351 return status;
2352}
2353
2354static int mos7840_port_remove(struct usb_serial_port *port)
2355{
2356 struct moschip_port *mos7840_port;
2357
2358 mos7840_port = mos7840_get_port_private(port);
2359
2360 if (mos7840_port->has_led) {
2361 /* Turn off LED */
2362 mos7840_set_led_sync(port, MODEM_CONTROL_REGISTER, 0x0300);
2363
2364 del_timer_sync(&mos7840_port->led_timer1);
2365 del_timer_sync(&mos7840_port->led_timer2);
2366
2367 usb_kill_urb(mos7840_port->led_urb);
2368 usb_free_urb(mos7840_port->led_urb);
2369 kfree(mos7840_port->led_dr);
2370 }
2371 usb_kill_urb(mos7840_port->control_urb);
2372 usb_free_urb(mos7840_port->control_urb);
2373 kfree(mos7840_port->ctrl_buf);
2374 kfree(mos7840_port->dr);
2375 kfree(mos7840_port);
2376
2377 return 0;
2378}
2379
2380static struct usb_serial_driver moschip7840_4port_device = {
2381 .driver = {
2382 .owner = THIS_MODULE,
2383 .name = "mos7840",
2384 },
2385 .description = DRIVER_DESC,
2386 .id_table = id_table,
2387 .num_interrupt_in = 1,
2388 .open = mos7840_open,
2389 .close = mos7840_close,
2390 .write = mos7840_write,
2391 .write_room = mos7840_write_room,
2392 .chars_in_buffer = mos7840_chars_in_buffer,
2393 .throttle = mos7840_throttle,
2394 .unthrottle = mos7840_unthrottle,
2395 .calc_num_ports = mos7840_calc_num_ports,
2396 .probe = mos7840_probe,
2397 .ioctl = mos7840_ioctl,
2398 .set_termios = mos7840_set_termios,
2399 .break_ctl = mos7840_break,
2400 .tiocmget = mos7840_tiocmget,
2401 .tiocmset = mos7840_tiocmset,
2402 .tiocmiwait = usb_serial_generic_tiocmiwait,
2403 .get_icount = usb_serial_generic_get_icount,
2404 .port_probe = mos7840_port_probe,
2405 .port_remove = mos7840_port_remove,
2406 .read_bulk_callback = mos7840_bulk_in_callback,
2407 .read_int_callback = mos7840_interrupt_callback,
2408};
2409
2410static struct usb_serial_driver * const serial_drivers[] = {
2411 &moschip7840_4port_device, NULL
2412};
2413
2414module_usb_serial_driver(serial_drivers, id_table);
2415
2416MODULE_DESCRIPTION(DRIVER_DESC);
2417MODULE_LICENSE("GPL");