Commit a6f6d6b5 authored by Tomoya's avatar Tomoya Committed by David S. Miller

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: default avatarTomoya MORINAGA <tomoya-linux@dsn.okisemi.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent c7551456
...@@ -845,15 +845,6 @@ static int pch_can_open(struct net_device *ndev) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment