1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71#include <linux/kernel.h>
72#include <linux/errno.h>
73#include <linux/init.h>
74#include <linux/slab.h>
75#include <linux/tty.h>
76#include <linux/tty_driver.h>
77#include <linux/tty_flip.h>
78#include <linux/module.h>
79#include <linux/spinlock.h>
80#include <linux/workqueue.h>
81#include <linux/firmware.h>
82#include <linux/ihex.h>
83#include <linux/uaccess.h>
84#include <linux/usb.h>
85#include <linux/usb/serial.h>
86
87static int debug;
88
89
90#if defined(CONFIG_USB_SERIAL_KEYSPAN_PDA) || defined(CONFIG_USB_SERIAL_KEYSPAN_PDA_MODULE)
91 #define KEYSPAN
92#else
93 #undef KEYSPAN
94#endif
95#if defined(CONFIG_USB_SERIAL_XIRCOM) || defined(CONFIG_USB_SERIAL_XIRCOM_MODULE)
96 #define XIRCOM
97#else
98 #undef XIRCOM
99#endif
100
101
102
103
104#define DRIVER_VERSION "v1.1"
105#define DRIVER_AUTHOR "Brian Warner <warner@lothar.com>"
106#define DRIVER_DESC "USB Keyspan PDA Converter driver"
107
108struct keyspan_pda_private {
109 int tx_room;
110 int tx_throttled;
111 struct work_struct wakeup_work;
112 struct work_struct unthrottle_work;
113 struct usb_serial *serial;
114 struct usb_serial_port *port;
115};
116
117
118#define KEYSPAN_VENDOR_ID 0x06cd
119#define KEYSPAN_PDA_FAKE_ID 0x0103
120#define KEYSPAN_PDA_ID 0x0104
121
122
123#define XIRCOM_VENDOR_ID 0x085a
124#define XIRCOM_FAKE_ID 0x8027
125#define ENTREGRA_VENDOR_ID 0x1645
126#define ENTREGRA_FAKE_ID 0x8093
127
128static struct usb_device_id id_table_combined [] = {
129#ifdef KEYSPAN
130 { USB_DEVICE(KEYSPAN_VENDOR_ID, KEYSPAN_PDA_FAKE_ID) },
131#endif
132#ifdef XIRCOM
133 { USB_DEVICE(XIRCOM_VENDOR_ID, XIRCOM_FAKE_ID) },
134 { USB_DEVICE(ENTREGRA_VENDOR_ID, ENTREGRA_FAKE_ID) },
135#endif
136 { USB_DEVICE(KEYSPAN_VENDOR_ID, KEYSPAN_PDA_ID) },
137 { }
138};
139
140MODULE_DEVICE_TABLE(usb, id_table_combined);
141
142static struct usb_driver keyspan_pda_driver = {
143 .name = "keyspan_pda",
144 .probe = usb_serial_probe,
145 .disconnect = usb_serial_disconnect,
146 .id_table = id_table_combined,
147 .no_dynamic_id = 1,
148};
149
150static struct usb_device_id id_table_std [] = {
151 { USB_DEVICE(KEYSPAN_VENDOR_ID, KEYSPAN_PDA_ID) },
152 { }
153};
154
155#ifdef KEYSPAN
156static struct usb_device_id id_table_fake [] = {
157 { USB_DEVICE(KEYSPAN_VENDOR_ID, KEYSPAN_PDA_FAKE_ID) },
158 { }
159};
160#endif
161
162#ifdef XIRCOM
163static struct usb_device_id id_table_fake_xircom [] = {
164 { USB_DEVICE(XIRCOM_VENDOR_ID, XIRCOM_FAKE_ID) },
165 { USB_DEVICE(ENTREGRA_VENDOR_ID, ENTREGRA_FAKE_ID) },
166 { }
167};
168#endif
169
170static void keyspan_pda_wakeup_write(struct work_struct *work)
171{
172 struct keyspan_pda_private *priv =
173 container_of(work, struct keyspan_pda_private, wakeup_work);
174 struct usb_serial_port *port = priv->port;
175
176 tty_wakeup(port->port.tty);
177}
178
179static void keyspan_pda_request_unthrottle(struct work_struct *work)
180{
181 struct keyspan_pda_private *priv =
182 container_of(work, struct keyspan_pda_private, unthrottle_work);
183 struct usb_serial *serial = priv->serial;
184 int result;
185
186 dbg(" request_unthrottle");
187
188
189 result = usb_control_msg(serial->dev,
190 usb_sndctrlpipe(serial->dev, 0),
191 7,
192 USB_TYPE_VENDOR | USB_RECIP_INTERFACE
193 | USB_DIR_OUT,
194 16,
195 0,
196 NULL,
197 0,
198 2000);
199 if (result < 0)
200 dbg("%s - error %d from usb_control_msg",
201 __func__, result);
202}
203
204
205static void keyspan_pda_rx_interrupt(struct urb *urb)
206{
207 struct usb_serial_port *port = urb->context;
208 struct tty_struct *tty = port->port.tty;
209 unsigned char *data = urb->transfer_buffer;
210 int retval;
211 int status = urb->status;
212 struct keyspan_pda_private *priv;
213 priv = usb_get_serial_port_data(port);
214
215 switch (status) {
216 case 0:
217
218 break;
219 case -ECONNRESET:
220 case -ENOENT:
221 case -ESHUTDOWN:
222
223 dbg("%s - urb shutting down with status: %d",
224 __func__, status);
225 return;
226 default:
227 dbg("%s - nonzero urb status received: %d",
228 __func__, status);
229 goto exit;
230 }
231
232
233 switch (data[0]) {
234 case 0:
235
236 if (urb->actual_length) {
237 tty_insert_flip_string(tty, data + 1,
238 urb->actual_length - 1);
239 tty_flip_buffer_push(tty);
240 }
241 break;
242 case 1:
243
244 dbg(" rx int, d1=%d, d2=%d", data[1], data[2]);
245 switch (data[1]) {
246 case 1:
247 break;
248 case 2:
249 priv->tx_throttled = 0;
250
251 schedule_work(&priv->wakeup_work);
252 break;
253 default:
254 break;
255 }
256 break;
257 default:
258 break;
259 }
260
261exit:
262 retval = usb_submit_urb(urb, GFP_ATOMIC);
263 if (retval)
264 err("%s - usb_submit_urb failed with result %d",
265 __func__, retval);
266}
267
268
269static void keyspan_pda_rx_throttle(struct tty_struct *tty)
270{
271
272
273
274
275
276
277 struct usb_serial_port *port = tty->driver_data;
278 dbg("keyspan_pda_rx_throttle port %d", port->number);
279 usb_kill_urb(port->interrupt_in_urb);
280}
281
282
283static void keyspan_pda_rx_unthrottle(struct tty_struct *tty)
284{
285 struct usb_serial_port *port = tty->driver_data;
286
287 dbg("keyspan_pda_rx_unthrottle port %d", port->number);
288 port->interrupt_in_urb->dev = port->serial->dev;
289 if (usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC))
290 dbg(" usb_submit_urb(read urb) failed");
291 return;
292}
293
294
295static speed_t keyspan_pda_setbaud(struct usb_serial *serial, speed_t baud)
296{
297 int rc;
298 int bindex;
299
300 switch (baud) {
301 case 110:
302 bindex = 0;
303 break;
304 case 300:
305 bindex = 1;
306 break;
307 case 1200:
308 bindex = 2;
309 break;
310 case 2400:
311 bindex = 3;
312 break;
313 case 4800:
314 bindex = 4;
315 break;
316 case 9600:
317 bindex = 5;
318 break;
319 case 19200:
320 bindex = 6;
321 break;
322 case 38400:
323 bindex = 7;
324 break;
325 case 57600:
326 bindex = 8;
327 break;
328 case 115200:
329 bindex = 9;
330 break;
331 default:
332 bindex = 5;
333 baud = 9600;
334 }
335
336
337
338 rc = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
339 0,
340 USB_TYPE_VENDOR
341 | USB_RECIP_INTERFACE
342 | USB_DIR_OUT,
343 bindex,
344 0,
345 NULL,
346 0,
347 2000);
348 if (rc < 0)
349 return 0;
350 return baud;
351}
352
353
354static void keyspan_pda_break_ctl(struct tty_struct *tty, int break_state)
355{
356 struct usb_serial_port *port = tty->driver_data;
357 struct usb_serial *serial = port->serial;
358 int value;
359 int result;
360
361 if (break_state == -1)
362 value = 1;
363 else
364 value = 0;
365 result = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
366 4,
367 USB_TYPE_VENDOR | USB_RECIP_INTERFACE | USB_DIR_OUT,
368 value, 0, NULL, 0, 2000);
369 if (result < 0)
370 dbg("%s - error %d from usb_control_msg",
371 __func__, result);
372
373
374
375
376}
377
378
379static void keyspan_pda_set_termios(struct tty_struct *tty,
380 struct usb_serial_port *port, struct ktermios *old_termios)
381{
382 struct usb_serial *serial = port->serial;
383 speed_t speed;
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405 speed = tty_get_baud_rate(tty);
406 speed = keyspan_pda_setbaud(serial, speed);
407
408 if (speed == 0) {
409 dbg("can't handle requested baud rate");
410
411 speed = tty_termios_baud_rate(old_termios);
412 }
413
414
415 tty_termios_copy_hw(tty->termios, old_termios);
416 tty_encode_baud_rate(tty, speed, speed);
417}
418
419
420
421
422
423
424static int keyspan_pda_get_modem_info(struct usb_serial *serial,
425 unsigned char *value)
426{
427 int rc;
428 unsigned char data;
429 rc = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
430 3,
431 USB_TYPE_VENDOR|USB_RECIP_INTERFACE|USB_DIR_IN,
432 0, 0, &data, 1, 2000);
433 if (rc >= 0)
434 *value = data;
435 return rc;
436}
437
438
439static int keyspan_pda_set_modem_info(struct usb_serial *serial,
440 unsigned char value)
441{
442 int rc;
443 rc = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
444 3,
445 USB_TYPE_VENDOR|USB_RECIP_INTERFACE|USB_DIR_OUT,
446 value, 0, NULL, 0, 2000);
447 return rc;
448}
449
450static int keyspan_pda_tiocmget(struct tty_struct *tty, struct file *file)
451{
452 struct usb_serial_port *port = tty->driver_data;
453 struct usb_serial *serial = port->serial;
454 int rc;
455 unsigned char status;
456 int value;
457
458 rc = keyspan_pda_get_modem_info(serial, &status);
459 if (rc < 0)
460 return rc;
461 value =
462 ((status & (1<<7)) ? TIOCM_DTR : 0) |
463 ((status & (1<<6)) ? TIOCM_CAR : 0) |
464 ((status & (1<<5)) ? TIOCM_RNG : 0) |
465 ((status & (1<<4)) ? TIOCM_DSR : 0) |
466 ((status & (1<<3)) ? TIOCM_CTS : 0) |
467 ((status & (1<<2)) ? TIOCM_RTS : 0);
468 return value;
469}
470
471static int keyspan_pda_tiocmset(struct tty_struct *tty, struct file *file,
472 unsigned int set, unsigned int clear)
473{
474 struct usb_serial_port *port = tty->driver_data;
475 struct usb_serial *serial = port->serial;
476 int rc;
477 unsigned char status;
478
479 rc = keyspan_pda_get_modem_info(serial, &status);
480 if (rc < 0)
481 return rc;
482
483 if (set & TIOCM_RTS)
484 status |= (1<<2);
485 if (set & TIOCM_DTR)
486 status |= (1<<7);
487
488 if (clear & TIOCM_RTS)
489 status &= ~(1<<2);
490 if (clear & TIOCM_DTR)
491 status &= ~(1<<7);
492 rc = keyspan_pda_set_modem_info(serial, status);
493 return rc;
494}
495
496static int keyspan_pda_write(struct tty_struct *tty,
497 struct usb_serial_port *port, const unsigned char *buf, int count)
498{
499 struct usb_serial *serial = port->serial;
500 int request_unthrottle = 0;
501 int rc = 0;
502 struct keyspan_pda_private *priv;
503
504 priv = usb_get_serial_port_data(port);
505
506
507
508
509
510
511
512
513 dbg("keyspan_pda_write(%d)", count);
514 if (count == 0) {
515 dbg(" write request of 0 bytes");
516 return 0;
517 }
518
519
520
521
522
523 spin_lock_bh(&port->lock);
524 if (port->write_urb_busy || priv->tx_throttled) {
525 spin_unlock_bh(&port->lock);
526 return 0;
527 }
528 port->write_urb_busy = 1;
529 spin_unlock_bh(&port->lock);
530
531
532
533
534
535
536 count = (count > port->bulk_out_size) ? port->bulk_out_size : count;
537
538
539
540
541 if (count > priv->tx_room && !in_interrupt()) {
542 unsigned char room;
543 rc = usb_control_msg(serial->dev,
544 usb_rcvctrlpipe(serial->dev, 0),
545 6,
546 USB_TYPE_VENDOR | USB_RECIP_INTERFACE
547 | USB_DIR_IN,
548 0,
549 0,
550 &room,
551 1,
552 2000);
553 if (rc < 0) {
554 dbg(" roomquery failed");
555 goto exit;
556 }
557 if (rc == 0) {
558 dbg(" roomquery returned 0 bytes");
559 rc = -EIO;
560 goto exit;
561 }
562 dbg(" roomquery says %d", room);
563 priv->tx_room = room;
564 }
565 if (count > priv->tx_room) {
566
567
568 count = priv->tx_room;
569 request_unthrottle = 1;
570 }
571
572 if (count) {
573
574 memcpy(port->write_urb->transfer_buffer, buf, count);
575
576 port->write_urb->transfer_buffer_length = count;
577
578 priv->tx_room -= count;
579
580 port->write_urb->dev = port->serial->dev;
581 rc = usb_submit_urb(port->write_urb, GFP_ATOMIC);
582 if (rc) {
583 dbg(" usb_submit_urb(write bulk) failed");
584 goto exit;
585 }
586 } else {
587
588
589 request_unthrottle = 1;
590 }
591
592 if (request_unthrottle) {
593 priv->tx_throttled = 1;
594 schedule_work(&priv->unthrottle_work);
595 }
596
597 rc = count;
598exit:
599 if (rc < 0)
600 port->write_urb_busy = 0;
601 return rc;
602}
603
604
605static void keyspan_pda_write_bulk_callback(struct urb *urb)
606{
607 struct usb_serial_port *port = urb->context;
608 struct keyspan_pda_private *priv;
609
610 port->write_urb_busy = 0;
611 priv = usb_get_serial_port_data(port);
612
613
614 schedule_work(&priv->wakeup_work);
615}
616
617
618static int keyspan_pda_write_room(struct tty_struct *tty)
619{
620 struct usb_serial_port *port = tty->driver_data;
621 struct keyspan_pda_private *priv;
622 priv = usb_get_serial_port_data(port);
623
624
625
626 return priv->tx_room;
627}
628
629
630static int keyspan_pda_chars_in_buffer(struct tty_struct *tty)
631{
632 struct usb_serial_port *port = tty->driver_data;
633 struct keyspan_pda_private *priv;
634 unsigned long flags;
635 int ret = 0;
636
637 priv = usb_get_serial_port_data(port);
638
639
640
641
642 spin_lock_irqsave(&port->lock, flags);
643 if (port->write_urb_busy || priv->tx_throttled)
644 ret = 256;
645 spin_unlock_irqrestore(&port->lock, flags);
646 return ret;
647}
648
649
650static int keyspan_pda_open(struct tty_struct *tty,
651 struct usb_serial_port *port, struct file *filp)
652{
653 struct usb_serial *serial = port->serial;
654 unsigned char room;
655 int rc = 0;
656 struct keyspan_pda_private *priv;
657
658
659 rc = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
660 6,
661 USB_TYPE_VENDOR | USB_RECIP_INTERFACE
662 | USB_DIR_IN,
663 0,
664 0,
665 &room,
666 1,
667 2000);
668 if (rc < 0) {
669 dbg("%s - roomquery failed", __func__);
670 goto error;
671 }
672 if (rc == 0) {
673 dbg("%s - roomquery returned 0 bytes", __func__);
674 rc = -EIO;
675 goto error;
676 }
677 priv = usb_get_serial_port_data(port);
678 priv->tx_room = room;
679 priv->tx_throttled = room ? 0 : 1;
680
681
682
683 if (tty && (tty->termios->c_cflag & CBAUD))
684 keyspan_pda_set_modem_info(serial, (1<<7) | (1<<2));
685 else
686 keyspan_pda_set_modem_info(serial, 0);
687
688
689 port->interrupt_in_urb->dev = serial->dev;
690 rc = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
691 if (rc) {
692 dbg("%s - usb_submit_urb(read int) failed", __func__);
693 goto error;
694 }
695
696error:
697 return rc;
698}
699
700
701static void keyspan_pda_close(struct tty_struct *tty,
702 struct usb_serial_port *port, struct file *filp)
703{
704 struct usb_serial *serial = port->serial;
705
706 if (serial->dev) {
707
708
709 if (tty->termios->c_cflag & HUPCL)
710 keyspan_pda_set_modem_info(serial, 0);
711
712
713 usb_kill_urb(port->write_urb);
714 usb_kill_urb(port->interrupt_in_urb);
715 }
716}
717
718
719
720static int keyspan_pda_fake_startup(struct usb_serial *serial)
721{
722 int response;
723 const char *fw_name;
724 const struct ihex_binrec *record;
725 const struct firmware *fw;
726
727
728 response = ezusb_set_reset(serial, 1);
729
730 if (0) { ; }
731#ifdef KEYSPAN
732 else if (le16_to_cpu(serial->dev->descriptor.idVendor) == KEYSPAN_VENDOR_ID)
733 fw_name = "keyspan_pda/keyspan_pda.fw";
734#endif
735#ifdef XIRCOM
736 else if ((le16_to_cpu(serial->dev->descriptor.idVendor) == XIRCOM_VENDOR_ID) ||
737 (le16_to_cpu(serial->dev->descriptor.idVendor) == ENTREGRA_VENDOR_ID))
738 fw_name = "keyspan_pda/xircom_pgs.fw";
739#endif
740 else {
741 err("%s: unknown vendor, aborting.", __func__);
742 return -ENODEV;
743 }
744 if (request_ihex_firmware(&fw, fw_name, &serial->dev->dev)) {
745 err("failed to load firmware \"%s\"\n", fw_name);
746 return -ENOENT;
747 }
748 record = (const struct ihex_binrec *)fw->data;
749
750 while (record) {
751 response = ezusb_writememory(serial, be32_to_cpu(record->addr),
752 (unsigned char *)record->data,
753 be16_to_cpu(record->len), 0xa0);
754 if (response < 0) {
755 err("ezusb_writememory failed for Keyspan PDA "
756 "firmware (%d %04X %p %d)",
757 response, be32_to_cpu(record->addr),
758 record->data, be16_to_cpu(record->len));
759 break;
760 }
761 record = ihex_next_binrec(record);
762 }
763 release_firmware(fw);
764
765
766 response = ezusb_set_reset(serial, 0);
767
768
769 return 1;
770}
771
772static int keyspan_pda_startup(struct usb_serial *serial)
773{
774
775 struct keyspan_pda_private *priv;
776
777
778
779
780 priv = kmalloc(sizeof(struct keyspan_pda_private), GFP_KERNEL);
781 if (!priv)
782 return 1;
783 usb_set_serial_port_data(serial->port[0], priv);
784 init_waitqueue_head(&serial->port[0]->write_wait);
785 INIT_WORK(&priv->wakeup_work, keyspan_pda_wakeup_write);
786 INIT_WORK(&priv->unthrottle_work, keyspan_pda_request_unthrottle);
787 priv->serial = serial;
788 priv->port = serial->port[0];
789 return 0;
790}
791
792static void keyspan_pda_release(struct usb_serial *serial)
793{
794 dbg("%s", __func__);
795
796 kfree(usb_get_serial_port_data(serial->port[0]));
797}
798
799#ifdef KEYSPAN
800static struct usb_serial_driver keyspan_pda_fake_device = {
801 .driver = {
802 .owner = THIS_MODULE,
803 .name = "keyspan_pda_pre",
804 },
805 .description = "Keyspan PDA - (prerenumeration)",
806 .usb_driver = &keyspan_pda_driver,
807 .id_table = id_table_fake,
808 .num_ports = 1,
809 .attach = keyspan_pda_fake_startup,
810};
811#endif
812
813#ifdef XIRCOM
814static struct usb_serial_driver xircom_pgs_fake_device = {
815 .driver = {
816 .owner = THIS_MODULE,
817 .name = "xircom_no_firm",
818 },
819 .description = "Xircom / Entregra PGS - (prerenumeration)",
820 .usb_driver = &keyspan_pda_driver,
821 .id_table = id_table_fake_xircom,
822 .num_ports = 1,
823 .attach = keyspan_pda_fake_startup,
824};
825#endif
826
827static struct usb_serial_driver keyspan_pda_device = {
828 .driver = {
829 .owner = THIS_MODULE,
830 .name = "keyspan_pda",
831 },
832 .description = "Keyspan PDA",
833 .usb_driver = &keyspan_pda_driver,
834 .id_table = id_table_std,
835 .num_ports = 1,
836 .open = keyspan_pda_open,
837 .close = keyspan_pda_close,
838 .write = keyspan_pda_write,
839 .write_room = keyspan_pda_write_room,
840 .write_bulk_callback = keyspan_pda_write_bulk_callback,
841 .read_int_callback = keyspan_pda_rx_interrupt,
842 .chars_in_buffer = keyspan_pda_chars_in_buffer,
843 .throttle = keyspan_pda_rx_throttle,
844 .unthrottle = keyspan_pda_rx_unthrottle,
845 .set_termios = keyspan_pda_set_termios,
846 .break_ctl = keyspan_pda_break_ctl,
847 .tiocmget = keyspan_pda_tiocmget,
848 .tiocmset = keyspan_pda_tiocmset,
849 .attach = keyspan_pda_startup,
850 .release = keyspan_pda_release,
851};
852
853
854static int __init keyspan_pda_init(void)
855{
856 int retval;
857 retval = usb_serial_register(&keyspan_pda_device);
858 if (retval)
859 goto failed_pda_register;
860#ifdef KEYSPAN
861 retval = usb_serial_register(&keyspan_pda_fake_device);
862 if (retval)
863 goto failed_pda_fake_register;
864#endif
865#ifdef XIRCOM
866 retval = usb_serial_register(&xircom_pgs_fake_device);
867 if (retval)
868 goto failed_xircom_register;
869#endif
870 retval = usb_register(&keyspan_pda_driver);
871 if (retval)
872 goto failed_usb_register;
873 info(DRIVER_DESC " " DRIVER_VERSION);
874 return 0;
875failed_usb_register:
876#ifdef XIRCOM
877 usb_serial_deregister(&xircom_pgs_fake_device);
878failed_xircom_register:
879#endif
880#ifdef KEYSPAN
881 usb_serial_deregister(&keyspan_pda_fake_device);
882#endif
883#ifdef KEYSPAN
884failed_pda_fake_register:
885#endif
886 usb_serial_deregister(&keyspan_pda_device);
887failed_pda_register:
888 return retval;
889}
890
891
892static void __exit keyspan_pda_exit(void)
893{
894 usb_deregister(&keyspan_pda_driver);
895 usb_serial_deregister(&keyspan_pda_device);
896#ifdef KEYSPAN
897 usb_serial_deregister(&keyspan_pda_fake_device);
898#endif
899#ifdef XIRCOM
900 usb_serial_deregister(&xircom_pgs_fake_device);
901#endif
902}
903
904
905module_init(keyspan_pda_init);
906module_exit(keyspan_pda_exit);
907
908MODULE_AUTHOR(DRIVER_AUTHOR);
909MODULE_DESCRIPTION(DRIVER_DESC);
910MODULE_LICENSE("GPL");
911
912module_param(debug, bool, S_IRUGO | S_IWUSR);
913MODULE_PARM_DESC(debug, "Debug enabled or not");
914
915