示例#1
0
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;
}
示例#2
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;
}