Version:  2.0.40 2.2.26 2.4.37 3.6 3.7 3.8 3.9 3.10 3.11 3.12 3.13 3.14 3.15 3.16 3.17 3.18 3.19 4.0 4.1 4.2

Linux/drivers/usb/serial/mos7720.c

  1 /*
  2  * mos7720.c
  3  *   Controls the Moschip 7720 usb to dual port serial converter
  4  *
  5  * Copyright 2006 Moschip Semiconductor Tech. Ltd.
  6  *
  7  * This program is free software; you can redistribute it and/or modify
  8  * it under the terms of the GNU General Public License as published by
  9  * the Free Software Foundation, version 2 of the License.
 10  *
 11  * Developed by:
 12  *      Vijaya Kumar <vijaykumar.gn@gmail.com>
 13  *      Ajay Kumar <naanuajay@yahoo.com>
 14  *      Gurudeva <ngurudeva@yahoo.com>
 15  *
 16  * Cleaned up from the original by:
 17  *      Greg Kroah-Hartman <gregkh@suse.de>
 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 #include <linux/kernel.h>
 24 #include <linux/errno.h>
 25 #include <linux/slab.h>
 26 #include <linux/tty.h>
 27 #include <linux/tty_driver.h>
 28 #include <linux/tty_flip.h>
 29 #include <linux/module.h>
 30 #include <linux/spinlock.h>
 31 #include <linux/serial.h>
 32 #include <linux/serial_reg.h>
 33 #include <linux/usb.h>
 34 #include <linux/usb/serial.h>
 35 #include <linux/uaccess.h>
 36 #include <linux/parport.h>
 37 
 38 #define DRIVER_AUTHOR "Aspire Communications pvt Ltd."
 39 #define DRIVER_DESC "Moschip USB Serial Driver"
 40 
 41 /* default urb timeout */
 42 #define MOS_WDR_TIMEOUT 5000
 43 
 44 #define MOS_MAX_PORT    0x02
 45 #define MOS_WRITE       0x0E
 46 #define MOS_READ        0x0D
 47 
 48 /* Interrupt Routines Defines   */
 49 #define SERIAL_IIR_RLS  0x06
 50 #define SERIAL_IIR_RDA  0x04
 51 #define SERIAL_IIR_CTI  0x0c
 52 #define SERIAL_IIR_THR  0x02
 53 #define SERIAL_IIR_MS   0x00
 54 
 55 #define NUM_URBS                        16      /* URB Count */
 56 #define URB_TRANSFER_BUFFER_SIZE        32      /* URB Size */
 57 
 58 /* This structure holds all of the local serial port information */
 59 struct moschip_port {
 60         __u8    shadowLCR;              /* last LCR value received */
 61         __u8    shadowMCR;              /* last MCR value received */
 62         __u8    shadowMSR;              /* last MSR value received */
 63         char                    open;
 64         struct usb_serial_port  *port;  /* loop back to the owner */
 65         struct urb              *write_urb_pool[NUM_URBS];
 66 };
 67 
 68 static struct usb_serial_driver moschip7720_2port_driver;
 69 
 70 #define USB_VENDOR_ID_MOSCHIP           0x9710
 71 #define MOSCHIP_DEVICE_ID_7720          0x7720
 72 #define MOSCHIP_DEVICE_ID_7715          0x7715
 73 
 74 static const struct usb_device_id id_table[] = {
 75         { USB_DEVICE(USB_VENDOR_ID_MOSCHIP, MOSCHIP_DEVICE_ID_7720) },
 76         { USB_DEVICE(USB_VENDOR_ID_MOSCHIP, MOSCHIP_DEVICE_ID_7715) },
 77         { } /* terminating entry */
 78 };
 79 MODULE_DEVICE_TABLE(usb, id_table);
 80 
 81 #ifdef CONFIG_USB_SERIAL_MOS7715_PARPORT
 82 
 83 /* initial values for parport regs */
 84 #define DCR_INIT_VAL       0x0c /* SLCTIN, nINIT */
 85 #define ECR_INIT_VAL       0x00 /* SPP mode */
 86 
 87 struct urbtracker {
 88         struct mos7715_parport  *mos_parport;
 89         struct list_head        urblist_entry;
 90         struct kref             ref_count;
 91         struct urb              *urb;
 92         struct usb_ctrlrequest  *setup;
 93 };
 94 
 95 enum mos7715_pp_modes {
 96         SPP = 0<<5,
 97         PS2 = 1<<5,      /* moschip calls this 'NIBBLE' mode */
 98         PPF = 2<<5,      /* moschip calls this 'CB-FIFO mode */
 99 };
100 
101 struct mos7715_parport {
102         struct parport          *pp;           /* back to containing struct */
103         struct kref             ref_count;     /* to instance of this struct */
104         struct list_head        deferred_urbs; /* list deferred async urbs */
105         struct list_head        active_urbs;   /* list async urbs in flight */
106         spinlock_t              listlock;      /* protects list access */
107         bool                    msg_pending;   /* usb sync call pending */
108         struct completion       syncmsg_compl; /* usb sync call completed */
109         struct tasklet_struct   urb_tasklet;   /* for sending deferred urbs */
110         struct usb_serial       *serial;       /* back to containing struct */
111         __u8                    shadowECR;     /* parallel port regs... */
112         __u8                    shadowDCR;
113         atomic_t                shadowDSR;     /* updated in int-in callback */
114 };
115 
116 /* lock guards against dereferencing NULL ptr in parport ops callbacks */
117 static DEFINE_SPINLOCK(release_lock);
118 
119 #endif  /* CONFIG_USB_SERIAL_MOS7715_PARPORT */
120 
121 static const unsigned int dummy; /* for clarity in register access fns */
122 
123 enum mos_regs {
124         MOS7720_THR,              /* serial port regs */
125         MOS7720_RHR,
126         MOS7720_IER,
127         MOS7720_FCR,
128         MOS7720_ISR,
129         MOS7720_LCR,
130         MOS7720_MCR,
131         MOS7720_LSR,
132         MOS7720_MSR,
133         MOS7720_SPR,
134         MOS7720_DLL,
135         MOS7720_DLM,
136         MOS7720_DPR,              /* parallel port regs */
137         MOS7720_DSR,
138         MOS7720_DCR,
139         MOS7720_ECR,
140         MOS7720_SP1_REG,          /* device control regs */
141         MOS7720_SP2_REG,          /* serial port 2 (7720 only) */
142         MOS7720_PP_REG,
143         MOS7720_SP_CONTROL_REG,
144 };
145 
146 /*
147  * Return the correct value for the Windex field of the setup packet
148  * for a control endpoint message.  See the 7715 datasheet.
149  */
150 static inline __u16 get_reg_index(enum mos_regs reg)
151 {
152         static const __u16 mos7715_index_lookup_table[] = {
153                 0x00,           /* MOS7720_THR */
154                 0x00,           /* MOS7720_RHR */
155                 0x01,           /* MOS7720_IER */
156                 0x02,           /* MOS7720_FCR */
157                 0x02,           /* MOS7720_ISR */
158                 0x03,           /* MOS7720_LCR */
159                 0x04,           /* MOS7720_MCR */
160                 0x05,           /* MOS7720_LSR */
161                 0x06,           /* MOS7720_MSR */
162                 0x07,           /* MOS7720_SPR */
163                 0x00,           /* MOS7720_DLL */
164                 0x01,           /* MOS7720_DLM */
165                 0x00,           /* MOS7720_DPR */
166                 0x01,           /* MOS7720_DSR */
167                 0x02,           /* MOS7720_DCR */
168                 0x0a,           /* MOS7720_ECR */
169                 0x01,           /* MOS7720_SP1_REG */
170                 0x02,           /* MOS7720_SP2_REG (7720 only) */
171                 0x04,           /* MOS7720_PP_REG (7715 only) */
172                 0x08,           /* MOS7720_SP_CONTROL_REG */
173         };
174         return mos7715_index_lookup_table[reg];
175 }
176 
177 /*
178  * Return the correct value for the upper byte of the Wvalue field of
179  * the setup packet for a control endpoint message.
180  */
181 static inline __u16 get_reg_value(enum mos_regs reg,
182                                   unsigned int serial_portnum)
183 {
184         if (reg >= MOS7720_SP1_REG)     /* control reg */
185                 return 0x0000;
186 
187         else if (reg >= MOS7720_DPR)    /* parallel port reg (7715 only) */
188                 return 0x0100;
189 
190         else                          /* serial port reg */
191                 return (serial_portnum + 2) << 8;
192 }
193 
194 /*
195  * Write data byte to the specified device register.  The data is embedded in
196  * the value field of the setup packet. serial_portnum is ignored for registers
197  * not specific to a particular serial port.
198  */
199 static int write_mos_reg(struct usb_serial *serial, unsigned int serial_portnum,
200                          enum mos_regs reg, __u8 data)
201 {
202         struct usb_device *usbdev = serial->dev;
203         unsigned int pipe = usb_sndctrlpipe(usbdev, 0);
204         __u8 request = (__u8)0x0e;
205         __u8 requesttype = (__u8)0x40;
206         __u16 index = get_reg_index(reg);
207         __u16 value = get_reg_value(reg, serial_portnum) + data;
208         int status = usb_control_msg(usbdev, pipe, request, requesttype, value,
209                                      index, NULL, 0, MOS_WDR_TIMEOUT);
210         if (status < 0)
211                 dev_err(&usbdev->dev,
212                         "mos7720: usb_control_msg() failed: %d\n", status);
213         return status;
214 }
215 
216 /*
217  * Read data byte from the specified device register.  The data returned by the
218  * device is embedded in the value field of the setup packet.  serial_portnum is
219  * ignored for registers that are not specific to a particular serial port.
220  */
221 static int read_mos_reg(struct usb_serial *serial, unsigned int serial_portnum,
222                         enum mos_regs reg, __u8 *data)
223 {
224         struct usb_device *usbdev = serial->dev;
225         unsigned int pipe = usb_rcvctrlpipe(usbdev, 0);
226         __u8 request = (__u8)0x0d;
227         __u8 requesttype = (__u8)0xc0;
228         __u16 index = get_reg_index(reg);
229         __u16 value = get_reg_value(reg, serial_portnum);
230         u8 *buf;
231         int status;
232 
233         buf = kmalloc(1, GFP_KERNEL);
234         if (!buf)
235                 return -ENOMEM;
236 
237         status = usb_control_msg(usbdev, pipe, request, requesttype, value,
238                                      index, buf, 1, MOS_WDR_TIMEOUT);
239         if (status == 1)
240                 *data = *buf;
241         else if (status < 0)
242                 dev_err(&usbdev->dev,
243                         "mos7720: usb_control_msg() failed: %d\n", status);
244         kfree(buf);
245 
246         return status;
247 }
248 
249 #ifdef CONFIG_USB_SERIAL_MOS7715_PARPORT
250 
251 static inline int mos7715_change_mode(struct mos7715_parport *mos_parport,
252                                       enum mos7715_pp_modes mode)
253 {
254         mos_parport->shadowECR = mode;
255         write_mos_reg(mos_parport->serial, dummy, MOS7720_ECR,
256                       mos_parport->shadowECR);
257         return 0;
258 }
259 
260 static void destroy_mos_parport(struct kref *kref)
261 {
262         struct mos7715_parport *mos_parport =
263                 container_of(kref, struct mos7715_parport, ref_count);
264 
265         kfree(mos_parport);
266 }
267 
268 static void destroy_urbtracker(struct kref *kref)
269 {
270         struct urbtracker *urbtrack =
271                 container_of(kref, struct urbtracker, ref_count);
272         struct mos7715_parport *mos_parport = urbtrack->mos_parport;
273 
274         usb_free_urb(urbtrack->urb);
275         kfree(urbtrack->setup);
276         kfree(urbtrack);
277         kref_put(&mos_parport->ref_count, destroy_mos_parport);
278 }
279 
280 /*
281  * This runs as a tasklet when sending an urb in a non-blocking parallel
282  * port callback had to be deferred because the disconnect mutex could not be
283  * obtained at the time.
284  */
285 static void send_deferred_urbs(unsigned long _mos_parport)
286 {
287         int ret_val;
288         unsigned long flags;
289         struct mos7715_parport *mos_parport = (void *)_mos_parport;
290         struct urbtracker *urbtrack, *tmp;
291         struct list_head *cursor, *next;
292         struct device *dev;
293 
294         /* if release function ran, game over */
295         if (unlikely(mos_parport->serial == NULL))
296                 return;
297 
298         dev = &mos_parport->serial->dev->dev;
299 
300         /* try again to get the mutex */
301         if (!mutex_trylock(&mos_parport->serial->disc_mutex)) {
302                 dev_dbg(dev, "%s: rescheduling tasklet\n", __func__);
303                 tasklet_schedule(&mos_parport->urb_tasklet);
304                 return;
305         }
306 
307         /* if device disconnected, game over */
308         if (unlikely(mos_parport->serial->disconnected)) {
309                 mutex_unlock(&mos_parport->serial->disc_mutex);
310                 return;
311         }
312 
313         spin_lock_irqsave(&mos_parport->listlock, flags);
314         if (list_empty(&mos_parport->deferred_urbs)) {
315                 spin_unlock_irqrestore(&mos_parport->listlock, flags);
316                 mutex_unlock(&mos_parport->serial->disc_mutex);
317                 dev_dbg(dev, "%s: deferred_urbs list empty\n", __func__);
318                 return;
319         }
320 
321         /* move contents of deferred_urbs list to active_urbs list and submit */
322         list_for_each_safe(cursor, next, &mos_parport->deferred_urbs)
323                 list_move_tail(cursor, &mos_parport->active_urbs);
324         list_for_each_entry_safe(urbtrack, tmp, &mos_parport->active_urbs,
325                             urblist_entry) {
326                 ret_val = usb_submit_urb(urbtrack->urb, GFP_ATOMIC);
327                 dev_dbg(dev, "%s: urb submitted\n", __func__);
328                 if (ret_val) {
329                         dev_err(dev, "usb_submit_urb() failed: %d\n", ret_val);
330                         list_del(&urbtrack->urblist_entry);
331                         kref_put(&urbtrack->ref_count, destroy_urbtracker);
332                 }
333         }
334         spin_unlock_irqrestore(&mos_parport->listlock, flags);
335         mutex_unlock(&mos_parport->serial->disc_mutex);
336 }
337 
338 /* callback for parallel port control urbs submitted asynchronously */
339 static void async_complete(struct urb *urb)
340 {
341         struct urbtracker *urbtrack = urb->context;
342         int status = urb->status;
343 
344         if (unlikely(status))
345                 dev_dbg(&urb->dev->dev, "%s - nonzero urb status received: %d\n", __func__, status);
346 
347         /* remove the urbtracker from the active_urbs list */
348         spin_lock(&urbtrack->mos_parport->listlock);
349         list_del(&urbtrack->urblist_entry);
350         spin_unlock(&urbtrack->mos_parport->listlock);
351         kref_put(&urbtrack->ref_count, destroy_urbtracker);
352 }
353 
354 static int write_parport_reg_nonblock(struct mos7715_parport *mos_parport,
355                                       enum mos_regs reg, __u8 data)
356 {
357         struct urbtracker *urbtrack;
358         int ret_val;
359         unsigned long flags;
360         struct usb_serial *serial = mos_parport->serial;
361         struct usb_device *usbdev = serial->dev;
362 
363         /* create and initialize the control urb and containing urbtracker */
364         urbtrack = kmalloc(sizeof(struct urbtracker), GFP_ATOMIC);
365         if (!urbtrack)
366                 return -ENOMEM;
367 
368         kref_get(&mos_parport->ref_count);
369         urbtrack->mos_parport = mos_parport;
370         urbtrack->urb = usb_alloc_urb(0, GFP_ATOMIC);
371         if (!urbtrack->urb) {
372                 kfree(urbtrack);
373                 return -ENOMEM;
374         }
375         urbtrack->setup = kmalloc(sizeof(*urbtrack->setup), GFP_ATOMIC);
376         if (!urbtrack->setup) {
377                 usb_free_urb(urbtrack->urb);
378                 kfree(urbtrack);
379                 return -ENOMEM;
380         }
381         urbtrack->setup->bRequestType = (__u8)0x40;
382         urbtrack->setup->bRequest = (__u8)0x0e;
383         urbtrack->setup->wValue = cpu_to_le16(get_reg_value(reg, dummy));
384         urbtrack->setup->wIndex = cpu_to_le16(get_reg_index(reg));
385         urbtrack->setup->wLength = 0;
386         usb_fill_control_urb(urbtrack->urb, usbdev,
387                              usb_sndctrlpipe(usbdev, 0),
388                              (unsigned char *)urbtrack->setup,
389                              NULL, 0, async_complete, urbtrack);
390         kref_init(&urbtrack->ref_count);
391         INIT_LIST_HEAD(&urbtrack->urblist_entry);
392 
393         /*
394          * get the disconnect mutex, or add tracker to the deferred_urbs list
395          * and schedule a tasklet to try again later
396          */
397         if (!mutex_trylock(&serial->disc_mutex)) {
398                 spin_lock_irqsave(&mos_parport->listlock, flags);
399                 list_add_tail(&urbtrack->urblist_entry,
400                               &mos_parport->deferred_urbs);
401                 spin_unlock_irqrestore(&mos_parport->listlock, flags);
402                 tasklet_schedule(&mos_parport->urb_tasklet);
403                 dev_dbg(&usbdev->dev, "tasklet scheduled\n");
404                 return 0;
405         }
406 
407         /* bail if device disconnected */
408         if (serial->disconnected) {
409                 kref_put(&urbtrack->ref_count, destroy_urbtracker);
410                 mutex_unlock(&serial->disc_mutex);
411                 return -ENODEV;
412         }
413 
414         /* add the tracker to the active_urbs list and submit */
415         spin_lock_irqsave(&mos_parport->listlock, flags);
416         list_add_tail(&urbtrack->urblist_entry, &mos_parport->active_urbs);
417         spin_unlock_irqrestore(&mos_parport->listlock, flags);
418         ret_val = usb_submit_urb(urbtrack->urb, GFP_ATOMIC);
419         mutex_unlock(&serial->disc_mutex);
420         if (ret_val) {
421                 dev_err(&usbdev->dev,
422                         "%s: submit_urb() failed: %d\n", __func__, ret_val);
423                 spin_lock_irqsave(&mos_parport->listlock, flags);
424                 list_del(&urbtrack->urblist_entry);
425                 spin_unlock_irqrestore(&mos_parport->listlock, flags);
426                 kref_put(&urbtrack->ref_count, destroy_urbtracker);
427                 return ret_val;
428         }
429         return 0;
430 }
431 
432 /*
433  * This is the the common top part of all parallel port callback operations that
434  * send synchronous messages to the device.  This implements convoluted locking
435  * that avoids two scenarios: (1) a port operation is called after usbserial
436  * has called our release function, at which point struct mos7715_parport has
437  * been destroyed, and (2) the device has been disconnected, but usbserial has
438  * not called the release function yet because someone has a serial port open.
439  * The shared release_lock prevents the first, and the mutex and disconnected
440  * flag maintained by usbserial covers the second.  We also use the msg_pending
441  * flag to ensure that all synchronous usb message calls have completed before
442  * our release function can return.
443  */
444 static int parport_prologue(struct parport *pp)
445 {
446         struct mos7715_parport *mos_parport;
447 
448         spin_lock(&release_lock);
449         mos_parport = pp->private_data;
450         if (unlikely(mos_parport == NULL)) {
451                 /* release fn called, port struct destroyed */
452                 spin_unlock(&release_lock);
453                 return -1;
454         }
455         mos_parport->msg_pending = true;   /* synch usb call pending */
456         reinit_completion(&mos_parport->syncmsg_compl);
457         spin_unlock(&release_lock);
458 
459         mutex_lock(&mos_parport->serial->disc_mutex);
460         if (mos_parport->serial->disconnected) {
461                 /* device disconnected */
462                 mutex_unlock(&mos_parport->serial->disc_mutex);
463                 mos_parport->msg_pending = false;
464                 complete(&mos_parport->syncmsg_compl);
465                 return -1;
466         }
467 
468         return 0;
469 }
470 
471 /*
472  * This is the common bottom part of all parallel port functions that send
473  * synchronous messages to the device.
474  */
475 static inline void parport_epilogue(struct parport *pp)
476 {
477         struct mos7715_parport *mos_parport = pp->private_data;
478         mutex_unlock(&mos_parport->serial->disc_mutex);
479         mos_parport->msg_pending = false;
480         complete(&mos_parport->syncmsg_compl);
481 }
482 
483 static void parport_mos7715_write_data(struct parport *pp, unsigned char d)
484 {
485         struct mos7715_parport *mos_parport = pp->private_data;
486 
487         if (parport_prologue(pp) < 0)
488                 return;
489         mos7715_change_mode(mos_parport, SPP);
490         write_mos_reg(mos_parport->serial, dummy, MOS7720_DPR, (__u8)d);
491         parport_epilogue(pp);
492 }
493 
494 static unsigned char parport_mos7715_read_data(struct parport *pp)
495 {
496         struct mos7715_parport *mos_parport = pp->private_data;
497         unsigned char d;
498 
499         if (parport_prologue(pp) < 0)
500                 return 0;
501         read_mos_reg(mos_parport->serial, dummy, MOS7720_DPR, &d);
502         parport_epilogue(pp);
503         return d;
504 }
505 
506 static void parport_mos7715_write_control(struct parport *pp, unsigned char d)
507 {
508         struct mos7715_parport *mos_parport = pp->private_data;
509         __u8 data;
510 
511         if (parport_prologue(pp) < 0)
512                 return;
513         data = ((__u8)d & 0x0f) | (mos_parport->shadowDCR & 0xf0);
514         write_mos_reg(mos_parport->serial, dummy, MOS7720_DCR, data);
515         mos_parport->shadowDCR = data;
516         parport_epilogue(pp);
517 }
518 
519 static unsigned char parport_mos7715_read_control(struct parport *pp)
520 {
521         struct mos7715_parport *mos_parport = pp->private_data;
522         __u8 dcr;
523 
524         spin_lock(&release_lock);
525         mos_parport = pp->private_data;
526         if (unlikely(mos_parport == NULL)) {
527                 spin_unlock(&release_lock);
528                 return 0;
529         }
530         dcr = mos_parport->shadowDCR & 0x0f;
531         spin_unlock(&release_lock);
532         return dcr;
533 }
534 
535 static unsigned char parport_mos7715_frob_control(struct parport *pp,
536                                                   unsigned char mask,
537                                                   unsigned char val)
538 {
539         struct mos7715_parport *mos_parport = pp->private_data;
540         __u8 dcr;
541 
542         mask &= 0x0f;
543         val &= 0x0f;
544         if (parport_prologue(pp) < 0)
545                 return 0;
546         mos_parport->shadowDCR = (mos_parport->shadowDCR & (~mask)) ^ val;
547         write_mos_reg(mos_parport->serial, dummy, MOS7720_DCR,
548                       mos_parport->shadowDCR);
549         dcr = mos_parport->shadowDCR & 0x0f;
550         parport_epilogue(pp);
551         return dcr;
552 }
553 
554 static unsigned char parport_mos7715_read_status(struct parport *pp)
555 {
556         unsigned char status;
557         struct mos7715_parport *mos_parport = pp->private_data;
558 
559         spin_lock(&release_lock);
560         mos_parport = pp->private_data;
561         if (unlikely(mos_parport == NULL)) {    /* release called */
562                 spin_unlock(&release_lock);
563                 return 0;
564         }
565         status = atomic_read(&mos_parport->shadowDSR) & 0xf8;
566         spin_unlock(&release_lock);
567         return status;
568 }
569 
570 static void parport_mos7715_enable_irq(struct parport *pp)
571 {
572 }
573 
574 static void parport_mos7715_disable_irq(struct parport *pp)
575 {
576 }
577 
578 static void parport_mos7715_data_forward(struct parport *pp)
579 {
580         struct mos7715_parport *mos_parport = pp->private_data;
581 
582         if (parport_prologue(pp) < 0)
583                 return;
584         mos7715_change_mode(mos_parport, PS2);
585         mos_parport->shadowDCR &=  ~0x20;
586         write_mos_reg(mos_parport->serial, dummy, MOS7720_DCR,
587                       mos_parport->shadowDCR);
588         parport_epilogue(pp);
589 }
590 
591 static void parport_mos7715_data_reverse(struct parport *pp)
592 {
593         struct mos7715_parport *mos_parport = pp->private_data;
594 
595         if (parport_prologue(pp) < 0)
596                 return;
597         mos7715_change_mode(mos_parport, PS2);
598         mos_parport->shadowDCR |= 0x20;
599         write_mos_reg(mos_parport->serial, dummy, MOS7720_DCR,
600                       mos_parport->shadowDCR);
601         parport_epilogue(pp);
602 }
603 
604 static void parport_mos7715_init_state(struct pardevice *dev,
605                                        struct parport_state *s)
606 {
607         s->u.pc.ctr = DCR_INIT_VAL;
608         s->u.pc.ecr = ECR_INIT_VAL;
609 }
610 
611 /* N.B. Parport core code requires that this function not block */
612 static void parport_mos7715_save_state(struct parport *pp,
613                                        struct parport_state *s)
614 {
615         struct mos7715_parport *mos_parport;
616 
617         spin_lock(&release_lock);
618         mos_parport = pp->private_data;
619         if (unlikely(mos_parport == NULL)) {    /* release called */
620                 spin_unlock(&release_lock);
621                 return;
622         }
623         s->u.pc.ctr = mos_parport->shadowDCR;
624         s->u.pc.ecr = mos_parport->shadowECR;
625         spin_unlock(&release_lock);
626 }
627 
628 /* N.B. Parport core code requires that this function not block */
629 static void parport_mos7715_restore_state(struct parport *pp,
630                                           struct parport_state *s)
631 {
632         struct mos7715_parport *mos_parport;
633 
634         spin_lock(&release_lock);
635         mos_parport = pp->private_data;
636         if (unlikely(mos_parport == NULL)) {    /* release called */
637                 spin_unlock(&release_lock);
638                 return;
639         }
640         write_parport_reg_nonblock(mos_parport, MOS7720_DCR,
641                                    mos_parport->shadowDCR);
642         write_parport_reg_nonblock(mos_parport, MOS7720_ECR,
643                                    mos_parport->shadowECR);
644         spin_unlock(&release_lock);
645 }
646 
647 static size_t parport_mos7715_write_compat(struct parport *pp,
648                                            const void *buffer,
649                                            size_t len, int flags)
650 {
651         int retval;
652         struct mos7715_parport *mos_parport = pp->private_data;
653         int actual_len;
654 
655         if (parport_prologue(pp) < 0)
656                 return 0;
657         mos7715_change_mode(mos_parport, PPF);
658         retval = usb_bulk_msg(mos_parport->serial->dev,
659                               usb_sndbulkpipe(mos_parport->serial->dev, 2),
660                               (void *)buffer, len, &actual_len,
661                               MOS_WDR_TIMEOUT);
662         parport_epilogue(pp);
663         if (retval) {
664                 dev_err(&mos_parport->serial->dev->dev,
665                         "mos7720: usb_bulk_msg() failed: %d\n", retval);
666                 return 0;
667         }
668         return actual_len;
669 }
670 
671 static struct parport_operations parport_mos7715_ops = {
672         .owner =                THIS_MODULE,
673         .write_data =           parport_mos7715_write_data,
674         .read_data =            parport_mos7715_read_data,
675 
676         .write_control =        parport_mos7715_write_control,
677         .read_control =         parport_mos7715_read_control,
678         .frob_control =         parport_mos7715_frob_control,
679 
680         .read_status =          parport_mos7715_read_status,
681 
682         .enable_irq =           parport_mos7715_enable_irq,
683         .disable_irq =          parport_mos7715_disable_irq,
684 
685         .data_forward =         parport_mos7715_data_forward,
686         .data_reverse =         parport_mos7715_data_reverse,
687 
688         .init_state =           parport_mos7715_init_state,
689         .save_state =           parport_mos7715_save_state,
690         .restore_state =        parport_mos7715_restore_state,
691 
692         .compat_write_data =    parport_mos7715_write_compat,
693 
694         .nibble_read_data =     parport_ieee1284_read_nibble,
695         .byte_read_data =       parport_ieee1284_read_byte,
696 };
697 
698 /*
699  * Allocate and initialize parallel port control struct, initialize
700  * the parallel port hardware device, and register with the parport subsystem.
701  */
702 static int mos7715_parport_init(struct usb_serial *serial)
703 {
704         struct mos7715_parport *mos_parport;
705 
706         /* allocate and initialize parallel port control struct */
707         mos_parport = kzalloc(sizeof(struct mos7715_parport), GFP_KERNEL);
708         if (!mos_parport)
709                 return -ENOMEM;
710 
711         mos_parport->msg_pending = false;
712         kref_init(&mos_parport->ref_count);
713         spin_lock_init(&mos_parport->listlock);
714         INIT_LIST_HEAD(&mos_parport->active_urbs);
715         INIT_LIST_HEAD(&mos_parport->deferred_urbs);
716         usb_set_serial_data(serial, mos_parport); /* hijack private pointer */
717         mos_parport->serial = serial;
718         tasklet_init(&mos_parport->urb_tasklet, send_deferred_urbs,
719                      (unsigned long) mos_parport);
720         init_completion(&mos_parport->syncmsg_compl);
721 
722         /* cycle parallel port reset bit */
723         write_mos_reg(mos_parport->serial, dummy, MOS7720_PP_REG, (__u8)0x80);
724         write_mos_reg(mos_parport->serial, dummy, MOS7720_PP_REG, (__u8)0x00);
725 
726         /* initialize device registers */
727         mos_parport->shadowDCR = DCR_INIT_VAL;
728         write_mos_reg(mos_parport->serial, dummy, MOS7720_DCR,
729                       mos_parport->shadowDCR);
730         mos_parport->shadowECR = ECR_INIT_VAL;
731         write_mos_reg(mos_parport->serial, dummy, MOS7720_ECR,
732                       mos_parport->shadowECR);
733 
734         /* register with parport core */
735         mos_parport->pp = parport_register_port(0, PARPORT_IRQ_NONE,
736                                                 PARPORT_DMA_NONE,
737                                                 &parport_mos7715_ops);
738         if (mos_parport->pp == NULL) {
739                 dev_err(&serial->interface->dev,
740                         "Could not register parport\n");
741                 kref_put(&mos_parport->ref_count, destroy_mos_parport);
742                 return -EIO;
743         }
744         mos_parport->pp->private_data = mos_parport;
745         mos_parport->pp->modes = PARPORT_MODE_COMPAT | PARPORT_MODE_PCSPP;
746         mos_parport->pp->dev = &serial->interface->dev;
747         parport_announce_port(mos_parport->pp);
748 
749         return 0;
750 }
751 #endif  /* CONFIG_USB_SERIAL_MOS7715_PARPORT */
752 
753 /*
754  * mos7720_interrupt_callback
755  *      this is the callback function for when we have received data on the
756  *      interrupt endpoint.
757  */
758 static void mos7720_interrupt_callback(struct urb *urb)
759 {
760         int result;
761         int length;
762         int status = urb->status;
763         struct device *dev = &urb->dev->dev;
764         __u8 *data;
765         __u8 sp1;
766         __u8 sp2;
767 
768         switch (status) {
769         case 0:
770                 /* success */
771                 break;
772         case -ECONNRESET:
773         case -ENOENT:
774         case -ESHUTDOWN:
775                 /* this urb is terminated, clean up */
776                 dev_dbg(dev, "%s - urb shutting down with status: %d\n", __func__, status);
777                 return;
778         default:
779                 dev_dbg(dev, "%s - nonzero urb status received: %d\n", __func__, status);
780                 goto exit;
781         }
782 
783         length = urb->actual_length;
784         data = urb->transfer_buffer;
785 
786         /* Moschip get 4 bytes
787          * Byte 1 IIR Port 1 (port.number is 0)
788          * Byte 2 IIR Port 2 (port.number is 1)
789          * Byte 3 --------------
790          * Byte 4 FIFO status for both */
791 
792         /* the above description is inverted
793          *      oneukum 2007-03-14 */
794 
795         if (unlikely(length != 4)) {
796                 dev_dbg(dev, "Wrong data !!!\n");
797                 return;
798         }
799 
800         sp1 = data[3];
801         sp2 = data[2];
802 
803         if ((sp1 | sp2) & 0x01) {
804                 /* No Interrupt Pending in both the ports */
805                 dev_dbg(dev, "No Interrupt !!!\n");
806         } else {
807                 switch (sp1 & 0x0f) {
808                 case SERIAL_IIR_RLS:
809                         dev_dbg(dev, "Serial Port 1: Receiver status error or address bit detected in 9-bit mode\n");
810                         break;
811                 case SERIAL_IIR_CTI:
812                         dev_dbg(dev, "Serial Port 1: Receiver time out\n");
813                         break;
814                 case SERIAL_IIR_MS:
815                         /* dev_dbg(dev, "Serial Port 1: Modem status change\n"); */
816                         break;
817                 }
818 
819                 switch (sp2 & 0x0f) {
820                 case SERIAL_IIR_RLS:
821                         dev_dbg(dev, "Serial Port 2: Receiver status error or address bit detected in 9-bit mode\n");
822                         break;
823                 case SERIAL_IIR_CTI:
824                         dev_dbg(dev, "Serial Port 2: Receiver time out\n");
825                         break;
826                 case SERIAL_IIR_MS:
827                         /* dev_dbg(dev, "Serial Port 2: Modem status change\n"); */
828                         break;
829                 }
830         }
831 
832 exit:
833         result = usb_submit_urb(urb, GFP_ATOMIC);
834         if (result)
835                 dev_err(dev, "%s - Error %d submitting control urb\n", __func__, result);
836 }
837 
838 /*
839  * mos7715_interrupt_callback
840  *      this is the 7715's callback function for when we have received data on
841  *      the interrupt endpoint.
842  */
843 static void mos7715_interrupt_callback(struct urb *urb)
844 {
845         int result;
846         int length;
847         int status = urb->status;
848         struct device *dev = &urb->dev->dev;
849         __u8 *data;
850         __u8 iir;
851 
852         switch (status) {
853         case 0:
854                 /* success */
855                 break;
856         case -ECONNRESET:
857         case -ENOENT:
858         case -ESHUTDOWN:
859         case -ENODEV:
860                 /* this urb is terminated, clean up */
861                 dev_dbg(dev, "%s - urb shutting down with status: %d\n", __func__, status);
862                 return;
863         default:
864                 dev_dbg(dev, "%s - nonzero urb status received: %d\n", __func__, status);
865                 goto exit;
866         }
867 
868         length = urb->actual_length;
869         data = urb->transfer_buffer;
870 
871         /* Structure of data from 7715 device:
872          * Byte 1: IIR serial Port
873          * Byte 2: unused
874          * Byte 2: DSR parallel port
875          * Byte 4: FIFO status for both */
876 
877         if (unlikely(length != 4)) {
878                 dev_dbg(dev, "Wrong data !!!\n");
879                 return;
880         }
881 
882         iir = data[0];
883         if (!(iir & 0x01)) {    /* serial port interrupt pending */
884                 switch (iir & 0x0f) {
885                 case SERIAL_IIR_RLS:
886                         dev_dbg(dev, "Serial Port: Receiver status error or address bit detected in 9-bit mode\n");
887                         break;
888                 case SERIAL_IIR_CTI:
889                         dev_dbg(dev, "Serial Port: Receiver time out\n");
890                         break;
891                 case SERIAL_IIR_MS:
892                         /* dev_dbg(dev, "Serial Port: Modem status change\n"); */
893                         break;
894                 }
895         }
896 
897 #ifdef CONFIG_USB_SERIAL_MOS7715_PARPORT
898         {       /* update local copy of DSR reg */
899                 struct usb_serial_port *port = urb->context;
900                 struct mos7715_parport *mos_parport = port->serial->private;
901                 if (unlikely(mos_parport == NULL))
902                         return;
903                 atomic_set(&mos_parport->shadowDSR, data[2]);
904         }
905 #endif
906 
907 exit:
908         result = usb_submit_urb(urb, GFP_ATOMIC);
909         if (result)
910                 dev_err(dev, "%s - Error %d submitting control urb\n", __func__, result);
911 }
912 
913 /*
914  * mos7720_bulk_in_callback
915  *      this is the callback function for when we have received data on the
916  *      bulk in endpoint.
917  */
918 static void mos7720_bulk_in_callback(struct urb *urb)
919 {
920         int retval;
921         unsigned char *data ;
922         struct usb_serial_port *port;
923         int status = urb->status;
924 
925         if (status) {
926                 dev_dbg(&urb->dev->dev, "nonzero read bulk status received: %d\n", status);
927                 return;
928         }
929 
930         port = urb->context;
931 
932         dev_dbg(&port->dev, "Entering...%s\n", __func__);
933 
934         data = urb->transfer_buffer;
935 
936         if (urb->actual_length) {
937                 tty_insert_flip_string(&port->port, data, urb->actual_length);
938                 tty_flip_buffer_push(&port->port);
939         }
940 
941         if (port->read_urb->status != -EINPROGRESS) {
942                 retval = usb_submit_urb(port->read_urb, GFP_ATOMIC);
943                 if (retval)
944                         dev_dbg(&port->dev, "usb_submit_urb(read bulk) failed, retval = %d\n", retval);
945         }
946 }
947 
948 /*
949  * mos7720_bulk_out_data_callback
950  *      this is the callback function for when we have finished sending serial
951  *      data on the bulk out endpoint.
952  */
953 static void mos7720_bulk_out_data_callback(struct urb *urb)
954 {
955         struct moschip_port *mos7720_port;
956         int status = urb->status;
957 
958         if (status) {
959                 dev_dbg(&urb->dev->dev, "nonzero write bulk status received:%d\n", status);
960                 return;
961         }
962 
963         mos7720_port = urb->context;
964         if (!mos7720_port) {
965                 dev_dbg(&urb->dev->dev, "NULL mos7720_port pointer\n");
966                 return ;
967         }
968 
969         if (mos7720_port->open)
970                 tty_port_tty_wakeup(&mos7720_port->port->port);
971 }
972 
973 /*
974  * mos77xx_probe
975  *      this function installs the appropriate read interrupt endpoint callback
976  *      depending on whether the device is a 7720 or 7715, thus avoiding costly
977  *      run-time checks in the high-frequency callback routine itself.
978  */
979 static int mos77xx_probe(struct usb_serial *serial,
980                          const struct usb_device_id *id)
981 {
982         if (id->idProduct == MOSCHIP_DEVICE_ID_7715)
983                 moschip7720_2port_driver.read_int_callback =
984                         mos7715_interrupt_callback;
985         else
986                 moschip7720_2port_driver.read_int_callback =
987                         mos7720_interrupt_callback;
988 
989         return 0;
990 }
991 
992 static int mos77xx_calc_num_ports(struct usb_serial *serial)
993 {
994         u16 product = le16_to_cpu(serial->dev->descriptor.idProduct);
995         if (product == MOSCHIP_DEVICE_ID_7715)
996                 return 1;
997 
998         return 2;
999 }
1000 
1001 static int mos7720_open(struct tty_struct *tty, struct usb_serial_port *port)
1002 {
1003         struct usb_serial *serial;
1004         struct urb *urb;
1005         struct moschip_port *mos7720_port;
1006         int response;
1007         int port_number;
1008         __u8 data;
1009         int allocated_urbs = 0;
1010         int j;
1011 
1012         serial = port->serial;
1013 
1014         mos7720_port = usb_get_serial_port_data(port);
1015         if (mos7720_port == NULL)
1016                 return -ENODEV;
1017 
1018         usb_clear_halt(serial->dev, port->write_urb->pipe);
1019         usb_clear_halt(serial->dev, port->read_urb->pipe);
1020 
1021         /* Initialising the write urb pool */
1022         for (j = 0; j < NUM_URBS; ++j) {
1023                 urb = usb_alloc_urb(0, GFP_KERNEL);
1024                 mos7720_port->write_urb_pool[j] = urb;
1025                 if (!urb)
1026                         continue;
1027 
1028                 urb->transfer_buffer = kmalloc(URB_TRANSFER_BUFFER_SIZE,
1029                                                GFP_KERNEL);
1030                 if (!urb->transfer_buffer) {
1031                         usb_free_urb(mos7720_port->write_urb_pool[j]);
1032                         mos7720_port->write_urb_pool[j] = NULL;
1033                         continue;
1034                 }
1035                 allocated_urbs++;
1036         }
1037 
1038         if (!allocated_urbs)
1039                 return -ENOMEM;
1040 
1041          /* Initialize MCS7720 -- Write Init values to corresponding Registers
1042           *
1043           * Register Index
1044           * 0 : MOS7720_THR/MOS7720_RHR
1045           * 1 : MOS7720_IER
1046           * 2 : MOS7720_FCR
1047           * 3 : MOS7720_LCR
1048           * 4 : MOS7720_MCR
1049           * 5 : MOS7720_LSR
1050           * 6 : MOS7720_MSR
1051           * 7 : MOS7720_SPR
1052           *
1053           * 0x08 : SP1/2 Control Reg
1054           */
1055         port_number = port->port_number;
1056         read_mos_reg(serial, port_number, MOS7720_LSR, &data);
1057 
1058         dev_dbg(&port->dev, "SS::%p LSR:%x\n", mos7720_port, data);
1059 
1060         write_mos_reg(serial, dummy, MOS7720_SP1_REG, 0x02);
1061         write_mos_reg(serial, dummy, MOS7720_SP2_REG, 0x02);
1062 
1063         write_mos_reg(serial, port_number, MOS7720_IER, 0x00);
1064         write_mos_reg(serial, port_number, MOS7720_FCR, 0x00);
1065 
1066         write_mos_reg(serial, port_number, MOS7720_FCR, 0xcf);
1067         mos7720_port->shadowLCR = 0x03;
1068         write_mos_reg(serial, port_number, MOS7720_LCR,
1069                       mos7720_port->shadowLCR);
1070         mos7720_port->shadowMCR = 0x0b;
1071         write_mos_reg(serial, port_number, MOS7720_MCR,
1072                       mos7720_port->shadowMCR);
1073 
1074         write_mos_reg(serial, port_number, MOS7720_SP_CONTROL_REG, 0x00);
1075         read_mos_reg(serial, dummy, MOS7720_SP_CONTROL_REG, &data);
1076         data = data | (port->port_number + 1);
1077         write_mos_reg(serial, dummy, MOS7720_SP_CONTROL_REG, data);
1078         mos7720_port->shadowLCR = 0x83;
1079         write_mos_reg(serial, port_number, MOS7720_LCR,
1080                       mos7720_port->shadowLCR);
1081         write_mos_reg(serial, port_number, MOS7720_THR, 0x0c);
1082         write_mos_reg(serial, port_number, MOS7720_IER, 0x00);
1083         mos7720_port->shadowLCR = 0x03;
1084         write_mos_reg(serial, port_number, MOS7720_LCR,
1085                       mos7720_port->shadowLCR);
1086         write_mos_reg(serial, port_number, MOS7720_IER, 0x0c);
1087 
1088         response = usb_submit_urb(port->read_urb, GFP_KERNEL);
1089         if (response)
1090                 dev_err(&port->dev, "%s - Error %d submitting read urb\n",
1091                                                         __func__, response);
1092 
1093         /* initialize our port settings */
1094         mos7720_port->shadowMCR = UART_MCR_OUT2; /* Must set to enable ints! */
1095 
1096         /* send a open port command */
1097         mos7720_port->open = 1;
1098 
1099         return 0;
1100 }
1101 
1102 /*
1103  * mos7720_chars_in_buffer
1104  *      this function is called by the tty driver when it wants to know how many
1105  *      bytes of data we currently have outstanding in the port (data that has
1106  *      been written, but hasn't made it out the port yet)
1107  *      If successful, we return the number of bytes left to be written in the
1108  *      system,
1109  *      Otherwise we return a negative error number.
1110  */
1111 static int mos7720_chars_in_buffer(struct tty_struct *tty)
1112 {
1113         struct usb_serial_port *port = tty->driver_data;
1114         int i;
1115         int chars = 0;
1116         struct moschip_port *mos7720_port;
1117 
1118         mos7720_port = usb_get_serial_port_data(port);
1119         if (mos7720_port == NULL)
1120                 return 0;
1121 
1122         for (i = 0; i < NUM_URBS; ++i) {
1123                 if (mos7720_port->write_urb_pool[i] &&
1124                     mos7720_port->write_urb_pool[i]->status == -EINPROGRESS)
1125                         chars += URB_TRANSFER_BUFFER_SIZE;
1126         }
1127         dev_dbg(&port->dev, "%s - returns %d\n", __func__, chars);
1128         return chars;
1129 }
1130 
1131 static void mos7720_close(struct usb_serial_port *port)
1132 {
1133         struct usb_serial *serial;
1134         struct moschip_port *mos7720_port;
1135         int j;
1136 
1137         serial = port->serial;
1138 
1139         mos7720_port = usb_get_serial_port_data(port);
1140         if (mos7720_port == NULL)
1141                 return;
1142 
1143         for (j = 0; j < NUM_URBS; ++j)
1144                 usb_kill_urb(mos7720_port->write_urb_pool[j]);
1145 
1146         /* Freeing Write URBs */
1147         for (j = 0; j < NUM_URBS; ++j) {
1148                 if (mos7720_port->write_urb_pool[j]) {
1149                         kfree(mos7720_port->write_urb_pool[j]->transfer_buffer);
1150                         usb_free_urb(mos7720_port->write_urb_pool[j]);
1151                 }
1152         }
1153 
1154         /* While closing port, shutdown all bulk read, write  *
1155          * and interrupt read if they exists, otherwise nop   */
1156         usb_kill_urb(port->write_urb);
1157         usb_kill_urb(port->read_urb);
1158 
1159         write_mos_reg(serial, port->port_number, MOS7720_MCR, 0x00);
1160         write_mos_reg(serial, port->port_number, MOS7720_IER, 0x00);
1161 
1162         mos7720_port->open = 0;
1163 }
1164 
1165 static void mos7720_break(struct tty_struct *tty, int break_state)
1166 {
1167         struct usb_serial_port *port = tty->driver_data;
1168         unsigned char data;
1169         struct usb_serial *serial;
1170         struct moschip_port *mos7720_port;
1171 
1172         serial = port->serial;
1173 
1174         mos7720_port = usb_get_serial_port_data(port);
1175         if (mos7720_port == NULL)
1176                 return;
1177 
1178         if (break_state == -1)
1179                 data = mos7720_port->shadowLCR | UART_LCR_SBC;
1180         else
1181                 data = mos7720_port->shadowLCR & ~UART_LCR_SBC;
1182 
1183         mos7720_port->shadowLCR  = data;
1184         write_mos_reg(serial, port->port_number, MOS7720_LCR,
1185                       mos7720_port->shadowLCR);
1186 }
1187 
1188 /*
1189  * mos7720_write_room
1190  *      this function is called by the tty driver when it wants to know how many
1191  *      bytes of data we can accept for a specific port.
1192  *      If successful, we return the amount of room that we have for this port
1193  *      Otherwise we return a negative error number.
1194  */
1195 static int mos7720_write_room(struct tty_struct *tty)
1196 {
1197         struct usb_serial_port *port = tty->driver_data;
1198         struct moschip_port *mos7720_port;
1199         int room = 0;
1200         int i;
1201 
1202         mos7720_port = usb_get_serial_port_data(port);
1203         if (mos7720_port == NULL)
1204                 return -ENODEV;
1205 
1206         /* FIXME: Locking */
1207         for (i = 0; i < NUM_URBS; ++i) {
1208                 if (mos7720_port->write_urb_pool[i] &&
1209                     mos7720_port->write_urb_pool[i]->status != -EINPROGRESS)
1210                         room += URB_TRANSFER_BUFFER_SIZE;
1211         }
1212 
1213         dev_dbg(&port->dev, "%s - returns %d\n", __func__, room);
1214         return room;
1215 }
1216 
1217 static int mos7720_write(struct tty_struct *tty, struct usb_serial_port *port,
1218                                  const unsigned char *data, int count)
1219 {
1220         int status;
1221         int i;
1222         int bytes_sent = 0;
1223         int transfer_size;
1224 
1225         struct moschip_port *mos7720_port;
1226         struct usb_serial *serial;
1227         struct urb    *urb;
1228         const unsigned char *current_position = data;
1229 
1230         serial = port->serial;
1231 
1232         mos7720_port = usb_get_serial_port_data(port);
1233         if (mos7720_port == NULL)
1234                 return -ENODEV;
1235 
1236         /* try to find a free urb in the list */
1237         urb = NULL;
1238 
1239         for (i = 0; i < NUM_URBS; ++i) {
1240                 if (mos7720_port->write_urb_pool[i] &&
1241                     mos7720_port->write_urb_pool[i]->status != -EINPROGRESS) {
1242                         urb = mos7720_port->write_urb_pool[i];
1243                         dev_dbg(&port->dev, "URB:%d\n", i);
1244                         break;
1245                 }
1246         }
1247 
1248         if (urb == NULL) {
1249                 dev_dbg(&port->dev, "%s - no more free urbs\n", __func__);
1250                 goto exit;
1251         }
1252 
1253         if (urb->transfer_buffer == NULL) {
1254                 urb->transfer_buffer = kmalloc(URB_TRANSFER_BUFFER_SIZE,
1255                                                GFP_KERNEL);
1256                 if (!urb->transfer_buffer)
1257                         goto exit;
1258         }
1259         transfer_size = min(count, URB_TRANSFER_BUFFER_SIZE);
1260 
1261         memcpy(urb->transfer_buffer, current_position, transfer_size);
1262         usb_serial_debug_data(&port->dev, __func__, transfer_size,
1263                               urb->transfer_buffer);
1264 
1265         /* fill urb with data and submit  */
1266         usb_fill_bulk_urb(urb, serial->dev,
1267                           usb_sndbulkpipe(serial->dev,
1268                                         port->bulk_out_endpointAddress),
1269                           urb->transfer_buffer, transfer_size,
1270                           mos7720_bulk_out_data_callback, mos7720_port);
1271 
1272         /* send it down the pipe */
1273         status = usb_submit_urb(urb, GFP_ATOMIC);
1274         if (status) {
1275                 dev_err_console(port, "%s - usb_submit_urb(write bulk) failed "
1276                         "with status = %d\n", __func__, status);
1277                 bytes_sent = status;
1278                 goto exit;
1279         }
1280         bytes_sent = transfer_size;
1281 
1282 exit:
1283         return bytes_sent;
1284 }
1285 
1286 static void mos7720_throttle(struct tty_struct *tty)
1287 {
1288         struct usb_serial_port *port = tty->driver_data;
1289         struct moschip_port *mos7720_port;
1290         int status;
1291 
1292         mos7720_port = usb_get_serial_port_data(port);
1293 
1294         if (mos7720_port == NULL)
1295                 return;
1296 
1297         if (!mos7720_port->open) {
1298                 dev_dbg(&port->dev, "%s - port not opened\n", __func__);
1299                 return;
1300         }
1301 
1302         /* if we are implementing XON/XOFF, send the stop character */
1303         if (I_IXOFF(tty)) {
1304                 unsigned char stop_char = STOP_CHAR(tty);
1305                 status = mos7720_write(tty, port, &stop_char, 1);
1306                 if (status <= 0)
1307                         return;
1308         }
1309 
1310         /* if we are implementing RTS/CTS, toggle that line */
1311         if (tty->termios.c_cflag & CRTSCTS) {
1312                 mos7720_port->shadowMCR &= ~UART_MCR_RTS;
1313                 write_mos_reg(port->serial, port->port_number, MOS7720_MCR,
1314                               mos7720_port->shadowMCR);
1315         }
1316 }
1317 
1318 static void mos7720_unthrottle(struct tty_struct *tty)
1319 {
1320         struct usb_serial_port *port = tty->driver_data;
1321         struct moschip_port *mos7720_port = usb_get_serial_port_data(port);
1322         int status;
1323 
1324         if (mos7720_port == NULL)
1325                 return;
1326 
1327         if (!mos7720_port->open) {
1328                 dev_dbg(&port->dev, "%s - port not opened\n", __func__);
1329                 return;
1330         }
1331 
1332         /* if we are implementing XON/XOFF, send the start character */
1333         if (I_IXOFF(tty)) {
1334                 unsigned char start_char = START_CHAR(tty);
1335                 status = mos7720_write(tty, port, &start_char, 1);
1336                 if (status <= 0)
1337                         return;
1338         }
1339 
1340         /* if we are implementing RTS/CTS, toggle that line */
1341         if (tty->termios.c_cflag & CRTSCTS) {
1342                 mos7720_port->shadowMCR |= UART_MCR_RTS;
1343                 write_mos_reg(port->serial, port->port_number, MOS7720_MCR,
1344                               mos7720_port->shadowMCR);
1345         }
1346 }
1347 
1348 /* FIXME: this function does not work */
1349 static int set_higher_rates(struct moschip_port *mos7720_port,
1350                             unsigned int baud)
1351 {
1352         struct usb_serial_port *port;
1353         struct usb_serial *serial;
1354         int port_number;
1355         enum mos_regs sp_reg;
1356         if (mos7720_port == NULL)
1357                 return -EINVAL;
1358 
1359         port = mos7720_port->port;
1360         serial = port->serial;
1361 
1362          /***********************************************
1363          *      Init Sequence for higher rates
1364          ***********************************************/
1365         dev_dbg(&port->dev, "Sending Setting Commands ..........\n");
1366         port_number = port->port_number;
1367 
1368         write_mos_reg(serial, port_number, MOS7720_IER, 0x00);
1369         write_mos_reg(serial, port_number, MOS7720_FCR, 0x00);
1370         write_mos_reg(serial, port_number, MOS7720_FCR, 0xcf);
1371         mos7720_port->shadowMCR = 0x0b;
1372         write_mos_reg(serial, port_number, MOS7720_MCR,
1373                       mos7720_port->shadowMCR);
1374         write_mos_reg(serial, dummy, MOS7720_SP_CONTROL_REG, 0x00);
1375 
1376         /***********************************************
1377          *              Set for higher rates           *
1378          ***********************************************/
1379         /* writing baud rate verbatum into uart clock field clearly not right */
1380         if (port_number == 0)
1381                 sp_reg = MOS7720_SP1_REG;
1382         else
1383                 sp_reg = MOS7720_SP2_REG;
1384         write_mos_reg(serial, dummy, sp_reg, baud * 0x10);
1385         write_mos_reg(serial, dummy, MOS7720_SP_CONTROL_REG, 0x03);
1386         mos7720_port->shadowMCR = 0x2b;
1387         write_mos_reg(serial, port_number, MOS7720_MCR,
1388                       mos7720_port->shadowMCR);
1389 
1390         /***********************************************
1391          *              Set DLL/DLM
1392          ***********************************************/
1393         mos7720_port->shadowLCR = mos7720_port->shadowLCR | UART_LCR_DLAB;
1394         write_mos_reg(serial, port_number, MOS7720_LCR,
1395                       mos7720_port->shadowLCR);
1396         write_mos_reg(serial, port_number, MOS7720_DLL, 0x01);
1397         write_mos_reg(serial, port_number, MOS7720_DLM, 0x00);
1398         mos7720_port->shadowLCR = mos7720_port->shadowLCR & ~UART_LCR_DLAB;
1399         write_mos_reg(serial, port_number, MOS7720_LCR,
1400                       mos7720_port->shadowLCR);
1401 
1402         return 0;
1403 }
1404 
1405 /* baud rate information */
1406 struct divisor_table_entry {
1407         __u32  baudrate;
1408         __u16  divisor;
1409 };
1410 
1411 /* Define table of divisors for moschip 7720 hardware      *
1412  * These assume a 3.6864MHz crystal, the standard /16, and *
1413  * MCR.7 = 0.                                              */
1414 static struct divisor_table_entry divisor_table[] = {
1415         {   50,         2304},
1416         {   110,        1047},  /* 2094.545455 => 230450   => .0217 % over */
1417         {   134,        857},   /* 1713.011152 => 230398.5 => .00065% under */
1418         {   150,        768},
1419         {   300,        384},
1420         {   600,        192},
1421         {   1200,       96},
1422         {   1800,       64},
1423         {   2400,       48},
1424         {   4800,       24},
1425         {   7200,       16},
1426         {   9600,       12},
1427         {   19200,      6},
1428         {   38400,      3},
1429         {   57600,      2},
1430         {   115200,     1},
1431 };
1432 
1433 /*****************************************************************************
1434  * calc_baud_rate_divisor
1435  *      this function calculates the proper baud rate divisor for the specified
1436  *      baud rate.
1437  *****************************************************************************/
1438 static int calc_baud_rate_divisor(struct usb_serial_port *port, int baudrate, int *divisor)
1439 {
1440         int i;
1441         __u16 custom;
1442         __u16 round1;
1443         __u16 round;
1444 
1445 
1446         dev_dbg(&port->dev, "%s - %d\n", __func__, baudrate);
1447 
1448         for (i = 0; i < ARRAY_SIZE(divisor_table); i++) {
1449                 if (divisor_table[i].baudrate == baudrate) {
1450                         *divisor = divisor_table[i].divisor;
1451                         return 0;
1452                 }
1453         }
1454 
1455         /* After trying for all the standard baud rates    *
1456          * Try calculating the divisor for this baud rate  */
1457         if (baudrate > 75 &&  baudrate < 230400) {
1458                 /* get the divisor */
1459                 custom = (__u16)(230400L  / baudrate);
1460 
1461                 /* Check for round off */
1462                 round1 = (__u16)(2304000L / baudrate);
1463                 round = (__u16)(round1 - (custom * 10));
1464                 if (round > 4)
1465                         custom++;
1466                 *divisor = custom;
1467 
1468                 dev_dbg(&port->dev, "Baud %d = %d\n", baudrate, custom);
1469                 return 0;
1470         }
1471 
1472         dev_dbg(&port->dev, "Baud calculation Failed...\n");
1473         return -EINVAL;
1474 }
1475 
1476 /*
1477  * send_cmd_write_baud_rate
1478  *      this function sends the proper command to change the baud rate of the
1479  *      specified port.
1480  */
1481 static int send_cmd_write_baud_rate(struct moschip_port *mos7720_port,
1482                                     int baudrate)
1483 {
1484         struct usb_serial_port *port;
1485         struct usb_serial *serial;
1486         int divisor;
1487         int status;
1488         unsigned char number;
1489 
1490         if (mos7720_port == NULL)
1491                 return -1;
1492 
1493         port = mos7720_port->port;
1494         serial = port->serial;
1495 
1496         number = port->port_number;
1497         dev_dbg(&port->dev, "%s - baud = %d\n", __func__, baudrate);
1498 
1499         /* Calculate the Divisor */
1500         status = calc_baud_rate_divisor(port, baudrate, &divisor);
1501         if (status) {
1502                 dev_err(&port->dev, "%s - bad baud rate\n", __func__);
1503                 return status;
1504         }
1505 
1506         /* Enable access to divisor latch */
1507         mos7720_port->shadowLCR = mos7720_port->shadowLCR | UART_LCR_DLAB;
1508         write_mos_reg(serial, number, MOS7720_LCR, mos7720_port->shadowLCR);
1509 
1510         /* Write the divisor */
1511         write_mos_reg(serial, number, MOS7720_DLL, (__u8)(divisor & 0xff));
1512         write_mos_reg(serial, number, MOS7720_DLM,
1513                       (__u8)((divisor & 0xff00) >> 8));
1514 
1515         /* Disable access to divisor latch */
1516         mos7720_port->shadowLCR = mos7720_port->shadowLCR & ~UART_LCR_DLAB;
1517         write_mos_reg(serial, number, MOS7720_LCR, mos7720_port->shadowLCR);
1518 
1519         return status;
1520 }
1521 
1522 /*
1523  * change_port_settings
1524  *      This routine is called to set the UART on the device to match
1525  *      the specified new settings.
1526  */
1527 static void change_port_settings(struct tty_struct *tty,
1528                                  struct moschip_port *mos7720_port,
1529                                  struct ktermios *old_termios)
1530 {
1531         struct usb_serial_port *port;
1532         struct usb_serial *serial;
1533         int baud;
1534         unsigned cflag;
1535         unsigned iflag;
1536         __u8 mask = 0xff;
1537         __u8 lData;
1538         __u8 lParity;
1539         __u8 lStop;
1540         int status;
1541         int port_number;
1542 
1543         if (mos7720_port == NULL)
1544                 return ;
1545 
1546         port = mos7720_port->port;
1547         serial = port->serial;
1548         port_number = port->port_number;
1549 
1550         if (!mos7720_port->open) {
1551                 dev_dbg(&port->dev, "%s - port not opened\n", __func__);
1552                 return;
1553         }
1554 
1555         lData = UART_LCR_WLEN8;
1556         lStop = 0x00;   /* 1 stop bit */
1557         lParity = 0x00; /* No parity */
1558 
1559         cflag = tty->termios.c_cflag;
1560         iflag = tty->termios.c_iflag;
1561 
1562         /* Change the number of bits */
1563         switch (cflag & CSIZE) {
1564         case CS5:
1565                 lData = UART_LCR_WLEN5;
1566                 mask = 0x1f;
1567                 break;
1568 
1569         case CS6:
1570                 lData = UART_LCR_WLEN6;
1571                 mask = 0x3f;
1572                 break;
1573 
1574         case CS7:
1575                 lData = UART_LCR_WLEN7;
1576                 mask = 0x7f;
1577                 break;
1578         default:
1579         case CS8:
1580                 lData = UART_LCR_WLEN8;
1581                 break;
1582         }
1583 
1584         /* Change the Parity bit */
1585         if (cflag & PARENB) {
1586                 if (cflag & PARODD) {
1587                         lParity = UART_LCR_PARITY;
1588                         dev_dbg(&port->dev, "%s - parity = odd\n", __func__);
1589                 } else {
1590                         lParity = (UART_LCR_EPAR | UART_LCR_PARITY);
1591                         dev_dbg(&port->dev, "%s - parity = even\n", __func__);
1592                 }
1593 
1594         } else {
1595                 dev_dbg(&port->dev, "%s - parity = none\n", __func__);
1596         }
1597 
1598         if (cflag & CMSPAR)
1599                 lParity = lParity | 0x20;
1600 
1601         /* Change the Stop bit */
1602         if (cflag & CSTOPB) {
1603                 lStop = UART_LCR_STOP;
1604                 dev_dbg(&port->dev, "%s - stop bits = 2\n", __func__);
1605         } else {
1606                 lStop = 0x00;
1607                 dev_dbg(&port->dev, "%s - stop bits = 1\n", __func__);
1608         }
1609 
1610 #define LCR_BITS_MASK           0x03    /* Mask for bits/char field */
1611 #define LCR_STOP_MASK           0x04    /* Mask for stop bits field */
1612 #define LCR_PAR_MASK            0x38    /* Mask for parity field */
1613 
1614         /* Update the LCR with the correct value */
1615         mos7720_port->shadowLCR &=
1616                 ~(LCR_BITS_MASK | LCR_STOP_MASK | LCR_PAR_MASK);
1617         mos7720_port->shadowLCR |= (lData | lParity | lStop);
1618 
1619 
1620         /* Disable Interrupts */
1621         write_mos_reg(serial, port_number, MOS7720_IER, 0x00);
1622         write_mos_reg(serial, port_number, MOS7720_FCR, 0x00);
1623         write_mos_reg(serial, port_number, MOS7720_FCR, 0xcf);
1624 
1625         /* Send the updated LCR value to the mos7720 */
1626         write_mos_reg(serial, port_number, MOS7720_LCR,
1627                       mos7720_port->shadowLCR);
1628         mos7720_port->shadowMCR = 0x0b;
1629         write_mos_reg(serial, port_number, MOS7720_MCR,
1630                       mos7720_port->shadowMCR);
1631 
1632         /* set up the MCR register and send it to the mos7720 */
1633         mos7720_port->shadowMCR = UART_MCR_OUT2;
1634         if (cflag & CBAUD)
1635                 mos7720_port->shadowMCR |= (UART_MCR_DTR | UART_MCR_RTS);
1636 
1637         if (cflag & CRTSCTS) {
1638                 mos7720_port->shadowMCR |= (UART_MCR_XONANY);
1639                 /* To set hardware flow control to the specified *
1640                  * serial port, in SP1/2_CONTROL_REG             */
1641                 if (port_number)
1642                         write_mos_reg(serial, dummy, MOS7720_SP_CONTROL_REG,
1643                                       0x01);
1644                 else
1645                         write_mos_reg(serial, dummy, MOS7720_SP_CONTROL_REG,
1646                                       0x02);
1647 
1648         } else
1649                 mos7720_port->shadowMCR &= ~(UART_MCR_XONANY);
1650 
1651         write_mos_reg(serial, port_number, MOS7720_MCR,
1652                       mos7720_port->shadowMCR);
1653 
1654         /* Determine divisor based on baud rate */
1655         baud = tty_get_baud_rate(tty);
1656         if (!baud) {
1657                 /* pick a default, any default... */
1658                 dev_dbg(&port->dev, "Picked default baud...\n");
1659                 baud = 9600;
1660         }
1661 
1662         if (baud >= 230400) {
1663                 set_higher_rates(mos7720_port, baud);
1664                 /* Enable Interrupts */
1665                 write_mos_reg(serial, port_number, MOS7720_IER, 0x0c);
1666                 return;
1667         }
1668 
1669         dev_dbg(&port->dev, "%s - baud rate = %d\n", __func__, baud);
1670         status = send_cmd_write_baud_rate(mos7720_port, baud);
1671         /* FIXME: needs to write actual resulting baud back not just
1672            blindly do so */
1673         if (cflag & CBAUD)
1674                 tty_encode_baud_rate(tty, baud, baud);
1675         /* Enable Interrupts */
1676         write_mos_reg(serial, port_number, MOS7720_IER, 0x0c);
1677 
1678         if (port->read_urb->status != -EINPROGRESS) {
1679                 status = usb_submit_urb(port->read_urb, GFP_KERNEL);
1680                 if (status)
1681                         dev_dbg(&port->dev, "usb_submit_urb(read bulk) failed, status = %d\n", status);
1682         }
1683 }
1684 
1685 /*
1686  * mos7720_set_termios
1687  *      this function is called by the tty driver when it wants to change the
1688  *      termios structure.
1689  */
1690 static void mos7720_set_termios(struct tty_struct *tty,
1691                 struct usb_serial_port *port, struct ktermios *old_termios)
1692 {
1693         int status;
1694         unsigned int cflag;
1695         struct usb_serial *serial;
1696         struct moschip_port *mos7720_port;
1697 
1698         serial = port->serial;
1699 
1700         mos7720_port = usb_get_serial_port_data(port);
1701 
1702         if (mos7720_port == NULL)
1703                 return;
1704 
1705         if (!mos7720_port->open) {
1706                 dev_dbg(&port->dev, "%s - port not opened\n", __func__);
1707                 return;
1708         }
1709 
1710         dev_dbg(&port->dev, "setting termios - ASPIRE\n");
1711 
1712         cflag = tty->termios.c_cflag;
1713 
1714         dev_dbg(&port->dev, "%s - cflag %08x iflag %08x\n", __func__,
1715                 tty->termios.c_cflag, RELEVANT_IFLAG(tty->termios.c_iflag));
1716 
1717         dev_dbg(&port->dev, "%s - old cflag %08x old iflag %08x\n", __func__,
1718                 old_termios->c_cflag, RELEVANT_IFLAG(old_termios->c_iflag));
1719 
1720         /* change the port settings to the new ones specified */
1721         change_port_settings(tty, mos7720_port, old_termios);
1722 
1723         if (port->read_urb->status != -EINPROGRESS) {
1724                 status = usb_submit_urb(port->read_urb, GFP_KERNEL);
1725                 if (status)
1726                         dev_dbg(&port->dev, "usb_submit_urb(read bulk) failed, status = %d\n", status);
1727         }
1728 }
1729 
1730 /*
1731  * get_lsr_info - get line status register info
1732  *
1733  * Purpose: Let user call ioctl() to get info when the UART physically
1734  *          is emptied.  On bus types like RS485, the transmitter must
1735  *          release the bus after transmitting. This must be done when
1736  *          the transmit shift register is empty, not be done when the
1737  *          transmit holding register is empty.  This functionality
1738  *          allows an RS485 driver to be written in user space.
1739  */
1740 static int get_lsr_info(struct tty_struct *tty,
1741                 struct moschip_port *mos7720_port, unsigned int __user *value)
1742 {
1743         struct usb_serial_port *port = tty->driver_data;
1744         unsigned int result = 0;
1745         unsigned char data = 0;
1746         int port_number = port->port_number;
1747         int count;
1748 
1749         count = mos7720_chars_in_buffer(tty);
1750         if (count == 0) {
1751                 read_mos_reg(port->serial, port_number, MOS7720_LSR, &data);
1752                 if ((data & (UART_LSR_TEMT | UART_LSR_THRE))
1753                                         == (UART_LSR_TEMT | UART_LSR_THRE)) {
1754                         dev_dbg(&port->dev, "%s -- Empty\n", __func__);
1755                         result = TIOCSER_TEMT;
1756                 }
1757         }
1758         if (copy_to_user(value, &result, sizeof(int)))
1759                 return -EFAULT;
1760         return 0;
1761 }
1762 
1763 static int mos7720_tiocmget(struct tty_struct *tty)
1764 {
1765         struct usb_serial_port *port = tty->driver_data;
1766         struct moschip_port *mos7720_port = usb_get_serial_port_data(port);
1767         unsigned int result = 0;
1768         unsigned int mcr ;
1769         unsigned int msr ;
1770 
1771         mcr = mos7720_port->shadowMCR;
1772         msr = mos7720_port->shadowMSR;
1773 
1774         result = ((mcr & UART_MCR_DTR)  ? TIOCM_DTR : 0)   /* 0x002 */
1775           | ((mcr & UART_MCR_RTS)   ? TIOCM_RTS : 0)   /* 0x004 */
1776           | ((msr & UART_MSR_CTS)   ? TIOCM_CTS : 0)   /* 0x020 */
1777           | ((msr & UART_MSR_DCD)   ? TIOCM_CAR : 0)   /* 0x040 */
1778           | ((msr & UART_MSR_RI)    ? TIOCM_RI :  0)   /* 0x080 */
1779           | ((msr & UART_MSR_DSR)   ? TIOCM_DSR : 0);  /* 0x100 */
1780 
1781         return result;
1782 }
1783 
1784 static int mos7720_tiocmset(struct tty_struct *tty,
1785                             unsigned int set, unsigned int clear)
1786 {
1787         struct usb_serial_port *port = tty->driver_data;
1788         struct moschip_port *mos7720_port = usb_get_serial_port_data(port);
1789         unsigned int mcr ;
1790 
1791         mcr = mos7720_port->shadowMCR;
1792 
1793         if (set & TIOCM_RTS)
1794                 mcr |= UART_MCR_RTS;
1795         if (set & TIOCM_DTR)
1796                 mcr |= UART_MCR_DTR;
1797         if (set & TIOCM_LOOP)
1798                 mcr |= UART_MCR_LOOP;
1799 
1800         if (clear & TIOCM_RTS)
1801                 mcr &= ~UART_MCR_RTS;
1802         if (clear & TIOCM_DTR)
1803                 mcr &= ~UART_MCR_DTR;
1804         if (clear & TIOCM_LOOP)
1805                 mcr &= ~UART_MCR_LOOP;
1806 
1807         mos7720_port->shadowMCR = mcr;
1808         write_mos_reg(port->serial, port->port_number, MOS7720_MCR,
1809                       mos7720_port->shadowMCR);
1810 
1811         return 0;
1812 }
1813 
1814 static int set_modem_info(struct moschip_port *mos7720_port, unsigned int cmd,
1815                           unsigned int __user *value)
1816 {
1817         unsigned int mcr;
1818         unsigned int arg;
1819 
1820         struct usb_serial_port *port;
1821 
1822         if (mos7720_port == NULL)
1823                 return -1;
1824 
1825         port = (struct usb_serial_port *)mos7720_port->port;
1826         mcr = mos7720_port->shadowMCR;
1827 
1828         if (copy_from_user(&arg, value, sizeof(int)))
1829                 return -EFAULT;
1830 
1831         switch (cmd) {
1832         case TIOCMBIS:
1833                 if (arg & TIOCM_RTS)
1834                         mcr |= UART_MCR_RTS;
1835                 if (arg & TIOCM_DTR)
1836                         mcr |= UART_MCR_RTS;
1837                 if (arg & TIOCM_LOOP)
1838                         mcr |= UART_MCR_LOOP;
1839                 break;
1840 
1841         case TIOCMBIC:
1842                 if (arg & TIOCM_RTS)
1843                         mcr &= ~UART_MCR_RTS;
1844                 if (arg & TIOCM_DTR)
1845                         mcr &= ~UART_MCR_RTS;
1846                 if (arg & TIOCM_LOOP)
1847                         mcr &= ~UART_MCR_LOOP;
1848                 break;
1849 
1850         }
1851 
1852         mos7720_port->shadowMCR = mcr;
1853         write_mos_reg(port->serial, port->port_number, MOS7720_MCR,
1854                       mos7720_port->shadowMCR);
1855 
1856         return 0;
1857 }
1858 
1859 static int get_serial_info(struct moschip_port *mos7720_port,
1860                            struct serial_struct __user *retinfo)
1861 {
1862         struct serial_struct tmp;
1863 
1864         if (!retinfo)
1865                 return -EFAULT;
1866 
1867         memset(&tmp, 0, sizeof(tmp));
1868 
1869         tmp.type                = PORT_16550A;
1870         tmp.line                = mos7720_port->port->minor;
1871         tmp.port                = mos7720_port->port->port_number;
1872         tmp.irq                 = 0;
1873         tmp.flags               = ASYNC_SKIP_TEST | ASYNC_AUTO_IRQ;
1874         tmp.xmit_fifo_size      = NUM_URBS * URB_TRANSFER_BUFFER_SIZE;
1875         tmp.baud_base           = 9600;
1876         tmp.close_delay         = 5*HZ;
1877         tmp.closing_wait        = 30*HZ;
1878 
1879         if (copy_to_user(retinfo, &tmp, sizeof(*retinfo)))
1880                 return -EFAULT;
1881         return 0;
1882 }
1883 
1884 static int mos7720_ioctl(struct tty_struct *tty,
1885                          unsigned int cmd, unsigned long arg)
1886 {
1887         struct usb_serial_port *port = tty->driver_data;
1888         struct moschip_port *mos7720_port;
1889 
1890         mos7720_port = usb_get_serial_port_data(port);
1891         if (mos7720_port == NULL)
1892                 return -ENODEV;
1893 
1894         switch (cmd) {
1895         case TIOCSERGETLSR:
1896                 dev_dbg(&port->dev, "%s TIOCSERGETLSR\n", __func__);
1897                 return get_lsr_info(tty, mos7720_port,
1898                                         (unsigned int __user *)arg);
1899 
1900         /* FIXME: These should be using the mode methods */
1901         case TIOCMBIS:
1902         case TIOCMBIC:
1903                 dev_dbg(&port->dev, "%s TIOCMSET/TIOCMBIC/TIOCMSET\n", __func__);
1904                 return set_modem_info(mos7720_port, cmd,
1905                                       (unsigned int __user *)arg);
1906 
1907         case TIOCGSERIAL:
1908                 dev_dbg(&port->dev, "%s TIOCGSERIAL\n", __func__);
1909                 return get_serial_info(mos7720_port,
1910                                        (struct serial_struct __user *)arg);
1911         }
1912 
1913         return -ENOIOCTLCMD;
1914 }
1915 
1916 static int mos7720_startup(struct usb_serial *serial)
1917 {
1918         struct usb_device *dev;
1919         char data;
1920         u16 product;
1921         int ret_val;
1922 
1923         product = le16_to_cpu(serial->dev->descriptor.idProduct);
1924         dev = serial->dev;
1925 
1926         /*
1927          * The 7715 uses the first bulk in/out endpoint pair for the parallel
1928          * port, and the second for the serial port.  Because the usbserial core
1929          * assumes both pairs are serial ports, we must engage in a bit of
1930          * subterfuge and swap the pointers for ports 0 and 1 in order to make
1931          * port 0 point to the serial port.  However, both moschip devices use a
1932          * single interrupt-in endpoint for both ports (as mentioned a little
1933          * further down), and this endpoint was assigned to port 0.  So after
1934          * the swap, we must copy the interrupt endpoint elements from port 1
1935          * (as newly assigned) to port 0, and null out port 1 pointers.
1936          */
1937         if (product == MOSCHIP_DEVICE_ID_7715) {
1938                 struct usb_serial_port *tmp = serial->port[0];
1939                 serial->port[0] = serial->port[1];
1940                 serial->port[1] = tmp;
1941                 serial->port[0]->interrupt_in_urb = tmp->interrupt_in_urb;
1942                 serial->port[0]->interrupt_in_buffer = tmp->interrupt_in_buffer;
1943                 serial->port[0]->interrupt_in_endpointAddress =
1944                         tmp->interrupt_in_endpointAddress;
1945                 serial->port[1]->interrupt_in_urb = NULL;
1946                 serial->port[1]->interrupt_in_buffer = NULL;
1947         }
1948 
1949         /* setting configuration feature to one */
1950         usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
1951                         (__u8)0x03, 0x00, 0x01, 0x00, NULL, 0x00, 5000);
1952 
1953         /* start the interrupt urb */
1954         ret_val = usb_submit_urb(serial->port[0]->interrupt_in_urb, GFP_KERNEL);
1955         if (ret_val)
1956                 dev_err(&dev->dev,
1957                         "%s - Error %d submitting control urb\n",
1958                         __func__, ret_val);
1959 
1960 #ifdef CONFIG_USB_SERIAL_MOS7715_PARPORT
1961         if (product == MOSCHIP_DEVICE_ID_7715) {
1962                 ret_val = mos7715_parport_init(serial);
1963                 if (ret_val < 0)
1964                         return ret_val;
1965         }
1966 #endif
1967         /* LSR For Port 1 */
1968         read_mos_reg(serial, 0, MOS7720_LSR, &data);
1969         dev_dbg(&dev->dev, "LSR:%x\n", data);
1970 
1971         return 0;
1972 }
1973 
1974 static void mos7720_release(struct usb_serial *serial)
1975 {
1976 #ifdef CONFIG_USB_SERIAL_MOS7715_PARPORT
1977         /* close the parallel port */
1978 
1979         if (le16_to_cpu(serial->dev->descriptor.idProduct)
1980             == MOSCHIP_DEVICE_ID_7715) {
1981                 struct urbtracker *urbtrack;
1982                 unsigned long flags;
1983                 struct mos7715_parport *mos_parport =
1984                         usb_get_serial_data(serial);
1985 
1986                 /* prevent NULL ptr dereference in port callbacks */
1987                 spin_lock(&release_lock);
1988                 mos_parport->pp->private_data = NULL;
1989                 spin_unlock(&release_lock);
1990 
1991                 /* wait for synchronous usb calls to return */
1992                 if (mos_parport->msg_pending)
1993                         wait_for_completion_timeout(&mos_parport->syncmsg_compl,
1994                                             msecs_to_jiffies(MOS_WDR_TIMEOUT));
1995 
1996                 parport_remove_port(mos_parport->pp);
1997                 usb_set_serial_data(serial, NULL);
1998                 mos_parport->serial = NULL;
1999 
2000                 /* if tasklet currently scheduled, wait for it to complete */
2001                 tasklet_kill(&mos_parport->urb_tasklet);
2002 
2003                 /* unlink any urbs sent by the tasklet  */
2004                 spin_lock_irqsave(&mos_parport->listlock, flags);
2005                 list_for_each_entry(urbtrack,
2006                                     &mos_parport->active_urbs,
2007                                     urblist_entry)
2008                         usb_unlink_urb(urbtrack->urb);
2009                 spin_unlock_irqrestore(&mos_parport->listlock, flags);
2010 
2011                 kref_put(&mos_parport->ref_count, destroy_mos_parport);
2012         }
2013 #endif
2014 }
2015 
2016 static int mos7720_port_probe(struct usb_serial_port *port)
2017 {
2018         struct moschip_port *mos7720_port;
2019 
2020         mos7720_port = kzalloc(sizeof(*mos7720_port), GFP_KERNEL);
2021         if (!mos7720_port)
2022                 return -ENOMEM;
2023 
2024         /* Initialize all port interrupt end point to port 0 int endpoint.
2025          * Our device has only one interrupt endpoint common to all ports.
2026          */
2027         port->interrupt_in_endpointAddress =
2028                 port->serial->port[0]->interrupt_in_endpointAddress;
2029         mos7720_port->port = port;
2030 
2031         usb_set_serial_port_data(port, mos7720_port);
2032 
2033         return 0;
2034 }
2035 
2036 static int mos7720_port_remove(struct usb_serial_port *port)
2037 {
2038         struct moschip_port *mos7720_port;
2039 
2040         mos7720_port = usb_get_serial_port_data(port);
2041         kfree(mos7720_port);
2042 
2043         return 0;
2044 }
2045 
2046 static struct usb_serial_driver moschip7720_2port_driver = {
2047         .driver = {
2048                 .owner =        THIS_MODULE,
2049                 .name =         "moschip7720",
2050         },
2051         .description            = "Moschip 2 port adapter",
2052         .id_table               = id_table,
2053         .calc_num_ports         = mos77xx_calc_num_ports,
2054         .open                   = mos7720_open,
2055         .close                  = mos7720_close,
2056         .throttle               = mos7720_throttle,
2057         .unthrottle             = mos7720_unthrottle,
2058         .probe                  = mos77xx_probe,
2059         .attach                 = mos7720_startup,
2060         .release                = mos7720_release,
2061         .port_probe             = mos7720_port_probe,
2062         .port_remove            = mos7720_port_remove,
2063         .ioctl                  = mos7720_ioctl,
2064         .tiocmget               = mos7720_tiocmget,
2065         .tiocmset               = mos7720_tiocmset,
2066         .set_termios            = mos7720_set_termios,
2067         .write                  = mos7720_write,
2068         .write_room             = mos7720_write_room,
2069         .chars_in_buffer        = mos7720_chars_in_buffer,
2070         .break_ctl              = mos7720_break,
2071         .read_bulk_callback     = mos7720_bulk_in_callback,
2072         .read_int_callback      = NULL  /* dynamically assigned in probe() */
2073 };
2074 
2075 static struct usb_serial_driver * const serial_drivers[] = {
2076         &moschip7720_2port_driver, NULL
2077 };
2078 
2079 module_usb_serial_driver(serial_drivers, id_table);
2080 
2081 MODULE_AUTHOR(DRIVER_AUTHOR);
2082 MODULE_DESCRIPTION(DRIVER_DESC);
2083 MODULE_LICENSE("GPL");
2084 

This page was automatically generated by LXR 0.3.1 (source).  •  Linux is a registered trademark of Linus Torvalds  •  Contact us