static int ar9170_resume(struct usb_interface *intf) { struct ar9170_usb *aru = usb_get_intfdata(intf); int err; if (!aru) return -ENODEV; usb_unpoison_anchored_urbs(&aru->rx_submitted); usb_unpoison_anchored_urbs(&aru->tx_submitted); err = ar9170_usb_init_device(aru); if (err) goto err_unrx; err = ar9170_usb_open(&aru->common); if (err) goto err_unrx; return 0; err_unrx: aru->common.state = AR9170_IDLE; ar9170_usb_cancel_urbs(aru); return err; }
static int ar9170_usb_init_device(struct ar9170_usb *aru) { int err; err = ar9170_usb_alloc_rx_irq_urb(aru); if (err) goto err_out; err = ar9170_usb_alloc_rx_bulk_urbs(aru); if (err) goto err_unrx; err = ar9170_usb_upload_firmware(aru); if (err) { err = ar9170_echo_test(&aru->common, 0x60d43110); if (err) { /* force user invention, by disabling the device */ err = usb_driver_set_configuration(aru->udev, -1); dev_err(&aru->udev->dev, "device is in a bad state. " "please reconnect it!\n"); goto err_unrx; } } return 0; err_unrx: ar9170_usb_cancel_urbs(aru); err_out: return err; }
static int ar9170_suspend(struct usb_interface *intf, pm_message_t message) { struct ar9170_usb *aru = usb_get_intfdata(intf); if (!aru) return -ENODEV; aru->common.state = AR9170_IDLE; ar9170_usb_cancel_urbs(aru); return 0; }
static void ar9170_usb_disconnect(struct usb_interface *intf) { struct ar9170_usb *aru = usb_get_intfdata(intf); if (!aru) return; aru->common.state = AR9170_IDLE; ar9170_unregister(&aru->common); ar9170_usb_cancel_urbs(aru); release_firmware(aru->init_values); release_firmware(aru->firmware); usb_put_dev(aru->udev); usb_set_intfdata(intf, NULL); ieee80211_free_hw(aru->common.hw); }
static void ar9170_usb_firmware_finish(const struct firmware *fw, void *context) { struct ar9170_usb *aru = context; int err; aru->firmware = fw; if (!fw) { dev_err(&aru->udev->dev, "firmware file not found.\n"); goto err_freefw; } err = ar9170_usb_init_device(aru); if (err) goto err_freefw; err = ar9170_usb_open(&aru->common); if (err) goto err_unrx; err = ar9170_register(&aru->common, &aru->udev->dev); ar9170_usb_stop(&aru->common); if (err) goto err_unrx; complete(&aru->firmware_loading_complete); usb_put_dev(aru->udev); return; err_unrx: ar9170_usb_cancel_urbs(aru); err_freefw: ar9170_usb_firmware_failed(aru); }
static int ar9170_usb_probe(struct usb_interface *intf, const struct usb_device_id *id) { struct ar9170_usb *aru; struct ar9170 *ar; struct usb_device *udev; int err; aru = ar9170_alloc(sizeof(*aru)); if (IS_ERR(aru)) { err = PTR_ERR(aru); goto out; } udev = interface_to_usbdev(intf); usb_get_dev(udev); aru->udev = udev; aru->intf = intf; ar = &aru->common; aru->req_one_stage_fw = ar9170_requires_one_stage(id); usb_set_intfdata(intf, aru); SET_IEEE80211_DEV(ar->hw, &intf->dev); init_usb_anchor(&aru->rx_submitted); init_usb_anchor(&aru->tx_pending); init_usb_anchor(&aru->tx_submitted); init_completion(&aru->cmd_wait); spin_lock_init(&aru->tx_urb_lock); aru->tx_pending_urbs = 0; aru->tx_submitted_urbs = 0; aru->common.stop = ar9170_usb_stop; aru->common.flush = ar9170_usb_flush; aru->common.open = ar9170_usb_open; aru->common.tx = ar9170_usb_tx; aru->common.exec_cmd = ar9170_usb_exec_cmd; aru->common.callback_cmd = ar9170_usb_callback_cmd; #ifdef CONFIG_PM udev->reset_resume = 1; #endif /* CONFIG_PM */ err = ar9170_usb_reset(aru); if (err) goto err_freehw; err = ar9170_usb_request_firmware(aru); if (err) goto err_freehw; err = ar9170_usb_init_device(aru); if (err) goto err_freefw; err = ar9170_usb_open(ar); if (err) goto err_unrx; err = ar9170_register(ar, &udev->dev); ar9170_usb_stop(ar); if (err) goto err_unrx; return 0; err_unrx: ar9170_usb_cancel_urbs(aru); err_freefw: release_firmware(aru->init_values); release_firmware(aru->firmware); err_freehw: usb_set_intfdata(intf, NULL); usb_put_dev(udev); ieee80211_free_hw(ar->hw); out: return err; }