static int rkusb_do_thread_cmd( struct rkusb_dev *dev ) { rk28printk("rkusb thread cmd = 0x%x,func=0x%x,len=%d\n" , DEV_CMD(dev),DEV_FUNC(dev) , DEV_LENGTH(dev)); switch( DEV_CMD(dev)) { #if RKUSB_XFILE case K_FW_XFERFILE: { FILE_INFO *fi = rkusb_xfer_cmd_valid( dev ); if( !fi ) { rk28printk("invalid FILE_INFO for K_FW_XFERFILE[0x%x]\n" , K_FW_XFERFILE ); break; } switch( DEV_FUNC(dev )) { case FUNC_XFER_FILE_PATH: rkusb_file_path( dev ); break; case FUNC_RFILE_DATA: case FUNC_WFILE_DATA: rkusb_xfer_file_task( dev ); break; default: break; } if( fi->error ) rkusb_xfer_free_fi( dev ); } break; #endif /* RKUSB_XFILE */ case K_FW_TASKFUN: rkusb_do_task_cmd( dev ); break; case K_FW_SDRAM_READ_10: rkusb_do_read_sdram( dev ); break; case K_FW_SDRAM_WRITE_10: rkusb_do_write_sdram( dev ); break; case K_FW_FUNCALL: rkusb_do_func_call( dev ); break; case K_FW_USBCMD : if(FUNC_UCMD_RKUSBVER== DEV_FUNC(dev ) && (DEV_OFFSET(dev) == ECC_SWITCH_MSC || DEV_OFFSET(dev) == ECC_RESET) ) { char cmd[32]; char *p=(char *)DEV_INREQ_BUF(dev); strncpy( cmd , p , sizeof(cmd) ); rkusb_send_csw( dev , RKUSB_STATUS_PASS ); mdelay(10); sys_sync(); kernel_restart( cmd ); } else { rkusb_send_csw( dev , RKUSB_STATUS_FAIL ); } break; default: return -ENOTSUPP; break; } return 0; }
static int rkusb_command( struct rkusb_dev *dev ) { int r= RKUSB_CB_FAILD; //dev->cb.DataTransferLength = __be32_to_cpu( dev->cb.DataTransferLength ); //dev->cb.Lba = __be32_to_cpu( dev->cb.Lba ); //dev->cb.pid = __be16_to_cpu( dev->cb.pid ); rkusb_print_cb( dev ); if( DEV_LENGTH(dev) > dev->req_buf_length ){ rk28printk("data length[0x%x] > limit[0x%x]\n" , DEV_LENGTH(dev),dev->req_buf_length); DEV_LENGTH(dev) = dev->req_buf_length; } //dev->thread_task->mm = NULL; dev->slave_task = NULL; switch ( DEV_CMD(dev) ) { case K_FW_GETRESULT: r = rkusb_get_lastcmd_result( dev ); break; case K_FW_GETLOG: r = rkusb_get_log( dev ); break; case K_FW_SETLOG: r = rkusb_set_log( dev ); break; case K_FW_TRACE: r = rkusb_do_trace( dev ); break; case K_FW_USBCMD: r = rkusb_usb_command( dev ); break; case K_FW_XFERFILE: r = rkusb_do_xfer_file( dev ); break; case K_FW_FUNCALL: r = rkusb_function_call( dev ); break; case K_FW_SDRAM_READ_10: r = rkusb_read_sdram( dev ); break; case K_FW_SDRAM_WRITE_10: r = rkusb_write_sdram( dev ); break; case K_FW_GETSYMB: r = rkusb_get_symbol( dev ); break; case K_FW_TASKFUN: r = rkusb_task_cmd( dev ); break; default: return RKUSB_NOT_HANDLED; } if( RKUSB_CB_FAILD == r ) { /* 20100330,HSL@RK,for failed cmd,must handle it */ DEV_OFFSET(dev) = 0; rkusb_normal_data_xfer( dev , rkusb_failed_cb ); return 0 ; /* RKUSB_NOT_HANDLED;*/ } else if( RKUSB_CB_OK_CSW == r ) rkusb_send_csw( dev , RKUSB_STATUS_PASS ); else if( RKUSB_CB_FAILD_CSW == r ) rkusb_send_csw( dev , RKUSB_STATUS_FAIL); return 0; }