mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-28 11:18:45 +07:00
3905118912
Now that the SPDX tag is in all USB files, that identifies the license in a specific and legally-defined manner. So the extra GPL text wording can be removed as it is no longer needed at all. This is done on a quest to remove the 700+ different ways that files in the kernel describe the GPL license text. And there's unneeded stuff like the address (sometimes incorrect) for the FSF which is never needed. No copyright headers or other non-license-description text was removed. Cc: Felipe Balbi <felipe.balbi@linux.intel.com> Cc: Johan Hovold <johan@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
83 lines
1.8 KiB
C
83 lines
1.8 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
/*
|
|
* Wireless Host Controller (WHC) interrupt handling.
|
|
*
|
|
* Copyright (C) 2007 Cambridge Silicon Radio Ltd.
|
|
*/
|
|
#include <linux/kernel.h>
|
|
#include <linux/uwb/umc.h>
|
|
|
|
#include "../../wusbcore/wusbhc.h"
|
|
|
|
#include "whcd.h"
|
|
|
|
static void transfer_done(struct whc *whc)
|
|
{
|
|
queue_work(whc->workqueue, &whc->async_work);
|
|
queue_work(whc->workqueue, &whc->periodic_work);
|
|
}
|
|
|
|
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);
|
|
|
|
/*
|
|
* A transfer completed (see [WHCI] section 4.7.1.2 for when
|
|
* this occurs).
|
|
*/
|
|
if (sts & (WUSBSTS_INT | WUSBSTS_ERR_INT))
|
|
transfer_done(whc);
|
|
|
|
return IRQ_HANDLED;
|
|
}
|
|
|
|
static int process_dn_buf(struct whc *whc)
|
|
{
|
|
struct wusbhc *wusbhc = &whc->wusbhc;
|
|
struct dn_buf_entry *dn;
|
|
int processed = 0;
|
|
|
|
for (dn = whc->dn_buf; dn < whc->dn_buf + WHC_N_DN_ENTRIES; dn++) {
|
|
if (dn->status & WHC_DN_STATUS_VALID) {
|
|
wusbhc_handle_dn(wusbhc, dn->src_addr,
|
|
(struct wusb_dn_hdr *)dn->dn_data,
|
|
dn->msg_size);
|
|
dn->status &= ~WHC_DN_STATUS_VALID;
|
|
processed++;
|
|
}
|
|
}
|
|
return processed;
|
|
}
|
|
|
|
void whc_dn_work(struct work_struct *work)
|
|
{
|
|
struct whc *whc = container_of(work, struct whc, dn_work);
|
|
int processed;
|
|
|
|
do {
|
|
processed = process_dn_buf(whc);
|
|
} while (processed);
|
|
}
|