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, |
