diff options
Diffstat (limited to 'drivers/net/usb/hso.c')
-rw-r--r-- | drivers/net/usb/hso.c | 56 |
1 files changed, 32 insertions, 24 deletions
diff --git a/drivers/net/usb/hso.c b/drivers/net/usb/hso.c index 031d07b105af..6e42b5a8c22b 100644 --- a/drivers/net/usb/hso.c +++ b/drivers/net/usb/hso.c | |||
@@ -102,8 +102,12 @@ | |||
102 | 102 | ||
103 | #define MAX_RX_URBS 2 | 103 | #define MAX_RX_URBS 2 |
104 | 104 | ||
105 | #define get_serial_by_tty(x) \ | 105 | static inline struct hso_serial *get_serial_by_tty(struct tty_struct *tty) |
106 | (x ? (struct hso_serial *)x->driver_data : NULL) | 106 | { |
107 | if (tty) | ||
108 | return tty->driver_data; | ||
109 | return NULL; | ||
110 | } | ||
107 | 111 | ||
108 | /*****************************************************************************/ | 112 | /*****************************************************************************/ |
109 | /* Debugging functions */ | 113 | /* Debugging functions */ |
@@ -294,24 +298,25 @@ static int hso_get_activity(struct hso_device *hso_dev); | |||
294 | 298 | ||
295 | /* #define DEBUG */ | 299 | /* #define DEBUG */ |
296 | 300 | ||
297 | #define dev2net(x) (x->port_data.dev_net) | 301 | static inline struct hso_net *dev2net(struct hso_device *hso_dev) |
298 | #define dev2ser(x) (x->port_data.dev_serial) | 302 | { |
303 | return hso_dev->port_data.dev_net; | ||
304 | } | ||
305 | |||
306 | static inline struct hso_serial *dev2ser(struct hso_device *hso_dev) | ||
307 | { | ||
308 | return hso_dev->port_data.dev_serial; | ||
309 | } | ||
299 | 310 | ||
300 | /* Debugging functions */ | 311 | /* Debugging functions */ |
301 | #ifdef DEBUG | 312 | #ifdef DEBUG |
302 | static void dbg_dump(int line_count, const char *func_name, unsigned char *buf, | 313 | static void dbg_dump(int line_count, const char *func_name, unsigned char *buf, |
303 | unsigned int len) | 314 | unsigned int len) |
304 | { | 315 | { |
305 | u8 i = 0; | 316 | static char name[255]; |
306 | 317 | ||
307 | printk(KERN_DEBUG "[%d:%s]: len %d", line_count, func_name, len); | 318 | sprintf(name, "hso[%d:%s]", line_count, func_name); |
308 | 319 | print_hex_dump_bytes(name, DUMP_PREFIX_NONE, buf, len); | |
309 | for (i = 0; i < len; i++) { | ||
310 | if (!(i % 16)) | ||
311 | printk("\n 0x%03x: ", i); | ||
312 | printk("%02x ", (unsigned char)buf[i]); | ||
313 | } | ||
314 | printk("\n"); | ||
315 | } | 320 | } |
316 | 321 | ||
317 | #define DUMP(buf_, len_) \ | 322 | #define DUMP(buf_, len_) \ |
@@ -392,7 +397,7 @@ static const struct usb_device_id hso_ids[] = { | |||
392 | {default_port_device(0x0af0, 0xc031)}, /* Icon-Edge */ | 397 | {default_port_device(0x0af0, 0xc031)}, /* Icon-Edge */ |
393 | {icon321_port_device(0x0af0, 0xd013)}, /* Module HSxPA */ | 398 | {icon321_port_device(0x0af0, 0xd013)}, /* Module HSxPA */ |
394 | {icon321_port_device(0x0af0, 0xd031)}, /* Icon-321 */ | 399 | {icon321_port_device(0x0af0, 0xd031)}, /* Icon-321 */ |
395 | {default_port_device(0x0af0, 0xd033)}, /* Icon-322 */ | 400 | {icon321_port_device(0x0af0, 0xd033)}, /* Icon-322 */ |
396 | {USB_DEVICE(0x0af0, 0x7301)}, /* GE40x */ | 401 | {USB_DEVICE(0x0af0, 0x7301)}, /* GE40x */ |
397 | {USB_DEVICE(0x0af0, 0x7361)}, /* GE40x */ | 402 | {USB_DEVICE(0x0af0, 0x7361)}, /* GE40x */ |
398 | {USB_DEVICE(0x0af0, 0x7401)}, /* GI 0401 */ | 403 | {USB_DEVICE(0x0af0, 0x7401)}, /* GI 0401 */ |
@@ -528,13 +533,12 @@ static struct hso_serial *get_serial_by_shared_int_and_type( | |||
528 | 533 | ||
529 | static struct hso_serial *get_serial_by_index(unsigned index) | 534 | static struct hso_serial *get_serial_by_index(unsigned index) |
530 | { | 535 | { |
531 | struct hso_serial *serial; | 536 | struct hso_serial *serial = NULL; |
532 | unsigned long flags; | 537 | unsigned long flags; |
533 | 538 | ||
534 | if (!serial_table[index]) | ||
535 | return NULL; | ||
536 | spin_lock_irqsave(&serial_table_lock, flags); | 539 | spin_lock_irqsave(&serial_table_lock, flags); |
537 | serial = dev2ser(serial_table[index]); | 540 | if (serial_table[index]) |
541 | serial = dev2ser(serial_table[index]); | ||
538 | spin_unlock_irqrestore(&serial_table_lock, flags); | 542 | spin_unlock_irqrestore(&serial_table_lock, flags); |
539 | 543 | ||
540 | return serial; | 544 | return serial; |
@@ -561,6 +565,7 @@ static int get_free_serial_index(void) | |||
561 | static void set_serial_by_index(unsigned index, struct hso_serial *serial) | 565 | static void set_serial_by_index(unsigned index, struct hso_serial *serial) |
562 | { | 566 | { |
563 | unsigned long flags; | 567 | unsigned long flags; |
568 | |||
564 | spin_lock_irqsave(&serial_table_lock, flags); | 569 | spin_lock_irqsave(&serial_table_lock, flags); |
565 | if (serial) | 570 | if (serial) |
566 | serial_table[index] = serial->parent; | 571 | serial_table[index] = serial->parent; |
@@ -569,7 +574,7 @@ static void set_serial_by_index(unsigned index, struct hso_serial *serial) | |||
569 | spin_unlock_irqrestore(&serial_table_lock, flags); | 574 | spin_unlock_irqrestore(&serial_table_lock, flags); |
570 | } | 575 | } |
571 | 576 | ||
572 | /* log a meaningfull explanation of an USB status */ | 577 | /* log a meaningful explanation of an USB status */ |
573 | static void log_usb_status(int status, const char *function) | 578 | static void log_usb_status(int status, const char *function) |
574 | { | 579 | { |
575 | char *explanation; | 580 | char *explanation; |
@@ -1103,8 +1108,8 @@ static void hso_serial_close(struct tty_struct *tty, struct file *filp) | |||
1103 | /* reset the rts and dtr */ | 1108 | /* reset the rts and dtr */ |
1104 | /* do the actual close */ | 1109 | /* do the actual close */ |
1105 | serial->open_count--; | 1110 | serial->open_count--; |
1111 | kref_put(&serial->parent->ref, hso_serial_ref_free); | ||
1106 | if (serial->open_count <= 0) { | 1112 | if (serial->open_count <= 0) { |
1107 | kref_put(&serial->parent->ref, hso_serial_ref_free); | ||
1108 | serial->open_count = 0; | 1113 | serial->open_count = 0; |
1109 | if (serial->tty) { | 1114 | if (serial->tty) { |
1110 | serial->tty->driver_data = NULL; | 1115 | serial->tty->driver_data = NULL; |
@@ -1467,7 +1472,8 @@ static void hso_std_serial_write_bulk_callback(struct urb *urb) | |||
1467 | return; | 1472 | return; |
1468 | } | 1473 | } |
1469 | hso_put_activity(serial->parent); | 1474 | hso_put_activity(serial->parent); |
1470 | tty_wakeup(serial->tty); | 1475 | if (serial->tty) |
1476 | tty_wakeup(serial->tty); | ||
1471 | hso_kick_transmit(serial); | 1477 | hso_kick_transmit(serial); |
1472 | 1478 | ||
1473 | D1(" "); | 1479 | D1(" "); |
@@ -1538,7 +1544,8 @@ static void ctrl_callback(struct urb *urb) | |||
1538 | clear_bit(HSO_SERIAL_FLAG_RX_SENT, &serial->flags); | 1544 | clear_bit(HSO_SERIAL_FLAG_RX_SENT, &serial->flags); |
1539 | } else { | 1545 | } else { |
1540 | hso_put_activity(serial->parent); | 1546 | hso_put_activity(serial->parent); |
1541 | tty_wakeup(serial->tty); | 1547 | if (serial->tty) |
1548 | tty_wakeup(serial->tty); | ||
1542 | /* response to a write command */ | 1549 | /* response to a write command */ |
1543 | hso_kick_transmit(serial); | 1550 | hso_kick_transmit(serial); |
1544 | } | 1551 | } |
@@ -2606,6 +2613,7 @@ static int hso_resume(struct usb_interface *iface) | |||
2606 | "Transmitting lingering data\n"); | 2613 | "Transmitting lingering data\n"); |
2607 | hso_net_start_xmit(hso_net->skb_tx_buf, | 2614 | hso_net_start_xmit(hso_net->skb_tx_buf, |
2608 | hso_net->net); | 2615 | hso_net->net); |
2616 | hso_net->skb_tx_buf = NULL; | ||
2609 | } | 2617 | } |
2610 | result = hso_start_net_device(network_table[i]); | 2618 | result = hso_start_net_device(network_table[i]); |
2611 | if (result) | 2619 | if (result) |
@@ -2652,7 +2660,7 @@ static void hso_free_interface(struct usb_interface *interface) | |||
2652 | hso_stop_net_device(network_table[i]); | 2660 | hso_stop_net_device(network_table[i]); |
2653 | cancel_work_sync(&network_table[i]->async_put_intf); | 2661 | cancel_work_sync(&network_table[i]->async_put_intf); |
2654 | cancel_work_sync(&network_table[i]->async_get_intf); | 2662 | cancel_work_sync(&network_table[i]->async_get_intf); |
2655 | if(rfk) | 2663 | if (rfk) |
2656 | rfkill_unregister(rfk); | 2664 | rfkill_unregister(rfk); |
2657 | hso_free_net_device(network_table[i]); | 2665 | hso_free_net_device(network_table[i]); |
2658 | } | 2666 | } |
@@ -2723,7 +2731,7 @@ static int hso_mux_submit_intr_urb(struct hso_shared_int *shared_int, | |||
2723 | } | 2731 | } |
2724 | 2732 | ||
2725 | /* operations setup of the serial interface */ | 2733 | /* operations setup of the serial interface */ |
2726 | static struct tty_operations hso_serial_ops = { | 2734 | static const struct tty_operations hso_serial_ops = { |
2727 | .open = hso_serial_open, | 2735 | .open = hso_serial_open, |
2728 | .close = hso_serial_close, | 2736 | .close = hso_serial_close, |
2729 | .write = hso_serial_write, | 2737 | .write = hso_serial_write, |