cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

xen-hcd.c (38613B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * xen-hcd.c
      4 *
      5 * Xen USB Virtual Host Controller driver
      6 *
      7 * Copyright (C) 2009, FUJITSU LABORATORIES LTD.
      8 * Author: Noboru Iwamatsu <n_iwamatsu@jp.fujitsu.com>
      9 */
     10
     11#include <linux/module.h>
     12#include <linux/usb.h>
     13#include <linux/list.h>
     14#include <linux/usb/hcd.h>
     15#include <linux/io.h>
     16
     17#include <xen/xen.h>
     18#include <xen/xenbus.h>
     19#include <xen/grant_table.h>
     20#include <xen/events.h>
     21#include <xen/page.h>
     22
     23#include <xen/interface/io/usbif.h>
     24
     25/* Private per-URB data */
     26struct urb_priv {
     27	struct list_head list;
     28	struct urb *urb;
     29	int req_id;		/* RING_REQUEST id for submitting */
     30	int unlink_req_id;	/* RING_REQUEST id for unlinking */
     31	int status;
     32	bool unlinked;		/* dequeued marker */
     33};
     34
     35/* virtual roothub port status */
     36struct rhport_status {
     37	__u32 status;
     38	bool resuming;		/* in resuming */
     39	bool c_connection;	/* connection changed */
     40	unsigned long timeout;
     41};
     42
     43/* status of attached device */
     44struct vdevice_status {
     45	int devnum;
     46	enum usb_device_state status;
     47	enum usb_device_speed speed;
     48};
     49
     50/* RING request shadow */
     51struct usb_shadow {
     52	struct xenusb_urb_request req;
     53	struct urb *urb;
     54	bool in_flight;
     55};
     56
     57struct xenhcd_info {
     58	/* Virtual Host Controller has 4 urb queues */
     59	struct list_head pending_submit_list;
     60	struct list_head pending_unlink_list;
     61	struct list_head in_progress_list;
     62	struct list_head giveback_waiting_list;
     63
     64	spinlock_t lock;
     65
     66	/* timer that kick pending and giveback waiting urbs */
     67	struct timer_list watchdog;
     68	unsigned long actions;
     69
     70	/* virtual root hub */
     71	int rh_numports;
     72	struct rhport_status ports[XENUSB_MAX_PORTNR];
     73	struct vdevice_status devices[XENUSB_MAX_PORTNR];
     74
     75	/* Xen related staff */
     76	struct xenbus_device *xbdev;
     77	int urb_ring_ref;
     78	int conn_ring_ref;
     79	struct xenusb_urb_front_ring urb_ring;
     80	struct xenusb_conn_front_ring conn_ring;
     81
     82	unsigned int evtchn;
     83	unsigned int irq;
     84	struct usb_shadow shadow[XENUSB_URB_RING_SIZE];
     85	unsigned int shadow_free;
     86
     87	bool error;
     88};
     89
     90#define XENHCD_RING_JIFFIES (HZ/200)
     91#define XENHCD_SCAN_JIFFIES 1
     92
     93enum xenhcd_timer_action {
     94	TIMER_RING_WATCHDOG,
     95	TIMER_SCAN_PENDING_URBS,
     96};
     97
     98static struct kmem_cache *xenhcd_urbp_cachep;
     99
    100static inline struct xenhcd_info *xenhcd_hcd_to_info(struct usb_hcd *hcd)
    101{
    102	return (struct xenhcd_info *)hcd->hcd_priv;
    103}
    104
    105static inline struct usb_hcd *xenhcd_info_to_hcd(struct xenhcd_info *info)
    106{
    107	return container_of((void *)info, struct usb_hcd, hcd_priv);
    108}
    109
    110static void xenhcd_set_error(struct xenhcd_info *info, const char *msg)
    111{
    112	info->error = true;
    113
    114	pr_alert("xen-hcd: protocol error: %s!\n", msg);
    115}
    116
    117static inline void xenhcd_timer_action_done(struct xenhcd_info *info,
    118					    enum xenhcd_timer_action action)
    119{
    120	clear_bit(action, &info->actions);
    121}
    122
    123static void xenhcd_timer_action(struct xenhcd_info *info,
    124				enum xenhcd_timer_action action)
    125{
    126	if (timer_pending(&info->watchdog) &&
    127	    test_bit(TIMER_SCAN_PENDING_URBS, &info->actions))
    128		return;
    129
    130	if (!test_and_set_bit(action, &info->actions)) {
    131		unsigned long t;
    132
    133		switch (action) {
    134		case TIMER_RING_WATCHDOG:
    135			t = XENHCD_RING_JIFFIES;
    136			break;
    137		default:
    138			t = XENHCD_SCAN_JIFFIES;
    139			break;
    140		}
    141		mod_timer(&info->watchdog, t + jiffies);
    142	}
    143}
    144
    145/*
    146 * set virtual port connection status
    147 */
    148static void xenhcd_set_connect_state(struct xenhcd_info *info, int portnum)
    149{
    150	int port;
    151
    152	port = portnum - 1;
    153	if (info->ports[port].status & USB_PORT_STAT_POWER) {
    154		switch (info->devices[port].speed) {
    155		case XENUSB_SPEED_NONE:
    156			info->ports[port].status &=
    157				~(USB_PORT_STAT_CONNECTION |
    158				  USB_PORT_STAT_ENABLE |
    159				  USB_PORT_STAT_LOW_SPEED |
    160				  USB_PORT_STAT_HIGH_SPEED |
    161				  USB_PORT_STAT_SUSPEND);
    162			break;
    163		case XENUSB_SPEED_LOW:
    164			info->ports[port].status |= USB_PORT_STAT_CONNECTION;
    165			info->ports[port].status |= USB_PORT_STAT_LOW_SPEED;
    166			break;
    167		case XENUSB_SPEED_FULL:
    168			info->ports[port].status |= USB_PORT_STAT_CONNECTION;
    169			break;
    170		case XENUSB_SPEED_HIGH:
    171			info->ports[port].status |= USB_PORT_STAT_CONNECTION;
    172			info->ports[port].status |= USB_PORT_STAT_HIGH_SPEED;
    173			break;
    174		default: /* error */
    175			return;
    176		}
    177		info->ports[port].status |= (USB_PORT_STAT_C_CONNECTION << 16);
    178	}
    179}
    180
    181/*
    182 * set virtual device connection status
    183 */
    184static int xenhcd_rhport_connect(struct xenhcd_info *info, __u8 portnum,
    185				 __u8 speed)
    186{
    187	int port;
    188
    189	if (portnum < 1 || portnum > info->rh_numports)
    190		return -EINVAL; /* invalid port number */
    191
    192	port = portnum - 1;
    193	if (info->devices[port].speed != speed) {
    194		switch (speed) {
    195		case XENUSB_SPEED_NONE: /* disconnect */
    196			info->devices[port].status = USB_STATE_NOTATTACHED;
    197			break;
    198		case XENUSB_SPEED_LOW:
    199		case XENUSB_SPEED_FULL:
    200		case XENUSB_SPEED_HIGH:
    201			info->devices[port].status = USB_STATE_ATTACHED;
    202			break;
    203		default: /* error */
    204			return -EINVAL;
    205		}
    206		info->devices[port].speed = speed;
    207		info->ports[port].c_connection = true;
    208
    209		xenhcd_set_connect_state(info, portnum);
    210	}
    211
    212	return 0;
    213}
    214
    215/*
    216 * SetPortFeature(PORT_SUSPENDED)
    217 */
    218static void xenhcd_rhport_suspend(struct xenhcd_info *info, int portnum)
    219{
    220	int port;
    221
    222	port = portnum - 1;
    223	info->ports[port].status |= USB_PORT_STAT_SUSPEND;
    224	info->devices[port].status = USB_STATE_SUSPENDED;
    225}
    226
    227/*
    228 * ClearPortFeature(PORT_SUSPENDED)
    229 */
    230static void xenhcd_rhport_resume(struct xenhcd_info *info, int portnum)
    231{
    232	int port;
    233
    234	port = portnum - 1;
    235	if (info->ports[port].status & USB_PORT_STAT_SUSPEND) {
    236		info->ports[port].resuming = true;
    237		info->ports[port].timeout = jiffies + msecs_to_jiffies(20);
    238	}
    239}
    240
    241/*
    242 * SetPortFeature(PORT_POWER)
    243 */
    244static void xenhcd_rhport_power_on(struct xenhcd_info *info, int portnum)
    245{
    246	int port;
    247
    248	port = portnum - 1;
    249	if ((info->ports[port].status & USB_PORT_STAT_POWER) == 0) {
    250		info->ports[port].status |= USB_PORT_STAT_POWER;
    251		if (info->devices[port].status != USB_STATE_NOTATTACHED)
    252			info->devices[port].status = USB_STATE_POWERED;
    253		if (info->ports[port].c_connection)
    254			xenhcd_set_connect_state(info, portnum);
    255	}
    256}
    257
    258/*
    259 * ClearPortFeature(PORT_POWER)
    260 * SetConfiguration(non-zero)
    261 * Power_Source_Off
    262 * Over-current
    263 */
    264static void xenhcd_rhport_power_off(struct xenhcd_info *info, int portnum)
    265{
    266	int port;
    267
    268	port = portnum - 1;
    269	if (info->ports[port].status & USB_PORT_STAT_POWER) {
    270		info->ports[port].status = 0;
    271		if (info->devices[port].status != USB_STATE_NOTATTACHED)
    272			info->devices[port].status = USB_STATE_ATTACHED;
    273	}
    274}
    275
    276/*
    277 * ClearPortFeature(PORT_ENABLE)
    278 */
    279static void xenhcd_rhport_disable(struct xenhcd_info *info, int portnum)
    280{
    281	int port;
    282
    283	port = portnum - 1;
    284	info->ports[port].status &= ~USB_PORT_STAT_ENABLE;
    285	info->ports[port].status &= ~USB_PORT_STAT_SUSPEND;
    286	info->ports[port].resuming = false;
    287	if (info->devices[port].status != USB_STATE_NOTATTACHED)
    288		info->devices[port].status = USB_STATE_POWERED;
    289}
    290
    291/*
    292 * SetPortFeature(PORT_RESET)
    293 */
    294static void xenhcd_rhport_reset(struct xenhcd_info *info, int portnum)
    295{
    296	int port;
    297
    298	port = portnum - 1;
    299	info->ports[port].status &= ~(USB_PORT_STAT_ENABLE |
    300				      USB_PORT_STAT_LOW_SPEED |
    301				      USB_PORT_STAT_HIGH_SPEED);
    302	info->ports[port].status |= USB_PORT_STAT_RESET;
    303
    304	if (info->devices[port].status != USB_STATE_NOTATTACHED)
    305		info->devices[port].status = USB_STATE_ATTACHED;
    306
    307	/* 10msec reset signaling */
    308	info->ports[port].timeout = jiffies + msecs_to_jiffies(10);
    309}
    310
    311#ifdef CONFIG_PM
    312static int xenhcd_bus_suspend(struct usb_hcd *hcd)
    313{
    314	struct xenhcd_info *info = xenhcd_hcd_to_info(hcd);
    315	int ret = 0;
    316	int i, ports;
    317
    318	ports = info->rh_numports;
    319
    320	spin_lock_irq(&info->lock);
    321	if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags)) {
    322		ret = -ESHUTDOWN;
    323	} else {
    324		/* suspend any active ports*/
    325		for (i = 1; i <= ports; i++)
    326			xenhcd_rhport_suspend(info, i);
    327	}
    328	spin_unlock_irq(&info->lock);
    329
    330	del_timer_sync(&info->watchdog);
    331
    332	return ret;
    333}
    334
    335static int xenhcd_bus_resume(struct usb_hcd *hcd)
    336{
    337	struct xenhcd_info *info = xenhcd_hcd_to_info(hcd);
    338	int ret = 0;
    339	int i, ports;
    340
    341	ports = info->rh_numports;
    342
    343	spin_lock_irq(&info->lock);
    344	if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags)) {
    345		ret = -ESHUTDOWN;
    346	} else {
    347		/* resume any suspended ports*/
    348		for (i = 1; i <= ports; i++)
    349			xenhcd_rhport_resume(info, i);
    350	}
    351	spin_unlock_irq(&info->lock);
    352
    353	return ret;
    354}
    355#endif
    356
    357static void xenhcd_hub_descriptor(struct xenhcd_info *info,
    358				  struct usb_hub_descriptor *desc)
    359{
    360	__u16 temp;
    361	int ports = info->rh_numports;
    362
    363	desc->bDescriptorType = 0x29;
    364	desc->bPwrOn2PwrGood = 10; /* EHCI says 20ms max */
    365	desc->bHubContrCurrent = 0;
    366	desc->bNbrPorts = ports;
    367
    368	/* size of DeviceRemovable and PortPwrCtrlMask fields */
    369	temp = 1 + (ports / 8);
    370	desc->bDescLength = 7 + 2 * temp;
    371
    372	/* bitmaps for DeviceRemovable and PortPwrCtrlMask */
    373	memset(&desc->u.hs.DeviceRemovable[0], 0, temp);
    374	memset(&desc->u.hs.DeviceRemovable[temp], 0xff, temp);
    375
    376	/* per-port over current reporting and no power switching */
    377	temp = 0x000a;
    378	desc->wHubCharacteristics = cpu_to_le16(temp);
    379}
    380
    381/* port status change mask for hub_status_data */
    382#define PORT_C_MASK	((USB_PORT_STAT_C_CONNECTION |		\
    383			  USB_PORT_STAT_C_ENABLE |		\
    384			  USB_PORT_STAT_C_SUSPEND |		\
    385			  USB_PORT_STAT_C_OVERCURRENT |		\
    386			  USB_PORT_STAT_C_RESET) << 16)
    387
    388/*
    389 * See USB 2.0 Spec, 11.12.4 Hub and Port Status Change Bitmap.
    390 * If port status changed, writes the bitmap to buf and return
    391 * that length(number of bytes).
    392 * If Nothing changed, return 0.
    393 */
    394static int xenhcd_hub_status_data(struct usb_hcd *hcd, char *buf)
    395{
    396	struct xenhcd_info *info = xenhcd_hcd_to_info(hcd);
    397	int ports;
    398	int i;
    399	unsigned long flags;
    400	int ret;
    401	int changed = 0;
    402
    403	/* initialize the status to no-changes */
    404	ports = info->rh_numports;
    405	ret = 1 + (ports / 8);
    406	memset(buf, 0, ret);
    407
    408	spin_lock_irqsave(&info->lock, flags);
    409
    410	for (i = 0; i < ports; i++) {
    411		/* check status for each port */
    412		if (info->ports[i].status & PORT_C_MASK) {
    413			buf[(i + 1) / 8] |= 1 << (i + 1) % 8;
    414			changed = 1;
    415		}
    416	}
    417
    418	if ((hcd->state == HC_STATE_SUSPENDED) && (changed == 1))
    419		usb_hcd_resume_root_hub(hcd);
    420
    421	spin_unlock_irqrestore(&info->lock, flags);
    422
    423	return changed ? ret : 0;
    424}
    425
    426static int xenhcd_hub_control(struct usb_hcd *hcd, __u16 typeReq, __u16 wValue,
    427			      __u16 wIndex, char *buf, __u16 wLength)
    428{
    429	struct xenhcd_info *info = xenhcd_hcd_to_info(hcd);
    430	int ports = info->rh_numports;
    431	unsigned long flags;
    432	int ret = 0;
    433	int i;
    434	int changed = 0;
    435
    436	spin_lock_irqsave(&info->lock, flags);
    437	switch (typeReq) {
    438	case ClearHubFeature:
    439		/* ignore this request */
    440		break;
    441	case ClearPortFeature:
    442		if (!wIndex || wIndex > ports)
    443			goto error;
    444
    445		switch (wValue) {
    446		case USB_PORT_FEAT_SUSPEND:
    447			xenhcd_rhport_resume(info, wIndex);
    448			break;
    449		case USB_PORT_FEAT_POWER:
    450			xenhcd_rhport_power_off(info, wIndex);
    451			break;
    452		case USB_PORT_FEAT_ENABLE:
    453			xenhcd_rhport_disable(info, wIndex);
    454			break;
    455		case USB_PORT_FEAT_C_CONNECTION:
    456			info->ports[wIndex - 1].c_connection = false;
    457			fallthrough;
    458		default:
    459			info->ports[wIndex - 1].status &= ~(1 << wValue);
    460			break;
    461		}
    462		break;
    463	case GetHubDescriptor:
    464		xenhcd_hub_descriptor(info, (struct usb_hub_descriptor *)buf);
    465		break;
    466	case GetHubStatus:
    467		/* always local power supply good and no over-current exists. */
    468		*(__le32 *)buf = cpu_to_le32(0);
    469		break;
    470	case GetPortStatus:
    471		if (!wIndex || wIndex > ports)
    472			goto error;
    473
    474		wIndex--;
    475
    476		/* resume completion */
    477		if (info->ports[wIndex].resuming &&
    478		    time_after_eq(jiffies, info->ports[wIndex].timeout)) {
    479			info->ports[wIndex].status |=
    480				USB_PORT_STAT_C_SUSPEND << 16;
    481			info->ports[wIndex].status &= ~USB_PORT_STAT_SUSPEND;
    482		}
    483
    484		/* reset completion */
    485		if ((info->ports[wIndex].status & USB_PORT_STAT_RESET) != 0 &&
    486		    time_after_eq(jiffies, info->ports[wIndex].timeout)) {
    487			info->ports[wIndex].status |=
    488				USB_PORT_STAT_C_RESET << 16;
    489			info->ports[wIndex].status &= ~USB_PORT_STAT_RESET;
    490
    491			if (info->devices[wIndex].status !=
    492			    USB_STATE_NOTATTACHED) {
    493				info->ports[wIndex].status |=
    494					USB_PORT_STAT_ENABLE;
    495				info->devices[wIndex].status =
    496					USB_STATE_DEFAULT;
    497			}
    498
    499			switch (info->devices[wIndex].speed) {
    500			case XENUSB_SPEED_LOW:
    501				info->ports[wIndex].status |=
    502					USB_PORT_STAT_LOW_SPEED;
    503				break;
    504			case XENUSB_SPEED_HIGH:
    505				info->ports[wIndex].status |=
    506					USB_PORT_STAT_HIGH_SPEED;
    507				break;
    508			default:
    509				break;
    510			}
    511		}
    512
    513		*(__le32 *)buf = cpu_to_le32(info->ports[wIndex].status);
    514		break;
    515	case SetPortFeature:
    516		if (!wIndex || wIndex > ports)
    517			goto error;
    518
    519		switch (wValue) {
    520		case USB_PORT_FEAT_POWER:
    521			xenhcd_rhport_power_on(info, wIndex);
    522			break;
    523		case USB_PORT_FEAT_RESET:
    524			xenhcd_rhport_reset(info, wIndex);
    525			break;
    526		case USB_PORT_FEAT_SUSPEND:
    527			xenhcd_rhport_suspend(info, wIndex);
    528			break;
    529		default:
    530			if (info->ports[wIndex-1].status & USB_PORT_STAT_POWER)
    531				info->ports[wIndex-1].status |= (1 << wValue);
    532		}
    533		break;
    534
    535	case SetHubFeature:
    536		/* not supported */
    537	default:
    538error:
    539		ret = -EPIPE;
    540	}
    541	spin_unlock_irqrestore(&info->lock, flags);
    542
    543	/* check status for each port */
    544	for (i = 0; i < ports; i++) {
    545		if (info->ports[i].status & PORT_C_MASK)
    546			changed = 1;
    547	}
    548	if (changed)
    549		usb_hcd_poll_rh_status(hcd);
    550
    551	return ret;
    552}
    553
    554static void xenhcd_free_urb_priv(struct urb_priv *urbp)
    555{
    556	urbp->urb->hcpriv = NULL;
    557	kmem_cache_free(xenhcd_urbp_cachep, urbp);
    558}
    559
    560static inline unsigned int xenhcd_get_id_from_freelist(struct xenhcd_info *info)
    561{
    562	unsigned int free;
    563
    564	free = info->shadow_free;
    565	info->shadow_free = info->shadow[free].req.id;
    566	info->shadow[free].req.id = 0x0fff; /* debug */
    567	return free;
    568}
    569
    570static inline void xenhcd_add_id_to_freelist(struct xenhcd_info *info,
    571					     unsigned int id)
    572{
    573	info->shadow[id].req.id	= info->shadow_free;
    574	info->shadow[id].urb = NULL;
    575	info->shadow_free = id;
    576}
    577
    578static inline int xenhcd_count_pages(void *addr, int length)
    579{
    580	unsigned long vaddr = (unsigned long)addr;
    581
    582	return PFN_UP(vaddr + length) - PFN_DOWN(vaddr);
    583}
    584
    585static void xenhcd_gnttab_map(struct xenhcd_info *info, void *addr, int length,
    586			      grant_ref_t *gref_head,
    587			      struct xenusb_request_segment *seg,
    588			      int nr_pages, int flags)
    589{
    590	grant_ref_t ref;
    591	unsigned int offset;
    592	unsigned int len = length;
    593	unsigned int bytes;
    594	int i;
    595
    596	for (i = 0; i < nr_pages; i++) {
    597		offset = offset_in_page(addr);
    598
    599		bytes = PAGE_SIZE - offset;
    600		if (bytes > len)
    601			bytes = len;
    602
    603		ref = gnttab_claim_grant_reference(gref_head);
    604		gnttab_grant_foreign_access_ref(ref, info->xbdev->otherend_id,
    605						virt_to_gfn(addr), flags);
    606		seg[i].gref = ref;
    607		seg[i].offset = (__u16)offset;
    608		seg[i].length = (__u16)bytes;
    609
    610		addr += bytes;
    611		len -= bytes;
    612	}
    613}
    614
    615static __u32 xenhcd_pipe_urb_to_xenusb(__u32 urb_pipe, __u8 port)
    616{
    617	static __u32 pipe;
    618
    619	pipe = usb_pipedevice(urb_pipe) << XENUSB_PIPE_DEV_SHIFT;
    620	pipe |= usb_pipeendpoint(urb_pipe) << XENUSB_PIPE_EP_SHIFT;
    621	if (usb_pipein(urb_pipe))
    622		pipe |= XENUSB_PIPE_DIR;
    623	switch (usb_pipetype(urb_pipe)) {
    624	case PIPE_ISOCHRONOUS:
    625		pipe |= XENUSB_PIPE_TYPE_ISOC << XENUSB_PIPE_TYPE_SHIFT;
    626		break;
    627	case PIPE_INTERRUPT:
    628		pipe |= XENUSB_PIPE_TYPE_INT << XENUSB_PIPE_TYPE_SHIFT;
    629		break;
    630	case PIPE_CONTROL:
    631		pipe |= XENUSB_PIPE_TYPE_CTRL << XENUSB_PIPE_TYPE_SHIFT;
    632		break;
    633	case PIPE_BULK:
    634		pipe |= XENUSB_PIPE_TYPE_BULK << XENUSB_PIPE_TYPE_SHIFT;
    635		break;
    636	}
    637	pipe = xenusb_setportnum_pipe(pipe, port);
    638
    639	return pipe;
    640}
    641
    642static int xenhcd_map_urb_for_request(struct xenhcd_info *info, struct urb *urb,
    643				      struct xenusb_urb_request *req)
    644{
    645	grant_ref_t gref_head;
    646	int nr_buff_pages = 0;
    647	int nr_isodesc_pages = 0;
    648	int nr_grants = 0;
    649
    650	if (urb->transfer_buffer_length) {
    651		nr_buff_pages = xenhcd_count_pages(urb->transfer_buffer,
    652						urb->transfer_buffer_length);
    653
    654		if (usb_pipeisoc(urb->pipe))
    655			nr_isodesc_pages = xenhcd_count_pages(
    656				&urb->iso_frame_desc[0],
    657				sizeof(struct usb_iso_packet_descriptor) *
    658				urb->number_of_packets);
    659
    660		nr_grants = nr_buff_pages + nr_isodesc_pages;
    661		if (nr_grants > XENUSB_MAX_SEGMENTS_PER_REQUEST) {
    662			pr_err("xenhcd: error: %d grants\n", nr_grants);
    663			return -E2BIG;
    664		}
    665
    666		if (gnttab_alloc_grant_references(nr_grants, &gref_head)) {
    667			pr_err("xenhcd: gnttab_alloc_grant_references() error\n");
    668			return -ENOMEM;
    669		}
    670
    671		xenhcd_gnttab_map(info, urb->transfer_buffer,
    672				  urb->transfer_buffer_length, &gref_head,
    673				  &req->seg[0], nr_buff_pages,
    674				  usb_pipein(urb->pipe) ? 0 : GTF_readonly);
    675	}
    676
    677	req->pipe = xenhcd_pipe_urb_to_xenusb(urb->pipe, urb->dev->portnum);
    678	req->transfer_flags = 0;
    679	if (urb->transfer_flags & URB_SHORT_NOT_OK)
    680		req->transfer_flags |= XENUSB_SHORT_NOT_OK;
    681	req->buffer_length = urb->transfer_buffer_length;
    682	req->nr_buffer_segs = nr_buff_pages;
    683
    684	switch (usb_pipetype(urb->pipe)) {
    685	case PIPE_ISOCHRONOUS:
    686		req->u.isoc.interval = urb->interval;
    687		req->u.isoc.start_frame = urb->start_frame;
    688		req->u.isoc.number_of_packets = urb->number_of_packets;
    689		req->u.isoc.nr_frame_desc_segs = nr_isodesc_pages;
    690
    691		xenhcd_gnttab_map(info, &urb->iso_frame_desc[0],
    692				  sizeof(struct usb_iso_packet_descriptor) *
    693				  urb->number_of_packets,
    694				  &gref_head, &req->seg[nr_buff_pages],
    695				  nr_isodesc_pages, 0);
    696		break;
    697	case PIPE_INTERRUPT:
    698		req->u.intr.interval = urb->interval;
    699		break;
    700	case PIPE_CONTROL:
    701		if (urb->setup_packet)
    702			memcpy(req->u.ctrl, urb->setup_packet, 8);
    703		break;
    704	case PIPE_BULK:
    705		break;
    706	default:
    707		break;
    708	}
    709
    710	if (nr_grants)
    711		gnttab_free_grant_references(gref_head);
    712
    713	return 0;
    714}
    715
    716static void xenhcd_gnttab_done(struct xenhcd_info *info, unsigned int id)
    717{
    718	struct usb_shadow *shadow = info->shadow + id;
    719	int nr_segs = 0;
    720	int i;
    721
    722	if (!shadow->in_flight) {
    723		xenhcd_set_error(info, "Illegal request id");
    724		return;
    725	}
    726	shadow->in_flight = false;
    727
    728	nr_segs = shadow->req.nr_buffer_segs;
    729
    730	if (xenusb_pipeisoc(shadow->req.pipe))
    731		nr_segs += shadow->req.u.isoc.nr_frame_desc_segs;
    732
    733	for (i = 0; i < nr_segs; i++) {
    734		if (!gnttab_try_end_foreign_access(shadow->req.seg[i].gref))
    735			xenhcd_set_error(info, "backend didn't release grant");
    736	}
    737
    738	shadow->req.nr_buffer_segs = 0;
    739	shadow->req.u.isoc.nr_frame_desc_segs = 0;
    740}
    741
    742static int xenhcd_translate_status(int status)
    743{
    744	switch (status) {
    745	case XENUSB_STATUS_OK:
    746		return 0;
    747	case XENUSB_STATUS_NODEV:
    748		return -ENODEV;
    749	case XENUSB_STATUS_INVAL:
    750		return -EINVAL;
    751	case XENUSB_STATUS_STALL:
    752		return -EPIPE;
    753	case XENUSB_STATUS_IOERROR:
    754		return -EPROTO;
    755	case XENUSB_STATUS_BABBLE:
    756		return -EOVERFLOW;
    757	default:
    758		return -ESHUTDOWN;
    759	}
    760}
    761
    762static void xenhcd_giveback_urb(struct xenhcd_info *info, struct urb *urb,
    763				int status)
    764{
    765	struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv;
    766	int priv_status = urbp->status;
    767
    768	list_del_init(&urbp->list);
    769	xenhcd_free_urb_priv(urbp);
    770
    771	if (urb->status == -EINPROGRESS)
    772		urb->status = xenhcd_translate_status(status);
    773
    774	spin_unlock(&info->lock);
    775	usb_hcd_giveback_urb(xenhcd_info_to_hcd(info), urb,
    776			     priv_status <= 0 ? priv_status : urb->status);
    777	spin_lock(&info->lock);
    778}
    779
    780static int xenhcd_do_request(struct xenhcd_info *info, struct urb_priv *urbp)
    781{
    782	struct xenusb_urb_request *req;
    783	struct urb *urb = urbp->urb;
    784	unsigned int id;
    785	int notify;
    786	int ret;
    787
    788	id = xenhcd_get_id_from_freelist(info);
    789	req = &info->shadow[id].req;
    790	req->id = id;
    791
    792	if (unlikely(urbp->unlinked)) {
    793		req->u.unlink.unlink_id = urbp->req_id;
    794		req->pipe = xenusb_setunlink_pipe(xenhcd_pipe_urb_to_xenusb(
    795						 urb->pipe, urb->dev->portnum));
    796		urbp->unlink_req_id = id;
    797	} else {
    798		ret = xenhcd_map_urb_for_request(info, urb, req);
    799		if (ret) {
    800			xenhcd_add_id_to_freelist(info, id);
    801			return ret;
    802		}
    803		urbp->req_id = id;
    804	}
    805
    806	req = RING_GET_REQUEST(&info->urb_ring, info->urb_ring.req_prod_pvt);
    807	*req = info->shadow[id].req;
    808
    809	info->urb_ring.req_prod_pvt++;
    810	info->shadow[id].urb = urb;
    811	info->shadow[id].in_flight = true;
    812
    813	RING_PUSH_REQUESTS_AND_CHECK_NOTIFY(&info->urb_ring, notify);
    814	if (notify)
    815		notify_remote_via_irq(info->irq);
    816
    817	return 0;
    818}
    819
    820static void xenhcd_kick_pending_urbs(struct xenhcd_info *info)
    821{
    822	struct urb_priv *urbp;
    823
    824	while (!list_empty(&info->pending_submit_list)) {
    825		if (RING_FULL(&info->urb_ring)) {
    826			xenhcd_timer_action(info, TIMER_RING_WATCHDOG);
    827			return;
    828		}
    829
    830		urbp = list_entry(info->pending_submit_list.next,
    831				  struct urb_priv, list);
    832		if (!xenhcd_do_request(info, urbp))
    833			list_move_tail(&urbp->list, &info->in_progress_list);
    834		else
    835			xenhcd_giveback_urb(info, urbp->urb, -ESHUTDOWN);
    836	}
    837	xenhcd_timer_action_done(info, TIMER_SCAN_PENDING_URBS);
    838}
    839
    840/*
    841 * caller must lock info->lock
    842 */
    843static void xenhcd_cancel_all_enqueued_urbs(struct xenhcd_info *info)
    844{
    845	struct urb_priv *urbp, *tmp;
    846	int req_id;
    847
    848	list_for_each_entry_safe(urbp, tmp, &info->in_progress_list, list) {
    849		req_id = urbp->req_id;
    850		if (!urbp->unlinked) {
    851			xenhcd_gnttab_done(info, req_id);
    852			if (info->error)
    853				return;
    854			if (urbp->urb->status == -EINPROGRESS)
    855				/* not dequeued */
    856				xenhcd_giveback_urb(info, urbp->urb,
    857						    -ESHUTDOWN);
    858			else	/* dequeued */
    859				xenhcd_giveback_urb(info, urbp->urb,
    860						    urbp->urb->status);
    861		}
    862		info->shadow[req_id].urb = NULL;
    863	}
    864
    865	list_for_each_entry_safe(urbp, tmp, &info->pending_submit_list, list)
    866		xenhcd_giveback_urb(info, urbp->urb, -ESHUTDOWN);
    867}
    868
    869/*
    870 * caller must lock info->lock
    871 */
    872static void xenhcd_giveback_unlinked_urbs(struct xenhcd_info *info)
    873{
    874	struct urb_priv *urbp, *tmp;
    875
    876	list_for_each_entry_safe(urbp, tmp, &info->giveback_waiting_list, list)
    877		xenhcd_giveback_urb(info, urbp->urb, urbp->urb->status);
    878}
    879
    880static int xenhcd_submit_urb(struct xenhcd_info *info, struct urb_priv *urbp)
    881{
    882	int ret;
    883
    884	if (RING_FULL(&info->urb_ring)) {
    885		list_add_tail(&urbp->list, &info->pending_submit_list);
    886		xenhcd_timer_action(info, TIMER_RING_WATCHDOG);
    887		return 0;
    888	}
    889
    890	if (!list_empty(&info->pending_submit_list)) {
    891		list_add_tail(&urbp->list, &info->pending_submit_list);
    892		xenhcd_timer_action(info, TIMER_SCAN_PENDING_URBS);
    893		return 0;
    894	}
    895
    896	ret = xenhcd_do_request(info, urbp);
    897	if (ret == 0)
    898		list_add_tail(&urbp->list, &info->in_progress_list);
    899
    900	return ret;
    901}
    902
    903static int xenhcd_unlink_urb(struct xenhcd_info *info, struct urb_priv *urbp)
    904{
    905	int ret;
    906
    907	/* already unlinked? */
    908	if (urbp->unlinked)
    909		return -EBUSY;
    910
    911	urbp->unlinked = true;
    912
    913	/* the urb is still in pending_submit queue */
    914	if (urbp->req_id == ~0) {
    915		list_move_tail(&urbp->list, &info->giveback_waiting_list);
    916		xenhcd_timer_action(info, TIMER_SCAN_PENDING_URBS);
    917		return 0;
    918	}
    919
    920	/* send unlink request to backend */
    921	if (RING_FULL(&info->urb_ring)) {
    922		list_move_tail(&urbp->list, &info->pending_unlink_list);
    923		xenhcd_timer_action(info, TIMER_RING_WATCHDOG);
    924		return 0;
    925	}
    926
    927	if (!list_empty(&info->pending_unlink_list)) {
    928		list_move_tail(&urbp->list, &info->pending_unlink_list);
    929		xenhcd_timer_action(info, TIMER_SCAN_PENDING_URBS);
    930		return 0;
    931	}
    932
    933	ret = xenhcd_do_request(info, urbp);
    934	if (ret == 0)
    935		list_move_tail(&urbp->list, &info->in_progress_list);
    936
    937	return ret;
    938}
    939
    940static void xenhcd_res_to_urb(struct xenhcd_info *info,
    941			      struct xenusb_urb_response *res, struct urb *urb)
    942{
    943	if (unlikely(!urb))
    944		return;
    945
    946	if (res->actual_length > urb->transfer_buffer_length)
    947		urb->actual_length = urb->transfer_buffer_length;
    948	else if (res->actual_length < 0)
    949		urb->actual_length = 0;
    950	else
    951		urb->actual_length = res->actual_length;
    952	urb->error_count = res->error_count;
    953	urb->start_frame = res->start_frame;
    954	xenhcd_giveback_urb(info, urb, res->status);
    955}
    956
    957static int xenhcd_urb_request_done(struct xenhcd_info *info,
    958				   unsigned int *eoiflag)
    959{
    960	struct xenusb_urb_response res;
    961	RING_IDX i, rp;
    962	__u16 id;
    963	int more_to_do = 0;
    964	unsigned long flags;
    965
    966	spin_lock_irqsave(&info->lock, flags);
    967
    968	rp = info->urb_ring.sring->rsp_prod;
    969	if (RING_RESPONSE_PROD_OVERFLOW(&info->urb_ring, rp)) {
    970		xenhcd_set_error(info, "Illegal index on urb-ring");
    971		goto err;
    972	}
    973	rmb(); /* ensure we see queued responses up to "rp" */
    974
    975	for (i = info->urb_ring.rsp_cons; i != rp; i++) {
    976		RING_COPY_RESPONSE(&info->urb_ring, i, &res);
    977		id = res.id;
    978		if (id >= XENUSB_URB_RING_SIZE) {
    979			xenhcd_set_error(info, "Illegal data on urb-ring");
    980			goto err;
    981		}
    982
    983		if (likely(xenusb_pipesubmit(info->shadow[id].req.pipe))) {
    984			xenhcd_gnttab_done(info, id);
    985			if (info->error)
    986				goto err;
    987			xenhcd_res_to_urb(info, &res, info->shadow[id].urb);
    988		}
    989
    990		xenhcd_add_id_to_freelist(info, id);
    991
    992		*eoiflag = 0;
    993	}
    994	info->urb_ring.rsp_cons = i;
    995
    996	if (i != info->urb_ring.req_prod_pvt)
    997		RING_FINAL_CHECK_FOR_RESPONSES(&info->urb_ring, more_to_do);
    998	else
    999		info->urb_ring.sring->rsp_event = i + 1;
   1000
   1001	spin_unlock_irqrestore(&info->lock, flags);
   1002
   1003	return more_to_do;
   1004
   1005 err:
   1006	spin_unlock_irqrestore(&info->lock, flags);
   1007	return 0;
   1008}
   1009
   1010static int xenhcd_conn_notify(struct xenhcd_info *info, unsigned int *eoiflag)
   1011{
   1012	struct xenusb_conn_response res;
   1013	struct xenusb_conn_request *req;
   1014	RING_IDX rc, rp;
   1015	__u16 id;
   1016	__u8 portnum, speed;
   1017	int more_to_do = 0;
   1018	int notify;
   1019	int port_changed = 0;
   1020	unsigned long flags;
   1021
   1022	spin_lock_irqsave(&info->lock, flags);
   1023
   1024	rc = info->conn_ring.rsp_cons;
   1025	rp = info->conn_ring.sring->rsp_prod;
   1026	if (RING_RESPONSE_PROD_OVERFLOW(&info->conn_ring, rp)) {
   1027		xenhcd_set_error(info, "Illegal index on conn-ring");
   1028		spin_unlock_irqrestore(&info->lock, flags);
   1029		return 0;
   1030	}
   1031	rmb(); /* ensure we see queued responses up to "rp" */
   1032
   1033	while (rc != rp) {
   1034		RING_COPY_RESPONSE(&info->conn_ring, rc, &res);
   1035		id = res.id;
   1036		portnum = res.portnum;
   1037		speed = res.speed;
   1038		info->conn_ring.rsp_cons = ++rc;
   1039
   1040		if (xenhcd_rhport_connect(info, portnum, speed)) {
   1041			xenhcd_set_error(info, "Illegal data on conn-ring");
   1042			spin_unlock_irqrestore(&info->lock, flags);
   1043			return 0;
   1044		}
   1045
   1046		if (info->ports[portnum - 1].c_connection)
   1047			port_changed = 1;
   1048
   1049		barrier();
   1050
   1051		req = RING_GET_REQUEST(&info->conn_ring,
   1052				       info->conn_ring.req_prod_pvt);
   1053		req->id = id;
   1054		info->conn_ring.req_prod_pvt++;
   1055
   1056		*eoiflag = 0;
   1057	}
   1058
   1059	if (rc != info->conn_ring.req_prod_pvt)
   1060		RING_FINAL_CHECK_FOR_RESPONSES(&info->conn_ring, more_to_do);
   1061	else
   1062		info->conn_ring.sring->rsp_event = rc + 1;
   1063
   1064	RING_PUSH_REQUESTS_AND_CHECK_NOTIFY(&info->conn_ring, notify);
   1065	if (notify)
   1066		notify_remote_via_irq(info->irq);
   1067
   1068	spin_unlock_irqrestore(&info->lock, flags);
   1069
   1070	if (port_changed)
   1071		usb_hcd_poll_rh_status(xenhcd_info_to_hcd(info));
   1072
   1073	return more_to_do;
   1074}
   1075
   1076static irqreturn_t xenhcd_int(int irq, void *dev_id)
   1077{
   1078	struct xenhcd_info *info = (struct xenhcd_info *)dev_id;
   1079	unsigned int eoiflag = XEN_EOI_FLAG_SPURIOUS;
   1080
   1081	if (unlikely(info->error)) {
   1082		xen_irq_lateeoi(irq, XEN_EOI_FLAG_SPURIOUS);
   1083		return IRQ_HANDLED;
   1084	}
   1085
   1086	while (xenhcd_urb_request_done(info, &eoiflag) |
   1087	       xenhcd_conn_notify(info, &eoiflag))
   1088		/* Yield point for this unbounded loop. */
   1089		cond_resched();
   1090
   1091	xen_irq_lateeoi(irq, eoiflag);
   1092	return IRQ_HANDLED;
   1093}
   1094
   1095static void xenhcd_destroy_rings(struct xenhcd_info *info)
   1096{
   1097	if (info->irq)
   1098		unbind_from_irqhandler(info->irq, info);
   1099	info->irq = 0;
   1100
   1101	xenbus_teardown_ring((void **)&info->urb_ring.sring, 1,
   1102			     &info->urb_ring_ref);
   1103	xenbus_teardown_ring((void **)&info->conn_ring.sring, 1,
   1104			     &info->conn_ring_ref);
   1105}
   1106
   1107static int xenhcd_setup_rings(struct xenbus_device *dev,
   1108			      struct xenhcd_info *info)
   1109{
   1110	struct xenusb_urb_sring *urb_sring;
   1111	struct xenusb_conn_sring *conn_sring;
   1112	int err;
   1113
   1114	info->conn_ring_ref = INVALID_GRANT_REF;
   1115	err = xenbus_setup_ring(dev, GFP_NOIO | __GFP_HIGH,
   1116				(void **)&urb_sring, 1, &info->urb_ring_ref);
   1117	if (err) {
   1118		xenbus_dev_fatal(dev, err, "allocating urb ring");
   1119		return err;
   1120	}
   1121	XEN_FRONT_RING_INIT(&info->urb_ring, urb_sring, PAGE_SIZE);
   1122
   1123	err = xenbus_setup_ring(dev, GFP_NOIO | __GFP_HIGH,
   1124				(void **)&conn_sring, 1, &info->conn_ring_ref);
   1125	if (err) {
   1126		xenbus_dev_fatal(dev, err, "allocating conn ring");
   1127		goto fail;
   1128	}
   1129	XEN_FRONT_RING_INIT(&info->conn_ring, conn_sring, PAGE_SIZE);
   1130
   1131	err = xenbus_alloc_evtchn(dev, &info->evtchn);
   1132	if (err) {
   1133		xenbus_dev_fatal(dev, err, "xenbus_alloc_evtchn");
   1134		goto fail;
   1135	}
   1136
   1137	err = bind_evtchn_to_irq_lateeoi(info->evtchn);
   1138	if (err <= 0) {
   1139		xenbus_dev_fatal(dev, err, "bind_evtchn_to_irq_lateeoi");
   1140		goto fail;
   1141	}
   1142
   1143	info->irq = err;
   1144
   1145	err = request_threaded_irq(info->irq, NULL, xenhcd_int,
   1146				   IRQF_ONESHOT, "xenhcd", info);
   1147	if (err) {
   1148		xenbus_dev_fatal(dev, err, "request_threaded_irq");
   1149		goto free_irq;
   1150	}
   1151
   1152	return 0;
   1153
   1154free_irq:
   1155	unbind_from_irqhandler(info->irq, info);
   1156fail:
   1157	xenhcd_destroy_rings(info);
   1158	return err;
   1159}
   1160
   1161static int xenhcd_talk_to_backend(struct xenbus_device *dev,
   1162				  struct xenhcd_info *info)
   1163{
   1164	const char *message;
   1165	struct xenbus_transaction xbt;
   1166	int err;
   1167
   1168	err = xenhcd_setup_rings(dev, info);
   1169	if (err)
   1170		return err;
   1171
   1172again:
   1173	err = xenbus_transaction_start(&xbt);
   1174	if (err) {
   1175		xenbus_dev_fatal(dev, err, "starting transaction");
   1176		goto destroy_ring;
   1177	}
   1178
   1179	err = xenbus_printf(xbt, dev->nodename, "urb-ring-ref", "%u",
   1180			    info->urb_ring_ref);
   1181	if (err) {
   1182		message = "writing urb-ring-ref";
   1183		goto abort_transaction;
   1184	}
   1185
   1186	err = xenbus_printf(xbt, dev->nodename, "conn-ring-ref", "%u",
   1187			    info->conn_ring_ref);
   1188	if (err) {
   1189		message = "writing conn-ring-ref";
   1190		goto abort_transaction;
   1191	}
   1192
   1193	err = xenbus_printf(xbt, dev->nodename, "event-channel", "%u",
   1194			    info->evtchn);
   1195	if (err) {
   1196		message = "writing event-channel";
   1197		goto abort_transaction;
   1198	}
   1199
   1200	err = xenbus_transaction_end(xbt, 0);
   1201	if (err) {
   1202		if (err == -EAGAIN)
   1203			goto again;
   1204		xenbus_dev_fatal(dev, err, "completing transaction");
   1205		goto destroy_ring;
   1206	}
   1207
   1208	return 0;
   1209
   1210abort_transaction:
   1211	xenbus_transaction_end(xbt, 1);
   1212	xenbus_dev_fatal(dev, err, "%s", message);
   1213
   1214destroy_ring:
   1215	xenhcd_destroy_rings(info);
   1216
   1217	return err;
   1218}
   1219
   1220static int xenhcd_connect(struct xenbus_device *dev)
   1221{
   1222	struct xenhcd_info *info = dev_get_drvdata(&dev->dev);
   1223	struct xenusb_conn_request *req;
   1224	int idx, err;
   1225	int notify;
   1226	char name[TASK_COMM_LEN];
   1227	struct usb_hcd *hcd;
   1228
   1229	hcd = xenhcd_info_to_hcd(info);
   1230	snprintf(name, TASK_COMM_LEN, "xenhcd.%d", hcd->self.busnum);
   1231
   1232	err = xenhcd_talk_to_backend(dev, info);
   1233	if (err)
   1234		return err;
   1235
   1236	/* prepare ring for hotplug notification */
   1237	for (idx = 0; idx < XENUSB_CONN_RING_SIZE; idx++) {
   1238		req = RING_GET_REQUEST(&info->conn_ring, idx);
   1239		req->id = idx;
   1240	}
   1241	info->conn_ring.req_prod_pvt = idx;
   1242
   1243	RING_PUSH_REQUESTS_AND_CHECK_NOTIFY(&info->conn_ring, notify);
   1244	if (notify)
   1245		notify_remote_via_irq(info->irq);
   1246
   1247	return 0;
   1248}
   1249
   1250static void xenhcd_disconnect(struct xenbus_device *dev)
   1251{
   1252	struct xenhcd_info *info = dev_get_drvdata(&dev->dev);
   1253	struct usb_hcd *hcd = xenhcd_info_to_hcd(info);
   1254
   1255	usb_remove_hcd(hcd);
   1256	xenbus_frontend_closed(dev);
   1257}
   1258
   1259static void xenhcd_watchdog(struct timer_list *timer)
   1260{
   1261	struct xenhcd_info *info = from_timer(info, timer, watchdog);
   1262	unsigned long flags;
   1263
   1264	spin_lock_irqsave(&info->lock, flags);
   1265	if (likely(HC_IS_RUNNING(xenhcd_info_to_hcd(info)->state))) {
   1266		xenhcd_timer_action_done(info, TIMER_RING_WATCHDOG);
   1267		xenhcd_giveback_unlinked_urbs(info);
   1268		xenhcd_kick_pending_urbs(info);
   1269	}
   1270	spin_unlock_irqrestore(&info->lock, flags);
   1271}
   1272
   1273/*
   1274 * one-time HC init
   1275 */
   1276static int xenhcd_setup(struct usb_hcd *hcd)
   1277{
   1278	struct xenhcd_info *info = xenhcd_hcd_to_info(hcd);
   1279
   1280	spin_lock_init(&info->lock);
   1281	INIT_LIST_HEAD(&info->pending_submit_list);
   1282	INIT_LIST_HEAD(&info->pending_unlink_list);
   1283	INIT_LIST_HEAD(&info->in_progress_list);
   1284	INIT_LIST_HEAD(&info->giveback_waiting_list);
   1285	timer_setup(&info->watchdog, xenhcd_watchdog, 0);
   1286
   1287	hcd->has_tt = (hcd->driver->flags & HCD_MASK) != HCD_USB11;
   1288
   1289	return 0;
   1290}
   1291
   1292/*
   1293 * start HC running
   1294 */
   1295static int xenhcd_run(struct usb_hcd *hcd)
   1296{
   1297	hcd->uses_new_polling = 1;
   1298	clear_bit(HCD_FLAG_POLL_RH, &hcd->flags);
   1299	hcd->state = HC_STATE_RUNNING;
   1300	return 0;
   1301}
   1302
   1303/*
   1304 * stop running HC
   1305 */
   1306static void xenhcd_stop(struct usb_hcd *hcd)
   1307{
   1308	struct xenhcd_info *info = xenhcd_hcd_to_info(hcd);
   1309
   1310	del_timer_sync(&info->watchdog);
   1311	spin_lock_irq(&info->lock);
   1312	/* cancel all urbs */
   1313	hcd->state = HC_STATE_HALT;
   1314	xenhcd_cancel_all_enqueued_urbs(info);
   1315	xenhcd_giveback_unlinked_urbs(info);
   1316	spin_unlock_irq(&info->lock);
   1317}
   1318
   1319/*
   1320 * called as .urb_enqueue()
   1321 * non-error returns are promise to giveback the urb later
   1322 */
   1323static int xenhcd_urb_enqueue(struct usb_hcd *hcd, struct urb *urb,
   1324			      gfp_t mem_flags)
   1325{
   1326	struct xenhcd_info *info = xenhcd_hcd_to_info(hcd);
   1327	struct urb_priv *urbp;
   1328	unsigned long flags;
   1329	int ret;
   1330
   1331	if (unlikely(info->error))
   1332		return -ESHUTDOWN;
   1333
   1334	urbp = kmem_cache_zalloc(xenhcd_urbp_cachep, mem_flags);
   1335	if (!urbp)
   1336		return -ENOMEM;
   1337
   1338	spin_lock_irqsave(&info->lock, flags);
   1339
   1340	urbp->urb = urb;
   1341	urb->hcpriv = urbp;
   1342	urbp->req_id = ~0;
   1343	urbp->unlink_req_id = ~0;
   1344	INIT_LIST_HEAD(&urbp->list);
   1345	urbp->status = 1;
   1346	urb->unlinked = false;
   1347
   1348	ret = xenhcd_submit_urb(info, urbp);
   1349
   1350	if (ret)
   1351		xenhcd_free_urb_priv(urbp);
   1352
   1353	spin_unlock_irqrestore(&info->lock, flags);
   1354
   1355	return ret;
   1356}
   1357
   1358/*
   1359 * called as .urb_dequeue()
   1360 */
   1361static int xenhcd_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status)
   1362{
   1363	struct xenhcd_info *info = xenhcd_hcd_to_info(hcd);
   1364	struct urb_priv *urbp;
   1365	unsigned long flags;
   1366	int ret = 0;
   1367
   1368	spin_lock_irqsave(&info->lock, flags);
   1369
   1370	urbp = urb->hcpriv;
   1371	if (urbp) {
   1372		urbp->status = status;
   1373		ret = xenhcd_unlink_urb(info, urbp);
   1374	}
   1375
   1376	spin_unlock_irqrestore(&info->lock, flags);
   1377
   1378	return ret;
   1379}
   1380
   1381/*
   1382 * called from usb_get_current_frame_number(),
   1383 * but, almost all drivers not use such function.
   1384 */
   1385static int xenhcd_get_frame(struct usb_hcd *hcd)
   1386{
   1387	/* it means error, but probably no problem :-) */
   1388	return 0;
   1389}
   1390
   1391static struct hc_driver xenhcd_usb20_hc_driver = {
   1392	.description = "xen-hcd",
   1393	.product_desc = "Xen USB2.0 Virtual Host Controller",
   1394	.hcd_priv_size = sizeof(struct xenhcd_info),
   1395	.flags = HCD_USB2,
   1396
   1397	/* basic HC lifecycle operations */
   1398	.reset = xenhcd_setup,
   1399	.start = xenhcd_run,
   1400	.stop = xenhcd_stop,
   1401
   1402	/* managing urb I/O */
   1403	.urb_enqueue = xenhcd_urb_enqueue,
   1404	.urb_dequeue = xenhcd_urb_dequeue,
   1405	.get_frame_number = xenhcd_get_frame,
   1406
   1407	/* root hub operations */
   1408	.hub_status_data = xenhcd_hub_status_data,
   1409	.hub_control = xenhcd_hub_control,
   1410#ifdef CONFIG_PM
   1411	.bus_suspend = xenhcd_bus_suspend,
   1412	.bus_resume = xenhcd_bus_resume,
   1413#endif
   1414};
   1415
   1416static struct hc_driver xenhcd_usb11_hc_driver = {
   1417	.description = "xen-hcd",
   1418	.product_desc = "Xen USB1.1 Virtual Host Controller",
   1419	.hcd_priv_size = sizeof(struct xenhcd_info),
   1420	.flags = HCD_USB11,
   1421
   1422	/* basic HC lifecycle operations */
   1423	.reset = xenhcd_setup,
   1424	.start = xenhcd_run,
   1425	.stop = xenhcd_stop,
   1426
   1427	/* managing urb I/O */
   1428	.urb_enqueue = xenhcd_urb_enqueue,
   1429	.urb_dequeue = xenhcd_urb_dequeue,
   1430	.get_frame_number = xenhcd_get_frame,
   1431
   1432	/* root hub operations */
   1433	.hub_status_data = xenhcd_hub_status_data,
   1434	.hub_control = xenhcd_hub_control,
   1435#ifdef CONFIG_PM
   1436	.bus_suspend = xenhcd_bus_suspend,
   1437	.bus_resume = xenhcd_bus_resume,
   1438#endif
   1439};
   1440
   1441static struct usb_hcd *xenhcd_create_hcd(struct xenbus_device *dev)
   1442{
   1443	int i;
   1444	int err = 0;
   1445	int num_ports;
   1446	int usb_ver;
   1447	struct usb_hcd *hcd = NULL;
   1448	struct xenhcd_info *info;
   1449
   1450	err = xenbus_scanf(XBT_NIL, dev->otherend, "num-ports", "%d",
   1451			   &num_ports);
   1452	if (err != 1) {
   1453		xenbus_dev_fatal(dev, err, "reading num-ports");
   1454		return ERR_PTR(-EINVAL);
   1455	}
   1456	if (num_ports < 1 || num_ports > XENUSB_MAX_PORTNR) {
   1457		xenbus_dev_fatal(dev, err, "invalid num-ports");
   1458		return ERR_PTR(-EINVAL);
   1459	}
   1460
   1461	err = xenbus_scanf(XBT_NIL, dev->otherend, "usb-ver", "%d", &usb_ver);
   1462	if (err != 1) {
   1463		xenbus_dev_fatal(dev, err, "reading usb-ver");
   1464		return ERR_PTR(-EINVAL);
   1465	}
   1466	switch (usb_ver) {
   1467	case XENUSB_VER_USB11:
   1468		hcd = usb_create_hcd(&xenhcd_usb11_hc_driver, &dev->dev,
   1469				     dev_name(&dev->dev));
   1470		break;
   1471	case XENUSB_VER_USB20:
   1472		hcd = usb_create_hcd(&xenhcd_usb20_hc_driver, &dev->dev,
   1473				     dev_name(&dev->dev));
   1474		break;
   1475	default:
   1476		xenbus_dev_fatal(dev, err, "invalid usb-ver");
   1477		return ERR_PTR(-EINVAL);
   1478	}
   1479	if (!hcd) {
   1480		xenbus_dev_fatal(dev, err,
   1481				 "fail to allocate USB host controller");
   1482		return ERR_PTR(-ENOMEM);
   1483	}
   1484
   1485	info = xenhcd_hcd_to_info(hcd);
   1486	info->xbdev = dev;
   1487	info->rh_numports = num_ports;
   1488
   1489	for (i = 0; i < XENUSB_URB_RING_SIZE; i++) {
   1490		info->shadow[i].req.id = i + 1;
   1491		info->shadow[i].urb = NULL;
   1492		info->shadow[i].in_flight = false;
   1493	}
   1494	info->shadow[XENUSB_URB_RING_SIZE - 1].req.id = 0x0fff;
   1495
   1496	return hcd;
   1497}
   1498
   1499static void xenhcd_backend_changed(struct xenbus_device *dev,
   1500				   enum xenbus_state backend_state)
   1501{
   1502	switch (backend_state) {
   1503	case XenbusStateInitialising:
   1504	case XenbusStateReconfiguring:
   1505	case XenbusStateReconfigured:
   1506	case XenbusStateUnknown:
   1507		break;
   1508
   1509	case XenbusStateInitWait:
   1510	case XenbusStateInitialised:
   1511	case XenbusStateConnected:
   1512		if (dev->state != XenbusStateInitialising)
   1513			break;
   1514		if (!xenhcd_connect(dev))
   1515			xenbus_switch_state(dev, XenbusStateConnected);
   1516		break;
   1517
   1518	case XenbusStateClosed:
   1519		if (dev->state == XenbusStateClosed)
   1520			break;
   1521		fallthrough;	/* Missed the backend's Closing state. */
   1522	case XenbusStateClosing:
   1523		xenhcd_disconnect(dev);
   1524		break;
   1525
   1526	default:
   1527		xenbus_dev_fatal(dev, -EINVAL, "saw state %d at frontend",
   1528				 backend_state);
   1529		break;
   1530	}
   1531}
   1532
   1533static int xenhcd_remove(struct xenbus_device *dev)
   1534{
   1535	struct xenhcd_info *info = dev_get_drvdata(&dev->dev);
   1536	struct usb_hcd *hcd = xenhcd_info_to_hcd(info);
   1537
   1538	xenhcd_destroy_rings(info);
   1539	usb_put_hcd(hcd);
   1540
   1541	return 0;
   1542}
   1543
   1544static int xenhcd_probe(struct xenbus_device *dev,
   1545			const struct xenbus_device_id *id)
   1546{
   1547	int err;
   1548	struct usb_hcd *hcd;
   1549	struct xenhcd_info *info;
   1550
   1551	if (usb_disabled())
   1552		return -ENODEV;
   1553
   1554	hcd = xenhcd_create_hcd(dev);
   1555	if (IS_ERR(hcd)) {
   1556		err = PTR_ERR(hcd);
   1557		xenbus_dev_fatal(dev, err,
   1558				 "fail to create usb host controller");
   1559		return err;
   1560	}
   1561
   1562	info = xenhcd_hcd_to_info(hcd);
   1563	dev_set_drvdata(&dev->dev, info);
   1564
   1565	err = usb_add_hcd(hcd, 0, 0);
   1566	if (err) {
   1567		xenbus_dev_fatal(dev, err, "fail to add USB host controller");
   1568		usb_put_hcd(hcd);
   1569		dev_set_drvdata(&dev->dev, NULL);
   1570	}
   1571
   1572	return err;
   1573}
   1574
   1575static const struct xenbus_device_id xenhcd_ids[] = {
   1576	{ "vusb" },
   1577	{ "" },
   1578};
   1579
   1580static struct xenbus_driver xenhcd_driver = {
   1581	.ids			= xenhcd_ids,
   1582	.probe			= xenhcd_probe,
   1583	.otherend_changed	= xenhcd_backend_changed,
   1584	.remove			= xenhcd_remove,
   1585};
   1586
   1587static int __init xenhcd_init(void)
   1588{
   1589	if (!xen_domain())
   1590		return -ENODEV;
   1591
   1592	xenhcd_urbp_cachep = kmem_cache_create("xenhcd_urb_priv",
   1593					sizeof(struct urb_priv), 0, 0, NULL);
   1594	if (!xenhcd_urbp_cachep) {
   1595		pr_err("xenhcd failed to create kmem cache\n");
   1596		return -ENOMEM;
   1597	}
   1598
   1599	return xenbus_register_frontend(&xenhcd_driver);
   1600}
   1601module_init(xenhcd_init);
   1602
   1603static void __exit xenhcd_exit(void)
   1604{
   1605	kmem_cache_destroy(xenhcd_urbp_cachep);
   1606	xenbus_unregister_driver(&xenhcd_driver);
   1607}
   1608module_exit(xenhcd_exit);
   1609
   1610MODULE_ALIAS("xen:vusb");
   1611MODULE_AUTHOR("Juergen Gross <jgross@suse.com>");
   1612MODULE_DESCRIPTION("Xen USB Virtual Host Controller driver (xen-hcd)");
   1613MODULE_LICENSE("Dual BSD/GPL");