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