net2280.c 98.9 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4
/*
 * Driver for the PLX NET2280 USB device controller.
 * Specs and errata are available from <http://www.plxtech.com>.
 *
5
 * PLX Technology Inc. (formerly NetChip Technology) supported the
L
Linus Torvalds 已提交
6 7 8 9 10 11
 * development of this driver.
 *
 *
 * CODE STATUS HIGHLIGHTS
 *
 * This driver should work well with most "gadget" drivers, including
12
 * the Mass Storage, Serial, and Ethernet/RNDIS gadget drivers
L
Linus Torvalds 已提交
13 14 15 16 17 18 19 20
 * as well as Gadget Zero and Gadgetfs.
 *
 * DMA is enabled by default.  Drivers using transfer queues might use
 * DMA chaining to remove IRQ latencies between transfers.  (Except when
 * short OUT transfers happen.)  Drivers can use the req->no_interrupt
 * hint to completely eliminate some IRQs, if a later IRQ is guaranteed
 * and DMA chaining is enabled.
 *
21 22 23
 * MSI is enabled by default.  The legacy IRQ is used if MSI couldn't
 * be enabled.
 *
L
Linus Torvalds 已提交
24 25 26 27 28 29 30
 * Note that almost all the errata workarounds here are only needed for
 * rev1 chips.  Rev1a silicon (0110) fixes almost all of them.
 */

/*
 * Copyright (C) 2003 David Brownell
 * Copyright (C) 2003-2005 PLX Technology, Inc.
31
 * Copyright (C) 2014 Ricardo Ribalda - Qtechnology/AS
L
Linus Torvalds 已提交
32
 *
33 34
 * Modified Seth Levy 2005 PLX Technology, Inc. to provide compatibility
 *	with 2282 chip
35
 *
36 37 38
 * Modified Ricardo Ribalda Qtechnology AS  to provide compatibility
 *	with usb 338x chip. Based on PLX driver
 *
L
Linus Torvalds 已提交
39 40 41 42 43 44 45 46
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 */

#include <linux/module.h>
#include <linux/pci.h>
47
#include <linux/dma-mapping.h>
L
Linus Torvalds 已提交
48 49 50 51 52 53 54 55 56 57 58
#include <linux/kernel.h>
#include <linux/delay.h>
#include <linux/ioport.h>
#include <linux/slab.h>
#include <linux/errno.h>
#include <linux/init.h>
#include <linux/timer.h>
#include <linux/list.h>
#include <linux/interrupt.h>
#include <linux/moduleparam.h>
#include <linux/device.h>
59
#include <linux/usb/ch9.h>
60
#include <linux/usb/gadget.h>
61
#include <linux/prefetch.h>
62
#include <linux/io.h>
L
Linus Torvalds 已提交
63 64 65 66 67

#include <asm/byteorder.h>
#include <asm/irq.h>
#include <asm/unaligned.h>

68 69
#define	DRIVER_DESC		"PLX NET228x/USB338x USB Peripheral Controller"
#define	DRIVER_VERSION		"2005 Sept 27/v3.0"
L
Linus Torvalds 已提交
70 71 72 73 74 75

#define	EP_DONTUSE		13	/* nonzero */

#define USE_RDK_LEDS		/* GPIO pins control three LEDs */


76 77
static const char driver_name[] = "net2280";
static const char driver_desc[] = DRIVER_DESC;
L
Linus Torvalds 已提交
78

79
static const u32 ep_bit[9] = { 0, 17, 2, 19, 4, 1, 18, 3, 20 };
80 81
static const char ep0name[] = "ep0";
static const char *const ep_name[] = {
L
Linus Torvalds 已提交
82 83
	ep0name,
	"ep-a", "ep-b", "ep-c", "ep-d",
84
	"ep-e", "ep-f", "ep-g", "ep-h",
L
Linus Torvalds 已提交
85 86 87 88 89 90 91 92 93 94
};

/* use_dma -- general goodness, fewer interrupts, less cpu load (vs PIO)
 * use_dma_chaining -- dma descriptor queueing gives even more irq reduction
 *
 * The net2280 DMA engines are not tightly integrated with their FIFOs;
 * not all cases are (yet) handled well in this driver or the silicon.
 * Some gadget drivers work better with the dma support here than others.
 * These two parameters let you use PIO or more aggressive DMA.
 */
95 96 97
static bool use_dma = true;
static bool use_dma_chaining;
static bool use_msi = true;
L
Linus Torvalds 已提交
98 99

/* "modprobe net2280 use_dma=n" etc */
100 101 102
module_param(use_dma, bool, 0444);
module_param(use_dma_chaining, bool, 0444);
module_param(use_msi, bool, 0444);
L
Linus Torvalds 已提交
103 104 105 106 107

/* mode 0 == ep-{a,b,c,d} 1K fifo each
 * mode 1 == ep-{a,b} 2K fifo each, ep-{c,d} unavailable
 * mode 2 == ep-a 2K fifo, ep-{b,c} 1K each, ep-d unavailable
 */
108
static ushort fifo_mode;
L
Linus Torvalds 已提交
109 110

/* "modprobe net2280 fifo_mode=1" etc */
111
module_param(fifo_mode, ushort, 0644);
L
Linus Torvalds 已提交
112 113 114

/* enable_suspend -- When enabled, the driver will respond to
 * USB suspend requests by powering down the NET2280.  Otherwise,
L
Lucas De Marchi 已提交
115
 * USB suspend requests will be ignored.  This is acceptable for
116
 * self-powered devices
L
Linus Torvalds 已提交
117
 */
118
static bool enable_suspend;
L
Linus Torvalds 已提交
119 120

/* "modprobe net2280 enable_suspend=1" etc */
121
module_param(enable_suspend, bool, 0444);
L
Linus Torvalds 已提交
122

123 124 125 126
/* force full-speed operation */
static bool full_speed;
module_param(full_speed, bool, 0444);
MODULE_PARM_DESC(full_speed, "force full-speed mode -- for testing only!");
L
Linus Torvalds 已提交
127 128 129

#define	DIR_STRING(bAddress) (((bAddress) & USB_DIR_IN) ? "in" : "out")

130
static char *type_string(u8 bmAttributes)
L
Linus Torvalds 已提交
131 132 133 134 135
{
	switch ((bmAttributes) & USB_ENDPOINT_XFERTYPE_MASK) {
	case USB_ENDPOINT_XFER_BULK:	return "bulk";
	case USB_ENDPOINT_XFER_ISOC:	return "iso";
	case USB_ENDPOINT_XFER_INT:	return "intr";
J
Joe Perches 已提交
136
	}
L
Linus Torvalds 已提交
137 138 139 140 141
	return "control";
}

#include "net2280.h"

142 143
#define valid_bit	cpu_to_le32(BIT(VALID_BIT))
#define dma_done_ie	cpu_to_le32(BIT(DMA_DONE_INTERRUPT_ENABLE))
L
Linus Torvalds 已提交
144 145

/*-------------------------------------------------------------------------*/
146 147 148 149
static inline void enable_pciirqenb(struct net2280_ep *ep)
{
	u32 tmp = readl(&ep->dev->regs->pciirqenb0);

150
	if (ep->dev->quirks & PLX_LEGACY)
151
		tmp |= BIT(ep->num);
152
	else
153
		tmp |= BIT(ep_bit[ep->num]);
154 155 156 157
	writel(tmp, &ep->dev->regs->pciirqenb0);

	return;
}
L
Linus Torvalds 已提交
158 159

static int
160
net2280_enable(struct usb_ep *_ep, const struct usb_endpoint_descriptor *desc)
L
Linus Torvalds 已提交
161 162 163 164 165
{
	struct net2280		*dev;
	struct net2280_ep	*ep;
	u32			max, tmp;
	unsigned long		flags;
166
	static const u32 ep_key[9] = { 1, 0, 1, 0, 1, 1, 0, 1, 0 };
L
Linus Torvalds 已提交
167

168
	ep = container_of(_ep, struct net2280_ep, ep);
169 170
	if (!_ep || !desc || ep->desc || _ep->name == ep0name ||
			desc->bDescriptorType != USB_DT_ENDPOINT)
L
Linus Torvalds 已提交
171 172 173 174 175 176 177 178 179
		return -EINVAL;
	dev = ep->dev;
	if (!dev->driver || dev->gadget.speed == USB_SPEED_UNKNOWN)
		return -ESHUTDOWN;

	/* erratum 0119 workaround ties up an endpoint number */
	if ((desc->bEndpointAddress & 0x0f) == EP_DONTUSE)
		return -EDOM;

180
	if (dev->quirks & PLX_SUPERSPEED) {
181 182 183 184 185 186 187
		if ((desc->bEndpointAddress & 0x0f) >= 0x0c)
			return -EDOM;
		ep->is_in = !!usb_endpoint_dir_in(desc);
		if (dev->enhanced_mode && ep->is_in && ep_key[ep->num])
			return -EINVAL;
	}

L
Linus Torvalds 已提交
188
	/* sanity check ep-e/ep-f since their fifos are small */
189
	max = usb_endpoint_maxp(desc) & 0x1fff;
190
	if (ep->num > 4 && max > 64 && (dev->quirks & PLX_LEGACY))
L
Linus Torvalds 已提交
191 192
		return -ERANGE;

193
	spin_lock_irqsave(&dev->lock, flags);
L
Linus Torvalds 已提交
194 195 196 197 198
	_ep->maxpacket = max & 0x7ff;
	ep->desc = desc;

	/* ep_reset() has already been called */
	ep->stopped = 0;
199
	ep->wedged = 0;
L
Linus Torvalds 已提交
200 201 202
	ep->out_overflow = 0;

	/* set speed-dependent max packet; may kick in high bandwidth */
203
	set_max_speed(ep, max);
L
Linus Torvalds 已提交
204 205 206 207 208

	/* FIFO lines can't go to different packets.  PIO is ok, so
	 * use it instead of troublesome (non-bulk) multi-packet DMA.
	 */
	if (ep->dma && (max % 4) != 0 && use_dma_chaining) {
209
		ep_dbg(ep->dev, "%s, no dma for maxpacket %d\n",
L
Linus Torvalds 已提交
210 211 212 213 214
			ep->ep.name, ep->ep.maxpacket);
		ep->dma = NULL;
	}

	/* set type, direction, address; reset fifo counters */
215
	writel(BIT(FIFO_FLUSH), &ep->regs->ep_stat);
L
Linus Torvalds 已提交
216 217 218
	tmp = (desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK);
	if (tmp == USB_ENDPOINT_XFER_INT) {
		/* erratum 0105 workaround prevents hs NYET */
219 220 221
		if (dev->chiprev == 0100 &&
				dev->gadget.speed == USB_SPEED_HIGH &&
				!(desc->bEndpointAddress & USB_DIR_IN))
222
			writel(BIT(CLEAR_NAK_OUT_PACKETS_MODE),
L
Linus Torvalds 已提交
223 224 225
				&ep->regs->ep_rsp);
	} else if (tmp == USB_ENDPOINT_XFER_BULK) {
		/* catch some particularly blatant driver bugs */
226 227 228 229
		if ((dev->gadget.speed == USB_SPEED_SUPER && max != 1024) ||
		    (dev->gadget.speed == USB_SPEED_HIGH && max != 512) ||
		    (dev->gadget.speed == USB_SPEED_FULL && max > 64)) {
			spin_unlock_irqrestore(&dev->lock, flags);
L
Linus Torvalds 已提交
230 231 232
			return -ERANGE;
		}
	}
233
	ep->is_iso = (tmp == USB_ENDPOINT_XFER_ISOC);
234
	/* Enable this endpoint */
235
	if (dev->quirks & PLX_LEGACY) {
236 237 238 239
		tmp <<= ENDPOINT_TYPE;
		tmp |= desc->bEndpointAddress;
		/* default full fifo lines */
		tmp |= (4 << ENDPOINT_BYTE_COUNT);
240
		tmp |= BIT(ENDPOINT_ENABLE);
241 242 243 244 245
		ep->is_in = (tmp & USB_DIR_IN) != 0;
	} else {
		/* In Legacy mode, only OUT endpoints are used */
		if (dev->enhanced_mode && ep->is_in) {
			tmp <<= IN_ENDPOINT_TYPE;
246
			tmp |= BIT(IN_ENDPOINT_ENABLE);
247
			/* Not applicable to Legacy */
248
			tmp |= BIT(ENDPOINT_DIRECTION);
249 250
		} else {
			tmp <<= OUT_ENDPOINT_TYPE;
251
			tmp |= BIT(OUT_ENDPOINT_ENABLE);
252 253 254 255 256 257 258 259 260
			tmp |= (ep->is_in << ENDPOINT_DIRECTION);
		}

		tmp |= usb_endpoint_num(desc);
		tmp |= (ep->ep.maxburst << MAX_BURST_SIZE);
	}

	/* Make sure all the registers are written before ep_rsp*/
	wmb();
L
Linus Torvalds 已提交
261 262 263

	/* for OUT transfers, block the rx fifo until a read is posted */
	if (!ep->is_in)
264
		writel(BIT(SET_NAK_OUT_PACKETS), &ep->regs->ep_rsp);
265
	else if (!(dev->quirks & PLX_2280)) {
266 267 268
		/* Added for 2282, Don't use nak packets on an in endpoint,
		 * this was ignored on 2280
		 */
269 270
		writel(BIT(CLEAR_NAK_OUT_PACKETS) |
			BIT(CLEAR_NAK_OUT_PACKETS_MODE), &ep->regs->ep_rsp);
271
	}
L
Linus Torvalds 已提交
272

273
	writel(tmp, &ep->cfg->ep_cfg);
L
Linus Torvalds 已提交
274 275 276

	/* enable irqs */
	if (!ep->dma) {				/* pio, per-packet */
277
		enable_pciirqenb(ep);
L
Linus Torvalds 已提交
278

279 280
		tmp = BIT(DATA_PACKET_RECEIVED_INTERRUPT_ENABLE) |
			BIT(DATA_PACKET_TRANSMITTED_INTERRUPT_ENABLE);
281
		if (dev->quirks & PLX_2280)
282 283
			tmp |= readl(&ep->regs->ep_irqenb);
		writel(tmp, &ep->regs->ep_irqenb);
L
Linus Torvalds 已提交
284
	} else {				/* dma, per-request */
285
		tmp = BIT((8 + ep->num));	/* completion */
286 287
		tmp |= readl(&dev->regs->pciirqenb1);
		writel(tmp, &dev->regs->pciirqenb1);
L
Linus Torvalds 已提交
288 289 290 291 292 293

		/* for short OUT transfers, dma completions can't
		 * advance the queue; do it pio-style, by hand.
		 * NOTE erratum 0112 workaround #2
		 */
		if ((desc->bEndpointAddress & USB_DIR_IN) == 0) {
294
			tmp = BIT(SHORT_PACKET_TRANSFERRED_INTERRUPT_ENABLE);
295
			writel(tmp, &ep->regs->ep_irqenb);
L
Linus Torvalds 已提交
296

297
			enable_pciirqenb(ep);
L
Linus Torvalds 已提交
298 299 300 301
		}
	}

	tmp = desc->bEndpointAddress;
302
	ep_dbg(dev, "enabled %s (ep%d%s-%s) %s max %04x\n",
303 304
		_ep->name, tmp & 0x0f, DIR_STRING(tmp),
		type_string(desc->bmAttributes),
L
Linus Torvalds 已提交
305 306 307
		ep->dma ? "dma" : "pio", max);

	/* pci writes may still be posted */
308
	spin_unlock_irqrestore(&dev->lock, flags);
L
Linus Torvalds 已提交
309 310 311
	return 0;
}

312
static int handshake(u32 __iomem *ptr, u32 mask, u32 done, int usec)
L
Linus Torvalds 已提交
313 314 315 316
{
	u32	result;

	do {
317
		result = readl(ptr);
L
Linus Torvalds 已提交
318 319 320 321 322
		if (result == ~(u32)0)		/* "device unplugged" */
			return -ENODEV;
		result &= mask;
		if (result == done)
			return 0;
323
		udelay(1);
L
Linus Torvalds 已提交
324 325 326 327 328
		usec--;
	} while (usec > 0);
	return -ETIMEDOUT;
}

329
static const struct usb_ep_ops net2280_ep_ops;
L
Linus Torvalds 已提交
330

331 332
static void ep_reset_228x(struct net2280_regs __iomem *regs,
			  struct net2280_ep *ep)
L
Linus Torvalds 已提交
333 334 335 336
{
	u32		tmp;

	ep->desc = NULL;
337
	INIT_LIST_HEAD(&ep->queue);
L
Linus Torvalds 已提交
338

339
	usb_ep_set_maxpacket_limit(&ep->ep, ~0);
L
Linus Torvalds 已提交
340 341 342 343
	ep->ep.ops = &net2280_ep_ops;

	/* disable the dma, irqs, endpoint... */
	if (ep->dma) {
344
		writel(0, &ep->dma->dmactl);
345 346 347 348
		writel(BIT(DMA_SCATTER_GATHER_DONE_INTERRUPT) |
			BIT(DMA_TRANSACTION_DONE_INTERRUPT) |
			BIT(DMA_ABORT),
			&ep->dma->dmastat);
L
Linus Torvalds 已提交
349

350
		tmp = readl(&regs->pciirqenb0);
351
		tmp &= ~BIT(ep->num);
352
		writel(tmp, &regs->pciirqenb0);
L
Linus Torvalds 已提交
353
	} else {
354
		tmp = readl(&regs->pciirqenb1);
355
		tmp &= ~BIT((8 + ep->num));	/* completion */
356
		writel(tmp, &regs->pciirqenb1);
L
Linus Torvalds 已提交
357
	}
358
	writel(0, &ep->regs->ep_irqenb);
L
Linus Torvalds 已提交
359 360 361 362

	/* init to our chosen defaults, notably so that we NAK OUT
	 * packets until the driver queues a read (+note erratum 0112)
	 */
363
	if (!ep->is_in || (ep->dev->quirks & PLX_2280)) {
364 365 366 367
		tmp = BIT(SET_NAK_OUT_PACKETS_MODE) |
		BIT(SET_NAK_OUT_PACKETS) |
		BIT(CLEAR_EP_HIDE_STATUS_PHASE) |
		BIT(CLEAR_INTERRUPT_MODE);
368 369
	} else {
		/* added for 2282 */
370 371 372 373
		tmp = BIT(CLEAR_NAK_OUT_PACKETS_MODE) |
		BIT(CLEAR_NAK_OUT_PACKETS) |
		BIT(CLEAR_EP_HIDE_STATUS_PHASE) |
		BIT(CLEAR_INTERRUPT_MODE);
374
	}
L
Linus Torvalds 已提交
375 376

	if (ep->num != 0) {
377 378
		tmp |= BIT(CLEAR_ENDPOINT_TOGGLE) |
			BIT(CLEAR_ENDPOINT_HALT);
L
Linus Torvalds 已提交
379
	}
380
	writel(tmp, &ep->regs->ep_rsp);
L
Linus Torvalds 已提交
381 382

	/* scrub most status bits, and flush any fifo state */
383
	if (ep->dev->quirks & PLX_2280)
384 385
		tmp = BIT(FIFO_OVERFLOW) |
			BIT(FIFO_UNDERFLOW);
386 387 388
	else
		tmp = 0;

389 390 391 392 393 394 395 396 397 398 399 400
	writel(tmp | BIT(TIMEOUT) |
		BIT(USB_STALL_SENT) |
		BIT(USB_IN_NAK_SENT) |
		BIT(USB_IN_ACK_RCVD) |
		BIT(USB_OUT_PING_NAK_SENT) |
		BIT(USB_OUT_ACK_SENT) |
		BIT(FIFO_FLUSH) |
		BIT(SHORT_PACKET_OUT_DONE_INTERRUPT) |
		BIT(SHORT_PACKET_TRANSFERRED_INTERRUPT) |
		BIT(DATA_PACKET_RECEIVED_INTERRUPT) |
		BIT(DATA_PACKET_TRANSMITTED_INTERRUPT) |
		BIT(DATA_OUT_PING_TOKEN_INTERRUPT) |
401 402
		BIT(DATA_IN_TOKEN_INTERRUPT),
		&ep->regs->ep_stat);
L
Linus Torvalds 已提交
403 404 405 406

	/* fifo size is handled separately */
}

407 408 409 410 411 412 413 414 415 416 417 418 419 420
static void ep_reset_338x(struct net2280_regs __iomem *regs,
					struct net2280_ep *ep)
{
	u32 tmp, dmastat;

	ep->desc = NULL;
	INIT_LIST_HEAD(&ep->queue);

	usb_ep_set_maxpacket_limit(&ep->ep, ~0);
	ep->ep.ops = &net2280_ep_ops;

	/* disable the dma, irqs, endpoint... */
	if (ep->dma) {
		writel(0, &ep->dma->dmactl);
421 422 423
		writel(BIT(DMA_ABORT_DONE_INTERRUPT) |
		       BIT(DMA_PAUSE_DONE_INTERRUPT) |
		       BIT(DMA_SCATTER_GATHER_DONE_INTERRUPT) |
424 425 426
		       BIT(DMA_TRANSACTION_DONE_INTERRUPT),
		       /* | BIT(DMA_ABORT), */
		       &ep->dma->dmastat);
427 428 429

		dmastat = readl(&ep->dma->dmastat);
		if (dmastat == 0x5002) {
430
			ep_warn(ep->dev, "The dmastat return = %x!!\n",
431 432 433 434 435
			       dmastat);
			writel(0x5a, &ep->dma->dmastat);
		}

		tmp = readl(&regs->pciirqenb0);
436
		tmp &= ~BIT(ep_bit[ep->num]);
437 438 439 440
		writel(tmp, &regs->pciirqenb0);
	} else {
		if (ep->num < 5) {
			tmp = readl(&regs->pciirqenb1);
441
			tmp &= ~BIT((8 + ep->num));	/* completion */
442 443 444 445 446
			writel(tmp, &regs->pciirqenb1);
		}
	}
	writel(0, &ep->regs->ep_irqenb);

447 448 449 450 451 452 453
	writel(BIT(SHORT_PACKET_OUT_DONE_INTERRUPT) |
	       BIT(SHORT_PACKET_TRANSFERRED_INTERRUPT) |
	       BIT(FIFO_OVERFLOW) |
	       BIT(DATA_PACKET_RECEIVED_INTERRUPT) |
	       BIT(DATA_PACKET_TRANSMITTED_INTERRUPT) |
	       BIT(DATA_OUT_PING_TOKEN_INTERRUPT) |
	       BIT(DATA_IN_TOKEN_INTERRUPT), &ep->regs->ep_stat);
454 455
}

456
static void nuke(struct net2280_ep *);
L
Linus Torvalds 已提交
457

458
static int net2280_disable(struct usb_ep *_ep)
L
Linus Torvalds 已提交
459 460 461 462
{
	struct net2280_ep	*ep;
	unsigned long		flags;

463
	ep = container_of(_ep, struct net2280_ep, ep);
L
Linus Torvalds 已提交
464 465 466
	if (!_ep || !ep->desc || _ep->name == ep0name)
		return -EINVAL;

467 468
	spin_lock_irqsave(&ep->dev->lock, flags);
	nuke(ep);
469

470
	if (ep->dev->quirks & PLX_SUPERSPEED)
471 472 473
		ep_reset_338x(ep->dev->regs, ep);
	else
		ep_reset_228x(ep->dev->regs, ep);
L
Linus Torvalds 已提交
474

475
	ep_vdbg(ep->dev, "disabled %s %s\n",
L
Linus Torvalds 已提交
476 477 478
			ep->dma ? "dma" : "pio", _ep->name);

	/* synch memory views with the device */
479
	(void)readl(&ep->cfg->ep_cfg);
L
Linus Torvalds 已提交
480 481

	if (use_dma && !ep->dma && ep->num >= 1 && ep->num <= 4)
482
		ep->dma = &ep->dev->dma[ep->num - 1];
L
Linus Torvalds 已提交
483

484
	spin_unlock_irqrestore(&ep->dev->lock, flags);
L
Linus Torvalds 已提交
485 486 487 488 489
	return 0;
}

/*-------------------------------------------------------------------------*/

490 491
static struct usb_request
*net2280_alloc_request(struct usb_ep *_ep, gfp_t gfp_flags)
L
Linus Torvalds 已提交
492 493 494 495 496 497
{
	struct net2280_ep	*ep;
	struct net2280_request	*req;

	if (!_ep)
		return NULL;
498
	ep = container_of(_ep, struct net2280_ep, ep);
L
Linus Torvalds 已提交
499

500
	req = kzalloc(sizeof(*req), gfp_flags);
L
Linus Torvalds 已提交
501 502 503
	if (!req)
		return NULL;

504
	INIT_LIST_HEAD(&req->queue);
L
Linus Torvalds 已提交
505 506 507 508 509

	/* this dma descriptor may be swapped with the previous dummy */
	if (ep->dma) {
		struct net2280_dma	*td;

510
		td = pci_pool_alloc(ep->dev->requests, gfp_flags,
L
Linus Torvalds 已提交
511 512
				&req->td_dma);
		if (!td) {
513
			kfree(req);
L
Linus Torvalds 已提交
514 515 516 517 518 519 520 521 522
			return NULL;
		}
		td->dmacount = 0;	/* not VALID */
		td->dmadesc = td->dmaaddr;
		req->td = td;
	}
	return &req->req;
}

523
static void net2280_free_request(struct usb_ep *_ep, struct usb_request *_req)
L
Linus Torvalds 已提交
524 525 526 527
{
	struct net2280_ep	*ep;
	struct net2280_request	*req;

528
	ep = container_of(_ep, struct net2280_ep, ep);
L
Linus Torvalds 已提交
529 530 531
	if (!_ep || !_req)
		return;

532 533
	req = container_of(_req, struct net2280_request, req);
	WARN_ON(!list_empty(&req->queue));
L
Linus Torvalds 已提交
534
	if (req->td)
535 536
		pci_pool_free(ep->dev->requests, req->td, req->td_dma);
	kfree(req);
L
Linus Torvalds 已提交
537 538 539 540 541 542 543 544 545 546 547
}

/*-------------------------------------------------------------------------*/

/* load a packet into the fifo we use for usb IN transfers.
 * works for all endpoints.
 *
 * NOTE: pio with ep-a..ep-d could stuff multiple packets into the fifo
 * at a time, but this code is simpler because it knows it only writes
 * one packet.  ep-a..ep-d should use dma instead.
 */
548
static void write_fifo(struct net2280_ep *ep, struct usb_request *req)
L
Linus Torvalds 已提交
549 550 551 552 553 554 555 556 557 558
{
	struct net2280_ep_regs	__iomem *regs = ep->regs;
	u8			*buf;
	u32			tmp;
	unsigned		count, total;

	/* INVARIANT:  fifo is currently empty. (testable) */

	if (req) {
		buf = req->buf + req->actual;
559
		prefetch(buf);
L
Linus Torvalds 已提交
560 561 562 563 564 565 566 567 568 569 570
		total = req->length - req->actual;
	} else {
		total = 0;
		buf = NULL;
	}

	/* write just one packet at a time */
	count = ep->ep.maxpacket;
	if (count > total)	/* min() cannot be used on a bitfield */
		count = total;

571
	ep_vdbg(ep->dev, "write %s fifo (IN) %d bytes%s req %p\n",
L
Linus Torvalds 已提交
572 573 574 575 576 577 578 579
			ep->ep.name, count,
			(count != ep->ep.maxpacket) ? " (short)" : "",
			req);
	while (count >= 4) {
		/* NOTE be careful if you try to align these. fifo lines
		 * should normally be full (4 bytes) and successive partial
		 * lines are ok only in certain cases.
		 */
580 581 582
		tmp = get_unaligned((u32 *)buf);
		cpu_to_le32s(&tmp);
		writel(tmp, &regs->ep_data);
L
Linus Torvalds 已提交
583 584 585 586 587 588 589 590 591
		buf += 4;
		count -= 4;
	}

	/* last fifo entry is "short" unless we wrote a full packet.
	 * also explicitly validate last word in (periodic) transfers
	 * when maxpacket is not a multiple of 4 bytes.
	 */
	if (count || total < ep->ep.maxpacket) {
592 593 594 595
		tmp = count ? get_unaligned((u32 *)buf) : count;
		cpu_to_le32s(&tmp);
		set_fifo_bytecount(ep, count & 0x03);
		writel(tmp, &regs->ep_data);
L
Linus Torvalds 已提交
596 597 598 599 600 601 602 603 604 605 606 607
	}

	/* pci writes may still be posted */
}

/* work around erratum 0106: PCI and USB race over the OUT fifo.
 * caller guarantees chiprev 0100, out endpoint is NAKing, and
 * there's no real data in the fifo.
 *
 * NOTE:  also used in cases where that erratum doesn't apply:
 * where the host wrote "too much" data to us.
 */
608
static void out_flush(struct net2280_ep *ep)
L
Linus Torvalds 已提交
609 610 611 612
{
	u32	__iomem *statp;
	u32	tmp;

613
	ASSERT_OUT_NAKING(ep);
L
Linus Torvalds 已提交
614 615

	statp = &ep->regs->ep_stat;
616
	writel(BIT(DATA_OUT_PING_TOKEN_INTERRUPT) |
617 618
		BIT(DATA_PACKET_RECEIVED_INTERRUPT),
		statp);
619
	writel(BIT(FIFO_FLUSH), statp);
620 621 622
	/* Make sure that stap is written */
	mb();
	tmp = readl(statp);
623
	if (tmp & BIT(DATA_OUT_PING_TOKEN_INTERRUPT) &&
L
Linus Torvalds 已提交
624
			/* high speed did bulk NYET; fifo isn't filling */
625
			ep->dev->gadget.speed == USB_SPEED_FULL) {
L
Linus Torvalds 已提交
626 627 628
		unsigned	usec;

		usec = 50;		/* 64 byte bulk/interrupt */
629 630
		handshake(statp, BIT(USB_OUT_PING_NAK_SENT),
				BIT(USB_OUT_PING_NAK_SENT), usec);
L
Linus Torvalds 已提交
631 632 633 634 635 636 637 638 639 640 641
		/* NAK done; now CLEAR_NAK_OUT_PACKETS is safe */
	}
}

/* unload packet(s) from the fifo we use for usb OUT transfers.
 * returns true iff the request completed, because of short packet
 * or the request buffer having filled with full packets.
 *
 * for ep-a..ep-d this will read multiple packets out when they
 * have been accepted.
 */
642
static int read_fifo(struct net2280_ep *ep, struct net2280_request *req)
L
Linus Torvalds 已提交
643 644 645 646 647 648 649 650 651
{
	struct net2280_ep_regs	__iomem *regs = ep->regs;
	u8			*buf = req->req.buf + req->req.actual;
	unsigned		count, tmp, is_short;
	unsigned		cleanup = 0, prevent = 0;

	/* erratum 0106 ... packets coming in during fifo reads might
	 * be incompletely rejected.  not all cases have workarounds.
	 */
652 653
	if (ep->dev->chiprev == 0x0100 &&
			ep->dev->gadget.speed == USB_SPEED_FULL) {
654 655
		udelay(1);
		tmp = readl(&ep->regs->ep_stat);
656
		if ((tmp & BIT(NAK_OUT_PACKETS)))
L
Linus Torvalds 已提交
657
			cleanup = 1;
658
		else if ((tmp & BIT(FIFO_FULL))) {
659
			start_out_naking(ep);
L
Linus Torvalds 已提交
660 661 662 663 664 665 666 667
			prevent = 1;
		}
		/* else: hope we don't see the problem */
	}

	/* never overflow the rx buffer. the fifo reads packets until
	 * it sees a short one; we might not be ready for them all.
	 */
668 669 670 671 672 673
	prefetchw(buf);
	count = readl(&regs->ep_avail);
	if (unlikely(count == 0)) {
		udelay(1);
		tmp = readl(&ep->regs->ep_stat);
		count = readl(&regs->ep_avail);
L
Linus Torvalds 已提交
674
		/* handled that data already? */
675
		if (count == 0 && (tmp & BIT(NAK_OUT_PACKETS)) == 0)
L
Linus Torvalds 已提交
676 677 678 679 680 681 682
			return 0;
	}

	tmp = req->req.length - req->req.actual;
	if (count > tmp) {
		/* as with DMA, data overflow gets flushed */
		if ((tmp % ep->ep.maxpacket) != 0) {
683
			ep_err(ep->dev,
L
Linus Torvalds 已提交
684 685 686 687 688 689 690 691 692 693 694 695 696 697
				"%s out fifo %d bytes, expected %d\n",
				ep->ep.name, count, tmp);
			req->req.status = -EOVERFLOW;
			cleanup = 1;
			/* NAK_OUT_PACKETS will be set, so flushing is safe;
			 * the next read will start with the next packet
			 */
		} /* else it's a ZLP, no worries */
		count = tmp;
	}
	req->req.actual += count;

	is_short = (count == 0) || ((count % ep->ep.maxpacket) != 0);

698
	ep_vdbg(ep->dev, "read %s fifo (OUT) %d bytes%s%s%s req %p %d/%d\n",
L
Linus Torvalds 已提交
699 700 701 702 703
			ep->ep.name, count, is_short ? " (short)" : "",
			cleanup ? " flush" : "", prevent ? " nak" : "",
			req, req->req.actual, req->req.length);

	while (count >= 4) {
704 705 706
		tmp = readl(&regs->ep_data);
		cpu_to_le32s(&tmp);
		put_unaligned(tmp, (u32 *)buf);
L
Linus Torvalds 已提交
707 708 709 710
		buf += 4;
		count -= 4;
	}
	if (count) {
711
		tmp = readl(&regs->ep_data);
L
Linus Torvalds 已提交
712 713 714 715 716 717 718
		/* LE conversion is implicit here: */
		do {
			*buf++ = (u8) tmp;
			tmp >>= 8;
		} while (--count);
	}
	if (cleanup)
719
		out_flush(ep);
L
Linus Torvalds 已提交
720
	if (prevent) {
721
		writel(BIT(CLEAR_NAK_OUT_PACKETS), &ep->regs->ep_rsp);
722
		(void) readl(&ep->regs->ep_rsp);
L
Linus Torvalds 已提交
723 724
	}

725 726
	return is_short || ((req->req.actual == req->req.length) &&
			!req->req.zero);
L
Linus Torvalds 已提交
727 728 729
}

/* fill out dma descriptor to match a given request */
730 731
static void fill_dma_desc(struct net2280_ep *ep,
					struct net2280_request *req, int valid)
L
Linus Torvalds 已提交
732 733 734 735 736 737 738 739 740 741
{
	struct net2280_dma	*td = req->td;
	u32			dmacount = req->req.length;

	/* don't let DMA continue after a short OUT packet,
	 * so overruns can't affect the next transfer.
	 * in case of overruns on max-size packets, we can't
	 * stop the fifo from filling but we can flush it.
	 */
	if (ep->is_in)
742
		dmacount |= BIT(DMA_DIRECTION);
743
	if ((!ep->is_in && (dmacount % ep->ep.maxpacket) != 0) ||
744
					!(ep->dev->quirks & PLX_2280))
745
		dmacount |= BIT(END_OF_CHAIN);
L
Linus Torvalds 已提交
746 747 748

	req->valid = valid;
	if (valid)
749
		dmacount |= BIT(VALID_BIT);
L
Linus Torvalds 已提交
750
	if (likely(!req->req.no_interrupt || !use_dma_chaining))
751
		dmacount |= BIT(DMA_DONE_INTERRUPT_ENABLE);
L
Linus Torvalds 已提交
752 753 754 755 756

	/* td->dmadesc = previously set by caller */
	td->dmaaddr = cpu_to_le32 (req->req.dma);

	/* 2280 may be polling VALID_BIT through ep->dma->dmadesc */
757
	wmb();
758
	td->dmacount = cpu_to_le32(dmacount);
L
Linus Torvalds 已提交
759 760 761
}

static const u32 dmactl_default =
762 763
		BIT(DMA_SCATTER_GATHER_DONE_INTERRUPT) |
		BIT(DMA_CLEAR_COUNT_ENABLE) |
L
Linus Torvalds 已提交
764
		/* erratum 0116 workaround part 1 (use POLLING) */
765 766 767 768
		(POLL_100_USEC << DESCRIPTOR_POLLING_RATE) |
		BIT(DMA_VALID_BIT_POLLING_ENABLE) |
		BIT(DMA_VALID_BIT_ENABLE) |
		BIT(DMA_SCATTER_GATHER_ENABLE) |
L
Linus Torvalds 已提交
769
		/* erratum 0116 workaround part 2 (no AUTOSTART) */
770
		BIT(DMA_ENABLE);
L
Linus Torvalds 已提交
771

772
static inline void spin_stop_dma(struct net2280_dma_regs __iomem *dma)
L
Linus Torvalds 已提交
773
{
774
	handshake(&dma->dmactl, BIT(DMA_ENABLE), 0, 50);
L
Linus Torvalds 已提交
775 776
}

777
static inline void stop_dma(struct net2280_dma_regs __iomem *dma)
L
Linus Torvalds 已提交
778
{
779
	writel(readl(&dma->dmactl) & ~BIT(DMA_ENABLE), &dma->dmactl);
780
	spin_stop_dma(dma);
L
Linus Torvalds 已提交
781 782
}

783
static void start_queue(struct net2280_ep *ep, u32 dmactl, u32 td_dma)
L
Linus Torvalds 已提交
784 785
{
	struct net2280_dma_regs	__iomem *dma = ep->dma;
786
	unsigned int tmp = BIT(VALID_BIT) | (ep->is_in << DMA_DIRECTION);
L
Linus Torvalds 已提交
787

788
	if (!(ep->dev->quirks & PLX_2280))
789
		tmp |= BIT(END_OF_CHAIN);
790

791 792
	writel(tmp, &dma->dmacount);
	writel(readl(&dma->dmastat), &dma->dmastat);
L
Linus Torvalds 已提交
793

794
	writel(td_dma, &dma->dmadesc);
795
	if (ep->dev->quirks & PLX_SUPERSPEED)
796
		dmactl |= BIT(DMA_REQUEST_OUTSTANDING);
797
	writel(dmactl, &dma->dmactl);
L
Linus Torvalds 已提交
798 799

	/* erratum 0116 workaround part 3:  pci arbiter away from net2280 */
800
	(void) readl(&ep->dev->pci->pcimstctl);
L
Linus Torvalds 已提交
801

802
	writel(BIT(DMA_START), &dma->dmastat);
L
Linus Torvalds 已提交
803 804

	if (!ep->is_in)
805
		stop_out_naking(ep);
L
Linus Torvalds 已提交
806 807
}

808
static void start_dma(struct net2280_ep *ep, struct net2280_request *req)
L
Linus Torvalds 已提交
809 810 811 812 813 814 815
{
	u32			tmp;
	struct net2280_dma_regs	__iomem *dma = ep->dma;

	/* FIXME can't use DMA for ZLPs */

	/* on this path we "know" there's no dma active (yet) */
816
	WARN_ON(readl(&dma->dmactl) & BIT(DMA_ENABLE));
817
	writel(0, &ep->dma->dmactl);
L
Linus Torvalds 已提交
818 819

	/* previous OUT packet might have been short */
820 821
	if (!ep->is_in && (readl(&ep->regs->ep_stat) &
				BIT(NAK_OUT_PACKETS))) {
822
		writel(BIT(SHORT_PACKET_TRANSFERRED_INTERRUPT),
L
Linus Torvalds 已提交
823 824
			&ep->regs->ep_stat);

825
		tmp = readl(&ep->regs->ep_avail);
L
Linus Torvalds 已提交
826
		if (tmp) {
827
			writel(readl(&dma->dmastat), &dma->dmastat);
L
Linus Torvalds 已提交
828 829

			/* transfer all/some fifo data */
830 831
			writel(req->req.dma, &dma->dmaaddr);
			tmp = min(tmp, req->req.length);
L
Linus Torvalds 已提交
832 833

			/* dma irq, faking scatterlist status */
834
			req->td->dmacount = cpu_to_le32(req->req.length - tmp);
835 836
			writel(BIT(DMA_DONE_INTERRUPT_ENABLE) | tmp,
					&dma->dmacount);
L
Linus Torvalds 已提交
837 838 839
			req->td->dmadesc = 0;
			req->valid = 1;

840 841
			writel(BIT(DMA_ENABLE), &dma->dmactl);
			writel(BIT(DMA_START), &dma->dmastat);
L
Linus Torvalds 已提交
842 843 844 845 846 847 848 849 850 851 852
			return;
		}
	}

	tmp = dmactl_default;

	/* force packet boundaries between dma requests, but prevent the
	 * controller from automagically writing a last "short" packet
	 * (zero length) unless the driver explicitly said to do that.
	 */
	if (ep->is_in) {
853 854
		if (likely((req->req.length % ep->ep.maxpacket) ||
							req->req.zero)){
855
			tmp |= BIT(DMA_FIFO_VALIDATE);
L
Linus Torvalds 已提交
856 857 858 859 860 861 862
			ep->in_fifo_validate = 1;
		} else
			ep->in_fifo_validate = 0;
	}

	/* init req->td, pointing to the current dummy */
	req->td->dmadesc = cpu_to_le32 (ep->td_dma);
863
	fill_dma_desc(ep, req, 1);
L
Linus Torvalds 已提交
864 865

	if (!use_dma_chaining)
866
		req->td->dmacount |= cpu_to_le32(BIT(END_OF_CHAIN));
L
Linus Torvalds 已提交
867

868
	start_queue(ep, tmp, req->td_dma);
L
Linus Torvalds 已提交
869 870
}

871 872
static inline void resume_dma(struct net2280_ep *ep)
{
873
	writel(readl(&ep->dma->dmactl) | BIT(DMA_ENABLE), &ep->dma->dmactl);
874 875 876 877 878 879

	ep->dma_started = true;
}

static inline void ep_stop_dma(struct net2280_ep *ep)
{
880
	writel(readl(&ep->dma->dmactl) & ~BIT(DMA_ENABLE), &ep->dma->dmactl);
881 882 883 884 885
	spin_stop_dma(ep->dma);

	ep->dma_started = false;
}

L
Linus Torvalds 已提交
886
static inline void
887
queue_dma(struct net2280_ep *ep, struct net2280_request *req, int valid)
L
Linus Torvalds 已提交
888 889 890 891 892 893 894 895 896 897 898 899 900 901 902
{
	struct net2280_dma	*end;
	dma_addr_t		tmp;

	/* swap new dummy for old, link; fill and maybe activate */
	end = ep->dummy;
	ep->dummy = req->td;
	req->td = end;

	tmp = ep->td_dma;
	ep->td_dma = req->td_dma;
	req->td_dma = tmp;

	end->dmadesc = cpu_to_le32 (ep->td_dma);

903
	fill_dma_desc(ep, req, valid);
L
Linus Torvalds 已提交
904 905 906
}

static void
907
done(struct net2280_ep *ep, struct net2280_request *req, int status)
L
Linus Torvalds 已提交
908 909 910 911
{
	struct net2280		*dev;
	unsigned		stopped = ep->stopped;

912
	list_del_init(&req->queue);
L
Linus Torvalds 已提交
913 914 915 916 917 918 919

	if (req->req.status == -EINPROGRESS)
		req->req.status = status;
	else
		status = req->req.status;

	dev = ep->dev;
920 921
	if (ep->dma)
		usb_gadget_unmap_request(&dev->gadget, &req->req, ep->is_in);
L
Linus Torvalds 已提交
922 923

	if (status && status != -ESHUTDOWN)
924
		ep_vdbg(dev, "complete %s req %p stat %d len %u/%u\n",
L
Linus Torvalds 已提交
925 926 927 928 929
			ep->ep.name, &req->req, status,
			req->req.actual, req->req.length);

	/* don't modify queue heads during completion callback */
	ep->stopped = 1;
930
	spin_unlock(&dev->lock);
931
	usb_gadget_giveback_request(&ep->ep, &req->req);
932
	spin_lock(&dev->lock);
L
Linus Torvalds 已提交
933 934 935 936 937 938
	ep->stopped = stopped;
}

/*-------------------------------------------------------------------------*/

static int
939
net2280_queue(struct usb_ep *_ep, struct usb_request *_req, gfp_t gfp_flags)
L
Linus Torvalds 已提交
940 941 942 943 944 945 946 947 948
{
	struct net2280_request	*req;
	struct net2280_ep	*ep;
	struct net2280		*dev;
	unsigned long		flags;

	/* we always require a cpu-view buffer, so that we can
	 * always use pio (as fallback or whatever).
	 */
949 950 951
	req = container_of(_req, struct net2280_request, req);
	if (!_req || !_req->complete || !_req->buf ||
				!list_empty(&req->queue))
L
Linus Torvalds 已提交
952 953 954
		return -EINVAL;
	if (_req->length > (~0 & DMA_BYTE_COUNT_MASK))
		return -EDOM;
955
	ep = container_of(_ep, struct net2280_ep, ep);
L
Linus Torvalds 已提交
956 957 958 959 960 961 962 963 964 965 966
	if (!_ep || (!ep->desc && ep->num != 0))
		return -EINVAL;
	dev = ep->dev;
	if (!dev->driver || dev->gadget.speed == USB_SPEED_UNKNOWN)
		return -ESHUTDOWN;

	/* FIXME implement PIO fallback for ZLPs with DMA */
	if (ep->dma && _req->length == 0)
		return -EOPNOTSUPP;

	/* set up dma mapping in case the caller didn't */
967 968 969 970 971 972 973
	if (ep->dma) {
		int ret;

		ret = usb_gadget_map_request(&dev->gadget, _req,
				ep->is_in);
		if (ret)
			return ret;
L
Linus Torvalds 已提交
974 975 976
	}

#if 0
977
	ep_vdbg(dev, "%s queue req %p, len %d buf %p\n",
L
Linus Torvalds 已提交
978 979 980
			_ep->name, _req, _req->length, _req->buf);
#endif

981
	spin_lock_irqsave(&dev->lock, flags);
L
Linus Torvalds 已提交
982 983 984 985 986

	_req->status = -EINPROGRESS;
	_req->actual = 0;

	/* kickstart this i/o queue? */
987
	if (list_empty(&ep->queue) && !ep->stopped) {
988 989
		/* DMA request while EP halted */
		if (ep->dma &&
990
		    (readl(&ep->regs->ep_rsp) & BIT(CLEAR_ENDPOINT_HALT)) &&
991
			(dev->quirks & PLX_SUPERSPEED)) {
992 993 994 995 996 997 998 999 1000 1001 1002
			int valid = 1;
			if (ep->is_in) {
				int expect;
				expect = likely(req->req.zero ||
						((req->req.length %
						  ep->ep.maxpacket) != 0));
				if (expect != ep->in_fifo_validate)
					valid = 0;
			}
			queue_dma(ep, req, valid);
		}
L
Linus Torvalds 已提交
1003
		/* use DMA if the endpoint supports it, else pio */
1004
		else if (ep->dma)
1005
			start_dma(ep, req);
L
Linus Torvalds 已提交
1006 1007 1008
		else {
			/* maybe there's no control data, just status ack */
			if (ep->num == 0 && _req->length == 0) {
1009 1010
				allow_status(ep);
				done(ep, req, 0);
1011
				ep_vdbg(dev, "%s status ack\n", ep->ep.name);
L
Linus Torvalds 已提交
1012 1013 1014 1015 1016
				goto done;
			}

			/* PIO ... stuff the fifo, or unblock it.  */
			if (ep->is_in)
1017 1018
				write_fifo(ep, _req);
			else if (list_empty(&ep->queue)) {
L
Linus Torvalds 已提交
1019 1020 1021
				u32	s;

				/* OUT FIFO might have packet(s) buffered */
1022
				s = readl(&ep->regs->ep_stat);
1023
				if ((s & BIT(FIFO_EMPTY)) == 0) {
L
Linus Torvalds 已提交
1024 1025 1026 1027 1028 1029
					/* note:  _req->short_not_ok is
					 * ignored here since PIO _always_
					 * stops queue advance here, and
					 * _req->status doesn't change for
					 * short reads (only _req->actual)
					 */
1030 1031 1032 1033
					if (read_fifo(ep, req) &&
							ep->num == 0) {
						done(ep, req, 0);
						allow_status(ep);
L
Linus Torvalds 已提交
1034 1035
						/* don't queue it */
						req = NULL;
1036 1037 1038 1039
					} else if (read_fifo(ep, req) &&
							ep->num != 0) {
						done(ep, req, 0);
						req = NULL;
L
Linus Torvalds 已提交
1040
					} else
1041
						s = readl(&ep->regs->ep_stat);
L
Linus Torvalds 已提交
1042 1043 1044
				}

				/* don't NAK, let the fifo fill */
1045 1046
				if (req && (s & BIT(NAK_OUT_PACKETS)))
					writel(BIT(CLEAR_NAK_OUT_PACKETS),
L
Linus Torvalds 已提交
1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059
							&ep->regs->ep_rsp);
			}
		}

	} else if (ep->dma) {
		int	valid = 1;

		if (ep->is_in) {
			int	expect;

			/* preventing magic zlps is per-engine state, not
			 * per-transfer; irq logic must recover hiccups.
			 */
1060 1061
			expect = likely(req->req.zero ||
				(req->req.length % ep->ep.maxpacket));
L
Linus Torvalds 已提交
1062 1063 1064
			if (expect != ep->in_fifo_validate)
				valid = 0;
		}
1065
		queue_dma(ep, req, valid);
L
Linus Torvalds 已提交
1066 1067 1068

	} /* else the irq handler advances the queue. */

1069
	ep->responded = 1;
L
Linus Torvalds 已提交
1070
	if (req)
1071
		list_add_tail(&req->queue, &ep->queue);
L
Linus Torvalds 已提交
1072
done:
1073
	spin_unlock_irqrestore(&dev->lock, flags);
L
Linus Torvalds 已提交
1074 1075 1076 1077 1078 1079

	/* pci writes may still be posted */
	return 0;
}

static inline void
1080 1081
dma_done(struct net2280_ep *ep,	struct net2280_request *req, u32 dmacount,
		int status)
L
Linus Torvalds 已提交
1082 1083
{
	req->req.actual = req->req.length - (DMA_BYTE_COUNT_MASK & dmacount);
1084
	done(ep, req, status);
L
Linus Torvalds 已提交
1085 1086
}

1087
static void restart_dma(struct net2280_ep *ep);
L
Linus Torvalds 已提交
1088

1089
static void scan_dma_completions(struct net2280_ep *ep)
L
Linus Torvalds 已提交
1090 1091 1092 1093
{
	/* only look at descriptors that were "naturally" retired,
	 * so fifo and list head state won't matter
	 */
1094
	while (!list_empty(&ep->queue)) {
L
Linus Torvalds 已提交
1095 1096 1097
		struct net2280_request	*req;
		u32			tmp;

1098
		req = list_entry(ep->queue.next,
L
Linus Torvalds 已提交
1099 1100 1101
				struct net2280_request, queue);
		if (!req->valid)
			break;
1102 1103
		rmb();
		tmp = le32_to_cpup(&req->td->dmacount);
1104
		if ((tmp & BIT(VALID_BIT)) != 0)
L
Linus Torvalds 已提交
1105 1106 1107 1108 1109 1110
			break;

		/* SHORT_PACKET_TRANSFERRED_INTERRUPT handles "usb-short"
		 * cases where DMA must be aborted; this code handles
		 * all non-abort DMA completions.
		 */
1111
		if (unlikely(req->td->dmadesc == 0)) {
L
Linus Torvalds 已提交
1112
			/* paranoia */
1113
			tmp = readl(&ep->dma->dmacount);
L
Linus Torvalds 已提交
1114 1115 1116
			if (tmp & DMA_BYTE_COUNT_MASK)
				break;
			/* single transfer mode */
1117
			dma_done(ep, req, tmp, 0);
L
Linus Torvalds 已提交
1118
			break;
1119 1120
		} else if (!ep->is_in &&
				(req->req.length % ep->ep.maxpacket) != 0) {
1121
			tmp = readl(&ep->regs->ep_stat);
1122
			if (ep->dev->quirks & PLX_SUPERSPEED)
1123
				return dma_done(ep, req, tmp, 0);
L
Linus Torvalds 已提交
1124 1125 1126 1127 1128

			/* AVOID TROUBLE HERE by not issuing short reads from
			 * your gadget driver.  That helps avoids errata 0121,
			 * 0122, and 0124; not all cases trigger the warning.
			 */
1129
			if ((tmp & BIT(NAK_OUT_PACKETS)) == 0) {
1130
				ep_warn(ep->dev, "%s lost packet sync!\n",
L
Linus Torvalds 已提交
1131 1132
						ep->ep.name);
				req->req.status = -EOVERFLOW;
1133 1134 1135 1136 1137
			} else {
				tmp = readl(&ep->regs->ep_avail);
				if (tmp) {
					/* fifo gets flushed later */
					ep->out_overflow = 1;
1138
					ep_dbg(ep->dev,
1139
						"%s dma, discard %d len %d\n",
L
Linus Torvalds 已提交
1140 1141
						ep->ep.name, tmp,
						req->req.length);
1142 1143
					req->req.status = -EOVERFLOW;
				}
L
Linus Torvalds 已提交
1144 1145
			}
		}
1146
		dma_done(ep, req, tmp, 0);
L
Linus Torvalds 已提交
1147 1148 1149
	}
}

1150
static void restart_dma(struct net2280_ep *ep)
L
Linus Torvalds 已提交
1151 1152 1153 1154 1155 1156
{
	struct net2280_request	*req;
	u32			dmactl = dmactl_default;

	if (ep->stopped)
		return;
1157
	req = list_entry(ep->queue.next, struct net2280_request, queue);
L
Linus Torvalds 已提交
1158 1159

	if (!use_dma_chaining) {
1160
		start_dma(ep, req);
L
Linus Torvalds 已提交
1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173
		return;
	}

	/* the 2280 will be processing the queue unless queue hiccups after
	 * the previous transfer:
	 *  IN:   wanted automagic zlp, head doesn't (or vice versa)
	 *        DMA_FIFO_VALIDATE doesn't init from dma descriptors.
	 *  OUT:  was "usb-short", we must restart.
	 */
	if (ep->is_in && !req->valid) {
		struct net2280_request	*entry, *prev = NULL;
		int			reqmode, done = 0;

1174
		ep_dbg(ep->dev, "%s dma hiccup td %p\n", ep->ep.name, req->td);
1175 1176
		ep->in_fifo_validate = likely(req->req.zero ||
				(req->req.length % ep->ep.maxpacket) != 0);
L
Linus Torvalds 已提交
1177
		if (ep->in_fifo_validate)
1178
			dmactl |= BIT(DMA_FIFO_VALIDATE);
1179
		list_for_each_entry(entry, &ep->queue, queue) {
1180
			__le32		dmacount;
L
Linus Torvalds 已提交
1181 1182 1183 1184 1185

			if (entry == req)
				continue;
			dmacount = entry->td->dmacount;
			if (!done) {
1186 1187
				reqmode = likely(entry->req.zero ||
				   (entry->req.length % ep->ep.maxpacket));
L
Linus Torvalds 已提交
1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208
				if (reqmode == ep->in_fifo_validate) {
					entry->valid = 1;
					dmacount |= valid_bit;
					entry->td->dmacount = dmacount;
					prev = entry;
					continue;
				} else {
					/* force a hiccup */
					prev->td->dmacount |= dma_done_ie;
					done = 1;
				}
			}

			/* walk the rest of the queue so unlinks behave */
			entry->valid = 0;
			dmacount &= ~valid_bit;
			entry->td->dmacount = dmacount;
			prev = entry;
		}
	}

1209 1210
	writel(0, &ep->dma->dmactl);
	start_queue(ep, dmactl, req->td_dma);
L
Linus Torvalds 已提交
1211 1212
}

1213
static void abort_dma_228x(struct net2280_ep *ep)
L
Linus Torvalds 已提交
1214 1215
{
	/* abort the current transfer */
1216
	if (likely(!list_empty(&ep->queue))) {
L
Linus Torvalds 已提交
1217
		/* FIXME work around errata 0121, 0122, 0124 */
1218
		writel(BIT(DMA_ABORT), &ep->dma->dmastat);
1219
		spin_stop_dma(ep->dma);
L
Linus Torvalds 已提交
1220
	} else
1221 1222
		stop_dma(ep->dma);
	scan_dma_completions(ep);
L
Linus Torvalds 已提交
1223 1224
}

1225 1226
static void abort_dma_338x(struct net2280_ep *ep)
{
1227
	writel(BIT(DMA_ABORT), &ep->dma->dmastat);
1228 1229 1230 1231 1232
	spin_stop_dma(ep->dma);
}

static void abort_dma(struct net2280_ep *ep)
{
1233
	if (ep->dev->quirks & PLX_LEGACY)
1234 1235 1236 1237
		return abort_dma_228x(ep);
	return abort_dma_338x(ep);
}

L
Linus Torvalds 已提交
1238
/* dequeue ALL requests */
1239
static void nuke(struct net2280_ep *ep)
L
Linus Torvalds 已提交
1240 1241 1242 1243 1244 1245
{
	struct net2280_request	*req;

	/* called with spinlock held */
	ep->stopped = 1;
	if (ep->dma)
1246 1247 1248
		abort_dma(ep);
	while (!list_empty(&ep->queue)) {
		req = list_entry(ep->queue.next,
L
Linus Torvalds 已提交
1249 1250
				struct net2280_request,
				queue);
1251
		done(ep, req, -ESHUTDOWN);
L
Linus Torvalds 已提交
1252 1253 1254 1255
	}
}

/* dequeue JUST ONE request */
1256
static int net2280_dequeue(struct usb_ep *_ep, struct usb_request *_req)
L
Linus Torvalds 已提交
1257 1258 1259 1260 1261 1262 1263
{
	struct net2280_ep	*ep;
	struct net2280_request	*req;
	unsigned long		flags;
	u32			dmactl;
	int			stopped;

1264
	ep = container_of(_ep, struct net2280_ep, ep);
L
Linus Torvalds 已提交
1265 1266 1267
	if (!_ep || (!ep->desc && ep->num != 0) || !_req)
		return -EINVAL;

1268
	spin_lock_irqsave(&ep->dev->lock, flags);
L
Linus Torvalds 已提交
1269 1270 1271 1272 1273 1274
	stopped = ep->stopped;

	/* quiesce dma while we patch the queue */
	dmactl = 0;
	ep->stopped = 1;
	if (ep->dma) {
1275
		dmactl = readl(&ep->dma->dmactl);
L
Linus Torvalds 已提交
1276
		/* WARNING erratum 0127 may kick in ... */
1277 1278
		stop_dma(ep->dma);
		scan_dma_completions(ep);
L
Linus Torvalds 已提交
1279 1280 1281
	}

	/* make sure it's still queued on this endpoint */
1282
	list_for_each_entry(req, &ep->queue, queue) {
L
Linus Torvalds 已提交
1283 1284 1285 1286
		if (&req->req == _req)
			break;
	}
	if (&req->req != _req) {
1287
		spin_unlock_irqrestore(&ep->dev->lock, flags);
L
Linus Torvalds 已提交
1288 1289 1290 1291 1292 1293
		return -EINVAL;
	}

	/* queue head may be partially complete. */
	if (ep->queue.next == &req->queue) {
		if (ep->dma) {
1294
			ep_dbg(ep->dev, "unlink (%s) dma\n", _ep->name);
L
Linus Torvalds 已提交
1295
			_req->status = -ECONNRESET;
1296 1297 1298
			abort_dma(ep);
			if (likely(ep->queue.next == &req->queue)) {
				/* NOTE: misreports single-transfer mode*/
L
Linus Torvalds 已提交
1299
				req->td->dmacount = 0;	/* invalidate */
1300 1301
				dma_done(ep, req,
					readl(&ep->dma->dmacount),
L
Linus Torvalds 已提交
1302 1303 1304
					-ECONNRESET);
			}
		} else {
1305
			ep_dbg(ep->dev, "unlink (%s) pio\n", _ep->name);
1306
			done(ep, req, -ECONNRESET);
L
Linus Torvalds 已提交
1307 1308 1309 1310 1311 1312
		}
		req = NULL;

	/* patch up hardware chaining data */
	} else if (ep->dma && use_dma_chaining) {
		if (req->queue.prev == ep->queue.next) {
1313
			writel(le32_to_cpu(req->td->dmadesc),
L
Linus Torvalds 已提交
1314 1315
				&ep->dma->dmadesc);
			if (req->td->dmacount & dma_done_ie)
1316 1317
				writel(readl(&ep->dma->dmacount) |
						le32_to_cpu(dma_done_ie),
L
Linus Torvalds 已提交
1318 1319 1320 1321
					&ep->dma->dmacount);
		} else {
			struct net2280_request	*prev;

1322
			prev = list_entry(req->queue.prev,
L
Linus Torvalds 已提交
1323 1324 1325 1326 1327 1328 1329 1330
				struct net2280_request, queue);
			prev->td->dmadesc = req->td->dmadesc;
			if (req->td->dmacount & dma_done_ie)
				prev->td->dmacount |= dma_done_ie;
		}
	}

	if (req)
1331
		done(ep, req, -ECONNRESET);
L
Linus Torvalds 已提交
1332 1333 1334 1335
	ep->stopped = stopped;

	if (ep->dma) {
		/* turn off dma on inactive queues */
1336 1337
		if (list_empty(&ep->queue))
			stop_dma(ep->dma);
L
Linus Torvalds 已提交
1338 1339 1340
		else if (!ep->stopped) {
			/* resume current request, or start new one */
			if (req)
1341
				writel(dmactl, &ep->dma->dmactl);
L
Linus Torvalds 已提交
1342
			else
1343
				start_dma(ep, list_entry(ep->queue.next,
L
Linus Torvalds 已提交
1344 1345 1346 1347
					struct net2280_request, queue));
		}
	}

1348
	spin_unlock_irqrestore(&ep->dev->lock, flags);
L
Linus Torvalds 已提交
1349 1350 1351 1352 1353
	return 0;
}

/*-------------------------------------------------------------------------*/

1354
static int net2280_fifo_status(struct usb_ep *_ep);
L
Linus Torvalds 已提交
1355 1356

static int
1357
net2280_set_halt_and_wedge(struct usb_ep *_ep, int value, int wedged)
L
Linus Torvalds 已提交
1358 1359 1360 1361 1362
{
	struct net2280_ep	*ep;
	unsigned long		flags;
	int			retval = 0;

1363
	ep = container_of(_ep, struct net2280_ep, ep);
L
Linus Torvalds 已提交
1364 1365 1366 1367 1368 1369 1370 1371
	if (!_ep || (!ep->desc && ep->num != 0))
		return -EINVAL;
	if (!ep->dev->driver || ep->dev->gadget.speed == USB_SPEED_UNKNOWN)
		return -ESHUTDOWN;
	if (ep->desc /* not ep0 */ && (ep->desc->bmAttributes & 0x03)
						== USB_ENDPOINT_XFER_ISOC)
		return -EINVAL;

1372 1373
	spin_lock_irqsave(&ep->dev->lock, flags);
	if (!list_empty(&ep->queue))
L
Linus Torvalds 已提交
1374
		retval = -EAGAIN;
1375
	else if (ep->is_in && value && net2280_fifo_status(_ep) != 0)
L
Linus Torvalds 已提交
1376 1377
		retval = -EAGAIN;
	else {
1378
		ep_vdbg(ep->dev, "%s %s %s\n", _ep->name,
1379 1380
				value ? "set" : "clear",
				wedged ? "wedge" : "halt");
L
Linus Torvalds 已提交
1381 1382 1383 1384 1385
		/* set/clear, then synch memory views with the device */
		if (value) {
			if (ep->num == 0)
				ep->dev->protocol_stall = 1;
			else
1386
				set_halt(ep);
1387 1388 1389
			if (wedged)
				ep->wedged = 1;
		} else {
1390
			clear_halt(ep);
1391
			if (ep->dev->quirks & PLX_SUPERSPEED &&
1392 1393
				!list_empty(&ep->queue) && ep->td_dma)
					restart_dma(ep);
1394 1395
			ep->wedged = 0;
		}
1396
		(void) readl(&ep->regs->ep_rsp);
L
Linus Torvalds 已提交
1397
	}
1398
	spin_unlock_irqrestore(&ep->dev->lock, flags);
L
Linus Torvalds 已提交
1399 1400 1401 1402

	return retval;
}

1403
static int net2280_set_halt(struct usb_ep *_ep, int value)
1404 1405 1406 1407
{
	return net2280_set_halt_and_wedge(_ep, value, 0);
}

1408
static int net2280_set_wedge(struct usb_ep *_ep)
1409 1410 1411 1412 1413 1414
{
	if (!_ep || _ep->name == ep0name)
		return -EINVAL;
	return net2280_set_halt_and_wedge(_ep, 1, 1);
}

1415
static int net2280_fifo_status(struct usb_ep *_ep)
L
Linus Torvalds 已提交
1416 1417 1418 1419
{
	struct net2280_ep	*ep;
	u32			avail;

1420
	ep = container_of(_ep, struct net2280_ep, ep);
L
Linus Torvalds 已提交
1421 1422 1423 1424 1425
	if (!_ep || (!ep->desc && ep->num != 0))
		return -ENODEV;
	if (!ep->dev->driver || ep->dev->gadget.speed == USB_SPEED_UNKNOWN)
		return -ESHUTDOWN;

1426
	avail = readl(&ep->regs->ep_avail) & (BIT(12) - 1);
L
Linus Torvalds 已提交
1427 1428 1429 1430 1431 1432 1433
	if (avail > ep->fifo_size)
		return -EOVERFLOW;
	if (ep->is_in)
		avail = ep->fifo_size - avail;
	return avail;
}

1434
static void net2280_fifo_flush(struct usb_ep *_ep)
L
Linus Torvalds 已提交
1435 1436 1437
{
	struct net2280_ep	*ep;

1438
	ep = container_of(_ep, struct net2280_ep, ep);
L
Linus Torvalds 已提交
1439 1440 1441 1442 1443
	if (!_ep || (!ep->desc && ep->num != 0))
		return;
	if (!ep->dev->driver || ep->dev->gadget.speed == USB_SPEED_UNKNOWN)
		return;

1444
	writel(BIT(FIFO_FLUSH), &ep->regs->ep_stat);
1445
	(void) readl(&ep->regs->ep_rsp);
L
Linus Torvalds 已提交
1446 1447
}

1448
static const struct usb_ep_ops net2280_ep_ops = {
L
Linus Torvalds 已提交
1449 1450 1451 1452 1453 1454 1455 1456 1457 1458
	.enable		= net2280_enable,
	.disable	= net2280_disable,

	.alloc_request	= net2280_alloc_request,
	.free_request	= net2280_free_request,

	.queue		= net2280_queue,
	.dequeue	= net2280_dequeue,

	.set_halt	= net2280_set_halt,
1459
	.set_wedge	= net2280_set_wedge,
L
Linus Torvalds 已提交
1460 1461 1462 1463 1464 1465
	.fifo_status	= net2280_fifo_status,
	.fifo_flush	= net2280_fifo_flush,
};

/*-------------------------------------------------------------------------*/

1466
static int net2280_get_frame(struct usb_gadget *_gadget)
L
Linus Torvalds 已提交
1467 1468 1469 1470 1471 1472 1473
{
	struct net2280		*dev;
	unsigned long		flags;
	u16			retval;

	if (!_gadget)
		return -ENODEV;
1474 1475 1476 1477
	dev = container_of(_gadget, struct net2280, gadget);
	spin_lock_irqsave(&dev->lock, flags);
	retval = get_idx_reg(dev->regs, REG_FRAME) & 0x03ff;
	spin_unlock_irqrestore(&dev->lock, flags);
L
Linus Torvalds 已提交
1478 1479 1480
	return retval;
}

1481
static int net2280_wakeup(struct usb_gadget *_gadget)
L
Linus Torvalds 已提交
1482 1483 1484 1485 1486 1487 1488
{
	struct net2280		*dev;
	u32			tmp;
	unsigned long		flags;

	if (!_gadget)
		return 0;
1489
	dev = container_of(_gadget, struct net2280, gadget);
L
Linus Torvalds 已提交
1490

1491 1492
	spin_lock_irqsave(&dev->lock, flags);
	tmp = readl(&dev->usb->usbctl);
1493 1494
	if (tmp & BIT(DEVICE_REMOTE_WAKEUP_ENABLE))
		writel(BIT(GENERATE_RESUME), &dev->usb->usbstat);
1495
	spin_unlock_irqrestore(&dev->lock, flags);
L
Linus Torvalds 已提交
1496 1497 1498 1499 1500

	/* pci writes may still be posted */
	return 0;
}

1501
static int net2280_set_selfpowered(struct usb_gadget *_gadget, int value)
L
Linus Torvalds 已提交
1502 1503 1504 1505 1506 1507 1508
{
	struct net2280		*dev;
	u32			tmp;
	unsigned long		flags;

	if (!_gadget)
		return 0;
1509
	dev = container_of(_gadget, struct net2280, gadget);
L
Linus Torvalds 已提交
1510

1511 1512
	spin_lock_irqsave(&dev->lock, flags);
	tmp = readl(&dev->usb->usbctl);
1513
	if (value) {
1514
		tmp |= BIT(SELF_POWERED_STATUS);
1515 1516
		dev->selfpowered = 1;
	} else {
1517
		tmp &= ~BIT(SELF_POWERED_STATUS);
1518 1519
		dev->selfpowered = 0;
	}
1520 1521
	writel(tmp, &dev->usb->usbctl);
	spin_unlock_irqrestore(&dev->lock, flags);
L
Linus Torvalds 已提交
1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533

	return 0;
}

static int net2280_pullup(struct usb_gadget *_gadget, int is_on)
{
	struct net2280  *dev;
	u32             tmp;
	unsigned long   flags;

	if (!_gadget)
		return -ENODEV;
1534
	dev = container_of(_gadget, struct net2280, gadget);
L
Linus Torvalds 已提交
1535

1536 1537
	spin_lock_irqsave(&dev->lock, flags);
	tmp = readl(&dev->usb->usbctl);
L
Linus Torvalds 已提交
1538 1539
	dev->softconnect = (is_on != 0);
	if (is_on)
1540
		tmp |= BIT(USB_DETECT_ENABLE);
L
Linus Torvalds 已提交
1541
	else
1542
		tmp &= ~BIT(USB_DETECT_ENABLE);
1543 1544
	writel(tmp, &dev->usb->usbctl);
	spin_unlock_irqrestore(&dev->lock, flags);
L
Linus Torvalds 已提交
1545 1546 1547 1548

	return 0;
}

1549 1550 1551 1552
static int net2280_start(struct usb_gadget *_gadget,
		struct usb_gadget_driver *driver);
static int net2280_stop(struct usb_gadget *_gadget,
		struct usb_gadget_driver *driver);
1553

L
Linus Torvalds 已提交
1554 1555 1556 1557 1558
static const struct usb_gadget_ops net2280_ops = {
	.get_frame	= net2280_get_frame,
	.wakeup		= net2280_wakeup,
	.set_selfpowered = net2280_set_selfpowered,
	.pullup		= net2280_pullup,
1559 1560
	.udc_start	= net2280_start,
	.udc_stop	= net2280_stop,
L
Linus Torvalds 已提交
1561 1562 1563 1564
};

/*-------------------------------------------------------------------------*/

1565
#ifdef	CONFIG_USB_GADGET_DEBUG_FILES
L
Linus Torvalds 已提交
1566 1567 1568 1569 1570 1571 1572

/* FIXME move these into procfs, and use seq_file.
 * Sysfs _still_ doesn't behave for arbitrarily sized files,
 * and also doesn't help products using this with 2.4 kernels.
 */

/* "function" sysfs attribute */
1573 1574
static ssize_t function_show(struct device *_dev, struct device_attribute *attr,
			     char *buf)
L
Linus Torvalds 已提交
1575
{
1576
	struct net2280	*dev = dev_get_drvdata(_dev);
L
Linus Torvalds 已提交
1577

1578 1579
	if (!dev->driver || !dev->driver->function ||
			strlen(dev->driver->function) > PAGE_SIZE)
L
Linus Torvalds 已提交
1580
		return 0;
1581
	return scnprintf(buf, PAGE_SIZE, "%s\n", dev->driver->function);
L
Linus Torvalds 已提交
1582
}
1583
static DEVICE_ATTR_RO(function);
L
Linus Torvalds 已提交
1584

1585 1586
static ssize_t registers_show(struct device *_dev,
			      struct device_attribute *attr, char *buf)
L
Linus Torvalds 已提交
1587 1588 1589 1590 1591 1592 1593
{
	struct net2280		*dev;
	char			*next;
	unsigned		size, t;
	unsigned long		flags;
	int			i;
	u32			t1, t2;
A
Andrew Morton 已提交
1594
	const char		*s;
L
Linus Torvalds 已提交
1595

1596
	dev = dev_get_drvdata(_dev);
L
Linus Torvalds 已提交
1597 1598
	next = buf;
	size = PAGE_SIZE;
1599
	spin_lock_irqsave(&dev->lock, flags);
L
Linus Torvalds 已提交
1600 1601 1602 1603 1604 1605 1606

	if (dev->driver)
		s = dev->driver->driver.name;
	else
		s = "(none)";

	/* Main Control Registers */
1607
	t = scnprintf(next, size, "%s version " DRIVER_VERSION
L
Linus Torvalds 已提交
1608 1609 1610 1611 1612 1613 1614 1615
			", chiprev %04x, dma %s\n\n"
			"devinit %03x fifoctl %08x gadget '%s'\n"
			"pci irqenb0 %02x irqenb1 %08x "
			"irqstat0 %04x irqstat1 %08x\n",
			driver_name, dev->chiprev,
			use_dma
				? (use_dma_chaining ? "chaining" : "enabled")
				: "disabled",
1616 1617
			readl(&dev->regs->devinit),
			readl(&dev->regs->fifoctl),
L
Linus Torvalds 已提交
1618
			s,
1619 1620 1621 1622
			readl(&dev->regs->pciirqenb0),
			readl(&dev->regs->pciirqenb1),
			readl(&dev->regs->irqstat0),
			readl(&dev->regs->irqstat1));
L
Linus Torvalds 已提交
1623 1624 1625 1626
	size -= t;
	next += t;

	/* USB Control Registers */
1627 1628
	t1 = readl(&dev->usb->usbctl);
	t2 = readl(&dev->usb->usbstat);
1629 1630
	if (t1 & BIT(VBUS_PIN)) {
		if (t2 & BIT(HIGH_SPEED))
L
Linus Torvalds 已提交
1631 1632 1633 1634 1635 1636 1637 1638
			s = "high speed";
		else if (dev->gadget.speed == USB_SPEED_UNKNOWN)
			s = "powered";
		else
			s = "full speed";
		/* full speed bit (6) not working?? */
	} else
			s = "not attached";
1639
	t = scnprintf(next, size,
L
Linus Torvalds 已提交
1640 1641
			"stdrsp %08x usbctl %08x usbstat %08x "
				"addr 0x%02x (%s)\n",
1642 1643
			readl(&dev->usb->stdrsp), t1, t2,
			readl(&dev->usb->ouraddr), s);
L
Linus Torvalds 已提交
1644 1645 1646 1647 1648 1649 1650 1651
	size -= t;
	next += t;

	/* PCI Master Control Registers */

	/* DMA Control Registers */

	/* Configurable EP Control Registers */
1652
	for (i = 0; i < dev->n_ep; i++) {
L
Linus Torvalds 已提交
1653 1654
		struct net2280_ep	*ep;

1655
		ep = &dev->ep[i];
L
Linus Torvalds 已提交
1656 1657 1658
		if (i && !ep->desc)
			continue;

1659
		t1 = readl(&ep->cfg->ep_cfg);
1660 1661
		t2 = readl(&ep->regs->ep_rsp) & 0xff;
		t = scnprintf(next, size,
L
Linus Torvalds 已提交
1662 1663 1664
				"\n%s\tcfg %05x rsp (%02x) %s%s%s%s%s%s%s%s"
					"irqenb %02x\n",
				ep->ep.name, t1, t2,
1665
				(t2 & BIT(CLEAR_NAK_OUT_PACKETS))
L
Linus Torvalds 已提交
1666
					? "NAK " : "",
1667
				(t2 & BIT(CLEAR_EP_HIDE_STATUS_PHASE))
L
Linus Torvalds 已提交
1668
					? "hide " : "",
1669
				(t2 & BIT(CLEAR_EP_FORCE_CRC_ERROR))
L
Linus Torvalds 已提交
1670
					? "CRC " : "",
1671
				(t2 & BIT(CLEAR_INTERRUPT_MODE))
L
Linus Torvalds 已提交
1672
					? "interrupt " : "",
1673
				(t2 & BIT(CLEAR_CONTROL_STATUS_PHASE_HANDSHAKE))
L
Linus Torvalds 已提交
1674
					? "status " : "",
1675
				(t2 & BIT(CLEAR_NAK_OUT_PACKETS_MODE))
L
Linus Torvalds 已提交
1676
					? "NAKmode " : "",
1677
				(t2 & BIT(CLEAR_ENDPOINT_TOGGLE))
L
Linus Torvalds 已提交
1678
					? "DATA1 " : "DATA0 ",
1679
				(t2 & BIT(CLEAR_ENDPOINT_HALT))
L
Linus Torvalds 已提交
1680
					? "HALT " : "",
1681
				readl(&ep->regs->ep_irqenb));
L
Linus Torvalds 已提交
1682 1683 1684
		size -= t;
		next += t;

1685
		t = scnprintf(next, size,
L
Linus Torvalds 已提交
1686 1687
				"\tstat %08x avail %04x "
				"(ep%d%s-%s)%s\n",
1688 1689 1690 1691
				readl(&ep->regs->ep_stat),
				readl(&ep->regs->ep_avail),
				t1 & 0x0f, DIR_STRING(t1),
				type_string(t1 >> 8),
L
Linus Torvalds 已提交
1692 1693 1694 1695 1696 1697 1698
				ep->stopped ? "*" : "");
		size -= t;
		next += t;

		if (!ep->dma)
			continue;

1699
		t = scnprintf(next, size,
L
Linus Torvalds 已提交
1700 1701
				"  dma\tctl %08x stat %08x count %08x\n"
				"\taddr %08x desc %08x\n",
1702 1703 1704 1705 1706
				readl(&ep->dma->dmactl),
				readl(&ep->dma->dmastat),
				readl(&ep->dma->dmacount),
				readl(&ep->dma->dmaaddr),
				readl(&ep->dma->dmadesc));
L
Linus Torvalds 已提交
1707 1708 1709 1710 1711
		size -= t;
		next += t;

	}

1712
	/* Indexed Registers (none yet) */
L
Linus Torvalds 已提交
1713 1714

	/* Statistics */
1715
	t = scnprintf(next, size, "\nirqs:  ");
L
Linus Torvalds 已提交
1716 1717
	size -= t;
	next += t;
1718
	for (i = 0; i < dev->n_ep; i++) {
L
Linus Torvalds 已提交
1719 1720
		struct net2280_ep	*ep;

1721
		ep = &dev->ep[i];
L
Linus Torvalds 已提交
1722 1723
		if (i && !ep->irqs)
			continue;
1724
		t = scnprintf(next, size, " %s/%lu", ep->ep.name, ep->irqs);
L
Linus Torvalds 已提交
1725 1726 1727 1728
		size -= t;
		next += t;

	}
1729
	t = scnprintf(next, size, "\n");
L
Linus Torvalds 已提交
1730 1731 1732
	size -= t;
	next += t;

1733
	spin_unlock_irqrestore(&dev->lock, flags);
L
Linus Torvalds 已提交
1734 1735 1736

	return PAGE_SIZE - size;
}
1737
static DEVICE_ATTR_RO(registers);
L
Linus Torvalds 已提交
1738

1739 1740
static ssize_t queues_show(struct device *_dev, struct device_attribute *attr,
			   char *buf)
L
Linus Torvalds 已提交
1741 1742 1743 1744 1745 1746 1747
{
	struct net2280		*dev;
	char			*next;
	unsigned		size;
	unsigned long		flags;
	int			i;

1748
	dev = dev_get_drvdata(_dev);
L
Linus Torvalds 已提交
1749 1750
	next = buf;
	size = PAGE_SIZE;
1751
	spin_lock_irqsave(&dev->lock, flags);
L
Linus Torvalds 已提交
1752

1753
	for (i = 0; i < dev->n_ep; i++) {
1754
		struct net2280_ep		*ep = &dev->ep[i];
L
Linus Torvalds 已提交
1755 1756 1757 1758 1759 1760 1761 1762 1763 1764
		struct net2280_request		*req;
		int				t;

		if (i != 0) {
			const struct usb_endpoint_descriptor	*d;

			d = ep->desc;
			if (!d)
				continue;
			t = d->bEndpointAddress;
1765
			t = scnprintf(next, size,
L
Linus Torvalds 已提交
1766 1767 1768
				"\n%s (ep%d%s-%s) max %04x %s fifo %d\n",
				ep->ep.name, t & USB_ENDPOINT_NUMBER_MASK,
				(t & USB_DIR_IN) ? "in" : "out",
1769
				type_string(d->bmAttributes),
1770
				usb_endpoint_maxp(d) & 0x1fff,
L
Linus Torvalds 已提交
1771 1772 1773
				ep->dma ? "dma" : "pio", ep->fifo_size
				);
		} else /* ep0 should only have one transfer queued */
1774
			t = scnprintf(next, size, "ep0 max 64 pio %s\n",
L
Linus Torvalds 已提交
1775 1776 1777 1778 1779 1780
					ep->is_in ? "in" : "out");
		if (t <= 0 || t > size)
			goto done;
		size -= t;
		next += t;

1781 1782
		if (list_empty(&ep->queue)) {
			t = scnprintf(next, size, "\t(nothing queued)\n");
L
Linus Torvalds 已提交
1783 1784 1785 1786 1787 1788
			if (t <= 0 || t > size)
				goto done;
			size -= t;
			next += t;
			continue;
		}
1789 1790 1791
		list_for_each_entry(req, &ep->queue, queue) {
			if (ep->dma && req->td_dma == readl(&ep->dma->dmadesc))
				t = scnprintf(next, size,
L
Linus Torvalds 已提交
1792 1793 1794 1795
					"\treq %p len %d/%d "
					"buf %p (dmacount %08x)\n",
					&req->req, req->req.actual,
					req->req.length, req->req.buf,
1796
					readl(&ep->dma->dmacount));
L
Linus Torvalds 已提交
1797
			else
1798
				t = scnprintf(next, size,
L
Linus Torvalds 已提交
1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810
					"\treq %p len %d/%d buf %p\n",
					&req->req, req->req.actual,
					req->req.length, req->req.buf);
			if (t <= 0 || t > size)
				goto done;
			size -= t;
			next += t;

			if (ep->dma) {
				struct net2280_dma	*td;

				td = req->td;
1811
				t = scnprintf(next, size, "\t    td %08x "
L
Linus Torvalds 已提交
1812 1813
					" count %08x buf %08x desc %08x\n",
					(u32) req->td_dma,
1814 1815 1816
					le32_to_cpu(td->dmacount),
					le32_to_cpu(td->dmaaddr),
					le32_to_cpu(td->dmadesc));
L
Linus Torvalds 已提交
1817 1818 1819 1820 1821 1822 1823 1824 1825
				if (t <= 0 || t > size)
					goto done;
				size -= t;
				next += t;
			}
		}
	}

done:
1826
	spin_unlock_irqrestore(&dev->lock, flags);
L
Linus Torvalds 已提交
1827 1828
	return PAGE_SIZE - size;
}
1829
static DEVICE_ATTR_RO(queues);
L
Linus Torvalds 已提交
1830 1831 1832 1833


#else

1834 1835
#define device_create_file(a, b)	(0)
#define device_remove_file(a, b)	do { } while (0)
L
Linus Torvalds 已提交
1836 1837 1838 1839 1840 1841 1842 1843 1844

#endif

/*-------------------------------------------------------------------------*/

/* another driver-specific mode might be a request type doing dma
 * to/from another device fifo instead of to/from memory.
 */

1845
static void set_fifo_mode(struct net2280 *dev, int mode)
L
Linus Torvalds 已提交
1846 1847
{
	/* keeping high bits preserves BAR2 */
1848
	writel((0xffff << PCI_BASE2_RANGE) | mode, &dev->regs->fifoctl);
L
Linus Torvalds 已提交
1849 1850

	/* always ep-{a,b,e,f} ... maybe not ep-c or ep-d */
1851 1852 1853
	INIT_LIST_HEAD(&dev->gadget.ep_list);
	list_add_tail(&dev->ep[1].ep.ep_list, &dev->gadget.ep_list);
	list_add_tail(&dev->ep[2].ep.ep_list, &dev->gadget.ep_list);
L
Linus Torvalds 已提交
1854 1855
	switch (mode) {
	case 0:
1856 1857 1858
		list_add_tail(&dev->ep[3].ep.ep_list, &dev->gadget.ep_list);
		list_add_tail(&dev->ep[4].ep.ep_list, &dev->gadget.ep_list);
		dev->ep[1].fifo_size = dev->ep[2].fifo_size = 1024;
L
Linus Torvalds 已提交
1859 1860
		break;
	case 1:
1861
		dev->ep[1].fifo_size = dev->ep[2].fifo_size = 2048;
L
Linus Torvalds 已提交
1862 1863
		break;
	case 2:
1864 1865 1866
		list_add_tail(&dev->ep[3].ep.ep_list, &dev->gadget.ep_list);
		dev->ep[1].fifo_size = 2048;
		dev->ep[2].fifo_size = 1024;
L
Linus Torvalds 已提交
1867 1868 1869
		break;
	}
	/* fifo sizes for ep0, ep-c, ep-d, ep-e, and ep-f never change */
1870 1871
	list_add_tail(&dev->ep[5].ep.ep_list, &dev->gadget.ep_list);
	list_add_tail(&dev->ep[6].ep.ep_list, &dev->gadget.ep_list);
L
Linus Torvalds 已提交
1872 1873
}

1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905
static void defect7374_disable_data_eps(struct net2280 *dev)
{
	/*
	 * For Defect 7374, disable data EPs (and more):
	 *  - This phase undoes the earlier phase of the Defect 7374 workaround,
	 *    returing ep regs back to normal.
	 */
	struct net2280_ep *ep;
	int i;
	unsigned char ep_sel;
	u32 tmp_reg;

	for (i = 1; i < 5; i++) {
		ep = &dev->ep[i];
		writel(0, &ep->cfg->ep_cfg);
	}

	/* CSROUT, CSRIN, PCIOUT, PCIIN, STATIN, RCIN */
	for (i = 0; i < 6; i++)
		writel(0, &dev->dep[i].dep_cfg);

	for (ep_sel = 0; ep_sel <= 21; ep_sel++) {
		/* Select an endpoint for subsequent operations: */
		tmp_reg = readl(&dev->plregs->pl_ep_ctrl);
		writel(((tmp_reg & ~0x1f) | ep_sel), &dev->plregs->pl_ep_ctrl);

		if (ep_sel < 2 || (ep_sel > 9 && ep_sel < 14) ||
					ep_sel == 18 || ep_sel == 20)
			continue;

		/* Change settings on some selected endpoints */
		tmp_reg = readl(&dev->plregs->pl_ep_cfg_4);
1906
		tmp_reg &= ~BIT(NON_CTRL_IN_TOLERATE_BAD_DIR);
1907 1908
		writel(tmp_reg, &dev->plregs->pl_ep_cfg_4);
		tmp_reg = readl(&dev->plregs->pl_ep_ctrl);
1909
		tmp_reg |= BIT(EP_INITIALIZED);
1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926
		writel(tmp_reg, &dev->plregs->pl_ep_ctrl);
	}
}

static void defect7374_enable_data_eps_zero(struct net2280 *dev)
{
	u32 tmp = 0, tmp_reg;
	u32 fsmvalue, scratch;
	int i;
	unsigned char ep_sel;

	scratch = get_idx_reg(dev->regs, SCRATCH);
	fsmvalue = scratch & (0xf << DEFECT7374_FSM_FIELD);
	scratch &= ~(0xf << DEFECT7374_FSM_FIELD);

	/*See if firmware needs to set up for workaround*/
	if (fsmvalue != DEFECT7374_FSM_SS_CONTROL_READ) {
1927 1928
		ep_warn(dev, "Operate Defect 7374 workaround soft this time");
		ep_warn(dev, "It will operate on cold-reboot and SS connect");
1929 1930

		/*GPEPs:*/
1931
		tmp = ((0 << ENDPOINT_NUMBER) | BIT(ENDPOINT_DIRECTION) |
1932 1933
		       (2 << OUT_ENDPOINT_TYPE) | (2 << IN_ENDPOINT_TYPE) |
		       ((dev->enhanced_mode) ?
1934 1935
		       BIT(OUT_ENDPOINT_ENABLE) : BIT(ENDPOINT_ENABLE)) |
		       BIT(IN_ENDPOINT_ENABLE));
1936 1937 1938 1939 1940

		for (i = 1; i < 5; i++)
			writel(tmp, &dev->ep[i].cfg->ep_cfg);

		/* CSRIN, PCIIN, STATIN, RCIN*/
1941
		tmp = ((0 << ENDPOINT_NUMBER) | BIT(ENDPOINT_ENABLE));
1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957
		writel(tmp, &dev->dep[1].dep_cfg);
		writel(tmp, &dev->dep[3].dep_cfg);
		writel(tmp, &dev->dep[4].dep_cfg);
		writel(tmp, &dev->dep[5].dep_cfg);

		/*Implemented for development and debug.
		 * Can be refined/tuned later.*/
		for (ep_sel = 0; ep_sel <= 21; ep_sel++) {
			/* Select an endpoint for subsequent operations: */
			tmp_reg = readl(&dev->plregs->pl_ep_ctrl);
			writel(((tmp_reg & ~0x1f) | ep_sel),
			       &dev->plregs->pl_ep_ctrl);

			if (ep_sel == 1) {
				tmp =
				    (readl(&dev->plregs->pl_ep_ctrl) |
1958
				     BIT(CLEAR_ACK_ERROR_CODE) | 0);
1959 1960 1961 1962 1963 1964 1965 1966 1967
				writel(tmp, &dev->plregs->pl_ep_ctrl);
				continue;
			}

			if (ep_sel == 0 || (ep_sel > 9 && ep_sel < 14) ||
					ep_sel == 18  || ep_sel == 20)
				continue;

			tmp = (readl(&dev->plregs->pl_ep_cfg_4) |
1968
				 BIT(NON_CTRL_IN_TOLERATE_BAD_DIR) | 0);
1969 1970 1971
			writel(tmp, &dev->plregs->pl_ep_cfg_4);

			tmp = readl(&dev->plregs->pl_ep_ctrl) &
1972
				~BIT(EP_INITIALIZED);
1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983
			writel(tmp, &dev->plregs->pl_ep_ctrl);

		}

		/* Set FSM to focus on the first Control Read:
		 * - Tip: Connection speed is known upon the first
		 * setup request.*/
		scratch |= DEFECT7374_FSM_WAITING_FOR_CONTROL_READ;
		set_idx_reg(dev->regs, SCRATCH, scratch);

	} else{
1984 1985
		ep_warn(dev, "Defect 7374 workaround soft will NOT operate");
		ep_warn(dev, "It will operate on cold-reboot and SS connect");
1986 1987 1988
	}
}

L
Linus Torvalds 已提交
1989 1990 1991 1992 1993 1994 1995 1996 1997
/* keeping it simple:
 * - one bus driver, initted first;
 * - one function driver, initted second
 *
 * most of the work to support multiple net2280 controllers would
 * be to associate this gadget driver (yes?) with all of them, or
 * perhaps to bind specific drivers to specific devices.
 */

1998
static void usb_reset_228x(struct net2280 *dev)
L
Linus Torvalds 已提交
1999 2000 2001 2002
{
	u32	tmp;

	dev->gadget.speed = USB_SPEED_UNKNOWN;
2003
	(void) readl(&dev->usb->usbctl);
L
Linus Torvalds 已提交
2004

2005
	net2280_led_init(dev);
L
Linus Torvalds 已提交
2006 2007

	/* disable automatic responses, and irqs */
2008 2009 2010
	writel(0, &dev->usb->stdrsp);
	writel(0, &dev->regs->pciirqenb0);
	writel(0, &dev->regs->pciirqenb1);
L
Linus Torvalds 已提交
2011 2012 2013

	/* clear old dma and irq state */
	for (tmp = 0; tmp < 4; tmp++) {
2014
		struct net2280_ep       *ep = &dev->ep[tmp + 1];
L
Linus Torvalds 已提交
2015
		if (ep->dma)
2016
			abort_dma(ep);
L
Linus Torvalds 已提交
2017
	}
2018

2019
	writel(~0, &dev->regs->irqstat0),
2020
	writel(~(u32)BIT(SUSPEND_REQUEST_INTERRUPT), &dev->regs->irqstat1),
L
Linus Torvalds 已提交
2021 2022

	/* reset, and enable pci */
2023 2024 2025 2026 2027
	tmp = readl(&dev->regs->devinit) |
		BIT(PCI_ENABLE) |
		BIT(FIFO_SOFT_RESET) |
		BIT(USB_SOFT_RESET) |
		BIT(M8051_RESET);
2028
	writel(tmp, &dev->regs->devinit);
L
Linus Torvalds 已提交
2029 2030

	/* standard fifo and endpoint allocations */
2031
	set_fifo_mode(dev, (fifo_mode <= 2) ? fifo_mode : 0);
L
Linus Torvalds 已提交
2032 2033
}

2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048
static void usb_reset_338x(struct net2280 *dev)
{
	u32 tmp;
	u32 fsmvalue;

	dev->gadget.speed = USB_SPEED_UNKNOWN;
	(void)readl(&dev->usb->usbctl);

	net2280_led_init(dev);

	fsmvalue = get_idx_reg(dev->regs, SCRATCH) &
			(0xf << DEFECT7374_FSM_FIELD);

	/* See if firmware needs to set up for workaround: */
	if (fsmvalue != DEFECT7374_FSM_SS_CONTROL_READ) {
2049
		ep_info(dev, "%s: Defect 7374 FsmValue 0x%08x\n", __func__,
2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070
		     fsmvalue);
	} else {
		/* disable automatic responses, and irqs */
		writel(0, &dev->usb->stdrsp);
		writel(0, &dev->regs->pciirqenb0);
		writel(0, &dev->regs->pciirqenb1);
	}

	/* clear old dma and irq state */
	for (tmp = 0; tmp < 4; tmp++) {
		struct net2280_ep *ep = &dev->ep[tmp + 1];

		if (ep->dma)
			abort_dma(ep);
	}

	writel(~0, &dev->regs->irqstat0), writel(~0, &dev->regs->irqstat1);

	if (fsmvalue == DEFECT7374_FSM_SS_CONTROL_READ) {
		/* reset, and enable pci */
		tmp = readl(&dev->regs->devinit) |
2071 2072 2073 2074
		    BIT(PCI_ENABLE) |
		    BIT(FIFO_SOFT_RESET) |
		    BIT(USB_SOFT_RESET) |
		    BIT(M8051_RESET);
2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088

		writel(tmp, &dev->regs->devinit);
	}

	/* always ep-{1,2,3,4} ... maybe not ep-3 or ep-4 */
	INIT_LIST_HEAD(&dev->gadget.ep_list);

	for (tmp = 1; tmp < dev->n_ep; tmp++)
		list_add_tail(&dev->ep[tmp].ep.ep_list, &dev->gadget.ep_list);

}

static void usb_reset(struct net2280 *dev)
{
2089
	if (dev->quirks & PLX_LEGACY)
2090 2091 2092 2093 2094
		return usb_reset_228x(dev);
	return usb_reset_338x(dev);
}

static void usb_reinit_228x(struct net2280 *dev)
L
Linus Torvalds 已提交
2095 2096 2097 2098 2099 2100 2101 2102 2103
{
	u32	tmp;
	int	init_dma;

	/* use_dma changes are ignored till next device re-init */
	init_dma = use_dma;

	/* basic endpoint init */
	for (tmp = 0; tmp < 7; tmp++) {
2104
		struct net2280_ep	*ep = &dev->ep[tmp];
L
Linus Torvalds 已提交
2105

2106
		ep->ep.name = ep_name[tmp];
L
Linus Torvalds 已提交
2107 2108 2109 2110 2111 2112
		ep->dev = dev;
		ep->num = tmp;

		if (tmp > 0 && tmp <= 4) {
			ep->fifo_size = 1024;
			if (init_dma)
2113
				ep->dma = &dev->dma[tmp - 1];
L
Linus Torvalds 已提交
2114 2115
		} else
			ep->fifo_size = 64;
2116
		ep->regs = &dev->epregs[tmp];
2117 2118
		ep->cfg = &dev->epregs[tmp];
		ep_reset_228x(dev->regs, ep);
L
Linus Torvalds 已提交
2119
	}
2120 2121 2122
	usb_ep_set_maxpacket_limit(&dev->ep[0].ep, 64);
	usb_ep_set_maxpacket_limit(&dev->ep[5].ep, 64);
	usb_ep_set_maxpacket_limit(&dev->ep[6].ep, 64);
L
Linus Torvalds 已提交
2123

2124 2125 2126
	dev->gadget.ep0 = &dev->ep[0].ep;
	dev->ep[0].stopped = 0;
	INIT_LIST_HEAD(&dev->gadget.ep0->ep_list);
L
Linus Torvalds 已提交
2127 2128 2129 2130 2131

	/* we want to prevent lowlevel/insecure access from the USB host,
	 * but erratum 0119 means this enable bit is ignored
	 */
	for (tmp = 0; tmp < 5; tmp++)
2132
		writel(EP_DONTUSE, &dev->dep[tmp].dep_cfg);
L
Linus Torvalds 已提交
2133 2134
}

2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161
static void usb_reinit_338x(struct net2280 *dev)
{
	int init_dma;
	int i;
	u32 tmp, val;
	u32 fsmvalue;
	static const u32 ne[9] = { 0, 1, 2, 3, 4, 1, 2, 3, 4 };
	static const u32 ep_reg_addr[9] = { 0x00, 0xC0, 0x00, 0xC0, 0x00,
						0x00, 0xC0, 0x00, 0xC0 };

	/* use_dma changes are ignored till next device re-init */
	init_dma = use_dma;

	/* basic endpoint init */
	for (i = 0; i < dev->n_ep; i++) {
		struct net2280_ep *ep = &dev->ep[i];

		ep->ep.name = ep_name[i];
		ep->dev = dev;
		ep->num = i;

		if (i > 0 && i <= 4 && init_dma)
			ep->dma = &dev->dma[i - 1];

		if (dev->enhanced_mode) {
			ep->cfg = &dev->epregs[ne[i]];
			ep->regs = (struct net2280_ep_regs __iomem *)
2162
				(((void __iomem *)&dev->epregs[ne[i]]) +
2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185
				ep_reg_addr[i]);
			ep->fiforegs = &dev->fiforegs[i];
		} else {
			ep->cfg = &dev->epregs[i];
			ep->regs = &dev->epregs[i];
			ep->fiforegs = &dev->fiforegs[i];
		}

		ep->fifo_size = (i != 0) ? 2048 : 512;

		ep_reset_338x(dev->regs, ep);
	}
	usb_ep_set_maxpacket_limit(&dev->ep[0].ep, 512);

	dev->gadget.ep0 = &dev->ep[0].ep;
	dev->ep[0].stopped = 0;

	/* Link layer set up */
	fsmvalue = get_idx_reg(dev->regs, SCRATCH) &
				(0xf << DEFECT7374_FSM_FIELD);

	/* See if driver needs to set up for workaround: */
	if (fsmvalue != DEFECT7374_FSM_SS_CONTROL_READ)
2186
		ep_info(dev, "%s: Defect 7374 FsmValue %08x\n",
2187 2188 2189
						__func__, fsmvalue);
	else {
		tmp = readl(&dev->usb_ext->usbctl2) &
2190
		    ~(BIT(U1_ENABLE) | BIT(U2_ENABLE) | BIT(LTM_ENABLE));
2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228
		writel(tmp, &dev->usb_ext->usbctl2);
	}

	/* Hardware Defect and Workaround */
	val = readl(&dev->ll_lfps_regs->ll_lfps_5);
	val &= ~(0xf << TIMER_LFPS_6US);
	val |= 0x5 << TIMER_LFPS_6US;
	writel(val, &dev->ll_lfps_regs->ll_lfps_5);

	val = readl(&dev->ll_lfps_regs->ll_lfps_6);
	val &= ~(0xffff << TIMER_LFPS_80US);
	val |= 0x0100 << TIMER_LFPS_80US;
	writel(val, &dev->ll_lfps_regs->ll_lfps_6);

	/*
	 * AA_AB Errata. Issue 4. Workaround for SuperSpeed USB
	 * Hot Reset Exit Handshake may Fail in Specific Case using
	 * Default Register Settings. Workaround for Enumeration test.
	 */
	val = readl(&dev->ll_tsn_regs->ll_tsn_counters_2);
	val &= ~(0x1f << HOT_TX_NORESET_TS2);
	val |= 0x10 << HOT_TX_NORESET_TS2;
	writel(val, &dev->ll_tsn_regs->ll_tsn_counters_2);

	val = readl(&dev->ll_tsn_regs->ll_tsn_counters_3);
	val &= ~(0x1f << HOT_RX_RESET_TS2);
	val |= 0x3 << HOT_RX_RESET_TS2;
	writel(val, &dev->ll_tsn_regs->ll_tsn_counters_3);

	/*
	 * Set Recovery Idle to Recover bit:
	 * - On SS connections, setting Recovery Idle to Recover Fmw improves
	 *   link robustness with various hosts and hubs.
	 * - It is safe to set for all connection speeds; all chip revisions.
	 * - R-M-W to leave other bits undisturbed.
	 * - Reference PLX TT-7372
	*/
	val = readl(&dev->ll_chicken_reg->ll_tsn_chicken_bit);
2229
	val |= BIT(RECOVERY_IDLE_TO_RECOVER_FMW);
2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244
	writel(val, &dev->ll_chicken_reg->ll_tsn_chicken_bit);

	INIT_LIST_HEAD(&dev->gadget.ep0->ep_list);

	/* disable dedicated endpoints */
	writel(0x0D, &dev->dep[0].dep_cfg);
	writel(0x0D, &dev->dep[1].dep_cfg);
	writel(0x0E, &dev->dep[2].dep_cfg);
	writel(0x0E, &dev->dep[3].dep_cfg);
	writel(0x0F, &dev->dep[4].dep_cfg);
	writel(0x0C, &dev->dep[5].dep_cfg);
}

static void usb_reinit(struct net2280 *dev)
{
2245
	if (dev->quirks & PLX_LEGACY)
2246 2247 2248 2249 2250
		return usb_reinit_228x(dev);
	return usb_reinit_338x(dev);
}

static void ep0_start_228x(struct net2280 *dev)
L
Linus Torvalds 已提交
2251
{
2252 2253
	writel(BIT(CLEAR_EP_HIDE_STATUS_PHASE) |
		BIT(CLEAR_NAK_OUT_PACKETS) |
2254 2255
		BIT(CLEAR_CONTROL_STATUS_PHASE_HANDSHAKE),
		&dev->epregs[0].ep_rsp);
L
Linus Torvalds 已提交
2256 2257 2258 2259 2260 2261 2262

	/*
	 * hardware optionally handles a bunch of standard requests
	 * that the API hides from drivers anyway.  have it do so.
	 * endpoint status/features are handled in software, to
	 * help pass tests for some dubious behavior.
	 */
2263 2264 2265 2266
	writel(BIT(SET_TEST_MODE) |
		BIT(SET_ADDRESS) |
		BIT(DEVICE_SET_CLEAR_DEVICE_REMOTE_WAKEUP) |
		BIT(GET_DEVICE_STATUS) |
2267 2268
		BIT(GET_INTERFACE_STATUS),
		&dev->usb->stdrsp);
2269 2270 2271 2272 2273 2274
	writel(BIT(USB_ROOT_PORT_WAKEUP_ENABLE) |
		BIT(SELF_POWERED_USB_DEVICE) |
		BIT(REMOTE_WAKEUP_SUPPORT) |
		(dev->softconnect << USB_DETECT_ENABLE) |
		BIT(SELF_POWERED_STATUS),
		&dev->usb->usbctl);
L
Linus Torvalds 已提交
2275 2276

	/* enable irqs so we can see ep0 and general operation  */
2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287
	writel(BIT(SETUP_PACKET_INTERRUPT_ENABLE) |
		BIT(ENDPOINT_0_INTERRUPT_ENABLE),
		&dev->regs->pciirqenb0);
	writel(BIT(PCI_INTERRUPT_ENABLE) |
		BIT(PCI_MASTER_ABORT_RECEIVED_INTERRUPT_ENABLE) |
		BIT(PCI_TARGET_ABORT_RECEIVED_INTERRUPT_ENABLE) |
		BIT(PCI_RETRY_ABORT_INTERRUPT_ENABLE) |
		BIT(VBUS_INTERRUPT_ENABLE) |
		BIT(ROOT_PORT_RESET_INTERRUPT_ENABLE) |
		BIT(SUSPEND_REQUEST_CHANGE_INTERRUPT_ENABLE),
		&dev->regs->pciirqenb1);
L
Linus Torvalds 已提交
2288 2289

	/* don't leave any writes posted */
2290
	(void) readl(&dev->usb->usbctl);
L
Linus Torvalds 已提交
2291 2292
}

2293 2294 2295 2296 2297 2298 2299 2300
static void ep0_start_338x(struct net2280 *dev)
{
	u32 fsmvalue;

	fsmvalue = get_idx_reg(dev->regs, SCRATCH) &
			(0xf << DEFECT7374_FSM_FIELD);

	if (fsmvalue != DEFECT7374_FSM_SS_CONTROL_READ)
2301
		ep_info(dev, "%s: Defect 7374 FsmValue %08x\n", __func__,
2302 2303
		     fsmvalue);
	else
2304 2305
		writel(BIT(CLEAR_NAK_OUT_PACKETS_MODE) |
		       BIT(SET_EP_HIDE_STATUS_PHASE),
2306 2307 2308 2309 2310 2311 2312 2313
		       &dev->epregs[0].ep_rsp);

	/*
	 * hardware optionally handles a bunch of standard requests
	 * that the API hides from drivers anyway.  have it do so.
	 * endpoint status/features are handled in software, to
	 * help pass tests for some dubious behavior.
	 */
2314 2315 2316 2317 2318 2319
	writel(BIT(SET_ISOCHRONOUS_DELAY) |
	       BIT(SET_SEL) |
	       BIT(SET_TEST_MODE) |
	       BIT(SET_ADDRESS) |
	       BIT(GET_INTERFACE_STATUS) |
	       BIT(GET_DEVICE_STATUS),
2320 2321
		&dev->usb->stdrsp);
	dev->wakeup_enable = 1;
2322
	writel(BIT(USB_ROOT_PORT_WAKEUP_ENABLE) |
2323
	       (dev->softconnect << USB_DETECT_ENABLE) |
2324
	       BIT(DEVICE_REMOTE_WAKEUP_ENABLE),
2325 2326 2327
	       &dev->usb->usbctl);

	/* enable irqs so we can see ep0 and general operation  */
2328
	writel(BIT(SETUP_PACKET_INTERRUPT_ENABLE) |
2329 2330
	       BIT(ENDPOINT_0_INTERRUPT_ENABLE),
	       &dev->regs->pciirqenb0);
2331 2332 2333 2334
	writel(BIT(PCI_INTERRUPT_ENABLE) |
	       BIT(ROOT_PORT_RESET_INTERRUPT_ENABLE) |
	       BIT(SUSPEND_REQUEST_CHANGE_INTERRUPT_ENABLE) |
	       BIT(VBUS_INTERRUPT_ENABLE),
2335 2336 2337 2338 2339 2340 2341 2342
	       &dev->regs->pciirqenb1);

	/* don't leave any writes posted */
	(void)readl(&dev->usb->usbctl);
}

static void ep0_start(struct net2280 *dev)
{
2343
	if (dev->quirks & PLX_LEGACY)
2344 2345 2346 2347
		return ep0_start_228x(dev);
	return ep0_start_338x(dev);
}

L
Linus Torvalds 已提交
2348 2349 2350 2351 2352 2353
/* when a driver is successfully registered, it will receive
 * control requests including set_configuration(), which enables
 * non-control requests.  then usb traffic follows until a
 * disconnect is reported.  then a host may connect again, or
 * the driver might get unbound.
 */
2354 2355
static int net2280_start(struct usb_gadget *_gadget,
		struct usb_gadget_driver *driver)
L
Linus Torvalds 已提交
2356
{
2357
	struct net2280		*dev;
L
Linus Torvalds 已提交
2358 2359 2360 2361 2362 2363 2364
	int			retval;
	unsigned		i;

	/* insist on high speed support from the driver, since
	 * (dev->usb->xcvrdiag & FORCE_FULL_SPEED_MODE)
	 * "must not be used in normal operation"
	 */
2365 2366
	if (!driver || driver->max_speed < USB_SPEED_HIGH ||
			!driver->setup)
L
Linus Torvalds 已提交
2367
		return -EINVAL;
2368

2369
	dev = container_of(_gadget, struct net2280, gadget);
L
Linus Torvalds 已提交
2370

2371
	for (i = 0; i < dev->n_ep; i++)
2372
		dev->ep[i].irqs = 0;
L
Linus Torvalds 已提交
2373 2374 2375 2376 2377 2378

	/* hook up the driver ... */
	dev->softconnect = 1;
	driver->driver.bus = NULL;
	dev->driver = driver;

2379 2380 2381 2382 2383 2384
	retval = device_create_file(&dev->pdev->dev, &dev_attr_function);
	if (retval)
		goto err_unbind;
	retval = device_create_file(&dev->pdev->dev, &dev_attr_queues);
	if (retval)
		goto err_func;
L
Linus Torvalds 已提交
2385

2386
	/* Enable force-full-speed testing mode, if desired */
2387
	if (full_speed && (dev->quirks & PLX_LEGACY))
2388
		writel(BIT(FORCE_FULL_SPEED_MODE), &dev->usb->xcvrdiag);
2389

L
Linus Torvalds 已提交
2390 2391 2392
	/* ... then enable host detection and ep0; and we're ready
	 * for set_configuration as well as eventual disconnect.
	 */
2393
	net2280_led_active(dev, 1);
2394

2395
	if (dev->quirks & PLX_SUPERSPEED)
2396 2397
		defect7374_enable_data_eps_zero(dev);

2398
	ep0_start(dev);
L
Linus Torvalds 已提交
2399 2400 2401

	/* pci writes may still be posted */
	return 0;
2402 2403

err_func:
2404
	device_remove_file(&dev->pdev->dev, &dev_attr_function);
2405 2406 2407
err_unbind:
	dev->driver = NULL;
	return retval;
L
Linus Torvalds 已提交
2408 2409
}

2410
static void stop_activity(struct net2280 *dev, struct usb_gadget_driver *driver)
L
Linus Torvalds 已提交
2411 2412 2413 2414 2415 2416 2417 2418 2419 2420
{
	int			i;

	/* don't disconnect if it's not connected */
	if (dev->gadget.speed == USB_SPEED_UNKNOWN)
		driver = NULL;

	/* stop hardware; prevent new request submissions;
	 * and kill any outstanding requests.
	 */
2421
	usb_reset(dev);
2422
	for (i = 0; i < dev->n_ep; i++)
2423
		nuke(&dev->ep[i]);
L
Linus Torvalds 已提交
2424

2425 2426 2427 2428 2429 2430 2431
	/* report disconnect; the driver is already quiesced */
	if (driver) {
		spin_unlock(&dev->lock);
		driver->disconnect(&dev->gadget);
		spin_lock(&dev->lock);
	}

2432
	usb_reinit(dev);
L
Linus Torvalds 已提交
2433 2434
}

2435 2436
static int net2280_stop(struct usb_gadget *_gadget,
		struct usb_gadget_driver *driver)
L
Linus Torvalds 已提交
2437
{
2438
	struct net2280	*dev;
L
Linus Torvalds 已提交
2439 2440
	unsigned long	flags;

2441
	dev = container_of(_gadget, struct net2280, gadget);
L
Linus Torvalds 已提交
2442

2443
	spin_lock_irqsave(&dev->lock, flags);
2444
	stop_activity(dev, NULL);
2445
	spin_unlock_irqrestore(&dev->lock, flags);
L
Linus Torvalds 已提交
2446

2447
	net2280_led_active(dev, 0);
2448 2449

	/* Disable full-speed test mode */
2450
	if (dev->quirks & PLX_LEGACY)
2451
		writel(0, &dev->usb->xcvrdiag);
2452

2453 2454
	device_remove_file(&dev->pdev->dev, &dev_attr_function);
	device_remove_file(&dev->pdev->dev, &dev_attr_queues);
L
Linus Torvalds 已提交
2455

2456
	dev->driver = NULL;
2457

L
Linus Torvalds 已提交
2458 2459 2460 2461 2462 2463 2464 2465 2466
	return 0;
}

/*-------------------------------------------------------------------------*/

/* handle ep0, ep-e, ep-f with 64 byte packets: packet per irq.
 * also works for dma-capable endpoints, in pio mode or just
 * to manually advance the queue after short OUT transfers.
 */
2467
static void handle_ep_small(struct net2280_ep *ep)
L
Linus Torvalds 已提交
2468 2469 2470 2471 2472 2473
{
	struct net2280_request	*req;
	u32			t;
	/* 0 error, 1 mid-data, 2 done */
	int			mode = 1;

2474 2475
	if (!list_empty(&ep->queue))
		req = list_entry(ep->queue.next,
L
Linus Torvalds 已提交
2476 2477 2478 2479 2480
			struct net2280_request, queue);
	else
		req = NULL;

	/* ack all, and handle what we care about */
2481
	t = readl(&ep->regs->ep_stat);
L
Linus Torvalds 已提交
2482 2483
	ep->irqs++;
#if 0
2484
	ep_vdbg(ep->dev, "%s ack ep_stat %08x, req %p\n",
L
Linus Torvalds 已提交
2485 2486
			ep->ep.name, t, req ? &req->req : 0);
#endif
2487
	if (!ep->is_in || (ep->dev->quirks & PLX_2280))
2488
		writel(t & ~BIT(NAK_OUT_PACKETS), &ep->regs->ep_stat);
2489 2490
	else
		/* Added for 2282 */
2491
		writel(t, &ep->regs->ep_stat);
L
Linus Torvalds 已提交
2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502

	/* for ep0, monitor token irqs to catch data stage length errors
	 * and to synchronize on status.
	 *
	 * also, to defer reporting of protocol stalls ... here's where
	 * data or status first appears, handling stalls here should never
	 * cause trouble on the host side..
	 *
	 * control requests could be slightly faster without token synch for
	 * status, but status can jam up that way.
	 */
2503
	if (unlikely(ep->num == 0)) {
L
Linus Torvalds 已提交
2504 2505
		if (ep->is_in) {
			/* status; stop NAKing */
2506
			if (t & BIT(DATA_OUT_PING_TOKEN_INTERRUPT)) {
L
Linus Torvalds 已提交
2507 2508
				if (ep->dev->protocol_stall) {
					ep->stopped = 1;
2509
					set_halt(ep);
L
Linus Torvalds 已提交
2510 2511
				}
				if (!req)
2512
					allow_status(ep);
L
Linus Torvalds 已提交
2513 2514
				mode = 2;
			/* reply to extra IN data tokens with a zlp */
2515
			} else if (t & BIT(DATA_IN_TOKEN_INTERRUPT)) {
L
Linus Torvalds 已提交
2516 2517
				if (ep->dev->protocol_stall) {
					ep->stopped = 1;
2518
					set_halt(ep);
L
Linus Torvalds 已提交
2519
					mode = 2;
2520 2521
				} else if (ep->responded &&
						!req && !ep->stopped)
2522
					write_fifo(ep, NULL);
L
Linus Torvalds 已提交
2523 2524 2525
			}
		} else {
			/* status; stop NAKing */
2526
			if (t & BIT(DATA_IN_TOKEN_INTERRUPT)) {
L
Linus Torvalds 已提交
2527 2528
				if (ep->dev->protocol_stall) {
					ep->stopped = 1;
2529
					set_halt(ep);
L
Linus Torvalds 已提交
2530 2531 2532
				}
				mode = 2;
			/* an extra OUT token is an error */
2533 2534 2535 2536
			} else if (((t & BIT(DATA_OUT_PING_TOKEN_INTERRUPT)) &&
					req &&
					req->req.actual == req->req.length) ||
					(ep->responded && !req)) {
L
Linus Torvalds 已提交
2537
				ep->dev->protocol_stall = 1;
2538
				set_halt(ep);
L
Linus Torvalds 已提交
2539 2540
				ep->stopped = 1;
				if (req)
2541
					done(ep, req, -EOVERFLOW);
L
Linus Torvalds 已提交
2542 2543 2544 2545 2546
				req = NULL;
			}
		}
	}

2547
	if (unlikely(!req))
L
Linus Torvalds 已提交
2548 2549 2550
		return;

	/* manual DMA queue advance after short OUT */
2551
	if (likely(ep->dma)) {
2552
		if (t & BIT(SHORT_PACKET_TRANSFERRED_INTERRUPT)) {
L
Linus Torvalds 已提交
2553 2554 2555 2556 2557 2558 2559 2560
			u32	count;
			int	stopped = ep->stopped;

			/* TRANSFERRED works around OUT_DONE erratum 0112.
			 * we expect (N <= maxpacket) bytes; host wrote M.
			 * iff (M < N) we won't ever see a DMA interrupt.
			 */
			ep->stopped = 1;
2561
			for (count = 0; ; t = readl(&ep->regs->ep_stat)) {
L
Linus Torvalds 已提交
2562 2563 2564 2565

				/* any preceding dma transfers must finish.
				 * dma handles (M >= N), may empty the queue
				 */
2566
				scan_dma_completions(ep);
2567 2568
				if (unlikely(list_empty(&ep->queue) ||
						ep->out_overflow)) {
L
Linus Torvalds 已提交
2569 2570 2571
					req = NULL;
					break;
				}
2572
				req = list_entry(ep->queue.next,
L
Linus Torvalds 已提交
2573 2574 2575 2576 2577
					struct net2280_request, queue);

				/* here either (M < N), a "real" short rx;
				 * or (M == N) and the queue didn't empty
				 */
2578
				if (likely(t & BIT(FIFO_EMPTY))) {
2579
					count = readl(&ep->dma->dmacount);
L
Linus Torvalds 已提交
2580
					count &= DMA_BYTE_COUNT_MASK;
2581
					if (readl(&ep->dma->dmadesc)
L
Linus Torvalds 已提交
2582 2583 2584 2585 2586 2587 2588 2589
							!= req->td_dma)
						req = NULL;
					break;
				}
				udelay(1);
			}

			/* stop DMA, leave ep NAKing */
2590
			writel(BIT(DMA_ABORT), &ep->dma->dmastat);
2591
			spin_stop_dma(ep->dma);
L
Linus Torvalds 已提交
2592

2593
			if (likely(req)) {
L
Linus Torvalds 已提交
2594
				req->td->dmacount = 0;
2595 2596
				t = readl(&ep->regs->ep_avail);
				dma_done(ep, req, count,
2597 2598
					(ep->out_overflow || t)
						? -EOVERFLOW : 0);
L
Linus Torvalds 已提交
2599 2600 2601
			}

			/* also flush to prevent erratum 0106 trouble */
2602 2603 2604 2605
			if (unlikely(ep->out_overflow ||
					(ep->dev->chiprev == 0x0100 &&
					ep->dev->gadget.speed
					== USB_SPEED_FULL))) {
2606
				out_flush(ep);
L
Linus Torvalds 已提交
2607 2608 2609 2610 2611
				ep->out_overflow = 0;
			}

			/* (re)start dma if needed, stop NAKing */
			ep->stopped = stopped;
2612 2613
			if (!list_empty(&ep->queue))
				restart_dma(ep);
L
Linus Torvalds 已提交
2614
		} else
2615
			ep_dbg(ep->dev, "%s dma ep_stat %08x ??\n",
L
Linus Torvalds 已提交
2616 2617 2618 2619
					ep->ep.name, t);
		return;

	/* data packet(s) received (in the fifo, OUT) */
2620
	} else if (t & BIT(DATA_PACKET_RECEIVED_INTERRUPT)) {
2621
		if (read_fifo(ep, req) && ep->num != 0)
L
Linus Torvalds 已提交
2622 2623 2624
			mode = 2;

	/* data packet(s) transmitted (IN) */
2625
	} else if (t & BIT(DATA_PACKET_TRANSMITTED_INTERRUPT)) {
L
Linus Torvalds 已提交
2626 2627 2628 2629 2630 2631 2632 2633
		unsigned	len;

		len = req->req.length - req->req.actual;
		if (len > ep->ep.maxpacket)
			len = ep->ep.maxpacket;
		req->req.actual += len;

		/* if we wrote it all, we're usually done */
2634 2635 2636
		/* send zlps until the status stage */
		if ((req->req.actual == req->req.length) &&
			(!req->req.zero || len != ep->ep.maxpacket) && ep->num)
L
Linus Torvalds 已提交
2637 2638 2639 2640 2641 2642 2643 2644 2645
				mode = 2;

	/* there was nothing to do ...  */
	} else if (mode == 1)
		return;

	/* done */
	if (mode == 2) {
		/* stream endpoints often resubmit/unlink in completion */
2646
		done(ep, req, 0);
L
Linus Torvalds 已提交
2647 2648 2649 2650 2651 2652 2653 2654

		/* maybe advance queue to next request */
		if (ep->num == 0) {
			/* NOTE:  net2280 could let gadget driver start the
			 * status stage later. since not all controllers let
			 * them control that, the api doesn't (yet) allow it.
			 */
			if (!ep->stopped)
2655
				allow_status(ep);
L
Linus Torvalds 已提交
2656 2657
			req = NULL;
		} else {
2658 2659
			if (!list_empty(&ep->queue) && !ep->stopped)
				req = list_entry(ep->queue.next,
L
Linus Torvalds 已提交
2660 2661 2662 2663
					struct net2280_request, queue);
			else
				req = NULL;
			if (req && !ep->is_in)
2664
				stop_out_naking(ep);
L
Linus Torvalds 已提交
2665 2666 2667 2668 2669 2670 2671 2672 2673
		}
	}

	/* is there a buffer for the next packet?
	 * for best streaming performance, make sure there is one.
	 */
	if (req && !ep->stopped) {

		/* load IN fifo with next packet (may be zlp) */
2674
		if (t & BIT(DATA_PACKET_TRANSMITTED_INTERRUPT))
2675
			write_fifo(ep, &req->req);
L
Linus Torvalds 已提交
2676 2677 2678
	}
}

2679
static struct net2280_ep *get_ep_by_addr(struct net2280 *dev, u16 wIndex)
L
Linus Torvalds 已提交
2680 2681 2682 2683
{
	struct net2280_ep	*ep;

	if ((wIndex & USB_ENDPOINT_NUMBER_MASK) == 0)
2684 2685
		return &dev->ep[0];
	list_for_each_entry(ep, &dev->gadget.ep_list, ep.ep_list) {
L
Linus Torvalds 已提交
2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698
		u8	bEndpointAddress;

		if (!ep->desc)
			continue;
		bEndpointAddress = ep->desc->bEndpointAddress;
		if ((wIndex ^ bEndpointAddress) & USB_DIR_IN)
			continue;
		if ((wIndex & 0x0f) == (bEndpointAddress & 0x0f))
			return ep;
	}
	return NULL;
}

2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713
static void defect7374_workaround(struct net2280 *dev, struct usb_ctrlrequest r)
{
	u32 scratch, fsmvalue;
	u32 ack_wait_timeout, state;

	/* Workaround for Defect 7374 (U1/U2 erroneously rejected): */
	scratch = get_idx_reg(dev->regs, SCRATCH);
	fsmvalue = scratch & (0xf << DEFECT7374_FSM_FIELD);
	scratch &= ~(0xf << DEFECT7374_FSM_FIELD);

	if (!((fsmvalue == DEFECT7374_FSM_WAITING_FOR_CONTROL_READ) &&
				(r.bRequestType & USB_DIR_IN)))
		return;

	/* This is the first Control Read for this connection: */
2714
	if (!(readl(&dev->usb->usbstat) & BIT(SUPER_SPEED_MODE))) {
2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748
		/*
		 * Connection is NOT SS:
		 * - Connection must be FS or HS.
		 * - This FSM state should allow workaround software to
		 * run after the next USB connection.
		 */
		scratch |= DEFECT7374_FSM_NON_SS_CONTROL_READ;
		goto restore_data_eps;
	}

	/* Connection is SS: */
	for (ack_wait_timeout = 0;
			ack_wait_timeout < DEFECT_7374_NUMBEROF_MAX_WAIT_LOOPS;
			ack_wait_timeout++) {

		state =	readl(&dev->plregs->pl_ep_status_1)
			& (0xff << STATE);
		if ((state >= (ACK_GOOD_NORMAL << STATE)) &&
			(state <= (ACK_GOOD_MORE_ACKS_TO_COME << STATE))) {
			scratch |= DEFECT7374_FSM_SS_CONTROL_READ;
			break;
		}

		/*
		 * We have not yet received host's Data Phase ACK
		 * - Wait and try again.
		 */
		udelay(DEFECT_7374_PROCESSOR_WAIT_TIME);

		continue;
	}


	if (ack_wait_timeout >= DEFECT_7374_NUMBEROF_MAX_WAIT_LOOPS) {
2749
		ep_err(dev, "FAIL: Defect 7374 workaround waited but failed "
2750
		"to detect SS host's data phase ACK.");
2751
		ep_err(dev, "PL_EP_STATUS_1(23:16):.Expected from 0x11 to 0x16"
2752 2753
		"got 0x%2.2x.\n", state >> STATE);
	} else {
2754
		ep_warn(dev, "INFO: Defect 7374 workaround waited about\n"
2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777
		"%duSec for Control Read Data Phase ACK\n",
			DEFECT_7374_PROCESSOR_WAIT_TIME * ack_wait_timeout);
	}

restore_data_eps:
	/*
	 * Restore data EPs to their pre-workaround settings (disabled,
	 * initialized, and other details).
	 */
	defect7374_disable_data_eps(dev);

	set_idx_reg(dev->regs, SCRATCH, scratch);

	return;
}

static void ep_stall(struct net2280_ep *ep, int stall)
{
	struct net2280 *dev = ep->dev;
	u32 val;
	static const u32 ep_pl[9] = { 0, 3, 4, 7, 8, 2, 5, 6, 9 };

	if (stall) {
2778 2779 2780
		writel(BIT(SET_ENDPOINT_HALT) |
		       /* BIT(SET_NAK_PACKETS) | */
		       BIT(CLEAR_CONTROL_STATUS_PHASE_HANDSHAKE),
2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792
		       &ep->regs->ep_rsp);
		ep->is_halt = 1;
	} else {
		if (dev->gadget.speed == USB_SPEED_SUPER) {
			/*
			 * Workaround for SS SeqNum not cleared via
			 * Endpoint Halt (Clear) bit. select endpoint
			 */
			val = readl(&dev->plregs->pl_ep_ctrl);
			val = (val & ~0x1f) | ep_pl[ep->num];
			writel(val, &dev->plregs->pl_ep_ctrl);

2793
			val |= BIT(SEQUENCE_NUMBER_RESET);
2794 2795 2796
			writel(val, &dev->plregs->pl_ep_ctrl);
		}
		val = readl(&ep->regs->ep_rsp);
2797 2798
		val |= BIT(CLEAR_ENDPOINT_HALT) |
			BIT(CLEAR_ENDPOINT_TOGGLE);
2799 2800 2801
		writel(val,
		       /* | BIT(CLEAR_NAK_PACKETS),*/
		       &ep->regs->ep_rsp);
2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868
		ep->is_halt = 0;
		val = readl(&ep->regs->ep_rsp);
	}
}

static void ep_stdrsp(struct net2280_ep *ep, int value, int wedged)
{
	/* set/clear, then synch memory views with the device */
	if (value) {
		ep->stopped = 1;
		if (ep->num == 0)
			ep->dev->protocol_stall = 1;
		else {
			if (ep->dma)
				ep_stop_dma(ep);
			ep_stall(ep, true);
		}

		if (wedged)
			ep->wedged = 1;
	} else {
		ep->stopped = 0;
		ep->wedged = 0;

		ep_stall(ep, false);

		/* Flush the queue */
		if (!list_empty(&ep->queue)) {
			struct net2280_request *req =
			    list_entry(ep->queue.next, struct net2280_request,
				       queue);
			if (ep->dma)
				resume_dma(ep);
			else {
				if (ep->is_in)
					write_fifo(ep, &req->req);
				else {
					if (read_fifo(ep, req))
						done(ep, req, 0);
				}
			}
		}
	}
}

static void handle_stat0_irqs_superspeed(struct net2280 *dev,
		struct net2280_ep *ep, struct usb_ctrlrequest r)
{
	int tmp = 0;

#define	w_value		le16_to_cpu(r.wValue)
#define	w_index		le16_to_cpu(r.wIndex)
#define	w_length	le16_to_cpu(r.wLength)

	switch (r.bRequest) {
		struct net2280_ep *e;
		u16 status;

	case USB_REQ_SET_CONFIGURATION:
		dev->addressed_state = !w_value;
		goto usb3_delegate;

	case USB_REQ_GET_STATUS:
		switch (r.bRequestType) {
		case (USB_DIR_IN | USB_TYPE_STANDARD | USB_RECIP_DEVICE):
			status = dev->wakeup_enable ? 0x02 : 0x00;
			if (dev->selfpowered)
2869
				status |= BIT(0);
2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882
			status |= (dev->u1_enable << 2 | dev->u2_enable << 3 |
							dev->ltm_enable << 4);
			writel(0, &dev->epregs[0].ep_irqenb);
			set_fifo_bytecount(ep, sizeof(status));
			writel((__force u32) status, &dev->epregs[0].ep_data);
			allow_status_338x(ep);
			break;

		case (USB_DIR_IN | USB_TYPE_STANDARD | USB_RECIP_ENDPOINT):
			e = get_ep_by_addr(dev, w_index);
			if (!e)
				goto do_stall3;
			status = readl(&e->regs->ep_rsp) &
2883
						BIT(CLEAR_ENDPOINT_HALT);
2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902
			writel(0, &dev->epregs[0].ep_irqenb);
			set_fifo_bytecount(ep, sizeof(status));
			writel((__force u32) status, &dev->epregs[0].ep_data);
			allow_status_338x(ep);
			break;

		default:
			goto usb3_delegate;
		}
		break;

	case USB_REQ_CLEAR_FEATURE:
		switch (r.bRequestType) {
		case (USB_DIR_OUT | USB_TYPE_STANDARD | USB_RECIP_DEVICE):
			if (!dev->addressed_state) {
				switch (w_value) {
				case USB_DEVICE_U1_ENABLE:
					dev->u1_enable = 0;
					writel(readl(&dev->usb_ext->usbctl2) &
2903
						~BIT(U1_ENABLE),
2904 2905 2906 2907 2908 2909 2910
						&dev->usb_ext->usbctl2);
					allow_status_338x(ep);
					goto next_endpoints3;

				case USB_DEVICE_U2_ENABLE:
					dev->u2_enable = 0;
					writel(readl(&dev->usb_ext->usbctl2) &
2911
						~BIT(U2_ENABLE),
2912 2913 2914 2915 2916 2917 2918
						&dev->usb_ext->usbctl2);
					allow_status_338x(ep);
					goto next_endpoints3;

				case USB_DEVICE_LTM_ENABLE:
					dev->ltm_enable = 0;
					writel(readl(&dev->usb_ext->usbctl2) &
2919
						~BIT(LTM_ENABLE),
2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930
						&dev->usb_ext->usbctl2);
					allow_status_338x(ep);
					goto next_endpoints3;

				default:
					break;
				}
			}
			if (w_value == USB_DEVICE_REMOTE_WAKEUP) {
				dev->wakeup_enable = 0;
				writel(readl(&dev->usb->usbctl) &
2931
					~BIT(DEVICE_REMOTE_WAKEUP_ENABLE),
2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943
					&dev->usb->usbctl);
				allow_status_338x(ep);
				break;
			}
			goto usb3_delegate;

		case (USB_DIR_OUT | USB_TYPE_STANDARD | USB_RECIP_ENDPOINT):
			e = get_ep_by_addr(dev,	w_index);
			if (!e)
				goto do_stall3;
			if (w_value != USB_ENDPOINT_HALT)
				goto do_stall3;
2944
			ep_vdbg(dev, "%s clear halt\n", e->ep.name);
2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963
			ep_stall(e, false);
			if (!list_empty(&e->queue) && e->td_dma)
				restart_dma(e);
			allow_status(ep);
			ep->stopped = 1;
			break;

		default:
			goto usb3_delegate;
		}
		break;
	case USB_REQ_SET_FEATURE:
		switch (r.bRequestType) {
		case (USB_DIR_OUT | USB_TYPE_STANDARD | USB_RECIP_DEVICE):
			if (!dev->addressed_state) {
				switch (w_value) {
				case USB_DEVICE_U1_ENABLE:
					dev->u1_enable = 1;
					writel(readl(&dev->usb_ext->usbctl2) |
2964
						BIT(U1_ENABLE),
2965 2966 2967 2968 2969 2970 2971
						&dev->usb_ext->usbctl2);
					allow_status_338x(ep);
					goto next_endpoints3;

				case USB_DEVICE_U2_ENABLE:
					dev->u2_enable = 1;
					writel(readl(&dev->usb_ext->usbctl2) |
2972
						BIT(U2_ENABLE),
2973 2974 2975 2976 2977 2978 2979
						&dev->usb_ext->usbctl2);
					allow_status_338x(ep);
					goto next_endpoints3;

				case USB_DEVICE_LTM_ENABLE:
					dev->ltm_enable = 1;
					writel(readl(&dev->usb_ext->usbctl2) |
2980
						BIT(LTM_ENABLE),
2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991
						&dev->usb_ext->usbctl2);
					allow_status_338x(ep);
					goto next_endpoints3;
				default:
					break;
				}
			}

			if (w_value == USB_DEVICE_REMOTE_WAKEUP) {
				dev->wakeup_enable = 1;
				writel(readl(&dev->usb->usbctl) |
2992
					BIT(DEVICE_REMOTE_WAKEUP_ENABLE),
2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014
					&dev->usb->usbctl);
				allow_status_338x(ep);
				break;
			}
			goto usb3_delegate;

		case (USB_DIR_OUT | USB_TYPE_STANDARD | USB_RECIP_ENDPOINT):
			e = get_ep_by_addr(dev,	w_index);
			if (!e || (w_value != USB_ENDPOINT_HALT))
				goto do_stall3;
			ep_stdrsp(e, true, false);
			allow_status_338x(ep);
			break;

		default:
			goto usb3_delegate;
		}

		break;
	default:

usb3_delegate:
3015
		ep_vdbg(dev, "setup %02x.%02x v%04x i%04x l%04x ep_cfg %08x\n",
3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026
				r.bRequestType, r.bRequest,
				w_value, w_index, w_length,
				readl(&ep->cfg->ep_cfg));

		ep->responded = 0;
		spin_unlock(&dev->lock);
		tmp = dev->driver->setup(&dev->gadget, &r);
		spin_lock(&dev->lock);
	}
do_stall3:
	if (tmp < 0) {
3027
		ep_vdbg(dev, "req %02x.%02x protocol STALL; stat %d\n",
3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042
				r.bRequestType, r.bRequest, tmp);
		dev->protocol_stall = 1;
		/* TD 9.9 Halt Endpoint test. TD 9.22 Set feature test */
		ep_stall(ep, true);
	}

next_endpoints3:

#undef	w_value
#undef	w_index
#undef	w_length

	return;
}

3043
static void handle_stat0_irqs(struct net2280 *dev, u32 stat)
L
Linus Torvalds 已提交
3044 3045 3046 3047 3048
{
	struct net2280_ep	*ep;
	u32			num, scratch;

	/* most of these don't need individual acks */
3049
	stat &= ~BIT(INTA_ASSERTED);
L
Linus Torvalds 已提交
3050 3051
	if (!stat)
		return;
3052
	/* ep_dbg(dev, "irqstat0 %04x\n", stat); */
L
Linus Torvalds 已提交
3053 3054

	/* starting a control request? */
3055
	if (unlikely(stat & BIT(SETUP_PACKET_INTERRUPT))) {
L
Linus Torvalds 已提交
3056
		union {
3057
			u32			raw[2];
L
Linus Torvalds 已提交
3058 3059
			struct usb_ctrlrequest	r;
		} u;
3060
		int				tmp;
L
Linus Torvalds 已提交
3061 3062 3063
		struct net2280_request		*req;

		if (dev->gadget.speed == USB_SPEED_UNKNOWN) {
3064
			u32 val = readl(&dev->usb->usbstat);
3065
			if (val & BIT(SUPER_SPEED)) {
3066 3067 3068
				dev->gadget.speed = USB_SPEED_SUPER;
				usb_ep_set_maxpacket_limit(&dev->ep[0].ep,
						EP0_SS_MAX_PACKET_SIZE);
3069
			} else if (val & BIT(HIGH_SPEED)) {
L
Linus Torvalds 已提交
3070
				dev->gadget.speed = USB_SPEED_HIGH;
3071 3072 3073
				usb_ep_set_maxpacket_limit(&dev->ep[0].ep,
						EP0_HS_MAX_PACKET_SIZE);
			} else {
L
Linus Torvalds 已提交
3074
				dev->gadget.speed = USB_SPEED_FULL;
3075 3076 3077
				usb_ep_set_maxpacket_limit(&dev->ep[0].ep,
						EP0_HS_MAX_PACKET_SIZE);
			}
3078
			net2280_led_speed(dev, dev->gadget.speed);
3079
			ep_dbg(dev, "%s\n",
3080
					usb_speed_string(dev->gadget.speed));
L
Linus Torvalds 已提交
3081 3082
		}

3083
		ep = &dev->ep[0];
L
Linus Torvalds 已提交
3084 3085 3086
		ep->irqs++;

		/* make sure any leftover request state is cleared */
3087
		stat &= ~BIT(ENDPOINT_0_INTERRUPT);
3088 3089
		while (!list_empty(&ep->queue)) {
			req = list_entry(ep->queue.next,
L
Linus Torvalds 已提交
3090
					struct net2280_request, queue);
3091
			done(ep, req, (req->req.actual == req->req.length)
L
Linus Torvalds 已提交
3092 3093 3094 3095
						? 0 : -EPROTO);
		}
		ep->stopped = 0;
		dev->protocol_stall = 0;
3096
		if (dev->quirks & PLX_SUPERSPEED)
3097 3098
			ep->is_halt = 0;
		else{
3099
			if (ep->dev->quirks & PLX_2280)
3100 3101
				tmp = BIT(FIFO_OVERFLOW) |
				    BIT(FIFO_UNDERFLOW);
3102 3103 3104
			else
				tmp = 0;

3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115
			writel(tmp | BIT(TIMEOUT) |
				   BIT(USB_STALL_SENT) |
				   BIT(USB_IN_NAK_SENT) |
				   BIT(USB_IN_ACK_RCVD) |
				   BIT(USB_OUT_PING_NAK_SENT) |
				   BIT(USB_OUT_ACK_SENT) |
				   BIT(SHORT_PACKET_OUT_DONE_INTERRUPT) |
				   BIT(SHORT_PACKET_TRANSFERRED_INTERRUPT) |
				   BIT(DATA_PACKET_RECEIVED_INTERRUPT) |
				   BIT(DATA_PACKET_TRANSMITTED_INTERRUPT) |
				   BIT(DATA_OUT_PING_TOKEN_INTERRUPT) |
3116 3117
				   BIT(DATA_IN_TOKEN_INTERRUPT),
				   &ep->regs->ep_stat);
3118 3119 3120
		}
		u.raw[0] = readl(&dev->usb->setup0123);
		u.raw[1] = readl(&dev->usb->setup4567);
3121

3122 3123
		cpu_to_le32s(&u.raw[0]);
		cpu_to_le32s(&u.raw[1]);
L
Linus Torvalds 已提交
3124

3125
		if (dev->quirks & PLX_SUPERSPEED)
3126 3127
			defect7374_workaround(dev, u.r);

3128 3129
		tmp = 0;

3130 3131 3132
#define	w_value		le16_to_cpu(u.r.wValue)
#define	w_index		le16_to_cpu(u.r.wIndex)
#define	w_length	le16_to_cpu(u.r.wLength)
L
Linus Torvalds 已提交
3133 3134

		/* ack the irq */
3135 3136
		writel(BIT(SETUP_PACKET_INTERRUPT), &dev->regs->irqstat0);
		stat ^= BIT(SETUP_PACKET_INTERRUPT);
L
Linus Torvalds 已提交
3137 3138 3139 3140 3141 3142 3143 3144

		/* watch control traffic at the token level, and force
		 * synchronization before letting the status stage happen.
		 * FIXME ignore tokens we'll NAK, until driver responds.
		 * that'll mean a lot less irqs for some drivers.
		 */
		ep->is_in = (u.r.bRequestType & USB_DIR_IN) != 0;
		if (ep->is_in) {
3145 3146 3147
			scratch = BIT(DATA_PACKET_TRANSMITTED_INTERRUPT) |
				BIT(DATA_OUT_PING_TOKEN_INTERRUPT) |
				BIT(DATA_IN_TOKEN_INTERRUPT);
3148
			stop_out_naking(ep);
L
Linus Torvalds 已提交
3149
		} else
3150 3151 3152
			scratch = BIT(DATA_PACKET_RECEIVED_INTERRUPT) |
				BIT(DATA_OUT_PING_TOKEN_INTERRUPT) |
				BIT(DATA_IN_TOKEN_INTERRUPT);
3153
		writel(scratch, &dev->epregs[0].ep_irqenb);
L
Linus Torvalds 已提交
3154 3155 3156 3157

		/* we made the hardware handle most lowlevel requests;
		 * everything else goes uplevel to the gadget code.
		 */
3158
		ep->responded = 1;
3159 3160 3161 3162 3163 3164

		if (dev->gadget.speed == USB_SPEED_SUPER) {
			handle_stat0_irqs_superspeed(dev, ep, u.r);
			goto next_endpoints;
		}

L
Linus Torvalds 已提交
3165 3166 3167
		switch (u.r.bRequest) {
		case USB_REQ_GET_STATUS: {
			struct net2280_ep	*e;
3168
			__le32			status;
L
Linus Torvalds 已提交
3169 3170 3171 3172

			/* hw handles device and interface status */
			if (u.r.bRequestType != (USB_DIR_IN|USB_RECIP_ENDPOINT))
				goto delegate;
3173 3174
			e = get_ep_by_addr(dev, w_index);
			if (!e || w_length > 2)
L
Linus Torvalds 已提交
3175 3176
				goto do_stall;

3177
			if (readl(&e->regs->ep_rsp) & BIT(SET_ENDPOINT_HALT))
3178
				status = cpu_to_le32(1);
L
Linus Torvalds 已提交
3179
			else
3180
				status = cpu_to_le32(0);
L
Linus Torvalds 已提交
3181 3182

			/* don't bother with a request object! */
3183 3184 3185 3186
			writel(0, &dev->epregs[0].ep_irqenb);
			set_fifo_bytecount(ep, w_length);
			writel((__force u32)status, &dev->epregs[0].ep_data);
			allow_status(ep);
3187
			ep_vdbg(dev, "%s stat %02x\n", ep->ep.name, status);
L
Linus Torvalds 已提交
3188 3189 3190 3191 3192 3193 3194 3195 3196
			goto next_endpoints;
			}
			break;
		case USB_REQ_CLEAR_FEATURE: {
			struct net2280_ep	*e;

			/* hw handles device features */
			if (u.r.bRequestType != USB_RECIP_ENDPOINT)
				goto delegate;
3197
			if (w_value != USB_ENDPOINT_HALT || w_length != 0)
L
Linus Torvalds 已提交
3198
				goto do_stall;
3199 3200
			e = get_ep_by_addr(dev, w_index);
			if (!e)
L
Linus Torvalds 已提交
3201
				goto do_stall;
3202
			if (e->wedged) {
3203
				ep_vdbg(dev, "%s wedged, halt not cleared\n",
3204 3205
						ep->ep.name);
			} else {
3206
				ep_vdbg(dev, "%s clear halt\n", e->ep.name);
3207
				clear_halt(e);
3208
				if ((ep->dev->quirks & PLX_SUPERSPEED) &&
3209 3210
					!list_empty(&e->queue) && e->td_dma)
						restart_dma(e);
3211
			}
3212
			allow_status(ep);
L
Linus Torvalds 已提交
3213 3214 3215 3216 3217 3218 3219 3220 3221
			goto next_endpoints;
			}
			break;
		case USB_REQ_SET_FEATURE: {
			struct net2280_ep	*e;

			/* hw handles device features */
			if (u.r.bRequestType != USB_RECIP_ENDPOINT)
				goto delegate;
3222
			if (w_value != USB_ENDPOINT_HALT || w_length != 0)
L
Linus Torvalds 已提交
3223
				goto do_stall;
3224 3225
			e = get_ep_by_addr(dev, w_index);
			if (!e)
L
Linus Torvalds 已提交
3226
				goto do_stall;
3227 3228
			if (e->ep.name == ep0name)
				goto do_stall;
3229
			set_halt(e);
3230
			if ((dev->quirks & PLX_SUPERSPEED) && e->dma)
3231
				abort_dma(e);
3232
			allow_status(ep);
3233
			ep_vdbg(dev, "%s set halt\n", ep->ep.name);
L
Linus Torvalds 已提交
3234 3235 3236 3237 3238
			goto next_endpoints;
			}
			break;
		default:
delegate:
3239
			ep_vdbg(dev, "setup %02x.%02x v%04x i%04x l%04x "
L
Linus Torvalds 已提交
3240 3241
				"ep_cfg %08x\n",
				u.r.bRequestType, u.r.bRequest,
3242
				w_value, w_index, w_length,
3243
				readl(&ep->cfg->ep_cfg));
3244
			ep->responded = 0;
3245 3246 3247
			spin_unlock(&dev->lock);
			tmp = dev->driver->setup(&dev->gadget, &u.r);
			spin_lock(&dev->lock);
L
Linus Torvalds 已提交
3248 3249 3250 3251 3252
		}

		/* stall ep0 on error */
		if (tmp < 0) {
do_stall:
3253
			ep_vdbg(dev, "req %02x.%02x protocol STALL; stat %d\n",
L
Linus Torvalds 已提交
3254 3255 3256 3257 3258 3259 3260 3261 3262 3263
					u.r.bRequestType, u.r.bRequest, tmp);
			dev->protocol_stall = 1;
		}

		/* some in/out token irq should follow; maybe stall then.
		 * driver must queue a request (even zlp) or halt ep0
		 * before the host times out.
		 */
	}

3264 3265 3266 3267
#undef	w_value
#undef	w_index
#undef	w_length

L
Linus Torvalds 已提交
3268 3269 3270 3271 3272 3273 3274 3275
next_endpoints:
	/* endpoint data irq ? */
	scratch = stat & 0x7f;
	stat &= ~0x7f;
	for (num = 0; scratch; num++) {
		u32		t;

		/* do this endpoint's FIFO and queue need tending? */
3276
		t = BIT(num);
L
Linus Torvalds 已提交
3277 3278 3279 3280
		if ((scratch & t) == 0)
			continue;
		scratch ^= t;

3281 3282
		ep = &dev->ep[num];
		handle_ep_small(ep);
L
Linus Torvalds 已提交
3283 3284 3285
	}

	if (stat)
3286
		ep_dbg(dev, "unhandled irqstat0 %08x\n", stat);
L
Linus Torvalds 已提交
3287 3288
}

3289 3290 3291 3292
#define DMA_INTERRUPTS (BIT(DMA_D_INTERRUPT) | \
		BIT(DMA_C_INTERRUPT) | \
		BIT(DMA_B_INTERRUPT) | \
		BIT(DMA_A_INTERRUPT))
L
Linus Torvalds 已提交
3293
#define	PCI_ERROR_INTERRUPTS ( \
3294 3295 3296
		BIT(PCI_MASTER_ABORT_RECEIVED_INTERRUPT) | \
		BIT(PCI_TARGET_ABORT_RECEIVED_INTERRUPT) | \
		BIT(PCI_RETRY_ABORT_INTERRUPT))
L
Linus Torvalds 已提交
3297

3298
static void handle_stat1_irqs(struct net2280 *dev, u32 stat)
L
Linus Torvalds 已提交
3299 3300 3301 3302 3303
{
	struct net2280_ep	*ep;
	u32			tmp, num, mask, scratch;

	/* after disconnect there's nothing else to do! */
3304 3305
	tmp = BIT(VBUS_INTERRUPT) | BIT(ROOT_PORT_RESET_INTERRUPT);
	mask = BIT(SUPER_SPEED) | BIT(HIGH_SPEED) | BIT(FULL_SPEED);
L
Linus Torvalds 已提交
3306 3307

	/* VBUS disconnect is indicated by VBUS_PIN and VBUS_INTERRUPT set.
3308
	 * Root Port Reset is indicated by ROOT_PORT_RESET_INTERRUPT set and
3309
	 * both HIGH_SPEED and FULL_SPEED clear (as ROOT_PORT_RESET_INTERRUPT
L
Linus Torvalds 已提交
3310 3311 3312
	 * only indicates a change in the reset state).
	 */
	if (stat & tmp) {
3313
		writel(tmp, &dev->regs->irqstat1);
3314
		if ((((stat & BIT(ROOT_PORT_RESET_INTERRUPT)) &&
3315
				((readl(&dev->usb->usbstat) & mask) == 0)) ||
3316 3317 3318
				((readl(&dev->usb->usbctl) &
					BIT(VBUS_PIN)) == 0)) &&
				(dev->gadget.speed != USB_SPEED_UNKNOWN)) {
3319
			ep_dbg(dev, "disconnect %s\n",
L
Linus Torvalds 已提交
3320
					dev->driver->driver.name);
3321 3322
			stop_activity(dev, dev->driver);
			ep0_start(dev);
L
Linus Torvalds 已提交
3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336
			return;
		}
		stat &= ~tmp;

		/* vBUS can bounce ... one of many reasons to ignore the
		 * notion of hotplug events on bus connect/disconnect!
		 */
		if (!stat)
			return;
	}

	/* NOTE: chip stays in PCI D0 state for now, but it could
	 * enter D1 to save more power
	 */
3337
	tmp = BIT(SUSPEND_REQUEST_CHANGE_INTERRUPT);
L
Linus Torvalds 已提交
3338
	if (stat & tmp) {
3339
		writel(tmp, &dev->regs->irqstat1);
3340
		if (stat & BIT(SUSPEND_REQUEST_INTERRUPT)) {
L
Linus Torvalds 已提交
3341
			if (dev->driver->suspend)
3342
				dev->driver->suspend(&dev->gadget);
L
Linus Torvalds 已提交
3343
			if (!enable_suspend)
3344
				stat &= ~BIT(SUSPEND_REQUEST_INTERRUPT);
L
Linus Torvalds 已提交
3345 3346
		} else {
			if (dev->driver->resume)
3347
				dev->driver->resume(&dev->gadget);
L
Linus Torvalds 已提交
3348 3349 3350 3351 3352 3353 3354
			/* at high speed, note erratum 0133 */
		}
		stat &= ~tmp;
	}

	/* clear any other status/irqs */
	if (stat)
3355
		writel(stat, &dev->regs->irqstat1);
L
Linus Torvalds 已提交
3356 3357

	/* some status we can just ignore */
3358
	if (dev->quirks & PLX_2280)
3359 3360 3361 3362
		stat &= ~(BIT(CONTROL_STATUS_INTERRUPT) |
			  BIT(SUSPEND_REQUEST_INTERRUPT) |
			  BIT(RESUME_INTERRUPT) |
			  BIT(SOF_INTERRUPT));
3363
	else
3364 3365 3366 3367
		stat &= ~(BIT(CONTROL_STATUS_INTERRUPT) |
			  BIT(RESUME_INTERRUPT) |
			  BIT(SOF_DOWN_INTERRUPT) |
			  BIT(SOF_INTERRUPT));
3368

L
Linus Torvalds 已提交
3369 3370
	if (!stat)
		return;
3371
	/* ep_dbg(dev, "irqstat1 %08x\n", stat);*/
L
Linus Torvalds 已提交
3372 3373 3374 3375 3376 3377 3378 3379

	/* DMA status, for ep-{a,b,c,d} */
	scratch = stat & DMA_INTERRUPTS;
	stat &= ~DMA_INTERRUPTS;
	scratch >>= 9;
	for (num = 0; scratch; num++) {
		struct net2280_dma_regs	__iomem *dma;

3380
		tmp = BIT(num);
L
Linus Torvalds 已提交
3381 3382 3383 3384
		if ((tmp & scratch) == 0)
			continue;
		scratch ^= tmp;

3385
		ep = &dev->ep[num + 1];
L
Linus Torvalds 已提交
3386 3387 3388 3389 3390 3391
		dma = ep->dma;

		if (!dma)
			continue;

		/* clear ep's dma status */
3392 3393
		tmp = readl(&dma->dmastat);
		writel(tmp, &dma->dmastat);
L
Linus Torvalds 已提交
3394

3395
		/* dma sync*/
3396
		if (dev->quirks & PLX_SUPERSPEED) {
3397 3398
			u32 r_dmacount = readl(&dma->dmacount);
			if (!ep->is_in &&  (r_dmacount & 0x00FFFFFF) &&
3399
			    (tmp & BIT(DMA_TRANSACTION_DONE_INTERRUPT)))
3400 3401 3402
				continue;
		}

L
Linus Torvalds 已提交
3403 3404 3405 3406
		/* chaining should stop on abort, short OUT from fifo,
		 * or (stat0 codepath) short OUT transfer.
		 */
		if (!use_dma_chaining) {
3407
			if (!(tmp & BIT(DMA_TRANSACTION_DONE_INTERRUPT))) {
3408
				ep_dbg(ep->dev, "%s no xact done? %08x\n",
L
Linus Torvalds 已提交
3409 3410 3411
					ep->ep.name, tmp);
				continue;
			}
3412
			stop_dma(ep->dma);
L
Linus Torvalds 已提交
3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424
		}

		/* OUT transfers terminate when the data from the
		 * host is in our memory.  Process whatever's done.
		 * On this path, we know transfer's last packet wasn't
		 * less than req->length. NAK_OUT_PACKETS may be set,
		 * or the FIFO may already be holding new packets.
		 *
		 * IN transfers can linger in the FIFO for a very
		 * long time ... we ignore that for now, accounting
		 * precisely (like PIO does) needs per-packet irqs
		 */
3425
		scan_dma_completions(ep);
L
Linus Torvalds 已提交
3426 3427

		/* disable dma on inactive queues; else maybe restart */
3428
		if (list_empty(&ep->queue)) {
L
Linus Torvalds 已提交
3429
			if (use_dma_chaining)
3430
				stop_dma(ep->dma);
L
Linus Torvalds 已提交
3431
		} else {
3432
			tmp = readl(&dma->dmactl);
3433
			if (!use_dma_chaining || (tmp & BIT(DMA_ENABLE)) == 0)
3434
				restart_dma(ep);
L
Linus Torvalds 已提交
3435 3436
			else if (ep->is_in && use_dma_chaining) {
				struct net2280_request	*req;
3437
				__le32			dmacount;
L
Linus Torvalds 已提交
3438 3439 3440 3441 3442 3443

				/* the descriptor at the head of the chain
				 * may still have VALID_BIT clear; that's
				 * used to trigger changing DMA_FIFO_VALIDATE
				 * (affects automagic zlp writes).
				 */
3444
				req = list_entry(ep->queue.next,
L
Linus Torvalds 已提交
3445 3446
						struct net2280_request, queue);
				dmacount = req->td->dmacount;
3447 3448
				dmacount &= cpu_to_le32(BIT(VALID_BIT) |
						DMA_BYTE_COUNT_MASK);
L
Linus Torvalds 已提交
3449
				if (dmacount && (dmacount & valid_bit) == 0)
3450
					restart_dma(ep);
L
Linus Torvalds 已提交
3451 3452 3453 3454 3455 3456 3457 3458 3459
			}
		}
		ep->irqs++;
	}

	/* NOTE:  there are other PCI errors we might usefully notice.
	 * if they appear very often, here's where to try recovering.
	 */
	if (stat & PCI_ERROR_INTERRUPTS) {
3460
		ep_err(dev, "pci dma error; stat %08x\n", stat);
L
Linus Torvalds 已提交
3461 3462 3463 3464
		stat &= ~PCI_ERROR_INTERRUPTS;
		/* these are fatal errors, but "maybe" they won't
		 * happen again ...
		 */
3465 3466
		stop_activity(dev, dev->driver);
		ep0_start(dev);
L
Linus Torvalds 已提交
3467 3468 3469 3470
		stat = 0;
	}

	if (stat)
3471
		ep_dbg(dev, "unhandled irqstat1 %08x\n", stat);
L
Linus Torvalds 已提交
3472 3473
}

3474
static irqreturn_t net2280_irq(int irq, void *_dev)
L
Linus Torvalds 已提交
3475 3476 3477
{
	struct net2280		*dev = _dev;

3478
	/* shared interrupt, not ours */
3479
	if ((dev->quirks & PLX_LEGACY) &&
3480
		(!(readl(&dev->regs->irqstat0) & BIT(INTA_ASSERTED))))
3481 3482
		return IRQ_NONE;

3483
	spin_lock(&dev->lock);
L
Linus Torvalds 已提交
3484 3485

	/* handle disconnect, dma, and more */
3486
	handle_stat1_irqs(dev, readl(&dev->regs->irqstat1));
L
Linus Torvalds 已提交
3487 3488

	/* control requests and PIO */
3489
	handle_stat0_irqs(dev, readl(&dev->regs->irqstat0));
L
Linus Torvalds 已提交
3490

3491
	if (dev->quirks & PLX_SUPERSPEED) {
3492 3493 3494 3495 3496 3497
		/* re-enable interrupt to trigger any possible new interrupt */
		u32 pciirqenb1 = readl(&dev->regs->pciirqenb1);
		writel(pciirqenb1 & 0x7FFFFFFF, &dev->regs->pciirqenb1);
		writel(pciirqenb1, &dev->regs->pciirqenb1);
	}

3498
	spin_unlock(&dev->lock);
L
Linus Torvalds 已提交
3499 3500 3501 3502 3503 3504

	return IRQ_HANDLED;
}

/*-------------------------------------------------------------------------*/

3505
static void gadget_release(struct device *_dev)
L
Linus Torvalds 已提交
3506
{
3507
	struct net2280	*dev = dev_get_drvdata(_dev);
L
Linus Torvalds 已提交
3508

3509
	kfree(dev);
L
Linus Torvalds 已提交
3510 3511 3512 3513
}

/* tear down the binding between this driver and the pci device */

3514
static void net2280_remove(struct pci_dev *pdev)
L
Linus Torvalds 已提交
3515
{
3516
	struct net2280		*dev = pci_get_drvdata(pdev);
L
Linus Torvalds 已提交
3517

3518 3519
	usb_del_gadget_udc(&dev->gadget);

3520
	BUG_ON(dev->driver);
L
Linus Torvalds 已提交
3521 3522

	/* then clean up the resources we allocated during probe() */
3523
	net2280_led_shutdown(dev);
L
Linus Torvalds 已提交
3524 3525 3526
	if (dev->requests) {
		int		i;
		for (i = 1; i < 5; i++) {
3527
			if (!dev->ep[i].dummy)
L
Linus Torvalds 已提交
3528
				continue;
3529 3530
			pci_pool_free(dev->requests, dev->ep[i].dummy,
					dev->ep[i].td_dma);
L
Linus Torvalds 已提交
3531
		}
3532
		pci_pool_destroy(dev->requests);
L
Linus Torvalds 已提交
3533 3534
	}
	if (dev->got_irq)
3535
		free_irq(pdev->irq, dev);
3536
	if (use_msi && dev->quirks & PLX_SUPERSPEED)
3537
		pci_disable_msi(pdev);
L
Linus Torvalds 已提交
3538
	if (dev->regs)
3539
		iounmap(dev->regs);
L
Linus Torvalds 已提交
3540
	if (dev->region)
3541 3542
		release_mem_region(pci_resource_start(pdev, 0),
				pci_resource_len(pdev, 0));
L
Linus Torvalds 已提交
3543
	if (dev->enabled)
3544 3545
		pci_disable_device(pdev);
	device_remove_file(&pdev->dev, &dev_attr_registers);
L
Linus Torvalds 已提交
3546

3547
	ep_info(dev, "unbind\n");
L
Linus Torvalds 已提交
3548 3549 3550 3551 3552 3553
}

/* wrap this driver around the specified device, but
 * don't respond over USB until a gadget driver binds to us.
 */

3554
static int net2280_probe(struct pci_dev *pdev, const struct pci_device_id *id)
L
Linus Torvalds 已提交
3555 3556 3557 3558 3559 3560
{
	struct net2280		*dev;
	unsigned long		resource, len;
	void			__iomem *base = NULL;
	int			retval, i;

3561 3562 3563
	if (!use_dma)
		use_dma_chaining = 0;

L
Linus Torvalds 已提交
3564
	/* alloc, and start init */
3565 3566
	dev = kzalloc(sizeof(*dev), GFP_KERNEL);
	if (dev == NULL) {
L
Linus Torvalds 已提交
3567 3568 3569 3570
		retval = -ENOMEM;
		goto done;
	}

3571 3572
	pci_set_drvdata(pdev, dev);
	spin_lock_init(&dev->lock);
3573
	dev->quirks = id->driver_data;
L
Linus Torvalds 已提交
3574 3575
	dev->pdev = pdev;
	dev->gadget.ops = &net2280_ops;
3576
	dev->gadget.max_speed = (dev->quirks & PLX_SUPERSPEED) ?
3577
				USB_SPEED_SUPER : USB_SPEED_HIGH;
L
Linus Torvalds 已提交
3578 3579 3580 3581 3582

	/* the "gadget" abstracts/virtualizes the controller */
	dev->gadget.name = driver_name;

	/* now all the pci goodies ... */
3583 3584
	if (pci_enable_device(pdev) < 0) {
		retval = -ENODEV;
L
Linus Torvalds 已提交
3585 3586 3587 3588 3589 3590 3591 3592
		goto done;
	}
	dev->enabled = 1;

	/* BAR 0 holds all the registers
	 * BAR 1 is 8051 memory; unused here (note erratum 0103)
	 * BAR 2 is fifo memory; unused here
	 */
3593 3594 3595
	resource = pci_resource_start(pdev, 0);
	len = pci_resource_len(pdev, 0);
	if (!request_mem_region(resource, len, driver_name)) {
3596
		ep_dbg(dev, "controller already in use\n");
L
Linus Torvalds 已提交
3597 3598 3599 3600 3601
		retval = -EBUSY;
		goto done;
	}
	dev->region = 1;

3602 3603 3604 3605
	/* FIXME provide firmware download interface to put
	 * 8051 code into the chip, e.g. to turn on PCI PM.
	 */

3606
	base = ioremap_nocache(resource, len);
L
Linus Torvalds 已提交
3607
	if (base == NULL) {
3608
		ep_dbg(dev, "can't map memory\n");
L
Linus Torvalds 已提交
3609 3610 3611 3612 3613 3614 3615 3616 3617 3618
		retval = -EFAULT;
		goto done;
	}
	dev->regs = (struct net2280_regs __iomem *) base;
	dev->usb = (struct net2280_usb_regs __iomem *) (base + 0x0080);
	dev->pci = (struct net2280_pci_regs __iomem *) (base + 0x0100);
	dev->dma = (struct net2280_dma_regs __iomem *) (base + 0x0180);
	dev->dep = (struct net2280_dep_regs __iomem *) (base + 0x0200);
	dev->epregs = (struct net2280_ep_regs __iomem *) (base + 0x0300);

3619
	if (dev->quirks & PLX_SUPERSPEED) {
3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636
		u32 fsmvalue;
		u32 usbstat;
		dev->usb_ext = (struct usb338x_usb_ext_regs __iomem *)
							(base + 0x00b4);
		dev->fiforegs = (struct usb338x_fifo_regs __iomem *)
							(base + 0x0500);
		dev->llregs = (struct usb338x_ll_regs __iomem *)
							(base + 0x0700);
		dev->ll_lfps_regs = (struct usb338x_ll_lfps_regs __iomem *)
							(base + 0x0748);
		dev->ll_tsn_regs = (struct usb338x_ll_tsn_regs __iomem *)
							(base + 0x077c);
		dev->ll_chicken_reg = (struct usb338x_ll_chi_regs __iomem *)
							(base + 0x079c);
		dev->plregs = (struct usb338x_pl_regs __iomem *)
							(base + 0x0800);
		usbstat = readl(&dev->usb->usbstat);
3637
		dev->enhanced_mode = !!(usbstat & BIT(11));
3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651
		dev->n_ep = (dev->enhanced_mode) ? 9 : 5;
		/* put into initial config, link up all endpoints */
		fsmvalue = get_idx_reg(dev->regs, SCRATCH) &
					(0xf << DEFECT7374_FSM_FIELD);
		/* See if firmware needs to set up for workaround: */
		if (fsmvalue == DEFECT7374_FSM_SS_CONTROL_READ)
			writel(0, &dev->usb->usbctl);
	} else{
		dev->enhanced_mode = 0;
		dev->n_ep = 7;
		/* put into initial config, link up all endpoints */
		writel(0, &dev->usb->usbctl);
	}

3652 3653
	usb_reset(dev);
	usb_reinit(dev);
L
Linus Torvalds 已提交
3654 3655 3656

	/* irq setup after old hardware is cleaned up */
	if (!pdev->irq) {
3657
		ep_err(dev, "No IRQ.  Check PCI setup!\n");
L
Linus Torvalds 已提交
3658 3659 3660
		retval = -ENODEV;
		goto done;
	}
D
David S. Miller 已提交
3661

3662
	if (use_msi && (dev->quirks & PLX_SUPERSPEED))
3663
		if (pci_enable_msi(pdev))
3664
			ep_err(dev, "Failed to enable MSI mode\n");
3665

3666 3667
	if (request_irq(pdev->irq, net2280_irq, IRQF_SHARED,
							driver_name, dev)) {
3668
		ep_err(dev, "request interrupt %d failed\n", pdev->irq);
L
Linus Torvalds 已提交
3669 3670 3671 3672 3673 3674 3675
		retval = -EBUSY;
		goto done;
	}
	dev->got_irq = 1;

	/* DMA setup */
	/* NOTE:  we know only the 32 LSBs of dma addresses may be nonzero */
3676 3677
	dev->requests = pci_pool_create("requests", pdev,
		sizeof(struct net2280_dma),
L
Linus Torvalds 已提交
3678 3679 3680
		0 /* no alignment requirements */,
		0 /* or page-crossing issues */);
	if (!dev->requests) {
3681
		ep_dbg(dev, "can't get request pool\n");
L
Linus Torvalds 已提交
3682 3683 3684 3685 3686 3687
		retval = -ENOMEM;
		goto done;
	}
	for (i = 1; i < 5; i++) {
		struct net2280_dma	*td;

3688 3689
		td = pci_pool_alloc(dev->requests, GFP_KERNEL,
				&dev->ep[i].td_dma);
L
Linus Torvalds 已提交
3690
		if (!td) {
3691
			ep_dbg(dev, "can't get dummy %d\n", i);
L
Linus Torvalds 已提交
3692 3693 3694 3695 3696
			retval = -ENOMEM;
			goto done;
		}
		td->dmacount = 0;	/* not VALID */
		td->dmadesc = td->dmaaddr;
3697
		dev->ep[i].dummy = td;
L
Linus Torvalds 已提交
3698 3699 3700
	}

	/* enable lower-overhead pci memory bursts during DMA */
3701
	if (dev->quirks & PLX_LEGACY)
3702 3703 3704 3705 3706 3707 3708 3709
		writel(BIT(DMA_MEMORY_WRITE_AND_INVALIDATE_ENABLE) |
			/*
			 * 256 write retries may not be enough...
			   BIT(PCI_RETRY_ABORT_ENABLE) |
			*/
			BIT(DMA_READ_MULTIPLE_ENABLE) |
			BIT(DMA_READ_LINE_ENABLE),
			&dev->pci->pcimstctl);
L
Linus Torvalds 已提交
3710
	/* erratum 0115 shouldn't appear: Linux inits PCI_LATENCY_TIMER */
3711 3712
	pci_set_master(pdev);
	pci_try_set_mwi(pdev);
L
Linus Torvalds 已提交
3713 3714

	/* ... also flushes any posted pci writes */
3715
	dev->chiprev = get_idx_reg(dev->regs, REG_CHIPREV) & 0xffff;
L
Linus Torvalds 已提交
3716 3717

	/* done */
3718 3719
	ep_info(dev, "%s\n", driver_desc);
	ep_info(dev, "irq %d, pci mem %p, chip rev %04x\n",
D
David S. Miller 已提交
3720
			pdev->irq, base, dev->chiprev);
3721
	ep_info(dev, "version: " DRIVER_VERSION "; dma %s %s\n",
3722 3723 3724
		use_dma	? (use_dma_chaining ? "chaining" : "enabled")
			: "disabled",
		dev->enhanced_mode ? "enhanced mode" : "legacy mode");
3725 3726 3727
	retval = device_create_file(&pdev->dev, &dev_attr_registers);
	if (retval)
		goto done;
L
Linus Torvalds 已提交
3728

3729 3730
	retval = usb_add_gadget_udc_release(&pdev->dev, &dev->gadget,
			gadget_release);
3731 3732
	if (retval)
		goto done;
L
Linus Torvalds 已提交
3733 3734 3735 3736
	return 0;

done:
	if (dev)
3737
		net2280_remove(pdev);
L
Linus Torvalds 已提交
3738 3739 3740
	return retval;
}

3741 3742 3743 3744
/* make sure the board is quiescent; otherwise it will continue
 * generating IRQs across the upcoming reboot.
 */

3745
static void net2280_shutdown(struct pci_dev *pdev)
3746
{
3747
	struct net2280		*dev = pci_get_drvdata(pdev);
3748 3749

	/* disable IRQs */
3750 3751
	writel(0, &dev->regs->pciirqenb0);
	writel(0, &dev->regs->pciirqenb1);
3752 3753

	/* disable the pullup so the host will think we're gone */
3754
	writel(0, &dev->usb->usbctl);
3755 3756

	/* Disable full-speed test mode */
3757
	if (dev->quirks & PLX_LEGACY)
3758
		writel(0, &dev->usb->xcvrdiag);
3759 3760
}

L
Linus Torvalds 已提交
3761 3762 3763

/*-------------------------------------------------------------------------*/

3764
static const struct pci_device_id pci_ids[] = { {
3765 3766
	.class =	((PCI_CLASS_SERIAL_USB << 8) | 0xfe),
	.class_mask =	~0,
3767
	.vendor =	PCI_VENDOR_ID_PLX_LEGACY,
L
Linus Torvalds 已提交
3768 3769 3770
	.device =	0x2280,
	.subvendor =	PCI_ANY_ID,
	.subdevice =	PCI_ANY_ID,
3771
	.driver_data =	PLX_LEGACY | PLX_2280,
3772
	}, {
3773 3774
	.class =	((PCI_CLASS_SERIAL_USB << 8) | 0xfe),
	.class_mask =	~0,
3775
	.vendor =	PCI_VENDOR_ID_PLX_LEGACY,
3776 3777 3778
	.device =	0x2282,
	.subvendor =	PCI_ANY_ID,
	.subdevice =	PCI_ANY_ID,
3779
	.driver_data =	PLX_LEGACY,
3780
	},
3781
	{
3782 3783 3784 3785 3786 3787
	.class =	((PCI_CLASS_SERIAL_USB << 8) | 0xfe),
	.class_mask =	~0,
	.vendor =	PCI_VENDOR_ID_PLX,
	.device =	0x3380,
	.subvendor =	PCI_ANY_ID,
	.subdevice =	PCI_ANY_ID,
3788
	.driver_data =	PLX_SUPERSPEED,
3789 3790
	 },
	{
3791 3792 3793 3794 3795 3796
	.class =	((PCI_CLASS_SERIAL_USB << 8) | 0xfe),
	.class_mask =	~0,
	.vendor =	PCI_VENDOR_ID_PLX,
	.device =	0x3382,
	.subvendor =	PCI_ANY_ID,
	.subdevice =	PCI_ANY_ID,
3797
	.driver_data =	PLX_SUPERSPEED,
3798 3799
	 },
{ /* end: all zeroes */ }
L
Linus Torvalds 已提交
3800
};
3801
MODULE_DEVICE_TABLE(pci, pci_ids);
L
Linus Torvalds 已提交
3802 3803 3804 3805 3806 3807 3808 3809

/* pci driver glue; this is a "new style" PCI driver module */
static struct pci_driver net2280_pci_driver = {
	.name =		(char *) driver_name,
	.id_table =	pci_ids,

	.probe =	net2280_probe,
	.remove =	net2280_remove,
3810
	.shutdown =	net2280_shutdown,
L
Linus Torvalds 已提交
3811 3812 3813 3814

	/* FIXME add power management support */
};

3815 3816
module_pci_driver(net2280_pci_driver);

3817 3818 3819
MODULE_DESCRIPTION(DRIVER_DESC);
MODULE_AUTHOR("David Brownell");
MODULE_LICENSE("GPL");