MOXA linux-2.6.x / linux-2.6.19-uc1 from UC-7110-LX-BOOTLOADER-1.9_VERSION-4.2.tgz
[linux-2.6.19-moxart.git] / drivers / usb / serial / option.c
blob130afbbd3fca6c97b9e8c9400961b1583eca6c72
1 /*
2 USB Driver for GSM modems
4 Copyright (C) 2005 Matthias Urlichs <smurf@smurf.noris.de>
6 This driver is free software; you can redistribute it and/or modify
7 it under the terms of Version 2 of the GNU General Public License as
8 published by the Free Software Foundation.
10 Portions copied from the Keyspan driver by Hugh Blemings <hugh@blemings.org>
12 History: see the git log.
14 Work sponsored by: Sigos GmbH, Germany <info@sigos.de>
16 This driver exists because the "normal" serial driver doesn't work too well
17 with GSM modems. Issues:
18 - data loss -- one single Receive URB is not nearly enough
19 - nonstandard flow (Option devices) control
20 - controlling the baud rate doesn't make sense
22 This driver is named "option" because the most common device it's
23 used for is a PC-Card (with an internal OHCI-USB interface, behind
24 which the GSM interface sits), made by Option Inc.
26 Some of the "one port" devices actually exhibit multiple USB instances
27 on the USB bus. This is not a bug, these ports are used for different
28 device features.
31 #define DRIVER_VERSION "v0.7.1"
32 #define DRIVER_AUTHOR "Matthias Urlichs <smurf@smurf.noris.de>"
33 #define DRIVER_DESC "USB Driver for GSM modems"
35 #include <linux/kernel.h>
36 #include <linux/jiffies.h>
37 #include <linux/errno.h>
38 #include <linux/tty.h>
39 #include <linux/tty_flip.h>
40 #include <linux/module.h>
41 #include <linux/usb.h>
42 #include <linux/usb/serial.h>
44 /* Function prototypes */
45 static int option_open(struct usb_serial_port *port, struct file *filp);
46 static void option_close(struct usb_serial_port *port, struct file *filp);
47 static int option_startup(struct usb_serial *serial);
48 static void option_shutdown(struct usb_serial *serial);
49 static void option_rx_throttle(struct usb_serial_port *port);
50 static void option_rx_unthrottle(struct usb_serial_port *port);
51 static int option_write_room(struct usb_serial_port *port);
53 static void option_instat_callback(struct urb *urb);
55 static int option_write(struct usb_serial_port *port,
56 const unsigned char *buf, int count);
58 static int option_chars_in_buffer(struct usb_serial_port *port);
59 static int option_ioctl(struct usb_serial_port *port, struct file *file,
60 unsigned int cmd, unsigned long arg);
61 static void option_set_termios(struct usb_serial_port *port,
62 struct termios *old);
63 static void option_break_ctl(struct usb_serial_port *port, int break_state);
64 static int option_tiocmget(struct usb_serial_port *port, struct file *file);
65 static int option_tiocmset(struct usb_serial_port *port, struct file *file,
66 unsigned int set, unsigned int clear);
67 static int option_send_setup(struct usb_serial_port *port);
69 /* Vendor and product IDs */
70 #define OPTION_VENDOR_ID 0x0AF0
71 #define HUAWEI_VENDOR_ID 0x12D1
72 #define AUDIOVOX_VENDOR_ID 0x0F3D
73 #define NOVATELWIRELESS_VENDOR_ID 0x1410
74 #define ANYDATA_VENDOR_ID 0x16d5
76 #define OPTION_PRODUCT_OLD 0x5000
77 #define OPTION_PRODUCT_FUSION 0x6000
78 #define OPTION_PRODUCT_FUSION2 0x6300
79 #define OPTION_PRODUCT_COBRA 0x6500
80 #define OPTION_PRODUCT_COBRA2 0x6600
81 #define HUAWEI_PRODUCT_E600 0x1001
82 #define AUDIOVOX_PRODUCT_AIRCARD 0x0112
83 #define NOVATELWIRELESS_PRODUCT_U740 0x1400
84 #define ANYDATA_PRODUCT_ID 0x6501
86 static struct usb_device_id option_ids[] = {
87 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_OLD) },
88 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION) },
89 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION2) },
90 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA) },
91 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA2) },
92 { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600) },
93 { USB_DEVICE(AUDIOVOX_VENDOR_ID, AUDIOVOX_PRODUCT_AIRCARD) },
94 { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID,NOVATELWIRELESS_PRODUCT_U740) },
95 { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ID) },
96 { } /* Terminating entry */
99 static struct usb_device_id option_ids1[] = {
100 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_OLD) },
101 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION) },
102 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION2) },
103 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA) },
104 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA2) },
105 { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600) },
106 { USB_DEVICE(AUDIOVOX_VENDOR_ID, AUDIOVOX_PRODUCT_AIRCARD) },
107 { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID,NOVATELWIRELESS_PRODUCT_U740) },
108 { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ID) },
109 { } /* Terminating entry */
112 MODULE_DEVICE_TABLE(usb, option_ids);
114 static struct usb_driver option_driver = {
115 .name = "option",
116 .probe = usb_serial_probe,
117 .disconnect = usb_serial_disconnect,
118 .id_table = option_ids,
119 .no_dynamic_id = 1,
122 /* The card has three separate interfaces, which the serial driver
123 * recognizes separately, thus num_port=1.
126 static struct usb_serial_driver option_1port_device = {
127 .driver = {
128 .owner = THIS_MODULE,
129 .name = "option1",
131 .description = "GSM modem (1-port)",
132 .id_table = option_ids1,
133 .num_interrupt_in = NUM_DONT_CARE,
134 .num_bulk_in = NUM_DONT_CARE,
135 .num_bulk_out = NUM_DONT_CARE,
136 .num_ports = 1,
137 .open = option_open,
138 .close = option_close,
139 .write = option_write,
140 .write_room = option_write_room,
141 .chars_in_buffer = option_chars_in_buffer,
142 .throttle = option_rx_throttle,
143 .unthrottle = option_rx_unthrottle,
144 .ioctl = option_ioctl,
145 .set_termios = option_set_termios,
146 .break_ctl = option_break_ctl,
147 .tiocmget = option_tiocmget,
148 .tiocmset = option_tiocmset,
149 .attach = option_startup,
150 .shutdown = option_shutdown,
151 .read_int_callback = option_instat_callback,
154 #ifdef CONFIG_USB_DEBUG
155 static int debug;
156 #else
157 #define debug 0
158 #endif
160 /* per port private data */
162 #define N_IN_URB 4
163 #define N_OUT_URB 1
164 #define IN_BUFLEN 4096
165 #define OUT_BUFLEN 128
167 struct option_port_private {
168 /* Input endpoints and buffer for this port */
169 struct urb *in_urbs[N_IN_URB];
170 char in_buffer[N_IN_URB][IN_BUFLEN];
171 /* Output endpoints and buffer for this port */
172 struct urb *out_urbs[N_OUT_URB];
173 char out_buffer[N_OUT_URB][OUT_BUFLEN];
175 /* Settings for the port */
176 int rts_state; /* Handshaking pins (outputs) */
177 int dtr_state;
178 int cts_state; /* Handshaking pins (inputs) */
179 int dsr_state;
180 int dcd_state;
181 int ri_state;
183 unsigned long tx_start_time[N_OUT_URB];
186 /* Functions used by new usb-serial code. */
187 static int __init option_init(void)
189 int retval;
190 retval = usb_serial_register(&option_1port_device);
191 if (retval)
192 goto failed_1port_device_register;
193 retval = usb_register(&option_driver);
194 if (retval)
195 goto failed_driver_register;
197 info(DRIVER_DESC ": " DRIVER_VERSION);
199 return 0;
201 failed_driver_register:
202 usb_serial_deregister (&option_1port_device);
203 failed_1port_device_register:
204 return retval;
207 static void __exit option_exit(void)
209 usb_deregister (&option_driver);
210 usb_serial_deregister (&option_1port_device);
213 module_init(option_init);
214 module_exit(option_exit);
216 static void option_rx_throttle(struct usb_serial_port *port)
218 dbg("%s", __FUNCTION__);
221 static void option_rx_unthrottle(struct usb_serial_port *port)
223 dbg("%s", __FUNCTION__);
226 static void option_break_ctl(struct usb_serial_port *port, int break_state)
228 /* Unfortunately, I don't know how to send a break */
229 dbg("%s", __FUNCTION__);
232 static void option_set_termios(struct usb_serial_port *port,
233 struct termios *old_termios)
235 dbg("%s", __FUNCTION__);
237 option_send_setup(port);
240 static int option_tiocmget(struct usb_serial_port *port, struct file *file)
242 unsigned int value;
243 struct option_port_private *portdata;
245 portdata = usb_get_serial_port_data(port);
247 value = ((portdata->rts_state) ? TIOCM_RTS : 0) |
248 ((portdata->dtr_state) ? TIOCM_DTR : 0) |
249 ((portdata->cts_state) ? TIOCM_CTS : 0) |
250 ((portdata->dsr_state) ? TIOCM_DSR : 0) |
251 ((portdata->dcd_state) ? TIOCM_CAR : 0) |
252 ((portdata->ri_state) ? TIOCM_RNG : 0);
254 return value;
257 static int option_tiocmset(struct usb_serial_port *port, struct file *file,
258 unsigned int set, unsigned int clear)
260 struct option_port_private *portdata;
262 portdata = usb_get_serial_port_data(port);
264 if (set & TIOCM_RTS)
265 portdata->rts_state = 1;
266 if (set & TIOCM_DTR)
267 portdata->dtr_state = 1;
269 if (clear & TIOCM_RTS)
270 portdata->rts_state = 0;
271 if (clear & TIOCM_DTR)
272 portdata->dtr_state = 0;
273 return option_send_setup(port);
276 static int option_ioctl(struct usb_serial_port *port, struct file *file,
277 unsigned int cmd, unsigned long arg)
279 return -ENOIOCTLCMD;
282 /* Write */
283 static int option_write(struct usb_serial_port *port,
284 const unsigned char *buf, int count)
286 struct option_port_private *portdata;
287 int i;
288 int left, todo;
289 struct urb *this_urb = NULL; /* spurious */
290 int err;
292 portdata = usb_get_serial_port_data(port);
294 dbg("%s: write (%d chars)", __FUNCTION__, count);
296 i = 0;
297 left = count;
298 for (i=0; left > 0 && i < N_OUT_URB; i++) {
299 todo = left;
300 if (todo > OUT_BUFLEN)
301 todo = OUT_BUFLEN;
303 this_urb = portdata->out_urbs[i];
304 if (this_urb->status == -EINPROGRESS) {
305 if (time_before(jiffies,
306 portdata->tx_start_time[i] + 10 * HZ))
307 continue;
308 usb_unlink_urb(this_urb);
309 continue;
311 if (this_urb->status != 0)
312 dbg("usb_write %p failed (err=%d)",
313 this_urb, this_urb->status);
315 dbg("%s: endpoint %d buf %d", __FUNCTION__,
316 usb_pipeendpoint(this_urb->pipe), i);
318 /* send the data */
319 memcpy (this_urb->transfer_buffer, buf, todo);
320 this_urb->transfer_buffer_length = todo;
322 this_urb->dev = port->serial->dev;
323 err = usb_submit_urb(this_urb, GFP_ATOMIC);
324 if (err) {
325 dbg("usb_submit_urb %p (write bulk) failed "
326 "(%d, has %d)", this_urb,
327 err, this_urb->status);
328 continue;
330 portdata->tx_start_time[i] = jiffies;
331 buf += todo;
332 left -= todo;
335 count -= left;
336 dbg("%s: wrote (did %d)", __FUNCTION__, count);
337 return count;
340 static void option_indat_callback(struct urb *urb)
342 int err;
343 int endpoint;
344 struct usb_serial_port *port;
345 struct tty_struct *tty;
346 unsigned char *data = urb->transfer_buffer;
348 dbg("%s: %p", __FUNCTION__, urb);
350 endpoint = usb_pipeendpoint(urb->pipe);
351 port = (struct usb_serial_port *) urb->context;
353 if (urb->status) {
354 dbg("%s: nonzero status: %d on endpoint %02x.",
355 __FUNCTION__, urb->status, endpoint);
356 } else {
357 tty = port->tty;
358 if (urb->actual_length) {
359 tty_buffer_request_room(tty, urb->actual_length);
360 tty_insert_flip_string(tty, data, urb->actual_length);
361 tty_flip_buffer_push(tty);
362 } else {
363 dbg("%s: empty read urb received", __FUNCTION__);
366 /* Resubmit urb so we continue receiving */
367 if (port->open_count && urb->status != -ESHUTDOWN) {
368 err = usb_submit_urb(urb, GFP_ATOMIC);
369 if (err)
370 printk(KERN_ERR "%s: resubmit read urb failed. "
371 "(%d)", __FUNCTION__, err);
374 return;
377 static void option_outdat_callback(struct urb *urb)
379 struct usb_serial_port *port;
381 dbg("%s", __FUNCTION__);
383 port = (struct usb_serial_port *) urb->context;
385 usb_serial_port_softint(port);
388 static void option_instat_callback(struct urb *urb)
390 int err;
391 struct usb_serial_port *port = (struct usb_serial_port *) urb->context;
392 struct option_port_private *portdata = usb_get_serial_port_data(port);
393 struct usb_serial *serial = port->serial;
395 dbg("%s", __FUNCTION__);
396 dbg("%s: urb %p port %p has data %p", __FUNCTION__,urb,port,portdata);
398 if (urb->status == 0) {
399 struct usb_ctrlrequest *req_pkt =
400 (struct usb_ctrlrequest *)urb->transfer_buffer;
402 if (!req_pkt) {
403 dbg("%s: NULL req_pkt\n", __FUNCTION__);
404 return;
406 if ((req_pkt->bRequestType == 0xA1) &&
407 (req_pkt->bRequest == 0x20)) {
408 int old_dcd_state;
409 unsigned char signals = *((unsigned char *)
410 urb->transfer_buffer +
411 sizeof(struct usb_ctrlrequest));
413 dbg("%s: signal x%x", __FUNCTION__, signals);
415 old_dcd_state = portdata->dcd_state;
416 portdata->cts_state = 1;
417 portdata->dcd_state = ((signals & 0x01) ? 1 : 0);
418 portdata->dsr_state = ((signals & 0x02) ? 1 : 0);
419 portdata->ri_state = ((signals & 0x08) ? 1 : 0);
421 if (port->tty && !C_CLOCAL(port->tty) &&
422 old_dcd_state && !portdata->dcd_state)
423 tty_hangup(port->tty);
424 } else {
425 dbg("%s: type %x req %x", __FUNCTION__,
426 req_pkt->bRequestType,req_pkt->bRequest);
428 } else
429 dbg("%s: error %d", __FUNCTION__, urb->status);
431 /* Resubmit urb so we continue receiving IRQ data */
432 if (urb->status != -ESHUTDOWN) {
433 urb->dev = serial->dev;
434 err = usb_submit_urb(urb, GFP_ATOMIC);
435 if (err)
436 dbg("%s: resubmit intr urb failed. (%d)",
437 __FUNCTION__, err);
441 static int option_write_room(struct usb_serial_port *port)
443 struct option_port_private *portdata;
444 int i;
445 int data_len = 0;
446 struct urb *this_urb;
448 portdata = usb_get_serial_port_data(port);
450 for (i=0; i < N_OUT_URB; i++) {
451 this_urb = portdata->out_urbs[i];
452 if (this_urb && this_urb->status != -EINPROGRESS)
453 data_len += OUT_BUFLEN;
456 dbg("%s: %d", __FUNCTION__, data_len);
457 return data_len;
460 static int option_chars_in_buffer(struct usb_serial_port *port)
462 struct option_port_private *portdata;
463 int i;
464 int data_len = 0;
465 struct urb *this_urb;
467 portdata = usb_get_serial_port_data(port);
469 for (i=0; i < N_OUT_URB; i++) {
470 this_urb = portdata->out_urbs[i];
471 if (this_urb && this_urb->status == -EINPROGRESS)
472 data_len += this_urb->transfer_buffer_length;
474 dbg("%s: %d", __FUNCTION__, data_len);
475 return data_len;
478 static int option_open(struct usb_serial_port *port, struct file *filp)
480 struct option_port_private *portdata;
481 struct usb_serial *serial = port->serial;
482 int i, err;
483 struct urb *urb;
485 portdata = usb_get_serial_port_data(port);
487 dbg("%s", __FUNCTION__);
489 /* Set some sane defaults */
490 portdata->rts_state = 1;
491 portdata->dtr_state = 1;
493 /* Reset low level data toggle and start reading from endpoints */
494 for (i = 0; i < N_IN_URB; i++) {
495 urb = portdata->in_urbs[i];
496 if (! urb)
497 continue;
498 if (urb->dev != serial->dev) {
499 dbg("%s: dev %p != %p", __FUNCTION__,
500 urb->dev, serial->dev);
501 continue;
505 * make sure endpoint data toggle is synchronized with the
506 * device
508 usb_clear_halt(urb->dev, urb->pipe);
510 err = usb_submit_urb(urb, GFP_KERNEL);
511 if (err) {
512 dbg("%s: submit urb %d failed (%d) %d",
513 __FUNCTION__, i, err,
514 urb->transfer_buffer_length);
518 /* Reset low level data toggle on out endpoints */
519 for (i = 0; i < N_OUT_URB; i++) {
520 urb = portdata->out_urbs[i];
521 if (! urb)
522 continue;
523 urb->dev = serial->dev;
524 /* usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe),
525 usb_pipeout(urb->pipe), 0); */
528 port->tty->low_latency = 1;
530 option_send_setup(port);
532 return (0);
535 static inline void stop_urb(struct urb *urb)
537 if (urb && urb->status == -EINPROGRESS)
538 usb_kill_urb(urb);
541 static void option_close(struct usb_serial_port *port, struct file *filp)
543 int i;
544 struct usb_serial *serial = port->serial;
545 struct option_port_private *portdata;
547 dbg("%s", __FUNCTION__);
548 portdata = usb_get_serial_port_data(port);
550 portdata->rts_state = 0;
551 portdata->dtr_state = 0;
553 if (serial->dev) {
554 option_send_setup(port);
556 /* Stop reading/writing urbs */
557 for (i = 0; i < N_IN_URB; i++)
558 stop_urb(portdata->in_urbs[i]);
559 for (i = 0; i < N_OUT_URB; i++)
560 stop_urb(portdata->out_urbs[i]);
562 port->tty = NULL;
565 /* Helper functions used by option_setup_urbs */
566 static struct urb *option_setup_urb(struct usb_serial *serial, int endpoint,
567 int dir, void *ctx, char *buf, int len,
568 void (*callback)(struct urb *))
570 struct urb *urb;
572 if (endpoint == -1)
573 return NULL; /* endpoint not needed */
575 urb = usb_alloc_urb(0, GFP_KERNEL); /* No ISO */
576 if (urb == NULL) {
577 dbg("%s: alloc for endpoint %d failed.", __FUNCTION__, endpoint);
578 return NULL;
581 /* Fill URB using supplied data. */
582 usb_fill_bulk_urb(urb, serial->dev,
583 usb_sndbulkpipe(serial->dev, endpoint) | dir,
584 buf, len, callback, ctx);
586 return urb;
589 /* Setup urbs */
590 static void option_setup_urbs(struct usb_serial *serial)
592 int i,j;
593 struct usb_serial_port *port;
594 struct option_port_private *portdata;
596 dbg("%s", __FUNCTION__);
598 for (i = 0; i < serial->num_ports; i++) {
599 port = serial->port[i];
600 portdata = usb_get_serial_port_data(port);
602 /* Do indat endpoints first */
603 for (j = 0; j < N_IN_URB; ++j) {
604 portdata->in_urbs[j] = option_setup_urb (serial,
605 port->bulk_in_endpointAddress, USB_DIR_IN, port,
606 portdata->in_buffer[j], IN_BUFLEN, option_indat_callback);
609 /* outdat endpoints */
610 for (j = 0; j < N_OUT_URB; ++j) {
611 portdata->out_urbs[j] = option_setup_urb (serial,
612 port->bulk_out_endpointAddress, USB_DIR_OUT, port,
613 portdata->out_buffer[j], OUT_BUFLEN, option_outdat_callback);
618 static int option_send_setup(struct usb_serial_port *port)
620 struct usb_serial *serial = port->serial;
621 struct option_port_private *portdata;
623 dbg("%s", __FUNCTION__);
625 portdata = usb_get_serial_port_data(port);
627 if (port->tty) {
628 int val = 0;
629 if (portdata->dtr_state)
630 val |= 0x01;
631 if (portdata->rts_state)
632 val |= 0x02;
634 return usb_control_msg(serial->dev,
635 usb_rcvctrlpipe(serial->dev, 0),
636 0x22,0x21,val,0,NULL,0,USB_CTRL_SET_TIMEOUT);
639 return 0;
642 static int option_startup(struct usb_serial *serial)
644 int i, err;
645 struct usb_serial_port *port;
646 struct option_port_private *portdata;
648 dbg("%s", __FUNCTION__);
650 /* Now setup per port private data */
651 for (i = 0; i < serial->num_ports; i++) {
652 port = serial->port[i];
653 portdata = kzalloc(sizeof(*portdata), GFP_KERNEL);
654 if (!portdata) {
655 dbg("%s: kmalloc for option_port_private (%d) failed!.",
656 __FUNCTION__, i);
657 return (1);
660 usb_set_serial_port_data(port, portdata);
662 if (! port->interrupt_in_urb)
663 continue;
664 err = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
665 if (err)
666 dbg("%s: submit irq_in urb failed %d",
667 __FUNCTION__, err);
670 option_setup_urbs(serial);
672 return (0);
675 static void option_shutdown(struct usb_serial *serial)
677 int i, j;
678 struct usb_serial_port *port;
679 struct option_port_private *portdata;
681 dbg("%s", __FUNCTION__);
683 /* Stop reading/writing urbs */
684 for (i = 0; i < serial->num_ports; ++i) {
685 port = serial->port[i];
686 portdata = usb_get_serial_port_data(port);
687 for (j = 0; j < N_IN_URB; j++)
688 stop_urb(portdata->in_urbs[j]);
689 for (j = 0; j < N_OUT_URB; j++)
690 stop_urb(portdata->out_urbs[j]);
693 /* Now free them */
694 for (i = 0; i < serial->num_ports; ++i) {
695 port = serial->port[i];
696 portdata = usb_get_serial_port_data(port);
698 for (j = 0; j < N_IN_URB; j++) {
699 if (portdata->in_urbs[j]) {
700 usb_free_urb(portdata->in_urbs[j]);
701 portdata->in_urbs[j] = NULL;
704 for (j = 0; j < N_OUT_URB; j++) {
705 if (portdata->out_urbs[j]) {
706 usb_free_urb(portdata->out_urbs[j]);
707 portdata->out_urbs[j] = NULL;
712 /* Now free per port private data */
713 for (i = 0; i < serial->num_ports; i++) {
714 port = serial->port[i];
715 kfree(usb_get_serial_port_data(port));
719 MODULE_AUTHOR(DRIVER_AUTHOR);
720 MODULE_DESCRIPTION(DRIVER_DESC);
721 MODULE_VERSION(DRIVER_VERSION);
722 MODULE_LICENSE("GPL");
724 #ifdef CONFIG_USB_DEBUG
725 module_param(debug, bool, S_IRUGO | S_IWUSR);
726 MODULE_PARM_DESC(debug, "Debug messages");
727 #endif