blob: cfb8e8ab933843d9c943edbe589224575a9b2748 [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;
840 priv->atl_ints[slot].data_buffer = qtd->data_buffer;
Arvid Brodinfd436ae2011-02-26 22:03:49 +0100841 qtd->status |= URB_ENQUEUED;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200842 qtd->status |= slot << 16;
843}
844
Arvid Brodina041d8e2011-02-26 22:04:40 +0100845static void enqueue_one_int_qtd(struct isp1760_hcd *priv,
846 struct isp1760_qh *qh, u32 slot,
847 struct isp1760_qtd *qtd)
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200848{
849 struct ptd ptd;
850 struct usb_hcd *hcd = priv_to_hcd(priv);
851
Arvid Brodina041d8e2011-02-26 22:04:40 +0100852 alloc_mem(priv, qtd);
853 transform_into_int(priv, qh, qtd, &ptd);
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100854 ptd_write(hcd->regs, INT_PTD_OFFSET, slot, &ptd);
Arvid Brodina041d8e2011-02-26 22:04:40 +0100855 enqueue_one_qtd(qtd, priv);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200856
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200857 priv->int_ints[slot].qh = qh;
858 priv->int_ints[slot].qtd = qtd;
859 priv->int_ints[slot].data_buffer = qtd->data_buffer;
Arvid Brodinfd436ae2011-02-26 22:03:49 +0100860 qtd->status |= URB_ENQUEUED;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200861 qtd->status |= slot << 16;
862}
863
Adrian Bunk473bca92008-05-05 21:25:33 +0300864static void enqueue_an_ATL_packet(struct usb_hcd *hcd, struct isp1760_qh *qh,
865 struct isp1760_qtd *qtd)
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200866{
867 struct isp1760_hcd *priv = hcd_to_priv(hcd);
868 u32 skip_map, or_map;
869 u32 queue_entry;
870 u32 slot;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200871 u32 buffstatus;
872
Catalin Marinase6bdfe32009-03-23 12:38:16 +0000873 /*
874 * When this function is called from the interrupt handler to enqueue
875 * a follow-up packet, the SKIP register gets written and read back
876 * almost immediately. With ISP1761, this register requires a delay of
877 * 195ns between a write and subsequent read (see section 15.1.1.3).
878 */
Michael Hennerichebb8a4e2010-08-05 17:53:57 -0400879 mmiowb();
Catalin Marinase6bdfe32009-03-23 12:38:16 +0000880 ndelay(195);
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100881 skip_map = reg_read32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200882
883 BUG_ON(!skip_map);
884 slot = __ffs(skip_map);
885 queue_entry = 1 << slot;
886
Arvid Brodina041d8e2011-02-26 22:04:40 +0100887 enqueue_one_atl_qtd(priv, qh, slot, qtd);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200888
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100889 or_map = reg_read32(hcd->regs, HC_ATL_IRQ_MASK_OR_REG);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200890 or_map |= queue_entry;
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100891 reg_write32(hcd->regs, HC_ATL_IRQ_MASK_OR_REG, or_map);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200892
893 skip_map &= ~queue_entry;
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100894 reg_write32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG, skip_map);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200895
Sebastian Andrzej Siewiorb14e8402011-02-08 21:07:40 +0100896 priv->atl_queued++;
897 if (priv->atl_queued == 2)
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100898 reg_write32(hcd->regs, HC_INTERRUPT_ENABLE,
899 INTERRUPT_ENABLE_SOT_MASK);
Sebastian Andrzej Siewiorb14e8402011-02-08 21:07:40 +0100900
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100901 buffstatus = reg_read32(hcd->regs, HC_BUFFER_STATUS_REG);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200902 buffstatus |= ATL_BUFFER;
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100903 reg_write32(hcd->regs, HC_BUFFER_STATUS_REG, buffstatus);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200904}
905
Adrian Bunk473bca92008-05-05 21:25:33 +0300906static void enqueue_an_INT_packet(struct usb_hcd *hcd, struct isp1760_qh *qh,
907 struct isp1760_qtd *qtd)
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200908{
909 struct isp1760_hcd *priv = hcd_to_priv(hcd);
910 u32 skip_map, or_map;
911 u32 queue_entry;
912 u32 slot;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200913 u32 buffstatus;
914
Catalin Marinase6bdfe32009-03-23 12:38:16 +0000915 /*
916 * When this function is called from the interrupt handler to enqueue
917 * a follow-up packet, the SKIP register gets written and read back
918 * almost immediately. With ISP1761, this register requires a delay of
919 * 195ns between a write and subsequent read (see section 15.1.1.3).
920 */
Michael Hennerichebb8a4e2010-08-05 17:53:57 -0400921 mmiowb();
Catalin Marinase6bdfe32009-03-23 12:38:16 +0000922 ndelay(195);
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100923 skip_map = reg_read32(hcd->regs, HC_INT_PTD_SKIPMAP_REG);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200924
925 BUG_ON(!skip_map);
926 slot = __ffs(skip_map);
927 queue_entry = 1 << slot;
928
Arvid Brodina041d8e2011-02-26 22:04:40 +0100929 enqueue_one_int_qtd(priv, qh, slot, qtd);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200930
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100931 or_map = reg_read32(hcd->regs, HC_INT_IRQ_MASK_OR_REG);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200932 or_map |= queue_entry;
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100933 reg_write32(hcd->regs, HC_INT_IRQ_MASK_OR_REG, or_map);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200934
935 skip_map &= ~queue_entry;
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100936 reg_write32(hcd->regs, HC_INT_PTD_SKIPMAP_REG, skip_map);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200937
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100938 buffstatus = reg_read32(hcd->regs, HC_BUFFER_STATUS_REG);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200939 buffstatus |= INT_BUFFER;
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100940 reg_write32(hcd->regs, HC_BUFFER_STATUS_REG, buffstatus);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200941}
942
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100943static void isp1760_urb_done(struct isp1760_hcd *priv, struct urb *urb,
944 int status)
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200945__releases(priv->lock)
946__acquires(priv->lock)
947{
948 if (!urb->unlinked) {
949 if (status == -EINPROGRESS)
950 status = 0;
951 }
952
Catalin Marinasdb8516f2010-02-02 15:31:02 +0000953 if (usb_pipein(urb->pipe) && usb_pipetype(urb->pipe) != PIPE_CONTROL) {
954 void *ptr;
955 for (ptr = urb->transfer_buffer;
956 ptr < urb->transfer_buffer + urb->transfer_buffer_length;
957 ptr += PAGE_SIZE)
958 flush_dcache_page(virt_to_page(ptr));
959 }
960
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200961 /* complete() can reenter this HCD */
962 usb_hcd_unlink_urb_from_ep(priv_to_hcd(priv), urb);
963 spin_unlock(&priv->lock);
964 usb_hcd_giveback_urb(priv_to_hcd(priv), urb, status);
965 spin_lock(&priv->lock);
966}
967
968static void isp1760_qtd_free(struct isp1760_qtd *qtd)
969{
Arvid Brodina041d8e2011-02-26 22:04:40 +0100970 BUG_ON(qtd->payload_addr);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200971 kmem_cache_free(qtd_cachep, qtd);
972}
973
Arvid Brodinfd436ae2011-02-26 22:03:49 +0100974static struct isp1760_qtd *clean_this_qtd(struct isp1760_qtd *qtd,
975 struct isp1760_qh *qh)
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200976{
977 struct isp1760_qtd *tmp_qtd;
978
Arvid Brodinfd436ae2011-02-26 22:03:49 +0100979 if (list_is_last(&qtd->qtd_list, &qh->qtd_list))
980 tmp_qtd = NULL;
981 else
982 tmp_qtd = list_entry(qtd->qtd_list.next, struct isp1760_qtd,
983 qtd_list);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200984 list_del(&qtd->qtd_list);
985 isp1760_qtd_free(qtd);
986 return tmp_qtd;
987}
988
989/*
990 * Remove this QTD from the QH list and free its memory. If this QTD
991 * isn't the last one than remove also his successor(s).
992 * Returns the QTD which is part of an new URB and should be enqueued.
993 */
Arvid Brodinfd436ae2011-02-26 22:03:49 +0100994static struct isp1760_qtd *clean_up_qtdlist(struct isp1760_qtd *qtd,
995 struct isp1760_qh *qh)
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200996{
Arvid Brodinfd436ae2011-02-26 22:03:49 +0100997 struct urb *urb;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200998
Arvid Brodinfd436ae2011-02-26 22:03:49 +0100999 urb = qtd->urb;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001000 do {
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001001 qtd = clean_this_qtd(qtd, qh);
1002 } while (qtd && (qtd->urb == urb));
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001003
1004 return qtd;
1005}
1006
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001007static int last_qtd_of_urb(struct isp1760_qtd *qtd, struct isp1760_qh *qh)
1008{
1009 struct urb *urb;
1010
1011 if (list_is_last(&qtd->qtd_list, &qh->qtd_list))
1012 return 1;
1013
1014 urb = qtd->urb;
1015 qtd = list_entry(qtd->qtd_list.next, typeof(*qtd), qtd_list);
1016 return (qtd->urb != urb);
1017}
1018
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001019static void do_atl_int(struct usb_hcd *hcd)
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001020{
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001021 struct isp1760_hcd *priv = hcd_to_priv(hcd);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001022 u32 done_map, skip_map;
1023 struct ptd ptd;
1024 struct urb *urb = NULL;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001025 u32 queue_entry;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001026 u32 length;
1027 u32 or_map;
1028 u32 status = -EINVAL;
1029 int error;
1030 struct isp1760_qtd *qtd;
1031 struct isp1760_qh *qh;
1032 u32 rl;
1033 u32 nakcount;
1034
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001035 done_map = reg_read32(hcd->regs, HC_ATL_PTD_DONEMAP_REG);
1036 skip_map = reg_read32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001037
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001038 or_map = reg_read32(hcd->regs, HC_ATL_IRQ_MASK_OR_REG);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001039 or_map &= ~done_map;
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001040 reg_write32(hcd->regs, HC_ATL_IRQ_MASK_OR_REG, or_map);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001041
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001042 while (done_map) {
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001043 status = 0;
Sebastian Andrzej Siewiorb14e8402011-02-08 21:07:40 +01001044 priv->atl_queued--;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001045
1046 queue_entry = __ffs(done_map);
1047 done_map &= ~(1 << queue_entry);
1048 skip_map |= 1 << queue_entry;
1049
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001050 qtd = priv->atl_ints[queue_entry].qtd;
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001051 urb = qtd->urb;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001052 qh = priv->atl_ints[queue_entry].qh;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001053
1054 if (!qh) {
1055 printk(KERN_ERR "qh is 0\n");
1056 continue;
1057 }
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001058 ptd_read(hcd->regs, ATL_PTD_OFFSET, queue_entry, &ptd);
Enrico Scholz3f02a952008-07-17 20:09:30 +02001059
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001060 rl = (ptd.dw2 >> 25) & 0x0f;
1061 nakcount = (ptd.dw3 >> 19) & 0xf;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001062
1063 /* Transfer Error, *but* active and no HALT -> reload */
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001064 if ((ptd.dw3 & DW3_ERROR_BIT) && (ptd.dw3 & DW3_QTD_ACTIVE) &&
1065 !(ptd.dw3 & DW3_HALT_BIT)) {
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001066
1067 /* according to ppriv code, we have to
1068 * reload this one if trasfered bytes != requested bytes
1069 * else act like everything went smooth..
1070 * XXX This just doesn't feel right and hasn't
1071 * triggered so far.
1072 */
1073
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001074 length = PTD_XFERRED_LENGTH(ptd.dw3);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001075 printk(KERN_ERR "Should reload now.... transfered %d "
1076 "of %zu\n", length, qtd->length);
1077 BUG();
1078 }
1079
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001080 if (!nakcount && (ptd.dw3 & DW3_QTD_ACTIVE)) {
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001081 u32 buffstatus;
1082
Colin Tuckleyc0d74142010-01-07 11:22:47 +00001083 /*
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001084 * NAKs are handled in HW by the chip. Usually if the
1085 * device is not able to send data fast enough.
Colin Tuckleyc0d74142010-01-07 11:22:47 +00001086 * This happens mostly on slower hardware.
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001087 */
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001088
1089 /* RL counter = ERR counter */
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001090 ptd.dw3 &= ~(0xf << 19);
1091 ptd.dw3 |= rl << 19;
1092 ptd.dw3 &= ~(3 << (55 - 32));
1093 ptd.dw3 |= ERR_COUNTER << (55 - 32);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001094
1095 /*
1096 * It is not needed to write skip map back because it
1097 * is unchanged. Just make sure that this entry is
1098 * unskipped once it gets written to the HW.
1099 */
1100 skip_map &= ~(1 << queue_entry);
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001101 or_map = reg_read32(hcd->regs, HC_ATL_IRQ_MASK_OR_REG);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001102 or_map |= 1 << queue_entry;
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001103 reg_write32(hcd->regs, HC_ATL_IRQ_MASK_OR_REG, or_map);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001104
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001105 ptd.dw0 |= PTD_VALID;
1106 ptd_write(hcd->regs, ATL_PTD_OFFSET, queue_entry, &ptd);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001107
Sebastian Andrzej Siewiorb14e8402011-02-08 21:07:40 +01001108 priv->atl_queued++;
1109 if (priv->atl_queued == 2)
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001110 reg_write32(hcd->regs, HC_INTERRUPT_ENABLE,
1111 INTERRUPT_ENABLE_SOT_MASK);
Sebastian Andrzej Siewiorb14e8402011-02-08 21:07:40 +01001112
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001113 buffstatus = reg_read32(hcd->regs,
1114 HC_BUFFER_STATUS_REG);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001115 buffstatus |= ATL_BUFFER;
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001116 reg_write32(hcd->regs, HC_BUFFER_STATUS_REG,
1117 buffstatus);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001118 continue;
1119 }
1120
1121 error = check_error(&ptd);
1122 if (error) {
1123 status = error;
1124 priv->atl_ints[queue_entry].qh->toggle = 0;
1125 priv->atl_ints[queue_entry].qh->ping = 0;
1126 urb->status = -EPIPE;
1127
1128#if 0
1129 printk(KERN_ERR "Error in %s().\n", __func__);
1130 printk(KERN_ERR "IN dw0: %08x dw1: %08x dw2: %08x "
1131 "dw3: %08x dw4: %08x dw5: %08x dw6: "
1132 "%08x dw7: %08x\n",
1133 ptd.dw0, ptd.dw1, ptd.dw2, ptd.dw3,
1134 ptd.dw4, ptd.dw5, ptd.dw6, ptd.dw7);
1135#endif
1136 } else {
1137 if (usb_pipetype(urb->pipe) == PIPE_BULK) {
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001138 priv->atl_ints[queue_entry].qh->toggle =
1139 ptd.dw3 & (1 << 25);
1140 priv->atl_ints[queue_entry].qh->ping =
1141 ptd.dw3 & (1 << 26);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001142 }
1143 }
1144
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001145 length = PTD_XFERRED_LENGTH(ptd.dw3);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001146 if (length) {
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001147 switch (DW1_GET_PID(ptd.dw1)) {
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001148 case IN_PID:
Arvid Brodina041d8e2011-02-26 22:04:40 +01001149 mem_reads8(hcd->regs, qtd->payload_addr,
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001150 priv->atl_ints[queue_entry].data_buffer,
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001151 length);
1152
1153 case OUT_PID:
1154
1155 urb->actual_length += length;
1156
1157 case SETUP_PID:
1158 break;
1159 }
1160 }
1161
1162 priv->atl_ints[queue_entry].data_buffer = NULL;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001163 priv->atl_ints[queue_entry].qtd = NULL;
1164 priv->atl_ints[queue_entry].qh = NULL;
1165
Arvid Brodina041d8e2011-02-26 22:04:40 +01001166 free_mem(priv, qtd);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001167
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001168 reg_write32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG, skip_map);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001169
1170 if (urb->status == -EPIPE) {
1171 /* HALT was received */
1172
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001173 qtd = clean_up_qtdlist(qtd, qh);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001174 isp1760_urb_done(priv, urb, urb->status);
1175
1176 } else if (usb_pipebulk(urb->pipe) && (length < qtd->length)) {
1177 /* short BULK received */
1178
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001179 if (urb->transfer_flags & URB_SHORT_NOT_OK) {
1180 urb->status = -EREMOTEIO;
Sebastian Siewior7839b512008-07-17 20:09:29 +02001181 isp1760_dbg(priv, "short bulk, %d instead %zu "
1182 "with URB_SHORT_NOT_OK flag.\n",
1183 length, qtd->length);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001184 }
1185
1186 if (urb->status == -EINPROGRESS)
1187 urb->status = 0;
1188
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001189 qtd = clean_up_qtdlist(qtd, qh);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001190
1191 isp1760_urb_done(priv, urb, urb->status);
1192
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001193 } else if (last_qtd_of_urb(qtd, qh)) {
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001194 /* that was the last qtd of that URB */
1195
1196 if (urb->status == -EINPROGRESS)
1197 urb->status = 0;
1198
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001199 qtd = clean_this_qtd(qtd, qh);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001200 isp1760_urb_done(priv, urb, urb->status);
1201
1202 } else {
1203 /* next QTD of this URB */
1204
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001205 qtd = clean_this_qtd(qtd, qh);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001206 BUG_ON(!qtd);
1207 }
1208
1209 if (qtd)
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001210 enqueue_an_ATL_packet(hcd, qh, qtd);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001211
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001212 skip_map = reg_read32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001213 }
Sebastian Andrzej Siewiorb14e8402011-02-08 21:07:40 +01001214 if (priv->atl_queued <= 1)
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001215 reg_write32(hcd->regs, HC_INTERRUPT_ENABLE,
1216 INTERRUPT_ENABLE_MASK);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001217}
1218
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001219static void do_intl_int(struct usb_hcd *hcd)
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001220{
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001221 struct isp1760_hcd *priv = hcd_to_priv(hcd);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001222 u32 done_map, skip_map;
1223 struct ptd ptd;
1224 struct urb *urb = NULL;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001225 u32 length;
1226 u32 or_map;
1227 int error;
1228 u32 queue_entry;
1229 struct isp1760_qtd *qtd;
1230 struct isp1760_qh *qh;
1231
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001232 done_map = reg_read32(hcd->regs, HC_INT_PTD_DONEMAP_REG);
1233 skip_map = reg_read32(hcd->regs, HC_INT_PTD_SKIPMAP_REG);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001234
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001235 or_map = reg_read32(hcd->regs, HC_INT_IRQ_MASK_OR_REG);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001236 or_map &= ~done_map;
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001237 reg_write32(hcd->regs, HC_INT_IRQ_MASK_OR_REG, or_map);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001238
1239 while (done_map) {
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001240 queue_entry = __ffs(done_map);
1241 done_map &= ~(1 << queue_entry);
1242 skip_map |= 1 << queue_entry;
1243
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001244 qtd = priv->int_ints[queue_entry].qtd;
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001245 urb = qtd->urb;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001246 qh = priv->int_ints[queue_entry].qh;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001247
1248 if (!qh) {
1249 printk(KERN_ERR "(INT) qh is 0\n");
1250 continue;
1251 }
1252
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001253 ptd_read(hcd->regs, INT_PTD_OFFSET, queue_entry, &ptd);
1254 check_int_err_status(ptd.dw4);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001255
1256 error = check_error(&ptd);
1257 if (error) {
1258#if 0
1259 printk(KERN_ERR "Error in %s().\n", __func__);
1260 printk(KERN_ERR "IN dw0: %08x dw1: %08x dw2: %08x "
1261 "dw3: %08x dw4: %08x dw5: %08x dw6: "
1262 "%08x dw7: %08x\n",
1263 ptd.dw0, ptd.dw1, ptd.dw2, ptd.dw3,
1264 ptd.dw4, ptd.dw5, ptd.dw6, ptd.dw7);
1265#endif
1266 urb->status = -EPIPE;
1267 priv->int_ints[queue_entry].qh->toggle = 0;
1268 priv->int_ints[queue_entry].qh->ping = 0;
1269
1270 } else {
1271 priv->int_ints[queue_entry].qh->toggle =
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001272 ptd.dw3 & (1 << 25);
1273 priv->int_ints[queue_entry].qh->ping =
1274 ptd.dw3 & (1 << 26);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001275 }
1276
1277 if (urb->dev->speed != USB_SPEED_HIGH)
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001278 length = PTD_XFERRED_LENGTH_LO(ptd.dw3);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001279 else
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001280 length = PTD_XFERRED_LENGTH(ptd.dw3);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001281
1282 if (length) {
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001283 switch (DW1_GET_PID(ptd.dw1)) {
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001284 case IN_PID:
Arvid Brodina041d8e2011-02-26 22:04:40 +01001285 mem_reads8(hcd->regs, qtd->payload_addr,
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001286 priv->int_ints[queue_entry].data_buffer,
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001287 length);
1288 case OUT_PID:
1289
1290 urb->actual_length += length;
1291
1292 case SETUP_PID:
1293 break;
1294 }
1295 }
1296
1297 priv->int_ints[queue_entry].data_buffer = NULL;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001298 priv->int_ints[queue_entry].qtd = NULL;
1299 priv->int_ints[queue_entry].qh = NULL;
1300
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001301 reg_write32(hcd->regs, HC_INT_PTD_SKIPMAP_REG, skip_map);
Arvid Brodina041d8e2011-02-26 22:04:40 +01001302 free_mem(priv, qtd);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001303
1304 if (urb->status == -EPIPE) {
1305 /* HALT received */
1306
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001307 qtd = clean_up_qtdlist(qtd, qh);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001308 isp1760_urb_done(priv, urb, urb->status);
1309
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001310 } else if (last_qtd_of_urb(qtd, qh)) {
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001311
1312 if (urb->status == -EINPROGRESS)
1313 urb->status = 0;
1314
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001315 qtd = clean_this_qtd(qtd, qh);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001316 isp1760_urb_done(priv, urb, urb->status);
1317
1318 } else {
1319 /* next QTD of this URB */
1320
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001321 qtd = clean_this_qtd(qtd, qh);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001322 BUG_ON(!qtd);
1323 }
1324
1325 if (qtd)
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001326 enqueue_an_INT_packet(hcd, qh, qtd);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001327
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001328 skip_map = reg_read32(hcd->regs, HC_INT_PTD_SKIPMAP_REG);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001329 }
1330}
1331
1332#define max_packet(wMaxPacketSize) ((wMaxPacketSize) & 0x07ff)
1333static struct isp1760_qh *qh_make(struct isp1760_hcd *priv, struct urb *urb,
1334 gfp_t flags)
1335{
1336 struct isp1760_qh *qh;
1337 int is_input, type;
1338
1339 qh = isp1760_qh_alloc(priv, flags);
1340 if (!qh)
1341 return qh;
1342
1343 /*
1344 * init endpoint/device data for this QH
1345 */
1346 is_input = usb_pipein(urb->pipe);
1347 type = usb_pipetype(urb->pipe);
1348
1349 if (type == PIPE_INTERRUPT) {
1350
1351 if (urb->dev->speed == USB_SPEED_HIGH) {
1352
1353 qh->period = urb->interval >> 3;
1354 if (qh->period == 0 && urb->interval != 1) {
1355 /* NOTE interval 2 or 4 uframes could work.
1356 * But interval 1 scheduling is simpler, and
1357 * includes high bandwidth.
1358 */
1359 printk(KERN_ERR "intr period %d uframes, NYET!",
1360 urb->interval);
1361 qh_destroy(qh);
1362 return NULL;
1363 }
1364 } else {
1365 qh->period = urb->interval;
1366 }
1367 }
1368
1369 /* support for tt scheduling, and access to toggles */
1370 qh->dev = urb->dev;
1371
1372 if (!usb_pipecontrol(urb->pipe))
1373 usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe), !is_input,
1374 1);
1375 return qh;
1376}
1377
1378/*
1379 * For control/bulk/interrupt, return QH with these TDs appended.
1380 * Allocates and initializes the QH if necessary.
1381 * Returns null if it can't allocate a QH it needs to.
1382 * If the QH has TDs (urbs) already, that's great.
1383 */
1384static struct isp1760_qh *qh_append_tds(struct isp1760_hcd *priv,
1385 struct urb *urb, struct list_head *qtd_list, int epnum,
1386 void **ptr)
1387{
1388 struct isp1760_qh *qh;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001389
1390 qh = (struct isp1760_qh *)*ptr;
1391 if (!qh) {
1392 /* can't sleep here, we have priv->lock... */
1393 qh = qh_make(priv, urb, GFP_ATOMIC);
1394 if (!qh)
1395 return qh;
1396 *ptr = qh;
1397 }
1398
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001399 list_splice(qtd_list, qh->qtd_list.prev);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001400
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001401 return qh;
1402}
1403
1404static void qtd_list_free(struct isp1760_hcd *priv, struct urb *urb,
1405 struct list_head *qtd_list)
1406{
1407 struct list_head *entry, *temp;
1408
1409 list_for_each_safe(entry, temp, qtd_list) {
1410 struct isp1760_qtd *qtd;
1411
1412 qtd = list_entry(entry, struct isp1760_qtd, qtd_list);
1413 list_del(&qtd->qtd_list);
1414 isp1760_qtd_free(qtd);
1415 }
1416}
1417
1418static int isp1760_prepare_enqueue(struct isp1760_hcd *priv, struct urb *urb,
1419 struct list_head *qtd_list, gfp_t mem_flags, packet_enqueue *p)
1420{
1421 struct isp1760_qtd *qtd;
1422 int epnum;
1423 unsigned long flags;
1424 struct isp1760_qh *qh = NULL;
1425 int rc;
1426 int qh_busy;
1427
1428 qtd = list_entry(qtd_list->next, struct isp1760_qtd, qtd_list);
1429 epnum = urb->ep->desc.bEndpointAddress;
1430
1431 spin_lock_irqsave(&priv->lock, flags);
Alan Stern541c7d42010-06-22 16:39:10 -04001432 if (!HCD_HW_ACCESSIBLE(priv_to_hcd(priv))) {
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001433 rc = -ESHUTDOWN;
1434 goto done;
1435 }
1436 rc = usb_hcd_link_urb_to_ep(priv_to_hcd(priv), urb);
1437 if (rc)
1438 goto done;
1439
1440 qh = urb->ep->hcpriv;
1441 if (qh)
1442 qh_busy = !list_empty(&qh->qtd_list);
1443 else
1444 qh_busy = 0;
1445
1446 qh = qh_append_tds(priv, urb, qtd_list, epnum, &urb->ep->hcpriv);
1447 if (!qh) {
1448 usb_hcd_unlink_urb_from_ep(priv_to_hcd(priv), urb);
1449 rc = -ENOMEM;
1450 goto done;
1451 }
1452
1453 if (!qh_busy)
1454 p(priv_to_hcd(priv), qh, qtd);
1455
1456done:
1457 spin_unlock_irqrestore(&priv->lock, flags);
1458 if (!qh)
1459 qtd_list_free(priv, urb, qtd_list);
1460 return rc;
1461}
1462
1463static struct isp1760_qtd *isp1760_qtd_alloc(struct isp1760_hcd *priv,
1464 gfp_t flags)
1465{
1466 struct isp1760_qtd *qtd;
1467
1468 qtd = kmem_cache_zalloc(qtd_cachep, flags);
1469 if (qtd)
1470 INIT_LIST_HEAD(&qtd->qtd_list);
1471
1472 return qtd;
1473}
1474
1475/*
1476 * create a list of filled qtds for this URB; won't link into qh.
1477 */
1478static struct list_head *qh_urb_transaction(struct isp1760_hcd *priv,
1479 struct urb *urb, struct list_head *head, gfp_t flags)
1480{
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001481 struct isp1760_qtd *qtd;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001482 void *buf;
1483 int len, maxpacket;
1484 int is_input;
1485 u32 token;
1486
1487 /*
1488 * URBs map to sequences of QTDs: one logical transaction
1489 */
1490 qtd = isp1760_qtd_alloc(priv, flags);
1491 if (!qtd)
1492 return NULL;
1493
1494 list_add_tail(&qtd->qtd_list, head);
1495 qtd->urb = urb;
1496 urb->status = -EINPROGRESS;
1497
1498 token = 0;
1499 /* for split transactions, SplitXState initialized to zero */
1500
1501 len = urb->transfer_buffer_length;
1502 is_input = usb_pipein(urb->pipe);
1503 if (usb_pipecontrol(urb->pipe)) {
1504 /* SETUP pid */
1505 qtd_fill(qtd, urb->setup_packet,
1506 sizeof(struct usb_ctrlrequest),
1507 token | SETUP_PID);
1508
1509 /* ... and always at least one more pid */
1510 token ^= DATA_TOGGLE;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001511 qtd = isp1760_qtd_alloc(priv, flags);
1512 if (!qtd)
1513 goto cleanup;
1514 qtd->urb = urb;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001515 list_add_tail(&qtd->qtd_list, head);
1516
1517 /* for zero length DATA stages, STATUS is always IN */
1518 if (len == 0)
1519 token |= IN_PID;
1520 }
1521
1522 /*
1523 * data transfer stage: buffer setup
1524 */
1525 buf = urb->transfer_buffer;
1526
1527 if (is_input)
1528 token |= IN_PID;
1529 else
1530 token |= OUT_PID;
1531
1532 maxpacket = max_packet(usb_maxpacket(urb->dev, urb->pipe, !is_input));
1533
1534 /*
1535 * buffer gets wrapped in one or more qtds;
1536 * last one may be "short" (including zero len)
1537 * and may serve as a control status ack
1538 */
1539 for (;;) {
1540 int this_qtd_len;
1541
1542 if (!buf && len) {
1543 /* XXX This looks like usb storage / SCSI bug */
1544 printk(KERN_ERR "buf is null, dma is %08lx len is %d\n",
1545 (long unsigned)urb->transfer_dma, len);
1546 WARN_ON(1);
1547 }
1548
1549 this_qtd_len = qtd_fill(qtd, buf, len, token);
1550 len -= this_qtd_len;
1551 buf += this_qtd_len;
1552
1553 /* qh makes control packets use qtd toggle; maybe switch it */
1554 if ((maxpacket & (this_qtd_len + (maxpacket - 1))) == 0)
1555 token ^= DATA_TOGGLE;
1556
1557 if (len <= 0)
1558 break;
1559
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001560 qtd = isp1760_qtd_alloc(priv, flags);
1561 if (!qtd)
1562 goto cleanup;
1563 qtd->urb = urb;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001564 list_add_tail(&qtd->qtd_list, head);
1565 }
1566
1567 /*
1568 * control requests may need a terminating data "status" ack;
1569 * bulk ones may need a terminating short packet (zero length).
1570 */
1571 if (urb->transfer_buffer_length != 0) {
1572 int one_more = 0;
1573
1574 if (usb_pipecontrol(urb->pipe)) {
1575 one_more = 1;
1576 /* "in" <--> "out" */
1577 token ^= IN_PID;
1578 /* force DATA1 */
1579 token |= DATA_TOGGLE;
1580 } else if (usb_pipebulk(urb->pipe)
1581 && (urb->transfer_flags & URB_ZERO_PACKET)
1582 && !(urb->transfer_buffer_length % maxpacket)) {
1583 one_more = 1;
1584 }
1585 if (one_more) {
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001586 qtd = isp1760_qtd_alloc(priv, flags);
1587 if (!qtd)
1588 goto cleanup;
1589 qtd->urb = urb;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001590 list_add_tail(&qtd->qtd_list, head);
1591
1592 /* never any data in such packets */
1593 qtd_fill(qtd, NULL, 0, token);
1594 }
1595 }
1596
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001597 qtd->status = 0;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001598 return head;
1599
1600cleanup:
1601 qtd_list_free(priv, urb, head);
1602 return NULL;
1603}
1604
1605static int isp1760_urb_enqueue(struct usb_hcd *hcd, struct urb *urb,
1606 gfp_t mem_flags)
1607{
1608 struct isp1760_hcd *priv = hcd_to_priv(hcd);
1609 struct list_head qtd_list;
1610 packet_enqueue *pe;
1611
1612 INIT_LIST_HEAD(&qtd_list);
1613
1614 switch (usb_pipetype(urb->pipe)) {
1615 case PIPE_CONTROL:
1616 case PIPE_BULK:
1617
1618 if (!qh_urb_transaction(priv, urb, &qtd_list, mem_flags))
1619 return -ENOMEM;
1620 pe = enqueue_an_ATL_packet;
1621 break;
1622
1623 case PIPE_INTERRUPT:
1624 if (!qh_urb_transaction(priv, urb, &qtd_list, mem_flags))
1625 return -ENOMEM;
1626 pe = enqueue_an_INT_packet;
1627 break;
1628
1629 case PIPE_ISOCHRONOUS:
1630 printk(KERN_ERR "PIPE_ISOCHRONOUS ain't supported\n");
1631 default:
1632 return -EPIPE;
1633 }
1634
Sebastian Siewiora36c27d2008-07-17 20:09:28 +02001635 return isp1760_prepare_enqueue(priv, urb, &qtd_list, mem_flags, pe);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001636}
1637
1638static int isp1760_urb_dequeue(struct usb_hcd *hcd, struct urb *urb,
1639 int status)
1640{
1641 struct isp1760_hcd *priv = hcd_to_priv(hcd);
1642 struct inter_packet_info *ints;
1643 u32 i;
1644 u32 reg_base, or_reg, skip_reg;
Andrew Mortond249afd2008-06-09 16:39:52 -07001645 unsigned long flags;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001646 struct ptd ptd;
Warren Free0afb20e2009-05-08 10:27:08 +02001647 packet_enqueue *pe;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001648
1649 switch (usb_pipetype(urb->pipe)) {
1650 case PIPE_ISOCHRONOUS:
1651 return -EPIPE;
1652 break;
1653
1654 case PIPE_INTERRUPT:
1655 ints = priv->int_ints;
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001656 reg_base = INT_PTD_OFFSET;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001657 or_reg = HC_INT_IRQ_MASK_OR_REG;
1658 skip_reg = HC_INT_PTD_SKIPMAP_REG;
Warren Free0afb20e2009-05-08 10:27:08 +02001659 pe = enqueue_an_INT_packet;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001660 break;
1661
1662 default:
1663 ints = priv->atl_ints;
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001664 reg_base = ATL_PTD_OFFSET;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001665 or_reg = HC_ATL_IRQ_MASK_OR_REG;
1666 skip_reg = HC_ATL_PTD_SKIPMAP_REG;
Warren Free0afb20e2009-05-08 10:27:08 +02001667 pe = enqueue_an_ATL_packet;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001668 break;
1669 }
1670
1671 memset(&ptd, 0, sizeof(ptd));
1672 spin_lock_irqsave(&priv->lock, flags);
1673
1674 for (i = 0; i < 32; i++) {
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001675 if (!ints[i].qh)
1676 continue;
1677 BUG_ON(!ints[i].qtd);
1678
1679 if (ints[i].qtd->urb == urb) {
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001680 u32 skip_map;
1681 u32 or_map;
1682 struct isp1760_qtd *qtd;
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001683 struct isp1760_qh *qh;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001684
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001685 skip_map = reg_read32(hcd->regs, skip_reg);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001686 skip_map |= 1 << i;
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001687 reg_write32(hcd->regs, skip_reg, skip_map);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001688
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001689 or_map = reg_read32(hcd->regs, or_reg);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001690 or_map &= ~(1 << i);
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001691 reg_write32(hcd->regs, or_reg, or_map);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001692
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001693 ptd_write(hcd->regs, reg_base, i, &ptd);
1694
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001695 qtd = ints->qtd;
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001696 qh = ints[i].qh;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001697
Arvid Brodina041d8e2011-02-26 22:04:40 +01001698 free_mem(priv, qtd);
1699 qtd = clean_up_qtdlist(qtd, qh);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001700
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001701 ints->qh = NULL;
1702 ints->qtd = NULL;
1703 ints->data_buffer = NULL;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001704
1705 isp1760_urb_done(priv, urb, status);
Warren Free0afb20e2009-05-08 10:27:08 +02001706 if (qtd)
1707 pe(hcd, qh, qtd);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001708 break;
Warren Free0afb20e2009-05-08 10:27:08 +02001709
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001710 } else {
1711 struct isp1760_qtd *qtd;
Warren Free0afb20e2009-05-08 10:27:08 +02001712
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001713 list_for_each_entry(qtd, &ints[i].qtd->qtd_list,
1714 qtd_list) {
Warren Free0afb20e2009-05-08 10:27:08 +02001715 if (qtd->urb == urb) {
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001716 clean_up_qtdlist(qtd, ints[i].qh);
Warren Free0afb20e2009-05-08 10:27:08 +02001717 isp1760_urb_done(priv, urb, status);
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001718 qtd = NULL;
Warren Free0afb20e2009-05-08 10:27:08 +02001719 break;
1720 }
Warren Free0afb20e2009-05-08 10:27:08 +02001721 }
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001722
1723 /* We found the urb before the last slot */
1724 if (!qtd)
Warren Free0afb20e2009-05-08 10:27:08 +02001725 break;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001726 }
1727 ints++;
1728 }
1729
1730 spin_unlock_irqrestore(&priv->lock, flags);
1731 return 0;
1732}
1733
1734static irqreturn_t isp1760_irq(struct usb_hcd *usb_hcd)
1735{
1736 struct isp1760_hcd *priv = hcd_to_priv(usb_hcd);
1737 u32 imask;
1738 irqreturn_t irqret = IRQ_NONE;
1739
1740 spin_lock(&priv->lock);
1741
1742 if (!(usb_hcd->state & HC_STATE_RUNNING))
1743 goto leave;
1744
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001745 imask = reg_read32(usb_hcd->regs, HC_INTERRUPT_REG);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001746 if (unlikely(!imask))
1747 goto leave;
1748
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001749 reg_write32(usb_hcd->regs, HC_INTERRUPT_REG, imask);
Sebastian Andrzej Siewiorb14e8402011-02-08 21:07:40 +01001750 if (imask & (HC_ATL_INT | HC_SOT_INT))
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001751 do_atl_int(usb_hcd);
1752
1753 if (imask & HC_INTL_INT)
1754 do_intl_int(usb_hcd);
1755
1756 irqret = IRQ_HANDLED;
1757leave:
1758 spin_unlock(&priv->lock);
1759 return irqret;
1760}
1761
1762static int isp1760_hub_status_data(struct usb_hcd *hcd, char *buf)
1763{
1764 struct isp1760_hcd *priv = hcd_to_priv(hcd);
1765 u32 temp, status = 0;
1766 u32 mask;
1767 int retval = 1;
1768 unsigned long flags;
1769
1770 /* if !USB_SUSPEND, root hub timers won't get shut down ... */
1771 if (!HC_IS_RUNNING(hcd->state))
1772 return 0;
1773
1774 /* init status to no-changes */
1775 buf[0] = 0;
1776 mask = PORT_CSC;
1777
1778 spin_lock_irqsave(&priv->lock, flags);
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001779 temp = reg_read32(hcd->regs, HC_PORTSC1);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001780
1781 if (temp & PORT_OWNER) {
1782 if (temp & PORT_CSC) {
1783 temp &= ~PORT_CSC;
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001784 reg_write32(hcd->regs, HC_PORTSC1, temp);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001785 goto done;
1786 }
1787 }
1788
1789 /*
1790 * Return status information even for ports with OWNER set.
1791 * Otherwise khubd wouldn't see the disconnect event when a
1792 * high-speed device is switched over to the companion
1793 * controller by the user.
1794 */
1795
1796 if ((temp & mask) != 0
1797 || ((temp & PORT_RESUME) != 0
1798 && time_after_eq(jiffies,
1799 priv->reset_done))) {
1800 buf [0] |= 1 << (0 + 1);
1801 status = STS_PCD;
1802 }
1803 /* FIXME autosuspend idle root hubs */
1804done:
1805 spin_unlock_irqrestore(&priv->lock, flags);
1806 return status ? retval : 0;
1807}
1808
1809static void isp1760_hub_descriptor(struct isp1760_hcd *priv,
1810 struct usb_hub_descriptor *desc)
1811{
1812 int ports = HCS_N_PORTS(priv->hcs_params);
1813 u16 temp;
1814
1815 desc->bDescriptorType = 0x29;
1816 /* priv 1.0, 2.3.9 says 20ms max */
1817 desc->bPwrOn2PwrGood = 10;
1818 desc->bHubContrCurrent = 0;
1819
1820 desc->bNbrPorts = ports;
1821 temp = 1 + (ports / 8);
1822 desc->bDescLength = 7 + 2 * temp;
1823
1824 /* two bitmaps: ports removable, and usb 1.0 legacy PortPwrCtrlMask */
1825 memset(&desc->bitmap[0], 0, temp);
1826 memset(&desc->bitmap[temp], 0xff, temp);
1827
1828 /* per-port overcurrent reporting */
1829 temp = 0x0008;
1830 if (HCS_PPC(priv->hcs_params))
1831 /* per-port power control */
1832 temp |= 0x0001;
1833 else
1834 /* no power switching */
1835 temp |= 0x0002;
1836 desc->wHubCharacteristics = cpu_to_le16(temp);
1837}
1838
1839#define PORT_WAKE_BITS (PORT_WKOC_E|PORT_WKDISC_E|PORT_WKCONN_E)
1840
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001841static int check_reset_complete(struct usb_hcd *hcd, int index,
1842 int port_status)
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001843{
1844 if (!(port_status & PORT_CONNECT))
1845 return port_status;
1846
1847 /* if reset finished and it's still not enabled -- handoff */
1848 if (!(port_status & PORT_PE)) {
1849
1850 printk(KERN_ERR "port %d full speed --> companion\n",
1851 index + 1);
1852
1853 port_status |= PORT_OWNER;
1854 port_status &= ~PORT_RWC_BITS;
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001855 reg_write32(hcd->regs, HC_PORTSC1, port_status);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001856
1857 } else
1858 printk(KERN_ERR "port %d high speed\n", index + 1);
1859
1860 return port_status;
1861}
1862
1863static int isp1760_hub_control(struct usb_hcd *hcd, u16 typeReq,
1864 u16 wValue, u16 wIndex, char *buf, u16 wLength)
1865{
1866 struct isp1760_hcd *priv = hcd_to_priv(hcd);
1867 int ports = HCS_N_PORTS(priv->hcs_params);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001868 u32 temp, status;
1869 unsigned long flags;
1870 int retval = 0;
1871 unsigned selector;
1872
1873 /*
1874 * FIXME: support SetPortFeatures USB_PORT_FEAT_INDICATOR.
1875 * HCS_INDICATOR may say we can change LEDs to off/amber/green.
1876 * (track current state ourselves) ... blink for diagnostics,
1877 * power, "this is the one", etc. EHCI spec supports this.
1878 */
1879
1880 spin_lock_irqsave(&priv->lock, flags);
1881 switch (typeReq) {
1882 case ClearHubFeature:
1883 switch (wValue) {
1884 case C_HUB_LOCAL_POWER:
1885 case C_HUB_OVER_CURRENT:
1886 /* no hub-wide feature/status flags */
1887 break;
1888 default:
1889 goto error;
1890 }
1891 break;
1892 case ClearPortFeature:
1893 if (!wIndex || wIndex > ports)
1894 goto error;
1895 wIndex--;
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001896 temp = reg_read32(hcd->regs, HC_PORTSC1);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001897
1898 /*
1899 * Even if OWNER is set, so the port is owned by the
1900 * companion controller, khubd needs to be able to clear
1901 * the port-change status bits (especially
Alan Stern749da5f2010-03-04 17:05:08 -05001902 * USB_PORT_STAT_C_CONNECTION).
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001903 */
1904
1905 switch (wValue) {
1906 case USB_PORT_FEAT_ENABLE:
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001907 reg_write32(hcd->regs, HC_PORTSC1, temp & ~PORT_PE);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001908 break;
1909 case USB_PORT_FEAT_C_ENABLE:
1910 /* XXX error? */
1911 break;
1912 case USB_PORT_FEAT_SUSPEND:
1913 if (temp & PORT_RESET)
1914 goto error;
1915
1916 if (temp & PORT_SUSPEND) {
1917 if ((temp & PORT_PE) == 0)
1918 goto error;
1919 /* resume signaling for 20 msec */
1920 temp &= ~(PORT_RWC_BITS);
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001921 reg_write32(hcd->regs, HC_PORTSC1,
1922 temp | PORT_RESUME);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001923 priv->reset_done = jiffies +
1924 msecs_to_jiffies(20);
1925 }
1926 break;
1927 case USB_PORT_FEAT_C_SUSPEND:
1928 /* we auto-clear this feature */
1929 break;
1930 case USB_PORT_FEAT_POWER:
1931 if (HCS_PPC(priv->hcs_params))
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001932 reg_write32(hcd->regs, HC_PORTSC1,
1933 temp & ~PORT_POWER);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001934 break;
1935 case USB_PORT_FEAT_C_CONNECTION:
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001936 reg_write32(hcd->regs, HC_PORTSC1, temp | PORT_CSC);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001937 break;
1938 case USB_PORT_FEAT_C_OVER_CURRENT:
1939 /* XXX error ?*/
1940 break;
1941 case USB_PORT_FEAT_C_RESET:
1942 /* GetPortStatus clears reset */
1943 break;
1944 default:
1945 goto error;
1946 }
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001947 reg_read32(hcd->regs, HC_USBCMD);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001948 break;
1949 case GetHubDescriptor:
1950 isp1760_hub_descriptor(priv, (struct usb_hub_descriptor *)
1951 buf);
1952 break;
1953 case GetHubStatus:
1954 /* no hub-wide feature/status flags */
1955 memset(buf, 0, 4);
1956 break;
1957 case GetPortStatus:
1958 if (!wIndex || wIndex > ports)
1959 goto error;
1960 wIndex--;
1961 status = 0;
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001962 temp = reg_read32(hcd->regs, HC_PORTSC1);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001963
1964 /* wPortChange bits */
1965 if (temp & PORT_CSC)
Alan Stern749da5f2010-03-04 17:05:08 -05001966 status |= USB_PORT_STAT_C_CONNECTION << 16;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001967
1968
1969 /* whoever resumes must GetPortStatus to complete it!! */
1970 if (temp & PORT_RESUME) {
1971 printk(KERN_ERR "Port resume should be skipped.\n");
1972
1973 /* Remote Wakeup received? */
1974 if (!priv->reset_done) {
1975 /* resume signaling for 20 msec */
1976 priv->reset_done = jiffies
1977 + msecs_to_jiffies(20);
1978 /* check the port again */
1979 mod_timer(&priv_to_hcd(priv)->rh_timer,
1980 priv->reset_done);
1981 }
1982
1983 /* resume completed? */
1984 else if (time_after_eq(jiffies,
1985 priv->reset_done)) {
Alan Stern749da5f2010-03-04 17:05:08 -05001986 status |= USB_PORT_STAT_C_SUSPEND << 16;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001987 priv->reset_done = 0;
1988
1989 /* stop resume signaling */
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001990 temp = reg_read32(hcd->regs, HC_PORTSC1);
1991 reg_write32(hcd->regs, HC_PORTSC1,
1992 temp & ~(PORT_RWC_BITS | PORT_RESUME));
1993 retval = handshake(hcd, HC_PORTSC1,
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001994 PORT_RESUME, 0, 2000 /* 2msec */);
1995 if (retval != 0) {
1996 isp1760_err(priv,
1997 "port %d resume error %d\n",
1998 wIndex + 1, retval);
1999 goto error;
2000 }
2001 temp &= ~(PORT_SUSPEND|PORT_RESUME|(3<<10));
2002 }
2003 }
2004
2005 /* whoever resets must GetPortStatus to complete it!! */
2006 if ((temp & PORT_RESET)
2007 && time_after_eq(jiffies,
2008 priv->reset_done)) {
Alan Stern749da5f2010-03-04 17:05:08 -05002009 status |= USB_PORT_STAT_C_RESET << 16;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002010 priv->reset_done = 0;
2011
2012 /* force reset to complete */
Arvid Brodinbedc0c32011-02-26 22:02:57 +01002013 reg_write32(hcd->regs, HC_PORTSC1, temp & ~PORT_RESET);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002014 /* REVISIT: some hardware needs 550+ usec to clear
2015 * this bit; seems too long to spin routinely...
2016 */
Arvid Brodinbedc0c32011-02-26 22:02:57 +01002017 retval = handshake(hcd, HC_PORTSC1,
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002018 PORT_RESET, 0, 750);
2019 if (retval != 0) {
2020 isp1760_err(priv, "port %d reset error %d\n",
2021 wIndex + 1, retval);
2022 goto error;
2023 }
2024
2025 /* see what we found out */
Arvid Brodinbedc0c32011-02-26 22:02:57 +01002026 temp = check_reset_complete(hcd, wIndex,
2027 reg_read32(hcd->regs, HC_PORTSC1));
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002028 }
2029 /*
2030 * Even if OWNER is set, there's no harm letting khubd
2031 * see the wPortStatus values (they should all be 0 except
2032 * for PORT_POWER anyway).
2033 */
2034
2035 if (temp & PORT_OWNER)
2036 printk(KERN_ERR "Warning: PORT_OWNER is set\n");
2037
2038 if (temp & PORT_CONNECT) {
Alan Stern749da5f2010-03-04 17:05:08 -05002039 status |= USB_PORT_STAT_CONNECTION;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002040 /* status may be from integrated TT */
2041 status |= ehci_port_speed(priv, temp);
2042 }
2043 if (temp & PORT_PE)
Alan Stern749da5f2010-03-04 17:05:08 -05002044 status |= USB_PORT_STAT_ENABLE;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002045 if (temp & (PORT_SUSPEND|PORT_RESUME))
Alan Stern749da5f2010-03-04 17:05:08 -05002046 status |= USB_PORT_STAT_SUSPEND;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002047 if (temp & PORT_RESET)
Alan Stern749da5f2010-03-04 17:05:08 -05002048 status |= USB_PORT_STAT_RESET;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002049 if (temp & PORT_POWER)
Alan Stern749da5f2010-03-04 17:05:08 -05002050 status |= USB_PORT_STAT_POWER;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002051
2052 put_unaligned(cpu_to_le32(status), (__le32 *) buf);
2053 break;
2054 case SetHubFeature:
2055 switch (wValue) {
2056 case C_HUB_LOCAL_POWER:
2057 case C_HUB_OVER_CURRENT:
2058 /* no hub-wide feature/status flags */
2059 break;
2060 default:
2061 goto error;
2062 }
2063 break;
2064 case SetPortFeature:
2065 selector = wIndex >> 8;
2066 wIndex &= 0xff;
2067 if (!wIndex || wIndex > ports)
2068 goto error;
2069 wIndex--;
Arvid Brodinbedc0c32011-02-26 22:02:57 +01002070 temp = reg_read32(hcd->regs, HC_PORTSC1);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002071 if (temp & PORT_OWNER)
2072 break;
2073
2074/* temp &= ~PORT_RWC_BITS; */
2075 switch (wValue) {
2076 case USB_PORT_FEAT_ENABLE:
Arvid Brodinbedc0c32011-02-26 22:02:57 +01002077 reg_write32(hcd->regs, HC_PORTSC1, temp | PORT_PE);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002078 break;
2079
2080 case USB_PORT_FEAT_SUSPEND:
2081 if ((temp & PORT_PE) == 0
2082 || (temp & PORT_RESET) != 0)
2083 goto error;
2084
Arvid Brodinbedc0c32011-02-26 22:02:57 +01002085 reg_write32(hcd->regs, HC_PORTSC1, temp | PORT_SUSPEND);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002086 break;
2087 case USB_PORT_FEAT_POWER:
2088 if (HCS_PPC(priv->hcs_params))
Arvid Brodinbedc0c32011-02-26 22:02:57 +01002089 reg_write32(hcd->regs, HC_PORTSC1,
2090 temp | PORT_POWER);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002091 break;
2092 case USB_PORT_FEAT_RESET:
2093 if (temp & PORT_RESUME)
2094 goto error;
2095 /* line status bits may report this as low speed,
2096 * which can be fine if this root hub has a
2097 * transaction translator built in.
2098 */
2099 if ((temp & (PORT_PE|PORT_CONNECT)) == PORT_CONNECT
2100 && PORT_USB11(temp)) {
2101 temp |= PORT_OWNER;
2102 } else {
2103 temp |= PORT_RESET;
2104 temp &= ~PORT_PE;
2105
2106 /*
2107 * caller must wait, then call GetPortStatus
2108 * usb 2.0 spec says 50 ms resets on root
2109 */
2110 priv->reset_done = jiffies +
2111 msecs_to_jiffies(50);
2112 }
Arvid Brodinbedc0c32011-02-26 22:02:57 +01002113 reg_write32(hcd->regs, HC_PORTSC1, temp);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002114 break;
2115 default:
2116 goto error;
2117 }
Arvid Brodinbedc0c32011-02-26 22:02:57 +01002118 reg_read32(hcd->regs, HC_USBCMD);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002119 break;
2120
2121 default:
2122error:
2123 /* "stall" on error */
2124 retval = -EPIPE;
2125 }
2126 spin_unlock_irqrestore(&priv->lock, flags);
2127 return retval;
2128}
2129
2130static void isp1760_endpoint_disable(struct usb_hcd *usb_hcd,
2131 struct usb_host_endpoint *ep)
2132{
2133 struct isp1760_hcd *priv = hcd_to_priv(usb_hcd);
2134 struct isp1760_qh *qh;
2135 struct isp1760_qtd *qtd;
Andrew Mortond249afd2008-06-09 16:39:52 -07002136 unsigned long flags;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002137
2138 spin_lock_irqsave(&priv->lock, flags);
2139 qh = ep->hcpriv;
2140 if (!qh)
2141 goto out;
2142
2143 ep->hcpriv = NULL;
2144 do {
2145 /* more than entry might get removed */
2146 if (list_empty(&qh->qtd_list))
2147 break;
2148
2149 qtd = list_first_entry(&qh->qtd_list, struct isp1760_qtd,
2150 qtd_list);
2151
2152 if (qtd->status & URB_ENQUEUED) {
2153
2154 spin_unlock_irqrestore(&priv->lock, flags);
2155 isp1760_urb_dequeue(usb_hcd, qtd->urb, -ECONNRESET);
2156 spin_lock_irqsave(&priv->lock, flags);
2157 } else {
2158 struct urb *urb;
2159
2160 urb = qtd->urb;
Arvid Brodinfd436ae2011-02-26 22:03:49 +01002161 clean_up_qtdlist(qtd, qh);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002162 isp1760_urb_done(priv, urb, -ECONNRESET);
2163 }
2164 } while (1);
2165
2166 qh_destroy(qh);
2167 /* remove requests and leak them.
2168 * ATL are pretty fast done, INT could take a while...
2169 * The latter shoule be removed
2170 */
2171out:
2172 spin_unlock_irqrestore(&priv->lock, flags);
2173}
2174
2175static int isp1760_get_frame(struct usb_hcd *hcd)
2176{
2177 struct isp1760_hcd *priv = hcd_to_priv(hcd);
2178 u32 fr;
2179
Arvid Brodinbedc0c32011-02-26 22:02:57 +01002180 fr = reg_read32(hcd->regs, HC_FRINDEX);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002181 return (fr >> 3) % priv->periodic_size;
2182}
2183
2184static void isp1760_stop(struct usb_hcd *hcd)
2185{
2186 struct isp1760_hcd *priv = hcd_to_priv(hcd);
Nate Case3faefc82008-06-17 11:11:38 -05002187 u32 temp;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002188
2189 isp1760_hub_control(hcd, ClearPortFeature, USB_PORT_FEAT_POWER, 1,
2190 NULL, 0);
2191 mdelay(20);
2192
2193 spin_lock_irq(&priv->lock);
2194 ehci_reset(priv);
2195 /* Disable IRQ */
Arvid Brodinbedc0c32011-02-26 22:02:57 +01002196 temp = reg_read32(hcd->regs, HC_HW_MODE_CTRL);
2197 reg_write32(hcd->regs, HC_HW_MODE_CTRL, temp &= ~HW_GLOBAL_INTR_EN);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002198 spin_unlock_irq(&priv->lock);
2199
Arvid Brodinbedc0c32011-02-26 22:02:57 +01002200 reg_write32(hcd->regs, HC_CONFIGFLAG, 0);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002201}
2202
2203static void isp1760_shutdown(struct usb_hcd *hcd)
2204{
Nate Case3faefc82008-06-17 11:11:38 -05002205 u32 command, temp;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002206
2207 isp1760_stop(hcd);
Arvid Brodinbedc0c32011-02-26 22:02:57 +01002208 temp = reg_read32(hcd->regs, HC_HW_MODE_CTRL);
2209 reg_write32(hcd->regs, HC_HW_MODE_CTRL, temp &= ~HW_GLOBAL_INTR_EN);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002210
Arvid Brodinbedc0c32011-02-26 22:02:57 +01002211 command = reg_read32(hcd->regs, HC_USBCMD);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002212 command &= ~CMD_RUN;
Arvid Brodinbedc0c32011-02-26 22:02:57 +01002213 reg_write32(hcd->regs, HC_USBCMD, command);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002214}
2215
2216static const struct hc_driver isp1760_hc_driver = {
2217 .description = "isp1760-hcd",
2218 .product_desc = "NXP ISP1760 USB Host Controller",
2219 .hcd_priv_size = sizeof(struct isp1760_hcd),
2220 .irq = isp1760_irq,
2221 .flags = HCD_MEMORY | HCD_USB2,
2222 .reset = isp1760_hc_setup,
2223 .start = isp1760_run,
2224 .stop = isp1760_stop,
2225 .shutdown = isp1760_shutdown,
2226 .urb_enqueue = isp1760_urb_enqueue,
2227 .urb_dequeue = isp1760_urb_dequeue,
2228 .endpoint_disable = isp1760_endpoint_disable,
2229 .get_frame_number = isp1760_get_frame,
2230 .hub_status_data = isp1760_hub_status_data,
2231 .hub_control = isp1760_hub_control,
2232};
2233
2234int __init init_kmem_once(void)
2235{
2236 qtd_cachep = kmem_cache_create("isp1760_qtd",
2237 sizeof(struct isp1760_qtd), 0, SLAB_TEMPORARY |
2238 SLAB_MEM_SPREAD, NULL);
2239
2240 if (!qtd_cachep)
2241 return -ENOMEM;
2242
2243 qh_cachep = kmem_cache_create("isp1760_qh", sizeof(struct isp1760_qh),
2244 0, SLAB_TEMPORARY | SLAB_MEM_SPREAD, NULL);
2245
2246 if (!qh_cachep) {
2247 kmem_cache_destroy(qtd_cachep);
2248 return -ENOMEM;
2249 }
2250
2251 return 0;
2252}
2253
2254void deinit_kmem_cache(void)
2255{
2256 kmem_cache_destroy(qtd_cachep);
2257 kmem_cache_destroy(qh_cachep);
2258}
2259
Catalin Marinasf9031f22009-02-10 16:55:45 +00002260struct usb_hcd *isp1760_register(phys_addr_t res_start, resource_size_t res_len,
2261 int irq, unsigned long irqflags,
2262 struct device *dev, const char *busname,
2263 unsigned int devflags)
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002264{
2265 struct usb_hcd *hcd;
2266 struct isp1760_hcd *priv;
2267 int ret;
2268
2269 if (usb_disabled())
2270 return ERR_PTR(-ENODEV);
2271
2272 /* prevent usb-core allocating DMA pages */
2273 dev->dma_mask = NULL;
2274
Kay Sievers0031a062008-05-02 06:02:41 +02002275 hcd = usb_create_hcd(&isp1760_hc_driver, dev, dev_name(dev));
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002276 if (!hcd)
2277 return ERR_PTR(-ENOMEM);
2278
2279 priv = hcd_to_priv(hcd);
Nate Case3faefc82008-06-17 11:11:38 -05002280 priv->devflags = devflags;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002281 init_memory(priv);
2282 hcd->regs = ioremap(res_start, res_len);
2283 if (!hcd->regs) {
2284 ret = -EIO;
2285 goto err_put;
2286 }
2287
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002288 hcd->irq = irq;
2289 hcd->rsrc_start = res_start;
2290 hcd->rsrc_len = res_len;
2291
Nate Casee6942d62008-05-21 16:28:20 -05002292 ret = usb_add_hcd(hcd, irq, irqflags);
2293 if (ret)
2294 goto err_unmap;
2295
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002296 return hcd;
2297
2298err_unmap:
2299 iounmap(hcd->regs);
2300
2301err_put:
2302 usb_put_hcd(hcd);
2303
2304 return ERR_PTR(ret);
2305}
2306
2307MODULE_DESCRIPTION("Driver for the ISP1760 USB-controller from NXP");
2308MODULE_AUTHOR("Sebastian Siewior <bigeasy@linuxtronix.de>");
2309MODULE_LICENSE("GPL v2");