mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-30 08:02:30 +00:00
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
4 changed files with 149 additions and 133 deletions
|
@ -729,34 +729,16 @@ static void create_sysfs_entry(struct device *dev)
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static int GLOB_SBD_init(void)
|
int register_spectra_ftl()
|
||||||
{
|
{
|
||||||
int i;
|
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); */
|
/* create_sysfs_entry(&dev->dev); */
|
||||||
|
|
||||||
if (PASS != GLOB_FTL_IdentifyDevice(&IdentifyDeviceData)) {
|
if (PASS != GLOB_FTL_IdentifyDevice(&IdentifyDeviceData)) {
|
||||||
printk(KERN_ERR "Spectra: Unable to Read Flash Device. "
|
printk(KERN_ERR "Spectra: Unable to Read Flash Device. "
|
||||||
"Aborting\n");
|
"Aborting\n");
|
||||||
goto out_flash_register;
|
return -ENOMEM;
|
||||||
} else {
|
} else {
|
||||||
nand_dbg_print(NAND_DBG_WARN, "In GLOB_SBD_init: "
|
nand_dbg_print(NAND_DBG_WARN, "In GLOB_SBD_init: "
|
||||||
"Num blocks=%d, pagesperblock=%d, "
|
"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");
|
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++)
|
for (i = 0; i < NUM_DEVICES; i++)
|
||||||
if (SBD_setup_device(&nand_device[i], i) == -ENOMEM)
|
if (SBD_setup_device(&nand_device[i], i) == -ENOMEM)
|
||||||
goto out_ftl_flash_register;
|
goto out_blk_register;
|
||||||
|
|
||||||
nand_dbg_print(NAND_DBG_DEBUG,
|
nand_dbg_print(NAND_DBG_DEBUG,
|
||||||
"Spectra: module loaded with major number %d\n",
|
"Spectra: module loaded with major number %d\n",
|
||||||
GLOB_SBD_majornum);
|
GLOB_SBD_majornum);
|
||||||
|
|
||||||
return 0;
|
return PASS;
|
||||||
|
|
||||||
|
out_blk_register:
|
||||||
|
unregister_blkdev(GLOB_SBD_majornum, GLOB_SBD_NAME);
|
||||||
out_ftl_flash_register:
|
out_ftl_flash_register:
|
||||||
GLOB_FTL_Cache_Release();
|
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");
|
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)
|
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 int GLOB_Calc_Used_Bits(u32 n);
|
||||||
extern u64 GLOB_u64_Div(u64 addr, u32 divisor);
|
extern u64 GLOB_u64_Div(u64 addr, u32 divisor);
|
||||||
extern u64 GLOB_u64_Remainder(u64 addr, u32 divisor_type);
|
extern u64 GLOB_u64_Remainder(u64 addr, u32 divisor_type);
|
||||||
|
extern int register_spectra_ftl(void);
|
||||||
|
|
||||||
#endif /* _FFSPORT_ */
|
#endif /* _FFSPORT_ */
|
||||||
|
|
|
@ -1258,9 +1258,7 @@ int GLOB_FTL_Flash_Init(void)
|
||||||
|
|
||||||
g_SBDCmdIndex = 0;
|
g_SBDCmdIndex = 0;
|
||||||
|
|
||||||
GLOB_LLD_Flash_Init();
|
status = GLOB_LLD_Flash_Init();
|
||||||
|
|
||||||
status = GLOB_LLD_Read_Device_ID();
|
|
||||||
|
|
||||||
return status;
|
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_base;
|
||||||
unsigned long csr_len;
|
unsigned long csr_len;
|
||||||
struct mrst_nand_info *pndev = &info;
|
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;
|
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__);
|
__FILE__, __LINE__, __func__);
|
||||||
|
|
||||||
FlashReg = ioremap_nocache(GLOB_HWCTL_REG_BASE,
|
FlashReg = ioremap_nocache(GLOB_HWCTL_REG_BASE,
|
||||||
|
@ -2582,6 +2479,122 @@ int NAND_Flash_Init(void)
|
||||||
iowrite32(0, FlashReg + TWO_ROW_ADDR_CYCLES);
|
iowrite32(0, FlashReg + TWO_ROW_ADDR_CYCLES);
|
||||||
iowrite32(1, FlashReg + ECC_ENABLE);
|
iowrite32(1, FlashReg + ECC_ENABLE);
|
||||||
enable_ecc = 1;
|
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);
|
retval = pci_register_driver(&nand_pci_driver);
|
||||||
if (retval)
|
if (retval)
|
||||||
|
|
Loading…
Reference in a new issue