Linux Audio

Check our new training course

Loading...
v3.1
 
   1/*
   2* Host Controller Driver for the Elan Digital Systems U132 adapter
   3*
   4* Copyright(C) 2006 Elan Digital Systems Limited
   5* http://www.elandigitalsystems.com
   6*
   7* Author and Maintainer - Tony Olech - Elan Digital Systems
   8* tony.olech@elandigitalsystems.com
   9*
  10* This program is free software;you can redistribute it and/or
  11* modify it under the terms of the GNU General Public License as
  12* published by the Free Software Foundation, version 2.
  13*
  14*
  15* This driver was written by Tony Olech(tony.olech@elandigitalsystems.com)
  16* based on various USB host drivers in the 2.6.15 linux kernel
  17* with constant reference to the 3rd Edition of Linux Device Drivers
  18* published by O'Reilly
  19*
  20* The U132 adapter is a USB to CardBus adapter specifically designed
  21* for PC cards that contain an OHCI host controller. Typical PC cards
  22* are the Orange Mobile 3G Option GlobeTrotter Fusion card.
  23*
  24* The U132 adapter will *NOT *work with PC cards that do not contain
  25* an OHCI controller. A simple way to test whether a PC card has an
  26* OHCI controller as an interface is to insert the PC card directly
  27* into a laptop(or desktop) with a CardBus slot and if "lspci" shows
  28* a new USB controller and "lsusb -v" shows a new OHCI Host Controller
  29* then there is a good chance that the U132 adapter will support the
  30* PC card.(you also need the specific client driver for the PC card)
  31*
  32* Please inform the Author and Maintainer about any PC cards that
  33* contain OHCI Host Controller and work when directly connected to
  34* an embedded CardBus slot but do not work when they are connected
  35* via an ELAN U132 adapter.
  36*
  37*/
  38#include <linux/kernel.h>
  39#include <linux/module.h>
  40#include <linux/moduleparam.h>
  41#include <linux/delay.h>
  42#include <linux/ioport.h>
  43#include <linux/pci_ids.h>
  44#include <linux/sched.h>
  45#include <linux/slab.h>
  46#include <linux/errno.h>
  47#include <linux/init.h>
  48#include <linux/timer.h>
  49#include <linux/list.h>
  50#include <linux/interrupt.h>
  51#include <linux/usb.h>
  52#include <linux/usb/hcd.h>
  53#include <linux/workqueue.h>
  54#include <linux/platform_device.h>
  55#include <linux/mutex.h>
  56#include <asm/io.h>
  57#include <asm/irq.h>
  58#include <asm/system.h>
  59#include <asm/byteorder.h>
  60
  61	/* FIXME ohci.h is ONLY for internal use by the OHCI driver.
  62	 * If you're going to try stuff like this, you need to split
  63	 * out shareable stuff (register declarations?) into its own
  64	 * file, maybe name <linux/usb/ohci.h>
  65	 */
  66
  67#include "ohci.h"
  68#define OHCI_CONTROL_INIT OHCI_CTRL_CBSR
  69#define OHCI_INTR_INIT (OHCI_INTR_MIE | OHCI_INTR_UE | OHCI_INTR_RD | \
  70	OHCI_INTR_WDH)
  71MODULE_AUTHOR("Tony Olech - Elan Digital Systems Limited");
  72MODULE_DESCRIPTION("U132 USB Host Controller Driver");
  73MODULE_LICENSE("GPL");
  74#define INT_MODULE_PARM(n, v) static int n = v;module_param(n, int, 0444)
  75INT_MODULE_PARM(testing, 0);
  76/* Some boards misreport power switching/overcurrent*/
  77static int distrust_firmware = 1;
  78module_param(distrust_firmware, bool, 0);
  79MODULE_PARM_DESC(distrust_firmware, "true to distrust firmware power/overcurren"
  80	"t setup");
  81static DECLARE_WAIT_QUEUE_HEAD(u132_hcd_wait);
  82/*
  83* u132_module_lock exists to protect access to global variables
  84*
  85*/
  86static struct mutex u132_module_lock;
  87static int u132_exiting;
  88static int u132_instances;
  89static struct list_head u132_static_list;
  90/*
  91* end of the global variables protected by u132_module_lock
  92*/
  93static struct workqueue_struct *workqueue;
  94#define MAX_U132_PORTS 7
  95#define MAX_U132_ADDRS 128
  96#define MAX_U132_UDEVS 4
  97#define MAX_U132_ENDPS 100
  98#define MAX_U132_RINGS 4
  99static const char *cc_to_text[16] = {
 100	"No Error ",
 101	"CRC Error ",
 102	"Bit Stuff ",
 103	"Data Togg ",
 104	"Stall ",
 105	"DevNotResp ",
 106	"PIDCheck ",
 107	"UnExpPID ",
 108	"DataOver ",
 109	"DataUnder ",
 110	"(for hw) ",
 111	"(for hw) ",
 112	"BufferOver ",
 113	"BuffUnder ",
 114	"(for HCD) ",
 115	"(for HCD) "
 116};
 117struct u132_port {
 118	struct u132 *u132;
 119	int reset;
 120	int enable;
 121	int power;
 122	int Status;
 123};
 124struct u132_addr {
 125	u8 address;
 126};
 127struct u132_udev {
 128	struct kref kref;
 129	struct usb_device *usb_device;
 130	u8 enumeration;
 131	u8 udev_number;
 132	u8 usb_addr;
 133	u8 portnumber;
 134	u8 endp_number_in[16];
 135	u8 endp_number_out[16];
 136};
 137#define ENDP_QUEUE_SHIFT 3
 138#define ENDP_QUEUE_SIZE (1<<ENDP_QUEUE_SHIFT)
 139#define ENDP_QUEUE_MASK (ENDP_QUEUE_SIZE-1)
 140struct u132_urbq {
 141	struct list_head urb_more;
 142	struct urb *urb;
 143};
 144struct u132_spin {
 145	spinlock_t slock;
 146};
 147struct u132_endp {
 148	struct kref kref;
 149	u8 udev_number;
 150	u8 endp_number;
 151	u8 usb_addr;
 152	u8 usb_endp;
 153	struct u132 *u132;
 154	struct list_head endp_ring;
 155	struct u132_ring *ring;
 156	unsigned toggle_bits:2;
 157	unsigned active:1;
 158	unsigned delayed:1;
 159	unsigned input:1;
 160	unsigned output:1;
 161	unsigned pipetype:2;
 162	unsigned dequeueing:1;
 163	unsigned edset_flush:1;
 164	unsigned spare_bits:14;
 165	unsigned long jiffies;
 166	struct usb_host_endpoint *hep;
 167	struct u132_spin queue_lock;
 168	u16 queue_size;
 169	u16 queue_last;
 170	u16 queue_next;
 171	struct urb *urb_list[ENDP_QUEUE_SIZE];
 172	struct list_head urb_more;
 173	struct delayed_work scheduler;
 174};
 175struct u132_ring {
 176	unsigned in_use:1;
 177	unsigned length:7;
 178	u8 number;
 179	struct u132 *u132;
 180	struct u132_endp *curr_endp;
 181	struct delayed_work scheduler;
 182};
 183struct u132 {
 184	struct kref kref;
 185	struct list_head u132_list;
 186	struct mutex sw_lock;
 187	struct mutex scheduler_lock;
 188	struct u132_platform_data *board;
 189	struct platform_device *platform_dev;
 190	struct u132_ring ring[MAX_U132_RINGS];
 191	int sequence_num;
 192	int going;
 193	int power;
 194	int reset;
 195	int num_ports;
 196	u32 hc_control;
 197	u32 hc_fminterval;
 198	u32 hc_roothub_status;
 199	u32 hc_roothub_a;
 200	u32 hc_roothub_portstatus[MAX_ROOT_PORTS];
 201	int flags;
 202	unsigned long next_statechange;
 203	struct delayed_work monitor;
 204	int num_endpoints;
 205	struct u132_addr addr[MAX_U132_ADDRS];
 206	struct u132_udev udev[MAX_U132_UDEVS];
 207	struct u132_port port[MAX_U132_PORTS];
 208	struct u132_endp *endp[MAX_U132_ENDPS];
 209};
 210
 211/*
 212* these cannot be inlines because we need the structure offset!!
 213* Does anyone have a better way?????
 214*/
 215#define ftdi_read_pcimem(pdev, member, data) usb_ftdi_elan_read_pcimem(pdev, \
 216	offsetof(struct ohci_regs, member), 0, data);
 217#define ftdi_write_pcimem(pdev, member, data) usb_ftdi_elan_write_pcimem(pdev, \
 218	offsetof(struct ohci_regs, member), 0, data);
 219#define u132_read_pcimem(u132, member, data) \
 220	usb_ftdi_elan_read_pcimem(u132->platform_dev, offsetof(struct \
 221	ohci_regs, member), 0, data);
 222#define u132_write_pcimem(u132, member, data) \
 223	usb_ftdi_elan_write_pcimem(u132->platform_dev, offsetof(struct \
 224	ohci_regs, member), 0, data);
 225static inline struct u132 *udev_to_u132(struct u132_udev *udev)
 226{
 227	u8 udev_number = udev->udev_number;
 228	return container_of(udev, struct u132, udev[udev_number]);
 229}
 230
 231static inline struct u132 *hcd_to_u132(struct usb_hcd *hcd)
 232{
 233	return (struct u132 *)(hcd->hcd_priv);
 234}
 235
 236static inline struct usb_hcd *u132_to_hcd(struct u132 *u132)
 237{
 238	return container_of((void *)u132, struct usb_hcd, hcd_priv);
 239}
 240
 241static inline void u132_disable(struct u132 *u132)
 242{
 243	u132_to_hcd(u132)->state = HC_STATE_HALT;
 244}
 245
 246
 247#define kref_to_u132(d) container_of(d, struct u132, kref)
 248#define kref_to_u132_endp(d) container_of(d, struct u132_endp, kref)
 249#define kref_to_u132_udev(d) container_of(d, struct u132_udev, kref)
 250#include "../misc/usb_u132.h"
 251static const char hcd_name[] = "u132_hcd";
 252#define PORT_C_MASK ((USB_PORT_STAT_C_CONNECTION | USB_PORT_STAT_C_ENABLE | \
 253	USB_PORT_STAT_C_SUSPEND | USB_PORT_STAT_C_OVERCURRENT | \
 254	USB_PORT_STAT_C_RESET) << 16)
 255static void u132_hcd_delete(struct kref *kref)
 256{
 257	struct u132 *u132 = kref_to_u132(kref);
 258	struct platform_device *pdev = u132->platform_dev;
 259	struct usb_hcd *hcd = u132_to_hcd(u132);
 260	u132->going += 1;
 261	mutex_lock(&u132_module_lock);
 262	list_del_init(&u132->u132_list);
 263	u132_instances -= 1;
 264	mutex_unlock(&u132_module_lock);
 265	dev_warn(&u132->platform_dev->dev, "FREEING the hcd=%p and thus the u13"
 266		"2=%p going=%d pdev=%p\n", hcd, u132, u132->going, pdev);
 267	usb_put_hcd(hcd);
 268}
 269
 270static inline void u132_u132_put_kref(struct u132 *u132)
 271{
 272	kref_put(&u132->kref, u132_hcd_delete);
 273}
 274
 275static inline void u132_u132_init_kref(struct u132 *u132)
 276{
 277	kref_init(&u132->kref);
 278}
 279
 280static void u132_udev_delete(struct kref *kref)
 281{
 282	struct u132_udev *udev = kref_to_u132_udev(kref);
 283	udev->udev_number = 0;
 284	udev->usb_device = NULL;
 285	udev->usb_addr = 0;
 286	udev->enumeration = 0;
 287}
 288
 289static inline void u132_udev_put_kref(struct u132 *u132, struct u132_udev *udev)
 290{
 291	kref_put(&udev->kref, u132_udev_delete);
 292}
 293
 294static inline void u132_udev_get_kref(struct u132 *u132, struct u132_udev *udev)
 295{
 296	kref_get(&udev->kref);
 297}
 298
 299static inline void u132_udev_init_kref(struct u132 *u132,
 300	struct u132_udev *udev)
 301{
 302	kref_init(&udev->kref);
 303}
 304
 305static inline void u132_ring_put_kref(struct u132 *u132, struct u132_ring *ring)
 306{
 307	kref_put(&u132->kref, u132_hcd_delete);
 308}
 309
 310static void u132_ring_requeue_work(struct u132 *u132, struct u132_ring *ring,
 311	unsigned int delta)
 312{
 313	if (delta > 0) {
 314		if (queue_delayed_work(workqueue, &ring->scheduler, delta))
 315			return;
 316	} else if (queue_delayed_work(workqueue, &ring->scheduler, 0))
 317		return;
 318	kref_put(&u132->kref, u132_hcd_delete);
 319}
 320
 321static void u132_ring_queue_work(struct u132 *u132, struct u132_ring *ring,
 322	unsigned int delta)
 323{
 324	kref_get(&u132->kref);
 325	u132_ring_requeue_work(u132, ring, delta);
 326}
 327
 328static void u132_ring_cancel_work(struct u132 *u132, struct u132_ring *ring)
 329{
 330	if (cancel_delayed_work(&ring->scheduler))
 331		kref_put(&u132->kref, u132_hcd_delete);
 332}
 333
 334static void u132_endp_delete(struct kref *kref)
 335{
 336	struct u132_endp *endp = kref_to_u132_endp(kref);
 337	struct u132 *u132 = endp->u132;
 338	u8 usb_addr = endp->usb_addr;
 339	u8 usb_endp = endp->usb_endp;
 340	u8 address = u132->addr[usb_addr].address;
 341	struct u132_udev *udev = &u132->udev[address];
 342	u8 endp_number = endp->endp_number;
 343	struct usb_host_endpoint *hep = endp->hep;
 344	struct u132_ring *ring = endp->ring;
 345	struct list_head *head = &endp->endp_ring;
 346	ring->length -= 1;
 347	if (endp == ring->curr_endp) {
 348		if (list_empty(head)) {
 349			ring->curr_endp = NULL;
 350			list_del(head);
 351		} else {
 352			struct u132_endp *next_endp = list_entry(head->next,
 353				struct u132_endp, endp_ring);
 354			ring->curr_endp = next_endp;
 355			list_del(head);
 356		}
 357	} else
 358		list_del(head);
 359	if (endp->input) {
 360		udev->endp_number_in[usb_endp] = 0;
 361		u132_udev_put_kref(u132, udev);
 362	}
 363	if (endp->output) {
 364		udev->endp_number_out[usb_endp] = 0;
 365		u132_udev_put_kref(u132, udev);
 366	}
 367	u132->endp[endp_number - 1] = NULL;
 368	hep->hcpriv = NULL;
 369	kfree(endp);
 370	u132_u132_put_kref(u132);
 371}
 372
 373static inline void u132_endp_put_kref(struct u132 *u132, struct u132_endp *endp)
 374{
 375	kref_put(&endp->kref, u132_endp_delete);
 376}
 377
 378static inline void u132_endp_get_kref(struct u132 *u132, struct u132_endp *endp)
 379{
 380	kref_get(&endp->kref);
 381}
 382
 383static inline void u132_endp_init_kref(struct u132 *u132,
 384	struct u132_endp *endp)
 385{
 386	kref_init(&endp->kref);
 387	kref_get(&u132->kref);
 388}
 389
 390static void u132_endp_queue_work(struct u132 *u132, struct u132_endp *endp,
 391	unsigned int delta)
 392{
 393	if (queue_delayed_work(workqueue, &endp->scheduler, delta))
 394		kref_get(&endp->kref);
 395}
 396
 397static void u132_endp_cancel_work(struct u132 *u132, struct u132_endp *endp)
 398{
 399	if (cancel_delayed_work(&endp->scheduler))
 400		kref_put(&endp->kref, u132_endp_delete);
 401}
 402
 403static inline void u132_monitor_put_kref(struct u132 *u132)
 404{
 405	kref_put(&u132->kref, u132_hcd_delete);
 406}
 407
 408static void u132_monitor_queue_work(struct u132 *u132, unsigned int delta)
 409{
 410	if (queue_delayed_work(workqueue, &u132->monitor, delta))
 411		kref_get(&u132->kref);
 412}
 413
 414static void u132_monitor_requeue_work(struct u132 *u132, unsigned int delta)
 415{
 416	if (!queue_delayed_work(workqueue, &u132->monitor, delta))
 417		kref_put(&u132->kref, u132_hcd_delete);
 418}
 419
 420static void u132_monitor_cancel_work(struct u132 *u132)
 421{
 422	if (cancel_delayed_work(&u132->monitor))
 423		kref_put(&u132->kref, u132_hcd_delete);
 424}
 425
 426static int read_roothub_info(struct u132 *u132)
 427{
 428	u32 revision;
 429	int retval;
 430	retval = u132_read_pcimem(u132, revision, &revision);
 431	if (retval) {
 432		dev_err(&u132->platform_dev->dev, "error %d accessing device co"
 433			"ntrol\n", retval);
 434		return retval;
 435	} else if ((revision & 0xFF) == 0x10) {
 436	} else if ((revision & 0xFF) == 0x11) {
 437	} else {
 438		dev_err(&u132->platform_dev->dev, "device revision is not valid"
 439			" %08X\n", revision);
 440		return -ENODEV;
 441	}
 442	retval = u132_read_pcimem(u132, control, &u132->hc_control);
 443	if (retval) {
 444		dev_err(&u132->platform_dev->dev, "error %d accessing device co"
 445			"ntrol\n", retval);
 446		return retval;
 447	}
 448	retval = u132_read_pcimem(u132, roothub.status,
 449		&u132->hc_roothub_status);
 450	if (retval) {
 451		dev_err(&u132->platform_dev->dev, "error %d accessing device re"
 452			"g roothub.status\n", retval);
 453		return retval;
 454	}
 455	retval = u132_read_pcimem(u132, roothub.a, &u132->hc_roothub_a);
 456	if (retval) {
 457		dev_err(&u132->platform_dev->dev, "error %d accessing device re"
 458			"g roothub.a\n", retval);
 459		return retval;
 460	}
 461	{
 462		int I = u132->num_ports;
 463		int i = 0;
 464		while (I-- > 0) {
 465			retval = u132_read_pcimem(u132, roothub.portstatus[i],
 466				&u132->hc_roothub_portstatus[i]);
 467			if (retval) {
 468				dev_err(&u132->platform_dev->dev, "error %d acc"
 469					"essing device roothub.portstatus[%d]\n"
 470					, retval, i);
 471				return retval;
 472			} else
 473				i += 1;
 474		}
 475	}
 476	return 0;
 477}
 478
 479static void u132_hcd_monitor_work(struct work_struct *work)
 480{
 481	struct u132 *u132 = container_of(work, struct u132, monitor.work);
 482	if (u132->going > 1) {
 483		dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
 484			, u132->going);
 485		u132_monitor_put_kref(u132);
 486		return;
 487	} else if (u132->going > 0) {
 488		dev_err(&u132->platform_dev->dev, "device is being removed\n");
 489		u132_monitor_put_kref(u132);
 490		return;
 491	} else {
 492		int retval;
 493		mutex_lock(&u132->sw_lock);
 494		retval = read_roothub_info(u132);
 495		if (retval) {
 496			struct usb_hcd *hcd = u132_to_hcd(u132);
 497			u132_disable(u132);
 498			u132->going = 1;
 499			mutex_unlock(&u132->sw_lock);
 500			usb_hc_died(hcd);
 501			ftdi_elan_gone_away(u132->platform_dev);
 502			u132_monitor_put_kref(u132);
 503			return;
 504		} else {
 505			u132_monitor_requeue_work(u132, 500);
 506			mutex_unlock(&u132->sw_lock);
 507			return;
 508		}
 509	}
 510}
 511
 512static void u132_hcd_giveback_urb(struct u132 *u132, struct u132_endp *endp,
 513	struct urb *urb, int status)
 514{
 515	struct u132_ring *ring;
 516	unsigned long irqs;
 517	struct usb_hcd *hcd = u132_to_hcd(u132);
 518	urb->error_count = 0;
 519	spin_lock_irqsave(&endp->queue_lock.slock, irqs);
 520	usb_hcd_unlink_urb_from_ep(hcd, urb);
 521	endp->queue_next += 1;
 522	if (ENDP_QUEUE_SIZE > --endp->queue_size) {
 523		endp->active = 0;
 524		spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
 525	} else {
 526		struct list_head *next = endp->urb_more.next;
 527		struct u132_urbq *urbq = list_entry(next, struct u132_urbq,
 528			urb_more);
 529		list_del(next);
 530		endp->urb_list[ENDP_QUEUE_MASK & endp->queue_last++] =
 531			urbq->urb;
 532		endp->active = 0;
 533		spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
 534		kfree(urbq);
 535	}
 536	mutex_lock(&u132->scheduler_lock);
 537	ring = endp->ring;
 538	ring->in_use = 0;
 539	u132_ring_cancel_work(u132, ring);
 540	u132_ring_queue_work(u132, ring, 0);
 541	mutex_unlock(&u132->scheduler_lock);
 542	u132_endp_put_kref(u132, endp);
 543	usb_hcd_giveback_urb(hcd, urb, status);
 544}
 545
 546static void u132_hcd_forget_urb(struct u132 *u132, struct u132_endp *endp,
 547	struct urb *urb, int status)
 548{
 549	u132_endp_put_kref(u132, endp);
 550}
 551
 552static void u132_hcd_abandon_urb(struct u132 *u132, struct u132_endp *endp,
 553	struct urb *urb, int status)
 554{
 555	unsigned long irqs;
 556	struct usb_hcd *hcd = u132_to_hcd(u132);
 557	urb->error_count = 0;
 558	spin_lock_irqsave(&endp->queue_lock.slock, irqs);
 559	usb_hcd_unlink_urb_from_ep(hcd, urb);
 560	endp->queue_next += 1;
 561	if (ENDP_QUEUE_SIZE > --endp->queue_size) {
 562		endp->active = 0;
 563		spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
 564	} else {
 565		struct list_head *next = endp->urb_more.next;
 566		struct u132_urbq *urbq = list_entry(next, struct u132_urbq,
 567			urb_more);
 568		list_del(next);
 569		endp->urb_list[ENDP_QUEUE_MASK & endp->queue_last++] =
 570			urbq->urb;
 571		endp->active = 0;
 572		spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
 573		kfree(urbq);
 574	}
 575	usb_hcd_giveback_urb(hcd, urb, status);
 576}
 577
 578static inline int edset_input(struct u132 *u132, struct u132_ring *ring,
 579	struct u132_endp *endp, struct urb *urb, u8 address, u8 toggle_bits,
 580	void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,
 581	int toggle_bits, int error_count, int condition_code, int repeat_number,
 582	 int halted, int skipped, int actual, int non_null))
 583{
 584	return usb_ftdi_elan_edset_input(u132->platform_dev, ring->number, endp,
 585		 urb, address, endp->usb_endp, toggle_bits, callback);
 586}
 587
 588static inline int edset_setup(struct u132 *u132, struct u132_ring *ring,
 589	struct u132_endp *endp, struct urb *urb, u8 address, u8 toggle_bits,
 590	void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,
 591	int toggle_bits, int error_count, int condition_code, int repeat_number,
 592	 int halted, int skipped, int actual, int non_null))
 593{
 594	return usb_ftdi_elan_edset_setup(u132->platform_dev, ring->number, endp,
 595		 urb, address, endp->usb_endp, toggle_bits, callback);
 596}
 597
 598static inline int edset_single(struct u132 *u132, struct u132_ring *ring,
 599	struct u132_endp *endp, struct urb *urb, u8 address, u8 toggle_bits,
 600	void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,
 601	int toggle_bits, int error_count, int condition_code, int repeat_number,
 602	 int halted, int skipped, int actual, int non_null))
 603{
 604	return usb_ftdi_elan_edset_single(u132->platform_dev, ring->number,
 605		endp, urb, address, endp->usb_endp, toggle_bits, callback);
 606}
 607
 608static inline int edset_output(struct u132 *u132, struct u132_ring *ring,
 609	struct u132_endp *endp, struct urb *urb, u8 address, u8 toggle_bits,
 610	void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,
 611	int toggle_bits, int error_count, int condition_code, int repeat_number,
 612	 int halted, int skipped, int actual, int non_null))
 613{
 614	return usb_ftdi_elan_edset_output(u132->platform_dev, ring->number,
 615		endp, urb, address, endp->usb_endp, toggle_bits, callback);
 616}
 617
 618
 619/*
 620* must not LOCK sw_lock
 621*
 622*/
 623static void u132_hcd_interrupt_recv(void *data, struct urb *urb, u8 *buf,
 624	int len, int toggle_bits, int error_count, int condition_code,
 625	int repeat_number, int halted, int skipped, int actual, int non_null)
 626{
 627	struct u132_endp *endp = data;
 628	struct u132 *u132 = endp->u132;
 629	u8 address = u132->addr[endp->usb_addr].address;
 630	struct u132_udev *udev = &u132->udev[address];
 631	mutex_lock(&u132->scheduler_lock);
 632	if (u132->going > 1) {
 633		dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
 634			, u132->going);
 635		mutex_unlock(&u132->scheduler_lock);
 636		u132_hcd_forget_urb(u132, endp, urb, -ENODEV);
 637		return;
 638	} else if (endp->dequeueing) {
 639		endp->dequeueing = 0;
 640		mutex_unlock(&u132->scheduler_lock);
 641		u132_hcd_giveback_urb(u132, endp, urb, -EINTR);
 642		return;
 643	} else if (u132->going > 0) {
 644		dev_err(&u132->platform_dev->dev, "device is being removed "
 645				"urb=%p\n", urb);
 646		mutex_unlock(&u132->scheduler_lock);
 647		u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
 648		return;
 649	} else if (!urb->unlinked) {
 650		struct u132_ring *ring = endp->ring;
 651		u8 *u = urb->transfer_buffer + urb->actual_length;
 652		u8 *b = buf;
 653		int L = len;
 654
 655		while (L-- > 0)
 656			*u++ = *b++;
 657
 658		urb->actual_length += len;
 659		if ((condition_code == TD_CC_NOERROR) &&
 660			(urb->transfer_buffer_length > urb->actual_length)) {
 661			endp->toggle_bits = toggle_bits;
 662			usb_settoggle(udev->usb_device, endp->usb_endp, 0,
 663				1 & toggle_bits);
 664			if (urb->actual_length > 0) {
 665				int retval;
 666				mutex_unlock(&u132->scheduler_lock);
 667				retval = edset_single(u132, ring, endp, urb,
 668					address, endp->toggle_bits,
 669					u132_hcd_interrupt_recv);
 670				if (retval != 0)
 671					u132_hcd_giveback_urb(u132, endp, urb,
 672						retval);
 673			} else {
 674				ring->in_use = 0;
 675				endp->active = 0;
 676				endp->jiffies = jiffies +
 677					msecs_to_jiffies(urb->interval);
 678				u132_ring_cancel_work(u132, ring);
 679				u132_ring_queue_work(u132, ring, 0);
 680				mutex_unlock(&u132->scheduler_lock);
 681				u132_endp_put_kref(u132, endp);
 682			}
 683			return;
 684		} else if ((condition_code == TD_DATAUNDERRUN) &&
 685			((urb->transfer_flags & URB_SHORT_NOT_OK) == 0)) {
 686			endp->toggle_bits = toggle_bits;
 687			usb_settoggle(udev->usb_device, endp->usb_endp, 0,
 688				1 & toggle_bits);
 689			mutex_unlock(&u132->scheduler_lock);
 690			u132_hcd_giveback_urb(u132, endp, urb, 0);
 691			return;
 692		} else {
 693			if (condition_code == TD_CC_NOERROR) {
 694				endp->toggle_bits = toggle_bits;
 695				usb_settoggle(udev->usb_device, endp->usb_endp,
 696					0, 1 & toggle_bits);
 697			} else if (condition_code == TD_CC_STALL) {
 698				endp->toggle_bits = 0x2;
 699				usb_settoggle(udev->usb_device, endp->usb_endp,
 700					0, 0);
 701			} else {
 702				endp->toggle_bits = 0x2;
 703				usb_settoggle(udev->usb_device, endp->usb_endp,
 704					0, 0);
 705				dev_err(&u132->platform_dev->dev, "urb=%p givin"
 706					"g back INTERRUPT %s\n", urb,
 707					cc_to_text[condition_code]);
 708			}
 709			mutex_unlock(&u132->scheduler_lock);
 710			u132_hcd_giveback_urb(u132, endp, urb,
 711				cc_to_error[condition_code]);
 712			return;
 713		}
 714	} else {
 715		dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p "
 716				"unlinked=%d\n", urb, urb->unlinked);
 717		mutex_unlock(&u132->scheduler_lock);
 718		u132_hcd_giveback_urb(u132, endp, urb, 0);
 719		return;
 720	}
 721}
 722
 723static void u132_hcd_bulk_output_sent(void *data, struct urb *urb, u8 *buf,
 724	int len, int toggle_bits, int error_count, int condition_code,
 725	int repeat_number, int halted, int skipped, int actual, int non_null)
 726{
 727	struct u132_endp *endp = data;
 728	struct u132 *u132 = endp->u132;
 729	u8 address = u132->addr[endp->usb_addr].address;
 730	mutex_lock(&u132->scheduler_lock);
 731	if (u132->going > 1) {
 732		dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
 733			, u132->going);
 734		mutex_unlock(&u132->scheduler_lock);
 735		u132_hcd_forget_urb(u132, endp, urb, -ENODEV);
 736		return;
 737	} else if (endp->dequeueing) {
 738		endp->dequeueing = 0;
 739		mutex_unlock(&u132->scheduler_lock);
 740		u132_hcd_giveback_urb(u132, endp, urb, -EINTR);
 741		return;
 742	} else if (u132->going > 0) {
 743		dev_err(&u132->platform_dev->dev, "device is being removed "
 744				"urb=%p\n", urb);
 745		mutex_unlock(&u132->scheduler_lock);
 746		u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
 747		return;
 748	} else if (!urb->unlinked) {
 749		struct u132_ring *ring = endp->ring;
 750		urb->actual_length += len;
 751		endp->toggle_bits = toggle_bits;
 752		if (urb->transfer_buffer_length > urb->actual_length) {
 753			int retval;
 754			mutex_unlock(&u132->scheduler_lock);
 755			retval = edset_output(u132, ring, endp, urb, address,
 756				endp->toggle_bits, u132_hcd_bulk_output_sent);
 757			if (retval != 0)
 758				u132_hcd_giveback_urb(u132, endp, urb, retval);
 759			return;
 760		} else {
 761			mutex_unlock(&u132->scheduler_lock);
 762			u132_hcd_giveback_urb(u132, endp, urb, 0);
 763			return;
 764		}
 765	} else {
 766		dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p "
 767				"unlinked=%d\n", urb, urb->unlinked);
 768		mutex_unlock(&u132->scheduler_lock);
 769		u132_hcd_giveback_urb(u132, endp, urb, 0);
 770		return;
 771	}
 772}
 773
 774static void u132_hcd_bulk_input_recv(void *data, struct urb *urb, u8 *buf,
 775	int len, int toggle_bits, int error_count, int condition_code,
 776	int repeat_number, int halted, int skipped, int actual, int non_null)
 777{
 778	struct u132_endp *endp = data;
 779	struct u132 *u132 = endp->u132;
 780	u8 address = u132->addr[endp->usb_addr].address;
 781	struct u132_udev *udev = &u132->udev[address];
 782	mutex_lock(&u132->scheduler_lock);
 783	if (u132->going > 1) {
 784		dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
 785			, u132->going);
 786		mutex_unlock(&u132->scheduler_lock);
 787		u132_hcd_forget_urb(u132, endp, urb, -ENODEV);
 788		return;
 789	} else if (endp->dequeueing) {
 790		endp->dequeueing = 0;
 791		mutex_unlock(&u132->scheduler_lock);
 792		u132_hcd_giveback_urb(u132, endp, urb, -EINTR);
 793		return;
 794	} else if (u132->going > 0) {
 795		dev_err(&u132->platform_dev->dev, "device is being removed "
 796				"urb=%p\n", urb);
 797		mutex_unlock(&u132->scheduler_lock);
 798		u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
 799		return;
 800	} else if (!urb->unlinked) {
 801		struct u132_ring *ring = endp->ring;
 802		u8 *u = urb->transfer_buffer + urb->actual_length;
 803		u8 *b = buf;
 804		int L = len;
 805
 806		while (L-- > 0)
 807			*u++ = *b++;
 808
 809		urb->actual_length += len;
 810		if ((condition_code == TD_CC_NOERROR) &&
 811			(urb->transfer_buffer_length > urb->actual_length)) {
 812			int retval;
 813			endp->toggle_bits = toggle_bits;
 814			usb_settoggle(udev->usb_device, endp->usb_endp, 0,
 815				1 & toggle_bits);
 816			mutex_unlock(&u132->scheduler_lock);
 817			retval = usb_ftdi_elan_edset_input(u132->platform_dev,
 818				ring->number, endp, urb, address,
 819				endp->usb_endp, endp->toggle_bits,
 820				u132_hcd_bulk_input_recv);
 821			if (retval != 0)
 822				u132_hcd_giveback_urb(u132, endp, urb, retval);
 823			return;
 824		} else if (condition_code == TD_CC_NOERROR) {
 825			endp->toggle_bits = toggle_bits;
 826			usb_settoggle(udev->usb_device, endp->usb_endp, 0,
 827				1 & toggle_bits);
 828			mutex_unlock(&u132->scheduler_lock);
 829			u132_hcd_giveback_urb(u132, endp, urb,
 830				cc_to_error[condition_code]);
 831			return;
 832		} else if ((condition_code == TD_DATAUNDERRUN) &&
 833			((urb->transfer_flags & URB_SHORT_NOT_OK) == 0)) {
 834			endp->toggle_bits = toggle_bits;
 835			usb_settoggle(udev->usb_device, endp->usb_endp, 0,
 836				1 & toggle_bits);
 837			mutex_unlock(&u132->scheduler_lock);
 838			u132_hcd_giveback_urb(u132, endp, urb, 0);
 839			return;
 840		} else if (condition_code == TD_DATAUNDERRUN) {
 841			endp->toggle_bits = toggle_bits;
 842			usb_settoggle(udev->usb_device, endp->usb_endp, 0,
 843				1 & toggle_bits);
 844			dev_warn(&u132->platform_dev->dev, "urb=%p(SHORT NOT OK"
 845				") giving back BULK IN %s\n", urb,
 846				cc_to_text[condition_code]);
 847			mutex_unlock(&u132->scheduler_lock);
 848			u132_hcd_giveback_urb(u132, endp, urb, 0);
 849			return;
 850		} else if (condition_code == TD_CC_STALL) {
 851			endp->toggle_bits = 0x2;
 852			usb_settoggle(udev->usb_device, endp->usb_endp, 0, 0);
 853			mutex_unlock(&u132->scheduler_lock);
 854			u132_hcd_giveback_urb(u132, endp, urb,
 855				cc_to_error[condition_code]);
 856			return;
 857		} else {
 858			endp->toggle_bits = 0x2;
 859			usb_settoggle(udev->usb_device, endp->usb_endp, 0, 0);
 860			dev_err(&u132->platform_dev->dev, "urb=%p giving back B"
 861				"ULK IN code=%d %s\n", urb, condition_code,
 862				cc_to_text[condition_code]);
 863			mutex_unlock(&u132->scheduler_lock);
 864			u132_hcd_giveback_urb(u132, endp, urb,
 865				cc_to_error[condition_code]);
 866			return;
 867		}
 868	} else {
 869		dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p "
 870				"unlinked=%d\n", urb, urb->unlinked);
 871		mutex_unlock(&u132->scheduler_lock);
 872		u132_hcd_giveback_urb(u132, endp, urb, 0);
 873		return;
 874	}
 875}
 876
 877static void u132_hcd_configure_empty_sent(void *data, struct urb *urb, u8 *buf,
 878	int len, int toggle_bits, int error_count, int condition_code,
 879	int repeat_number, int halted, int skipped, int actual, int non_null)
 880{
 881	struct u132_endp *endp = data;
 882	struct u132 *u132 = endp->u132;
 883	mutex_lock(&u132->scheduler_lock);
 884	if (u132->going > 1) {
 885		dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
 886			, u132->going);
 887		mutex_unlock(&u132->scheduler_lock);
 888		u132_hcd_forget_urb(u132, endp, urb, -ENODEV);
 889		return;
 890	} else if (endp->dequeueing) {
 891		endp->dequeueing = 0;
 892		mutex_unlock(&u132->scheduler_lock);
 893		u132_hcd_giveback_urb(u132, endp, urb, -EINTR);
 894		return;
 895	} else if (u132->going > 0) {
 896		dev_err(&u132->platform_dev->dev, "device is being removed "
 897				"urb=%p\n", urb);
 898		mutex_unlock(&u132->scheduler_lock);
 899		u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
 900		return;
 901	} else if (!urb->unlinked) {
 902		mutex_unlock(&u132->scheduler_lock);
 903		u132_hcd_giveback_urb(u132, endp, urb, 0);
 904		return;
 905	} else {
 906		dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p "
 907				"unlinked=%d\n", urb, urb->unlinked);
 908		mutex_unlock(&u132->scheduler_lock);
 909		u132_hcd_giveback_urb(u132, endp, urb, 0);
 910		return;
 911	}
 912}
 913
 914static void u132_hcd_configure_input_recv(void *data, struct urb *urb, u8 *buf,
 915	int len, int toggle_bits, int error_count, int condition_code,
 916	int repeat_number, int halted, int skipped, int actual, int non_null)
 917{
 918	struct u132_endp *endp = data;
 919	struct u132 *u132 = endp->u132;
 920	u8 address = u132->addr[endp->usb_addr].address;
 921	mutex_lock(&u132->scheduler_lock);
 922	if (u132->going > 1) {
 923		dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
 924			, u132->going);
 925		mutex_unlock(&u132->scheduler_lock);
 926		u132_hcd_forget_urb(u132, endp, urb, -ENODEV);
 927		return;
 928	} else if (endp->dequeueing) {
 929		endp->dequeueing = 0;
 930		mutex_unlock(&u132->scheduler_lock);
 931		u132_hcd_giveback_urb(u132, endp, urb, -EINTR);
 932		return;
 933	} else if (u132->going > 0) {
 934		dev_err(&u132->platform_dev->dev, "device is being removed "
 935				"urb=%p\n", urb);
 936		mutex_unlock(&u132->scheduler_lock);
 937		u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
 938		return;
 939	} else if (!urb->unlinked) {
 940		struct u132_ring *ring = endp->ring;
 941		u8 *u = urb->transfer_buffer;
 942		u8 *b = buf;
 943		int L = len;
 944
 945		while (L-- > 0)
 946			*u++ = *b++;
 947
 948		urb->actual_length = len;
 949		if ((condition_code == TD_CC_NOERROR) || ((condition_code ==
 950			TD_DATAUNDERRUN) && ((urb->transfer_flags &
 951			URB_SHORT_NOT_OK) == 0))) {
 952			int retval;
 953			mutex_unlock(&u132->scheduler_lock);
 954			retval = usb_ftdi_elan_edset_empty(u132->platform_dev,
 955				ring->number, endp, urb, address,
 956				endp->usb_endp, 0x3,
 957				u132_hcd_configure_empty_sent);
 958			if (retval != 0)
 959				u132_hcd_giveback_urb(u132, endp, urb, retval);
 960			return;
 961		} else if (condition_code == TD_CC_STALL) {
 962			mutex_unlock(&u132->scheduler_lock);
 963			dev_warn(&u132->platform_dev->dev, "giving back SETUP I"
 964				"NPUT STALL urb %p\n", urb);
 965			u132_hcd_giveback_urb(u132, endp, urb,
 966				cc_to_error[condition_code]);
 967			return;
 968		} else {
 969			mutex_unlock(&u132->scheduler_lock);
 970			dev_err(&u132->platform_dev->dev, "giving back SETUP IN"
 971				"PUT %s urb %p\n", cc_to_text[condition_code],
 972				urb);
 973			u132_hcd_giveback_urb(u132, endp, urb,
 974				cc_to_error[condition_code]);
 975			return;
 976		}
 977	} else {
 978		dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p "
 979				"unlinked=%d\n", urb, urb->unlinked);
 980		mutex_unlock(&u132->scheduler_lock);
 981		u132_hcd_giveback_urb(u132, endp, urb, 0);
 982		return;
 983	}
 984}
 985
 986static void u132_hcd_configure_empty_recv(void *data, struct urb *urb, u8 *buf,
 987	int len, int toggle_bits, int error_count, int condition_code,
 988	int repeat_number, int halted, int skipped, int actual, int non_null)
 989{
 990	struct u132_endp *endp = data;
 991	struct u132 *u132 = endp->u132;
 992	mutex_lock(&u132->scheduler_lock);
 993	if (u132->going > 1) {
 994		dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
 995			, u132->going);
 996		mutex_unlock(&u132->scheduler_lock);
 997		u132_hcd_forget_urb(u132, endp, urb, -ENODEV);
 998		return;
 999	} else if (endp->dequeueing) {
1000		endp->dequeueing = 0;
1001		mutex_unlock(&u132->scheduler_lock);
1002		u132_hcd_giveback_urb(u132, endp, urb, -EINTR);
1003		return;
1004	} else if (u132->going > 0) {
1005		dev_err(&u132->platform_dev->dev, "device is being removed "
1006				"urb=%p\n", urb);
1007		mutex_unlock(&u132->scheduler_lock);
1008		u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
1009		return;
1010	} else if (!urb->unlinked) {
1011		mutex_unlock(&u132->scheduler_lock);
1012		u132_hcd_giveback_urb(u132, endp, urb, 0);
1013		return;
1014	} else {
1015		dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p "
1016				"unlinked=%d\n", urb, urb->unlinked);
1017		mutex_unlock(&u132->scheduler_lock);
1018		u132_hcd_giveback_urb(u132, endp, urb, 0);
1019		return;
1020	}
1021}
1022
1023static void u132_hcd_configure_setup_sent(void *data, struct urb *urb, u8 *buf,
1024	int len, int toggle_bits, int error_count, int condition_code,
1025	int repeat_number, int halted, int skipped, int actual, int non_null)
1026{
1027	struct u132_endp *endp = data;
1028	struct u132 *u132 = endp->u132;
1029	u8 address = u132->addr[endp->usb_addr].address;
1030	mutex_lock(&u132->scheduler_lock);
1031	if (u132->going > 1) {
1032		dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
1033			, u132->going);
1034		mutex_unlock(&u132->scheduler_lock);
1035		u132_hcd_forget_urb(u132, endp, urb, -ENODEV);
1036		return;
1037	} else if (endp->dequeueing) {
1038		endp->dequeueing = 0;
1039		mutex_unlock(&u132->scheduler_lock);
1040		u132_hcd_giveback_urb(u132, endp, urb, -EINTR);
1041		return;
1042	} else if (u132->going > 0) {
1043		dev_err(&u132->platform_dev->dev, "device is being removed "
1044				"urb=%p\n", urb);
1045		mutex_unlock(&u132->scheduler_lock);
1046		u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
1047		return;
1048	} else if (!urb->unlinked) {
1049		if (usb_pipein(urb->pipe)) {
1050			int retval;
1051			struct u132_ring *ring = endp->ring;
1052			mutex_unlock(&u132->scheduler_lock);
1053			retval = usb_ftdi_elan_edset_input(u132->platform_dev,
1054				ring->number, endp, urb, address,
1055				endp->usb_endp, 0,
1056				u132_hcd_configure_input_recv);
1057			if (retval != 0)
1058				u132_hcd_giveback_urb(u132, endp, urb, retval);
1059			return;
1060		} else {
1061			int retval;
1062			struct u132_ring *ring = endp->ring;
1063			mutex_unlock(&u132->scheduler_lock);
1064			retval = usb_ftdi_elan_edset_input(u132->platform_dev,
1065				ring->number, endp, urb, address,
1066				endp->usb_endp, 0,
1067				u132_hcd_configure_empty_recv);
1068			if (retval != 0)
1069				u132_hcd_giveback_urb(u132, endp, urb, retval);
1070			return;
1071		}
1072	} else {
1073		dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p "
1074				"unlinked=%d\n", urb, urb->unlinked);
1075		mutex_unlock(&u132->scheduler_lock);
1076		u132_hcd_giveback_urb(u132, endp, urb, 0);
1077		return;
1078	}
1079}
1080
1081static void u132_hcd_enumeration_empty_recv(void *data, struct urb *urb,
1082	u8 *buf, int len, int toggle_bits, int error_count, int condition_code,
1083	int repeat_number, int halted, int skipped, int actual, int non_null)
1084{
1085	struct u132_endp *endp = data;
1086	struct u132 *u132 = endp->u132;
1087	u8 address = u132->addr[endp->usb_addr].address;
1088	struct u132_udev *udev = &u132->udev[address];
1089	mutex_lock(&u132->scheduler_lock);
1090	if (u132->going > 1) {
1091		dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
1092			, u132->going);
1093		mutex_unlock(&u132->scheduler_lock);
1094		u132_hcd_forget_urb(u132, endp, urb, -ENODEV);
1095		return;
1096	} else if (endp->dequeueing) {
1097		endp->dequeueing = 0;
1098		mutex_unlock(&u132->scheduler_lock);
1099		u132_hcd_giveback_urb(u132, endp, urb, -EINTR);
1100		return;
1101	} else if (u132->going > 0) {
1102		dev_err(&u132->platform_dev->dev, "device is being removed "
1103				"urb=%p\n", urb);
1104		mutex_unlock(&u132->scheduler_lock);
1105		u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
1106		return;
1107	} else if (!urb->unlinked) {
1108		u132->addr[0].address = 0;
1109		endp->usb_addr = udev->usb_addr;
1110		mutex_unlock(&u132->scheduler_lock);
1111		u132_hcd_giveback_urb(u132, endp, urb, 0);
1112		return;
1113	} else {
1114		dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p "
1115				"unlinked=%d\n", urb, urb->unlinked);
1116		mutex_unlock(&u132->scheduler_lock);
1117		u132_hcd_giveback_urb(u132, endp, urb, 0);
1118		return;
1119	}
1120}
1121
1122static void u132_hcd_enumeration_address_sent(void *data, struct urb *urb,
1123	u8 *buf, int len, int toggle_bits, int error_count, int condition_code,
1124	int repeat_number, int halted, int skipped, int actual, int non_null)
1125{
1126	struct u132_endp *endp = data;
1127	struct u132 *u132 = endp->u132;
1128	mutex_lock(&u132->scheduler_lock);
1129	if (u132->going > 1) {
1130		dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
1131			, u132->going);
1132		mutex_unlock(&u132->scheduler_lock);
1133		u132_hcd_forget_urb(u132, endp, urb, -ENODEV);
1134		return;
1135	} else if (endp->dequeueing) {
1136		endp->dequeueing = 0;
1137		mutex_unlock(&u132->scheduler_lock);
1138		u132_hcd_giveback_urb(u132, endp, urb, -EINTR);
1139		return;
1140	} else if (u132->going > 0) {
1141		dev_err(&u132->platform_dev->dev, "device is being removed "
1142				"urb=%p\n", urb);
1143		mutex_unlock(&u132->scheduler_lock);
1144		u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
1145		return;
1146	} else if (!urb->unlinked) {
1147		int retval;
1148		struct u132_ring *ring = endp->ring;
1149		mutex_unlock(&u132->scheduler_lock);
1150		retval = usb_ftdi_elan_edset_input(u132->platform_dev,
1151			ring->number, endp, urb, 0, endp->usb_endp, 0,
1152			u132_hcd_enumeration_empty_recv);
1153		if (retval != 0)
1154			u132_hcd_giveback_urb(u132, endp, urb, retval);
1155		return;
1156	} else {
1157		dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p "
1158				"unlinked=%d\n", urb, urb->unlinked);
1159		mutex_unlock(&u132->scheduler_lock);
1160		u132_hcd_giveback_urb(u132, endp, urb, 0);
1161		return;
1162	}
1163}
1164
1165static void u132_hcd_initial_empty_sent(void *data, struct urb *urb, u8 *buf,
1166	int len, int toggle_bits, int error_count, int condition_code,
1167	int repeat_number, int halted, int skipped, int actual, int non_null)
1168{
1169	struct u132_endp *endp = data;
1170	struct u132 *u132 = endp->u132;
1171	mutex_lock(&u132->scheduler_lock);
1172	if (u132->going > 1) {
1173		dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
1174			, u132->going);
1175		mutex_unlock(&u132->scheduler_lock);
1176		u132_hcd_forget_urb(u132, endp, urb, -ENODEV);
1177		return;
1178	} else if (endp->dequeueing) {
1179		endp->dequeueing = 0;
1180		mutex_unlock(&u132->scheduler_lock);
1181		u132_hcd_giveback_urb(u132, endp, urb, -EINTR);
1182		return;
1183	} else if (u132->going > 0) {
1184		dev_err(&u132->platform_dev->dev, "device is being removed "
1185				"urb=%p\n", urb);
1186		mutex_unlock(&u132->scheduler_lock);
1187		u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
1188		return;
1189	} else if (!urb->unlinked) {
1190		mutex_unlock(&u132->scheduler_lock);
1191		u132_hcd_giveback_urb(u132, endp, urb, 0);
1192		return;
1193	} else {
1194		dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p "
1195				"unlinked=%d\n", urb, urb->unlinked);
1196		mutex_unlock(&u132->scheduler_lock);
1197		u132_hcd_giveback_urb(u132, endp, urb, 0);
1198		return;
1199	}
1200}
1201
1202static void u132_hcd_initial_input_recv(void *data, struct urb *urb, u8 *buf,
1203	int len, int toggle_bits, int error_count, int condition_code,
1204	int repeat_number, int halted, int skipped, int actual, int non_null)
1205{
1206	struct u132_endp *endp = data;
1207	struct u132 *u132 = endp->u132;
1208	u8 address = u132->addr[endp->usb_addr].address;
1209	mutex_lock(&u132->scheduler_lock);
1210	if (u132->going > 1) {
1211		dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
1212			, u132->going);
1213		mutex_unlock(&u132->scheduler_lock);
1214		u132_hcd_forget_urb(u132, endp, urb, -ENODEV);
1215		return;
1216	} else if (endp->dequeueing) {
1217		endp->dequeueing = 0;
1218		mutex_unlock(&u132->scheduler_lock);
1219		u132_hcd_giveback_urb(u132, endp, urb, -EINTR);
1220		return;
1221	} else if (u132->going > 0) {
1222		dev_err(&u132->platform_dev->dev, "device is being removed "
1223				"urb=%p\n", urb);
1224		mutex_unlock(&u132->scheduler_lock);
1225		u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
1226		return;
1227	} else if (!urb->unlinked) {
1228		int retval;
1229		struct u132_ring *ring = endp->ring;
1230		u8 *u = urb->transfer_buffer;
1231		u8 *b = buf;
1232		int L = len;
1233
1234		while (L-- > 0)
1235			*u++ = *b++;
1236
1237		urb->actual_length = len;
1238		mutex_unlock(&u132->scheduler_lock);
1239		retval = usb_ftdi_elan_edset_empty(u132->platform_dev,
1240			ring->number, endp, urb, address, endp->usb_endp, 0x3,
1241			u132_hcd_initial_empty_sent);
1242		if (retval != 0)
1243			u132_hcd_giveback_urb(u132, endp, urb, retval);
1244		return;
1245	} else {
1246		dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p "
1247				"unlinked=%d\n", urb, urb->unlinked);
1248		mutex_unlock(&u132->scheduler_lock);
1249		u132_hcd_giveback_urb(u132, endp, urb, 0);
1250		return;
1251	}
1252}
1253
1254static void u132_hcd_initial_setup_sent(void *data, struct urb *urb, u8 *buf,
1255	int len, int toggle_bits, int error_count, int condition_code,
1256	int repeat_number, int halted, int skipped, int actual, int non_null)
1257{
1258	struct u132_endp *endp = data;
1259	struct u132 *u132 = endp->u132;
1260	u8 address = u132->addr[endp->usb_addr].address;
1261	mutex_lock(&u132->scheduler_lock);
1262	if (u132->going > 1) {
1263		dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
1264			, u132->going);
1265		mutex_unlock(&u132->scheduler_lock);
1266		u132_hcd_forget_urb(u132, endp, urb, -ENODEV);
1267		return;
1268	} else if (endp->dequeueing) {
1269		endp->dequeueing = 0;
1270		mutex_unlock(&u132->scheduler_lock);
1271		u132_hcd_giveback_urb(u132, endp, urb, -EINTR);
1272		return;
1273	} else if (u132->going > 0) {
1274		dev_err(&u132->platform_dev->dev, "device is being removed "
1275				"urb=%p\n", urb);
1276		mutex_unlock(&u132->scheduler_lock);
1277		u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
1278		return;
1279	} else if (!urb->unlinked) {
1280		int retval;
1281		struct u132_ring *ring = endp->ring;
1282		mutex_unlock(&u132->scheduler_lock);
1283		retval = usb_ftdi_elan_edset_input(u132->platform_dev,
1284			ring->number, endp, urb, address, endp->usb_endp, 0,
1285			u132_hcd_initial_input_recv);
1286		if (retval != 0)
1287			u132_hcd_giveback_urb(u132, endp, urb, retval);
1288		return;
1289	} else {
1290		dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p "
1291				"unlinked=%d\n", urb, urb->unlinked);
1292		mutex_unlock(&u132->scheduler_lock);
1293		u132_hcd_giveback_urb(u132, endp, urb, 0);
1294		return;
1295	}
1296}
1297
1298/*
1299* this work function is only executed from the work queue
1300*
1301*/
1302static void u132_hcd_ring_work_scheduler(struct work_struct *work)
1303{
1304	struct u132_ring *ring =
1305		container_of(work, struct u132_ring, scheduler.work);
1306	struct u132 *u132 = ring->u132;
1307	mutex_lock(&u132->scheduler_lock);
1308	if (ring->in_use) {
1309		mutex_unlock(&u132->scheduler_lock);
1310		u132_ring_put_kref(u132, ring);
1311		return;
1312	} else if (ring->curr_endp) {
1313		struct u132_endp *last_endp = ring->curr_endp;
1314		struct list_head *scan;
1315		struct list_head *head = &last_endp->endp_ring;
1316		unsigned long wakeup = 0;
1317		list_for_each(scan, head) {
1318			struct u132_endp *endp = list_entry(scan,
1319				struct u132_endp, endp_ring);
1320			if (endp->queue_next == endp->queue_last) {
1321			} else if ((endp->delayed == 0)
1322				|| time_after_eq(jiffies, endp->jiffies)) {
1323				ring->curr_endp = endp;
1324				u132_endp_cancel_work(u132, last_endp);
1325				u132_endp_queue_work(u132, last_endp, 0);
1326				mutex_unlock(&u132->scheduler_lock);
1327				u132_ring_put_kref(u132, ring);
1328				return;
1329			} else {
1330				unsigned long delta = endp->jiffies - jiffies;
1331				if (delta > wakeup)
1332					wakeup = delta;
1333			}
1334		}
1335		if (last_endp->queue_next == last_endp->queue_last) {
1336		} else if ((last_endp->delayed == 0) || time_after_eq(jiffies,
1337			last_endp->jiffies)) {
1338			u132_endp_cancel_work(u132, last_endp);
1339			u132_endp_queue_work(u132, last_endp, 0);
1340			mutex_unlock(&u132->scheduler_lock);
1341			u132_ring_put_kref(u132, ring);
1342			return;
1343		} else {
1344			unsigned long delta = last_endp->jiffies - jiffies;
1345			if (delta > wakeup)
1346				wakeup = delta;
1347		}
1348		if (wakeup > 0) {
1349			u132_ring_requeue_work(u132, ring, wakeup);
1350			mutex_unlock(&u132->scheduler_lock);
1351			return;
1352		} else {
1353			mutex_unlock(&u132->scheduler_lock);
1354			u132_ring_put_kref(u132, ring);
1355			return;
1356		}
1357	} else {
1358		mutex_unlock(&u132->scheduler_lock);
1359		u132_ring_put_kref(u132, ring);
1360		return;
1361	}
1362}
1363
1364static void u132_hcd_endp_work_scheduler(struct work_struct *work)
1365{
1366	struct u132_ring *ring;
1367	struct u132_endp *endp =
1368		container_of(work, struct u132_endp, scheduler.work);
1369	struct u132 *u132 = endp->u132;
1370	mutex_lock(&u132->scheduler_lock);
1371	ring = endp->ring;
1372	if (endp->edset_flush) {
1373		endp->edset_flush = 0;
1374		if (endp->dequeueing)
1375			usb_ftdi_elan_edset_flush(u132->platform_dev,
1376				ring->number, endp);
1377		mutex_unlock(&u132->scheduler_lock);
1378		u132_endp_put_kref(u132, endp);
1379		return;
1380	} else if (endp->active) {
1381		mutex_unlock(&u132->scheduler_lock);
1382		u132_endp_put_kref(u132, endp);
1383		return;
1384	} else if (ring->in_use) {
1385		mutex_unlock(&u132->scheduler_lock);
1386		u132_endp_put_kref(u132, endp);
1387		return;
1388	} else if (endp->queue_next == endp->queue_last) {
1389		mutex_unlock(&u132->scheduler_lock);
1390		u132_endp_put_kref(u132, endp);
1391		return;
1392	} else if (endp->pipetype == PIPE_INTERRUPT) {
1393		u8 address = u132->addr[endp->usb_addr].address;
1394		if (ring->in_use) {
1395			mutex_unlock(&u132->scheduler_lock);
1396			u132_endp_put_kref(u132, endp);
1397			return;
1398		} else {
1399			int retval;
1400			struct urb *urb = endp->urb_list[ENDP_QUEUE_MASK &
1401				endp->queue_next];
1402			endp->active = 1;
1403			ring->curr_endp = endp;
1404			ring->in_use = 1;
1405			mutex_unlock(&u132->scheduler_lock);
1406			retval = edset_single(u132, ring, endp, urb, address,
1407				endp->toggle_bits, u132_hcd_interrupt_recv);
1408			if (retval != 0)
1409				u132_hcd_giveback_urb(u132, endp, urb, retval);
1410			return;
1411		}
1412	} else if (endp->pipetype == PIPE_CONTROL) {
1413		u8 address = u132->addr[endp->usb_addr].address;
1414		if (ring->in_use) {
1415			mutex_unlock(&u132->scheduler_lock);
1416			u132_endp_put_kref(u132, endp);
1417			return;
1418		} else if (address == 0) {
1419			int retval;
1420			struct urb *urb = endp->urb_list[ENDP_QUEUE_MASK &
1421				endp->queue_next];
1422			endp->active = 1;
1423			ring->curr_endp = endp;
1424			ring->in_use = 1;
1425			mutex_unlock(&u132->scheduler_lock);
1426			retval = edset_setup(u132, ring, endp, urb, address,
1427				0x2, u132_hcd_initial_setup_sent);
1428			if (retval != 0)
1429				u132_hcd_giveback_urb(u132, endp, urb, retval);
1430			return;
1431		} else if (endp->usb_addr == 0) {
1432			int retval;
1433			struct urb *urb = endp->urb_list[ENDP_QUEUE_MASK &
1434				endp->queue_next];
1435			endp->active = 1;
1436			ring->curr_endp = endp;
1437			ring->in_use = 1;
1438			mutex_unlock(&u132->scheduler_lock);
1439			retval = edset_setup(u132, ring, endp, urb, 0, 0x2,
1440				u132_hcd_enumeration_address_sent);
1441			if (retval != 0)
1442				u132_hcd_giveback_urb(u132, endp, urb, retval);
1443			return;
1444		} else {
1445			int retval;
1446			struct urb *urb = endp->urb_list[ENDP_QUEUE_MASK &
1447				endp->queue_next];
1448			address = u132->addr[endp->usb_addr].address;
1449			endp->active = 1;
1450			ring->curr_endp = endp;
1451			ring->in_use = 1;
1452			mutex_unlock(&u132->scheduler_lock);
1453			retval = edset_setup(u132, ring, endp, urb, address,
1454				0x2, u132_hcd_configure_setup_sent);
1455			if (retval != 0)
1456				u132_hcd_giveback_urb(u132, endp, urb, retval);
1457			return;
1458		}
1459	} else {
1460		if (endp->input) {
1461			u8 address = u132->addr[endp->usb_addr].address;
1462			if (ring->in_use) {
1463				mutex_unlock(&u132->scheduler_lock);
1464				u132_endp_put_kref(u132, endp);
1465				return;
1466			} else {
1467				int retval;
1468				struct urb *urb = endp->urb_list[
1469					ENDP_QUEUE_MASK & endp->queue_next];
1470				endp->active = 1;
1471				ring->curr_endp = endp;
1472				ring->in_use = 1;
1473				mutex_unlock(&u132->scheduler_lock);
1474				retval = edset_input(u132, ring, endp, urb,
1475					address, endp->toggle_bits,
1476					u132_hcd_bulk_input_recv);
1477				if (retval == 0) {
1478				} else
1479					u132_hcd_giveback_urb(u132, endp, urb,
1480						retval);
1481				return;
1482			}
1483		} else {	/* output pipe */
1484			u8 address = u132->addr[endp->usb_addr].address;
1485			if (ring->in_use) {
1486				mutex_unlock(&u132->scheduler_lock);
1487				u132_endp_put_kref(u132, endp);
1488				return;
1489			} else {
1490				int retval;
1491				struct urb *urb = endp->urb_list[
1492					ENDP_QUEUE_MASK & endp->queue_next];
1493				endp->active = 1;
1494				ring->curr_endp = endp;
1495				ring->in_use = 1;
1496				mutex_unlock(&u132->scheduler_lock);
1497				retval = edset_output(u132, ring, endp, urb,
1498					address, endp->toggle_bits,
1499					u132_hcd_bulk_output_sent);
1500				if (retval == 0) {
1501				} else
1502					u132_hcd_giveback_urb(u132, endp, urb,
1503						retval);
1504				return;
1505			}
1506		}
1507	}
1508}
1509#ifdef CONFIG_PM
1510
1511static void port_power(struct u132 *u132, int pn, int is_on)
1512{
1513	u132->port[pn].power = is_on;
1514}
1515
1516#endif
1517
1518static void u132_power(struct u132 *u132, int is_on)
1519{
1520	struct usb_hcd *hcd = u132_to_hcd(u132)
1521		;	/* hub is inactive unless the port is powered */
1522	if (is_on) {
1523		if (u132->power)
1524			return;
1525		u132->power = 1;
1526	} else {
1527		u132->power = 0;
1528		hcd->state = HC_STATE_HALT;
1529	}
1530}
1531
1532static int u132_periodic_reinit(struct u132 *u132)
1533{
1534	int retval;
1535	u32 fi = u132->hc_fminterval & 0x03fff;
1536	u32 fit;
1537	u32 fminterval;
1538	retval = u132_read_pcimem(u132, fminterval, &fminterval);
1539	if (retval)
1540		return retval;
1541	fit = fminterval & FIT;
1542	retval = u132_write_pcimem(u132, fminterval,
1543		(fit ^ FIT) | u132->hc_fminterval);
1544	if (retval)
1545		return retval;
1546	retval = u132_write_pcimem(u132, periodicstart,
1547		((9 * fi) / 10) & 0x3fff);
1548	if (retval)
1549		return retval;
1550	return 0;
1551}
1552
1553static char *hcfs2string(int state)
1554{
1555	switch (state) {
1556	case OHCI_USB_RESET:
1557		return "reset";
1558	case OHCI_USB_RESUME:
1559		return "resume";
1560	case OHCI_USB_OPER:
1561		return "operational";
1562	case OHCI_USB_SUSPEND:
1563		return "suspend";
1564	}
1565	return "?";
1566}
1567
1568static int u132_init(struct u132 *u132)
1569{
1570	int retval;
1571	u32 control;
1572	u132_disable(u132);
1573	u132->next_statechange = jiffies;
1574	retval = u132_write_pcimem(u132, intrdisable, OHCI_INTR_MIE);
1575	if (retval)
1576		return retval;
1577	retval = u132_read_pcimem(u132, control, &control);
1578	if (retval)
1579		return retval;
1580	if (u132->num_ports == 0) {
1581		u32 rh_a = -1;
1582		retval = u132_read_pcimem(u132, roothub.a, &rh_a);
1583		if (retval)
1584			return retval;
1585		u132->num_ports = rh_a & RH_A_NDP;
1586		retval = read_roothub_info(u132);
1587		if (retval)
1588			return retval;
1589	}
1590	if (u132->num_ports > MAX_U132_PORTS)
1591		return -EINVAL;
1592
1593	return 0;
1594}
1595
1596
1597/* Start an OHCI controller, set the BUS operational
1598* resets USB and controller
1599* enable interrupts
1600*/
1601static int u132_run(struct u132 *u132)
1602{
1603	int retval;
1604	u32 control;
1605	u32 status;
1606	u32 fminterval;
1607	u32 periodicstart;
1608	u32 cmdstatus;
1609	u32 roothub_a;
1610	int mask = OHCI_INTR_INIT;
1611	int first = u132->hc_fminterval == 0;
1612	int sleep_time = 0;
1613	int reset_timeout = 30;	/* ... allow extra time */
1614	u132_disable(u132);
1615	if (first) {
1616		u32 temp;
1617		retval = u132_read_pcimem(u132, fminterval, &temp);
1618		if (retval)
1619			return retval;
1620		u132->hc_fminterval = temp & 0x3fff;
1621		u132->hc_fminterval |= FSMP(u132->hc_fminterval) << 16;
1622	}
1623	retval = u132_read_pcimem(u132, control, &u132->hc_control);
1624	if (retval)
1625		return retval;
1626	dev_info(&u132->platform_dev->dev, "resetting from state '%s', control "
1627		"= %08X\n", hcfs2string(u132->hc_control & OHCI_CTRL_HCFS),
1628		u132->hc_control);
1629	switch (u132->hc_control & OHCI_CTRL_HCFS) {
1630	case OHCI_USB_OPER:
1631		sleep_time = 0;
1632		break;
1633	case OHCI_USB_SUSPEND:
1634	case OHCI_USB_RESUME:
1635		u132->hc_control &= OHCI_CTRL_RWC;
1636		u132->hc_control |= OHCI_USB_RESUME;
1637		sleep_time = 10;
1638		break;
1639	default:
1640		u132->hc_control &= OHCI_CTRL_RWC;
1641		u132->hc_control |= OHCI_USB_RESET;
1642		sleep_time = 50;
1643		break;
1644	}
1645	retval = u132_write_pcimem(u132, control, u132->hc_control);
1646	if (retval)
1647		return retval;
1648	retval = u132_read_pcimem(u132, control, &control);
1649	if (retval)
1650		return retval;
1651	msleep(sleep_time);
1652	retval = u132_read_pcimem(u132, roothub.a, &roothub_a);
1653	if (retval)
1654		return retval;
1655	if (!(roothub_a & RH_A_NPS)) {
1656		int temp;	/* power down each port */
1657		for (temp = 0; temp < u132->num_ports; temp++) {
1658			retval = u132_write_pcimem(u132,
1659				roothub.portstatus[temp], RH_PS_LSDA);
1660			if (retval)
1661				return retval;
1662		}
1663	}
1664	retval = u132_read_pcimem(u132, control, &control);
1665	if (retval)
1666		return retval;
1667retry:
1668	retval = u132_read_pcimem(u132, cmdstatus, &status);
1669	if (retval)
1670		return retval;
1671	retval = u132_write_pcimem(u132, cmdstatus, OHCI_HCR);
1672	if (retval)
1673		return retval;
1674extra:	{
1675		retval = u132_read_pcimem(u132, cmdstatus, &status);
1676		if (retval)
1677			return retval;
1678		if (0 != (status & OHCI_HCR)) {
1679			if (--reset_timeout == 0) {
1680				dev_err(&u132->platform_dev->dev, "USB HC reset"
1681					" timed out!\n");
1682				return -ENODEV;
1683			} else {
1684				msleep(5);
1685				goto extra;
1686			}
1687		}
1688	}
1689	if (u132->flags & OHCI_QUIRK_INITRESET) {
1690		retval = u132_write_pcimem(u132, control, u132->hc_control);
1691		if (retval)
1692			return retval;
1693		retval = u132_read_pcimem(u132, control, &control);
1694		if (retval)
1695			return retval;
1696	}
1697	retval = u132_write_pcimem(u132, ed_controlhead, 0x00000000);
1698	if (retval)
1699		return retval;
1700	retval = u132_write_pcimem(u132, ed_bulkhead, 0x11000000);
1701	if (retval)
1702		return retval;
1703	retval = u132_write_pcimem(u132, hcca, 0x00000000);
1704	if (retval)
1705		return retval;
1706	retval = u132_periodic_reinit(u132);
1707	if (retval)
1708		return retval;
1709	retval = u132_read_pcimem(u132, fminterval, &fminterval);
1710	if (retval)
1711		return retval;
1712	retval = u132_read_pcimem(u132, periodicstart, &periodicstart);
1713	if (retval)
1714		return retval;
1715	if (0 == (fminterval & 0x3fff0000) || 0 == periodicstart) {
1716		if (!(u132->flags & OHCI_QUIRK_INITRESET)) {
1717			u132->flags |= OHCI_QUIRK_INITRESET;
1718			goto retry;
1719		} else
1720			dev_err(&u132->platform_dev->dev, "init err(%08x %04x)"
1721				"\n", fminterval, periodicstart);
1722	}			/* start controller operations */
1723	u132->hc_control &= OHCI_CTRL_RWC;
1724	u132->hc_control |= OHCI_CONTROL_INIT | OHCI_CTRL_BLE | OHCI_USB_OPER;
1725	retval = u132_write_pcimem(u132, control, u132->hc_control);
1726	if (retval)
1727		return retval;
1728	retval = u132_write_pcimem(u132, cmdstatus, OHCI_BLF);
1729	if (retval)
1730		return retval;
1731	retval = u132_read_pcimem(u132, cmdstatus, &cmdstatus);
1732	if (retval)
1733		return retval;
1734	retval = u132_read_pcimem(u132, control, &control);
1735	if (retval)
1736		return retval;
1737	u132_to_hcd(u132)->state = HC_STATE_RUNNING;
1738	retval = u132_write_pcimem(u132, roothub.status, RH_HS_DRWE);
1739	if (retval)
1740		return retval;
1741	retval = u132_write_pcimem(u132, intrstatus, mask);
1742	if (retval)
1743		return retval;
1744	retval = u132_write_pcimem(u132, intrdisable,
1745		OHCI_INTR_MIE | OHCI_INTR_OC | OHCI_INTR_RHSC | OHCI_INTR_FNO |
1746		OHCI_INTR_UE | OHCI_INTR_RD | OHCI_INTR_SF | OHCI_INTR_WDH |
1747		OHCI_INTR_SO);
1748	if (retval)
1749		return retval;	/* handle root hub init quirks ... */
1750	retval = u132_read_pcimem(u132, roothub.a, &roothub_a);
1751	if (retval)
1752		return retval;
1753	roothub_a &= ~(RH_A_PSM | RH_A_OCPM);
1754	if (u132->flags & OHCI_QUIRK_SUPERIO) {
1755		roothub_a |= RH_A_NOCP;
1756		roothub_a &= ~(RH_A_POTPGT | RH_A_NPS);
1757		retval = u132_write_pcimem(u132, roothub.a, roothub_a);
1758		if (retval)
1759			return retval;
1760	} else if ((u132->flags & OHCI_QUIRK_AMD756) || distrust_firmware) {
1761		roothub_a |= RH_A_NPS;
1762		retval = u132_write_pcimem(u132, roothub.a, roothub_a);
1763		if (retval)
1764			return retval;
1765	}
1766	retval = u132_write_pcimem(u132, roothub.status, RH_HS_LPSC);
1767	if (retval)
1768		return retval;
1769	retval = u132_write_pcimem(u132, roothub.b,
1770		(roothub_a & RH_A_NPS) ? 0 : RH_B_PPCM);
1771	if (retval)
1772		return retval;
1773	retval = u132_read_pcimem(u132, control, &control);
1774	if (retval)
1775		return retval;
1776	mdelay((roothub_a >> 23) & 0x1fe);
1777	u132_to_hcd(u132)->state = HC_STATE_RUNNING;
1778	return 0;
1779}
1780
1781static void u132_hcd_stop(struct usb_hcd *hcd)
1782{
1783	struct u132 *u132 = hcd_to_u132(hcd);
1784	if (u132->going > 1) {
1785		dev_err(&u132->platform_dev->dev, "u132 device %p(hcd=%p) has b"
1786			"een removed %d\n", u132, hcd, u132->going);
1787	} else if (u132->going > 0) {
1788		dev_err(&u132->platform_dev->dev, "device hcd=%p is being remov"
1789			"ed\n", hcd);
1790	} else {
1791		mutex_lock(&u132->sw_lock);
1792		msleep(100);
1793		u132_power(u132, 0);
1794		mutex_unlock(&u132->sw_lock);
1795	}
1796}
1797
1798static int u132_hcd_start(struct usb_hcd *hcd)
1799{
1800	struct u132 *u132 = hcd_to_u132(hcd);
1801	if (u132->going > 1) {
1802		dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
1803			, u132->going);
1804		return -ENODEV;
1805	} else if (u132->going > 0) {
1806		dev_err(&u132->platform_dev->dev, "device is being removed\n");
1807		return -ESHUTDOWN;
1808	} else if (hcd->self.controller) {
1809		int retval;
1810		struct platform_device *pdev =
1811			to_platform_device(hcd->self.controller);
1812		u16 vendor = ((struct u132_platform_data *)
1813			(pdev->dev.platform_data))->vendor;
1814		u16 device = ((struct u132_platform_data *)
1815			(pdev->dev.platform_data))->device;
1816		mutex_lock(&u132->sw_lock);
1817		msleep(10);
1818		if (vendor == PCI_VENDOR_ID_AMD && device == 0x740c) {
1819			u132->flags = OHCI_QUIRK_AMD756;
1820		} else if (vendor == PCI_VENDOR_ID_OPTI && device == 0xc861) {
1821			dev_err(&u132->platform_dev->dev, "WARNING: OPTi workar"
1822				"ounds unavailable\n");
1823		} else if (vendor == PCI_VENDOR_ID_COMPAQ && device == 0xa0f8)
1824			u132->flags |= OHCI_QUIRK_ZFMICRO;
1825		retval = u132_run(u132);
1826		if (retval) {
1827			u132_disable(u132);
1828			u132->going = 1;
1829		}
1830		msleep(100);
1831		mutex_unlock(&u132->sw_lock);
1832		return retval;
1833	} else {
1834		dev_err(&u132->platform_dev->dev, "platform_device missing\n");
1835		return -ENODEV;
1836	}
1837}
1838
1839static int u132_hcd_reset(struct usb_hcd *hcd)
1840{
1841	struct u132 *u132 = hcd_to_u132(hcd);
1842	if (u132->going > 1) {
1843		dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
1844			, u132->going);
1845		return -ENODEV;
1846	} else if (u132->going > 0) {
1847		dev_err(&u132->platform_dev->dev, "device is being removed\n");
1848		return -ESHUTDOWN;
1849	} else {
1850		int retval;
1851		mutex_lock(&u132->sw_lock);
1852		retval = u132_init(u132);
1853		if (retval) {
1854			u132_disable(u132);
1855			u132->going = 1;
1856		}
1857		mutex_unlock(&u132->sw_lock);
1858		return retval;
1859	}
1860}
1861
1862static int create_endpoint_and_queue_int(struct u132 *u132,
1863	struct u132_udev *udev, struct urb *urb,
1864	struct usb_device *usb_dev, u8 usb_addr, u8 usb_endp, u8 address,
1865	gfp_t mem_flags)
1866{
1867	struct u132_ring *ring;
1868	unsigned long irqs;
1869	int rc;
1870	u8 endp_number;
1871	struct u132_endp *endp = kmalloc(sizeof(struct u132_endp), mem_flags);
1872
1873	if (!endp)
1874		return -ENOMEM;
1875
1876	spin_lock_init(&endp->queue_lock.slock);
1877	spin_lock_irqsave(&endp->queue_lock.slock, irqs);
1878	rc = usb_hcd_link_urb_to_ep(u132_to_hcd(u132), urb);
1879	if (rc) {
1880		spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
1881		kfree(endp);
1882		return rc;
1883	}
1884
1885	endp_number = ++u132->num_endpoints;
1886	urb->ep->hcpriv = u132->endp[endp_number - 1] = endp;
1887	INIT_DELAYED_WORK(&endp->scheduler, u132_hcd_endp_work_scheduler);
1888	INIT_LIST_HEAD(&endp->urb_more);
1889	ring = endp->ring = &u132->ring[0];
1890	if (ring->curr_endp) {
1891		list_add_tail(&endp->endp_ring, &ring->curr_endp->endp_ring);
1892	} else {
1893		INIT_LIST_HEAD(&endp->endp_ring);
1894		ring->curr_endp = endp;
1895	}
1896	ring->length += 1;
1897	endp->dequeueing = 0;
1898	endp->edset_flush = 0;
1899	endp->active = 0;
1900	endp->delayed = 0;
1901	endp->endp_number = endp_number;
1902	endp->u132 = u132;
1903	endp->hep = urb->ep;
1904	endp->pipetype = usb_pipetype(urb->pipe);
1905	u132_endp_init_kref(u132, endp);
1906	if (usb_pipein(urb->pipe)) {
1907		endp->toggle_bits = 0x2;
1908		usb_settoggle(udev->usb_device, usb_endp, 0, 0);
1909		endp->input = 1;
1910		endp->output = 0;
1911		udev->endp_number_in[usb_endp] = endp_number;
1912		u132_udev_get_kref(u132, udev);
1913	} else {
1914		endp->toggle_bits = 0x2;
1915		usb_settoggle(udev->usb_device, usb_endp, 1, 0);
1916		endp->input = 0;
1917		endp->output = 1;
1918		udev->endp_number_out[usb_endp] = endp_number;
1919		u132_udev_get_kref(u132, udev);
1920	}
1921	urb->hcpriv = u132;
1922	endp->delayed = 1;
1923	endp->jiffies = jiffies + msecs_to_jiffies(urb->interval);
1924	endp->udev_number = address;
1925	endp->usb_addr = usb_addr;
1926	endp->usb_endp = usb_endp;
1927	endp->queue_size = 1;
1928	endp->queue_last = 0;
1929	endp->queue_next = 0;
1930	endp->urb_list[ENDP_QUEUE_MASK & endp->queue_last++] = urb;
1931	spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
1932	u132_endp_queue_work(u132, endp, msecs_to_jiffies(urb->interval));
1933	return 0;
1934}
1935
1936static int queue_int_on_old_endpoint(struct u132 *u132,
1937	struct u132_udev *udev, struct urb *urb,
1938	struct usb_device *usb_dev, struct u132_endp *endp, u8 usb_addr,
1939	u8 usb_endp, u8 address)
1940{
1941	urb->hcpriv = u132;
1942	endp->delayed = 1;
1943	endp->jiffies = jiffies + msecs_to_jiffies(urb->interval);
1944	if (endp->queue_size++ < ENDP_QUEUE_SIZE) {
1945		endp->urb_list[ENDP_QUEUE_MASK & endp->queue_last++] = urb;
1946	} else {
1947		struct u132_urbq *urbq = kmalloc(sizeof(struct u132_urbq),
1948			GFP_ATOMIC);
1949		if (urbq == NULL) {
1950			endp->queue_size -= 1;
1951			return -ENOMEM;
1952		} else {
1953			list_add_tail(&urbq->urb_more, &endp->urb_more);
1954			urbq->urb = urb;
1955		}
1956	}
1957	return 0;
1958}
1959
1960static int create_endpoint_and_queue_bulk(struct u132 *u132,
1961	struct u132_udev *udev, struct urb *urb,
1962	struct usb_device *usb_dev, u8 usb_addr, u8 usb_endp, u8 address,
1963	gfp_t mem_flags)
1964{
1965	int ring_number;
1966	struct u132_ring *ring;
1967	unsigned long irqs;
1968	int rc;
1969	u8 endp_number;
1970	struct u132_endp *endp = kmalloc(sizeof(struct u132_endp), mem_flags);
1971
1972	if (!endp)
1973		return -ENOMEM;
1974
1975	spin_lock_init(&endp->queue_lock.slock);
1976	spin_lock_irqsave(&endp->queue_lock.slock, irqs);
1977	rc = usb_hcd_link_urb_to_ep(u132_to_hcd(u132), urb);
1978	if (rc) {
1979		spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
1980		kfree(endp);
1981		return rc;
1982	}
1983
1984	endp_number = ++u132->num_endpoints;
1985	urb->ep->hcpriv = u132->endp[endp_number - 1] = endp;
1986	INIT_DELAYED_WORK(&endp->scheduler, u132_hcd_endp_work_scheduler);
1987	INIT_LIST_HEAD(&endp->urb_more);
1988	endp->dequeueing = 0;
1989	endp->edset_flush = 0;
1990	endp->active = 0;
1991	endp->delayed = 0;
1992	endp->endp_number = endp_number;
1993	endp->u132 = u132;
1994	endp->hep = urb->ep;
1995	endp->pipetype = usb_pipetype(urb->pipe);
1996	u132_endp_init_kref(u132, endp);
1997	if (usb_pipein(urb->pipe)) {
1998		endp->toggle_bits = 0x2;
1999		usb_settoggle(udev->usb_device, usb_endp, 0, 0);
2000		ring_number = 3;
2001		endp->input = 1;
2002		endp->output = 0;
2003		udev->endp_number_in[usb_endp] = endp_number;
2004		u132_udev_get_kref(u132, udev);
2005	} else {
2006		endp->toggle_bits = 0x2;
2007		usb_settoggle(udev->usb_device, usb_endp, 1, 0);
2008		ring_number = 2;
2009		endp->input = 0;
2010		endp->output = 1;
2011		udev->endp_number_out[usb_endp] = endp_number;
2012		u132_udev_get_kref(u132, udev);
2013	}
2014	ring = endp->ring = &u132->ring[ring_number - 1];
2015	if (ring->curr_endp) {
2016		list_add_tail(&endp->endp_ring, &ring->curr_endp->endp_ring);
2017	} else {
2018		INIT_LIST_HEAD(&endp->endp_ring);
2019		ring->curr_endp = endp;
2020	}
2021	ring->length += 1;
2022	urb->hcpriv = u132;
2023	endp->udev_number = address;
2024	endp->usb_addr = usb_addr;
2025	endp->usb_endp = usb_endp;
2026	endp->queue_size = 1;
2027	endp->queue_last = 0;
2028	endp->queue_next = 0;
2029	endp->urb_list[ENDP_QUEUE_MASK & endp->queue_last++] = urb;
2030	spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
2031	u132_endp_queue_work(u132, endp, 0);
2032	return 0;
2033}
2034
2035static int queue_bulk_on_old_endpoint(struct u132 *u132, struct u132_udev *udev,
2036	struct urb *urb,
2037	struct usb_device *usb_dev, struct u132_endp *endp, u8 usb_addr,
2038	u8 usb_endp, u8 address)
2039{
2040	urb->hcpriv = u132;
2041	if (endp->queue_size++ < ENDP_QUEUE_SIZE) {
2042		endp->urb_list[ENDP_QUEUE_MASK & endp->queue_last++] = urb;
2043	} else {
2044		struct u132_urbq *urbq = kmalloc(sizeof(struct u132_urbq),
2045			GFP_ATOMIC);
2046		if (urbq == NULL) {
2047			endp->queue_size -= 1;
2048			return -ENOMEM;
2049		} else {
2050			list_add_tail(&urbq->urb_more, &endp->urb_more);
2051			urbq->urb = urb;
2052		}
2053	}
2054	return 0;
2055}
2056
2057static int create_endpoint_and_queue_control(struct u132 *u132,
2058	struct urb *urb,
2059	struct usb_device *usb_dev, u8 usb_addr, u8 usb_endp,
2060	gfp_t mem_flags)
2061{
2062	struct u132_ring *ring;
2063	unsigned long irqs;
2064	int rc;
2065	u8 endp_number;
2066	struct u132_endp *endp = kmalloc(sizeof(struct u132_endp), mem_flags);
2067
2068	if (!endp)
2069		return -ENOMEM;
2070
2071	spin_lock_init(&endp->queue_lock.slock);
2072	spin_lock_irqsave(&endp->queue_lock.slock, irqs);
2073	rc = usb_hcd_link_urb_to_ep(u132_to_hcd(u132), urb);
2074	if (rc) {
2075		spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
2076		kfree(endp);
2077		return rc;
2078	}
2079
2080	endp_number = ++u132->num_endpoints;
2081	urb->ep->hcpriv = u132->endp[endp_number - 1] = endp;
2082	INIT_DELAYED_WORK(&endp->scheduler, u132_hcd_endp_work_scheduler);
2083	INIT_LIST_HEAD(&endp->urb_more);
2084	ring = endp->ring = &u132->ring[0];
2085	if (ring->curr_endp) {
2086		list_add_tail(&endp->endp_ring, &ring->curr_endp->endp_ring);
2087	} else {
2088		INIT_LIST_HEAD(&endp->endp_ring);
2089		ring->curr_endp = endp;
2090	}
2091	ring->length += 1;
2092	endp->dequeueing = 0;
2093	endp->edset_flush = 0;
2094	endp->active = 0;
2095	endp->delayed = 0;
2096	endp->endp_number = endp_number;
2097	endp->u132 = u132;
2098	endp->hep = urb->ep;
2099	u132_endp_init_kref(u132, endp);
2100	u132_endp_get_kref(u132, endp);
2101	if (usb_addr == 0) {
2102		u8 address = u132->addr[usb_addr].address;
2103		struct u132_udev *udev = &u132->udev[address];
2104		endp->udev_number = address;
2105		endp->usb_addr = usb_addr;
2106		endp->usb_endp = usb_endp;
2107		endp->input = 1;
2108		endp->output = 1;
2109		endp->pipetype = usb_pipetype(urb->pipe);
2110		u132_udev_init_kref(u132, udev);
2111		u132_udev_get_kref(u132, udev);
2112		udev->endp_number_in[usb_endp] = endp_number;
2113		udev->endp_number_out[usb_endp] = endp_number;
2114		urb->hcpriv = u132;
2115		endp->queue_size = 1;
2116		endp->queue_last = 0;
2117		endp->queue_next = 0;
2118		endp->urb_list[ENDP_QUEUE_MASK & endp->queue_last++] = urb;
2119		spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
2120		u132_endp_queue_work(u132, endp, 0);
2121		return 0;
2122	} else {		/*(usb_addr > 0) */
2123		u8 address = u132->addr[usb_addr].address;
2124		struct u132_udev *udev = &u132->udev[address];
2125		endp->udev_number = address;
2126		endp->usb_addr = usb_addr;
2127		endp->usb_endp = usb_endp;
2128		endp->input = 1;
2129		endp->output = 1;
2130		endp->pipetype = usb_pipetype(urb->pipe);
2131		u132_udev_get_kref(u132, udev);
2132		udev->enumeration = 2;
2133		udev->endp_number_in[usb_endp] = endp_number;
2134		udev->endp_number_out[usb_endp] = endp_number;
2135		urb->hcpriv = u132;
2136		endp->queue_size = 1;
2137		endp->queue_last = 0;
2138		endp->queue_next = 0;
2139		endp->urb_list[ENDP_QUEUE_MASK & endp->queue_last++] = urb;
2140		spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
2141		u132_endp_queue_work(u132, endp, 0);
2142		return 0;
2143	}
2144}
2145
2146static int queue_control_on_old_endpoint(struct u132 *u132,
2147	struct urb *urb,
2148	struct usb_device *usb_dev, struct u132_endp *endp, u8 usb_addr,
2149	u8 usb_endp)
2150{
2151	if (usb_addr == 0) {
2152		if (usb_pipein(urb->pipe)) {
2153			urb->hcpriv = u132;
2154			if (endp->queue_size++ < ENDP_QUEUE_SIZE) {
2155				endp->urb_list[ENDP_QUEUE_MASK &
2156					endp->queue_last++] = urb;
2157			} else {
2158				struct u132_urbq *urbq =
2159					kmalloc(sizeof(struct u132_urbq),
2160					GFP_ATOMIC);
2161				if (urbq == NULL) {
2162					endp->queue_size -= 1;
2163					return -ENOMEM;
2164				} else {
2165					list_add_tail(&urbq->urb_more,
2166						&endp->urb_more);
2167					urbq->urb = urb;
2168				}
2169			}
2170			return 0;
2171		} else {	/* usb_pipeout(urb->pipe) */
2172			struct u132_addr *addr = &u132->addr[usb_dev->devnum];
2173			int I = MAX_U132_UDEVS;
2174			int i = 0;
2175			while (--I > 0) {
2176				struct u132_udev *udev = &u132->udev[++i];
2177				if (udev->usb_device) {
2178					continue;
2179				} else {
2180					udev->enumeration = 1;
2181					u132->addr[0].address = i;
2182					endp->udev_number = i;
2183					udev->udev_number = i;
2184					udev->usb_addr = usb_dev->devnum;
2185					u132_udev_init_kref(u132, udev);
2186					udev->endp_number_in[usb_endp] =
2187						endp->endp_number;
2188					u132_udev_get_kref(u132, udev);
2189					udev->endp_number_out[usb_endp] =
2190						endp->endp_number;
2191					udev->usb_device = usb_dev;
2192					((u8 *) (urb->setup_packet))[2] =
2193						addr->address = i;
2194					u132_udev_get_kref(u132, udev);
2195					break;
2196				}
2197			}
2198			if (I == 0) {
2199				dev_err(&u132->platform_dev->dev, "run out of d"
2200					"evice space\n");
2201				return -EINVAL;
2202			}
2203			urb->hcpriv = u132;
2204			if (endp->queue_size++ < ENDP_QUEUE_SIZE) {
2205				endp->urb_list[ENDP_QUEUE_MASK &
2206					endp->queue_last++] = urb;
2207			} else {
2208				struct u132_urbq *urbq =
2209					kmalloc(sizeof(struct u132_urbq),
2210					GFP_ATOMIC);
2211				if (urbq == NULL) {
2212					endp->queue_size -= 1;
2213					return -ENOMEM;
2214				} else {
2215					list_add_tail(&urbq->urb_more,
2216						&endp->urb_more);
2217					urbq->urb = urb;
2218				}
2219			}
2220			return 0;
2221		}
2222	} else {		/*(usb_addr > 0) */
2223		u8 address = u132->addr[usb_addr].address;
2224		struct u132_udev *udev = &u132->udev[address];
2225		urb->hcpriv = u132;
2226		if (udev->enumeration != 2)
2227			udev->enumeration = 2;
2228		if (endp->queue_size++ < ENDP_QUEUE_SIZE) {
2229			endp->urb_list[ENDP_QUEUE_MASK & endp->queue_last++] =
2230				urb;
2231		} else {
2232			struct u132_urbq *urbq =
2233				kmalloc(sizeof(struct u132_urbq), GFP_ATOMIC);
2234			if (urbq == NULL) {
2235				endp->queue_size -= 1;
2236				return -ENOMEM;
2237			} else {
2238				list_add_tail(&urbq->urb_more, &endp->urb_more);
2239				urbq->urb = urb;
2240			}
2241		}
2242		return 0;
2243	}
2244}
2245
2246static int u132_urb_enqueue(struct usb_hcd *hcd, struct urb *urb,
2247		gfp_t mem_flags)
2248{
2249	struct u132 *u132 = hcd_to_u132(hcd);
2250	if (irqs_disabled()) {
2251		if (__GFP_WAIT & mem_flags) {
2252			printk(KERN_ERR "invalid context for function that migh"
2253				"t sleep\n");
2254			return -EINVAL;
2255		}
2256	}
2257	if (u132->going > 1) {
2258		dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
2259			, u132->going);
2260		return -ENODEV;
2261	} else if (u132->going > 0) {
2262		dev_err(&u132->platform_dev->dev, "device is being removed "
2263				"urb=%p\n", urb);
2264		return -ESHUTDOWN;
2265	} else {
2266		u8 usb_addr = usb_pipedevice(urb->pipe);
2267		u8 usb_endp = usb_pipeendpoint(urb->pipe);
2268		struct usb_device *usb_dev = urb->dev;
2269		if (usb_pipetype(urb->pipe) == PIPE_INTERRUPT) {
2270			u8 address = u132->addr[usb_addr].address;
2271			struct u132_udev *udev = &u132->udev[address];
2272			struct u132_endp *endp = urb->ep->hcpriv;
2273			urb->actual_length = 0;
2274			if (endp) {
2275				unsigned long irqs;
2276				int retval;
2277				spin_lock_irqsave(&endp->queue_lock.slock,
2278					irqs);
2279				retval = usb_hcd_link_urb_to_ep(hcd, urb);
2280				if (retval == 0) {
2281					retval = queue_int_on_old_endpoint(
2282							u132, udev, urb,
2283							usb_dev, endp,
2284							usb_addr, usb_endp,
2285							address);
2286					if (retval)
2287						usb_hcd_unlink_urb_from_ep(
2288	hcd, urb);
2289				}
2290				spin_unlock_irqrestore(&endp->queue_lock.slock,
2291					irqs);
2292				if (retval) {
2293					return retval;
2294				} else {
2295					u132_endp_queue_work(u132, endp,
2296						msecs_to_jiffies(urb->interval))
2297						;
2298					return 0;
2299				}
2300			} else if (u132->num_endpoints == MAX_U132_ENDPS) {
2301				return -EINVAL;
2302			} else {	/*(endp == NULL) */
2303				return create_endpoint_and_queue_int(u132, udev,
2304						urb, usb_dev, usb_addr,
2305						usb_endp, address, mem_flags);
2306			}
2307		} else if (usb_pipetype(urb->pipe) == PIPE_ISOCHRONOUS) {
2308			dev_err(&u132->platform_dev->dev, "the hardware does no"
2309				"t support PIPE_ISOCHRONOUS\n");
2310			return -EINVAL;
2311		} else if (usb_pipetype(urb->pipe) == PIPE_BULK) {
2312			u8 address = u132->addr[usb_addr].address;
2313			struct u132_udev *udev = &u132->udev[address];
2314			struct u132_endp *endp = urb->ep->hcpriv;
2315			urb->actual_length = 0;
2316			if (endp) {
2317				unsigned long irqs;
2318				int retval;
2319				spin_lock_irqsave(&endp->queue_lock.slock,
2320					irqs);
2321				retval = usb_hcd_link_urb_to_ep(hcd, urb);
2322				if (retval == 0) {
2323					retval = queue_bulk_on_old_endpoint(
2324							u132, udev, urb,
2325							usb_dev, endp,
2326							usb_addr, usb_endp,
2327							address);
2328					if (retval)
2329						usb_hcd_unlink_urb_from_ep(
2330	hcd, urb);
2331				}
2332				spin_unlock_irqrestore(&endp->queue_lock.slock,
2333					irqs);
2334				if (retval) {
2335					return retval;
2336				} else {
2337					u132_endp_queue_work(u132, endp, 0);
2338					return 0;
2339				}
2340			} else if (u132->num_endpoints == MAX_U132_ENDPS) {
2341				return -EINVAL;
2342			} else
2343				return create_endpoint_and_queue_bulk(u132,
2344					udev, urb, usb_dev, usb_addr,
2345					usb_endp, address, mem_flags);
2346		} else {
2347			struct u132_endp *endp = urb->ep->hcpriv;
2348			u16 urb_size = 8;
2349			u8 *b = urb->setup_packet;
2350			int i = 0;
2351			char data[30 * 3 + 4];
2352			char *d = data;
2353			int m = (sizeof(data) - 1) / 3;
2354			int l = 0;
2355			data[0] = 0;
2356			while (urb_size-- > 0) {
2357				if (i > m) {
2358				} else if (i++ < m) {
2359					int w = sprintf(d, " %02X", *b++);
2360					d += w;
2361					l += w;
2362				} else
2363					d += sprintf(d, " ..");
2364			}
2365			if (endp) {
2366				unsigned long irqs;
2367				int retval;
2368				spin_lock_irqsave(&endp->queue_lock.slock,
2369					irqs);
2370				retval = usb_hcd_link_urb_to_ep(hcd, urb);
2371				if (retval == 0) {
2372					retval = queue_control_on_old_endpoint(
2373							u132, urb, usb_dev,
2374							endp, usb_addr,
2375							usb_endp);
2376					if (retval)
2377						usb_hcd_unlink_urb_from_ep(
2378								hcd, urb);
2379				}
2380				spin_unlock_irqrestore(&endp->queue_lock.slock,
2381					irqs);
2382				if (retval) {
2383					return retval;
2384				} else {
2385					u132_endp_queue_work(u132, endp, 0);
2386					return 0;
2387				}
2388			} else if (u132->num_endpoints == MAX_U132_ENDPS) {
2389				return -EINVAL;
2390			} else
2391				return create_endpoint_and_queue_control(u132,
2392					urb, usb_dev, usb_addr, usb_endp,
2393					mem_flags);
2394		}
2395	}
2396}
2397
2398static int dequeue_from_overflow_chain(struct u132 *u132,
2399	struct u132_endp *endp, struct urb *urb)
2400{
2401	struct list_head *scan;
2402	struct list_head *head = &endp->urb_more;
2403	list_for_each(scan, head) {
2404		struct u132_urbq *urbq = list_entry(scan, struct u132_urbq,
2405			urb_more);
2406		if (urbq->urb == urb) {
2407			struct usb_hcd *hcd = u132_to_hcd(u132);
2408			list_del(scan);
2409			endp->queue_size -= 1;
2410			urb->error_count = 0;
2411			usb_hcd_giveback_urb(hcd, urb, 0);
2412			return 0;
2413		} else
2414			continue;
2415	}
2416	dev_err(&u132->platform_dev->dev, "urb=%p not found in endp[%d]=%p ring"
2417		"[%d] %c%c usb_endp=%d usb_addr=%d size=%d next=%04X last=%04X"
2418		"\n", urb, endp->endp_number, endp, endp->ring->number,
2419		endp->input ? 'I' : ' ', endp->output ? 'O' : ' ',
2420		endp->usb_endp, endp->usb_addr, endp->queue_size,
2421		endp->queue_next, endp->queue_last);
2422	return -EINVAL;
2423}
2424
2425static int u132_endp_urb_dequeue(struct u132 *u132, struct u132_endp *endp,
2426		struct urb *urb, int status)
2427{
2428	unsigned long irqs;
2429	int rc;
2430
2431	spin_lock_irqsave(&endp->queue_lock.slock, irqs);
2432	rc = usb_hcd_check_unlink_urb(u132_to_hcd(u132), urb, status);
2433	if (rc) {
2434		spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
2435		return rc;
2436	}
2437	if (endp->queue_size == 0) {
2438		dev_err(&u132->platform_dev->dev, "urb=%p not found in endp[%d]"
2439			"=%p ring[%d] %c%c usb_endp=%d usb_addr=%d\n", urb,
2440			endp->endp_number, endp, endp->ring->number,
2441			endp->input ? 'I' : ' ', endp->output ? 'O' : ' ',
2442			endp->usb_endp, endp->usb_addr);
2443		spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
2444		return -EINVAL;
2445	}
2446	if (urb == endp->urb_list[ENDP_QUEUE_MASK & endp->queue_next]) {
2447		if (endp->active) {
2448			endp->dequeueing = 1;
2449			endp->edset_flush = 1;
2450			u132_endp_queue_work(u132, endp, 0);
2451			spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
2452			return 0;
2453		} else {
2454			spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
2455			u132_hcd_abandon_urb(u132, endp, urb, status);
2456			return 0;
2457		}
2458	} else {
2459		u16 queue_list = 0;
2460		u16 queue_size = endp->queue_size;
2461		u16 queue_scan = endp->queue_next;
2462		struct urb **urb_slot = NULL;
2463		while (++queue_list < ENDP_QUEUE_SIZE && --queue_size > 0) {
2464			if (urb == endp->urb_list[ENDP_QUEUE_MASK &
2465				++queue_scan]) {
2466				urb_slot = &endp->urb_list[ENDP_QUEUE_MASK &
2467					queue_scan];
2468				break;
2469			} else
2470				continue;
2471		}
2472		while (++queue_list < ENDP_QUEUE_SIZE && --queue_size > 0) {
2473			*urb_slot = endp->urb_list[ENDP_QUEUE_MASK &
2474				++queue_scan];
2475			urb_slot = &endp->urb_list[ENDP_QUEUE_MASK &
2476				queue_scan];
2477		}
2478		if (urb_slot) {
2479			struct usb_hcd *hcd = u132_to_hcd(u132);
2480
2481			usb_hcd_unlink_urb_from_ep(hcd, urb);
2482			endp->queue_size -= 1;
2483			if (list_empty(&endp->urb_more)) {
2484				spin_unlock_irqrestore(&endp->queue_lock.slock,
2485					irqs);
2486			} else {
2487				struct list_head *next = endp->urb_more.next;
2488				struct u132_urbq *urbq = list_entry(next,
2489					struct u132_urbq, urb_more);
2490				list_del(next);
2491				*urb_slot = urbq->urb;
2492				spin_unlock_irqrestore(&endp->queue_lock.slock,
2493					irqs);
2494				kfree(urbq);
2495			} urb->error_count = 0;
 
2496			usb_hcd_giveback_urb(hcd, urb, status);
2497			return 0;
2498		} else if (list_empty(&endp->urb_more)) {
2499			dev_err(&u132->platform_dev->dev, "urb=%p not found in "
2500				"endp[%d]=%p ring[%d] %c%c usb_endp=%d usb_addr"
2501				"=%d size=%d next=%04X last=%04X\n", urb,
2502				endp->endp_number, endp, endp->ring->number,
2503				endp->input ? 'I' : ' ',
2504				endp->output ? 'O' : ' ', endp->usb_endp,
2505				endp->usb_addr, endp->queue_size,
2506				endp->queue_next, endp->queue_last);
2507			spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
2508			return -EINVAL;
2509		} else {
2510			int retval;
2511
2512			usb_hcd_unlink_urb_from_ep(u132_to_hcd(u132), urb);
2513			retval = dequeue_from_overflow_chain(u132, endp,
2514				urb);
2515			spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
2516			return retval;
2517		}
2518	}
2519}
2520
2521static int u132_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status)
2522{
2523	struct u132 *u132 = hcd_to_u132(hcd);
2524	if (u132->going > 2) {
2525		dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
2526			, u132->going);
2527		return -ENODEV;
2528	} else {
2529		u8 usb_addr = usb_pipedevice(urb->pipe);
2530		u8 usb_endp = usb_pipeendpoint(urb->pipe);
2531		u8 address = u132->addr[usb_addr].address;
2532		struct u132_udev *udev = &u132->udev[address];
2533		if (usb_pipein(urb->pipe)) {
2534			u8 endp_number = udev->endp_number_in[usb_endp];
2535			struct u132_endp *endp = u132->endp[endp_number - 1];
2536			return u132_endp_urb_dequeue(u132, endp, urb, status);
2537		} else {
2538			u8 endp_number = udev->endp_number_out[usb_endp];
2539			struct u132_endp *endp = u132->endp[endp_number - 1];
2540			return u132_endp_urb_dequeue(u132, endp, urb, status);
2541		}
2542	}
2543}
2544
2545static void u132_endpoint_disable(struct usb_hcd *hcd,
2546	struct usb_host_endpoint *hep)
2547{
2548	struct u132 *u132 = hcd_to_u132(hcd);
2549	if (u132->going > 2) {
2550		dev_err(&u132->platform_dev->dev, "u132 device %p(hcd=%p hep=%p"
2551			") has been removed %d\n", u132, hcd, hep,
2552			u132->going);
2553	} else {
2554		struct u132_endp *endp = hep->hcpriv;
2555		if (endp)
2556			u132_endp_put_kref(u132, endp);
2557	}
2558}
2559
2560static int u132_get_frame(struct usb_hcd *hcd)
2561{
2562	struct u132 *u132 = hcd_to_u132(hcd);
2563	if (u132->going > 1) {
2564		dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
2565			, u132->going);
2566		return -ENODEV;
2567	} else if (u132->going > 0) {
2568		dev_err(&u132->platform_dev->dev, "device is being removed\n");
2569		return -ESHUTDOWN;
2570	} else {
2571		int frame = 0;
2572		dev_err(&u132->platform_dev->dev, "TODO: u132_get_frame\n");
2573		msleep(100);
2574		return frame;
2575	}
2576}
2577
2578static int u132_roothub_descriptor(struct u132 *u132,
2579	struct usb_hub_descriptor *desc)
2580{
2581	int retval;
2582	u16 temp;
2583	u32 rh_a = -1;
2584	u32 rh_b = -1;
2585	retval = u132_read_pcimem(u132, roothub.a, &rh_a);
2586	if (retval)
2587		return retval;
2588	desc->bDescriptorType = 0x29;
2589	desc->bPwrOn2PwrGood = (rh_a & RH_A_POTPGT) >> 24;
2590	desc->bHubContrCurrent = 0;
2591	desc->bNbrPorts = u132->num_ports;
2592	temp = 1 + (u132->num_ports / 8);
2593	desc->bDescLength = 7 + 2 * temp;
2594	temp = 0;
2595	if (rh_a & RH_A_NPS)
2596		temp |= 0x0002;
2597	if (rh_a & RH_A_PSM)
2598		temp |= 0x0001;
2599	if (rh_a & RH_A_NOCP)
2600		temp |= 0x0010;
2601	else if (rh_a & RH_A_OCPM)
2602		temp |= 0x0008;
2603	desc->wHubCharacteristics = cpu_to_le16(temp);
2604	retval = u132_read_pcimem(u132, roothub.b, &rh_b);
2605	if (retval)
2606		return retval;
2607	memset(desc->u.hs.DeviceRemovable, 0xff,
2608			sizeof(desc->u.hs.DeviceRemovable));
2609	desc->u.hs.DeviceRemovable[0] = rh_b & RH_B_DR;
2610	if (u132->num_ports > 7) {
2611		desc->u.hs.DeviceRemovable[1] = (rh_b & RH_B_DR) >> 8;
2612		desc->u.hs.DeviceRemovable[2] = 0xff;
2613	} else
2614		desc->u.hs.DeviceRemovable[1] = 0xff;
2615	return 0;
2616}
2617
2618static int u132_roothub_status(struct u132 *u132, __le32 *desc)
2619{
2620	u32 rh_status = -1;
2621	int ret_status = u132_read_pcimem(u132, roothub.status, &rh_status);
2622	*desc = cpu_to_le32(rh_status);
2623	return ret_status;
2624}
2625
2626static int u132_roothub_portstatus(struct u132 *u132, __le32 *desc, u16 wIndex)
2627{
2628	if (wIndex == 0 || wIndex > u132->num_ports) {
2629		return -EINVAL;
2630	} else {
2631		int port = wIndex - 1;
2632		u32 rh_portstatus = -1;
2633		int ret_portstatus = u132_read_pcimem(u132,
2634			roothub.portstatus[port], &rh_portstatus);
2635		*desc = cpu_to_le32(rh_portstatus);
2636		if (*(u16 *) (desc + 2)) {
2637			dev_info(&u132->platform_dev->dev, "Port %d Status Chan"
2638				"ge = %08X\n", port, *desc);
2639		}
2640		return ret_portstatus;
2641	}
2642}
2643
2644
2645/* this timer value might be vendor-specific ... */
2646#define PORT_RESET_HW_MSEC 10
2647#define PORT_RESET_MSEC 10
2648/* wrap-aware logic morphed from <linux/jiffies.h> */
2649#define tick_before(t1, t2) ((s16)(((s16)(t1))-((s16)(t2))) < 0)
2650static int u132_roothub_portreset(struct u132 *u132, int port_index)
2651{
2652	int retval;
2653	u32 fmnumber;
2654	u16 now;
2655	u16 reset_done;
2656	retval = u132_read_pcimem(u132, fmnumber, &fmnumber);
2657	if (retval)
2658		return retval;
2659	now = fmnumber;
2660	reset_done = now + PORT_RESET_MSEC;
2661	do {
2662		u32 portstat;
2663		do {
2664			retval = u132_read_pcimem(u132,
2665				roothub.portstatus[port_index], &portstat);
2666			if (retval)
2667				return retval;
2668			if (RH_PS_PRS & portstat)
2669				continue;
2670			else
2671				break;
2672		} while (tick_before(now, reset_done));
2673		if (RH_PS_PRS & portstat)
2674			return -ENODEV;
2675		if (RH_PS_CCS & portstat) {
2676			if (RH_PS_PRSC & portstat) {
2677				retval = u132_write_pcimem(u132,
2678					roothub.portstatus[port_index],
2679					RH_PS_PRSC);
2680				if (retval)
2681					return retval;
2682			}
2683		} else
2684			break;	/* start the next reset,
2685				sleep till it's probably done */
2686		retval = u132_write_pcimem(u132, roothub.portstatus[port_index],
2687			 RH_PS_PRS);
2688		if (retval)
2689			return retval;
2690		msleep(PORT_RESET_HW_MSEC);
2691		retval = u132_read_pcimem(u132, fmnumber, &fmnumber);
2692		if (retval)
2693			return retval;
2694		now = fmnumber;
2695	} while (tick_before(now, reset_done));
2696	return 0;
2697}
2698
2699static int u132_roothub_setportfeature(struct u132 *u132, u16 wValue,
2700	u16 wIndex)
2701{
2702	if (wIndex == 0 || wIndex > u132->num_ports) {
2703		return -EINVAL;
2704	} else {
2705		int retval;
2706		int port_index = wIndex - 1;
2707		struct u132_port *port = &u132->port[port_index];
2708		port->Status &= ~(1 << wValue);
2709		switch (wValue) {
2710		case USB_PORT_FEAT_SUSPEND:
2711			retval = u132_write_pcimem(u132,
2712				roothub.portstatus[port_index], RH_PS_PSS);
2713			if (retval)
2714				return retval;
2715			return 0;
2716		case USB_PORT_FEAT_POWER:
2717			retval = u132_write_pcimem(u132,
2718				roothub.portstatus[port_index], RH_PS_PPS);
2719			if (retval)
2720				return retval;
2721			return 0;
2722		case USB_PORT_FEAT_RESET:
2723			retval = u132_roothub_portreset(u132, port_index);
2724			if (retval)
2725				return retval;
2726			return 0;
2727		default:
2728			return -EPIPE;
2729		}
2730	}
2731}
2732
2733static int u132_roothub_clearportfeature(struct u132 *u132, u16 wValue,
2734	u16 wIndex)
2735{
2736	if (wIndex == 0 || wIndex > u132->num_ports) {
2737		return -EINVAL;
2738	} else {
2739		int port_index = wIndex - 1;
2740		u32 temp;
2741		int retval;
2742		struct u132_port *port = &u132->port[port_index];
2743		port->Status &= ~(1 << wValue);
2744		switch (wValue) {
2745		case USB_PORT_FEAT_ENABLE:
2746			temp = RH_PS_CCS;
2747			break;
2748		case USB_PORT_FEAT_C_ENABLE:
2749			temp = RH_PS_PESC;
2750			break;
2751		case USB_PORT_FEAT_SUSPEND:
2752			temp = RH_PS_POCI;
2753			if ((u132->hc_control & OHCI_CTRL_HCFS)
2754				!= OHCI_USB_OPER) {
2755				dev_err(&u132->platform_dev->dev, "TODO resume_"
2756					"root_hub\n");
2757			}
2758			break;
2759		case USB_PORT_FEAT_C_SUSPEND:
2760			temp = RH_PS_PSSC;
2761			break;
2762		case USB_PORT_FEAT_POWER:
2763			temp = RH_PS_LSDA;
2764			break;
2765		case USB_PORT_FEAT_C_CONNECTION:
2766			temp = RH_PS_CSC;
2767			break;
2768		case USB_PORT_FEAT_C_OVER_CURRENT:
2769			temp = RH_PS_OCIC;
2770			break;
2771		case USB_PORT_FEAT_C_RESET:
2772			temp = RH_PS_PRSC;
2773			break;
2774		default:
2775			return -EPIPE;
2776		}
2777		retval = u132_write_pcimem(u132, roothub.portstatus[port_index],
2778			 temp);
2779		if (retval)
2780			return retval;
2781		return 0;
2782	}
2783}
2784
2785
2786/* the virtual root hub timer IRQ checks for hub status*/
2787static int u132_hub_status_data(struct usb_hcd *hcd, char *buf)
2788{
2789	struct u132 *u132 = hcd_to_u132(hcd);
2790	if (u132->going > 1) {
2791		dev_err(&u132->platform_dev->dev, "device hcd=%p has been remov"
2792			"ed %d\n", hcd, u132->going);
2793		return -ENODEV;
2794	} else if (u132->going > 0) {
2795		dev_err(&u132->platform_dev->dev, "device hcd=%p is being remov"
2796			"ed\n", hcd);
2797		return -ESHUTDOWN;
2798	} else {
2799		int i, changed = 0, length = 1;
2800		if (u132->flags & OHCI_QUIRK_AMD756) {
2801			if ((u132->hc_roothub_a & RH_A_NDP) > MAX_ROOT_PORTS) {
2802				dev_err(&u132->platform_dev->dev, "bogus NDP, r"
2803					"ereads as NDP=%d\n",
2804					u132->hc_roothub_a & RH_A_NDP);
2805				goto done;
2806			}
2807		}
2808		if (u132->hc_roothub_status & (RH_HS_LPSC | RH_HS_OCIC))
2809			buf[0] = changed = 1;
2810		else
2811			buf[0] = 0;
2812		if (u132->num_ports > 7) {
2813			buf[1] = 0;
2814			length++;
2815		}
2816		for (i = 0; i < u132->num_ports; i++) {
2817			if (u132->hc_roothub_portstatus[i] & (RH_PS_CSC |
2818				RH_PS_PESC | RH_PS_PSSC | RH_PS_OCIC |
2819				RH_PS_PRSC)) {
2820				changed = 1;
2821				if (i < 7)
2822					buf[0] |= 1 << (i + 1);
2823				else
2824					buf[1] |= 1 << (i - 7);
2825				continue;
2826			}
2827			if (!(u132->hc_roothub_portstatus[i] & RH_PS_CCS))
2828				continue;
2829
2830			if ((u132->hc_roothub_portstatus[i] & RH_PS_PSS))
2831				continue;
2832		}
2833done:
2834		return changed ? length : 0;
2835	}
2836}
2837
2838static int u132_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
2839	u16 wIndex, char *buf, u16 wLength)
2840{
2841	struct u132 *u132 = hcd_to_u132(hcd);
2842	if (u132->going > 1) {
2843		dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
2844			, u132->going);
2845		return -ENODEV;
2846	} else if (u132->going > 0) {
2847		dev_err(&u132->platform_dev->dev, "device is being removed\n");
2848		return -ESHUTDOWN;
2849	} else {
2850		int retval = 0;
2851		mutex_lock(&u132->sw_lock);
2852		switch (typeReq) {
2853		case ClearHubFeature:
2854			switch (wValue) {
2855			case C_HUB_OVER_CURRENT:
2856			case C_HUB_LOCAL_POWER:
2857				break;
2858			default:
2859				goto stall;
2860			}
2861			break;
2862		case SetHubFeature:
2863			switch (wValue) {
2864			case C_HUB_OVER_CURRENT:
2865			case C_HUB_LOCAL_POWER:
2866				break;
2867			default:
2868				goto stall;
2869			}
2870			break;
2871		case ClearPortFeature:{
2872				retval = u132_roothub_clearportfeature(u132,
2873					wValue, wIndex);
2874				if (retval)
2875					goto error;
2876				break;
2877			}
2878		case GetHubDescriptor:{
2879				retval = u132_roothub_descriptor(u132,
2880					(struct usb_hub_descriptor *)buf);
2881				if (retval)
2882					goto error;
2883				break;
2884			}
2885		case GetHubStatus:{
2886				retval = u132_roothub_status(u132,
2887					(__le32 *) buf);
2888				if (retval)
2889					goto error;
2890				break;
2891			}
2892		case GetPortStatus:{
2893				retval = u132_roothub_portstatus(u132,
2894					(__le32 *) buf, wIndex);
2895				if (retval)
2896					goto error;
2897				break;
2898			}
2899		case SetPortFeature:{
2900				retval = u132_roothub_setportfeature(u132,
2901					wValue, wIndex);
2902				if (retval)
2903					goto error;
2904				break;
2905			}
2906		default:
2907			goto stall;
2908		error:
2909			u132_disable(u132);
2910			u132->going = 1;
2911			break;
2912		stall:
2913			retval = -EPIPE;
2914			break;
2915		}
2916		mutex_unlock(&u132->sw_lock);
2917		return retval;
2918	}
2919}
2920
2921static int u132_start_port_reset(struct usb_hcd *hcd, unsigned port_num)
2922{
2923	struct u132 *u132 = hcd_to_u132(hcd);
2924	if (u132->going > 1) {
2925		dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
2926			, u132->going);
2927		return -ENODEV;
2928	} else if (u132->going > 0) {
2929		dev_err(&u132->platform_dev->dev, "device is being removed\n");
2930		return -ESHUTDOWN;
2931	} else
2932		return 0;
2933}
2934
2935
2936#ifdef CONFIG_PM
2937static int u132_bus_suspend(struct usb_hcd *hcd)
2938{
2939	struct u132 *u132 = hcd_to_u132(hcd);
2940	if (u132->going > 1) {
2941		dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
2942			, u132->going);
2943		return -ENODEV;
2944	} else if (u132->going > 0) {
2945		dev_err(&u132->platform_dev->dev, "device is being removed\n");
2946		return -ESHUTDOWN;
2947	} else
2948		return 0;
2949}
2950
2951static int u132_bus_resume(struct usb_hcd *hcd)
2952{
2953	struct u132 *u132 = hcd_to_u132(hcd);
2954	if (u132->going > 1) {
2955		dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
2956			, u132->going);
2957		return -ENODEV;
2958	} else if (u132->going > 0) {
2959		dev_err(&u132->platform_dev->dev, "device is being removed\n");
2960		return -ESHUTDOWN;
2961	} else
2962		return 0;
2963}
2964
2965#else
2966#define u132_bus_suspend NULL
2967#define u132_bus_resume NULL
2968#endif
2969static struct hc_driver u132_hc_driver = {
2970	.description = hcd_name,
2971	.hcd_priv_size = sizeof(struct u132),
2972	.irq = NULL,
2973	.flags = HCD_USB11 | HCD_MEMORY,
2974	.reset = u132_hcd_reset,
2975	.start = u132_hcd_start,
2976	.stop = u132_hcd_stop,
2977	.urb_enqueue = u132_urb_enqueue,
2978	.urb_dequeue = u132_urb_dequeue,
2979	.endpoint_disable = u132_endpoint_disable,
2980	.get_frame_number = u132_get_frame,
2981	.hub_status_data = u132_hub_status_data,
2982	.hub_control = u132_hub_control,
2983	.bus_suspend = u132_bus_suspend,
2984	.bus_resume = u132_bus_resume,
2985	.start_port_reset = u132_start_port_reset,
2986};
2987
2988/*
2989* This function may be called by the USB core whilst the "usb_all_devices_rwsem"
2990* is held for writing, thus this module must not call usb_remove_hcd()
2991* synchronously - but instead should immediately stop activity to the
2992* device and asynchronously call usb_remove_hcd()
2993*/
2994static int __devexit u132_remove(struct platform_device *pdev)
2995{
2996	struct usb_hcd *hcd = platform_get_drvdata(pdev);
2997	if (hcd) {
2998		struct u132 *u132 = hcd_to_u132(hcd);
2999		if (u132->going++ > 1) {
3000			dev_err(&u132->platform_dev->dev, "already being remove"
3001				"d\n");
3002			return -ENODEV;
3003		} else {
3004			int rings = MAX_U132_RINGS;
3005			int endps = MAX_U132_ENDPS;
3006			dev_err(&u132->platform_dev->dev, "removing device u132"
3007				".%d\n", u132->sequence_num);
3008			msleep(100);
3009			mutex_lock(&u132->sw_lock);
3010			u132_monitor_cancel_work(u132);
3011			while (rings-- > 0) {
3012				struct u132_ring *ring = &u132->ring[rings];
3013				u132_ring_cancel_work(u132, ring);
3014			} while (endps-- > 0) {
 
3015				struct u132_endp *endp = u132->endp[endps];
3016				if (endp)
3017					u132_endp_cancel_work(u132, endp);
3018			}
3019			u132->going += 1;
3020			printk(KERN_INFO "removing device u132.%d\n",
3021				u132->sequence_num);
3022			mutex_unlock(&u132->sw_lock);
3023			usb_remove_hcd(hcd);
3024			u132_u132_put_kref(u132);
3025			return 0;
3026		}
3027	} else
3028		return 0;
3029}
3030
3031static void u132_initialise(struct u132 *u132, struct platform_device *pdev)
3032{
3033	int rings = MAX_U132_RINGS;
3034	int ports = MAX_U132_PORTS;
3035	int addrs = MAX_U132_ADDRS;
3036	int udevs = MAX_U132_UDEVS;
3037	int endps = MAX_U132_ENDPS;
3038	u132->board = pdev->dev.platform_data;
3039	u132->platform_dev = pdev;
3040	u132->power = 0;
3041	u132->reset = 0;
3042	mutex_init(&u132->sw_lock);
3043	mutex_init(&u132->scheduler_lock);
3044	while (rings-- > 0) {
3045		struct u132_ring *ring = &u132->ring[rings];
3046		ring->u132 = u132;
3047		ring->number = rings + 1;
3048		ring->length = 0;
3049		ring->curr_endp = NULL;
3050		INIT_DELAYED_WORK(&ring->scheduler,
3051				  u132_hcd_ring_work_scheduler);
3052	}
3053	mutex_lock(&u132->sw_lock);
3054	INIT_DELAYED_WORK(&u132->monitor, u132_hcd_monitor_work);
3055	while (ports-- > 0) {
3056		struct u132_port *port = &u132->port[ports];
3057		port->u132 = u132;
3058		port->reset = 0;
3059		port->enable = 0;
3060		port->power = 0;
3061		port->Status = 0;
3062	}
3063	while (addrs-- > 0) {
3064		struct u132_addr *addr = &u132->addr[addrs];
3065		addr->address = 0;
3066	}
3067	while (udevs-- > 0) {
3068		struct u132_udev *udev = &u132->udev[udevs];
3069		int i = ARRAY_SIZE(udev->endp_number_in);
3070		int o = ARRAY_SIZE(udev->endp_number_out);
3071		udev->usb_device = NULL;
3072		udev->udev_number = 0;
3073		udev->usb_addr = 0;
3074		udev->portnumber = 0;
3075		while (i-- > 0)
3076			udev->endp_number_in[i] = 0;
3077
3078		while (o-- > 0)
3079			udev->endp_number_out[o] = 0;
3080
3081	}
3082	while (endps-- > 0)
3083		u132->endp[endps] = NULL;
3084
3085	mutex_unlock(&u132->sw_lock);
3086}
3087
3088static int __devinit u132_probe(struct platform_device *pdev)
3089{
3090	struct usb_hcd *hcd;
3091	int retval;
3092	u32 control;
3093	u32 rh_a = -1;
3094	u32 num_ports;
3095
3096	msleep(100);
3097	if (u132_exiting > 0)
3098		return -ENODEV;
3099
3100	retval = ftdi_write_pcimem(pdev, intrdisable, OHCI_INTR_MIE);
3101	if (retval)
3102		return retval;
3103	retval = ftdi_read_pcimem(pdev, control, &control);
3104	if (retval)
3105		return retval;
3106	retval = ftdi_read_pcimem(pdev, roothub.a, &rh_a);
3107	if (retval)
3108		return retval;
3109	num_ports = rh_a & RH_A_NDP;	/* refuse to confuse usbcore */
3110	if (pdev->dev.dma_mask)
3111		return -EINVAL;
3112
3113	hcd = usb_create_hcd(&u132_hc_driver, &pdev->dev, dev_name(&pdev->dev));
3114	if (!hcd) {
3115		printk(KERN_ERR "failed to create the usb hcd struct for U132\n"
3116			);
3117		ftdi_elan_gone_away(pdev);
3118		return -ENOMEM;
3119	} else {
3120		struct u132 *u132 = hcd_to_u132(hcd);
3121		retval = 0;
3122		hcd->rsrc_start = 0;
3123		mutex_lock(&u132_module_lock);
3124		list_add_tail(&u132->u132_list, &u132_static_list);
3125		u132->sequence_num = ++u132_instances;
3126		mutex_unlock(&u132_module_lock);
3127		u132_u132_init_kref(u132);
3128		u132_initialise(u132, pdev);
3129		hcd->product_desc = "ELAN U132 Host Controller";
3130		retval = usb_add_hcd(hcd, 0, 0);
3131		if (retval != 0) {
3132			dev_err(&u132->platform_dev->dev, "init error %d\n",
3133				retval);
3134			u132_u132_put_kref(u132);
3135			return retval;
3136		} else {
 
3137			u132_monitor_queue_work(u132, 100);
3138			return 0;
3139		}
3140	}
3141}
3142
3143
3144#ifdef CONFIG_PM
3145/* for this device there's no useful distinction between the controller
3146* and its root hub, except that the root hub only gets direct PM calls
3147* when CONFIG_USB_SUSPEND is enabled.
3148*/
3149static int u132_suspend(struct platform_device *pdev, pm_message_t state)
3150{
3151	struct usb_hcd *hcd = platform_get_drvdata(pdev);
3152	struct u132 *u132 = hcd_to_u132(hcd);
3153	if (u132->going > 1) {
3154		dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
3155			, u132->going);
3156		return -ENODEV;
3157	} else if (u132->going > 0) {
3158		dev_err(&u132->platform_dev->dev, "device is being removed\n");
3159		return -ESHUTDOWN;
3160	} else {
3161		int retval = 0, ports;
3162
3163		switch (state.event) {
3164		case PM_EVENT_FREEZE:
3165			retval = u132_bus_suspend(hcd);
3166			break;
3167		case PM_EVENT_SUSPEND:
3168		case PM_EVENT_HIBERNATE:
3169			ports = MAX_U132_PORTS;
3170			while (ports-- > 0) {
3171				port_power(u132, ports, 0);
3172			}
3173			break;
3174		}
3175		return retval;
3176	}
3177}
3178
3179static int u132_resume(struct platform_device *pdev)
3180{
3181	struct usb_hcd *hcd = platform_get_drvdata(pdev);
3182	struct u132 *u132 = hcd_to_u132(hcd);
3183	if (u132->going > 1) {
3184		dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
3185			, u132->going);
3186		return -ENODEV;
3187	} else if (u132->going > 0) {
3188		dev_err(&u132->platform_dev->dev, "device is being removed\n");
3189		return -ESHUTDOWN;
3190	} else {
3191		int retval = 0;
3192		if (!u132->port[0].power) {
3193			int ports = MAX_U132_PORTS;
3194			while (ports-- > 0) {
3195				port_power(u132, ports, 1);
3196			}
3197			retval = 0;
3198		} else {
3199			retval = u132_bus_resume(hcd);
3200		}
3201		return retval;
3202	}
3203}
3204
3205#else
3206#define u132_suspend NULL
3207#define u132_resume NULL
3208#endif
3209/*
3210* this driver is loaded explicitly by ftdi_u132
3211*
3212* the platform_driver struct is static because it is per type of module
3213*/
3214static struct platform_driver u132_platform_driver = {
3215	.probe = u132_probe,
3216	.remove = __devexit_p(u132_remove),
3217	.suspend = u132_suspend,
3218	.resume = u132_resume,
3219	.driver = {
3220		   .name = (char *)hcd_name,
3221		   .owner = THIS_MODULE,
3222		   },
3223};
3224static int __init u132_hcd_init(void)
3225{
3226	int retval;
3227	INIT_LIST_HEAD(&u132_static_list);
3228	u132_instances = 0;
3229	u132_exiting = 0;
3230	mutex_init(&u132_module_lock);
3231	if (usb_disabled())
3232		return -ENODEV;
3233	printk(KERN_INFO "driver %s\n", hcd_name);
3234	workqueue = create_singlethread_workqueue("u132");
 
 
3235	retval = platform_driver_register(&u132_platform_driver);
 
 
 
3236	return retval;
3237}
3238
3239
3240module_init(u132_hcd_init);
3241static void __exit u132_hcd_exit(void)
3242{
3243	struct u132 *u132;
3244	struct u132 *temp;
3245	mutex_lock(&u132_module_lock);
3246	u132_exiting += 1;
3247	mutex_unlock(&u132_module_lock);
3248	list_for_each_entry_safe(u132, temp, &u132_static_list, u132_list) {
3249		platform_device_unregister(u132->platform_dev);
3250	}
3251	platform_driver_unregister(&u132_platform_driver);
3252	printk(KERN_INFO "u132-hcd driver deregistered\n");
3253	wait_event(u132_hcd_wait, u132_instances == 0);
3254	flush_workqueue(workqueue);
3255	destroy_workqueue(workqueue);
3256}
3257
3258
3259module_exit(u132_hcd_exit);
3260MODULE_LICENSE("GPL");
3261MODULE_ALIAS("platform:u132_hcd");
v5.14.15
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3* Host Controller Driver for the Elan Digital Systems U132 adapter
   4*
   5* Copyright(C) 2006 Elan Digital Systems Limited
   6* http://www.elandigitalsystems.com
   7*
   8* Author and Maintainer - Tony Olech - Elan Digital Systems
   9* tony.olech@elandigitalsystems.com
  10*
 
 
 
 
 
  11* This driver was written by Tony Olech(tony.olech@elandigitalsystems.com)
  12* based on various USB host drivers in the 2.6.15 linux kernel
  13* with constant reference to the 3rd Edition of Linux Device Drivers
  14* published by O'Reilly
  15*
  16* The U132 adapter is a USB to CardBus adapter specifically designed
  17* for PC cards that contain an OHCI host controller. Typical PC cards
  18* are the Orange Mobile 3G Option GlobeTrotter Fusion card.
  19*
  20* The U132 adapter will *NOT *work with PC cards that do not contain
  21* an OHCI controller. A simple way to test whether a PC card has an
  22* OHCI controller as an interface is to insert the PC card directly
  23* into a laptop(or desktop) with a CardBus slot and if "lspci" shows
  24* a new USB controller and "lsusb -v" shows a new OHCI Host Controller
  25* then there is a good chance that the U132 adapter will support the
  26* PC card.(you also need the specific client driver for the PC card)
  27*
  28* Please inform the Author and Maintainer about any PC cards that
  29* contain OHCI Host Controller and work when directly connected to
  30* an embedded CardBus slot but do not work when they are connected
  31* via an ELAN U132 adapter.
  32*
  33*/
  34#include <linux/kernel.h>
  35#include <linux/module.h>
  36#include <linux/moduleparam.h>
  37#include <linux/delay.h>
  38#include <linux/ioport.h>
  39#include <linux/pci_ids.h>
  40#include <linux/sched.h>
  41#include <linux/slab.h>
  42#include <linux/errno.h>
  43#include <linux/init.h>
  44#include <linux/timer.h>
  45#include <linux/list.h>
  46#include <linux/interrupt.h>
  47#include <linux/usb.h>
  48#include <linux/usb/hcd.h>
  49#include <linux/workqueue.h>
  50#include <linux/platform_device.h>
  51#include <linux/mutex.h>
  52#include <asm/io.h>
  53#include <asm/irq.h>
 
  54#include <asm/byteorder.h>
  55
  56	/* FIXME ohci.h is ONLY for internal use by the OHCI driver.
  57	 * If you're going to try stuff like this, you need to split
  58	 * out shareable stuff (register declarations?) into its own
  59	 * file, maybe name <linux/usb/ohci.h>
  60	 */
  61
  62#include "ohci.h"
  63#define OHCI_CONTROL_INIT OHCI_CTRL_CBSR
  64#define OHCI_INTR_INIT (OHCI_INTR_MIE | OHCI_INTR_UE | OHCI_INTR_RD | \
  65	OHCI_INTR_WDH)
  66MODULE_AUTHOR("Tony Olech - Elan Digital Systems Limited");
  67MODULE_DESCRIPTION("U132 USB Host Controller Driver");
  68MODULE_LICENSE("GPL");
  69#define INT_MODULE_PARM(n, v) static int n = v;module_param(n, int, 0444)
  70INT_MODULE_PARM(testing, 0);
  71/* Some boards misreport power switching/overcurrent*/
  72static bool distrust_firmware = true;
  73module_param(distrust_firmware, bool, 0);
  74MODULE_PARM_DESC(distrust_firmware, "true to distrust firmware power/overcurrent"
  75	"t setup");
  76static DECLARE_WAIT_QUEUE_HEAD(u132_hcd_wait);
  77/*
  78* u132_module_lock exists to protect access to global variables
  79*
  80*/
  81static DEFINE_MUTEX(u132_module_lock);
  82static int u132_exiting;
  83static int u132_instances;
 
  84/*
  85* end of the global variables protected by u132_module_lock
  86*/
  87static struct workqueue_struct *workqueue;
  88#define MAX_U132_PORTS 7
  89#define MAX_U132_ADDRS 128
  90#define MAX_U132_UDEVS 4
  91#define MAX_U132_ENDPS 100
  92#define MAX_U132_RINGS 4
  93static const char *cc_to_text[16] = {
  94	"No Error ",
  95	"CRC Error ",
  96	"Bit Stuff ",
  97	"Data Togg ",
  98	"Stall ",
  99	"DevNotResp ",
 100	"PIDCheck ",
 101	"UnExpPID ",
 102	"DataOver ",
 103	"DataUnder ",
 104	"(for hw) ",
 105	"(for hw) ",
 106	"BufferOver ",
 107	"BuffUnder ",
 108	"(for HCD) ",
 109	"(for HCD) "
 110};
 111struct u132_port {
 112	struct u132 *u132;
 113	int reset;
 114	int enable;
 115	int power;
 116	int Status;
 117};
 118struct u132_addr {
 119	u8 address;
 120};
 121struct u132_udev {
 122	struct kref kref;
 123	struct usb_device *usb_device;
 124	u8 enumeration;
 125	u8 udev_number;
 126	u8 usb_addr;
 127	u8 portnumber;
 128	u8 endp_number_in[16];
 129	u8 endp_number_out[16];
 130};
 131#define ENDP_QUEUE_SHIFT 3
 132#define ENDP_QUEUE_SIZE (1<<ENDP_QUEUE_SHIFT)
 133#define ENDP_QUEUE_MASK (ENDP_QUEUE_SIZE-1)
 134struct u132_urbq {
 135	struct list_head urb_more;
 136	struct urb *urb;
 137};
 138struct u132_spin {
 139	spinlock_t slock;
 140};
 141struct u132_endp {
 142	struct kref kref;
 143	u8 udev_number;
 144	u8 endp_number;
 145	u8 usb_addr;
 146	u8 usb_endp;
 147	struct u132 *u132;
 148	struct list_head endp_ring;
 149	struct u132_ring *ring;
 150	unsigned toggle_bits:2;
 151	unsigned active:1;
 152	unsigned delayed:1;
 153	unsigned input:1;
 154	unsigned output:1;
 155	unsigned pipetype:2;
 156	unsigned dequeueing:1;
 157	unsigned edset_flush:1;
 158	unsigned spare_bits:14;
 159	unsigned long jiffies;
 160	struct usb_host_endpoint *hep;
 161	struct u132_spin queue_lock;
 162	u16 queue_size;
 163	u16 queue_last;
 164	u16 queue_next;
 165	struct urb *urb_list[ENDP_QUEUE_SIZE];
 166	struct list_head urb_more;
 167	struct delayed_work scheduler;
 168};
 169struct u132_ring {
 170	unsigned in_use:1;
 171	unsigned length:7;
 172	u8 number;
 173	struct u132 *u132;
 174	struct u132_endp *curr_endp;
 175	struct delayed_work scheduler;
 176};
 177struct u132 {
 178	struct kref kref;
 
 179	struct mutex sw_lock;
 180	struct mutex scheduler_lock;
 181	struct u132_platform_data *board;
 182	struct platform_device *platform_dev;
 183	struct u132_ring ring[MAX_U132_RINGS];
 184	int sequence_num;
 185	int going;
 186	int power;
 187	int reset;
 188	int num_ports;
 189	u32 hc_control;
 190	u32 hc_fminterval;
 191	u32 hc_roothub_status;
 192	u32 hc_roothub_a;
 193	u32 hc_roothub_portstatus[MAX_ROOT_PORTS];
 194	int flags;
 195	unsigned long next_statechange;
 196	struct delayed_work monitor;
 197	int num_endpoints;
 198	struct u132_addr addr[MAX_U132_ADDRS];
 199	struct u132_udev udev[MAX_U132_UDEVS];
 200	struct u132_port port[MAX_U132_PORTS];
 201	struct u132_endp *endp[MAX_U132_ENDPS];
 202};
 203
 204/*
 205* these cannot be inlines because we need the structure offset!!
 206* Does anyone have a better way?????
 207*/
 208#define ftdi_read_pcimem(pdev, member, data) usb_ftdi_elan_read_pcimem(pdev, \
 209	offsetof(struct ohci_regs, member), 0, data);
 210#define ftdi_write_pcimem(pdev, member, data) usb_ftdi_elan_write_pcimem(pdev, \
 211	offsetof(struct ohci_regs, member), 0, data)
 212#define u132_read_pcimem(u132, member, data) \
 213	usb_ftdi_elan_read_pcimem(u132->platform_dev, offsetof(struct \
 214	ohci_regs, member), 0, data)
 215#define u132_write_pcimem(u132, member, data) \
 216	usb_ftdi_elan_write_pcimem(u132->platform_dev, offsetof(struct \
 217	ohci_regs, member), 0, data)
 218static inline struct u132 *udev_to_u132(struct u132_udev *udev)
 219{
 220	u8 udev_number = udev->udev_number;
 221	return container_of(udev, struct u132, udev[udev_number]);
 222}
 223
 224static inline struct u132 *hcd_to_u132(struct usb_hcd *hcd)
 225{
 226	return (struct u132 *)(hcd->hcd_priv);
 227}
 228
 229static inline struct usb_hcd *u132_to_hcd(struct u132 *u132)
 230{
 231	return container_of((void *)u132, struct usb_hcd, hcd_priv);
 232}
 233
 234static inline void u132_disable(struct u132 *u132)
 235{
 236	u132_to_hcd(u132)->state = HC_STATE_HALT;
 237}
 238
 239
 240#define kref_to_u132(d) container_of(d, struct u132, kref)
 241#define kref_to_u132_endp(d) container_of(d, struct u132_endp, kref)
 242#define kref_to_u132_udev(d) container_of(d, struct u132_udev, kref)
 243#include "../misc/usb_u132.h"
 244static const char hcd_name[] = "u132_hcd";
 245#define PORT_C_MASK ((USB_PORT_STAT_C_CONNECTION | USB_PORT_STAT_C_ENABLE | \
 246	USB_PORT_STAT_C_SUSPEND | USB_PORT_STAT_C_OVERCURRENT | \
 247	USB_PORT_STAT_C_RESET) << 16)
 248static void u132_hcd_delete(struct kref *kref)
 249{
 250	struct u132 *u132 = kref_to_u132(kref);
 251	struct platform_device *pdev = u132->platform_dev;
 252	struct usb_hcd *hcd = u132_to_hcd(u132);
 253	u132->going += 1;
 254	mutex_lock(&u132_module_lock);
 
 255	u132_instances -= 1;
 256	mutex_unlock(&u132_module_lock);
 257	dev_warn(&u132->platform_dev->dev, "FREEING the hcd=%p and thus the u13"
 258		"2=%p going=%d pdev=%p\n", hcd, u132, u132->going, pdev);
 259	usb_put_hcd(hcd);
 260}
 261
 262static inline void u132_u132_put_kref(struct u132 *u132)
 263{
 264	kref_put(&u132->kref, u132_hcd_delete);
 265}
 266
 267static inline void u132_u132_init_kref(struct u132 *u132)
 268{
 269	kref_init(&u132->kref);
 270}
 271
 272static void u132_udev_delete(struct kref *kref)
 273{
 274	struct u132_udev *udev = kref_to_u132_udev(kref);
 275	udev->udev_number = 0;
 276	udev->usb_device = NULL;
 277	udev->usb_addr = 0;
 278	udev->enumeration = 0;
 279}
 280
 281static inline void u132_udev_put_kref(struct u132 *u132, struct u132_udev *udev)
 282{
 283	kref_put(&udev->kref, u132_udev_delete);
 284}
 285
 286static inline void u132_udev_get_kref(struct u132 *u132, struct u132_udev *udev)
 287{
 288	kref_get(&udev->kref);
 289}
 290
 291static inline void u132_udev_init_kref(struct u132 *u132,
 292	struct u132_udev *udev)
 293{
 294	kref_init(&udev->kref);
 295}
 296
 297static inline void u132_ring_put_kref(struct u132 *u132, struct u132_ring *ring)
 298{
 299	kref_put(&u132->kref, u132_hcd_delete);
 300}
 301
 302static void u132_ring_requeue_work(struct u132 *u132, struct u132_ring *ring,
 303	unsigned int delta)
 304{
 305	if (delta > 0) {
 306		if (queue_delayed_work(workqueue, &ring->scheduler, delta))
 307			return;
 308	} else if (queue_delayed_work(workqueue, &ring->scheduler, 0))
 309		return;
 310	kref_put(&u132->kref, u132_hcd_delete);
 311}
 312
 313static void u132_ring_queue_work(struct u132 *u132, struct u132_ring *ring,
 314	unsigned int delta)
 315{
 316	kref_get(&u132->kref);
 317	u132_ring_requeue_work(u132, ring, delta);
 318}
 319
 320static void u132_ring_cancel_work(struct u132 *u132, struct u132_ring *ring)
 321{
 322	if (cancel_delayed_work(&ring->scheduler))
 323		kref_put(&u132->kref, u132_hcd_delete);
 324}
 325
 326static void u132_endp_delete(struct kref *kref)
 327{
 328	struct u132_endp *endp = kref_to_u132_endp(kref);
 329	struct u132 *u132 = endp->u132;
 330	u8 usb_addr = endp->usb_addr;
 331	u8 usb_endp = endp->usb_endp;
 332	u8 address = u132->addr[usb_addr].address;
 333	struct u132_udev *udev = &u132->udev[address];
 334	u8 endp_number = endp->endp_number;
 335	struct usb_host_endpoint *hep = endp->hep;
 336	struct u132_ring *ring = endp->ring;
 337	struct list_head *head = &endp->endp_ring;
 338	ring->length -= 1;
 339	if (endp == ring->curr_endp) {
 340		if (list_empty(head)) {
 341			ring->curr_endp = NULL;
 342			list_del(head);
 343		} else {
 344			struct u132_endp *next_endp = list_entry(head->next,
 345				struct u132_endp, endp_ring);
 346			ring->curr_endp = next_endp;
 347			list_del(head);
 348		}
 349	} else
 350		list_del(head);
 351	if (endp->input) {
 352		udev->endp_number_in[usb_endp] = 0;
 353		u132_udev_put_kref(u132, udev);
 354	}
 355	if (endp->output) {
 356		udev->endp_number_out[usb_endp] = 0;
 357		u132_udev_put_kref(u132, udev);
 358	}
 359	u132->endp[endp_number - 1] = NULL;
 360	hep->hcpriv = NULL;
 361	kfree(endp);
 362	u132_u132_put_kref(u132);
 363}
 364
 365static inline void u132_endp_put_kref(struct u132 *u132, struct u132_endp *endp)
 366{
 367	kref_put(&endp->kref, u132_endp_delete);
 368}
 369
 370static inline void u132_endp_get_kref(struct u132 *u132, struct u132_endp *endp)
 371{
 372	kref_get(&endp->kref);
 373}
 374
 375static inline void u132_endp_init_kref(struct u132 *u132,
 376	struct u132_endp *endp)
 377{
 378	kref_init(&endp->kref);
 379	kref_get(&u132->kref);
 380}
 381
 382static void u132_endp_queue_work(struct u132 *u132, struct u132_endp *endp,
 383	unsigned int delta)
 384{
 385	if (queue_delayed_work(workqueue, &endp->scheduler, delta))
 386		kref_get(&endp->kref);
 387}
 388
 389static void u132_endp_cancel_work(struct u132 *u132, struct u132_endp *endp)
 390{
 391	if (cancel_delayed_work(&endp->scheduler))
 392		kref_put(&endp->kref, u132_endp_delete);
 393}
 394
 395static inline void u132_monitor_put_kref(struct u132 *u132)
 396{
 397	kref_put(&u132->kref, u132_hcd_delete);
 398}
 399
 400static void u132_monitor_queue_work(struct u132 *u132, unsigned int delta)
 401{
 402	if (queue_delayed_work(workqueue, &u132->monitor, delta))
 403		kref_get(&u132->kref);
 404}
 405
 406static void u132_monitor_requeue_work(struct u132 *u132, unsigned int delta)
 407{
 408	if (!queue_delayed_work(workqueue, &u132->monitor, delta))
 409		kref_put(&u132->kref, u132_hcd_delete);
 410}
 411
 412static void u132_monitor_cancel_work(struct u132 *u132)
 413{
 414	if (cancel_delayed_work(&u132->monitor))
 415		kref_put(&u132->kref, u132_hcd_delete);
 416}
 417
 418static int read_roothub_info(struct u132 *u132)
 419{
 420	u32 revision;
 421	int retval;
 422	retval = u132_read_pcimem(u132, revision, &revision);
 423	if (retval) {
 424		dev_err(&u132->platform_dev->dev, "error %d accessing device co"
 425			"ntrol\n", retval);
 426		return retval;
 427	} else if ((revision & 0xFF) == 0x10) {
 428	} else if ((revision & 0xFF) == 0x11) {
 429	} else {
 430		dev_err(&u132->platform_dev->dev, "device revision is not valid"
 431			" %08X\n", revision);
 432		return -ENODEV;
 433	}
 434	retval = u132_read_pcimem(u132, control, &u132->hc_control);
 435	if (retval) {
 436		dev_err(&u132->platform_dev->dev, "error %d accessing device co"
 437			"ntrol\n", retval);
 438		return retval;
 439	}
 440	retval = u132_read_pcimem(u132, roothub.status,
 441		&u132->hc_roothub_status);
 442	if (retval) {
 443		dev_err(&u132->platform_dev->dev, "error %d accessing device re"
 444			"g roothub.status\n", retval);
 445		return retval;
 446	}
 447	retval = u132_read_pcimem(u132, roothub.a, &u132->hc_roothub_a);
 448	if (retval) {
 449		dev_err(&u132->platform_dev->dev, "error %d accessing device re"
 450			"g roothub.a\n", retval);
 451		return retval;
 452	}
 453	{
 454		int I = u132->num_ports;
 455		int i = 0;
 456		while (I-- > 0) {
 457			retval = u132_read_pcimem(u132, roothub.portstatus[i],
 458				&u132->hc_roothub_portstatus[i]);
 459			if (retval) {
 460				dev_err(&u132->platform_dev->dev, "error %d acc"
 461					"essing device roothub.portstatus[%d]\n"
 462					, retval, i);
 463				return retval;
 464			} else
 465				i += 1;
 466		}
 467	}
 468	return 0;
 469}
 470
 471static void u132_hcd_monitor_work(struct work_struct *work)
 472{
 473	struct u132 *u132 = container_of(work, struct u132, monitor.work);
 474	if (u132->going > 1) {
 475		dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
 476			, u132->going);
 477		u132_monitor_put_kref(u132);
 478		return;
 479	} else if (u132->going > 0) {
 480		dev_err(&u132->platform_dev->dev, "device is being removed\n");
 481		u132_monitor_put_kref(u132);
 482		return;
 483	} else {
 484		int retval;
 485		mutex_lock(&u132->sw_lock);
 486		retval = read_roothub_info(u132);
 487		if (retval) {
 488			struct usb_hcd *hcd = u132_to_hcd(u132);
 489			u132_disable(u132);
 490			u132->going = 1;
 491			mutex_unlock(&u132->sw_lock);
 492			usb_hc_died(hcd);
 493			ftdi_elan_gone_away(u132->platform_dev);
 494			u132_monitor_put_kref(u132);
 495			return;
 496		} else {
 497			u132_monitor_requeue_work(u132, 500);
 498			mutex_unlock(&u132->sw_lock);
 499			return;
 500		}
 501	}
 502}
 503
 504static void u132_hcd_giveback_urb(struct u132 *u132, struct u132_endp *endp,
 505	struct urb *urb, int status)
 506{
 507	struct u132_ring *ring;
 508	unsigned long irqs;
 509	struct usb_hcd *hcd = u132_to_hcd(u132);
 510	urb->error_count = 0;
 511	spin_lock_irqsave(&endp->queue_lock.slock, irqs);
 512	usb_hcd_unlink_urb_from_ep(hcd, urb);
 513	endp->queue_next += 1;
 514	if (ENDP_QUEUE_SIZE > --endp->queue_size) {
 515		endp->active = 0;
 516		spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
 517	} else {
 518		struct list_head *next = endp->urb_more.next;
 519		struct u132_urbq *urbq = list_entry(next, struct u132_urbq,
 520			urb_more);
 521		list_del(next);
 522		endp->urb_list[ENDP_QUEUE_MASK & endp->queue_last++] =
 523			urbq->urb;
 524		endp->active = 0;
 525		spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
 526		kfree(urbq);
 527	}
 528	mutex_lock(&u132->scheduler_lock);
 529	ring = endp->ring;
 530	ring->in_use = 0;
 531	u132_ring_cancel_work(u132, ring);
 532	u132_ring_queue_work(u132, ring, 0);
 533	mutex_unlock(&u132->scheduler_lock);
 534	u132_endp_put_kref(u132, endp);
 535	usb_hcd_giveback_urb(hcd, urb, status);
 536}
 537
 538static void u132_hcd_forget_urb(struct u132 *u132, struct u132_endp *endp,
 539	struct urb *urb, int status)
 540{
 541	u132_endp_put_kref(u132, endp);
 542}
 543
 544static void u132_hcd_abandon_urb(struct u132 *u132, struct u132_endp *endp,
 545	struct urb *urb, int status)
 546{
 547	unsigned long irqs;
 548	struct usb_hcd *hcd = u132_to_hcd(u132);
 549	urb->error_count = 0;
 550	spin_lock_irqsave(&endp->queue_lock.slock, irqs);
 551	usb_hcd_unlink_urb_from_ep(hcd, urb);
 552	endp->queue_next += 1;
 553	if (ENDP_QUEUE_SIZE > --endp->queue_size) {
 554		endp->active = 0;
 555		spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
 556	} else {
 557		struct list_head *next = endp->urb_more.next;
 558		struct u132_urbq *urbq = list_entry(next, struct u132_urbq,
 559			urb_more);
 560		list_del(next);
 561		endp->urb_list[ENDP_QUEUE_MASK & endp->queue_last++] =
 562			urbq->urb;
 563		endp->active = 0;
 564		spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
 565		kfree(urbq);
 566	}
 567	usb_hcd_giveback_urb(hcd, urb, status);
 568}
 569
 570static inline int edset_input(struct u132 *u132, struct u132_ring *ring,
 571	struct u132_endp *endp, struct urb *urb, u8 address, u8 toggle_bits,
 572	void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,
 573	int toggle_bits, int error_count, int condition_code, int repeat_number,
 574	 int halted, int skipped, int actual, int non_null))
 575{
 576	return usb_ftdi_elan_edset_input(u132->platform_dev, ring->number, endp,
 577		 urb, address, endp->usb_endp, toggle_bits, callback);
 578}
 579
 580static inline int edset_setup(struct u132 *u132, struct u132_ring *ring,
 581	struct u132_endp *endp, struct urb *urb, u8 address, u8 toggle_bits,
 582	void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,
 583	int toggle_bits, int error_count, int condition_code, int repeat_number,
 584	 int halted, int skipped, int actual, int non_null))
 585{
 586	return usb_ftdi_elan_edset_setup(u132->platform_dev, ring->number, endp,
 587		 urb, address, endp->usb_endp, toggle_bits, callback);
 588}
 589
 590static inline int edset_single(struct u132 *u132, struct u132_ring *ring,
 591	struct u132_endp *endp, struct urb *urb, u8 address, u8 toggle_bits,
 592	void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,
 593	int toggle_bits, int error_count, int condition_code, int repeat_number,
 594	 int halted, int skipped, int actual, int non_null))
 595{
 596	return usb_ftdi_elan_edset_single(u132->platform_dev, ring->number,
 597		endp, urb, address, endp->usb_endp, toggle_bits, callback);
 598}
 599
 600static inline int edset_output(struct u132 *u132, struct u132_ring *ring,
 601	struct u132_endp *endp, struct urb *urb, u8 address, u8 toggle_bits,
 602	void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,
 603	int toggle_bits, int error_count, int condition_code, int repeat_number,
 604	 int halted, int skipped, int actual, int non_null))
 605{
 606	return usb_ftdi_elan_edset_output(u132->platform_dev, ring->number,
 607		endp, urb, address, endp->usb_endp, toggle_bits, callback);
 608}
 609
 610
 611/*
 612* must not LOCK sw_lock
 613*
 614*/
 615static void u132_hcd_interrupt_recv(void *data, struct urb *urb, u8 *buf,
 616	int len, int toggle_bits, int error_count, int condition_code,
 617	int repeat_number, int halted, int skipped, int actual, int non_null)
 618{
 619	struct u132_endp *endp = data;
 620	struct u132 *u132 = endp->u132;
 621	u8 address = u132->addr[endp->usb_addr].address;
 622	struct u132_udev *udev = &u132->udev[address];
 623	mutex_lock(&u132->scheduler_lock);
 624	if (u132->going > 1) {
 625		dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
 626			, u132->going);
 627		mutex_unlock(&u132->scheduler_lock);
 628		u132_hcd_forget_urb(u132, endp, urb, -ENODEV);
 629		return;
 630	} else if (endp->dequeueing) {
 631		endp->dequeueing = 0;
 632		mutex_unlock(&u132->scheduler_lock);
 633		u132_hcd_giveback_urb(u132, endp, urb, -EINTR);
 634		return;
 635	} else if (u132->going > 0) {
 636		dev_err(&u132->platform_dev->dev, "device is being removed "
 637				"urb=%p\n", urb);
 638		mutex_unlock(&u132->scheduler_lock);
 639		u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
 640		return;
 641	} else if (!urb->unlinked) {
 642		struct u132_ring *ring = endp->ring;
 643		u8 *u = urb->transfer_buffer + urb->actual_length;
 644		u8 *b = buf;
 645		int L = len;
 646
 647		while (L-- > 0)
 648			*u++ = *b++;
 649
 650		urb->actual_length += len;
 651		if ((condition_code == TD_CC_NOERROR) &&
 652			(urb->transfer_buffer_length > urb->actual_length)) {
 653			endp->toggle_bits = toggle_bits;
 654			usb_settoggle(udev->usb_device, endp->usb_endp, 0,
 655				1 & toggle_bits);
 656			if (urb->actual_length > 0) {
 657				int retval;
 658				mutex_unlock(&u132->scheduler_lock);
 659				retval = edset_single(u132, ring, endp, urb,
 660					address, endp->toggle_bits,
 661					u132_hcd_interrupt_recv);
 662				if (retval != 0)
 663					u132_hcd_giveback_urb(u132, endp, urb,
 664						retval);
 665			} else {
 666				ring->in_use = 0;
 667				endp->active = 0;
 668				endp->jiffies = jiffies +
 669					msecs_to_jiffies(urb->interval);
 670				u132_ring_cancel_work(u132, ring);
 671				u132_ring_queue_work(u132, ring, 0);
 672				mutex_unlock(&u132->scheduler_lock);
 673				u132_endp_put_kref(u132, endp);
 674			}
 675			return;
 676		} else if ((condition_code == TD_DATAUNDERRUN) &&
 677			((urb->transfer_flags & URB_SHORT_NOT_OK) == 0)) {
 678			endp->toggle_bits = toggle_bits;
 679			usb_settoggle(udev->usb_device, endp->usb_endp, 0,
 680				1 & toggle_bits);
 681			mutex_unlock(&u132->scheduler_lock);
 682			u132_hcd_giveback_urb(u132, endp, urb, 0);
 683			return;
 684		} else {
 685			if (condition_code == TD_CC_NOERROR) {
 686				endp->toggle_bits = toggle_bits;
 687				usb_settoggle(udev->usb_device, endp->usb_endp,
 688					0, 1 & toggle_bits);
 689			} else if (condition_code == TD_CC_STALL) {
 690				endp->toggle_bits = 0x2;
 691				usb_settoggle(udev->usb_device, endp->usb_endp,
 692					0, 0);
 693			} else {
 694				endp->toggle_bits = 0x2;
 695				usb_settoggle(udev->usb_device, endp->usb_endp,
 696					0, 0);
 697				dev_err(&u132->platform_dev->dev, "urb=%p givin"
 698					"g back INTERRUPT %s\n", urb,
 699					cc_to_text[condition_code]);
 700			}
 701			mutex_unlock(&u132->scheduler_lock);
 702			u132_hcd_giveback_urb(u132, endp, urb,
 703				cc_to_error[condition_code]);
 704			return;
 705		}
 706	} else {
 707		dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p "
 708				"unlinked=%d\n", urb, urb->unlinked);
 709		mutex_unlock(&u132->scheduler_lock);
 710		u132_hcd_giveback_urb(u132, endp, urb, 0);
 711		return;
 712	}
 713}
 714
 715static void u132_hcd_bulk_output_sent(void *data, struct urb *urb, u8 *buf,
 716	int len, int toggle_bits, int error_count, int condition_code,
 717	int repeat_number, int halted, int skipped, int actual, int non_null)
 718{
 719	struct u132_endp *endp = data;
 720	struct u132 *u132 = endp->u132;
 721	u8 address = u132->addr[endp->usb_addr].address;
 722	mutex_lock(&u132->scheduler_lock);
 723	if (u132->going > 1) {
 724		dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
 725			, u132->going);
 726		mutex_unlock(&u132->scheduler_lock);
 727		u132_hcd_forget_urb(u132, endp, urb, -ENODEV);
 728		return;
 729	} else if (endp->dequeueing) {
 730		endp->dequeueing = 0;
 731		mutex_unlock(&u132->scheduler_lock);
 732		u132_hcd_giveback_urb(u132, endp, urb, -EINTR);
 733		return;
 734	} else if (u132->going > 0) {
 735		dev_err(&u132->platform_dev->dev, "device is being removed "
 736				"urb=%p\n", urb);
 737		mutex_unlock(&u132->scheduler_lock);
 738		u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
 739		return;
 740	} else if (!urb->unlinked) {
 741		struct u132_ring *ring = endp->ring;
 742		urb->actual_length += len;
 743		endp->toggle_bits = toggle_bits;
 744		if (urb->transfer_buffer_length > urb->actual_length) {
 745			int retval;
 746			mutex_unlock(&u132->scheduler_lock);
 747			retval = edset_output(u132, ring, endp, urb, address,
 748				endp->toggle_bits, u132_hcd_bulk_output_sent);
 749			if (retval != 0)
 750				u132_hcd_giveback_urb(u132, endp, urb, retval);
 751			return;
 752		} else {
 753			mutex_unlock(&u132->scheduler_lock);
 754			u132_hcd_giveback_urb(u132, endp, urb, 0);
 755			return;
 756		}
 757	} else {
 758		dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p "
 759				"unlinked=%d\n", urb, urb->unlinked);
 760		mutex_unlock(&u132->scheduler_lock);
 761		u132_hcd_giveback_urb(u132, endp, urb, 0);
 762		return;
 763	}
 764}
 765
 766static void u132_hcd_bulk_input_recv(void *data, struct urb *urb, u8 *buf,
 767	int len, int toggle_bits, int error_count, int condition_code,
 768	int repeat_number, int halted, int skipped, int actual, int non_null)
 769{
 770	struct u132_endp *endp = data;
 771	struct u132 *u132 = endp->u132;
 772	u8 address = u132->addr[endp->usb_addr].address;
 773	struct u132_udev *udev = &u132->udev[address];
 774	mutex_lock(&u132->scheduler_lock);
 775	if (u132->going > 1) {
 776		dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
 777			, u132->going);
 778		mutex_unlock(&u132->scheduler_lock);
 779		u132_hcd_forget_urb(u132, endp, urb, -ENODEV);
 780		return;
 781	} else if (endp->dequeueing) {
 782		endp->dequeueing = 0;
 783		mutex_unlock(&u132->scheduler_lock);
 784		u132_hcd_giveback_urb(u132, endp, urb, -EINTR);
 785		return;
 786	} else if (u132->going > 0) {
 787		dev_err(&u132->platform_dev->dev, "device is being removed "
 788				"urb=%p\n", urb);
 789		mutex_unlock(&u132->scheduler_lock);
 790		u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
 791		return;
 792	} else if (!urb->unlinked) {
 793		struct u132_ring *ring = endp->ring;
 794		u8 *u = urb->transfer_buffer + urb->actual_length;
 795		u8 *b = buf;
 796		int L = len;
 797
 798		while (L-- > 0)
 799			*u++ = *b++;
 800
 801		urb->actual_length += len;
 802		if ((condition_code == TD_CC_NOERROR) &&
 803			(urb->transfer_buffer_length > urb->actual_length)) {
 804			int retval;
 805			endp->toggle_bits = toggle_bits;
 806			usb_settoggle(udev->usb_device, endp->usb_endp, 0,
 807				1 & toggle_bits);
 808			mutex_unlock(&u132->scheduler_lock);
 809			retval = usb_ftdi_elan_edset_input(u132->platform_dev,
 810				ring->number, endp, urb, address,
 811				endp->usb_endp, endp->toggle_bits,
 812				u132_hcd_bulk_input_recv);
 813			if (retval != 0)
 814				u132_hcd_giveback_urb(u132, endp, urb, retval);
 815			return;
 816		} else if (condition_code == TD_CC_NOERROR) {
 817			endp->toggle_bits = toggle_bits;
 818			usb_settoggle(udev->usb_device, endp->usb_endp, 0,
 819				1 & toggle_bits);
 820			mutex_unlock(&u132->scheduler_lock);
 821			u132_hcd_giveback_urb(u132, endp, urb,
 822				cc_to_error[condition_code]);
 823			return;
 824		} else if ((condition_code == TD_DATAUNDERRUN) &&
 825			((urb->transfer_flags & URB_SHORT_NOT_OK) == 0)) {
 826			endp->toggle_bits = toggle_bits;
 827			usb_settoggle(udev->usb_device, endp->usb_endp, 0,
 828				1 & toggle_bits);
 829			mutex_unlock(&u132->scheduler_lock);
 830			u132_hcd_giveback_urb(u132, endp, urb, 0);
 831			return;
 832		} else if (condition_code == TD_DATAUNDERRUN) {
 833			endp->toggle_bits = toggle_bits;
 834			usb_settoggle(udev->usb_device, endp->usb_endp, 0,
 835				1 & toggle_bits);
 836			dev_warn(&u132->platform_dev->dev, "urb=%p(SHORT NOT OK"
 837				") giving back BULK IN %s\n", urb,
 838				cc_to_text[condition_code]);
 839			mutex_unlock(&u132->scheduler_lock);
 840			u132_hcd_giveback_urb(u132, endp, urb, 0);
 841			return;
 842		} else if (condition_code == TD_CC_STALL) {
 843			endp->toggle_bits = 0x2;
 844			usb_settoggle(udev->usb_device, endp->usb_endp, 0, 0);
 845			mutex_unlock(&u132->scheduler_lock);
 846			u132_hcd_giveback_urb(u132, endp, urb,
 847				cc_to_error[condition_code]);
 848			return;
 849		} else {
 850			endp->toggle_bits = 0x2;
 851			usb_settoggle(udev->usb_device, endp->usb_endp, 0, 0);
 852			dev_err(&u132->platform_dev->dev, "urb=%p giving back B"
 853				"ULK IN code=%d %s\n", urb, condition_code,
 854				cc_to_text[condition_code]);
 855			mutex_unlock(&u132->scheduler_lock);
 856			u132_hcd_giveback_urb(u132, endp, urb,
 857				cc_to_error[condition_code]);
 858			return;
 859		}
 860	} else {
 861		dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p "
 862				"unlinked=%d\n", urb, urb->unlinked);
 863		mutex_unlock(&u132->scheduler_lock);
 864		u132_hcd_giveback_urb(u132, endp, urb, 0);
 865		return;
 866	}
 867}
 868
 869static void u132_hcd_configure_empty_sent(void *data, struct urb *urb, u8 *buf,
 870	int len, int toggle_bits, int error_count, int condition_code,
 871	int repeat_number, int halted, int skipped, int actual, int non_null)
 872{
 873	struct u132_endp *endp = data;
 874	struct u132 *u132 = endp->u132;
 875	mutex_lock(&u132->scheduler_lock);
 876	if (u132->going > 1) {
 877		dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
 878			, u132->going);
 879		mutex_unlock(&u132->scheduler_lock);
 880		u132_hcd_forget_urb(u132, endp, urb, -ENODEV);
 881		return;
 882	} else if (endp->dequeueing) {
 883		endp->dequeueing = 0;
 884		mutex_unlock(&u132->scheduler_lock);
 885		u132_hcd_giveback_urb(u132, endp, urb, -EINTR);
 886		return;
 887	} else if (u132->going > 0) {
 888		dev_err(&u132->platform_dev->dev, "device is being removed "
 889				"urb=%p\n", urb);
 890		mutex_unlock(&u132->scheduler_lock);
 891		u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
 892		return;
 893	} else if (!urb->unlinked) {
 894		mutex_unlock(&u132->scheduler_lock);
 895		u132_hcd_giveback_urb(u132, endp, urb, 0);
 896		return;
 897	} else {
 898		dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p "
 899				"unlinked=%d\n", urb, urb->unlinked);
 900		mutex_unlock(&u132->scheduler_lock);
 901		u132_hcd_giveback_urb(u132, endp, urb, 0);
 902		return;
 903	}
 904}
 905
 906static void u132_hcd_configure_input_recv(void *data, struct urb *urb, u8 *buf,
 907	int len, int toggle_bits, int error_count, int condition_code,
 908	int repeat_number, int halted, int skipped, int actual, int non_null)
 909{
 910	struct u132_endp *endp = data;
 911	struct u132 *u132 = endp->u132;
 912	u8 address = u132->addr[endp->usb_addr].address;
 913	mutex_lock(&u132->scheduler_lock);
 914	if (u132->going > 1) {
 915		dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
 916			, u132->going);
 917		mutex_unlock(&u132->scheduler_lock);
 918		u132_hcd_forget_urb(u132, endp, urb, -ENODEV);
 919		return;
 920	} else if (endp->dequeueing) {
 921		endp->dequeueing = 0;
 922		mutex_unlock(&u132->scheduler_lock);
 923		u132_hcd_giveback_urb(u132, endp, urb, -EINTR);
 924		return;
 925	} else if (u132->going > 0) {
 926		dev_err(&u132->platform_dev->dev, "device is being removed "
 927				"urb=%p\n", urb);
 928		mutex_unlock(&u132->scheduler_lock);
 929		u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
 930		return;
 931	} else if (!urb->unlinked) {
 932		struct u132_ring *ring = endp->ring;
 933		u8 *u = urb->transfer_buffer;
 934		u8 *b = buf;
 935		int L = len;
 936
 937		while (L-- > 0)
 938			*u++ = *b++;
 939
 940		urb->actual_length = len;
 941		if ((condition_code == TD_CC_NOERROR) || ((condition_code ==
 942			TD_DATAUNDERRUN) && ((urb->transfer_flags &
 943			URB_SHORT_NOT_OK) == 0))) {
 944			int retval;
 945			mutex_unlock(&u132->scheduler_lock);
 946			retval = usb_ftdi_elan_edset_empty(u132->platform_dev,
 947				ring->number, endp, urb, address,
 948				endp->usb_endp, 0x3,
 949				u132_hcd_configure_empty_sent);
 950			if (retval != 0)
 951				u132_hcd_giveback_urb(u132, endp, urb, retval);
 952			return;
 953		} else if (condition_code == TD_CC_STALL) {
 954			mutex_unlock(&u132->scheduler_lock);
 955			dev_warn(&u132->platform_dev->dev, "giving back SETUP I"
 956				"NPUT STALL urb %p\n", urb);
 957			u132_hcd_giveback_urb(u132, endp, urb,
 958				cc_to_error[condition_code]);
 959			return;
 960		} else {
 961			mutex_unlock(&u132->scheduler_lock);
 962			dev_err(&u132->platform_dev->dev, "giving back SETUP IN"
 963				"PUT %s urb %p\n", cc_to_text[condition_code],
 964				urb);
 965			u132_hcd_giveback_urb(u132, endp, urb,
 966				cc_to_error[condition_code]);
 967			return;
 968		}
 969	} else {
 970		dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p "
 971				"unlinked=%d\n", urb, urb->unlinked);
 972		mutex_unlock(&u132->scheduler_lock);
 973		u132_hcd_giveback_urb(u132, endp, urb, 0);
 974		return;
 975	}
 976}
 977
 978static void u132_hcd_configure_empty_recv(void *data, struct urb *urb, u8 *buf,
 979	int len, int toggle_bits, int error_count, int condition_code,
 980	int repeat_number, int halted, int skipped, int actual, int non_null)
 981{
 982	struct u132_endp *endp = data;
 983	struct u132 *u132 = endp->u132;
 984	mutex_lock(&u132->scheduler_lock);
 985	if (u132->going > 1) {
 986		dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
 987			, u132->going);
 988		mutex_unlock(&u132->scheduler_lock);
 989		u132_hcd_forget_urb(u132, endp, urb, -ENODEV);
 990		return;
 991	} else if (endp->dequeueing) {
 992		endp->dequeueing = 0;
 993		mutex_unlock(&u132->scheduler_lock);
 994		u132_hcd_giveback_urb(u132, endp, urb, -EINTR);
 995		return;
 996	} else if (u132->going > 0) {
 997		dev_err(&u132->platform_dev->dev, "device is being removed "
 998				"urb=%p\n", urb);
 999		mutex_unlock(&u132->scheduler_lock);
1000		u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
1001		return;
1002	} else if (!urb->unlinked) {
1003		mutex_unlock(&u132->scheduler_lock);
1004		u132_hcd_giveback_urb(u132, endp, urb, 0);
1005		return;
1006	} else {
1007		dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p "
1008				"unlinked=%d\n", urb, urb->unlinked);
1009		mutex_unlock(&u132->scheduler_lock);
1010		u132_hcd_giveback_urb(u132, endp, urb, 0);
1011		return;
1012	}
1013}
1014
1015static void u132_hcd_configure_setup_sent(void *data, struct urb *urb, u8 *buf,
1016	int len, int toggle_bits, int error_count, int condition_code,
1017	int repeat_number, int halted, int skipped, int actual, int non_null)
1018{
1019	struct u132_endp *endp = data;
1020	struct u132 *u132 = endp->u132;
1021	u8 address = u132->addr[endp->usb_addr].address;
1022	mutex_lock(&u132->scheduler_lock);
1023	if (u132->going > 1) {
1024		dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
1025			, u132->going);
1026		mutex_unlock(&u132->scheduler_lock);
1027		u132_hcd_forget_urb(u132, endp, urb, -ENODEV);
1028		return;
1029	} else if (endp->dequeueing) {
1030		endp->dequeueing = 0;
1031		mutex_unlock(&u132->scheduler_lock);
1032		u132_hcd_giveback_urb(u132, endp, urb, -EINTR);
1033		return;
1034	} else if (u132->going > 0) {
1035		dev_err(&u132->platform_dev->dev, "device is being removed "
1036				"urb=%p\n", urb);
1037		mutex_unlock(&u132->scheduler_lock);
1038		u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
1039		return;
1040	} else if (!urb->unlinked) {
1041		if (usb_pipein(urb->pipe)) {
1042			int retval;
1043			struct u132_ring *ring = endp->ring;
1044			mutex_unlock(&u132->scheduler_lock);
1045			retval = usb_ftdi_elan_edset_input(u132->platform_dev,
1046				ring->number, endp, urb, address,
1047				endp->usb_endp, 0,
1048				u132_hcd_configure_input_recv);
1049			if (retval != 0)
1050				u132_hcd_giveback_urb(u132, endp, urb, retval);
1051			return;
1052		} else {
1053			int retval;
1054			struct u132_ring *ring = endp->ring;
1055			mutex_unlock(&u132->scheduler_lock);
1056			retval = usb_ftdi_elan_edset_input(u132->platform_dev,
1057				ring->number, endp, urb, address,
1058				endp->usb_endp, 0,
1059				u132_hcd_configure_empty_recv);
1060			if (retval != 0)
1061				u132_hcd_giveback_urb(u132, endp, urb, retval);
1062			return;
1063		}
1064	} else {
1065		dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p "
1066				"unlinked=%d\n", urb, urb->unlinked);
1067		mutex_unlock(&u132->scheduler_lock);
1068		u132_hcd_giveback_urb(u132, endp, urb, 0);
1069		return;
1070	}
1071}
1072
1073static void u132_hcd_enumeration_empty_recv(void *data, struct urb *urb,
1074	u8 *buf, int len, int toggle_bits, int error_count, int condition_code,
1075	int repeat_number, int halted, int skipped, int actual, int non_null)
1076{
1077	struct u132_endp *endp = data;
1078	struct u132 *u132 = endp->u132;
1079	u8 address = u132->addr[endp->usb_addr].address;
1080	struct u132_udev *udev = &u132->udev[address];
1081	mutex_lock(&u132->scheduler_lock);
1082	if (u132->going > 1) {
1083		dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
1084			, u132->going);
1085		mutex_unlock(&u132->scheduler_lock);
1086		u132_hcd_forget_urb(u132, endp, urb, -ENODEV);
1087		return;
1088	} else if (endp->dequeueing) {
1089		endp->dequeueing = 0;
1090		mutex_unlock(&u132->scheduler_lock);
1091		u132_hcd_giveback_urb(u132, endp, urb, -EINTR);
1092		return;
1093	} else if (u132->going > 0) {
1094		dev_err(&u132->platform_dev->dev, "device is being removed "
1095				"urb=%p\n", urb);
1096		mutex_unlock(&u132->scheduler_lock);
1097		u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
1098		return;
1099	} else if (!urb->unlinked) {
1100		u132->addr[0].address = 0;
1101		endp->usb_addr = udev->usb_addr;
1102		mutex_unlock(&u132->scheduler_lock);
1103		u132_hcd_giveback_urb(u132, endp, urb, 0);
1104		return;
1105	} else {
1106		dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p "
1107				"unlinked=%d\n", urb, urb->unlinked);
1108		mutex_unlock(&u132->scheduler_lock);
1109		u132_hcd_giveback_urb(u132, endp, urb, 0);
1110		return;
1111	}
1112}
1113
1114static void u132_hcd_enumeration_address_sent(void *data, struct urb *urb,
1115	u8 *buf, int len, int toggle_bits, int error_count, int condition_code,
1116	int repeat_number, int halted, int skipped, int actual, int non_null)
1117{
1118	struct u132_endp *endp = data;
1119	struct u132 *u132 = endp->u132;
1120	mutex_lock(&u132->scheduler_lock);
1121	if (u132->going > 1) {
1122		dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
1123			, u132->going);
1124		mutex_unlock(&u132->scheduler_lock);
1125		u132_hcd_forget_urb(u132, endp, urb, -ENODEV);
1126		return;
1127	} else if (endp->dequeueing) {
1128		endp->dequeueing = 0;
1129		mutex_unlock(&u132->scheduler_lock);
1130		u132_hcd_giveback_urb(u132, endp, urb, -EINTR);
1131		return;
1132	} else if (u132->going > 0) {
1133		dev_err(&u132->platform_dev->dev, "device is being removed "
1134				"urb=%p\n", urb);
1135		mutex_unlock(&u132->scheduler_lock);
1136		u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
1137		return;
1138	} else if (!urb->unlinked) {
1139		int retval;
1140		struct u132_ring *ring = endp->ring;
1141		mutex_unlock(&u132->scheduler_lock);
1142		retval = usb_ftdi_elan_edset_input(u132->platform_dev,
1143			ring->number, endp, urb, 0, endp->usb_endp, 0,
1144			u132_hcd_enumeration_empty_recv);
1145		if (retval != 0)
1146			u132_hcd_giveback_urb(u132, endp, urb, retval);
1147		return;
1148	} else {
1149		dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p "
1150				"unlinked=%d\n", urb, urb->unlinked);
1151		mutex_unlock(&u132->scheduler_lock);
1152		u132_hcd_giveback_urb(u132, endp, urb, 0);
1153		return;
1154	}
1155}
1156
1157static void u132_hcd_initial_empty_sent(void *data, struct urb *urb, u8 *buf,
1158	int len, int toggle_bits, int error_count, int condition_code,
1159	int repeat_number, int halted, int skipped, int actual, int non_null)
1160{
1161	struct u132_endp *endp = data;
1162	struct u132 *u132 = endp->u132;
1163	mutex_lock(&u132->scheduler_lock);
1164	if (u132->going > 1) {
1165		dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
1166			, u132->going);
1167		mutex_unlock(&u132->scheduler_lock);
1168		u132_hcd_forget_urb(u132, endp, urb, -ENODEV);
1169		return;
1170	} else if (endp->dequeueing) {
1171		endp->dequeueing = 0;
1172		mutex_unlock(&u132->scheduler_lock);
1173		u132_hcd_giveback_urb(u132, endp, urb, -EINTR);
1174		return;
1175	} else if (u132->going > 0) {
1176		dev_err(&u132->platform_dev->dev, "device is being removed "
1177				"urb=%p\n", urb);
1178		mutex_unlock(&u132->scheduler_lock);
1179		u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
1180		return;
1181	} else if (!urb->unlinked) {
1182		mutex_unlock(&u132->scheduler_lock);
1183		u132_hcd_giveback_urb(u132, endp, urb, 0);
1184		return;
1185	} else {
1186		dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p "
1187				"unlinked=%d\n", urb, urb->unlinked);
1188		mutex_unlock(&u132->scheduler_lock);
1189		u132_hcd_giveback_urb(u132, endp, urb, 0);
1190		return;
1191	}
1192}
1193
1194static void u132_hcd_initial_input_recv(void *data, struct urb *urb, u8 *buf,
1195	int len, int toggle_bits, int error_count, int condition_code,
1196	int repeat_number, int halted, int skipped, int actual, int non_null)
1197{
1198	struct u132_endp *endp = data;
1199	struct u132 *u132 = endp->u132;
1200	u8 address = u132->addr[endp->usb_addr].address;
1201	mutex_lock(&u132->scheduler_lock);
1202	if (u132->going > 1) {
1203		dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
1204			, u132->going);
1205		mutex_unlock(&u132->scheduler_lock);
1206		u132_hcd_forget_urb(u132, endp, urb, -ENODEV);
1207		return;
1208	} else if (endp->dequeueing) {
1209		endp->dequeueing = 0;
1210		mutex_unlock(&u132->scheduler_lock);
1211		u132_hcd_giveback_urb(u132, endp, urb, -EINTR);
1212		return;
1213	} else if (u132->going > 0) {
1214		dev_err(&u132->platform_dev->dev, "device is being removed "
1215				"urb=%p\n", urb);
1216		mutex_unlock(&u132->scheduler_lock);
1217		u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
1218		return;
1219	} else if (!urb->unlinked) {
1220		int retval;
1221		struct u132_ring *ring = endp->ring;
1222		u8 *u = urb->transfer_buffer;
1223		u8 *b = buf;
1224		int L = len;
1225
1226		while (L-- > 0)
1227			*u++ = *b++;
1228
1229		urb->actual_length = len;
1230		mutex_unlock(&u132->scheduler_lock);
1231		retval = usb_ftdi_elan_edset_empty(u132->platform_dev,
1232			ring->number, endp, urb, address, endp->usb_endp, 0x3,
1233			u132_hcd_initial_empty_sent);
1234		if (retval != 0)
1235			u132_hcd_giveback_urb(u132, endp, urb, retval);
1236		return;
1237	} else {
1238		dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p "
1239				"unlinked=%d\n", urb, urb->unlinked);
1240		mutex_unlock(&u132->scheduler_lock);
1241		u132_hcd_giveback_urb(u132, endp, urb, 0);
1242		return;
1243	}
1244}
1245
1246static void u132_hcd_initial_setup_sent(void *data, struct urb *urb, u8 *buf,
1247	int len, int toggle_bits, int error_count, int condition_code,
1248	int repeat_number, int halted, int skipped, int actual, int non_null)
1249{
1250	struct u132_endp *endp = data;
1251	struct u132 *u132 = endp->u132;
1252	u8 address = u132->addr[endp->usb_addr].address;
1253	mutex_lock(&u132->scheduler_lock);
1254	if (u132->going > 1) {
1255		dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
1256			, u132->going);
1257		mutex_unlock(&u132->scheduler_lock);
1258		u132_hcd_forget_urb(u132, endp, urb, -ENODEV);
1259		return;
1260	} else if (endp->dequeueing) {
1261		endp->dequeueing = 0;
1262		mutex_unlock(&u132->scheduler_lock);
1263		u132_hcd_giveback_urb(u132, endp, urb, -EINTR);
1264		return;
1265	} else if (u132->going > 0) {
1266		dev_err(&u132->platform_dev->dev, "device is being removed "
1267				"urb=%p\n", urb);
1268		mutex_unlock(&u132->scheduler_lock);
1269		u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
1270		return;
1271	} else if (!urb->unlinked) {
1272		int retval;
1273		struct u132_ring *ring = endp->ring;
1274		mutex_unlock(&u132->scheduler_lock);
1275		retval = usb_ftdi_elan_edset_input(u132->platform_dev,
1276			ring->number, endp, urb, address, endp->usb_endp, 0,
1277			u132_hcd_initial_input_recv);
1278		if (retval != 0)
1279			u132_hcd_giveback_urb(u132, endp, urb, retval);
1280		return;
1281	} else {
1282		dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p "
1283				"unlinked=%d\n", urb, urb->unlinked);
1284		mutex_unlock(&u132->scheduler_lock);
1285		u132_hcd_giveback_urb(u132, endp, urb, 0);
1286		return;
1287	}
1288}
1289
1290/*
1291* this work function is only executed from the work queue
1292*
1293*/
1294static void u132_hcd_ring_work_scheduler(struct work_struct *work)
1295{
1296	struct u132_ring *ring =
1297		container_of(work, struct u132_ring, scheduler.work);
1298	struct u132 *u132 = ring->u132;
1299	mutex_lock(&u132->scheduler_lock);
1300	if (ring->in_use) {
1301		mutex_unlock(&u132->scheduler_lock);
1302		u132_ring_put_kref(u132, ring);
1303		return;
1304	} else if (ring->curr_endp) {
1305		struct u132_endp *endp, *last_endp = ring->curr_endp;
 
 
1306		unsigned long wakeup = 0;
1307		list_for_each_entry(endp, &last_endp->endp_ring, endp_ring) {
 
 
1308			if (endp->queue_next == endp->queue_last) {
1309			} else if ((endp->delayed == 0)
1310				|| time_after_eq(jiffies, endp->jiffies)) {
1311				ring->curr_endp = endp;
1312				u132_endp_cancel_work(u132, last_endp);
1313				u132_endp_queue_work(u132, last_endp, 0);
1314				mutex_unlock(&u132->scheduler_lock);
1315				u132_ring_put_kref(u132, ring);
1316				return;
1317			} else {
1318				unsigned long delta = endp->jiffies - jiffies;
1319				if (delta > wakeup)
1320					wakeup = delta;
1321			}
1322		}
1323		if (last_endp->queue_next == last_endp->queue_last) {
1324		} else if ((last_endp->delayed == 0) || time_after_eq(jiffies,
1325			last_endp->jiffies)) {
1326			u132_endp_cancel_work(u132, last_endp);
1327			u132_endp_queue_work(u132, last_endp, 0);
1328			mutex_unlock(&u132->scheduler_lock);
1329			u132_ring_put_kref(u132, ring);
1330			return;
1331		} else {
1332			unsigned long delta = last_endp->jiffies - jiffies;
1333			if (delta > wakeup)
1334				wakeup = delta;
1335		}
1336		if (wakeup > 0) {
1337			u132_ring_requeue_work(u132, ring, wakeup);
1338			mutex_unlock(&u132->scheduler_lock);
1339			return;
1340		} else {
1341			mutex_unlock(&u132->scheduler_lock);
1342			u132_ring_put_kref(u132, ring);
1343			return;
1344		}
1345	} else {
1346		mutex_unlock(&u132->scheduler_lock);
1347		u132_ring_put_kref(u132, ring);
1348		return;
1349	}
1350}
1351
1352static void u132_hcd_endp_work_scheduler(struct work_struct *work)
1353{
1354	struct u132_ring *ring;
1355	struct u132_endp *endp =
1356		container_of(work, struct u132_endp, scheduler.work);
1357	struct u132 *u132 = endp->u132;
1358	mutex_lock(&u132->scheduler_lock);
1359	ring = endp->ring;
1360	if (endp->edset_flush) {
1361		endp->edset_flush = 0;
1362		if (endp->dequeueing)
1363			usb_ftdi_elan_edset_flush(u132->platform_dev,
1364				ring->number, endp);
1365		mutex_unlock(&u132->scheduler_lock);
1366		u132_endp_put_kref(u132, endp);
1367		return;
1368	} else if (endp->active) {
1369		mutex_unlock(&u132->scheduler_lock);
1370		u132_endp_put_kref(u132, endp);
1371		return;
1372	} else if (ring->in_use) {
1373		mutex_unlock(&u132->scheduler_lock);
1374		u132_endp_put_kref(u132, endp);
1375		return;
1376	} else if (endp->queue_next == endp->queue_last) {
1377		mutex_unlock(&u132->scheduler_lock);
1378		u132_endp_put_kref(u132, endp);
1379		return;
1380	} else if (endp->pipetype == PIPE_INTERRUPT) {
1381		u8 address = u132->addr[endp->usb_addr].address;
1382		if (ring->in_use) {
1383			mutex_unlock(&u132->scheduler_lock);
1384			u132_endp_put_kref(u132, endp);
1385			return;
1386		} else {
1387			int retval;
1388			struct urb *urb = endp->urb_list[ENDP_QUEUE_MASK &
1389				endp->queue_next];
1390			endp->active = 1;
1391			ring->curr_endp = endp;
1392			ring->in_use = 1;
1393			mutex_unlock(&u132->scheduler_lock);
1394			retval = edset_single(u132, ring, endp, urb, address,
1395				endp->toggle_bits, u132_hcd_interrupt_recv);
1396			if (retval != 0)
1397				u132_hcd_giveback_urb(u132, endp, urb, retval);
1398			return;
1399		}
1400	} else if (endp->pipetype == PIPE_CONTROL) {
1401		u8 address = u132->addr[endp->usb_addr].address;
1402		if (ring->in_use) {
1403			mutex_unlock(&u132->scheduler_lock);
1404			u132_endp_put_kref(u132, endp);
1405			return;
1406		} else if (address == 0) {
1407			int retval;
1408			struct urb *urb = endp->urb_list[ENDP_QUEUE_MASK &
1409				endp->queue_next];
1410			endp->active = 1;
1411			ring->curr_endp = endp;
1412			ring->in_use = 1;
1413			mutex_unlock(&u132->scheduler_lock);
1414			retval = edset_setup(u132, ring, endp, urb, address,
1415				0x2, u132_hcd_initial_setup_sent);
1416			if (retval != 0)
1417				u132_hcd_giveback_urb(u132, endp, urb, retval);
1418			return;
1419		} else if (endp->usb_addr == 0) {
1420			int retval;
1421			struct urb *urb = endp->urb_list[ENDP_QUEUE_MASK &
1422				endp->queue_next];
1423			endp->active = 1;
1424			ring->curr_endp = endp;
1425			ring->in_use = 1;
1426			mutex_unlock(&u132->scheduler_lock);
1427			retval = edset_setup(u132, ring, endp, urb, 0, 0x2,
1428				u132_hcd_enumeration_address_sent);
1429			if (retval != 0)
1430				u132_hcd_giveback_urb(u132, endp, urb, retval);
1431			return;
1432		} else {
1433			int retval;
1434			struct urb *urb = endp->urb_list[ENDP_QUEUE_MASK &
1435				endp->queue_next];
1436			address = u132->addr[endp->usb_addr].address;
1437			endp->active = 1;
1438			ring->curr_endp = endp;
1439			ring->in_use = 1;
1440			mutex_unlock(&u132->scheduler_lock);
1441			retval = edset_setup(u132, ring, endp, urb, address,
1442				0x2, u132_hcd_configure_setup_sent);
1443			if (retval != 0)
1444				u132_hcd_giveback_urb(u132, endp, urb, retval);
1445			return;
1446		}
1447	} else {
1448		if (endp->input) {
1449			u8 address = u132->addr[endp->usb_addr].address;
1450			if (ring->in_use) {
1451				mutex_unlock(&u132->scheduler_lock);
1452				u132_endp_put_kref(u132, endp);
1453				return;
1454			} else {
1455				int retval;
1456				struct urb *urb = endp->urb_list[
1457					ENDP_QUEUE_MASK & endp->queue_next];
1458				endp->active = 1;
1459				ring->curr_endp = endp;
1460				ring->in_use = 1;
1461				mutex_unlock(&u132->scheduler_lock);
1462				retval = edset_input(u132, ring, endp, urb,
1463					address, endp->toggle_bits,
1464					u132_hcd_bulk_input_recv);
1465				if (retval == 0) {
1466				} else
1467					u132_hcd_giveback_urb(u132, endp, urb,
1468						retval);
1469				return;
1470			}
1471		} else {	/* output pipe */
1472			u8 address = u132->addr[endp->usb_addr].address;
1473			if (ring->in_use) {
1474				mutex_unlock(&u132->scheduler_lock);
1475				u132_endp_put_kref(u132, endp);
1476				return;
1477			} else {
1478				int retval;
1479				struct urb *urb = endp->urb_list[
1480					ENDP_QUEUE_MASK & endp->queue_next];
1481				endp->active = 1;
1482				ring->curr_endp = endp;
1483				ring->in_use = 1;
1484				mutex_unlock(&u132->scheduler_lock);
1485				retval = edset_output(u132, ring, endp, urb,
1486					address, endp->toggle_bits,
1487					u132_hcd_bulk_output_sent);
1488				if (retval == 0) {
1489				} else
1490					u132_hcd_giveback_urb(u132, endp, urb,
1491						retval);
1492				return;
1493			}
1494		}
1495	}
1496}
1497#ifdef CONFIG_PM
1498
1499static void port_power(struct u132 *u132, int pn, int is_on)
1500{
1501	u132->port[pn].power = is_on;
1502}
1503
1504#endif
1505
1506static void u132_power(struct u132 *u132, int is_on)
1507{
1508	struct usb_hcd *hcd = u132_to_hcd(u132)
1509		;	/* hub is inactive unless the port is powered */
1510	if (is_on) {
1511		if (u132->power)
1512			return;
1513		u132->power = 1;
1514	} else {
1515		u132->power = 0;
1516		hcd->state = HC_STATE_HALT;
1517	}
1518}
1519
1520static int u132_periodic_reinit(struct u132 *u132)
1521{
1522	int retval;
1523	u32 fi = u132->hc_fminterval & 0x03fff;
1524	u32 fit;
1525	u32 fminterval;
1526	retval = u132_read_pcimem(u132, fminterval, &fminterval);
1527	if (retval)
1528		return retval;
1529	fit = fminterval & FIT;
1530	retval = u132_write_pcimem(u132, fminterval,
1531		(fit ^ FIT) | u132->hc_fminterval);
1532	if (retval)
1533		return retval;
1534	return u132_write_pcimem(u132, periodicstart,
1535	       ((9 * fi) / 10) & 0x3fff);
 
 
 
1536}
1537
1538static char *hcfs2string(int state)
1539{
1540	switch (state) {
1541	case OHCI_USB_RESET:
1542		return "reset";
1543	case OHCI_USB_RESUME:
1544		return "resume";
1545	case OHCI_USB_OPER:
1546		return "operational";
1547	case OHCI_USB_SUSPEND:
1548		return "suspend";
1549	}
1550	return "?";
1551}
1552
1553static int u132_init(struct u132 *u132)
1554{
1555	int retval;
1556	u32 control;
1557	u132_disable(u132);
1558	u132->next_statechange = jiffies;
1559	retval = u132_write_pcimem(u132, intrdisable, OHCI_INTR_MIE);
1560	if (retval)
1561		return retval;
1562	retval = u132_read_pcimem(u132, control, &control);
1563	if (retval)
1564		return retval;
1565	if (u132->num_ports == 0) {
1566		u32 rh_a = -1;
1567		retval = u132_read_pcimem(u132, roothub.a, &rh_a);
1568		if (retval)
1569			return retval;
1570		u132->num_ports = rh_a & RH_A_NDP;
1571		retval = read_roothub_info(u132);
1572		if (retval)
1573			return retval;
1574	}
1575	if (u132->num_ports > MAX_U132_PORTS)
1576		return -EINVAL;
1577
1578	return 0;
1579}
1580
1581
1582/* Start an OHCI controller, set the BUS operational
1583* resets USB and controller
1584* enable interrupts
1585*/
1586static int u132_run(struct u132 *u132)
1587{
1588	int retval;
1589	u32 control;
1590	u32 status;
1591	u32 fminterval;
1592	u32 periodicstart;
1593	u32 cmdstatus;
1594	u32 roothub_a;
1595	int mask = OHCI_INTR_INIT;
1596	int first = u132->hc_fminterval == 0;
1597	int sleep_time = 0;
1598	int reset_timeout = 30;	/* ... allow extra time */
1599	u132_disable(u132);
1600	if (first) {
1601		u32 temp;
1602		retval = u132_read_pcimem(u132, fminterval, &temp);
1603		if (retval)
1604			return retval;
1605		u132->hc_fminterval = temp & 0x3fff;
1606		u132->hc_fminterval |= FSMP(u132->hc_fminterval) << 16;
1607	}
1608	retval = u132_read_pcimem(u132, control, &u132->hc_control);
1609	if (retval)
1610		return retval;
1611	dev_info(&u132->platform_dev->dev, "resetting from state '%s', control "
1612		"= %08X\n", hcfs2string(u132->hc_control & OHCI_CTRL_HCFS),
1613		u132->hc_control);
1614	switch (u132->hc_control & OHCI_CTRL_HCFS) {
1615	case OHCI_USB_OPER:
1616		sleep_time = 0;
1617		break;
1618	case OHCI_USB_SUSPEND:
1619	case OHCI_USB_RESUME:
1620		u132->hc_control &= OHCI_CTRL_RWC;
1621		u132->hc_control |= OHCI_USB_RESUME;
1622		sleep_time = 10;
1623		break;
1624	default:
1625		u132->hc_control &= OHCI_CTRL_RWC;
1626		u132->hc_control |= OHCI_USB_RESET;
1627		sleep_time = 50;
1628		break;
1629	}
1630	retval = u132_write_pcimem(u132, control, u132->hc_control);
1631	if (retval)
1632		return retval;
1633	retval = u132_read_pcimem(u132, control, &control);
1634	if (retval)
1635		return retval;
1636	msleep(sleep_time);
1637	retval = u132_read_pcimem(u132, roothub.a, &roothub_a);
1638	if (retval)
1639		return retval;
1640	if (!(roothub_a & RH_A_NPS)) {
1641		int temp;	/* power down each port */
1642		for (temp = 0; temp < u132->num_ports; temp++) {
1643			retval = u132_write_pcimem(u132,
1644				roothub.portstatus[temp], RH_PS_LSDA);
1645			if (retval)
1646				return retval;
1647		}
1648	}
1649	retval = u132_read_pcimem(u132, control, &control);
1650	if (retval)
1651		return retval;
1652retry:
1653	retval = u132_read_pcimem(u132, cmdstatus, &status);
1654	if (retval)
1655		return retval;
1656	retval = u132_write_pcimem(u132, cmdstatus, OHCI_HCR);
1657	if (retval)
1658		return retval;
1659extra:	{
1660		retval = u132_read_pcimem(u132, cmdstatus, &status);
1661		if (retval)
1662			return retval;
1663		if (0 != (status & OHCI_HCR)) {
1664			if (--reset_timeout == 0) {
1665				dev_err(&u132->platform_dev->dev, "USB HC reset"
1666					" timed out!\n");
1667				return -ENODEV;
1668			} else {
1669				msleep(5);
1670				goto extra;
1671			}
1672		}
1673	}
1674	if (u132->flags & OHCI_QUIRK_INITRESET) {
1675		retval = u132_write_pcimem(u132, control, u132->hc_control);
1676		if (retval)
1677			return retval;
1678		retval = u132_read_pcimem(u132, control, &control);
1679		if (retval)
1680			return retval;
1681	}
1682	retval = u132_write_pcimem(u132, ed_controlhead, 0x00000000);
1683	if (retval)
1684		return retval;
1685	retval = u132_write_pcimem(u132, ed_bulkhead, 0x11000000);
1686	if (retval)
1687		return retval;
1688	retval = u132_write_pcimem(u132, hcca, 0x00000000);
1689	if (retval)
1690		return retval;
1691	retval = u132_periodic_reinit(u132);
1692	if (retval)
1693		return retval;
1694	retval = u132_read_pcimem(u132, fminterval, &fminterval);
1695	if (retval)
1696		return retval;
1697	retval = u132_read_pcimem(u132, periodicstart, &periodicstart);
1698	if (retval)
1699		return retval;
1700	if (0 == (fminterval & 0x3fff0000) || 0 == periodicstart) {
1701		if (!(u132->flags & OHCI_QUIRK_INITRESET)) {
1702			u132->flags |= OHCI_QUIRK_INITRESET;
1703			goto retry;
1704		} else
1705			dev_err(&u132->platform_dev->dev, "init err(%08x %04x)"
1706				"\n", fminterval, periodicstart);
1707	}			/* start controller operations */
1708	u132->hc_control &= OHCI_CTRL_RWC;
1709	u132->hc_control |= OHCI_CONTROL_INIT | OHCI_CTRL_BLE | OHCI_USB_OPER;
1710	retval = u132_write_pcimem(u132, control, u132->hc_control);
1711	if (retval)
1712		return retval;
1713	retval = u132_write_pcimem(u132, cmdstatus, OHCI_BLF);
1714	if (retval)
1715		return retval;
1716	retval = u132_read_pcimem(u132, cmdstatus, &cmdstatus);
1717	if (retval)
1718		return retval;
1719	retval = u132_read_pcimem(u132, control, &control);
1720	if (retval)
1721		return retval;
1722	u132_to_hcd(u132)->state = HC_STATE_RUNNING;
1723	retval = u132_write_pcimem(u132, roothub.status, RH_HS_DRWE);
1724	if (retval)
1725		return retval;
1726	retval = u132_write_pcimem(u132, intrstatus, mask);
1727	if (retval)
1728		return retval;
1729	retval = u132_write_pcimem(u132, intrdisable,
1730		OHCI_INTR_MIE | OHCI_INTR_OC | OHCI_INTR_RHSC | OHCI_INTR_FNO |
1731		OHCI_INTR_UE | OHCI_INTR_RD | OHCI_INTR_SF | OHCI_INTR_WDH |
1732		OHCI_INTR_SO);
1733	if (retval)
1734		return retval;	/* handle root hub init quirks ... */
1735	retval = u132_read_pcimem(u132, roothub.a, &roothub_a);
1736	if (retval)
1737		return retval;
1738	roothub_a &= ~(RH_A_PSM | RH_A_OCPM);
1739	if (u132->flags & OHCI_QUIRK_SUPERIO) {
1740		roothub_a |= RH_A_NOCP;
1741		roothub_a &= ~(RH_A_POTPGT | RH_A_NPS);
1742		retval = u132_write_pcimem(u132, roothub.a, roothub_a);
1743		if (retval)
1744			return retval;
1745	} else if ((u132->flags & OHCI_QUIRK_AMD756) || distrust_firmware) {
1746		roothub_a |= RH_A_NPS;
1747		retval = u132_write_pcimem(u132, roothub.a, roothub_a);
1748		if (retval)
1749			return retval;
1750	}
1751	retval = u132_write_pcimem(u132, roothub.status, RH_HS_LPSC);
1752	if (retval)
1753		return retval;
1754	retval = u132_write_pcimem(u132, roothub.b,
1755		(roothub_a & RH_A_NPS) ? 0 : RH_B_PPCM);
1756	if (retval)
1757		return retval;
1758	retval = u132_read_pcimem(u132, control, &control);
1759	if (retval)
1760		return retval;
1761	mdelay((roothub_a >> 23) & 0x1fe);
1762	u132_to_hcd(u132)->state = HC_STATE_RUNNING;
1763	return 0;
1764}
1765
1766static void u132_hcd_stop(struct usb_hcd *hcd)
1767{
1768	struct u132 *u132 = hcd_to_u132(hcd);
1769	if (u132->going > 1) {
1770		dev_err(&u132->platform_dev->dev, "u132 device %p(hcd=%p) has b"
1771			"een removed %d\n", u132, hcd, u132->going);
1772	} else if (u132->going > 0) {
1773		dev_err(&u132->platform_dev->dev, "device hcd=%p is being remov"
1774			"ed\n", hcd);
1775	} else {
1776		mutex_lock(&u132->sw_lock);
1777		msleep(100);
1778		u132_power(u132, 0);
1779		mutex_unlock(&u132->sw_lock);
1780	}
1781}
1782
1783static int u132_hcd_start(struct usb_hcd *hcd)
1784{
1785	struct u132 *u132 = hcd_to_u132(hcd);
1786	if (u132->going > 1) {
1787		dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
1788			, u132->going);
1789		return -ENODEV;
1790	} else if (u132->going > 0) {
1791		dev_err(&u132->platform_dev->dev, "device is being removed\n");
1792		return -ESHUTDOWN;
1793	} else if (hcd->self.controller) {
1794		int retval;
1795		struct platform_device *pdev =
1796			to_platform_device(hcd->self.controller);
1797		u16 vendor = ((struct u132_platform_data *)
1798			dev_get_platdata(&pdev->dev))->vendor;
1799		u16 device = ((struct u132_platform_data *)
1800			dev_get_platdata(&pdev->dev))->device;
1801		mutex_lock(&u132->sw_lock);
1802		msleep(10);
1803		if (vendor == PCI_VENDOR_ID_AMD && device == 0x740c) {
1804			u132->flags = OHCI_QUIRK_AMD756;
1805		} else if (vendor == PCI_VENDOR_ID_OPTI && device == 0xc861) {
1806			dev_err(&u132->platform_dev->dev, "WARNING: OPTi workar"
1807				"ounds unavailable\n");
1808		} else if (vendor == PCI_VENDOR_ID_COMPAQ && device == 0xa0f8)
1809			u132->flags |= OHCI_QUIRK_ZFMICRO;
1810		retval = u132_run(u132);
1811		if (retval) {
1812			u132_disable(u132);
1813			u132->going = 1;
1814		}
1815		msleep(100);
1816		mutex_unlock(&u132->sw_lock);
1817		return retval;
1818	} else {
1819		dev_err(&u132->platform_dev->dev, "platform_device missing\n");
1820		return -ENODEV;
1821	}
1822}
1823
1824static int u132_hcd_reset(struct usb_hcd *hcd)
1825{
1826	struct u132 *u132 = hcd_to_u132(hcd);
1827	if (u132->going > 1) {
1828		dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
1829			, u132->going);
1830		return -ENODEV;
1831	} else if (u132->going > 0) {
1832		dev_err(&u132->platform_dev->dev, "device is being removed\n");
1833		return -ESHUTDOWN;
1834	} else {
1835		int retval;
1836		mutex_lock(&u132->sw_lock);
1837		retval = u132_init(u132);
1838		if (retval) {
1839			u132_disable(u132);
1840			u132->going = 1;
1841		}
1842		mutex_unlock(&u132->sw_lock);
1843		return retval;
1844	}
1845}
1846
1847static int create_endpoint_and_queue_int(struct u132 *u132,
1848	struct u132_udev *udev, struct urb *urb,
1849	struct usb_device *usb_dev, u8 usb_addr, u8 usb_endp, u8 address,
1850	gfp_t mem_flags)
1851{
1852	struct u132_ring *ring;
1853	unsigned long irqs;
1854	int rc;
1855	u8 endp_number;
1856	struct u132_endp *endp = kmalloc(sizeof(struct u132_endp), mem_flags);
1857
1858	if (!endp)
1859		return -ENOMEM;
1860
1861	spin_lock_init(&endp->queue_lock.slock);
1862	spin_lock_irqsave(&endp->queue_lock.slock, irqs);
1863	rc = usb_hcd_link_urb_to_ep(u132_to_hcd(u132), urb);
1864	if (rc) {
1865		spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
1866		kfree(endp);
1867		return rc;
1868	}
1869
1870	endp_number = ++u132->num_endpoints;
1871	urb->ep->hcpriv = u132->endp[endp_number - 1] = endp;
1872	INIT_DELAYED_WORK(&endp->scheduler, u132_hcd_endp_work_scheduler);
1873	INIT_LIST_HEAD(&endp->urb_more);
1874	ring = endp->ring = &u132->ring[0];
1875	if (ring->curr_endp) {
1876		list_add_tail(&endp->endp_ring, &ring->curr_endp->endp_ring);
1877	} else {
1878		INIT_LIST_HEAD(&endp->endp_ring);
1879		ring->curr_endp = endp;
1880	}
1881	ring->length += 1;
1882	endp->dequeueing = 0;
1883	endp->edset_flush = 0;
1884	endp->active = 0;
1885	endp->delayed = 0;
1886	endp->endp_number = endp_number;
1887	endp->u132 = u132;
1888	endp->hep = urb->ep;
1889	endp->pipetype = usb_pipetype(urb->pipe);
1890	u132_endp_init_kref(u132, endp);
1891	if (usb_pipein(urb->pipe)) {
1892		endp->toggle_bits = 0x2;
1893		usb_settoggle(udev->usb_device, usb_endp, 0, 0);
1894		endp->input = 1;
1895		endp->output = 0;
1896		udev->endp_number_in[usb_endp] = endp_number;
1897		u132_udev_get_kref(u132, udev);
1898	} else {
1899		endp->toggle_bits = 0x2;
1900		usb_settoggle(udev->usb_device, usb_endp, 1, 0);
1901		endp->input = 0;
1902		endp->output = 1;
1903		udev->endp_number_out[usb_endp] = endp_number;
1904		u132_udev_get_kref(u132, udev);
1905	}
1906	urb->hcpriv = u132;
1907	endp->delayed = 1;
1908	endp->jiffies = jiffies + msecs_to_jiffies(urb->interval);
1909	endp->udev_number = address;
1910	endp->usb_addr = usb_addr;
1911	endp->usb_endp = usb_endp;
1912	endp->queue_size = 1;
1913	endp->queue_last = 0;
1914	endp->queue_next = 0;
1915	endp->urb_list[ENDP_QUEUE_MASK & endp->queue_last++] = urb;
1916	spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
1917	u132_endp_queue_work(u132, endp, msecs_to_jiffies(urb->interval));
1918	return 0;
1919}
1920
1921static int queue_int_on_old_endpoint(struct u132 *u132,
1922	struct u132_udev *udev, struct urb *urb,
1923	struct usb_device *usb_dev, struct u132_endp *endp, u8 usb_addr,
1924	u8 usb_endp, u8 address)
1925{
1926	urb->hcpriv = u132;
1927	endp->delayed = 1;
1928	endp->jiffies = jiffies + msecs_to_jiffies(urb->interval);
1929	if (endp->queue_size++ < ENDP_QUEUE_SIZE) {
1930		endp->urb_list[ENDP_QUEUE_MASK & endp->queue_last++] = urb;
1931	} else {
1932		struct u132_urbq *urbq = kmalloc(sizeof(struct u132_urbq),
1933			GFP_ATOMIC);
1934		if (urbq == NULL) {
1935			endp->queue_size -= 1;
1936			return -ENOMEM;
1937		} else {
1938			list_add_tail(&urbq->urb_more, &endp->urb_more);
1939			urbq->urb = urb;
1940		}
1941	}
1942	return 0;
1943}
1944
1945static int create_endpoint_and_queue_bulk(struct u132 *u132,
1946	struct u132_udev *udev, struct urb *urb,
1947	struct usb_device *usb_dev, u8 usb_addr, u8 usb_endp, u8 address,
1948	gfp_t mem_flags)
1949{
1950	int ring_number;
1951	struct u132_ring *ring;
1952	unsigned long irqs;
1953	int rc;
1954	u8 endp_number;
1955	struct u132_endp *endp = kmalloc(sizeof(struct u132_endp), mem_flags);
1956
1957	if (!endp)
1958		return -ENOMEM;
1959
1960	spin_lock_init(&endp->queue_lock.slock);
1961	spin_lock_irqsave(&endp->queue_lock.slock, irqs);
1962	rc = usb_hcd_link_urb_to_ep(u132_to_hcd(u132), urb);
1963	if (rc) {
1964		spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
1965		kfree(endp);
1966		return rc;
1967	}
1968
1969	endp_number = ++u132->num_endpoints;
1970	urb->ep->hcpriv = u132->endp[endp_number - 1] = endp;
1971	INIT_DELAYED_WORK(&endp->scheduler, u132_hcd_endp_work_scheduler);
1972	INIT_LIST_HEAD(&endp->urb_more);
1973	endp->dequeueing = 0;
1974	endp->edset_flush = 0;
1975	endp->active = 0;
1976	endp->delayed = 0;
1977	endp->endp_number = endp_number;
1978	endp->u132 = u132;
1979	endp->hep = urb->ep;
1980	endp->pipetype = usb_pipetype(urb->pipe);
1981	u132_endp_init_kref(u132, endp);
1982	if (usb_pipein(urb->pipe)) {
1983		endp->toggle_bits = 0x2;
1984		usb_settoggle(udev->usb_device, usb_endp, 0, 0);
1985		ring_number = 3;
1986		endp->input = 1;
1987		endp->output = 0;
1988		udev->endp_number_in[usb_endp] = endp_number;
1989		u132_udev_get_kref(u132, udev);
1990	} else {
1991		endp->toggle_bits = 0x2;
1992		usb_settoggle(udev->usb_device, usb_endp, 1, 0);
1993		ring_number = 2;
1994		endp->input = 0;
1995		endp->output = 1;
1996		udev->endp_number_out[usb_endp] = endp_number;
1997		u132_udev_get_kref(u132, udev);
1998	}
1999	ring = endp->ring = &u132->ring[ring_number - 1];
2000	if (ring->curr_endp) {
2001		list_add_tail(&endp->endp_ring, &ring->curr_endp->endp_ring);
2002	} else {
2003		INIT_LIST_HEAD(&endp->endp_ring);
2004		ring->curr_endp = endp;
2005	}
2006	ring->length += 1;
2007	urb->hcpriv = u132;
2008	endp->udev_number = address;
2009	endp->usb_addr = usb_addr;
2010	endp->usb_endp = usb_endp;
2011	endp->queue_size = 1;
2012	endp->queue_last = 0;
2013	endp->queue_next = 0;
2014	endp->urb_list[ENDP_QUEUE_MASK & endp->queue_last++] = urb;
2015	spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
2016	u132_endp_queue_work(u132, endp, 0);
2017	return 0;
2018}
2019
2020static int queue_bulk_on_old_endpoint(struct u132 *u132, struct u132_udev *udev,
2021	struct urb *urb,
2022	struct usb_device *usb_dev, struct u132_endp *endp, u8 usb_addr,
2023	u8 usb_endp, u8 address)
2024{
2025	urb->hcpriv = u132;
2026	if (endp->queue_size++ < ENDP_QUEUE_SIZE) {
2027		endp->urb_list[ENDP_QUEUE_MASK & endp->queue_last++] = urb;
2028	} else {
2029		struct u132_urbq *urbq = kmalloc(sizeof(struct u132_urbq),
2030			GFP_ATOMIC);
2031		if (urbq == NULL) {
2032			endp->queue_size -= 1;
2033			return -ENOMEM;
2034		} else {
2035			list_add_tail(&urbq->urb_more, &endp->urb_more);
2036			urbq->urb = urb;
2037		}
2038	}
2039	return 0;
2040}
2041
2042static int create_endpoint_and_queue_control(struct u132 *u132,
2043	struct urb *urb,
2044	struct usb_device *usb_dev, u8 usb_addr, u8 usb_endp,
2045	gfp_t mem_flags)
2046{
2047	struct u132_ring *ring;
2048	unsigned long irqs;
2049	int rc;
2050	u8 endp_number;
2051	struct u132_endp *endp = kmalloc(sizeof(struct u132_endp), mem_flags);
2052
2053	if (!endp)
2054		return -ENOMEM;
2055
2056	spin_lock_init(&endp->queue_lock.slock);
2057	spin_lock_irqsave(&endp->queue_lock.slock, irqs);
2058	rc = usb_hcd_link_urb_to_ep(u132_to_hcd(u132), urb);
2059	if (rc) {
2060		spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
2061		kfree(endp);
2062		return rc;
2063	}
2064
2065	endp_number = ++u132->num_endpoints;
2066	urb->ep->hcpriv = u132->endp[endp_number - 1] = endp;
2067	INIT_DELAYED_WORK(&endp->scheduler, u132_hcd_endp_work_scheduler);
2068	INIT_LIST_HEAD(&endp->urb_more);
2069	ring = endp->ring = &u132->ring[0];
2070	if (ring->curr_endp) {
2071		list_add_tail(&endp->endp_ring, &ring->curr_endp->endp_ring);
2072	} else {
2073		INIT_LIST_HEAD(&endp->endp_ring);
2074		ring->curr_endp = endp;
2075	}
2076	ring->length += 1;
2077	endp->dequeueing = 0;
2078	endp->edset_flush = 0;
2079	endp->active = 0;
2080	endp->delayed = 0;
2081	endp->endp_number = endp_number;
2082	endp->u132 = u132;
2083	endp->hep = urb->ep;
2084	u132_endp_init_kref(u132, endp);
2085	u132_endp_get_kref(u132, endp);
2086	if (usb_addr == 0) {
2087		u8 address = u132->addr[usb_addr].address;
2088		struct u132_udev *udev = &u132->udev[address];
2089		endp->udev_number = address;
2090		endp->usb_addr = usb_addr;
2091		endp->usb_endp = usb_endp;
2092		endp->input = 1;
2093		endp->output = 1;
2094		endp->pipetype = usb_pipetype(urb->pipe);
2095		u132_udev_init_kref(u132, udev);
2096		u132_udev_get_kref(u132, udev);
2097		udev->endp_number_in[usb_endp] = endp_number;
2098		udev->endp_number_out[usb_endp] = endp_number;
2099		urb->hcpriv = u132;
2100		endp->queue_size = 1;
2101		endp->queue_last = 0;
2102		endp->queue_next = 0;
2103		endp->urb_list[ENDP_QUEUE_MASK & endp->queue_last++] = urb;
2104		spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
2105		u132_endp_queue_work(u132, endp, 0);
2106		return 0;
2107	} else {		/*(usb_addr > 0) */
2108		u8 address = u132->addr[usb_addr].address;
2109		struct u132_udev *udev = &u132->udev[address];
2110		endp->udev_number = address;
2111		endp->usb_addr = usb_addr;
2112		endp->usb_endp = usb_endp;
2113		endp->input = 1;
2114		endp->output = 1;
2115		endp->pipetype = usb_pipetype(urb->pipe);
2116		u132_udev_get_kref(u132, udev);
2117		udev->enumeration = 2;
2118		udev->endp_number_in[usb_endp] = endp_number;
2119		udev->endp_number_out[usb_endp] = endp_number;
2120		urb->hcpriv = u132;
2121		endp->queue_size = 1;
2122		endp->queue_last = 0;
2123		endp->queue_next = 0;
2124		endp->urb_list[ENDP_QUEUE_MASK & endp->queue_last++] = urb;
2125		spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
2126		u132_endp_queue_work(u132, endp, 0);
2127		return 0;
2128	}
2129}
2130
2131static int queue_control_on_old_endpoint(struct u132 *u132,
2132	struct urb *urb,
2133	struct usb_device *usb_dev, struct u132_endp *endp, u8 usb_addr,
2134	u8 usb_endp)
2135{
2136	if (usb_addr == 0) {
2137		if (usb_pipein(urb->pipe)) {
2138			urb->hcpriv = u132;
2139			if (endp->queue_size++ < ENDP_QUEUE_SIZE) {
2140				endp->urb_list[ENDP_QUEUE_MASK &
2141					endp->queue_last++] = urb;
2142			} else {
2143				struct u132_urbq *urbq =
2144					kmalloc(sizeof(struct u132_urbq),
2145					GFP_ATOMIC);
2146				if (urbq == NULL) {
2147					endp->queue_size -= 1;
2148					return -ENOMEM;
2149				} else {
2150					list_add_tail(&urbq->urb_more,
2151						&endp->urb_more);
2152					urbq->urb = urb;
2153				}
2154			}
2155			return 0;
2156		} else {	/* usb_pipeout(urb->pipe) */
2157			struct u132_addr *addr = &u132->addr[usb_dev->devnum];
2158			int I = MAX_U132_UDEVS;
2159			int i = 0;
2160			while (--I > 0) {
2161				struct u132_udev *udev = &u132->udev[++i];
2162				if (udev->usb_device) {
2163					continue;
2164				} else {
2165					udev->enumeration = 1;
2166					u132->addr[0].address = i;
2167					endp->udev_number = i;
2168					udev->udev_number = i;
2169					udev->usb_addr = usb_dev->devnum;
2170					u132_udev_init_kref(u132, udev);
2171					udev->endp_number_in[usb_endp] =
2172						endp->endp_number;
2173					u132_udev_get_kref(u132, udev);
2174					udev->endp_number_out[usb_endp] =
2175						endp->endp_number;
2176					udev->usb_device = usb_dev;
2177					((u8 *) (urb->setup_packet))[2] =
2178						addr->address = i;
2179					u132_udev_get_kref(u132, udev);
2180					break;
2181				}
2182			}
2183			if (I == 0) {
2184				dev_err(&u132->platform_dev->dev, "run out of d"
2185					"evice space\n");
2186				return -EINVAL;
2187			}
2188			urb->hcpriv = u132;
2189			if (endp->queue_size++ < ENDP_QUEUE_SIZE) {
2190				endp->urb_list[ENDP_QUEUE_MASK &
2191					endp->queue_last++] = urb;
2192			} else {
2193				struct u132_urbq *urbq =
2194					kmalloc(sizeof(struct u132_urbq),
2195					GFP_ATOMIC);
2196				if (urbq == NULL) {
2197					endp->queue_size -= 1;
2198					return -ENOMEM;
2199				} else {
2200					list_add_tail(&urbq->urb_more,
2201						&endp->urb_more);
2202					urbq->urb = urb;
2203				}
2204			}
2205			return 0;
2206		}
2207	} else {		/*(usb_addr > 0) */
2208		u8 address = u132->addr[usb_addr].address;
2209		struct u132_udev *udev = &u132->udev[address];
2210		urb->hcpriv = u132;
2211		if (udev->enumeration != 2)
2212			udev->enumeration = 2;
2213		if (endp->queue_size++ < ENDP_QUEUE_SIZE) {
2214			endp->urb_list[ENDP_QUEUE_MASK & endp->queue_last++] =
2215				urb;
2216		} else {
2217			struct u132_urbq *urbq =
2218				kmalloc(sizeof(struct u132_urbq), GFP_ATOMIC);
2219			if (urbq == NULL) {
2220				endp->queue_size -= 1;
2221				return -ENOMEM;
2222			} else {
2223				list_add_tail(&urbq->urb_more, &endp->urb_more);
2224				urbq->urb = urb;
2225			}
2226		}
2227		return 0;
2228	}
2229}
2230
2231static int u132_urb_enqueue(struct usb_hcd *hcd, struct urb *urb,
2232		gfp_t mem_flags)
2233{
2234	struct u132 *u132 = hcd_to_u132(hcd);
2235	if (irqs_disabled()) {
2236		if (gfpflags_allow_blocking(mem_flags)) {
2237			printk(KERN_ERR "invalid context for function that might sleep\n");
 
2238			return -EINVAL;
2239		}
2240	}
2241	if (u132->going > 1) {
2242		dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
2243			, u132->going);
2244		return -ENODEV;
2245	} else if (u132->going > 0) {
2246		dev_err(&u132->platform_dev->dev, "device is being removed "
2247				"urb=%p\n", urb);
2248		return -ESHUTDOWN;
2249	} else {
2250		u8 usb_addr = usb_pipedevice(urb->pipe);
2251		u8 usb_endp = usb_pipeendpoint(urb->pipe);
2252		struct usb_device *usb_dev = urb->dev;
2253		if (usb_pipetype(urb->pipe) == PIPE_INTERRUPT) {
2254			u8 address = u132->addr[usb_addr].address;
2255			struct u132_udev *udev = &u132->udev[address];
2256			struct u132_endp *endp = urb->ep->hcpriv;
2257			urb->actual_length = 0;
2258			if (endp) {
2259				unsigned long irqs;
2260				int retval;
2261				spin_lock_irqsave(&endp->queue_lock.slock,
2262					irqs);
2263				retval = usb_hcd_link_urb_to_ep(hcd, urb);
2264				if (retval == 0) {
2265					retval = queue_int_on_old_endpoint(
2266							u132, udev, urb,
2267							usb_dev, endp,
2268							usb_addr, usb_endp,
2269							address);
2270					if (retval)
2271						usb_hcd_unlink_urb_from_ep(
2272	hcd, urb);
2273				}
2274				spin_unlock_irqrestore(&endp->queue_lock.slock,
2275					irqs);
2276				if (retval) {
2277					return retval;
2278				} else {
2279					u132_endp_queue_work(u132, endp,
2280						msecs_to_jiffies(urb->interval))
2281						;
2282					return 0;
2283				}
2284			} else if (u132->num_endpoints == MAX_U132_ENDPS) {
2285				return -EINVAL;
2286			} else {	/*(endp == NULL) */
2287				return create_endpoint_and_queue_int(u132, udev,
2288						urb, usb_dev, usb_addr,
2289						usb_endp, address, mem_flags);
2290			}
2291		} else if (usb_pipetype(urb->pipe) == PIPE_ISOCHRONOUS) {
2292			dev_err(&u132->platform_dev->dev, "the hardware does no"
2293				"t support PIPE_ISOCHRONOUS\n");
2294			return -EINVAL;
2295		} else if (usb_pipetype(urb->pipe) == PIPE_BULK) {
2296			u8 address = u132->addr[usb_addr].address;
2297			struct u132_udev *udev = &u132->udev[address];
2298			struct u132_endp *endp = urb->ep->hcpriv;
2299			urb->actual_length = 0;
2300			if (endp) {
2301				unsigned long irqs;
2302				int retval;
2303				spin_lock_irqsave(&endp->queue_lock.slock,
2304					irqs);
2305				retval = usb_hcd_link_urb_to_ep(hcd, urb);
2306				if (retval == 0) {
2307					retval = queue_bulk_on_old_endpoint(
2308							u132, udev, urb,
2309							usb_dev, endp,
2310							usb_addr, usb_endp,
2311							address);
2312					if (retval)
2313						usb_hcd_unlink_urb_from_ep(
2314	hcd, urb);
2315				}
2316				spin_unlock_irqrestore(&endp->queue_lock.slock,
2317					irqs);
2318				if (retval) {
2319					return retval;
2320				} else {
2321					u132_endp_queue_work(u132, endp, 0);
2322					return 0;
2323				}
2324			} else if (u132->num_endpoints == MAX_U132_ENDPS) {
2325				return -EINVAL;
2326			} else
2327				return create_endpoint_and_queue_bulk(u132,
2328					udev, urb, usb_dev, usb_addr,
2329					usb_endp, address, mem_flags);
2330		} else {
2331			struct u132_endp *endp = urb->ep->hcpriv;
2332			u16 urb_size = 8;
2333			u8 *b = urb->setup_packet;
2334			int i = 0;
2335			char data[30 * 3 + 4];
2336			char *d = data;
2337			int m = (sizeof(data) - 1) / 3;
2338			int l = 0;
2339			data[0] = 0;
2340			while (urb_size-- > 0) {
2341				if (i > m) {
2342				} else if (i++ < m) {
2343					int w = sprintf(d, " %02X", *b++);
2344					d += w;
2345					l += w;
2346				} else
2347					d += sprintf(d, " ..");
2348			}
2349			if (endp) {
2350				unsigned long irqs;
2351				int retval;
2352				spin_lock_irqsave(&endp->queue_lock.slock,
2353					irqs);
2354				retval = usb_hcd_link_urb_to_ep(hcd, urb);
2355				if (retval == 0) {
2356					retval = queue_control_on_old_endpoint(
2357							u132, urb, usb_dev,
2358							endp, usb_addr,
2359							usb_endp);
2360					if (retval)
2361						usb_hcd_unlink_urb_from_ep(
2362								hcd, urb);
2363				}
2364				spin_unlock_irqrestore(&endp->queue_lock.slock,
2365					irqs);
2366				if (retval) {
2367					return retval;
2368				} else {
2369					u132_endp_queue_work(u132, endp, 0);
2370					return 0;
2371				}
2372			} else if (u132->num_endpoints == MAX_U132_ENDPS) {
2373				return -EINVAL;
2374			} else
2375				return create_endpoint_and_queue_control(u132,
2376					urb, usb_dev, usb_addr, usb_endp,
2377					mem_flags);
2378		}
2379	}
2380}
2381
2382static int dequeue_from_overflow_chain(struct u132 *u132,
2383	struct u132_endp *endp, struct urb *urb)
2384{
2385	struct u132_urbq *urbq;
2386
2387	list_for_each_entry(urbq, &endp->urb_more, urb_more) {
 
 
2388		if (urbq->urb == urb) {
2389			struct usb_hcd *hcd = u132_to_hcd(u132);
2390			list_del(&urbq->urb_more);
2391			endp->queue_size -= 1;
2392			urb->error_count = 0;
2393			usb_hcd_giveback_urb(hcd, urb, 0);
2394			return 0;
2395		}
 
2396	}
2397	dev_err(&u132->platform_dev->dev, "urb=%p not found in endp[%d]=%p ring"
2398		"[%d] %c%c usb_endp=%d usb_addr=%d size=%d next=%04X last=%04X"
2399		"\n", urb, endp->endp_number, endp, endp->ring->number,
2400		endp->input ? 'I' : ' ', endp->output ? 'O' : ' ',
2401		endp->usb_endp, endp->usb_addr, endp->queue_size,
2402		endp->queue_next, endp->queue_last);
2403	return -EINVAL;
2404}
2405
2406static int u132_endp_urb_dequeue(struct u132 *u132, struct u132_endp *endp,
2407		struct urb *urb, int status)
2408{
2409	unsigned long irqs;
2410	int rc;
2411
2412	spin_lock_irqsave(&endp->queue_lock.slock, irqs);
2413	rc = usb_hcd_check_unlink_urb(u132_to_hcd(u132), urb, status);
2414	if (rc) {
2415		spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
2416		return rc;
2417	}
2418	if (endp->queue_size == 0) {
2419		dev_err(&u132->platform_dev->dev, "urb=%p not found in endp[%d]"
2420			"=%p ring[%d] %c%c usb_endp=%d usb_addr=%d\n", urb,
2421			endp->endp_number, endp, endp->ring->number,
2422			endp->input ? 'I' : ' ', endp->output ? 'O' : ' ',
2423			endp->usb_endp, endp->usb_addr);
2424		spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
2425		return -EINVAL;
2426	}
2427	if (urb == endp->urb_list[ENDP_QUEUE_MASK & endp->queue_next]) {
2428		if (endp->active) {
2429			endp->dequeueing = 1;
2430			endp->edset_flush = 1;
2431			u132_endp_queue_work(u132, endp, 0);
2432			spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
2433			return 0;
2434		} else {
2435			spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
2436			u132_hcd_abandon_urb(u132, endp, urb, status);
2437			return 0;
2438		}
2439	} else {
2440		u16 queue_list = 0;
2441		u16 queue_size = endp->queue_size;
2442		u16 queue_scan = endp->queue_next;
2443		struct urb **urb_slot = NULL;
2444		while (++queue_list < ENDP_QUEUE_SIZE && --queue_size > 0) {
2445			if (urb == endp->urb_list[ENDP_QUEUE_MASK &
2446				++queue_scan]) {
2447				urb_slot = &endp->urb_list[ENDP_QUEUE_MASK &
2448					queue_scan];
2449				break;
2450			}
 
2451		}
2452		while (++queue_list < ENDP_QUEUE_SIZE && --queue_size > 0) {
2453			*urb_slot = endp->urb_list[ENDP_QUEUE_MASK &
2454				++queue_scan];
2455			urb_slot = &endp->urb_list[ENDP_QUEUE_MASK &
2456				queue_scan];
2457		}
2458		if (urb_slot) {
2459			struct usb_hcd *hcd = u132_to_hcd(u132);
2460
2461			usb_hcd_unlink_urb_from_ep(hcd, urb);
2462			endp->queue_size -= 1;
2463			if (list_empty(&endp->urb_more)) {
2464				spin_unlock_irqrestore(&endp->queue_lock.slock,
2465					irqs);
2466			} else {
2467				struct list_head *next = endp->urb_more.next;
2468				struct u132_urbq *urbq = list_entry(next,
2469					struct u132_urbq, urb_more);
2470				list_del(next);
2471				*urb_slot = urbq->urb;
2472				spin_unlock_irqrestore(&endp->queue_lock.slock,
2473					irqs);
2474				kfree(urbq);
2475			}
2476			urb->error_count = 0;
2477			usb_hcd_giveback_urb(hcd, urb, status);
2478			return 0;
2479		} else if (list_empty(&endp->urb_more)) {
2480			dev_err(&u132->platform_dev->dev, "urb=%p not found in "
2481				"endp[%d]=%p ring[%d] %c%c usb_endp=%d usb_addr"
2482				"=%d size=%d next=%04X last=%04X\n", urb,
2483				endp->endp_number, endp, endp->ring->number,
2484				endp->input ? 'I' : ' ',
2485				endp->output ? 'O' : ' ', endp->usb_endp,
2486				endp->usb_addr, endp->queue_size,
2487				endp->queue_next, endp->queue_last);
2488			spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
2489			return -EINVAL;
2490		} else {
2491			int retval;
2492
2493			usb_hcd_unlink_urb_from_ep(u132_to_hcd(u132), urb);
2494			retval = dequeue_from_overflow_chain(u132, endp,
2495				urb);
2496			spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
2497			return retval;
2498		}
2499	}
2500}
2501
2502static int u132_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status)
2503{
2504	struct u132 *u132 = hcd_to_u132(hcd);
2505	if (u132->going > 2) {
2506		dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
2507			, u132->going);
2508		return -ENODEV;
2509	} else {
2510		u8 usb_addr = usb_pipedevice(urb->pipe);
2511		u8 usb_endp = usb_pipeendpoint(urb->pipe);
2512		u8 address = u132->addr[usb_addr].address;
2513		struct u132_udev *udev = &u132->udev[address];
2514		if (usb_pipein(urb->pipe)) {
2515			u8 endp_number = udev->endp_number_in[usb_endp];
2516			struct u132_endp *endp = u132->endp[endp_number - 1];
2517			return u132_endp_urb_dequeue(u132, endp, urb, status);
2518		} else {
2519			u8 endp_number = udev->endp_number_out[usb_endp];
2520			struct u132_endp *endp = u132->endp[endp_number - 1];
2521			return u132_endp_urb_dequeue(u132, endp, urb, status);
2522		}
2523	}
2524}
2525
2526static void u132_endpoint_disable(struct usb_hcd *hcd,
2527	struct usb_host_endpoint *hep)
2528{
2529	struct u132 *u132 = hcd_to_u132(hcd);
2530	if (u132->going > 2) {
2531		dev_err(&u132->platform_dev->dev, "u132 device %p(hcd=%p hep=%p"
2532			") has been removed %d\n", u132, hcd, hep,
2533			u132->going);
2534	} else {
2535		struct u132_endp *endp = hep->hcpriv;
2536		if (endp)
2537			u132_endp_put_kref(u132, endp);
2538	}
2539}
2540
2541static int u132_get_frame(struct usb_hcd *hcd)
2542{
2543	struct u132 *u132 = hcd_to_u132(hcd);
2544	if (u132->going > 1) {
2545		dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
2546			, u132->going);
2547		return -ENODEV;
2548	} else if (u132->going > 0) {
2549		dev_err(&u132->platform_dev->dev, "device is being removed\n");
2550		return -ESHUTDOWN;
2551	} else {
 
2552		dev_err(&u132->platform_dev->dev, "TODO: u132_get_frame\n");
2553		mdelay(100);
2554		return 0;
2555	}
2556}
2557
2558static int u132_roothub_descriptor(struct u132 *u132,
2559	struct usb_hub_descriptor *desc)
2560{
2561	int retval;
2562	u16 temp;
2563	u32 rh_a = -1;
2564	u32 rh_b = -1;
2565	retval = u132_read_pcimem(u132, roothub.a, &rh_a);
2566	if (retval)
2567		return retval;
2568	desc->bDescriptorType = USB_DT_HUB;
2569	desc->bPwrOn2PwrGood = (rh_a & RH_A_POTPGT) >> 24;
2570	desc->bHubContrCurrent = 0;
2571	desc->bNbrPorts = u132->num_ports;
2572	temp = 1 + (u132->num_ports / 8);
2573	desc->bDescLength = 7 + 2 * temp;
2574	temp = HUB_CHAR_COMMON_LPSM | HUB_CHAR_COMMON_OCPM;
2575	if (rh_a & RH_A_NPS)
2576		temp |= HUB_CHAR_NO_LPSM;
2577	if (rh_a & RH_A_PSM)
2578		temp |= HUB_CHAR_INDV_PORT_LPSM;
2579	if (rh_a & RH_A_NOCP)
2580		temp |= HUB_CHAR_NO_OCPM;
2581	else if (rh_a & RH_A_OCPM)
2582		temp |= HUB_CHAR_INDV_PORT_OCPM;
2583	desc->wHubCharacteristics = cpu_to_le16(temp);
2584	retval = u132_read_pcimem(u132, roothub.b, &rh_b);
2585	if (retval)
2586		return retval;
2587	memset(desc->u.hs.DeviceRemovable, 0xff,
2588			sizeof(desc->u.hs.DeviceRemovable));
2589	desc->u.hs.DeviceRemovable[0] = rh_b & RH_B_DR;
2590	if (u132->num_ports > 7) {
2591		desc->u.hs.DeviceRemovable[1] = (rh_b & RH_B_DR) >> 8;
2592		desc->u.hs.DeviceRemovable[2] = 0xff;
2593	} else
2594		desc->u.hs.DeviceRemovable[1] = 0xff;
2595	return 0;
2596}
2597
2598static int u132_roothub_status(struct u132 *u132, __le32 *desc)
2599{
2600	u32 rh_status = -1;
2601	int ret_status = u132_read_pcimem(u132, roothub.status, &rh_status);
2602	*desc = cpu_to_le32(rh_status);
2603	return ret_status;
2604}
2605
2606static int u132_roothub_portstatus(struct u132 *u132, __le32 *desc, u16 wIndex)
2607{
2608	if (wIndex == 0 || wIndex > u132->num_ports) {
2609		return -EINVAL;
2610	} else {
2611		int port = wIndex - 1;
2612		u32 rh_portstatus = -1;
2613		int ret_portstatus = u132_read_pcimem(u132,
2614			roothub.portstatus[port], &rh_portstatus);
2615		*desc = cpu_to_le32(rh_portstatus);
2616		if (*(u16 *) (desc + 2)) {
2617			dev_info(&u132->platform_dev->dev, "Port %d Status Chan"
2618				"ge = %08X\n", port, *desc);
2619		}
2620		return ret_portstatus;
2621	}
2622}
2623
2624
2625/* this timer value might be vendor-specific ... */
2626#define PORT_RESET_HW_MSEC 10
2627#define PORT_RESET_MSEC 10
2628/* wrap-aware logic morphed from <linux/jiffies.h> */
2629#define tick_before(t1, t2) ((s16)(((s16)(t1))-((s16)(t2))) < 0)
2630static int u132_roothub_portreset(struct u132 *u132, int port_index)
2631{
2632	int retval;
2633	u32 fmnumber;
2634	u16 now;
2635	u16 reset_done;
2636	retval = u132_read_pcimem(u132, fmnumber, &fmnumber);
2637	if (retval)
2638		return retval;
2639	now = fmnumber;
2640	reset_done = now + PORT_RESET_MSEC;
2641	do {
2642		u32 portstat;
2643		do {
2644			retval = u132_read_pcimem(u132,
2645				roothub.portstatus[port_index], &portstat);
2646			if (retval)
2647				return retval;
2648			if (RH_PS_PRS & portstat)
2649				continue;
2650			else
2651				break;
2652		} while (tick_before(now, reset_done));
2653		if (RH_PS_PRS & portstat)
2654			return -ENODEV;
2655		if (RH_PS_CCS & portstat) {
2656			if (RH_PS_PRSC & portstat) {
2657				retval = u132_write_pcimem(u132,
2658					roothub.portstatus[port_index],
2659					RH_PS_PRSC);
2660				if (retval)
2661					return retval;
2662			}
2663		} else
2664			break;	/* start the next reset,
2665				sleep till it's probably done */
2666		retval = u132_write_pcimem(u132, roothub.portstatus[port_index],
2667			 RH_PS_PRS);
2668		if (retval)
2669			return retval;
2670		msleep(PORT_RESET_HW_MSEC);
2671		retval = u132_read_pcimem(u132, fmnumber, &fmnumber);
2672		if (retval)
2673			return retval;
2674		now = fmnumber;
2675	} while (tick_before(now, reset_done));
2676	return 0;
2677}
2678
2679static int u132_roothub_setportfeature(struct u132 *u132, u16 wValue,
2680	u16 wIndex)
2681{
2682	if (wIndex == 0 || wIndex > u132->num_ports) {
2683		return -EINVAL;
2684	} else {
 
2685		int port_index = wIndex - 1;
2686		struct u132_port *port = &u132->port[port_index];
2687		port->Status &= ~(1 << wValue);
2688		switch (wValue) {
2689		case USB_PORT_FEAT_SUSPEND:
2690			return u132_write_pcimem(u132,
2691			       roothub.portstatus[port_index], RH_PS_PSS);
 
 
 
2692		case USB_PORT_FEAT_POWER:
2693			return u132_write_pcimem(u132,
2694			       roothub.portstatus[port_index], RH_PS_PPS);
 
 
 
2695		case USB_PORT_FEAT_RESET:
2696			return u132_roothub_portreset(u132, port_index);
 
 
 
2697		default:
2698			return -EPIPE;
2699		}
2700	}
2701}
2702
2703static int u132_roothub_clearportfeature(struct u132 *u132, u16 wValue,
2704	u16 wIndex)
2705{
2706	if (wIndex == 0 || wIndex > u132->num_ports) {
2707		return -EINVAL;
2708	} else {
2709		int port_index = wIndex - 1;
2710		u32 temp;
 
2711		struct u132_port *port = &u132->port[port_index];
2712		port->Status &= ~(1 << wValue);
2713		switch (wValue) {
2714		case USB_PORT_FEAT_ENABLE:
2715			temp = RH_PS_CCS;
2716			break;
2717		case USB_PORT_FEAT_C_ENABLE:
2718			temp = RH_PS_PESC;
2719			break;
2720		case USB_PORT_FEAT_SUSPEND:
2721			temp = RH_PS_POCI;
2722			if ((u132->hc_control & OHCI_CTRL_HCFS)
2723				!= OHCI_USB_OPER) {
2724				dev_err(&u132->platform_dev->dev, "TODO resume_"
2725					"root_hub\n");
2726			}
2727			break;
2728		case USB_PORT_FEAT_C_SUSPEND:
2729			temp = RH_PS_PSSC;
2730			break;
2731		case USB_PORT_FEAT_POWER:
2732			temp = RH_PS_LSDA;
2733			break;
2734		case USB_PORT_FEAT_C_CONNECTION:
2735			temp = RH_PS_CSC;
2736			break;
2737		case USB_PORT_FEAT_C_OVER_CURRENT:
2738			temp = RH_PS_OCIC;
2739			break;
2740		case USB_PORT_FEAT_C_RESET:
2741			temp = RH_PS_PRSC;
2742			break;
2743		default:
2744			return -EPIPE;
2745		}
2746		return u132_write_pcimem(u132, roothub.portstatus[port_index],
2747		       temp);
 
 
 
2748	}
2749}
2750
2751
2752/* the virtual root hub timer IRQ checks for hub status*/
2753static int u132_hub_status_data(struct usb_hcd *hcd, char *buf)
2754{
2755	struct u132 *u132 = hcd_to_u132(hcd);
2756	if (u132->going > 1) {
2757		dev_err(&u132->platform_dev->dev, "device hcd=%p has been remov"
2758			"ed %d\n", hcd, u132->going);
2759		return -ENODEV;
2760	} else if (u132->going > 0) {
2761		dev_err(&u132->platform_dev->dev, "device hcd=%p is being remov"
2762			"ed\n", hcd);
2763		return -ESHUTDOWN;
2764	} else {
2765		int i, changed = 0, length = 1;
2766		if (u132->flags & OHCI_QUIRK_AMD756) {
2767			if ((u132->hc_roothub_a & RH_A_NDP) > MAX_ROOT_PORTS) {
2768				dev_err(&u132->platform_dev->dev, "bogus NDP, r"
2769					"ereads as NDP=%d\n",
2770					u132->hc_roothub_a & RH_A_NDP);
2771				goto done;
2772			}
2773		}
2774		if (u132->hc_roothub_status & (RH_HS_LPSC | RH_HS_OCIC))
2775			buf[0] = changed = 1;
2776		else
2777			buf[0] = 0;
2778		if (u132->num_ports > 7) {
2779			buf[1] = 0;
2780			length++;
2781		}
2782		for (i = 0; i < u132->num_ports; i++) {
2783			if (u132->hc_roothub_portstatus[i] & (RH_PS_CSC |
2784				RH_PS_PESC | RH_PS_PSSC | RH_PS_OCIC |
2785				RH_PS_PRSC)) {
2786				changed = 1;
2787				if (i < 7)
2788					buf[0] |= 1 << (i + 1);
2789				else
2790					buf[1] |= 1 << (i - 7);
2791				continue;
2792			}
2793			if (!(u132->hc_roothub_portstatus[i] & RH_PS_CCS))
2794				continue;
2795
2796			if ((u132->hc_roothub_portstatus[i] & RH_PS_PSS))
2797				continue;
2798		}
2799done:
2800		return changed ? length : 0;
2801	}
2802}
2803
2804static int u132_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
2805	u16 wIndex, char *buf, u16 wLength)
2806{
2807	struct u132 *u132 = hcd_to_u132(hcd);
2808	if (u132->going > 1) {
2809		dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
2810			, u132->going);
2811		return -ENODEV;
2812	} else if (u132->going > 0) {
2813		dev_err(&u132->platform_dev->dev, "device is being removed\n");
2814		return -ESHUTDOWN;
2815	} else {
2816		int retval = 0;
2817		mutex_lock(&u132->sw_lock);
2818		switch (typeReq) {
2819		case ClearHubFeature:
2820			switch (wValue) {
2821			case C_HUB_OVER_CURRENT:
2822			case C_HUB_LOCAL_POWER:
2823				break;
2824			default:
2825				goto stall;
2826			}
2827			break;
2828		case SetHubFeature:
2829			switch (wValue) {
2830			case C_HUB_OVER_CURRENT:
2831			case C_HUB_LOCAL_POWER:
2832				break;
2833			default:
2834				goto stall;
2835			}
2836			break;
2837		case ClearPortFeature:{
2838				retval = u132_roothub_clearportfeature(u132,
2839					wValue, wIndex);
2840				if (retval)
2841					goto error;
2842				break;
2843			}
2844		case GetHubDescriptor:{
2845				retval = u132_roothub_descriptor(u132,
2846					(struct usb_hub_descriptor *)buf);
2847				if (retval)
2848					goto error;
2849				break;
2850			}
2851		case GetHubStatus:{
2852				retval = u132_roothub_status(u132,
2853					(__le32 *) buf);
2854				if (retval)
2855					goto error;
2856				break;
2857			}
2858		case GetPortStatus:{
2859				retval = u132_roothub_portstatus(u132,
2860					(__le32 *) buf, wIndex);
2861				if (retval)
2862					goto error;
2863				break;
2864			}
2865		case SetPortFeature:{
2866				retval = u132_roothub_setportfeature(u132,
2867					wValue, wIndex);
2868				if (retval)
2869					goto error;
2870				break;
2871			}
2872		default:
2873			goto stall;
2874		error:
2875			u132_disable(u132);
2876			u132->going = 1;
2877			break;
2878		stall:
2879			retval = -EPIPE;
2880			break;
2881		}
2882		mutex_unlock(&u132->sw_lock);
2883		return retval;
2884	}
2885}
2886
2887static int u132_start_port_reset(struct usb_hcd *hcd, unsigned port_num)
2888{
2889	struct u132 *u132 = hcd_to_u132(hcd);
2890	if (u132->going > 1) {
2891		dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
2892			, u132->going);
2893		return -ENODEV;
2894	} else if (u132->going > 0) {
2895		dev_err(&u132->platform_dev->dev, "device is being removed\n");
2896		return -ESHUTDOWN;
2897	} else
2898		return 0;
2899}
2900
2901
2902#ifdef CONFIG_PM
2903static int u132_bus_suspend(struct usb_hcd *hcd)
2904{
2905	struct u132 *u132 = hcd_to_u132(hcd);
2906	if (u132->going > 1) {
2907		dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
2908			, u132->going);
2909		return -ENODEV;
2910	} else if (u132->going > 0) {
2911		dev_err(&u132->platform_dev->dev, "device is being removed\n");
2912		return -ESHUTDOWN;
2913	} else
2914		return 0;
2915}
2916
2917static int u132_bus_resume(struct usb_hcd *hcd)
2918{
2919	struct u132 *u132 = hcd_to_u132(hcd);
2920	if (u132->going > 1) {
2921		dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
2922			, u132->going);
2923		return -ENODEV;
2924	} else if (u132->going > 0) {
2925		dev_err(&u132->platform_dev->dev, "device is being removed\n");
2926		return -ESHUTDOWN;
2927	} else
2928		return 0;
2929}
2930
2931#else
2932#define u132_bus_suspend NULL
2933#define u132_bus_resume NULL
2934#endif
2935static const struct hc_driver u132_hc_driver = {
2936	.description = hcd_name,
2937	.hcd_priv_size = sizeof(struct u132),
2938	.irq = NULL,
2939	.flags = HCD_USB11 | HCD_MEMORY,
2940	.reset = u132_hcd_reset,
2941	.start = u132_hcd_start,
2942	.stop = u132_hcd_stop,
2943	.urb_enqueue = u132_urb_enqueue,
2944	.urb_dequeue = u132_urb_dequeue,
2945	.endpoint_disable = u132_endpoint_disable,
2946	.get_frame_number = u132_get_frame,
2947	.hub_status_data = u132_hub_status_data,
2948	.hub_control = u132_hub_control,
2949	.bus_suspend = u132_bus_suspend,
2950	.bus_resume = u132_bus_resume,
2951	.start_port_reset = u132_start_port_reset,
2952};
2953
2954/*
2955* This function may be called by the USB core whilst the "usb_all_devices_rwsem"
2956* is held for writing, thus this module must not call usb_remove_hcd()
2957* synchronously - but instead should immediately stop activity to the
2958* device and asynchronously call usb_remove_hcd()
2959*/
2960static int u132_remove(struct platform_device *pdev)
2961{
2962	struct usb_hcd *hcd = platform_get_drvdata(pdev);
2963	if (hcd) {
2964		struct u132 *u132 = hcd_to_u132(hcd);
2965		if (u132->going++ > 1) {
2966			dev_err(&u132->platform_dev->dev, "already being remove"
2967				"d\n");
2968			return -ENODEV;
2969		} else {
2970			int rings = MAX_U132_RINGS;
2971			int endps = MAX_U132_ENDPS;
2972			dev_err(&u132->platform_dev->dev, "removing device u132"
2973				".%d\n", u132->sequence_num);
2974			msleep(100);
2975			mutex_lock(&u132->sw_lock);
2976			u132_monitor_cancel_work(u132);
2977			while (rings-- > 0) {
2978				struct u132_ring *ring = &u132->ring[rings];
2979				u132_ring_cancel_work(u132, ring);
2980			}
2981			while (endps-- > 0) {
2982				struct u132_endp *endp = u132->endp[endps];
2983				if (endp)
2984					u132_endp_cancel_work(u132, endp);
2985			}
2986			u132->going += 1;
2987			printk(KERN_INFO "removing device u132.%d\n",
2988				u132->sequence_num);
2989			mutex_unlock(&u132->sw_lock);
2990			usb_remove_hcd(hcd);
2991			u132_u132_put_kref(u132);
2992			return 0;
2993		}
2994	} else
2995		return 0;
2996}
2997
2998static void u132_initialise(struct u132 *u132, struct platform_device *pdev)
2999{
3000	int rings = MAX_U132_RINGS;
3001	int ports = MAX_U132_PORTS;
3002	int addrs = MAX_U132_ADDRS;
3003	int udevs = MAX_U132_UDEVS;
3004	int endps = MAX_U132_ENDPS;
3005	u132->board = dev_get_platdata(&pdev->dev);
3006	u132->platform_dev = pdev;
3007	u132->power = 0;
3008	u132->reset = 0;
3009	mutex_init(&u132->sw_lock);
3010	mutex_init(&u132->scheduler_lock);
3011	while (rings-- > 0) {
3012		struct u132_ring *ring = &u132->ring[rings];
3013		ring->u132 = u132;
3014		ring->number = rings + 1;
3015		ring->length = 0;
3016		ring->curr_endp = NULL;
3017		INIT_DELAYED_WORK(&ring->scheduler,
3018				  u132_hcd_ring_work_scheduler);
3019	}
3020	mutex_lock(&u132->sw_lock);
3021	INIT_DELAYED_WORK(&u132->monitor, u132_hcd_monitor_work);
3022	while (ports-- > 0) {
3023		struct u132_port *port = &u132->port[ports];
3024		port->u132 = u132;
3025		port->reset = 0;
3026		port->enable = 0;
3027		port->power = 0;
3028		port->Status = 0;
3029	}
3030	while (addrs-- > 0) {
3031		struct u132_addr *addr = &u132->addr[addrs];
3032		addr->address = 0;
3033	}
3034	while (udevs-- > 0) {
3035		struct u132_udev *udev = &u132->udev[udevs];
3036		int i = ARRAY_SIZE(udev->endp_number_in);
3037		int o = ARRAY_SIZE(udev->endp_number_out);
3038		udev->usb_device = NULL;
3039		udev->udev_number = 0;
3040		udev->usb_addr = 0;
3041		udev->portnumber = 0;
3042		while (i-- > 0)
3043			udev->endp_number_in[i] = 0;
3044
3045		while (o-- > 0)
3046			udev->endp_number_out[o] = 0;
3047
3048	}
3049	while (endps-- > 0)
3050		u132->endp[endps] = NULL;
3051
3052	mutex_unlock(&u132->sw_lock);
3053}
3054
3055static int u132_probe(struct platform_device *pdev)
3056{
3057	struct usb_hcd *hcd;
3058	int retval;
3059	u32 control;
3060	u32 rh_a = -1;
 
3061
3062	msleep(100);
3063	if (u132_exiting > 0)
3064		return -ENODEV;
3065
3066	retval = ftdi_write_pcimem(pdev, intrdisable, OHCI_INTR_MIE);
3067	if (retval)
3068		return retval;
3069	retval = ftdi_read_pcimem(pdev, control, &control);
3070	if (retval)
3071		return retval;
3072	retval = ftdi_read_pcimem(pdev, roothub.a, &rh_a);
3073	if (retval)
3074		return retval;
 
 
 
3075
3076	hcd = usb_create_hcd(&u132_hc_driver, &pdev->dev, dev_name(&pdev->dev));
3077	if (!hcd) {
3078		printk(KERN_ERR "failed to create the usb hcd struct for U132\n"
3079			);
3080		ftdi_elan_gone_away(pdev);
3081		return -ENOMEM;
3082	} else {
3083		struct u132 *u132 = hcd_to_u132(hcd);
3084		retval = 0;
3085		hcd->rsrc_start = 0;
3086		mutex_lock(&u132_module_lock);
 
3087		u132->sequence_num = ++u132_instances;
3088		mutex_unlock(&u132_module_lock);
3089		u132_u132_init_kref(u132);
3090		u132_initialise(u132, pdev);
3091		hcd->product_desc = "ELAN U132 Host Controller";
3092		retval = usb_add_hcd(hcd, 0, 0);
3093		if (retval != 0) {
3094			dev_err(&u132->platform_dev->dev, "init error %d\n",
3095				retval);
3096			u132_u132_put_kref(u132);
3097			return retval;
3098		} else {
3099			device_wakeup_enable(hcd->self.controller);
3100			u132_monitor_queue_work(u132, 100);
3101			return 0;
3102		}
3103	}
3104}
3105
3106
3107#ifdef CONFIG_PM
3108/*
3109 * for this device there's no useful distinction between the controller
3110 * and its root hub.
3111 */
3112static int u132_suspend(struct platform_device *pdev, pm_message_t state)
3113{
3114	struct usb_hcd *hcd = platform_get_drvdata(pdev);
3115	struct u132 *u132 = hcd_to_u132(hcd);
3116	if (u132->going > 1) {
3117		dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
3118			, u132->going);
3119		return -ENODEV;
3120	} else if (u132->going > 0) {
3121		dev_err(&u132->platform_dev->dev, "device is being removed\n");
3122		return -ESHUTDOWN;
3123	} else {
3124		int retval = 0, ports;
3125
3126		switch (state.event) {
3127		case PM_EVENT_FREEZE:
3128			retval = u132_bus_suspend(hcd);
3129			break;
3130		case PM_EVENT_SUSPEND:
3131		case PM_EVENT_HIBERNATE:
3132			ports = MAX_U132_PORTS;
3133			while (ports-- > 0) {
3134				port_power(u132, ports, 0);
3135			}
3136			break;
3137		}
3138		return retval;
3139	}
3140}
3141
3142static int u132_resume(struct platform_device *pdev)
3143{
3144	struct usb_hcd *hcd = platform_get_drvdata(pdev);
3145	struct u132 *u132 = hcd_to_u132(hcd);
3146	if (u132->going > 1) {
3147		dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
3148			, u132->going);
3149		return -ENODEV;
3150	} else if (u132->going > 0) {
3151		dev_err(&u132->platform_dev->dev, "device is being removed\n");
3152		return -ESHUTDOWN;
3153	} else {
3154		int retval = 0;
3155		if (!u132->port[0].power) {
3156			int ports = MAX_U132_PORTS;
3157			while (ports-- > 0) {
3158				port_power(u132, ports, 1);
3159			}
3160			retval = 0;
3161		} else {
3162			retval = u132_bus_resume(hcd);
3163		}
3164		return retval;
3165	}
3166}
3167
3168#else
3169#define u132_suspend NULL
3170#define u132_resume NULL
3171#endif
3172/*
3173* this driver is loaded explicitly by ftdi_u132
3174*
3175* the platform_driver struct is static because it is per type of module
3176*/
3177static struct platform_driver u132_platform_driver = {
3178	.probe = u132_probe,
3179	.remove = u132_remove,
3180	.suspend = u132_suspend,
3181	.resume = u132_resume,
3182	.driver = {
3183		   .name = hcd_name,
 
3184		   },
3185};
3186static int __init u132_hcd_init(void)
3187{
3188	int retval;
 
3189	u132_instances = 0;
3190	u132_exiting = 0;
 
3191	if (usb_disabled())
3192		return -ENODEV;
3193	printk(KERN_INFO "driver %s\n", hcd_name);
3194	workqueue = create_singlethread_workqueue("u132");
3195	if (!workqueue)
3196		return -ENOMEM;
3197	retval = platform_driver_register(&u132_platform_driver);
3198	if (retval)
3199		destroy_workqueue(workqueue);
3200
3201	return retval;
3202}
3203
3204
3205module_init(u132_hcd_init);
3206static void __exit u132_hcd_exit(void)
3207{
 
 
3208	mutex_lock(&u132_module_lock);
3209	u132_exiting += 1;
3210	mutex_unlock(&u132_module_lock);
 
 
 
3211	platform_driver_unregister(&u132_platform_driver);
3212	printk(KERN_INFO "u132-hcd driver deregistered\n");
3213	wait_event(u132_hcd_wait, u132_instances == 0);
3214	flush_workqueue(workqueue);
3215	destroy_workqueue(workqueue);
3216}
3217
3218
3219module_exit(u132_hcd_exit);
3220MODULE_LICENSE("GPL");
3221MODULE_ALIAS("platform:u132_hcd");