cachepc-linux

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

net2272.c (70118B)


      1// SPDX-License-Identifier: GPL-2.0+
      2/*
      3 * Driver for PLX NET2272 USB device controller
      4 *
      5 * Copyright (C) 2005-2006 PLX Technology, Inc.
      6 * Copyright (C) 2006-2011 Analog Devices, Inc.
      7 */
      8
      9#include <linux/delay.h>
     10#include <linux/device.h>
     11#include <linux/errno.h>
     12#include <linux/init.h>
     13#include <linux/interrupt.h>
     14#include <linux/io.h>
     15#include <linux/ioport.h>
     16#include <linux/kernel.h>
     17#include <linux/list.h>
     18#include <linux/module.h>
     19#include <linux/moduleparam.h>
     20#include <linux/pci.h>
     21#include <linux/platform_device.h>
     22#include <linux/prefetch.h>
     23#include <linux/sched.h>
     24#include <linux/slab.h>
     25#include <linux/timer.h>
     26#include <linux/usb.h>
     27#include <linux/usb/ch9.h>
     28#include <linux/usb/gadget.h>
     29
     30#include <asm/byteorder.h>
     31#include <asm/unaligned.h>
     32
     33#include "net2272.h"
     34
     35#define DRIVER_DESC "PLX NET2272 USB Peripheral Controller"
     36
     37static const char driver_name[] = "net2272";
     38static const char driver_vers[] = "2006 October 17/mainline";
     39static const char driver_desc[] = DRIVER_DESC;
     40
     41static const char ep0name[] = "ep0";
     42static const char * const ep_name[] = {
     43	ep0name,
     44	"ep-a", "ep-b", "ep-c",
     45};
     46
     47#ifdef CONFIG_USB_NET2272_DMA
     48/*
     49 * use_dma: the NET2272 can use an external DMA controller.
     50 * Note that since there is no generic DMA api, some functions,
     51 * notably request_dma, start_dma, and cancel_dma will need to be
     52 * modified for your platform's particular dma controller.
     53 *
     54 * If use_dma is disabled, pio will be used instead.
     55 */
     56static bool use_dma = false;
     57module_param(use_dma, bool, 0644);
     58
     59/*
     60 * dma_ep: selects the endpoint for use with dma (1=ep-a, 2=ep-b)
     61 * The NET2272 can only use dma for a single endpoint at a time.
     62 * At some point this could be modified to allow either endpoint
     63 * to take control of dma as it becomes available.
     64 *
     65 * Note that DMA should not be used on OUT endpoints unless it can
     66 * be guaranteed that no short packets will arrive on an IN endpoint
     67 * while the DMA operation is pending.  Otherwise the OUT DMA will
     68 * terminate prematurely (See NET2272 Errata 630-0213-0101)
     69 */
     70static ushort dma_ep = 1;
     71module_param(dma_ep, ushort, 0644);
     72
     73/*
     74 * dma_mode: net2272 dma mode setting (see LOCCTL1 definition):
     75 *	mode 0 == Slow DREQ mode
     76 *	mode 1 == Fast DREQ mode
     77 *	mode 2 == Burst mode
     78 */
     79static ushort dma_mode = 2;
     80module_param(dma_mode, ushort, 0644);
     81#else
     82#define use_dma 0
     83#define dma_ep 1
     84#define dma_mode 2
     85#endif
     86
     87/*
     88 * fifo_mode: net2272 buffer configuration:
     89 *      mode 0 == ep-{a,b,c} 512db each
     90 *      mode 1 == ep-a 1k, ep-{b,c} 512db
     91 *      mode 2 == ep-a 1k, ep-b 1k, ep-c 512db
     92 *      mode 3 == ep-a 1k, ep-b disabled, ep-c 512db
     93 */
     94static ushort fifo_mode = 0;
     95module_param(fifo_mode, ushort, 0644);
     96
     97/*
     98 * enable_suspend: When enabled, the driver will respond to
     99 * USB suspend requests by powering down the NET2272.  Otherwise,
    100 * USB suspend requests will be ignored.  This is acceptable for
    101 * self-powered devices.  For bus powered devices set this to 1.
    102 */
    103static ushort enable_suspend = 0;
    104module_param(enable_suspend, ushort, 0644);
    105
    106static void assert_out_naking(struct net2272_ep *ep, const char *where)
    107{
    108	u8 tmp;
    109
    110#ifndef DEBUG
    111	return;
    112#endif
    113
    114	tmp = net2272_ep_read(ep, EP_STAT0);
    115	if ((tmp & (1 << NAK_OUT_PACKETS)) == 0) {
    116		dev_dbg(ep->dev->dev, "%s %s %02x !NAK\n",
    117			ep->ep.name, where, tmp);
    118		net2272_ep_write(ep, EP_RSPSET, 1 << ALT_NAK_OUT_PACKETS);
    119	}
    120}
    121#define ASSERT_OUT_NAKING(ep) assert_out_naking(ep, __func__)
    122
    123static void stop_out_naking(struct net2272_ep *ep)
    124{
    125	u8 tmp = net2272_ep_read(ep, EP_STAT0);
    126
    127	if ((tmp & (1 << NAK_OUT_PACKETS)) != 0)
    128		net2272_ep_write(ep, EP_RSPCLR, 1 << ALT_NAK_OUT_PACKETS);
    129}
    130
    131#define PIPEDIR(bAddress) (usb_pipein(bAddress) ? "in" : "out")
    132
    133static char *type_string(u8 bmAttributes)
    134{
    135	switch ((bmAttributes) & USB_ENDPOINT_XFERTYPE_MASK) {
    136	case USB_ENDPOINT_XFER_BULK: return "bulk";
    137	case USB_ENDPOINT_XFER_ISOC: return "iso";
    138	case USB_ENDPOINT_XFER_INT:  return "intr";
    139	default:                     return "control";
    140	}
    141}
    142
    143static char *buf_state_string(unsigned state)
    144{
    145	switch (state) {
    146	case BUFF_FREE:  return "free";
    147	case BUFF_VALID: return "valid";
    148	case BUFF_LCL:   return "local";
    149	case BUFF_USB:   return "usb";
    150	default:         return "unknown";
    151	}
    152}
    153
    154static char *dma_mode_string(void)
    155{
    156	if (!use_dma)
    157		return "PIO";
    158	switch (dma_mode) {
    159	case 0:  return "SLOW DREQ";
    160	case 1:  return "FAST DREQ";
    161	case 2:  return "BURST";
    162	default: return "invalid";
    163	}
    164}
    165
    166static void net2272_dequeue_all(struct net2272_ep *);
    167static int net2272_kick_dma(struct net2272_ep *, struct net2272_request *);
    168static int net2272_fifo_status(struct usb_ep *);
    169
    170static const struct usb_ep_ops net2272_ep_ops;
    171
    172/*---------------------------------------------------------------------------*/
    173
    174static int
    175net2272_enable(struct usb_ep *_ep, const struct usb_endpoint_descriptor *desc)
    176{
    177	struct net2272 *dev;
    178	struct net2272_ep *ep;
    179	u32 max;
    180	u8 tmp;
    181	unsigned long flags;
    182
    183	ep = container_of(_ep, struct net2272_ep, ep);
    184	if (!_ep || !desc || ep->desc || _ep->name == ep0name
    185			|| desc->bDescriptorType != USB_DT_ENDPOINT)
    186		return -EINVAL;
    187	dev = ep->dev;
    188	if (!dev->driver || dev->gadget.speed == USB_SPEED_UNKNOWN)
    189		return -ESHUTDOWN;
    190
    191	max = usb_endpoint_maxp(desc);
    192
    193	spin_lock_irqsave(&dev->lock, flags);
    194	_ep->maxpacket = max;
    195	ep->desc = desc;
    196
    197	/* net2272_ep_reset() has already been called */
    198	ep->stopped = 0;
    199	ep->wedged = 0;
    200
    201	/* set speed-dependent max packet */
    202	net2272_ep_write(ep, EP_MAXPKT0, max & 0xff);
    203	net2272_ep_write(ep, EP_MAXPKT1, (max & 0xff00) >> 8);
    204
    205	/* set type, direction, address; reset fifo counters */
    206	net2272_ep_write(ep, EP_STAT1, 1 << BUFFER_FLUSH);
    207	tmp = usb_endpoint_type(desc);
    208	if (usb_endpoint_xfer_bulk(desc)) {
    209		/* catch some particularly blatant driver bugs */
    210		if ((dev->gadget.speed == USB_SPEED_HIGH && max != 512) ||
    211		    (dev->gadget.speed == USB_SPEED_FULL && max > 64)) {
    212			spin_unlock_irqrestore(&dev->lock, flags);
    213			return -ERANGE;
    214		}
    215	}
    216	ep->is_iso = usb_endpoint_xfer_isoc(desc) ? 1 : 0;
    217	tmp <<= ENDPOINT_TYPE;
    218	tmp |= ((desc->bEndpointAddress & 0x0f) << ENDPOINT_NUMBER);
    219	tmp |= usb_endpoint_dir_in(desc) << ENDPOINT_DIRECTION;
    220	tmp |= (1 << ENDPOINT_ENABLE);
    221
    222	/* for OUT transfers, block the rx fifo until a read is posted */
    223	ep->is_in = usb_endpoint_dir_in(desc);
    224	if (!ep->is_in)
    225		net2272_ep_write(ep, EP_RSPSET, 1 << ALT_NAK_OUT_PACKETS);
    226
    227	net2272_ep_write(ep, EP_CFG, tmp);
    228
    229	/* enable irqs */
    230	tmp = (1 << ep->num) | net2272_read(dev, IRQENB0);
    231	net2272_write(dev, IRQENB0, tmp);
    232
    233	tmp = (1 << DATA_PACKET_RECEIVED_INTERRUPT_ENABLE)
    234		| (1 << DATA_PACKET_TRANSMITTED_INTERRUPT_ENABLE)
    235		| net2272_ep_read(ep, EP_IRQENB);
    236	net2272_ep_write(ep, EP_IRQENB, tmp);
    237
    238	tmp = desc->bEndpointAddress;
    239	dev_dbg(dev->dev, "enabled %s (ep%d%s-%s) max %04x cfg %02x\n",
    240		_ep->name, tmp & 0x0f, PIPEDIR(tmp),
    241		type_string(desc->bmAttributes), max,
    242		net2272_ep_read(ep, EP_CFG));
    243
    244	spin_unlock_irqrestore(&dev->lock, flags);
    245	return 0;
    246}
    247
    248static void net2272_ep_reset(struct net2272_ep *ep)
    249{
    250	u8 tmp;
    251
    252	ep->desc = NULL;
    253	INIT_LIST_HEAD(&ep->queue);
    254
    255	usb_ep_set_maxpacket_limit(&ep->ep, ~0);
    256	ep->ep.ops = &net2272_ep_ops;
    257
    258	/* disable irqs, endpoint */
    259	net2272_ep_write(ep, EP_IRQENB, 0);
    260
    261	/* init to our chosen defaults, notably so that we NAK OUT
    262	 * packets until the driver queues a read.
    263	 */
    264	tmp = (1 << NAK_OUT_PACKETS_MODE) | (1 << ALT_NAK_OUT_PACKETS);
    265	net2272_ep_write(ep, EP_RSPSET, tmp);
    266
    267	tmp = (1 << INTERRUPT_MODE) | (1 << HIDE_STATUS_PHASE);
    268	if (ep->num != 0)
    269		tmp |= (1 << ENDPOINT_TOGGLE) | (1 << ENDPOINT_HALT);
    270
    271	net2272_ep_write(ep, EP_RSPCLR, tmp);
    272
    273	/* scrub most status bits, and flush any fifo state */
    274	net2272_ep_write(ep, EP_STAT0,
    275			  (1 << DATA_IN_TOKEN_INTERRUPT)
    276			| (1 << DATA_OUT_TOKEN_INTERRUPT)
    277			| (1 << DATA_PACKET_TRANSMITTED_INTERRUPT)
    278			| (1 << DATA_PACKET_RECEIVED_INTERRUPT)
    279			| (1 << SHORT_PACKET_TRANSFERRED_INTERRUPT));
    280
    281	net2272_ep_write(ep, EP_STAT1,
    282			    (1 << TIMEOUT)
    283			  | (1 << USB_OUT_ACK_SENT)
    284			  | (1 << USB_OUT_NAK_SENT)
    285			  | (1 << USB_IN_ACK_RCVD)
    286			  | (1 << USB_IN_NAK_SENT)
    287			  | (1 << USB_STALL_SENT)
    288			  | (1 << LOCAL_OUT_ZLP)
    289			  | (1 << BUFFER_FLUSH));
    290
    291	/* fifo size is handled separately */
    292}
    293
    294static int net2272_disable(struct usb_ep *_ep)
    295{
    296	struct net2272_ep *ep;
    297	unsigned long flags;
    298
    299	ep = container_of(_ep, struct net2272_ep, ep);
    300	if (!_ep || !ep->desc || _ep->name == ep0name)
    301		return -EINVAL;
    302
    303	spin_lock_irqsave(&ep->dev->lock, flags);
    304	net2272_dequeue_all(ep);
    305	net2272_ep_reset(ep);
    306
    307	dev_vdbg(ep->dev->dev, "disabled %s\n", _ep->name);
    308
    309	spin_unlock_irqrestore(&ep->dev->lock, flags);
    310	return 0;
    311}
    312
    313/*---------------------------------------------------------------------------*/
    314
    315static struct usb_request *
    316net2272_alloc_request(struct usb_ep *_ep, gfp_t gfp_flags)
    317{
    318	struct net2272_request *req;
    319
    320	if (!_ep)
    321		return NULL;
    322
    323	req = kzalloc(sizeof(*req), gfp_flags);
    324	if (!req)
    325		return NULL;
    326
    327	INIT_LIST_HEAD(&req->queue);
    328
    329	return &req->req;
    330}
    331
    332static void
    333net2272_free_request(struct usb_ep *_ep, struct usb_request *_req)
    334{
    335	struct net2272_request *req;
    336
    337	if (!_ep || !_req)
    338		return;
    339
    340	req = container_of(_req, struct net2272_request, req);
    341	WARN_ON(!list_empty(&req->queue));
    342	kfree(req);
    343}
    344
    345static void
    346net2272_done(struct net2272_ep *ep, struct net2272_request *req, int status)
    347{
    348	struct net2272 *dev;
    349	unsigned stopped = ep->stopped;
    350
    351	if (ep->num == 0) {
    352		if (ep->dev->protocol_stall) {
    353			ep->stopped = 1;
    354			set_halt(ep);
    355		}
    356		allow_status(ep);
    357	}
    358
    359	list_del_init(&req->queue);
    360
    361	if (req->req.status == -EINPROGRESS)
    362		req->req.status = status;
    363	else
    364		status = req->req.status;
    365
    366	dev = ep->dev;
    367	if (use_dma && ep->dma)
    368		usb_gadget_unmap_request(&dev->gadget, &req->req,
    369				ep->is_in);
    370
    371	if (status && status != -ESHUTDOWN)
    372		dev_vdbg(dev->dev, "complete %s req %p stat %d len %u/%u buf %p\n",
    373			ep->ep.name, &req->req, status,
    374			req->req.actual, req->req.length, req->req.buf);
    375
    376	/* don't modify queue heads during completion callback */
    377	ep->stopped = 1;
    378	spin_unlock(&dev->lock);
    379	usb_gadget_giveback_request(&ep->ep, &req->req);
    380	spin_lock(&dev->lock);
    381	ep->stopped = stopped;
    382}
    383
    384static int
    385net2272_write_packet(struct net2272_ep *ep, u8 *buf,
    386	struct net2272_request *req, unsigned max)
    387{
    388	u16 __iomem *ep_data = net2272_reg_addr(ep->dev, EP_DATA);
    389	u16 *bufp;
    390	unsigned length, count;
    391	u8 tmp;
    392
    393	length = min(req->req.length - req->req.actual, max);
    394	req->req.actual += length;
    395
    396	dev_vdbg(ep->dev->dev, "write packet %s req %p max %u len %u avail %u\n",
    397		ep->ep.name, req, max, length,
    398		(net2272_ep_read(ep, EP_AVAIL1) << 8) | net2272_ep_read(ep, EP_AVAIL0));
    399
    400	count = length;
    401	bufp = (u16 *)buf;
    402
    403	while (likely(count >= 2)) {
    404		/* no byte-swap required; chip endian set during init */
    405		writew(*bufp++, ep_data);
    406		count -= 2;
    407	}
    408	buf = (u8 *)bufp;
    409
    410	/* write final byte by placing the NET2272 into 8-bit mode */
    411	if (unlikely(count)) {
    412		tmp = net2272_read(ep->dev, LOCCTL);
    413		net2272_write(ep->dev, LOCCTL, tmp & ~(1 << DATA_WIDTH));
    414		writeb(*buf, ep_data);
    415		net2272_write(ep->dev, LOCCTL, tmp);
    416	}
    417	return length;
    418}
    419
    420/* returns: 0: still running, 1: completed, negative: errno */
    421static int
    422net2272_write_fifo(struct net2272_ep *ep, struct net2272_request *req)
    423{
    424	u8 *buf;
    425	unsigned count, max;
    426	int status;
    427
    428	dev_vdbg(ep->dev->dev, "write_fifo %s actual %d len %d\n",
    429		ep->ep.name, req->req.actual, req->req.length);
    430
    431	/*
    432	 * Keep loading the endpoint until the final packet is loaded,
    433	 * or the endpoint buffer is full.
    434	 */
    435 top:
    436	/*
    437	 * Clear interrupt status
    438	 *  - Packet Transmitted interrupt will become set again when the
    439	 *    host successfully takes another packet
    440	 */
    441	net2272_ep_write(ep, EP_STAT0, (1 << DATA_PACKET_TRANSMITTED_INTERRUPT));
    442	while (!(net2272_ep_read(ep, EP_STAT0) & (1 << BUFFER_FULL))) {
    443		buf = req->req.buf + req->req.actual;
    444		prefetch(buf);
    445
    446		/* force pagesel */
    447		net2272_ep_read(ep, EP_STAT0);
    448
    449		max = (net2272_ep_read(ep, EP_AVAIL1) << 8) |
    450			(net2272_ep_read(ep, EP_AVAIL0));
    451
    452		if (max < ep->ep.maxpacket)
    453			max = (net2272_ep_read(ep, EP_AVAIL1) << 8)
    454				| (net2272_ep_read(ep, EP_AVAIL0));
    455
    456		count = net2272_write_packet(ep, buf, req, max);
    457		/* see if we are done */
    458		if (req->req.length == req->req.actual) {
    459			/* validate short or zlp packet */
    460			if (count < ep->ep.maxpacket)
    461				set_fifo_bytecount(ep, 0);
    462			net2272_done(ep, req, 0);
    463
    464			if (!list_empty(&ep->queue)) {
    465				req = list_entry(ep->queue.next,
    466						struct net2272_request,
    467						queue);
    468				status = net2272_kick_dma(ep, req);
    469
    470				if (status < 0)
    471					if ((net2272_ep_read(ep, EP_STAT0)
    472							& (1 << BUFFER_EMPTY)))
    473						goto top;
    474			}
    475			return 1;
    476		}
    477		net2272_ep_write(ep, EP_STAT0, (1 << DATA_PACKET_TRANSMITTED_INTERRUPT));
    478	}
    479	return 0;
    480}
    481
    482static void
    483net2272_out_flush(struct net2272_ep *ep)
    484{
    485	ASSERT_OUT_NAKING(ep);
    486
    487	net2272_ep_write(ep, EP_STAT0, (1 << DATA_OUT_TOKEN_INTERRUPT)
    488			| (1 << DATA_PACKET_RECEIVED_INTERRUPT));
    489	net2272_ep_write(ep, EP_STAT1, 1 << BUFFER_FLUSH);
    490}
    491
    492static int
    493net2272_read_packet(struct net2272_ep *ep, u8 *buf,
    494	struct net2272_request *req, unsigned avail)
    495{
    496	u16 __iomem *ep_data = net2272_reg_addr(ep->dev, EP_DATA);
    497	unsigned is_short;
    498	u16 *bufp;
    499
    500	req->req.actual += avail;
    501
    502	dev_vdbg(ep->dev->dev, "read packet %s req %p len %u avail %u\n",
    503		ep->ep.name, req, avail,
    504		(net2272_ep_read(ep, EP_AVAIL1) << 8) | net2272_ep_read(ep, EP_AVAIL0));
    505
    506	is_short = (avail < ep->ep.maxpacket);
    507
    508	if (unlikely(avail == 0)) {
    509		/* remove any zlp from the buffer */
    510		(void)readw(ep_data);
    511		return is_short;
    512	}
    513
    514	/* Ensure we get the final byte */
    515	if (unlikely(avail % 2))
    516		avail++;
    517	bufp = (u16 *)buf;
    518
    519	do {
    520		*bufp++ = readw(ep_data);
    521		avail -= 2;
    522	} while (avail);
    523
    524	/*
    525	 * To avoid false endpoint available race condition must read
    526	 * ep stat0 twice in the case of a short transfer
    527	 */
    528	if (net2272_ep_read(ep, EP_STAT0) & (1 << SHORT_PACKET_TRANSFERRED_INTERRUPT))
    529		net2272_ep_read(ep, EP_STAT0);
    530
    531	return is_short;
    532}
    533
    534static int
    535net2272_read_fifo(struct net2272_ep *ep, struct net2272_request *req)
    536{
    537	u8 *buf;
    538	unsigned is_short;
    539	int count;
    540	int tmp;
    541	int cleanup = 0;
    542
    543	dev_vdbg(ep->dev->dev, "read_fifo %s actual %d len %d\n",
    544		ep->ep.name, req->req.actual, req->req.length);
    545
    546 top:
    547	do {
    548		buf = req->req.buf + req->req.actual;
    549		prefetchw(buf);
    550
    551		count = (net2272_ep_read(ep, EP_AVAIL1) << 8)
    552			| net2272_ep_read(ep, EP_AVAIL0);
    553
    554		net2272_ep_write(ep, EP_STAT0,
    555			(1 << SHORT_PACKET_TRANSFERRED_INTERRUPT) |
    556			(1 << DATA_PACKET_RECEIVED_INTERRUPT));
    557
    558		tmp = req->req.length - req->req.actual;
    559
    560		if (count > tmp) {
    561			if ((tmp % ep->ep.maxpacket) != 0) {
    562				dev_err(ep->dev->dev,
    563					"%s out fifo %d bytes, expected %d\n",
    564					ep->ep.name, count, tmp);
    565				cleanup = 1;
    566			}
    567			count = (tmp > 0) ? tmp : 0;
    568		}
    569
    570		is_short = net2272_read_packet(ep, buf, req, count);
    571
    572		/* completion */
    573		if (unlikely(cleanup || is_short ||
    574				req->req.actual == req->req.length)) {
    575
    576			if (cleanup) {
    577				net2272_out_flush(ep);
    578				net2272_done(ep, req, -EOVERFLOW);
    579			} else
    580				net2272_done(ep, req, 0);
    581
    582			/* re-initialize endpoint transfer registers
    583			 * otherwise they may result in erroneous pre-validation
    584			 * for subsequent control reads
    585			 */
    586			if (unlikely(ep->num == 0)) {
    587				net2272_ep_write(ep, EP_TRANSFER2, 0);
    588				net2272_ep_write(ep, EP_TRANSFER1, 0);
    589				net2272_ep_write(ep, EP_TRANSFER0, 0);
    590			}
    591
    592			if (!list_empty(&ep->queue)) {
    593				int status;
    594
    595				req = list_entry(ep->queue.next,
    596					struct net2272_request, queue);
    597				status = net2272_kick_dma(ep, req);
    598				if ((status < 0) &&
    599				    !(net2272_ep_read(ep, EP_STAT0) & (1 << BUFFER_EMPTY)))
    600					goto top;
    601			}
    602			return 1;
    603		}
    604	} while (!(net2272_ep_read(ep, EP_STAT0) & (1 << BUFFER_EMPTY)));
    605
    606	return 0;
    607}
    608
    609static void
    610net2272_pio_advance(struct net2272_ep *ep)
    611{
    612	struct net2272_request *req;
    613
    614	if (unlikely(list_empty(&ep->queue)))
    615		return;
    616
    617	req = list_entry(ep->queue.next, struct net2272_request, queue);
    618	(ep->is_in ? net2272_write_fifo : net2272_read_fifo)(ep, req);
    619}
    620
    621/* returns 0 on success, else negative errno */
    622static int
    623net2272_request_dma(struct net2272 *dev, unsigned ep, u32 buf,
    624	unsigned len, unsigned dir)
    625{
    626	dev_vdbg(dev->dev, "request_dma ep %d buf %08x len %d dir %d\n",
    627		ep, buf, len, dir);
    628
    629	/* The NET2272 only supports a single dma channel */
    630	if (dev->dma_busy)
    631		return -EBUSY;
    632	/*
    633	 * EP_TRANSFER (used to determine the number of bytes received
    634	 * in an OUT transfer) is 24 bits wide; don't ask for more than that.
    635	 */
    636	if ((dir == 1) && (len > 0x1000000))
    637		return -EINVAL;
    638
    639	dev->dma_busy = 1;
    640
    641	/* initialize platform's dma */
    642#ifdef CONFIG_USB_PCI
    643	/* NET2272 addr, buffer addr, length, etc. */
    644	switch (dev->dev_id) {
    645	case PCI_DEVICE_ID_RDK1:
    646		/* Setup PLX 9054 DMA mode */
    647		writel((1 << LOCAL_BUS_WIDTH) |
    648			(1 << TA_READY_INPUT_ENABLE) |
    649			(0 << LOCAL_BURST_ENABLE) |
    650			(1 << DONE_INTERRUPT_ENABLE) |
    651			(1 << LOCAL_ADDRESSING_MODE) |
    652			(1 << DEMAND_MODE) |
    653			(1 << DMA_EOT_ENABLE) |
    654			(1 << FAST_SLOW_TERMINATE_MODE_SELECT) |
    655			(1 << DMA_CHANNEL_INTERRUPT_SELECT),
    656			dev->rdk1.plx9054_base_addr + DMAMODE0);
    657
    658		writel(0x100000, dev->rdk1.plx9054_base_addr + DMALADR0);
    659		writel(buf, dev->rdk1.plx9054_base_addr + DMAPADR0);
    660		writel(len, dev->rdk1.plx9054_base_addr + DMASIZ0);
    661		writel((dir << DIRECTION_OF_TRANSFER) |
    662			(1 << INTERRUPT_AFTER_TERMINAL_COUNT),
    663			dev->rdk1.plx9054_base_addr + DMADPR0);
    664		writel((1 << LOCAL_DMA_CHANNEL_0_INTERRUPT_ENABLE) |
    665			readl(dev->rdk1.plx9054_base_addr + INTCSR),
    666			dev->rdk1.plx9054_base_addr + INTCSR);
    667
    668		break;
    669	}
    670#endif
    671
    672	net2272_write(dev, DMAREQ,
    673		(0 << DMA_BUFFER_VALID) |
    674		(1 << DMA_REQUEST_ENABLE) |
    675		(1 << DMA_CONTROL_DACK) |
    676		(dev->dma_eot_polarity << EOT_POLARITY) |
    677		(dev->dma_dack_polarity << DACK_POLARITY) |
    678		(dev->dma_dreq_polarity << DREQ_POLARITY) |
    679		((ep >> 1) << DMA_ENDPOINT_SELECT));
    680
    681	(void) net2272_read(dev, SCRATCH);
    682
    683	return 0;
    684}
    685
    686static void
    687net2272_start_dma(struct net2272 *dev)
    688{
    689	/* start platform's dma controller */
    690#ifdef CONFIG_USB_PCI
    691	switch (dev->dev_id) {
    692	case PCI_DEVICE_ID_RDK1:
    693		writeb((1 << CHANNEL_ENABLE) | (1 << CHANNEL_START),
    694			dev->rdk1.plx9054_base_addr + DMACSR0);
    695		break;
    696	}
    697#endif
    698}
    699
    700/* returns 0 on success, else negative errno */
    701static int
    702net2272_kick_dma(struct net2272_ep *ep, struct net2272_request *req)
    703{
    704	unsigned size;
    705	u8 tmp;
    706
    707	if (!use_dma || (ep->num < 1) || (ep->num > 2) || !ep->dma)
    708		return -EINVAL;
    709
    710	/* don't use dma for odd-length transfers
    711	 * otherwise, we'd need to deal with the last byte with pio
    712	 */
    713	if (req->req.length & 1)
    714		return -EINVAL;
    715
    716	dev_vdbg(ep->dev->dev, "kick_dma %s req %p dma %08llx\n",
    717		ep->ep.name, req, (unsigned long long) req->req.dma);
    718
    719	net2272_ep_write(ep, EP_RSPSET, 1 << ALT_NAK_OUT_PACKETS);
    720
    721	/* The NET2272 can only use DMA on one endpoint at a time */
    722	if (ep->dev->dma_busy)
    723		return -EBUSY;
    724
    725	/* Make sure we only DMA an even number of bytes (we'll use
    726	 * pio to complete the transfer)
    727	 */
    728	size = req->req.length;
    729	size &= ~1;
    730
    731	/* device-to-host transfer */
    732	if (ep->is_in) {
    733		/* initialize platform's dma controller */
    734		if (net2272_request_dma(ep->dev, ep->num, req->req.dma, size, 0))
    735			/* unable to obtain DMA channel; return error and use pio mode */
    736			return -EBUSY;
    737		req->req.actual += size;
    738
    739	/* host-to-device transfer */
    740	} else {
    741		tmp = net2272_ep_read(ep, EP_STAT0);
    742
    743		/* initialize platform's dma controller */
    744		if (net2272_request_dma(ep->dev, ep->num, req->req.dma, size, 1))
    745			/* unable to obtain DMA channel; return error and use pio mode */
    746			return -EBUSY;
    747
    748		if (!(tmp & (1 << BUFFER_EMPTY)))
    749			ep->not_empty = 1;
    750		else
    751			ep->not_empty = 0;
    752
    753
    754		/* allow the endpoint's buffer to fill */
    755		net2272_ep_write(ep, EP_RSPCLR, 1 << ALT_NAK_OUT_PACKETS);
    756
    757		/* this transfer completed and data's already in the fifo
    758		 * return error so pio gets used.
    759		 */
    760		if (tmp & (1 << SHORT_PACKET_TRANSFERRED_INTERRUPT)) {
    761
    762			/* deassert dreq */
    763			net2272_write(ep->dev, DMAREQ,
    764				(0 << DMA_BUFFER_VALID) |
    765				(0 << DMA_REQUEST_ENABLE) |
    766				(1 << DMA_CONTROL_DACK) |
    767				(ep->dev->dma_eot_polarity << EOT_POLARITY) |
    768				(ep->dev->dma_dack_polarity << DACK_POLARITY) |
    769				(ep->dev->dma_dreq_polarity << DREQ_POLARITY) |
    770				((ep->num >> 1) << DMA_ENDPOINT_SELECT));
    771
    772			return -EBUSY;
    773		}
    774	}
    775
    776	/* Don't use per-packet interrupts: use dma interrupts only */
    777	net2272_ep_write(ep, EP_IRQENB, 0);
    778
    779	net2272_start_dma(ep->dev);
    780
    781	return 0;
    782}
    783
    784static void net2272_cancel_dma(struct net2272 *dev)
    785{
    786#ifdef CONFIG_USB_PCI
    787	switch (dev->dev_id) {
    788	case PCI_DEVICE_ID_RDK1:
    789		writeb(0, dev->rdk1.plx9054_base_addr + DMACSR0);
    790		writeb(1 << CHANNEL_ABORT, dev->rdk1.plx9054_base_addr + DMACSR0);
    791		while (!(readb(dev->rdk1.plx9054_base_addr + DMACSR0) &
    792		         (1 << CHANNEL_DONE)))
    793			continue;	/* wait for dma to stabalize */
    794
    795		/* dma abort generates an interrupt */
    796		writeb(1 << CHANNEL_CLEAR_INTERRUPT,
    797			dev->rdk1.plx9054_base_addr + DMACSR0);
    798		break;
    799	}
    800#endif
    801
    802	dev->dma_busy = 0;
    803}
    804
    805/*---------------------------------------------------------------------------*/
    806
    807static int
    808net2272_queue(struct usb_ep *_ep, struct usb_request *_req, gfp_t gfp_flags)
    809{
    810	struct net2272_request *req;
    811	struct net2272_ep *ep;
    812	struct net2272 *dev;
    813	unsigned long flags;
    814	int status = -1;
    815	u8 s;
    816
    817	req = container_of(_req, struct net2272_request, req);
    818	if (!_req || !_req->complete || !_req->buf
    819			|| !list_empty(&req->queue))
    820		return -EINVAL;
    821	ep = container_of(_ep, struct net2272_ep, ep);
    822	if (!_ep || (!ep->desc && ep->num != 0))
    823		return -EINVAL;
    824	dev = ep->dev;
    825	if (!dev->driver || dev->gadget.speed == USB_SPEED_UNKNOWN)
    826		return -ESHUTDOWN;
    827
    828	/* set up dma mapping in case the caller didn't */
    829	if (use_dma && ep->dma) {
    830		status = usb_gadget_map_request(&dev->gadget, _req,
    831				ep->is_in);
    832		if (status)
    833			return status;
    834	}
    835
    836	dev_vdbg(dev->dev, "%s queue req %p, len %d buf %p dma %08llx %s\n",
    837		_ep->name, _req, _req->length, _req->buf,
    838		(unsigned long long) _req->dma, _req->zero ? "zero" : "!zero");
    839
    840	spin_lock_irqsave(&dev->lock, flags);
    841
    842	_req->status = -EINPROGRESS;
    843	_req->actual = 0;
    844
    845	/* kickstart this i/o queue? */
    846	if (list_empty(&ep->queue) && !ep->stopped) {
    847		/* maybe there's no control data, just status ack */
    848		if (ep->num == 0 && _req->length == 0) {
    849			net2272_done(ep, req, 0);
    850			dev_vdbg(dev->dev, "%s status ack\n", ep->ep.name);
    851			goto done;
    852		}
    853
    854		/* Return zlp, don't let it block subsequent packets */
    855		s = net2272_ep_read(ep, EP_STAT0);
    856		if (s & (1 << BUFFER_EMPTY)) {
    857			/* Buffer is empty check for a blocking zlp, handle it */
    858			if ((s & (1 << NAK_OUT_PACKETS)) &&
    859			    net2272_ep_read(ep, EP_STAT1) & (1 << LOCAL_OUT_ZLP)) {
    860				dev_dbg(dev->dev, "WARNING: returning ZLP short packet termination!\n");
    861				/*
    862				 * Request is going to terminate with a short packet ...
    863				 * hope the client is ready for it!
    864				 */
    865				status = net2272_read_fifo(ep, req);
    866				/* clear short packet naking */
    867				net2272_ep_write(ep, EP_STAT0, (1 << NAK_OUT_PACKETS));
    868				goto done;
    869			}
    870		}
    871
    872		/* try dma first */
    873		status = net2272_kick_dma(ep, req);
    874
    875		if (status < 0) {
    876			/* dma failed (most likely in use by another endpoint)
    877			 * fallback to pio
    878			 */
    879			status = 0;
    880
    881			if (ep->is_in)
    882				status = net2272_write_fifo(ep, req);
    883			else {
    884				s = net2272_ep_read(ep, EP_STAT0);
    885				if ((s & (1 << BUFFER_EMPTY)) == 0)
    886					status = net2272_read_fifo(ep, req);
    887			}
    888
    889			if (unlikely(status != 0)) {
    890				if (status > 0)
    891					status = 0;
    892				req = NULL;
    893			}
    894		}
    895	}
    896	if (likely(req))
    897		list_add_tail(&req->queue, &ep->queue);
    898
    899	if (likely(!list_empty(&ep->queue)))
    900		net2272_ep_write(ep, EP_RSPCLR, 1 << ALT_NAK_OUT_PACKETS);
    901 done:
    902	spin_unlock_irqrestore(&dev->lock, flags);
    903
    904	return 0;
    905}
    906
    907/* dequeue ALL requests */
    908static void
    909net2272_dequeue_all(struct net2272_ep *ep)
    910{
    911	struct net2272_request *req;
    912
    913	/* called with spinlock held */
    914	ep->stopped = 1;
    915
    916	while (!list_empty(&ep->queue)) {
    917		req = list_entry(ep->queue.next,
    918				struct net2272_request,
    919				queue);
    920		net2272_done(ep, req, -ESHUTDOWN);
    921	}
    922}
    923
    924/* dequeue JUST ONE request */
    925static int
    926net2272_dequeue(struct usb_ep *_ep, struct usb_request *_req)
    927{
    928	struct net2272_ep *ep;
    929	struct net2272_request *req = NULL, *iter;
    930	unsigned long flags;
    931	int stopped;
    932
    933	ep = container_of(_ep, struct net2272_ep, ep);
    934	if (!_ep || (!ep->desc && ep->num != 0) || !_req)
    935		return -EINVAL;
    936
    937	spin_lock_irqsave(&ep->dev->lock, flags);
    938	stopped = ep->stopped;
    939	ep->stopped = 1;
    940
    941	/* make sure it's still queued on this endpoint */
    942	list_for_each_entry(iter, &ep->queue, queue) {
    943		if (&iter->req != _req)
    944			continue;
    945		req = iter;
    946		break;
    947	}
    948	if (!req) {
    949		ep->stopped = stopped;
    950		spin_unlock_irqrestore(&ep->dev->lock, flags);
    951		return -EINVAL;
    952	}
    953
    954	/* queue head may be partially complete */
    955	if (ep->queue.next == &req->queue) {
    956		dev_dbg(ep->dev->dev, "unlink (%s) pio\n", _ep->name);
    957		net2272_done(ep, req, -ECONNRESET);
    958	}
    959	ep->stopped = stopped;
    960
    961	spin_unlock_irqrestore(&ep->dev->lock, flags);
    962	return 0;
    963}
    964
    965/*---------------------------------------------------------------------------*/
    966
    967static int
    968net2272_set_halt_and_wedge(struct usb_ep *_ep, int value, int wedged)
    969{
    970	struct net2272_ep *ep;
    971	unsigned long flags;
    972	int ret = 0;
    973
    974	ep = container_of(_ep, struct net2272_ep, ep);
    975	if (!_ep || (!ep->desc && ep->num != 0))
    976		return -EINVAL;
    977	if (!ep->dev->driver || ep->dev->gadget.speed == USB_SPEED_UNKNOWN)
    978		return -ESHUTDOWN;
    979	if (ep->desc /* not ep0 */ && usb_endpoint_xfer_isoc(ep->desc))
    980		return -EINVAL;
    981
    982	spin_lock_irqsave(&ep->dev->lock, flags);
    983	if (!list_empty(&ep->queue))
    984		ret = -EAGAIN;
    985	else if (ep->is_in && value && net2272_fifo_status(_ep) != 0)
    986		ret = -EAGAIN;
    987	else {
    988		dev_vdbg(ep->dev->dev, "%s %s %s\n", _ep->name,
    989			value ? "set" : "clear",
    990			wedged ? "wedge" : "halt");
    991		/* set/clear */
    992		if (value) {
    993			if (ep->num == 0)
    994				ep->dev->protocol_stall = 1;
    995			else
    996				set_halt(ep);
    997			if (wedged)
    998				ep->wedged = 1;
    999		} else {
   1000			clear_halt(ep);
   1001			ep->wedged = 0;
   1002		}
   1003	}
   1004	spin_unlock_irqrestore(&ep->dev->lock, flags);
   1005
   1006	return ret;
   1007}
   1008
   1009static int
   1010net2272_set_halt(struct usb_ep *_ep, int value)
   1011{
   1012	return net2272_set_halt_and_wedge(_ep, value, 0);
   1013}
   1014
   1015static int
   1016net2272_set_wedge(struct usb_ep *_ep)
   1017{
   1018	if (!_ep || _ep->name == ep0name)
   1019		return -EINVAL;
   1020	return net2272_set_halt_and_wedge(_ep, 1, 1);
   1021}
   1022
   1023static int
   1024net2272_fifo_status(struct usb_ep *_ep)
   1025{
   1026	struct net2272_ep *ep;
   1027	u16 avail;
   1028
   1029	ep = container_of(_ep, struct net2272_ep, ep);
   1030	if (!_ep || (!ep->desc && ep->num != 0))
   1031		return -ENODEV;
   1032	if (!ep->dev->driver || ep->dev->gadget.speed == USB_SPEED_UNKNOWN)
   1033		return -ESHUTDOWN;
   1034
   1035	avail = net2272_ep_read(ep, EP_AVAIL1) << 8;
   1036	avail |= net2272_ep_read(ep, EP_AVAIL0);
   1037	if (avail > ep->fifo_size)
   1038		return -EOVERFLOW;
   1039	if (ep->is_in)
   1040		avail = ep->fifo_size - avail;
   1041	return avail;
   1042}
   1043
   1044static void
   1045net2272_fifo_flush(struct usb_ep *_ep)
   1046{
   1047	struct net2272_ep *ep;
   1048
   1049	ep = container_of(_ep, struct net2272_ep, ep);
   1050	if (!_ep || (!ep->desc && ep->num != 0))
   1051		return;
   1052	if (!ep->dev->driver || ep->dev->gadget.speed == USB_SPEED_UNKNOWN)
   1053		return;
   1054
   1055	net2272_ep_write(ep, EP_STAT1, 1 << BUFFER_FLUSH);
   1056}
   1057
   1058static const struct usb_ep_ops net2272_ep_ops = {
   1059	.enable        = net2272_enable,
   1060	.disable       = net2272_disable,
   1061
   1062	.alloc_request = net2272_alloc_request,
   1063	.free_request  = net2272_free_request,
   1064
   1065	.queue         = net2272_queue,
   1066	.dequeue       = net2272_dequeue,
   1067
   1068	.set_halt      = net2272_set_halt,
   1069	.set_wedge     = net2272_set_wedge,
   1070	.fifo_status   = net2272_fifo_status,
   1071	.fifo_flush    = net2272_fifo_flush,
   1072};
   1073
   1074/*---------------------------------------------------------------------------*/
   1075
   1076static int
   1077net2272_get_frame(struct usb_gadget *_gadget)
   1078{
   1079	struct net2272 *dev;
   1080	unsigned long flags;
   1081	u16 ret;
   1082
   1083	if (!_gadget)
   1084		return -ENODEV;
   1085	dev = container_of(_gadget, struct net2272, gadget);
   1086	spin_lock_irqsave(&dev->lock, flags);
   1087
   1088	ret = net2272_read(dev, FRAME1) << 8;
   1089	ret |= net2272_read(dev, FRAME0);
   1090
   1091	spin_unlock_irqrestore(&dev->lock, flags);
   1092	return ret;
   1093}
   1094
   1095static int
   1096net2272_wakeup(struct usb_gadget *_gadget)
   1097{
   1098	struct net2272 *dev;
   1099	u8 tmp;
   1100	unsigned long flags;
   1101
   1102	if (!_gadget)
   1103		return 0;
   1104	dev = container_of(_gadget, struct net2272, gadget);
   1105
   1106	spin_lock_irqsave(&dev->lock, flags);
   1107	tmp = net2272_read(dev, USBCTL0);
   1108	if (tmp & (1 << IO_WAKEUP_ENABLE))
   1109		net2272_write(dev, USBCTL1, (1 << GENERATE_RESUME));
   1110
   1111	spin_unlock_irqrestore(&dev->lock, flags);
   1112
   1113	return 0;
   1114}
   1115
   1116static int
   1117net2272_set_selfpowered(struct usb_gadget *_gadget, int value)
   1118{
   1119	if (!_gadget)
   1120		return -ENODEV;
   1121
   1122	_gadget->is_selfpowered = (value != 0);
   1123
   1124	return 0;
   1125}
   1126
   1127static int
   1128net2272_pullup(struct usb_gadget *_gadget, int is_on)
   1129{
   1130	struct net2272 *dev;
   1131	u8 tmp;
   1132	unsigned long flags;
   1133
   1134	if (!_gadget)
   1135		return -ENODEV;
   1136	dev = container_of(_gadget, struct net2272, gadget);
   1137
   1138	spin_lock_irqsave(&dev->lock, flags);
   1139	tmp = net2272_read(dev, USBCTL0);
   1140	dev->softconnect = (is_on != 0);
   1141	if (is_on)
   1142		tmp |= (1 << USB_DETECT_ENABLE);
   1143	else
   1144		tmp &= ~(1 << USB_DETECT_ENABLE);
   1145	net2272_write(dev, USBCTL0, tmp);
   1146	spin_unlock_irqrestore(&dev->lock, flags);
   1147
   1148	return 0;
   1149}
   1150
   1151static int net2272_start(struct usb_gadget *_gadget,
   1152		struct usb_gadget_driver *driver);
   1153static int net2272_stop(struct usb_gadget *_gadget);
   1154static void net2272_async_callbacks(struct usb_gadget *_gadget, bool enable);
   1155
   1156static const struct usb_gadget_ops net2272_ops = {
   1157	.get_frame	= net2272_get_frame,
   1158	.wakeup		= net2272_wakeup,
   1159	.set_selfpowered = net2272_set_selfpowered,
   1160	.pullup		= net2272_pullup,
   1161	.udc_start	= net2272_start,
   1162	.udc_stop	= net2272_stop,
   1163	.udc_async_callbacks = net2272_async_callbacks,
   1164};
   1165
   1166/*---------------------------------------------------------------------------*/
   1167
   1168static ssize_t
   1169registers_show(struct device *_dev, struct device_attribute *attr, char *buf)
   1170{
   1171	struct net2272 *dev;
   1172	char *next;
   1173	unsigned size, t;
   1174	unsigned long flags;
   1175	u8 t1, t2;
   1176	int i;
   1177	const char *s;
   1178
   1179	dev = dev_get_drvdata(_dev);
   1180	next = buf;
   1181	size = PAGE_SIZE;
   1182	spin_lock_irqsave(&dev->lock, flags);
   1183
   1184	/* Main Control Registers */
   1185	t = scnprintf(next, size, "%s version %s,"
   1186		"chiprev %02x, locctl %02x\n"
   1187		"irqenb0 %02x irqenb1 %02x "
   1188		"irqstat0 %02x irqstat1 %02x\n",
   1189		driver_name, driver_vers, dev->chiprev,
   1190		net2272_read(dev, LOCCTL),
   1191		net2272_read(dev, IRQENB0),
   1192		net2272_read(dev, IRQENB1),
   1193		net2272_read(dev, IRQSTAT0),
   1194		net2272_read(dev, IRQSTAT1));
   1195	size -= t;
   1196	next += t;
   1197
   1198	/* DMA */
   1199	t1 = net2272_read(dev, DMAREQ);
   1200	t = scnprintf(next, size, "\ndmareq %02x: %s %s%s%s%s\n",
   1201		t1, ep_name[(t1 & 0x01) + 1],
   1202		t1 & (1 << DMA_CONTROL_DACK) ? "dack " : "",
   1203		t1 & (1 << DMA_REQUEST_ENABLE) ? "reqenb " : "",
   1204		t1 & (1 << DMA_REQUEST) ? "req " : "",
   1205		t1 & (1 << DMA_BUFFER_VALID) ? "valid " : "");
   1206	size -= t;
   1207	next += t;
   1208
   1209	/* USB Control Registers */
   1210	t1 = net2272_read(dev, USBCTL1);
   1211	if (t1 & (1 << VBUS_PIN)) {
   1212		if (t1 & (1 << USB_HIGH_SPEED))
   1213			s = "high speed";
   1214		else if (dev->gadget.speed == USB_SPEED_UNKNOWN)
   1215			s = "powered";
   1216		else
   1217			s = "full speed";
   1218	} else
   1219		s = "not attached";
   1220	t = scnprintf(next, size,
   1221		"usbctl0 %02x usbctl1 %02x addr 0x%02x (%s)\n",
   1222		net2272_read(dev, USBCTL0), t1,
   1223		net2272_read(dev, OURADDR), s);
   1224	size -= t;
   1225	next += t;
   1226
   1227	/* Endpoint Registers */
   1228	for (i = 0; i < 4; ++i) {
   1229		struct net2272_ep *ep;
   1230
   1231		ep = &dev->ep[i];
   1232		if (i && !ep->desc)
   1233			continue;
   1234
   1235		t1 = net2272_ep_read(ep, EP_CFG);
   1236		t2 = net2272_ep_read(ep, EP_RSPSET);
   1237		t = scnprintf(next, size,
   1238			"\n%s\tcfg %02x rsp (%02x) %s%s%s%s%s%s%s%s"
   1239			"irqenb %02x\n",
   1240			ep->ep.name, t1, t2,
   1241			(t2 & (1 << ALT_NAK_OUT_PACKETS)) ? "NAK " : "",
   1242			(t2 & (1 << HIDE_STATUS_PHASE)) ? "hide " : "",
   1243			(t2 & (1 << AUTOVALIDATE)) ? "auto " : "",
   1244			(t2 & (1 << INTERRUPT_MODE)) ? "interrupt " : "",
   1245			(t2 & (1 << CONTROL_STATUS_PHASE_HANDSHAKE)) ? "status " : "",
   1246			(t2 & (1 << NAK_OUT_PACKETS_MODE)) ? "NAKmode " : "",
   1247			(t2 & (1 << ENDPOINT_TOGGLE)) ? "DATA1 " : "DATA0 ",
   1248			(t2 & (1 << ENDPOINT_HALT)) ? "HALT " : "",
   1249			net2272_ep_read(ep, EP_IRQENB));
   1250		size -= t;
   1251		next += t;
   1252
   1253		t = scnprintf(next, size,
   1254			"\tstat0 %02x stat1 %02x avail %04x "
   1255			"(ep%d%s-%s)%s\n",
   1256			net2272_ep_read(ep, EP_STAT0),
   1257			net2272_ep_read(ep, EP_STAT1),
   1258			(net2272_ep_read(ep, EP_AVAIL1) << 8) | net2272_ep_read(ep, EP_AVAIL0),
   1259			t1 & 0x0f,
   1260			ep->is_in ? "in" : "out",
   1261			type_string(t1 >> 5),
   1262			ep->stopped ? "*" : "");
   1263		size -= t;
   1264		next += t;
   1265
   1266		t = scnprintf(next, size,
   1267			"\tep_transfer %06x\n",
   1268			((net2272_ep_read(ep, EP_TRANSFER2) & 0xff) << 16) |
   1269			((net2272_ep_read(ep, EP_TRANSFER1) & 0xff) << 8) |
   1270			((net2272_ep_read(ep, EP_TRANSFER0) & 0xff)));
   1271		size -= t;
   1272		next += t;
   1273
   1274		t1 = net2272_ep_read(ep, EP_BUFF_STATES) & 0x03;
   1275		t2 = (net2272_ep_read(ep, EP_BUFF_STATES) >> 2) & 0x03;
   1276		t = scnprintf(next, size,
   1277			"\tbuf-a %s buf-b %s\n",
   1278			buf_state_string(t1),
   1279			buf_state_string(t2));
   1280		size -= t;
   1281		next += t;
   1282	}
   1283
   1284	spin_unlock_irqrestore(&dev->lock, flags);
   1285
   1286	return PAGE_SIZE - size;
   1287}
   1288static DEVICE_ATTR_RO(registers);
   1289
   1290/*---------------------------------------------------------------------------*/
   1291
   1292static void
   1293net2272_set_fifo_mode(struct net2272 *dev, int mode)
   1294{
   1295	u8 tmp;
   1296
   1297	tmp = net2272_read(dev, LOCCTL) & 0x3f;
   1298	tmp |= (mode << 6);
   1299	net2272_write(dev, LOCCTL, tmp);
   1300
   1301	INIT_LIST_HEAD(&dev->gadget.ep_list);
   1302
   1303	/* always ep-a, ep-c ... maybe not ep-b */
   1304	list_add_tail(&dev->ep[1].ep.ep_list, &dev->gadget.ep_list);
   1305
   1306	switch (mode) {
   1307	case 0:
   1308		list_add_tail(&dev->ep[2].ep.ep_list, &dev->gadget.ep_list);
   1309		dev->ep[1].fifo_size = dev->ep[2].fifo_size = 512;
   1310		break;
   1311	case 1:
   1312		list_add_tail(&dev->ep[2].ep.ep_list, &dev->gadget.ep_list);
   1313		dev->ep[1].fifo_size = 1024;
   1314		dev->ep[2].fifo_size = 512;
   1315		break;
   1316	case 2:
   1317		list_add_tail(&dev->ep[2].ep.ep_list, &dev->gadget.ep_list);
   1318		dev->ep[1].fifo_size = dev->ep[2].fifo_size = 1024;
   1319		break;
   1320	case 3:
   1321		dev->ep[1].fifo_size = 1024;
   1322		break;
   1323	}
   1324
   1325	/* ep-c is always 2 512 byte buffers */
   1326	list_add_tail(&dev->ep[3].ep.ep_list, &dev->gadget.ep_list);
   1327	dev->ep[3].fifo_size = 512;
   1328}
   1329
   1330/*---------------------------------------------------------------------------*/
   1331
   1332static void
   1333net2272_usb_reset(struct net2272 *dev)
   1334{
   1335	dev->gadget.speed = USB_SPEED_UNKNOWN;
   1336
   1337	net2272_cancel_dma(dev);
   1338
   1339	net2272_write(dev, IRQENB0, 0);
   1340	net2272_write(dev, IRQENB1, 0);
   1341
   1342	/* clear irq state */
   1343	net2272_write(dev, IRQSTAT0, 0xff);
   1344	net2272_write(dev, IRQSTAT1, ~(1 << SUSPEND_REQUEST_INTERRUPT));
   1345
   1346	net2272_write(dev, DMAREQ,
   1347		(0 << DMA_BUFFER_VALID) |
   1348		(0 << DMA_REQUEST_ENABLE) |
   1349		(1 << DMA_CONTROL_DACK) |
   1350		(dev->dma_eot_polarity << EOT_POLARITY) |
   1351		(dev->dma_dack_polarity << DACK_POLARITY) |
   1352		(dev->dma_dreq_polarity << DREQ_POLARITY) |
   1353		((dma_ep >> 1) << DMA_ENDPOINT_SELECT));
   1354
   1355	net2272_cancel_dma(dev);
   1356	net2272_set_fifo_mode(dev, (fifo_mode <= 3) ? fifo_mode : 0);
   1357
   1358	/* Set the NET2272 ep fifo data width to 16-bit mode and for correct byte swapping
   1359	 * note that the higher level gadget drivers are expected to convert data to little endian.
   1360	 * Enable byte swap for your local bus/cpu if needed by setting BYTE_SWAP in LOCCTL here
   1361	 */
   1362	net2272_write(dev, LOCCTL, net2272_read(dev, LOCCTL) | (1 << DATA_WIDTH));
   1363	net2272_write(dev, LOCCTL1, (dma_mode << DMA_MODE));
   1364}
   1365
   1366static void
   1367net2272_usb_reinit(struct net2272 *dev)
   1368{
   1369	int i;
   1370
   1371	/* basic endpoint init */
   1372	for (i = 0; i < 4; ++i) {
   1373		struct net2272_ep *ep = &dev->ep[i];
   1374
   1375		ep->ep.name = ep_name[i];
   1376		ep->dev = dev;
   1377		ep->num = i;
   1378		ep->not_empty = 0;
   1379
   1380		if (use_dma && ep->num == dma_ep)
   1381			ep->dma = 1;
   1382
   1383		if (i > 0 && i <= 3)
   1384			ep->fifo_size = 512;
   1385		else
   1386			ep->fifo_size = 64;
   1387		net2272_ep_reset(ep);
   1388
   1389		if (i == 0) {
   1390			ep->ep.caps.type_control = true;
   1391		} else {
   1392			ep->ep.caps.type_iso = true;
   1393			ep->ep.caps.type_bulk = true;
   1394			ep->ep.caps.type_int = true;
   1395		}
   1396
   1397		ep->ep.caps.dir_in = true;
   1398		ep->ep.caps.dir_out = true;
   1399	}
   1400	usb_ep_set_maxpacket_limit(&dev->ep[0].ep, 64);
   1401
   1402	dev->gadget.ep0 = &dev->ep[0].ep;
   1403	dev->ep[0].stopped = 0;
   1404	INIT_LIST_HEAD(&dev->gadget.ep0->ep_list);
   1405}
   1406
   1407static void
   1408net2272_ep0_start(struct net2272 *dev)
   1409{
   1410	struct net2272_ep *ep0 = &dev->ep[0];
   1411
   1412	net2272_ep_write(ep0, EP_RSPSET,
   1413		(1 << NAK_OUT_PACKETS_MODE) |
   1414		(1 << ALT_NAK_OUT_PACKETS));
   1415	net2272_ep_write(ep0, EP_RSPCLR,
   1416		(1 << HIDE_STATUS_PHASE) |
   1417		(1 << CONTROL_STATUS_PHASE_HANDSHAKE));
   1418	net2272_write(dev, USBCTL0,
   1419		(dev->softconnect << USB_DETECT_ENABLE) |
   1420		(1 << USB_ROOT_PORT_WAKEUP_ENABLE) |
   1421		(1 << IO_WAKEUP_ENABLE));
   1422	net2272_write(dev, IRQENB0,
   1423		(1 << SETUP_PACKET_INTERRUPT_ENABLE) |
   1424		(1 << ENDPOINT_0_INTERRUPT_ENABLE) |
   1425		(1 << DMA_DONE_INTERRUPT_ENABLE));
   1426	net2272_write(dev, IRQENB1,
   1427		(1 << VBUS_INTERRUPT_ENABLE) |
   1428		(1 << ROOT_PORT_RESET_INTERRUPT_ENABLE) |
   1429		(1 << SUSPEND_REQUEST_CHANGE_INTERRUPT_ENABLE));
   1430}
   1431
   1432/* when a driver is successfully registered, it will receive
   1433 * control requests including set_configuration(), which enables
   1434 * non-control requests.  then usb traffic follows until a
   1435 * disconnect is reported.  then a host may connect again, or
   1436 * the driver might get unbound.
   1437 */
   1438static int net2272_start(struct usb_gadget *_gadget,
   1439		struct usb_gadget_driver *driver)
   1440{
   1441	struct net2272 *dev;
   1442	unsigned i;
   1443
   1444	if (!driver || !driver->setup ||
   1445	    driver->max_speed != USB_SPEED_HIGH)
   1446		return -EINVAL;
   1447
   1448	dev = container_of(_gadget, struct net2272, gadget);
   1449
   1450	for (i = 0; i < 4; ++i)
   1451		dev->ep[i].irqs = 0;
   1452	/* hook up the driver ... */
   1453	dev->softconnect = 1;
   1454	driver->driver.bus = NULL;
   1455	dev->driver = driver;
   1456
   1457	/* ... then enable host detection and ep0; and we're ready
   1458	 * for set_configuration as well as eventual disconnect.
   1459	 */
   1460	net2272_ep0_start(dev);
   1461
   1462	return 0;
   1463}
   1464
   1465static void
   1466stop_activity(struct net2272 *dev, struct usb_gadget_driver *driver)
   1467{
   1468	int i;
   1469
   1470	/* don't disconnect if it's not connected */
   1471	if (dev->gadget.speed == USB_SPEED_UNKNOWN)
   1472		driver = NULL;
   1473
   1474	/* stop hardware; prevent new request submissions;
   1475	 * and kill any outstanding requests.
   1476	 */
   1477	net2272_usb_reset(dev);
   1478	for (i = 0; i < 4; ++i)
   1479		net2272_dequeue_all(&dev->ep[i]);
   1480
   1481	/* report disconnect; the driver is already quiesced */
   1482	if (dev->async_callbacks && driver) {
   1483		spin_unlock(&dev->lock);
   1484		driver->disconnect(&dev->gadget);
   1485		spin_lock(&dev->lock);
   1486	}
   1487
   1488	net2272_usb_reinit(dev);
   1489}
   1490
   1491static int net2272_stop(struct usb_gadget *_gadget)
   1492{
   1493	struct net2272 *dev;
   1494	unsigned long flags;
   1495
   1496	dev = container_of(_gadget, struct net2272, gadget);
   1497
   1498	spin_lock_irqsave(&dev->lock, flags);
   1499	stop_activity(dev, NULL);
   1500	spin_unlock_irqrestore(&dev->lock, flags);
   1501
   1502	dev->driver = NULL;
   1503
   1504	return 0;
   1505}
   1506
   1507static void net2272_async_callbacks(struct usb_gadget *_gadget, bool enable)
   1508{
   1509	struct net2272	*dev = container_of(_gadget, struct net2272, gadget);
   1510
   1511	spin_lock_irq(&dev->lock);
   1512	dev->async_callbacks = enable;
   1513	spin_unlock_irq(&dev->lock);
   1514}
   1515
   1516/*---------------------------------------------------------------------------*/
   1517/* handle ep-a/ep-b dma completions */
   1518static void
   1519net2272_handle_dma(struct net2272_ep *ep)
   1520{
   1521	struct net2272_request *req;
   1522	unsigned len;
   1523	int status;
   1524
   1525	if (!list_empty(&ep->queue))
   1526		req = list_entry(ep->queue.next,
   1527				struct net2272_request, queue);
   1528	else
   1529		req = NULL;
   1530
   1531	dev_vdbg(ep->dev->dev, "handle_dma %s req %p\n", ep->ep.name, req);
   1532
   1533	/* Ensure DREQ is de-asserted */
   1534	net2272_write(ep->dev, DMAREQ,
   1535		(0 << DMA_BUFFER_VALID)
   1536	      | (0 << DMA_REQUEST_ENABLE)
   1537	      | (1 << DMA_CONTROL_DACK)
   1538	      | (ep->dev->dma_eot_polarity << EOT_POLARITY)
   1539	      | (ep->dev->dma_dack_polarity << DACK_POLARITY)
   1540	      | (ep->dev->dma_dreq_polarity << DREQ_POLARITY)
   1541	      | (ep->dma << DMA_ENDPOINT_SELECT));
   1542
   1543	ep->dev->dma_busy = 0;
   1544
   1545	net2272_ep_write(ep, EP_IRQENB,
   1546		  (1 << DATA_PACKET_RECEIVED_INTERRUPT_ENABLE)
   1547		| (1 << DATA_PACKET_TRANSMITTED_INTERRUPT_ENABLE)
   1548		| net2272_ep_read(ep, EP_IRQENB));
   1549
   1550	/* device-to-host transfer completed */
   1551	if (ep->is_in) {
   1552		/* validate a short packet or zlp if necessary */
   1553		if ((req->req.length % ep->ep.maxpacket != 0) ||
   1554				req->req.zero)
   1555			set_fifo_bytecount(ep, 0);
   1556
   1557		net2272_done(ep, req, 0);
   1558		if (!list_empty(&ep->queue)) {
   1559			req = list_entry(ep->queue.next,
   1560					struct net2272_request, queue);
   1561			status = net2272_kick_dma(ep, req);
   1562			if (status < 0)
   1563				net2272_pio_advance(ep);
   1564		}
   1565
   1566	/* host-to-device transfer completed */
   1567	} else {
   1568		/* terminated with a short packet? */
   1569		if (net2272_read(ep->dev, IRQSTAT0) &
   1570				(1 << DMA_DONE_INTERRUPT)) {
   1571			/* abort system dma */
   1572			net2272_cancel_dma(ep->dev);
   1573		}
   1574
   1575		/* EP_TRANSFER will contain the number of bytes
   1576		 * actually received.
   1577		 * NOTE: There is no overflow detection on EP_TRANSFER:
   1578		 * We can't deal with transfers larger than 2^24 bytes!
   1579		 */
   1580		len = (net2272_ep_read(ep, EP_TRANSFER2) << 16)
   1581			| (net2272_ep_read(ep, EP_TRANSFER1) << 8)
   1582			| (net2272_ep_read(ep, EP_TRANSFER0));
   1583
   1584		if (ep->not_empty)
   1585			len += 4;
   1586
   1587		req->req.actual += len;
   1588
   1589		/* get any remaining data */
   1590		net2272_pio_advance(ep);
   1591	}
   1592}
   1593
   1594/*---------------------------------------------------------------------------*/
   1595
   1596static void
   1597net2272_handle_ep(struct net2272_ep *ep)
   1598{
   1599	struct net2272_request *req;
   1600	u8 stat0, stat1;
   1601
   1602	if (!list_empty(&ep->queue))
   1603		req = list_entry(ep->queue.next,
   1604			struct net2272_request, queue);
   1605	else
   1606		req = NULL;
   1607
   1608	/* ack all, and handle what we care about */
   1609	stat0 = net2272_ep_read(ep, EP_STAT0);
   1610	stat1 = net2272_ep_read(ep, EP_STAT1);
   1611	ep->irqs++;
   1612
   1613	dev_vdbg(ep->dev->dev, "%s ack ep_stat0 %02x, ep_stat1 %02x, req %p\n",
   1614		ep->ep.name, stat0, stat1, req ? &req->req : NULL);
   1615
   1616	net2272_ep_write(ep, EP_STAT0, stat0 &
   1617		~((1 << NAK_OUT_PACKETS)
   1618		| (1 << SHORT_PACKET_TRANSFERRED_INTERRUPT)));
   1619	net2272_ep_write(ep, EP_STAT1, stat1);
   1620
   1621	/* data packet(s) received (in the fifo, OUT)
   1622	 * direction must be validated, otherwise control read status phase
   1623	 * could be interpreted as a valid packet
   1624	 */
   1625	if (!ep->is_in && (stat0 & (1 << DATA_PACKET_RECEIVED_INTERRUPT)))
   1626		net2272_pio_advance(ep);
   1627	/* data packet(s) transmitted (IN) */
   1628	else if (stat0 & (1 << DATA_PACKET_TRANSMITTED_INTERRUPT))
   1629		net2272_pio_advance(ep);
   1630}
   1631
   1632static struct net2272_ep *
   1633net2272_get_ep_by_addr(struct net2272 *dev, u16 wIndex)
   1634{
   1635	struct net2272_ep *ep;
   1636
   1637	if ((wIndex & USB_ENDPOINT_NUMBER_MASK) == 0)
   1638		return &dev->ep[0];
   1639
   1640	list_for_each_entry(ep, &dev->gadget.ep_list, ep.ep_list) {
   1641		u8 bEndpointAddress;
   1642
   1643		if (!ep->desc)
   1644			continue;
   1645		bEndpointAddress = ep->desc->bEndpointAddress;
   1646		if ((wIndex ^ bEndpointAddress) & USB_DIR_IN)
   1647			continue;
   1648		if ((wIndex & 0x0f) == (bEndpointAddress & 0x0f))
   1649			return ep;
   1650	}
   1651	return NULL;
   1652}
   1653
   1654/*
   1655 * USB Test Packet:
   1656 * JKJKJKJK * 9
   1657 * JJKKJJKK * 8
   1658 * JJJJKKKK * 8
   1659 * JJJJJJJKKKKKKK * 8
   1660 * JJJJJJJK * 8
   1661 * {JKKKKKKK * 10}, JK
   1662 */
   1663static const u8 net2272_test_packet[] = {
   1664	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   1665	0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
   1666	0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
   1667	0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
   1668	0x7F, 0xBF, 0xDF, 0xEF, 0xF7, 0xFB, 0xFD,
   1669	0xFC, 0x7E, 0xBF, 0xDF, 0xEF, 0xF7, 0xFD, 0x7E
   1670};
   1671
   1672static void
   1673net2272_set_test_mode(struct net2272 *dev, int mode)
   1674{
   1675	int i;
   1676
   1677	/* Disable all net2272 interrupts:
   1678	 * Nothing but a power cycle should stop the test.
   1679	 */
   1680	net2272_write(dev, IRQENB0, 0x00);
   1681	net2272_write(dev, IRQENB1, 0x00);
   1682
   1683	/* Force tranceiver to high-speed */
   1684	net2272_write(dev, XCVRDIAG, 1 << FORCE_HIGH_SPEED);
   1685
   1686	net2272_write(dev, PAGESEL, 0);
   1687	net2272_write(dev, EP_STAT0, 1 << DATA_PACKET_TRANSMITTED_INTERRUPT);
   1688	net2272_write(dev, EP_RSPCLR,
   1689			  (1 << CONTROL_STATUS_PHASE_HANDSHAKE)
   1690			| (1 << HIDE_STATUS_PHASE));
   1691	net2272_write(dev, EP_CFG, 1 << ENDPOINT_DIRECTION);
   1692	net2272_write(dev, EP_STAT1, 1 << BUFFER_FLUSH);
   1693
   1694	/* wait for status phase to complete */
   1695	while (!(net2272_read(dev, EP_STAT0) &
   1696				(1 << DATA_PACKET_TRANSMITTED_INTERRUPT)))
   1697		;
   1698
   1699	/* Enable test mode */
   1700	net2272_write(dev, USBTEST, mode);
   1701
   1702	/* load test packet */
   1703	if (mode == USB_TEST_PACKET) {
   1704		/* switch to 8 bit mode */
   1705		net2272_write(dev, LOCCTL, net2272_read(dev, LOCCTL) &
   1706				~(1 << DATA_WIDTH));
   1707
   1708		for (i = 0; i < sizeof(net2272_test_packet); ++i)
   1709			net2272_write(dev, EP_DATA, net2272_test_packet[i]);
   1710
   1711		/* Validate test packet */
   1712		net2272_write(dev, EP_TRANSFER0, 0);
   1713	}
   1714}
   1715
   1716static void
   1717net2272_handle_stat0_irqs(struct net2272 *dev, u8 stat)
   1718{
   1719	struct net2272_ep *ep;
   1720	u8 num, scratch;
   1721
   1722	/* starting a control request? */
   1723	if (unlikely(stat & (1 << SETUP_PACKET_INTERRUPT))) {
   1724		union {
   1725			u8 raw[8];
   1726			struct usb_ctrlrequest	r;
   1727		} u;
   1728		int tmp = 0;
   1729		struct net2272_request *req;
   1730
   1731		if (dev->gadget.speed == USB_SPEED_UNKNOWN) {
   1732			if (net2272_read(dev, USBCTL1) & (1 << USB_HIGH_SPEED))
   1733				dev->gadget.speed = USB_SPEED_HIGH;
   1734			else
   1735				dev->gadget.speed = USB_SPEED_FULL;
   1736			dev_dbg(dev->dev, "%s\n",
   1737				usb_speed_string(dev->gadget.speed));
   1738		}
   1739
   1740		ep = &dev->ep[0];
   1741		ep->irqs++;
   1742
   1743		/* make sure any leftover interrupt state is cleared */
   1744		stat &= ~(1 << ENDPOINT_0_INTERRUPT);
   1745		while (!list_empty(&ep->queue)) {
   1746			req = list_entry(ep->queue.next,
   1747				struct net2272_request, queue);
   1748			net2272_done(ep, req,
   1749				(req->req.actual == req->req.length) ? 0 : -EPROTO);
   1750		}
   1751		ep->stopped = 0;
   1752		dev->protocol_stall = 0;
   1753		net2272_ep_write(ep, EP_STAT0,
   1754			    (1 << DATA_IN_TOKEN_INTERRUPT)
   1755			  | (1 << DATA_OUT_TOKEN_INTERRUPT)
   1756			  | (1 << DATA_PACKET_TRANSMITTED_INTERRUPT)
   1757			  | (1 << DATA_PACKET_RECEIVED_INTERRUPT)
   1758			  | (1 << SHORT_PACKET_TRANSFERRED_INTERRUPT));
   1759		net2272_ep_write(ep, EP_STAT1,
   1760			    (1 << TIMEOUT)
   1761			  | (1 << USB_OUT_ACK_SENT)
   1762			  | (1 << USB_OUT_NAK_SENT)
   1763			  | (1 << USB_IN_ACK_RCVD)
   1764			  | (1 << USB_IN_NAK_SENT)
   1765			  | (1 << USB_STALL_SENT)
   1766			  | (1 << LOCAL_OUT_ZLP));
   1767
   1768		/*
   1769		 * Ensure Control Read pre-validation setting is beyond maximum size
   1770		 *  - Control Writes can leave non-zero values in EP_TRANSFER. If
   1771		 *    an EP0 transfer following the Control Write is a Control Read,
   1772		 *    the NET2272 sees the non-zero EP_TRANSFER as an unexpected
   1773		 *    pre-validation count.
   1774		 *  - Setting EP_TRANSFER beyond the maximum EP0 transfer size ensures
   1775		 *    the pre-validation count cannot cause an unexpected validatation
   1776		 */
   1777		net2272_write(dev, PAGESEL, 0);
   1778		net2272_write(dev, EP_TRANSFER2, 0xff);
   1779		net2272_write(dev, EP_TRANSFER1, 0xff);
   1780		net2272_write(dev, EP_TRANSFER0, 0xff);
   1781
   1782		u.raw[0] = net2272_read(dev, SETUP0);
   1783		u.raw[1] = net2272_read(dev, SETUP1);
   1784		u.raw[2] = net2272_read(dev, SETUP2);
   1785		u.raw[3] = net2272_read(dev, SETUP3);
   1786		u.raw[4] = net2272_read(dev, SETUP4);
   1787		u.raw[5] = net2272_read(dev, SETUP5);
   1788		u.raw[6] = net2272_read(dev, SETUP6);
   1789		u.raw[7] = net2272_read(dev, SETUP7);
   1790		/*
   1791		 * If you have a big endian cpu make sure le16_to_cpus
   1792		 * performs the proper byte swapping here...
   1793		 */
   1794		le16_to_cpus(&u.r.wValue);
   1795		le16_to_cpus(&u.r.wIndex);
   1796		le16_to_cpus(&u.r.wLength);
   1797
   1798		/* ack the irq */
   1799		net2272_write(dev, IRQSTAT0, 1 << SETUP_PACKET_INTERRUPT);
   1800		stat ^= (1 << SETUP_PACKET_INTERRUPT);
   1801
   1802		/* watch control traffic at the token level, and force
   1803		 * synchronization before letting the status phase happen.
   1804		 */
   1805		ep->is_in = (u.r.bRequestType & USB_DIR_IN) != 0;
   1806		if (ep->is_in) {
   1807			scratch = (1 << DATA_PACKET_TRANSMITTED_INTERRUPT_ENABLE)
   1808				| (1 << DATA_OUT_TOKEN_INTERRUPT_ENABLE)
   1809				| (1 << DATA_IN_TOKEN_INTERRUPT_ENABLE);
   1810			stop_out_naking(ep);
   1811		} else
   1812			scratch = (1 << DATA_PACKET_RECEIVED_INTERRUPT_ENABLE)
   1813				| (1 << DATA_OUT_TOKEN_INTERRUPT_ENABLE)
   1814				| (1 << DATA_IN_TOKEN_INTERRUPT_ENABLE);
   1815		net2272_ep_write(ep, EP_IRQENB, scratch);
   1816
   1817		if ((u.r.bRequestType & USB_TYPE_MASK) != USB_TYPE_STANDARD)
   1818			goto delegate;
   1819		switch (u.r.bRequest) {
   1820		case USB_REQ_GET_STATUS: {
   1821			struct net2272_ep *e;
   1822			u16 status = 0;
   1823
   1824			switch (u.r.bRequestType & USB_RECIP_MASK) {
   1825			case USB_RECIP_ENDPOINT:
   1826				e = net2272_get_ep_by_addr(dev, u.r.wIndex);
   1827				if (!e || u.r.wLength > 2)
   1828					goto do_stall;
   1829				if (net2272_ep_read(e, EP_RSPSET) & (1 << ENDPOINT_HALT))
   1830					status = cpu_to_le16(1);
   1831				else
   1832					status = cpu_to_le16(0);
   1833
   1834				/* don't bother with a request object! */
   1835				net2272_ep_write(&dev->ep[0], EP_IRQENB, 0);
   1836				writew(status, net2272_reg_addr(dev, EP_DATA));
   1837				set_fifo_bytecount(&dev->ep[0], 0);
   1838				allow_status(ep);
   1839				dev_vdbg(dev->dev, "%s stat %02x\n",
   1840					ep->ep.name, status);
   1841				goto next_endpoints;
   1842			case USB_RECIP_DEVICE:
   1843				if (u.r.wLength > 2)
   1844					goto do_stall;
   1845				if (dev->gadget.is_selfpowered)
   1846					status = (1 << USB_DEVICE_SELF_POWERED);
   1847
   1848				/* don't bother with a request object! */
   1849				net2272_ep_write(&dev->ep[0], EP_IRQENB, 0);
   1850				writew(status, net2272_reg_addr(dev, EP_DATA));
   1851				set_fifo_bytecount(&dev->ep[0], 0);
   1852				allow_status(ep);
   1853				dev_vdbg(dev->dev, "device stat %02x\n", status);
   1854				goto next_endpoints;
   1855			case USB_RECIP_INTERFACE:
   1856				if (u.r.wLength > 2)
   1857					goto do_stall;
   1858
   1859				/* don't bother with a request object! */
   1860				net2272_ep_write(&dev->ep[0], EP_IRQENB, 0);
   1861				writew(status, net2272_reg_addr(dev, EP_DATA));
   1862				set_fifo_bytecount(&dev->ep[0], 0);
   1863				allow_status(ep);
   1864				dev_vdbg(dev->dev, "interface status %02x\n", status);
   1865				goto next_endpoints;
   1866			}
   1867
   1868			break;
   1869		}
   1870		case USB_REQ_CLEAR_FEATURE: {
   1871			struct net2272_ep *e;
   1872
   1873			if (u.r.bRequestType != USB_RECIP_ENDPOINT)
   1874				goto delegate;
   1875			if (u.r.wValue != USB_ENDPOINT_HALT ||
   1876			    u.r.wLength != 0)
   1877				goto do_stall;
   1878			e = net2272_get_ep_by_addr(dev, u.r.wIndex);
   1879			if (!e)
   1880				goto do_stall;
   1881			if (e->wedged) {
   1882				dev_vdbg(dev->dev, "%s wedged, halt not cleared\n",
   1883					ep->ep.name);
   1884			} else {
   1885				dev_vdbg(dev->dev, "%s clear halt\n", ep->ep.name);
   1886				clear_halt(e);
   1887			}
   1888			allow_status(ep);
   1889			goto next_endpoints;
   1890		}
   1891		case USB_REQ_SET_FEATURE: {
   1892			struct net2272_ep *e;
   1893
   1894			if (u.r.bRequestType == USB_RECIP_DEVICE) {
   1895				if (u.r.wIndex != NORMAL_OPERATION)
   1896					net2272_set_test_mode(dev, (u.r.wIndex >> 8));
   1897				allow_status(ep);
   1898				dev_vdbg(dev->dev, "test mode: %d\n", u.r.wIndex);
   1899				goto next_endpoints;
   1900			} else if (u.r.bRequestType != USB_RECIP_ENDPOINT)
   1901				goto delegate;
   1902			if (u.r.wValue != USB_ENDPOINT_HALT ||
   1903			    u.r.wLength != 0)
   1904				goto do_stall;
   1905			e = net2272_get_ep_by_addr(dev, u.r.wIndex);
   1906			if (!e)
   1907				goto do_stall;
   1908			set_halt(e);
   1909			allow_status(ep);
   1910			dev_vdbg(dev->dev, "%s set halt\n", ep->ep.name);
   1911			goto next_endpoints;
   1912		}
   1913		case USB_REQ_SET_ADDRESS: {
   1914			net2272_write(dev, OURADDR, u.r.wValue & 0xff);
   1915			allow_status(ep);
   1916			break;
   1917		}
   1918		default:
   1919 delegate:
   1920			dev_vdbg(dev->dev, "setup %02x.%02x v%04x i%04x "
   1921				"ep_cfg %08x\n",
   1922				u.r.bRequestType, u.r.bRequest,
   1923				u.r.wValue, u.r.wIndex,
   1924				net2272_ep_read(ep, EP_CFG));
   1925			if (dev->async_callbacks) {
   1926				spin_unlock(&dev->lock);
   1927				tmp = dev->driver->setup(&dev->gadget, &u.r);
   1928				spin_lock(&dev->lock);
   1929			}
   1930		}
   1931
   1932		/* stall ep0 on error */
   1933		if (tmp < 0) {
   1934 do_stall:
   1935			dev_vdbg(dev->dev, "req %02x.%02x protocol STALL; stat %d\n",
   1936				u.r.bRequestType, u.r.bRequest, tmp);
   1937			dev->protocol_stall = 1;
   1938		}
   1939	/* endpoint dma irq? */
   1940	} else if (stat & (1 << DMA_DONE_INTERRUPT)) {
   1941		net2272_cancel_dma(dev);
   1942		net2272_write(dev, IRQSTAT0, 1 << DMA_DONE_INTERRUPT);
   1943		stat &= ~(1 << DMA_DONE_INTERRUPT);
   1944		num = (net2272_read(dev, DMAREQ) & (1 << DMA_ENDPOINT_SELECT))
   1945			? 2 : 1;
   1946
   1947		ep = &dev->ep[num];
   1948		net2272_handle_dma(ep);
   1949	}
   1950
   1951 next_endpoints:
   1952	/* endpoint data irq? */
   1953	scratch = stat & 0x0f;
   1954	stat &= ~0x0f;
   1955	for (num = 0; scratch; num++) {
   1956		u8 t;
   1957
   1958		/* does this endpoint's FIFO and queue need tending? */
   1959		t = 1 << num;
   1960		if ((scratch & t) == 0)
   1961			continue;
   1962		scratch ^= t;
   1963
   1964		ep = &dev->ep[num];
   1965		net2272_handle_ep(ep);
   1966	}
   1967
   1968	/* some interrupts we can just ignore */
   1969	stat &= ~(1 << SOF_INTERRUPT);
   1970
   1971	if (stat)
   1972		dev_dbg(dev->dev, "unhandled irqstat0 %02x\n", stat);
   1973}
   1974
   1975static void
   1976net2272_handle_stat1_irqs(struct net2272 *dev, u8 stat)
   1977{
   1978	u8 tmp, mask;
   1979
   1980	/* after disconnect there's nothing else to do! */
   1981	tmp = (1 << VBUS_INTERRUPT) | (1 << ROOT_PORT_RESET_INTERRUPT);
   1982	mask = (1 << USB_HIGH_SPEED) | (1 << USB_FULL_SPEED);
   1983
   1984	if (stat & tmp) {
   1985		bool	reset = false;
   1986		bool	disconnect = false;
   1987
   1988		/*
   1989		 * Ignore disconnects and resets if the speed hasn't been set.
   1990		 * VBUS can bounce and there's always an initial reset.
   1991		 */
   1992		net2272_write(dev, IRQSTAT1, tmp);
   1993		if (dev->gadget.speed != USB_SPEED_UNKNOWN) {
   1994			if ((stat & (1 << VBUS_INTERRUPT)) &&
   1995					(net2272_read(dev, USBCTL1) &
   1996						(1 << VBUS_PIN)) == 0) {
   1997				disconnect = true;
   1998				dev_dbg(dev->dev, "disconnect %s\n",
   1999					dev->driver->driver.name);
   2000			} else if ((stat & (1 << ROOT_PORT_RESET_INTERRUPT)) &&
   2001					(net2272_read(dev, USBCTL1) & mask)
   2002						== 0) {
   2003				reset = true;
   2004				dev_dbg(dev->dev, "reset %s\n",
   2005					dev->driver->driver.name);
   2006			}
   2007
   2008			if (disconnect || reset) {
   2009				stop_activity(dev, dev->driver);
   2010				net2272_ep0_start(dev);
   2011				if (dev->async_callbacks) {
   2012					spin_unlock(&dev->lock);
   2013					if (reset)
   2014						usb_gadget_udc_reset(&dev->gadget, dev->driver);
   2015					else
   2016						(dev->driver->disconnect)(&dev->gadget);
   2017					spin_lock(&dev->lock);
   2018				}
   2019				return;
   2020			}
   2021		}
   2022		stat &= ~tmp;
   2023
   2024		if (!stat)
   2025			return;
   2026	}
   2027
   2028	tmp = (1 << SUSPEND_REQUEST_CHANGE_INTERRUPT);
   2029	if (stat & tmp) {
   2030		net2272_write(dev, IRQSTAT1, tmp);
   2031		if (stat & (1 << SUSPEND_REQUEST_INTERRUPT)) {
   2032			if (dev->async_callbacks && dev->driver->suspend)
   2033				dev->driver->suspend(&dev->gadget);
   2034			if (!enable_suspend) {
   2035				stat &= ~(1 << SUSPEND_REQUEST_INTERRUPT);
   2036				dev_dbg(dev->dev, "Suspend disabled, ignoring\n");
   2037			}
   2038		} else {
   2039			if (dev->async_callbacks && dev->driver->resume)
   2040				dev->driver->resume(&dev->gadget);
   2041		}
   2042		stat &= ~tmp;
   2043	}
   2044
   2045	/* clear any other status/irqs */
   2046	if (stat)
   2047		net2272_write(dev, IRQSTAT1, stat);
   2048
   2049	/* some status we can just ignore */
   2050	stat &= ~((1 << CONTROL_STATUS_INTERRUPT)
   2051			| (1 << SUSPEND_REQUEST_INTERRUPT)
   2052			| (1 << RESUME_INTERRUPT));
   2053	if (!stat)
   2054		return;
   2055	else
   2056		dev_dbg(dev->dev, "unhandled irqstat1 %02x\n", stat);
   2057}
   2058
   2059static irqreturn_t net2272_irq(int irq, void *_dev)
   2060{
   2061	struct net2272 *dev = _dev;
   2062#if defined(PLX_PCI_RDK) || defined(PLX_PCI_RDK2)
   2063	u32 intcsr;
   2064#endif
   2065#if defined(PLX_PCI_RDK)
   2066	u8 dmareq;
   2067#endif
   2068	spin_lock(&dev->lock);
   2069#if defined(PLX_PCI_RDK)
   2070	intcsr = readl(dev->rdk1.plx9054_base_addr + INTCSR);
   2071
   2072	if ((intcsr & LOCAL_INTERRUPT_TEST) == LOCAL_INTERRUPT_TEST) {
   2073		writel(intcsr & ~(1 << PCI_INTERRUPT_ENABLE),
   2074				dev->rdk1.plx9054_base_addr + INTCSR);
   2075		net2272_handle_stat1_irqs(dev, net2272_read(dev, IRQSTAT1));
   2076		net2272_handle_stat0_irqs(dev, net2272_read(dev, IRQSTAT0));
   2077		intcsr = readl(dev->rdk1.plx9054_base_addr + INTCSR);
   2078		writel(intcsr | (1 << PCI_INTERRUPT_ENABLE),
   2079			dev->rdk1.plx9054_base_addr + INTCSR);
   2080	}
   2081	if ((intcsr & DMA_CHANNEL_0_TEST) == DMA_CHANNEL_0_TEST) {
   2082		writeb((1 << CHANNEL_CLEAR_INTERRUPT | (0 << CHANNEL_ENABLE)),
   2083				dev->rdk1.plx9054_base_addr + DMACSR0);
   2084
   2085		dmareq = net2272_read(dev, DMAREQ);
   2086		if (dmareq & 0x01)
   2087			net2272_handle_dma(&dev->ep[2]);
   2088		else
   2089			net2272_handle_dma(&dev->ep[1]);
   2090	}
   2091#endif
   2092#if defined(PLX_PCI_RDK2)
   2093	/* see if PCI int for us by checking irqstat */
   2094	intcsr = readl(dev->rdk2.fpga_base_addr + RDK2_IRQSTAT);
   2095	if (!(intcsr & (1 << NET2272_PCI_IRQ))) {
   2096		spin_unlock(&dev->lock);
   2097		return IRQ_NONE;
   2098	}
   2099	/* check dma interrupts */
   2100#endif
   2101	/* Platform/devcice interrupt handler */
   2102#if !defined(PLX_PCI_RDK)
   2103	net2272_handle_stat1_irqs(dev, net2272_read(dev, IRQSTAT1));
   2104	net2272_handle_stat0_irqs(dev, net2272_read(dev, IRQSTAT0));
   2105#endif
   2106	spin_unlock(&dev->lock);
   2107
   2108	return IRQ_HANDLED;
   2109}
   2110
   2111static int net2272_present(struct net2272 *dev)
   2112{
   2113	/*
   2114	 * Quick test to see if CPU can communicate properly with the NET2272.
   2115	 * Verifies connection using writes and reads to write/read and
   2116	 * read-only registers.
   2117	 *
   2118	 * This routine is strongly recommended especially during early bring-up
   2119	 * of new hardware, however for designs that do not apply Power On System
   2120	 * Tests (POST) it may discarded (or perhaps minimized).
   2121	 */
   2122	unsigned int ii;
   2123	u8 val, refval;
   2124
   2125	/* Verify NET2272 write/read SCRATCH register can write and read */
   2126	refval = net2272_read(dev, SCRATCH);
   2127	for (ii = 0; ii < 0x100; ii += 7) {
   2128		net2272_write(dev, SCRATCH, ii);
   2129		val = net2272_read(dev, SCRATCH);
   2130		if (val != ii) {
   2131			dev_dbg(dev->dev,
   2132				"%s: write/read SCRATCH register test failed: "
   2133				"wrote:0x%2.2x, read:0x%2.2x\n",
   2134				__func__, ii, val);
   2135			return -EINVAL;
   2136		}
   2137	}
   2138	/* To be nice, we write the original SCRATCH value back: */
   2139	net2272_write(dev, SCRATCH, refval);
   2140
   2141	/* Verify NET2272 CHIPREV register is read-only: */
   2142	refval = net2272_read(dev, CHIPREV_2272);
   2143	for (ii = 0; ii < 0x100; ii += 7) {
   2144		net2272_write(dev, CHIPREV_2272, ii);
   2145		val = net2272_read(dev, CHIPREV_2272);
   2146		if (val != refval) {
   2147			dev_dbg(dev->dev,
   2148				"%s: write/read CHIPREV register test failed: "
   2149				"wrote 0x%2.2x, read:0x%2.2x expected:0x%2.2x\n",
   2150				__func__, ii, val, refval);
   2151			return -EINVAL;
   2152		}
   2153	}
   2154
   2155	/*
   2156	 * Verify NET2272's "NET2270 legacy revision" register
   2157	 *  - NET2272 has two revision registers. The NET2270 legacy revision
   2158	 *    register should read the same value, regardless of the NET2272
   2159	 *    silicon revision.  The legacy register applies to NET2270
   2160	 *    firmware being applied to the NET2272.
   2161	 */
   2162	val = net2272_read(dev, CHIPREV_LEGACY);
   2163	if (val != NET2270_LEGACY_REV) {
   2164		/*
   2165		 * Unexpected legacy revision value
   2166		 * - Perhaps the chip is a NET2270?
   2167		 */
   2168		dev_dbg(dev->dev,
   2169			"%s: WARNING: UNEXPECTED NET2272 LEGACY REGISTER VALUE:\n"
   2170			" - CHIPREV_LEGACY: expected 0x%2.2x, got:0x%2.2x. (Not NET2272?)\n",
   2171			__func__, NET2270_LEGACY_REV, val);
   2172		return -EINVAL;
   2173	}
   2174
   2175	/*
   2176	 * Verify NET2272 silicon revision
   2177	 *  - This revision register is appropriate for the silicon version
   2178	 *    of the NET2272
   2179	 */
   2180	val = net2272_read(dev, CHIPREV_2272);
   2181	switch (val) {
   2182	case CHIPREV_NET2272_R1:
   2183		/*
   2184		 * NET2272 Rev 1 has DMA related errata:
   2185		 *  - Newer silicon (Rev 1A or better) required
   2186		 */
   2187		dev_dbg(dev->dev,
   2188			"%s: Rev 1 detected: newer silicon recommended for DMA support\n",
   2189			__func__);
   2190		break;
   2191	case CHIPREV_NET2272_R1A:
   2192		break;
   2193	default:
   2194		/* NET2272 silicon version *may* not work with this firmware */
   2195		dev_dbg(dev->dev,
   2196			"%s: unexpected silicon revision register value: "
   2197			" CHIPREV_2272: 0x%2.2x\n",
   2198			__func__, val);
   2199		/*
   2200		 * Return Success, even though the chip rev is not an expected value
   2201		 *  - Older, pre-built firmware can attempt to operate on newer silicon
   2202		 *  - Often, new silicon is perfectly compatible
   2203		 */
   2204	}
   2205
   2206	/* Success: NET2272 checks out OK */
   2207	return 0;
   2208}
   2209
   2210static void
   2211net2272_gadget_release(struct device *_dev)
   2212{
   2213	struct net2272 *dev = container_of(_dev, struct net2272, gadget.dev);
   2214
   2215	kfree(dev);
   2216}
   2217
   2218/*---------------------------------------------------------------------------*/
   2219
   2220static void
   2221net2272_remove(struct net2272 *dev)
   2222{
   2223	if (dev->added)
   2224		usb_del_gadget(&dev->gadget);
   2225	free_irq(dev->irq, dev);
   2226	iounmap(dev->base_addr);
   2227	device_remove_file(dev->dev, &dev_attr_registers);
   2228
   2229	dev_info(dev->dev, "unbind\n");
   2230}
   2231
   2232static struct net2272 *net2272_probe_init(struct device *dev, unsigned int irq)
   2233{
   2234	struct net2272 *ret;
   2235
   2236	if (!irq) {
   2237		dev_dbg(dev, "No IRQ!\n");
   2238		return ERR_PTR(-ENODEV);
   2239	}
   2240
   2241	/* alloc, and start init */
   2242	ret = kzalloc(sizeof(*ret), GFP_KERNEL);
   2243	if (!ret)
   2244		return ERR_PTR(-ENOMEM);
   2245
   2246	spin_lock_init(&ret->lock);
   2247	ret->irq = irq;
   2248	ret->dev = dev;
   2249	ret->gadget.ops = &net2272_ops;
   2250	ret->gadget.max_speed = USB_SPEED_HIGH;
   2251
   2252	/* the "gadget" abstracts/virtualizes the controller */
   2253	ret->gadget.name = driver_name;
   2254	usb_initialize_gadget(dev, &ret->gadget, net2272_gadget_release);
   2255
   2256	return ret;
   2257}
   2258
   2259static int
   2260net2272_probe_fin(struct net2272 *dev, unsigned int irqflags)
   2261{
   2262	int ret;
   2263
   2264	/* See if there... */
   2265	if (net2272_present(dev)) {
   2266		dev_warn(dev->dev, "2272 not found!\n");
   2267		ret = -ENODEV;
   2268		goto err;
   2269	}
   2270
   2271	net2272_usb_reset(dev);
   2272	net2272_usb_reinit(dev);
   2273
   2274	ret = request_irq(dev->irq, net2272_irq, irqflags, driver_name, dev);
   2275	if (ret) {
   2276		dev_err(dev->dev, "request interrupt %i failed\n", dev->irq);
   2277		goto err;
   2278	}
   2279
   2280	dev->chiprev = net2272_read(dev, CHIPREV_2272);
   2281
   2282	/* done */
   2283	dev_info(dev->dev, "%s\n", driver_desc);
   2284	dev_info(dev->dev, "irq %i, mem %p, chip rev %04x, dma %s\n",
   2285		dev->irq, dev->base_addr, dev->chiprev,
   2286		dma_mode_string());
   2287	dev_info(dev->dev, "version: %s\n", driver_vers);
   2288
   2289	ret = device_create_file(dev->dev, &dev_attr_registers);
   2290	if (ret)
   2291		goto err_irq;
   2292
   2293	ret = usb_add_gadget(&dev->gadget);
   2294	if (ret)
   2295		goto err_add_udc;
   2296	dev->added = 1;
   2297
   2298	return 0;
   2299
   2300err_add_udc:
   2301	device_remove_file(dev->dev, &dev_attr_registers);
   2302 err_irq:
   2303	free_irq(dev->irq, dev);
   2304 err:
   2305	return ret;
   2306}
   2307
   2308#ifdef CONFIG_USB_PCI
   2309
   2310/*
   2311 * wrap this driver around the specified device, but
   2312 * don't respond over USB until a gadget driver binds to us
   2313 */
   2314
   2315static int
   2316net2272_rdk1_probe(struct pci_dev *pdev, struct net2272 *dev)
   2317{
   2318	unsigned long resource, len, tmp;
   2319	void __iomem *mem_mapped_addr[4];
   2320	int ret, i;
   2321
   2322	/*
   2323	 * BAR 0 holds PLX 9054 config registers
   2324	 * BAR 1 is i/o memory; unused here
   2325	 * BAR 2 holds EPLD config registers
   2326	 * BAR 3 holds NET2272 registers
   2327	 */
   2328
   2329	/* Find and map all address spaces */
   2330	for (i = 0; i < 4; ++i) {
   2331		if (i == 1)
   2332			continue;	/* BAR1 unused */
   2333
   2334		resource = pci_resource_start(pdev, i);
   2335		len = pci_resource_len(pdev, i);
   2336
   2337		if (!request_mem_region(resource, len, driver_name)) {
   2338			dev_dbg(dev->dev, "controller already in use\n");
   2339			ret = -EBUSY;
   2340			goto err;
   2341		}
   2342
   2343		mem_mapped_addr[i] = ioremap(resource, len);
   2344		if (mem_mapped_addr[i] == NULL) {
   2345			release_mem_region(resource, len);
   2346			dev_dbg(dev->dev, "can't map memory\n");
   2347			ret = -EFAULT;
   2348			goto err;
   2349		}
   2350	}
   2351
   2352	dev->rdk1.plx9054_base_addr = mem_mapped_addr[0];
   2353	dev->rdk1.epld_base_addr = mem_mapped_addr[2];
   2354	dev->base_addr = mem_mapped_addr[3];
   2355
   2356	/* Set PLX 9054 bus width (16 bits) */
   2357	tmp = readl(dev->rdk1.plx9054_base_addr + LBRD1);
   2358	writel((tmp & ~(3 << MEMORY_SPACE_LOCAL_BUS_WIDTH)) | W16_BIT,
   2359			dev->rdk1.plx9054_base_addr + LBRD1);
   2360
   2361	/* Enable PLX 9054 Interrupts */
   2362	writel(readl(dev->rdk1.plx9054_base_addr + INTCSR) |
   2363			(1 << PCI_INTERRUPT_ENABLE) |
   2364			(1 << LOCAL_INTERRUPT_INPUT_ENABLE),
   2365			dev->rdk1.plx9054_base_addr + INTCSR);
   2366
   2367	writeb((1 << CHANNEL_CLEAR_INTERRUPT | (0 << CHANNEL_ENABLE)),
   2368			dev->rdk1.plx9054_base_addr + DMACSR0);
   2369
   2370	/* reset */
   2371	writeb((1 << EPLD_DMA_ENABLE) |
   2372		(1 << DMA_CTL_DACK) |
   2373		(1 << DMA_TIMEOUT_ENABLE) |
   2374		(1 << USER) |
   2375		(0 << MPX_MODE) |
   2376		(1 << BUSWIDTH) |
   2377		(1 << NET2272_RESET),
   2378		dev->base_addr + EPLD_IO_CONTROL_REGISTER);
   2379
   2380	mb();
   2381	writeb(readb(dev->base_addr + EPLD_IO_CONTROL_REGISTER) &
   2382		~(1 << NET2272_RESET),
   2383		dev->base_addr + EPLD_IO_CONTROL_REGISTER);
   2384	udelay(200);
   2385
   2386	return 0;
   2387
   2388 err:
   2389	while (--i >= 0) {
   2390		if (i == 1)
   2391			continue;	/* BAR1 unused */
   2392		iounmap(mem_mapped_addr[i]);
   2393		release_mem_region(pci_resource_start(pdev, i),
   2394			pci_resource_len(pdev, i));
   2395	}
   2396
   2397	return ret;
   2398}
   2399
   2400static int
   2401net2272_rdk2_probe(struct pci_dev *pdev, struct net2272 *dev)
   2402{
   2403	unsigned long resource, len;
   2404	void __iomem *mem_mapped_addr[2];
   2405	int ret, i;
   2406
   2407	/*
   2408	 * BAR 0 holds FGPA config registers
   2409	 * BAR 1 holds NET2272 registers
   2410	 */
   2411
   2412	/* Find and map all address spaces, bar2-3 unused in rdk 2 */
   2413	for (i = 0; i < 2; ++i) {
   2414		resource = pci_resource_start(pdev, i);
   2415		len = pci_resource_len(pdev, i);
   2416
   2417		if (!request_mem_region(resource, len, driver_name)) {
   2418			dev_dbg(dev->dev, "controller already in use\n");
   2419			ret = -EBUSY;
   2420			goto err;
   2421		}
   2422
   2423		mem_mapped_addr[i] = ioremap(resource, len);
   2424		if (mem_mapped_addr[i] == NULL) {
   2425			release_mem_region(resource, len);
   2426			dev_dbg(dev->dev, "can't map memory\n");
   2427			ret = -EFAULT;
   2428			goto err;
   2429		}
   2430	}
   2431
   2432	dev->rdk2.fpga_base_addr = mem_mapped_addr[0];
   2433	dev->base_addr = mem_mapped_addr[1];
   2434
   2435	mb();
   2436	/* Set 2272 bus width (16 bits) and reset */
   2437	writel((1 << CHIP_RESET), dev->rdk2.fpga_base_addr + RDK2_LOCCTLRDK);
   2438	udelay(200);
   2439	writel((1 << BUS_WIDTH), dev->rdk2.fpga_base_addr + RDK2_LOCCTLRDK);
   2440	/* Print fpga version number */
   2441	dev_info(dev->dev, "RDK2 FPGA version %08x\n",
   2442		readl(dev->rdk2.fpga_base_addr + RDK2_FPGAREV));
   2443	/* Enable FPGA Interrupts */
   2444	writel((1 << NET2272_PCI_IRQ), dev->rdk2.fpga_base_addr + RDK2_IRQENB);
   2445
   2446	return 0;
   2447
   2448 err:
   2449	while (--i >= 0) {
   2450		iounmap(mem_mapped_addr[i]);
   2451		release_mem_region(pci_resource_start(pdev, i),
   2452			pci_resource_len(pdev, i));
   2453	}
   2454
   2455	return ret;
   2456}
   2457
   2458static int
   2459net2272_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
   2460{
   2461	struct net2272 *dev;
   2462	int ret;
   2463
   2464	dev = net2272_probe_init(&pdev->dev, pdev->irq);
   2465	if (IS_ERR(dev))
   2466		return PTR_ERR(dev);
   2467	dev->dev_id = pdev->device;
   2468
   2469	if (pci_enable_device(pdev) < 0) {
   2470		ret = -ENODEV;
   2471		goto err_put;
   2472	}
   2473
   2474	pci_set_master(pdev);
   2475
   2476	switch (pdev->device) {
   2477	case PCI_DEVICE_ID_RDK1: ret = net2272_rdk1_probe(pdev, dev); break;
   2478	case PCI_DEVICE_ID_RDK2: ret = net2272_rdk2_probe(pdev, dev); break;
   2479	default: BUG();
   2480	}
   2481	if (ret)
   2482		goto err_pci;
   2483
   2484	ret = net2272_probe_fin(dev, 0);
   2485	if (ret)
   2486		goto err_pci;
   2487
   2488	pci_set_drvdata(pdev, dev);
   2489
   2490	return 0;
   2491
   2492 err_pci:
   2493	pci_disable_device(pdev);
   2494 err_put:
   2495	usb_put_gadget(&dev->gadget);
   2496
   2497	return ret;
   2498}
   2499
   2500static void
   2501net2272_rdk1_remove(struct pci_dev *pdev, struct net2272 *dev)
   2502{
   2503	int i;
   2504
   2505	/* disable PLX 9054 interrupts */
   2506	writel(readl(dev->rdk1.plx9054_base_addr + INTCSR) &
   2507		~(1 << PCI_INTERRUPT_ENABLE),
   2508		dev->rdk1.plx9054_base_addr + INTCSR);
   2509
   2510	/* clean up resources allocated during probe() */
   2511	iounmap(dev->rdk1.plx9054_base_addr);
   2512	iounmap(dev->rdk1.epld_base_addr);
   2513
   2514	for (i = 0; i < 4; ++i) {
   2515		if (i == 1)
   2516			continue;	/* BAR1 unused */
   2517		release_mem_region(pci_resource_start(pdev, i),
   2518			pci_resource_len(pdev, i));
   2519	}
   2520}
   2521
   2522static void
   2523net2272_rdk2_remove(struct pci_dev *pdev, struct net2272 *dev)
   2524{
   2525	int i;
   2526
   2527	/* disable fpga interrupts
   2528	writel(readl(dev->rdk1.plx9054_base_addr + INTCSR) &
   2529			~(1 << PCI_INTERRUPT_ENABLE),
   2530			dev->rdk1.plx9054_base_addr + INTCSR);
   2531	*/
   2532
   2533	/* clean up resources allocated during probe() */
   2534	iounmap(dev->rdk2.fpga_base_addr);
   2535
   2536	for (i = 0; i < 2; ++i)
   2537		release_mem_region(pci_resource_start(pdev, i),
   2538			pci_resource_len(pdev, i));
   2539}
   2540
   2541static void
   2542net2272_pci_remove(struct pci_dev *pdev)
   2543{
   2544	struct net2272 *dev = pci_get_drvdata(pdev);
   2545
   2546	net2272_remove(dev);
   2547
   2548	switch (pdev->device) {
   2549	case PCI_DEVICE_ID_RDK1: net2272_rdk1_remove(pdev, dev); break;
   2550	case PCI_DEVICE_ID_RDK2: net2272_rdk2_remove(pdev, dev); break;
   2551	default: BUG();
   2552	}
   2553
   2554	pci_disable_device(pdev);
   2555
   2556	usb_put_gadget(&dev->gadget);
   2557}
   2558
   2559/* Table of matching PCI IDs */
   2560static struct pci_device_id pci_ids[] = {
   2561	{	/* RDK 1 card */
   2562		.class       = ((PCI_CLASS_BRIDGE_OTHER << 8) | 0xfe),
   2563		.class_mask  = 0,
   2564		.vendor      = PCI_VENDOR_ID_PLX,
   2565		.device      = PCI_DEVICE_ID_RDK1,
   2566		.subvendor   = PCI_ANY_ID,
   2567		.subdevice   = PCI_ANY_ID,
   2568	},
   2569	{	/* RDK 2 card */
   2570		.class       = ((PCI_CLASS_BRIDGE_OTHER << 8) | 0xfe),
   2571		.class_mask  = 0,
   2572		.vendor      = PCI_VENDOR_ID_PLX,
   2573		.device      = PCI_DEVICE_ID_RDK2,
   2574		.subvendor   = PCI_ANY_ID,
   2575		.subdevice   = PCI_ANY_ID,
   2576	},
   2577	{ }
   2578};
   2579MODULE_DEVICE_TABLE(pci, pci_ids);
   2580
   2581static struct pci_driver net2272_pci_driver = {
   2582	.name     = driver_name,
   2583	.id_table = pci_ids,
   2584
   2585	.probe    = net2272_pci_probe,
   2586	.remove   = net2272_pci_remove,
   2587};
   2588
   2589static int net2272_pci_register(void)
   2590{
   2591	return pci_register_driver(&net2272_pci_driver);
   2592}
   2593
   2594static void net2272_pci_unregister(void)
   2595{
   2596	pci_unregister_driver(&net2272_pci_driver);
   2597}
   2598
   2599#else
   2600static inline int net2272_pci_register(void) { return 0; }
   2601static inline void net2272_pci_unregister(void) { }
   2602#endif
   2603
   2604/*---------------------------------------------------------------------------*/
   2605
   2606static int
   2607net2272_plat_probe(struct platform_device *pdev)
   2608{
   2609	struct net2272 *dev;
   2610	int ret;
   2611	unsigned int irqflags;
   2612	resource_size_t base, len;
   2613	struct resource *iomem, *iomem_bus, *irq_res;
   2614
   2615	irq_res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
   2616	iomem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
   2617	iomem_bus = platform_get_resource(pdev, IORESOURCE_BUS, 0);
   2618	if (!irq_res || !iomem) {
   2619		dev_err(&pdev->dev, "must provide irq/base addr");
   2620		return -EINVAL;
   2621	}
   2622
   2623	dev = net2272_probe_init(&pdev->dev, irq_res->start);
   2624	if (IS_ERR(dev))
   2625		return PTR_ERR(dev);
   2626
   2627	irqflags = 0;
   2628	if (irq_res->flags & IORESOURCE_IRQ_HIGHEDGE)
   2629		irqflags |= IRQF_TRIGGER_RISING;
   2630	if (irq_res->flags & IORESOURCE_IRQ_LOWEDGE)
   2631		irqflags |= IRQF_TRIGGER_FALLING;
   2632	if (irq_res->flags & IORESOURCE_IRQ_HIGHLEVEL)
   2633		irqflags |= IRQF_TRIGGER_HIGH;
   2634	if (irq_res->flags & IORESOURCE_IRQ_LOWLEVEL)
   2635		irqflags |= IRQF_TRIGGER_LOW;
   2636
   2637	base = iomem->start;
   2638	len = resource_size(iomem);
   2639	if (iomem_bus)
   2640		dev->base_shift = iomem_bus->start;
   2641
   2642	if (!request_mem_region(base, len, driver_name)) {
   2643		dev_dbg(dev->dev, "get request memory region!\n");
   2644		ret = -EBUSY;
   2645		goto err;
   2646	}
   2647	dev->base_addr = ioremap(base, len);
   2648	if (!dev->base_addr) {
   2649		dev_dbg(dev->dev, "can't map memory\n");
   2650		ret = -EFAULT;
   2651		goto err_req;
   2652	}
   2653
   2654	ret = net2272_probe_fin(dev, IRQF_TRIGGER_LOW);
   2655	if (ret)
   2656		goto err_io;
   2657
   2658	platform_set_drvdata(pdev, dev);
   2659	dev_info(&pdev->dev, "running in 16-bit, %sbyte swap local bus mode\n",
   2660		(net2272_read(dev, LOCCTL) & (1 << BYTE_SWAP)) ? "" : "no ");
   2661
   2662	return 0;
   2663
   2664 err_io:
   2665	iounmap(dev->base_addr);
   2666 err_req:
   2667	release_mem_region(base, len);
   2668 err:
   2669	usb_put_gadget(&dev->gadget);
   2670
   2671	return ret;
   2672}
   2673
   2674static int
   2675net2272_plat_remove(struct platform_device *pdev)
   2676{
   2677	struct net2272 *dev = platform_get_drvdata(pdev);
   2678
   2679	net2272_remove(dev);
   2680
   2681	release_mem_region(pdev->resource[0].start,
   2682		resource_size(&pdev->resource[0]));
   2683
   2684	usb_put_gadget(&dev->gadget);
   2685
   2686	return 0;
   2687}
   2688
   2689static struct platform_driver net2272_plat_driver = {
   2690	.probe   = net2272_plat_probe,
   2691	.remove  = net2272_plat_remove,
   2692	.driver  = {
   2693		.name  = driver_name,
   2694	},
   2695	/* FIXME .suspend, .resume */
   2696};
   2697MODULE_ALIAS("platform:net2272");
   2698
   2699static int __init net2272_init(void)
   2700{
   2701	int ret;
   2702
   2703	ret = net2272_pci_register();
   2704	if (ret)
   2705		return ret;
   2706	ret = platform_driver_register(&net2272_plat_driver);
   2707	if (ret)
   2708		goto err_pci;
   2709	return ret;
   2710
   2711err_pci:
   2712	net2272_pci_unregister();
   2713	return ret;
   2714}
   2715module_init(net2272_init);
   2716
   2717static void __exit net2272_cleanup(void)
   2718{
   2719	net2272_pci_unregister();
   2720	platform_driver_unregister(&net2272_plat_driver);
   2721}
   2722module_exit(net2272_cleanup);
   2723
   2724MODULE_DESCRIPTION(DRIVER_DESC);
   2725MODULE_AUTHOR("PLX Technology, Inc.");
   2726MODULE_LICENSE("GPL");