forked from Minki/linux
staging: spectra: move all init logic into nand_pci_probe
Currently there are some driver initialization logic that is not part of nand_pci_probe function. This will result in that part of driver initialization code executing even on platforms without the corresponding hardware which is always dangerous. Signed-off-by: Chuanxiao Dong <chuanxiao.dong@intel.com> Signed-off-by: Yong Wang <yong.y.wang@intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
237a1a1aef
commit
6f5a416216
@ -729,34 +729,16 @@ static void create_sysfs_entry(struct device *dev)
|
||||
}
|
||||
*/
|
||||
|
||||
static int GLOB_SBD_init(void)
|
||||
int register_spectra_ftl()
|
||||
{
|
||||
int i;
|
||||
|
||||
/* Set debug output level (0~3) here. 3 is most verbose */
|
||||
printk(KERN_ALERT "Spectra: %s\n", GLOB_version);
|
||||
|
||||
mutex_init(&spectra_lock);
|
||||
|
||||
GLOB_SBD_majornum = register_blkdev(0, GLOB_SBD_NAME);
|
||||
if (GLOB_SBD_majornum <= 0) {
|
||||
printk(KERN_ERR "Unable to get the major %d for Spectra",
|
||||
GLOB_SBD_majornum);
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
if (PASS != GLOB_FTL_Flash_Init()) {
|
||||
printk(KERN_ERR "Spectra: Unable to Initialize Flash Device. "
|
||||
"Aborting\n");
|
||||
goto out_flash_register;
|
||||
}
|
||||
|
||||
/* create_sysfs_entry(&dev->dev); */
|
||||
|
||||
if (PASS != GLOB_FTL_IdentifyDevice(&IdentifyDeviceData)) {
|
||||
printk(KERN_ERR "Spectra: Unable to Read Flash Device. "
|
||||
"Aborting\n");
|
||||
goto out_flash_register;
|
||||
return -ENOMEM;
|
||||
} else {
|
||||
nand_dbg_print(NAND_DBG_WARN, "In GLOB_SBD_init: "
|
||||
"Num blocks=%d, pagesperblock=%d, "
|
||||
@ -775,24 +757,46 @@ static int GLOB_SBD_init(void)
|
||||
}
|
||||
printk(KERN_ALERT "Spectra: block table has been found.\n");
|
||||
|
||||
GLOB_SBD_majornum = register_blkdev(0, GLOB_SBD_NAME);
|
||||
if (GLOB_SBD_majornum <= 0) {
|
||||
printk(KERN_ERR "Unable to get the major %d for Spectra",
|
||||
GLOB_SBD_majornum);
|
||||
goto out_ftl_flash_register;
|
||||
}
|
||||
|
||||
for (i = 0; i < NUM_DEVICES; i++)
|
||||
if (SBD_setup_device(&nand_device[i], i) == -ENOMEM)
|
||||
goto out_ftl_flash_register;
|
||||
goto out_blk_register;
|
||||
|
||||
nand_dbg_print(NAND_DBG_DEBUG,
|
||||
"Spectra: module loaded with major number %d\n",
|
||||
GLOB_SBD_majornum);
|
||||
|
||||
return 0;
|
||||
return PASS;
|
||||
|
||||
out_blk_register:
|
||||
unregister_blkdev(GLOB_SBD_majornum, GLOB_SBD_NAME);
|
||||
out_ftl_flash_register:
|
||||
GLOB_FTL_Cache_Release();
|
||||
out_flash_register:
|
||||
GLOB_FTL_Flash_Release();
|
||||
unregister_blkdev(GLOB_SBD_majornum, GLOB_SBD_NAME);
|
||||
printk(KERN_ERR "Spectra: Module load failed.\n");
|
||||
|
||||
return -ENOMEM;
|
||||
return FAIL;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(register_spectra_ftl);
|
||||
|
||||
static int GLOB_SBD_init(void)
|
||||
{
|
||||
/* Set debug output level (0~3) here. 3 is most verbose */
|
||||
printk(KERN_ALERT "Spectra: %s\n", GLOB_version);
|
||||
|
||||
mutex_init(&spectra_lock);
|
||||
|
||||
if (PASS != GLOB_FTL_Flash_Init()) {
|
||||
printk(KERN_ERR "Spectra: Unable to Initialize Flash Device. "
|
||||
"Aborting\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __exit GLOB_SBD_exit(void)
|
||||
|
@ -80,5 +80,6 @@ extern int nand_debug_level;
|
||||
extern int GLOB_Calc_Used_Bits(u32 n);
|
||||
extern u64 GLOB_u64_Div(u64 addr, u32 divisor);
|
||||
extern u64 GLOB_u64_Remainder(u64 addr, u32 divisor_type);
|
||||
extern int register_spectra_ftl(void);
|
||||
|
||||
#endif /* _FFSPORT_ */
|
||||
|
@ -1258,9 +1258,7 @@ int GLOB_FTL_Flash_Init(void)
|
||||
|
||||
g_SBDCmdIndex = 0;
|
||||
|
||||
GLOB_LLD_Flash_Init();
|
||||
|
||||
status = GLOB_LLD_Read_Device_ID();
|
||||
status = GLOB_LLD_Flash_Init();
|
||||
|
||||
return status;
|
||||
}
|
||||
|
@ -2395,112 +2395,9 @@ static int nand_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
|
||||
unsigned long csr_base;
|
||||
unsigned long csr_len;
|
||||
struct mrst_nand_info *pndev = &info;
|
||||
|
||||
nand_dbg_print(NAND_DBG_WARN, "%s, Line %d, Function: %s\n",
|
||||
__FILE__, __LINE__, __func__);
|
||||
|
||||
ret = pci_enable_device(dev);
|
||||
if (ret) {
|
||||
printk(KERN_ERR "Spectra: pci_enable_device failed.\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
pci_set_master(dev);
|
||||
pndev->dev = dev;
|
||||
|
||||
csr_base = pci_resource_start(dev, 0);
|
||||
if (!csr_base) {
|
||||
printk(KERN_ERR "Spectra: pci_resource_start failed!\n");
|
||||
ret = -ENODEV;
|
||||
goto failed_req_csr;
|
||||
}
|
||||
|
||||
csr_len = pci_resource_len(dev, 0);
|
||||
if (!csr_len) {
|
||||
printk(KERN_ERR "Spectra: pci_resource_len failed!\n");
|
||||
ret = -ENODEV;
|
||||
goto failed_req_csr;
|
||||
}
|
||||
|
||||
ret = pci_request_regions(dev, SPECTRA_NAND_NAME);
|
||||
if (ret) {
|
||||
printk(KERN_ERR "Spectra: Unable to request "
|
||||
"memory region\n");
|
||||
goto failed_req_csr;
|
||||
}
|
||||
|
||||
pndev->ioaddr = ioremap_nocache(csr_base, csr_len);
|
||||
if (!pndev->ioaddr) {
|
||||
printk(KERN_ERR "Spectra: Unable to remap memory region\n");
|
||||
ret = -ENOMEM;
|
||||
goto failed_remap_csr;
|
||||
}
|
||||
nand_dbg_print(NAND_DBG_DEBUG, "Spectra: CSR 0x%08lx -> 0x%p (0x%lx)\n",
|
||||
csr_base, pndev->ioaddr, csr_len);
|
||||
|
||||
init_completion(&pndev->complete);
|
||||
nand_dbg_print(NAND_DBG_DEBUG, "Spectra: IRQ %d\n", dev->irq);
|
||||
|
||||
#if CMD_DMA
|
||||
if (request_irq(dev->irq, cdma_isr, IRQF_SHARED,
|
||||
SPECTRA_NAND_NAME, &info)) {
|
||||
printk(KERN_ERR "Spectra: Unable to allocate IRQ\n");
|
||||
ret = -ENODEV;
|
||||
iounmap(pndev->ioaddr);
|
||||
goto failed_remap_csr;
|
||||
}
|
||||
#else
|
||||
if (request_irq(dev->irq, ddma_isr, IRQF_SHARED,
|
||||
SPECTRA_NAND_NAME, &info)) {
|
||||
printk(KERN_ERR "Spectra: Unable to allocate IRQ\n");
|
||||
ret = -ENODEV;
|
||||
iounmap(pndev->ioaddr);
|
||||
goto failed_remap_csr;
|
||||
}
|
||||
#endif
|
||||
|
||||
pci_set_drvdata(dev, pndev);
|
||||
|
||||
return 0;
|
||||
|
||||
failed_remap_csr:
|
||||
pci_release_regions(dev);
|
||||
failed_req_csr:
|
||||
pci_disable_device(dev);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void nand_pci_remove(struct pci_dev *dev)
|
||||
{
|
||||
struct mrst_nand_info *pndev = pci_get_drvdata(dev);
|
||||
|
||||
nand_dbg_print(NAND_DBG_WARN, "%s, Line %d, Function: %s\n",
|
||||
__FILE__, __LINE__, __func__);
|
||||
|
||||
#if CMD_DMA
|
||||
free_irq(dev->irq, pndev);
|
||||
#endif
|
||||
iounmap(pndev->ioaddr);
|
||||
pci_release_regions(dev);
|
||||
pci_disable_device(dev);
|
||||
}
|
||||
|
||||
MODULE_DEVICE_TABLE(pci, nand_pci_ids);
|
||||
|
||||
static struct pci_driver nand_pci_driver = {
|
||||
.name = SPECTRA_NAND_NAME,
|
||||
.id_table = nand_pci_ids,
|
||||
.probe = nand_pci_probe,
|
||||
.remove = nand_pci_remove,
|
||||
};
|
||||
|
||||
int NAND_Flash_Init(void)
|
||||
{
|
||||
int retval;
|
||||
u32 int_mask;
|
||||
|
||||
nand_dbg_print(NAND_DBG_TRACE, "%s, Line %d, Function: %s\n",
|
||||
nand_dbg_print(NAND_DBG_WARN, "%s, Line %d, Function: %s\n",
|
||||
__FILE__, __LINE__, __func__);
|
||||
|
||||
FlashReg = ioremap_nocache(GLOB_HWCTL_REG_BASE,
|
||||
@ -2582,6 +2479,122 @@ int NAND_Flash_Init(void)
|
||||
iowrite32(0, FlashReg + TWO_ROW_ADDR_CYCLES);
|
||||
iowrite32(1, FlashReg + ECC_ENABLE);
|
||||
enable_ecc = 1;
|
||||
ret = pci_enable_device(dev);
|
||||
if (ret) {
|
||||
printk(KERN_ERR "Spectra: pci_enable_device failed.\n");
|
||||
goto failed_req_csr;
|
||||
}
|
||||
|
||||
pci_set_master(dev);
|
||||
pndev->dev = dev;
|
||||
|
||||
csr_base = pci_resource_start(dev, 0);
|
||||
if (!csr_base) {
|
||||
printk(KERN_ERR "Spectra: pci_resource_start failed!\n");
|
||||
ret = -ENODEV;
|
||||
goto failed_req_csr;
|
||||
}
|
||||
|
||||
csr_len = pci_resource_len(dev, 0);
|
||||
if (!csr_len) {
|
||||
printk(KERN_ERR "Spectra: pci_resource_len failed!\n");
|
||||
ret = -ENODEV;
|
||||
goto failed_req_csr;
|
||||
}
|
||||
|
||||
ret = pci_request_regions(dev, SPECTRA_NAND_NAME);
|
||||
if (ret) {
|
||||
printk(KERN_ERR "Spectra: Unable to request "
|
||||
"memory region\n");
|
||||
goto failed_req_csr;
|
||||
}
|
||||
|
||||
pndev->ioaddr = ioremap_nocache(csr_base, csr_len);
|
||||
if (!pndev->ioaddr) {
|
||||
printk(KERN_ERR "Spectra: Unable to remap memory region\n");
|
||||
ret = -ENOMEM;
|
||||
goto failed_remap_csr;
|
||||
}
|
||||
nand_dbg_print(NAND_DBG_DEBUG, "Spectra: CSR 0x%08lx -> 0x%p (0x%lx)\n",
|
||||
csr_base, pndev->ioaddr, csr_len);
|
||||
|
||||
init_completion(&pndev->complete);
|
||||
nand_dbg_print(NAND_DBG_DEBUG, "Spectra: IRQ %d\n", dev->irq);
|
||||
|
||||
#if CMD_DMA
|
||||
if (request_irq(dev->irq, cdma_isr, IRQF_SHARED,
|
||||
SPECTRA_NAND_NAME, &info)) {
|
||||
printk(KERN_ERR "Spectra: Unable to allocate IRQ\n");
|
||||
ret = -ENODEV;
|
||||
iounmap(pndev->ioaddr);
|
||||
goto failed_remap_csr;
|
||||
}
|
||||
#else
|
||||
if (request_irq(dev->irq, ddma_isr, IRQF_SHARED,
|
||||
SPECTRA_NAND_NAME, &info)) {
|
||||
printk(KERN_ERR "Spectra: Unable to allocate IRQ\n");
|
||||
ret = -ENODEV;
|
||||
iounmap(pndev->ioaddr);
|
||||
goto failed_remap_csr;
|
||||
}
|
||||
#endif
|
||||
|
||||
pci_set_drvdata(dev, pndev);
|
||||
|
||||
ret = GLOB_LLD_Read_Device_ID();
|
||||
if (ret) {
|
||||
iounmap(pndev->ioaddr);
|
||||
goto failed_remap_csr;
|
||||
}
|
||||
|
||||
ret = register_spectra_ftl();
|
||||
if (ret) {
|
||||
iounmap(pndev->ioaddr);
|
||||
goto failed_remap_csr;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
failed_remap_csr:
|
||||
pci_release_regions(dev);
|
||||
failed_req_csr:
|
||||
pci_disable_device(dev);
|
||||
iounmap(FlashMem);
|
||||
iounmap(FlashReg);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void nand_pci_remove(struct pci_dev *dev)
|
||||
{
|
||||
struct mrst_nand_info *pndev = pci_get_drvdata(dev);
|
||||
|
||||
nand_dbg_print(NAND_DBG_WARN, "%s, Line %d, Function: %s\n",
|
||||
__FILE__, __LINE__, __func__);
|
||||
|
||||
#if CMD_DMA
|
||||
free_irq(dev->irq, pndev);
|
||||
#endif
|
||||
iounmap(pndev->ioaddr);
|
||||
pci_release_regions(dev);
|
||||
pci_disable_device(dev);
|
||||
}
|
||||
|
||||
MODULE_DEVICE_TABLE(pci, nand_pci_ids);
|
||||
|
||||
static struct pci_driver nand_pci_driver = {
|
||||
.name = SPECTRA_NAND_NAME,
|
||||
.id_table = nand_pci_ids,
|
||||
.probe = nand_pci_probe,
|
||||
.remove = nand_pci_remove,
|
||||
};
|
||||
|
||||
int NAND_Flash_Init(void)
|
||||
{
|
||||
int retval;
|
||||
|
||||
nand_dbg_print(NAND_DBG_TRACE, "%s, Line %d, Function: %s\n",
|
||||
__FILE__, __LINE__, __func__);
|
||||
|
||||
retval = pci_register_driver(&nand_pci_driver);
|
||||
if (retval)
|
||||
|
Loading…
Reference in New Issue
Block a user