1 #include <linux/init.h>
3 #include <linux/log2.h>
4 #include <linux/module.h>
5 #include <linux/moduleparam.h>
6 #include <linux/slab.h>
8 #include <linux/kernel.h> /* printk() */
9 #include <linux/fs.h> /* everything... */
10 #include <linux/errno.h> /* error codes */
11 #include <linux/types.h> /* size_t */
12 #include <linux/proc_fs.h>
13 #include <linux/fcntl.h> /* O_ACCMODE */
14 #include <linux/seq_file.h>
15 #include <linux/cdev.h>
16 //#include <linux/pci.h>
17 #include <linux/string.h>
18 #include <linux/random.h>
19 #include <linux/scatterlist.h>
20 #include <asm/unaligned.h>
21 #include <linux/usb/ch9.h>
22 #include <asm/uaccess.h>
25 #include "mtk-usb-hcd.h"
26 //#include <linux/usb/hcd.h>
27 #include "mtk-test-lib.h"
28 #include "mtk-protocol.h"
29 //#include "xhci-hub.c"
30 #include <linux/dma-mapping.h>
31 #include "xhci-mtk-scheduler.h"
32 #include <linux/mu3phy/mtk-phy.h>
33 #include "xhci-mtk-power.h"
34 #include <linux/dmapool.h>
36 #include <linux/kthread.h>
37 #include <linux/kobject.h>
38 #include <linux/miscdevice.h>
42 //extern u32 mtktest_xhci_port_state_to_neutral(u32 state);
44 struct file_operations xhci_mtk_test_fops_host
;
46 static struct miscdevice mu3h_test_uevent_device
= {
47 .minor
= MISC_DYNAMIC_MINOR
,
48 .name
= "usbif_u3h_test_uevent",
52 /********************************************************
54 * Send disable slot command, release current slot id
56 *********************************************************/
57 static int t_slot_disable_slot(int argc
, char** argv
);
58 /********************************************************
60 * Config an bulk EP to let slot go to configured state
62 *********************************************************/
63 //static int t_slot_config_ep(int argc, char** argv);
64 static int t_slot_reset_device(int argc
, char** argv
);
65 /********************************************************
67 * After reset device, set address command and getConfigure, setConfigure
69 *********************************************************/
70 /********************************************************
72 * Attach device, send enable slot command
74 *********************************************************/
75 static int t_slot_enable_slot(int argc
, char** argv
);
76 /********************************************************
78 * Send address command to current slot
80 *********************************************************/
81 static int t_slot_address(int argc
, char** argv
);
82 /********************************************************
84 * Do GetDescriptor control transfer
86 *********************************************************/
87 static int t_slot_getdescriptor(int argc
, char** argv
);
88 static int t_slot_forcegetdescriptor(int argc
, char** argv
);
89 static int t_slot_getbos(int argc
, char** argv
);
90 static int t_slot_setconf(int argc
, char** argv
);
91 static int t_slot_setu1u2(int argc
, char** argv
);
92 //static int t_slot_setsel(int argc, char** argv);
93 static int t_slot_getdevstatus(int argc
, char** argv
);
94 static int t_slt_resetport(int argc
, char** argv
);
95 //static int t_slot_stress_ctrl(int argc, char** argv);
96 /********************************************************
98 * Wait device to desicon, disable slot
100 *********************************************************/
101 static int t_slot_discon(int argc
, char** argv
);
102 static int t_slot_evaluate_context(int argc
, char** argv
);
103 static int t_slt_ped(int argc
, char** argv
);
105 static int t_loopback_loop(int argc
, char** argv
);
106 static int t_loopback_configep(int argc
, char** argv
);
107 static int t_loopback_deconfigep(int argc
, char** argv
);
109 /********************************************************
113 *********************************************************/
114 static int t_power_suspend(int argc
, char** argv
);
115 /********************************************************
119 *********************************************************/
120 static int t_power_resume(int argc
, char** argv
);
121 /********************************************************
123 * When in suspend(U3) state, wait for device to wakeup
124 * After got remote wakeup signal, back to U0 state
126 *********************************************************/
127 static int t_power_remotewakeup(int argc
, char** argv
);
128 /********************************************************
130 * Adjust U1/U2 timeout regs value
132 * 1. u?(1/2): 1=u1, 2=u2
133 * 2. value: u1(0~127, 255), u2(0~254, 255)
134 *********************************************************/
135 static int t_power_u1u2(int argc
, char** argv
);
136 static int t_power_suspendport(int argc
, char** argv
);
137 static int t_power_resumeport(int argc
, char** argv
);
138 static int t_power_fla(int argc
, char** argv
);
139 static int t_power_occ(int argc
, char** argv
);
140 static int t_power_u2_lpm(int argc
, char** argv
);
141 static int t_power_u2_swlpm(int argc
, char** argv
);
142 static int t_power_random_access_regs(int argc
, char** argv
);
143 /********************************************************
145 * Test event ring full error event
147 *********************************************************/
148 static int t_ring_er_full(int argc
, char** argv
);
149 /********************************************************
153 *********************************************************/
154 static int t_ring_stop_cmd(int argc
, char** argv
);
155 /********************************************************
157 * Abort command when executing address device command
159 *********************************************************/
160 static int t_ring_abort_cmd_add(int argc
, char** argv
);
161 static int t_ring_stop_ep(int argc
, char** argv
);
162 static int t_ring_random_ring_doorbell(int argc
, char** argv
);
163 static int t_ring_random_stop_ep(int argc
, char** argv
);
164 static int t_ring_enlarge(int argc
, char** argv
);
165 static int t_ring_shrink(int argc
, char**argv
);
166 static int t_ring_intr_moderation(int argc
, char** argv
);
167 static int t_ring_bei(int argc
, char** argv
);
168 static int t_ring_idt(int argc
, char** argv
);
169 static int t_ring_noop_transfer(int argc
, char** argv
);
171 static int t_u3auto_ctrl_loopback(int argc
, char** argv
);
172 static int t_u3auto_loopback(int argc
, char** argv
);
173 static int t_u3auto_loopback_scan(int argc
, char** argv
);
174 static int t_u3auto_loopback_sg(int argc
, char** argv
);
175 static int t_u3auto_loopback_scan_sg(int argc
, char** argv
);
176 static int t_u3auto_random_suspend(int argc
, char** argv
);
177 static int t_u3auto_random_wakeup(int argc
, char**argv
);
178 static int t_u3auto_randomstop_dev(int argc
, char** argv
);
179 static int t_u3auto_stress(int argc
, char** argv
);
180 static int t_u3auto_isoc_frame_id(int argc
, char** argv
);
181 static int t_u3auto_concurrent_remotewakeup(int argc
, char** argv
);
182 static int t_u3auto_concurrent_u1u2_enter(int argc
, char** argv
);
183 static int t_u3auto_concurrent_u1u2_exit(int argc
, char** argv
);
185 static int t_hub_configurehub(int argc
, char** argv
);
186 static int t_hub_configuresubhub(int argc
, char** argv
);
187 static int t_hub_configuredevice(int argc
, char** argv
);
188 static int t_hub_ixia_stress(int argc
, char** argv
);
189 static int t_hub_loop_stress(int argc
, char** argv
);
190 static int t_hub_loop(int argc
, char** argv
);
191 static int t_hub_reset_dev(int argc
, char** argv
);
192 static int t_hub_remotewakeup_dev(int argc
, char** argv
);
193 static int t_hub_selsuspend(int argc
, char** argv
);
194 static int t_hub_selresume(int argc
, char** argv
);
195 static int t_hub_configure_eth_device(int argc
, char** argv
);
196 static int t_hub_queue_intr(int argc
, char** argv
);
197 static int t_hub_set_u1u2(int argc
, char** argv
);
198 static int t_hub_force_pm(int argc
, char** argv
);
200 static int t_u3h_otg_dev_A_host(int argc
,char** argv
);
201 static int t_u3h_otg_dev_B_host(int argc
,char** argv
);
202 static int t_u3h_otg_dev_A_srp(int argc
,char** argv
);
203 static int t_u3h_otg_dev_A_hnp(int argc
,char** argv
);
204 static int t_u3h_otg_dev_A_hnp_back(int argc
,char** argv
);
205 static int t_u3h_otg_dev_B_hnp(int argc
,char** argv
);
206 static int t_u3h_otg_dev_B_hnp_back(int argc
, char** argv
);
207 static int t_u3h_otg_uut_A(int argc
, char** argv
);
208 static int t_u3h_otg_uut_B(int argc
,char * * argv
);
209 static int t_u3h_otg_pet_uutA(int argc
, char** argv
);
210 static int t_u3h_otg_pet_uutB(int argc
, char** argv
);
212 static int t_hcd_init(int argc
, char** argv
);
213 static int t_hcd_cleanup(int argc
, char** argv
);
215 static int t_drv_vbus(int argc
, char** argv
);
216 static int t_stop_vbus(int argc
, char** argv
);
218 static int t_start_host_test_mode(int argc
, char** argv
);
219 static int t_stop_host_test_mode(int argc
, char** argv
);
221 /********************************************************
223 * Print current port status register value
225 *********************************************************/
226 static int dbg_printportstatus(int argc
, char** argv
);
227 /********************************************************
229 * Print current slot context content
231 *********************************************************/
232 static int dbg_printslotcontext(int argc
, char** argv
);
233 /********************************************************
235 * Print HCCPARAM values
237 *********************************************************/
238 static int dbg_printhccparams(int argc
, char** argv
);
239 /********************************************************
241 * Print xhci related register value
245 *********************************************************/
246 static int dbg_read_xhci(int argc
, char** argv
);
247 /********************************************************
249 * print all xhci registers
251 *********************************************************/
252 static int dbg_dump_regs(int argc
, char** argv
);
254 static int dbg_port_set_pls(int argc
, char** argv
);
255 static int dbg_port_set_ped(int argc
, char** argv
);
256 static int dbg_port_reset(int argc
, char** argv
);
258 static int dbg_delayms(int argc
, char** argv
);
259 static int dbg_u3w(int argc
, char**argv
);
260 static int dbg_u3r(int argc
, char**argv
);
261 static int dbg_u3PHY_init(int argc
, char**argv
);
262 static int dbg_u3_calibration(int argc
, char** argv
);
263 static int dbg_phy_eyescan(int argc
, char** argv
);
264 static int dbg_u2_testmode(int argc
, char** argv
);
266 static int dbg_u3ct_lecroy(int argc
, char** argv
);
267 static int dbg_u3ct_ellisys(int argc
, char** argv
);
268 static int dbg_u2ct(int argc
, char** argv
);
270 static int dbg_memorywrite(int argc
, char** argv
);
271 static int dbg_memoryread(int argc
, char** argv
);
272 static int dbg_sch_algorithm(int argc
, char** argv
);
273 static int dbg_reg_ewe(int argc
, char** argv
);
275 static int t_class_keyboard(int argc
, char** argv
);
276 static int t_ellysis_TD7_36(int argc
, char** argv
);
278 static int t_dev_config_ep(int argc
,char * * argv
);
279 static int t_dev_polling_status(int argc
,char * * argv
);
280 static int t_dev_query_status(int argc
,char * * argv
);
281 static int t_dev_remotewakeup(int argc
,char * * argv
);
282 static int t_dev_reset(int argc
,char * * argv
);
283 static int t_dev_init(int argc
, char** argv
);
284 static int t_dev_notification(int argc
, char** argv
);
285 static int t_dev_u1u2(int argc
, char** argv
);
286 static int t_dev_lpm(int argc
, char** argv
);
289 ////////////////////////////////////////////////////////////////////////////
291 //#define CLI_MAGIC 'CLI'
292 #define CLI_MAGIC 'CLI_MU3H'
293 #define IOCTL_READ _IOR(CLI_MAGIC, 0, int)
294 #define IOCTL_WRITE _IOW(CLI_MAGIC, 1, int)
297 #define MAX_ARG_SIZE 20
299 #define DMA_BURST_SIZE_TEST
301 ////////////////////////////////////////////////////////////////////////////
303 int u2_initialize(int argc
, char** argv
);
305 ////////////////////////////////////////////////////////////////////////////
310 int (*cb_func
)(int argc
, char** argv
);
313 CMD_TBL_T _arPCmdTbl_host
[] =
315 {"hcd.init", &t_hcd_init
},
316 {"hcd.cleanup", &t_hcd_cleanup
},
317 {"hcd.drvvbus", &t_drv_vbus
},
318 {"hcd.stopvbus", &t_stop_vbus
},
319 {"hcd.starthosttestmode", &t_start_host_test_mode
},
320 {"hcd.stophosttestmode", &t_stop_host_test_mode
},
321 {"slt.discon", &t_slot_discon
},
322 {"slt.disable", &t_slot_disable_slot
},
323 {"slt.reset", &t_slot_reset_device
},
324 {"slt.resetp", &t_slt_resetport
},
325 {"slt.enable", &t_slot_enable_slot
},
326 {"slt.addslt", &t_slot_address
},
327 {"slt.getdesc", &t_slot_forcegetdescriptor
},
328 {"slt.getbos", &t_slot_getbos
},
329 {"slt.setconf", &t_slot_setconf
},
330 {"slt.setu1u2", &t_slot_setu1u2
},
331 {"slt.devstat", &t_slot_getdevstatus
},
332 {"slt.evalctx", &t_slot_evaluate_context
},
333 {"slt.ped", &t_slt_ped
},
334 {"lb.config", &t_loopback_configep
},
335 {"lb.deconfig", &t_loopback_deconfigep
},
336 {"lb.loop", &t_loopback_loop
},
337 {"pw.suspend", &t_power_suspend
},
338 {"pw.suspendp", &t_power_suspendport
},
339 {"pw.resume", &t_power_resume
},
340 {"pw.resumep", &t_power_resumeport
},
341 {"pw.wakeup", &t_power_remotewakeup
},
342 {"pw.u1u2", &t_power_u1u2
},
343 {"pw.fla", &t_power_fla
},
344 {"pw.occ", &t_power_occ
},
345 {"pw.lpm", &t_power_u2_lpm
},
346 {"pw.swlpm", &t_power_u2_swlpm
},
347 {"pw.rdnreg", &t_power_random_access_regs
},
348 {"ring.erfull", &t_ring_er_full
},
349 {"ring.stopcmd", &t_ring_stop_cmd
},
350 {"ring.abortcmd", &t_ring_abort_cmd_add
},
351 {"ring.stopep", &t_ring_stop_ep
},
352 {"ring.rrd", &t_ring_random_ring_doorbell
},
353 {"ring.rstp", &t_ring_random_stop_ep
},
354 {"ring.enlarge", &t_ring_enlarge
},
355 {"ring.shrink", &t_ring_shrink
},
356 {"ring.intrmod", &t_ring_intr_moderation
},
357 {"ring.bei", &t_ring_bei
},
358 {"ring.idt", &t_ring_idt
},
359 {"ring.noop", &t_ring_noop_transfer
},
360 {"auto.lbctrl", &t_u3auto_ctrl_loopback
},
361 {"auto.lb", &t_u3auto_loopback
},
362 {"auto.lbscan", &t_u3auto_loopback_scan
},
363 {"auto.lbsg", &t_u3auto_loopback_sg
},
364 {"auto.lbsgscan", &t_u3auto_loopback_scan_sg
},
365 {"auto.randomsuspend", &t_u3auto_random_suspend
},
366 {"auto.randomwakeup", &t_u3auto_random_wakeup
},
367 {"auto.devrandomstop", &t_u3auto_randomstop_dev
},
368 {"auto.stress", &t_u3auto_stress
},
369 {"auto.isofrm", &t_u3auto_isoc_frame_id
},
370 {"auto.conresume", &t_u3auto_concurrent_remotewakeup
},
371 {"auto.conu1u2", &t_u3auto_concurrent_u1u2_enter
},
372 {"auto.conu1u2exit", &t_u3auto_concurrent_u1u2_exit
},
373 {"hub.config", &t_hub_configurehub
},
374 {"hub.subhub", &t_hub_configuresubhub
},
375 {"hub.dev", &t_hub_configuredevice
},
376 {"hub.ixia", &t_hub_ixia_stress
},
377 {"hub.lbstress", &t_hub_loop_stress
},
378 {"hub.loop", &t_hub_loop
},
379 {"hub.reset", &t_hub_reset_dev
},
380 {"hub.wakeup", &t_hub_remotewakeup_dev
},
381 {"hub.selsuspend", &t_hub_selsuspend
},
382 {"hub.selresume", &t_hub_selresume
},
383 {"hub.deveth", &t_hub_configure_eth_device
},
384 {"hub.intr", &t_hub_queue_intr
},
385 {"hub.u1u2", &t_hub_set_u1u2
},
386 {"hub.forcepm", &t_hub_force_pm
},
387 {"otg.deva", &t_u3h_otg_dev_A_host
},
388 {"otg.devb", &t_u3h_otg_dev_B_host
},
389 {"otg.srp", &t_u3h_otg_dev_A_srp
},
390 {"otg.hnpa", &t_u3h_otg_dev_A_hnp
},
391 {"otg.hnpabackh", &t_u3h_otg_dev_A_hnp_back
},
392 {"otg.hnpb", &t_u3h_otg_dev_B_hnp
},
393 {"otg.hnpbbackd", &t_u3h_otg_dev_B_hnp_back
},
394 //{"otg.uuta", &t_u3h_otg_uut_A},
395 //{"otg.uutb", &t_u3h_otg_uut_B},
396 {"otg.uuta", &t_u3h_otg_pet_uutA
},
397 {"otg.uutb", &t_u3h_otg_pet_uutB
},
398 {"dbg.portstatus", &dbg_printportstatus
},
399 {"dbg.dbgslt", &dbg_printslotcontext
},
400 {"dbg.hccparams", &dbg_printhccparams
},
401 {"dbg.r", &dbg_read_xhci
},
402 {"dbg.dr", &dbg_dump_regs
},
403 {"dbg.setpls", &dbg_port_set_pls
},
404 {"dbg.setped", &dbg_port_set_ped
},
405 {"dbg.portreset", &dbg_port_reset
},
406 {"dbg.mdelay", &dbg_delayms
},
407 {"dbg.u3w", &dbg_u3w
},
408 {"dbg.u3r", &dbg_u3r
},
409 {"dbg.u3i", &dbg_u3PHY_init
},
410 {"dbg.u3c", &dbg_u3_calibration
},
411 {"dbg.u3eyescan", &dbg_phy_eyescan
},
412 {"dbg.mw", &dbg_memorywrite
},
413 {"dbg.mr", &dbg_memoryread
},
414 {"dbg.kb", &t_ellysis_TD7_36
},
415 {"dbg.sch", &dbg_sch_algorithm
},
416 {"dbg.ewe", &dbg_reg_ewe
},
417 {"dbg.u2t", &dbg_u2_testmode
},
418 {"dbg.u3lect", &dbg_u3ct_lecroy
},
419 {"dbg.u3elct", &dbg_u3ct_ellisys
},
420 {"dbg.u2ct", &dbg_u2ct
},
421 {"dev.reset", &t_dev_reset
},
422 {"dev.pollstatus", &t_dev_polling_status
},
423 {"dev.qrystatus", &t_dev_query_status
},
424 {"dev.configep", &t_dev_config_ep
},
425 {"dev.wakeup", &t_dev_remotewakeup
},
426 {"dev.note", &t_dev_notification
},
427 {"dev.u1u2", &t_dev_u1u2
},
428 {"dev.lpm", &t_dev_lpm
},
429 {"dev.init", &t_dev_init
},
433 ////////////////////////////////////////////////////////////////////////////
435 char w_buf_host
[BUF_SIZE
];
436 char r_buf_host
[BUF_SIZE
] = "this is a test";
438 ////////////////////////////////////////////////////////////////////////////
440 int call_function_host(char *buf
)
444 char *argv
[MAX_ARG_SIZE
];
449 argv
[argc
] = strsep(&buf
, " ");
450 mtk_test_dbg( "[%d] %s\r\n", argc
, argv
[argc
]);
454 for (i
= 0; i
< sizeof(_arPCmdTbl_host
)/sizeof(CMD_TBL_T
); i
++)
456 if ((!strcmp(_arPCmdTbl_host
[i
].name
, argv
[0])) && (_arPCmdTbl_host
[i
].cb_func
!= NULL
))
457 return _arPCmdTbl_host
[i
].cb_func(argc
, argv
);
468 struct numsection
*next
;
471 struct numsection
*init_num_sec(int min
, int max
){
472 struct numsection
*tmp
;
473 tmp
= kmalloc(sizeof(struct numsection
), GFP_NOIO
);
476 tmp
->current_value
= min
;
481 void clear_num_secs(struct numsection
*num_sec
){
482 struct numsection
*next
;
483 struct numsection
*cur
;
492 void add_num_sec(int min
, int max
, struct numsection
*sec
){
493 struct numsection
*tmp
, *cur
;
495 while(cur
->next
!= NULL
){
498 tmp
= kmalloc(sizeof(struct numsection
), GFP_NOIO
);
501 tmp
->current_value
= min
;
506 struct numsection
*find_next_num(struct numsection
*sec
){
507 struct numsection
*cur
;
509 cur
->current_value
++;
510 if(cur
->current_value
> cur
->max
){
511 cur
->current_value
= cur
->min
;
517 static int xhci_mtk_test_open(struct inode
*inode
, struct file
*file
)
520 mtk_test_dbg( "xhci_mtk_test open: successful\n");
524 static int xhci_mtk_test_release(struct inode
*inode
, struct file
*file
)
527 mtk_test_dbg( "xhci_mtk_test release: successful\n");
531 static ssize_t
xhci_mtk_test_read(struct file
*file
, char *buf
, size_t count
, loff_t
*ptr
)
534 mtk_test_dbg( "xhci_mtk_test read: returning zero bytes\n");
538 static ssize_t
xhci_mtk_test_write(struct file
*file
, const char *buf
, size_t count
, loff_t
* ppos
)
541 mtk_test_dbg( "xhci_mtk_test write: accepting zero bytes\n");
545 static int xhci_mtk_test_ioctl(struct inode
*inode
, struct file
*file
, unsigned int cmd
, unsigned long arg
)
552 copy_to_user((char *) arg
, r_buf_host
, len
);
553 mtk_test_dbg( "IOCTL_READ: %s\r\n", r_buf_host
);
556 copy_from_user(w_buf_host
, (char *) arg
, len
);
557 mtk_test_dbg( "IOCTL_WRITE: %s\r\n", w_buf_host
);
560 return call_function_host(w_buf_host
);
569 static int xhci_mtk_test_unlock_ioctl(struct file
*file
, unsigned int cmd
, unsigned long arg
)
576 copy_to_user((char *) arg
, r_buf_host
, len
);
577 mtk_test_dbg( "IOCTL_READ: %s\r\n", r_buf_host
);
580 copy_from_user(w_buf_host
, (char *) arg
, len
);
581 mtk_test_dbg( "IOCTL_WRITE: %s\r\n", w_buf_host
);
584 return call_function_host(w_buf_host
);
594 static void print_slot_state(int slot_state
){
595 switch (slot_state
) {
597 mtk_test_dbg( "slot state: enabled/disabled\n");
600 mtk_test_dbg( "slot state: default\n");
603 mtk_test_dbg( "slot state: addressed\n");
606 mtk_test_dbg( "slot state: configured\n");
609 mtk_test_dbg( "slot state: reserved\n");
614 static int t_hcd_init(int argc
, char** argv
){
615 return f_test_lib_init();
618 static int t_hcd_cleanup(int argc
, char** argv
){
619 return f_test_lib_cleanup();
622 void framecount_disabe(){
623 writel(0x01, 0xf1270944);
624 mtk_test_dbg("disable frame counter\n");
627 void framecount_enable(){
628 writel(0x00, 0xf1270944);
629 mtk_test_dbg("enable frame counter\n");
631 int u3auto_hcd_reset(void)
633 if(f_test_lib_init() != RET_SUCCESS
)
640 if(f_enable_port(0) != RET_SUCCESS
)
642 if(f_enable_slot(NULL
) != RET_SUCCESS
)
651 if(f_address_slot(false, NULL
) != RET_SUCCESS
)
656 static int t_slot_discon(int argc
, char** argv
){
659 ret
= f_disconnect_port(0);
660 if(ret
!= RET_SUCCESS
){
663 ret
= f_disable_slot();
664 if(ret
!= RET_SUCCESS
){
669 static int t_slot_disable_slot(int argc
, char** argv
){
671 struct xhci_hcd
*xhci
;
674 mtk_test_dbg( "[ERROR]host controller driver not initiated\n");
677 xhci
= hcd_to_xhci(my_hcd
);
679 ret
= f_disable_slot();
681 if(ret
!= RET_SUCCESS
){
687 static int t_slot_evaluate_context(int argc
, char** argv
){
689 int max_exit_latency
, maxp0
, preping_mode
, preping
;
693 max_exit_latency
= 0;
699 mtk_test_dbg( "[ERROR]host controller driver not initiated\n");
703 max_exit_latency
= (int)simple_strtol(argv
[1], &argv
[1], 10);
706 maxp0
= (int)simple_strtol(argv
[2], &argv
[2], 10);
709 preping_mode
= (int)simple_strtol(argv
[3], &argv
[3], 10);
712 preping
= (int)simple_strtol(argv
[4], &argv
[4], 10);
715 besl
= (int)simple_strtol(argv
[5], &argv
[5], 10);
718 besld
= (int)simple_strtol(argv
[6], &argv
[6], 10);
720 ret
= f_evaluate_context(max_exit_latency
, maxp0
, preping_mode
, preping
, besl
, besld
);
722 if(ret
!= RET_SUCCESS
){
728 static int t_slot_getbos(int argc
, char** argv
){
730 struct usb_device
*udev
, *rhdev
;
731 struct xhci_virt_device
*virt_dev
;
732 struct xhci_hcd
*xhci
;
734 struct usb_ctrlrequest
*dr
;
736 short *tmp_length
, total_length
;
740 mtk_test_dbg( "[ERROR] slot ID not valid\n");
744 xhci
= hcd_to_xhci(my_hcd
);
745 rhdev
= my_hcd
->self
.root_hub
;
746 udev
= rhdev
->children
[g_port_id
-1];
748 //get total length in bos
749 dr
= kmalloc(sizeof(struct usb_ctrlrequest
), GFP_NOIO
);
750 dr
->bRequestType
= USB_DIR_IN
;
751 dr
->bRequest
= USB_REQ_GET_DESCRIPTOR
;
752 dr
->wValue
= cpu_to_le16((USB_DT_BOS
<< 8) + 0);
753 dr
->wIndex
= cpu_to_le16(0);
754 dr
->wLength
= cpu_to_le16(USB_DT_BOS_SIZE
);
755 buf
= kmalloc(USB_DT_BOS_SIZE
, GFP_KERNEL
);
756 memset(buf
, 0, USB_DT_BOS_SIZE
);
758 urb
= alloc_ctrl_urb(dr
, buf
, udev
);
759 ret
= f_ctrlrequest(urb
,udev
);
761 tmp_length
= urb
->transfer_buffer
+2;
762 total_length
= *tmp_length
;
763 xhci_dbg(xhci
, "total_length: %d\n", total_length
);
771 dr
= kmalloc(sizeof(struct usb_ctrlrequest
), GFP_NOIO
);
772 dr
->bRequestType
= USB_DIR_IN
;
773 dr
->bRequest
= USB_REQ_GET_DESCRIPTOR
;
774 dr
->wValue
= cpu_to_le16((USB_DT_BOS
<< 8) + 0);
775 dr
->wIndex
= cpu_to_le16(0);
776 dr
->wLength
= cpu_to_le16(total_length
);
777 buf
= kmalloc(total_length
, GFP_KERNEL
);
778 memset(buf
, 0 , total_length
);
779 urb
= alloc_ctrl_urb(dr
, buf
, udev
);
780 ret
= f_ctrlrequest(urb
,udev
);
788 static int t_slot_forcegetdescriptor(int argc
, char** argv
){
790 struct usb_device
*udev
, *rhdev
;
791 struct xhci_virt_device
*virt_dev
;
792 struct xhci_hcd
*xhci
;
794 struct usb_ctrlrequest
*dr
;
795 struct usb_config_descriptor
*desc
;
801 mtk_test_dbg( "[ERROR] slot ID not valid\n");
805 xhci
= hcd_to_xhci(my_hcd
);
806 rhdev
= my_hcd
->self
.root_hub
;
807 udev
= rhdev
->children
[g_port_id
-1];
809 dr
= kmalloc(sizeof(struct usb_ctrlrequest
), GFP_NOIO
);
810 dr
->bRequestType
= USB_DIR_IN
;
811 dr
->bRequest
= USB_REQ_GET_DESCRIPTOR
;
812 dr
->wValue
= cpu_to_le16((USB_DT_DEVICE
<< 8) + 0);
813 dr
->wIndex
= cpu_to_le16(0);
814 dr
->wLength
= cpu_to_le16(USB_DT_DEVICE_SIZE
);
815 desc
= kmalloc(USB_DT_DEVICE_SIZE
, GFP_KERNEL
);
816 memset(desc
, 0, USB_DT_DEVICE_SIZE
);
818 urb
= alloc_ctrl_urb(dr
, desc
, udev
);
819 ret
= f_ctrlrequest(urb
, udev
);
820 if(urb
->status
== -EINPROGRESS
){
821 //timeout, stop endpoint, set TR dequeue pointer
822 f_ring_stop_ep(g_slot_id
, 0);
823 f_ring_set_tr_dequeue_pointer(g_slot_id
, 0, urb
);
833 static int t_slot_getdescriptor(int argc
, char** argv
){
835 struct usb_device
*udev
, *rhdev
;
836 struct xhci_virt_device
*virt_dev
;
837 struct xhci_hcd
*xhci
;
839 struct usb_ctrlrequest
*dr
;
840 struct usb_config_descriptor
*desc
;
846 mtk_test_dbg( "[ERROR] slot ID not valid\n");
850 xhci
= hcd_to_xhci(my_hcd
);
851 rhdev
= my_hcd
->self
.root_hub
;
852 udev
= rhdev
->children
[g_port_id
-1];
854 dr
= kmalloc(sizeof(struct usb_ctrlrequest
), GFP_NOIO
);
855 dr
->bRequestType
= USB_DIR_IN
;
856 dr
->bRequest
= USB_REQ_GET_DESCRIPTOR
;
857 dr
->wValue
= cpu_to_le16((USB_DT_DEVICE
<< 8) + 0);
858 dr
->wIndex
= cpu_to_le16(0);
859 dr
->wLength
= cpu_to_le16(USB_DT_DEVICE_SIZE
);
860 desc
= kmalloc(USB_DT_DEVICE_SIZE
, GFP_KERNEL
);
861 memset(desc
, 0, USB_DT_DEVICE_SIZE
);
863 urb
= alloc_ctrl_urb(dr
, desc
, udev
);
864 ret
= f_ctrlrequest(urb
, udev
);
874 static int t_slot_setconf(int argc
, char** argv
){
876 struct usb_device
*udev
, *rhdev
;
877 struct xhci_virt_device
*virt_dev
;
878 struct xhci_hcd
*xhci
;
880 struct usb_ctrlrequest
*dr
;
886 isConfigMouse
= false;
889 mtk_test_dbg( "[ERROR] slot ID not valid\n");
894 if(!strcmp(argv
[1], "mouse")){
895 isConfigMouse
= true;
899 xhci
= hcd_to_xhci(my_hcd
);
900 rhdev
= my_hcd
->self
.root_hub
;
901 udev
= rhdev
->children
[g_port_id
-1];
904 //config mouse for Ellysis T7.36 test case
905 dr
= kmalloc(sizeof(struct usb_ctrlrequest
), GFP_NOIO
);
906 dr
->bRequestType
= 0x21;
908 dr
->wValue
= cpu_to_le16(0);
909 dr
->wIndex
= cpu_to_le16(0);
910 dr
->wLength
= cpu_to_le16(0);
911 urb
= alloc_ctrl_urb(dr
, NULL
, udev
);
912 ret
= f_ctrlrequest(urb
,udev
);
918 dr
= kmalloc(sizeof(struct usb_ctrlrequest
), GFP_NOIO
);
919 dr
->bRequestType
= USB_DIR_OUT
;
920 dr
->bRequest
= USB_REQ_SET_CONFIGURATION
;
921 dr
->wValue
= cpu_to_le16(1);
922 dr
->wIndex
= cpu_to_le16(0);
923 dr
->wLength
= cpu_to_le16(0);
924 urb
= alloc_ctrl_urb(dr
, NULL
, udev
);
925 ret
= f_ctrlrequest(urb
,udev
);
933 static int t_slot_setu1u2(int argc
, char** argv
){
935 struct usb_device
*udev
, *rhdev
;
936 struct xhci_virt_device
*virt_dev
;
937 struct xhci_hcd
*xhci
;
939 struct usb_ctrlrequest
*dr
;
940 struct usb_config_descriptor
*desc
;
946 mtk_test_dbg( "[ERROR] slot ID not valid\n");
950 xhci
= hcd_to_xhci(my_hcd
);
951 rhdev
= my_hcd
->self
.root_hub
;
952 udev
= rhdev
->children
[g_port_id
-1];
954 //set feature - u1 enable
955 dr
= kmalloc(sizeof(struct usb_ctrlrequest
), GFP_NOIO
);
956 dr
->bRequestType
= USB_DIR_OUT
;
957 dr
->bRequest
= USB_REQ_SET_FEATURE
;
958 dr
->wValue
= cpu_to_le16(USB_U1_ENABLE
);
959 dr
->wIndex
= cpu_to_le16(0);
960 dr
->wLength
= cpu_to_le16(0);
961 urb
= alloc_ctrl_urb(dr
, NULL
, udev
);
962 ret
= f_ctrlrequest(urb
,udev
);
968 //set feature - u2 enable
969 dr
= kmalloc(sizeof(struct usb_ctrlrequest
), GFP_NOIO
);
970 dr
->bRequestType
= USB_DIR_OUT
;
971 dr
->bRequest
= USB_REQ_SET_FEATURE
;
972 dr
->wValue
= cpu_to_le16(USB_U2_ENABLE
);
973 dr
->wIndex
= cpu_to_le16(0);
974 dr
->wLength
= cpu_to_le16(0);
975 urb
= alloc_ctrl_urb(dr
, NULL
, udev
);
976 ret
= f_ctrlrequest(urb
,udev
);
984 static int t_slot_getdevstatus(int argc
, char** argv
){
986 struct usb_device
*udev
, *rhdev
;
987 struct xhci_virt_device
*virt_dev
;
988 struct xhci_hcd
*xhci
;
990 struct usb_ctrlrequest
*dr
;
991 struct usb_config_descriptor
*desc
;
997 mtk_test_dbg( "[ERROR] slot ID not valid\n");
1001 xhci
= hcd_to_xhci(my_hcd
);
1002 rhdev
= my_hcd
->self
.root_hub
;
1003 udev
= rhdev
->children
[g_port_id
-1];
1006 dr
= kmalloc(sizeof(struct usb_ctrlrequest
), GFP_NOIO
);
1007 dr
->bRequestType
= USB_DIR_IN
;
1008 dr
->bRequest
= USB_REQ_GET_STATUS
;
1009 dr
->wValue
= cpu_to_le16(0);
1010 dr
->wIndex
= cpu_to_le16(0);
1011 dr
->wLength
= cpu_to_le16(USB_DT_STATUS_SIZE
);
1012 desc
= kmalloc(USB_DT_STATUS_SIZE
, GFP_KERNEL
);
1013 urb
= alloc_ctrl_urb(dr
, desc
, udev
);
1014 ret
= f_ctrlrequest(urb
,udev
);
1022 static int t_slt_resetport(int argc
, char** argv
){
1027 struct xhci_hcd
*xhci
;
1029 port_id
= g_port_id
;
1030 isWarmReset
= false;
1033 if(!strcmp(argv
[1], "true")){
1034 mtk_test_dbg( "Do Warm Reset\n");
1039 port_id
= (int)simple_strtol(argv
[2], &argv
[2], 10);
1042 xhci
= hcd_to_xhci(my_hcd
);
1046 addr
= &xhci
->op_regs
->port_status_base
+ NUM_PORT_REGS
*(port_id
-1 & 0xff);
1047 temp
= xhci_readl(xhci
, addr
);
1048 xhci_dbg(xhci
, "before reset port %d = 0x%x\n", port_id
-1, temp
);
1049 temp
= mtktest_xhci_port_state_to_neutral(temp
);
1050 temp
= (temp
| PORT_WR
);
1051 xhci_writel(xhci
, temp
, addr
);
1052 temp
= xhci_readl(xhci
, addr
);
1053 xhci_dbg(xhci
, "after reset port %d = 0x%x\n", port_id
-1, temp
);
1058 addr
= &xhci
->op_regs
->port_status_base
+ NUM_PORT_REGS
*(port_id
-1 & 0xff);
1059 temp
= xhci_readl(xhci
, addr
);
1060 xhci_dbg(xhci
, "before reset port %d = 0x%x\n", port_id
-1, temp
);
1061 temp
= mtktest_xhci_port_state_to_neutral(temp
);
1062 temp
= (temp
| PORT_RESET
);
1063 xhci_writel(xhci
, temp
, addr
);
1067 static int t_slt_ped(int argc
, char** argv
){
1068 struct xhci_hcd
*xhci
;
1073 xhci
= hcd_to_xhci(my_hcd
);
1074 addr
= &xhci
->op_regs
->port_status_base
+ NUM_PORT_REGS
*(g_port_id
-1 & 0xff);
1075 temp
= xhci_readl(xhci
, addr
);
1077 xhci_writel(xhci
, temp
, addr
);
1078 ret
= f_disconnect_port(0);
1079 if(ret
!= RET_SUCCESS
){
1082 ret
= f_disable_slot();
1083 if(ret
!= RET_SUCCESS
){
1089 /* simply address a slot */
1090 static int t_slot_address(int argc
, char** argv
){
1096 if(!strcmp(argv
[1], "true")){
1097 mtk_test_dbg( "test BSR=true\n");
1102 return f_address_slot(isBSR
, NULL
);
1105 static int t_slot_enable_slot(int argc
, char** argv
){
1107 isEnablePort
= true;
1109 if(!strcmp(argv
[1], "false")){
1110 mtk_test_dbg( "test BSR=true\n");
1111 isEnablePort
= false;
1115 if(f_enable_port(0) != RET_SUCCESS
){
1119 return f_enable_slot(NULL
);
1122 static int t_slot_reset_device(int argc
, char** argv
){
1124 isWarmReset
= false;
1127 if(!strcmp(argv
[1], "true")){
1128 mtk_test_dbg( "test WarmReset=true\n");
1132 return f_slot_reset_device(0, isWarmReset
);
1136 static int t_u3auto_ctrl_loopback(int argc
, char** argv
){
1137 int ret
,loop
,length
,num
=0;
1138 char isFullSpeed
, isReset
;
1140 isFullSpeed
= false;
1146 num
= (int)simple_strtol(argv
[1], &argv
[1], 10);
1149 length
= (int)simple_strtol(argv
[2], &argv
[2], 10);
1152 if(!strcmp(argv
[3], "ss")){
1153 mtk_test_dbg( "test super speed\n");
1154 isFullSpeed
= false;
1156 if(!strcmp(argv
[3], "hs")){
1157 mtk_test_dbg( "test high speed\n");
1158 isFullSpeed
= false;
1160 if(!strcmp(argv
[3], "fs")){
1161 mtk_test_dbg( "Test full speed\n");
1166 if(!strcmp(argv
[4], "true")){
1167 mtk_test_dbg( "Reset device\n");
1172 if(u3auto_hcd_reset() != RET_SUCCESS
)
1175 if(isFullSpeed
&& isReset
){
1176 start_port_reenabled(0, DEV_SPEED_FULL
);
1178 ret
=dev_reset(DEV_SPEED_FULL
,NULL
);
1180 mtk_test_dbg( "Set device to full speed failed!!\n");
1184 ret
= f_disable_slot();
1186 mtk_test_dbg( "disable slot failed!!\n");
1190 ret
= f_reenable_port(0);
1192 mtk_test_dbg( "reenable port failed!!\n");
1196 ret
= f_enable_slot(NULL
);
1198 mtk_test_dbg( "enable slot failed!!\n");
1202 ret
=f_address_slot(false, NULL
);
1204 mtk_test_dbg( "address device failed!!\n");
1209 //num = 0, loop forever
1210 //num = 1, follow the length that user input
1211 //num != 1, loopback incremental length data
1212 int max_length
= 2048;
1214 for(length
=1; length
<= max_length
;){
1215 mtk_test_dbg( "Do CTRL loopback, length %d\n", length
);
1216 ret
=dev_ctrl_loopback(length
,NULL
);
1221 mtk_test_dbg( "ctrl loop fail!!\n");
1222 mtk_test_dbg( "length : %d\n",length
);
1225 length
= length
+ 1;
1229 for(loop
=0;loop
<num
;loop
++){
1231 length
=((((loop
+1)*102400)+loop
*40)%2048);
1237 mtk_test_dbg( "Do CTRL loopback, length %d\n", length
);
1238 ret
=dev_ctrl_loopback(length
,NULL
);
1242 mtk_test_dbg( "ctrl loop fail!!\n");
1243 mtk_test_dbg( "length : %d\n",length
);
1250 mtk_test_dbg( "[FAIL] Ctrl loop back test failed\n");
1253 mtk_test_dbg( "[PASS] ctrl loop back [%d] round\n",num
);
1258 #define SG_SS_BULK_INTERVAL_SIZE 1
1259 #define SG_SS_BULK_MAXP_SIZE 1
1260 #define SG_SS_BULK_OUT_EP_SIZE 1
1261 #define SG_SS_BULK_IN_EP_SIZE 1
1262 #define SG_SS_BULK_SG_LEN_SIZE 4
1263 #define SG_SS_BULK_BURST_SIZE 1
1264 #define SG_SS_BULK_MULT_SIZE 1
1266 #define SG_SS_INTR_INTERVAL_SIZE 1
1267 #define SG_SS_INTR_MAXP_SIZE 1
1268 #define SG_SS_INTR_OUT_EP_SIZE 1
1269 #define SG_SS_INTR_IN_EP_SIZE 1
1270 #define SG_SS_INTR_SG_LEN_SIZE 3
1271 #define SG_SS_INTR_BURST_SIZE 1
1272 #define SG_SS_INTR_MULT_SIZE 1
1274 #define SG_HS_BULK_INTERVAL_SIZE 1
1275 #define SG_HS_BULK_MAXP_SIZE 1
1276 #define SG_HS_BULK_OUT_EP_SIZE 1
1277 #define SG_HS_BULK_IN_EP_SIZE 1
1278 #define SG_HS_BULK_SG_LEN_SIZE 4
1280 #define SG_HS_INTR_INTERVAL_SIZE 1
1281 #define SG_HS_INTR_MAXP_SIZE 1
1282 #define SG_HS_INTR_OUT_EP_SIZE 1
1283 #define SG_HS_INTR_IN_EP_SIZE 1
1284 #define SG_HS_INTR_SG_LEN_SIZE 3
1286 #define SG_FS_BULK_INTERVAL_SIZE 1
1287 #define SG_FS_BULK_MAXP_SIZE 1
1288 #define SG_FS_BULK_OUT_EP_SIZE 1
1289 #define SG_FS_BULK_IN_EP_SIZE 1
1290 #define SG_FS_BULK_SG_LEN_SIZE 4
1292 #define SG_FS_INTR_INTERVAL_SIZE 1
1293 #define SG_FS_INTR_MAXP_SIZE 1
1294 #define SG_FS_INTR_OUT_EP_SIZE 1
1295 #define SG_FS_INTR_IN_EP_SIZE 1
1296 #define SG_FS_INTR_SG_LEN_SIZE 3
1298 #define DF_BURST_SIZE 1 //default for hs, fs
1299 #define DF_MULT_SIZE 1 //default for hs, fs
1301 static int t_u3auto_loopback_scan_sg(int argc
, char** argv
){
1302 int ret
,length
,start_add
;
1304 int gpd_buf_size
,bd_buf_size
;
1309 int ep_out_num
, ep_in_num
;
1311 int start_add_index
, ep_out_index
, ep_in_index
, maxp_index
, interval_index
, sg_len_index
, mult_index
, burst_index
;
1312 int interval_arr_size
, maxp_arr_size
, out_ep_arr_size
, in_ep_arr_size
, sg_len_arr_size
, mult_arr_size
, burst_arr_size
;
1313 int min_length
, max_length
, min_start_add
, max_start_add
;
1314 int *arr_interval
, *arr_maxp
, *arr_ep_out
, *arr_ep_in
, *arr_sg_len
, *arr_mult
, *arr_burst
;
1315 int mult_dev
, burst
, mult
;
1316 int dram_offset
, extension
;
1317 struct numsection
*sec
, *cur_sec
;
1319 int sg_ss_bulk_interval
[SG_SS_BULK_INTERVAL_SIZE
] = {0};
1320 int sg_ss_bulk_maxp
[SG_SS_BULK_MAXP_SIZE
] = {1024};
1321 int sg_ss_bulk_out_ep
[SG_SS_BULK_OUT_EP_SIZE
] = {1};
1322 int sg_ss_bulk_in_ep
[SG_SS_BULK_IN_EP_SIZE
] = {1};
1323 int sg_ss_bulk_sg_len
[SG_SS_BULK_SG_LEN_SIZE
] = {512, 1024, 2048, 4096};
1324 int sg_ss_bulk_burst
[SG_SS_BULK_BURST_SIZE
] = {15};
1325 int sg_ss_bulk_mult
[SG_SS_BULK_MULT_SIZE
] = {0};
1327 int sg_ss_intr_interval
[SG_SS_INTR_INTERVAL_SIZE
] = {1};
1328 int sg_ss_intr_maxp
[SG_SS_INTR_MAXP_SIZE
] = {1024};
1329 int sg_ss_intr_out_ep
[SG_SS_INTR_OUT_EP_SIZE
] = {1};
1330 int sg_ss_intr_in_ep
[SG_SS_INTR_IN_EP_SIZE
] = {1};
1331 int sg_ss_intr_sg_len
[SG_SS_INTR_SG_LEN_SIZE
] = {64,512,1024};
1332 int sg_ss_intr_burst
[SG_SS_INTR_BURST_SIZE
] = {0/*,1,2*/};
1333 int sg_ss_intr_mult
[SG_SS_INTR_MULT_SIZE
] = {0};
1335 int sg_hs_bulk_interval
[SG_HS_BULK_INTERVAL_SIZE
] = {0};
1336 int sg_hs_bulk_maxp
[SG_HS_BULK_MAXP_SIZE
] = {512};
1337 int sg_hs_bulk_out_ep
[SG_HS_BULK_OUT_EP_SIZE
] = {1};
1338 int sg_hs_bulk_in_ep
[SG_HS_BULK_IN_EP_SIZE
] = {1};
1339 int sg_hs_bulk_sg_len
[SG_HS_BULK_SG_LEN_SIZE
] = {512, 1024, 2048, 4096};
1341 int sg_hs_intr_interval
[SG_HS_INTR_INTERVAL_SIZE
] = {1};
1342 int sg_hs_intr_maxp
[SG_HS_INTR_MAXP_SIZE
] = {1024}; //32, 512, 1024
1343 int sg_hs_intr_out_ep
[SG_HS_INTR_OUT_EP_SIZE
] = {2};
1344 int sg_hs_intr_in_ep
[SG_HS_INTR_IN_EP_SIZE
] = {2};
1345 int sg_hs_intr_sg_len
[SG_HS_INTR_SG_LEN_SIZE
] = {64, 512, 1024};
1347 int sg_fs_bulk_interval
[SG_FS_BULK_INTERVAL_SIZE
] = {0};
1348 int sg_fs_bulk_maxp
[SG_FS_BULK_MAXP_SIZE
] = {64};
1349 int sg_fs_bulk_out_ep
[SG_FS_BULK_OUT_EP_SIZE
] = {1};
1350 int sg_fs_bulk_in_ep
[SG_FS_BULK_IN_EP_SIZE
] = {1};
1351 int sg_fs_bulk_sg_len
[SG_FS_BULK_SG_LEN_SIZE
] = {64, 512, 1024, 2048};
1353 int sg_fs_intr_interval
[SG_FS_INTR_INTERVAL_SIZE
] = {1};// 1, 127,255
1354 int sg_fs_intr_maxp
[SG_FS_INTR_MAXP_SIZE
] = {32}; //8, 32, 64
1355 int sg_fs_intr_out_ep
[SG_FS_INTR_OUT_EP_SIZE
] = {2};
1356 int sg_fs_intr_in_ep
[SG_FS_INTR_IN_EP_SIZE
] = {2};
1357 int sg_fs_intr_sg_len
[SG_FS_INTR_SG_LEN_SIZE
] = {64,512,1024};
1359 int df_burst
[DF_BURST_SIZE
] = {0};
1360 int df_mult
[DF_MULT_SIZE
] = {0};
1363 speed
= DEV_SPEED_HIGH
;;
1364 transfer_type
= EPATT_BULK
;
1377 if(!strcmp(argv
[1], "ss")){
1378 mtk_test_dbg( "Test super speed\n");
1379 speed
= DEV_SPEED_SUPER
; //TODO: superspeed
1381 else if(!strcmp(argv
[1], "hs")){
1382 mtk_test_dbg( "Test high speed\n");
1383 speed
= DEV_SPEED_HIGH
;
1385 else if(!strcmp(argv
[1], "fs")){
1386 mtk_test_dbg( "Test full speed\n");
1387 speed
= DEV_SPEED_FULL
;
1391 if(!strcmp(argv
[2], "bulk")){
1392 mtk_test_dbg( "Test bulk transfer\n");
1393 transfer_type
= EPATT_BULK
;
1395 else if(!strcmp(argv
[2], "intr")){
1396 mtk_test_dbg( "Test intr transfer\n");
1397 transfer_type
= EPATT_INT
;
1399 else if(!strcmp(argv
[2], "isoc")){
1400 mtk_test_dbg( "Test isoc transfer\n");
1401 transfer_type
= EPATT_ISO
;
1405 if(speed
== DEV_SPEED_SUPER
&& transfer_type
== EPATT_BULK
){
1406 arr_maxp
= sg_ss_bulk_maxp
;
1407 maxp_arr_size
= SG_SS_BULK_MAXP_SIZE
;
1408 arr_interval
= sg_ss_bulk_interval
;
1409 interval_arr_size
= SG_SS_BULK_INTERVAL_SIZE
;
1411 sec
= init_num_sec(513, 1025);
1412 add_num_sec(10240-10, 10240+10,sec
);
1413 add_num_sec(65535-10,65535,sec
);
1417 arr_ep_out
= sg_ss_bulk_out_ep
;
1418 out_ep_arr_size
= SG_SS_BULK_OUT_EP_SIZE
;
1419 arr_ep_in
= sg_ss_bulk_in_ep
;
1420 in_ep_arr_size
= SG_SS_BULK_IN_EP_SIZE
;
1423 arr_sg_len
= sg_ss_bulk_sg_len
;
1424 sg_len_arr_size
= SG_SS_BULK_SG_LEN_SIZE
;
1426 arr_burst
= sg_ss_bulk_burst
;
1427 burst_arr_size
= SG_SS_BULK_BURST_SIZE
;
1428 arr_mult
= sg_ss_bulk_mult
;
1429 mult_arr_size
= SG_SS_BULK_MULT_SIZE
;
1432 if(speed
== DEV_SPEED_SUPER
&& transfer_type
== EPATT_INT
){
1433 arr_maxp
= sg_ss_intr_maxp
;
1434 maxp_arr_size
= SG_SS_INTR_MAXP_SIZE
;
1435 arr_interval
= sg_ss_intr_interval
;
1436 interval_arr_size
= SG_SS_INTR_INTERVAL_SIZE
;
1438 sec
= init_num_sec(513, 1025);
1439 add_num_sec(10240-10, 10240+10,sec
);
1440 add_num_sec(65535-10,65535,sec
);
1444 arr_ep_out
= sg_ss_intr_out_ep
;
1445 out_ep_arr_size
= SG_SS_INTR_OUT_EP_SIZE
;
1446 arr_ep_in
= sg_ss_intr_in_ep
;
1447 in_ep_arr_size
= SG_SS_INTR_IN_EP_SIZE
;
1450 arr_sg_len
= sg_ss_intr_sg_len
;
1451 sg_len_arr_size
= SG_SS_INTR_SG_LEN_SIZE
;
1453 arr_burst
= sg_ss_intr_burst
;
1454 burst_arr_size
= SG_SS_INTR_BURST_SIZE
;
1455 arr_mult
= sg_ss_intr_mult
;
1456 mult_arr_size
= SG_SS_INTR_MULT_SIZE
;
1459 if(speed
== DEV_SPEED_HIGH
&& transfer_type
== EPATT_BULK
){
1460 arr_maxp
= sg_hs_bulk_maxp
;
1461 maxp_arr_size
= SG_HS_BULK_MAXP_SIZE
;
1462 arr_interval
= sg_hs_bulk_interval
;
1463 interval_arr_size
= SG_HS_BULK_INTERVAL_SIZE
;
1465 sec
= init_num_sec(1,513);
1466 add_num_sec(10240-10,10240+10,sec
);
1467 add_num_sec(65535-10,65535,sec
);
1472 arr_ep_out
= sg_hs_bulk_out_ep
;
1473 out_ep_arr_size
= SG_HS_BULK_OUT_EP_SIZE
;
1475 arr_ep_in
= sg_hs_bulk_in_ep
;
1476 in_ep_arr_size
= SG_HS_BULK_IN_EP_SIZE
;
1478 arr_sg_len
= sg_hs_bulk_sg_len
;
1479 sg_len_arr_size
= SG_HS_BULK_SG_LEN_SIZE
;
1481 //burst & mult all default value
1482 arr_burst
= df_burst
;
1483 burst_arr_size
= DF_BURST_SIZE
;
1485 mult_arr_size
= DF_MULT_SIZE
;
1487 if(speed
== DEV_SPEED_HIGH
&& transfer_type
== EPATT_INT
){
1488 arr_maxp
= sg_hs_intr_maxp
;
1489 maxp_arr_size
= SG_HS_INTR_MAXP_SIZE
;
1490 arr_interval
= sg_hs_intr_interval
;
1491 interval_arr_size
= SG_HS_INTR_INTERVAL_SIZE
;
1493 sec
= init_num_sec(1, 1025);
1494 add_num_sec(10240-10, 10240+10,sec
);
1499 arr_ep_out
= sg_hs_intr_out_ep
;
1500 out_ep_arr_size
= SG_HS_INTR_OUT_EP_SIZE
;
1502 arr_ep_in
= sg_hs_intr_in_ep
;
1503 in_ep_arr_size
= SG_HS_INTR_IN_EP_SIZE
;
1505 arr_sg_len
= sg_hs_intr_sg_len
;
1506 sg_len_arr_size
= SG_HS_INTR_SG_LEN_SIZE
;
1508 //burst & mult all default value
1509 arr_burst
= df_burst
;
1510 burst_arr_size
= DF_BURST_SIZE
;
1512 mult_arr_size
= DF_MULT_SIZE
;
1514 if(speed
== DEV_SPEED_FULL
&& transfer_type
== EPATT_BULK
){
1515 arr_maxp
= sg_fs_bulk_maxp
;
1516 maxp_arr_size
= SG_FS_BULK_MAXP_SIZE
;
1517 arr_interval
= sg_fs_bulk_interval
;
1518 interval_arr_size
= SG_FS_BULK_INTERVAL_SIZE
;
1520 sec
= init_num_sec(513, 1025);
1521 add_num_sec(10240-10, 10240+10,sec
);
1522 add_num_sec(65535-10,65535,sec
);
1527 arr_ep_out
= sg_fs_bulk_out_ep
;
1528 out_ep_arr_size
= SG_FS_BULK_OUT_EP_SIZE
;
1530 arr_ep_in
= sg_fs_bulk_in_ep
;
1531 in_ep_arr_size
= SG_FS_BULK_IN_EP_SIZE
;
1533 arr_sg_len
= sg_fs_bulk_sg_len
;
1534 sg_len_arr_size
= SG_FS_BULK_SG_LEN_SIZE
;
1536 //burst & mult all default value
1537 arr_burst
= df_burst
;
1538 burst_arr_size
= DF_BURST_SIZE
;
1540 mult_arr_size
= DF_MULT_SIZE
;
1543 if(speed
== DEV_SPEED_FULL
&& transfer_type
== EPATT_INT
){
1544 arr_maxp
= sg_fs_intr_maxp
;
1545 maxp_arr_size
= SG_FS_INTR_MAXP_SIZE
;
1546 arr_interval
= sg_fs_intr_interval
;
1547 interval_arr_size
= SG_FS_INTR_INTERVAL_SIZE
;
1549 sec
= init_num_sec(1, 1025);
1550 add_num_sec(2048-10, 2048+10,sec
);
1551 add_num_sec(3072-10, 3072+10,sec
);
1556 arr_ep_out
= sg_fs_intr_out_ep
;
1557 out_ep_arr_size
= SG_FS_INTR_OUT_EP_SIZE
;
1559 arr_ep_in
= sg_fs_intr_in_ep
;
1560 in_ep_arr_size
= SG_FS_INTR_IN_EP_SIZE
;
1562 arr_sg_len
= sg_fs_intr_sg_len
;
1563 sg_len_arr_size
= SG_FS_INTR_SG_LEN_SIZE
;
1565 //burst & mult all default value
1566 arr_burst
= df_burst
;
1567 burst_arr_size
= DF_BURST_SIZE
;
1569 mult_arr_size
= DF_MULT_SIZE
;
1572 if(u3auto_hcd_reset() != RET_SUCCESS
)
1575 for(ep_in_index
= 0; ep_in_index
< in_ep_arr_size
; ep_in_index
++){
1576 ep_in_num
= *(arr_ep_in
+ ep_in_index
);
1577 for(ep_out_index
= 0; ep_out_index
< out_ep_arr_size
; ep_out_index
++){
1578 ep_out_num
= *(arr_ep_out
+ ep_out_index
);
1579 for(interval_index
= 0; interval_index
< interval_arr_size
; interval_index
++){
1580 bInterval
= *(arr_interval
+ interval_index
);
1581 for(maxp_index
= 0; maxp_index
< maxp_arr_size
; maxp_index
++){
1582 maxp
= *(arr_maxp
+ maxp_index
);
1583 for(mult_index
= 0; mult_index
< mult_arr_size
; mult_index
++){
1584 mult
= *(arr_mult
+mult_index
);
1585 for(burst_index
= 0; burst_index
< burst_arr_size
; burst_index
++){
1586 burst
= *(arr_burst
+burst_index
);
1587 mtk_test_dbg( "[TEST]*************************************\n");
1588 mtk_test_dbg( " OUT_EP: %d***************************\n", ep_out_num
);
1589 mtk_test_dbg( " IN_EP: %d ***************************\n", ep_in_num
);
1590 mtk_test_dbg( " MAXP: %d ***************************\n", maxp
);
1591 mtk_test_dbg( " INTERVAL: %d ***************************\n", bInterval
);
1592 mtk_test_dbg( " MULT: %d **************************\n", mult
);
1593 mtk_test_dbg( " BURST: %d *************************\n", burst
);
1594 /* ==phase 0 : device reset==*/
1595 start_port_reenabled(0, speed
);
1596 ret
=dev_reset(speed
,NULL
);
1598 mtk_test_dbg( "device reset failed!!!!!!!!!!\n");
1602 ret
= f_disable_slot();
1604 mtk_test_dbg( "disable slot failed!!!!!!!!!!\n");
1608 ret
= f_reenable_port(0);
1609 if(ret
!= RET_SUCCESS
){
1610 mtk_test_dbg( "device reenable failed!!!!!!!!!!\n");
1614 ret
= f_enable_slot(NULL
);
1616 mtk_test_dbg( "enable slot failed!!!!!!!!!!\n");
1620 ret
=f_address_slot(false, NULL
);
1622 mtk_test_dbg( "address slot failed!!!!!!!!!!\n");
1625 mtktest_mtk_xhci_scheduler_init();
1626 /* ==phase 1 : config EP==*/
1627 ret
=dev_config_ep(ep_out_num
,USB_RX
,transfer_type
,maxp
,bInterval
,mult_dev
,burst
,mult
,NULL
);
1630 mtk_test_dbg( "config dev EP fail!!\n");
1634 ret
=dev_config_ep(ep_in_num
,USB_TX
,transfer_type
,maxp
,bInterval
,mult_dev
,burst
,mult
,NULL
);
1637 mtk_test_dbg( "config dev EP fail!!\n");
1641 ret
= f_config_ep(ep_out_num
,EPADD_OUT
,transfer_type
,maxp
,bInterval
,burst
,mult
, NULL
,0);
1644 mtk_test_dbg( "config EP fail!!\n");
1648 ret
= f_config_ep(ep_in_num
,EPADD_IN
,transfer_type
,maxp
,bInterval
,burst
,mult
, NULL
,1);
1651 mtk_test_dbg( "config EP fail!!\n");
1655 for(start_add
= min_start_add
; start_add
<= max_start_add
; start_add
++){
1657 while(cur_sec
!= NULL
){
1658 length
= cur_sec
->current_value
;
1659 for(sg_len_index
= 0; sg_len_index
< sg_len_arr_size
; sg_len_index
++){
1660 sg_len
= *(arr_sg_len
+ sg_len_index
);
1661 if((length
/sg_len
) > 61)
1663 mtk_test_dbg( " [ROUND]**************************\n");
1664 mtk_test_dbg( " START_ADD: %d*************\n", start_add
);
1665 mtk_test_dbg( " LENGTH: %d *************\n", length
);
1666 mtk_test_dbg( " SG_LEN: %d *************\n", sg_len
);
1667 /* ==phase 2 : loopback==*/
1669 gpd_buf_size
=length
;
1672 ret
=dev_loopback(bdp
,length
,gpd_buf_size
,bd_buf_size
, dram_offset
, extension
,NULL
);
1675 mtk_test_dbg( "loopback request fail!!\n");
1680 // ret = f_loopback_sg_loop(
1681 // ep_out_num, ep_in_num, length, start_add, sg_len, NULL);
1682 ret
= f_loopback_sg_loop_gpd(
1683 ep_out_num
,ep_in_num
,length
,start_add
,sg_len
, gpd_buf_size
,NULL
);
1686 mtk_test_dbg( "loopback fail!!\n");
1687 mtk_test_dbg( "length : %d\n",length
);
1691 /* ==phase 3: get device status==*/
1692 ret
=dev_polling_status(NULL
);
1696 mtk_test_dbg( "query request fail!!\n");
1700 cur_sec
= find_next_num(cur_sec
);
1712 #define SS_BULK_INTERVAL_SIZE 1
1713 #define SS_BULK_MAXP_SIZE 1
1714 #define SS_BULK_OUT_EP_SIZE 1
1715 #define SS_BULK_IN_EP_SIZE 1
1716 #define SS_BULK_BURST_SIZE 2
1717 #define SS_BULK_MULT_SIZE 1
1719 #define SS_INTR_INTERVAL_SIZE 2
1720 #define SS_INTR_MAXP_SIZE 2
1721 #define SS_INTR_OUT_EP_SIZE 1
1722 #define SS_INTR_IN_EP_SIZE 1
1723 #define SS_INTR_BURST_SIZE 1
1724 #define SS_INTR_MULT_SIZE 1
1726 #define SS_HB_INTR_INTERVAL_SIZE 1
1727 #define SS_HB_INTR_MAXP_SIZE 1
1728 #define SS_HB_INTR_OUT_EP_SIZE 1
1729 #define SS_HB_INTR_IN_EP_SIZE 1
1730 #define SS_HB_INTR_BURST_SIZE 2
1731 #define SS_HB_INTR_MULT_SIZE 1
1733 #define SS_ISOC_INTERVAL_SIZE 2
1734 #define SS_ISOC_MAXP_SIZE 2
1735 #define SS_ISOC_OUT_EP_SIZE 1
1736 #define SS_ISOC_IN_EP_SIZE 1
1737 #define SS_ISOC_BURST_SIZE 1
1738 #define SS_ISOC_MULT_SIZE 1
1740 #define SS_HB_ISOC_INTERVAL_SIZE 2
1741 #define SS_HB_ISOC_MAXP_SIZE 1
1742 #define SS_HB_ISOC_OUT_EP_SIZE 1
1743 #define SS_HB_ISOC_IN_EP_SIZE 1
1744 #define SS_HB_ISOC_BURST_SIZE 2
1745 #define SS_HB_ISOC_MULT_SIZE 2
1747 #define HS_BULK_INTERVAL_SIZE 1
1748 #define HS_BULK_MAXP_SIZE 1
1749 #define HS_BULK_OUT_EP_SIZE 1
1750 #define HS_BULK_IN_EP_SIZE 1
1752 #define HS_INTR_INTERVAL_SIZE 2
1753 #define HS_INTR_MAXP_SIZE 4
1754 #define HS_INTR_OUT_EP_SIZE 1
1755 #define HS_INTR_IN_EP_SIZE 1
1757 #define HS_HB_INTR_INTERVAL_SIZE 2
1758 #define HS_HB_INTR_MAXP_SIZE 1
1759 #define HS_HB_INTR_OUT_EP_SIZE 1
1760 #define HS_HB_INTR_IN_EP_SIZE 1
1761 #define HS_HB_INTR_MULT_SIZE 2
1763 #define HS_ISOC_INTERVAL_SIZE 2
1764 #define HS_ISOC_MAXP_SIZE 2
1765 #define HS_ISOC_OUT_EP_SIZE 1
1766 #define HS_ISOC_IN_EP_SIZE 1
1768 #define HS_HB_ISOC_INTERVAL_SIZE 2
1769 #define HS_HB_ISOC_MAXP_SIZE 1
1770 #define HS_HB_ISOC_OUT_EP_SIZE 1
1771 #define HS_HB_ISOC_IN_EP_SIZE 1
1772 #define HS_HB_ISOC_MULT_SIZE 2
1774 #define FS_BULK_INTERVAL_SIZE 1
1775 #define FS_BULK_MAXP_SIZE 3
1776 #define FS_BULK_OUT_EP_SIZE 1
1777 #define FS_BULK_IN_EP_SIZE 1
1779 #define FS_INTR_INTERVAL_SIZE 2
1780 #define FS_INTR_MAXP_SIZE 4
1781 #define FS_INTR_OUT_EP_SIZE 1
1782 #define FS_INTR_IN_EP_SIZE 1
1784 #define FS_ISOC_INTERVAL_SIZE 2
1785 #define FS_ISOC_MAXP_SIZE 2
1786 #define FS_ISOC_OUT_EP_SIZE 1
1787 #define FS_ISOC_IN_EP_SIZE 1
1789 #define DF_BURST_SIZE 1 //default for hs, fs
1790 #define DF_MULT_SIZE 1 //default for hs, fs
1793 static int t_u3auto_loopback_scan(int argc
, char** argv
){
1794 int ret
,length
,start_add
;
1796 int gpd_buf_size
,bd_buf_size
;
1800 int ep_out_num
, ep_in_num
;
1802 int start_add_index
, ep_out_index
, ep_in_index
, maxp_index
, interval_index
, burst_index
, mult_index
;
1803 int interval_arr_size
, maxp_arr_size
, out_ep_arr_size
, in_ep_arr_size
, burst_arr_size
, mult_arr_size
;
1804 int min_length
, max_length
, min_start_add
, max_start_add
;
1805 int *arr_interval
, *arr_maxp
, *arr_ep_out
, *arr_ep_in
, *arr_burst
, *arr_mult
;
1806 int mult_dev
, mult
, burst
;
1807 int dram_offset
, extension
;
1808 struct numsection
*sec
, *cur_sec
;
1810 #ifdef DMA_BURST_SIZE_TEST
1811 int dma_burst_sz
= 0;
1815 int ss_bulk_interval
[SS_BULK_INTERVAL_SIZE
] = {0};
1816 int ss_bulk_maxp
[SS_BULK_MAXP_SIZE
] = {1024};
1817 int ss_bulk_out_ep
[SS_BULK_OUT_EP_SIZE
] = {1/*,2*/};
1818 int ss_bulk_in_ep
[SS_BULK_IN_EP_SIZE
] = {1/*,2*/};
1819 int ss_bulk_burst
[SS_BULK_BURST_SIZE
] = {0,15,/*0*/};
1820 int ss_bulk_mult
[SS_BULK_MULT_SIZE
] = {0};
1822 int ss_intr_interval
[SS_INTR_INTERVAL_SIZE
] = {1, 2/*, 16*/};
1823 int ss_intr_maxp
[SS_INTR_MAXP_SIZE
] = {8, /*32, 128, 512, */1024};
1824 int ss_intr_out_ep
[SS_INTR_OUT_EP_SIZE
] = {1};
1825 int ss_intr_in_ep
[SS_INTR_IN_EP_SIZE
] = {1};
1826 int ss_intr_burst
[SS_INTR_BURST_SIZE
] = {0};
1827 int ss_intr_mult
[SS_INTR_MULT_SIZE
] = {0};
1829 int ss_hb_intr_interval
[SS_HB_INTR_INTERVAL_SIZE
] = {1};
1830 int ss_hb_intr_maxp
[SS_HB_INTR_MAXP_SIZE
] = {1024};
1831 int ss_hb_intr_out_ep
[SS_HB_INTR_OUT_EP_SIZE
] = {1};
1832 int ss_hb_intr_in_ep
[SS_HB_INTR_IN_EP_SIZE
] = {1};
1833 int ss_hb_intr_burst
[SS_HB_INTR_BURST_SIZE
] = {1,2};
1834 int ss_hb_intr_mult
[SS_HB_INTR_MULT_SIZE
] = {0};
1836 int ss_isoc_interval
[SS_ISOC_INTERVAL_SIZE
] = {1, 2/*, 16*/};
1837 int ss_isoc_maxp
[SS_ISOC_MAXP_SIZE
] = {/*64, 512, */64,1024};
1838 int ss_isoc_out_ep
[SS_ISOC_OUT_EP_SIZE
] = {1};
1839 int ss_isoc_in_ep
[SS_ISOC_IN_EP_SIZE
] = {1};
1840 int ss_isoc_burst
[SS_ISOC_BURST_SIZE
] = {0};
1841 int ss_isoc_mult
[SS_ISOC_MULT_SIZE
] = {0};
1843 int ss_hb_isoc_interval
[SS_HB_ISOC_INTERVAL_SIZE
] = {1, 2};
1844 int ss_hb_isoc_maxp
[SS_HB_ISOC_MAXP_SIZE
] = {1024};
1845 int ss_hb_isoc_out_ep
[SS_HB_ISOC_OUT_EP_SIZE
] = {1};
1846 int ss_hb_isoc_in_ep
[SS_HB_ISOC_IN_EP_SIZE
] = {1};
1847 int ss_hb_isoc_burst
[SS_HB_ISOC_BURST_SIZE
] = {/*0,*/1,2};
1848 int ss_hb_isoc_mult
[SS_HB_ISOC_MULT_SIZE
] = {0,1/*,2*/};
1850 int hs_bulk_interval
[HS_BULK_INTERVAL_SIZE
] = {0};
1851 int hs_bulk_maxp
[HS_BULK_MAXP_SIZE
] = {512};
1852 int hs_bulk_out_ep
[HS_BULK_OUT_EP_SIZE
] = {1};
1853 int hs_bulk_in_ep
[HS_BULK_IN_EP_SIZE
] = {1};
1855 int hs_intr_interval
[HS_INTR_INTERVAL_SIZE
] = {1/*,7*/,2}; //0,8,15
1856 int hs_intr_maxp
[HS_INTR_MAXP_SIZE
] = {6, 8, 30/*,32,128,512*/,1024}; //8,16,128,512, 1024, 2048, 3072
1857 int hs_intr_out_ep
[HS_INTR_OUT_EP_SIZE
] = {1};
1858 int hs_intr_in_ep
[HS_INTR_IN_EP_SIZE
] = {1};
1860 int hs_hb_intr_interval
[HS_HB_INTR_INTERVAL_SIZE
] = {1/*,7*/,2}; //0,8,15
1861 int hs_hb_intr_maxp
[HS_HB_INTR_MAXP_SIZE
] = {1024}; //8,16,128,512, 1024, 2048, 3072
1862 int hs_hb_intr_out_ep
[HS_HB_INTR_OUT_EP_SIZE
] = {1};
1863 int hs_hb_intr_in_ep
[HS_HB_INTR_IN_EP_SIZE
] = {1};
1864 int hs_hb_intr_mult
[HS_HB_INTR_MULT_SIZE
] = {1,2};
1866 int hs_isoc_interval
[HS_ISOC_INTERVAL_SIZE
] = {1,2};
1867 int hs_isoc_maxp
[HS_ISOC_MAXP_SIZE
] = {/*8,32,*/128,/*512,*/1024};
1868 int hs_isoc_out_ep
[HS_ISOC_OUT_EP_SIZE
] = {1};
1869 int hs_isoc_in_ep
[HS_ISOC_IN_EP_SIZE
] = {1};
1871 int hs_hb_isoc_interval
[HS_HB_ISOC_INTERVAL_SIZE
] = {1,2};
1872 int hs_hb_isoc_maxp
[HS_HB_ISOC_MAXP_SIZE
] = {1024};
1873 int hs_hb_isoc_out_ep
[HS_HB_ISOC_OUT_EP_SIZE
] = {1};
1874 int hs_hb_isoc_in_ep
[HS_HB_ISOC_IN_EP_SIZE
] = {1};
1875 int hs_hb_isoc_mult
[HS_HB_ISOC_MULT_SIZE
] = {1,2};
1877 int fs_bulk_interval
[FS_BULK_INTERVAL_SIZE
] = {0};
1878 int fs_bulk_maxp
[FS_BULK_MAXP_SIZE
] = {8/*,16*/,32,64}; // 8,16,32,64
1879 int fs_bulk_out_ep
[FS_BULK_OUT_EP_SIZE
] = {1};
1880 int fs_bulk_in_ep
[FS_BULK_IN_EP_SIZE
] = {1};
1882 int fs_intr_interval
[FS_INTR_INTERVAL_SIZE
] = {1, 2}; //1, 127 ,255
1883 int fs_intr_maxp
[FS_INTR_MAXP_SIZE
] = {6, 8, 30,/*32,*/64}; // 8,32,64
1884 int fs_intr_out_ep
[FS_INTR_OUT_EP_SIZE
] = {1};
1885 int fs_intr_in_ep
[FS_INTR_IN_EP_SIZE
] = {1};
1887 int fs_isoc_interval
[FS_ISOC_INTERVAL_SIZE
] = {1, 2};
1888 int fs_isoc_maxp
[FS_ISOC_MAXP_SIZE
] = {/*8,32,*/128,1023};
1889 int fs_isoc_out_ep
[FS_ISOC_OUT_EP_SIZE
] = {1};
1890 int fs_isoc_in_ep
[FS_ISOC_IN_EP_SIZE
] = {1};
1892 int df_burst
[DF_BURST_SIZE
] = {0};
1893 int df_mult
[DF_MULT_SIZE
] = {0};
1896 speed
= DEV_SPEED_HIGH
;;
1897 transfer_type
= EPATT_BULK
;
1911 if(!strcmp(argv
[1], "ss")){
1912 mtk_test_dbg( "Test super speed\n");
1913 speed
= DEV_SPEED_SUPER
;
1915 else if(!strcmp(argv
[1], "hs")){
1916 mtk_test_dbg( "Test high speed\n");
1917 speed
= DEV_SPEED_HIGH
;
1919 else if(!strcmp(argv
[1], "fs")){
1920 mtk_test_dbg( "Test full speed\n");
1921 speed
= DEV_SPEED_FULL
;
1925 if(!strcmp(argv
[2], "bulk")){
1926 mtk_test_dbg( "Test bulk transfer\n");
1927 transfer_type
= EPATT_BULK
;
1929 else if(!strcmp(argv
[2], "intr")){
1930 mtk_test_dbg( "Test intr transfer\n");
1931 transfer_type
= EPATT_INT
;
1933 else if(!strcmp(argv
[2], "isoc")){
1934 mtk_test_dbg( "Test isoc transfer\n");
1935 transfer_type
= EPATT_ISO
;
1939 if(!strcmp(argv
[3], "true")){
1940 mtk_test_dbg( "Test high bandwidth\n");
1944 mtk_test_dbg( "Doesn't test high bandwidth\n");
1948 if(speed
== DEV_SPEED_SUPER
&& transfer_type
== EPATT_BULK
){
1949 arr_maxp
= ss_bulk_maxp
;
1950 maxp_arr_size
= SS_BULK_MAXP_SIZE
;
1951 arr_interval
= ss_bulk_interval
;
1952 interval_arr_size
= SS_BULK_INTERVAL_SIZE
;
1953 //1~1025, 10240+-512, 65535-1024~65535
1955 sec
= init_num_sec(1,1025);
1956 add_num_sec(10240-10,10240+10,sec
);
1957 add_num_sec(65535-10,65535,sec
);
1959 // sec = init_num_sec(1025,1027);
1963 arr_ep_out
= ss_bulk_out_ep
;
1964 out_ep_arr_size
= SS_BULK_OUT_EP_SIZE
;
1965 arr_ep_in
= ss_bulk_in_ep
;
1966 in_ep_arr_size
= SS_BULK_IN_EP_SIZE
;
1967 arr_burst
= ss_bulk_burst
;
1968 burst_arr_size
= SS_BULK_BURST_SIZE
;
1969 arr_mult
= ss_bulk_mult
;
1970 mult_arr_size
= SS_BULK_MULT_SIZE
;
1972 if(speed
== DEV_SPEED_SUPER
&& transfer_type
== EPATT_INT
&& (!isHB
)){
1973 arr_maxp
= ss_intr_maxp
;
1974 maxp_arr_size
= SS_INTR_MAXP_SIZE
;
1975 arr_interval
= ss_intr_interval
;
1976 interval_arr_size
= SS_INTR_INTERVAL_SIZE
;
1977 //length 1~1025,10241-1024~10241
1979 sec
= init_num_sec(1,1025);
1980 add_num_sec(2048-10,2048+10, sec
);
1981 add_num_sec(3072-10,3072+10, sec
);
1982 add_num_sec(10240-10,10240+10,sec
);
1984 sec
= init_num_sec(1023,1027);
1989 arr_ep_out
= ss_intr_out_ep
;
1990 out_ep_arr_size
= SS_INTR_OUT_EP_SIZE
;
1991 arr_ep_in
= ss_intr_in_ep
;
1992 in_ep_arr_size
= SS_INTR_IN_EP_SIZE
;
1993 arr_burst
= ss_intr_burst
;
1994 burst_arr_size
= SS_INTR_BURST_SIZE
;
1995 arr_mult
= ss_intr_mult
;
1996 mult_arr_size
= SS_INTR_MULT_SIZE
;
1998 if(speed
== DEV_SPEED_SUPER
&& transfer_type
== EPATT_INT
&& isHB
){
1999 arr_maxp
= ss_hb_intr_maxp
;
2000 maxp_arr_size
= SS_HB_INTR_MAXP_SIZE
;
2001 arr_interval
= ss_hb_intr_interval
;
2002 interval_arr_size
= SS_HB_INTR_INTERVAL_SIZE
;
2003 //length 1~1025,10241-1024~10241
2005 sec
= init_num_sec(1,1025);
2006 add_num_sec(2048-10,2048+10, sec
);
2007 add_num_sec(3072-10,3072+10, sec
);
2008 add_num_sec(10241-3,10241,sec
);
2010 sec
= init_num_sec(1023,1027);
2015 arr_ep_out
= ss_hb_intr_out_ep
;
2016 out_ep_arr_size
= SS_HB_INTR_OUT_EP_SIZE
;
2017 arr_ep_in
= ss_hb_intr_in_ep
;
2018 in_ep_arr_size
= SS_HB_INTR_IN_EP_SIZE
;
2019 arr_burst
= ss_hb_intr_burst
;
2020 burst_arr_size
= SS_HB_INTR_BURST_SIZE
;
2021 arr_mult
= ss_hb_intr_mult
;
2022 mult_arr_size
= SS_HB_INTR_MULT_SIZE
;
2024 if(speed
== DEV_SPEED_SUPER
&& transfer_type
== EPATT_ISO
&& (!isHB
)){
2025 arr_maxp
= ss_isoc_maxp
;
2026 maxp_arr_size
= SS_ISOC_MAXP_SIZE
;
2027 arr_interval
= ss_isoc_interval
;
2028 interval_arr_size
= SS_ISOC_INTERVAL_SIZE
;
2029 //length 1~1025, 10241-1024~10241, 65535-1024~65535
2030 //sec = init_num_sec(9217, 9225);
2032 sec
= init_num_sec(1,3);
2033 add_num_sec(1024-3,1024+3,sec
);
2034 //sec = init_num_sec(1023,1025);
2035 add_num_sec(10241-3,10241,sec
);
2036 //add_num_sec(65535-3,65535,sec);
2038 sec
= init_num_sec(1024*48-1,1024*48+1);
2043 arr_ep_out
= ss_isoc_out_ep
;
2044 out_ep_arr_size
= SS_ISOC_OUT_EP_SIZE
;
2045 arr_ep_in
= ss_isoc_in_ep
;
2046 in_ep_arr_size
= SS_ISOC_IN_EP_SIZE
;
2047 arr_burst
= ss_isoc_burst
;
2048 burst_arr_size
= SS_ISOC_BURST_SIZE
;
2049 arr_mult
= ss_isoc_mult
;
2050 mult_arr_size
= SS_ISOC_MULT_SIZE
;
2052 if(speed
== DEV_SPEED_SUPER
&& transfer_type
== EPATT_ISO
&& isHB
){
2053 arr_maxp
= ss_hb_isoc_maxp
;
2054 maxp_arr_size
= SS_HB_ISOC_MAXP_SIZE
;
2055 arr_interval
= ss_hb_isoc_interval
;
2056 interval_arr_size
= SS_HB_ISOC_INTERVAL_SIZE
;
2057 //length 1~1025, 10241-1024~10241, 65535-1024~65535
2058 //sec = init_num_sec(9217, 9225);
2060 sec
= init_num_sec(1,3);
2061 add_num_sec(1024-3,1024+3,sec
);
2062 //sec = init_num_sec(1023,1025);
2063 add_num_sec(10241-3,10240+3,sec
);
2064 add_num_sec(65535-3,65535,sec
);
2066 sec
= init_num_sec(1024*48-1,1024*48+1);
2071 arr_ep_out
= ss_hb_isoc_out_ep
;
2072 out_ep_arr_size
= SS_HB_ISOC_OUT_EP_SIZE
;
2073 arr_ep_in
= ss_hb_isoc_in_ep
;
2074 in_ep_arr_size
= SS_HB_ISOC_IN_EP_SIZE
;
2075 arr_burst
= ss_hb_isoc_burst
;
2076 burst_arr_size
= SS_HB_ISOC_BURST_SIZE
;
2077 arr_mult
= ss_hb_isoc_mult
;
2078 mult_arr_size
= SS_HB_ISOC_MULT_SIZE
;
2080 if(speed
== DEV_SPEED_HIGH
&& transfer_type
== EPATT_BULK
){
2081 arr_maxp
= hs_bulk_maxp
;
2082 maxp_arr_size
= HS_BULK_MAXP_SIZE
;
2083 arr_interval
= hs_bulk_interval
;
2084 interval_arr_size
= HS_BULK_INTERVAL_SIZE
;
2086 sec
= init_num_sec(1,513);
2087 add_num_sec(10240-10, 10240+10,sec
);
2088 add_num_sec(65535-10, 65535,sec
);
2093 arr_ep_out
= hs_bulk_out_ep
;
2094 out_ep_arr_size
= HS_BULK_OUT_EP_SIZE
;
2096 arr_ep_in
= hs_bulk_in_ep
;
2097 in_ep_arr_size
= HS_BULK_IN_EP_SIZE
;
2098 //burst & mult all default value
2099 arr_burst
= df_burst
;
2100 burst_arr_size
= DF_BURST_SIZE
;
2102 mult_arr_size
= DF_MULT_SIZE
;
2104 if(speed
== DEV_SPEED_HIGH
&& transfer_type
== EPATT_INT
&& (!isHB
)){
2105 arr_maxp
= hs_intr_maxp
;
2106 maxp_arr_size
= HS_INTR_MAXP_SIZE
;
2107 arr_interval
= hs_intr_interval
;
2108 interval_arr_size
= HS_INTR_INTERVAL_SIZE
;
2110 sec
= init_num_sec(1,1025);
2111 add_num_sec(2048-3,2048+3,sec
);
2112 add_num_sec(3072-3,3072+3,sec
);
2113 add_num_sec(10240-3,10240+3,sec
);
2115 // max_length = 5120;
2120 arr_ep_out
= hs_intr_out_ep
;
2121 out_ep_arr_size
= HS_INTR_OUT_EP_SIZE
;
2123 arr_ep_in
= hs_intr_in_ep
;
2124 in_ep_arr_size
= HS_INTR_IN_EP_SIZE
;
2125 //burst & mult all default value
2126 arr_burst
= df_burst
;
2127 burst_arr_size
= DF_BURST_SIZE
;
2129 mult_arr_size
= DF_MULT_SIZE
;
2131 if(speed
== DEV_SPEED_HIGH
&& transfer_type
== EPATT_INT
&& (isHB
)){
2132 arr_maxp
= hs_hb_intr_maxp
;
2133 maxp_arr_size
= HS_HB_INTR_MAXP_SIZE
;
2134 arr_interval
= hs_hb_intr_interval
;
2135 interval_arr_size
= HS_HB_INTR_INTERVAL_SIZE
;
2137 sec
= init_num_sec(1,1025);
2138 add_num_sec(2048-3,2048+3,sec
);
2139 add_num_sec(3072-3,3072+3,sec
);
2140 add_num_sec(10240-3,10240+3,sec
);
2142 // max_length = 5120;
2147 arr_ep_out
= hs_hb_intr_out_ep
;
2148 out_ep_arr_size
= HS_HB_INTR_OUT_EP_SIZE
;
2150 arr_ep_in
= hs_hb_intr_in_ep
;
2151 in_ep_arr_size
= HS_HB_INTR_IN_EP_SIZE
;
2152 //burst & mult all default value
2153 arr_burst
= df_burst
;
2154 burst_arr_size
= DF_BURST_SIZE
;
2155 arr_mult
= hs_hb_intr_mult
;
2156 mult_arr_size
= HS_HB_INTR_MULT_SIZE
;
2158 if(speed
== DEV_SPEED_HIGH
&& transfer_type
== EPATT_ISO
&& (!isHB
)){
2159 arr_maxp
= hs_isoc_maxp
;
2160 maxp_arr_size
= HS_ISOC_MAXP_SIZE
;
2161 arr_interval
= hs_isoc_interval
;
2162 interval_arr_size
= HS_ISOC_INTERVAL_SIZE
;
2164 sec
= init_num_sec(1,3);
2165 add_num_sec(1024-3,1024+3,sec
);
2166 add_num_sec(2048-3,2048+3,sec
);
2167 add_num_sec(3072-3,3072+3,sec
);
2168 add_num_sec(10240-3,10240+3,sec
);
2173 arr_ep_out
= hs_isoc_out_ep
;
2174 out_ep_arr_size
= HS_ISOC_OUT_EP_SIZE
;
2175 arr_ep_in
= hs_isoc_in_ep
;
2176 in_ep_arr_size
= HS_ISOC_IN_EP_SIZE
;
2177 //burst & mult all default value
2178 arr_burst
= df_burst
;
2179 burst_arr_size
= DF_BURST_SIZE
;
2181 mult_arr_size
= DF_MULT_SIZE
;
2183 if(speed
== DEV_SPEED_HIGH
&& transfer_type
== EPATT_ISO
&& (isHB
)){
2184 arr_maxp
= hs_hb_isoc_maxp
;
2185 maxp_arr_size
= HS_HB_ISOC_MAXP_SIZE
;
2186 arr_interval
= hs_hb_isoc_interval
;
2187 interval_arr_size
= HS_HB_ISOC_INTERVAL_SIZE
;
2189 sec
= init_num_sec(1,3);
2190 add_num_sec(1024-3,1024+3,sec
);
2191 add_num_sec(2048-3,2048+3,sec
);
2192 add_num_sec(3072-3,3072+3,sec
);
2193 add_num_sec(10240-3,10240+3,sec
);
2198 arr_ep_out
= hs_hb_isoc_out_ep
;
2199 out_ep_arr_size
= HS_HB_ISOC_OUT_EP_SIZE
;
2200 arr_ep_in
= hs_hb_isoc_in_ep
;
2201 in_ep_arr_size
= HS_HB_ISOC_IN_EP_SIZE
;
2202 //burst & mult all default value
2203 arr_burst
= df_burst
;
2204 burst_arr_size
= DF_BURST_SIZE
;
2205 arr_mult
= hs_hb_isoc_mult
;
2206 mult_arr_size
= HS_HB_ISOC_MULT_SIZE
;
2208 if(speed
== DEV_SPEED_FULL
&& transfer_type
== EPATT_BULK
){
2209 arr_maxp
= fs_bulk_maxp
;
2210 maxp_arr_size
= FS_BULK_MAXP_SIZE
;
2211 arr_interval
= hs_bulk_interval
;
2212 interval_arr_size
= FS_BULK_INTERVAL_SIZE
;
2214 sec
= init_num_sec(1,65);
2215 add_num_sec(10240-10,10240+10,sec
);
2216 add_num_sec(65535-10,65535,sec
);
2221 arr_ep_out
= fs_bulk_out_ep
;
2222 out_ep_arr_size
= FS_BULK_OUT_EP_SIZE
;
2223 arr_ep_in
= fs_bulk_in_ep
;
2224 in_ep_arr_size
= FS_BULK_IN_EP_SIZE
;
2225 //burst & mult all default value
2226 arr_burst
= df_burst
;
2227 burst_arr_size
= DF_BURST_SIZE
;
2229 mult_arr_size
= DF_MULT_SIZE
;
2231 if(speed
== DEV_SPEED_FULL
&& transfer_type
== EPATT_INT
){
2232 arr_maxp
= fs_intr_maxp
;
2233 maxp_arr_size
= FS_INTR_MAXP_SIZE
;
2234 arr_interval
= fs_intr_interval
;
2235 interval_arr_size
= FS_INTR_INTERVAL_SIZE
;
2237 sec
= init_num_sec(1, 65);
2238 add_num_sec(3072-3,3072+3,sec
);
2242 arr_ep_out
= fs_intr_out_ep
;
2243 out_ep_arr_size
= FS_INTR_OUT_EP_SIZE
;
2244 arr_ep_in
= fs_intr_in_ep
;
2245 in_ep_arr_size
= FS_INTR_IN_EP_SIZE
;
2246 //burst & mult all default value
2247 arr_burst
= df_burst
;
2248 burst_arr_size
= DF_BURST_SIZE
;
2250 mult_arr_size
= DF_MULT_SIZE
;
2252 if(speed
== DEV_SPEED_FULL
&& transfer_type
== EPATT_ISO
){
2253 arr_maxp
= fs_isoc_maxp
;
2254 maxp_arr_size
= FS_ISOC_MAXP_SIZE
;
2255 arr_interval
= fs_isoc_interval
;
2256 interval_arr_size
= FS_ISOC_INTERVAL_SIZE
;
2257 sec
= init_num_sec(1,3);
2258 add_num_sec(1023-3,1023+3,sec
);
2259 add_num_sec(3072-3,3072+3,sec
);
2263 arr_ep_out
= fs_isoc_out_ep
;
2264 out_ep_arr_size
= FS_ISOC_OUT_EP_SIZE
;
2265 arr_ep_in
= fs_isoc_in_ep
;
2266 in_ep_arr_size
= FS_ISOC_IN_EP_SIZE
;
2267 //burst & mult all default value
2268 arr_burst
= df_burst
;
2269 burst_arr_size
= DF_BURST_SIZE
;
2271 mult_arr_size
= DF_MULT_SIZE
;
2274 if(u3auto_hcd_reset() != RET_SUCCESS
)
2277 for(ep_in_index
= 0; ep_in_index
< in_ep_arr_size
; ep_in_index
++){
2278 ep_in_num
= *(arr_ep_in
+ ep_in_index
);
2279 for(ep_out_index
= 0; ep_out_index
< out_ep_arr_size
; ep_out_index
++){
2280 ep_out_num
= *(arr_ep_out
+ ep_out_index
);
2281 for(maxp_index
= 0; maxp_index
< maxp_arr_size
; maxp_index
++){
2282 maxp
= *(arr_maxp
+ maxp_index
);
2283 for(interval_index
= 0; interval_index
< interval_arr_size
; interval_index
++){
2284 bInterval
= *(arr_interval
+ interval_index
);
2285 for(mult_index
= 0; mult_index
< mult_arr_size
; mult_index
++){
2286 mult
= *(arr_mult
+mult_index
);
2287 for(burst_index
= 0; burst_index
< burst_arr_size
; burst_index
++){
2288 burst
= *(arr_burst
+burst_index
);
2290 printk(KERN_ERR "[TEST]*************************************\n");
2291 printk(KERN_ERR " OUT_EP: %d***************************\n", ep_out_num);
2292 printk(KERN_ERR " IN_EP: %d ***************************\n", ep_in_num);
2293 printk(KERN_ERR " MAXP: %d ***************************\n", maxp);
2294 printk(KERN_ERR " INTERVAL: %d ***************************\n", bInterval);
2295 printk(KERN_ERR " MULT: %d **************************\n", mult);
2296 printk(KERN_ERR " BURST: %d *************************\n", burst);
2298 /* ==phase 0 : device reset==*/
2300 if(speed
== DEV_SPEED_SUPER
&& transfer_type
== EPATT_ISO
&& mult
> 0 && burst
> 1){
2301 mtk_test_dbg( " SKIP!!\n");
2304 start_port_reenabled(0, speed
);
2305 ret
=dev_reset(speed
, NULL
);
2307 mtk_test_dbg( "device reset failed!!!!!!!!!!\n");
2311 ret
= f_disable_slot();
2313 mtk_test_dbg( "disable slot failed!!!!!!!!!!\n");
2317 ret
= f_reenable_port(0);
2318 if(ret
!= RET_SUCCESS
){
2319 mtk_test_dbg( "device reenable failed!!!!!!!!!!\n");
2323 ret
= f_enable_slot(NULL
);
2325 mtk_test_dbg( "enable slot failed!!!!!!!!!!\n");
2329 ret
=f_address_slot(false, NULL
);
2331 mtk_test_dbg( "address slot failed!!!!!!!!!!\n");
2335 //reset SW scheduler algorithm
2336 mtktest_mtk_xhci_scheduler_init();
2337 /* ==phase 1 : config EP==*/
2338 ret
=dev_config_ep(ep_out_num
,USB_RX
,transfer_type
,maxp
,bInterval
,mult_dev
,burst
,mult
,NULL
);
2341 mtk_test_dbg( "config dev EP fail!!\n");
2344 ret
=dev_config_ep(ep_in_num
,USB_TX
,transfer_type
,maxp
,bInterval
,mult_dev
,burst
,mult
,NULL
);
2347 mtk_test_dbg( "config dev EP fail!!\n");
2350 ret
= f_config_ep(ep_out_num
,EPADD_OUT
,transfer_type
,maxp
,bInterval
,burst
,mult
, NULL
,0);
2353 mtk_test_dbg( "config EP fail!!\n");
2357 ret
= f_config_ep(ep_in_num
,EPADD_IN
,transfer_type
,maxp
,bInterval
,burst
,mult
, NULL
,1);
2360 mtk_test_dbg( "config EP fail!!\n");
2364 for(start_add
= min_start_add
; start_add
<= max_start_add
; start_add
++){
2366 while(cur_sec
!= NULL
){
2367 mtk_test_dbg( "[TEST]*************************************\n");
2368 mtk_test_dbg( " OUT_EP: %d***************************\n", ep_out_num
);
2369 mtk_test_dbg( " IN_EP: %d ***************************\n", ep_in_num
);
2370 mtk_test_dbg( " MAXP: %d ***************************\n", maxp
);
2371 mtk_test_dbg( " INTERVAL: %d ***************************\n", bInterval
);
2372 mtk_test_dbg( " MULT: %d **************************\n", mult
);
2373 mtk_test_dbg( " BURST: %d *************************\n", burst
);
2376 length
= cur_sec
->current_value
;
2377 mtk_test_dbg( " [ROUND]**************************\n");
2378 mtk_test_dbg( " START_ADD: %d*************\n", start_add
);
2379 mtk_test_dbg( " LENGTH: %d *************\n", length
);
2381 if(speed
== DEV_SPEED_HIGH
&& transfer_type
== EPATT_ISO
2382 && (maxp
== 2048 || maxp
== 3072) && (length
%maxp
!= 0)
2383 && (length
% 1024 == 0)){
2384 mtk_test_dbg( " SKIP!!\n");
2385 cur_sec
= find_next_num(cur_sec
);
2390 /* ==phase 2 : loopback==*/
2392 #ifdef DMA_BURST_SIZE_TEST
2393 dma_burst_sz
= (dma_burst_sz
+ 1) % 4;
2394 dma_tmp
= readl(SSUSB_XHCI_HDMA_CFG
);
2395 /* clear dma r/w fields */
2397 /* set r/w burst size */
2398 dma_tmp
|= (dma_burst_sz
<< 2 | dma_burst_sz
<< 10);
2399 writel(dma_tmp
, SSUSB_XHCI_HDMA_CFG
);
2401 mtk_test_dbg( " DMA_BURST: %d *************\n", dma_burst_sz
);
2404 if(speed
== DEV_SPEED_SUPER
&& transfer_type
== EPATT_ISO
){
2405 if(length
% maxp
== 0){
2406 cur_sec
= find_next_num(cur_sec
);
2407 mtk_test_dbg( " SKIP!!\n");
2410 else if((burst
==0) && (length
/maxp
>250)){
2411 cur_sec
= find_next_num(cur_sec
);
2412 mtk_test_dbg( " SKIP!!\n");
2417 gpd_buf_size
= length
;
2421 else if(speed
== DEV_SPEED_HIGH
&& transfer_type
== EPATT_ISO
){
2422 if(length
% maxp
== 0){
2423 cur_sec
= find_next_num(cur_sec
);
2424 mtk_test_dbg( " SKIP!!\n");
2427 else if((mult
== 0) && (length
/maxp
>250)){
2428 cur_sec
= find_next_num(cur_sec
);
2429 mtk_test_dbg( " SKIP!!\n");
2434 gpd_buf_size
= length
;
2438 else if(transfer_type
== EPATT_ISO
){
2439 if(length
/maxp
> 250){
2440 cur_sec
= find_next_num(cur_sec
);
2441 mtk_test_dbg( " SKIP!!\n");
2446 gpd_buf_size
= length
;
2452 gpd_buf_size
= length
;
2456 ret
=dev_loopback(bdp
,length
,gpd_buf_size
,bd_buf_size
,dram_offset
,extension
,NULL
);
2459 mtk_test_dbg( "loopback request fail!!\n");
2464 // ret = f_loopback_loop(ep_out_num, ep_in_num, length, start_add,NULL);
2465 ret
= f_loopback_loop_gpd(
2466 ep_out_num
, ep_in_num
, length
, start_add
, gpd_buf_size
, NULL
);
2469 mtk_test_dbg( "loopback fail!!\n");
2470 mtk_test_dbg( "length : %d\n",length
);
2475 /* ==phase 3: get device status==*/
2476 ret
=dev_polling_status(NULL
);
2480 mtk_test_dbg( "query request fail!!\n");
2483 cur_sec
= find_next_num(cur_sec
);
2492 clear_num_secs(sec
);
2496 static int t_u3auto_loopback(int argc
, char** argv
){
2497 int ret
,length
,start_add
;
2499 int gpd_buf_size
,bd_buf_size
;
2503 int ep_out_num
, ep_in_num
;
2505 int mult
, burst
, dev_mult
;
2506 int dram_offset
, extension
;
2509 speed
= DEV_SPEED_HIGH
;;
2510 transfer_type
= EPATT_BULK
;
2521 if(!strcmp(argv
[1], "ss")){
2522 mtk_test_dbg( "Test super speed\n");
2523 speed
= DEV_SPEED_SUPER
; //TODO: superspeed
2525 else if(!strcmp(argv
[1], "hs")){
2526 mtk_test_dbg( "Test high speed\n");
2527 speed
= DEV_SPEED_HIGH
;
2529 else if(!strcmp(argv
[1], "fs")){
2530 mtk_test_dbg( "Test full speed\n");
2531 speed
= DEV_SPEED_FULL
;
2535 if(!strcmp(argv
[2], "bulk")){
2536 mtk_test_dbg( "Test bulk transfer\n");
2537 transfer_type
= EPATT_BULK
;
2539 else if(!strcmp(argv
[2], "intr")){
2540 mtk_test_dbg( "Test intr transfer\n");
2541 transfer_type
= EPATT_INT
;
2543 else if(!strcmp(argv
[2], "isoc")){
2544 mtk_test_dbg( "Test isoc transfer\n");
2545 transfer_type
= EPATT_ISO
;
2549 maxp
= (int)simple_strtol(argv
[3], &argv
[3], 10);
2550 mtk_test_dbg( "maxp set to %d\n", maxp
);
2553 bInterval
= (int)simple_strtol(argv
[4], &argv
[4], 10);
2554 mtk_test_dbg( "interval set to %d\n", bInterval
);
2557 length
= (int)simple_strtol(argv
[5], &argv
[5], 10);
2558 mtk_test_dbg( "length set to %d\n", length
);
2561 start_add
= (int)simple_strtol(argv
[6], &argv
[6], 10);
2562 mtk_test_dbg( "start add offset set to %d\n", start_add
);
2565 ep_out_num
= (int)simple_strtol(argv
[7], &argv
[7], 10);
2566 mtk_test_dbg( "ep out num set to %d\n", ep_out_num
);
2569 ep_in_num
= (int)simple_strtol(argv
[8], &argv
[8], 10);
2570 mtk_test_dbg( "ep in num set to %d\n", ep_in_num
);
2573 burst
= (int)simple_strtol(argv
[9], &argv
[9], 10);
2574 mtk_test_dbg( "burst set to %d\n", burst
);
2577 mult
= (int)simple_strtol(argv
[10], &argv
[10], 10);
2578 mtk_test_dbg( "mult set to %d\n", mult
);
2581 if(u3auto_hcd_reset() != RET_SUCCESS
)
2584 mtk_test_dbg( "/*=========loopback===========*/\n");
2586 /* ==phase 0 : device reset==*/
2587 start_port_reenabled(0, speed
);
2588 ret
=dev_reset(speed
,NULL
);
2590 mtk_test_dbg( "device reset failed!!!!!!!!!!\n");
2594 ret
= f_disable_slot();
2596 mtk_test_dbg( "disable slot failed!!!!!!!!!!\n");
2600 ret
= f_reenable_port(0);
2601 if(ret
!= RET_SUCCESS
){
2602 mtk_test_dbg( "device reenable failed!!!!!!!!!!\n");
2606 ret
= f_enable_slot(NULL
);
2608 mtk_test_dbg( "enable slot failed!!!!!!!!!!\n");
2612 ret
=f_address_slot(false, NULL
);
2614 mtk_test_dbg( "address slot failed!!!!!!!!!!\n");
2618 /* ==phase 1 : config EP==*/
2619 ret
=dev_config_ep(ep_out_num
,USB_RX
,transfer_type
,maxp
,bInterval
,dev_mult
,burst
,mult
,NULL
);
2622 mtk_test_dbg( "config dev EP fail!!\n");
2626 ret
=dev_config_ep(ep_in_num
,USB_TX
,transfer_type
,maxp
,bInterval
,dev_mult
,burst
,mult
,NULL
);
2629 mtk_test_dbg( "config dev EP fail!!\n");
2633 ret
= f_config_ep(ep_out_num
,EPADD_OUT
,transfer_type
,maxp
,bInterval
,burst
,mult
, NULL
,0);
2636 mtk_test_dbg( "config EP fail!!\n");
2640 ret
= f_config_ep(ep_in_num
,EPADD_IN
,transfer_type
,maxp
,bInterval
,burst
,mult
, NULL
,1);
2643 mtk_test_dbg( "config EP fail!!\n");
2647 /* ==phase 2 : loopback==*/
2649 gpd_buf_size
=length
;
2651 //TODO: device should turn off extension length feature
2653 if(((length
-10)%(bd_buf_size
+6))<7){
2657 ret
=dev_loopback(bdp
,length
,gpd_buf_size
,bd_buf_size
,dram_offset
,extension
,NULL
);
2660 mtk_test_dbg( "loopback request fail!!\n");
2664 ret
= f_loopback_loop_gpd(ep_out_num
, ep_in_num
, length
, start_add
, gpd_buf_size
, NULL
);
2667 mtk_test_dbg( "loopback fail!!\n");
2668 mtk_test_dbg( "length : %d\n",length
);
2672 /* ==phase 3: get device status==*/
2673 ret
=dev_polling_status(NULL
);
2676 mtk_test_dbg( "query request fail!!\n");
2680 ret
=dev_reset(speed
,NULL
);
2685 static int t_u3auto_loopback_sg(int argc
, char** argv
){
2686 int ret
,length
,start_add
;
2688 int gpd_buf_size
,bd_buf_size
;
2692 int ep_out_num
, ep_in_num
;
2695 int mult
,burst
, dev_mult
;
2696 int dram_offset
, extension
;
2699 speed
= DEV_SPEED_HIGH
;
2700 transfer_type
= EPATT_BULK
;
2711 if(!strcmp(argv
[1], "ss")){
2712 mtk_test_dbg( "Test super speed\n");
2713 speed
= DEV_SPEED_SUPER
;
2715 else if(!strcmp(argv
[1], "hs")){
2716 mtk_test_dbg( "Test high speed\n");
2717 speed
= DEV_SPEED_HIGH
;
2719 else if(!strcmp(argv
[1], "fs")){
2720 mtk_test_dbg( "Test full speed\n");
2721 speed
= DEV_SPEED_FULL
;
2725 if(!strcmp(argv
[2], "bulk")){
2726 mtk_test_dbg( "Test bulk transfer\n");
2727 transfer_type
= EPATT_BULK
;
2729 else if(!strcmp(argv
[2], "intr")){
2730 mtk_test_dbg( "Test intr transfer\n");
2731 transfer_type
= EPATT_INT
;
2733 else if(!strcmp(argv
[2], "isoc")){
2734 mtk_test_dbg( "Test isoc transfer\n");
2735 transfer_type
= EPATT_ISO
;
2739 maxp
= (int)simple_strtol(argv
[3], &argv
[3], 10);
2740 mtk_test_dbg( "maxp set to %d\n", maxp
);
2743 bInterval
= (int)simple_strtol(argv
[4], &argv
[4], 10);
2744 mtk_test_dbg( "interval set to %d\n", bInterval
);
2747 length
= (int)simple_strtol(argv
[5], &argv
[5], 10);
2748 mtk_test_dbg( "length set to %d\n", length
);
2751 start_add
= (int)simple_strtol(argv
[6], &argv
[6], 10);
2752 mtk_test_dbg( "start add offset set to %d\n", start_add
);
2755 sg_len
= (int)simple_strtol(argv
[7], &argv
[7], 10);
2756 mtk_test_dbg( "sg length set to %d\n", sg_len
);
2758 mtk_test_dbg( "random sg length\n");
2762 ep_out_num
= (int)simple_strtol(argv
[8], &argv
[8], 10);
2763 mtk_test_dbg( "ep out num set to %d\n", ep_out_num
);
2766 ep_in_num
= (int)simple_strtol(argv
[9], &argv
[9], 10);
2767 mtk_test_dbg( "ep in num set to %d\n", ep_in_num
);
2770 burst
= (int)simple_strtol(argv
[10], &argv
[10], 10);
2771 mtk_test_dbg( "burst set to %d\n", burst
);
2774 mult
= (int)simple_strtol(argv
[11], &argv
[11], 10);
2775 mtk_test_dbg( "mult set to %d\n", mult
);
2778 if(u3auto_hcd_reset() != RET_SUCCESS
)
2781 mtk_test_dbg( "/*=========loopback===========*/\n");
2783 /* ==phase 0 : device reset==*/
2784 start_port_reenabled(0, speed
);
2785 ret
=dev_reset(speed
,NULL
);
2787 mtk_test_dbg( "device reset failed!!!!!!!!!!\n");
2790 ret
= f_disable_slot();
2792 mtk_test_dbg( "disable slot failed!!!!!!!!!!\n");
2795 ret
= f_reenable_port(0);
2796 if(ret
!= RET_SUCCESS
){
2797 mtk_test_dbg( "device reenable failed!!!!!!!!!!\n");
2801 ret
= f_enable_slot(NULL
);
2803 mtk_test_dbg( "enable slot failed!!!!!!!!!!\n");
2807 ret
=f_address_slot(false, NULL
);
2809 mtk_test_dbg( "address slot failed!!!!!!!!!!\n");
2813 /* ==phase 1 : config EP==*/
2814 ret
=dev_config_ep(ep_out_num
,USB_RX
,transfer_type
,maxp
,bInterval
,dev_mult
,burst
,mult
,NULL
);
2817 mtk_test_dbg( "config dev EP fail!!\n");
2821 ret
=dev_config_ep(ep_in_num
,USB_TX
,transfer_type
,maxp
,bInterval
,dev_mult
,burst
,mult
,NULL
);
2824 mtk_test_dbg( "config dev EP fail!!\n");
2828 ret
= f_config_ep(ep_out_num
,EPADD_OUT
,transfer_type
,maxp
,bInterval
,burst
,mult
,NULL
,0);
2831 mtk_test_dbg( "config EP fail!!\n");
2835 ret
= f_config_ep(ep_in_num
,EPADD_IN
,transfer_type
,maxp
,bInterval
,burst
,mult
, NULL
,1);
2838 mtk_test_dbg( "config EP fail!!\n");
2842 /* ==phase 2 : loopback==*/
2844 gpd_buf_size
=length
;
2846 //TODO: device should turn off extension length feature
2848 if(((length
-10)%(bd_buf_size
+6))<7){
2852 ret
=dev_loopback(bdp
,length
,gpd_buf_size
,bd_buf_size
,dram_offset
,extension
,NULL
);
2855 mtk_test_dbg( "loopback request fail!!\n");
2859 ret
= f_loopback_sg_loop(ep_out_num
, ep_in_num
, length
, start_add
, sg_len
, NULL
);
2862 mtk_test_dbg( "loopback fail!!\n");
2863 mtk_test_dbg( "length : %d\n",length
);
2867 /* ==phase 3: get device status==*/
2868 ret
=dev_polling_status(NULL
);
2871 mtk_test_dbg( "query request fail!!\n");
2877 //always use bulk transfer
2878 static int t_u3auto_random_suspend(int argc
, char** argv
){
2879 int ret
,length
,start_add
;
2881 int gpd_buf_size
,bd_buf_size
;
2885 int ep_out_num
, ep_in_num
;
2887 int mult
, burst
, dev_mult
;
2888 int dram_offset
, extension
;
2889 int suspend_count
, suspend_boundry
;
2893 speed
= DEV_SPEED_HIGH
;;
2894 transfer_type
= EPATT_BULK
;
2904 suspend_boundry
= 10;
2907 if(!strcmp(argv
[1], "ss")){
2908 mtk_test_dbg( "Test super speed\n");
2909 speed
= DEV_SPEED_SUPER
; //TODO: superspeed
2911 else if(!strcmp(argv
[1], "hs")){
2912 mtk_test_dbg( "Test high speed\n");
2913 speed
= DEV_SPEED_HIGH
;
2915 else if(!strcmp(argv
[1], "fs")){
2916 mtk_test_dbg( "Test full speed\n");
2917 speed
= DEV_SPEED_FULL
;
2921 suspend_boundry
= (int)simple_strtol(argv
[2], &argv
[2], 10);
2922 mtk_test_dbg( "suspend_boundry set to %d\n", suspend_boundry
);
2924 if(speed
== DEV_SPEED_SUPER
){
2927 else if(speed
== DEV_SPEED_HIGH
){
2930 else if(speed
== DEV_SPEED_FULL
){
2941 if(u3auto_hcd_reset() != RET_SUCCESS
)
2945 /* ==phase 0 : device reset==*/
2946 start_port_reenabled(0, speed
);
2947 ret
=dev_reset(speed
,NULL
);
2949 mtk_test_dbg( "device reset failed!!!!!!!!!!\n");
2953 ret
= f_disable_slot();
2955 mtk_test_dbg( "disable slot failed!!!!!!!!!!\n");
2959 ret
= f_reenable_port(0);
2960 if(ret
!= RET_SUCCESS
){
2961 mtk_test_dbg( "device reenable failed!!!!!!!!!!\n");
2965 ret
= f_enable_slot(NULL
);
2967 mtk_test_dbg( "enable slot failed!!!!!!!!!!\n");
2971 ret
=f_address_slot(false, NULL
);
2973 mtk_test_dbg( "address slot failed!!!!!!!!!!\n");
2976 mtktest_mtk_xhci_scheduler_init();
2977 /* ==phase 1 : config EP==*/
2978 ret
=dev_config_ep(ep_out_num
,USB_RX
,transfer_type
,maxp
,bInterval
,dev_mult
,burst
,mult
,NULL
);
2981 mtk_test_dbg( "config dev EP fail!!\n");
2985 ret
=dev_config_ep(ep_in_num
,USB_TX
,transfer_type
,maxp
,bInterval
,dev_mult
,burst
,mult
,NULL
);
2988 mtk_test_dbg( "config dev EP fail!!\n");
2992 ret
= f_config_ep(ep_out_num
,EPADD_OUT
,transfer_type
,maxp
,bInterval
,burst
,mult
, NULL
,0);
2995 mtk_test_dbg( "config EP fail!!\n");
2999 ret
= f_config_ep(ep_in_num
,EPADD_IN
,transfer_type
,maxp
,bInterval
,burst
,mult
, NULL
,1);
3002 mtk_test_dbg( "config EP fail!!\n");
3006 while(suspend_count
< suspend_boundry
){
3007 isSuspend
= (char)(get_random_int() % 2);
3009 mtk_test_dbg( "Suspend/Resume\n");
3010 ret
= f_power_suspend();
3014 mtk_test_dbg( "Enter U3, Suspend success\n");
3016 ret
= f_power_resume();
3020 mtk_test_dbg( "Enter U0, Resume success\n");
3023 length
= (get_random_int() % 65535)+1;
3024 mtk_test_dbg( "count(%d), isSuspend(%d), loopback %d length\n",
3025 suspend_count
, isSuspend
, length
);
3026 /* ==phase 2 : loopback==*/
3028 gpd_buf_size
=length
;
3030 //TODO: device should turn off extension length feature
3032 if(((length
-10)%(bd_buf_size
+6))<7){
3036 ret
=dev_loopback(bdp
,length
,gpd_buf_size
,bd_buf_size
,dram_offset
,extension
,NULL
);
3039 mtk_test_dbg( "loopback request fail!!\n");
3043 ret
= f_loopback_loop(ep_out_num
, ep_in_num
, length
, start_add
,NULL
);
3046 mtk_test_dbg( "loopback fail!!\n");
3047 mtk_test_dbg( "length : %d\n",length
);
3051 /* ==phase 3: get device status==*/
3052 ret
=dev_polling_status(NULL
);
3055 mtk_test_dbg( "query request fail!!\n");
3061 ret
=dev_reset(speed
,NULL
);
3066 static int t_u3auto_random_wakeup(int argc
, char**argv
){
3067 int ret
,length
,start_add
, random_delay
;
3069 int gpd_buf_size
,bd_buf_size
;
3073 int ep_out_num
, ep_in_num
;
3075 int mult
, burst
, dev_mult
;
3076 int dram_offset
, extension
;
3077 int suspend_count
, suspend_boundry
;
3081 speed
= DEV_SPEED_HIGH
;;
3082 transfer_type
= EPATT_BULK
;
3092 suspend_boundry
= 10;
3095 if(!strcmp(argv
[1], "ss")){
3096 mtk_test_dbg( "Test super speed\n");
3097 speed
= DEV_SPEED_SUPER
;
3099 else if(!strcmp(argv
[1], "hs")){
3100 mtk_test_dbg( "Test high speed\n");
3101 speed
= DEV_SPEED_HIGH
;
3103 else if(!strcmp(argv
[1], "fs")){
3104 mtk_test_dbg( "Test full speed\n");
3105 speed
= DEV_SPEED_FULL
;
3109 suspend_boundry
= (int)simple_strtol(argv
[2], &argv
[2], 10);
3110 mtk_test_dbg( "wakeup_boundary set to %d\n", suspend_boundry
);
3112 if(speed
== DEV_SPEED_SUPER
){
3115 else if(speed
== DEV_SPEED_HIGH
){
3118 else if(speed
== DEV_SPEED_FULL
){
3129 if(u3auto_hcd_reset() != RET_SUCCESS
)
3133 /* ==phase 0 : device reset==*/
3134 start_port_reenabled(0, speed
);
3135 ret
=dev_reset(speed
,NULL
);
3137 mtk_test_dbg( "device reset failed!!!!!!!!!!\n");
3141 ret
= f_disable_slot();
3143 mtk_test_dbg( "disable slot failed!!!!!!!!!!\n");
3147 ret
= f_reenable_port(0);
3148 if(ret
!= RET_SUCCESS
){
3149 mtk_test_dbg( "device reenable failed!!!!!!!!!!\n");
3153 ret
= f_enable_slot(NULL
);
3155 mtk_test_dbg( "enable slot failed!!!!!!!!!!\n");
3159 ret
=f_address_slot(false, NULL
);
3161 mtk_test_dbg( "address slot failed!!!!!!!!!!\n");
3165 /* ==phase 1 : config EP==*/
3166 ret
=dev_config_ep(ep_out_num
,USB_RX
,transfer_type
,maxp
,bInterval
,dev_mult
,burst
,mult
,NULL
);
3169 mtk_test_dbg( "config dev EP fail!!\n");
3173 ret
=dev_config_ep(ep_in_num
,USB_TX
,transfer_type
,maxp
,bInterval
,dev_mult
,burst
,mult
,NULL
);
3176 mtk_test_dbg( "config dev EP fail!!\n");
3179 mtktest_mtk_xhci_scheduler_init();
3180 ret
= f_config_ep(ep_out_num
,EPADD_OUT
,transfer_type
,maxp
,bInterval
,burst
,mult
, NULL
,0);
3183 mtk_test_dbg( "config EP fail!!\n");
3187 ret
= f_config_ep(ep_in_num
,EPADD_IN
,transfer_type
,maxp
,bInterval
,burst
,mult
, NULL
,1);
3190 mtk_test_dbg( "config EP fail!!\n");
3194 while(suspend_count
< suspend_boundry
){
3195 length
= (get_random_int() % 65535)+1;
3196 mtk_test_dbg( "loopback %d length\n", length
);
3197 random_delay
= (get_random_int() % 300000)+1;
3199 gpd_buf_size
=length
;
3201 isSuspend
= (char)(get_random_int() % 2);
3203 mtk_test_dbg( "random_delay(%d)\n", random_delay
);
3204 ret
= dev_remotewakeup(random_delay
);
3205 ret
= f_power_remotewakeup();
3212 /* ==phase 2 : loopback==*/
3214 //TODO: device should turn off extension length feature
3216 if(((length
-10)%(bd_buf_size
+6))<7){
3220 ret
=dev_loopback(bdp
,length
,gpd_buf_size
,bd_buf_size
,dram_offset
,extension
,NULL
);
3223 mtk_test_dbg( "loopback request fail!!\n");
3227 ret
= f_loopback_loop(ep_out_num
, ep_in_num
, length
, start_add
,NULL
);
3230 mtk_test_dbg( "loopback fail!!\n");
3231 mtk_test_dbg( "length : %d\n",length
);
3235 /* ==phase 3: get device status==*/
3236 ret
=dev_polling_status(NULL
);
3239 mtk_test_dbg( "query request fail!!\n");
3245 ret
=dev_reset(speed
,NULL
);
3250 static int t_u3auto_reconfig(int argc
, char** argv
){
3252 unsigned int rnd_transfer_type
, rdn_maxp
, rdn_interval
;
3253 unsigned int length
;
3263 if(!strcmp(argv
[1], "ss")){
3264 mtk_test_dbg( "Test super speed\n");
3265 dev_speed
= DEV_SPEED_SUPER
;
3267 else if(!strcmp(argv
[1], "hs")){
3268 mtk_test_dbg( "Test high speed\n");
3269 dev_speed
= DEV_SPEED_HIGH
;
3271 else if(!strcmp(argv
[1], "fs")){
3272 mtk_test_dbg( "Test full speed\n");
3273 dev_speed
= DEV_SPEED_FULL
;
3275 else if(!strcmp(argv
[1], "stop")){
3276 mtk_test_dbg( "STOP!!\n");
3282 round
= (int)simple_strtol(argv
[2], &argv
[2], 10);
3285 num_ep
= (int)simple_strtol(argv
[3], &argv
[3], 10);
3288 for(i
=0; i
<round
; i
++){
3289 //random new endpoint
3290 rdn_ep_num
= (get_random_int()%3)+1;
3291 rnd_transfer_type
= (get_random_int()%3)+1;
3292 if(rnd_transfer_type
== EPATT_ISO
){
3293 rdn_interval
= get_random_int()%3+1;
3294 rdn_maxp
= (get_random_int()%8+1)*128;
3296 else if(rnd_transfer_type
== EPATT_BULK
){
3298 if(dev_speed
== DEV_SPEED_SUPER
){
3301 else if(dev_speed
== DEV_SPEED_HIGH
){
3304 else if(dev_speed
== DEV_SPEED_FULL
){
3308 else if(rnd_transfer_type
== EPATT_INT
){
3309 rdn_interval
= get_random_int()%4+1;
3310 rdn_maxp
= (get_random_int()%8+1)*128;
3312 //de-configure device endpoint
3314 //de-configure endpoint
3316 f_deconfig_ep(1, 0, 0, NULL
, 0);
3318 //configure endpoints
3320 //do loopback for 100 rounds
3325 static int t_u3auto_stress(int argc
, char** argv
){
3326 int ret
, num_ep
, i
, speed
;
3327 int transfer_type
[5];
3328 int maxp
[5],interval
[5], burst
[5],mult
[5];
3337 struct usb_device
*udev
;
3344 if(!strcmp(argv
[1], "ss")){
3345 mtk_test_dbg( "Test super speed\n");
3346 speed
= DEV_SPEED_SUPER
;
3348 else if(!strcmp(argv
[1], "hs")){
3349 mtk_test_dbg( "Test high speed\n");
3350 speed
= DEV_SPEED_HIGH
;
3352 else if(!strcmp(argv
[1], "fs")){
3353 mtk_test_dbg( "Test full speed\n");
3354 speed
= DEV_SPEED_FULL
;
3356 else if(!strcmp(argv
[1], "stop")){
3357 mtk_test_dbg( "STOP!!\n");
3363 dev_num
= (int)simple_strtol(argv
[2], &argv
[2], 10);
3367 num_ep
= (int)simple_strtol(argv
[3], &argv
[3], 10);
3370 if(!strcmp(argv
[4], "false")){
3375 if(!strcmp(argv
[5], "true")){
3380 for(i
=6; i
<=9; i
++){
3383 if(!strcmp(argv
[i
], "bulk")){
3384 mtk_test_dbg( "Test bulk transfer for ep %d\n", cur_index
);
3385 transfer_type
[cur_index
] = EPATT_BULK
;
3386 if(speed
== DEV_SPEED_SUPER
){
3387 maxp
[cur_index
] = 1024;
3388 burst
[cur_index
] = 8;
3389 mult
[cur_index
] = 0;
3390 interval
[cur_index
] = 1;
3393 else if(speed
== DEV_SPEED_HIGH
){
3394 maxp
[cur_index
] = 512;
3395 burst
[cur_index
] = 0;
3396 mult
[cur_index
] = 0;
3397 interval
[cur_index
] = 1;
3400 else if(speed
== DEV_SPEED_FULL
){
3401 maxp
[cur_index
] = 64;
3402 burst
[cur_index
] = 0;
3403 mult
[cur_index
] = 0;
3404 interval
[cur_index
] = 1;
3408 else if(!strcmp(argv
[i
], "intr")){
3409 mtk_test_dbg( "Test intr transfer for ep %d\n", (cur_index
));
3410 transfer_type
[cur_index
] = EPATT_INT
;
3411 if(speed
== DEV_SPEED_SUPER
){
3412 maxp
[cur_index
] = 1024;
3413 burst
[cur_index
] = 0;
3414 mult
[cur_index
] = 0;
3415 interval
[cur_index
] = 1;
3417 else if(speed
== DEV_SPEED_HIGH
){
3418 maxp
[cur_index
] = 1024;
3419 burst
[cur_index
] = 0;
3420 mult
[cur_index
] = 0;
3423 interval
[cur_index
] = 4;
3426 interval
[cur_index
] = 1;
3429 else if(speed
== DEV_SPEED_FULL
){
3430 maxp
[cur_index
] = 64;
3431 burst
[cur_index
] = 0;
3432 mult
[cur_index
] = 0;
3435 interval
[cur_index
] = 3;
3438 interval
[cur_index
] = 1;
3442 else if(!strcmp(argv
[i
], "intr_pm")){
3443 mtk_test_dbg( "Test intr transfer for ep %d\n", (cur_index
));
3444 transfer_type
[cur_index
] = EPATT_INT
;
3445 if(speed
== DEV_SPEED_SUPER
){
3446 maxp
[cur_index
] = 1024;
3447 burst
[cur_index
] = 0;
3448 mult
[cur_index
] = 0;
3449 interval
[cur_index
] = 4;
3452 else if(!strcmp(argv
[i
], "intr_pm_u2")){
3453 mtk_test_dbg( "Test intr transfer for ep %d\n", (cur_index
));
3454 transfer_type
[cur_index
] = EPATT_INT
;
3455 if(speed
== DEV_SPEED_SUPER
){
3456 maxp
[cur_index
] = 1024;
3457 burst
[cur_index
] = 0;
3458 mult
[cur_index
] = 0;
3459 interval
[cur_index
] = 5;
3462 else if(!strcmp(argv
[i
], "isoc")){
3463 mtk_test_dbg( "Test isoc transfer for ep %d\n", (cur_index
));
3464 transfer_type
[cur_index
] = EPATT_ISO
;
3465 if(speed
== DEV_SPEED_SUPER
){
3466 maxp
[cur_index
] = 1024;
3467 burst
[cur_index
] = 0;
3468 mult
[cur_index
] = 0;
3469 interval
[cur_index
] = 4;
3471 else if(speed
== DEV_SPEED_HIGH
){
3472 maxp
[cur_index
] = 1024;
3473 burst
[cur_index
] = 0;
3474 mult
[cur_index
] = 0;
3477 interval
[cur_index
] = 4;
3480 interval
[cur_index
] = 1;
3483 else if(speed
== DEV_SPEED_FULL
){
3484 maxp
[cur_index
] = 1023;
3485 burst
[cur_index
] = 0;
3486 mult
[cur_index
] = 0;
3489 interval
[cur_index
] = 3;
3492 interval
[cur_index
] = 1;
3497 else if(!strcmp(argv
[i
], "isoc_pm")){
3498 mtk_test_dbg( "Test isoc transfer for ep %d\n", (cur_index
));
3499 transfer_type
[cur_index
] = EPATT_ISO
;
3500 if(speed
== DEV_SPEED_SUPER
){
3501 maxp
[cur_index
] = 1024;
3502 burst
[cur_index
] = 0;
3503 mult
[cur_index
] = 0;
3504 interval
[cur_index
] = 5;
3510 /* ==phase 0 : device reset==*/
3512 #if 0 //doesn't reset now, should reset to tested speed before execute this test item
3513 start_port_reenabled(0, speed
);
3514 ret
=dev_reset(speed
, NULL
);
3516 mtk_test_dbg( "device reset failed!!!!!!!!!!\n");
3520 ret
= f_disable_slot();
3522 mtk_test_dbg( "disable slot failed!!!!!!!!!!\n");
3526 ret
= f_reenable_port(0);
3527 if(ret
!= RET_SUCCESS
){
3528 mtk_test_dbg( "device reenable failed!!!!!!!!!!\n");
3532 ret
= f_enable_slot(NULL
);
3534 mtk_test_dbg( "enable slot failed!!!!!!!!!!\n");
3538 ret
=f_address_slot(false, NULL
);
3540 mtk_test_dbg( "address slot failed!!!!!!!!!!\n");
3546 else if(dev_num
< 5){
3547 udev
= dev_list
[dev_num
-1];
3548 port_num
= udev
->portnum
;
3549 f_hub_reset_dev(udev
, dev_num
, port_num
, speed
);
3550 udev
= dev_list
[dev_num
-1];
3552 /* ==phase 1 : config EP==*/
3553 for(i
=1; i
<=num_ep
; i
++){
3554 if(transfer_type
[i
] == EPATT_ISO
){
3560 dev_config_ep(i
,USB_RX
, transfer_type
[i
], maxp
[i
], interval
[i
], dev_slot
, burst
[i
],mult
[i
], udev
);
3561 dev_config_ep(i
,USB_TX
, transfer_type
[i
], maxp
[i
], interval
[i
], dev_slot
, burst
[i
],mult
[i
], udev
);
3563 f_config_ep(i
,EPADD_OUT
,transfer_type
[i
],maxp
[i
],interval
[i
],burst
[i
],mult
[i
],udev
,0);
3565 f_config_ep(i
, EPADD_IN
, transfer_type
[i
], maxp
[i
], interval
[i
],burst
[i
],mult
[i
],udev
,1);
3568 f_config_ep(i
, EPADD_IN
, transfer_type
[i
], maxp
[i
], interval
[i
],burst
[i
],mult
[i
],udev
,0);
3570 if(transfer_type
[i
] == EPATT_ISO
){
3571 f_ring_enlarge(EPADD_OUT
, i
, -1);
3572 f_ring_enlarge(EPADD_OUT
, i
, -1);
3573 f_ring_enlarge(EPADD_IN
, i
, -1);
3574 f_ring_enlarge(EPADD_IN
, i
, -1);
3580 ret
=dev_stress(0,GPD_LENGTH_RDN
,GPD_LENGTH_RDN
,0,num_ep
, udev
);
3582 for(i
=1; i
<=num_ep
; i
++){
3583 f_add_rdn_len_str_threads(dev_num
, i
, maxp
[i
], isCompare
, udev
, isEP0
);
3586 mtk_test_dbg( "stress request failed!!!!!!!!!!\n");
3592 static int t_u3auto_isoc_frame_id(int argc
, char** argv
){
3593 int ret
,length
,start_add
;
3595 int gpd_buf_size
,bd_buf_size
;
3599 int ep_out_num
, ep_in_num
;
3601 int mult_dev
, mult
, burst
;
3602 int dram_offset
, extension
;
3606 speed
= DEV_SPEED_HIGH
;;
3607 transfer_type
= EPATT_ISO
;
3620 if(!strcmp(argv
[1], "ss")){
3621 mtk_test_dbg( "Test super speed\n");
3622 speed
= DEV_SPEED_SUPER
;
3624 else if(!strcmp(argv
[1], "hs")){
3625 mtk_test_dbg( "Test high speed\n");
3626 speed
= DEV_SPEED_HIGH
;
3628 else if(!strcmp(argv
[1], "fs")){
3629 mtk_test_dbg( "Test full speed\n");
3630 speed
= DEV_SPEED_FULL
;
3633 if(speed
== DEV_SPEED_SUPER
){
3636 else if(speed
== DEV_SPEED_HIGH
){
3639 else if(speed
== DEV_SPEED_FULL
){
3645 start_port_reenabled(0, speed
);
3646 ret
=dev_reset(speed
, NULL
);
3648 mtk_test_dbg( "device reset failed!!!!!!!!!!\n");
3652 ret
= f_disable_slot();
3654 mtk_test_dbg( "disable slot failed!!!!!!!!!!\n");
3658 ret
= f_reenable_port(0);
3659 if(ret
!= RET_SUCCESS
){
3660 mtk_test_dbg( "device reenable failed!!!!!!!!!!\n");
3664 ret
= f_enable_slot(NULL
);
3666 mtk_test_dbg( "enable slot failed!!!!!!!!!!\n");
3670 ret
=f_address_slot(false, NULL
);
3672 mtk_test_dbg( "address slot failed!!!!!!!!!!\n");
3676 ret
=dev_config_ep(ep_out_num
,USB_RX
,transfer_type
,maxp
,bInterval
,mult_dev
,burst
,mult
,NULL
);
3679 mtk_test_dbg( "config dev EP fail!!\n");
3682 ret
=dev_config_ep(ep_in_num
,USB_TX
,transfer_type
,maxp
,bInterval
,mult_dev
,burst
,mult
,NULL
);
3685 mtk_test_dbg( "config dev EP fail!!\n");
3689 ret
= f_config_ep(ep_out_num
,EPADD_OUT
,transfer_type
,maxp
,bInterval
,burst
,mult
, NULL
,0);
3692 mtk_test_dbg( "config EP fail!!\n");
3696 ret
= f_config_ep(ep_in_num
,EPADD_IN
,transfer_type
,maxp
,bInterval
,burst
,mult
, NULL
,1);
3699 mtk_test_dbg( "config EP fail!!\n");
3706 gpd_buf_size
= length
;
3708 for(i
=0; i
<10; i
++){
3709 ret
=dev_loopback(bdp
,length
,gpd_buf_size
,bd_buf_size
,dram_offset
,extension
,NULL
);
3712 mtk_test_dbg( "loopback request fail!!\n");
3716 ret
= f_loopback_loop_gpd(
3717 ep_out_num
, ep_in_num
, length
, start_add
, gpd_buf_size
, NULL
);
3720 mtk_test_dbg( "loopback fail!!\n");
3721 mtk_test_dbg( "length : %d\n",length
);
3725 ret
=dev_polling_status(NULL
);
3729 mtk_test_dbg( "query request fail!!\n");
3734 g_iso_frame
= false;
3738 static int t_ellysis_TD7_36(int argc
, char** argv
){
3741 struct usb_device
*udev
, *rhdev
;
3742 struct xhci_virt_device
*virt_dev
;
3743 struct xhci_hcd
*xhci
;
3745 struct usb_ctrlrequest
*dr
;
3746 struct usb_config_descriptor
*desc
;
3750 struct usb_host_endpoint
*ep_rx
;
3756 if(u3auto_hcd_reset() != RET_SUCCESS
)
3758 xhci
= hcd_to_xhci(my_hcd
);
3759 rhdev
= my_hcd
->self
.root_hub
;
3760 udev
= rhdev
->children
[g_port_id
-1];
3761 dev
= xhci_to_hcd(xhci
)->self
.controller
;//dma stream buffer
3762 xhci_dbg(xhci
, "device speed %d\n", udev
->speed
);
3763 //get descriptor (device)
3764 dr
= kmalloc(sizeof(struct usb_ctrlrequest
), GFP_NOIO
);
3765 dr
->bRequestType
= USB_DIR_IN
;
3766 dr
->bRequest
= USB_REQ_GET_DESCRIPTOR
;
3767 dr
->wValue
= cpu_to_le16((USB_DT_DEVICE
<< 8) + 0);
3768 dr
->wIndex
= cpu_to_le16(0);
3769 dr
->wLength
= cpu_to_le16(8);
3770 desc
= kmalloc(8, GFP_KERNEL
);
3772 urb
= alloc_ctrl_urb(dr
, desc
, udev
);
3773 ret
= f_ctrlrequest(urb
, udev
);
3777 //get descriptor (device)
3778 dr
= kmalloc(sizeof(struct usb_ctrlrequest
), GFP_NOIO
);
3779 dr
->bRequestType
= USB_DIR_IN
;
3780 dr
->bRequest
= USB_REQ_GET_DESCRIPTOR
;
3781 dr
->wValue
= cpu_to_le16((USB_DT_DEVICE
<< 8) + 0);
3782 dr
->wIndex
= cpu_to_le16(0);
3783 dr
->wLength
= cpu_to_le16(USB_DT_DEVICE_SIZE
);
3784 desc
= kmalloc(USB_DT_DEVICE_SIZE
, GFP_KERNEL
);
3785 memset(desc
, 0, USB_DT_DEVICE_SIZE
);
3786 urb
= alloc_ctrl_urb(dr
, desc
, udev
);
3787 ret
= f_ctrlrequest(urb
, udev
);
3791 //get descriptor (configure)
3792 dr
= kmalloc(sizeof(struct usb_ctrlrequest
), GFP_NOIO
);
3793 dr
->bRequestType
= USB_DIR_IN
;
3794 dr
->bRequest
= USB_REQ_GET_DESCRIPTOR
;
3795 dr
->wValue
= cpu_to_le16((USB_DT_CONFIG
<< 8) + 0);
3796 dr
->wIndex
= cpu_to_le16(0);
3797 dr
->wLength
= cpu_to_le16(USB_DT_CONFIG_SIZE
);
3798 desc
= kmalloc(USB_DT_CONFIG_SIZE
, GFP_KERNEL
);
3799 memset(desc
, 0, USB_DT_CONFIG_SIZE
);
3800 urb
= alloc_ctrl_urb(dr
, desc
, udev
);
3801 ret
= f_ctrlrequest(urb
, udev
);
3805 //get descriptor (configure)
3806 dr
= kmalloc(sizeof(struct usb_ctrlrequest
), GFP_NOIO
);
3807 dr
->bRequestType
= USB_DIR_IN
;
3808 dr
->bRequest
= USB_REQ_GET_DESCRIPTOR
;
3809 dr
->wValue
= cpu_to_le16((USB_DT_CONFIG
<< 8) + 0);
3810 dr
->wIndex
= cpu_to_le16(0);
3811 dr
->wLength
= cpu_to_le16(40);
3812 desc
= kmalloc(40, GFP_KERNEL
);
3813 memset(desc
, 0, 40);
3814 urb
= alloc_ctrl_urb(dr
, desc
, udev
);
3815 ret
= f_ctrlrequest(urb
, udev
);
3820 dr
= kmalloc(sizeof(struct usb_ctrlrequest
), GFP_NOIO
);
3821 dr
->bRequestType
= USB_DIR_OUT
;
3822 dr
->bRequest
= USB_REQ_SET_CONFIGURATION
;
3823 dr
->wValue
= cpu_to_le16(1);
3824 dr
->wIndex
= cpu_to_le16(0);
3825 dr
->wLength
= cpu_to_le16(0);
3826 urb
= alloc_ctrl_urb(dr
, NULL
, udev
);
3827 ret
= f_ctrlrequest(urb
,udev
);
3831 dr
= kmalloc(sizeof(struct usb_ctrlrequest
), GFP_NOIO
);
3832 dr
->bRequestType
= USB_DIR_OUT
| USB_TYPE_CLASS
| USB_RECIP_INTERFACE
;
3833 dr
->bRequest
= 0x0A;
3834 dr
->wValue
= cpu_to_le16(0);
3835 dr
->wIndex
= cpu_to_le16(0);
3836 dr
->wLength
= cpu_to_le16(0);
3837 urb
= alloc_ctrl_urb(dr
, NULL
, udev
);
3838 ret
= f_ctrlrequest(urb
,udev
);
3841 //get descriptor (HID report)
3842 ret
= f_config_ep(1, EPADD_IN
, EPATT_INT
, 4, 7,0,0, udev
, 1);
3844 ep_rx
= udev
->ep_in
[1];
3845 ep_index_rx
= mtktest_xhci_get_endpoint_index(&ep_rx
->desc
);
3846 xhci_err(xhci
, "[INPUT]\n");
3847 for(i
=0; i
<10; i
++){
3848 urb_rx
= usb_alloc_urb(0, GFP_KERNEL
);
3849 ret
= f_fill_urb(urb_rx
,1,4,0,EPADD_IN
, 0, 4, udev
);
3851 xhci_err(xhci
, "[ERROR]fill rx urb Error!!\n");
3854 urb_rx
->transfer_flags
&= ~URB_ZERO_PACKET
;
3855 ret
= f_queue_urb(urb_rx
,1,udev
);
3857 xhci_err(xhci
, "[ERROR]rx urb transfer failed!!\n");
3860 dma_sync_single_for_cpu(dev
,urb_rx
->transfer_dma
, 4,DMA_BIDIRECTIONAL
);
3861 for(j
=0; j
<urb_rx
->transfer_buffer_length
; j
++){
3862 tmp
= urb_rx
->transfer_buffer
+i
;
3863 //xhci_err(xhci, "%x ", *tmp);
3865 //xhci_err(xhci, "\n");
3866 usb_free_urb(urb_rx
);
3872 static int t_class_keyboard(int argc
, char** argv
){
3875 struct usb_device
*udev
, *rhdev
;
3876 struct xhci_virt_device
*virt_dev
;
3877 struct xhci_hcd
*xhci
;
3879 struct usb_ctrlrequest
*dr
;
3883 struct usb_host_endpoint
*ep_rx
;
3889 if(u3auto_hcd_reset() != RET_SUCCESS
)
3893 xhci
= hcd_to_xhci(my_hcd
);
3894 rhdev
= my_hcd
->self
.root_hub
;
3895 udev
= rhdev
->children
[g_port_id
-1];
3896 dev
= xhci_to_hcd(xhci
)->self
.controller
;//dma stream buffer
3897 xhci_dbg(xhci
, "device speed %d\n", udev
->speed
);
3899 dr
= kmalloc(sizeof(struct usb_ctrlrequest
), GFP_NOIO
);
3900 dr
->bRequestType
= USB_DIR_OUT
;
3901 dr
->bRequest
= USB_REQ_SET_CONFIGURATION
;
3902 dr
->wValue
= cpu_to_le16(1);
3903 dr
->wIndex
= cpu_to_le16(0);
3904 dr
->wLength
= cpu_to_le16(0);
3905 urb
= alloc_ctrl_urb(dr
, NULL
, udev
);
3906 ret
= f_ctrlrequest(urb
,udev
);
3910 dr
= kmalloc(sizeof(struct usb_ctrlrequest
), GFP_NOIO
);
3911 dr
->bRequestType
= 0x21;
3912 dr
->bRequest
= 0x0a;
3913 dr
->wValue
= cpu_to_le16(0);
3914 dr
->wIndex
= cpu_to_le16(0);
3915 dr
->wLength
= cpu_to_le16(0);
3916 urb
= alloc_ctrl_urb(dr
, NULL
, udev
);
3917 ret
= f_ctrlrequest(urb
,udev
);
3921 dr
= kmalloc(sizeof(struct usb_ctrlrequest
), GFP_NOIO
);
3922 dr
->bRequestType
= 0x21;
3923 dr
->bRequest
= 0x09;
3924 dr
->wValue
= cpu_to_le16(0x200);
3925 dr
->wIndex
= cpu_to_le16(0);
3926 dr
->wLength
= cpu_to_le16(1);
3927 buffer
= kmalloc(1, GFP_KERNEL
);
3929 urb
= alloc_ctrl_urb(dr
, buffer
, udev
);
3930 ret
= f_ctrlrequest(urb
,udev
);
3935 //config a interrupt IN endpiont, ep_num=1
3936 ret
= f_config_ep(1, EPADD_IN
, EPATT_INT
, 8, 10,0,0, udev
, 1);
3938 //continuous queue interrupt transfer for 10 times
3939 ep_rx
= udev
->ep_in
[1];
3940 ep_index_rx
= mtktest_xhci_get_endpoint_index(&ep_rx
->desc
);
3941 xhci_err(xhci
, "[INPUT]\n");
3942 for(i
=0; i
<100; i
++){
3943 urb_rx
= usb_alloc_urb(0, GFP_KERNEL
);
3944 ret
= f_fill_urb(urb_rx
,1,8,0,EPADD_IN
, 0, 8, udev
);
3946 xhci_err(xhci
, "[ERROR]fill rx urb Error!!\n");
3949 urb_rx
->transfer_flags
&= ~URB_ZERO_PACKET
;
3950 ret
= f_queue_urb(urb_rx
,1,udev
);
3952 xhci_err(xhci
, "[ERROR]rx urb transfer failed!!\n");
3955 dma_sync_single_for_cpu(dev
,urb_rx
->transfer_dma
, 8,DMA_BIDIRECTIONAL
);
3956 for(i
=0; i
<urb_rx
->transfer_buffer_length
; i
++){
3957 tmp
= urb_rx
->transfer_buffer
+i
;
3958 xhci_err(xhci
, "%x ", *tmp
);
3960 xhci_err(xhci
, "\n");
3961 usb_free_urb(urb_rx
);
3967 static int t_u3auto_randomstop_dev(int argc
, char** argv
){
3969 int speed
, transfer_type_1
, transfer_type_2
, maxp_1
, maxp_2
, gpd_buf_size
, bdp
3970 , bd_buf_size
, ep_1_num
, ep_2_num
, dir_1
, dir_2
, dev_dir_1
, dev_dir_2
3971 , urb_dir_1
, urb_dir_2
, length
;
3972 int stop_count_1
, stop_count_2
;
3979 speed
= DEV_SPEED_HIGH
;
3980 transfer_type_1
= transfer_type_2
= EPATT_BULK
;
3981 maxp_1
= maxp_2
= 512;
3982 gpd_buf_size
= 16*1024;
3987 urb_dir_1
= URB_DIR_OUT
;
3992 urb_dir_2
= URB_DIR_IN
;
3998 stop_count_1
= stop_count_2
= 3;
4001 if(!strcmp(argv
[1], "ss")){
4002 mtk_test_dbg( "Test super speed\n");
4003 speed
= DEV_SPEED_SUPER
; //TODO: superspeed
4005 else if(!strcmp(argv
[1], "hs")){
4006 mtk_test_dbg( "Test high speed\n");
4007 speed
= DEV_SPEED_HIGH
;
4009 else if(!strcmp(argv
[1], "fs")){
4010 mtk_test_dbg( "Test full speed\n");
4011 speed
= DEV_SPEED_FULL
;
4015 if(!strcmp(argv
[2], "bulk")){
4016 mtk_test_dbg( "Tx BULK transfer\n");
4017 transfer_type_1
= EPATT_BULK
;
4019 else if(!strcmp(argv
[2], "intr")){
4020 mtk_test_dbg( "Tx INTERRUPT transfer\n");
4021 transfer_type_1
= EPATT_INT
;
4023 else if(!strcmp(argv
[2], "isoc")){
4024 mtk_test_dbg( "Tx ISOC transfer\n");
4025 transfer_type_1
= EPATT_ISO
;
4029 if(!strcmp(argv
[3], "bulk")){
4030 mtk_test_dbg( "Rx BULK transfer\n");
4031 transfer_type_2
= EPATT_BULK
;
4033 else if(!strcmp(argv
[3], "intr")){
4034 mtk_test_dbg( "Rx INTERRUPT transfer\n");
4035 transfer_type_2
= EPATT_INT
;
4037 else if(!strcmp(argv
[3], "isoc")){
4038 mtk_test_dbg( "Rx ISOC transfer\n");
4039 transfer_type_2
= EPATT_ISO
;
4043 ep_1_num
= (int)simple_strtol(argv
[4], &argv
[4], 10);
4046 ep_2_num
= (int)simple_strtol(argv
[5], &argv
[5], 10);
4049 if(!strcmp(argv
[6], "OUT")){
4052 urb_dir_1
= URB_DIR_OUT
;
4057 urb_dir_1
= URB_DIR_IN
;
4061 if(!strcmp(argv
[7], "OUT")){
4064 urb_dir_2
= URB_DIR_OUT
;
4069 urb_dir_2
= URB_DIR_IN
;
4073 maxp_1
= (int)simple_strtol(argv
[8], &argv
[8], 10);
4076 maxp_2
= (int)simple_strtol(argv
[9], &argv
[9], 10);
4079 gpd_buf_size
= (int)simple_strtol(argv
[10], &argv
[10], 10);
4082 bd_buf_size
= (int)simple_strtol(argv
[11], &argv
[11], 10);
4085 stop_count_1
= (int)simple_strtol(argv
[12], &argv
[12], 10);
4088 stop_count_2
= (int)simple_strtol(argv
[13], &argv
[13], 10);
4091 ret
=dev_config_ep(ep_1_num
,dev_dir_1
,transfer_type_1
,maxp_1
, bInterval
,mult_dev
,burst
,0, NULL
);
4094 mtk_test_dbg( "config dev EP fail!!\n");
4098 ret
=dev_config_ep(ep_2_num
,dev_dir_2
,transfer_type_2
,maxp_2
, bInterval
,mult_dev
,burst
,0, NULL
);
4101 mtk_test_dbg( "config dev EP fail!!\n");
4105 ret
= f_config_ep(ep_1_num
,dir_1
,transfer_type_1
,maxp_1
,bInterval
,8,0, NULL
,0);
4108 mtk_test_dbg( "config EP fail!!\n");
4112 ret
= f_config_ep(ep_2_num
,dir_2
,transfer_type_2
,maxp_2
,bInterval
,8,0, NULL
,1);
4115 mtk_test_dbg( "config EP fail!!\n");
4120 length
= gpd_buf_size
;
4122 ret
=dev_random_stop(length
, gpd_buf_size
, bd_buf_size
, dev_dir_1
, dev_dir_2
, stop_count_1
, stop_count_2
);
4124 mtk_test_dbg( "random stop request failed!!!!!!!!!!\n");
4127 ret
= f_random_stop(ep_1_num
, ep_2_num
, stop_count_1
, stop_count_2
, urb_dir_1
, urb_dir_2
, length
);
4134 static int t_ring_random_ring_doorbell(int argc
, char** argv
){
4135 int ep_num
, ep_dir
, ep_index
;
4136 struct xhci_hcd
*xhci
;
4142 if(!strcmp(argv
[1], "out")){
4143 mtk_test_dbg( "OUT EP\n");
4146 else if(!strcmp(argv
[1], "in")){
4147 mtk_test_dbg( "IN EP\n");
4152 ep_num
= (int)simple_strtol(argv
[2], &argv
[2], 10);
4153 mtk_test_dbg( "ep num set to %d\n", ep_num
);
4159 if(ep_dir
== EPADD_OUT
){
4160 ep_index
= ep_num
* 2 - 1;
4163 ep_index
= ep_num
* 2;
4166 xhci
= hcd_to_xhci(my_hcd
);
4167 f_add_random_ring_doorbell_thread(xhci
, g_slot_id
, ep_index
);
4171 static int t_power_random_access_regs(int argc
, char** argv
){
4172 int port_id
, port_rev
, power_required
;
4173 struct xhci_hcd
*xhci
;
4176 mtk_test_dbg( "arg: port_id port_rev is_power_required\n");
4178 port_id
= (int)simple_strtol(argv
[1], &argv
[1], 10);
4179 port_rev
= (int)simple_strtol(argv
[2], &argv
[2], 10);
4180 if(!strcmp(argv
[3], "true")){
4186 xhci
= hcd_to_xhci(my_hcd
);
4187 f_add_random_access_reg_thread(xhci
, port_id
, port_rev
, power_required
);
4191 static int t_ring_random_stop_ep(int argc
, char** argv
){
4192 int ep_num
, ep_dir
, ep_index
;
4193 struct xhci_hcd
*xhci
;
4199 if(!strcmp(argv
[1], "out")){
4200 mtk_test_dbg( "OUT EP\n");
4203 else if(!strcmp(argv
[1], "in")){
4204 mtk_test_dbg( "IN EP\n");
4209 ep_num
= (int)simple_strtol(argv
[2], &argv
[2], 10);
4210 mtk_test_dbg( "ep num set to %d\n", ep_num
);
4216 if(ep_dir
== EPADD_OUT
){
4217 ep_index
= ep_num
* 2 - 1;
4220 ep_index
= ep_num
* 2;
4223 xhci
= hcd_to_xhci(my_hcd
);
4224 g_test_random_stop_ep
= true;
4225 f_add_random_stop_ep_thread(xhci
, g_slot_id
, ep_index
);
4229 static int t_loopback_configep(int argc
, char** argv
){
4238 transfer_type
= EPATT_BULK
;
4247 if(!strcmp(argv
[1], "bulk")){
4248 mtk_test_dbg( "Test bulk transfer\n");
4249 transfer_type
= EPATT_BULK
;
4251 else if(!strcmp(argv
[1], "intr")){
4252 mtk_test_dbg( "Test intr transfer\n");
4253 transfer_type
= EPATT_INT
;
4255 else if(!strcmp(argv
[1], "isoc")){
4256 mtk_test_dbg( "Test isoc transfer\n");
4257 transfer_type
= EPATT_ISO
;
4261 if(!strcmp(argv
[2], "out")){
4262 mtk_test_dbg( "OUT EP\n");
4265 else if(!strcmp(argv
[2], "in")){
4266 mtk_test_dbg( "IN EP\n");
4271 maxp
= (int)simple_strtol(argv
[3], &argv
[3], 10);
4272 mtk_test_dbg( "maxp set to %d\n", maxp
);
4275 bInterval
= (int)simple_strtol(argv
[4], &argv
[4], 10);
4276 mtk_test_dbg( "interval set to %d\n", bInterval
);
4279 ep_num
= (int)simple_strtol(argv
[5], &argv
[5], 10);
4280 mtk_test_dbg( "ep num set to %d\n", ep_num
);
4283 is_config
= (int)simple_strtol(argv
[6], &argv
[6], 10);
4284 mtk_test_dbg( "is_config set to %d\n", is_config
);
4287 burst
= (int)simple_strtol(argv
[7], &argv
[7], 10);
4288 mtk_test_dbg( "burst set to %d\n", burst
);
4291 mult
= (int)simple_strtol(argv
[8], &argv
[8], 10);
4292 mtk_test_dbg( "mult set to %d\n", mult
);
4294 return f_config_ep(ep_num
, ep_dir
, transfer_type
, maxp
, bInterval
,burst
,mult
, NULL
, is_config
);
4297 static int t_loopback_deconfigep(int argc
, char** argv
){
4311 if(!strcmp(argv
[1], "out")){
4312 mtk_test_dbg( "OUT EP\n");
4315 else if(!strcmp(argv
[1], "in")){
4316 mtk_test_dbg( "IN EP\n");
4319 else if(!strcmp(argv
[1], "all")){
4320 mtk_test_dbg( "all EP\n");
4326 ep_num
= (int)simple_strtol(argv
[2], &argv
[2], 10);
4327 mtk_test_dbg( "ep num set to %d\n", ep_num
);
4330 is_config
= (int)simple_strtol(argv
[3], &argv
[3], 10);
4331 mtk_test_dbg( "is_config set to %d\n", is_config
);
4333 f_deconfig_ep(is_all
, ep_num
, ep_dir
, NULL
, is_config
);
4336 static int t_loopback_loop(int argc
, char** argv
){
4337 int ret
,length
,start_add
;
4339 int gpd_buf_size
,bd_buf_size
;
4340 int ep_out_num
, ep_in_num
;
4344 int dram_offset
, extension
;
4347 speed
= DEV_SPEED_HIGH
;
4357 length
= (int)simple_strtol(argv
[1], &argv
[1], 10);
4358 mtk_test_dbg( "length set to %d\n", length
);
4361 start_add
= (int)simple_strtol(argv
[2], &argv
[2], 10);
4362 mtk_test_dbg( "start add offset set to %d\n", start_add
);
4365 ep_out_num
= (int)simple_strtol(argv
[3], &argv
[3], 10);
4366 mtk_test_dbg( "ep out num set to %d\n", ep_out_num
);
4369 ep_in_num
= (int)simple_strtol(argv
[4], &argv
[4], 10);
4370 mtk_test_dbg( "ep in num set to %d\n", ep_in_num
);
4374 round
= (int)simple_strtol(argv
[5], &argv
[5], 10);
4375 mtk_test_dbg( "Execute %d round\n", round
);
4379 sg_len
= (int)simple_strtol(argv
[6], &argv
[6], 10);
4380 mtk_test_dbg( "sg_len set to %d\n", sg_len
);
4384 gpd_buf_size
=length
;
4386 //TODO: device should turn off extension length feature
4388 if(((length
-10)%(bd_buf_size
+6))<7){
4392 for(i
=0; i
<round
; i
++){
4395 length
= (get_random_int() % 65535) + 1;
4396 start_add
= get_random_int() % 64;
4397 gpd_buf_size
= length
;
4398 mtk_test_dbg( "ROUND[%d] length[%d] start_add[%d]\n", i
, length
, start_add
);
4400 ret
=dev_loopback(bdp
,length
,gpd_buf_size
,bd_buf_size
,dram_offset
,extension
,NULL
);
4403 mtk_test_dbg( "loopback request fail!!\n");
4407 ret
= f_loopback_loop(ep_out_num
, ep_in_num
, length
, start_add
,NULL
);
4410 ret
= f_loopback_sg_loop(ep_out_num
,ep_in_num
,length
,start_add
,sg_len
,NULL
);
4414 mtk_test_dbg( "loopback fail!!\n");
4415 mtk_test_dbg( "length : %d\n",length
);
4419 /* ==phase 3: get device status==*/
4420 ret
=dev_polling_status(NULL
);
4423 mtk_test_dbg( "query request fail!!\n");
4430 static int t_power_suspend(int argc
, char** argv
){
4431 return f_power_suspend();
4434 static int t_power_resume(int argc
, char** argv
){
4435 return f_power_resume();
4438 static int t_power_suspendport(int argc
, char** argv
){
4442 struct xhci_hcd
*xhci
;
4444 port_id
= g_port_id
;
4447 port_id
= (int)simple_strtol(argv
[1], &argv
[1], 10);
4450 xhci
= hcd_to_xhci(my_hcd
);
4452 addr
= &xhci
->op_regs
->port_status_base
+ NUM_PORT_REGS
*(port_id
-1 & 0xff);
4453 temp
= xhci_readl(xhci
, addr
);
4454 xhci_dbg(xhci
, "before reset port %d = 0x%x\n", port_id
-1, temp
);
4455 temp
= mtktest_xhci_port_state_to_neutral(temp
);
4456 temp
= (temp
& ~(0xf << 5));
4457 temp
= (temp
| (3 << 5) | PORT_LINK_STROBE
);
4458 xhci_writel(xhci
, temp
, addr
);
4459 mtk_xhci_handshake(xhci
, addr
, (15<<5), (3<<5), 30*1000);
4460 temp
= xhci_readl(xhci
, addr
);
4461 if(PORT_PLS_VALUE(temp
) != 3){
4462 xhci_err(xhci
, "port not enter U3 state\n");
4468 static int t_power_resumeport(int argc
, char** argv
){
4473 struct xhci_hcd
*xhci
;
4475 port_id
= g_port_id
;
4478 port_id
= (int)simple_strtol(argv
[1], &argv
[1], 10);
4481 xhci
= hcd_to_xhci(my_hcd
);
4483 addr
= &xhci
->op_regs
->port_status_base
+ NUM_PORT_REGS
*(port_id
-1 & 0xff);
4484 temp
= xhci_readl(xhci
, addr
);
4485 xhci_dbg(xhci
, "before reset port %d = 0x%x\n", port_id
-1, temp
);
4486 if(PORT_PLS(temp
) != (3 << 5)){
4487 xhci_err(xhci
, "port not in U3 state\n");
4491 temp
= mtktest_xhci_port_state_to_neutral(temp
);
4492 temp
= (temp
& ~(0xf << 5));
4494 if(DEV_SUPERSPEED(temp
)){
4495 //superspeed direct set U0
4496 temp
= (temp
| PORT_LINK_STROBE
);
4497 xhci_writel(xhci
, temp
, addr
);
4500 //HS/FS, set resume for 20ms, then set U0
4501 temp
= (temp
| (15 << 5) | PORT_LINK_STROBE
);
4502 xhci_writel(xhci
, temp
, addr
);
4504 temp
= xhci_readl(xhci
, addr
);
4505 temp
= mtktest_xhci_port_state_to_neutral(temp
);
4506 temp
= (temp
& ~(0xf << 5));
4507 temp
= (temp
| PORT_LINK_STROBE
);
4508 xhci_writel(xhci
, temp
, addr
);
4510 for(i
=0; i
<200; i
++){
4511 temp
= xhci_readl(xhci
, addr
);
4512 if(PORT_PLS_VALUE(temp
) == 0){
4518 if(PORT_PLS_VALUE(temp
) != 0){
4519 xhci_err(xhci
, "port not return U0 state\n");
4526 static int t_power_remotewakeup(int argc
, char** argv
){
4527 return f_power_remotewakeup();
4530 static int t_power_u1u2(int argc
, char** argv
){
4539 u_num
= (int)simple_strtol(argv
[1], &argv
[1], 10);
4540 // xhci_dbg(xhci, "u_num set to %d\n", u_num);
4543 value1
= (int)simple_strtol(argv
[2], &argv
[2], 10);
4544 // xhci_dbg(xhci, "value1 set to %d\n", value1);
4547 value2
= (int)simple_strtol(argv
[3], &argv
[3], 10);
4548 // xhci_dbg(xhci, "value2 set to %d\n", value2);
4551 return f_power_set_u1u2(u_num
, value1
, value2
);
4556 f_power_reset_u1u2_counter(1);
4557 f_power_reset_u1u2_counter(2);
4561 else if (u_num
== 5){
4563 mtk_test_dbg( "u1 counter = %d\n", f_power_get_u1u2_counter(1));
4564 mtk_test_dbg( "u2 counter = %d\n", f_power_get_u1u2_counter(2));
4570 static int t_power_u2_lpm(int argc
, char** argv
){
4572 int hle
, rwe
, hirdm
, besl
, besld
, pdn
, int_nak_active
, bulk_nyet_active
;
4575 hle
= (int)simple_strtol(argv
[1], &argv
[1], 10);
4578 rwe
= (int)simple_strtol(argv
[2], &argv
[2], 10);
4581 hirdm
= (int)simple_strtol(argv
[3], &argv
[3], 10);
4584 L1_timeout
= (int)simple_strtol(argv
[4], &argv
[4], 10);
4587 besl
= (int)simple_strtol(argv
[5], &argv
[5], 10);
4590 besld
= (int)simple_strtol(argv
[6], &argv
[6], 10);
4593 pdn
= (int)simple_strtol(argv
[7], &argv
[7], 10);
4596 int_nak_active
= (int)simple_strtol(argv
[8], &argv
[8], 10);
4599 bulk_nyet_active
= (int)simple_strtol(argv
[9], &argv
[9], 10);
4603 f_power_config_lpm(g_slot_id
, hirdm
, L1_timeout
, rwe
, besl
, besld
, hle
, int_nak_active
, bulk_nyet_active
);
4608 static int t_power_u2_swlpm(int argc
, char** argv
){
4611 struct xhci_hcd
*xhci
;
4620 //0:resume 1:accept, 2:NYET, 3:STALL, 4:timeout, 5:remote_wakeup, 6:reset counter, 7:print counter
4621 expected_L1S
= (int)simple_strtol(argv
[1], &argv
[1], 10);
4623 if(expected_L1S
== 5){
4628 if(expected_L1S
== 6){
4629 f_power_reset_L1_counter(1);
4630 f_power_reset_L1_counter(2);
4633 if(expected_L1S
== 7){
4635 mtk_test_dbg( "L1 entr counter = %d\n", f_power_get_L1_counter(1));
4636 mtk_test_dbg( "L1 exit counter = %d\n", f_power_get_L1_counter(2));
4640 xhci
= hcd_to_xhci(my_hcd
);
4642 num_u3_port
= SSUSB_U3_PORT_NUM(readl(SSUSB_IP_CAP
));
4643 mtktest_enablePortClockPower((g_port_id
-1-num_u3_port
), 0x2);
4645 addr
= &xhci
->op_regs
->port_status_base
+ NUM_PORT_REGS
*((g_port_id
-1) & 0xff);
4646 temp
= xhci_readl(xhci
, addr
);
4647 temp
= mtktest_xhci_port_state_to_neutral(temp
);
4648 temp
= (temp
& ~(0xf << 5));
4649 if(expected_L1S
== 0){
4650 temp
= (temp
| PORT_LINK_STROBE
);
4651 xhci_writel(xhci
, temp
, addr
);
4652 ret
= mtk_xhci_handshake(xhci
, addr
, (0xf << 5), expected_L1S
, ATTACH_TIMEOUT
);
4654 xhci_err(xhci
, "resume failed\n");
4661 temp
= (temp
| (0xf << 5) | PORT_LINK_STROBE
);
4662 xhci_writel(xhci
, temp
, addr
);
4664 temp
= xhci_readl(xhci
, addr
);
4665 temp
= mtktest_xhci_port_state_to_neutral(temp
);
4666 temp
= (temp
& ~(0xf << 5));
4667 temp
= (temp
| PORT_LINK_STROBE
);
4668 xhci_writel(xhci
, temp
, addr
);
4669 ret
= mtk_xhci_handshake(xhci
, addr
, (0xf << 5), expected_L1S
, ATTACH_TIMEOUT
);
4671 xhci_err(xhci
, "resume failed\n");
4680 /* if expected_L1S != 1, go into L1 state */
4681 temp
= (temp
| (2 << 5) | PORT_LINK_STROBE
);
4686 xhci_writel(xhci
, temp
, addr
);
4687 addr
= &xhci
->op_regs
->port_power_base
+ NUM_PORT_REGS
*((g_port_id
-1) & 0xff);
4688 /* check L1 status of PORTPMSC */
4689 ret
= mtk_xhci_handshake(xhci
, addr
, 0x7, expected_L1S
, ATTACH_TIMEOUT
);
4691 xhci_err(xhci
, "L1S doesn't as expected, expected[%d], actual[%d]\n"
4692 , expected_L1S
, xhci_readl(xhci
, addr
));
4695 if(expected_L1S
== 2 || expected_L1S
== 3 || expected_L1S
== 4){
4696 if(g_port_plc
== 0){
4697 xhci_err(xhci
, "Doesn't get port PLC event\n");
4701 if(expected_L1S
== 1){
4702 mtktest_disablePortClockPower((g_port_id
-1-num_u3_port
), 0x2);
4707 wait_event_on_timeout(&g_port_plc
, 1, 5000);
4708 if(g_port_plc
== 0){
4709 xhci_err(xhci
, "No port state change event\n");
4712 addr
= &xhci
->op_regs
->port_status_base
+ NUM_PORT_REGS
*((g_port_id
-1) & 0xff);
4713 ret
= mtk_xhci_handshake(xhci
, addr
, (0xf << 5), 0, ATTACH_TIMEOUT
);
4715 xhci_err(xhci
, "Remote wakeup failed\n");
4718 addr
= &xhci
->op_regs
->port_status_base
+ NUM_PORT_REGS
*((g_port_id
-1) & 0xff);
4719 ret
= mtk_xhci_handshake(xhci
, addr
, (0xf << 5), 0, ATTACH_TIMEOUT
);
4721 xhci_err(xhci
, "Remote wakeup failed\n");
4728 static int t_power_fla(int argc
, char** argv
){
4733 fla_value
= (int)simple_strtol(argv
[1], &argv
[1], 10);
4734 xhci_dbg(xhci
, "fla_value set to %d\n", fla_value
);
4736 return f_power_send_fla(fla_value
);
4739 static int t_power_occ(int argc
, char** argv
){
4743 struct xhci_hcd
*xhci
;
4744 struct xhci_port
*port
;
4747 xhci
= hcd_to_xhci(my_hcd
);
4750 g_num_u3_port
= SSUSB_U3_PORT_NUM(readl(SSUSB_IP_CAP
));
4751 g_num_u2_port
= SSUSB_U2_PORT_NUM(readl(SSUSB_IP_CAP
));
4752 //disable U2 port first
4753 for(i
=1; i
<=g_num_u2_port
; i
++){
4754 port_id
=i
+g_num_u3_port
;
4755 addr
= &xhci
->op_regs
->port_status_base
+ NUM_PORT_REGS
*(port_id
-1 & 0xff);
4756 temp
= xhci_readl(xhci
, addr
);
4757 temp
= mtktest_xhci_port_state_to_neutral(temp
);
4758 temp
&= ~PORT_POWER
;
4759 xhci_writel(xhci
, temp
, addr
);
4767 if(g_port_occ
== true){
4771 mtk_test_dbg( "[ERROR] doesn't get over-current event\n");
4775 //turn on PP, re-enable device
4776 //disable slot, port connection, enable...
4777 xhci
= hcd_to_xhci(my_hcd
);
4778 addr
= &xhci
->op_regs
->port_status_base
+ NUM_PORT_REGS
*(g_port_id
-1 & 0xff);
4779 temp
= xhci_readl(xhci
, addr
);
4780 if((temp
& PORT_POWER
)){
4781 mtk_test_dbg( "[ERROR] port_power bit is still 1\n");
4789 addr
= &xhci
->op_regs
->port_status_base
+ NUM_PORT_REGS
*(g_port_id
-1 & 0xff);
4790 temp
= xhci_readl(xhci
, addr
);
4791 //start_port_reenabled(0, DEV_SPEED_SUPER);
4793 port
->port_status
= DISCONNECTED
;
4797 temp
= temp
| PORT_POWER
;
4798 xhci_writel(xhci
, temp
, addr
);
4799 if(f_enable_port(0) != RET_SUCCESS
){
4800 mtk_test_dbg( "[ERROR] port not reconnectted after set PP\n");
4802 ret
= f_enable_slot(NULL
);
4803 ret
= f_address_slot(false, NULL
);
4808 static int t_ring_enlarge(int argc
, char** argv
){
4809 int ep_dir
, ep_num
, ep_index
, dev_num
, slot_id
;
4810 struct xhci_hcd
*xhci
;
4811 struct usb_host_endpoint
*ep
;
4812 struct xhci_virt_device
*virt_dev
;
4813 struct usb_device
*udev
, *rhdev
;
4814 struct xhci_ring
*ep_ring
;
4815 struct xhci_segment
*next
, *prev
;
4825 if(!strcmp(argv
[1], "out")){
4826 mtk_test_dbg( "OUT EP\n");
4829 else if(!strcmp(argv
[1], "in")){
4830 mtk_test_dbg( "IN EP\n");
4835 ep_num
= (int)simple_strtol(argv
[2], &argv
[2], 10);
4836 xhci_dbg(xhci
, "ep_num set to %d\n", ep_num
);
4839 dev_num
= (int)simple_strtol(argv
[3], &argv
[3], 10);
4840 xhci_dbg(xhci
, "dev_num set to %d\n", dev_num
);
4843 xhci
= hcd_to_xhci(my_hcd
);
4845 rhdev
= my_hcd
->self
.root_hub
;
4846 udev
= rhdev
->children
[g_port_id
-1];
4847 slot_id
= udev
->slot_id
;
4850 udev
= dev_list
[dev_num
-1];
4851 slot_id
= udev
->slot_id
;
4853 virt_dev
= xhci
->devs
[udev
->slot_id
];
4854 if(ep_dir
== EPADD_OUT
){
4855 ep
= udev
->ep_out
[ep_num
];
4858 ep
= udev
->ep_in
[ep_num
];
4860 ep_index
= mtktest_xhci_get_endpoint_index(&ep
->desc
);
4861 ep_ring
= (&(virt_dev
->eps
[ep_index
]))->ring
;
4863 prev
= ep_ring
->enq_seg
;
4864 next
= mtktest_xhci_segment_alloc(xhci
, GFP_NOIO
);
4865 next
->next
= prev
->next
;
4866 next
->trbs
[TRBS_PER_SEGMENT
-1].link
.segment_ptr
= prev
->next
->dma
;
4867 val
= next
->trbs
[TRBS_PER_SEGMENT
-1].link
.control
;
4868 val
&= ~TRB_TYPE_BITMASK
;
4869 val
|= TRB_TYPE(TRB_LINK
);
4871 next
->trbs
[TRBS_PER_SEGMENT
-1].link
.control
= val
;
4872 xhci_dbg(xhci
, "Linking segment 0x%llx to segment 0x%llx (DMA)\n",
4873 (unsigned long long)prev
->dma
,
4874 (unsigned long long)next
->dma
);
4876 if(ep_ring
->cycle_state
== 1){
4882 for(i
=0; i
<TRBS_PER_SEGMENT
; i
++){
4883 val
= next
->trbs
[i
].generic
.field
[3];
4890 next
->trbs
[i
].generic
.field
[3] = val
;
4891 xhci_dbg(xhci
, "Set new segment trb %d cycle bit 0x%x\n", i
, val
);
4893 mtktest_xhci_link_segments(xhci
, prev
, next
, true);
4894 if(prev
->trbs
[TRBS_PER_SEGMENT
-1].link
.control
& LINK_TOGGLE
){
4895 val
= prev
->trbs
[TRBS_PER_SEGMENT
-1].link
.control
;
4896 val
&= ~LINK_TOGGLE
;
4897 prev
->trbs
[TRBS_PER_SEGMENT
-1].link
.control
= val
;
4898 val
= next
->trbs
[TRBS_PER_SEGMENT
-1].link
.control
;
4900 next
->trbs
[TRBS_PER_SEGMENT
-1].link
.control
= val
;
4905 static int t_ring_shrink(int argc
, char**argv
){
4906 int ep_dir
, ep_num
, ep_index
, dev_num
, slot_id
;
4907 struct xhci_hcd
*xhci
;
4908 struct usb_host_endpoint
*ep
;
4909 struct xhci_virt_device
*virt_dev
;
4910 struct usb_device
*udev
, *rhdev
;
4911 struct xhci_ring
*ep_ring
;
4912 struct xhci_segment
*next
, *prev
;
4922 if(!strcmp(argv
[1], "out")){
4923 mtk_test_dbg( "OUT EP\n");
4926 else if(!strcmp(argv
[1], "in")){
4927 mtk_test_dbg( "IN EP\n");
4932 ep_num
= (int)simple_strtol(argv
[2], &argv
[2], 10);
4933 xhci_dbg(xhci
, "ep_num set to %d\n", ep_num
);
4936 dev_num
= (int)simple_strtol(argv
[3], &argv
[3], 10);
4937 xhci_dbg(xhci
, "dev_num set to %d\n", dev_num
);
4940 xhci
= hcd_to_xhci(my_hcd
);
4942 rhdev
= my_hcd
->self
.root_hub
;
4943 udev
= rhdev
->children
[g_port_id
-1];
4944 slot_id
= udev
->slot_id
;
4947 udev
= dev_list
[dev_num
-1];
4948 slot_id
= udev
->slot_id
;
4950 virt_dev
= xhci
->devs
[udev
->slot_id
];
4951 if(ep_dir
== EPADD_OUT
){
4952 ep
= udev
->ep_out
[ep_num
];
4955 ep
= udev
->ep_in
[ep_num
];
4958 ep_index
= mtktest_xhci_get_endpoint_index(&ep
->desc
);
4959 ep_ring
= (&(virt_dev
->eps
[ep_index
]))->ring
;
4961 prev
= ep_ring
->enq_seg
;
4964 mtk_test_dbg( "This is the last segment, can not be remove\n");
4967 if(prev
->trbs
[TRBS_PER_SEGMENT
-1].link
.control
& LINK_TOGGLE
){
4968 ep_ring
->first_seg
= next
->next
;
4970 else if(next
->trbs
[TRBS_PER_SEGMENT
-1].link
.control
& LINK_TOGGLE
){
4971 val
= prev
->trbs
[TRBS_PER_SEGMENT
-1].link
.control
;
4973 prev
->trbs
[TRBS_PER_SEGMENT
-1].link
.control
= val
;
4975 mtktest_xhci_link_segments(xhci
, prev
, next
->next
, true);
4976 mtktest_xhci_segment_free(xhci
, next
);
4980 static int t_ring_stop_ep(int argc
, char** argv
){
4981 int ep_dir
, ep_num
, ep_index
, dev_num
, slot_id
;
4982 struct xhci_hcd
*xhci
;
4983 struct usb_host_endpoint
*ep
;
4984 struct xhci_virt_device
*virt_dev
;
4985 struct usb_device
*udev
, *rhdev
;
4992 if(!strcmp(argv
[1], "out")){
4993 mtk_test_dbg( "OUT EP\n");
4996 else if(!strcmp(argv
[1], "in")){
4997 mtk_test_dbg( "IN EP\n");
5002 ep_num
= (int)simple_strtol(argv
[2], &argv
[2], 10);
5003 xhci_dbg(xhci
, "ep_num set to %d\n", ep_num
);
5006 dev_num
= (int)simple_strtol(argv
[3], &argv
[3], 10);
5007 xhci_dbg(xhci
, "dev_num set to %d\n", dev_num
);
5010 xhci
= hcd_to_xhci(my_hcd
);
5012 rhdev
= my_hcd
->self
.root_hub
;
5013 udev
= rhdev
->children
[g_port_id
-1];
5014 slot_id
= udev
->slot_id
;
5017 udev
= dev_list
[dev_num
-1];
5018 slot_id
= udev
->slot_id
;
5020 virt_dev
= xhci
->devs
[udev
->slot_id
];
5021 if(ep_dir
== EPADD_OUT
){
5022 ep
= udev
->ep_out
[ep_num
];
5025 ep
= udev
->ep_in
[ep_num
];
5027 ep_index
= mtktest_xhci_get_endpoint_index(&ep
->desc
);
5028 return f_ring_stop_ep(slot_id
, ep_index
);
5032 static int t_ring_stop_cmd(int argc
, char** argv
){
5033 return f_ring_stop_cmd();
5036 static int t_ring_abort_cmd_add(int argc
, char** argv
){
5038 struct xhci_hcd
*xhci
;
5039 struct usb_device
*udev
, *rhdev
;
5040 struct xhci_virt_device
*virt_dev
;
5042 ret
= f_enable_port(0);
5043 if(ret
!= RET_SUCCESS
){
5046 ret
= f_enable_slot(NULL
);
5047 if(ret
!= RET_SUCCESS
){
5051 //queue address slot command but not waiting for cmd complete
5052 xhci
= hcd_to_xhci(my_hcd
);
5053 rhdev
= my_hcd
->self
.root_hub
;
5054 udev
= rhdev
->children
[g_port_id
-1];
5055 mtktest_xhci_setup_addressable_virt_dev(xhci
, udev
);
5056 virt_dev
= xhci
->devs
[udev
->slot_id
];
5057 ret
= mtktest_xhci_queue_address_device(xhci
, virt_dev
->in_ctx
->dma
, udev
->slot_id
, false);
5059 //abort command ring right now
5060 return f_ring_abort_cmd();
5063 static int t_ring_intr_moderation(int argc
, char** argv
){
5067 struct xhci_hcd
*xhci
;
5069 xhci
= hcd_to_xhci(my_hcd
);
5073 intr_mod_value
= (int)simple_strtol(argv
[1], &argv
[1], 10);
5074 xhci_dbg(xhci
, "intr_mod_value set to %d\n", intr_mod_value
);
5077 temp
= xhci_readl(xhci
, &xhci
->ir_set
->irq_control
);
5079 temp
|=intr_mod_value
;
5080 xhci_writel(xhci
, temp
, &xhci
->ir_set
->irq_control
);
5082 for(i
=0; i
<1000; i
++){
5083 mtktest_mtk_xhci_setup_one_noop(xhci
);
5086 xhci_err(xhci
, "interrupt handler executed %ld times\n", g_intr_handled
);
5087 g_intr_handled
= -1;
5091 static int t_ring_er_full(int argc
, char** argv
){
5093 struct xhci_hcd
*xhci
;
5096 union xhci_trb
*event
;
5098 g_event_full
= true;
5100 mtk_test_dbg( "[ERROR]host controller driver not initiated\n");
5103 xhci
= hcd_to_xhci(my_hcd
);
5105 //turn off interrupt first
5106 temp
= xhci_readl(xhci
, &xhci
->op_regs
->command
);
5108 xhci_dbg(xhci
, "// Disable interrupts, cmd = 0x%x.\n", temp
);
5109 xhci_writel(xhci
, temp
, &xhci
->op_regs
->command
);
5110 //continuous queue no-op command
5112 event
= xhci
->event_ring
->dequeue
;
5113 struct xhci_generic_trb
*event_trb
= &event
->generic
;
5114 if((event
->event_cmd
.flags
& TRB_CYCLE
) == xhci
->event_ring
->cycle_state
){
5115 xhci_dbg(xhci
, "SW own current event\n");
5116 if(GET_COMP_CODE(event_trb
->field
[2]) == COMP_ER_FULL
){
5117 xhci_dbg(xhci
, "Got event ring full\n");
5121 xhci_dbg(xhci
, "Increase command ring dequeue pointer\n");
5122 mtktest_inc_deq(xhci
, xhci
->cmd_ring
, false);
5124 mtktest_inc_deq(xhci
, xhci
->event_ring
, true);
5126 xhci_dbg(xhci
, "Queue No-Op command\n");
5128 mtktest_mtk_xhci_setup_one_noop(xhci
);
5134 static int t_ring_idt(int argc
, char** argv
){
5135 //do loopback set IDT
5136 int ret
,length
,start_add
;
5138 int gpd_buf_size
,bd_buf_size
;
5142 int ep_out_num
, ep_in_num
;
5144 int mult_dev
, mult
, burst
;
5146 struct xhci_hcd
*xhci
;
5148 struct usb_device
*udev
, *rhdev
;
5150 struct urb
*urb_tx
, *urb_rx
;
5151 int iso_num_packets
;
5152 struct usb_host_endpoint
*ep_tx
, *ep_rx
;
5153 int max_esit_payload
;
5154 void *buffer_tx
, *buffer_rx
;
5155 dma_addr_t mapping_tx
, mapping_rx
;
5158 speed
= DEV_SPEED_SUPER
;
5159 transfer_type
= EPATT_BULK
;
5170 gpd_buf_size
= 65535;
5173 start_port_reenabled(0, speed
);
5174 ret
=dev_reset(speed
, NULL
);
5176 mtk_test_dbg( "device reset failed!!!!!!!!!!\n");
5180 ret
= f_disable_slot();
5182 mtk_test_dbg( "disable slot failed!!!!!!!!!!\n");
5186 ret
= f_reenable_port(0);
5187 if(ret
!= RET_SUCCESS
){
5188 mtk_test_dbg( "device reenable failed!!!!!!!!!!\n");
5192 ret
= f_enable_slot(NULL
);
5194 mtk_test_dbg( "enable slot failed!!!!!!!!!!\n");
5198 ret
=f_address_slot(false, NULL
);
5200 mtk_test_dbg( "address slot failed!!!!!!!!!!\n");
5204 /* ==phase 1 : config EP==*/
5205 ret
=dev_config_ep(ep_out_num
,USB_RX
,transfer_type
,maxp
,bInterval
,mult_dev
,burst
,mult
,NULL
);
5208 mtk_test_dbg( "config dev EP fail!!\n");
5211 ret
=dev_config_ep(ep_in_num
,USB_TX
,transfer_type
,maxp
,bInterval
,mult_dev
,burst
,mult
,NULL
);
5214 mtk_test_dbg( "config dev EP fail!!\n");
5218 ret
= f_config_ep(ep_out_num
,EPADD_OUT
,transfer_type
,maxp
,bInterval
,burst
,mult
, NULL
,0);
5221 mtk_test_dbg( "config EP fail!!\n");
5225 ret
= f_config_ep(ep_in_num
,EPADD_IN
,transfer_type
,maxp
,bInterval
,burst
,mult
, NULL
,1);
5228 mtk_test_dbg( "config EP fail!!\n");
5231 g_idt_transfer
= true;
5233 ret
=dev_loopback(bdp
,length
,gpd_buf_size
,bd_buf_size
,0,0,NULL
);
5236 mtk_test_dbg( "loopback request fail!!\n");
5240 ret
= f_loopback_loop_gpd(ep_out_num
, ep_in_num
, length
, start_add
, gpd_buf_size
, NULL
);
5242 mtk_test_dbg( "loopback fail!!\n");
5246 g_idt_transfer
= false;
5251 static int t_ring_bei(int argc
, char** argv
){
5252 //do loopback set BEI
5253 //after tx round should not get URB complete status
5254 //queue no-op without set BEI
5255 //get URB complete status
5256 //do the same to Rx round
5257 int ret
,length
,start_add
;
5259 int gpd_buf_size
,bd_buf_size
;
5263 int ep_out_num
, ep_in_num
;
5265 int mult_dev
, mult
, burst
;
5267 struct xhci_hcd
*xhci
;
5269 struct usb_device
*udev
, *rhdev
;
5271 struct urb
*urb_tx
, *urb_rx
;
5272 int iso_num_packets
;
5273 struct usb_host_endpoint
*ep_tx
, *ep_rx
;
5274 int max_esit_payload
;
5275 void *buffer_tx
, *buffer_rx
;
5276 dma_addr_t mapping_tx
, mapping_rx
;
5279 speed
= DEV_SPEED_SUPER
;
5280 transfer_type
= EPATT_BULK
;
5291 gpd_buf_size
= 65535;
5295 start_port_reenabled(0, speed
);
5296 ret
=dev_reset(speed
, NULL
);
5298 mtk_test_dbg( "device reset failed!!!!!!!!!!\n");
5302 ret
= f_disable_slot();
5304 mtk_test_dbg( "disable slot failed!!!!!!!!!!\n");
5308 ret
= f_reenable_port(0);
5309 if(ret
!= RET_SUCCESS
){
5310 mtk_test_dbg( "device reenable failed!!!!!!!!!!\n");
5314 ret
= f_enable_slot(NULL
);
5316 mtk_test_dbg( "enable slot failed!!!!!!!!!!\n");
5320 ret
=f_address_slot(false, NULL
);
5322 mtk_test_dbg( "address slot failed!!!!!!!!!!\n");
5326 /* ==phase 1 : config EP==*/
5327 ret
=dev_config_ep(ep_out_num
,USB_RX
,transfer_type
,maxp
,bInterval
,mult_dev
,burst
,mult
,NULL
);
5330 mtk_test_dbg( "config dev EP fail!!\n");
5333 ret
=dev_config_ep(ep_in_num
,USB_TX
,transfer_type
,maxp
,bInterval
,mult_dev
,burst
,mult
,NULL
);
5336 mtk_test_dbg( "config dev EP fail!!\n");
5340 ret
= f_config_ep(ep_out_num
,EPADD_OUT
,transfer_type
,maxp
,bInterval
,burst
,mult
, NULL
,0);
5343 mtk_test_dbg( "config EP fail!!\n");
5347 ret
= f_config_ep(ep_in_num
,EPADD_IN
,transfer_type
,maxp
,bInterval
,burst
,mult
, NULL
,1);
5350 mtk_test_dbg( "config EP fail!!\n");
5355 ret
=dev_loopback(bdp
,length
,gpd_buf_size
,bd_buf_size
,0,0,NULL
);
5358 mtk_test_dbg( "loopback request fail!!\n");
5363 iso_num_packets
= 0;
5364 xhci
= hcd_to_xhci(my_hcd
);
5365 dev
= xhci_to_hcd(xhci
)->self
.controller
;//dma stream buffer
5366 rhdev
= my_hcd
->self
.root_hub
;
5367 udev
= rhdev
->children
[g_port_id
-1];
5368 ep_tx
= udev
->ep_out
[ep_out_num
];
5369 ep_rx
= udev
->ep_in
[ep_in_num
];
5372 buffer_tx
= kmalloc(length
, GFP_KERNEL
);
5373 mapping_tx
= dma_map_single(dev
, buffer_tx
,length
, DMA_BIDIRECTIONAL
);
5374 urb_tx
= usb_alloc_urb(iso_num_packets
, GFP_KERNEL
);
5375 f_fill_urb_with_buffer(urb_tx
, ep_out_num
, length
, buffer_tx
5376 , start_add
, URB_DIR_OUT
, iso_num_packets
, max_esit_payload
, mapping_tx
, udev
);
5378 xhci_err(xhci
, "[ERROR]fill tx urb Error!!\n");
5381 ret
= f_queue_urb(urb_tx
,0,NULL
);
5383 xhci_err(xhci
, "[ERROR]queue tx urb Error!!\n");
5387 if(urb_tx
->status
== 0){
5388 xhci_err(xhci
, "URB_TX status become 0, BEI seems doesn't work\n");
5392 mtktest_mtk_xhci_setup_one_noop(xhci
);
5394 if(urb_tx
->status
!= 0){
5395 xhci_err(xhci
, "URB_TX status doesn't become 0 after interrupt\n");
5398 usb_free_urb(urb_tx
);
5400 buffer_rx
= kmalloc(length
, GFP_KERNEL
);
5401 memset(buffer_rx
, 0, length
);
5402 mapping_rx
= dma_map_single(dev
, buffer_rx
,length
, DMA_BIDIRECTIONAL
);
5403 urb_rx
= usb_alloc_urb(iso_num_packets
, GFP_KERNEL
);
5404 f_fill_urb_with_buffer(urb_rx
, ep_in_num
, length
, buffer_rx
5405 , start_add
, URB_DIR_IN
, iso_num_packets
, max_esit_payload
, mapping_rx
,udev
);
5407 xhci_err(xhci
, "[ERROR]fill tx urb Error!!\n");
5410 ret
= f_queue_urb(urb_rx
,0,NULL
);
5412 xhci_err(xhci
, "[ERROR]queue rx urb Error!!\n");
5416 if(urb_rx
->status
== 0){
5417 xhci_err(xhci
, "URB_RX status become 0, BEI seems doesn't work\n");
5421 mtktest_mtk_xhci_setup_one_noop(xhci
);
5423 if(urb_tx
->status
!= 0){
5424 xhci_err(xhci
, "URB_RX status doesn't become 0 after interrupt\n");
5427 urb_rx
->transfer_buffer
= NULL
;
5428 urb_rx
->transfer_dma
= NULL
;
5429 usb_free_urb(urb_rx
);
5438 static int t_ring_noop_transfer(int argc
, char** argv
){
5439 int ret
,length
,start_add
;
5441 int gpd_buf_size
,bd_buf_size
;
5445 int ep_out_num
, ep_in_num
;
5447 int mult_dev
, mult
, burst
;
5449 struct xhci_hcd
*xhci
;
5451 struct usb_device
*udev
, *rhdev
;
5453 struct urb
*urb_tx1
, *urb_tx2
, *urb_rx1
, *urb_rx2
;
5454 int iso_num_packets
;
5455 struct usb_host_endpoint
*ep_tx
, *ep_rx
;
5456 int max_esit_payload
;
5457 void *buffer_tx1
, *buffer_tx2
, *buffer_rx1
, *buffer_rx2
;
5458 dma_addr_t mapping_tx1
, mapping_tx2
, mapping_rx1
, mapping_rx2
;
5461 speed
= DEV_SPEED_SUPER
;
5462 transfer_type
= EPATT_BULK
;
5473 gpd_buf_size
= 65535;
5477 start_port_reenabled(0, speed
);
5478 ret
=dev_reset(speed
, NULL
);
5480 mtk_test_dbg( "device reset failed!!!!!!!!!!\n");
5484 ret
= f_disable_slot();
5486 mtk_test_dbg( "disable slot failed!!!!!!!!!!\n");
5490 ret
= f_reenable_port(0);
5491 if(ret
!= RET_SUCCESS
){
5492 mtk_test_dbg( "device reenable failed!!!!!!!!!!\n");
5496 ret
= f_enable_slot(NULL
);
5498 mtk_test_dbg( "enable slot failed!!!!!!!!!!\n");
5502 ret
=f_address_slot(false, NULL
);
5504 mtk_test_dbg( "address slot failed!!!!!!!!!!\n");
5508 /* ==phase 1 : config EP==*/
5509 ret
=dev_config_ep(ep_out_num
,USB_RX
,transfer_type
,maxp
,bInterval
,mult_dev
,burst
,mult
,NULL
);
5512 mtk_test_dbg( "config dev EP fail!!\n");
5515 ret
=dev_config_ep(ep_in_num
,USB_TX
,transfer_type
,maxp
,bInterval
,mult_dev
,burst
,mult
,NULL
);
5518 mtk_test_dbg( "config dev EP fail!!\n");
5522 ret
= f_config_ep(ep_out_num
,EPADD_OUT
,transfer_type
,maxp
,bInterval
,burst
,mult
, NULL
,0);
5525 mtk_test_dbg( "config EP fail!!\n");
5529 ret
= f_config_ep(ep_in_num
,EPADD_IN
,transfer_type
,maxp
,bInterval
,burst
,mult
, NULL
,1);
5532 mtk_test_dbg( "config EP fail!!\n");
5536 ret
=dev_loopback(bdp
,length
,gpd_buf_size
,bd_buf_size
,0,0,NULL
);
5539 mtk_test_dbg( "loopback request fail!!\n");
5544 //queue 2 URB, the first is false, and doesn't ring doorbell
5546 iso_num_packets
= 0;
5547 xhci
= hcd_to_xhci(my_hcd
);
5548 dev
= xhci_to_hcd(xhci
)->self
.controller
;//dma stream buffer
5549 rhdev
= my_hcd
->self
.root_hub
;
5550 udev
= rhdev
->children
[g_port_id
-1];
5551 ep_tx
= udev
->ep_out
[ep_out_num
];
5552 ep_rx
= udev
->ep_in
[ep_in_num
];
5556 buffer_tx1
= kmalloc(1000, GFP_KERNEL
);
5557 mapping_tx1
= dma_map_single(dev
, buffer_tx1
,1000, DMA_BIDIRECTIONAL
);
5558 urb_tx1
= usb_alloc_urb(iso_num_packets
, GFP_KERNEL
);
5559 f_fill_urb_with_buffer(urb_tx1
, ep_out_num
, 1000, buffer_tx1
5560 , start_add
, URB_DIR_OUT
, iso_num_packets
, max_esit_payload
, mapping_tx1
, udev
);
5562 xhci_err(xhci
, "[ERROR]fill tx urb Error!!\n");
5566 g_td_to_noop
= true;
5567 ret
= f_queue_urb(urb_tx1
,0,NULL
);
5569 xhci_err(xhci
, "[ERROR]queue tx urb Error!!\n");
5572 g_td_to_noop
= false;
5575 buffer_tx2
= kmalloc(length
, GFP_KERNEL
);
5576 mapping_tx2
= dma_map_single(dev
, buffer_tx2
,length
, DMA_BIDIRECTIONAL
);
5577 urb_tx2
= usb_alloc_urb(iso_num_packets
, GFP_KERNEL
);
5578 f_fill_urb_with_buffer(urb_tx2
, ep_out_num
, length
, buffer_tx2
5579 , start_add
, URB_DIR_OUT
, iso_num_packets
, max_esit_payload
, mapping_tx2
, udev
);
5581 xhci_err(xhci
, "[ERROR]fill tx urb Error!!\n");
5584 ret
= f_queue_urb(urb_tx2
,1,NULL
);
5586 xhci_err(xhci
, "[ERROR]queue tx urb Error!!\n");
5589 urb_tx1
->transfer_buffer
= NULL
;
5590 urb_tx2
->transfer_buffer
= NULL
;
5591 urb_tx1
->transfer_dma
= NULL
;
5592 urb_tx2
->transfer_dma
= NULL
;
5593 usb_free_urb(urb_tx1
);
5594 usb_free_urb(urb_tx2
);
5597 buffer_rx1
= kmalloc(1000, GFP_KERNEL
);
5598 memset(buffer_rx1
, 0, 1000);
5599 mapping_rx1
= dma_map_single(dev
, buffer_rx1
,1000, DMA_BIDIRECTIONAL
);
5600 urb_rx1
= usb_alloc_urb(iso_num_packets
, GFP_KERNEL
);
5601 f_fill_urb_with_buffer(urb_rx1
, ep_in_num
, 1000, buffer_rx1
5602 , start_add
, URB_DIR_IN
, iso_num_packets
, max_esit_payload
, mapping_rx1
,udev
);
5604 xhci_err(xhci
, "[ERROR]fill tx urb Error!!\n");
5607 g_td_to_noop
= true;
5608 ret
= f_queue_urb(urb_rx1
,0,NULL
);
5610 xhci_err(xhci
, "[ERROR]queue rx urb Error!!\n");
5613 g_td_to_noop
= false;
5616 buffer_rx2
= kmalloc(length
, GFP_KERNEL
);
5617 memset(buffer_rx2
, 0, length
);
5618 mapping_rx2
= dma_map_single(dev
, buffer_rx2
,length
, DMA_BIDIRECTIONAL
);
5619 urb_rx2
= usb_alloc_urb(iso_num_packets
, GFP_KERNEL
);
5620 f_fill_urb_with_buffer(urb_rx2
, ep_in_num
, length
, buffer_rx2
5621 , start_add
, URB_DIR_IN
, iso_num_packets
, max_esit_payload
, mapping_rx2
,udev
);
5623 xhci_err(xhci
, "[ERROR]fill tx urb Error!!\n");
5627 ret
= f_queue_urb(urb_rx2
,1,NULL
);
5629 xhci_err(xhci
, "[ERROR]queue rx urb Error!!\n");
5633 urb_rx1
->transfer_buffer
= NULL
;
5634 urb_rx1
->transfer_dma
= NULL
;
5635 urb_rx2
->transfer_buffer
= NULL
;
5636 urb_rx2
->transfer_dma
= NULL
;
5637 usb_free_urb(urb_rx1
);
5638 usb_free_urb(urb_rx2
);
5648 static int t_hub_selsuspendss(int argc
, char** argv
){
5649 int hub_num
, port_num
;
5655 if(argc
> 1){ //hub number
5656 hub_num
= (int)simple_strtol(argv
[1], &argv
[1], 10);
5657 xhci_dbg(xhci
, "hub_num set to %d\n", hub_num
);
5659 if(argc
> 2){ //port number
5660 port_num
= (int)simple_strtol(argv
[2], &argv
[2], 10);
5661 xhci_dbg(xhci
, "port_num set to %d\n", port_num
);
5663 return f_hub_setportfeature(hub_num
, HUB_FEATURE_PORT_LINK_STATE
, port_num
| (3<<8));
5666 static int t_hub_selsuspend(int argc
, char** argv
){
5667 int hub_num
, port_num
;
5673 speed
= USB_SPEED_HIGH
;
5675 if(argc
> 1){ //hub number
5676 hub_num
= (int)simple_strtol(argv
[1], &argv
[1], 10);
5677 xhci_dbg(xhci
, "hub_num set to %d\n", hub_num
);
5679 if(argc
> 2){ //port number
5680 port_num
= (int)simple_strtol(argv
[2], &argv
[2], 10);
5681 xhci_dbg(xhci
, "port_num set to %d\n", port_num
);
5684 if(!strcmp(argv
[3], "ss")){
5685 mtk_test_dbg( "SUPERSPEED\n");
5686 speed
= USB_SPEED_SUPER
;
5689 if(speed
== USB_SPEED_HIGH
){
5690 return f_hub_setportfeature(hub_num
, HUB_FEATURE_PORT_SUSPEND
, port_num
);
5692 else if(speed
== USB_SPEED_SUPER
){
5693 return f_hub_setportfeature(hub_num
, HUB_FEATURE_PORT_LINK_STATE
, port_num
| (3<<8));
5696 mtk_test_dbg( "Error speed value\n");
5701 static int t_hub_selresume(int argc
, char** argv
){
5703 int hub_num
, port_num
;
5709 speed
= USB_SPEED_HIGH
;
5711 if(argc
> 1){ //hub number
5712 hub_num
= (int)simple_strtol(argv
[1], &argv
[1], 10);
5713 xhci_dbg(xhci
, "hub_num set to %d\n", hub_num
);
5715 if(argc
> 2){ //port number
5716 port_num
= (int)simple_strtol(argv
[2], &argv
[2], 10);
5717 xhci_dbg(xhci
, "port_num set to %d\n", port_num
);
5720 if(!strcmp(argv
[3], "ss")){
5721 mtk_test_dbg( "SUPERSPEED\n");
5722 speed
= USB_SPEED_SUPER
;
5725 if(speed
== USB_SPEED_HIGH
){
5726 return f_hub_clearportfeature(hub_num
, HUB_FEATURE_PORT_SUSPEND
, port_num
);
5728 else if(speed
== USB_SPEED_SUPER
){
5729 return f_hub_setportfeature(hub_num
, HUB_FEATURE_PORT_LINK_STATE
, port_num
);
5732 mtk_test_dbg( "Error speed value\n");
5736 static int t_hub_configurehub(int argc
, char** argv
){
5738 struct xhci_hcd
*xhci
;
5739 struct usb_device
*udev
, *rhdev
;
5740 struct xhci_virt_device
*virt_dev
;
5741 struct xhci_command
*config_cmd
;
5742 struct xhci_input_control_ctx
*ctrl_ctx
;
5743 struct xhci_slot_ctx
*slot_ctx
;
5746 struct xhci_port
*port
;
5750 mtk_test_dbg( "my_hcd is NULL\n");
5754 port_index
= (int)simple_strtol(argv
[1], &argv
[1], 10);
5755 xhci_dbg(xhci
, "port_index set to %d\n", port_index
);
5757 xhci
= hcd_to_xhci(my_hcd
);
5758 ret
= f_enable_port(port_index
);
5759 if(ret
!= RET_SUCCESS
){
5760 xhci_err(xhci
, "[ERROR] enable port failed\n");
5763 port
= rh_port
[port_index
];
5764 xhci_err(xhci
, "Port[%d] speed: %d\n", port_index
, port
->port_speed
);
5765 ret
= f_enable_slot(NULL
);
5766 if(ret
!= RET_SUCCESS
){
5767 xhci_err(xhci
, "[ERROR] enable slot failed\n");
5770 ret
= f_address_slot(false, NULL
);
5771 if(ret
!= RET_SUCCESS
){
5772 xhci_err(xhci
, "[ERROR] address device failed\n");
5775 rhdev
= my_hcd
->self
.root_hub
;
5776 udev
= rhdev
->children
[port
->port_id
-1];
5777 virt_dev
= xhci
->devs
[udev
->slot_id
];
5779 hdev_list
[port_index
] = udev
;
5780 f_update_hub_device(udev
, 4);
5781 if(f_hub_configep(port_index
+1, port_index
) != RET_SUCCESS
){
5782 xhci_err(xhci
, "config hub endpoint failed\n");
5785 mtktest_xhci_dbg_slot_ctx(xhci
, virt_dev
->out_ctx
);
5787 for(i
=1; i
<=4; i
++){
5788 if(f_hub_setportfeature((port_index
+1), HUB_FEATURE_PORT_POWER
, i
) != RET_SUCCESS
){
5789 xhci_err(xhci
, "[ERROR] set port_power 1 failed\n");
5793 //clear C_PORT_CONNECTION
5794 for(i
=1; i
<=4; i
++){
5795 if(f_hub_clearportfeature((port_index
+1), HUB_FEATURE_C_PORT_CONNECTION
, i
) != RET_SUCCESS
){
5796 xhci_err(xhci
, "[ERROR] clear c_port_connection failed\n");
5803 static int t_hub_ixia_stress(int argc
, char** argv
){
5804 struct xhci_hcd
*xhci
;
5810 dev_count
= (int)simple_strtol(argv
[1], &argv
[1], 10);
5811 xhci_dbg(xhci
, "dev_count set to %d\n", dev_count
);
5814 xhci
= hcd_to_xhci(my_hcd
);
5815 for(i
=0; i
<dev_count
; i
++){
5816 f_add_ixia_thread(xhci
,i
+1, ix_dev_list
[i
]);
5821 static int t_hub_loop_stress(int argc
, char** argv
){
5822 struct xhci_hcd
*xhci
;
5824 int dev_count
, ep_count
;
5826 struct usb_device
*udev
;
5827 struct usb_host_endpoint
*ep
;
5835 dev_count
= (int)simple_strtol(argv
[1], &argv
[1], 10);
5836 xhci_dbg(xhci
, "dev_count set to %d\n", dev_count
);
5839 ep_count
= (int)simple_strtol(argv
[2], &argv
[2], 10);
5840 xhci_dbg(xhci
, "ep_count set to %d\n", ep_count
);
5843 if(!strcmp(argv
[3], "true")){
5848 for(i
=0; i
<dev_count
; i
++){
5850 ret
=dev_stress(0,GPD_LENGTH
,GPD_LENGTH
,0,ep_count
, udev
);
5852 mtk_test_dbg( "stress request failed!!!!!!!!!!\n");
5856 for(i
=0; i
<dev_count
; i
++){
5858 for(j
=1; j
<=ep_count
; j
++){
5859 ep
= udev
->ep_out
[j
];
5860 maxp
= ep
->desc
.wMaxPacketSize
& 0x7ff;
5861 f_add_str_threads(i
,j
,maxp
,true, udev
, isEP0
);
5867 static int t_hub_loop(int argc
, char** argv
){
5868 struct usb_device
*udev
;
5869 int ret
,length
,start_add
;
5871 int gpd_buf_size
,bd_buf_size
;
5872 int ep_out_num
, ep_in_num
;
5875 int hub_num
, port_num
, dev_num
, round
, i
;
5876 int dram_offset
, extension
;
5886 if(argc
> 1){ //hub number
5887 hub_num
= (int)simple_strtol(argv
[1], &argv
[1], 10);
5888 xhci_dbg(xhci
, "hub_num set to %d\n", hub_num
);
5890 if(argc
> 2){ //port number
5891 port_num
= (int)simple_strtol(argv
[2], &argv
[2], 10);
5892 xhci_dbg(xhci
, "port_num set to %d\n", port_num
);
5894 if(argc
> 3){ //device number
5895 dev_num
= (int)simple_strtol(argv
[3], &argv
[3], 10);
5896 xhci_dbg(xhci
, "dev_num set to %d\n", dev_num
);
5899 length
= (int)simple_strtol(argv
[4], &argv
[4], 10);
5900 mtk_test_dbg( "length set to %d\n", length
);
5903 ep_out_num
= (int)simple_strtol(argv
[5], &argv
[5], 10);
5904 mtk_test_dbg( "ep out num set to %d\n", ep_out_num
);
5907 ep_in_num
= (int)simple_strtol(argv
[6], &argv
[6], 10);
5908 mtk_test_dbg( "ep in num set to %d\n", ep_in_num
);
5911 round
= (int)simple_strtol(argv
[7], &argv
[7], 10);
5912 mtk_test_dbg( "Execute %d round\n", round
);
5915 sg_len
= (int)simple_strtol(argv
[8], &argv
[8], 10);
5916 mtk_test_dbg( "sg_len %d\n", sg_len
);
5920 gpd_buf_size
=0xFC00;
5922 udev
= dev_list
[dev_num
-1];
5923 //TODO: device should turn off extension length feature
5925 if(((length
-10)%(bd_buf_size
+6))<7){
5930 if(ep_out_num
== 0 || ep_in_num
== 0){
5932 ret
= dev_ctrl_loopback(length
, udev
);
5934 mtk_test_dbg( "Control loopback failed!!\n");
5940 for(i
=0; i
<round
; i
++){
5941 length
= get_random_int() % 2048;
5942 length
= length
- (length
%4);
5945 mtk_test_dbg( "Loopback control length[%d]\n", length
);
5946 ret
= dev_ctrl_loopback(length
, udev
);
5948 mtk_test_dbg( "Control loopback failed!!\n");
5956 ret
=dev_loopback(bdp
,length
,gpd_buf_size
,bd_buf_size
,dram_offset
,extension
,udev
);
5959 mtk_test_dbg( "loopback request fail!!\n");
5963 ret
= f_loopback_loop(ep_out_num
, ep_in_num
, length
, start_add
,udev
);
5966 ret
= f_loopback_sg_loop(ep_out_num
,ep_in_num
, length
, start_add
5969 ret
=dev_polling_status(udev
);
5972 mtk_test_dbg( "query request fail!!\n");
5977 for(i
=0; i
<round
; i
++){
5978 length
= (get_random_int() % 3072/*65535 for bulk, 3072 for intr*/) + 1;
5979 start_add
= (get_random_int() % 63) + 1;
5980 sg_len
= (get_random_int() % 9) * 8/*512 for bulk, 8 for intr*/;
5981 mtk_test_dbg( "Loopback length[%d] start_add[%d] sg_len[%d]\n", length
, start_add
, sg_len
);
5982 if((sg_len
!= 0) && (length
/sg_len
) > 61){
5984 mtk_test_dbg( "SKIP\n");
5987 ret
=dev_loopback(bdp
,length
,gpd_buf_size
,bd_buf_size
,dram_offset
,extension
,udev
);
5990 mtk_test_dbg( "loopback request fail!!\n");
5994 ret
= f_loopback_loop(ep_out_num
, ep_in_num
, length
, start_add
,udev
);
5997 ret
= f_loopback_sg_loop(ep_out_num
,ep_in_num
, length
, start_add
6002 mtk_test_dbg( "loopback fail!!\n");
6003 mtk_test_dbg( "length : %d\n",length
);
6007 /* ==phase 3: get device status==*/
6008 ret
=dev_polling_status(udev
);
6011 mtk_test_dbg( "query request fail!!\n");
6018 static int t_hub_configuresubhub(int argc
, char** argv
){
6019 int parent_hub_num
, hub_num
, port_num
;
6020 struct xhci_hcd
*xhci
;
6021 xhci
= hcd_to_xhci(my_hcd
);
6023 hub_num
= parent_hub_num
+1;
6024 // hdev = hdev_list[parent_hub_num-1];
6026 parent_hub_num
= (int)simple_strtol(argv
[1], &argv
[1], 10);
6027 xhci_dbg(xhci
, "parent_hub_num set to %d\n", parent_hub_num
);
6030 hub_num
= (int)simple_strtol(argv
[2], &argv
[2], 10);
6031 xhci_dbg(xhci
, "hub_num set to %d\n", hub_num
);
6034 port_num
= (int)simple_strtol(argv
[3], &argv
[3], 10);
6035 xhci_dbg(xhci
, "port_num set to %d\n", port_num
);
6037 return f_hub_config_subhub(parent_hub_num
, hub_num
, port_num
);
6040 static int t_hub_configure_eth_device(int argc
, char** argv
){
6041 int hub_num
, port_num
, dev_num
;
6046 if(argc
> 1){ //hub number
6047 hub_num
= (int)simple_strtol(argv
[1], &argv
[1], 10);
6048 xhci_dbg(xhci
, "hub_num set to %d\n", hub_num
);
6050 if(argc
> 2){ //port number
6051 port_num
= (int)simple_strtol(argv
[2], &argv
[2], 10);
6052 xhci_dbg(xhci
, "port_num set to %d\n", port_num
);
6054 if(argc
> 3){ //device number
6055 dev_num
= (int)simple_strtol(argv
[3], &argv
[3], 10);
6056 xhci_dbg(xhci
, "dev_num set to %d\n", dev_num
);
6059 ret
= f_hub_configuredevice(hub_num
, port_num
, dev_num
6060 , 0, 0, 0, false, false, 0);
6063 mtk_test_dbg( "Config device failed\n");
6066 ret
= f_hub_configure_eth_device(hub_num
, port_num
, dev_num
);
6069 mtk_test_dbg( "Config eth device failed\n");
6075 static int t_hub_configuredevice(int argc
, char** argv
){
6076 int hub_num
, port_num
, dev_num
;
6077 int transfer_type
, bInterval
, maxp
;
6078 char is_config_ep
, is_stress
;
6085 transfer_type
= EPATT_BULK
;
6088 is_config_ep
= true;
6091 if(argc
> 1){ //hub number
6092 hub_num
= (int)simple_strtol(argv
[1], &argv
[1], 10);
6093 xhci_dbg(xhci
, "hub_num set to %d\n", hub_num
);
6095 if(argc
> 2){ //port number
6096 port_num
= (int)simple_strtol(argv
[2], &argv
[2], 10);
6097 xhci_dbg(xhci
, "port_num set to %d\n", port_num
);
6099 if(argc
> 3){ //device number
6100 dev_num
= (int)simple_strtol(argv
[3], &argv
[3], 10);
6101 xhci_dbg(xhci
, "dev_num set to %d\n", dev_num
);
6103 if(argc
> 4){ //transfer type
6104 if(!strcmp(argv
[4], "bulk")){
6105 transfer_type
= EPATT_BULK
;
6106 xhci_dbg(xhci
, "transfer type set to BULK\n");
6108 else if(!strcmp(argv
[4], "intr")){
6109 xhci_dbg(xhci
, "transfer type set to INTR\n");
6110 transfer_type
= EPATT_INT
;
6112 else if(!strcmp(argv
[4], "iso")){
6113 xhci_dbg(xhci
, "transfer type set to ISO\n");
6114 transfer_type
= EPATT_ISO
;
6116 else if(!strcmp(argv
[4], "stress1")){
6117 xhci_dbg(xhci
, "transfer type set to STRESS1 BULK+INT\n");
6120 is_config_ep
= false;
6122 else if(!strcmp(argv
[4], "stress2")){
6123 xhci_dbg(xhci
, "transfer type set to STRESS2 BULK_ISO\n");
6126 is_config_ep
= false;
6130 is_config_ep
= false;
6132 if(argc
> 5){ //maxp
6133 maxp
= (int)simple_strtol(argv
[5], &argv
[5], 10);
6134 xhci_dbg(xhci
, "maxp set to %d\n", maxp
);
6136 if(argc
> 6){ //interval
6137 bInterval
= (int)simple_strtol(argv
[6], &argv
[6], 10);
6138 xhci_dbg(xhci
, "bInterval set to %d\n", bInterval
);
6141 return f_hub_configuredevice(hub_num
, port_num
, dev_num
6142 , transfer_type
, maxp
, bInterval
, is_config_ep
, is_stress
, stress_config
);
6145 static int t_hub_reset_dev(int argc
, char** argv
){
6146 struct xhci_hcd
*xhci
;
6147 int hub_num
, port_num
, dev_num
;
6148 int transfer_type
, bInterval
, maxp
;
6149 struct usb_device
*udev
;
6150 USB_DEV_SPEED speed
;
6157 xhci
= hcd_to_xhci(my_hcd
);
6158 if(argc
> 1){ //hub number
6159 hub_num
= (int)simple_strtol(argv
[1], &argv
[1], 10);
6160 xhci_dbg(xhci
, "hub_num set to %d\n", hub_num
);
6162 if(argc
> 2){ //port number
6163 port_num
= (int)simple_strtol(argv
[2], &argv
[2], 10);
6164 xhci_dbg(xhci
, "port_num set to %d\n", port_num
);
6166 if(argc
> 3){ //device number
6167 dev_num
= (int)simple_strtol(argv
[3], &argv
[3], 10);
6168 xhci_dbg(xhci
, "dev_num set to %d\n", dev_num
);
6171 if(!strcmp(argv
[4], "hs")){
6172 mtk_test_dbg( "[DEV]Reset device to high speed\n");
6173 speed
= DEV_SPEED_HIGH
;
6175 else if(!strcmp(argv
[4], "fs")){
6176 mtk_test_dbg( "[DEV]Reset device to full speed\n");
6177 speed
= DEV_SPEED_FULL
;
6181 udev
= dev_list
[dev_num
-1];
6182 g_slot_id
= udev
->slot_id
;
6183 ret
= dev_reset(speed
,udev
);
6184 if(f_hub_clearportfeature(hub_num
, HUB_FEATURE_PORT_POWER
, dev_num
) != RET_SUCCESS
){
6185 xhci_err(xhci
, "[ERROR] clear port_power %d failed\n", dev_num
);
6189 if(f_hub_setportfeature(hub_num
, HUB_FEATURE_PORT_POWER
, dev_num
) != RET_SUCCESS
){
6190 xhci_err(xhci
, "[ERROR] set port_power %d failed\n", dev_num
);
6193 if(f_hub_clearportfeature(hub_num
, HUB_FEATURE_C_PORT_CONNECTION
, dev_num
) != RET_SUCCESS
){
6194 xhci_err(xhci
, "[ERROR] clear c_port_connection failed\n");
6198 dev_list
[dev_num
-1] = NULL
;
6202 static int t_hub_queue_intr(int argc
, char** argv
){
6205 struct usb_device
*hdev
;
6206 struct xhci_hcd
*xhci
;
6208 struct usb_host_endpoint
*ep
;
6209 int ep_index
, data_length
;
6211 xhci
= hcd_to_xhci(my_hcd
);
6212 hdev
= hdev_list
[0];
6213 ep
= hdev
->ep_in
[1];
6214 ep_index
= mtktest_xhci_get_endpoint_index(&ep
->desc
);
6215 urb
= usb_alloc_urb(0, GFP_KERNEL
);
6218 ret
= f_fill_urb(urb
,1,data_length
,0,URB_DIR_IN
, 0, 2, hdev
);
6220 xhci_err(xhci
, "[ERROR]fill urb Error!!\n");
6223 ret
= f_queue_urb(urb
,0,hdev
);
6225 xhci_err(xhci
, "[ERROR]urb transfer failed!!\n");
6231 static int t_hub_remotewakeup_dev(int argc
, char** argv
){
6232 int hub_num
, port_num
, dev_num
;
6233 int transfer_type
, bInterval
, maxp
;
6234 struct usb_device
*udev
;
6235 USB_DEV_SPEED speed
;
6238 int bdp
, gpd_buf_size
, bd_buf_size
;
6241 gpd_buf_size
=0xFC00;
6249 if(argc
> 1){ //hub number
6250 hub_num
= (int)simple_strtol(argv
[1], &argv
[1], 10);
6251 xhci_dbg(xhci
, "hub_num set to %d\n", hub_num
);
6253 if(argc
> 2){ //port number
6254 port_num
= (int)simple_strtol(argv
[2], &argv
[2], 10);
6255 xhci_dbg(xhci
, "port_num set to %d\n", port_num
);
6257 if(argc
> 3){ //device number
6258 dev_num
= (int)simple_strtol(argv
[3], &argv
[3], 10);
6259 xhci_dbg(xhci
, "dev_num set to %d\n", dev_num
);
6262 length
= (int)simple_strtol(argv
[4], &argv
[4], 10);
6263 mtk_test_dbg( "length set to %d\n", length
);
6266 udev
= dev_list
[dev_num
-1];
6267 g_slot_id
= udev
->slot_id
;
6268 return dev_remotewakeup(0);
6271 #define HUB_FEATURE_PORT_U1_TIMEOUT 23
6272 #define HUB_FEATURE_PORT_U2_TIMEOUT 24
6274 static int t_hub_set_u1u2(int argc
, char** argv
){
6275 int u_num
, value1
, value2
, value
;
6276 int feature_selector
;
6287 u_num
= (int)simple_strtol(argv
[1], &argv
[1], 10);
6288 xhci_dbg(xhci
, "u_num set to %d\n", u_num
);
6291 value1
= (int)simple_strtol(argv
[2], &argv
[2], 10);
6292 xhci_dbg(xhci
, "value1 set to %d\n", value1
);
6295 value2
= (int)simple_strtol(argv
[3], &argv
[3], 10);
6296 xhci_dbg(xhci
, "value2 set to %d\n", value2
);
6299 port_num
= (int)simple_strtol(argv
[4], &argv
[4], 10);
6300 xhci_dbg(xhci
, "port_num set to %d\n", port_num
);
6304 feature_selector
= HUB_FEATURE_PORT_U1_TIMEOUT
;
6307 else if(u_num
== 2){
6308 feature_selector
= HUB_FEATURE_PORT_U2_TIMEOUT
;
6312 f_hub_setportfeature(1, feature_selector
, (port_num
| (value
<<8)));
6316 #define HUB_FEATURE_FORCE_LINKPM_ACCEPT 30
6317 static int t_hub_force_pm(int argc
, char** argv
){
6318 f_hub_sethubfeature(1, HUB_FEATURE_FORCE_LINKPM_ACCEPT
);
6322 static int t_dev_notification(int argc
, char** argv
){
6333 mtk_test_dbg( "[ERROR] device not reset\n");
6337 mtk_test_dbg( "[ERROR] slot not enabled\n");
6341 //[DEV_NOTIF_FUNC_WAKE: 1]; [DEV_NOTIF_LTM: 2];
6342 //[DEV_NOTIF_BUS_INT_ADJ: 3];[VENDOR_DEV_TEST: 4]
6343 type
= (int)simple_strtol(argv
[1], &argv
[1], 10);
6346 value
= (int)simple_strtol(argv
[2], &argv
[2], 10);
6348 f_enable_dev_note();
6349 g_dev_notification
= 256;
6350 g_dev_not_value
= 0;
6351 // type_value = type+1;
6352 //TODO: device notification interface has been modified
6353 ret
= dev_notifiaction(type
,value
& 0xffffffff,(value
>> 32) & 0xffffffff);
6356 mtk_test_dbg( "set device notification failed!!\n");
6359 ret
=dev_polling_status(NULL
);
6362 mtk_test_dbg( "query request fail!!\n");
6365 ret
= wait_event_on_timeout(&g_dev_notification
, type
,CMD_TIMEOUT
);
6367 mtk_test_dbg( "device notification event not received!!\n");
6370 if(g_dev_not_value
!= value
){
6371 mtk_test_dbg( "device notification value error, expected %d, recived %ld!!\n", value
, g_dev_not_value
);
6377 static int t_dev_init(int argc
, char** argv
){
6378 if(u3auto_hcd_reset() != RET_SUCCESS
)
6382 static int t_dev_u1u2(int argc
, char** argv
){
6388 struct usb_device
*udev
;
6398 value1
= (int)simple_strtol(argv
[1], &argv
[1], 10);
6399 xhci_dbg(xhci
, "u1 value set to %d\n", value1
);
6402 value2
= (int)simple_strtol(argv
[2], &argv
[2], 10);
6403 xhci_dbg(xhci
, "u2 value set to %d\n", value2
);
6406 en_u1
= (int)simple_strtol(argv
[3], &argv
[3], 10);
6407 xhci_dbg(xhci
, "en_u1 set to %d\n", en_u1
);
6410 en_u2
= (int)simple_strtol(argv
[4], &argv
[4], 10);
6411 xhci_dbg(xhci
, "en_u2 set to %d\n", en_u2
);
6414 dev_num
= (int)simple_strtol(argv
[5], &argv
[5], 10);
6415 udev
= dev_list
[dev_num
-1];
6418 mode
= (int)simple_strtol(argv
[6], &argv
[6], 10);
6420 return dev_power(mode
, value1
, value2
, en_u1
, en_u2
, udev
);
6423 static int t_dev_lpm(int argc
, char** argv
){
6425 int lpm_mode
, wakeup
, beslck
, beslck_u3
, beslckd
, cond
, cond_en
;
6436 lpm_mode
= (int)simple_strtol(argv
[1], &argv
[1], 10);
6439 wakeup
= (int)simple_strtol(argv
[2], &argv
[2], 10);
6442 beslck
= (int)simple_strtol(argv
[3], &argv
[3], 10);
6445 beslck_u3
= (int)simple_strtol(argv
[4], &argv
[4], 10);
6448 beslckd
= (int)simple_strtol(argv
[5], &argv
[5], 10);
6451 cond
= (int)simple_strtol(argv
[6], &argv
[6], 10);
6454 cond_en
= (int)simple_strtol(argv
[7], &argv
[7], 10);
6457 dev_lpm_config_host(lpm_mode
, wakeup
, beslck
, beslck_u3
, beslckd
, cond
, cond_en
);
6460 static int t_dev_reset(int argc
, char** argv
){
6461 USB_DEV_SPEED speed
;
6466 mtk_test_dbg( "[ERROR] device not reset\n");
6470 mtk_test_dbg( "[ERROR] slot not enabled\n");
6473 speed
= DEV_SPEED_HIGH
;
6475 if(!strcmp(argv
[1], "ss")){
6476 mtk_test_dbg( "[DEV]Reset device to super speed\n");
6477 speed
= DEV_SPEED_SUPER
;
6479 if(!strcmp(argv
[1], "hs")){
6480 mtk_test_dbg( "[DEV]Reset device to high speed\n");
6481 speed
= DEV_SPEED_HIGH
;
6483 else if(!strcmp(argv
[1], "fs")){
6484 mtk_test_dbg( "[DEV]Reset device to full speed\n");
6485 speed
= DEV_SPEED_FULL
;
6488 start_port_reenabled(0, speed
);
6489 ret
= dev_reset(speed
,NULL
);
6491 mtk_test_dbg( "[ERROR] reset device failed\n");
6494 ret
= f_disable_slot();
6496 mtk_test_dbg( "disable slot failed!!!!!!!!!!\n");
6499 ret
= f_reenable_port(0);
6501 mtk_test_dbg( "[ERROR] port reenable failed\n");
6504 ret
= f_enable_slot(NULL
);
6506 mtk_test_dbg( "enable slot failed!!!!!!!!!!\n");
6510 ret
=f_address_slot(false, NULL
);
6512 mtk_test_dbg( "address slot failed!!!!!!!!!!\n");
6515 //reset SW scheduler algorithm
6516 mtktest_mtk_xhci_scheduler_init();
6520 static int t_dev_query_status(int argc
, char** argv
){
6522 mtk_test_dbg( "[ERROR] device not reset\n");
6526 mtk_test_dbg( "[ERROR] slot not enabled\n");
6529 return dev_query_status(NULL
);
6532 static int t_dev_polling_status(int argc
, char** argv
){
6534 mtk_test_dbg( "[ERROR] device not reset\n");
6538 mtk_test_dbg( "[ERROR] slot not enabled\n");
6541 return dev_polling_status(NULL
);
6544 static int t_dev_config_ep(int argc
, char** argv
){
6550 int mult_dev
, burst
, mult
;
6553 mtk_test_dbg( "[ERROR] device not reset\n");
6557 mtk_test_dbg( "[ERROR] slot not enabled\n");
6560 //ep_out_num,USB_RX,transfer_type,maxp,bInterval
6571 ep_num
= (int)simple_strtol(argv
[1], &argv
[1], 10);
6572 mtk_test_dbg( "ep_num set to %d\n", ep_num
);
6575 if(!strcmp(argv
[2], "tx")){
6576 mtk_test_dbg( "TX endpoint\n");
6579 else if(!strcmp(argv
[2], "rx")){
6580 mtk_test_dbg( "RX endpoint\n");
6585 if(!strcmp(argv
[3], "bulk")){
6586 mtk_test_dbg( "Test bulk transfer\n");
6589 else if(!strcmp(argv
[3], "intr")){
6590 mtk_test_dbg( "Test intr transfer\n");
6593 else if(!strcmp(argv
[3], "isoc")){
6594 mtk_test_dbg( "Test isoc transfer\n");
6599 maxp
= (int)simple_strtol(argv
[4], &argv
[4], 10);
6600 mtk_test_dbg( "maxp set to %d\n", maxp
);
6603 bInterval
= (int)simple_strtol(argv
[5], &argv
[5], 10);
6604 mtk_test_dbg( "bInterval set to %d\n", bInterval
);
6607 burst
= (int)simple_strtol(argv
[6], &argv
[6], 10);
6608 mtk_test_dbg( "burst set to %d\n", burst
);
6611 mult
= (int)simple_strtol(argv
[7], &argv
[7], 10);
6612 mtk_test_dbg( "mult set to %d\n", mult
);
6614 return dev_config_ep(ep_num
, dir
, type
, maxp
, bInterval
,mult_dev
,burst
,mult
,NULL
);
6617 static int t_dev_remotewakeup(int argc
, char** argv
){
6619 int bdp
, gpd_buf_size
, bd_buf_size
;
6622 gpd_buf_size
=0xFC00;
6626 mtk_test_dbg( "[ERROR] device not reset\n");
6630 mtk_test_dbg( "[ERROR] slot not enabled\n");
6634 delay_us
= (int)simple_strtol(argv
[1], &argv
[1], 10);
6635 mtk_test_dbg( "Device delay %d us\n", delay_us
);
6637 return dev_remotewakeup(delay_us
);
6640 //Test concurrently resume case
6641 static int t_u3auto_concurrent_remotewakeup(int argc
, char** argv
){
6642 int ret
,loop
,length
,j
,i
;
6644 short gpd_buf_size
,bd_buf_size
;
6645 int speed
,host_speed
;
6646 int maxp
, count
,mult
;
6648 uint dev_delay_us
, host_delay_ms
;
6650 struct xhci_hcd
*xhci
;
6655 xhci
= hcd_to_xhci(my_hcd
);
6656 addr
= &xhci
->op_regs
->port_status_base
+ NUM_PORT_REGS
*(g_port_id
-1 & 0xff);
6660 speed
= DEV_SPEED_HIGH
;
6664 if(!strcmp(argv
[1], "ss")){
6665 mtk_test_dbg( "Test super speed\n");
6666 speed
= DEV_SPEED_SUPER
;
6668 else if(!strcmp(argv
[1], "hs")){
6669 mtk_test_dbg( "Test high speed\n");
6670 speed
= DEV_SPEED_HIGH
;
6672 else if(!strcmp(argv
[1], "fs")){
6673 mtk_test_dbg( "Test full speed\n");
6674 speed
= DEV_SPEED_FULL
;
6679 count
= (int)simple_strtol(argv
[2], &argv
[2], 10);
6682 delay_time
= (int)simple_strtol(argv
[3], &argv
[3], 10);
6686 g_concurrent_resume
= true;
6687 /* ==phase 1 : config EP==*/
6690 ret
=dev_config_ep(2,USB_RX
,EPATT_BULK
,maxp
,0,3,0,0,NULL
);
6693 mtk_test_dbg( "config dev EP fail!!\n");
6697 ret
=dev_config_ep(2,USB_TX
,EPATT_BULK
,maxp
,0,3,0,0,NULL
);
6700 mtk_test_dbg( "config dev EP fail!!\n");
6704 ret
= f_config_ep(2,EPADD_OUT
,EPATT_BULK
,maxp
,0,0 ,0,NULL
,0);
6707 mtk_test_dbg( "config EP fail!!\n");
6711 ret
= f_config_ep(2,EPADD_IN
,EPATT_BULK
,maxp
,0,0 ,0,NULL
,1);
6714 mtk_test_dbg( "config EP fail!!\n");
6719 for(i
=0;i
<count
;i
++)
6722 get_random_bytes(&rand_num
, sizeof(rand_num
));
6723 host_delay_ms
= //suspend 30~60 ms to make sure the host side check timing saving
6724 get_random_bytes(&rand_num
, sizeof(rand_num
));
6725 dev_delay_ms
= 30 + rand_num
% 30; //suspend 30~60 ms to make sure the host side check timing saving
6730 mtk_test_dbg( "count: %d, host_delay: %d, dev_delay: %d\n", i
, host_delay_ms
, dev_delay_us
);
6732 ret
= dev_remotewakeup(dev_delay_us
);
6735 mtk_test_dbg( "remote wakeup request fail!!\n");
6736 g_concurrent_resume
= false;
6740 ret
= f_power_suspend();
6743 mtk_test_dbg( "suspend fail!!!\n");
6746 #if 0 //original remote wakeup test logic
6747 ret
= f_power_remotewakeup();
6750 mtk_test_dbg( "remote wakeup fail!!\n");
6753 #else //enhanced remote wakeup test logic
6754 addr
= &xhci
->op_regs
->port_status_base
+ NUM_PORT_REGS
*(g_port_id
-1 & 0xff);
6759 ret
=f_power_resume(0);
6762 mtk_test_dbg( "wakeup fail!!\n");
6763 g_concurrent_resume
= false;
6770 /* ==phase 2 : loopback== */
6772 gpd_buf_size
=0xFC00;
6777 ret
=dev_loopback(bdp
,length
,gpd_buf_size
,bd_buf_size
, 0, 0,NULL
);
6780 mtk_test_dbg( "loopback request fail!!\n");
6781 mtk_test_dbg( "length : %d\n",length
);
6785 ret
= f_loopback_loop(2,2,length
, 0,NULL
);
6788 mtk_test_dbg( "loopback fail!!\n");
6789 mtk_test_dbg( "length : %d\n",length
);
6793 ret
=dev_polling_status(NULL
);
6796 mtk_test_dbg( "query request fail!!\n");
6802 mtk_test_dbg( "length : %d\n",length
);
6805 g_concurrent_resume
= false;
6809 static int t_u3auto_concurrent_u1u2_exit(int argc
, char** argv
){
6810 int ret
,loop
,length
,j
,i
;
6812 short gpd_buf_size
,bd_buf_size
;
6813 int speed
,host_speed
;
6814 int maxp
, count
,mult
;
6816 struct xhci_hcd
*xhci
;
6819 int dev_delay_time
, host_delay_time
, do_ux
;
6822 struct usb_ctrlrequest
*dr
;
6823 struct usb_device
*udev
, *rhdev
;
6825 struct protocol_query
*query
;
6827 xhci
= hcd_to_xhci(my_hcd
);
6828 addr
= &xhci
->op_regs
->port_status_base
+ NUM_PORT_REGS
*(g_port_id
-1 & 0xff);
6832 speed
= DEV_SPEED_SUPER
;
6837 count
= (int)simple_strtol(argv
[1], &argv
[1], 10);
6840 dev_delay_time
= (int)simple_strtol(argv
[2], &argv
[2], 10);
6843 host_delay_time
= (int)simple_strtol(argv
[3], &argv
[3], 10);
6846 do_ux
= (int)simple_strtol(argv
[4], &argv
[4], 10);
6849 port_id
= (int)simple_strtol(argv
[5], &argv
[5], 10);
6851 for(i
=0; i
<count
; i
++){
6852 ret
= dev_remotewakeup(dev_delay_time
);
6855 mtk_test_dbg( "remote wakeup request fail!!\n");
6859 ret
= f_port_set_pls(port_id
, do_ux
);
6863 udelay(host_delay_time
);
6864 ret
= f_port_set_pls(1, 0);
6866 //dev_power(0, 0, 0, 1, 1, NULL);
6867 //f_port_set_pls(1, 0);
6872 static int t_u3auto_concurrent_u1u2_enter(int argc
, char** argv
){
6873 int ret
,loop
,length
,j
,i
;
6875 short gpd_buf_size
,bd_buf_size
;
6876 int speed
,host_speed
;
6877 int maxp
, count
,mult
;
6879 uint dev_delay_ms
, host_delay_ms
;
6881 struct xhci_hcd
*xhci
;
6884 int delay_time
, dev_u1_delay
, dev_u2_delay
;
6886 struct usb_ctrlrequest
*dr
;
6887 struct usb_device
*udev
, *rhdev
;
6889 struct protocol_query
*query
;
6891 xhci
= hcd_to_xhci(my_hcd
);
6892 addr
= &xhci
->op_regs
->port_status_base
+ NUM_PORT_REGS
*(g_port_id
-1 & 0xff);
6896 speed
= DEV_SPEED_SUPER
;
6904 count
= (int)simple_strtol(argv
[1], &argv
[1], 10);
6907 delay_time
= (int)simple_strtol(argv
[2], &argv
[2], 10);
6910 dev_u1_delay
= (int)simple_strtol(argv
[3], &argv
[3], 10);
6913 dev_u2_delay
= (int)simple_strtol(argv
[4], &argv
[4], 10);
6916 do_ux
= (int)simple_strtol(argv
[5], &argv
[5], 10);
6921 /* ==phase 1 : config EP==*/
6922 ret
=dev_config_ep(2,USB_RX
,EPATT_BULK
,maxp
,0,3,0,0,NULL
);
6925 mtk_test_dbg( "config dev EP fail!!\n");
6929 ret
=dev_config_ep(2,USB_TX
,EPATT_BULK
,maxp
,0,3,0,0,NULL
);
6932 mtk_test_dbg( "config dev EP fail!!\n");
6936 ret
= f_config_ep(2,EPADD_OUT
,EPATT_BULK
,maxp
,0,0 ,0,NULL
,0);
6939 mtk_test_dbg( "config EP fail!!\n");
6943 ret
= f_config_ep(2,EPADD_IN
,EPATT_BULK
,maxp
,0,0 ,0,NULL
,1);
6946 mtk_test_dbg( "config EP fail!!\n");
6951 //set device u1u2 timeout
6952 if(dev_u1_delay
> 0){
6953 dev_power(1, dev_u1_delay
, 0, 1, 1, NULL
);
6956 else if(dev_u2_delay
> 0){
6957 dev_power(2, 0, dev_u2_delay
, 1, 1, NULL
);
6961 mtk_test_dbg( "[ERROR] Doesn't set device u1 or u2 timeout value\n");
6965 //host side only set accept u1u2
6966 f_power_set_u1u2(3, 255, 255);
6969 g_con_is_enter
= true;
6970 g_con_delay_us
= delay_time
;
6971 g_con_enter_ux
= do_ux
;
6973 for(i
=0; i
<count
; i
++){
6974 //get_random_bytes(&rand_num , sizeof(rand_num));
6976 /* ==phase 1 : do some transfer to back to U0== */
6977 //dev_query_status(NULL);
6979 rhdev
= my_hcd
->self
.root_hub
;
6980 udev
= rhdev
->children
[g_port_id
-1];
6983 dr
= kmalloc(sizeof(struct usb_ctrlrequest
), GFP_NOIO
);
6984 query
= kmalloc(AT_CMD_ACK_DATA_LENGTH
, GFP_NOIO
);
6986 memset(query
, 0, AT_CMD_ACK_DATA_LENGTH
);
6988 dr
->bRequestType
= USB_DIR_IN
| USB_TYPE_VENDOR
| USB_RECIP_DEVICE
;;
6989 dr
->bRequest
= AT_CMD_ACK
;
6990 dr
->wValue
= cpu_to_le16(0);
6991 dr
->wIndex
= cpu_to_le16(0);
6992 dr
->wLength
= cpu_to_le16(AT_CMD_ACK_DATA_LENGTH
);
6993 urb
= alloc_ctrl_urb(dr
, query
, udev
);
6994 ret
= f_ctrlrequest_nowait(urb
, udev
);
6996 //**************************************************/
6997 //wait_not_event_on_timeout(&(urb->status), -EINPROGRESS, TRANS_TIMEOUT);
7001 /* ==phase 2 : transfer U1 or U2 packet== */
7002 //mtk_test_dbg( "[DBG] set port pls = %d\n", do_ux);
7003 f_port_set_pls(1, do_ux
);
7006 f_port_set_pls(1, 0);
7008 //mtk_test_dbg( "[DBG] set port pls = 0\n");
7009 //f_port_set_pls(1, 0);
7011 wait_not_event_on_timeout(&(urb
->status
), -EINPROGRESS
, TRANS_TIMEOUT
);
7012 mtktest_xhci_urb_free_priv(xhci
, urb
->hcpriv
);
7015 //* clear some trash left */
7020 //************************************************/
7021 dev_query_status(NULL
);
7023 dev_power(0, 0, 0, 1, 1, NULL
);
7024 //f_port_set_pls(1, 0);
7029 static int t_start_host_test_mode(int argc
, char** argv
){
7032 printk(KERN_ERR
"[OTG_H] call t_start_host_test_mode\n");
7034 td_no
= 0; // td_no = 6 ~ 12 (0x6 ~ 0xc)
7036 td_no
= (int)simple_strtol(argv
[1], &argv
[1], 10);
7038 f_host_test_mode(td_no
) ;
7043 static int t_stop_host_test_mode(int argc
, char** argv
){
7048 td_no
= (int)simple_strtol(argv
[1], &argv
[1], 10);
7051 f_host_test_mode_stop() ;
7057 static int t_drv_vbus(int argc
, char** argv
){
7062 static int t_stop_vbus(int argc
, char** argv
){
7067 //initial code attached to A-connector
7068 static int t_u3h_otg_dev_A_host(int argc
, char** argv
){
7071 g_otg_dev_B
= false;
7072 //enable OTG interrupt
7073 temp
= readl(SSUSB_OTG_INT_EN
);
7074 temp
= temp
| SSUSB_ATTACH_A_ROLE_INT_EN
| SSUSB_CHG_A_ROLE_A_INT_EN
7075 | SSUSB_CHG_B_ROLE_A_INT_EN
| SSUSB_SRP_REQ_INTR_EN
;
7076 writel(temp
, SSUSB_OTG_INT_EN
);
7078 //disable SIFSLV CLK gating
7079 temp
= readl(SSUSB_CSR_CK_CTRL
);
7080 temp
= temp
& ~SSUSB_SIFSLV_MCU_BUS_CK_GATE_EN
;
7081 writel(temp
, SSUSB_CSR_CK_CTRL
);
7083 kthread_run(otg_dev_A_host_thread
, NULL
, "otg_A_host");
7087 //initial code attached to B-connector
7088 static int t_u3h_otg_dev_B_host(int argc
, char** argv
){
7092 //enable OTG interrupt
7093 temp
= readl(SSUSB_OTG_INT_EN
);
7094 temp
= temp
| SSUSB_ATTACH_A_ROLE_INT_EN
| SSUSB_CHG_A_ROLE_A_INT_EN
7095 | SSUSB_CHG_B_ROLE_A_INT_EN
| SSUSB_SRP_REQ_INTR_EN
;
7096 writel(temp
, SSUSB_OTG_INT_EN
);
7098 //disable SIFSLV CLK gating
7099 temp
= readl(SSUSB_CSR_CK_CTRL
);
7100 temp
= temp
& ~SSUSB_SIFSLV_MCU_BUS_CK_GATE_EN
;
7101 writel(temp
, SSUSB_CSR_CK_CTRL
);
7103 if(f_test_lib_init() != RET_SUCCESS
){
7104 printk(KERN_ERR
"[OTG_H] controller driver init failed\n");
7110 //B device wait for hnp and become host
7111 static int t_u3h_otg_dev_B_hnp(int argc
, char** argv
){
7112 g_otg_hnp_become_host
= false;
7113 kthread_run(otg_dev_B_hnp
, NULL
, "otg_dev_B_hnp");
7117 //A device wait hnp and become device
7118 static int t_u3h_otg_dev_A_hnp(int argc
, char** argv
){
7119 g_otg_hnp_become_dev
= false;
7120 kthread_run(otg_dev_A_hnp
, NULL
, "otg_dev_A_hnp");
7124 //A device back to host after hnp
7125 static int t_u3h_otg_dev_A_hnp_back(int argc
, char** argv
){
7126 g_otg_hnp_become_host
= false;
7127 kthread_run(otg_dev_A_hnp_back
, NULL
, "otg_dev_A_hnp_back");
7131 //B device back to host after hnp
7132 static int t_u3h_otg_dev_B_hnp_back(int argc
, char** argv
){
7133 g_otg_hnp_become_dev
= false;
7134 kthread_run(otg_dev_B_hnp_back
, NULL
, "otg_dev_B_hnp_back");
7139 static int t_u3h_otg_dev_A_srp(int argc
, char** argv
){
7140 kthread_run(otg_dev_A_srp
, NULL
, "dev_A_srp");
7145 static int t_u3h_otg_uut_A(int argc
, char** argv
){
7146 kthread_run(otg_opt_uut_a
, NULL
, "[OTG_H]opt_uut_A");
7150 static int t_u3h_otg_uut_B(int argc
, char** argv
){
7151 kthread_run(otg_opt_uut_b
, NULL
, "[OTG_H]opt_uut_B");
7155 static int t_u3h_otg_pet_uutA(int argc
, char** argv
){
7156 kthread_run(otg_pet_uut_a
, NULL
, "[OTG_H]pet_uut_A");
7160 static int t_u3h_otg_pet_uutB(int argc
, char** argv
){
7161 kthread_run(otg_pet_uut_b
, NULL
, "[OTG_H]pet_uut_B");
7165 #define CTX_SIZE(_hcc) (HCC_64BYTE_CONTEXT(_hcc) ? 64 : 32)
7166 static struct xhci_container_ctx
*mtk_xhci_alloc_container_ctx(struct xhci_hcd
*xhci
,
7167 int type
, gfp_t flags
)
7169 struct xhci_container_ctx
*ctx
= kzalloc(sizeof(*ctx
), flags
);
7173 BUG_ON((type
!= XHCI_CTX_TYPE_DEVICE
) && (type
!= XHCI_CTX_TYPE_INPUT
));
7175 ctx
->size
= HCC_64BYTE_CONTEXT(xhci
->hcc_params
) ? 2048 : 1024;
7176 if (type
== XHCI_CTX_TYPE_INPUT
)
7177 ctx
->size
+= CTX_SIZE(xhci
->hcc_params
);
7179 ctx
->bytes
= dma_pool_alloc(xhci
->device_pool
, flags
, &ctx
->dma
);
7180 memset(ctx
->bytes
, 0, ctx
->size
);
7184 static int dbg_reg_ewe(int argc
, char** argv
){
7185 struct xhci_hcd
*xhci
;
7190 xhci
= hcd_to_xhci(my_hcd
);
7191 g_mfindex_event
= 0;
7192 temp
= xhci_readl(xhci
, &xhci
->op_regs
->command
);
7194 xhci_writel(xhci
, temp
, &xhci
->op_regs
->command
);
7196 if(g_mfindex_event
> 0){
7202 temp
= xhci_readl(xhci
, &xhci
->op_regs
->command
);
7204 xhci_writel(xhci
, temp
, &xhci
->op_regs
->command
);
7208 static int ct_check_hcd(){
7210 if(f_test_lib_init()){
7211 mtk_test_dbg( "init host controller FAILED\n");
7218 static int u3ct_lecroy7061(){
7222 mtk_test_dbg( "STEP 1: enable port and slot, address device(BSR=1)...\n");
7223 if(f_enable_port(0)){
7224 mtk_test_dbg( "enable port FAILED!!\n");
7227 if(f_enable_slot(NULL
)){
7228 mtk_test_dbg( "enable slot FAILED!!\n");
7231 if(f_address_slot(true, NULL
)){
7232 mtk_test_dbg( "address device (BSR=1) FAILED!!\n");
7238 static int u3ct_lecroy7062(){
7240 struct usb_device
*udev
, *rhdev
;
7241 struct xhci_virt_device
*virt_dev
;
7242 struct xhci_hcd
*xhci
;
7244 struct usb_ctrlrequest
*dr
;
7245 struct usb_config_descriptor
*desc
;
7249 mtk_test_dbg( "STEP 2: get_descriptor, whether success or failed...\n");
7252 mtk_test_dbg( "[ERROR] slot ID not valid\n");
7256 xhci
= hcd_to_xhci(my_hcd
);
7257 rhdev
= my_hcd
->self
.root_hub
;
7258 udev
= rhdev
->children
[g_port_id
-1];
7260 dr
= kmalloc(sizeof(struct usb_ctrlrequest
), GFP_NOIO
);
7261 dr
->bRequestType
= USB_DIR_IN
;
7262 dr
->bRequest
= USB_REQ_GET_DESCRIPTOR
;
7263 dr
->wValue
= cpu_to_le16((USB_DT_DEVICE
<< 8) + 0);
7264 dr
->wIndex
= cpu_to_le16(0);
7265 dr
->wLength
= cpu_to_le16(USB_DT_DEVICE_SIZE
);
7266 desc
= kmalloc(USB_DT_DEVICE_SIZE
, GFP_KERNEL
);
7267 memset(desc
, 0, USB_DT_DEVICE_SIZE
);
7269 urb
= alloc_ctrl_urb(dr
, desc
, udev
);
7270 ret
= f_ctrlrequest(urb
, udev
);
7271 if(urb
->status
== -EINPROGRESS
){
7272 //timeout, stop endpoint, set TR dequeue pointer
7273 f_ring_stop_ep(g_slot_id
, 0);
7274 f_ring_set_tr_dequeue_pointer(g_slot_id
, 0, urb
);
7283 static int u3ct_lecroy718(){
7284 mtk_test_dbg( "Reset host controller\n");
7286 if(f_test_lib_cleanup()){
7287 mtk_test_dbg( "cleanup host controller FAILED\n");
7291 if(f_test_lib_init()){
7292 mtk_test_dbg( "init host controller FAILED\n");
7295 mtk_test_dbg( "wait 1 sec\n");
7298 mtk_test_dbg( "enable port, slot, address (BSR=1)\n");
7299 if(f_enable_port(0)){
7300 mtk_test_dbg( "enable port FAILED!!\n");
7303 if(f_enable_slot(NULL
)){
7304 mtk_test_dbg( "enable slot FAILED!!\n");
7307 if(f_address_slot(true, NULL
)){
7308 mtk_test_dbg( "address device (BSR=1) FAILED!!\n");
7312 mtk_test_dbg( "set u1 timeout value=127\n");
7313 if(f_power_set_u1u2(3, 127, 0)){
7314 mtk_test_dbg( "set u1 timeout FAILED!!\n");
7321 static int u3ct_lecroy719(){
7325 mtk_test_dbg( "direct set u1 timeout value=0, u2 timeout value=127\n");
7326 if(f_power_set_u1u2(3, 0, 127)){
7327 mtk_test_dbg( "set u1/u2 timeout FAILED!!\n");
7334 static int u3ct_lecroy720(){
7338 mtk_test_dbg( "STEP 1: enable port and slot, address device(BSR=1)...\n");
7339 if(f_enable_port(0)){
7340 mtk_test_dbg( "enable port FAILED!!\n");
7343 if(f_enable_slot(NULL
)){
7344 mtk_test_dbg( "enable slot FAILED!!\n");
7347 if(f_address_slot(true, NULL
)){
7348 mtk_test_dbg( "address device (BSR=1) FAILED!!\n");
7351 mtk_test_dbg( "set u1 timeout value=127\n");
7352 if(f_power_set_u1u2(3, 127, 0)){
7353 mtk_test_dbg( "set u1 timeout FAILED!!\n");
7360 static int u3ct_lecroy721(){
7364 mtk_test_dbg( "STEP 1: enable port and slot, address device(BSR=1)...\n");
7365 if(f_enable_port(0)){
7366 mtk_test_dbg( "enable port FAILED!!\n");
7369 if(f_enable_slot(NULL
)){
7370 mtk_test_dbg( "enable slot FAILED!!\n");
7373 if(f_address_slot(true, NULL
)){
7374 mtk_test_dbg( "address device (BSR=1) FAILED!!\n");
7377 mtk_test_dbg( "set u1 timeout value=127\n");
7378 if(f_power_set_u1u2(3, 127, 0)){
7379 mtk_test_dbg( "set u1 timeout FAILED!!\n");
7386 static int u3ct_lecroy729(){
7391 struct xhci_hcd
*xhci
;
7393 mtk_test_dbg( "hot reset port...\n");
7394 port_id
= g_port_id
;
7396 addr
= &xhci
->op_regs
->port_status_base
+ NUM_PORT_REGS
*(port_id
-1 & 0xff);
7397 temp
= xhci_readl(xhci
, addr
);
7398 xhci_dbg(xhci
, "before reset port %d = 0x%x\n", port_id
-1, temp
);
7399 temp
= mtktest_xhci_port_state_to_neutral(temp
);
7400 temp
= (temp
| PORT_RESET
);
7401 xhci_writel(xhci
, temp
, addr
);
7405 static int u3ct_lecroy731(){
7410 struct xhci_hcd
*xhci
;
7412 mtk_test_dbg( "hot reset port...\n");
7413 port_id
= g_port_id
;
7414 xhci
= hcd_to_xhci(my_hcd
);
7416 addr
= &xhci
->op_regs
->port_status_base
+ NUM_PORT_REGS
*(port_id
-1 & 0xff);
7417 temp
= xhci_readl(xhci
, addr
);
7418 xhci_dbg(xhci
, "before reset port %d = 0x%x\n", port_id
-1, temp
);
7419 temp
= mtktest_xhci_port_state_to_neutral(temp
);
7420 temp
= (temp
| PORT_RESET
);
7421 xhci_writel(xhci
, temp
, addr
);
7425 static int u3ct_lecroy7341(){
7426 mtk_test_dbg( "Reset host controller\n");
7428 if(f_test_lib_cleanup()){
7429 mtk_test_dbg( "cleanup host controller FAILED\n");
7433 if(f_test_lib_init()){
7434 mtk_test_dbg( "init host controller FAILED\n");
7440 static int u3ct_lecroy7342(){
7445 struct xhci_hcd
*xhci
;
7447 mtk_test_dbg( "warm reset port\n");
7448 port_id
= g_port_id
;
7449 xhci
= hcd_to_xhci(my_hcd
);
7451 addr
= &xhci
->op_regs
->port_status_base
+ NUM_PORT_REGS
*(port_id
-1 & 0xff);
7452 temp
= xhci_readl(xhci
, addr
);
7453 xhci_dbg(xhci
, "before reset port %d = 0x%x\n", port_id
-1, temp
);
7454 temp
= mtktest_xhci_port_state_to_neutral(temp
);
7455 temp
= (temp
| PORT_WR
);
7456 xhci_writel(xhci
, temp
, addr
);
7460 static int u3ct_lecroy735(){
7464 struct xhci_hcd
*xhci
;
7466 port_id
= g_port_id
;
7467 xhci
= hcd_to_xhci(my_hcd
);
7469 mtk_test_dbg( "suspend port\n");
7470 addr
= &xhci
->op_regs
->port_status_base
+ NUM_PORT_REGS
*(port_id
-1 & 0xff);
7471 temp
= xhci_readl(xhci
, addr
);
7472 xhci_dbg(xhci
, "before reset port %d = 0x%x\n", port_id
-1, temp
);
7473 temp
= mtktest_xhci_port_state_to_neutral(temp
);
7474 temp
= (temp
& ~(0xf << 5));
7475 temp
= (temp
| (3 << 5) | PORT_LINK_STROBE
);
7476 xhci_writel(xhci
, temp
, addr
);
7477 mtk_xhci_handshake(xhci
, addr
, (15<<5), (3<<5), 30*1000);
7478 temp
= xhci_readl(xhci
, addr
);
7479 if(PORT_PLS_VALUE(temp
) != 3){
7480 xhci_err(xhci
, "port not enter U3 state\n");
7484 mtk_test_dbg( "delay 1 sec\n");
7486 mtk_test_dbg( "warm reset port\n");
7487 addr
= &xhci
->op_regs
->port_status_base
+ NUM_PORT_REGS
*(port_id
-1 & 0xff);
7488 temp
= xhci_readl(xhci
, addr
);
7489 xhci_dbg(xhci
, "before reset port %d = 0x%x\n", port_id
-1, temp
);
7490 temp
= mtktest_xhci_port_state_to_neutral(temp
);
7491 temp
= (temp
| PORT_WR
);
7492 xhci_writel(xhci
, temp
, addr
);
7496 static int u3ct_lecroy7361(){
7500 struct xhci_hcd
*xhci
;
7502 port_id
= g_port_id
;
7503 xhci
= hcd_to_xhci(my_hcd
);
7505 mtk_test_dbg( "suspend port\n");
7506 addr
= &xhci
->op_regs
->port_status_base
+ NUM_PORT_REGS
*(port_id
-1 & 0xff);
7507 temp
= xhci_readl(xhci
, addr
);
7508 xhci_dbg(xhci
, "before reset port %d = 0x%x\n", port_id
-1, temp
);
7509 temp
= mtktest_xhci_port_state_to_neutral(temp
);
7510 temp
= (temp
& ~(0xf << 5));
7511 temp
= (temp
| (3 << 5) | PORT_LINK_STROBE
);
7512 xhci_writel(xhci
, temp
, addr
);
7513 mtk_xhci_handshake(xhci
, addr
, (15<<5), (3<<5), 30*1000);
7514 temp
= xhci_readl(xhci
, addr
);
7515 if(PORT_PLS_VALUE(temp
) != 3){
7516 xhci_err(xhci
, "port not enter U3 state\n");
7522 static int u3ct_lecroy7362(){
7526 struct xhci_hcd
*xhci
;
7529 port_id
= g_port_id
;
7530 xhci
= hcd_to_xhci(my_hcd
);
7532 mtk_test_dbg( "resume port\n");
7533 addr
= &xhci
->op_regs
->port_status_base
+ NUM_PORT_REGS
*(port_id
-1 & 0xff);
7534 temp
= xhci_readl(xhci
, addr
);
7535 temp
= mtktest_xhci_port_state_to_neutral(temp
);
7536 temp
= (temp
& ~(0xf << 5));
7537 temp
= (temp
| PORT_LINK_STROBE
);
7538 xhci_writel(xhci
, temp
, addr
);
7539 for(i
=0; i
<200; i
++){
7540 temp
= xhci_readl(xhci
, addr
);
7541 if(PORT_PLS_VALUE(temp
) == 0){
7547 if(PORT_PLS_VALUE(temp
) != 0){
7548 xhci_err(xhci
, "port not return U0 state\n");
7555 static int dbg_u3ct_lecroy(int argc
, char** argv
){
7560 td_no
= (int)simple_strtol(argv
[1], &argv
[1], 10);
7564 mtk_test_dbg( "(7061) STEP 1, (7062) STEP 2\n");
7567 return u3ct_lecroy7061();
7570 return u3ct_lecroy7062();
7573 return u3ct_lecroy718();
7576 return u3ct_lecroy719();
7579 return u3ct_lecroy720();
7582 return u3ct_lecroy721();
7585 return u3ct_lecroy729();
7588 return u3ct_lecroy731();
7591 mtk_test_dbg( "(7341) STEP 1, (7342) STEP 2\n");
7594 return u3ct_lecroy7341();
7597 return u3ct_lecroy7342();
7600 return u3ct_lecroy735();
7603 mtk_test_dbg( "(7361) STEP 1, (7362) STEP 2\n");
7606 return u3ct_lecroy7361();
7609 return u3ct_lecroy7362();
7612 mtk_test_dbg( "enter td number\n");
7617 static int u3ct_ellisys7061(){
7621 mtk_test_dbg( "STEP 1: enable port and slot, address device(BSR=1)...\n");
7622 if(f_enable_port(0)){
7623 mtk_test_dbg( "enable port FAILED!!\n");
7626 if(f_enable_slot(NULL
)){
7627 mtk_test_dbg( "enable slot FAILED!!\n");
7630 if(f_address_slot(true, NULL
)){
7631 mtk_test_dbg( "address device (BSR=1) FAILED!!\n");
7637 static int u3ct_ellisys7062(){
7639 struct usb_device
*udev
, *rhdev
;
7640 struct xhci_virt_device
*virt_dev
;
7641 struct xhci_hcd
*xhci
;
7643 struct usb_ctrlrequest
*dr
;
7644 struct usb_config_descriptor
*desc
;
7648 mtk_test_dbg( "STEP 2: get_descriptor, whether success or failed...\n");
7651 mtk_test_dbg( "[ERROR] slot ID not valid\n");
7655 xhci
= hcd_to_xhci(my_hcd
);
7656 rhdev
= my_hcd
->self
.root_hub
;
7657 udev
= rhdev
->children
[g_port_id
-1];
7659 dr
= kmalloc(sizeof(struct usb_ctrlrequest
), GFP_NOIO
);
7660 dr
->bRequestType
= USB_DIR_IN
;
7661 dr
->bRequest
= USB_REQ_GET_DESCRIPTOR
;
7662 dr
->wValue
= cpu_to_le16((USB_DT_DEVICE
<< 8) + 0);
7663 dr
->wIndex
= cpu_to_le16(0);
7664 dr
->wLength
= cpu_to_le16(USB_DT_DEVICE_SIZE
);
7665 desc
= kmalloc(USB_DT_DEVICE_SIZE
, GFP_KERNEL
);
7666 memset(desc
, 0, USB_DT_DEVICE_SIZE
);
7668 urb
= alloc_ctrl_urb(dr
, desc
, udev
);
7669 ret
= f_ctrlrequest(urb
, udev
);
7670 if(urb
->status
== -EINPROGRESS
){
7671 //timeout, stop endpoint, set TR dequeue pointer
7672 f_ring_stop_ep(g_slot_id
, 0);
7673 f_ring_set_tr_dequeue_pointer(g_slot_id
, 0, urb
);
7682 static int u3ct_ellisys718(){
7683 mtk_test_dbg( "Reset host controller\n");
7685 if(f_test_lib_cleanup()){
7686 mtk_test_dbg( "cleanup host controller FAILED\n");
7690 if(f_test_lib_init()){
7691 mtk_test_dbg( "init host controller FAILED\n");
7694 mtk_test_dbg( "wait 1 sec\n");
7697 mtk_test_dbg( "enable port, slot, address (BSR=1)\n");
7698 if(f_enable_port(0)){
7699 mtk_test_dbg( "enable port FAILED!!\n");
7702 if(f_enable_slot(NULL
)){
7703 mtk_test_dbg( "enable slot FAILED!!\n");
7706 if(f_address_slot(true, NULL
)){
7707 mtk_test_dbg( "address device (BSR=1) FAILED!!\n");
7711 mtk_test_dbg( "set u1 timeout value=127\n");
7712 if(f_power_set_u1u2(3, 127, 0)){
7713 mtk_test_dbg( "set u1 timeout FAILED!!\n");
7720 static int u3ct_ellisys719(){
7721 mtk_test_dbg( "direct set u1 timeout value=0, u2 timeout value=127\n");
7722 if(f_power_set_u1u2(3, 0, 127)){
7723 mtk_test_dbg( "set u1/u2 timeout FAILED!!\n");
7730 static int u3ct_ellisys720(){
7734 mtk_test_dbg( "STEP 1: enable port and slot, address device(BSR=1)...\n");
7735 if(f_enable_port(0)){
7736 mtk_test_dbg( "enable port FAILED!!\n");
7739 if(f_enable_slot(NULL
)){
7740 mtk_test_dbg( "enable slot FAILED!!\n");
7743 if(f_address_slot(true, NULL
)){
7744 mtk_test_dbg( "address device (BSR=1) FAILED!!\n");
7747 mtk_test_dbg( "set u1 timeout value=127\n");
7748 if(f_power_set_u1u2(3, 127, 0)){
7749 mtk_test_dbg( "set u1 timeout FAILED!!\n");
7756 static int u3ct_ellisys721(){
7760 mtk_test_dbg( "STEP 1: enable port and slot, address device(BSR=1)...\n");
7761 if(f_enable_port(0)){
7762 mtk_test_dbg( "enable port FAILED!!\n");
7765 if(f_enable_slot(NULL
)){
7766 mtk_test_dbg( "enable slot FAILED!!\n");
7769 if(f_address_slot(true, NULL
)){
7770 mtk_test_dbg( "address device (BSR=1) FAILED!!\n");
7773 mtk_test_dbg( "set u1 timeout value=127\n");
7774 if(f_power_set_u1u2(3, 127, 0)){
7775 mtk_test_dbg( "set u1 timeout FAILED!!\n");
7782 static int u3ct_ellisys729(){
7787 struct xhci_hcd
*xhci
;
7789 mtk_test_dbg( "hot reset port...\n");
7790 port_id
= g_port_id
;
7792 addr
= &xhci
->op_regs
->port_status_base
+ NUM_PORT_REGS
*(port_id
-1 & 0xff);
7793 temp
= xhci_readl(xhci
, addr
);
7794 xhci_dbg(xhci
, "before reset port %d = 0x%x\n", port_id
-1, temp
);
7795 temp
= mtktest_xhci_port_state_to_neutral(temp
);
7796 temp
= (temp
| PORT_RESET
);
7797 xhci_writel(xhci
, temp
, addr
);
7801 static int u3ct_ellisys731(){
7806 struct xhci_hcd
*xhci
;
7808 mtk_test_dbg( "hot reset port...\n");
7809 port_id
= g_port_id
;
7810 xhci
= hcd_to_xhci(my_hcd
);
7812 addr
= &xhci
->op_regs
->port_status_base
+ NUM_PORT_REGS
*(port_id
-1 & 0xff);
7813 temp
= xhci_readl(xhci
, addr
);
7814 xhci_dbg(xhci
, "before reset port %d = 0x%x\n", port_id
-1, temp
);
7815 temp
= mtktest_xhci_port_state_to_neutral(temp
);
7816 temp
= (temp
| PORT_RESET
);
7817 xhci_writel(xhci
, temp
, addr
);
7821 static int u3ct_ellisys7341(){
7822 mtk_test_dbg( "Reset host controller\n");
7824 if(f_test_lib_cleanup()){
7825 mtk_test_dbg( "cleanup host controller FAILED\n");
7829 if(f_test_lib_init()){
7830 mtk_test_dbg( "init host controller FAILED\n");
7836 static int u3ct_ellisys7342(){
7841 struct xhci_hcd
*xhci
;
7843 mtk_test_dbg( "warm reset port\n");
7844 port_id
= g_port_id
;
7845 xhci
= hcd_to_xhci(my_hcd
);
7847 addr
= &xhci
->op_regs
->port_status_base
+ NUM_PORT_REGS
*(port_id
-1 & 0xff);
7848 temp
= xhci_readl(xhci
, addr
);
7849 xhci_dbg(xhci
, "before reset port %d = 0x%x\n", port_id
-1, temp
);
7850 temp
= mtktest_xhci_port_state_to_neutral(temp
);
7851 temp
= (temp
| PORT_WR
);
7852 xhci_writel(xhci
, temp
, addr
);
7856 static int u3ct_ellisys735(){
7860 struct xhci_hcd
*xhci
;
7862 port_id
= g_port_id
;
7863 xhci
= hcd_to_xhci(my_hcd
);
7865 mtk_test_dbg( "suspend port\n");
7866 addr
= &xhci
->op_regs
->port_status_base
+ NUM_PORT_REGS
*(port_id
-1 & 0xff);
7867 temp
= xhci_readl(xhci
, addr
);
7868 xhci_dbg(xhci
, "before reset port %d = 0x%x\n", port_id
-1, temp
);
7869 temp
= mtktest_xhci_port_state_to_neutral(temp
);
7870 temp
= (temp
& ~(0xf << 5));
7871 temp
= (temp
| (3 << 5) | PORT_LINK_STROBE
);
7872 xhci_writel(xhci
, temp
, addr
);
7873 mtk_xhci_handshake(xhci
, addr
, (15<<5), (3<<5), 30*1000);
7874 temp
= xhci_readl(xhci
, addr
);
7875 if(PORT_PLS_VALUE(temp
) != 3){
7876 xhci_err(xhci
, "port not enter U3 state\n");
7880 mtk_test_dbg( "delay 1 sec\n");
7882 mtk_test_dbg( "warm reset port\n");
7883 addr
= &xhci
->op_regs
->port_status_base
+ NUM_PORT_REGS
*(port_id
-1 & 0xff);
7884 temp
= xhci_readl(xhci
, addr
);
7885 xhci_dbg(xhci
, "before reset port %d = 0x%x\n", port_id
-1, temp
);
7886 temp
= mtktest_xhci_port_state_to_neutral(temp
);
7887 temp
= (temp
| PORT_WR
);
7888 xhci_writel(xhci
, temp
, addr
);
7892 static int u3ct_ellisys7361(){
7895 struct usb_device
*udev
, *rhdev
;
7896 struct xhci_virt_device
*virt_dev
;
7897 struct xhci_hcd
*xhci
;
7899 struct usb_ctrlrequest
*dr
;
7900 struct usb_config_descriptor
*desc
;
7904 struct usb_host_endpoint
*ep_rx
;
7910 mtk_test_dbg( "Reset host controller\n");
7912 if(f_test_lib_cleanup()){
7913 mtk_test_dbg( "cleanup host controller FAILED\n");
7917 if(u3auto_hcd_reset() != RET_SUCCESS
){
7918 mtk_test_dbg( "init host controller, enable slot, address dev FAILED\n");
7921 xhci
= hcd_to_xhci(my_hcd
);
7922 rhdev
= my_hcd
->self
.root_hub
;
7923 udev
= rhdev
->children
[g_port_id
-1];
7924 dev
= xhci_to_hcd(xhci
)->self
.controller
;//dma stream buffer
7925 xhci_dbg(xhci
, "device speed %d\n", udev
->speed
);
7926 //get descriptor (device)
7927 dr
= kmalloc(sizeof(struct usb_ctrlrequest
), GFP_NOIO
);
7928 dr
->bRequestType
= USB_DIR_IN
;
7929 dr
->bRequest
= USB_REQ_GET_DESCRIPTOR
;
7930 dr
->wValue
= cpu_to_le16((USB_DT_DEVICE
<< 8) + 0);
7931 dr
->wIndex
= cpu_to_le16(0);
7932 dr
->wLength
= cpu_to_le16(8);
7933 desc
= kmalloc(8, GFP_KERNEL
);
7935 urb
= alloc_ctrl_urb(dr
, desc
, udev
);
7936 ret
= f_ctrlrequest(urb
, udev
);
7940 //get descriptor (device)
7941 dr
= kmalloc(sizeof(struct usb_ctrlrequest
), GFP_NOIO
);
7942 dr
->bRequestType
= USB_DIR_IN
;
7943 dr
->bRequest
= USB_REQ_GET_DESCRIPTOR
;
7944 dr
->wValue
= cpu_to_le16((USB_DT_DEVICE
<< 8) + 0);
7945 dr
->wIndex
= cpu_to_le16(0);
7946 dr
->wLength
= cpu_to_le16(USB_DT_DEVICE_SIZE
);
7947 desc
= kmalloc(USB_DT_DEVICE_SIZE
, GFP_KERNEL
);
7948 memset(desc
, 0, USB_DT_DEVICE_SIZE
);
7949 urb
= alloc_ctrl_urb(dr
, desc
, udev
);
7950 ret
= f_ctrlrequest(urb
, udev
);
7954 //get descriptor (configure)
7955 dr
= kmalloc(sizeof(struct usb_ctrlrequest
), GFP_NOIO
);
7956 dr
->bRequestType
= USB_DIR_IN
;
7957 dr
->bRequest
= USB_REQ_GET_DESCRIPTOR
;
7958 dr
->wValue
= cpu_to_le16((USB_DT_CONFIG
<< 8) + 0);
7959 dr
->wIndex
= cpu_to_le16(0);
7960 dr
->wLength
= cpu_to_le16(USB_DT_CONFIG_SIZE
);
7961 desc
= kmalloc(USB_DT_CONFIG_SIZE
, GFP_KERNEL
);
7962 memset(desc
, 0, USB_DT_CONFIG_SIZE
);
7963 urb
= alloc_ctrl_urb(dr
, desc
, udev
);
7964 ret
= f_ctrlrequest(urb
, udev
);
7968 //get descriptor (configure)
7969 dr
= kmalloc(sizeof(struct usb_ctrlrequest
), GFP_NOIO
);
7970 dr
->bRequestType
= USB_DIR_IN
;
7971 dr
->bRequest
= USB_REQ_GET_DESCRIPTOR
;
7972 dr
->wValue
= cpu_to_le16((USB_DT_CONFIG
<< 8) + 0);
7973 dr
->wIndex
= cpu_to_le16(0);
7974 dr
->wLength
= cpu_to_le16(40);
7975 desc
= kmalloc(40, GFP_KERNEL
);
7976 memset(desc
, 0, 40);
7977 urb
= alloc_ctrl_urb(dr
, desc
, udev
);
7978 ret
= f_ctrlrequest(urb
, udev
);
7983 dr
= kmalloc(sizeof(struct usb_ctrlrequest
), GFP_NOIO
);
7984 dr
->bRequestType
= USB_DIR_OUT
;
7985 dr
->bRequest
= USB_REQ_SET_CONFIGURATION
;
7986 dr
->wValue
= cpu_to_le16(1);
7987 dr
->wIndex
= cpu_to_le16(0);
7988 dr
->wLength
= cpu_to_le16(0);
7989 urb
= alloc_ctrl_urb(dr
, NULL
, udev
);
7990 ret
= f_ctrlrequest(urb
,udev
);
7994 dr
= kmalloc(sizeof(struct usb_ctrlrequest
), GFP_NOIO
);
7995 dr
->bRequestType
= USB_DIR_OUT
| USB_TYPE_CLASS
| USB_RECIP_INTERFACE
;
7996 dr
->bRequest
= 0x0A;
7997 dr
->wValue
= cpu_to_le16(0);
7998 dr
->wIndex
= cpu_to_le16(0);
7999 dr
->wLength
= cpu_to_le16(0);
8000 urb
= alloc_ctrl_urb(dr
, NULL
, udev
);
8001 ret
= f_ctrlrequest(urb
,udev
);
8004 //get descriptor (HID report)
8005 ret
= f_config_ep(1, EPADD_IN
, EPATT_INT
, 4, 7,0,0, udev
, 1);
8007 ep_rx
= udev
->ep_in
[1];
8008 ep_index_rx
= mtktest_xhci_get_endpoint_index(&ep_rx
->desc
);
8009 xhci_err(xhci
, "[INPUT]\n");
8010 for(i
=0; i
<10; i
++){
8011 urb_rx
= usb_alloc_urb(0, GFP_KERNEL
);
8012 ret
= f_fill_urb(urb_rx
,1,4,0,EPADD_IN
, 0, 4, udev
);
8014 xhci_err(xhci
, "[ERROR]fill rx urb Error!!\n");
8017 urb_rx
->transfer_flags
&= ~URB_ZERO_PACKET
;
8018 ret
= f_queue_urb(urb_rx
,1,udev
);
8020 xhci_err(xhci
, "[ERROR]rx urb transfer failed!!\n");
8023 dma_sync_single_for_cpu(dev
,urb_rx
->transfer_dma
, 4,DMA_BIDIRECTIONAL
);
8024 for(j
=0; j
<urb_rx
->transfer_buffer_length
; j
++){
8025 tmp
= urb_rx
->transfer_buffer
+i
;
8026 //xhci_err(xhci, "%x ", *tmp);
8028 //xhci_err(xhci, "\n");
8029 usb_free_urb(urb_rx
);
8035 static int u3ct_ellisys7362(){
8039 struct xhci_hcd
*xhci
;
8041 port_id
= g_port_id
;
8042 xhci
= hcd_to_xhci(my_hcd
);
8044 mtk_test_dbg( "suspend port\n");
8045 addr
= &xhci
->op_regs
->port_status_base
+ NUM_PORT_REGS
*(port_id
-1 & 0xff);
8046 temp
= xhci_readl(xhci
, addr
);
8047 xhci_dbg(xhci
, "before reset port %d = 0x%x\n", port_id
-1, temp
);
8048 temp
= mtktest_xhci_port_state_to_neutral(temp
);
8049 temp
= (temp
& ~(0xf << 5));
8050 temp
= (temp
| (3 << 5) | PORT_LINK_STROBE
);
8051 xhci_writel(xhci
, temp
, addr
);
8052 mtk_xhci_handshake(xhci
, addr
, (15<<5), (3<<5), 30*1000);
8053 temp
= xhci_readl(xhci
, addr
);
8054 if(PORT_PLS_VALUE(temp
) != 3){
8055 xhci_err(xhci
, "port not enter U3 state\n");
8061 static int u3ct_ellisys7363(){
8065 struct xhci_hcd
*xhci
;
8068 port_id
= g_port_id
;
8069 xhci
= hcd_to_xhci(my_hcd
);
8071 mtk_test_dbg( "resume port\n");
8072 addr
= &xhci
->op_regs
->port_status_base
+ NUM_PORT_REGS
*(port_id
-1 & 0xff);
8073 temp
= xhci_readl(xhci
, addr
);
8074 temp
= mtktest_xhci_port_state_to_neutral(temp
);
8075 temp
= (temp
& ~(0xf << 5));
8076 temp
= (temp
| PORT_LINK_STROBE
);
8077 xhci_writel(xhci
, temp
, addr
);
8078 for(i
=0; i
<200; i
++){
8079 temp
= xhci_readl(xhci
, addr
);
8080 if(PORT_PLS_VALUE(temp
) == 0){
8086 if(PORT_PLS_VALUE(temp
) != 0){
8087 xhci_err(xhci
, "port not return U0 state\n");
8094 static int dbg_u3ct_ellisys(int argc
, char** argv
){
8099 td_no
= (int)simple_strtol(argv
[1], &argv
[1], 10);
8103 mtk_test_dbg( "(7061) STEP 1, (7062) STEP 2\n");
8106 return u3ct_ellisys7061();
8109 return u3ct_ellisys7062();
8112 return u3ct_ellisys718();
8115 return u3ct_ellisys719();
8118 return u3ct_ellisys720();
8121 return u3ct_ellisys721();
8124 return u3ct_ellisys729();
8127 return u3ct_ellisys731();
8130 mtk_test_dbg( "(7341) STEP 1, (7342) STEP 2\n");
8133 return u3ct_ellisys7341();
8136 return u3ct_ellisys7342();
8139 return u3ct_ellisys735();
8142 mtk_test_dbg( "(7361) STEP 1, (7362) STEP 2, (7363) STEP 3\n");
8145 return u3ct_ellisys7361();
8148 return u3ct_ellisys7362();
8151 return u3ct_ellisys7363();
8154 mtk_test_dbg( "enter td number\n");
8159 static int u2ct_signal_quality(){
8161 struct xhci_hcd
*xhci
;
8166 //initial host controller
8170 xhci
= hcd_to_xhci(my_hcd
);
8171 //turn off port power
8172 g_num_u3_port
= SSUSB_U3_PORT_NUM(readl(SSUSB_IP_CAP
));
8173 port_id
= g_num_u3_port
+1;
8174 addr
= &xhci
->op_regs
->port_status_base
+ NUM_PORT_REGS
*(port_id
-1 & 0xff);
8175 temp
= xhci_readl(xhci
, addr
);
8176 temp
= mtktest_xhci_port_state_to_neutral(temp
);
8177 temp
&= ~PORT_POWER
;
8178 xhci_writel(xhci
, temp
, addr
);
8180 mtk_test_dbg( "issue test packet\n");
8181 //test mode - test packet
8183 addr
= &xhci
->op_regs
->port_power_base
+ NUM_PORT_REGS
*(port_id
-1 & 0xff);
8184 temp
= xhci_readl(xhci
, addr
);
8186 temp
|= (test_value
<<28);
8187 xhci_writel(xhci
, temp
, addr
);
8191 static int u2ct_packet_parameter_init(){
8193 mtk_test_dbg( "Reset host controller\n");
8195 if(f_test_lib_cleanup()){
8196 mtk_test_dbg( "cleanup host controller FAILED\n");
8200 if(f_test_lib_init()){
8201 mtk_test_dbg( "init host controller FAILED\n");
8204 mtk_test_dbg( "STEP 1: enable port and slot, address device(BSR=1)...\n");
8205 if(f_enable_port(0)){
8206 mtk_test_dbg( "enable port FAILED!!\n");
8209 if(f_enable_slot(NULL
)){
8210 mtk_test_dbg( "enable slot FAILED!!\n");
8213 if(f_address_slot(false, NULL
)){
8214 mtk_test_dbg( "address device (BSR=1) FAILED!!\n");
8219 static int u2ct_packet_parameter_getdesc(){
8221 struct usb_device
*udev
, *rhdev
;
8222 struct xhci_virt_device
*virt_dev
;
8223 struct xhci_hcd
*xhci
;
8225 struct usb_ctrlrequest
*dr
;
8226 struct usb_config_descriptor
*desc
;
8232 mtk_test_dbg( "[ERROR] slot ID not valid\n");
8236 xhci
= hcd_to_xhci(my_hcd
);
8237 rhdev
= my_hcd
->self
.root_hub
;
8238 udev
= rhdev
->children
[g_port_id
-1];
8240 dr
= kmalloc(sizeof(struct usb_ctrlrequest
), GFP_NOIO
);
8241 dr
->bRequestType
= USB_DIR_IN
;
8242 dr
->bRequest
= USB_REQ_GET_DESCRIPTOR
;
8243 dr
->wValue
= cpu_to_le16((USB_DT_DEVICE
<< 8) + 0);
8244 dr
->wIndex
= cpu_to_le16(0);
8245 dr
->wLength
= cpu_to_le16(USB_DT_DEVICE_SIZE
);
8246 desc
= kmalloc(USB_DT_DEVICE_SIZE
, GFP_KERNEL
);
8247 memset(desc
, 0, USB_DT_DEVICE_SIZE
);
8249 urb
= alloc_ctrl_urb(dr
, desc
, udev
);
8250 ret
= f_ctrlrequest(urb
, udev
);
8251 if(urb
->status
== -EINPROGRESS
){
8252 //timeout, stop endpoint, set TR dequeue pointer
8253 f_ring_stop_ep(g_slot_id
, 0);
8254 f_ring_set_tr_dequeue_pointer(g_slot_id
, 0, urb
);
8263 static int u2ct_disconnect_detect(){
8265 struct xhci_hcd
*xhci
;
8269 mtk_test_dbg( "Reset host controller\n");
8271 if(f_test_lib_cleanup()){
8272 mtk_test_dbg( "cleanup host controller FAILED\n");
8276 if(f_test_lib_init()){
8277 mtk_test_dbg( "init host controller FAILED\n");
8281 xhci
= hcd_to_xhci(my_hcd
);
8282 //turn off port power
8283 g_num_u3_port
= SSUSB_U3_PORT_NUM(readl(SSUSB_IP_CAP
));
8284 port_id
= g_num_u3_port
+1;
8285 addr
= &xhci
->op_regs
->port_status_base
+ NUM_PORT_REGS
*(port_id
-1 & 0xff);
8286 temp
= xhci_readl(xhci
, addr
);
8287 temp
= mtktest_xhci_port_state_to_neutral(temp
);
8288 temp
&= ~PORT_POWER
;
8289 xhci_writel(xhci
, temp
, addr
);
8290 //let SW doesn't do reset after get discon/conn events
8291 g_hs_block_reset
= true;
8292 g_port_connect
= false;
8294 printk(KERN_ERR
"[OTG_H] u2ct_disconnect_detect, g_port_connect is %d\n", g_port_connect
);
8296 //test mode - force enable
8298 addr
= &xhci
->op_regs
->port_power_base
+ NUM_PORT_REGS
*(port_id
-1 & 0xff);
8299 temp
= xhci_readl(xhci
, addr
);
8301 temp
|= (test_value
<<28);
8302 xhci_writel(xhci
, temp
, addr
);
8303 mtk_test_dbg( "Please connect device in 30 secs\n");
8304 //waiting for conn event
8305 wait_event_on_timeout(&g_port_connect
, true, TRANS_TIMEOUT
);
8306 if(!g_port_connect
){
8307 mtk_test_dbg( "Port not connected\n");
8308 g_hs_block_reset
= false;
8311 mtk_test_dbg( "Device connected\n");
8312 mtk_test_dbg( "Please disconnect device in 30 secs\n");
8313 //waiting for discon event
8314 wait_event_on_timeout(&g_port_connect
, false, TRANS_TIMEOUT
);
8316 mtk_test_dbg( "Port not disconnected\n");
8317 g_hs_block_reset
= false;
8320 mtk_test_dbg( "Device disconnected\n");
8321 g_hs_block_reset
= false;
8325 static int u2ct_chirp_timing(){
8326 mtk_test_dbg( "Reset host controller\n");
8328 if(f_test_lib_cleanup()){
8329 mtk_test_dbg( "cleanup host controller FAILED\n");
8333 if(f_test_lib_init()){
8334 mtk_test_dbg( "init host controller FAILED\n");
8340 static int u2ct_suspend_resume_timing_init(){
8341 mtk_test_dbg( "Reset host controller\n");
8343 if(f_test_lib_cleanup()){
8344 mtk_test_dbg( "cleanup host controller FAILED\n");
8348 if(f_test_lib_init()){
8349 mtk_test_dbg( "init host controller FAILED\n");
8355 static int u2ct_suspend_resume_timing_suspend(){
8356 return f_power_suspend();
8359 static int u2ct_suspend_resume_timing_resume(){
8360 return f_power_resume();
8363 static int u2ct_j(){
8365 struct xhci_hcd
*xhci
;
8372 xhci
= hcd_to_xhci(my_hcd
);
8373 //turn off port power
8374 g_num_u3_port
= SSUSB_U3_PORT_NUM(readl(SSUSB_IP_CAP
));
8375 port_id
= g_num_u3_port
+1;
8376 addr
= &xhci
->op_regs
->port_status_base
+ NUM_PORT_REGS
*(port_id
-1 & 0xff);
8377 temp
= xhci_readl(xhci
, addr
);
8378 temp
= mtktest_xhci_port_state_to_neutral(temp
);
8379 temp
&= ~PORT_POWER
;
8380 xhci_writel(xhci
, temp
, addr
);
8381 //test mode - test j
8383 addr
= &xhci
->op_regs
->port_power_base
+ NUM_PORT_REGS
*(port_id
-1 & 0xff);
8384 temp
= xhci_readl(xhci
, addr
);
8386 temp
|= (test_value
<<28);
8387 xhci_writel(xhci
, temp
, addr
);
8392 static int u2ct_k(){
8394 struct xhci_hcd
*xhci
;
8402 xhci
= hcd_to_xhci(my_hcd
);
8403 //turn off port power
8404 g_num_u3_port
= SSUSB_U3_PORT_NUM(readl(SSUSB_IP_CAP
));
8405 port_id
= g_num_u3_port
+1;
8406 addr
= &xhci
->op_regs
->port_status_base
+ NUM_PORT_REGS
*(port_id
-1 & 0xff);
8407 temp
= xhci_readl(xhci
, addr
);
8408 temp
= mtktest_xhci_port_state_to_neutral(temp
);
8409 temp
&= ~PORT_POWER
;
8410 xhci_writel(xhci
, temp
, addr
);
8411 //test mode - test k
8413 addr
= &xhci
->op_regs
->port_power_base
+ NUM_PORT_REGS
*(port_id
-1 & 0xff);
8414 temp
= xhci_readl(xhci
, addr
);
8416 temp
|= (test_value
<<28);
8417 xhci_writel(xhci
, temp
, addr
);
8422 static int u2ct_se0_nak(){
8424 struct xhci_hcd
*xhci
;
8432 xhci
= hcd_to_xhci(my_hcd
);
8433 //turn off port power
8434 g_num_u3_port
= SSUSB_U3_PORT_NUM(readl(SSUSB_IP_CAP
));
8435 port_id
= g_num_u3_port
+1;
8436 addr
= &xhci
->op_regs
->port_status_base
+ NUM_PORT_REGS
*(port_id
-1 & 0xff);
8437 temp
= xhci_readl(xhci
, addr
);
8438 temp
= mtktest_xhci_port_state_to_neutral(temp
);
8439 temp
&= ~PORT_POWER
;
8440 xhci_writel(xhci
, temp
, addr
);
8441 //test mode - test k
8443 addr
= &xhci
->op_regs
->port_power_base
+ NUM_PORT_REGS
*(port_id
-1 & 0xff);
8444 temp
= xhci_readl(xhci
, addr
);
8446 temp
|= (test_value
<<28);
8447 xhci_writel(xhci
, temp
, addr
);
8452 static int dbg_u2ct(int argc
, char** argv
){
8457 td_no
= (int)simple_strtol(argv
[1], &argv
[1], 10);
8460 case 6: case 3: case 7:
8461 return u2ct_signal_quality();
8463 case 21: case 25: case 23: case 22: case 55:
8464 mtk_test_dbg( "(211, 251, 231, 221, 551) STEP 1, (212, 252, 232, 222, 552) STEP 2, (213, 253, 233, 223, 553) STEP 3\n");
8466 case 211: case 251: case 231: case 221: case 551:
8467 return u2ct_packet_parameter_init();
8469 case 212: case 213: case 252: case 253: case 232: case 233: case 222: case 223: case 552: case 553:
8470 return u2ct_packet_parameter_getdesc();
8473 return u2ct_disconnect_detect();
8475 case 33: case 34: case 35:
8476 return u2ct_chirp_timing();
8479 mtk_test_dbg( "(391,411) STEP 1, (392, 412) STEP 2, (393, 413) STEP 3\n");
8482 return u2ct_suspend_resume_timing_init();
8485 return u2ct_suspend_resume_timing_suspend();
8488 return u2ct_suspend_resume_timing_resume();
8491 mtk_test_dbg( "(81) J test (82) K test\n");
8500 return u2ct_se0_nak();
8503 mtk_test_dbg( "please enter EL number\n");
8508 #define EP_SPEED_SS 1
8509 #define EP_SPEED_HS 2
8510 #define EP_SPEED_FS 3
8511 #define EP_SPEED_LS 4
8512 #define EP_SPEED_RANDOM 0
8516 #define MAX_EPNUM 100
8518 static int dbg_sch_algorithm(int argc
, char** argv
){
8519 struct xhci_hcd
*xhci
;
8520 struct usb_device
*udev_ss
, *udev_hs
, *udev_fs
, *udev_ls
, *rhdev
, *udev
;
8521 int test_speed
, cur_speed
;
8522 struct usb_host_endpoint
*ep
;
8523 struct xhci_ep_ctx
*ep_ctx
;
8524 char is_continue
, ep_boundary
, ep_num
;
8525 int ep_dir
, transfer_type
, maxp
, bInterval
, mult
, burst
;
8528 struct usb_host_endpoint
*ep_list
[MAX_EPNUM
];
8529 struct xhci_virt_device
*virt_dev
;
8530 struct xhci_slot_ctx
*slot_ctx
;
8533 struct sch_ep
*sch_ep
;
8534 test_speed
= EP_SPEED_HS
;
8538 //0: all(except for ss), 1: ss, 2: hs, 3: fs, 4: ls
8539 test_speed
= (int)simple_strtol(argv
[1], &argv
[1], 10);
8540 mtk_test_dbg( "Test speed %d\n", test_speed
);
8543 ep_boundary
= (int)simple_strtol(argv
[2], &argv
[2], 10);
8544 mtk_test_dbg( "Try %d EPs\n", ep_boundary
);
8545 if(ep_boundary
> MAX_EPNUM
){
8546 mtk_test_dbg( "EP num too much!!\n");
8551 xhci
= hcd_to_xhci(my_hcd
);
8552 //create 4 device, ss, hs, fs(tt), ls(tt)
8553 rhdev
= my_hcd
->self
.root_hub
;
8555 udev_ss
= mtk_usb_alloc_dev(rhdev
, rhdev
->bus
, 1);
8556 udev_ss
->speed
= USB_SPEED_SUPER
;
8557 udev_ss
->level
= rhdev
->level
+ 1;
8558 udev_ss
->slot_id
= 1;
8559 mtktest_xhci_alloc_virt_device(xhci
, 1, udev_ss
, GFP_KERNEL
);
8561 udev_hs
= mtk_usb_alloc_dev(rhdev
, rhdev
->bus
, 2);
8562 udev_hs
->speed
= USB_SPEED_HIGH
;
8563 udev_hs
->level
= rhdev
->level
+ 1;
8564 udev_hs
->slot_id
= 2;
8565 mtktest_xhci_alloc_virt_device(xhci
, 2, udev_hs
, GFP_KERNEL
);
8567 udev_fs
= mtk_usb_alloc_dev(rhdev
, udev_hs
->bus
, 1);
8568 udev_fs
->speed
= USB_SPEED_FULL
;
8569 udev_fs
->level
= udev_hs
->level
+ 1;
8570 udev_fs
->tt
= kzalloc(sizeof(struct usb_tt
), GFP_KERNEL
);
8571 udev_fs
->tt
->hub
= udev_hs
;
8572 udev_fs
->tt
->multi
= false;
8573 udev_fs
->tt
->think_time
= 0;
8574 udev_fs
->ttport
= 1;
8575 udev_fs
->slot_id
= 3;
8576 mtktest_xhci_alloc_virt_device(xhci
, 3, udev_fs
, GFP_KERNEL
);
8577 virt_dev
= xhci
->devs
[3];
8578 slot_ctx
= mtktest_xhci_get_slot_ctx(xhci
, virt_dev
->out_ctx
);
8579 slot_ctx
->tt_info
= 0x1;
8581 udev_ls
= mtk_usb_alloc_dev(rhdev
, udev_hs
->bus
, 2);
8582 udev_ls
->speed
= USB_SPEED_LOW
;
8583 udev_ls
->level
= udev_hs
->level
+ 1;
8584 udev_ls
->tt
= kzalloc(sizeof(struct usb_tt
), GFP_KERNEL
);
8585 udev_ls
->tt
->hub
= udev_hs
;
8586 udev_ls
->tt
->multi
= false;
8587 udev_ls
->tt
->think_time
= 0;
8588 udev_ls
->ttport
= 2;
8589 udev_ls
->slot_id
= 4;
8590 mtktest_xhci_alloc_virt_device(xhci
, 4, udev_ls
, GFP_KERNEL
);
8591 virt_dev
= xhci
->devs
[4];
8592 slot_ctx
= mtktest_xhci_get_slot_ctx(xhci
, virt_dev
->out_ctx
);
8593 slot_ctx
->tt_info
= 0x1;
8594 //1.random add ep (speed(fix or random), iso or intr, maxp, interrupt, mult, burst)
8596 //3.directly call add/remove ep scheduler API
8597 //4.check if success, if failed over 10 times next, else goto 1
8600 while(ep_num
< ep_boundary
){
8601 ep_dir
= get_random_int() % 2;
8605 if(test_speed
== 0){
8606 cur_speed
= (get_random_int()%3)+2;
8609 cur_speed
= test_speed
;
8614 transfer_type
= get_random_int() % 2;
8615 if(transfer_type
== 0){
8616 transfer_type
= EPATT_INT
;
8617 burst
= get_random_int() % 3;
8622 maxp
= ((get_random_int() % 16)+1)*64;
8624 bInterval
= (get_random_int()%8)+1;
8627 burst
= get_random_int() % 16;
8632 maxp
= ((get_random_int() % 4)+1)*256;
8634 mult
= get_random_int() % 3;
8635 bInterval
= (get_random_int()%8)+1;
8640 transfer_type
= get_random_int() % 2;
8641 if(transfer_type
== 0){
8642 transfer_type
= EPATT_INT
;
8643 maxp
= ((get_random_int() % 16)+1)*64;
8644 mult
= get_random_int() % 3;
8646 bInterval
= (get_random_int()%8)+1;
8649 maxp
= ((get_random_int() % 16) + 1)*64;
8650 mult
= get_random_int() % 3;
8652 bInterval
= (get_random_int()%8)+1;
8657 transfer_type
= get_random_int() % 2;
8658 if(transfer_type
== 0){
8659 transfer_type
= EPATT_INT
;
8660 maxp
= ((get_random_int() % 8)+1)*8;
8663 bInterval
= (get_random_int()%256)+1;
8667 maxp
= ((get_random_int() % 16) + 1)*64;
8673 bInterval
= (get_random_int()%6)+1;
8679 transfer_type
= EPATT_INT
;
8681 bInterval
= (get_random_int()%256)+1;
8685 ep
= kmalloc(sizeof(struct usb_host_endpoint
), GFP_NOIO
);
8686 ep
->desc
.bDescriptorType
= USB_DT_ENDPOINT
;
8687 if(ep_dir
== EP_OUT
){
8688 ep
->desc
.bEndpointAddress
= EPADD_NUM(1) | EPADD_OUT
;
8691 ep
->desc
.bEndpointAddress
= EPADD_NUM(1) | EPADD_IN
;
8693 ep
->desc
.bmAttributes
= transfer_type
;
8694 if(cur_speed
== EP_SPEED_SS
){
8695 ep
->desc
.wMaxPacketSize
= maxp
;
8696 ep
->ss_ep_comp
.bmAttributes
= mult
;
8697 ep
->ss_ep_comp
.bMaxBurst
= burst
;
8700 ep
->desc
.wMaxPacketSize
= maxp
| (mult
<< 11);
8701 ep
->ss_ep_comp
.bmAttributes
= 0;
8702 ep
->ss_ep_comp
.bMaxBurst
= 0;
8704 ep
->desc
.bInterval
= bInterval
;
8705 interval
= 1<<(bInterval
-1);
8706 ep_ctx
= mtk_xhci_alloc_container_ctx(xhci
, XHCI_CTX_TYPE_DEVICE
, GFP_NOIO
);
8707 if(transfer_type
== EPATT_INT
&& (cur_speed
== EP_SPEED_FS
|| cur_speed
== EP_SPEED_LS
)){
8709 interval
= fls(8 * ep
->desc
.bInterval
) - 1;
8710 interval
= clamp_val(interval
, 3, 10);
8711 mtk_test_dbg( "ROUNDING interval to %d\n", interval
);
8712 ep_ctx
->ep_info
= EP_INTERVAL(interval
);
8714 mtk_test_dbg( "[EP]Speed[%d]dir[%d]transfer_type[%d]bInterval[%d]maxp[%d]burst[%d]mult[%d]"
8715 , cur_speed
, ep_dir
, transfer_type
, bInterval
, maxp
, burst
, mult
);
8717 sch_ep
= kmalloc(sizeof(struct sch_ep
), GFP_KERNEL
);
8718 ret
= mtktest_mtk_xhci_scheduler_add_ep(udev
->speed
, usb_endpoint_dir_in(&ep
->desc
), isTT
8719 , transfer_type
, maxp
, interval
, burst
, mult
, (u32
*)ep
, (u32
*)ep_ctx
, sch_ep
);
8721 ret
= mtktest_mtk_xhci_scheduler_add_ep(xhci
, udev
, ep
, ep_ctx
);
8723 if(ret
== SCH_SUCCESS
){
8724 mtk_test_dbg( "......Success\n");
8725 ep_list
[ep_index
] = ep
;
8730 mtk_test_dbg( "......Failed\n");
8734 //dump EP list and scheduler result
8735 //mtk_xhci_scheduler_dump_all(xhci);
8739 static int dbg_u3_calibration(int argc
, char** argv
){
8749 char u1ReadTimingValue
;
8750 char u1ReadPhyClkDrvValue
;
8764 int num_u3_port
, num_u2_port
;
8765 __u32 __iomem
*ip_reset_addr
;
8766 __u32 __iomem
*latch_sel_addr
;
8767 __u32 __iomem
*u3_cmd_addr
;
8768 __u32 __iomem
*u3_sts_addr
;
8769 __u32 __iomem
*u3_p1_sc_addr
;
8770 __u32 __iomem
*u3_p1_ltssm_addr
;
8771 __u32 __iomem
*u3_link_err_count_addr
;
8772 __u32 __iomem
*u3_recovery_count_addr
;
8774 num_u3_port
= SSUSB_U3_PORT_NUM(readl(SSUSB_IP_CAP
));
8775 num_u2_port
= SSUSB_U2_PORT_NUM(readl(SSUSB_IP_CAP
));
8777 latch_sel_addr
= U3_PIPE_LATCH_SEL_ADD
;
8778 u3_cmd_addr
= U3_XHCI_CMD_ADDR
;
8779 u3_sts_addr
= U3_XHCI_STS_ADDR
;
8780 u3_p1_sc_addr
= U3_P1_SC
;
8781 u3_p1_ltssm_addr
= U3_P1_LTSSM
;
8782 u3_link_err_count_addr
= U3_LINK_ERR_COUNT
;
8783 u3_recovery_count_addr
= U3_RECOVERY_COUNT
;
8786 for(u1RxSel
= 0; u1RxSel
<2; u1RxSel
++){
8788 for(u1TimeDelay
=0; u1TimeDelay
<32; u1TimeDelay
++){
8789 mtk_test_dbg( "Test TxSel[0x%02x] RxSel[0x%02x] TimingDelay[0x%02x] Reg[0x%02x]...\n"
8790 , u1TxSel
, u1RxSel
, u1TimeDelay
, u1TimeDelay
<<3);
8792 u3phy_ops
->change_pipe_phase(u3phy
, u1PhyDrv
, u1TimeDelay
);
8794 writel(readl(SSUSB_IP_PW_CTRL
) | (SSUSB_IP_SW_RST
), SSUSB_IP_PW_CTRL
);
8795 writel(readl(SSUSB_IP_PW_CTRL
) & (~SSUSB_IP_SW_RST
), SSUSB_IP_PW_CTRL
);
8796 writel(readl(SSUSB_IP_PW_CTRL_1
) & (~SSUSB_IP_PDN
), SSUSB_IP_PW_CTRL_1
);
8798 //turn on power, clock of each port
8799 for(i
=0; i
<num_u3_port
; i
++){
8800 temp
= readl(SSUSB_U3_CTRL(i
));
8801 temp
= temp
& (~SSUSB_U3_PORT_PDN
) & (~SSUSB_U3_PORT_DIS
);
8802 writel(temp
, SSUSB_U3_CTRL(i
));
8804 for(i
=0; i
<num_u2_port
; i
++){
8805 temp
= readl(SSUSB_U2_CTRL(i
));
8806 temp
& (~SSUSB_U2_PORT_PDN
) & (~SSUSB_U2_PORT_DIS
);
8807 writel(temp
, SSUSB_U2_CTRL(i
));
8811 u4LatchValue
= (u1TxSel
<<2) | u1RxSel
;
8812 writel(u4LatchValue
, latch_sel_addr
);
8814 writel(2, u3_cmd_addr
);
8816 for(i
=0; i
<500; i
++){
8817 u4USBStsVal
= readl(u3_sts_addr
);
8818 if(!((u4USBStsVal
&U3_CNR
) == U3_CNR
)){
8822 if((u4USBStsVal
&U3_CNR
) == U3_CNR
){
8823 mtk_test_dbg( "CNR not 0 after HCRST \n");
8827 //for loopback mode, write mac3 t2r loopback
8828 // writel(0x1, 0xf00426dc);
8830 //enable port power of port 1 in xHC port reg
8831 temp
= readl(u3_p1_sc_addr
);
8832 temp
= mtktest_xhci_port_state_to_neutral(temp
);
8834 writel(temp
, u3_p1_sc_addr
);
8843 //if PLS in compliance, set warm reset
8844 //if polling status in U0 more than 3 times, check recovery & link error count, report PASS
8845 // print phase information
8847 for(i
=0; i
<200; i
++){
8848 u4P1ScVal
= readl(u3_p1_sc_addr
);
8849 u1P1PlsVal
= (u4P1ScVal
>>U3_PLS_OFFSET
) & 0xf;
8850 u1Macltssm
= readl(u3_p1_ltssm_addr
);
8851 u1Macltssm
= u1Macltssm
& 0x1f;
8852 if(u1TmpMacltssm
!= u1Macltssm
|| u1TmpP1PlsVal
!= u1P1PlsVal
){
8853 mtk_test_dbg( "Polling %d PLS=%d LTSSM=%d\n", i
, u1P1PlsVal
, u1Macltssm
);
8854 u1TmpMacltssm
= u1Macltssm
;
8855 u1TmpP1PlsVal
= u1P1PlsVal
;
8857 if(u1P1PlsVal
== 10){
8858 u4P1ScVal
= u4P1ScVal
| (int)(1<<31);
8859 writel(u4P1ScVal
, u3_p1_sc_addr
);
8861 if(u1P1PlsVal
== 0){
8864 if(u4CorrectCnt
==3){
8865 //clear recovery count
8866 writel((1<<16), u3_recovery_count_addr
);
8869 u4ErrorCnt
= readl(u3_link_err_count_addr
);
8871 //read error count and recovery count in these period
8872 u4ErrorCnt
= readl(u3_link_err_count_addr
);
8873 u4RecoveryCnt
= readl(u3_recovery_count_addr
);
8879 mtk_test_dbg( "[PASS] PLS=0, Error=%d, Recovery=%d, TxSel[0x%02x] RxSel[0x%02x] PhyDrv[0x%02x] Reg[0x%02x] TimingDelay[0x%02x] Reg[0x%02x]\n"
8880 , u4ErrorCnt
, u4RecoveryCnt
, u1TxSel
, u1RxSel
, u1PhyDrv
, u1PhyDrvValue
, u1TimeDelay
, u1TimingValue
);
8883 mtk_test_dbg( "[FAIL] PLS=%d\n", u1P1PlsVal
);
8890 static int dbg_printhccparams(int argc
, char** argv
){
8891 struct xhci_hcd
*xhci
;
8892 xhci
= hcd_to_xhci(my_hcd
);
8894 int temp
, tmp_add
, i
;
8896 // mtktest_xhci_print_registers(xhci);
8897 xhci_dbg(xhci
, "hcs_params1 add: 0x%p\n", &xhci
->cap_regs
->hcs_params1
);
8898 xhci_dbg(xhci
, "hcs_params2 add: 0x%p\n", &xhci
->cap_regs
->hcs_params2
);
8899 xhci_dbg(xhci
, "hcs_params3 add: 0x%p\n", &xhci
->cap_regs
->hcs_params3
);
8900 xhci_dbg(xhci
, "hc_capbase add: 0x%p\n", &xhci
->cap_regs
->hc_capbase
);
8901 xhci_dbg(xhci
, "hcc_params add: 0x%p\n", &xhci
->cap_regs
->hcc_params
);
8902 temp
= xhci_readl(xhci
, &xhci
->cap_regs
->hcc_params
);
8903 xhci_dbg(xhci
, "hcc_params: 0x%x\n", temp
);
8904 tmp_add
= temp
>> 16;
8905 addr
= ((&xhci
->cap_regs
->hc_capbase
) + (temp
>>16));
8907 while(tmp_add
!= 0){
8908 xhci_dbg(xhci
, "cap pointer %d[0x%p: \n",i
, addr
);
8909 temp
= xhci_readl(xhci
, addr
);
8910 xhci_dbg(xhci
, "0x%x\n", temp
);
8911 tmp_add
= (temp
>> 8) & 0xff;
8912 temp
= xhci_readl(xhci
, addr
+1);
8913 xhci_dbg(xhci
, "0x%x\n", temp
);
8914 temp
= xhci_readl(xhci
, addr
+2);
8915 xhci_dbg(xhci
, "0x%x\n", temp
);
8916 temp
= xhci_readl(xhci
, addr
+3);
8917 xhci_dbg(xhci
, "0x%x\n", temp
);
8919 addr
= addr
+ tmp_add
;
8925 static dbg_port_set_pls(int argc
, char** argv
){
8926 struct xhci_hcd
*xhci
;
8932 port_id
= (int)simple_strtol(argv
[1], &argv
[1], 10);
8933 xhci_dbg(xhci
, "port_id = %d\n", port_id
);
8937 pls
= (int)simple_strtol(argv
[2], &argv
[2], 10);
8938 xhci_dbg(xhci
, "pls set to %d\n", pls
);
8940 xhci
= hcd_to_xhci(my_hcd
);
8941 addr
= &xhci
->op_regs
->port_status_base
+ NUM_PORT_REGS
*(port_id
-1 & 0xff);
8942 temp
= xhci_readl(xhci
, addr
);
8943 temp
= mtktest_xhci_port_state_to_neutral(temp
);
8944 temp
= temp
& ~(PORT_PLS_MASK
);
8945 temp
= temp
| (pls
<< 5) | PORT_LINK_STROBE
;
8946 xhci_writel(xhci
, temp
, addr
);
8950 static int dbg_port_set_ped(int argc
, char** argv
){
8951 struct xhci_hcd
*xhci
;
8957 port_id
= (int)simple_strtol(argv
[1], &argv
[1], 10);
8958 xhci_dbg(xhci
, "port_id = %d\n", port_id
);
8960 xhci
= hcd_to_xhci(my_hcd
);
8961 addr
= &xhci
->op_regs
->port_status_base
+ NUM_PORT_REGS
*(port_id
-1 & 0xff);
8962 temp
= xhci_readl(xhci
, addr
);
8963 temp
= mtktest_xhci_port_state_to_neutral(temp
);
8964 temp
= temp
| PORT_PE
;
8965 xhci_writel(xhci
, temp
, addr
);
8969 static int dbg_port_reset(int argc
, char** argv
){
8970 struct xhci_hcd
*xhci
;
8975 port_id
= g_port_id
;
8979 port_id
= (int)simple_strtol(argv
[1], &argv
[1], 10);
8980 xhci_dbg(xhci
, "port_id = %d\n", port_id
);
8984 if(!strcmp(argv
[2], "true")){
8985 mtk_test_dbg( "test WarmReset=true\n");
8989 xhci
= hcd_to_xhci(my_hcd
);
8992 addr
= &xhci
->op_regs
->port_status_base
+ NUM_PORT_REGS
*(port_id
-1 & 0xff);
8993 temp
= xhci_readl(xhci
, addr
);
8994 temp
= mtktest_xhci_port_state_to_neutral(temp
);
8995 temp
= (temp
| PORT_WR
);
8996 xhci_writel(xhci
, temp
, addr
);
9000 addr
= &xhci
->op_regs
->port_status_base
+ NUM_PORT_REGS
*(port_id
-1 & 0xff);
9001 temp
= xhci_readl(xhci
, addr
);
9002 temp
= mtktest_xhci_port_state_to_neutral(temp
);
9003 temp
= (temp
| PORT_RESET
);
9004 xhci_writel(xhci
, temp
, addr
);
9009 static int dbg_printportstatus(int argc
, char** argv
){
9010 struct xhci_hcd
*xhci
;
9014 port_id
= g_port_id
;
9016 port_id
= (int)simple_strtol(argv
[1], &argv
[1], 10);
9017 xhci_dbg(xhci
, "port_id = %d\n", port_id
);
9019 xhci
= hcd_to_xhci(my_hcd
);
9020 addr
= &xhci
->op_regs
->port_status_base
+ NUM_PORT_REGS
*(port_id
-1 & 0xff);
9021 temp
= xhci_readl(xhci
, addr
);
9022 xhci_dbg(xhci
, "port %d = 0x%x\n", port_id
, temp
);
9026 static int dbg_delayms(int argc
, char** argv
){
9032 msecs
= (int)simple_strtol(argv
[1], &argv
[1], 10);
9033 xhci_dbg(xhci
, "delay %d msecs\n", msecs
);
9041 extern PHY_INT32
_U3Read_Reg(PHY_INT32 address
);
9042 extern PHY_INT32
_U3Write_Reg(PHY_INT32 address
, PHY_INT32 value
);
9044 static int dbg_u3w(int argc
, char**argv
){
9047 int u4TimingAddress
;
9051 mtk_test_dbg( "Arg: address value\n");
9054 u4TimingAddress
= (int)simple_strtol(argv
[1], &argv
[1], 16);
9055 u4TimingValue
= (int)simple_strtol(argv
[2], &argv
[2], 16);
9056 u1TimingValue
= u4TimingValue
& 0xff;
9057 //_U3Write_Reg(u4TimingAddress, u1TimingValue);
9058 U3PhyWriteReg8(u4TimingAddress
, u1TimingValue
);
9059 mtk_test_dbg( "Write done\n");
9063 static int dbg_u3r(int argc
, char**argv
){
9064 char u1ReadTimingValue
;
9065 int u4TimingAddress
;
9068 mtk_test_dbg( "Arg: address\n");
9072 u4TimingAddress
= (int)simple_strtol(argv
[1], &argv
[1], 16);
9073 //u1ReadTimingValue = _U3Read_Reg(u4TimingAddress);
9074 u1ReadTimingValue
= U3PhyReadReg8(u4TimingAddress
);
9075 mtk_test_dbg( "Value = 0x%x\n", u1ReadTimingValue
);
9080 extern PHY_INT32
u2_slew_rate_calibration_d60802(struct u3phy_info
*info
);
9081 static int dbg_u3PHY_init(int argc
, char**argv
){
9084 mtk_test_dbg( "phy registers and operations initial done\n");
9085 if(u3phy_ops
->u2_slew_rate_calibration
){
9086 u3phy_ops
->u2_slew_rate_calibration(u3phy
);
9089 mtk_test_dbg( "WARN: PHY doesn't implement u2 slew rate calibration function\n");
9091 if(u3phy_ops
->init(u3phy
) == PHY_TRUE
)
9097 // USBIF , skip slew rate calibration ?
9098 extern void phy_probe_out_x();
9099 extern void phy_dump_regs();
9100 extern void phy_probe_reg();
9101 extern void phy_reset();
9103 static int dbg_u3PHY_init(int argc
, char**argv
){
9105 mtk_test_dbg( "phy registers and operations initial done\n");
9106 u3phy_ops
->init(u3phy
);
9112 static int dbg_phy_eyescan(int argc
, char** argv
){
9113 _rEye1
.bX_tl
= (int)simple_strtol(argv
[1], &argv
[1], 10);
9114 _rEye1
.bY_tl
= (int)simple_strtol(argv
[2], &argv
[2], 10);
9115 _rEye1
.bX_br
= (int)simple_strtol(argv
[3], &argv
[3], 10);
9116 _rEye1
.bY_br
= (int)simple_strtol(argv
[4], &argv
[4], 10);
9117 _rEye1
.bDeltaX
= (int)simple_strtol(argv
[5], &argv
[5], 10);
9118 _rEye1
.bDeltaY
= (int)simple_strtol(argv
[6], &argv
[6], 10);
9120 _rEye2
.bX_tl
= (int)simple_strtol(argv
[1], &argv
[1], 10);
9121 _rEye2
.bY_tl
= (int)simple_strtol(argv
[2], &argv
[2], 10);
9122 _rEye2
.bX_br
= (int)simple_strtol(argv
[3], &argv
[3], 10);
9123 _rEye2
.bY_br
= (int)simple_strtol(argv
[4], &argv
[4], 10);
9124 _rEye2
.bDeltaX
= (int)simple_strtol(argv
[5], &argv
[5], 10);
9125 _rEye2
.bDeltaY
= (int)simple_strtol(argv
[6], &argv
[6], 10);
9127 _rTestCycle
.wEyeCnt
= (int)simple_strtol(argv
[7], &argv
[7], 10);
9128 _rTestCycle
.bNumOfEyeCnt
= (int)simple_strtol(argv
[8], &argv
[8], 10);
9129 _rTestCycle
.bNumOfIgnoreCnt
= (int)simple_strtol(argv
[9], &argv
[9], 10);
9130 _rTestCycle
.bPICalEn
= 1;
9133 u3phy_ops
->eyescan(u3phy
, _rEye1
.bX_tl
, _rEye1
.bY_tl
, _rEye1
.bX_br
, _rEye1
.bY_br
, _rEye1
.bDeltaX
, _rEye1
.bDeltaY
9134 , _rTestCycle
.wEyeCnt
, _rTestCycle
.bNumOfEyeCnt
, _rTestCycle
.bPICalEn
, _rTestCycle
.bNumOfIgnoreCnt
);
9138 static int dbg_u2_testmode(int argc
, char** argv
){
9139 struct xhci_hcd
*xhci
;
9145 mtk_test_dbg( "Args: test mode value\n");
9146 mtk_test_dbg( " (0)not enabled (1)J_STATE (2)K_STATE (3)SE0_NAK (4)Packet (5)FORCE_ENABLE (15)Port test control error\n");
9151 test_value
= (int)simple_strtol(argv
[1], &argv
[1], 10);
9152 xhci_dbg(xhci
, "test_value = %d\n", test_value
);
9154 xhci
= hcd_to_xhci(my_hcd
);
9155 addr
= &xhci
->op_regs
->port_power_base
+ NUM_PORT_REGS
*(port_id
-1 & 0xff);
9156 temp
= xhci_readl(xhci
, addr
);
9158 temp
|= (test_value
<<28);
9159 xhci_writel(xhci
, temp
, addr
);
9166 static int dbg_memorywrite(int argc
, char** argv
){
9167 unsigned int addr
, value
;
9170 mtk_test_dbg( "Arg: address value\n");
9174 addr
= (int)simple_strtol(argv
[1], &argv
[1], 16);
9175 value
= (int)simple_strtol(argv
[2], &argv
[2], 16);
9177 writel(value
, addr
);
9180 static int dbg_memoryread(int argc
, char** argv
){
9181 unsigned int addr
, value
;
9184 mtk_test_dbg( "Arg: address\n");
9187 addr
= (int)simple_strtol(argv
[1], &argv
[1], 16);
9188 value
= readl(addr
);
9189 mtk_test_dbg( "Addr: 0x%x, Value: 0x%x\n", addr
, value
);
9192 static int dbg_printslotcontext(int argc
, char** argv
){
9193 struct xhci_hcd
*xhci
;
9194 struct xhci_container_ctx
*out_ctx
, *in_ctx
;
9197 slot_id
= g_slot_id
;
9200 slot_id
= (int)simple_strtol(argv
[1], &argv
[1], 10);
9201 xhci_dbg(xhci
, "slot id set to %d\n", slot_id
);
9204 xhci
= hcd_to_xhci(my_hcd
);
9205 in_ctx
= xhci
->devs
[slot_id
]->in_ctx
;
9206 mtktest_xhci_dbg_ctx(xhci
, in_ctx
, 5);
9207 out_ctx
= xhci
->devs
[slot_id
]->out_ctx
;
9208 mtktest_mtk_xhci_dbg_ctx(xhci
, out_ctx
, 5);
9212 static int dbg_read_xhci(int argc
, char** argv
)
9218 u32 temp1
, temp2
, temp3
, temp4
;
9220 struct xhci_hcd
*xhci
= hcd_to_xhci(my_hcd
);
9223 u4SrcAddr
= simple_strtoul(argv
[1], NULL
, 16) & 0xfffffffc;
9224 u4Len
= simple_strtoul(argv
[2], NULL
, 16);
9226 //no operation is needed
9232 //the maximum number of bytes
9238 //sum together xhci register base address and offset
9239 u4SrcAddr
+= ((u32
)(unsigned long)xhci
->cap_regs
);
9241 for (u4Idx
= 0; u4Idx
< u4Len
; u4Idx
+= 16)
9243 temp1
= xhci_readl(xhci
, (u4SrcAddr
+ u4Idx
+ 0));
9244 temp2
= xhci_readl(xhci
, (u4SrcAddr
+ u4Idx
+ 4));
9245 temp3
= xhci_readl(xhci
, (u4SrcAddr
+ u4Idx
+ 8));
9246 temp4
= xhci_readl(xhci
, (u4SrcAddr
+ u4Idx
+ 12));
9248 mtk_test_dbg("0x%08x | %08x %08x %08x %08x\r\n", (u4SrcAddr
+ u4Idx
), temp1
, temp2
, temp3
, temp4
);
9254 static int dbg_dump_regs(int argc
, char** argv
)
9256 struct xhci_hcd
*xhci
= hcd_to_xhci(my_hcd
);
9258 mtktest_xhci_print_registers(xhci
);
9263 struct file_operations xhci_mtk_test_fops_host
= {
9265 read
: xhci_mtk_test_read
,
9266 write
: xhci_mtk_test_write
,
9268 unlocked_ioctl
: xhci_mtk_test_unlock_ioctl
,
9270 ioctl
: xhci_mtk_test_ioctl
,
9272 open
: xhci_mtk_test_open
,
9273 release
: xhci_mtk_test_release
,
9276 // USBIF , to send IF uevent
9277 int usbif_u3h_test_send_event(char* event
)
9279 char udev_event
[128];
9280 char *envp
[] = {udev_event
, NULL
};
9283 snprintf(udev_event
, 128, "USBIF_EVENT=%s",event
);
9284 printk("usbif_u3h_test_send_event - sending event - %s in %s\n", udev_event
, kobject_get_path(&mu3h_test_uevent_device
.this_device
->kobj
, GFP_KERNEL
));
9285 ret
= kobject_uevent_env(&mu3h_test_uevent_device
.this_device
->kobj
, KOBJ_CHANGE
, envp
);
9287 printk("usbif_u3h_test_send_event sending failed with ret = %d, \n", ret
);
9292 static int __init
mtk_test_init(void)
9295 struct class *cli_class
;
9296 dev_t cli_dev_t
= MKDEV(XHCI_MTK_TEST_MAJOR
, 0) ;
9297 struct device
*cli_dev
;
9299 mtk_test_dbg( "xchi_mtk_test Init\n");
9301 cli_class
= class_create(THIS_MODULE
, DEVICE_NAME
);
9302 if (IS_ERR(cli_class
))
9303 mtk_test_dbg("%s: failed to create cli class ", __func__
);
9305 cli_dev
= device_create(cli_class
, NULL
, cli_dev_t
, NULL
, DEVICE_NAME
);
9306 if (IS_ERR(cli_dev
))
9307 mtk_test_dbg("%s: failed to create cli dev ", __func__
);
9309 retval
= register_chrdev(XHCI_MTK_TEST_MAJOR
, DEVICE_NAME
, &xhci_mtk_test_fops_host
);
9312 mtk_test_dbg( "xchi_mtk_test Init failed, %d\n", retval
);
9315 g_port_connect
= false;
9316 g_port_reset
= false;
9317 g_event_full
= false;
9320 g_speed
= 0; // UNKNOWN_SPEED
9321 g_cmd_status
= CMD_DONE
;
9322 // g_trans_status = TRANS_DONE;
9323 g_exec_done
= true ;
9327 printk(KERN_ERR
"[OTG_H] mtk_test_init, g_port_connect is %d\n", g_port_connect
);
9329 if (!misc_register(&mu3h_test_uevent_device
)){
9330 printk("create the mu3h_test_uevent_device uevent device OK!\n") ;
9333 printk("[ERROR] create the mu3h_test_uevent_device uevent device fail\n") ;
9340 module_init(mtk_test_init
);
9342 static void __exit
mtk_test_cleanup(void)
9344 mtk_test_dbg( "xchi_mtk_test End\n");
9345 misc_deregister(&mu3h_test_uevent_device
);
9347 unregister_chrdev(XHCI_MTK_TEST_MAJOR
, DEVICE_NAME
);
9349 mtk_xhci_hcd_cleanup();
9352 module_exit(mtk_test_cleanup
);
9354 MODULE_LICENSE("GPL");