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