blob: e0d9704b2039a3518b233d0e33c4edc5c4399c61 [file] [log] [blame]
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001/*
2 * Driver for the NXP ISP1760 chip
3 *
4 * However, the code might contain some bugs. What doesn't work for sure is:
5 * - ISO
6 * - OTG
7 e The interrupt line is configured as active low, level.
8 *
9 * (c) 2007 Sebastian Siewior <bigeasy@linutronix.de>
10 *
11 */
12#include <linux/module.h>
13#include <linux/kernel.h>
14#include <linux/slab.h>
15#include <linux/list.h>
16#include <linux/usb.h>
Eric Lescouet27729aa2010-04-24 23:21:52 +020017#include <linux/usb/hcd.h>
Sebastian Siewiordb11e472008-04-24 00:37:04 +020018#include <linux/debugfs.h>
19#include <linux/uaccess.h>
20#include <linux/io.h>
Catalin Marinasdb8516f2010-02-02 15:31:02 +000021#include <linux/mm.h>
Sebastian Siewiordb11e472008-04-24 00:37:04 +020022#include <asm/unaligned.h>
Catalin Marinasdb8516f2010-02-02 15:31:02 +000023#include <asm/cacheflush.h>
Sebastian Siewiordb11e472008-04-24 00:37:04 +020024
Sebastian Siewiordb11e472008-04-24 00:37:04 +020025#include "isp1760-hcd.h"
26
27static struct kmem_cache *qtd_cachep;
28static struct kmem_cache *qh_cachep;
29
30struct isp1760_hcd {
31 u32 hcs_params;
32 spinlock_t lock;
33 struct inter_packet_info atl_ints[32];
34 struct inter_packet_info int_ints[32];
35 struct memory_chunk memory_pool[BLOCKS];
Sebastian Andrzej Siewiorb14e8402011-02-08 21:07:40 +010036 u32 atl_queued;
Sebastian Siewiordb11e472008-04-24 00:37:04 +020037
38 /* periodic schedule support */
39#define DEFAULT_I_TDPS 1024
40 unsigned periodic_size;
41 unsigned i_thresh;
42 unsigned long reset_done;
43 unsigned long next_statechange;
Nate Case3faefc82008-06-17 11:11:38 -050044 unsigned int devflags;
Sebastian Siewiordb11e472008-04-24 00:37:04 +020045};
46
47static inline struct isp1760_hcd *hcd_to_priv(struct usb_hcd *hcd)
48{
49 return (struct isp1760_hcd *) (hcd->hcd_priv);
50}
51static inline struct usb_hcd *priv_to_hcd(struct isp1760_hcd *priv)
52{
53 return container_of((void *) priv, struct usb_hcd, hcd_priv);
54}
55
56/* Section 2.2 Host Controller Capability Registers */
57#define HC_LENGTH(p) (((p)>>00)&0x00ff) /* bits 7:0 */
58#define HC_VERSION(p) (((p)>>16)&0xffff) /* bits 31:16 */
59#define HCS_INDICATOR(p) ((p)&(1 << 16)) /* true: has port indicators */
60#define HCS_PPC(p) ((p)&(1 << 4)) /* true: port power control */
61#define HCS_N_PORTS(p) (((p)>>0)&0xf) /* bits 3:0, ports on HC */
62#define HCC_ISOC_CACHE(p) ((p)&(1 << 7)) /* true: can cache isoc frame */
63#define HCC_ISOC_THRES(p) (((p)>>4)&0x7) /* bits 6:4, uframes cached */
64
65/* Section 2.3 Host Controller Operational Registers */
66#define CMD_LRESET (1<<7) /* partial reset (no ports, etc) */
67#define CMD_RESET (1<<1) /* reset HC not bus */
68#define CMD_RUN (1<<0) /* start/stop HC */
69#define STS_PCD (1<<2) /* port change detect */
70#define FLAG_CF (1<<0) /* true: we'll support "high speed" */
71
72#define PORT_OWNER (1<<13) /* true: companion hc owns this port */
73#define PORT_POWER (1<<12) /* true: has power (see PPC) */
74#define PORT_USB11(x) (((x) & (3 << 10)) == (1 << 10)) /* USB 1.1 device */
75#define PORT_RESET (1<<8) /* reset port */
76#define PORT_SUSPEND (1<<7) /* suspend port */
77#define PORT_RESUME (1<<6) /* resume it */
78#define PORT_PE (1<<2) /* port enable */
79#define PORT_CSC (1<<1) /* connect status change */
80#define PORT_CONNECT (1<<0) /* device connected */
81#define PORT_RWC_BITS (PORT_CSC)
82
83struct isp1760_qtd {
Sebastian Siewiordb11e472008-04-24 00:37:04 +020084 u8 packet_type;
85 u8 toggle;
86
87 void *data_buffer;
Arvid Brodina041d8e2011-02-26 22:04:40 +010088 u32 payload_addr;
89
Sebastian Siewiordb11e472008-04-24 00:37:04 +020090 /* the rest is HCD-private */
91 struct list_head qtd_list;
92 struct urb *urb;
93 size_t length;
94
95 /* isp special*/
96 u32 status;
Sebastian Siewiordb11e472008-04-24 00:37:04 +020097#define URB_ENQUEUED (1 << 1)
Sebastian Siewiordb11e472008-04-24 00:37:04 +020098};
99
100struct isp1760_qh {
101 /* first part defined by EHCI spec */
102 struct list_head qtd_list;
103 struct isp1760_hcd *priv;
104
105 /* periodic schedule info */
106 unsigned short period; /* polling interval */
107 struct usb_device *dev;
108
109 u32 toggle;
110 u32 ping;
111};
112
Alan Stern288ead42010-03-04 11:32:30 -0500113#define ehci_port_speed(priv, portsc) USB_PORT_STAT_HIGH_SPEED
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200114
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100115/*
116 * Access functions for isp176x registers (addresses 0..0x03FF).
117 */
118static u32 reg_read32(void __iomem *base, u32 reg)
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200119{
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100120 return readl(base + reg);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200121}
122
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100123static void reg_write32(void __iomem *base, u32 reg, u32 val)
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200124{
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100125 writel(val, base + reg);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200126}
127
128/*
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100129 * Access functions for isp176x memory (offset >= 0x0400).
130 *
131 * bank_reads8() reads memory locations prefetched by an earlier write to
132 * HC_MEMORY_REG (see isp176x datasheet). Unless you want to do fancy multi-
133 * bank optimizations, you should use the more generic mem_reads8() below.
134 *
135 * For access to ptd memory, use the specialized ptd_read() and ptd_write()
136 * below.
137 *
138 * These functions copy via MMIO data to/from the device. memcpy_{to|from}io()
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200139 * doesn't quite work because some people have to enforce 32-bit access
140 */
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100141static void bank_reads8(void __iomem *src_base, u32 src_offset, u32 bank_addr,
142 __u32 *dst, u32 bytes)
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200143{
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100144 __u32 __iomem *src;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200145 u32 val;
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100146 __u8 *src_byteptr;
147 __u8 *dst_byteptr;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200148
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100149 src = src_base + (bank_addr | src_offset);
150
151 if (src_offset < PAYLOAD_OFFSET) {
152 while (bytes >= 4) {
153 *dst = le32_to_cpu(__raw_readl(src));
154 bytes -= 4;
155 src++;
156 dst++;
157 }
158 } else {
159 while (bytes >= 4) {
160 *dst = __raw_readl(src);
161 bytes -= 4;
162 src++;
163 dst++;
164 }
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200165 }
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200166
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100167 if (!bytes)
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200168 return;
169
170 /* in case we have 3, 2 or 1 by left. The dst buffer may not be fully
171 * allocated.
172 */
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100173 if (src_offset < PAYLOAD_OFFSET)
174 val = le32_to_cpu(__raw_readl(src));
175 else
176 val = __raw_readl(src);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200177
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100178 dst_byteptr = (void *) dst;
179 src_byteptr = (void *) &val;
180 while (bytes > 0) {
181 *dst_byteptr = *src_byteptr;
182 dst_byteptr++;
183 src_byteptr++;
184 bytes--;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200185 }
186}
187
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100188static void mem_reads8(void __iomem *src_base, u32 src_offset, void *dst,
189 u32 bytes)
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200190{
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100191 reg_write32(src_base, HC_MEMORY_REG, src_offset + ISP_BANK(0));
192 ndelay(90);
193 bank_reads8(src_base, src_offset, ISP_BANK(0), dst, bytes);
194}
195
196static void mem_writes8(void __iomem *dst_base, u32 dst_offset,
197 __u32 const *src, u32 bytes)
198{
199 __u32 __iomem *dst;
200
201 dst = dst_base + dst_offset;
202
203 if (dst_offset < PAYLOAD_OFFSET) {
204 while (bytes >= 4) {
205 __raw_writel(cpu_to_le32(*src), dst);
206 bytes -= 4;
207 src++;
208 dst++;
209 }
210 } else {
211 while (bytes >= 4) {
212 __raw_writel(*src, dst);
213 bytes -= 4;
214 src++;
215 dst++;
216 }
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200217 }
218
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100219 if (!bytes)
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200220 return;
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100221 /* in case we have 3, 2 or 1 bytes left. The buffer is allocated and the
222 * extra bytes should not be read by the HW.
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200223 */
224
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100225 if (dst_offset < PAYLOAD_OFFSET)
226 __raw_writel(cpu_to_le32(*src), dst);
227 else
228 __raw_writel(*src, dst);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200229}
230
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100231/*
232 * Read and write ptds. 'ptd_offset' should be one of ISO_PTD_OFFSET,
233 * INT_PTD_OFFSET, and ATL_PTD_OFFSET. 'slot' should be less than 32.
234 */
235static void ptd_read(void __iomem *base, u32 ptd_offset, u32 slot,
236 struct ptd *ptd)
237{
238 reg_write32(base, HC_MEMORY_REG,
239 ISP_BANK(0) + ptd_offset + slot*sizeof(*ptd));
240 ndelay(90);
241 bank_reads8(base, ptd_offset + slot*sizeof(*ptd), ISP_BANK(0),
242 (void *) ptd, sizeof(*ptd));
243}
244
245static void ptd_write(void __iomem *base, u32 ptd_offset, u32 slot,
246 struct ptd *ptd)
247{
248 mem_writes8(base, ptd_offset + slot*sizeof(*ptd) + sizeof(ptd->dw0),
249 &ptd->dw1, 7*sizeof(ptd->dw1));
250 /* Make sure dw0 gets written last (after other dw's and after payload)
251 since it contains the enable bit */
252 wmb();
253 mem_writes8(base, ptd_offset + slot*sizeof(*ptd), &ptd->dw0,
254 sizeof(ptd->dw0));
255}
256
257
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200258/* memory management of the 60kb on the chip from 0x1000 to 0xffff */
259static void init_memory(struct isp1760_hcd *priv)
260{
Arvid Brodina041d8e2011-02-26 22:04:40 +0100261 int i, curr;
262 u32 payload_addr;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200263
Arvid Brodina041d8e2011-02-26 22:04:40 +0100264 payload_addr = PAYLOAD_OFFSET;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200265 for (i = 0; i < BLOCK_1_NUM; i++) {
Arvid Brodina041d8e2011-02-26 22:04:40 +0100266 priv->memory_pool[i].start = payload_addr;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200267 priv->memory_pool[i].size = BLOCK_1_SIZE;
268 priv->memory_pool[i].free = 1;
Arvid Brodina041d8e2011-02-26 22:04:40 +0100269 payload_addr += priv->memory_pool[i].size;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200270 }
271
Arvid Brodina041d8e2011-02-26 22:04:40 +0100272 curr = i;
273 for (i = 0; i < BLOCK_2_NUM; i++) {
274 priv->memory_pool[curr + i].start = payload_addr;
275 priv->memory_pool[curr + i].size = BLOCK_2_SIZE;
276 priv->memory_pool[curr + i].free = 1;
277 payload_addr += priv->memory_pool[curr + i].size;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200278 }
279
Arvid Brodina041d8e2011-02-26 22:04:40 +0100280 curr = i;
281 for (i = 0; i < BLOCK_3_NUM; i++) {
282 priv->memory_pool[curr + i].start = payload_addr;
283 priv->memory_pool[curr + i].size = BLOCK_3_SIZE;
284 priv->memory_pool[curr + i].free = 1;
285 payload_addr += priv->memory_pool[curr + i].size;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200286 }
287
Arvid Brodina041d8e2011-02-26 22:04:40 +0100288 BUG_ON(payload_addr - priv->memory_pool[0].start > PAYLOAD_AREA_SIZE);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200289}
290
Arvid Brodina041d8e2011-02-26 22:04:40 +0100291static void alloc_mem(struct isp1760_hcd *priv, struct isp1760_qtd *qtd)
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200292{
293 int i;
294
Arvid Brodina041d8e2011-02-26 22:04:40 +0100295 BUG_ON(qtd->payload_addr);
296
297 if (!qtd->length)
298 return;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200299
300 for (i = 0; i < BLOCKS; i++) {
Arvid Brodina041d8e2011-02-26 22:04:40 +0100301 if (priv->memory_pool[i].size >= qtd->length &&
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200302 priv->memory_pool[i].free) {
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200303 priv->memory_pool[i].free = 0;
Arvid Brodina041d8e2011-02-26 22:04:40 +0100304 qtd->payload_addr = priv->memory_pool[i].start;
305 return;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200306 }
307 }
308
Arvid Brodina041d8e2011-02-26 22:04:40 +0100309 printk(KERN_ERR "ISP1760 MEM: can not allocate %lu bytes of memory\n",
310 qtd->length);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200311 printk(KERN_ERR "Current memory map:\n");
312 for (i = 0; i < BLOCKS; i++) {
313 printk(KERN_ERR "Pool %2d size %4d status: %d\n",
314 i, priv->memory_pool[i].size,
315 priv->memory_pool[i].free);
316 }
317 /* XXX maybe -ENOMEM could be possible */
318 BUG();
Arvid Brodina041d8e2011-02-26 22:04:40 +0100319 return;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200320}
321
Arvid Brodina041d8e2011-02-26 22:04:40 +0100322static void free_mem(struct isp1760_hcd *priv, struct isp1760_qtd *qtd)
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200323{
324 int i;
325
Arvid Brodina041d8e2011-02-26 22:04:40 +0100326 if (!qtd->payload_addr)
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200327 return;
328
329 for (i = 0; i < BLOCKS; i++) {
Arvid Brodina041d8e2011-02-26 22:04:40 +0100330 if (priv->memory_pool[i].start == qtd->payload_addr) {
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200331 BUG_ON(priv->memory_pool[i].free);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200332 priv->memory_pool[i].free = 1;
Arvid Brodina041d8e2011-02-26 22:04:40 +0100333 qtd->payload_addr = 0;
334 return;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200335 }
336 }
337
Arvid Brodina041d8e2011-02-26 22:04:40 +0100338 printk(KERN_ERR "%s: Invalid pointer: %08x\n", __func__,
339 qtd->payload_addr);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200340 BUG();
341}
342
343static void isp1760_init_regs(struct usb_hcd *hcd)
344{
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100345 reg_write32(hcd->regs, HC_BUFFER_STATUS_REG, 0);
346 reg_write32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG, NO_TRANSFER_ACTIVE);
347 reg_write32(hcd->regs, HC_INT_PTD_SKIPMAP_REG, NO_TRANSFER_ACTIVE);
348 reg_write32(hcd->regs, HC_ISO_PTD_SKIPMAP_REG, NO_TRANSFER_ACTIVE);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200349
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100350 reg_write32(hcd->regs, HC_ATL_PTD_DONEMAP_REG, ~NO_TRANSFER_ACTIVE);
351 reg_write32(hcd->regs, HC_INT_PTD_DONEMAP_REG, ~NO_TRANSFER_ACTIVE);
352 reg_write32(hcd->regs, HC_ISO_PTD_DONEMAP_REG, ~NO_TRANSFER_ACTIVE);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200353}
354
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100355static int handshake(struct usb_hcd *hcd, u32 reg,
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200356 u32 mask, u32 done, int usec)
357{
358 u32 result;
359
360 do {
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100361 result = reg_read32(hcd->regs, reg);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200362 if (result == ~0)
363 return -ENODEV;
364 result &= mask;
365 if (result == done)
366 return 0;
367 udelay(1);
368 usec--;
369 } while (usec > 0);
370 return -ETIMEDOUT;
371}
372
373/* reset a non-running (STS_HALT == 1) controller */
374static int ehci_reset(struct isp1760_hcd *priv)
375{
376 int retval;
377 struct usb_hcd *hcd = priv_to_hcd(priv);
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100378 u32 command = reg_read32(hcd->regs, HC_USBCMD);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200379
380 command |= CMD_RESET;
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100381 reg_write32(hcd->regs, HC_USBCMD, command);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200382 hcd->state = HC_STATE_HALT;
383 priv->next_statechange = jiffies;
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100384 retval = handshake(hcd, HC_USBCMD,
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200385 CMD_RESET, 0, 250 * 1000);
386 return retval;
387}
388
389static void qh_destroy(struct isp1760_qh *qh)
390{
391 BUG_ON(!list_empty(&qh->qtd_list));
392 kmem_cache_free(qh_cachep, qh);
393}
394
395static struct isp1760_qh *isp1760_qh_alloc(struct isp1760_hcd *priv,
396 gfp_t flags)
397{
398 struct isp1760_qh *qh;
399
400 qh = kmem_cache_zalloc(qh_cachep, flags);
401 if (!qh)
402 return qh;
403
404 INIT_LIST_HEAD(&qh->qtd_list);
405 qh->priv = priv;
406 return qh;
407}
408
409/* magic numbers that can affect system performance */
410#define EHCI_TUNE_CERR 3 /* 0-3 qtd retries; 0 == don't stop */
411#define EHCI_TUNE_RL_HS 4 /* nak throttle; see 4.9 */
412#define EHCI_TUNE_RL_TT 0
413#define EHCI_TUNE_MULT_HS 1 /* 1-3 transactions/uframe; 4.10.3 */
414#define EHCI_TUNE_MULT_TT 1
415#define EHCI_TUNE_FLS 2 /* (small) 256 frame schedule */
416
417/* one-time init, only for memory state */
418static int priv_init(struct usb_hcd *hcd)
419{
420 struct isp1760_hcd *priv = hcd_to_priv(hcd);
421 u32 hcc_params;
422
423 spin_lock_init(&priv->lock);
424
425 /*
426 * hw default: 1K periodic list heads, one per frame.
427 * periodic_size can shrink by USBCMD update if hcc_params allows.
428 */
429 priv->periodic_size = DEFAULT_I_TDPS;
430
431 /* controllers may cache some of the periodic schedule ... */
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100432 hcc_params = reg_read32(hcd->regs, HC_HCCPARAMS);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200433 /* full frame cache */
434 if (HCC_ISOC_CACHE(hcc_params))
435 priv->i_thresh = 8;
436 else /* N microframes cached */
437 priv->i_thresh = 2 + HCC_ISOC_THRES(hcc_params);
438
439 return 0;
440}
441
442static int isp1760_hc_setup(struct usb_hcd *hcd)
443{
444 struct isp1760_hcd *priv = hcd_to_priv(hcd);
445 int result;
Nate Case3faefc82008-06-17 11:11:38 -0500446 u32 scratch, hwmode;
447
448 /* Setup HW Mode Control: This assumes a level active-low interrupt */
449 hwmode = HW_DATA_BUS_32BIT;
450
451 if (priv->devflags & ISP1760_FLAG_BUS_WIDTH_16)
452 hwmode &= ~HW_DATA_BUS_32BIT;
453 if (priv->devflags & ISP1760_FLAG_ANALOG_OC)
454 hwmode |= HW_ANA_DIGI_OC;
455 if (priv->devflags & ISP1760_FLAG_DACK_POL_HIGH)
456 hwmode |= HW_DACK_POL_HIGH;
457 if (priv->devflags & ISP1760_FLAG_DREQ_POL_HIGH)
458 hwmode |= HW_DREQ_POL_HIGH;
Michael Hennerich9da69c62009-07-15 23:22:54 -0400459 if (priv->devflags & ISP1760_FLAG_INTR_POL_HIGH)
460 hwmode |= HW_INTR_HIGH_ACT;
461 if (priv->devflags & ISP1760_FLAG_INTR_EDGE_TRIG)
462 hwmode |= HW_INTR_EDGE_TRIG;
Nate Case3faefc82008-06-17 11:11:38 -0500463
464 /*
465 * We have to set this first in case we're in 16-bit mode.
466 * Write it twice to ensure correct upper bits if switching
467 * to 16-bit mode.
468 */
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100469 reg_write32(hcd->regs, HC_HW_MODE_CTRL, hwmode);
470 reg_write32(hcd->regs, HC_HW_MODE_CTRL, hwmode);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200471
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100472 reg_write32(hcd->regs, HC_SCRATCH_REG, 0xdeadbabe);
Nate Case3faefc82008-06-17 11:11:38 -0500473 /* Change bus pattern */
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100474 scratch = reg_read32(hcd->regs, HC_CHIP_ID_REG);
475 scratch = reg_read32(hcd->regs, HC_SCRATCH_REG);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200476 if (scratch != 0xdeadbabe) {
477 printk(KERN_ERR "ISP1760: Scratch test failed.\n");
478 return -ENODEV;
479 }
480
481 /* pre reset */
482 isp1760_init_regs(hcd);
483
484 /* reset */
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100485 reg_write32(hcd->regs, HC_RESET_REG, SW_RESET_RESET_ALL);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200486 mdelay(100);
487
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100488 reg_write32(hcd->regs, HC_RESET_REG, SW_RESET_RESET_HC);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200489 mdelay(100);
490
491 result = ehci_reset(priv);
492 if (result)
493 return result;
494
495 /* Step 11 passed */
496
Nate Case3faefc82008-06-17 11:11:38 -0500497 isp1760_info(priv, "bus width: %d, oc: %s\n",
498 (priv->devflags & ISP1760_FLAG_BUS_WIDTH_16) ?
499 16 : 32, (priv->devflags & ISP1760_FLAG_ANALOG_OC) ?
500 "analog" : "digital");
501
502 /* ATL reset */
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100503 reg_write32(hcd->regs, HC_HW_MODE_CTRL, hwmode | ALL_ATX_RESET);
Nate Case3faefc82008-06-17 11:11:38 -0500504 mdelay(10);
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100505 reg_write32(hcd->regs, HC_HW_MODE_CTRL, hwmode);
Nate Case3faefc82008-06-17 11:11:38 -0500506
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100507 reg_write32(hcd->regs, HC_INTERRUPT_REG, INTERRUPT_ENABLE_MASK);
508 reg_write32(hcd->regs, HC_INTERRUPT_ENABLE, INTERRUPT_ENABLE_MASK);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200509
Nate Case3faefc82008-06-17 11:11:38 -0500510 /*
511 * PORT 1 Control register of the ISP1760 is the OTG control
Thomas Hommel42c65392008-12-18 10:31:40 +0100512 * register on ISP1761. Since there is no OTG or device controller
513 * support in this driver, we use port 1 as a "normal" USB host port on
514 * both chips.
Nate Case3faefc82008-06-17 11:11:38 -0500515 */
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100516 reg_write32(hcd->regs, HC_PORT1_CTRL, PORT1_POWER | PORT1_INIT2);
Thomas Hommel42c65392008-12-18 10:31:40 +0100517 mdelay(10);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200518
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100519 priv->hcs_params = reg_read32(hcd->regs, HC_HCSPARAMS);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200520
521 return priv_init(hcd);
522}
523
524static void isp1760_init_maps(struct usb_hcd *hcd)
525{
526 /*set last maps, for iso its only 1, else 32 tds bitmap*/
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100527 reg_write32(hcd->regs, HC_ATL_PTD_LASTPTD_REG, 0x80000000);
528 reg_write32(hcd->regs, HC_INT_PTD_LASTPTD_REG, 0x80000000);
529 reg_write32(hcd->regs, HC_ISO_PTD_LASTPTD_REG, 0x00000001);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200530}
531
532static void isp1760_enable_interrupts(struct usb_hcd *hcd)
533{
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100534 reg_write32(hcd->regs, HC_ATL_IRQ_MASK_AND_REG, 0);
535 reg_write32(hcd->regs, HC_ATL_IRQ_MASK_OR_REG, 0);
536 reg_write32(hcd->regs, HC_INT_IRQ_MASK_AND_REG, 0);
537 reg_write32(hcd->regs, HC_INT_IRQ_MASK_OR_REG, 0);
538 reg_write32(hcd->regs, HC_ISO_IRQ_MASK_AND_REG, 0);
539 reg_write32(hcd->regs, HC_ISO_IRQ_MASK_OR_REG, 0xffffffff);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200540 /* step 23 passed */
541}
542
543static int isp1760_run(struct usb_hcd *hcd)
544{
545 struct isp1760_hcd *priv = hcd_to_priv(hcd);
546 int retval;
547 u32 temp;
548 u32 command;
549 u32 chipid;
550
551 hcd->uses_new_polling = 1;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200552
553 hcd->state = HC_STATE_RUNNING;
554 isp1760_enable_interrupts(hcd);
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100555 temp = reg_read32(hcd->regs, HC_HW_MODE_CTRL);
556 reg_write32(hcd->regs, HC_HW_MODE_CTRL, temp | HW_GLOBAL_INTR_EN);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200557
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100558 command = reg_read32(hcd->regs, HC_USBCMD);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200559 command &= ~(CMD_LRESET|CMD_RESET);
560 command |= CMD_RUN;
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100561 reg_write32(hcd->regs, HC_USBCMD, command);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200562
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100563 retval = handshake(hcd, HC_USBCMD, CMD_RUN, CMD_RUN,
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200564 250 * 1000);
565 if (retval)
566 return retval;
567
568 /*
569 * XXX
570 * Spec says to write FLAG_CF as last config action, priv code grabs
571 * the semaphore while doing so.
572 */
573 down_write(&ehci_cf_port_reset_rwsem);
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100574 reg_write32(hcd->regs, HC_CONFIGFLAG, FLAG_CF);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200575
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100576 retval = handshake(hcd, HC_CONFIGFLAG, FLAG_CF, FLAG_CF, 250 * 1000);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200577 up_write(&ehci_cf_port_reset_rwsem);
578 if (retval)
579 return retval;
580
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100581 chipid = reg_read32(hcd->regs, HC_CHIP_ID_REG);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200582 isp1760_info(priv, "USB ISP %04x HW rev. %d started\n", chipid & 0xffff,
583 chipid >> 16);
584
585 /* PTD Register Init Part 2, Step 28 */
586 /* enable INTs */
587 isp1760_init_maps(hcd);
588
589 /* GRR this is run-once init(), being done every time the HC starts.
590 * So long as they're part of class devices, we can't do it init()
591 * since the class device isn't created that early.
592 */
593 return 0;
594}
595
596static u32 base_to_chip(u32 base)
597{
598 return ((base - 0x400) >> 3);
599}
600
601static void transform_into_atl(struct isp1760_hcd *priv, struct isp1760_qh *qh,
Arvid Brodina041d8e2011-02-26 22:04:40 +0100602 struct isp1760_qtd *qtd, struct ptd *ptd)
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200603{
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200604 u32 maxpacket;
605 u32 multi;
606 u32 pid_code;
607 u32 rl = RL_COUNTER;
608 u32 nak = NAK_COUNTER;
609
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100610 memset(ptd, 0, sizeof(*ptd));
611
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200612 /* according to 3.6.2, max packet len can not be > 0x400 */
Arvid Brodina041d8e2011-02-26 22:04:40 +0100613 maxpacket = usb_maxpacket(qtd->urb->dev, qtd->urb->pipe,
614 usb_pipeout(qtd->urb->pipe));
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200615 multi = 1 + ((maxpacket >> 11) & 0x3);
616 maxpacket &= 0x7ff;
617
618 /* DW0 */
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100619 ptd->dw0 = PTD_VALID;
620 ptd->dw0 |= PTD_LENGTH(qtd->length);
621 ptd->dw0 |= PTD_MAXPACKET(maxpacket);
Arvid Brodina041d8e2011-02-26 22:04:40 +0100622 ptd->dw0 |= PTD_ENDPOINT(usb_pipeendpoint(qtd->urb->pipe));
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200623
624 /* DW1 */
Arvid Brodina041d8e2011-02-26 22:04:40 +0100625 ptd->dw1 = usb_pipeendpoint(qtd->urb->pipe) >> 1;
626 ptd->dw1 |= PTD_DEVICE_ADDR(usb_pipedevice(qtd->urb->pipe));
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200627
628 pid_code = qtd->packet_type;
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100629 ptd->dw1 |= PTD_PID_TOKEN(pid_code);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200630
Arvid Brodina041d8e2011-02-26 22:04:40 +0100631 if (usb_pipebulk(qtd->urb->pipe))
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100632 ptd->dw1 |= PTD_TRANS_BULK;
Arvid Brodina041d8e2011-02-26 22:04:40 +0100633 else if (usb_pipeint(qtd->urb->pipe))
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100634 ptd->dw1 |= PTD_TRANS_INT;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200635
Arvid Brodina041d8e2011-02-26 22:04:40 +0100636 if (qtd->urb->dev->speed != USB_SPEED_HIGH) {
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200637 /* split transaction */
638
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100639 ptd->dw1 |= PTD_TRANS_SPLIT;
Arvid Brodina041d8e2011-02-26 22:04:40 +0100640 if (qtd->urb->dev->speed == USB_SPEED_LOW)
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100641 ptd->dw1 |= PTD_SE_USB_LOSPEED;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200642
Arvid Brodina041d8e2011-02-26 22:04:40 +0100643 ptd->dw1 |= PTD_PORT_NUM(qtd->urb->dev->ttport);
644 ptd->dw1 |= PTD_HUB_NUM(qtd->urb->dev->tt->hub->devnum);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200645
646 /* SE bit for Split INT transfers */
Arvid Brodina041d8e2011-02-26 22:04:40 +0100647 if (usb_pipeint(qtd->urb->pipe) &&
648 (qtd->urb->dev->speed == USB_SPEED_LOW))
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100649 ptd->dw1 |= 2 << 16;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200650
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100651 ptd->dw3 = 0;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200652 rl = 0;
653 nak = 0;
654 } else {
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100655 ptd->dw0 |= PTD_MULTI(multi);
Arvid Brodina041d8e2011-02-26 22:04:40 +0100656 if (usb_pipecontrol(qtd->urb->pipe) ||
657 usb_pipebulk(qtd->urb->pipe))
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100658 ptd->dw3 = qh->ping;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200659 else
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100660 ptd->dw3 = 0;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200661 }
662 /* DW2 */
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100663 ptd->dw2 = 0;
Arvid Brodina041d8e2011-02-26 22:04:40 +0100664 ptd->dw2 |= PTD_DATA_START_ADDR(base_to_chip(qtd->payload_addr));
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100665 ptd->dw2 |= PTD_RL_CNT(rl);
666 ptd->dw3 |= PTD_NAC_CNT(nak);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200667
668 /* DW3 */
Arvid Brodina041d8e2011-02-26 22:04:40 +0100669 if (usb_pipecontrol(qtd->urb->pipe))
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100670 ptd->dw3 |= PTD_DATA_TOGGLE(qtd->toggle);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200671 else
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100672 ptd->dw3 |= qh->toggle;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200673
674
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100675 ptd->dw3 |= PTD_ACTIVE;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200676 /* Cerr */
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100677 ptd->dw3 |= PTD_CERR(ERR_COUNTER);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200678}
679
680static void transform_add_int(struct isp1760_hcd *priv, struct isp1760_qh *qh,
Arvid Brodina041d8e2011-02-26 22:04:40 +0100681 struct isp1760_qtd *qtd, struct ptd *ptd)
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200682{
683 u32 maxpacket;
684 u32 multi;
685 u32 numberofusofs;
686 u32 i;
687 u32 usofmask, usof;
688 u32 period;
689
Arvid Brodina041d8e2011-02-26 22:04:40 +0100690 maxpacket = usb_maxpacket(qtd->urb->dev, qtd->urb->pipe,
691 usb_pipeout(qtd->urb->pipe));
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200692 multi = 1 + ((maxpacket >> 11) & 0x3);
693 maxpacket &= 0x7ff;
694 /* length of the data per uframe */
695 maxpacket = multi * maxpacket;
696
Arvid Brodina041d8e2011-02-26 22:04:40 +0100697 numberofusofs = qtd->urb->transfer_buffer_length / maxpacket;
698 if (qtd->urb->transfer_buffer_length % maxpacket)
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200699 numberofusofs += 1;
700
701 usofmask = 1;
702 usof = 0;
703 for (i = 0; i < numberofusofs; i++) {
704 usof |= usofmask;
705 usofmask <<= 1;
706 }
707
Arvid Brodina041d8e2011-02-26 22:04:40 +0100708 if (qtd->urb->dev->speed != USB_SPEED_HIGH) {
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200709 /* split */
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100710 ptd->dw5 = 0x1c;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200711
712 if (qh->period >= 32)
713 period = qh->period / 2;
714 else
715 period = qh->period;
716
717 } else {
718
719 if (qh->period >= 8)
720 period = qh->period/8;
721 else
722 period = qh->period;
723
724 if (period >= 32)
725 period = 16;
726
727 if (qh->period >= 8) {
728 /* millisecond period */
729 period = (period << 3);
730 } else {
731 /* usof based tranmsfers */
732 /* minimum 4 usofs */
733 usof = 0x11;
734 }
735 }
736
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100737 ptd->dw2 |= period;
738 ptd->dw4 = usof;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200739}
740
741static void transform_into_int(struct isp1760_hcd *priv, struct isp1760_qh *qh,
Arvid Brodina041d8e2011-02-26 22:04:40 +0100742 struct isp1760_qtd *qtd, struct ptd *ptd)
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200743{
Arvid Brodina041d8e2011-02-26 22:04:40 +0100744 transform_into_atl(priv, qh, qtd, ptd);
745 transform_add_int(priv, qh, qtd, ptd);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200746}
747
748static int qtd_fill(struct isp1760_qtd *qtd, void *databuffer, size_t len,
749 u32 token)
750{
751 int count;
752
753 qtd->data_buffer = databuffer;
754 qtd->packet_type = GET_QTD_TOKEN_TYPE(token);
755 qtd->toggle = GET_DATA_TOGGLE(token);
756
Arvid Brodina041d8e2011-02-26 22:04:40 +0100757 if (len > MAX_PAYLOAD_SIZE)
758 count = MAX_PAYLOAD_SIZE;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200759 else
760 count = len;
761
762 qtd->length = count;
763 return count;
764}
765
766static int check_error(struct ptd *ptd)
767{
768 int error = 0;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200769
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100770 if (ptd->dw3 & DW3_HALT_BIT) {
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200771 error = -EPIPE;
772
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100773 if (ptd->dw3 & DW3_ERROR_BIT)
Anton Vorontsov0954e1c2010-05-07 01:09:19 +0400774 pr_err("error bit is set in DW3\n");
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200775 }
776
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100777 if (ptd->dw3 & DW3_QTD_ACTIVE) {
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200778 printk(KERN_ERR "transfer active bit is set DW3\n");
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100779 printk(KERN_ERR "nak counter: %d, rl: %d\n",
780 (ptd->dw3 >> 19) & 0xf, (ptd->dw2 >> 25) & 0xf);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200781 }
782
783 return error;
784}
785
786static void check_int_err_status(u32 dw4)
787{
788 u32 i;
789
790 dw4 >>= 8;
791
792 for (i = 0; i < 8; i++) {
793 switch (dw4 & 0x7) {
794 case INT_UNDERRUN:
795 printk(KERN_ERR "ERROR: under run , %d\n", i);
796 break;
797
798 case INT_EXACT:
799 printk(KERN_ERR "ERROR: transaction error, %d\n", i);
800 break;
801
802 case INT_BABBLE:
803 printk(KERN_ERR "ERROR: babble error, %d\n", i);
804 break;
805 }
806 dw4 >>= 3;
807 }
808}
809
Arvid Brodina041d8e2011-02-26 22:04:40 +0100810static void enqueue_one_qtd(struct isp1760_qtd *qtd, struct isp1760_hcd *priv)
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200811{
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200812 struct usb_hcd *hcd = priv_to_hcd(priv);
813
Arvid Brodina041d8e2011-02-26 22:04:40 +0100814 if (qtd->length && (qtd->length <= MAX_PAYLOAD_SIZE)) {
815 switch (qtd->packet_type) {
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200816 case IN_PID:
817 break;
818 case OUT_PID:
819 case SETUP_PID:
Arvid Brodina041d8e2011-02-26 22:04:40 +0100820 mem_writes8(hcd->regs, qtd->payload_addr,
821 qtd->data_buffer, qtd->length);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200822 }
823 }
824}
825
Arvid Brodina041d8e2011-02-26 22:04:40 +0100826static void enqueue_one_atl_qtd(struct isp1760_hcd *priv,
827 struct isp1760_qh *qh, u32 slot,
828 struct isp1760_qtd *qtd)
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200829{
830 struct ptd ptd;
831 struct usb_hcd *hcd = priv_to_hcd(priv);
832
Arvid Brodina041d8e2011-02-26 22:04:40 +0100833 alloc_mem(priv, qtd);
834 transform_into_atl(priv, qh, qtd, &ptd);
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100835 ptd_write(hcd->regs, ATL_PTD_OFFSET, slot, &ptd);
Arvid Brodina041d8e2011-02-26 22:04:40 +0100836 enqueue_one_qtd(qtd, priv);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200837
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200838 priv->atl_ints[slot].qh = qh;
839 priv->atl_ints[slot].qtd = qtd;
Arvid Brodinfd436ae2011-02-26 22:03:49 +0100840 qtd->status |= URB_ENQUEUED;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200841 qtd->status |= slot << 16;
842}
843
Arvid Brodina041d8e2011-02-26 22:04:40 +0100844static void enqueue_one_int_qtd(struct isp1760_hcd *priv,
845 struct isp1760_qh *qh, u32 slot,
846 struct isp1760_qtd *qtd)
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200847{
848 struct ptd ptd;
849 struct usb_hcd *hcd = priv_to_hcd(priv);
850
Arvid Brodina041d8e2011-02-26 22:04:40 +0100851 alloc_mem(priv, qtd);
852 transform_into_int(priv, qh, qtd, &ptd);
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100853 ptd_write(hcd->regs, INT_PTD_OFFSET, slot, &ptd);
Arvid Brodina041d8e2011-02-26 22:04:40 +0100854 enqueue_one_qtd(qtd, priv);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200855
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200856 priv->int_ints[slot].qh = qh;
857 priv->int_ints[slot].qtd = qtd;
Arvid Brodinfd436ae2011-02-26 22:03:49 +0100858 qtd->status |= URB_ENQUEUED;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200859 qtd->status |= slot << 16;
860}
861
Adrian Bunk473bca92008-05-05 21:25:33 +0300862static void enqueue_an_ATL_packet(struct usb_hcd *hcd, struct isp1760_qh *qh,
863 struct isp1760_qtd *qtd)
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200864{
865 struct isp1760_hcd *priv = hcd_to_priv(hcd);
866 u32 skip_map, or_map;
867 u32 queue_entry;
868 u32 slot;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200869 u32 buffstatus;
870
Catalin Marinase6bdfe32009-03-23 12:38:16 +0000871 /*
872 * When this function is called from the interrupt handler to enqueue
873 * a follow-up packet, the SKIP register gets written and read back
874 * almost immediately. With ISP1761, this register requires a delay of
875 * 195ns between a write and subsequent read (see section 15.1.1.3).
876 */
Michael Hennerichebb8a4e2010-08-05 17:53:57 -0400877 mmiowb();
Catalin Marinase6bdfe32009-03-23 12:38:16 +0000878 ndelay(195);
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100879 skip_map = reg_read32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200880
881 BUG_ON(!skip_map);
882 slot = __ffs(skip_map);
883 queue_entry = 1 << slot;
884
Arvid Brodina041d8e2011-02-26 22:04:40 +0100885 enqueue_one_atl_qtd(priv, qh, slot, qtd);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200886
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100887 or_map = reg_read32(hcd->regs, HC_ATL_IRQ_MASK_OR_REG);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200888 or_map |= queue_entry;
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100889 reg_write32(hcd->regs, HC_ATL_IRQ_MASK_OR_REG, or_map);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200890
891 skip_map &= ~queue_entry;
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100892 reg_write32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG, skip_map);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200893
Sebastian Andrzej Siewiorb14e8402011-02-08 21:07:40 +0100894 priv->atl_queued++;
895 if (priv->atl_queued == 2)
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100896 reg_write32(hcd->regs, HC_INTERRUPT_ENABLE,
897 INTERRUPT_ENABLE_SOT_MASK);
Sebastian Andrzej Siewiorb14e8402011-02-08 21:07:40 +0100898
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100899 buffstatus = reg_read32(hcd->regs, HC_BUFFER_STATUS_REG);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200900 buffstatus |= ATL_BUFFER;
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100901 reg_write32(hcd->regs, HC_BUFFER_STATUS_REG, buffstatus);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200902}
903
Adrian Bunk473bca92008-05-05 21:25:33 +0300904static void enqueue_an_INT_packet(struct usb_hcd *hcd, struct isp1760_qh *qh,
905 struct isp1760_qtd *qtd)
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200906{
907 struct isp1760_hcd *priv = hcd_to_priv(hcd);
908 u32 skip_map, or_map;
909 u32 queue_entry;
910 u32 slot;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200911 u32 buffstatus;
912
Catalin Marinase6bdfe32009-03-23 12:38:16 +0000913 /*
914 * When this function is called from the interrupt handler to enqueue
915 * a follow-up packet, the SKIP register gets written and read back
916 * almost immediately. With ISP1761, this register requires a delay of
917 * 195ns between a write and subsequent read (see section 15.1.1.3).
918 */
Michael Hennerichebb8a4e2010-08-05 17:53:57 -0400919 mmiowb();
Catalin Marinase6bdfe32009-03-23 12:38:16 +0000920 ndelay(195);
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100921 skip_map = reg_read32(hcd->regs, HC_INT_PTD_SKIPMAP_REG);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200922
923 BUG_ON(!skip_map);
924 slot = __ffs(skip_map);
925 queue_entry = 1 << slot;
926
Arvid Brodina041d8e2011-02-26 22:04:40 +0100927 enqueue_one_int_qtd(priv, qh, slot, qtd);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200928
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100929 or_map = reg_read32(hcd->regs, HC_INT_IRQ_MASK_OR_REG);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200930 or_map |= queue_entry;
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100931 reg_write32(hcd->regs, HC_INT_IRQ_MASK_OR_REG, or_map);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200932
933 skip_map &= ~queue_entry;
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100934 reg_write32(hcd->regs, HC_INT_PTD_SKIPMAP_REG, skip_map);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200935
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100936 buffstatus = reg_read32(hcd->regs, HC_BUFFER_STATUS_REG);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200937 buffstatus |= INT_BUFFER;
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100938 reg_write32(hcd->regs, HC_BUFFER_STATUS_REG, buffstatus);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200939}
940
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100941static void isp1760_urb_done(struct isp1760_hcd *priv, struct urb *urb,
942 int status)
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200943__releases(priv->lock)
944__acquires(priv->lock)
945{
946 if (!urb->unlinked) {
947 if (status == -EINPROGRESS)
948 status = 0;
949 }
950
Catalin Marinasdb8516f2010-02-02 15:31:02 +0000951 if (usb_pipein(urb->pipe) && usb_pipetype(urb->pipe) != PIPE_CONTROL) {
952 void *ptr;
953 for (ptr = urb->transfer_buffer;
954 ptr < urb->transfer_buffer + urb->transfer_buffer_length;
955 ptr += PAGE_SIZE)
956 flush_dcache_page(virt_to_page(ptr));
957 }
958
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200959 /* complete() can reenter this HCD */
960 usb_hcd_unlink_urb_from_ep(priv_to_hcd(priv), urb);
961 spin_unlock(&priv->lock);
962 usb_hcd_giveback_urb(priv_to_hcd(priv), urb, status);
963 spin_lock(&priv->lock);
964}
965
966static void isp1760_qtd_free(struct isp1760_qtd *qtd)
967{
Arvid Brodina041d8e2011-02-26 22:04:40 +0100968 BUG_ON(qtd->payload_addr);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200969 kmem_cache_free(qtd_cachep, qtd);
970}
971
Arvid Brodinfd436ae2011-02-26 22:03:49 +0100972static struct isp1760_qtd *clean_this_qtd(struct isp1760_qtd *qtd,
973 struct isp1760_qh *qh)
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200974{
975 struct isp1760_qtd *tmp_qtd;
976
Arvid Brodinfd436ae2011-02-26 22:03:49 +0100977 if (list_is_last(&qtd->qtd_list, &qh->qtd_list))
978 tmp_qtd = NULL;
979 else
980 tmp_qtd = list_entry(qtd->qtd_list.next, struct isp1760_qtd,
981 qtd_list);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200982 list_del(&qtd->qtd_list);
983 isp1760_qtd_free(qtd);
984 return tmp_qtd;
985}
986
987/*
988 * Remove this QTD from the QH list and free its memory. If this QTD
989 * isn't the last one than remove also his successor(s).
990 * Returns the QTD which is part of an new URB and should be enqueued.
991 */
Arvid Brodinfd436ae2011-02-26 22:03:49 +0100992static struct isp1760_qtd *clean_up_qtdlist(struct isp1760_qtd *qtd,
993 struct isp1760_qh *qh)
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200994{
Arvid Brodinfd436ae2011-02-26 22:03:49 +0100995 struct urb *urb;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200996
Arvid Brodinfd436ae2011-02-26 22:03:49 +0100997 urb = qtd->urb;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200998 do {
Arvid Brodinfd436ae2011-02-26 22:03:49 +0100999 qtd = clean_this_qtd(qtd, qh);
1000 } while (qtd && (qtd->urb == urb));
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001001
1002 return qtd;
1003}
1004
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001005static int last_qtd_of_urb(struct isp1760_qtd *qtd, struct isp1760_qh *qh)
1006{
1007 struct urb *urb;
1008
1009 if (list_is_last(&qtd->qtd_list, &qh->qtd_list))
1010 return 1;
1011
1012 urb = qtd->urb;
1013 qtd = list_entry(qtd->qtd_list.next, typeof(*qtd), qtd_list);
1014 return (qtd->urb != urb);
1015}
1016
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001017static void do_atl_int(struct usb_hcd *hcd)
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001018{
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001019 struct isp1760_hcd *priv = hcd_to_priv(hcd);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001020 u32 done_map, skip_map;
1021 struct ptd ptd;
1022 struct urb *urb = NULL;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001023 u32 queue_entry;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001024 u32 length;
1025 u32 or_map;
1026 u32 status = -EINVAL;
1027 int error;
1028 struct isp1760_qtd *qtd;
1029 struct isp1760_qh *qh;
1030 u32 rl;
1031 u32 nakcount;
1032
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001033 done_map = reg_read32(hcd->regs, HC_ATL_PTD_DONEMAP_REG);
1034 skip_map = reg_read32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001035
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001036 or_map = reg_read32(hcd->regs, HC_ATL_IRQ_MASK_OR_REG);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001037 or_map &= ~done_map;
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001038 reg_write32(hcd->regs, HC_ATL_IRQ_MASK_OR_REG, or_map);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001039
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001040 while (done_map) {
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001041 status = 0;
Sebastian Andrzej Siewiorb14e8402011-02-08 21:07:40 +01001042 priv->atl_queued--;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001043
1044 queue_entry = __ffs(done_map);
1045 done_map &= ~(1 << queue_entry);
1046 skip_map |= 1 << queue_entry;
1047
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001048 qtd = priv->atl_ints[queue_entry].qtd;
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001049 urb = qtd->urb;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001050 qh = priv->atl_ints[queue_entry].qh;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001051
1052 if (!qh) {
1053 printk(KERN_ERR "qh is 0\n");
1054 continue;
1055 }
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001056 ptd_read(hcd->regs, ATL_PTD_OFFSET, queue_entry, &ptd);
Enrico Scholz3f02a952008-07-17 20:09:30 +02001057
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001058 rl = (ptd.dw2 >> 25) & 0x0f;
1059 nakcount = (ptd.dw3 >> 19) & 0xf;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001060
1061 /* Transfer Error, *but* active and no HALT -> reload */
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001062 if ((ptd.dw3 & DW3_ERROR_BIT) && (ptd.dw3 & DW3_QTD_ACTIVE) &&
1063 !(ptd.dw3 & DW3_HALT_BIT)) {
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001064
1065 /* according to ppriv code, we have to
1066 * reload this one if trasfered bytes != requested bytes
1067 * else act like everything went smooth..
1068 * XXX This just doesn't feel right and hasn't
1069 * triggered so far.
1070 */
1071
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001072 length = PTD_XFERRED_LENGTH(ptd.dw3);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001073 printk(KERN_ERR "Should reload now.... transfered %d "
1074 "of %zu\n", length, qtd->length);
1075 BUG();
1076 }
1077
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001078 if (!nakcount && (ptd.dw3 & DW3_QTD_ACTIVE)) {
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001079 u32 buffstatus;
1080
Colin Tuckleyc0d74142010-01-07 11:22:47 +00001081 /*
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001082 * NAKs are handled in HW by the chip. Usually if the
1083 * device is not able to send data fast enough.
Colin Tuckleyc0d74142010-01-07 11:22:47 +00001084 * This happens mostly on slower hardware.
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001085 */
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001086
1087 /* RL counter = ERR counter */
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001088 ptd.dw3 &= ~(0xf << 19);
1089 ptd.dw3 |= rl << 19;
1090 ptd.dw3 &= ~(3 << (55 - 32));
1091 ptd.dw3 |= ERR_COUNTER << (55 - 32);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001092
1093 /*
1094 * It is not needed to write skip map back because it
1095 * is unchanged. Just make sure that this entry is
1096 * unskipped once it gets written to the HW.
1097 */
1098 skip_map &= ~(1 << queue_entry);
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001099 or_map = reg_read32(hcd->regs, HC_ATL_IRQ_MASK_OR_REG);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001100 or_map |= 1 << queue_entry;
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001101 reg_write32(hcd->regs, HC_ATL_IRQ_MASK_OR_REG, or_map);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001102
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001103 ptd.dw0 |= PTD_VALID;
1104 ptd_write(hcd->regs, ATL_PTD_OFFSET, queue_entry, &ptd);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001105
Sebastian Andrzej Siewiorb14e8402011-02-08 21:07:40 +01001106 priv->atl_queued++;
1107 if (priv->atl_queued == 2)
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001108 reg_write32(hcd->regs, HC_INTERRUPT_ENABLE,
1109 INTERRUPT_ENABLE_SOT_MASK);
Sebastian Andrzej Siewiorb14e8402011-02-08 21:07:40 +01001110
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001111 buffstatus = reg_read32(hcd->regs,
1112 HC_BUFFER_STATUS_REG);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001113 buffstatus |= ATL_BUFFER;
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001114 reg_write32(hcd->regs, HC_BUFFER_STATUS_REG,
1115 buffstatus);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001116 continue;
1117 }
1118
1119 error = check_error(&ptd);
1120 if (error) {
1121 status = error;
1122 priv->atl_ints[queue_entry].qh->toggle = 0;
1123 priv->atl_ints[queue_entry].qh->ping = 0;
1124 urb->status = -EPIPE;
1125
1126#if 0
1127 printk(KERN_ERR "Error in %s().\n", __func__);
1128 printk(KERN_ERR "IN dw0: %08x dw1: %08x dw2: %08x "
1129 "dw3: %08x dw4: %08x dw5: %08x dw6: "
1130 "%08x dw7: %08x\n",
1131 ptd.dw0, ptd.dw1, ptd.dw2, ptd.dw3,
1132 ptd.dw4, ptd.dw5, ptd.dw6, ptd.dw7);
1133#endif
1134 } else {
1135 if (usb_pipetype(urb->pipe) == PIPE_BULK) {
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001136 priv->atl_ints[queue_entry].qh->toggle =
1137 ptd.dw3 & (1 << 25);
1138 priv->atl_ints[queue_entry].qh->ping =
1139 ptd.dw3 & (1 << 26);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001140 }
1141 }
1142
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001143 length = PTD_XFERRED_LENGTH(ptd.dw3);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001144 if (length) {
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001145 switch (DW1_GET_PID(ptd.dw1)) {
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001146 case IN_PID:
Arvid Brodina041d8e2011-02-26 22:04:40 +01001147 mem_reads8(hcd->regs, qtd->payload_addr,
Arvid Brodinbbaa3872011-02-26 22:05:26 +01001148 qtd->data_buffer, length);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001149
1150 case OUT_PID:
1151
1152 urb->actual_length += length;
1153
1154 case SETUP_PID:
1155 break;
1156 }
1157 }
1158
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001159 priv->atl_ints[queue_entry].qtd = NULL;
1160 priv->atl_ints[queue_entry].qh = NULL;
1161
Arvid Brodina041d8e2011-02-26 22:04:40 +01001162 free_mem(priv, qtd);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001163
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001164 reg_write32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG, skip_map);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001165
1166 if (urb->status == -EPIPE) {
1167 /* HALT was received */
1168
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001169 qtd = clean_up_qtdlist(qtd, qh);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001170 isp1760_urb_done(priv, urb, urb->status);
1171
1172 } else if (usb_pipebulk(urb->pipe) && (length < qtd->length)) {
1173 /* short BULK received */
1174
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001175 if (urb->transfer_flags & URB_SHORT_NOT_OK) {
1176 urb->status = -EREMOTEIO;
Sebastian Siewior7839b512008-07-17 20:09:29 +02001177 isp1760_dbg(priv, "short bulk, %d instead %zu "
1178 "with URB_SHORT_NOT_OK flag.\n",
1179 length, qtd->length);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001180 }
1181
1182 if (urb->status == -EINPROGRESS)
1183 urb->status = 0;
1184
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001185 qtd = clean_up_qtdlist(qtd, qh);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001186
1187 isp1760_urb_done(priv, urb, urb->status);
1188
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001189 } else if (last_qtd_of_urb(qtd, qh)) {
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001190 /* that was the last qtd of that URB */
1191
1192 if (urb->status == -EINPROGRESS)
1193 urb->status = 0;
1194
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001195 qtd = clean_this_qtd(qtd, qh);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001196 isp1760_urb_done(priv, urb, urb->status);
1197
1198 } else {
1199 /* next QTD of this URB */
1200
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001201 qtd = clean_this_qtd(qtd, qh);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001202 BUG_ON(!qtd);
1203 }
1204
1205 if (qtd)
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001206 enqueue_an_ATL_packet(hcd, qh, qtd);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001207
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001208 skip_map = reg_read32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001209 }
Sebastian Andrzej Siewiorb14e8402011-02-08 21:07:40 +01001210 if (priv->atl_queued <= 1)
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001211 reg_write32(hcd->regs, HC_INTERRUPT_ENABLE,
1212 INTERRUPT_ENABLE_MASK);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001213}
1214
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001215static void do_intl_int(struct usb_hcd *hcd)
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001216{
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001217 struct isp1760_hcd *priv = hcd_to_priv(hcd);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001218 u32 done_map, skip_map;
1219 struct ptd ptd;
1220 struct urb *urb = NULL;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001221 u32 length;
1222 u32 or_map;
1223 int error;
1224 u32 queue_entry;
1225 struct isp1760_qtd *qtd;
1226 struct isp1760_qh *qh;
1227
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001228 done_map = reg_read32(hcd->regs, HC_INT_PTD_DONEMAP_REG);
1229 skip_map = reg_read32(hcd->regs, HC_INT_PTD_SKIPMAP_REG);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001230
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001231 or_map = reg_read32(hcd->regs, HC_INT_IRQ_MASK_OR_REG);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001232 or_map &= ~done_map;
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001233 reg_write32(hcd->regs, HC_INT_IRQ_MASK_OR_REG, or_map);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001234
1235 while (done_map) {
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001236 queue_entry = __ffs(done_map);
1237 done_map &= ~(1 << queue_entry);
1238 skip_map |= 1 << queue_entry;
1239
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001240 qtd = priv->int_ints[queue_entry].qtd;
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001241 urb = qtd->urb;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001242 qh = priv->int_ints[queue_entry].qh;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001243
1244 if (!qh) {
1245 printk(KERN_ERR "(INT) qh is 0\n");
1246 continue;
1247 }
1248
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001249 ptd_read(hcd->regs, INT_PTD_OFFSET, queue_entry, &ptd);
1250 check_int_err_status(ptd.dw4);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001251
1252 error = check_error(&ptd);
1253 if (error) {
1254#if 0
1255 printk(KERN_ERR "Error in %s().\n", __func__);
1256 printk(KERN_ERR "IN dw0: %08x dw1: %08x dw2: %08x "
1257 "dw3: %08x dw4: %08x dw5: %08x dw6: "
1258 "%08x dw7: %08x\n",
1259 ptd.dw0, ptd.dw1, ptd.dw2, ptd.dw3,
1260 ptd.dw4, ptd.dw5, ptd.dw6, ptd.dw7);
1261#endif
1262 urb->status = -EPIPE;
1263 priv->int_ints[queue_entry].qh->toggle = 0;
1264 priv->int_ints[queue_entry].qh->ping = 0;
1265
1266 } else {
1267 priv->int_ints[queue_entry].qh->toggle =
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001268 ptd.dw3 & (1 << 25);
1269 priv->int_ints[queue_entry].qh->ping =
1270 ptd.dw3 & (1 << 26);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001271 }
1272
1273 if (urb->dev->speed != USB_SPEED_HIGH)
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001274 length = PTD_XFERRED_LENGTH_LO(ptd.dw3);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001275 else
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001276 length = PTD_XFERRED_LENGTH(ptd.dw3);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001277
1278 if (length) {
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001279 switch (DW1_GET_PID(ptd.dw1)) {
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001280 case IN_PID:
Arvid Brodina041d8e2011-02-26 22:04:40 +01001281 mem_reads8(hcd->regs, qtd->payload_addr,
Arvid Brodinbbaa3872011-02-26 22:05:26 +01001282 qtd->data_buffer, length);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001283 case OUT_PID:
1284
1285 urb->actual_length += length;
1286
1287 case SETUP_PID:
1288 break;
1289 }
1290 }
1291
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001292 priv->int_ints[queue_entry].qtd = NULL;
1293 priv->int_ints[queue_entry].qh = NULL;
1294
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001295 reg_write32(hcd->regs, HC_INT_PTD_SKIPMAP_REG, skip_map);
Arvid Brodina041d8e2011-02-26 22:04:40 +01001296 free_mem(priv, qtd);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001297
1298 if (urb->status == -EPIPE) {
1299 /* HALT received */
1300
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001301 qtd = clean_up_qtdlist(qtd, qh);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001302 isp1760_urb_done(priv, urb, urb->status);
1303
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001304 } else if (last_qtd_of_urb(qtd, qh)) {
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001305
1306 if (urb->status == -EINPROGRESS)
1307 urb->status = 0;
1308
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001309 qtd = clean_this_qtd(qtd, qh);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001310 isp1760_urb_done(priv, urb, urb->status);
1311
1312 } else {
1313 /* next QTD of this URB */
1314
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001315 qtd = clean_this_qtd(qtd, qh);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001316 BUG_ON(!qtd);
1317 }
1318
1319 if (qtd)
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001320 enqueue_an_INT_packet(hcd, qh, qtd);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001321
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001322 skip_map = reg_read32(hcd->regs, HC_INT_PTD_SKIPMAP_REG);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001323 }
1324}
1325
1326#define max_packet(wMaxPacketSize) ((wMaxPacketSize) & 0x07ff)
1327static struct isp1760_qh *qh_make(struct isp1760_hcd *priv, struct urb *urb,
1328 gfp_t flags)
1329{
1330 struct isp1760_qh *qh;
1331 int is_input, type;
1332
1333 qh = isp1760_qh_alloc(priv, flags);
1334 if (!qh)
1335 return qh;
1336
1337 /*
1338 * init endpoint/device data for this QH
1339 */
1340 is_input = usb_pipein(urb->pipe);
1341 type = usb_pipetype(urb->pipe);
1342
1343 if (type == PIPE_INTERRUPT) {
1344
1345 if (urb->dev->speed == USB_SPEED_HIGH) {
1346
1347 qh->period = urb->interval >> 3;
1348 if (qh->period == 0 && urb->interval != 1) {
1349 /* NOTE interval 2 or 4 uframes could work.
1350 * But interval 1 scheduling is simpler, and
1351 * includes high bandwidth.
1352 */
1353 printk(KERN_ERR "intr period %d uframes, NYET!",
1354 urb->interval);
1355 qh_destroy(qh);
1356 return NULL;
1357 }
1358 } else {
1359 qh->period = urb->interval;
1360 }
1361 }
1362
1363 /* support for tt scheduling, and access to toggles */
1364 qh->dev = urb->dev;
1365
1366 if (!usb_pipecontrol(urb->pipe))
1367 usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe), !is_input,
1368 1);
1369 return qh;
1370}
1371
1372/*
1373 * For control/bulk/interrupt, return QH with these TDs appended.
1374 * Allocates and initializes the QH if necessary.
1375 * Returns null if it can't allocate a QH it needs to.
1376 * If the QH has TDs (urbs) already, that's great.
1377 */
1378static struct isp1760_qh *qh_append_tds(struct isp1760_hcd *priv,
1379 struct urb *urb, struct list_head *qtd_list, int epnum,
1380 void **ptr)
1381{
1382 struct isp1760_qh *qh;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001383
1384 qh = (struct isp1760_qh *)*ptr;
1385 if (!qh) {
1386 /* can't sleep here, we have priv->lock... */
1387 qh = qh_make(priv, urb, GFP_ATOMIC);
1388 if (!qh)
1389 return qh;
1390 *ptr = qh;
1391 }
1392
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001393 list_splice(qtd_list, qh->qtd_list.prev);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001394
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001395 return qh;
1396}
1397
1398static void qtd_list_free(struct isp1760_hcd *priv, struct urb *urb,
1399 struct list_head *qtd_list)
1400{
1401 struct list_head *entry, *temp;
1402
1403 list_for_each_safe(entry, temp, qtd_list) {
1404 struct isp1760_qtd *qtd;
1405
1406 qtd = list_entry(entry, struct isp1760_qtd, qtd_list);
1407 list_del(&qtd->qtd_list);
1408 isp1760_qtd_free(qtd);
1409 }
1410}
1411
1412static int isp1760_prepare_enqueue(struct isp1760_hcd *priv, struct urb *urb,
1413 struct list_head *qtd_list, gfp_t mem_flags, packet_enqueue *p)
1414{
1415 struct isp1760_qtd *qtd;
1416 int epnum;
1417 unsigned long flags;
1418 struct isp1760_qh *qh = NULL;
1419 int rc;
1420 int qh_busy;
1421
1422 qtd = list_entry(qtd_list->next, struct isp1760_qtd, qtd_list);
1423 epnum = urb->ep->desc.bEndpointAddress;
1424
1425 spin_lock_irqsave(&priv->lock, flags);
Alan Stern541c7d42010-06-22 16:39:10 -04001426 if (!HCD_HW_ACCESSIBLE(priv_to_hcd(priv))) {
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001427 rc = -ESHUTDOWN;
1428 goto done;
1429 }
1430 rc = usb_hcd_link_urb_to_ep(priv_to_hcd(priv), urb);
1431 if (rc)
1432 goto done;
1433
1434 qh = urb->ep->hcpriv;
1435 if (qh)
1436 qh_busy = !list_empty(&qh->qtd_list);
1437 else
1438 qh_busy = 0;
1439
1440 qh = qh_append_tds(priv, urb, qtd_list, epnum, &urb->ep->hcpriv);
1441 if (!qh) {
1442 usb_hcd_unlink_urb_from_ep(priv_to_hcd(priv), urb);
1443 rc = -ENOMEM;
1444 goto done;
1445 }
1446
1447 if (!qh_busy)
1448 p(priv_to_hcd(priv), qh, qtd);
1449
1450done:
1451 spin_unlock_irqrestore(&priv->lock, flags);
1452 if (!qh)
1453 qtd_list_free(priv, urb, qtd_list);
1454 return rc;
1455}
1456
1457static struct isp1760_qtd *isp1760_qtd_alloc(struct isp1760_hcd *priv,
1458 gfp_t flags)
1459{
1460 struct isp1760_qtd *qtd;
1461
1462 qtd = kmem_cache_zalloc(qtd_cachep, flags);
1463 if (qtd)
1464 INIT_LIST_HEAD(&qtd->qtd_list);
1465
1466 return qtd;
1467}
1468
1469/*
1470 * create a list of filled qtds for this URB; won't link into qh.
1471 */
1472static struct list_head *qh_urb_transaction(struct isp1760_hcd *priv,
1473 struct urb *urb, struct list_head *head, gfp_t flags)
1474{
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001475 struct isp1760_qtd *qtd;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001476 void *buf;
1477 int len, maxpacket;
1478 int is_input;
1479 u32 token;
1480
1481 /*
1482 * URBs map to sequences of QTDs: one logical transaction
1483 */
1484 qtd = isp1760_qtd_alloc(priv, flags);
1485 if (!qtd)
1486 return NULL;
1487
1488 list_add_tail(&qtd->qtd_list, head);
1489 qtd->urb = urb;
1490 urb->status = -EINPROGRESS;
1491
1492 token = 0;
1493 /* for split transactions, SplitXState initialized to zero */
1494
1495 len = urb->transfer_buffer_length;
1496 is_input = usb_pipein(urb->pipe);
1497 if (usb_pipecontrol(urb->pipe)) {
1498 /* SETUP pid */
1499 qtd_fill(qtd, urb->setup_packet,
1500 sizeof(struct usb_ctrlrequest),
1501 token | SETUP_PID);
1502
1503 /* ... and always at least one more pid */
1504 token ^= DATA_TOGGLE;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001505 qtd = isp1760_qtd_alloc(priv, flags);
1506 if (!qtd)
1507 goto cleanup;
1508 qtd->urb = urb;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001509 list_add_tail(&qtd->qtd_list, head);
1510
1511 /* for zero length DATA stages, STATUS is always IN */
1512 if (len == 0)
1513 token |= IN_PID;
1514 }
1515
1516 /*
1517 * data transfer stage: buffer setup
1518 */
1519 buf = urb->transfer_buffer;
1520
1521 if (is_input)
1522 token |= IN_PID;
1523 else
1524 token |= OUT_PID;
1525
1526 maxpacket = max_packet(usb_maxpacket(urb->dev, urb->pipe, !is_input));
1527
1528 /*
1529 * buffer gets wrapped in one or more qtds;
1530 * last one may be "short" (including zero len)
1531 * and may serve as a control status ack
1532 */
1533 for (;;) {
1534 int this_qtd_len;
1535
1536 if (!buf && len) {
1537 /* XXX This looks like usb storage / SCSI bug */
1538 printk(KERN_ERR "buf is null, dma is %08lx len is %d\n",
1539 (long unsigned)urb->transfer_dma, len);
1540 WARN_ON(1);
1541 }
1542
1543 this_qtd_len = qtd_fill(qtd, buf, len, token);
1544 len -= this_qtd_len;
1545 buf += this_qtd_len;
1546
1547 /* qh makes control packets use qtd toggle; maybe switch it */
1548 if ((maxpacket & (this_qtd_len + (maxpacket - 1))) == 0)
1549 token ^= DATA_TOGGLE;
1550
1551 if (len <= 0)
1552 break;
1553
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001554 qtd = isp1760_qtd_alloc(priv, flags);
1555 if (!qtd)
1556 goto cleanup;
1557 qtd->urb = urb;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001558 list_add_tail(&qtd->qtd_list, head);
1559 }
1560
1561 /*
1562 * control requests may need a terminating data "status" ack;
1563 * bulk ones may need a terminating short packet (zero length).
1564 */
1565 if (urb->transfer_buffer_length != 0) {
1566 int one_more = 0;
1567
1568 if (usb_pipecontrol(urb->pipe)) {
1569 one_more = 1;
1570 /* "in" <--> "out" */
1571 token ^= IN_PID;
1572 /* force DATA1 */
1573 token |= DATA_TOGGLE;
1574 } else if (usb_pipebulk(urb->pipe)
1575 && (urb->transfer_flags & URB_ZERO_PACKET)
1576 && !(urb->transfer_buffer_length % maxpacket)) {
1577 one_more = 1;
1578 }
1579 if (one_more) {
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001580 qtd = isp1760_qtd_alloc(priv, flags);
1581 if (!qtd)
1582 goto cleanup;
1583 qtd->urb = urb;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001584 list_add_tail(&qtd->qtd_list, head);
1585
1586 /* never any data in such packets */
1587 qtd_fill(qtd, NULL, 0, token);
1588 }
1589 }
1590
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001591 qtd->status = 0;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001592 return head;
1593
1594cleanup:
1595 qtd_list_free(priv, urb, head);
1596 return NULL;
1597}
1598
1599static int isp1760_urb_enqueue(struct usb_hcd *hcd, struct urb *urb,
1600 gfp_t mem_flags)
1601{
1602 struct isp1760_hcd *priv = hcd_to_priv(hcd);
1603 struct list_head qtd_list;
1604 packet_enqueue *pe;
1605
1606 INIT_LIST_HEAD(&qtd_list);
1607
1608 switch (usb_pipetype(urb->pipe)) {
1609 case PIPE_CONTROL:
1610 case PIPE_BULK:
1611
1612 if (!qh_urb_transaction(priv, urb, &qtd_list, mem_flags))
1613 return -ENOMEM;
1614 pe = enqueue_an_ATL_packet;
1615 break;
1616
1617 case PIPE_INTERRUPT:
1618 if (!qh_urb_transaction(priv, urb, &qtd_list, mem_flags))
1619 return -ENOMEM;
1620 pe = enqueue_an_INT_packet;
1621 break;
1622
1623 case PIPE_ISOCHRONOUS:
1624 printk(KERN_ERR "PIPE_ISOCHRONOUS ain't supported\n");
1625 default:
1626 return -EPIPE;
1627 }
1628
Sebastian Siewiora36c27d2008-07-17 20:09:28 +02001629 return isp1760_prepare_enqueue(priv, urb, &qtd_list, mem_flags, pe);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001630}
1631
1632static int isp1760_urb_dequeue(struct usb_hcd *hcd, struct urb *urb,
1633 int status)
1634{
1635 struct isp1760_hcd *priv = hcd_to_priv(hcd);
1636 struct inter_packet_info *ints;
1637 u32 i;
1638 u32 reg_base, or_reg, skip_reg;
Andrew Mortond249afd2008-06-09 16:39:52 -07001639 unsigned long flags;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001640 struct ptd ptd;
Warren Free0afb20e2009-05-08 10:27:08 +02001641 packet_enqueue *pe;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001642
1643 switch (usb_pipetype(urb->pipe)) {
1644 case PIPE_ISOCHRONOUS:
1645 return -EPIPE;
1646 break;
1647
1648 case PIPE_INTERRUPT:
1649 ints = priv->int_ints;
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001650 reg_base = INT_PTD_OFFSET;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001651 or_reg = HC_INT_IRQ_MASK_OR_REG;
1652 skip_reg = HC_INT_PTD_SKIPMAP_REG;
Warren Free0afb20e2009-05-08 10:27:08 +02001653 pe = enqueue_an_INT_packet;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001654 break;
1655
1656 default:
1657 ints = priv->atl_ints;
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001658 reg_base = ATL_PTD_OFFSET;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001659 or_reg = HC_ATL_IRQ_MASK_OR_REG;
1660 skip_reg = HC_ATL_PTD_SKIPMAP_REG;
Warren Free0afb20e2009-05-08 10:27:08 +02001661 pe = enqueue_an_ATL_packet;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001662 break;
1663 }
1664
1665 memset(&ptd, 0, sizeof(ptd));
1666 spin_lock_irqsave(&priv->lock, flags);
1667
1668 for (i = 0; i < 32; i++) {
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001669 if (!ints[i].qh)
1670 continue;
1671 BUG_ON(!ints[i].qtd);
1672
1673 if (ints[i].qtd->urb == urb) {
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001674 u32 skip_map;
1675 u32 or_map;
1676 struct isp1760_qtd *qtd;
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001677 struct isp1760_qh *qh;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001678
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001679 skip_map = reg_read32(hcd->regs, skip_reg);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001680 skip_map |= 1 << i;
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001681 reg_write32(hcd->regs, skip_reg, skip_map);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001682
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001683 or_map = reg_read32(hcd->regs, or_reg);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001684 or_map &= ~(1 << i);
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001685 reg_write32(hcd->regs, or_reg, or_map);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001686
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001687 ptd_write(hcd->regs, reg_base, i, &ptd);
1688
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001689 qtd = ints->qtd;
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001690 qh = ints[i].qh;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001691
Arvid Brodina041d8e2011-02-26 22:04:40 +01001692 free_mem(priv, qtd);
1693 qtd = clean_up_qtdlist(qtd, qh);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001694
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001695 ints->qh = NULL;
1696 ints->qtd = NULL;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001697
1698 isp1760_urb_done(priv, urb, status);
Warren Free0afb20e2009-05-08 10:27:08 +02001699 if (qtd)
1700 pe(hcd, qh, qtd);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001701 break;
Warren Free0afb20e2009-05-08 10:27:08 +02001702
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001703 } else {
1704 struct isp1760_qtd *qtd;
Warren Free0afb20e2009-05-08 10:27:08 +02001705
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001706 list_for_each_entry(qtd, &ints[i].qtd->qtd_list,
1707 qtd_list) {
Warren Free0afb20e2009-05-08 10:27:08 +02001708 if (qtd->urb == urb) {
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001709 clean_up_qtdlist(qtd, ints[i].qh);
Warren Free0afb20e2009-05-08 10:27:08 +02001710 isp1760_urb_done(priv, urb, status);
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001711 qtd = NULL;
Warren Free0afb20e2009-05-08 10:27:08 +02001712 break;
1713 }
Warren Free0afb20e2009-05-08 10:27:08 +02001714 }
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001715
1716 /* We found the urb before the last slot */
1717 if (!qtd)
Warren Free0afb20e2009-05-08 10:27:08 +02001718 break;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001719 }
1720 ints++;
1721 }
1722
1723 spin_unlock_irqrestore(&priv->lock, flags);
1724 return 0;
1725}
1726
1727static irqreturn_t isp1760_irq(struct usb_hcd *usb_hcd)
1728{
1729 struct isp1760_hcd *priv = hcd_to_priv(usb_hcd);
1730 u32 imask;
1731 irqreturn_t irqret = IRQ_NONE;
1732
1733 spin_lock(&priv->lock);
1734
1735 if (!(usb_hcd->state & HC_STATE_RUNNING))
1736 goto leave;
1737
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001738 imask = reg_read32(usb_hcd->regs, HC_INTERRUPT_REG);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001739 if (unlikely(!imask))
1740 goto leave;
1741
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001742 reg_write32(usb_hcd->regs, HC_INTERRUPT_REG, imask);
Sebastian Andrzej Siewiorb14e8402011-02-08 21:07:40 +01001743 if (imask & (HC_ATL_INT | HC_SOT_INT))
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001744 do_atl_int(usb_hcd);
1745
1746 if (imask & HC_INTL_INT)
1747 do_intl_int(usb_hcd);
1748
1749 irqret = IRQ_HANDLED;
1750leave:
1751 spin_unlock(&priv->lock);
1752 return irqret;
1753}
1754
1755static int isp1760_hub_status_data(struct usb_hcd *hcd, char *buf)
1756{
1757 struct isp1760_hcd *priv = hcd_to_priv(hcd);
1758 u32 temp, status = 0;
1759 u32 mask;
1760 int retval = 1;
1761 unsigned long flags;
1762
1763 /* if !USB_SUSPEND, root hub timers won't get shut down ... */
1764 if (!HC_IS_RUNNING(hcd->state))
1765 return 0;
1766
1767 /* init status to no-changes */
1768 buf[0] = 0;
1769 mask = PORT_CSC;
1770
1771 spin_lock_irqsave(&priv->lock, flags);
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001772 temp = reg_read32(hcd->regs, HC_PORTSC1);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001773
1774 if (temp & PORT_OWNER) {
1775 if (temp & PORT_CSC) {
1776 temp &= ~PORT_CSC;
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001777 reg_write32(hcd->regs, HC_PORTSC1, temp);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001778 goto done;
1779 }
1780 }
1781
1782 /*
1783 * Return status information even for ports with OWNER set.
1784 * Otherwise khubd wouldn't see the disconnect event when a
1785 * high-speed device is switched over to the companion
1786 * controller by the user.
1787 */
1788
1789 if ((temp & mask) != 0
1790 || ((temp & PORT_RESUME) != 0
1791 && time_after_eq(jiffies,
1792 priv->reset_done))) {
1793 buf [0] |= 1 << (0 + 1);
1794 status = STS_PCD;
1795 }
1796 /* FIXME autosuspend idle root hubs */
1797done:
1798 spin_unlock_irqrestore(&priv->lock, flags);
1799 return status ? retval : 0;
1800}
1801
1802static void isp1760_hub_descriptor(struct isp1760_hcd *priv,
1803 struct usb_hub_descriptor *desc)
1804{
1805 int ports = HCS_N_PORTS(priv->hcs_params);
1806 u16 temp;
1807
1808 desc->bDescriptorType = 0x29;
1809 /* priv 1.0, 2.3.9 says 20ms max */
1810 desc->bPwrOn2PwrGood = 10;
1811 desc->bHubContrCurrent = 0;
1812
1813 desc->bNbrPorts = ports;
1814 temp = 1 + (ports / 8);
1815 desc->bDescLength = 7 + 2 * temp;
1816
1817 /* two bitmaps: ports removable, and usb 1.0 legacy PortPwrCtrlMask */
1818 memset(&desc->bitmap[0], 0, temp);
1819 memset(&desc->bitmap[temp], 0xff, temp);
1820
1821 /* per-port overcurrent reporting */
1822 temp = 0x0008;
1823 if (HCS_PPC(priv->hcs_params))
1824 /* per-port power control */
1825 temp |= 0x0001;
1826 else
1827 /* no power switching */
1828 temp |= 0x0002;
1829 desc->wHubCharacteristics = cpu_to_le16(temp);
1830}
1831
1832#define PORT_WAKE_BITS (PORT_WKOC_E|PORT_WKDISC_E|PORT_WKCONN_E)
1833
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001834static int check_reset_complete(struct usb_hcd *hcd, int index,
1835 int port_status)
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001836{
1837 if (!(port_status & PORT_CONNECT))
1838 return port_status;
1839
1840 /* if reset finished and it's still not enabled -- handoff */
1841 if (!(port_status & PORT_PE)) {
1842
1843 printk(KERN_ERR "port %d full speed --> companion\n",
1844 index + 1);
1845
1846 port_status |= PORT_OWNER;
1847 port_status &= ~PORT_RWC_BITS;
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001848 reg_write32(hcd->regs, HC_PORTSC1, port_status);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001849
1850 } else
1851 printk(KERN_ERR "port %d high speed\n", index + 1);
1852
1853 return port_status;
1854}
1855
1856static int isp1760_hub_control(struct usb_hcd *hcd, u16 typeReq,
1857 u16 wValue, u16 wIndex, char *buf, u16 wLength)
1858{
1859 struct isp1760_hcd *priv = hcd_to_priv(hcd);
1860 int ports = HCS_N_PORTS(priv->hcs_params);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001861 u32 temp, status;
1862 unsigned long flags;
1863 int retval = 0;
1864 unsigned selector;
1865
1866 /*
1867 * FIXME: support SetPortFeatures USB_PORT_FEAT_INDICATOR.
1868 * HCS_INDICATOR may say we can change LEDs to off/amber/green.
1869 * (track current state ourselves) ... blink for diagnostics,
1870 * power, "this is the one", etc. EHCI spec supports this.
1871 */
1872
1873 spin_lock_irqsave(&priv->lock, flags);
1874 switch (typeReq) {
1875 case ClearHubFeature:
1876 switch (wValue) {
1877 case C_HUB_LOCAL_POWER:
1878 case C_HUB_OVER_CURRENT:
1879 /* no hub-wide feature/status flags */
1880 break;
1881 default:
1882 goto error;
1883 }
1884 break;
1885 case ClearPortFeature:
1886 if (!wIndex || wIndex > ports)
1887 goto error;
1888 wIndex--;
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001889 temp = reg_read32(hcd->regs, HC_PORTSC1);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001890
1891 /*
1892 * Even if OWNER is set, so the port is owned by the
1893 * companion controller, khubd needs to be able to clear
1894 * the port-change status bits (especially
Alan Stern749da5f2010-03-04 17:05:08 -05001895 * USB_PORT_STAT_C_CONNECTION).
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001896 */
1897
1898 switch (wValue) {
1899 case USB_PORT_FEAT_ENABLE:
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001900 reg_write32(hcd->regs, HC_PORTSC1, temp & ~PORT_PE);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001901 break;
1902 case USB_PORT_FEAT_C_ENABLE:
1903 /* XXX error? */
1904 break;
1905 case USB_PORT_FEAT_SUSPEND:
1906 if (temp & PORT_RESET)
1907 goto error;
1908
1909 if (temp & PORT_SUSPEND) {
1910 if ((temp & PORT_PE) == 0)
1911 goto error;
1912 /* resume signaling for 20 msec */
1913 temp &= ~(PORT_RWC_BITS);
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001914 reg_write32(hcd->regs, HC_PORTSC1,
1915 temp | PORT_RESUME);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001916 priv->reset_done = jiffies +
1917 msecs_to_jiffies(20);
1918 }
1919 break;
1920 case USB_PORT_FEAT_C_SUSPEND:
1921 /* we auto-clear this feature */
1922 break;
1923 case USB_PORT_FEAT_POWER:
1924 if (HCS_PPC(priv->hcs_params))
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001925 reg_write32(hcd->regs, HC_PORTSC1,
1926 temp & ~PORT_POWER);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001927 break;
1928 case USB_PORT_FEAT_C_CONNECTION:
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001929 reg_write32(hcd->regs, HC_PORTSC1, temp | PORT_CSC);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001930 break;
1931 case USB_PORT_FEAT_C_OVER_CURRENT:
1932 /* XXX error ?*/
1933 break;
1934 case USB_PORT_FEAT_C_RESET:
1935 /* GetPortStatus clears reset */
1936 break;
1937 default:
1938 goto error;
1939 }
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001940 reg_read32(hcd->regs, HC_USBCMD);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001941 break;
1942 case GetHubDescriptor:
1943 isp1760_hub_descriptor(priv, (struct usb_hub_descriptor *)
1944 buf);
1945 break;
1946 case GetHubStatus:
1947 /* no hub-wide feature/status flags */
1948 memset(buf, 0, 4);
1949 break;
1950 case GetPortStatus:
1951 if (!wIndex || wIndex > ports)
1952 goto error;
1953 wIndex--;
1954 status = 0;
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001955 temp = reg_read32(hcd->regs, HC_PORTSC1);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001956
1957 /* wPortChange bits */
1958 if (temp & PORT_CSC)
Alan Stern749da5f2010-03-04 17:05:08 -05001959 status |= USB_PORT_STAT_C_CONNECTION << 16;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001960
1961
1962 /* whoever resumes must GetPortStatus to complete it!! */
1963 if (temp & PORT_RESUME) {
1964 printk(KERN_ERR "Port resume should be skipped.\n");
1965
1966 /* Remote Wakeup received? */
1967 if (!priv->reset_done) {
1968 /* resume signaling for 20 msec */
1969 priv->reset_done = jiffies
1970 + msecs_to_jiffies(20);
1971 /* check the port again */
1972 mod_timer(&priv_to_hcd(priv)->rh_timer,
1973 priv->reset_done);
1974 }
1975
1976 /* resume completed? */
1977 else if (time_after_eq(jiffies,
1978 priv->reset_done)) {
Alan Stern749da5f2010-03-04 17:05:08 -05001979 status |= USB_PORT_STAT_C_SUSPEND << 16;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001980 priv->reset_done = 0;
1981
1982 /* stop resume signaling */
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001983 temp = reg_read32(hcd->regs, HC_PORTSC1);
1984 reg_write32(hcd->regs, HC_PORTSC1,
1985 temp & ~(PORT_RWC_BITS | PORT_RESUME));
1986 retval = handshake(hcd, HC_PORTSC1,
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001987 PORT_RESUME, 0, 2000 /* 2msec */);
1988 if (retval != 0) {
1989 isp1760_err(priv,
1990 "port %d resume error %d\n",
1991 wIndex + 1, retval);
1992 goto error;
1993 }
1994 temp &= ~(PORT_SUSPEND|PORT_RESUME|(3<<10));
1995 }
1996 }
1997
1998 /* whoever resets must GetPortStatus to complete it!! */
1999 if ((temp & PORT_RESET)
2000 && time_after_eq(jiffies,
2001 priv->reset_done)) {
Alan Stern749da5f2010-03-04 17:05:08 -05002002 status |= USB_PORT_STAT_C_RESET << 16;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002003 priv->reset_done = 0;
2004
2005 /* force reset to complete */
Arvid Brodinbedc0c32011-02-26 22:02:57 +01002006 reg_write32(hcd->regs, HC_PORTSC1, temp & ~PORT_RESET);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002007 /* REVISIT: some hardware needs 550+ usec to clear
2008 * this bit; seems too long to spin routinely...
2009 */
Arvid Brodinbedc0c32011-02-26 22:02:57 +01002010 retval = handshake(hcd, HC_PORTSC1,
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002011 PORT_RESET, 0, 750);
2012 if (retval != 0) {
2013 isp1760_err(priv, "port %d reset error %d\n",
2014 wIndex + 1, retval);
2015 goto error;
2016 }
2017
2018 /* see what we found out */
Arvid Brodinbedc0c32011-02-26 22:02:57 +01002019 temp = check_reset_complete(hcd, wIndex,
2020 reg_read32(hcd->regs, HC_PORTSC1));
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002021 }
2022 /*
2023 * Even if OWNER is set, there's no harm letting khubd
2024 * see the wPortStatus values (they should all be 0 except
2025 * for PORT_POWER anyway).
2026 */
2027
2028 if (temp & PORT_OWNER)
2029 printk(KERN_ERR "Warning: PORT_OWNER is set\n");
2030
2031 if (temp & PORT_CONNECT) {
Alan Stern749da5f2010-03-04 17:05:08 -05002032 status |= USB_PORT_STAT_CONNECTION;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002033 /* status may be from integrated TT */
2034 status |= ehci_port_speed(priv, temp);
2035 }
2036 if (temp & PORT_PE)
Alan Stern749da5f2010-03-04 17:05:08 -05002037 status |= USB_PORT_STAT_ENABLE;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002038 if (temp & (PORT_SUSPEND|PORT_RESUME))
Alan Stern749da5f2010-03-04 17:05:08 -05002039 status |= USB_PORT_STAT_SUSPEND;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002040 if (temp & PORT_RESET)
Alan Stern749da5f2010-03-04 17:05:08 -05002041 status |= USB_PORT_STAT_RESET;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002042 if (temp & PORT_POWER)
Alan Stern749da5f2010-03-04 17:05:08 -05002043 status |= USB_PORT_STAT_POWER;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002044
2045 put_unaligned(cpu_to_le32(status), (__le32 *) buf);
2046 break;
2047 case SetHubFeature:
2048 switch (wValue) {
2049 case C_HUB_LOCAL_POWER:
2050 case C_HUB_OVER_CURRENT:
2051 /* no hub-wide feature/status flags */
2052 break;
2053 default:
2054 goto error;
2055 }
2056 break;
2057 case SetPortFeature:
2058 selector = wIndex >> 8;
2059 wIndex &= 0xff;
2060 if (!wIndex || wIndex > ports)
2061 goto error;
2062 wIndex--;
Arvid Brodinbedc0c32011-02-26 22:02:57 +01002063 temp = reg_read32(hcd->regs, HC_PORTSC1);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002064 if (temp & PORT_OWNER)
2065 break;
2066
2067/* temp &= ~PORT_RWC_BITS; */
2068 switch (wValue) {
2069 case USB_PORT_FEAT_ENABLE:
Arvid Brodinbedc0c32011-02-26 22:02:57 +01002070 reg_write32(hcd->regs, HC_PORTSC1, temp | PORT_PE);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002071 break;
2072
2073 case USB_PORT_FEAT_SUSPEND:
2074 if ((temp & PORT_PE) == 0
2075 || (temp & PORT_RESET) != 0)
2076 goto error;
2077
Arvid Brodinbedc0c32011-02-26 22:02:57 +01002078 reg_write32(hcd->regs, HC_PORTSC1, temp | PORT_SUSPEND);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002079 break;
2080 case USB_PORT_FEAT_POWER:
2081 if (HCS_PPC(priv->hcs_params))
Arvid Brodinbedc0c32011-02-26 22:02:57 +01002082 reg_write32(hcd->regs, HC_PORTSC1,
2083 temp | PORT_POWER);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002084 break;
2085 case USB_PORT_FEAT_RESET:
2086 if (temp & PORT_RESUME)
2087 goto error;
2088 /* line status bits may report this as low speed,
2089 * which can be fine if this root hub has a
2090 * transaction translator built in.
2091 */
2092 if ((temp & (PORT_PE|PORT_CONNECT)) == PORT_CONNECT
2093 && PORT_USB11(temp)) {
2094 temp |= PORT_OWNER;
2095 } else {
2096 temp |= PORT_RESET;
2097 temp &= ~PORT_PE;
2098
2099 /*
2100 * caller must wait, then call GetPortStatus
2101 * usb 2.0 spec says 50 ms resets on root
2102 */
2103 priv->reset_done = jiffies +
2104 msecs_to_jiffies(50);
2105 }
Arvid Brodinbedc0c32011-02-26 22:02:57 +01002106 reg_write32(hcd->regs, HC_PORTSC1, temp);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002107 break;
2108 default:
2109 goto error;
2110 }
Arvid Brodinbedc0c32011-02-26 22:02:57 +01002111 reg_read32(hcd->regs, HC_USBCMD);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002112 break;
2113
2114 default:
2115error:
2116 /* "stall" on error */
2117 retval = -EPIPE;
2118 }
2119 spin_unlock_irqrestore(&priv->lock, flags);
2120 return retval;
2121}
2122
2123static void isp1760_endpoint_disable(struct usb_hcd *usb_hcd,
2124 struct usb_host_endpoint *ep)
2125{
2126 struct isp1760_hcd *priv = hcd_to_priv(usb_hcd);
2127 struct isp1760_qh *qh;
2128 struct isp1760_qtd *qtd;
Andrew Mortond249afd2008-06-09 16:39:52 -07002129 unsigned long flags;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002130
2131 spin_lock_irqsave(&priv->lock, flags);
2132 qh = ep->hcpriv;
2133 if (!qh)
2134 goto out;
2135
2136 ep->hcpriv = NULL;
2137 do {
2138 /* more than entry might get removed */
2139 if (list_empty(&qh->qtd_list))
2140 break;
2141
2142 qtd = list_first_entry(&qh->qtd_list, struct isp1760_qtd,
2143 qtd_list);
2144
2145 if (qtd->status & URB_ENQUEUED) {
2146
2147 spin_unlock_irqrestore(&priv->lock, flags);
2148 isp1760_urb_dequeue(usb_hcd, qtd->urb, -ECONNRESET);
2149 spin_lock_irqsave(&priv->lock, flags);
2150 } else {
2151 struct urb *urb;
2152
2153 urb = qtd->urb;
Arvid Brodinfd436ae2011-02-26 22:03:49 +01002154 clean_up_qtdlist(qtd, qh);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002155 isp1760_urb_done(priv, urb, -ECONNRESET);
2156 }
2157 } while (1);
2158
2159 qh_destroy(qh);
2160 /* remove requests and leak them.
2161 * ATL are pretty fast done, INT could take a while...
2162 * The latter shoule be removed
2163 */
2164out:
2165 spin_unlock_irqrestore(&priv->lock, flags);
2166}
2167
2168static int isp1760_get_frame(struct usb_hcd *hcd)
2169{
2170 struct isp1760_hcd *priv = hcd_to_priv(hcd);
2171 u32 fr;
2172
Arvid Brodinbedc0c32011-02-26 22:02:57 +01002173 fr = reg_read32(hcd->regs, HC_FRINDEX);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002174 return (fr >> 3) % priv->periodic_size;
2175}
2176
2177static void isp1760_stop(struct usb_hcd *hcd)
2178{
2179 struct isp1760_hcd *priv = hcd_to_priv(hcd);
Nate Case3faefc82008-06-17 11:11:38 -05002180 u32 temp;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002181
2182 isp1760_hub_control(hcd, ClearPortFeature, USB_PORT_FEAT_POWER, 1,
2183 NULL, 0);
2184 mdelay(20);
2185
2186 spin_lock_irq(&priv->lock);
2187 ehci_reset(priv);
2188 /* Disable IRQ */
Arvid Brodinbedc0c32011-02-26 22:02:57 +01002189 temp = reg_read32(hcd->regs, HC_HW_MODE_CTRL);
2190 reg_write32(hcd->regs, HC_HW_MODE_CTRL, temp &= ~HW_GLOBAL_INTR_EN);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002191 spin_unlock_irq(&priv->lock);
2192
Arvid Brodinbedc0c32011-02-26 22:02:57 +01002193 reg_write32(hcd->regs, HC_CONFIGFLAG, 0);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002194}
2195
2196static void isp1760_shutdown(struct usb_hcd *hcd)
2197{
Nate Case3faefc82008-06-17 11:11:38 -05002198 u32 command, temp;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002199
2200 isp1760_stop(hcd);
Arvid Brodinbedc0c32011-02-26 22:02:57 +01002201 temp = reg_read32(hcd->regs, HC_HW_MODE_CTRL);
2202 reg_write32(hcd->regs, HC_HW_MODE_CTRL, temp &= ~HW_GLOBAL_INTR_EN);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002203
Arvid Brodinbedc0c32011-02-26 22:02:57 +01002204 command = reg_read32(hcd->regs, HC_USBCMD);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002205 command &= ~CMD_RUN;
Arvid Brodinbedc0c32011-02-26 22:02:57 +01002206 reg_write32(hcd->regs, HC_USBCMD, command);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002207}
2208
2209static const struct hc_driver isp1760_hc_driver = {
2210 .description = "isp1760-hcd",
2211 .product_desc = "NXP ISP1760 USB Host Controller",
2212 .hcd_priv_size = sizeof(struct isp1760_hcd),
2213 .irq = isp1760_irq,
2214 .flags = HCD_MEMORY | HCD_USB2,
2215 .reset = isp1760_hc_setup,
2216 .start = isp1760_run,
2217 .stop = isp1760_stop,
2218 .shutdown = isp1760_shutdown,
2219 .urb_enqueue = isp1760_urb_enqueue,
2220 .urb_dequeue = isp1760_urb_dequeue,
2221 .endpoint_disable = isp1760_endpoint_disable,
2222 .get_frame_number = isp1760_get_frame,
2223 .hub_status_data = isp1760_hub_status_data,
2224 .hub_control = isp1760_hub_control,
2225};
2226
2227int __init init_kmem_once(void)
2228{
2229 qtd_cachep = kmem_cache_create("isp1760_qtd",
2230 sizeof(struct isp1760_qtd), 0, SLAB_TEMPORARY |
2231 SLAB_MEM_SPREAD, NULL);
2232
2233 if (!qtd_cachep)
2234 return -ENOMEM;
2235
2236 qh_cachep = kmem_cache_create("isp1760_qh", sizeof(struct isp1760_qh),
2237 0, SLAB_TEMPORARY | SLAB_MEM_SPREAD, NULL);
2238
2239 if (!qh_cachep) {
2240 kmem_cache_destroy(qtd_cachep);
2241 return -ENOMEM;
2242 }
2243
2244 return 0;
2245}
2246
2247void deinit_kmem_cache(void)
2248{
2249 kmem_cache_destroy(qtd_cachep);
2250 kmem_cache_destroy(qh_cachep);
2251}
2252
Catalin Marinasf9031f22009-02-10 16:55:45 +00002253struct usb_hcd *isp1760_register(phys_addr_t res_start, resource_size_t res_len,
2254 int irq, unsigned long irqflags,
2255 struct device *dev, const char *busname,
2256 unsigned int devflags)
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002257{
2258 struct usb_hcd *hcd;
2259 struct isp1760_hcd *priv;
2260 int ret;
2261
2262 if (usb_disabled())
2263 return ERR_PTR(-ENODEV);
2264
2265 /* prevent usb-core allocating DMA pages */
2266 dev->dma_mask = NULL;
2267
Kay Sievers0031a062008-05-02 06:02:41 +02002268 hcd = usb_create_hcd(&isp1760_hc_driver, dev, dev_name(dev));
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002269 if (!hcd)
2270 return ERR_PTR(-ENOMEM);
2271
2272 priv = hcd_to_priv(hcd);
Nate Case3faefc82008-06-17 11:11:38 -05002273 priv->devflags = devflags;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002274 init_memory(priv);
2275 hcd->regs = ioremap(res_start, res_len);
2276 if (!hcd->regs) {
2277 ret = -EIO;
2278 goto err_put;
2279 }
2280
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002281 hcd->irq = irq;
2282 hcd->rsrc_start = res_start;
2283 hcd->rsrc_len = res_len;
2284
Nate Casee6942d62008-05-21 16:28:20 -05002285 ret = usb_add_hcd(hcd, irq, irqflags);
2286 if (ret)
2287 goto err_unmap;
2288
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002289 return hcd;
2290
2291err_unmap:
2292 iounmap(hcd->regs);
2293
2294err_put:
2295 usb_put_hcd(hcd);
2296
2297 return ERR_PTR(ret);
2298}
2299
2300MODULE_DESCRIPTION("Driver for the ISP1760 USB-controller from NXP");
2301MODULE_AUTHOR("Sebastian Siewior <bigeasy@linuxtronix.de>");
2302MODULE_LICENSE("GPL v2");