blob: 0f5b48946739b5cccc2c7996de28447cf7a06c64 [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}
Sebastian Siewiordb11e472008-04-24 00:37:04 +020051
52/* Section 2.2 Host Controller Capability Registers */
53#define HC_LENGTH(p) (((p)>>00)&0x00ff) /* bits 7:0 */
54#define HC_VERSION(p) (((p)>>16)&0xffff) /* bits 31:16 */
55#define HCS_INDICATOR(p) ((p)&(1 << 16)) /* true: has port indicators */
56#define HCS_PPC(p) ((p)&(1 << 4)) /* true: port power control */
57#define HCS_N_PORTS(p) (((p)>>0)&0xf) /* bits 3:0, ports on HC */
58#define HCC_ISOC_CACHE(p) ((p)&(1 << 7)) /* true: can cache isoc frame */
59#define HCC_ISOC_THRES(p) (((p)>>4)&0x7) /* bits 6:4, uframes cached */
60
61/* Section 2.3 Host Controller Operational Registers */
62#define CMD_LRESET (1<<7) /* partial reset (no ports, etc) */
63#define CMD_RESET (1<<1) /* reset HC not bus */
64#define CMD_RUN (1<<0) /* start/stop HC */
65#define STS_PCD (1<<2) /* port change detect */
66#define FLAG_CF (1<<0) /* true: we'll support "high speed" */
67
68#define PORT_OWNER (1<<13) /* true: companion hc owns this port */
69#define PORT_POWER (1<<12) /* true: has power (see PPC) */
70#define PORT_USB11(x) (((x) & (3 << 10)) == (1 << 10)) /* USB 1.1 device */
71#define PORT_RESET (1<<8) /* reset port */
72#define PORT_SUSPEND (1<<7) /* suspend port */
73#define PORT_RESUME (1<<6) /* resume it */
74#define PORT_PE (1<<2) /* port enable */
75#define PORT_CSC (1<<1) /* connect status change */
76#define PORT_CONNECT (1<<0) /* device connected */
77#define PORT_RWC_BITS (PORT_CSC)
78
79struct isp1760_qtd {
Sebastian Siewiordb11e472008-04-24 00:37:04 +020080 u8 packet_type;
81 u8 toggle;
82
83 void *data_buffer;
Arvid Brodina041d8e2011-02-26 22:04:40 +010084 u32 payload_addr;
85
Sebastian Siewiordb11e472008-04-24 00:37:04 +020086 /* the rest is HCD-private */
87 struct list_head qtd_list;
88 struct urb *urb;
89 size_t length;
90
91 /* isp special*/
92 u32 status;
Sebastian Siewiordb11e472008-04-24 00:37:04 +020093#define URB_ENQUEUED (1 << 1)
Sebastian Siewiordb11e472008-04-24 00:37:04 +020094};
95
96struct isp1760_qh {
97 /* first part defined by EHCI spec */
98 struct list_head qtd_list;
Sebastian Siewiordb11e472008-04-24 00:37:04 +020099
100 /* periodic schedule info */
101 unsigned short period; /* polling interval */
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200102
103 u32 toggle;
104 u32 ping;
105};
106
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100107/*
108 * Access functions for isp176x registers (addresses 0..0x03FF).
109 */
110static u32 reg_read32(void __iomem *base, u32 reg)
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200111{
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100112 return readl(base + reg);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200113}
114
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100115static void reg_write32(void __iomem *base, u32 reg, u32 val)
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200116{
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100117 writel(val, base + reg);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200118}
119
120/*
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100121 * Access functions for isp176x memory (offset >= 0x0400).
122 *
123 * bank_reads8() reads memory locations prefetched by an earlier write to
124 * HC_MEMORY_REG (see isp176x datasheet). Unless you want to do fancy multi-
125 * bank optimizations, you should use the more generic mem_reads8() below.
126 *
127 * For access to ptd memory, use the specialized ptd_read() and ptd_write()
128 * below.
129 *
130 * These functions copy via MMIO data to/from the device. memcpy_{to|from}io()
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200131 * doesn't quite work because some people have to enforce 32-bit access
132 */
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100133static void bank_reads8(void __iomem *src_base, u32 src_offset, u32 bank_addr,
134 __u32 *dst, u32 bytes)
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200135{
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100136 __u32 __iomem *src;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200137 u32 val;
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100138 __u8 *src_byteptr;
139 __u8 *dst_byteptr;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200140
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100141 src = src_base + (bank_addr | src_offset);
142
143 if (src_offset < PAYLOAD_OFFSET) {
144 while (bytes >= 4) {
145 *dst = le32_to_cpu(__raw_readl(src));
146 bytes -= 4;
147 src++;
148 dst++;
149 }
150 } else {
151 while (bytes >= 4) {
152 *dst = __raw_readl(src);
153 bytes -= 4;
154 src++;
155 dst++;
156 }
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200157 }
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200158
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100159 if (!bytes)
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200160 return;
161
162 /* in case we have 3, 2 or 1 by left. The dst buffer may not be fully
163 * allocated.
164 */
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100165 if (src_offset < PAYLOAD_OFFSET)
166 val = le32_to_cpu(__raw_readl(src));
167 else
168 val = __raw_readl(src);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200169
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100170 dst_byteptr = (void *) dst;
171 src_byteptr = (void *) &val;
172 while (bytes > 0) {
173 *dst_byteptr = *src_byteptr;
174 dst_byteptr++;
175 src_byteptr++;
176 bytes--;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200177 }
178}
179
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100180static void mem_reads8(void __iomem *src_base, u32 src_offset, void *dst,
181 u32 bytes)
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200182{
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100183 reg_write32(src_base, HC_MEMORY_REG, src_offset + ISP_BANK(0));
184 ndelay(90);
185 bank_reads8(src_base, src_offset, ISP_BANK(0), dst, bytes);
186}
187
188static void mem_writes8(void __iomem *dst_base, u32 dst_offset,
189 __u32 const *src, u32 bytes)
190{
191 __u32 __iomem *dst;
192
193 dst = dst_base + dst_offset;
194
195 if (dst_offset < PAYLOAD_OFFSET) {
196 while (bytes >= 4) {
197 __raw_writel(cpu_to_le32(*src), dst);
198 bytes -= 4;
199 src++;
200 dst++;
201 }
202 } else {
203 while (bytes >= 4) {
204 __raw_writel(*src, dst);
205 bytes -= 4;
206 src++;
207 dst++;
208 }
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200209 }
210
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100211 if (!bytes)
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200212 return;
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100213 /* in case we have 3, 2 or 1 bytes left. The buffer is allocated and the
214 * extra bytes should not be read by the HW.
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200215 */
216
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100217 if (dst_offset < PAYLOAD_OFFSET)
218 __raw_writel(cpu_to_le32(*src), dst);
219 else
220 __raw_writel(*src, dst);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200221}
222
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100223/*
224 * Read and write ptds. 'ptd_offset' should be one of ISO_PTD_OFFSET,
225 * INT_PTD_OFFSET, and ATL_PTD_OFFSET. 'slot' should be less than 32.
226 */
227static void ptd_read(void __iomem *base, u32 ptd_offset, u32 slot,
228 struct ptd *ptd)
229{
230 reg_write32(base, HC_MEMORY_REG,
231 ISP_BANK(0) + ptd_offset + slot*sizeof(*ptd));
232 ndelay(90);
233 bank_reads8(base, ptd_offset + slot*sizeof(*ptd), ISP_BANK(0),
234 (void *) ptd, sizeof(*ptd));
235}
236
237static void ptd_write(void __iomem *base, u32 ptd_offset, u32 slot,
238 struct ptd *ptd)
239{
240 mem_writes8(base, ptd_offset + slot*sizeof(*ptd) + sizeof(ptd->dw0),
241 &ptd->dw1, 7*sizeof(ptd->dw1));
242 /* Make sure dw0 gets written last (after other dw's and after payload)
243 since it contains the enable bit */
244 wmb();
245 mem_writes8(base, ptd_offset + slot*sizeof(*ptd), &ptd->dw0,
246 sizeof(ptd->dw0));
247}
248
249
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200250/* memory management of the 60kb on the chip from 0x1000 to 0xffff */
251static void init_memory(struct isp1760_hcd *priv)
252{
Arvid Brodina041d8e2011-02-26 22:04:40 +0100253 int i, curr;
254 u32 payload_addr;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200255
Arvid Brodina041d8e2011-02-26 22:04:40 +0100256 payload_addr = PAYLOAD_OFFSET;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200257 for (i = 0; i < BLOCK_1_NUM; i++) {
Arvid Brodina041d8e2011-02-26 22:04:40 +0100258 priv->memory_pool[i].start = payload_addr;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200259 priv->memory_pool[i].size = BLOCK_1_SIZE;
260 priv->memory_pool[i].free = 1;
Arvid Brodina041d8e2011-02-26 22:04:40 +0100261 payload_addr += priv->memory_pool[i].size;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200262 }
263
Arvid Brodina041d8e2011-02-26 22:04:40 +0100264 curr = i;
265 for (i = 0; i < BLOCK_2_NUM; i++) {
266 priv->memory_pool[curr + i].start = payload_addr;
267 priv->memory_pool[curr + i].size = BLOCK_2_SIZE;
268 priv->memory_pool[curr + i].free = 1;
269 payload_addr += priv->memory_pool[curr + 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_3_NUM; i++) {
274 priv->memory_pool[curr + i].start = payload_addr;
275 priv->memory_pool[curr + i].size = BLOCK_3_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 BUG_ON(payload_addr - priv->memory_pool[0].start > PAYLOAD_AREA_SIZE);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200281}
282
Arvid Brodin6bda21b2011-02-26 22:06:37 +0100283static void alloc_mem(struct usb_hcd *hcd, struct isp1760_qtd *qtd)
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200284{
Arvid Brodin6bda21b2011-02-26 22:06:37 +0100285 struct isp1760_hcd *priv = hcd_to_priv(hcd);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200286 int i;
287
Arvid Brodina041d8e2011-02-26 22:04:40 +0100288 BUG_ON(qtd->payload_addr);
289
290 if (!qtd->length)
291 return;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200292
293 for (i = 0; i < BLOCKS; i++) {
Arvid Brodina041d8e2011-02-26 22:04:40 +0100294 if (priv->memory_pool[i].size >= qtd->length &&
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200295 priv->memory_pool[i].free) {
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200296 priv->memory_pool[i].free = 0;
Arvid Brodina041d8e2011-02-26 22:04:40 +0100297 qtd->payload_addr = priv->memory_pool[i].start;
298 return;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200299 }
300 }
301
Arvid Brodin6bda21b2011-02-26 22:06:37 +0100302 dev_err(hcd->self.controller,
303 "%s: Can not allocate %lu bytes of memory\n"
304 "Current memory map:\n",
305 __func__, qtd->length);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200306 for (i = 0; i < BLOCKS; i++) {
Arvid Brodin6bda21b2011-02-26 22:06:37 +0100307 dev_err(hcd->self.controller, "Pool %2d size %4d status: %d\n",
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200308 i, priv->memory_pool[i].size,
309 priv->memory_pool[i].free);
310 }
311 /* XXX maybe -ENOMEM could be possible */
312 BUG();
Arvid Brodina041d8e2011-02-26 22:04:40 +0100313 return;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200314}
315
Arvid Brodin6bda21b2011-02-26 22:06:37 +0100316static void free_mem(struct usb_hcd *hcd, struct isp1760_qtd *qtd)
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200317{
Arvid Brodin6bda21b2011-02-26 22:06:37 +0100318 struct isp1760_hcd *priv = hcd_to_priv(hcd);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200319 int i;
320
Arvid Brodina041d8e2011-02-26 22:04:40 +0100321 if (!qtd->payload_addr)
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200322 return;
323
324 for (i = 0; i < BLOCKS; i++) {
Arvid Brodina041d8e2011-02-26 22:04:40 +0100325 if (priv->memory_pool[i].start == qtd->payload_addr) {
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200326 BUG_ON(priv->memory_pool[i].free);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200327 priv->memory_pool[i].free = 1;
Arvid Brodina041d8e2011-02-26 22:04:40 +0100328 qtd->payload_addr = 0;
329 return;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200330 }
331 }
332
Arvid Brodin6bda21b2011-02-26 22:06:37 +0100333 dev_err(hcd->self.controller, "%s: Invalid pointer: %08x\n",
334 __func__, qtd->payload_addr);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200335 BUG();
336}
337
338static void isp1760_init_regs(struct usb_hcd *hcd)
339{
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100340 reg_write32(hcd->regs, HC_BUFFER_STATUS_REG, 0);
341 reg_write32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG, NO_TRANSFER_ACTIVE);
342 reg_write32(hcd->regs, HC_INT_PTD_SKIPMAP_REG, NO_TRANSFER_ACTIVE);
343 reg_write32(hcd->regs, HC_ISO_PTD_SKIPMAP_REG, NO_TRANSFER_ACTIVE);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200344
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100345 reg_write32(hcd->regs, HC_ATL_PTD_DONEMAP_REG, ~NO_TRANSFER_ACTIVE);
346 reg_write32(hcd->regs, HC_INT_PTD_DONEMAP_REG, ~NO_TRANSFER_ACTIVE);
347 reg_write32(hcd->regs, HC_ISO_PTD_DONEMAP_REG, ~NO_TRANSFER_ACTIVE);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200348}
349
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100350static int handshake(struct usb_hcd *hcd, u32 reg,
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200351 u32 mask, u32 done, int usec)
352{
353 u32 result;
354
355 do {
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100356 result = reg_read32(hcd->regs, reg);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200357 if (result == ~0)
358 return -ENODEV;
359 result &= mask;
360 if (result == done)
361 return 0;
362 udelay(1);
363 usec--;
364 } while (usec > 0);
365 return -ETIMEDOUT;
366}
367
368/* reset a non-running (STS_HALT == 1) controller */
Arvid Brodin6bda21b2011-02-26 22:06:37 +0100369static int ehci_reset(struct usb_hcd *hcd)
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200370{
371 int retval;
Arvid Brodin6bda21b2011-02-26 22:06:37 +0100372 struct isp1760_hcd *priv = hcd_to_priv(hcd);
373
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100374 u32 command = reg_read32(hcd->regs, HC_USBCMD);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200375
376 command |= CMD_RESET;
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100377 reg_write32(hcd->regs, HC_USBCMD, command);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200378 hcd->state = HC_STATE_HALT;
379 priv->next_statechange = jiffies;
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100380 retval = handshake(hcd, HC_USBCMD,
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200381 CMD_RESET, 0, 250 * 1000);
382 return retval;
383}
384
385static void qh_destroy(struct isp1760_qh *qh)
386{
387 BUG_ON(!list_empty(&qh->qtd_list));
388 kmem_cache_free(qh_cachep, qh);
389}
390
Arvid Brodin6bda21b2011-02-26 22:06:37 +0100391static struct isp1760_qh *isp1760_qh_alloc(gfp_t flags)
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200392{
393 struct isp1760_qh *qh;
394
395 qh = kmem_cache_zalloc(qh_cachep, flags);
396 if (!qh)
397 return qh;
398
399 INIT_LIST_HEAD(&qh->qtd_list);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200400 return qh;
401}
402
403/* magic numbers that can affect system performance */
404#define EHCI_TUNE_CERR 3 /* 0-3 qtd retries; 0 == don't stop */
405#define EHCI_TUNE_RL_HS 4 /* nak throttle; see 4.9 */
406#define EHCI_TUNE_RL_TT 0
407#define EHCI_TUNE_MULT_HS 1 /* 1-3 transactions/uframe; 4.10.3 */
408#define EHCI_TUNE_MULT_TT 1
409#define EHCI_TUNE_FLS 2 /* (small) 256 frame schedule */
410
411/* one-time init, only for memory state */
412static int priv_init(struct usb_hcd *hcd)
413{
414 struct isp1760_hcd *priv = hcd_to_priv(hcd);
415 u32 hcc_params;
416
417 spin_lock_init(&priv->lock);
418
419 /*
420 * hw default: 1K periodic list heads, one per frame.
421 * periodic_size can shrink by USBCMD update if hcc_params allows.
422 */
423 priv->periodic_size = DEFAULT_I_TDPS;
424
425 /* controllers may cache some of the periodic schedule ... */
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100426 hcc_params = reg_read32(hcd->regs, HC_HCCPARAMS);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200427 /* full frame cache */
428 if (HCC_ISOC_CACHE(hcc_params))
429 priv->i_thresh = 8;
430 else /* N microframes cached */
431 priv->i_thresh = 2 + HCC_ISOC_THRES(hcc_params);
432
433 return 0;
434}
435
436static int isp1760_hc_setup(struct usb_hcd *hcd)
437{
438 struct isp1760_hcd *priv = hcd_to_priv(hcd);
439 int result;
Nate Case3faefc82008-06-17 11:11:38 -0500440 u32 scratch, hwmode;
441
442 /* Setup HW Mode Control: This assumes a level active-low interrupt */
443 hwmode = HW_DATA_BUS_32BIT;
444
445 if (priv->devflags & ISP1760_FLAG_BUS_WIDTH_16)
446 hwmode &= ~HW_DATA_BUS_32BIT;
447 if (priv->devflags & ISP1760_FLAG_ANALOG_OC)
448 hwmode |= HW_ANA_DIGI_OC;
449 if (priv->devflags & ISP1760_FLAG_DACK_POL_HIGH)
450 hwmode |= HW_DACK_POL_HIGH;
451 if (priv->devflags & ISP1760_FLAG_DREQ_POL_HIGH)
452 hwmode |= HW_DREQ_POL_HIGH;
Michael Hennerich9da69c62009-07-15 23:22:54 -0400453 if (priv->devflags & ISP1760_FLAG_INTR_POL_HIGH)
454 hwmode |= HW_INTR_HIGH_ACT;
455 if (priv->devflags & ISP1760_FLAG_INTR_EDGE_TRIG)
456 hwmode |= HW_INTR_EDGE_TRIG;
Nate Case3faefc82008-06-17 11:11:38 -0500457
458 /*
459 * We have to set this first in case we're in 16-bit mode.
460 * Write it twice to ensure correct upper bits if switching
461 * to 16-bit mode.
462 */
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100463 reg_write32(hcd->regs, HC_HW_MODE_CTRL, hwmode);
464 reg_write32(hcd->regs, HC_HW_MODE_CTRL, hwmode);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200465
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100466 reg_write32(hcd->regs, HC_SCRATCH_REG, 0xdeadbabe);
Nate Case3faefc82008-06-17 11:11:38 -0500467 /* Change bus pattern */
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100468 scratch = reg_read32(hcd->regs, HC_CHIP_ID_REG);
469 scratch = reg_read32(hcd->regs, HC_SCRATCH_REG);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200470 if (scratch != 0xdeadbabe) {
Arvid Brodin6bda21b2011-02-26 22:06:37 +0100471 dev_err(hcd->self.controller, "Scratch test failed.\n");
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200472 return -ENODEV;
473 }
474
475 /* pre reset */
476 isp1760_init_regs(hcd);
477
478 /* reset */
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100479 reg_write32(hcd->regs, HC_RESET_REG, SW_RESET_RESET_ALL);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200480 mdelay(100);
481
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100482 reg_write32(hcd->regs, HC_RESET_REG, SW_RESET_RESET_HC);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200483 mdelay(100);
484
Arvid Brodin6bda21b2011-02-26 22:06:37 +0100485 result = ehci_reset(hcd);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200486 if (result)
487 return result;
488
489 /* Step 11 passed */
490
Arvid Brodin6bda21b2011-02-26 22:06:37 +0100491 dev_info(hcd->self.controller, "bus width: %d, oc: %s\n",
Nate Case3faefc82008-06-17 11:11:38 -0500492 (priv->devflags & ISP1760_FLAG_BUS_WIDTH_16) ?
493 16 : 32, (priv->devflags & ISP1760_FLAG_ANALOG_OC) ?
494 "analog" : "digital");
495
496 /* ATL reset */
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100497 reg_write32(hcd->regs, HC_HW_MODE_CTRL, hwmode | ALL_ATX_RESET);
Nate Case3faefc82008-06-17 11:11:38 -0500498 mdelay(10);
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100499 reg_write32(hcd->regs, HC_HW_MODE_CTRL, hwmode);
Nate Case3faefc82008-06-17 11:11:38 -0500500
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100501 reg_write32(hcd->regs, HC_INTERRUPT_REG, INTERRUPT_ENABLE_MASK);
502 reg_write32(hcd->regs, HC_INTERRUPT_ENABLE, INTERRUPT_ENABLE_MASK);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200503
Nate Case3faefc82008-06-17 11:11:38 -0500504 /*
505 * PORT 1 Control register of the ISP1760 is the OTG control
Thomas Hommel42c65392008-12-18 10:31:40 +0100506 * register on ISP1761. Since there is no OTG or device controller
507 * support in this driver, we use port 1 as a "normal" USB host port on
508 * both chips.
Nate Case3faefc82008-06-17 11:11:38 -0500509 */
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100510 reg_write32(hcd->regs, HC_PORT1_CTRL, PORT1_POWER | PORT1_INIT2);
Thomas Hommel42c65392008-12-18 10:31:40 +0100511 mdelay(10);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200512
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100513 priv->hcs_params = reg_read32(hcd->regs, HC_HCSPARAMS);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200514
515 return priv_init(hcd);
516}
517
518static void isp1760_init_maps(struct usb_hcd *hcd)
519{
520 /*set last maps, for iso its only 1, else 32 tds bitmap*/
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100521 reg_write32(hcd->regs, HC_ATL_PTD_LASTPTD_REG, 0x80000000);
522 reg_write32(hcd->regs, HC_INT_PTD_LASTPTD_REG, 0x80000000);
523 reg_write32(hcd->regs, HC_ISO_PTD_LASTPTD_REG, 0x00000001);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200524}
525
526static void isp1760_enable_interrupts(struct usb_hcd *hcd)
527{
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100528 reg_write32(hcd->regs, HC_ATL_IRQ_MASK_AND_REG, 0);
529 reg_write32(hcd->regs, HC_ATL_IRQ_MASK_OR_REG, 0);
530 reg_write32(hcd->regs, HC_INT_IRQ_MASK_AND_REG, 0);
531 reg_write32(hcd->regs, HC_INT_IRQ_MASK_OR_REG, 0);
532 reg_write32(hcd->regs, HC_ISO_IRQ_MASK_AND_REG, 0);
533 reg_write32(hcd->regs, HC_ISO_IRQ_MASK_OR_REG, 0xffffffff);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200534 /* step 23 passed */
535}
536
537static int isp1760_run(struct usb_hcd *hcd)
538{
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200539 int retval;
540 u32 temp;
541 u32 command;
542 u32 chipid;
543
544 hcd->uses_new_polling = 1;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200545
546 hcd->state = HC_STATE_RUNNING;
547 isp1760_enable_interrupts(hcd);
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100548 temp = reg_read32(hcd->regs, HC_HW_MODE_CTRL);
549 reg_write32(hcd->regs, HC_HW_MODE_CTRL, temp | HW_GLOBAL_INTR_EN);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200550
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100551 command = reg_read32(hcd->regs, HC_USBCMD);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200552 command &= ~(CMD_LRESET|CMD_RESET);
553 command |= CMD_RUN;
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100554 reg_write32(hcd->regs, HC_USBCMD, command);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200555
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100556 retval = handshake(hcd, HC_USBCMD, CMD_RUN, CMD_RUN,
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200557 250 * 1000);
558 if (retval)
559 return retval;
560
561 /*
562 * XXX
563 * Spec says to write FLAG_CF as last config action, priv code grabs
564 * the semaphore while doing so.
565 */
566 down_write(&ehci_cf_port_reset_rwsem);
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100567 reg_write32(hcd->regs, HC_CONFIGFLAG, FLAG_CF);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200568
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100569 retval = handshake(hcd, HC_CONFIGFLAG, FLAG_CF, FLAG_CF, 250 * 1000);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200570 up_write(&ehci_cf_port_reset_rwsem);
571 if (retval)
572 return retval;
573
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100574 chipid = reg_read32(hcd->regs, HC_CHIP_ID_REG);
Arvid Brodin6bda21b2011-02-26 22:06:37 +0100575 dev_info(hcd->self.controller, "USB ISP %04x HW rev. %d started\n",
576 chipid & 0xffff, chipid >> 16);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200577
578 /* PTD Register Init Part 2, Step 28 */
579 /* enable INTs */
580 isp1760_init_maps(hcd);
581
582 /* GRR this is run-once init(), being done every time the HC starts.
583 * So long as they're part of class devices, we can't do it init()
584 * since the class device isn't created that early.
585 */
586 return 0;
587}
588
589static u32 base_to_chip(u32 base)
590{
591 return ((base - 0x400) >> 3);
592}
593
Arvid Brodin6bda21b2011-02-26 22:06:37 +0100594static void transform_into_atl(struct isp1760_qh *qh,
Arvid Brodina041d8e2011-02-26 22:04:40 +0100595 struct isp1760_qtd *qtd, struct ptd *ptd)
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200596{
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200597 u32 maxpacket;
598 u32 multi;
599 u32 pid_code;
600 u32 rl = RL_COUNTER;
601 u32 nak = NAK_COUNTER;
602
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100603 memset(ptd, 0, sizeof(*ptd));
604
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200605 /* according to 3.6.2, max packet len can not be > 0x400 */
Arvid Brodina041d8e2011-02-26 22:04:40 +0100606 maxpacket = usb_maxpacket(qtd->urb->dev, qtd->urb->pipe,
607 usb_pipeout(qtd->urb->pipe));
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200608 multi = 1 + ((maxpacket >> 11) & 0x3);
609 maxpacket &= 0x7ff;
610
611 /* DW0 */
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100612 ptd->dw0 = PTD_VALID;
613 ptd->dw0 |= PTD_LENGTH(qtd->length);
614 ptd->dw0 |= PTD_MAXPACKET(maxpacket);
Arvid Brodina041d8e2011-02-26 22:04:40 +0100615 ptd->dw0 |= PTD_ENDPOINT(usb_pipeendpoint(qtd->urb->pipe));
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200616
617 /* DW1 */
Arvid Brodina041d8e2011-02-26 22:04:40 +0100618 ptd->dw1 = usb_pipeendpoint(qtd->urb->pipe) >> 1;
619 ptd->dw1 |= PTD_DEVICE_ADDR(usb_pipedevice(qtd->urb->pipe));
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200620
621 pid_code = qtd->packet_type;
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100622 ptd->dw1 |= PTD_PID_TOKEN(pid_code);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200623
Arvid Brodina041d8e2011-02-26 22:04:40 +0100624 if (usb_pipebulk(qtd->urb->pipe))
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100625 ptd->dw1 |= PTD_TRANS_BULK;
Arvid Brodina041d8e2011-02-26 22:04:40 +0100626 else if (usb_pipeint(qtd->urb->pipe))
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100627 ptd->dw1 |= PTD_TRANS_INT;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200628
Arvid Brodina041d8e2011-02-26 22:04:40 +0100629 if (qtd->urb->dev->speed != USB_SPEED_HIGH) {
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200630 /* split transaction */
631
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100632 ptd->dw1 |= PTD_TRANS_SPLIT;
Arvid Brodina041d8e2011-02-26 22:04:40 +0100633 if (qtd->urb->dev->speed == USB_SPEED_LOW)
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100634 ptd->dw1 |= PTD_SE_USB_LOSPEED;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200635
Arvid Brodina041d8e2011-02-26 22:04:40 +0100636 ptd->dw1 |= PTD_PORT_NUM(qtd->urb->dev->ttport);
637 ptd->dw1 |= PTD_HUB_NUM(qtd->urb->dev->tt->hub->devnum);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200638
639 /* SE bit for Split INT transfers */
Arvid Brodina041d8e2011-02-26 22:04:40 +0100640 if (usb_pipeint(qtd->urb->pipe) &&
641 (qtd->urb->dev->speed == USB_SPEED_LOW))
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100642 ptd->dw1 |= 2 << 16;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200643
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100644 ptd->dw3 = 0;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200645 rl = 0;
646 nak = 0;
647 } else {
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100648 ptd->dw0 |= PTD_MULTI(multi);
Arvid Brodina041d8e2011-02-26 22:04:40 +0100649 if (usb_pipecontrol(qtd->urb->pipe) ||
650 usb_pipebulk(qtd->urb->pipe))
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100651 ptd->dw3 = qh->ping;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200652 else
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100653 ptd->dw3 = 0;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200654 }
655 /* DW2 */
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100656 ptd->dw2 = 0;
Arvid Brodina041d8e2011-02-26 22:04:40 +0100657 ptd->dw2 |= PTD_DATA_START_ADDR(base_to_chip(qtd->payload_addr));
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100658 ptd->dw2 |= PTD_RL_CNT(rl);
659 ptd->dw3 |= PTD_NAC_CNT(nak);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200660
661 /* DW3 */
Arvid Brodina041d8e2011-02-26 22:04:40 +0100662 if (usb_pipecontrol(qtd->urb->pipe))
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100663 ptd->dw3 |= PTD_DATA_TOGGLE(qtd->toggle);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200664 else
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100665 ptd->dw3 |= qh->toggle;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200666
667
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100668 ptd->dw3 |= PTD_ACTIVE;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200669 /* Cerr */
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100670 ptd->dw3 |= PTD_CERR(ERR_COUNTER);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200671}
672
Arvid Brodin6bda21b2011-02-26 22:06:37 +0100673static void transform_add_int(struct isp1760_qh *qh,
Arvid Brodina041d8e2011-02-26 22:04:40 +0100674 struct isp1760_qtd *qtd, struct ptd *ptd)
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200675{
676 u32 maxpacket;
677 u32 multi;
678 u32 numberofusofs;
679 u32 i;
680 u32 usofmask, usof;
681 u32 period;
682
Arvid Brodina041d8e2011-02-26 22:04:40 +0100683 maxpacket = usb_maxpacket(qtd->urb->dev, qtd->urb->pipe,
684 usb_pipeout(qtd->urb->pipe));
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200685 multi = 1 + ((maxpacket >> 11) & 0x3);
686 maxpacket &= 0x7ff;
687 /* length of the data per uframe */
688 maxpacket = multi * maxpacket;
689
Arvid Brodina041d8e2011-02-26 22:04:40 +0100690 numberofusofs = qtd->urb->transfer_buffer_length / maxpacket;
691 if (qtd->urb->transfer_buffer_length % maxpacket)
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200692 numberofusofs += 1;
693
694 usofmask = 1;
695 usof = 0;
696 for (i = 0; i < numberofusofs; i++) {
697 usof |= usofmask;
698 usofmask <<= 1;
699 }
700
Arvid Brodina041d8e2011-02-26 22:04:40 +0100701 if (qtd->urb->dev->speed != USB_SPEED_HIGH) {
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200702 /* split */
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100703 ptd->dw5 = 0x1c;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200704
705 if (qh->period >= 32)
706 period = qh->period / 2;
707 else
708 period = qh->period;
709
710 } else {
711
712 if (qh->period >= 8)
713 period = qh->period/8;
714 else
715 period = qh->period;
716
717 if (period >= 32)
718 period = 16;
719
720 if (qh->period >= 8) {
721 /* millisecond period */
722 period = (period << 3);
723 } else {
724 /* usof based tranmsfers */
725 /* minimum 4 usofs */
726 usof = 0x11;
727 }
728 }
729
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100730 ptd->dw2 |= period;
731 ptd->dw4 = usof;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200732}
733
Arvid Brodin6bda21b2011-02-26 22:06:37 +0100734static void transform_into_int(struct isp1760_qh *qh,
Arvid Brodina041d8e2011-02-26 22:04:40 +0100735 struct isp1760_qtd *qtd, struct ptd *ptd)
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200736{
Arvid Brodin6bda21b2011-02-26 22:06:37 +0100737 transform_into_atl(qh, qtd, ptd);
738 transform_add_int(qh, qtd, ptd);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200739}
740
741static int qtd_fill(struct isp1760_qtd *qtd, void *databuffer, size_t len,
742 u32 token)
743{
744 int count;
745
746 qtd->data_buffer = databuffer;
747 qtd->packet_type = GET_QTD_TOKEN_TYPE(token);
748 qtd->toggle = GET_DATA_TOGGLE(token);
749
Arvid Brodina041d8e2011-02-26 22:04:40 +0100750 if (len > MAX_PAYLOAD_SIZE)
751 count = MAX_PAYLOAD_SIZE;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200752 else
753 count = len;
754
755 qtd->length = count;
756 return count;
757}
758
Arvid Brodin6bda21b2011-02-26 22:06:37 +0100759static int check_error(struct usb_hcd *hcd, struct ptd *ptd)
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200760{
761 int error = 0;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200762
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100763 if (ptd->dw3 & DW3_HALT_BIT) {
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200764 error = -EPIPE;
765
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100766 if (ptd->dw3 & DW3_ERROR_BIT)
Anton Vorontsov0954e1c2010-05-07 01:09:19 +0400767 pr_err("error bit is set in DW3\n");
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200768 }
769
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100770 if (ptd->dw3 & DW3_QTD_ACTIVE) {
Arvid Brodin6bda21b2011-02-26 22:06:37 +0100771 dev_err(hcd->self.controller, "Transfer active bit is set DW3\n"
772 "nak counter: %d, rl: %d\n",
773 (ptd->dw3 >> 19) & 0xf, (ptd->dw2 >> 25) & 0xf);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200774 }
775
776 return error;
777}
778
Arvid Brodin6bda21b2011-02-26 22:06:37 +0100779static void check_int_err_status(struct usb_hcd *hcd, u32 dw4)
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200780{
781 u32 i;
782
783 dw4 >>= 8;
784
785 for (i = 0; i < 8; i++) {
786 switch (dw4 & 0x7) {
787 case INT_UNDERRUN:
Arvid Brodin6bda21b2011-02-26 22:06:37 +0100788 dev_err(hcd->self.controller, "Underrun (%d)\n", i);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200789 break;
790
791 case INT_EXACT:
Arvid Brodin6bda21b2011-02-26 22:06:37 +0100792 dev_err(hcd->self.controller,
793 "Transaction error (%d)\n", i);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200794 break;
795
796 case INT_BABBLE:
Arvid Brodin6bda21b2011-02-26 22:06:37 +0100797 dev_err(hcd->self.controller, "Babble error (%d)\n", i);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200798 break;
799 }
800 dw4 >>= 3;
801 }
802}
803
Arvid Brodin6bda21b2011-02-26 22:06:37 +0100804static void enqueue_one_qtd(struct usb_hcd *hcd, struct isp1760_qtd *qtd)
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200805{
Arvid Brodina041d8e2011-02-26 22:04:40 +0100806 if (qtd->length && (qtd->length <= MAX_PAYLOAD_SIZE)) {
807 switch (qtd->packet_type) {
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200808 case IN_PID:
809 break;
810 case OUT_PID:
811 case SETUP_PID:
Arvid Brodina041d8e2011-02-26 22:04:40 +0100812 mem_writes8(hcd->regs, qtd->payload_addr,
813 qtd->data_buffer, qtd->length);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200814 }
815 }
816}
817
Arvid Brodin6bda21b2011-02-26 22:06:37 +0100818static void enqueue_one_atl_qtd(struct usb_hcd *hcd, struct isp1760_qh *qh,
819 u32 slot, struct isp1760_qtd *qtd)
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200820{
Arvid Brodin6bda21b2011-02-26 22:06:37 +0100821 struct isp1760_hcd *priv = hcd_to_priv(hcd);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200822 struct ptd ptd;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200823
Arvid Brodin6bda21b2011-02-26 22:06:37 +0100824 alloc_mem(hcd, qtd);
825 transform_into_atl(qh, qtd, &ptd);
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100826 ptd_write(hcd->regs, ATL_PTD_OFFSET, slot, &ptd);
Arvid Brodin6bda21b2011-02-26 22:06:37 +0100827 enqueue_one_qtd(hcd, qtd);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200828
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200829 priv->atl_ints[slot].qh = qh;
830 priv->atl_ints[slot].qtd = qtd;
Arvid Brodinfd436ae2011-02-26 22:03:49 +0100831 qtd->status |= URB_ENQUEUED;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200832 qtd->status |= slot << 16;
833}
834
Arvid Brodin6bda21b2011-02-26 22:06:37 +0100835static void enqueue_one_int_qtd(struct usb_hcd *hcd, struct isp1760_qh *qh,
836 u32 slot, struct isp1760_qtd *qtd)
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200837{
Arvid Brodin6bda21b2011-02-26 22:06:37 +0100838 struct isp1760_hcd *priv = hcd_to_priv(hcd);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200839 struct ptd ptd;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200840
Arvid Brodin6bda21b2011-02-26 22:06:37 +0100841 alloc_mem(hcd, qtd);
842 transform_into_int(qh, qtd, &ptd);
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100843 ptd_write(hcd->regs, INT_PTD_OFFSET, slot, &ptd);
Arvid Brodin6bda21b2011-02-26 22:06:37 +0100844 enqueue_one_qtd(hcd, qtd);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200845
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200846 priv->int_ints[slot].qh = qh;
847 priv->int_ints[slot].qtd = qtd;
Arvid Brodinfd436ae2011-02-26 22:03:49 +0100848 qtd->status |= URB_ENQUEUED;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200849 qtd->status |= slot << 16;
850}
851
Adrian Bunk473bca92008-05-05 21:25:33 +0300852static void enqueue_an_ATL_packet(struct usb_hcd *hcd, struct isp1760_qh *qh,
853 struct isp1760_qtd *qtd)
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200854{
855 struct isp1760_hcd *priv = hcd_to_priv(hcd);
856 u32 skip_map, or_map;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200857 u32 slot;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200858 u32 buffstatus;
859
Catalin Marinase6bdfe32009-03-23 12:38:16 +0000860 /*
861 * When this function is called from the interrupt handler to enqueue
862 * a follow-up packet, the SKIP register gets written and read back
863 * almost immediately. With ISP1761, this register requires a delay of
864 * 195ns between a write and subsequent read (see section 15.1.1.3).
865 */
Michael Hennerichebb8a4e2010-08-05 17:53:57 -0400866 mmiowb();
Catalin Marinase6bdfe32009-03-23 12:38:16 +0000867 ndelay(195);
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100868 skip_map = reg_read32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200869
870 BUG_ON(!skip_map);
871 slot = __ffs(skip_map);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200872
Arvid Brodin6bda21b2011-02-26 22:06:37 +0100873 enqueue_one_atl_qtd(hcd, qh, slot, qtd);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200874
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100875 or_map = reg_read32(hcd->regs, HC_ATL_IRQ_MASK_OR_REG);
Arvid Brodin6bda21b2011-02-26 22:06:37 +0100876 or_map |= (1 << slot);
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100877 reg_write32(hcd->regs, HC_ATL_IRQ_MASK_OR_REG, or_map);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200878
Arvid Brodin6bda21b2011-02-26 22:06:37 +0100879 skip_map &= ~(1 << slot);
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100880 reg_write32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG, skip_map);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200881
Sebastian Andrzej Siewiorb14e8402011-02-08 21:07:40 +0100882 priv->atl_queued++;
883 if (priv->atl_queued == 2)
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100884 reg_write32(hcd->regs, HC_INTERRUPT_ENABLE,
885 INTERRUPT_ENABLE_SOT_MASK);
Sebastian Andrzej Siewiorb14e8402011-02-08 21:07:40 +0100886
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100887 buffstatus = reg_read32(hcd->regs, HC_BUFFER_STATUS_REG);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200888 buffstatus |= ATL_BUFFER;
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100889 reg_write32(hcd->regs, HC_BUFFER_STATUS_REG, buffstatus);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200890}
891
Adrian Bunk473bca92008-05-05 21:25:33 +0300892static void enqueue_an_INT_packet(struct usb_hcd *hcd, struct isp1760_qh *qh,
893 struct isp1760_qtd *qtd)
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200894{
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200895 u32 skip_map, or_map;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200896 u32 slot;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200897 u32 buffstatus;
898
Catalin Marinase6bdfe32009-03-23 12:38:16 +0000899 /*
900 * When this function is called from the interrupt handler to enqueue
901 * a follow-up packet, the SKIP register gets written and read back
902 * almost immediately. With ISP1761, this register requires a delay of
903 * 195ns between a write and subsequent read (see section 15.1.1.3).
904 */
Michael Hennerichebb8a4e2010-08-05 17:53:57 -0400905 mmiowb();
Catalin Marinase6bdfe32009-03-23 12:38:16 +0000906 ndelay(195);
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100907 skip_map = reg_read32(hcd->regs, HC_INT_PTD_SKIPMAP_REG);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200908
909 BUG_ON(!skip_map);
910 slot = __ffs(skip_map);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200911
Arvid Brodin6bda21b2011-02-26 22:06:37 +0100912 enqueue_one_int_qtd(hcd, qh, slot, qtd);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200913
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100914 or_map = reg_read32(hcd->regs, HC_INT_IRQ_MASK_OR_REG);
Arvid Brodin6bda21b2011-02-26 22:06:37 +0100915 or_map |= (1 << slot);
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100916 reg_write32(hcd->regs, HC_INT_IRQ_MASK_OR_REG, or_map);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200917
Arvid Brodin6bda21b2011-02-26 22:06:37 +0100918 skip_map &= ~(1 << slot);
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100919 reg_write32(hcd->regs, HC_INT_PTD_SKIPMAP_REG, skip_map);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200920
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100921 buffstatus = reg_read32(hcd->regs, HC_BUFFER_STATUS_REG);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200922 buffstatus |= INT_BUFFER;
Arvid Brodinbedc0c32011-02-26 22:02:57 +0100923 reg_write32(hcd->regs, HC_BUFFER_STATUS_REG, buffstatus);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200924}
925
Arvid Brodin6bda21b2011-02-26 22:06:37 +0100926static void isp1760_urb_done(struct usb_hcd *hcd, struct urb *urb)
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200927__releases(priv->lock)
928__acquires(priv->lock)
929{
Arvid Brodin6bda21b2011-02-26 22:06:37 +0100930 struct isp1760_hcd *priv = hcd_to_priv(hcd);
931
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200932 if (!urb->unlinked) {
Arvid Brodin6bda21b2011-02-26 22:06:37 +0100933 if (urb->status == -EINPROGRESS)
934 urb->status = 0;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200935 }
936
Catalin Marinasdb8516f2010-02-02 15:31:02 +0000937 if (usb_pipein(urb->pipe) && usb_pipetype(urb->pipe) != PIPE_CONTROL) {
938 void *ptr;
939 for (ptr = urb->transfer_buffer;
940 ptr < urb->transfer_buffer + urb->transfer_buffer_length;
941 ptr += PAGE_SIZE)
942 flush_dcache_page(virt_to_page(ptr));
943 }
944
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200945 /* complete() can reenter this HCD */
Arvid Brodin6bda21b2011-02-26 22:06:37 +0100946 usb_hcd_unlink_urb_from_ep(hcd, urb);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200947 spin_unlock(&priv->lock);
Arvid Brodin6bda21b2011-02-26 22:06:37 +0100948 usb_hcd_giveback_urb(hcd, urb, urb->status);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200949 spin_lock(&priv->lock);
950}
951
952static void isp1760_qtd_free(struct isp1760_qtd *qtd)
953{
Arvid Brodina041d8e2011-02-26 22:04:40 +0100954 BUG_ON(qtd->payload_addr);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200955 kmem_cache_free(qtd_cachep, qtd);
956}
957
Arvid Brodinfd436ae2011-02-26 22:03:49 +0100958static struct isp1760_qtd *clean_this_qtd(struct isp1760_qtd *qtd,
959 struct isp1760_qh *qh)
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200960{
961 struct isp1760_qtd *tmp_qtd;
962
Arvid Brodinfd436ae2011-02-26 22:03:49 +0100963 if (list_is_last(&qtd->qtd_list, &qh->qtd_list))
964 tmp_qtd = NULL;
965 else
966 tmp_qtd = list_entry(qtd->qtd_list.next, struct isp1760_qtd,
967 qtd_list);
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200968 list_del(&qtd->qtd_list);
969 isp1760_qtd_free(qtd);
970 return tmp_qtd;
971}
972
973/*
974 * Remove this QTD from the QH list and free its memory. If this QTD
975 * isn't the last one than remove also his successor(s).
976 * Returns the QTD which is part of an new URB and should be enqueued.
977 */
Arvid Brodinfd436ae2011-02-26 22:03:49 +0100978static struct isp1760_qtd *clean_up_qtdlist(struct isp1760_qtd *qtd,
979 struct isp1760_qh *qh)
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200980{
Arvid Brodinfd436ae2011-02-26 22:03:49 +0100981 struct urb *urb;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200982
Arvid Brodinfd436ae2011-02-26 22:03:49 +0100983 urb = qtd->urb;
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200984 do {
Arvid Brodinfd436ae2011-02-26 22:03:49 +0100985 qtd = clean_this_qtd(qtd, qh);
986 } while (qtd && (qtd->urb == urb));
Sebastian Siewiordb11e472008-04-24 00:37:04 +0200987
988 return qtd;
989}
990
Arvid Brodinfd436ae2011-02-26 22:03:49 +0100991static int last_qtd_of_urb(struct isp1760_qtd *qtd, struct isp1760_qh *qh)
992{
993 struct urb *urb;
994
995 if (list_is_last(&qtd->qtd_list, &qh->qtd_list))
996 return 1;
997
998 urb = qtd->urb;
999 qtd = list_entry(qtd->qtd_list.next, typeof(*qtd), qtd_list);
1000 return (qtd->urb != urb);
1001}
1002
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001003static void do_atl_int(struct usb_hcd *hcd)
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001004{
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001005 struct isp1760_hcd *priv = hcd_to_priv(hcd);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001006 u32 done_map, skip_map;
1007 struct ptd ptd;
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001008 struct urb *urb;
1009 u32 slot;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001010 u32 length;
1011 u32 or_map;
1012 u32 status = -EINVAL;
1013 int error;
1014 struct isp1760_qtd *qtd;
1015 struct isp1760_qh *qh;
1016 u32 rl;
1017 u32 nakcount;
1018
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001019 done_map = reg_read32(hcd->regs, HC_ATL_PTD_DONEMAP_REG);
1020 skip_map = reg_read32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001021
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001022 or_map = reg_read32(hcd->regs, HC_ATL_IRQ_MASK_OR_REG);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001023 or_map &= ~done_map;
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001024 reg_write32(hcd->regs, HC_ATL_IRQ_MASK_OR_REG, or_map);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001025
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001026 while (done_map) {
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001027 status = 0;
Sebastian Andrzej Siewiorb14e8402011-02-08 21:07:40 +01001028 priv->atl_queued--;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001029
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001030 slot = __ffs(done_map);
1031 done_map &= ~(1 << slot);
1032 skip_map |= (1 << slot);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001033
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001034 qtd = priv->atl_ints[slot].qtd;
1035 qh = priv->atl_ints[slot].qh;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001036
1037 if (!qh) {
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001038 dev_err(hcd->self.controller, "qh is 0\n");
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001039 continue;
1040 }
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001041 ptd_read(hcd->regs, ATL_PTD_OFFSET, slot, &ptd);
Enrico Scholz3f02a952008-07-17 20:09:30 +02001042
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001043 rl = (ptd.dw2 >> 25) & 0x0f;
1044 nakcount = (ptd.dw3 >> 19) & 0xf;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001045
1046 /* Transfer Error, *but* active and no HALT -> reload */
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001047 if ((ptd.dw3 & DW3_ERROR_BIT) && (ptd.dw3 & DW3_QTD_ACTIVE) &&
1048 !(ptd.dw3 & DW3_HALT_BIT)) {
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001049
1050 /* according to ppriv code, we have to
1051 * reload this one if trasfered bytes != requested bytes
1052 * else act like everything went smooth..
1053 * XXX This just doesn't feel right and hasn't
1054 * triggered so far.
1055 */
1056
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001057 length = PTD_XFERRED_LENGTH(ptd.dw3);
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001058 dev_err(hcd->self.controller,
1059 "Should reload now... transferred %d "
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001060 "of %zu\n", length, qtd->length);
1061 BUG();
1062 }
1063
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001064 if (!nakcount && (ptd.dw3 & DW3_QTD_ACTIVE)) {
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001065 u32 buffstatus;
1066
Colin Tuckleyc0d74142010-01-07 11:22:47 +00001067 /*
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001068 * NAKs are handled in HW by the chip. Usually if the
1069 * device is not able to send data fast enough.
Colin Tuckleyc0d74142010-01-07 11:22:47 +00001070 * This happens mostly on slower hardware.
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001071 */
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001072
1073 /* RL counter = ERR counter */
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001074 ptd.dw3 &= ~(0xf << 19);
1075 ptd.dw3 |= rl << 19;
1076 ptd.dw3 &= ~(3 << (55 - 32));
1077 ptd.dw3 |= ERR_COUNTER << (55 - 32);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001078
1079 /*
1080 * It is not needed to write skip map back because it
1081 * is unchanged. Just make sure that this entry is
1082 * unskipped once it gets written to the HW.
1083 */
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001084 skip_map &= ~(1 << slot);
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001085 or_map = reg_read32(hcd->regs, HC_ATL_IRQ_MASK_OR_REG);
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001086 or_map |= 1 << slot;
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001087 reg_write32(hcd->regs, HC_ATL_IRQ_MASK_OR_REG, or_map);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001088
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001089 ptd.dw0 |= PTD_VALID;
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001090 ptd_write(hcd->regs, ATL_PTD_OFFSET, slot, &ptd);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001091
Sebastian Andrzej Siewiorb14e8402011-02-08 21:07:40 +01001092 priv->atl_queued++;
1093 if (priv->atl_queued == 2)
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001094 reg_write32(hcd->regs, HC_INTERRUPT_ENABLE,
1095 INTERRUPT_ENABLE_SOT_MASK);
Sebastian Andrzej Siewiorb14e8402011-02-08 21:07:40 +01001096
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001097 buffstatus = reg_read32(hcd->regs,
1098 HC_BUFFER_STATUS_REG);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001099 buffstatus |= ATL_BUFFER;
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001100 reg_write32(hcd->regs, HC_BUFFER_STATUS_REG,
1101 buffstatus);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001102 continue;
1103 }
1104
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001105 error = check_error(hcd, &ptd);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001106 if (error) {
1107 status = error;
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001108 priv->atl_ints[slot].qh->toggle = 0;
1109 priv->atl_ints[slot].qh->ping = 0;
1110 qtd->urb->status = -EPIPE;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001111
1112#if 0
1113 printk(KERN_ERR "Error in %s().\n", __func__);
1114 printk(KERN_ERR "IN dw0: %08x dw1: %08x dw2: %08x "
1115 "dw3: %08x dw4: %08x dw5: %08x dw6: "
1116 "%08x dw7: %08x\n",
1117 ptd.dw0, ptd.dw1, ptd.dw2, ptd.dw3,
1118 ptd.dw4, ptd.dw5, ptd.dw6, ptd.dw7);
1119#endif
1120 } else {
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001121 if (usb_pipetype(qtd->urb->pipe) == PIPE_BULK) {
1122 priv->atl_ints[slot].qh->toggle =
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001123 ptd.dw3 & (1 << 25);
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001124 priv->atl_ints[slot].qh->ping =
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001125 ptd.dw3 & (1 << 26);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001126 }
1127 }
1128
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001129 length = PTD_XFERRED_LENGTH(ptd.dw3);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001130 if (length) {
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001131 switch (DW1_GET_PID(ptd.dw1)) {
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001132 case IN_PID:
Arvid Brodina041d8e2011-02-26 22:04:40 +01001133 mem_reads8(hcd->regs, qtd->payload_addr,
Arvid Brodinbbaa3872011-02-26 22:05:26 +01001134 qtd->data_buffer, length);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001135
1136 case OUT_PID:
1137
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001138 qtd->urb->actual_length += length;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001139
1140 case SETUP_PID:
1141 break;
1142 }
1143 }
1144
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001145 priv->atl_ints[slot].qtd = NULL;
1146 priv->atl_ints[slot].qh = NULL;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001147
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001148 free_mem(hcd, qtd);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001149
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001150 reg_write32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG, skip_map);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001151
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001152 if (qtd->urb->status == -EPIPE) {
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001153 /* HALT was received */
1154
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001155 urb = qtd->urb;
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001156 qtd = clean_up_qtdlist(qtd, qh);
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001157 isp1760_urb_done(hcd, urb);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001158
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001159 } else if (usb_pipebulk(qtd->urb->pipe) &&
1160 (length < qtd->length)) {
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001161 /* short BULK received */
1162
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001163 if (qtd->urb->transfer_flags & URB_SHORT_NOT_OK) {
1164 qtd->urb->status = -EREMOTEIO;
1165 dev_dbg(hcd->self.controller,
1166 "short bulk, %d instead %zu "
1167 "with URB_SHORT_NOT_OK flag.\n",
1168 length, qtd->length);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001169 }
1170
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001171 if (qtd->urb->status == -EINPROGRESS)
1172 qtd->urb->status = 0;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001173
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001174 urb = qtd->urb;
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001175 qtd = clean_up_qtdlist(qtd, qh);
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001176 isp1760_urb_done(hcd, urb);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001177
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001178 } else if (last_qtd_of_urb(qtd, qh)) {
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001179 /* that was the last qtd of that URB */
1180
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001181 if (qtd->urb->status == -EINPROGRESS)
1182 qtd->urb->status = 0;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001183
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001184 urb = qtd->urb;
1185 qtd = clean_up_qtdlist(qtd, qh);
1186 isp1760_urb_done(hcd, urb);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001187
1188 } else {
1189 /* next QTD of this URB */
1190
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001191 qtd = clean_this_qtd(qtd, qh);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001192 BUG_ON(!qtd);
1193 }
1194
1195 if (qtd)
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001196 enqueue_an_ATL_packet(hcd, qh, qtd);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001197
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001198 skip_map = reg_read32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001199 }
Sebastian Andrzej Siewiorb14e8402011-02-08 21:07:40 +01001200 if (priv->atl_queued <= 1)
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001201 reg_write32(hcd->regs, HC_INTERRUPT_ENABLE,
1202 INTERRUPT_ENABLE_MASK);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001203}
1204
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001205static void do_intl_int(struct usb_hcd *hcd)
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001206{
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001207 struct isp1760_hcd *priv = hcd_to_priv(hcd);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001208 u32 done_map, skip_map;
1209 struct ptd ptd;
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001210 struct urb *urb;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001211 u32 length;
1212 u32 or_map;
1213 int error;
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001214 u32 slot;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001215 struct isp1760_qtd *qtd;
1216 struct isp1760_qh *qh;
1217
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001218 done_map = reg_read32(hcd->regs, HC_INT_PTD_DONEMAP_REG);
1219 skip_map = reg_read32(hcd->regs, HC_INT_PTD_SKIPMAP_REG);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001220
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001221 or_map = reg_read32(hcd->regs, HC_INT_IRQ_MASK_OR_REG);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001222 or_map &= ~done_map;
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001223 reg_write32(hcd->regs, HC_INT_IRQ_MASK_OR_REG, or_map);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001224
1225 while (done_map) {
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001226 slot = __ffs(done_map);
1227 done_map &= ~(1 << slot);
1228 skip_map |= (1 << slot);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001229
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001230 qtd = priv->int_ints[slot].qtd;
1231 qh = priv->int_ints[slot].qh;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001232
1233 if (!qh) {
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001234 dev_err(hcd->self.controller, "(INT) qh is 0\n");
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001235 continue;
1236 }
1237
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001238 ptd_read(hcd->regs, INT_PTD_OFFSET, slot, &ptd);
1239 check_int_err_status(hcd, ptd.dw4);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001240
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001241 error = check_error(hcd, &ptd);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001242 if (error) {
1243#if 0
1244 printk(KERN_ERR "Error in %s().\n", __func__);
1245 printk(KERN_ERR "IN dw0: %08x dw1: %08x dw2: %08x "
1246 "dw3: %08x dw4: %08x dw5: %08x dw6: "
1247 "%08x dw7: %08x\n",
1248 ptd.dw0, ptd.dw1, ptd.dw2, ptd.dw3,
1249 ptd.dw4, ptd.dw5, ptd.dw6, ptd.dw7);
1250#endif
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001251 qtd->urb->status = -EPIPE;
1252 priv->int_ints[slot].qh->toggle = 0;
1253 priv->int_ints[slot].qh->ping = 0;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001254
1255 } else {
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001256 priv->int_ints[slot].qh->toggle = ptd.dw3 & (1 << 25);
1257 priv->int_ints[slot].qh->ping = ptd.dw3 & (1 << 26);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001258 }
1259
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001260 if (qtd->urb->dev->speed != USB_SPEED_HIGH)
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001261 length = PTD_XFERRED_LENGTH_LO(ptd.dw3);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001262 else
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001263 length = PTD_XFERRED_LENGTH(ptd.dw3);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001264
1265 if (length) {
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001266 switch (DW1_GET_PID(ptd.dw1)) {
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001267 case IN_PID:
Arvid Brodina041d8e2011-02-26 22:04:40 +01001268 mem_reads8(hcd->regs, qtd->payload_addr,
Arvid Brodinbbaa3872011-02-26 22:05:26 +01001269 qtd->data_buffer, length);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001270 case OUT_PID:
1271
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001272 qtd->urb->actual_length += length;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001273
1274 case SETUP_PID:
1275 break;
1276 }
1277 }
1278
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001279 priv->int_ints[slot].qtd = NULL;
1280 priv->int_ints[slot].qh = NULL;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001281
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001282 reg_write32(hcd->regs, HC_INT_PTD_SKIPMAP_REG, skip_map);
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001283 free_mem(hcd, qtd);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001284
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001285 if (qtd->urb->status == -EPIPE) {
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001286 /* HALT received */
1287
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001288 urb = qtd->urb;
1289 qtd = clean_up_qtdlist(qtd, qh);
1290 isp1760_urb_done(hcd, urb);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001291
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001292 } else if (last_qtd_of_urb(qtd, qh)) {
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001293
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001294 if (qtd->urb->status == -EINPROGRESS)
1295 qtd->urb->status = 0;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001296
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001297 urb = qtd->urb;
1298 qtd = clean_up_qtdlist(qtd, qh);
1299 isp1760_urb_done(hcd, urb);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001300
1301 } else {
1302 /* next QTD of this URB */
1303
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001304 qtd = clean_this_qtd(qtd, qh);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001305 BUG_ON(!qtd);
1306 }
1307
1308 if (qtd)
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001309 enqueue_an_INT_packet(hcd, qh, qtd);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001310
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001311 skip_map = reg_read32(hcd->regs, HC_INT_PTD_SKIPMAP_REG);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001312 }
1313}
1314
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001315static struct isp1760_qh *qh_make(struct usb_hcd *hcd, struct urb *urb,
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001316 gfp_t flags)
1317{
1318 struct isp1760_qh *qh;
1319 int is_input, type;
1320
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001321 qh = isp1760_qh_alloc(flags);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001322 if (!qh)
1323 return qh;
1324
1325 /*
1326 * init endpoint/device data for this QH
1327 */
1328 is_input = usb_pipein(urb->pipe);
1329 type = usb_pipetype(urb->pipe);
1330
1331 if (type == PIPE_INTERRUPT) {
1332
1333 if (urb->dev->speed == USB_SPEED_HIGH) {
1334
1335 qh->period = urb->interval >> 3;
1336 if (qh->period == 0 && urb->interval != 1) {
1337 /* NOTE interval 2 or 4 uframes could work.
1338 * But interval 1 scheduling is simpler, and
1339 * includes high bandwidth.
1340 */
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001341 dev_err(hcd->self.controller, "intr period %d uframes, NYET!",
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001342 urb->interval);
1343 qh_destroy(qh);
1344 return NULL;
1345 }
1346 } else {
1347 qh->period = urb->interval;
1348 }
1349 }
1350
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001351 if (!usb_pipecontrol(urb->pipe))
1352 usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe), !is_input,
1353 1);
1354 return qh;
1355}
1356
1357/*
1358 * For control/bulk/interrupt, return QH with these TDs appended.
1359 * Allocates and initializes the QH if necessary.
1360 * Returns null if it can't allocate a QH it needs to.
1361 * If the QH has TDs (urbs) already, that's great.
1362 */
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001363static struct isp1760_qh *qh_append_tds(struct usb_hcd *hcd,
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001364 struct urb *urb, struct list_head *qtd_list, int epnum,
1365 void **ptr)
1366{
1367 struct isp1760_qh *qh;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001368
1369 qh = (struct isp1760_qh *)*ptr;
1370 if (!qh) {
1371 /* can't sleep here, we have priv->lock... */
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001372 qh = qh_make(hcd, urb, GFP_ATOMIC);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001373 if (!qh)
1374 return qh;
1375 *ptr = qh;
1376 }
1377
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001378 list_splice(qtd_list, qh->qtd_list.prev);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001379
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001380 return qh;
1381}
1382
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001383static void qtd_list_free(struct urb *urb, struct list_head *qtd_list)
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001384{
1385 struct list_head *entry, *temp;
1386
1387 list_for_each_safe(entry, temp, qtd_list) {
1388 struct isp1760_qtd *qtd;
1389
1390 qtd = list_entry(entry, struct isp1760_qtd, qtd_list);
1391 list_del(&qtd->qtd_list);
1392 isp1760_qtd_free(qtd);
1393 }
1394}
1395
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001396static int isp1760_prepare_enqueue(struct usb_hcd *hcd, struct urb *urb,
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001397 struct list_head *qtd_list, gfp_t mem_flags, packet_enqueue *p)
1398{
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001399 struct isp1760_hcd *priv = hcd_to_priv(hcd);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001400 struct isp1760_qtd *qtd;
1401 int epnum;
1402 unsigned long flags;
1403 struct isp1760_qh *qh = NULL;
1404 int rc;
1405 int qh_busy;
1406
1407 qtd = list_entry(qtd_list->next, struct isp1760_qtd, qtd_list);
1408 epnum = urb->ep->desc.bEndpointAddress;
1409
1410 spin_lock_irqsave(&priv->lock, flags);
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001411 if (!HCD_HW_ACCESSIBLE(hcd)) {
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001412 rc = -ESHUTDOWN;
1413 goto done;
1414 }
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001415 rc = usb_hcd_link_urb_to_ep(hcd, urb);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001416 if (rc)
1417 goto done;
1418
1419 qh = urb->ep->hcpriv;
1420 if (qh)
1421 qh_busy = !list_empty(&qh->qtd_list);
1422 else
1423 qh_busy = 0;
1424
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001425 qh = qh_append_tds(hcd, urb, qtd_list, epnum, &urb->ep->hcpriv);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001426 if (!qh) {
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001427 usb_hcd_unlink_urb_from_ep(hcd, urb);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001428 rc = -ENOMEM;
1429 goto done;
1430 }
1431
1432 if (!qh_busy)
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001433 p(hcd, qh, qtd);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001434
1435done:
1436 spin_unlock_irqrestore(&priv->lock, flags);
1437 if (!qh)
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001438 qtd_list_free(urb, qtd_list);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001439 return rc;
1440}
1441
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001442static struct isp1760_qtd *isp1760_qtd_alloc(gfp_t flags)
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001443{
1444 struct isp1760_qtd *qtd;
1445
1446 qtd = kmem_cache_zalloc(qtd_cachep, flags);
1447 if (qtd)
1448 INIT_LIST_HEAD(&qtd->qtd_list);
1449
1450 return qtd;
1451}
1452
1453/*
1454 * create a list of filled qtds for this URB; won't link into qh.
1455 */
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001456#define max_packet(wMaxPacketSize) ((wMaxPacketSize) & 0x07ff)
1457static struct list_head *qh_urb_transaction(struct usb_hcd *hcd,
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001458 struct urb *urb, struct list_head *head, gfp_t flags)
1459{
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001460 struct isp1760_qtd *qtd;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001461 void *buf;
1462 int len, maxpacket;
1463 int is_input;
1464 u32 token;
1465
1466 /*
1467 * URBs map to sequences of QTDs: one logical transaction
1468 */
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001469 qtd = isp1760_qtd_alloc(flags);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001470 if (!qtd)
1471 return NULL;
1472
1473 list_add_tail(&qtd->qtd_list, head);
1474 qtd->urb = urb;
1475 urb->status = -EINPROGRESS;
1476
1477 token = 0;
1478 /* for split transactions, SplitXState initialized to zero */
1479
1480 len = urb->transfer_buffer_length;
1481 is_input = usb_pipein(urb->pipe);
1482 if (usb_pipecontrol(urb->pipe)) {
1483 /* SETUP pid */
1484 qtd_fill(qtd, urb->setup_packet,
1485 sizeof(struct usb_ctrlrequest),
1486 token | SETUP_PID);
1487
1488 /* ... and always at least one more pid */
1489 token ^= DATA_TOGGLE;
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001490 qtd = isp1760_qtd_alloc(flags);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001491 if (!qtd)
1492 goto cleanup;
1493 qtd->urb = urb;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001494 list_add_tail(&qtd->qtd_list, head);
1495
1496 /* for zero length DATA stages, STATUS is always IN */
1497 if (len == 0)
1498 token |= IN_PID;
1499 }
1500
1501 /*
1502 * data transfer stage: buffer setup
1503 */
1504 buf = urb->transfer_buffer;
1505
1506 if (is_input)
1507 token |= IN_PID;
1508 else
1509 token |= OUT_PID;
1510
1511 maxpacket = max_packet(usb_maxpacket(urb->dev, urb->pipe, !is_input));
1512
1513 /*
1514 * buffer gets wrapped in one or more qtds;
1515 * last one may be "short" (including zero len)
1516 * and may serve as a control status ack
1517 */
1518 for (;;) {
1519 int this_qtd_len;
1520
1521 if (!buf && len) {
1522 /* XXX This looks like usb storage / SCSI bug */
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001523 dev_err(hcd->self.controller, "buf is null, dma is %08lx len is %d\n",
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001524 (long unsigned)urb->transfer_dma, len);
1525 WARN_ON(1);
1526 }
1527
1528 this_qtd_len = qtd_fill(qtd, buf, len, token);
1529 len -= this_qtd_len;
1530 buf += this_qtd_len;
1531
1532 /* qh makes control packets use qtd toggle; maybe switch it */
1533 if ((maxpacket & (this_qtd_len + (maxpacket - 1))) == 0)
1534 token ^= DATA_TOGGLE;
1535
1536 if (len <= 0)
1537 break;
1538
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001539 qtd = isp1760_qtd_alloc(flags);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001540 if (!qtd)
1541 goto cleanup;
1542 qtd->urb = urb;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001543 list_add_tail(&qtd->qtd_list, head);
1544 }
1545
1546 /*
1547 * control requests may need a terminating data "status" ack;
1548 * bulk ones may need a terminating short packet (zero length).
1549 */
1550 if (urb->transfer_buffer_length != 0) {
1551 int one_more = 0;
1552
1553 if (usb_pipecontrol(urb->pipe)) {
1554 one_more = 1;
1555 /* "in" <--> "out" */
1556 token ^= IN_PID;
1557 /* force DATA1 */
1558 token |= DATA_TOGGLE;
1559 } else if (usb_pipebulk(urb->pipe)
1560 && (urb->transfer_flags & URB_ZERO_PACKET)
1561 && !(urb->transfer_buffer_length % maxpacket)) {
1562 one_more = 1;
1563 }
1564 if (one_more) {
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001565 qtd = isp1760_qtd_alloc(flags);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001566 if (!qtd)
1567 goto cleanup;
1568 qtd->urb = urb;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001569 list_add_tail(&qtd->qtd_list, head);
1570
1571 /* never any data in such packets */
1572 qtd_fill(qtd, NULL, 0, token);
1573 }
1574 }
1575
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001576 qtd->status = 0;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001577 return head;
1578
1579cleanup:
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001580 qtd_list_free(urb, head);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001581 return NULL;
1582}
1583
1584static int isp1760_urb_enqueue(struct usb_hcd *hcd, struct urb *urb,
1585 gfp_t mem_flags)
1586{
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001587 struct list_head qtd_list;
1588 packet_enqueue *pe;
1589
1590 INIT_LIST_HEAD(&qtd_list);
1591
1592 switch (usb_pipetype(urb->pipe)) {
1593 case PIPE_CONTROL:
1594 case PIPE_BULK:
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001595 if (!qh_urb_transaction(hcd, urb, &qtd_list, mem_flags))
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001596 return -ENOMEM;
1597 pe = enqueue_an_ATL_packet;
1598 break;
1599
1600 case PIPE_INTERRUPT:
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001601 if (!qh_urb_transaction(hcd, urb, &qtd_list, mem_flags))
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001602 return -ENOMEM;
1603 pe = enqueue_an_INT_packet;
1604 break;
1605
1606 case PIPE_ISOCHRONOUS:
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001607 dev_err(hcd->self.controller, "PIPE_ISOCHRONOUS ain't supported\n");
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001608 default:
1609 return -EPIPE;
1610 }
1611
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001612 return isp1760_prepare_enqueue(hcd, urb, &qtd_list, mem_flags, pe);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001613}
1614
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001615static int isp1760_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status)
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001616{
1617 struct isp1760_hcd *priv = hcd_to_priv(hcd);
1618 struct inter_packet_info *ints;
1619 u32 i;
1620 u32 reg_base, or_reg, skip_reg;
Andrew Mortond249afd2008-06-09 16:39:52 -07001621 unsigned long flags;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001622 struct ptd ptd;
Warren Free0afb20e2009-05-08 10:27:08 +02001623 packet_enqueue *pe;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001624
1625 switch (usb_pipetype(urb->pipe)) {
1626 case PIPE_ISOCHRONOUS:
1627 return -EPIPE;
1628 break;
1629
1630 case PIPE_INTERRUPT:
1631 ints = priv->int_ints;
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001632 reg_base = INT_PTD_OFFSET;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001633 or_reg = HC_INT_IRQ_MASK_OR_REG;
1634 skip_reg = HC_INT_PTD_SKIPMAP_REG;
Warren Free0afb20e2009-05-08 10:27:08 +02001635 pe = enqueue_an_INT_packet;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001636 break;
1637
1638 default:
1639 ints = priv->atl_ints;
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001640 reg_base = ATL_PTD_OFFSET;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001641 or_reg = HC_ATL_IRQ_MASK_OR_REG;
1642 skip_reg = HC_ATL_PTD_SKIPMAP_REG;
Warren Free0afb20e2009-05-08 10:27:08 +02001643 pe = enqueue_an_ATL_packet;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001644 break;
1645 }
1646
1647 memset(&ptd, 0, sizeof(ptd));
1648 spin_lock_irqsave(&priv->lock, flags);
1649
1650 for (i = 0; i < 32; i++) {
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001651 if (!ints[i].qh)
1652 continue;
1653 BUG_ON(!ints[i].qtd);
1654
1655 if (ints[i].qtd->urb == urb) {
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001656 u32 skip_map;
1657 u32 or_map;
1658 struct isp1760_qtd *qtd;
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001659 struct isp1760_qh *qh;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001660
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001661 skip_map = reg_read32(hcd->regs, skip_reg);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001662 skip_map |= 1 << i;
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001663 reg_write32(hcd->regs, skip_reg, skip_map);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001664
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001665 or_map = reg_read32(hcd->regs, or_reg);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001666 or_map &= ~(1 << i);
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001667 reg_write32(hcd->regs, or_reg, or_map);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001668
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001669 ptd_write(hcd->regs, reg_base, i, &ptd);
1670
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001671 qtd = ints->qtd;
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001672 qh = ints[i].qh;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001673
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001674 free_mem(hcd, qtd);
Arvid Brodina041d8e2011-02-26 22:04:40 +01001675 qtd = clean_up_qtdlist(qtd, qh);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001676
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001677 ints->qh = NULL;
1678 ints->qtd = NULL;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001679
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001680 isp1760_urb_done(hcd, urb);
Warren Free0afb20e2009-05-08 10:27:08 +02001681 if (qtd)
1682 pe(hcd, qh, qtd);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001683 break;
Warren Free0afb20e2009-05-08 10:27:08 +02001684
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001685 } else {
1686 struct isp1760_qtd *qtd;
Warren Free0afb20e2009-05-08 10:27:08 +02001687
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001688 list_for_each_entry(qtd, &ints[i].qtd->qtd_list,
1689 qtd_list) {
Warren Free0afb20e2009-05-08 10:27:08 +02001690 if (qtd->urb == urb) {
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001691 clean_up_qtdlist(qtd, ints[i].qh);
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001692 isp1760_urb_done(hcd, urb);
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001693 qtd = NULL;
Warren Free0afb20e2009-05-08 10:27:08 +02001694 break;
1695 }
Warren Free0afb20e2009-05-08 10:27:08 +02001696 }
Arvid Brodinfd436ae2011-02-26 22:03:49 +01001697
1698 /* We found the urb before the last slot */
1699 if (!qtd)
Warren Free0afb20e2009-05-08 10:27:08 +02001700 break;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001701 }
1702 ints++;
1703 }
1704
1705 spin_unlock_irqrestore(&priv->lock, flags);
1706 return 0;
1707}
1708
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001709static irqreturn_t isp1760_irq(struct usb_hcd *hcd)
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001710{
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001711 struct isp1760_hcd *priv = hcd_to_priv(hcd);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001712 u32 imask;
1713 irqreturn_t irqret = IRQ_NONE;
1714
1715 spin_lock(&priv->lock);
1716
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001717 if (!(hcd->state & HC_STATE_RUNNING))
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001718 goto leave;
1719
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001720 imask = reg_read32(hcd->regs, HC_INTERRUPT_REG);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001721 if (unlikely(!imask))
1722 goto leave;
1723
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001724 reg_write32(hcd->regs, HC_INTERRUPT_REG, imask);
Sebastian Andrzej Siewiorb14e8402011-02-08 21:07:40 +01001725 if (imask & (HC_ATL_INT | HC_SOT_INT))
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001726 do_atl_int(hcd);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001727
1728 if (imask & HC_INTL_INT)
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001729 do_intl_int(hcd);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001730
1731 irqret = IRQ_HANDLED;
1732leave:
1733 spin_unlock(&priv->lock);
1734 return irqret;
1735}
1736
1737static int isp1760_hub_status_data(struct usb_hcd *hcd, char *buf)
1738{
1739 struct isp1760_hcd *priv = hcd_to_priv(hcd);
1740 u32 temp, status = 0;
1741 u32 mask;
1742 int retval = 1;
1743 unsigned long flags;
1744
1745 /* if !USB_SUSPEND, root hub timers won't get shut down ... */
1746 if (!HC_IS_RUNNING(hcd->state))
1747 return 0;
1748
1749 /* init status to no-changes */
1750 buf[0] = 0;
1751 mask = PORT_CSC;
1752
1753 spin_lock_irqsave(&priv->lock, flags);
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001754 temp = reg_read32(hcd->regs, HC_PORTSC1);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001755
1756 if (temp & PORT_OWNER) {
1757 if (temp & PORT_CSC) {
1758 temp &= ~PORT_CSC;
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001759 reg_write32(hcd->regs, HC_PORTSC1, temp);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001760 goto done;
1761 }
1762 }
1763
1764 /*
1765 * Return status information even for ports with OWNER set.
1766 * Otherwise khubd wouldn't see the disconnect event when a
1767 * high-speed device is switched over to the companion
1768 * controller by the user.
1769 */
1770
1771 if ((temp & mask) != 0
1772 || ((temp & PORT_RESUME) != 0
1773 && time_after_eq(jiffies,
1774 priv->reset_done))) {
1775 buf [0] |= 1 << (0 + 1);
1776 status = STS_PCD;
1777 }
1778 /* FIXME autosuspend idle root hubs */
1779done:
1780 spin_unlock_irqrestore(&priv->lock, flags);
1781 return status ? retval : 0;
1782}
1783
1784static void isp1760_hub_descriptor(struct isp1760_hcd *priv,
1785 struct usb_hub_descriptor *desc)
1786{
1787 int ports = HCS_N_PORTS(priv->hcs_params);
1788 u16 temp;
1789
1790 desc->bDescriptorType = 0x29;
1791 /* priv 1.0, 2.3.9 says 20ms max */
1792 desc->bPwrOn2PwrGood = 10;
1793 desc->bHubContrCurrent = 0;
1794
1795 desc->bNbrPorts = ports;
1796 temp = 1 + (ports / 8);
1797 desc->bDescLength = 7 + 2 * temp;
1798
1799 /* two bitmaps: ports removable, and usb 1.0 legacy PortPwrCtrlMask */
1800 memset(&desc->bitmap[0], 0, temp);
1801 memset(&desc->bitmap[temp], 0xff, temp);
1802
1803 /* per-port overcurrent reporting */
1804 temp = 0x0008;
1805 if (HCS_PPC(priv->hcs_params))
1806 /* per-port power control */
1807 temp |= 0x0001;
1808 else
1809 /* no power switching */
1810 temp |= 0x0002;
1811 desc->wHubCharacteristics = cpu_to_le16(temp);
1812}
1813
1814#define PORT_WAKE_BITS (PORT_WKOC_E|PORT_WKDISC_E|PORT_WKCONN_E)
1815
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001816static int check_reset_complete(struct usb_hcd *hcd, int index,
1817 int port_status)
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001818{
1819 if (!(port_status & PORT_CONNECT))
1820 return port_status;
1821
1822 /* if reset finished and it's still not enabled -- handoff */
1823 if (!(port_status & PORT_PE)) {
1824
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001825 dev_err(hcd->self.controller,
1826 "port %d full speed --> companion\n",
1827 index + 1);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001828
1829 port_status |= PORT_OWNER;
1830 port_status &= ~PORT_RWC_BITS;
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001831 reg_write32(hcd->regs, HC_PORTSC1, port_status);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001832
1833 } else
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001834 dev_err(hcd->self.controller, "port %d high speed\n",
1835 index + 1);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001836
1837 return port_status;
1838}
1839
1840static int isp1760_hub_control(struct usb_hcd *hcd, u16 typeReq,
1841 u16 wValue, u16 wIndex, char *buf, u16 wLength)
1842{
1843 struct isp1760_hcd *priv = hcd_to_priv(hcd);
1844 int ports = HCS_N_PORTS(priv->hcs_params);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001845 u32 temp, status;
1846 unsigned long flags;
1847 int retval = 0;
1848 unsigned selector;
1849
1850 /*
1851 * FIXME: support SetPortFeatures USB_PORT_FEAT_INDICATOR.
1852 * HCS_INDICATOR may say we can change LEDs to off/amber/green.
1853 * (track current state ourselves) ... blink for diagnostics,
1854 * power, "this is the one", etc. EHCI spec supports this.
1855 */
1856
1857 spin_lock_irqsave(&priv->lock, flags);
1858 switch (typeReq) {
1859 case ClearHubFeature:
1860 switch (wValue) {
1861 case C_HUB_LOCAL_POWER:
1862 case C_HUB_OVER_CURRENT:
1863 /* no hub-wide feature/status flags */
1864 break;
1865 default:
1866 goto error;
1867 }
1868 break;
1869 case ClearPortFeature:
1870 if (!wIndex || wIndex > ports)
1871 goto error;
1872 wIndex--;
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001873 temp = reg_read32(hcd->regs, HC_PORTSC1);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001874
1875 /*
1876 * Even if OWNER is set, so the port is owned by the
1877 * companion controller, khubd needs to be able to clear
1878 * the port-change status bits (especially
Alan Stern749da5f2010-03-04 17:05:08 -05001879 * USB_PORT_STAT_C_CONNECTION).
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001880 */
1881
1882 switch (wValue) {
1883 case USB_PORT_FEAT_ENABLE:
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001884 reg_write32(hcd->regs, HC_PORTSC1, temp & ~PORT_PE);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001885 break;
1886 case USB_PORT_FEAT_C_ENABLE:
1887 /* XXX error? */
1888 break;
1889 case USB_PORT_FEAT_SUSPEND:
1890 if (temp & PORT_RESET)
1891 goto error;
1892
1893 if (temp & PORT_SUSPEND) {
1894 if ((temp & PORT_PE) == 0)
1895 goto error;
1896 /* resume signaling for 20 msec */
1897 temp &= ~(PORT_RWC_BITS);
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001898 reg_write32(hcd->regs, HC_PORTSC1,
1899 temp | PORT_RESUME);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001900 priv->reset_done = jiffies +
1901 msecs_to_jiffies(20);
1902 }
1903 break;
1904 case USB_PORT_FEAT_C_SUSPEND:
1905 /* we auto-clear this feature */
1906 break;
1907 case USB_PORT_FEAT_POWER:
1908 if (HCS_PPC(priv->hcs_params))
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001909 reg_write32(hcd->regs, HC_PORTSC1,
1910 temp & ~PORT_POWER);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001911 break;
1912 case USB_PORT_FEAT_C_CONNECTION:
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001913 reg_write32(hcd->regs, HC_PORTSC1, temp | PORT_CSC);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001914 break;
1915 case USB_PORT_FEAT_C_OVER_CURRENT:
1916 /* XXX error ?*/
1917 break;
1918 case USB_PORT_FEAT_C_RESET:
1919 /* GetPortStatus clears reset */
1920 break;
1921 default:
1922 goto error;
1923 }
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001924 reg_read32(hcd->regs, HC_USBCMD);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001925 break;
1926 case GetHubDescriptor:
1927 isp1760_hub_descriptor(priv, (struct usb_hub_descriptor *)
1928 buf);
1929 break;
1930 case GetHubStatus:
1931 /* no hub-wide feature/status flags */
1932 memset(buf, 0, 4);
1933 break;
1934 case GetPortStatus:
1935 if (!wIndex || wIndex > ports)
1936 goto error;
1937 wIndex--;
1938 status = 0;
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001939 temp = reg_read32(hcd->regs, HC_PORTSC1);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001940
1941 /* wPortChange bits */
1942 if (temp & PORT_CSC)
Alan Stern749da5f2010-03-04 17:05:08 -05001943 status |= USB_PORT_STAT_C_CONNECTION << 16;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001944
1945
1946 /* whoever resumes must GetPortStatus to complete it!! */
1947 if (temp & PORT_RESUME) {
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001948 dev_err(hcd->self.controller, "Port resume should be skipped.\n");
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001949
1950 /* Remote Wakeup received? */
1951 if (!priv->reset_done) {
1952 /* resume signaling for 20 msec */
1953 priv->reset_done = jiffies
1954 + msecs_to_jiffies(20);
1955 /* check the port again */
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001956 mod_timer(&hcd->rh_timer, priv->reset_done);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001957 }
1958
1959 /* resume completed? */
1960 else if (time_after_eq(jiffies,
1961 priv->reset_done)) {
Alan Stern749da5f2010-03-04 17:05:08 -05001962 status |= USB_PORT_STAT_C_SUSPEND << 16;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001963 priv->reset_done = 0;
1964
1965 /* stop resume signaling */
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001966 temp = reg_read32(hcd->regs, HC_PORTSC1);
1967 reg_write32(hcd->regs, HC_PORTSC1,
1968 temp & ~(PORT_RWC_BITS | PORT_RESUME));
1969 retval = handshake(hcd, HC_PORTSC1,
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001970 PORT_RESUME, 0, 2000 /* 2msec */);
1971 if (retval != 0) {
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001972 dev_err(hcd->self.controller,
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001973 "port %d resume error %d\n",
1974 wIndex + 1, retval);
1975 goto error;
1976 }
1977 temp &= ~(PORT_SUSPEND|PORT_RESUME|(3<<10));
1978 }
1979 }
1980
1981 /* whoever resets must GetPortStatus to complete it!! */
1982 if ((temp & PORT_RESET)
1983 && time_after_eq(jiffies,
1984 priv->reset_done)) {
Alan Stern749da5f2010-03-04 17:05:08 -05001985 status |= USB_PORT_STAT_C_RESET << 16;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001986 priv->reset_done = 0;
1987
1988 /* force reset to complete */
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001989 reg_write32(hcd->regs, HC_PORTSC1, temp & ~PORT_RESET);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001990 /* REVISIT: some hardware needs 550+ usec to clear
1991 * this bit; seems too long to spin routinely...
1992 */
Arvid Brodinbedc0c32011-02-26 22:02:57 +01001993 retval = handshake(hcd, HC_PORTSC1,
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001994 PORT_RESET, 0, 750);
1995 if (retval != 0) {
Arvid Brodin6bda21b2011-02-26 22:06:37 +01001996 dev_err(hcd->self.controller, "port %d reset error %d\n",
Sebastian Siewiordb11e472008-04-24 00:37:04 +02001997 wIndex + 1, retval);
1998 goto error;
1999 }
2000
2001 /* see what we found out */
Arvid Brodinbedc0c32011-02-26 22:02:57 +01002002 temp = check_reset_complete(hcd, wIndex,
2003 reg_read32(hcd->regs, HC_PORTSC1));
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002004 }
2005 /*
2006 * Even if OWNER is set, there's no harm letting khubd
2007 * see the wPortStatus values (they should all be 0 except
2008 * for PORT_POWER anyway).
2009 */
2010
2011 if (temp & PORT_OWNER)
Arvid Brodin6bda21b2011-02-26 22:06:37 +01002012 dev_err(hcd->self.controller, "PORT_OWNER is set\n");
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002013
2014 if (temp & PORT_CONNECT) {
Alan Stern749da5f2010-03-04 17:05:08 -05002015 status |= USB_PORT_STAT_CONNECTION;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002016 /* status may be from integrated TT */
Arvid Brodin6bda21b2011-02-26 22:06:37 +01002017 status |= USB_PORT_STAT_HIGH_SPEED;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002018 }
2019 if (temp & PORT_PE)
Alan Stern749da5f2010-03-04 17:05:08 -05002020 status |= USB_PORT_STAT_ENABLE;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002021 if (temp & (PORT_SUSPEND|PORT_RESUME))
Alan Stern749da5f2010-03-04 17:05:08 -05002022 status |= USB_PORT_STAT_SUSPEND;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002023 if (temp & PORT_RESET)
Alan Stern749da5f2010-03-04 17:05:08 -05002024 status |= USB_PORT_STAT_RESET;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002025 if (temp & PORT_POWER)
Alan Stern749da5f2010-03-04 17:05:08 -05002026 status |= USB_PORT_STAT_POWER;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002027
2028 put_unaligned(cpu_to_le32(status), (__le32 *) buf);
2029 break;
2030 case SetHubFeature:
2031 switch (wValue) {
2032 case C_HUB_LOCAL_POWER:
2033 case C_HUB_OVER_CURRENT:
2034 /* no hub-wide feature/status flags */
2035 break;
2036 default:
2037 goto error;
2038 }
2039 break;
2040 case SetPortFeature:
2041 selector = wIndex >> 8;
2042 wIndex &= 0xff;
2043 if (!wIndex || wIndex > ports)
2044 goto error;
2045 wIndex--;
Arvid Brodinbedc0c32011-02-26 22:02:57 +01002046 temp = reg_read32(hcd->regs, HC_PORTSC1);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002047 if (temp & PORT_OWNER)
2048 break;
2049
2050/* temp &= ~PORT_RWC_BITS; */
2051 switch (wValue) {
2052 case USB_PORT_FEAT_ENABLE:
Arvid Brodinbedc0c32011-02-26 22:02:57 +01002053 reg_write32(hcd->regs, HC_PORTSC1, temp | PORT_PE);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002054 break;
2055
2056 case USB_PORT_FEAT_SUSPEND:
2057 if ((temp & PORT_PE) == 0
2058 || (temp & PORT_RESET) != 0)
2059 goto error;
2060
Arvid Brodinbedc0c32011-02-26 22:02:57 +01002061 reg_write32(hcd->regs, HC_PORTSC1, temp | PORT_SUSPEND);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002062 break;
2063 case USB_PORT_FEAT_POWER:
2064 if (HCS_PPC(priv->hcs_params))
Arvid Brodinbedc0c32011-02-26 22:02:57 +01002065 reg_write32(hcd->regs, HC_PORTSC1,
2066 temp | PORT_POWER);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002067 break;
2068 case USB_PORT_FEAT_RESET:
2069 if (temp & PORT_RESUME)
2070 goto error;
2071 /* line status bits may report this as low speed,
2072 * which can be fine if this root hub has a
2073 * transaction translator built in.
2074 */
2075 if ((temp & (PORT_PE|PORT_CONNECT)) == PORT_CONNECT
2076 && PORT_USB11(temp)) {
2077 temp |= PORT_OWNER;
2078 } else {
2079 temp |= PORT_RESET;
2080 temp &= ~PORT_PE;
2081
2082 /*
2083 * caller must wait, then call GetPortStatus
2084 * usb 2.0 spec says 50 ms resets on root
2085 */
2086 priv->reset_done = jiffies +
2087 msecs_to_jiffies(50);
2088 }
Arvid Brodinbedc0c32011-02-26 22:02:57 +01002089 reg_write32(hcd->regs, HC_PORTSC1, temp);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002090 break;
2091 default:
2092 goto error;
2093 }
Arvid Brodinbedc0c32011-02-26 22:02:57 +01002094 reg_read32(hcd->regs, HC_USBCMD);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002095 break;
2096
2097 default:
2098error:
2099 /* "stall" on error */
2100 retval = -EPIPE;
2101 }
2102 spin_unlock_irqrestore(&priv->lock, flags);
2103 return retval;
2104}
2105
Arvid Brodin6bda21b2011-02-26 22:06:37 +01002106static void isp1760_endpoint_disable(struct usb_hcd *hcd,
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002107 struct usb_host_endpoint *ep)
2108{
Arvid Brodin6bda21b2011-02-26 22:06:37 +01002109 struct isp1760_hcd *priv = hcd_to_priv(hcd);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002110 struct isp1760_qh *qh;
2111 struct isp1760_qtd *qtd;
Andrew Mortond249afd2008-06-09 16:39:52 -07002112 unsigned long flags;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002113
2114 spin_lock_irqsave(&priv->lock, flags);
2115 qh = ep->hcpriv;
2116 if (!qh)
2117 goto out;
2118
2119 ep->hcpriv = NULL;
2120 do {
2121 /* more than entry might get removed */
2122 if (list_empty(&qh->qtd_list))
2123 break;
2124
2125 qtd = list_first_entry(&qh->qtd_list, struct isp1760_qtd,
2126 qtd_list);
2127
2128 if (qtd->status & URB_ENQUEUED) {
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002129 spin_unlock_irqrestore(&priv->lock, flags);
Arvid Brodin6bda21b2011-02-26 22:06:37 +01002130 isp1760_urb_dequeue(hcd, qtd->urb, -ECONNRESET);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002131 spin_lock_irqsave(&priv->lock, flags);
2132 } else {
2133 struct urb *urb;
2134
2135 urb = qtd->urb;
Arvid Brodinfd436ae2011-02-26 22:03:49 +01002136 clean_up_qtdlist(qtd, qh);
Arvid Brodin6bda21b2011-02-26 22:06:37 +01002137 urb->status = -ECONNRESET;
2138 isp1760_urb_done(hcd, urb);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002139 }
2140 } while (1);
2141
2142 qh_destroy(qh);
2143 /* remove requests and leak them.
2144 * ATL are pretty fast done, INT could take a while...
2145 * The latter shoule be removed
2146 */
2147out:
2148 spin_unlock_irqrestore(&priv->lock, flags);
2149}
2150
2151static int isp1760_get_frame(struct usb_hcd *hcd)
2152{
2153 struct isp1760_hcd *priv = hcd_to_priv(hcd);
2154 u32 fr;
2155
Arvid Brodinbedc0c32011-02-26 22:02:57 +01002156 fr = reg_read32(hcd->regs, HC_FRINDEX);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002157 return (fr >> 3) % priv->periodic_size;
2158}
2159
2160static void isp1760_stop(struct usb_hcd *hcd)
2161{
2162 struct isp1760_hcd *priv = hcd_to_priv(hcd);
Nate Case3faefc82008-06-17 11:11:38 -05002163 u32 temp;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002164
2165 isp1760_hub_control(hcd, ClearPortFeature, USB_PORT_FEAT_POWER, 1,
2166 NULL, 0);
2167 mdelay(20);
2168
2169 spin_lock_irq(&priv->lock);
Arvid Brodin6bda21b2011-02-26 22:06:37 +01002170 ehci_reset(hcd);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002171 /* Disable IRQ */
Arvid Brodinbedc0c32011-02-26 22:02:57 +01002172 temp = reg_read32(hcd->regs, HC_HW_MODE_CTRL);
2173 reg_write32(hcd->regs, HC_HW_MODE_CTRL, temp &= ~HW_GLOBAL_INTR_EN);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002174 spin_unlock_irq(&priv->lock);
2175
Arvid Brodinbedc0c32011-02-26 22:02:57 +01002176 reg_write32(hcd->regs, HC_CONFIGFLAG, 0);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002177}
2178
2179static void isp1760_shutdown(struct usb_hcd *hcd)
2180{
Nate Case3faefc82008-06-17 11:11:38 -05002181 u32 command, temp;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002182
2183 isp1760_stop(hcd);
Arvid Brodinbedc0c32011-02-26 22:02:57 +01002184 temp = reg_read32(hcd->regs, HC_HW_MODE_CTRL);
2185 reg_write32(hcd->regs, HC_HW_MODE_CTRL, temp &= ~HW_GLOBAL_INTR_EN);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002186
Arvid Brodinbedc0c32011-02-26 22:02:57 +01002187 command = reg_read32(hcd->regs, HC_USBCMD);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002188 command &= ~CMD_RUN;
Arvid Brodinbedc0c32011-02-26 22:02:57 +01002189 reg_write32(hcd->regs, HC_USBCMD, command);
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002190}
2191
2192static const struct hc_driver isp1760_hc_driver = {
2193 .description = "isp1760-hcd",
2194 .product_desc = "NXP ISP1760 USB Host Controller",
2195 .hcd_priv_size = sizeof(struct isp1760_hcd),
2196 .irq = isp1760_irq,
2197 .flags = HCD_MEMORY | HCD_USB2,
2198 .reset = isp1760_hc_setup,
2199 .start = isp1760_run,
2200 .stop = isp1760_stop,
2201 .shutdown = isp1760_shutdown,
2202 .urb_enqueue = isp1760_urb_enqueue,
2203 .urb_dequeue = isp1760_urb_dequeue,
2204 .endpoint_disable = isp1760_endpoint_disable,
2205 .get_frame_number = isp1760_get_frame,
2206 .hub_status_data = isp1760_hub_status_data,
2207 .hub_control = isp1760_hub_control,
2208};
2209
2210int __init init_kmem_once(void)
2211{
2212 qtd_cachep = kmem_cache_create("isp1760_qtd",
2213 sizeof(struct isp1760_qtd), 0, SLAB_TEMPORARY |
2214 SLAB_MEM_SPREAD, NULL);
2215
2216 if (!qtd_cachep)
2217 return -ENOMEM;
2218
2219 qh_cachep = kmem_cache_create("isp1760_qh", sizeof(struct isp1760_qh),
2220 0, SLAB_TEMPORARY | SLAB_MEM_SPREAD, NULL);
2221
2222 if (!qh_cachep) {
2223 kmem_cache_destroy(qtd_cachep);
2224 return -ENOMEM;
2225 }
2226
2227 return 0;
2228}
2229
2230void deinit_kmem_cache(void)
2231{
2232 kmem_cache_destroy(qtd_cachep);
2233 kmem_cache_destroy(qh_cachep);
2234}
2235
Catalin Marinasf9031f22009-02-10 16:55:45 +00002236struct usb_hcd *isp1760_register(phys_addr_t res_start, resource_size_t res_len,
2237 int irq, unsigned long irqflags,
2238 struct device *dev, const char *busname,
2239 unsigned int devflags)
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002240{
2241 struct usb_hcd *hcd;
2242 struct isp1760_hcd *priv;
2243 int ret;
2244
2245 if (usb_disabled())
2246 return ERR_PTR(-ENODEV);
2247
2248 /* prevent usb-core allocating DMA pages */
2249 dev->dma_mask = NULL;
2250
Kay Sievers0031a062008-05-02 06:02:41 +02002251 hcd = usb_create_hcd(&isp1760_hc_driver, dev, dev_name(dev));
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002252 if (!hcd)
2253 return ERR_PTR(-ENOMEM);
2254
2255 priv = hcd_to_priv(hcd);
Nate Case3faefc82008-06-17 11:11:38 -05002256 priv->devflags = devflags;
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002257 init_memory(priv);
2258 hcd->regs = ioremap(res_start, res_len);
2259 if (!hcd->regs) {
2260 ret = -EIO;
2261 goto err_put;
2262 }
2263
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002264 hcd->irq = irq;
2265 hcd->rsrc_start = res_start;
2266 hcd->rsrc_len = res_len;
2267
Nate Casee6942d62008-05-21 16:28:20 -05002268 ret = usb_add_hcd(hcd, irq, irqflags);
2269 if (ret)
2270 goto err_unmap;
2271
Sebastian Siewiordb11e472008-04-24 00:37:04 +02002272 return hcd;
2273
2274err_unmap:
2275 iounmap(hcd->regs);
2276
2277err_put:
2278 usb_put_hcd(hcd);
2279
2280 return ERR_PTR(ret);
2281}
2282
2283MODULE_DESCRIPTION("Driver for the ISP1760 USB-controller from NXP");
2284MODULE_AUTHOR("Sebastian Siewior <bigeasy@linuxtronix.de>");
2285MODULE_LICENSE("GPL v2");