irqreturn_t whc_int_handler(struct usb_hcd *hcd) { struct wusbhc *wusbhc = usb_hcd_to_wusbhc(hcd); struct whc *whc = wusbhc_to_whc(wusbhc); u32 sts; sts = le_readl(whc->base + WUSBSTS); if (!(sts & WUSBSTS_INT_MASK)) return IRQ_NONE; le_writel(sts & WUSBSTS_INT_MASK, whc->base + WUSBSTS); if (sts & WUSBSTS_GEN_CMD_DONE) wake_up(&whc->cmd_wq); if (sts & WUSBSTS_HOST_ERR) dev_err(&whc->umc->dev, "FIXME: host system error\n"); if (sts & WUSBSTS_ASYNC_SCHED_SYNCED) wake_up(&whc->async_list_wq); if (sts & WUSBSTS_PERIODIC_SCHED_SYNCED) wake_up(&whc->periodic_list_wq); if (sts & WUSBSTS_DNTS_INT) queue_work(whc->workqueue, &whc->dn_work); if (sts & (WUSBSTS_INT | WUSBSTS_ERR_INT)) transfer_done(whc); return IRQ_HANDLED; }
gint update_downloads (gpointer data) { intptr_t do_one_transfer_at_a_time, start_transfers; GList * templist, * next; gftp_transfer * tdata; if (gftp_file_transfer_logs != NULL) display_cached_logs (); if (window1.request->gotbytes != 0) update_window_transfer_bytes (&window1); if (window2.request->gotbytes != 0) update_window_transfer_bytes (&window2); if (gftpui_common_child_process_done) check_done_process (); for (templist = gftp_file_transfers; templist != NULL;) { tdata = templist->data; if (tdata->ready) { g_static_mutex_lock (&tdata->structmutex); if (tdata->next_file) on_next_transfer (tdata); else if (tdata->show) show_transfer (tdata); else if (tdata->done) { next = templist->next; g_static_mutex_unlock (&tdata->structmutex); transfer_done (templist); templist = next; continue; } if (tdata->curfle != NULL) { gftp_lookup_global_option ("one_transfer", &do_one_transfer_at_a_time); gftp_lookup_global_option ("start_transfers", &start_transfers); if (!tdata->started && start_transfers && (num_transfers_in_progress == 0 || !do_one_transfer_at_a_time)) create_transfer (tdata); if (tdata->started) update_file_status (tdata); } g_static_mutex_unlock (&tdata->structmutex); } templist = templist->next; } gtk_timeout_add (500, update_downloads, NULL); return (0); }