static int rkusb_write_sdram( struct rkusb_dev *dev ) { int pid; if( __rkusb_write_enable() ) { int max_len; if( DEV_OFFSET(dev) >= 0xc0000000 ) { rkusb_normal_data_xfer( dev , NULL ); return RKUSB_CB_OK_NONE; } max_len = DEV_RWBUF_LENGTH( dev ); if( max_len < DEV_LENGTH(dev) ) { return RKUSB_CB_FAILD; } pid = DEV_PID( dev ); if( pid ) { dev->slave_task = find_task_by_pid( pid ); if(!dev->slave_task ) return RKUSB_CB_FAILD; //rk28printk("%s::pid=%d,task=%s\n" , __func__ , pid , dev->slave_task->comm ); } else { dev->slave_task = current ; } /* bakeup real offset and length */ dev->private_tmp = (void*)DEV_OFFSET(dev); dev->buf_nfill = DEV_LENGTH(dev); __rkusb_set_dest_or_source( dev , __rkusb_rwbuffer_start( dev ) ); rkusb_normal_data_xfer( dev , rkusb_write_sdram_cb); return RKUSB_CB_OK_NONE; } return RKUSB_CB_FAILD; }
static int rkusb_read_sdram( struct rkusb_dev *dev ) { int pid; if( __rkusb_read_enable() ) { if( DEV_OFFSET(dev) >= 0xc0000000 ) { rkusb_normal_data_xfer( dev , NULL ); return RKUSB_CB_OK_NONE; } pid = DEV_PID( dev ); if( pid ) { dev->slave_task = find_task_by_pid( pid ); if(!dev->slave_task ) return RKUSB_CB_FAILD; //rk28printk("%s::pid=%d,task=%s\n" , __func__ , pid , dev->slave_task->comm ); } else { dev->slave_task = current ; } if( dev->slave_task == current ){ char *dest = __rkusb_rwbuffer_start( dev ); int n = copy_from_user((void*)dest, (const void __user*)DEV_OFFSET(dev), DEV_LENGTH(dev)); if( !n ) { rkusb_normal_data_xfer_onetime( dev , dest ); return RKUSB_CB_OK_NONE; } else return RKUSB_CB_FAILD; } rkusb_wakeup_thread( dev ); return RKUSB_CB_OK_NONE; } return RKUSB_CB_FAILD; }
static int rkusb_xfer_file_path( struct rkusb_dev *dev ) { if( DEV_LENGTH(dev) < sizeof(FILE_INFO) || DEV_LENGTH(dev) > RKUSB_BUFFER_SIZE ) { return RKUSB_CB_FAILD; } rkusb_normal_data_xfer( dev , rkusb_xfer_file_path_cb ); return RKUSB_CB_OK_NONE; }
static int rkusb_do_get_task_cmd( struct rkusb_dev *dev ) { struct task_struct *p = dev->slave_task; int len = rkusb_get_task_cmdline( p , __rkusb_rwbuffer_start(dev) , DEV_RWBUF_LENGTH( dev ) ); __rkusb_set_dest_or_source( dev , __rkusb_rwbuffer_start(dev) ); rkusb_normal_data_xfer( dev , rkusb_do_get_taskcmd_cb ); dev->buf[0].filled = len; //rkusb_normal_data_xfer_onetime( dev , __rkusb_rwbuffer_start(dev) ); return RKUSB_CB_OK_NONE; }
/* * write sdram, just send command to shell. */ static int rkusb_set_log( struct rkusb_dev *dev ) { rk28printk("%s:lun=%d,lba=0x%08x\n" ,__func__ , DEV_LUN(dev) , DEV_OFFSET(dev)); if( DEV_LUN(dev) < dev->luns && (dev->log[DEV_LUN(dev)].property & LOG_PROT_WRITE ) && !__system_crashed() ) { rkusb_normal_data_xfer( dev , rkusb_write_shell_callback ); return RKUSB_CB_OK_NONE; } return RKUSB_CB_FAILD; }
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; }
static int rkusb_function_call( struct rkusb_dev *dev ) { rkusb_normal_data_xfer( dev , rkusb_function_call_callback ); return RKUSB_CB_OK_NONE; }