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
					
				
			
		
					 1 changed files with 14 additions and 15 deletions
				
			
		| 
						 | 
					@ -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…
	
	Add table
		Add a link
		
	
		Reference in a new issue