pch_can: Move MSI processing to probe/remove processing
Currently, in case this driver is integrated as module, and when this module is re-installed, no interrupts is to be occurred. For the above issue, move MSI processing to open/release processing. Signed-off-by: Tomoya MORINAGA <tomoya-linux@dsn.okisemi.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
c755145649
commit
a6f6d6b51b
@ -845,15 +845,6 @@ static int pch_can_open(struct net_device *ndev)
|
|||||||
struct pch_can_priv *priv = netdev_priv(ndev);
|
struct pch_can_priv *priv = netdev_priv(ndev);
|
||||||
int retval;
|
int retval;
|
||||||
|
|
||||||
retval = pci_enable_msi(priv->dev);
|
|
||||||
if (retval) {
|
|
||||||
netdev_err(ndev, "PCH CAN opened without MSI\n");
|
|
||||||
priv->use_msi = 0;
|
|
||||||
} else {
|
|
||||||
netdev_err(ndev, "PCH CAN opened with MSI\n");
|
|
||||||
priv->use_msi = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Regstering the interrupt. */
|
/* Regstering the interrupt. */
|
||||||
retval = request_irq(priv->dev->irq, pch_can_interrupt, IRQF_SHARED,
|
retval = request_irq(priv->dev->irq, pch_can_interrupt, IRQF_SHARED,
|
||||||
ndev->name, ndev);
|
ndev->name, ndev);
|
||||||
@ -879,9 +870,6 @@ static int pch_can_open(struct net_device *ndev)
|
|||||||
err_open_candev:
|
err_open_candev:
|
||||||
free_irq(priv->dev->irq, ndev);
|
free_irq(priv->dev->irq, ndev);
|
||||||
req_irq_err:
|
req_irq_err:
|
||||||
if (priv->use_msi)
|
|
||||||
pci_disable_msi(priv->dev);
|
|
||||||
|
|
||||||
pch_can_release(priv);
|
pch_can_release(priv);
|
||||||
|
|
||||||
return retval;
|
return retval;
|
||||||
@ -895,8 +883,6 @@ static int pch_close(struct net_device *ndev)
|
|||||||
napi_disable(&priv->napi);
|
napi_disable(&priv->napi);
|
||||||
pch_can_release(priv);
|
pch_can_release(priv);
|
||||||
free_irq(priv->dev->irq, ndev);
|
free_irq(priv->dev->irq, ndev);
|
||||||
if (priv->use_msi)
|
|
||||||
pci_disable_msi(priv->dev);
|
|
||||||
close_candev(ndev);
|
close_candev(ndev);
|
||||||
priv->can.state = CAN_STATE_STOPPED;
|
priv->can.state = CAN_STATE_STOPPED;
|
||||||
return 0;
|
return 0;
|
||||||
@ -975,12 +961,14 @@ static void __devexit pch_can_remove(struct pci_dev *pdev)
|
|||||||
struct pch_can_priv *priv = netdev_priv(ndev);
|
struct pch_can_priv *priv = netdev_priv(ndev);
|
||||||
|
|
||||||
unregister_candev(priv->ndev);
|
unregister_candev(priv->ndev);
|
||||||
free_candev(priv->ndev);
|
|
||||||
pci_iounmap(pdev, priv->regs);
|
pci_iounmap(pdev, priv->regs);
|
||||||
|
if (priv->use_msi)
|
||||||
|
pci_disable_msi(priv->dev);
|
||||||
pci_release_regions(pdev);
|
pci_release_regions(pdev);
|
||||||
pci_disable_device(pdev);
|
pci_disable_device(pdev);
|
||||||
pci_set_drvdata(pdev, NULL);
|
pci_set_drvdata(pdev, NULL);
|
||||||
pch_can_reset(priv);
|
pch_can_reset(priv);
|
||||||
|
free_candev(priv->ndev);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_PM
|
#ifdef CONFIG_PM
|
||||||
@ -1244,6 +1232,15 @@ static int __devinit pch_can_probe(struct pci_dev *pdev,
|
|||||||
|
|
||||||
netif_napi_add(ndev, &priv->napi, pch_can_poll, PCH_RX_OBJ_END);
|
netif_napi_add(ndev, &priv->napi, pch_can_poll, PCH_RX_OBJ_END);
|
||||||
|
|
||||||
|
rc = pci_enable_msi(priv->dev);
|
||||||
|
if (rc) {
|
||||||
|
netdev_err(ndev, "PCH CAN opened without MSI\n");
|
||||||
|
priv->use_msi = 0;
|
||||||
|
} else {
|
||||||
|
netdev_err(ndev, "PCH CAN opened with MSI\n");
|
||||||
|
priv->use_msi = 1;
|
||||||
|
}
|
||||||
|
|
||||||
rc = register_candev(ndev);
|
rc = register_candev(ndev);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
dev_err(&pdev->dev, "Failed register_candev %d\n", rc);
|
dev_err(&pdev->dev, "Failed register_candev %d\n", rc);
|
||||||
@ -1253,6 +1250,8 @@ static int __devinit pch_can_probe(struct pci_dev *pdev,
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
probe_exit_reg_candev:
|
probe_exit_reg_candev:
|
||||||
|
if (priv->use_msi)
|
||||||
|
pci_disable_msi(priv->dev);
|
||||||
free_candev(ndev);
|
free_candev(ndev);
|
||||||
probe_exit_alloc_candev:
|
probe_exit_alloc_candev:
|
||||||
pci_iounmap(pdev, addr);
|
pci_iounmap(pdev, addr);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user