diff options
Diffstat (limited to 'drivers/lightnvm/core.c')
| -rw-r--r-- | drivers/lightnvm/core.c | 51 | 
1 files changed, 27 insertions, 24 deletions
diff --git a/drivers/lightnvm/core.c b/drivers/lightnvm/core.c index f659e605a406..5178645ac42b 100644 --- a/drivers/lightnvm/core.c +++ b/drivers/lightnvm/core.c @@ -160,11 +160,6 @@ int nvm_erase_blk(struct nvm_dev *dev, struct nvm_block *blk)  }  EXPORT_SYMBOL(nvm_erase_blk); -static void nvm_core_free(struct nvm_dev *dev) -{ -	kfree(dev); -} -  static int nvm_core_init(struct nvm_dev *dev)  {  	struct nvm_id *id = &dev->identity; @@ -179,12 +174,21 @@ static int nvm_core_init(struct nvm_dev *dev)  	dev->sec_size = grp->csecs;  	dev->oob_size = grp->sos;  	dev->sec_per_pg = grp->fpg_sz / grp->csecs; -	dev->addr_mode = id->ppat; -	dev->addr_format = id->ppaf; +	memcpy(&dev->ppaf, &id->ppaf, sizeof(struct nvm_addr_format));  	dev->plane_mode = NVM_PLANE_SINGLE;  	dev->max_rq_size = dev->ops->max_phys_sect * dev->sec_size; +	if (grp->mtype != 0) { +		pr_err("nvm: memory type not supported\n"); +		return -EINVAL; +	} + +	if (grp->fmtype != 0 && grp->fmtype != 1) { +		pr_err("nvm: flash type not supported\n"); +		return -EINVAL; +	} +  	if (grp->mpos & 0x020202)  		dev->plane_mode = NVM_PLANE_DOUBLE;  	if (grp->mpos & 0x040404) @@ -213,21 +217,18 @@ static void nvm_free(struct nvm_dev *dev)  	if (dev->mt)  		dev->mt->unregister_mgr(dev); - -	nvm_core_free(dev);  }  static int nvm_init(struct nvm_dev *dev)  {  	struct nvmm_type *mt; -	int ret = 0; +	int ret = -EINVAL;  	if (!dev->q || !dev->ops) -		return -EINVAL; +		return ret;  	if (dev->ops->identity(dev->q, &dev->identity)) {  		pr_err("nvm: device could not be identified\n"); -		ret = -EINVAL;  		goto err;  	} @@ -273,7 +274,6 @@ static int nvm_init(struct nvm_dev *dev)  			dev->nr_chnls);  	return 0;  err: -	nvm_free(dev);  	pr_err("nvm: failed to initialize nvm\n");  	return ret;  } @@ -308,22 +308,24 @@ int nvm_register(struct request_queue *q, char *disk_name,  	if (ret)  		goto err_init; -	down_write(&nvm_lock); -	list_add(&dev->devices, &nvm_devices); -	up_write(&nvm_lock); -  	if (dev->ops->max_phys_sect > 1) {  		dev->ppalist_pool = dev->ops->create_dma_pool(dev->q,  								"ppalist");  		if (!dev->ppalist_pool) {  			pr_err("nvm: could not create ppa pool\n"); -			return -ENOMEM; +			ret = -ENOMEM; +			goto err_init;  		}  	} else if (dev->ops->max_phys_sect > 256) {  		pr_info("nvm: max sectors supported is 256.\n"); -		return -EINVAL; +		ret = -EINVAL; +		goto err_init;  	} +	down_write(&nvm_lock); +	list_add(&dev->devices, &nvm_devices); +	up_write(&nvm_lock); +  	return 0;  err_init:  	kfree(dev); @@ -341,11 +343,12 @@ void nvm_unregister(char *disk_name)  		return;  	} -	nvm_exit(dev); -  	down_write(&nvm_lock);  	list_del(&dev->devices);  	up_write(&nvm_lock); + +	nvm_exit(dev); +	kfree(dev);  }  EXPORT_SYMBOL(nvm_unregister); @@ -457,11 +460,11 @@ static void nvm_remove_target(struct nvm_target *t)  	lockdep_assert_held(&nvm_lock);  	del_gendisk(tdisk); +	blk_cleanup_queue(q); +  	if (tt->exit)  		tt->exit(tdisk->private_data); -	blk_cleanup_queue(q); -  	put_disk(tdisk);  	list_del(&t->list); @@ -541,7 +544,7 @@ static int nvm_configure_show(const char *val)  	if (!dev->mt)  		return 0; -	dev->mt->free_blocks_print(dev); +	dev->mt->lun_info_print(dev);  	return 0;  }  |