@@ -1646,24 +1646,28 @@ static int kvaser_pciefd_read_buffer(struct kvaser_pciefd *pcie, int dma_buf)
1646
1646
return res ;
1647
1647
}
1648
1648
1649
- static u32 kvaser_pciefd_receive_irq (struct kvaser_pciefd * pcie )
1649
+ static void kvaser_pciefd_receive_irq (struct kvaser_pciefd * pcie )
1650
1650
{
1651
+ void __iomem * srb_cmd_reg = KVASER_PCIEFD_SRB_ADDR (pcie ) + KVASER_PCIEFD_SRB_CMD_REG ;
1651
1652
u32 irq = ioread32 (KVASER_PCIEFD_SRB_ADDR (pcie ) + KVASER_PCIEFD_SRB_IRQ_REG );
1652
1653
1653
- if (irq & KVASER_PCIEFD_SRB_IRQ_DPD0 )
1654
+ iowrite32 (irq , KVASER_PCIEFD_SRB_ADDR (pcie ) + KVASER_PCIEFD_SRB_IRQ_REG );
1655
+
1656
+ if (irq & KVASER_PCIEFD_SRB_IRQ_DPD0 ) {
1654
1657
kvaser_pciefd_read_buffer (pcie , 0 );
1658
+ iowrite32 (KVASER_PCIEFD_SRB_CMD_RDB0 , srb_cmd_reg ); /* Rearm buffer */
1659
+ }
1655
1660
1656
- if (irq & KVASER_PCIEFD_SRB_IRQ_DPD1 )
1661
+ if (irq & KVASER_PCIEFD_SRB_IRQ_DPD1 ) {
1657
1662
kvaser_pciefd_read_buffer (pcie , 1 );
1663
+ iowrite32 (KVASER_PCIEFD_SRB_CMD_RDB1 , srb_cmd_reg ); /* Rearm buffer */
1664
+ }
1658
1665
1659
1666
if (unlikely (irq & KVASER_PCIEFD_SRB_IRQ_DOF0 ||
1660
1667
irq & KVASER_PCIEFD_SRB_IRQ_DOF1 ||
1661
1668
irq & KVASER_PCIEFD_SRB_IRQ_DUF0 ||
1662
1669
irq & KVASER_PCIEFD_SRB_IRQ_DUF1 ))
1663
1670
dev_err (& pcie -> pci -> dev , "DMA IRQ error 0x%08X\n" , irq );
1664
-
1665
- iowrite32 (irq , KVASER_PCIEFD_SRB_ADDR (pcie ) + KVASER_PCIEFD_SRB_IRQ_REG );
1666
- return irq ;
1667
1671
}
1668
1672
1669
1673
static void kvaser_pciefd_transmit_irq (struct kvaser_pciefd_can * can )
@@ -1691,29 +1695,22 @@ static irqreturn_t kvaser_pciefd_irq_handler(int irq, void *dev)
1691
1695
struct kvaser_pciefd * pcie = (struct kvaser_pciefd * )dev ;
1692
1696
const struct kvaser_pciefd_irq_mask * irq_mask = pcie -> driver_data -> irq_mask ;
1693
1697
u32 pci_irq = ioread32 (KVASER_PCIEFD_PCI_IRQ_ADDR (pcie ));
1694
- u32 srb_irq = 0 ;
1695
- u32 srb_release = 0 ;
1696
1698
int i ;
1697
1699
1698
1700
if (!(pci_irq & irq_mask -> all ))
1699
1701
return IRQ_NONE ;
1700
1702
1703
+ iowrite32 (0 , KVASER_PCIEFD_PCI_IEN_ADDR (pcie ));
1704
+
1701
1705
if (pci_irq & irq_mask -> kcan_rx0 )
1702
- srb_irq = kvaser_pciefd_receive_irq (pcie );
1706
+ kvaser_pciefd_receive_irq (pcie );
1703
1707
1704
1708
for (i = 0 ; i < pcie -> nr_channels ; i ++ ) {
1705
1709
if (pci_irq & irq_mask -> kcan_tx [i ])
1706
1710
kvaser_pciefd_transmit_irq (pcie -> can [i ]);
1707
1711
}
1708
1712
1709
- if (srb_irq & KVASER_PCIEFD_SRB_IRQ_DPD0 )
1710
- srb_release |= KVASER_PCIEFD_SRB_CMD_RDB0 ;
1711
-
1712
- if (srb_irq & KVASER_PCIEFD_SRB_IRQ_DPD1 )
1713
- srb_release |= KVASER_PCIEFD_SRB_CMD_RDB1 ;
1714
-
1715
- if (srb_release )
1716
- iowrite32 (srb_release , KVASER_PCIEFD_SRB_ADDR (pcie ) + KVASER_PCIEFD_SRB_CMD_REG );
1713
+ iowrite32 (irq_mask -> all , KVASER_PCIEFD_PCI_IEN_ADDR (pcie ));
1717
1714
1718
1715
return IRQ_HANDLED ;
1719
1716
}
@@ -1733,13 +1730,22 @@ static void kvaser_pciefd_teardown_can_ctrls(struct kvaser_pciefd *pcie)
1733
1730
}
1734
1731
}
1735
1732
1733
+ static void kvaser_pciefd_disable_irq_srcs (struct kvaser_pciefd * pcie )
1734
+ {
1735
+ unsigned int i ;
1736
+
1737
+ /* Masking PCI_IRQ is insufficient as running ISR will unmask it */
1738
+ iowrite32 (0 , KVASER_PCIEFD_SRB_ADDR (pcie ) + KVASER_PCIEFD_SRB_IEN_REG );
1739
+ for (i = 0 ; i < pcie -> nr_channels ; ++ i )
1740
+ iowrite32 (0 , pcie -> can [i ]-> reg_base + KVASER_PCIEFD_KCAN_IEN_REG );
1741
+ }
1742
+
1736
1743
static int kvaser_pciefd_probe (struct pci_dev * pdev ,
1737
1744
const struct pci_device_id * id )
1738
1745
{
1739
1746
int ret ;
1740
1747
struct kvaser_pciefd * pcie ;
1741
1748
const struct kvaser_pciefd_irq_mask * irq_mask ;
1742
- void __iomem * irq_en_base ;
1743
1749
1744
1750
pcie = devm_kzalloc (& pdev -> dev , sizeof (* pcie ), GFP_KERNEL );
1745
1751
if (!pcie )
@@ -1805,8 +1811,7 @@ static int kvaser_pciefd_probe(struct pci_dev *pdev,
1805
1811
KVASER_PCIEFD_SRB_ADDR (pcie ) + KVASER_PCIEFD_SRB_IEN_REG );
1806
1812
1807
1813
/* Enable PCI interrupts */
1808
- irq_en_base = KVASER_PCIEFD_PCI_IEN_ADDR (pcie );
1809
- iowrite32 (irq_mask -> all , irq_en_base );
1814
+ iowrite32 (irq_mask -> all , KVASER_PCIEFD_PCI_IEN_ADDR (pcie ));
1810
1815
/* Ready the DMA buffers */
1811
1816
iowrite32 (KVASER_PCIEFD_SRB_CMD_RDB0 ,
1812
1817
KVASER_PCIEFD_SRB_ADDR (pcie ) + KVASER_PCIEFD_SRB_CMD_REG );
@@ -1820,8 +1825,7 @@ static int kvaser_pciefd_probe(struct pci_dev *pdev,
1820
1825
return 0 ;
1821
1826
1822
1827
err_free_irq :
1823
- /* Disable PCI interrupts */
1824
- iowrite32 (0 , irq_en_base );
1828
+ kvaser_pciefd_disable_irq_srcs (pcie );
1825
1829
free_irq (pcie -> pci -> irq , pcie );
1826
1830
1827
1831
err_pci_free_irq_vectors :
@@ -1844,35 +1848,26 @@ static int kvaser_pciefd_probe(struct pci_dev *pdev,
1844
1848
return ret ;
1845
1849
}
1846
1850
1847
- static void kvaser_pciefd_remove_all_ctrls (struct kvaser_pciefd * pcie )
1848
- {
1849
- int i ;
1850
-
1851
- for (i = 0 ; i < pcie -> nr_channels ; i ++ ) {
1852
- struct kvaser_pciefd_can * can = pcie -> can [i ];
1853
-
1854
- if (can ) {
1855
- iowrite32 (0 , can -> reg_base + KVASER_PCIEFD_KCAN_IEN_REG );
1856
- unregister_candev (can -> can .dev );
1857
- timer_delete (& can -> bec_poll_timer );
1858
- kvaser_pciefd_pwm_stop (can );
1859
- free_candev (can -> can .dev );
1860
- }
1861
- }
1862
- }
1863
-
1864
1851
static void kvaser_pciefd_remove (struct pci_dev * pdev )
1865
1852
{
1866
1853
struct kvaser_pciefd * pcie = pci_get_drvdata (pdev );
1854
+ unsigned int i ;
1867
1855
1868
- kvaser_pciefd_remove_all_ctrls (pcie );
1856
+ for (i = 0 ; i < pcie -> nr_channels ; ++ i ) {
1857
+ struct kvaser_pciefd_can * can = pcie -> can [i ];
1869
1858
1870
- /* Disable interrupts */
1871
- iowrite32 (0 , KVASER_PCIEFD_SRB_ADDR (pcie ) + KVASER_PCIEFD_SRB_CTRL_REG );
1872
- iowrite32 (0 , KVASER_PCIEFD_PCI_IEN_ADDR (pcie ));
1859
+ unregister_candev (can -> can .dev );
1860
+ timer_delete (& can -> bec_poll_timer );
1861
+ kvaser_pciefd_pwm_stop (can );
1862
+ }
1873
1863
1864
+ kvaser_pciefd_disable_irq_srcs (pcie );
1874
1865
free_irq (pcie -> pci -> irq , pcie );
1875
1866
pci_free_irq_vectors (pcie -> pci );
1867
+
1868
+ for (i = 0 ; i < pcie -> nr_channels ; ++ i )
1869
+ free_candev (pcie -> can [i ]-> can .dev );
1870
+
1876
1871
pci_iounmap (pdev , pcie -> reg_base );
1877
1872
pci_release_regions (pdev );
1878
1873
pci_disable_device (pdev );
0 commit comments