hso.c (d585a021c0b10b0477d6b608c53e1feb8cde0507) | hso.c (19d337dff95cbf76edd3ad95c0cee2732c3e1ec5) |
---|---|
1/****************************************************************************** 2 * 3 * Driver for Option High Speed Mobile Devices. 4 * 5 * Copyright (C) 2008 Option International 6 * Filip Aben <f.aben@option.com> 7 * Denis Joseph Barrow <d.barow@option.com> 8 * Jan Dumon <j.dumon@option.com> --- 468 unchanged lines hidden (view full) --- 477}; 478MODULE_DEVICE_TABLE(usb, hso_ids); 479 480/* Sysfs attribute */ 481static ssize_t hso_sysfs_show_porttype(struct device *dev, 482 struct device_attribute *attr, 483 char *buf) 484{ | 1/****************************************************************************** 2 * 3 * Driver for Option High Speed Mobile Devices. 4 * 5 * Copyright (C) 2008 Option International 6 * Filip Aben <f.aben@option.com> 7 * Denis Joseph Barrow <d.barow@option.com> 8 * Jan Dumon <j.dumon@option.com> --- 468 unchanged lines hidden (view full) --- 477}; 478MODULE_DEVICE_TABLE(usb, hso_ids); 479 480/* Sysfs attribute */ 481static ssize_t hso_sysfs_show_porttype(struct device *dev, 482 struct device_attribute *attr, 483 char *buf) 484{ |
485 struct hso_device *hso_dev = dev->driver_data; | 485 struct hso_device *hso_dev = dev_get_drvdata(dev); |
486 char *port_name; 487 488 if (!hso_dev) 489 return 0; 490 491 switch (hso_dev->port_spec & HSO_PORT_MASK) { 492 case HSO_PORT_CONTROL: 493 port_name = "Control"; --- 1814 unchanged lines hidden (view full) --- 2308 minor = get_free_serial_index(); 2309 if (minor < 0) 2310 goto exit; 2311 2312 /* register our minor number */ 2313 serial->parent->dev = tty_register_device(tty_drv, minor, 2314 &serial->parent->interface->dev); 2315 dev = serial->parent->dev; | 486 char *port_name; 487 488 if (!hso_dev) 489 return 0; 490 491 switch (hso_dev->port_spec & HSO_PORT_MASK) { 492 case HSO_PORT_CONTROL: 493 port_name = "Control"; --- 1814 unchanged lines hidden (view full) --- 2308 minor = get_free_serial_index(); 2309 if (minor < 0) 2310 goto exit; 2311 2312 /* register our minor number */ 2313 serial->parent->dev = tty_register_device(tty_drv, minor, 2314 &serial->parent->interface->dev); 2315 dev = serial->parent->dev; |
2316 dev->driver_data = serial->parent; | 2316 dev_set_drvdata(dev, serial->parent); |
2317 i = device_create_file(dev, &dev_attr_hsotype); 2318 2319 /* fill in specific data for later use */ 2320 serial->minor = minor; 2321 serial->magic = HSO_SERIAL_MAGIC; 2322 spin_lock_init(&serial->serial_lock); 2323 serial->num_rx_urbs = num_urbs; 2324 --- 151 unchanged lines hidden (view full) --- 2476 break; 2477 } 2478 } 2479 if (i == HSO_MAX_NET_DEVICES) 2480 return -1; 2481 return 0; 2482} 2483 | 2317 i = device_create_file(dev, &dev_attr_hsotype); 2318 2319 /* fill in specific data for later use */ 2320 serial->minor = minor; 2321 serial->magic = HSO_SERIAL_MAGIC; 2322 spin_lock_init(&serial->serial_lock); 2323 serial->num_rx_urbs = num_urbs; 2324 --- 151 unchanged lines hidden (view full) --- 2476 break; 2477 } 2478 } 2479 if (i == HSO_MAX_NET_DEVICES) 2480 return -1; 2481 return 0; 2482} 2483 |
2484static int hso_radio_toggle(void *data, enum rfkill_state state) | 2484static int hso_rfkill_set_block(void *data, bool blocked) |
2485{ 2486 struct hso_device *hso_dev = data; | 2485{ 2486 struct hso_device *hso_dev = data; |
2487 int enabled = (state == RFKILL_STATE_ON); | 2487 int enabled = !blocked; |
2488 int rv; 2489 2490 mutex_lock(&hso_dev->mutex); 2491 if (hso_dev->usb_gone) 2492 rv = 0; 2493 else 2494 rv = usb_control_msg(hso_dev->usb, usb_rcvctrlpipe(hso_dev->usb, 0), 2495 enabled ? 0x82 : 0x81, 0x40, 0, 0, NULL, 0, 2496 USB_CTRL_SET_TIMEOUT); 2497 mutex_unlock(&hso_dev->mutex); 2498 return rv; 2499} 2500 | 2488 int rv; 2489 2490 mutex_lock(&hso_dev->mutex); 2491 if (hso_dev->usb_gone) 2492 rv = 0; 2493 else 2494 rv = usb_control_msg(hso_dev->usb, usb_rcvctrlpipe(hso_dev->usb, 0), 2495 enabled ? 0x82 : 0x81, 0x40, 0, 0, NULL, 0, 2496 USB_CTRL_SET_TIMEOUT); 2497 mutex_unlock(&hso_dev->mutex); 2498 return rv; 2499} 2500 |
2501static const struct rfkill_ops hso_rfkill_ops = { 2502 .set_block = hso_rfkill_set_block, 2503}; 2504 |
|
2501/* Creates and sets up everything for rfkill */ 2502static void hso_create_rfkill(struct hso_device *hso_dev, 2503 struct usb_interface *interface) 2504{ 2505 struct hso_net *hso_net = dev2net(hso_dev); 2506 struct device *dev = &hso_net->net->dev; 2507 char *rfkn; 2508 | 2505/* Creates and sets up everything for rfkill */ 2506static void hso_create_rfkill(struct hso_device *hso_dev, 2507 struct usb_interface *interface) 2508{ 2509 struct hso_net *hso_net = dev2net(hso_dev); 2510 struct device *dev = &hso_net->net->dev; 2511 char *rfkn; 2512 |
2509 hso_net->rfkill = rfkill_allocate(&interface_to_usbdev(interface)->dev, 2510 RFKILL_TYPE_WWAN); 2511 if (!hso_net->rfkill) { 2512 dev_err(dev, "%s - Out of memory\n", __func__); 2513 return; 2514 } | |
2515 rfkn = kzalloc(20, GFP_KERNEL); | 2513 rfkn = kzalloc(20, GFP_KERNEL); |
2516 if (!rfkn) { 2517 rfkill_free(hso_net->rfkill); 2518 hso_net->rfkill = NULL; | 2514 if (!rfkn) |
2519 dev_err(dev, "%s - Out of memory\n", __func__); | 2515 dev_err(dev, "%s - Out of memory\n", __func__); |
2520 return; 2521 } | 2516 |
2522 snprintf(rfkn, 20, "hso-%d", 2523 interface->altsetting->desc.bInterfaceNumber); | 2517 snprintf(rfkn, 20, "hso-%d", 2518 interface->altsetting->desc.bInterfaceNumber); |
2524 hso_net->rfkill->name = rfkn; 2525 hso_net->rfkill->state = RFKILL_STATE_ON; 2526 hso_net->rfkill->data = hso_dev; 2527 hso_net->rfkill->toggle_radio = hso_radio_toggle; | 2519 2520 hso_net->rfkill = rfkill_alloc(rfkn, 2521 &interface_to_usbdev(interface)->dev, 2522 RFKILL_TYPE_WWAN, 2523 &hso_rfkill_ops, hso_dev); 2524 if (!hso_net->rfkill) { 2525 dev_err(dev, "%s - Out of memory\n", __func__); 2526 kfree(rfkn); 2527 return; 2528 } |
2528 if (rfkill_register(hso_net->rfkill) < 0) { | 2529 if (rfkill_register(hso_net->rfkill) < 0) { |
2530 rfkill_destroy(hso_net->rfkill); |
|
2529 kfree(rfkn); | 2531 kfree(rfkn); |
2530 hso_net->rfkill->name = NULL; 2531 rfkill_free(hso_net->rfkill); | |
2532 hso_net->rfkill = NULL; 2533 dev_err(dev, "%s - Failed to register rfkill\n", __func__); 2534 return; 2535 } 2536} 2537 2538/* Creates our network device */ 2539static struct hso_device *hso_create_net_device(struct usb_interface *interface, --- 620 unchanged lines hidden (view full) --- 3160 && (network_table[i]->interface == interface)) { 3161 struct rfkill *rfk = dev2net(network_table[i])->rfkill; 3162 /* hso_stop_net_device doesn't stop the net queue since 3163 * traffic needs to start it again when suspended */ 3164 netif_stop_queue(dev2net(network_table[i])->net); 3165 hso_stop_net_device(network_table[i]); 3166 cancel_work_sync(&network_table[i]->async_put_intf); 3167 cancel_work_sync(&network_table[i]->async_get_intf); | 2532 hso_net->rfkill = NULL; 2533 dev_err(dev, "%s - Failed to register rfkill\n", __func__); 2534 return; 2535 } 2536} 2537 2538/* Creates our network device */ 2539static struct hso_device *hso_create_net_device(struct usb_interface *interface, --- 620 unchanged lines hidden (view full) --- 3160 && (network_table[i]->interface == interface)) { 3161 struct rfkill *rfk = dev2net(network_table[i])->rfkill; 3162 /* hso_stop_net_device doesn't stop the net queue since 3163 * traffic needs to start it again when suspended */ 3164 netif_stop_queue(dev2net(network_table[i])->net); 3165 hso_stop_net_device(network_table[i]); 3166 cancel_work_sync(&network_table[i]->async_put_intf); 3167 cancel_work_sync(&network_table[i]->async_get_intf); |
3168 if (rfk) | 3168 if (rfk) { |
3169 rfkill_unregister(rfk); | 3169 rfkill_unregister(rfk); |
3170 rfkill_destroy(rfk); 3171 } |
|
3170 hso_free_net_device(network_table[i]); 3171 } 3172 } 3173} 3174 3175/* Helper functions */ 3176 3177/* Get the endpoint ! */ --- 173 unchanged lines hidden --- | 3172 hso_free_net_device(network_table[i]); 3173 } 3174 } 3175} 3176 3177/* Helper functions */ 3178 3179/* Get the endpoint ! */ --- 173 unchanged lines hidden --- |