Branch data Line data Source code
1 : : /*
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 : : * (c) 2011 Arvid Brodin <arvid.brodin@enea.com>
12 : : *
13 : : */
14 : : #include <linux/module.h>
15 : : #include <linux/kernel.h>
16 : : #include <linux/slab.h>
17 : : #include <linux/list.h>
18 : : #include <linux/usb.h>
19 : : #include <linux/usb/hcd.h>
20 : : #include <linux/debugfs.h>
21 : : #include <linux/uaccess.h>
22 : : #include <linux/io.h>
23 : : #include <linux/mm.h>
24 : : #include <linux/timer.h>
25 : : #include <asm/unaligned.h>
26 : : #include <asm/cacheflush.h>
27 : : #include <linux/gpio.h>
28 : :
29 : : #include "isp1760-hcd.h"
30 : :
31 : : static struct kmem_cache *qtd_cachep;
32 : : static struct kmem_cache *qh_cachep;
33 : : static struct kmem_cache *urb_listitem_cachep;
34 : :
35 : : enum queue_head_types {
36 : : QH_CONTROL,
37 : : QH_BULK,
38 : : QH_INTERRUPT,
39 : : QH_END
40 : : };
41 : :
42 : : struct isp1760_hcd {
43 : : u32 hcs_params;
44 : : spinlock_t lock;
45 : : struct slotinfo atl_slots[32];
46 : : int atl_done_map;
47 : : struct slotinfo int_slots[32];
48 : : int int_done_map;
49 : : struct memory_chunk memory_pool[BLOCKS];
50 : : struct list_head qh_list[QH_END];
51 : :
52 : : /* periodic schedule support */
53 : : #define DEFAULT_I_TDPS 1024
54 : : unsigned periodic_size;
55 : : unsigned i_thresh;
56 : : unsigned long reset_done;
57 : : unsigned long next_statechange;
58 : : unsigned int devflags;
59 : :
60 : : int rst_gpio;
61 : : };
62 : :
63 : : static inline struct isp1760_hcd *hcd_to_priv(struct usb_hcd *hcd)
64 : : {
65 : : return (struct isp1760_hcd *) (hcd->hcd_priv);
66 : : }
67 : :
68 : : /* Section 2.2 Host Controller Capability Registers */
69 : : #define HC_LENGTH(p) (((p)>>00)&0x00ff) /* bits 7:0 */
70 : : #define HC_VERSION(p) (((p)>>16)&0xffff) /* bits 31:16 */
71 : : #define HCS_INDICATOR(p) ((p)&(1 << 16)) /* true: has port indicators */
72 : : #define HCS_PPC(p) ((p)&(1 << 4)) /* true: port power control */
73 : : #define HCS_N_PORTS(p) (((p)>>0)&0xf) /* bits 3:0, ports on HC */
74 : : #define HCC_ISOC_CACHE(p) ((p)&(1 << 7)) /* true: can cache isoc frame */
75 : : #define HCC_ISOC_THRES(p) (((p)>>4)&0x7) /* bits 6:4, uframes cached */
76 : :
77 : : /* Section 2.3 Host Controller Operational Registers */
78 : : #define CMD_LRESET (1<<7) /* partial reset (no ports, etc) */
79 : : #define CMD_RESET (1<<1) /* reset HC not bus */
80 : : #define CMD_RUN (1<<0) /* start/stop HC */
81 : : #define STS_PCD (1<<2) /* port change detect */
82 : : #define FLAG_CF (1<<0) /* true: we'll support "high speed" */
83 : :
84 : : #define PORT_OWNER (1<<13) /* true: companion hc owns this port */
85 : : #define PORT_POWER (1<<12) /* true: has power (see PPC) */
86 : : #define PORT_USB11(x) (((x) & (3 << 10)) == (1 << 10)) /* USB 1.1 device */
87 : : #define PORT_RESET (1<<8) /* reset port */
88 : : #define PORT_SUSPEND (1<<7) /* suspend port */
89 : : #define PORT_RESUME (1<<6) /* resume it */
90 : : #define PORT_PE (1<<2) /* port enable */
91 : : #define PORT_CSC (1<<1) /* connect status change */
92 : : #define PORT_CONNECT (1<<0) /* device connected */
93 : : #define PORT_RWC_BITS (PORT_CSC)
94 : :
95 : : struct isp1760_qtd {
96 : : u8 packet_type;
97 : : void *data_buffer;
98 : : u32 payload_addr;
99 : :
100 : : /* the rest is HCD-private */
101 : : struct list_head qtd_list;
102 : : struct urb *urb;
103 : : size_t length;
104 : : size_t actual_length;
105 : :
106 : : /* QTD_ENQUEUED: waiting for transfer (inactive) */
107 : : /* QTD_PAYLOAD_ALLOC: chip mem has been allocated for payload */
108 : : /* QTD_XFER_STARTED: valid ptd has been written to isp176x - only
109 : : interrupt handler may touch this qtd! */
110 : : /* QTD_XFER_COMPLETE: payload has been transferred successfully */
111 : : /* QTD_RETIRE: transfer error/abort qtd */
112 : : #define QTD_ENQUEUED 0
113 : : #define QTD_PAYLOAD_ALLOC 1
114 : : #define QTD_XFER_STARTED 2
115 : : #define QTD_XFER_COMPLETE 3
116 : : #define QTD_RETIRE 4
117 : : u32 status;
118 : : };
119 : :
120 : : /* Queue head, one for each active endpoint */
121 : : struct isp1760_qh {
122 : : struct list_head qh_list;
123 : : struct list_head qtd_list;
124 : : u32 toggle;
125 : : u32 ping;
126 : : int slot;
127 : : int tt_buffer_dirty; /* See USB2.0 spec section 11.17.5 */
128 : : };
129 : :
130 : : struct urb_listitem {
131 : : struct list_head urb_list;
132 : : struct urb *urb;
133 : : };
134 : :
135 : : /*
136 : : * Access functions for isp176x registers (addresses 0..0x03FF).
137 : : */
138 : : static u32 reg_read32(void __iomem *base, u32 reg)
139 : : {
140 : 16401154 : return readl(base + reg);
141 : : }
142 : :
143 : : static void reg_write32(void __iomem *base, u32 reg, u32 val)
144 : : {
145 : 7828085 : writel(val, base + reg);
146 : : }
147 : :
148 : : /*
149 : : * Access functions for isp176x memory (offset >= 0x0400).
150 : : *
151 : : * bank_reads8() reads memory locations prefetched by an earlier write to
152 : : * HC_MEMORY_REG (see isp176x datasheet). Unless you want to do fancy multi-
153 : : * bank optimizations, you should use the more generic mem_reads8() below.
154 : : *
155 : : * For access to ptd memory, use the specialized ptd_read() and ptd_write()
156 : : * below.
157 : : *
158 : : * These functions copy via MMIO data to/from the device. memcpy_{to|from}io()
159 : : * doesn't quite work because some people have to enforce 32-bit access
160 : : */
161 : 0 : static void bank_reads8(void __iomem *src_base, u32 src_offset, u32 bank_addr,
162 : : __u32 *dst, u32 bytes)
163 : : {
164 : : __u32 __iomem *src;
165 : : u32 val;
166 : : __u8 *src_byteptr;
167 : : __u8 *dst_byteptr;
168 : :
169 : 3142041 : src = src_base + (bank_addr | src_offset);
170 : :
171 [ + + ]: 3142041 : if (src_offset < PAYLOAD_OFFSET) {
172 [ + + ]: 21150711 : while (bytes >= 4) {
173 : 18800632 : *dst = le32_to_cpu(__raw_readl(src));
174 : 18800632 : bytes -= 4;
175 : 18800632 : src++;
176 : 18800632 : dst++;
177 : : }
178 : : } else {
179 [ + + ]: 411492415 : while (bytes >= 4) {
180 : 410700453 : *dst = __raw_readl(src);
181 : 410700453 : bytes -= 4;
182 : 410700453 : src++;
183 : 410700453 : dst++;
184 : : }
185 : : }
186 : :
187 [ + + ]: 3142041 : if (!bytes)
188 : 2708322 : return;
189 : :
190 : : /* in case we have 3, 2 or 1 by left. The dst buffer may not be fully
191 : : * allocated.
192 : : */
193 [ - + ]: 433719 : if (src_offset < PAYLOAD_OFFSET)
194 : 3142041 : val = le32_to_cpu(__raw_readl(src));
195 : : else
196 : 433719 : val = __raw_readl(src);
197 : :
198 : : dst_byteptr = (void *) dst;
199 : : src_byteptr = (void *) &val;
200 [ + + ]: 4009479 : while (bytes > 0) {
201 : 433719 : *dst_byteptr = *src_byteptr;
202 : 433719 : dst_byteptr++;
203 : 433719 : src_byteptr++;
204 : 433719 : bytes--;
205 : : }
206 : : }
207 : :
208 : 0 : static void mem_reads8(void __iomem *src_base, u32 src_offset, void *dst,
209 : : u32 bytes)
210 : : {
211 : : reg_write32(src_base, HC_MEMORY_REG, src_offset + ISP_BANK(0));
212 : : ndelay(90);
213 : 791962 : bank_reads8(src_base, src_offset, ISP_BANK(0), dst, bytes);
214 : 791962 : }
215 : :
216 : 0 : static void mem_writes8(void __iomem *dst_base, u32 dst_offset,
217 : : __u32 const *src, u32 bytes)
218 : : {
219 : : __u32 __iomem *dst;
220 : :
221 : 6237104 : dst = dst_base + dst_offset;
222 : :
223 [ + + ]: 6237104 : if (dst_offset < PAYLOAD_OFFSET) {
224 [ + + ]: 23430220 : while (bytes >= 4) {
225 : 18744176 : __raw_writel(cpu_to_le32(*src), dst);
226 : 18744176 : bytes -= 4;
227 : 18744176 : src++;
228 : 18744176 : dst++;
229 : : }
230 : : } else {
231 [ + + ]: 1364158037 : while (bytes >= 4) {
232 : 1362606977 : __raw_writel(*src, dst);
233 : 1362606977 : bytes -= 4;
234 : 1362606977 : src++;
235 : 1362606977 : dst++;
236 : : }
237 : : }
238 : :
239 [ + + ]: 6237104 : if (!bytes)
240 : 0 : return;
241 : : /* in case we have 3, 2 or 1 bytes left. The buffer is allocated and the
242 : : * extra bytes should not be read by the HW.
243 : : */
244 : :
245 [ - + ]: 433719 : if (dst_offset < PAYLOAD_OFFSET)
246 : 0 : __raw_writel(cpu_to_le32(*src), dst);
247 : : else
248 : 433719 : __raw_writel(*src, dst);
249 : : }
250 : :
251 : : /*
252 : : * Read and write ptds. 'ptd_offset' should be one of ISO_PTD_OFFSET,
253 : : * INT_PTD_OFFSET, and ATL_PTD_OFFSET. 'slot' should be less than 32.
254 : : */
255 : 0 : static void ptd_read(void __iomem *base, u32 ptd_offset, u32 slot,
256 : : struct ptd *ptd)
257 : : {
258 : 2350079 : reg_write32(base, HC_MEMORY_REG,
259 : 2350079 : ISP_BANK(0) + ptd_offset + slot*sizeof(*ptd));
260 : : ndelay(90);
261 : 2350079 : bank_reads8(base, ptd_offset + slot*sizeof(*ptd), ISP_BANK(0),
262 : : (void *) ptd, sizeof(*ptd));
263 : 2350079 : }
264 : :
265 : 0 : static void ptd_write(void __iomem *base, u32 ptd_offset, u32 slot,
266 : : struct ptd *ptd)
267 : : {
268 : 2343022 : mem_writes8(base, ptd_offset + slot*sizeof(*ptd) + sizeof(ptd->dw0),
269 : 2343022 : &ptd->dw1, 7*sizeof(ptd->dw1));
270 : : /* Make sure dw0 gets written last (after other dw's and after payload)
271 : : since it contains the enable bit */
272 : 2343022 : wmb();
273 : 2343022 : mem_writes8(base, ptd_offset + slot*sizeof(*ptd), &ptd->dw0,
274 : : sizeof(ptd->dw0));
275 : 2343022 : }
276 : :
277 : :
278 : : /* memory management of the 60kb on the chip from 0x1000 to 0xffff */
279 : 0 : static void init_memory(struct isp1760_hcd *priv)
280 : : {
281 : : int i, curr;
282 : : u32 payload_addr;
283 : :
284 : : payload_addr = PAYLOAD_OFFSET;
285 [ # # ]: 0 : for (i = 0; i < BLOCK_1_NUM; i++) {
286 : 0 : priv->memory_pool[i].start = payload_addr;
287 : 0 : priv->memory_pool[i].size = BLOCK_1_SIZE;
288 : 0 : priv->memory_pool[i].free = 1;
289 : 0 : payload_addr += priv->memory_pool[i].size;
290 : : }
291 : :
292 : : curr = i;
293 [ # # ]: 0 : for (i = 0; i < BLOCK_2_NUM; i++) {
294 : 0 : priv->memory_pool[curr + i].start = payload_addr;
295 : 0 : priv->memory_pool[curr + i].size = BLOCK_2_SIZE;
296 : 0 : priv->memory_pool[curr + i].free = 1;
297 : 0 : payload_addr += priv->memory_pool[curr + i].size;
298 : : }
299 : :
300 : : curr = i;
301 [ # # ]: 0 : for (i = 0; i < BLOCK_3_NUM; i++) {
302 : 0 : priv->memory_pool[curr + i].start = payload_addr;
303 : 0 : priv->memory_pool[curr + i].size = BLOCK_3_SIZE;
304 : 0 : priv->memory_pool[curr + i].free = 1;
305 : 0 : payload_addr += priv->memory_pool[curr + i].size;
306 : : }
307 : :
308 [ # # ]: 0 : WARN_ON(payload_addr - priv->memory_pool[0].start > PAYLOAD_AREA_SIZE);
309 : 0 : }
310 : :
311 : 0 : static void alloc_mem(struct usb_hcd *hcd, struct isp1760_qtd *qtd)
312 : : {
313 : : struct isp1760_hcd *priv = hcd_to_priv(hcd);
314 : : int i;
315 : :
316 [ - + ]: 2343022 : WARN_ON(qtd->payload_addr);
317 : :
318 [ + - ]: 2343022 : if (!qtd->length)
319 : : return;
320 : :
321 [ + - ]: 33732637 : for (i = 0; i < BLOCKS; i++) {
322 [ + + ][ + + ]: 33732637 : if (priv->memory_pool[i].size >= qtd->length &&
323 : 4220957 : priv->memory_pool[i].free) {
324 : 2343022 : priv->memory_pool[i].free = 0;
325 : 2343022 : qtd->payload_addr = priv->memory_pool[i].start;
326 : : return;
327 : : }
328 : : }
329 : : }
330 : :
331 : 0 : static void free_mem(struct usb_hcd *hcd, struct isp1760_qtd *qtd)
332 : : {
333 : : struct isp1760_hcd *priv = hcd_to_priv(hcd);
334 : : int i;
335 : :
336 [ + - ]: 2343022 : if (!qtd->payload_addr)
337 : : return;
338 : :
339 [ + - ]: 33732637 : for (i = 0; i < BLOCKS; i++) {
340 [ + + ]: 33732637 : if (priv->memory_pool[i].start == qtd->payload_addr) {
341 [ - + ]: 2343022 : WARN_ON(priv->memory_pool[i].free);
342 : 2343022 : priv->memory_pool[i].free = 1;
343 : 2343022 : qtd->payload_addr = 0;
344 : : return;
345 : : }
346 : : }
347 : :
348 : 0 : dev_err(hcd->self.controller, "%s: Invalid pointer: %08x\n",
349 : : __func__, qtd->payload_addr);
350 : 0 : WARN_ON(1);
351 : 0 : qtd->payload_addr = 0;
352 : : }
353 : :
354 : : static int handshake(struct usb_hcd *hcd, u32 reg,
355 : : u32 mask, u32 done, int usec)
356 : : {
357 : : u32 result;
358 : :
359 : : do {
360 : 0 : result = reg_read32(hcd->regs, reg);
361 [ # # # # : 0 : if (result == ~0)
# # # # #
# ]
362 : : return -ENODEV;
363 : 0 : result &= mask;
364 [ # # ][ # # ]: 0 : if (result == done)
[ # # ][ # # ]
[ # # ]
365 : : return 0;
366 : 0 : udelay(1);
367 : 0 : usec--;
368 [ # # ][ # # ]: 0 : } while (usec > 0);
[ # # ][ # # ]
[ # # ]
369 : : return -ETIMEDOUT;
370 : : }
371 : :
372 : : /* reset a non-running (STS_HALT == 1) controller */
373 : 0 : static int ehci_reset(struct usb_hcd *hcd)
374 : : {
375 : : int retval;
376 : : struct isp1760_hcd *priv = hcd_to_priv(hcd);
377 : :
378 : 0 : u32 command = reg_read32(hcd->regs, HC_USBCMD);
379 : :
380 : 0 : command |= CMD_RESET;
381 : 0 : reg_write32(hcd->regs, HC_USBCMD, command);
382 : 0 : hcd->state = HC_STATE_HALT;
383 : 0 : priv->next_statechange = jiffies;
384 : : retval = handshake(hcd, HC_USBCMD,
385 : : CMD_RESET, 0, 250 * 1000);
386 : 0 : return retval;
387 : : }
388 : :
389 : 0 : static struct isp1760_qh *qh_alloc(gfp_t flags)
390 : : {
391 : : struct isp1760_qh *qh;
392 : :
393 : 0 : qh = kmem_cache_zalloc(qh_cachep, flags);
394 [ # # ]: 0 : if (!qh)
395 : : return NULL;
396 : :
397 : 0 : INIT_LIST_HEAD(&qh->qh_list);
398 : 0 : INIT_LIST_HEAD(&qh->qtd_list);
399 : 0 : qh->slot = -1;
400 : :
401 : 0 : return qh;
402 : : }
403 : :
404 : 0 : static void qh_free(struct isp1760_qh *qh)
405 : : {
406 [ # # ]: 0 : WARN_ON(!list_empty(&qh->qtd_list));
407 [ # # ]: 0 : WARN_ON(qh->slot > -1);
408 : 0 : kmem_cache_free(qh_cachep, qh);
409 : 0 : }
410 : :
411 : : /* one-time init, only for memory state */
412 : 0 : static int priv_init(struct usb_hcd *hcd)
413 : : {
414 : : struct isp1760_hcd *priv = hcd_to_priv(hcd);
415 : : u32 hcc_params;
416 : : int i;
417 : :
418 : 0 : spin_lock_init(&priv->lock);
419 : :
420 [ # # ]: 0 : for (i = 0; i < QH_END; i++)
421 : 0 : INIT_LIST_HEAD(&priv->qh_list[i]);
422 : :
423 : : /*
424 : : * hw default: 1K periodic list heads, one per frame.
425 : : * periodic_size can shrink by USBCMD update if hcc_params allows.
426 : : */
427 : 0 : priv->periodic_size = DEFAULT_I_TDPS;
428 : :
429 : : /* controllers may cache some of the periodic schedule ... */
430 : 0 : hcc_params = reg_read32(hcd->regs, HC_HCCPARAMS);
431 : : /* full frame cache */
432 [ # # ]: 0 : if (HCC_ISOC_CACHE(hcc_params))
433 : 0 : priv->i_thresh = 8;
434 : : else /* N microframes cached */
435 : 0 : priv->i_thresh = 2 + HCC_ISOC_THRES(hcc_params);
436 : :
437 : 0 : return 0;
438 : : }
439 : :
440 : 0 : static int isp1760_hc_setup(struct usb_hcd *hcd)
441 : : {
442 : : struct isp1760_hcd *priv = hcd_to_priv(hcd);
443 : : int result;
444 : : u32 scratch, hwmode;
445 : :
446 : : /* low-level chip reset */
447 [ # # ]: 0 : if (gpio_is_valid(priv->rst_gpio)) {
448 : : unsigned int rst_lvl;
449 : :
450 : 0 : rst_lvl = (priv->devflags &
451 : 0 : ISP1760_FLAG_RESET_ACTIVE_HIGH) ? 1 : 0;
452 : :
453 : 0 : gpio_set_value(priv->rst_gpio, rst_lvl);
454 [ # # ]: 0 : mdelay(50);
455 : 0 : gpio_set_value(priv->rst_gpio, !rst_lvl);
456 : : }
457 : :
458 : : /* Setup HW Mode Control: This assumes a level active-low interrupt */
459 : : hwmode = HW_DATA_BUS_32BIT;
460 : :
461 [ # # ]: 0 : if (priv->devflags & ISP1760_FLAG_BUS_WIDTH_16)
462 : : hwmode &= ~HW_DATA_BUS_32BIT;
463 [ # # ]: 0 : if (priv->devflags & ISP1760_FLAG_ANALOG_OC)
464 : 0 : hwmode |= HW_ANA_DIGI_OC;
465 [ # # ]: 0 : if (priv->devflags & ISP1760_FLAG_DACK_POL_HIGH)
466 : 0 : hwmode |= HW_DACK_POL_HIGH;
467 [ # # ]: 0 : if (priv->devflags & ISP1760_FLAG_DREQ_POL_HIGH)
468 : 0 : hwmode |= HW_DREQ_POL_HIGH;
469 [ # # ]: 0 : if (priv->devflags & ISP1760_FLAG_INTR_POL_HIGH)
470 : 0 : hwmode |= HW_INTR_HIGH_ACT;
471 [ # # ]: 0 : if (priv->devflags & ISP1760_FLAG_INTR_EDGE_TRIG)
472 : 0 : hwmode |= HW_INTR_EDGE_TRIG;
473 : :
474 : : /*
475 : : * We have to set this first in case we're in 16-bit mode.
476 : : * Write it twice to ensure correct upper bits if switching
477 : : * to 16-bit mode.
478 : : */
479 : 0 : reg_write32(hcd->regs, HC_HW_MODE_CTRL, hwmode);
480 : 0 : reg_write32(hcd->regs, HC_HW_MODE_CTRL, hwmode);
481 : :
482 : 0 : reg_write32(hcd->regs, HC_SCRATCH_REG, 0xdeadbabe);
483 : : /* Change bus pattern */
484 : 0 : scratch = reg_read32(hcd->regs, HC_CHIP_ID_REG);
485 : 0 : scratch = reg_read32(hcd->regs, HC_SCRATCH_REG);
486 [ # # ]: 0 : if (scratch != 0xdeadbabe) {
487 : 0 : dev_err(hcd->self.controller, "Scratch test failed.\n");
488 : 0 : return -ENODEV;
489 : : }
490 : :
491 : : /* pre reset */
492 : 0 : reg_write32(hcd->regs, HC_BUFFER_STATUS_REG, 0);
493 : 0 : reg_write32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG, NO_TRANSFER_ACTIVE);
494 : 0 : reg_write32(hcd->regs, HC_INT_PTD_SKIPMAP_REG, NO_TRANSFER_ACTIVE);
495 : 0 : reg_write32(hcd->regs, HC_ISO_PTD_SKIPMAP_REG, NO_TRANSFER_ACTIVE);
496 : :
497 : : /* reset */
498 : 0 : reg_write32(hcd->regs, HC_RESET_REG, SW_RESET_RESET_ALL);
499 [ # # ]: 0 : mdelay(100);
500 : :
501 : 0 : reg_write32(hcd->regs, HC_RESET_REG, SW_RESET_RESET_HC);
502 [ # # ]: 0 : mdelay(100);
503 : :
504 : 0 : result = ehci_reset(hcd);
505 [ # # ]: 0 : if (result)
506 : : return result;
507 : :
508 : : /* Step 11 passed */
509 : :
510 [ # # ][ # # ]: 0 : dev_info(hcd->self.controller, "bus width: %d, oc: %s\n",
511 : : (priv->devflags & ISP1760_FLAG_BUS_WIDTH_16) ?
512 : : 16 : 32, (priv->devflags & ISP1760_FLAG_ANALOG_OC) ?
513 : : "analog" : "digital");
514 : :
515 : : /* ATL reset */
516 : 0 : reg_write32(hcd->regs, HC_HW_MODE_CTRL, hwmode | ALL_ATX_RESET);
517 [ # # ]: 0 : mdelay(10);
518 : 0 : reg_write32(hcd->regs, HC_HW_MODE_CTRL, hwmode);
519 : :
520 : 0 : reg_write32(hcd->regs, HC_INTERRUPT_ENABLE, INTERRUPT_ENABLE_MASK);
521 : :
522 : : /*
523 : : * PORT 1 Control register of the ISP1760 is the OTG control
524 : : * register on ISP1761. Since there is no OTG or device controller
525 : : * support in this driver, we use port 1 as a "normal" USB host port on
526 : : * both chips.
527 : : */
528 : 0 : reg_write32(hcd->regs, HC_PORT1_CTRL, PORT1_POWER | PORT1_INIT2);
529 [ # # ]: 0 : mdelay(10);
530 : :
531 : 0 : priv->hcs_params = reg_read32(hcd->regs, HC_HCSPARAMS);
532 : :
533 : 0 : return priv_init(hcd);
534 : : }
535 : :
536 : : static u32 base_to_chip(u32 base)
537 : : {
538 : 2343022 : return ((base - 0x400) >> 3);
539 : : }
540 : :
541 : : static int last_qtd_of_urb(struct isp1760_qtd *qtd, struct isp1760_qh *qh)
542 : : {
543 : : struct urb *urb;
544 : :
545 [ # # ][ + + ]: 2343022 : if (list_is_last(&qtd->qtd_list, &qh->qtd_list))
[ # # ]
546 : : return 1;
547 : :
548 : 1080509 : urb = qtd->urb;
549 : : qtd = list_entry(qtd->qtd_list.next, typeof(*qtd), qtd_list);
550 : 1080509 : return (qtd->urb != urb);
551 : : }
552 : :
553 : : /* magic numbers that can affect system performance */
554 : : #define EHCI_TUNE_CERR 3 /* 0-3 qtd retries; 0 == don't stop */
555 : : #define EHCI_TUNE_RL_HS 4 /* nak throttle; see 4.9 */
556 : : #define EHCI_TUNE_RL_TT 0
557 : : #define EHCI_TUNE_MULT_HS 1 /* 1-3 transactions/uframe; 4.10.3 */
558 : : #define EHCI_TUNE_MULT_TT 1
559 : : #define EHCI_TUNE_FLS 2 /* (small) 256 frame schedule */
560 : :
561 : 0 : static void create_ptd_atl(struct isp1760_qh *qh,
562 : : struct isp1760_qtd *qtd, struct ptd *ptd)
563 : : {
564 : : u32 maxpacket;
565 : : u32 multi;
566 : : u32 rl = RL_COUNTER;
567 : : u32 nak = NAK_COUNTER;
568 : :
569 : 2343022 : memset(ptd, 0, sizeof(*ptd));
570 : :
571 : : /* according to 3.6.2, max packet len can not be > 0x400 */
572 : 4686044 : maxpacket = usb_maxpacket(qtd->urb->dev, qtd->urb->pipe,
573 : 2343022 : usb_pipeout(qtd->urb->pipe));
574 : 2343022 : multi = 1 + ((maxpacket >> 11) & 0x3);
575 : 2343022 : maxpacket &= 0x7ff;
576 : :
577 : : /* DW0 */
578 : 2343022 : ptd->dw0 = DW0_VALID_BIT;
579 : 2343022 : ptd->dw0 |= TO_DW0_LENGTH(qtd->length);
580 : 2343022 : ptd->dw0 |= TO_DW0_MAXPACKET(maxpacket);
581 : 2343022 : ptd->dw0 |= TO_DW0_ENDPOINT(usb_pipeendpoint(qtd->urb->pipe));
582 : :
583 : : /* DW1 */
584 : 2343022 : ptd->dw1 = usb_pipeendpoint(qtd->urb->pipe) >> 1;
585 : 2343022 : ptd->dw1 |= TO_DW1_DEVICE_ADDR(usb_pipedevice(qtd->urb->pipe));
586 : 2343022 : ptd->dw1 |= TO_DW1_PID_TOKEN(qtd->packet_type);
587 : :
588 [ + - ]: 2343022 : if (usb_pipebulk(qtd->urb->pipe))
589 : 2343022 : ptd->dw1 |= DW1_TRANS_BULK;
590 [ # # ]: 0 : else if (usb_pipeint(qtd->urb->pipe))
591 : 0 : ptd->dw1 |= DW1_TRANS_INT;
592 : :
593 [ - + ]: 2343022 : if (qtd->urb->dev->speed != USB_SPEED_HIGH) {
594 : : /* split transaction */
595 : :
596 : 0 : ptd->dw1 |= DW1_TRANS_SPLIT;
597 [ # # ]: 0 : if (qtd->urb->dev->speed == USB_SPEED_LOW)
598 : 0 : ptd->dw1 |= DW1_SE_USB_LOSPEED;
599 : :
600 : 0 : ptd->dw1 |= TO_DW1_PORT_NUM(qtd->urb->dev->ttport);
601 : 0 : ptd->dw1 |= TO_DW1_HUB_NUM(qtd->urb->dev->tt->hub->devnum);
602 : :
603 : : /* SE bit for Split INT transfers */
604 [ # # ][ # # ]: 0 : if (usb_pipeint(qtd->urb->pipe) &&
605 : 0 : (qtd->urb->dev->speed == USB_SPEED_LOW))
606 : 0 : ptd->dw1 |= 2 << 16;
607 : :
608 : : rl = 0;
609 : : nak = 0;
610 : : } else {
611 : 2343022 : ptd->dw0 |= TO_DW0_MULTI(multi);
612 [ + - ]: 2343022 : if (usb_pipecontrol(qtd->urb->pipe) ||
613 : : usb_pipebulk(qtd->urb->pipe))
614 : 2343022 : ptd->dw3 |= TO_DW3_PING(qh->ping);
615 : : }
616 : : /* DW2 */
617 : 2343022 : ptd->dw2 = 0;
618 : 4686044 : ptd->dw2 |= TO_DW2_DATA_START_ADDR(base_to_chip(qtd->payload_addr));
619 : : ptd->dw2 |= TO_DW2_RL(rl);
620 : :
621 : : /* DW3 */
622 : 2343022 : ptd->dw3 |= TO_DW3_NAKCOUNT(nak);
623 : 2343022 : ptd->dw3 |= TO_DW3_DATA_TOGGLE(qh->toggle);
624 [ - + ]: 2343022 : if (usb_pipecontrol(qtd->urb->pipe)) {
625 [ # # ]: 0 : if (qtd->data_buffer == qtd->urb->setup_packet)
626 : 0 : ptd->dw3 &= ~TO_DW3_DATA_TOGGLE(1);
627 [ # # ]: 0 : else if (last_qtd_of_urb(qtd, qh))
628 : 0 : ptd->dw3 |= TO_DW3_DATA_TOGGLE(1);
629 : : }
630 : :
631 : 2343022 : ptd->dw3 |= DW3_ACTIVE_BIT;
632 : : /* Cerr */
633 : 2343022 : ptd->dw3 |= TO_DW3_CERR(ERR_COUNTER);
634 : 2343022 : }
635 : :
636 : 0 : static void transform_add_int(struct isp1760_qh *qh,
637 : : struct isp1760_qtd *qtd, struct ptd *ptd)
638 : : {
639 : : u32 usof;
640 : : u32 period;
641 : :
642 : : /*
643 : : * Most of this is guessing. ISP1761 datasheet is quite unclear, and
644 : : * the algorithm from the original Philips driver code, which was
645 : : * pretty much used in this driver before as well, is quite horrendous
646 : : * and, i believe, incorrect. The code below follows the datasheet and
647 : : * USB2.0 spec as far as I can tell, and plug/unplug seems to be much
648 : : * more reliable this way (fingers crossed...).
649 : : */
650 : :
651 [ # # ]: 0 : if (qtd->urb->dev->speed == USB_SPEED_HIGH) {
652 : : /* urb->interval is in units of microframes (1/8 ms) */
653 : 0 : period = qtd->urb->interval >> 3;
654 : :
655 [ # # ]: 0 : if (qtd->urb->interval > 4)
656 : : usof = 0x01; /* One bit set =>
657 : : interval 1 ms * uFrame-match */
658 [ # # ]: 0 : else if (qtd->urb->interval > 2)
659 : : usof = 0x22; /* Two bits set => interval 1/2 ms */
660 [ # # ]: 0 : else if (qtd->urb->interval > 1)
661 : : usof = 0x55; /* Four bits set => interval 1/4 ms */
662 : : else
663 : : usof = 0xff; /* All bits set => interval 1/8 ms */
664 : : } else {
665 : : /* urb->interval is in units of frames (1 ms) */
666 : 0 : period = qtd->urb->interval;
667 : : usof = 0x0f; /* Execute Start Split on any of the
668 : : four first uFrames */
669 : :
670 : : /*
671 : : * First 8 bits in dw5 is uSCS and "specifies which uSOF the
672 : : * complete split needs to be sent. Valid only for IN." Also,
673 : : * "All bits can be set to one for every transfer." (p 82,
674 : : * ISP1761 data sheet.) 0x1c is from Philips driver. Where did
675 : : * that number come from? 0xff seems to work fine...
676 : : */
677 : : /* ptd->dw5 = 0x1c; */
678 : 0 : ptd->dw5 = 0xff; /* Execute Complete Split on any uFrame */
679 : : }
680 : :
681 : 0 : period = period >> 1;/* Ensure equal or shorter period than requested */
682 : 0 : period &= 0xf8; /* Mask off too large values and lowest unused 3 bits */
683 : :
684 : 0 : ptd->dw2 |= period;
685 : 0 : ptd->dw4 = usof;
686 : 0 : }
687 : :
688 : 0 : static void create_ptd_int(struct isp1760_qh *qh,
689 : 0 : struct isp1760_qtd *qtd, struct ptd *ptd)
690 : : {
691 : 0 : create_ptd_atl(qh, qtd, ptd);
692 : 0 : transform_add_int(qh, qtd, ptd);
693 : 0 : }
694 : :
695 : 0 : static void isp1760_urb_done(struct usb_hcd *hcd, struct urb *urb)
696 : : __releases(priv->lock)
697 : : __acquires(priv->lock)
698 : : {
699 : : struct isp1760_hcd *priv = hcd_to_priv(hcd);
700 : :
701 [ + - ]: 2233869 : if (!urb->unlinked) {
702 [ + - ]: 2233869 : if (urb->status == -EINPROGRESS)
703 : 2233869 : urb->status = 0;
704 : : }
705 : :
706 [ + + ][ + - ]: 2233869 : if (usb_pipein(urb->pipe) && usb_pipetype(urb->pipe) != PIPE_CONTROL) {
707 : : void *ptr;
708 [ + + ]: 1618476 : for (ptr = urb->transfer_buffer;
709 : 1618476 : ptr < urb->transfer_buffer + urb->transfer_buffer_length;
710 : 833523 : ptr += PAGE_SIZE)
711 : 833523 : flush_dcache_page(virt_to_page(ptr));
712 : : }
713 : :
714 : : /* complete() can reenter this HCD */
715 : 2233869 : usb_hcd_unlink_urb_from_ep(hcd, urb);
716 : : spin_unlock(&priv->lock);
717 : 2233869 : usb_hcd_giveback_urb(hcd, urb, urb->status);
718 : : spin_lock(&priv->lock);
719 : 2233869 : }
720 : :
721 : 0 : static struct isp1760_qtd *qtd_alloc(gfp_t flags, struct urb *urb,
722 : : u8 packet_type)
723 : : {
724 : : struct isp1760_qtd *qtd;
725 : :
726 : 2343022 : qtd = kmem_cache_zalloc(qtd_cachep, flags);
727 [ + - ]: 2343022 : if (!qtd)
728 : : return NULL;
729 : :
730 : 2343022 : INIT_LIST_HEAD(&qtd->qtd_list);
731 : 2343022 : qtd->urb = urb;
732 : 2343022 : qtd->packet_type = packet_type;
733 : 2343022 : qtd->status = QTD_ENQUEUED;
734 : 2343022 : qtd->actual_length = 0;
735 : :
736 : 2343022 : return qtd;
737 : : }
738 : :
739 : 0 : static void qtd_free(struct isp1760_qtd *qtd)
740 : : {
741 [ - + ]: 2343022 : WARN_ON(qtd->payload_addr);
742 : 2343022 : kmem_cache_free(qtd_cachep, qtd);
743 : 2343022 : }
744 : :
745 : 0 : static void start_bus_transfer(struct usb_hcd *hcd, u32 ptd_offset, int slot,
746 : : struct slotinfo *slots, struct isp1760_qtd *qtd,
747 : : struct isp1760_qh *qh, struct ptd *ptd)
748 : : {
749 : : struct isp1760_hcd *priv = hcd_to_priv(hcd);
750 : : int skip_map;
751 : :
752 [ - + ]: 2343022 : WARN_ON((slot < 0) || (slot > 31));
753 [ + + ][ - + ]: 4686044 : WARN_ON(qtd->length && !qtd->payload_addr);
[ - + ]
754 [ - + ]: 2343022 : WARN_ON(slots[slot].qtd);
755 [ - + ]: 2343022 : WARN_ON(slots[slot].qh);
756 [ - + ]: 2343022 : WARN_ON(qtd->status != QTD_PAYLOAD_ALLOC);
757 : :
758 : : /* Make sure done map has not triggered from some unlinked transfer */
759 [ + - ]: 2343022 : if (ptd_offset == ATL_PTD_OFFSET) {
760 : 4686044 : priv->atl_done_map |= reg_read32(hcd->regs,
761 : : HC_ATL_PTD_DONEMAP_REG);
762 : 2343022 : priv->atl_done_map &= ~(1 << slot);
763 : : } else {
764 : 0 : priv->int_done_map |= reg_read32(hcd->regs,
765 : : HC_INT_PTD_DONEMAP_REG);
766 : 0 : priv->int_done_map &= ~(1 << slot);
767 : : }
768 : :
769 : 2343022 : qh->slot = slot;
770 : 2343022 : qtd->status = QTD_XFER_STARTED;
771 : 2343022 : slots[slot].timestamp = jiffies;
772 : 2343022 : slots[slot].qtd = qtd;
773 : 2343022 : slots[slot].qh = qh;
774 : 2343022 : ptd_write(hcd->regs, ptd_offset, slot, ptd);
775 : :
776 [ + - ]: 2343022 : if (ptd_offset == ATL_PTD_OFFSET) {
777 : 4686044 : skip_map = reg_read32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG);
778 : 2343022 : skip_map &= ~(1 << qh->slot);
779 : 2343022 : reg_write32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG, skip_map);
780 : : } else {
781 : 0 : skip_map = reg_read32(hcd->regs, HC_INT_PTD_SKIPMAP_REG);
782 : 0 : skip_map &= ~(1 << qh->slot);
783 : 0 : reg_write32(hcd->regs, HC_INT_PTD_SKIPMAP_REG, skip_map);
784 : : }
785 : 2343022 : }
786 : :
787 : : static int is_short_bulk(struct isp1760_qtd *qtd)
788 : : {
789 [ + - ][ + - ]: 12577313 : return (usb_pipebulk(qtd->urb->pipe) &&
[ + + ][ + ]
790 : 3423531 : (qtd->actual_length < qtd->length));
791 : : }
792 : :
793 : 0 : static void collect_qtds(struct usb_hcd *hcd, struct isp1760_qh *qh,
794 : : struct list_head *urb_list)
795 : : {
796 : : int last_qtd;
797 : : struct isp1760_qtd *qtd, *qtd_next;
798 : : struct urb_listitem *urb_listitem;
799 : :
800 [ + + ]: 11496804 : list_for_each_entry_safe(qtd, qtd_next, &qh->qtd_list, qtd_list) {
801 [ + + ]: 10234291 : if (qtd->status < QTD_XFER_COMPLETE)
802 : : break;
803 : :
804 : : last_qtd = last_qtd_of_urb(qtd, qh);
805 : :
806 [ + + ][ - + ]: 2343022 : if ((!last_qtd) && (qtd->status == QTD_RETIRE))
807 : 0 : qtd_next->status = QTD_RETIRE;
808 : :
809 [ + - ]: 2343022 : if (qtd->status == QTD_XFER_COMPLETE) {
810 [ + - ]: 2343022 : if (qtd->actual_length) {
811 [ + + ]: 2343022 : switch (qtd->packet_type) {
812 : : case IN_PID:
813 : 791962 : mem_reads8(hcd->regs, qtd->payload_addr,
814 : : qtd->data_buffer,
815 : : qtd->actual_length);
816 : : /* Fall through (?) */
817 : : case OUT_PID:
818 : 2343022 : qtd->urb->actual_length +=
819 : 2343022 : qtd->actual_length;
820 : : /* Fall through ... */
821 : : case SETUP_PID:
822 : : break;
823 : : }
824 : : }
825 : :
826 [ - + ]: 11496804 : if (is_short_bulk(qtd)) {
827 [ # # ]: 0 : if (qtd->urb->transfer_flags & URB_SHORT_NOT_OK)
828 : 0 : qtd->urb->status = -EREMOTEIO;
829 [ # # ]: 0 : if (!last_qtd)
830 : 0 : qtd_next->status = QTD_RETIRE;
831 : : }
832 : : }
833 : :
834 [ + - ]: 2343022 : if (qtd->payload_addr)
835 : 2343022 : free_mem(hcd, qtd);
836 : :
837 [ + + ]: 2343022 : if (last_qtd) {
838 [ - + ][ # # ]: 2233869 : if ((qtd->status == QTD_RETIRE) &&
839 : 0 : (qtd->urb->status == -EINPROGRESS))
840 : 0 : qtd->urb->status = -EPIPE;
841 : : /* Defer calling of urb_done() since it releases lock */
842 : 2233869 : urb_listitem = kmem_cache_zalloc(urb_listitem_cachep,
843 : : GFP_ATOMIC);
844 [ + - ]: 2233869 : if (unlikely(!urb_listitem))
845 : : break; /* Try again on next call */
846 : 2233869 : urb_listitem->urb = qtd->urb;
847 : 2233869 : list_add_tail(&urb_listitem->urb_list, urb_list);
848 : : }
849 : :
850 : : list_del(&qtd->qtd_list);
851 : 2343022 : qtd_free(qtd);
852 : : }
853 : 9153782 : }
854 : :
855 : : #define ENQUEUE_DEPTH 2
856 : 0 : static void enqueue_qtds(struct usb_hcd *hcd, struct isp1760_qh *qh)
857 : : {
858 : : struct isp1760_hcd *priv = hcd_to_priv(hcd);
859 : : int ptd_offset;
860 : : struct slotinfo *slots;
861 : : int curr_slot, free_slot;
862 : : int n;
863 : : struct ptd ptd;
864 : : struct isp1760_qtd *qtd;
865 : :
866 [ - + ]: 7891282 : if (unlikely(list_empty(&qh->qtd_list))) {
867 : 0 : WARN_ON(1);
868 : 0 : return;
869 : : }
870 : :
871 : : /* Make sure this endpoint's TT buffer is clean before queueing ptds */
872 [ + - ]: 7891282 : if (qh->tt_buffer_dirty)
873 : : return;
874 : :
875 [ + + ]: 7891282 : if (usb_pipeint(list_entry(qh->qtd_list.next, struct isp1760_qtd,
876 : : qtd_list)->urb->pipe)) {
877 : : ptd_offset = INT_PTD_OFFSET;
878 : 4576891 : slots = priv->int_slots;
879 : : } else {
880 : : ptd_offset = ATL_PTD_OFFSET;
881 : 3314391 : slots = priv->atl_slots;
882 : : }
883 : :
884 : : free_slot = -1;
885 [ + + ]: 48291698 : for (curr_slot = 0; curr_slot < 32; curr_slot++) {
886 [ + + ][ + + ]: 47029185 : if ((free_slot == -1) && (slots[curr_slot].qtd == NULL))
887 : : free_slot = curr_slot;
888 [ + + ]: 47029185 : if (slots[curr_slot].qh == qh)
889 : : break;
890 : : }
891 : :
892 : : n = 0;
893 [ + + ]: 18855842 : list_for_each_entry(qtd, &qh->qtd_list, qtd_list) {
894 [ + + ]: 10964560 : if (qtd->status == QTD_ENQUEUED) {
895 [ - + ]: 2343022 : WARN_ON(qtd->payload_addr);
896 : 2343022 : alloc_mem(hcd, qtd);
897 [ + - ][ + - ]: 2343022 : if ((qtd->length) && (!qtd->payload_addr))
898 : : break;
899 : :
900 [ + - ][ + + ]: 2343022 : if ((qtd->length) &&
901 : 2343022 : ((qtd->packet_type == SETUP_PID) ||
902 : : (qtd->packet_type == OUT_PID))) {
903 : 1551060 : mem_writes8(hcd->regs, qtd->payload_addr,
904 : 1551060 : qtd->data_buffer, qtd->length);
905 : : }
906 : :
907 : 2343022 : qtd->status = QTD_PAYLOAD_ALLOC;
908 : : }
909 : :
910 [ + + ]: 10964560 : if (qtd->status == QTD_PAYLOAD_ALLOC) {
911 : : /*
912 : : if ((curr_slot > 31) && (free_slot == -1))
913 : : dev_dbg(hcd->self.controller, "%s: No slot "
914 : : "available for transfer\n", __func__);
915 : : */
916 : : /* Start xfer for this endpoint if not already done */
917 [ + + ]: 4335791 : if ((curr_slot > 31) && (free_slot > -1)) {
918 [ - + ]: 1262513 : if (usb_pipeint(qtd->urb->pipe))
919 : 0 : create_ptd_int(qh, qtd, &ptd);
920 : : else
921 : 1262513 : create_ptd_atl(qh, qtd, &ptd);
922 : :
923 : 1262513 : start_bus_transfer(hcd, ptd_offset, free_slot,
924 : : slots, qtd, qh, &ptd);
925 : : curr_slot = free_slot;
926 : : }
927 : :
928 : 4335791 : n++;
929 [ + + ]: 12227073 : if (n >= ENQUEUE_DEPTH)
930 : : break;
931 : : }
932 : : }
933 : : }
934 : :
935 : 0 : static void schedule_ptds(struct usb_hcd *hcd)
936 : : {
937 : : struct isp1760_hcd *priv;
938 : : struct isp1760_qh *qh, *qh_next;
939 : : struct list_head *ep_queue;
940 : 4576891 : LIST_HEAD(urb_list);
941 : : struct urb_listitem *urb_listitem, *urb_listitem_next;
942 : : int i;
943 : :
944 [ + - ]: 4576891 : if (!hcd) {
945 : 0 : WARN_ON(1);
946 : 0 : return;
947 : : }
948 : :
949 : : priv = hcd_to_priv(hcd);
950 : :
951 : : /*
952 : : * check finished/retired xfers, transfer payloads, call urb_done()
953 : : */
954 [ + + ]: 18307564 : for (i = 0; i < QH_END; i++) {
955 : 13730673 : ep_queue = &priv->qh_list[i];
956 [ + + ]: 22884455 : list_for_each_entry_safe(qh, qh_next, ep_queue, qh_list) {
957 : 9153782 : collect_qtds(hcd, qh, &urb_list);
958 [ + + ]: 13730673 : if (list_empty(&qh->qtd_list))
959 : : list_del(&qh->qh_list);
960 : : }
961 : : }
962 : :
963 [ + + ]: 6810760 : list_for_each_entry_safe(urb_listitem, urb_listitem_next, &urb_list,
964 : : urb_list) {
965 : 2233869 : isp1760_urb_done(hcd, urb_listitem->urb);
966 : 2233869 : kmem_cache_free(urb_listitem_cachep, urb_listitem);
967 : : }
968 : :
969 : : /*
970 : : * Schedule packets for transfer.
971 : : *
972 : : * According to USB2.0 specification:
973 : : *
974 : : * 1st prio: interrupt xfers, up to 80 % of bandwidth
975 : : * 2nd prio: control xfers
976 : : * 3rd prio: bulk xfers
977 : : *
978 : : * ... but let's use a simpler scheme here (mostly because ISP1761 doc
979 : : * is very unclear on how to prioritize traffic):
980 : : *
981 : : * 1) Enqueue any queued control transfers, as long as payload chip mem
982 : : * and PTD ATL slots are available.
983 : : * 2) Enqueue any queued INT transfers, as long as payload chip mem
984 : : * and PTD INT slots are available.
985 : : * 3) Enqueue any queued bulk transfers, as long as payload chip mem
986 : : * and PTD ATL slots are available.
987 : : *
988 : : * Use double buffering (ENQUEUE_DEPTH==2) as a compromise between
989 : : * conservation of chip mem and performance.
990 : : *
991 : : * I'm sure this scheme could be improved upon!
992 : : */
993 [ + + ]: 18307564 : for (i = 0; i < QH_END; i++) {
994 : 13730673 : ep_queue = &priv->qh_list[i];
995 [ + + ]: 21621955 : list_for_each_entry_safe(qh, qh_next, ep_queue, qh_list)
996 : 7891282 : enqueue_qtds(hcd, qh);
997 : : }
998 : : }
999 : :
1000 : : #define PTD_STATE_QTD_DONE 1
1001 : : #define PTD_STATE_QTD_RELOAD 2
1002 : : #define PTD_STATE_URB_RETIRE 3
1003 : :
1004 : 0 : static int check_int_transfer(struct usb_hcd *hcd, struct ptd *ptd,
1005 : : struct urb *urb)
1006 : : {
1007 : : __dw dw4;
1008 : : int i;
1009 : :
1010 : 0 : dw4 = ptd->dw4;
1011 : 0 : dw4 >>= 8;
1012 : :
1013 : : /* FIXME: ISP1761 datasheet does not say what to do with these. Do we
1014 : : need to handle these errors? Is it done in hardware? */
1015 : :
1016 [ # # ]: 0 : if (ptd->dw3 & DW3_HALT_BIT) {
1017 : :
1018 : 0 : urb->status = -EPROTO; /* Default unknown error */
1019 : :
1020 [ # # ]: 0 : for (i = 0; i < 8; i++) {
1021 [ # # # # ]: 0 : switch (dw4 & 0x7) {
1022 : : case INT_UNDERRUN:
1023 : : dev_dbg(hcd->self.controller, "%s: underrun "
1024 : : "during uFrame %d\n",
1025 : : __func__, i);
1026 : 0 : urb->status = -ECOMM; /* Could not write data */
1027 : : break;
1028 : : case INT_EXACT:
1029 : : dev_dbg(hcd->self.controller, "%s: transaction "
1030 : : "error during uFrame %d\n",
1031 : : __func__, i);
1032 : 0 : urb->status = -EPROTO; /* timeout, bad CRC, PID
1033 : : error etc. */
1034 : : break;
1035 : : case INT_BABBLE:
1036 : : dev_dbg(hcd->self.controller, "%s: babble "
1037 : : "error during uFrame %d\n",
1038 : : __func__, i);
1039 : 0 : urb->status = -EOVERFLOW;
1040 : : break;
1041 : : }
1042 : 0 : dw4 >>= 3;
1043 : : }
1044 : :
1045 : : return PTD_STATE_URB_RETIRE;
1046 : : }
1047 : :
1048 : : return PTD_STATE_QTD_DONE;
1049 : : }
1050 : :
1051 : 0 : static int check_atl_transfer(struct usb_hcd *hcd, struct ptd *ptd,
1052 : : struct urb *urb)
1053 : : {
1054 [ - + ]: 2343022 : WARN_ON(!ptd);
1055 [ - + ]: 4686044 : if (ptd->dw3 & DW3_HALT_BIT) {
1056 [ # # ]: 0 : if (ptd->dw3 & DW3_BABBLE_BIT)
1057 : 0 : urb->status = -EOVERFLOW;
1058 [ # # ]: 0 : else if (FROM_DW3_CERR(ptd->dw3))
1059 : 0 : urb->status = -EPIPE; /* Stall */
1060 [ # # ]: 0 : else if (ptd->dw3 & DW3_ERROR_BIT)
1061 : 0 : urb->status = -EPROTO; /* XactErr */
1062 : : else
1063 : 0 : urb->status = -EPROTO; /* Unknown */
1064 : : /*
1065 : : dev_dbg(hcd->self.controller, "%s: ptd error:\n"
1066 : : " dw0: %08x dw1: %08x dw2: %08x dw3: %08x\n"
1067 : : " dw4: %08x dw5: %08x dw6: %08x dw7: %08x\n",
1068 : : __func__,
1069 : : ptd->dw0, ptd->dw1, ptd->dw2, ptd->dw3,
1070 : : ptd->dw4, ptd->dw5, ptd->dw6, ptd->dw7);
1071 : : */
1072 : : return PTD_STATE_URB_RETIRE;
1073 : : }
1074 : :
1075 [ - + ][ # # ]: 2343022 : if ((ptd->dw3 & DW3_ERROR_BIT) && (ptd->dw3 & DW3_ACTIVE_BIT)) {
1076 : : /* Transfer Error, *but* active and no HALT -> reload */
1077 : : dev_dbg(hcd->self.controller, "PID error; reloading ptd\n");
1078 : : return PTD_STATE_QTD_RELOAD;
1079 : : }
1080 : :
1081 [ + - ][ + - ]: 2343022 : if (!FROM_DW3_NAKCOUNT(ptd->dw3) && (ptd->dw3 & DW3_ACTIVE_BIT)) {
1082 : : /*
1083 : : * NAKs are handled in HW by the chip. Usually if the
1084 : : * device is not able to send data fast enough.
1085 : : * This happens mostly on slower hardware.
1086 : : */
1087 : : return PTD_STATE_QTD_RELOAD;
1088 : : }
1089 : :
1090 : : return PTD_STATE_QTD_DONE;
1091 : : }
1092 : :
1093 : 0 : static void handle_done_ptds(struct usb_hcd *hcd)
1094 : : {
1095 : : struct isp1760_hcd *priv = hcd_to_priv(hcd);
1096 : : struct ptd ptd;
1097 : : struct isp1760_qh *qh;
1098 : : int slot;
1099 : : int state;
1100 : : struct slotinfo *slots;
1101 : : u32 ptd_offset;
1102 : : struct isp1760_qtd *qtd;
1103 : : int modified;
1104 : : int skip_map;
1105 : :
1106 : 4686044 : skip_map = reg_read32(hcd->regs, HC_INT_PTD_SKIPMAP_REG);
1107 : 2343022 : priv->int_done_map &= ~skip_map;
1108 : 7029066 : skip_map = reg_read32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG);
1109 : 4686044 : priv->atl_done_map &= ~skip_map;
1110 : :
1111 [ + + ][ - + ]: 4686044 : modified = priv->int_done_map || priv->atl_done_map;
1112 : :
1113 [ - + ][ + + ]: 7029066 : while (priv->int_done_map || priv->atl_done_map) {
1114 [ - + ]: 2343022 : if (priv->int_done_map) {
1115 : : /* INT ptd */
1116 : 0 : slot = __ffs(priv->int_done_map);
1117 : 0 : priv->int_done_map &= ~(1 << slot);
1118 : 0 : slots = priv->int_slots;
1119 : : /* This should not trigger, and could be removed if
1120 : : noone have any problems with it triggering: */
1121 [ # # ]: 0 : if (!slots[slot].qh) {
1122 : 0 : WARN_ON(1);
1123 : 0 : continue;
1124 : : }
1125 : : ptd_offset = INT_PTD_OFFSET;
1126 : 0 : ptd_read(hcd->regs, INT_PTD_OFFSET, slot, &ptd);
1127 : 0 : state = check_int_transfer(hcd, &ptd,
1128 : 0 : slots[slot].qtd->urb);
1129 : : } else {
1130 : : /* ATL ptd */
1131 : 4686044 : slot = __ffs(priv->atl_done_map);
1132 : 2343022 : priv->atl_done_map &= ~(1 << slot);
1133 : 2343022 : slots = priv->atl_slots;
1134 : : /* This should not trigger, and could be removed if
1135 : : noone have any problems with it triggering: */
1136 [ - + ]: 2343022 : if (!slots[slot].qh) {
1137 : 0 : WARN_ON(1);
1138 : 0 : continue;
1139 : : }
1140 : : ptd_offset = ATL_PTD_OFFSET;
1141 : 2343022 : ptd_read(hcd->regs, ATL_PTD_OFFSET, slot, &ptd);
1142 : 2343022 : state = check_atl_transfer(hcd, &ptd,
1143 : 2343022 : slots[slot].qtd->urb);
1144 : : }
1145 : :
1146 : 2343022 : qtd = slots[slot].qtd;
1147 : 2343022 : slots[slot].qtd = NULL;
1148 : 2343022 : qh = slots[slot].qh;
1149 : 2343022 : slots[slot].qh = NULL;
1150 : 2343022 : qh->slot = -1;
1151 : :
1152 [ - + ]: 2343022 : WARN_ON(qtd->status != QTD_XFER_STARTED);
1153 : :
1154 [ + - - - ]: 2343022 : switch (state) {
1155 : : case PTD_STATE_QTD_DONE:
1156 [ - + ][ # # ]: 2343022 : if ((usb_pipeint(qtd->urb->pipe)) &&
1157 : 0 : (qtd->urb->dev->speed != USB_SPEED_HIGH))
1158 : 0 : qtd->actual_length =
1159 : 0 : FROM_DW3_SCS_NRBYTESTRANSFERRED(ptd.dw3);
1160 : : else
1161 : 2343022 : qtd->actual_length =
1162 : 2343022 : FROM_DW3_NRBYTESTRANSFERRED(ptd.dw3);
1163 : :
1164 : 2343022 : qtd->status = QTD_XFER_COMPLETE;
1165 [ + + ][ + - ]: 3423531 : if (list_is_last(&qtd->qtd_list, &qh->qtd_list) ||
1166 : : is_short_bulk(qtd))
1167 : : qtd = NULL;
1168 : : else
1169 : 1080509 : qtd = list_entry(qtd->qtd_list.next,
1170 : : typeof(*qtd), qtd_list);
1171 : :
1172 : 2343022 : qh->toggle = FROM_DW3_DATA_TOGGLE(ptd.dw3);
1173 : 2343022 : qh->ping = FROM_DW3_PING(ptd.dw3);
1174 : 2343022 : break;
1175 : :
1176 : : case PTD_STATE_QTD_RELOAD: /* QTD_RETRY, for atls only */
1177 : 0 : qtd->status = QTD_PAYLOAD_ALLOC;
1178 : 0 : ptd.dw0 |= DW0_VALID_BIT;
1179 : : /* RL counter = ERR counter */
1180 : 0 : ptd.dw3 &= ~TO_DW3_NAKCOUNT(0xf);
1181 : 0 : ptd.dw3 |= TO_DW3_NAKCOUNT(FROM_DW2_RL(ptd.dw2));
1182 : 0 : ptd.dw3 &= ~TO_DW3_CERR(3);
1183 : 0 : ptd.dw3 |= TO_DW3_CERR(ERR_COUNTER);
1184 : 0 : qh->toggle = FROM_DW3_DATA_TOGGLE(ptd.dw3);
1185 : 0 : qh->ping = FROM_DW3_PING(ptd.dw3);
1186 : 0 : break;
1187 : :
1188 : : case PTD_STATE_URB_RETIRE:
1189 : 0 : qtd->status = QTD_RETIRE;
1190 [ # # ][ # # ]: 0 : if ((qtd->urb->dev->speed != USB_SPEED_HIGH) &&
1191 [ # # ]: 0 : (qtd->urb->status != -EPIPE) &&
1192 : : (qtd->urb->status != -EREMOTEIO)) {
1193 : 0 : qh->tt_buffer_dirty = 1;
1194 [ # # ]: 0 : if (usb_hub_clear_tt_buffer(qtd->urb))
1195 : : /* Clear failed; let's hope things work
1196 : : anyway */
1197 : 0 : qh->tt_buffer_dirty = 0;
1198 : : }
1199 : : qtd = NULL;
1200 : 0 : qh->toggle = 0;
1201 : 0 : qh->ping = 0;
1202 : 0 : break;
1203 : :
1204 : : default:
1205 : 0 : WARN_ON(1);
1206 : 0 : continue;
1207 : : }
1208 : :
1209 [ + + ][ + - ]: 2343022 : if (qtd && (qtd->status == QTD_PAYLOAD_ALLOC)) {
1210 [ - + ]: 1080509 : if (slots == priv->int_slots) {
1211 [ # # ]: 0 : if (state == PTD_STATE_QTD_RELOAD)
1212 : 0 : dev_err(hcd->self.controller,
1213 : : "%s: PTD_STATE_QTD_RELOAD on "
1214 : : "interrupt packet\n", __func__);
1215 [ # # ]: 0 : if (state != PTD_STATE_QTD_RELOAD)
1216 : 0 : create_ptd_int(qh, qtd, &ptd);
1217 : : } else {
1218 [ + - ]: 1080509 : if (state != PTD_STATE_QTD_RELOAD)
1219 : 1080509 : create_ptd_atl(qh, qtd, &ptd);
1220 : : }
1221 : :
1222 : 2343022 : start_bus_transfer(hcd, ptd_offset, slot, slots, qtd,
1223 : : qh, &ptd);
1224 : : }
1225 : : }
1226 : :
1227 [ + - ]: 2343022 : if (modified)
1228 : 2343022 : schedule_ptds(hcd);
1229 : 2343022 : }
1230 : :
1231 : 0 : static irqreturn_t isp1760_irq(struct usb_hcd *hcd)
1232 : : {
1233 : : struct isp1760_hcd *priv = hcd_to_priv(hcd);
1234 : : u32 imask;
1235 : : irqreturn_t irqret = IRQ_NONE;
1236 : :
1237 : : spin_lock(&priv->lock);
1238 : :
1239 [ + - ]: 2343022 : if (!(hcd->state & HC_STATE_RUNNING))
1240 : : goto leave;
1241 : :
1242 : 2343022 : imask = reg_read32(hcd->regs, HC_INTERRUPT_REG);
1243 [ + - ]: 2343022 : if (unlikely(!imask))
1244 : : goto leave;
1245 : 2343022 : reg_write32(hcd->regs, HC_INTERRUPT_REG, imask); /* Clear */
1246 : :
1247 : 4686044 : priv->int_done_map |= reg_read32(hcd->regs, HC_INT_PTD_DONEMAP_REG);
1248 : 4686044 : priv->atl_done_map |= reg_read32(hcd->regs, HC_ATL_PTD_DONEMAP_REG);
1249 : :
1250 : 2343022 : handle_done_ptds(hcd);
1251 : :
1252 : : irqret = IRQ_HANDLED;
1253 : : leave:
1254 : : spin_unlock(&priv->lock);
1255 : :
1256 : 2343022 : return irqret;
1257 : : }
1258 : :
1259 : : /*
1260 : : * Workaround for problem described in chip errata 2:
1261 : : *
1262 : : * Sometimes interrupts are not generated when ATL (not INT?) completion occurs.
1263 : : * One solution suggested in the errata is to use SOF interrupts _instead_of_
1264 : : * ATL done interrupts (the "instead of" might be important since it seems
1265 : : * enabling ATL interrupts also causes the chip to sometimes - rarely - "forget"
1266 : : * to set the PTD's done bit in addition to not generating an interrupt!).
1267 : : *
1268 : : * So if we use SOF + ATL interrupts, we sometimes get stale PTDs since their
1269 : : * done bit is not being set. This is bad - it blocks the endpoint until reboot.
1270 : : *
1271 : : * If we use SOF interrupts only, we get latency between ptd completion and the
1272 : : * actual handling. This is very noticeable in testusb runs which takes several
1273 : : * minutes longer without ATL interrupts.
1274 : : *
1275 : : * A better solution is to run the code below every SLOT_CHECK_PERIOD ms. If it
1276 : : * finds active ATL slots which are older than SLOT_TIMEOUT ms, it checks the
1277 : : * slot's ACTIVE and VALID bits. If these are not set, the ptd is considered
1278 : : * completed and its done map bit is set.
1279 : : *
1280 : : * The values of SLOT_TIMEOUT and SLOT_CHECK_PERIOD have been arbitrarily chosen
1281 : : * not to cause too much lag when this HW bug occurs, while still hopefully
1282 : : * ensuring that the check does not falsely trigger.
1283 : : */
1284 : : #define SLOT_TIMEOUT 300
1285 : : #define SLOT_CHECK_PERIOD 200
1286 : : static struct timer_list errata2_timer;
1287 : :
1288 : 0 : static void errata2_function(unsigned long data)
1289 : : {
1290 : 436144 : struct usb_hcd *hcd = (struct usb_hcd *) data;
1291 : : struct isp1760_hcd *priv = hcd_to_priv(hcd);
1292 : : int slot;
1293 : : struct ptd ptd;
1294 : : unsigned long spinflags;
1295 : :
1296 : 436144 : spin_lock_irqsave(&priv->lock, spinflags);
1297 : :
1298 [ + + ]: 14392752 : for (slot = 0; slot < 32; slot++)
1299 [ + + ][ + + ]: 13956608 : if (priv->atl_slots[slot].qh && time_after(jiffies,
1300 : : priv->atl_slots[slot].timestamp +
1301 : : SLOT_TIMEOUT * HZ / 1000)) {
1302 : 7057 : ptd_read(hcd->regs, ATL_PTD_OFFSET, slot, &ptd);
1303 [ - + ][ # # ]: 7057 : if (!FROM_DW0_VALID(ptd.dw0) &&
1304 : 0 : !FROM_DW3_ACTIVE(ptd.dw3))
1305 : 0 : priv->atl_done_map |= 1 << slot;
1306 : : }
1307 : :
1308 [ - + ]: 436144 : if (priv->atl_done_map)
1309 : 0 : handle_done_ptds(hcd);
1310 : :
1311 : : spin_unlock_irqrestore(&priv->lock, spinflags);
1312 : :
1313 : 436144 : errata2_timer.expires = jiffies + SLOT_CHECK_PERIOD * HZ / 1000;
1314 : 436144 : add_timer(&errata2_timer);
1315 : 436144 : }
1316 : :
1317 : 0 : static int isp1760_run(struct usb_hcd *hcd)
1318 : : {
1319 : : int retval;
1320 : : u32 temp;
1321 : : u32 command;
1322 : : u32 chipid;
1323 : :
1324 : 0 : hcd->uses_new_polling = 1;
1325 : :
1326 : 0 : hcd->state = HC_STATE_RUNNING;
1327 : :
1328 : : /* Set PTD interrupt AND & OR maps */
1329 : 0 : reg_write32(hcd->regs, HC_ATL_IRQ_MASK_AND_REG, 0);
1330 : 0 : reg_write32(hcd->regs, HC_ATL_IRQ_MASK_OR_REG, 0xffffffff);
1331 : 0 : reg_write32(hcd->regs, HC_INT_IRQ_MASK_AND_REG, 0);
1332 : 0 : reg_write32(hcd->regs, HC_INT_IRQ_MASK_OR_REG, 0xffffffff);
1333 : 0 : reg_write32(hcd->regs, HC_ISO_IRQ_MASK_AND_REG, 0);
1334 : 0 : reg_write32(hcd->regs, HC_ISO_IRQ_MASK_OR_REG, 0xffffffff);
1335 : : /* step 23 passed */
1336 : :
1337 : 0 : temp = reg_read32(hcd->regs, HC_HW_MODE_CTRL);
1338 : 0 : reg_write32(hcd->regs, HC_HW_MODE_CTRL, temp | HW_GLOBAL_INTR_EN);
1339 : :
1340 : 0 : command = reg_read32(hcd->regs, HC_USBCMD);
1341 : 0 : command &= ~(CMD_LRESET|CMD_RESET);
1342 : 0 : command |= CMD_RUN;
1343 : 0 : reg_write32(hcd->regs, HC_USBCMD, command);
1344 : :
1345 : : retval = handshake(hcd, HC_USBCMD, CMD_RUN, CMD_RUN, 250 * 1000);
1346 [ # # ]: 0 : if (retval)
1347 : : return retval;
1348 : :
1349 : : /*
1350 : : * XXX
1351 : : * Spec says to write FLAG_CF as last config action, priv code grabs
1352 : : * the semaphore while doing so.
1353 : : */
1354 : 0 : down_write(&ehci_cf_port_reset_rwsem);
1355 : 0 : reg_write32(hcd->regs, HC_CONFIGFLAG, FLAG_CF);
1356 : :
1357 : : retval = handshake(hcd, HC_CONFIGFLAG, FLAG_CF, FLAG_CF, 250 * 1000);
1358 : 0 : up_write(&ehci_cf_port_reset_rwsem);
1359 [ # # ]: 0 : if (retval)
1360 : : return retval;
1361 : :
1362 : 0 : init_timer(&errata2_timer);
1363 : 0 : errata2_timer.function = errata2_function;
1364 : 0 : errata2_timer.data = (unsigned long) hcd;
1365 : 0 : errata2_timer.expires = jiffies + SLOT_CHECK_PERIOD * HZ / 1000;
1366 : 0 : add_timer(&errata2_timer);
1367 : :
1368 : 0 : chipid = reg_read32(hcd->regs, HC_CHIP_ID_REG);
1369 : 0 : dev_info(hcd->self.controller, "USB ISP %04x HW rev. %d started\n",
1370 : : chipid & 0xffff, chipid >> 16);
1371 : :
1372 : : /* PTD Register Init Part 2, Step 28 */
1373 : :
1374 : : /* Setup registers controlling PTD checking */
1375 : 0 : reg_write32(hcd->regs, HC_ATL_PTD_LASTPTD_REG, 0x80000000);
1376 : 0 : reg_write32(hcd->regs, HC_INT_PTD_LASTPTD_REG, 0x80000000);
1377 : 0 : reg_write32(hcd->regs, HC_ISO_PTD_LASTPTD_REG, 0x00000001);
1378 : 0 : reg_write32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG, 0xffffffff);
1379 : 0 : reg_write32(hcd->regs, HC_INT_PTD_SKIPMAP_REG, 0xffffffff);
1380 : 0 : reg_write32(hcd->regs, HC_ISO_PTD_SKIPMAP_REG, 0xffffffff);
1381 : 0 : reg_write32(hcd->regs, HC_BUFFER_STATUS_REG,
1382 : : ATL_BUF_FILL | INT_BUF_FILL);
1383 : :
1384 : : /* GRR this is run-once init(), being done every time the HC starts.
1385 : : * So long as they're part of class devices, we can't do it init()
1386 : : * since the class device isn't created that early.
1387 : : */
1388 : 0 : return 0;
1389 : : }
1390 : :
1391 : : static int qtd_fill(struct isp1760_qtd *qtd, void *databuffer, size_t len)
1392 : : {
1393 : 2343022 : qtd->data_buffer = databuffer;
1394 : :
1395 [ + + ]: 2343022 : if (len > MAX_PAYLOAD_SIZE)
1396 : : len = MAX_PAYLOAD_SIZE;
1397 : 2343022 : qtd->length = len;
1398 : :
1399 : 2343022 : return qtd->length;
1400 : : }
1401 : :
1402 : 0 : static void qtd_list_free(struct list_head *qtd_list)
1403 : : {
1404 : : struct isp1760_qtd *qtd, *qtd_next;
1405 : :
1406 [ # # ]: 0 : list_for_each_entry_safe(qtd, qtd_next, qtd_list, qtd_list) {
1407 : : list_del(&qtd->qtd_list);
1408 : 0 : qtd_free(qtd);
1409 : : }
1410 : 0 : }
1411 : :
1412 : : /*
1413 : : * Packetize urb->transfer_buffer into list of packets of size wMaxPacketSize.
1414 : : * Also calculate the PID type (SETUP/IN/OUT) for each packet.
1415 : : */
1416 : : #define max_packet(wMaxPacketSize) ((wMaxPacketSize) & 0x07ff)
1417 : 0 : static void packetize_urb(struct usb_hcd *hcd,
1418 : : struct urb *urb, struct list_head *head, gfp_t flags)
1419 : : {
1420 : : struct isp1760_qtd *qtd;
1421 : : void *buf;
1422 : : int len, maxpacketsize;
1423 : : u8 packet_type;
1424 : :
1425 : : /*
1426 : : * URBs map to sequences of QTDs: one logical transaction
1427 : : */
1428 : :
1429 [ - + ][ # # ]: 2233869 : if (!urb->transfer_buffer && urb->transfer_buffer_length) {
1430 : : /* XXX This looks like usb storage / SCSI bug */
1431 : 0 : dev_err(hcd->self.controller,
1432 : : "buf is null, dma is %08lx len is %d\n",
1433 : 0 : (long unsigned)urb->transfer_dma,
1434 : : urb->transfer_buffer_length);
1435 : 0 : WARN_ON(1);
1436 : : }
1437 : :
1438 [ + + ]: 2233869 : if (usb_pipein(urb->pipe))
1439 : : packet_type = IN_PID;
1440 : : else
1441 : : packet_type = OUT_PID;
1442 : :
1443 [ - + ]: 2233869 : if (usb_pipecontrol(urb->pipe)) {
1444 : 0 : qtd = qtd_alloc(flags, urb, SETUP_PID);
1445 [ # # ]: 0 : if (!qtd)
1446 : : goto cleanup;
1447 : 0 : qtd_fill(qtd, urb->setup_packet, sizeof(struct usb_ctrlrequest));
1448 : 0 : list_add_tail(&qtd->qtd_list, head);
1449 : :
1450 : : /* for zero length DATA stages, STATUS is always IN */
1451 [ # # ]: 0 : if (urb->transfer_buffer_length == 0)
1452 : : packet_type = IN_PID;
1453 : : }
1454 : :
1455 : 4467738 : maxpacketsize = max_packet(usb_maxpacket(urb->dev, urb->pipe,
1456 : : usb_pipeout(urb->pipe)));
1457 : :
1458 : : /*
1459 : : * buffer gets wrapped in one or more qtds;
1460 : : * last one may be "short" (including zero len)
1461 : : * and may serve as a control status ack
1462 : : */
1463 : 2233869 : buf = urb->transfer_buffer;
1464 : 2233869 : len = urb->transfer_buffer_length;
1465 : :
1466 : : for (;;) {
1467 : : int this_qtd_len;
1468 : :
1469 : 2343022 : qtd = qtd_alloc(flags, urb, packet_type);
1470 [ + - ]: 2343022 : if (!qtd)
1471 : : goto cleanup;
1472 : 2343022 : this_qtd_len = qtd_fill(qtd, buf, len);
1473 : 2343022 : list_add_tail(&qtd->qtd_list, head);
1474 : :
1475 : 2343022 : len -= this_qtd_len;
1476 : 2343022 : buf += this_qtd_len;
1477 : :
1478 [ + + ]: 2343022 : if (len <= 0)
1479 : : break;
1480 : : }
1481 : :
1482 : : /*
1483 : : * control requests may need a terminating data "status" ack;
1484 : : * bulk ones may need a terminating short packet (zero length).
1485 : : */
1486 [ + - ]: 2233869 : if (urb->transfer_buffer_length != 0) {
1487 : : int one_more = 0;
1488 : :
1489 [ - + ]: 2233869 : if (usb_pipecontrol(urb->pipe)) {
1490 : : one_more = 1;
1491 [ # # ]: 0 : if (packet_type == IN_PID)
1492 : : packet_type = OUT_PID;
1493 : : else
1494 : : packet_type = IN_PID;
1495 [ + - ]: 2233869 : } else if (usb_pipebulk(urb->pipe)
1496 [ - + ]: 2233869 : && (urb->transfer_flags & URB_ZERO_PACKET)
1497 [ # # ]: 0 : && !(urb->transfer_buffer_length %
1498 : : maxpacketsize)) {
1499 : : one_more = 1;
1500 : : }
1501 [ - + ]: 2233869 : if (one_more) {
1502 : 0 : qtd = qtd_alloc(flags, urb, packet_type);
1503 [ # # ]: 0 : if (!qtd)
1504 : : goto cleanup;
1505 : :
1506 : : /* never any data in such packets */
1507 : : qtd_fill(qtd, NULL, 0);
1508 : 0 : list_add_tail(&qtd->qtd_list, head);
1509 : : }
1510 : : }
1511 : :
1512 : 2233869 : return;
1513 : :
1514 : : cleanup:
1515 : 0 : qtd_list_free(head);
1516 : : }
1517 : :
1518 : 0 : static int isp1760_urb_enqueue(struct usb_hcd *hcd, struct urb *urb,
1519 : : gfp_t mem_flags)
1520 : : {
1521 : : struct isp1760_hcd *priv = hcd_to_priv(hcd);
1522 : : struct list_head *ep_queue;
1523 : : struct isp1760_qh *qh, *qhit;
1524 : : unsigned long spinflags;
1525 : 2233869 : LIST_HEAD(new_qtds);
1526 : : int retval;
1527 : : int qh_in_queue;
1528 : :
1529 [ - + - - : 2233869 : switch (usb_pipetype(urb->pipe)) {
- ]
1530 : : case PIPE_CONTROL:
1531 : 0 : ep_queue = &priv->qh_list[QH_CONTROL];
1532 : 0 : break;
1533 : : case PIPE_BULK:
1534 : 2233869 : ep_queue = &priv->qh_list[QH_BULK];
1535 : 2233869 : break;
1536 : : case PIPE_INTERRUPT:
1537 [ # # ]: 0 : if (urb->interval < 0)
1538 : : return -EINVAL;
1539 : : /* FIXME: Check bandwidth */
1540 : 0 : ep_queue = &priv->qh_list[QH_INTERRUPT];
1541 : 0 : break;
1542 : : case PIPE_ISOCHRONOUS:
1543 : 0 : dev_err(hcd->self.controller, "%s: isochronous USB packets "
1544 : : "not yet supported\n",
1545 : : __func__);
1546 : 0 : return -EPIPE;
1547 : : default:
1548 : 0 : dev_err(hcd->self.controller, "%s: unknown pipe type\n",
1549 : : __func__);
1550 : 0 : return -EPIPE;
1551 : : }
1552 : :
1553 [ + + ]: 2233869 : if (usb_pipein(urb->pipe))
1554 : 784953 : urb->actual_length = 0;
1555 : :
1556 : 2233869 : packetize_urb(hcd, urb, &new_qtds, mem_flags);
1557 [ + - ]: 2233869 : if (list_empty(&new_qtds))
1558 : : return -ENOMEM;
1559 : :
1560 : : retval = 0;
1561 : 2233869 : spin_lock_irqsave(&priv->lock, spinflags);
1562 : :
1563 [ - + ]: 2233869 : if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags)) {
1564 : : retval = -ESHUTDOWN;
1565 : 0 : qtd_list_free(&new_qtds);
1566 : 0 : goto out;
1567 : : }
1568 : 2233869 : retval = usb_hcd_link_urb_to_ep(hcd, urb);
1569 [ - + ]: 2233869 : if (retval) {
1570 : 0 : qtd_list_free(&new_qtds);
1571 : 0 : goto out;
1572 : : }
1573 : :
1574 : 2233869 : qh = urb->ep->hcpriv;
1575 [ + - ]: 2233869 : if (qh) {
1576 : : qh_in_queue = 0;
1577 [ + + ]: 2233869 : list_for_each_entry(qhit, ep_queue, qh_list) {
1578 [ - + ]: 971356 : if (qhit == qh) {
1579 : : qh_in_queue = 1;
1580 : : break;
1581 : : }
1582 : : }
1583 [ + + ]: 2233869 : if (!qh_in_queue)
1584 : 1262513 : list_add_tail(&qh->qh_list, ep_queue);
1585 : : } else {
1586 : 0 : qh = qh_alloc(GFP_ATOMIC);
1587 [ # # ]: 0 : if (!qh) {
1588 : : retval = -ENOMEM;
1589 : 0 : usb_hcd_unlink_urb_from_ep(hcd, urb);
1590 : 0 : qtd_list_free(&new_qtds);
1591 : 0 : goto out;
1592 : : }
1593 : 0 : list_add_tail(&qh->qh_list, ep_queue);
1594 : 0 : urb->ep->hcpriv = qh;
1595 : : }
1596 : :
1597 : 2233869 : list_splice_tail(&new_qtds, &qh->qtd_list);
1598 : 2233869 : schedule_ptds(hcd);
1599 : :
1600 : : out:
1601 : : spin_unlock_irqrestore(&priv->lock, spinflags);
1602 : 2233869 : return retval;
1603 : : }
1604 : :
1605 : 0 : static void kill_transfer(struct usb_hcd *hcd, struct urb *urb,
1606 : : struct isp1760_qh *qh)
1607 : : {
1608 : : struct isp1760_hcd *priv = hcd_to_priv(hcd);
1609 : : int skip_map;
1610 : :
1611 [ # # ]: 0 : WARN_ON(qh->slot == -1);
1612 : :
1613 : : /* We need to forcefully reclaim the slot since some transfers never
1614 : : return, e.g. interrupt transfers and NAKed bulk transfers. */
1615 [ # # ]: 0 : if (usb_pipecontrol(urb->pipe) || usb_pipebulk(urb->pipe)) {
1616 : 0 : skip_map = reg_read32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG);
1617 : 0 : skip_map |= (1 << qh->slot);
1618 : 0 : reg_write32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG, skip_map);
1619 : 0 : priv->atl_slots[qh->slot].qh = NULL;
1620 : 0 : priv->atl_slots[qh->slot].qtd = NULL;
1621 : : } else {
1622 : 0 : skip_map = reg_read32(hcd->regs, HC_INT_PTD_SKIPMAP_REG);
1623 : 0 : skip_map |= (1 << qh->slot);
1624 : 0 : reg_write32(hcd->regs, HC_INT_PTD_SKIPMAP_REG, skip_map);
1625 : 0 : priv->int_slots[qh->slot].qh = NULL;
1626 : 0 : priv->int_slots[qh->slot].qtd = NULL;
1627 : : }
1628 : :
1629 : 0 : qh->slot = -1;
1630 : 0 : }
1631 : :
1632 : : /*
1633 : : * Retire the qtds beginning at 'qtd' and belonging all to the same urb, killing
1634 : : * any active transfer belonging to the urb in the process.
1635 : : */
1636 : 0 : static void dequeue_urb_from_qtd(struct usb_hcd *hcd, struct isp1760_qh *qh,
1637 : : struct isp1760_qtd *qtd)
1638 : : {
1639 : : struct urb *urb;
1640 : : int urb_was_running;
1641 : :
1642 : 0 : urb = qtd->urb;
1643 : : urb_was_running = 0;
1644 [ # # ]: 0 : list_for_each_entry_from(qtd, &qh->qtd_list, qtd_list) {
1645 [ # # ]: 0 : if (qtd->urb != urb)
1646 : : break;
1647 : :
1648 [ # # ]: 0 : if (qtd->status >= QTD_XFER_STARTED)
1649 : : urb_was_running = 1;
1650 [ # # ][ # # ]: 0 : if (last_qtd_of_urb(qtd, qh) &&
1651 : : (qtd->status >= QTD_XFER_COMPLETE))
1652 : : urb_was_running = 0;
1653 : :
1654 [ # # ]: 0 : if (qtd->status == QTD_XFER_STARTED)
1655 : 0 : kill_transfer(hcd, urb, qh);
1656 : 0 : qtd->status = QTD_RETIRE;
1657 : : }
1658 : :
1659 [ # # ][ # # ]: 0 : if ((urb->dev->speed != USB_SPEED_HIGH) && urb_was_running) {
1660 : 0 : qh->tt_buffer_dirty = 1;
1661 [ # # ]: 0 : if (usb_hub_clear_tt_buffer(urb))
1662 : : /* Clear failed; let's hope things work anyway */
1663 : 0 : qh->tt_buffer_dirty = 0;
1664 : : }
1665 : 0 : }
1666 : :
1667 : 0 : static int isp1760_urb_dequeue(struct usb_hcd *hcd, struct urb *urb,
1668 : : int status)
1669 : : {
1670 : : struct isp1760_hcd *priv = hcd_to_priv(hcd);
1671 : : unsigned long spinflags;
1672 : : struct isp1760_qh *qh;
1673 : : struct isp1760_qtd *qtd;
1674 : : int retval = 0;
1675 : :
1676 : 0 : spin_lock_irqsave(&priv->lock, spinflags);
1677 : 0 : retval = usb_hcd_check_unlink_urb(hcd, urb, status);
1678 [ # # ]: 0 : if (retval)
1679 : : goto out;
1680 : :
1681 : 0 : qh = urb->ep->hcpriv;
1682 [ # # ]: 0 : if (!qh) {
1683 : : retval = -EINVAL;
1684 : : goto out;
1685 : : }
1686 : :
1687 [ # # ]: 0 : list_for_each_entry(qtd, &qh->qtd_list, qtd_list)
1688 [ # # ]: 0 : if (qtd->urb == urb) {
1689 : 0 : dequeue_urb_from_qtd(hcd, qh, qtd);
1690 : : list_move(&qtd->qtd_list, &qh->qtd_list);
1691 : : break;
1692 : : }
1693 : :
1694 : 0 : urb->status = status;
1695 : 0 : schedule_ptds(hcd);
1696 : :
1697 : : out:
1698 : : spin_unlock_irqrestore(&priv->lock, spinflags);
1699 : 0 : return retval;
1700 : : }
1701 : :
1702 : 0 : static void isp1760_endpoint_disable(struct usb_hcd *hcd,
1703 : : struct usb_host_endpoint *ep)
1704 : : {
1705 : : struct isp1760_hcd *priv = hcd_to_priv(hcd);
1706 : : unsigned long spinflags;
1707 : : struct isp1760_qh *qh, *qh_iter;
1708 : : int i;
1709 : :
1710 : 0 : spin_lock_irqsave(&priv->lock, spinflags);
1711 : :
1712 : 0 : qh = ep->hcpriv;
1713 [ # # ]: 0 : if (!qh)
1714 : : goto out;
1715 : :
1716 [ # # ]: 0 : WARN_ON(!list_empty(&qh->qtd_list));
1717 : :
1718 [ # # ]: 0 : for (i = 0; i < QH_END; i++)
1719 [ # # ]: 0 : list_for_each_entry(qh_iter, &priv->qh_list[i], qh_list)
1720 [ # # ]: 0 : if (qh_iter == qh) {
1721 : : list_del(&qh_iter->qh_list);
1722 : : i = QH_END;
1723 : 0 : break;
1724 : : }
1725 : 0 : qh_free(qh);
1726 : 0 : ep->hcpriv = NULL;
1727 : :
1728 : 0 : schedule_ptds(hcd);
1729 : :
1730 : : out:
1731 : : spin_unlock_irqrestore(&priv->lock, spinflags);
1732 : 0 : }
1733 : :
1734 : 0 : static int isp1760_hub_status_data(struct usb_hcd *hcd, char *buf)
1735 : : {
1736 : : struct isp1760_hcd *priv = hcd_to_priv(hcd);
1737 : : u32 temp, status = 0;
1738 : : u32 mask;
1739 : : int retval = 1;
1740 : : unsigned long flags;
1741 : :
1742 : : /* if !PM_RUNTIME, root hub timers won't get shut down ... */
1743 [ # # ]: 0 : if (!HC_IS_RUNNING(hcd->state))
1744 : : return 0;
1745 : :
1746 : : /* init status to no-changes */
1747 : 0 : buf[0] = 0;
1748 : : mask = PORT_CSC;
1749 : :
1750 : 0 : spin_lock_irqsave(&priv->lock, flags);
1751 : 0 : temp = reg_read32(hcd->regs, HC_PORTSC1);
1752 : :
1753 [ # # ]: 0 : if (temp & PORT_OWNER) {
1754 [ # # ]: 0 : if (temp & PORT_CSC) {
1755 : 0 : temp &= ~PORT_CSC;
1756 : 0 : reg_write32(hcd->regs, HC_PORTSC1, temp);
1757 : : goto done;
1758 : : }
1759 : : }
1760 : :
1761 : : /*
1762 : : * Return status information even for ports with OWNER set.
1763 : : * Otherwise khubd wouldn't see the disconnect event when a
1764 : : * high-speed device is switched over to the companion
1765 : : * controller by the user.
1766 : : */
1767 : :
1768 [ # # ]: 0 : if ((temp & mask) != 0
1769 [ # # ]: 0 : || ((temp & PORT_RESUME) != 0
1770 [ # # ]: 0 : && time_after_eq(jiffies,
1771 : : priv->reset_done))) {
1772 : 0 : buf [0] |= 1 << (0 + 1);
1773 : : status = STS_PCD;
1774 : : }
1775 : : /* FIXME autosuspend idle root hubs */
1776 : : done:
1777 : : spin_unlock_irqrestore(&priv->lock, flags);
1778 [ # # ]: 0 : return status ? retval : 0;
1779 : : }
1780 : :
1781 : 0 : static void isp1760_hub_descriptor(struct isp1760_hcd *priv,
1782 : : struct usb_hub_descriptor *desc)
1783 : : {
1784 : 0 : int ports = HCS_N_PORTS(priv->hcs_params);
1785 : : u16 temp;
1786 : :
1787 : 0 : desc->bDescriptorType = 0x29;
1788 : : /* priv 1.0, 2.3.9 says 20ms max */
1789 : 0 : desc->bPwrOn2PwrGood = 10;
1790 : 0 : desc->bHubContrCurrent = 0;
1791 : :
1792 : 0 : desc->bNbrPorts = ports;
1793 : 0 : temp = 1 + (ports / 8);
1794 : 0 : desc->bDescLength = 7 + 2 * temp;
1795 : :
1796 : : /* ports removable, and usb 1.0 legacy PortPwrCtrlMask */
1797 [ # # ]: 0 : memset(&desc->u.hs.DeviceRemovable[0], 0, temp);
1798 [ # # ]: 0 : memset(&desc->u.hs.DeviceRemovable[temp], 0xff, temp);
1799 : :
1800 : : /* per-port overcurrent reporting */
1801 : : temp = 0x0008;
1802 [ # # ]: 0 : if (HCS_PPC(priv->hcs_params))
1803 : : /* per-port power control */
1804 : : temp |= 0x0001;
1805 : : else
1806 : : /* no power switching */
1807 : : temp |= 0x0002;
1808 : 0 : desc->wHubCharacteristics = cpu_to_le16(temp);
1809 : 0 : }
1810 : :
1811 : : #define PORT_WAKE_BITS (PORT_WKOC_E|PORT_WKDISC_E|PORT_WKCONN_E)
1812 : :
1813 : 0 : static int check_reset_complete(struct usb_hcd *hcd, int index,
1814 : : int port_status)
1815 : : {
1816 [ # # ]: 0 : if (!(port_status & PORT_CONNECT))
1817 : : return port_status;
1818 : :
1819 : : /* if reset finished and it's still not enabled -- handoff */
1820 [ # # ]: 0 : if (!(port_status & PORT_PE)) {
1821 : :
1822 : 0 : dev_info(hcd->self.controller,
1823 : : "port %d full speed --> companion\n",
1824 : : index + 1);
1825 : :
1826 : : port_status |= PORT_OWNER;
1827 : 0 : port_status &= ~PORT_RWC_BITS;
1828 : 0 : reg_write32(hcd->regs, HC_PORTSC1, port_status);
1829 : :
1830 : : } else
1831 : 0 : dev_info(hcd->self.controller, "port %d high speed\n",
1832 : : index + 1);
1833 : :
1834 : : return port_status;
1835 : : }
1836 : :
1837 : 0 : static int isp1760_hub_control(struct usb_hcd *hcd, u16 typeReq,
1838 : : u16 wValue, u16 wIndex, char *buf, u16 wLength)
1839 : : {
1840 : 0 : struct isp1760_hcd *priv = hcd_to_priv(hcd);
1841 : 0 : int ports = HCS_N_PORTS(priv->hcs_params);
1842 : : u32 temp, status;
1843 : : unsigned long flags;
1844 : : int retval = 0;
1845 : : unsigned selector;
1846 : :
1847 : : /*
1848 : : * FIXME: support SetPortFeatures USB_PORT_FEAT_INDICATOR.
1849 : : * HCS_INDICATOR may say we can change LEDs to off/amber/green.
1850 : : * (track current state ourselves) ... blink for diagnostics,
1851 : : * power, "this is the one", etc. EHCI spec supports this.
1852 : : */
1853 : :
1854 : 0 : spin_lock_irqsave(&priv->lock, flags);
1855 [ # # # # : 0 : switch (typeReq) {
# # # # ]
1856 : : case ClearHubFeature:
1857 [ # # ]: 0 : switch (wValue) {
1858 : : case C_HUB_LOCAL_POWER:
1859 : : case C_HUB_OVER_CURRENT:
1860 : : /* no hub-wide feature/status flags */
1861 : : break;
1862 : : default:
1863 : : goto error;
1864 : : }
1865 : : break;
1866 : : case ClearPortFeature:
1867 [ # # ][ # # ]: 0 : if (!wIndex || wIndex > ports)
1868 : : goto error;
1869 : : wIndex--;
1870 : 0 : temp = reg_read32(hcd->regs, HC_PORTSC1);
1871 : :
1872 : : /*
1873 : : * Even if OWNER is set, so the port is owned by the
1874 : : * companion controller, khubd needs to be able to clear
1875 : : * the port-change status bits (especially
1876 : : * USB_PORT_STAT_C_CONNECTION).
1877 : : */
1878 : :
1879 [ # # # # : 0 : switch (wValue) {
# # ]
1880 : : case USB_PORT_FEAT_ENABLE:
1881 : 0 : reg_write32(hcd->regs, HC_PORTSC1, temp & ~PORT_PE);
1882 : : break;
1883 : : case USB_PORT_FEAT_C_ENABLE:
1884 : : /* XXX error? */
1885 : : break;
1886 : : case USB_PORT_FEAT_SUSPEND:
1887 [ # # ]: 0 : if (temp & PORT_RESET)
1888 : : goto error;
1889 : :
1890 [ # # ]: 0 : if (temp & PORT_SUSPEND) {
1891 [ # # ]: 0 : if ((temp & PORT_PE) == 0)
1892 : : goto error;
1893 : : /* resume signaling for 20 msec */
1894 : 0 : temp &= ~(PORT_RWC_BITS);
1895 : 0 : reg_write32(hcd->regs, HC_PORTSC1,
1896 : : temp | PORT_RESUME);
1897 : 0 : priv->reset_done = jiffies +
1898 : 0 : msecs_to_jiffies(20);
1899 : : }
1900 : : break;
1901 : : case USB_PORT_FEAT_C_SUSPEND:
1902 : : /* we auto-clear this feature */
1903 : : break;
1904 : : case USB_PORT_FEAT_POWER:
1905 [ # # ]: 0 : if (HCS_PPC(priv->hcs_params))
1906 : 0 : reg_write32(hcd->regs, HC_PORTSC1,
1907 : : temp & ~PORT_POWER);
1908 : : break;
1909 : : case USB_PORT_FEAT_C_CONNECTION:
1910 : 0 : reg_write32(hcd->regs, HC_PORTSC1, temp | PORT_CSC);
1911 : : break;
1912 : : case USB_PORT_FEAT_C_OVER_CURRENT:
1913 : : /* XXX error ?*/
1914 : : break;
1915 : : case USB_PORT_FEAT_C_RESET:
1916 : : /* GetPortStatus clears reset */
1917 : : break;
1918 : : default:
1919 : : goto error;
1920 : : }
1921 : 0 : reg_read32(hcd->regs, HC_USBCMD);
1922 : : break;
1923 : : case GetHubDescriptor:
1924 : 0 : isp1760_hub_descriptor(priv, (struct usb_hub_descriptor *)
1925 : : buf);
1926 : 0 : break;
1927 : : case GetHubStatus:
1928 : : /* no hub-wide feature/status flags */
1929 : 0 : memset(buf, 0, 4);
1930 : 0 : break;
1931 : : case GetPortStatus:
1932 [ # # ][ # # ]: 0 : if (!wIndex || wIndex > ports)
1933 : : goto error;
1934 : 0 : wIndex--;
1935 : : status = 0;
1936 : 0 : temp = reg_read32(hcd->regs, HC_PORTSC1);
1937 : :
1938 : : /* wPortChange bits */
1939 [ # # ]: 0 : if (temp & PORT_CSC)
1940 : : status |= USB_PORT_STAT_C_CONNECTION << 16;
1941 : :
1942 : :
1943 : : /* whoever resumes must GetPortStatus to complete it!! */
1944 [ # # ]: 0 : if (temp & PORT_RESUME) {
1945 : 0 : dev_err(hcd->self.controller, "Port resume should be skipped.\n");
1946 : :
1947 : : /* Remote Wakeup received? */
1948 [ # # ]: 0 : if (!priv->reset_done) {
1949 : : /* resume signaling for 20 msec */
1950 : 0 : priv->reset_done = jiffies
1951 : 0 : + msecs_to_jiffies(20);
1952 : : /* check the port again */
1953 : 0 : mod_timer(&hcd->rh_timer, priv->reset_done);
1954 : : }
1955 : :
1956 : : /* resume completed? */
1957 [ # # ]: 0 : else if (time_after_eq(jiffies,
1958 : : priv->reset_done)) {
1959 : 0 : status |= USB_PORT_STAT_C_SUSPEND << 16;
1960 : 0 : priv->reset_done = 0;
1961 : :
1962 : : /* stop resume signaling */
1963 : 0 : temp = reg_read32(hcd->regs, HC_PORTSC1);
1964 : 0 : reg_write32(hcd->regs, HC_PORTSC1,
1965 : : temp & ~(PORT_RWC_BITS | PORT_RESUME));
1966 : : retval = handshake(hcd, HC_PORTSC1,
1967 : : PORT_RESUME, 0, 2000 /* 2msec */);
1968 [ # # ]: 0 : if (retval != 0) {
1969 : 0 : dev_err(hcd->self.controller,
1970 : : "port %d resume error %d\n",
1971 : : wIndex + 1, retval);
1972 : 0 : goto error;
1973 : : }
1974 : 0 : temp &= ~(PORT_SUSPEND|PORT_RESUME|(3<<10));
1975 : : }
1976 : : }
1977 : :
1978 : : /* whoever resets must GetPortStatus to complete it!! */
1979 [ # # ]: 0 : if ((temp & PORT_RESET)
1980 [ # # ]: 0 : && time_after_eq(jiffies,
1981 : : priv->reset_done)) {
1982 : 0 : status |= USB_PORT_STAT_C_RESET << 16;
1983 : 0 : priv->reset_done = 0;
1984 : :
1985 : : /* force reset to complete */
1986 : 0 : reg_write32(hcd->regs, HC_PORTSC1, temp & ~PORT_RESET);
1987 : : /* REVISIT: some hardware needs 550+ usec to clear
1988 : : * this bit; seems too long to spin routinely...
1989 : : */
1990 : : retval = handshake(hcd, HC_PORTSC1,
1991 : : PORT_RESET, 0, 750);
1992 [ # # ]: 0 : if (retval != 0) {
1993 : 0 : dev_err(hcd->self.controller, "port %d reset error %d\n",
1994 : : wIndex + 1, retval);
1995 : 0 : goto error;
1996 : : }
1997 : :
1998 : : /* see what we found out */
1999 : 0 : temp = check_reset_complete(hcd, wIndex,
2000 : 0 : reg_read32(hcd->regs, HC_PORTSC1));
2001 : : }
2002 : : /*
2003 : : * Even if OWNER is set, there's no harm letting khubd
2004 : : * see the wPortStatus values (they should all be 0 except
2005 : : * for PORT_POWER anyway).
2006 : : */
2007 : :
2008 [ # # ]: 0 : if (temp & PORT_OWNER)
2009 : 0 : dev_err(hcd->self.controller, "PORT_OWNER is set\n");
2010 : :
2011 [ # # ]: 0 : if (temp & PORT_CONNECT) {
2012 : : status |= USB_PORT_STAT_CONNECTION;
2013 : : /* status may be from integrated TT */
2014 : 0 : status |= USB_PORT_STAT_HIGH_SPEED;
2015 : : }
2016 [ # # ]: 0 : if (temp & PORT_PE)
2017 : 0 : status |= USB_PORT_STAT_ENABLE;
2018 [ # # ]: 0 : if (temp & (PORT_SUSPEND|PORT_RESUME))
2019 : 0 : status |= USB_PORT_STAT_SUSPEND;
2020 [ # # ]: 0 : if (temp & PORT_RESET)
2021 : 0 : status |= USB_PORT_STAT_RESET;
2022 [ # # ]: 0 : if (temp & PORT_POWER)
2023 : 0 : status |= USB_PORT_STAT_POWER;
2024 : :
2025 : : put_unaligned(cpu_to_le32(status), (__le32 *) buf);
2026 : : break;
2027 : : case SetHubFeature:
2028 [ # # ]: 0 : switch (wValue) {
2029 : : case C_HUB_LOCAL_POWER:
2030 : : case C_HUB_OVER_CURRENT:
2031 : : /* no hub-wide feature/status flags */
2032 : : break;
2033 : : default:
2034 : : goto error;
2035 : : }
2036 : : break;
2037 : : case SetPortFeature:
2038 : : selector = wIndex >> 8;
2039 : 0 : wIndex &= 0xff;
2040 [ # # ][ # # ]: 0 : if (!wIndex || wIndex > ports)
2041 : : goto error;
2042 : : wIndex--;
2043 : 0 : temp = reg_read32(hcd->regs, HC_PORTSC1);
2044 [ # # ]: 0 : if (temp & PORT_OWNER)
2045 : : break;
2046 : :
2047 : : /* temp &= ~PORT_RWC_BITS; */
2048 [ # # # # : 0 : switch (wValue) {
# ]
2049 : : case USB_PORT_FEAT_ENABLE:
2050 : 0 : reg_write32(hcd->regs, HC_PORTSC1, temp | PORT_PE);
2051 : : break;
2052 : :
2053 : : case USB_PORT_FEAT_SUSPEND:
2054 [ # # ]: 0 : if ((temp & PORT_PE) == 0
2055 : 0 : || (temp & PORT_RESET) != 0)
2056 : : goto error;
2057 : :
2058 : 0 : reg_write32(hcd->regs, HC_PORTSC1, temp | PORT_SUSPEND);
2059 : : break;
2060 : : case USB_PORT_FEAT_POWER:
2061 [ # # ]: 0 : if (HCS_PPC(priv->hcs_params))
2062 : 0 : reg_write32(hcd->regs, HC_PORTSC1,
2063 : : temp | PORT_POWER);
2064 : : break;
2065 : : case USB_PORT_FEAT_RESET:
2066 [ # # ]: 0 : if (temp & PORT_RESUME)
2067 : : goto error;
2068 : : /* line status bits may report this as low speed,
2069 : : * which can be fine if this root hub has a
2070 : : * transaction translator built in.
2071 : : */
2072 [ # # ]: 0 : if ((temp & (PORT_PE|PORT_CONNECT)) == PORT_CONNECT
2073 : 0 : && PORT_USB11(temp)) {
2074 : 0 : temp |= PORT_OWNER;
2075 : : } else {
2076 : : temp |= PORT_RESET;
2077 : 0 : temp &= ~PORT_PE;
2078 : :
2079 : : /*
2080 : : * caller must wait, then call GetPortStatus
2081 : : * usb 2.0 spec says 50 ms resets on root
2082 : : */
2083 : 0 : priv->reset_done = jiffies +
2084 : 0 : msecs_to_jiffies(50);
2085 : : }
2086 : 0 : reg_write32(hcd->regs, HC_PORTSC1, temp);
2087 : : break;
2088 : : default:
2089 : : goto error;
2090 : : }
2091 : 0 : reg_read32(hcd->regs, HC_USBCMD);
2092 : : break;
2093 : :
2094 : : default:
2095 : : error:
2096 : : /* "stall" on error */
2097 : : retval = -EPIPE;
2098 : : }
2099 : : spin_unlock_irqrestore(&priv->lock, flags);
2100 : 0 : return retval;
2101 : : }
2102 : :
2103 : 0 : static int isp1760_get_frame(struct usb_hcd *hcd)
2104 : : {
2105 : : struct isp1760_hcd *priv = hcd_to_priv(hcd);
2106 : : u32 fr;
2107 : :
2108 : 0 : fr = reg_read32(hcd->regs, HC_FRINDEX);
2109 : 0 : return (fr >> 3) % priv->periodic_size;
2110 : : }
2111 : :
2112 : 0 : static void isp1760_stop(struct usb_hcd *hcd)
2113 : : {
2114 : : struct isp1760_hcd *priv = hcd_to_priv(hcd);
2115 : : u32 temp;
2116 : :
2117 : 0 : del_timer(&errata2_timer);
2118 : :
2119 : 0 : isp1760_hub_control(hcd, ClearPortFeature, USB_PORT_FEAT_POWER, 1,
2120 : : NULL, 0);
2121 [ # # ]: 0 : mdelay(20);
2122 : :
2123 : : spin_lock_irq(&priv->lock);
2124 : 0 : ehci_reset(hcd);
2125 : : /* Disable IRQ */
2126 : 0 : temp = reg_read32(hcd->regs, HC_HW_MODE_CTRL);
2127 : 0 : reg_write32(hcd->regs, HC_HW_MODE_CTRL, temp &= ~HW_GLOBAL_INTR_EN);
2128 : : spin_unlock_irq(&priv->lock);
2129 : :
2130 : 0 : reg_write32(hcd->regs, HC_CONFIGFLAG, 0);
2131 : 0 : }
2132 : :
2133 : 0 : static void isp1760_shutdown(struct usb_hcd *hcd)
2134 : : {
2135 : : u32 command, temp;
2136 : :
2137 : 0 : isp1760_stop(hcd);
2138 : 0 : temp = reg_read32(hcd->regs, HC_HW_MODE_CTRL);
2139 : 0 : reg_write32(hcd->regs, HC_HW_MODE_CTRL, temp &= ~HW_GLOBAL_INTR_EN);
2140 : :
2141 : 0 : command = reg_read32(hcd->regs, HC_USBCMD);
2142 : 0 : command &= ~CMD_RUN;
2143 : 0 : reg_write32(hcd->regs, HC_USBCMD, command);
2144 : 0 : }
2145 : :
2146 : 0 : static void isp1760_clear_tt_buffer_complete(struct usb_hcd *hcd,
2147 : : struct usb_host_endpoint *ep)
2148 : : {
2149 : : struct isp1760_hcd *priv = hcd_to_priv(hcd);
2150 : 0 : struct isp1760_qh *qh = ep->hcpriv;
2151 : : unsigned long spinflags;
2152 : :
2153 [ # # ]: 0 : if (!qh)
2154 : 0 : return;
2155 : :
2156 : 0 : spin_lock_irqsave(&priv->lock, spinflags);
2157 : 0 : qh->tt_buffer_dirty = 0;
2158 : 0 : schedule_ptds(hcd);
2159 : : spin_unlock_irqrestore(&priv->lock, spinflags);
2160 : : }
2161 : :
2162 : :
2163 : : static const struct hc_driver isp1760_hc_driver = {
2164 : : .description = "isp1760-hcd",
2165 : : .product_desc = "NXP ISP1760 USB Host Controller",
2166 : : .hcd_priv_size = sizeof(struct isp1760_hcd),
2167 : : .irq = isp1760_irq,
2168 : : .flags = HCD_MEMORY | HCD_USB2,
2169 : : .reset = isp1760_hc_setup,
2170 : : .start = isp1760_run,
2171 : : .stop = isp1760_stop,
2172 : : .shutdown = isp1760_shutdown,
2173 : : .urb_enqueue = isp1760_urb_enqueue,
2174 : : .urb_dequeue = isp1760_urb_dequeue,
2175 : : .endpoint_disable = isp1760_endpoint_disable,
2176 : : .get_frame_number = isp1760_get_frame,
2177 : : .hub_status_data = isp1760_hub_status_data,
2178 : : .hub_control = isp1760_hub_control,
2179 : : .clear_tt_buffer_complete = isp1760_clear_tt_buffer_complete,
2180 : : };
2181 : :
2182 : 0 : int __init init_kmem_once(void)
2183 : : {
2184 : 0 : urb_listitem_cachep = kmem_cache_create("isp1760_urb_listitem",
2185 : : sizeof(struct urb_listitem), 0, SLAB_TEMPORARY |
2186 : : SLAB_MEM_SPREAD, NULL);
2187 : :
2188 [ # # ]: 0 : if (!urb_listitem_cachep)
2189 : : return -ENOMEM;
2190 : :
2191 : 0 : qtd_cachep = kmem_cache_create("isp1760_qtd",
2192 : : sizeof(struct isp1760_qtd), 0, SLAB_TEMPORARY |
2193 : : SLAB_MEM_SPREAD, NULL);
2194 : :
2195 [ # # ]: 0 : if (!qtd_cachep)
2196 : : return -ENOMEM;
2197 : :
2198 : 0 : qh_cachep = kmem_cache_create("isp1760_qh", sizeof(struct isp1760_qh),
2199 : : 0, SLAB_TEMPORARY | SLAB_MEM_SPREAD, NULL);
2200 : :
2201 [ # # ]: 0 : if (!qh_cachep) {
2202 : 0 : kmem_cache_destroy(qtd_cachep);
2203 : 0 : return -ENOMEM;
2204 : : }
2205 : :
2206 : : return 0;
2207 : : }
2208 : :
2209 : 0 : void deinit_kmem_cache(void)
2210 : : {
2211 : 0 : kmem_cache_destroy(qtd_cachep);
2212 : 0 : kmem_cache_destroy(qh_cachep);
2213 : 0 : kmem_cache_destroy(urb_listitem_cachep);
2214 : 0 : }
2215 : :
2216 : 0 : struct usb_hcd *isp1760_register(phys_addr_t res_start, resource_size_t res_len,
2217 : : int irq, unsigned long irqflags,
2218 : : int rst_gpio,
2219 : : struct device *dev, const char *busname,
2220 : : unsigned int devflags)
2221 : : {
2222 : : struct usb_hcd *hcd;
2223 : : struct isp1760_hcd *priv;
2224 : : int ret;
2225 : :
2226 [ # # ]: 0 : if (usb_disabled())
2227 : : return ERR_PTR(-ENODEV);
2228 : :
2229 : : /* prevent usb-core allocating DMA pages */
2230 : 0 : dev->dma_mask = NULL;
2231 : :
2232 : 0 : hcd = usb_create_hcd(&isp1760_hc_driver, dev, dev_name(dev));
2233 [ # # ]: 0 : if (!hcd)
2234 : : return ERR_PTR(-ENOMEM);
2235 : :
2236 : 0 : priv = hcd_to_priv(hcd);
2237 : 0 : priv->devflags = devflags;
2238 : 0 : priv->rst_gpio = rst_gpio;
2239 : 0 : init_memory(priv);
2240 : 0 : hcd->regs = ioremap(res_start, res_len);
2241 [ # # ]: 0 : if (!hcd->regs) {
2242 : : ret = -EIO;
2243 : : goto err_put;
2244 : : }
2245 : :
2246 : 0 : hcd->irq = irq;
2247 : 0 : hcd->rsrc_start = res_start;
2248 : 0 : hcd->rsrc_len = res_len;
2249 : :
2250 : 0 : ret = usb_add_hcd(hcd, irq, irqflags);
2251 [ # # ]: 0 : if (ret)
2252 : : goto err_unmap;
2253 : :
2254 : : return hcd;
2255 : :
2256 : : err_unmap:
2257 : 0 : iounmap(hcd->regs);
2258 : :
2259 : : err_put:
2260 : 0 : usb_put_hcd(hcd);
2261 : :
2262 : 0 : return ERR_PTR(ret);
2263 : : }
2264 : :
2265 : : MODULE_DESCRIPTION("Driver for the ISP1760 USB-controller from NXP");
2266 : : MODULE_AUTHOR("Sebastian Siewior <bigeasy@linuxtronix.de>");
2267 : : MODULE_LICENSE("GPL v2");
|