static void ar9170_usb_cancel_urbs(struct ar9170_usb *aru) { int err; aru->common.state = AR9170_UNKNOWN_STATE; err = ar9170_usb_flush(&aru->common); if (err) dev_err(&aru->udev->dev, "stuck tx urbs!\n"); usb_poison_anchored_urbs(&aru->tx_submitted); usb_poison_anchored_urbs(&aru->rx_submitted); }
void carl9170_usb_stop(struct ar9170 *ar) { int ret; carl9170_set_state_when(ar, CARL9170_IDLE, CARL9170_STOPPED); ret = carl9170_usb_flush(ar); if (ret) dev_err(&ar->udev->dev, "kill pending tx urbs.\n"); usb_poison_anchored_urbs(&ar->tx_anch); carl9170_usb_handle_tx_err(ar); /* kill any pending command */ spin_lock_bh(&ar->cmd_lock); ar->readlen = 0; spin_unlock_bh(&ar->cmd_lock); complete_all(&ar->cmd_wait); /* This is required to prevent an early completion on _start */ INIT_COMPLETION(ar->cmd_wait); /* * Note: * So far we freed all tx urbs, but we won't dare to touch any rx urbs. * Else we would end up with a unresponsive device... */ }
static void carl9170_usb_cancel_urbs(struct ar9170 *ar) { int err; carl9170_set_state(ar, CARL9170_UNKNOWN_STATE); err = carl9170_usb_flush(ar); if (err) dev_err(&ar->udev->dev, "stuck tx urbs!\n"); usb_poison_anchored_urbs(&ar->tx_anch); carl9170_usb_handle_tx_err(ar); usb_poison_anchored_urbs(&ar->rx_anch); tasklet_kill(&ar->usb_tasklet); usb_scuttle_anchored_urbs(&ar->rx_work); usb_scuttle_anchored_urbs(&ar->rx_pool); usb_scuttle_anchored_urbs(&ar->tx_cmd); }
static void r92su_usb_disconnect(struct usb_interface *intf) { struct r92su *r92su = usb_get_intfdata(intf); struct urb *urb; r92su_unregister(r92su); /* give the disconnect command some time to finish... */ usb_wait_anchor_empty_timeout(&r92su->tx_submitted, USB_CTRL_SET_TIMEOUT); /* ... before everything is forcefully terminated */ usb_poison_anchored_urbs(&r92su->tx_submitted); usb_poison_anchored_urbs(&r92su->rx_submitted); while ((urb = usb_get_from_anchor(&r92su->tx_wait))) { kfree_skb(urb->context); usb_free_urb(urb); } r92su_free(r92su); }
static int ar9170_usb_open(struct ar9170 *ar) { struct ar9170_usb *aru = (void *) ar; int err; usb_unpoison_anchored_urbs(&aru->tx_submitted); err = ar9170_usb_init_transport(aru); if (err) { usb_poison_anchored_urbs(&aru->tx_submitted); return err; } aru->common.state = AR9170_IDLE; return 0; }
static void ar9170_usb_stop(struct ar9170 *ar) { struct ar9170_usb *aru = (void *) ar; int ret; if (IS_ACCEPTING_CMD(ar)) aru->common.state = AR9170_STOPPED; ret = ar9170_usb_flush(ar); if (ret) dev_err(&aru->udev->dev, "kill pending tx urbs.\n"); usb_poison_anchored_urbs(&aru->tx_submitted); /* * Note: * So far we freed all tx urbs, but we won't dare to touch any rx urbs. * Else we would end up with a unresponsive device... */ }