static int bml_block_open(struct block_device *bdev, fmode_t mode) { u32 volume, minor; int ret; minor = MINOR(bdev->bd_dev); #else static int bml_block_open(struct inode *inode, struct file *file) { u32 volume, minor; int ret; minor = MINOR(inode->i_rdev); #endif volume = fsr_vol(minor); DEBUG(DL3,"TINY[I]: volume(%d), minor(%d)\n", volume, minor); if (volume >= FSR_MAX_VOLUMES) { ERRPRINTK("TINY: Out of volume range\n"); return -ENODEV; } ret = FSR_BML_Open(volume, FSR_BML_FLAG_NONE); if (ret != FSR_BML_SUCCESS) { ERRPRINTK("TINY: open error = 0x%x\n", ret); return -ENODEV; } DEBUG(DL3,"TINY[O]: volume(%d), minor(%d)\n", volume, minor); return 0; }
int storage_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg) { int dgs_block_offset = 2047; #ifdef CONFIG_TARGET_LOCALE_KOR if (HWREV >= 12) /* uses 8G OneNAND*/ dgs_block_offset = 4095; #endif printk("Storage Device ioctl -> cmd : %08X, arg : %08X \n", cmd, arg); switch (cmd) { case STORAGE_READ_DGS: { int nRet; unsigned char aDGSBuf[4096]; /* DGS Info Cache */ if (FSR_BML_Open(0, FSR_BML_FLAG_NONE) != FSR_BML_SUCCESS) { printk("BML_Open Error !!\n"); while(1); } /* Acquire SM */ FSR_BML_AcquireSM(0); /* * Read DGS Page * Read 5th Page of 2047 Block */ #ifdef CONFIG_USE_KMALLOC /* * Modified for FSR Read DMA * Use kmalloc buffer to read data by using FSR_BML_Read */ unsigned char *temp = kmalloc(4096, GFP_KERNEL); nRet = FSR_OND_4K_Read(0, dgs_block_offset, 5, temp, NULL, FSR_LLD_FLAG_ECC_OFF); memcpy(aDGSBuf, temp, sizeof(aDGSBuf)); kfree(temp); #else nRet = FSR_OND_4K_Read(0, dgs_block_offset, 5, aDGSBuf, NULL, FSR_LLD_FLAG_ECC_OFF); #endif /* Release SM*/ FSR_BML_ReleaseSM(0); if(nRet != FSR_LLD_SUCCESS) { printk("Reading DGS information failed !!\n"); while(1); } return copy_to_user((char *) arg, (char *) aDGSBuf, sizeof (aDGSBuf)); } default: break; } return 0x53; }