@@ -154,6 +154,7 @@ struct mlxsw_pci {
154
154
} comp ;
155
155
} cmd ;
156
156
struct mlxsw_bus_info bus_info ;
157
+ const struct pci_device_id * id ;
157
158
};
158
159
159
160
static void mlxsw_pci_queue_tasklet_schedule (struct mlxsw_pci_queue * q )
@@ -1622,16 +1623,6 @@ static int mlxsw_pci_cmd_exec(void *bus_priv, u16 opcode, u8 opcode_mod,
1622
1623
return err ;
1623
1624
}
1624
1625
1625
- static const struct mlxsw_bus mlxsw_pci_bus = {
1626
- .kind = "pci" ,
1627
- .init = mlxsw_pci_init ,
1628
- .fini = mlxsw_pci_fini ,
1629
- .skb_transmit_busy = mlxsw_pci_skb_transmit_busy ,
1630
- .skb_transmit = mlxsw_pci_skb_transmit ,
1631
- .cmd_exec = mlxsw_pci_cmd_exec ,
1632
- .features = MLXSW_BUS_F_TXRX ,
1633
- };
1634
-
1635
1626
static int mlxsw_pci_sw_reset (struct mlxsw_pci * mlxsw_pci ,
1636
1627
const struct pci_device_id * id )
1637
1628
{
@@ -1660,6 +1651,41 @@ static int mlxsw_pci_sw_reset(struct mlxsw_pci *mlxsw_pci,
1660
1651
return 0 ;
1661
1652
}
1662
1653
1654
+ static void mlxsw_pci_free_irq_vectors (struct mlxsw_pci * mlxsw_pci )
1655
+ {
1656
+ pci_free_irq_vectors (mlxsw_pci -> pdev );
1657
+ }
1658
+
1659
+ static int mlxsw_pci_alloc_irq_vectors (struct mlxsw_pci * mlxsw_pci )
1660
+ {
1661
+ int err ;
1662
+
1663
+ err = pci_alloc_irq_vectors (mlxsw_pci -> pdev , 1 , 1 , PCI_IRQ_MSIX );
1664
+ if (err < 0 )
1665
+ dev_err (& mlxsw_pci -> pdev -> dev , "MSI-X init failed\n" );
1666
+ return err ;
1667
+ }
1668
+
1669
+ static void mlxsw_pci_reset (void * bus_priv )
1670
+ {
1671
+ struct mlxsw_pci * mlxsw_pci = bus_priv ;
1672
+
1673
+ mlxsw_pci_free_irq_vectors (mlxsw_pci );
1674
+ mlxsw_pci_sw_reset (mlxsw_pci , mlxsw_pci -> id );
1675
+ mlxsw_pci_alloc_irq_vectors (mlxsw_pci );
1676
+ }
1677
+
1678
+ static const struct mlxsw_bus mlxsw_pci_bus = {
1679
+ .kind = "pci" ,
1680
+ .init = mlxsw_pci_init ,
1681
+ .fini = mlxsw_pci_fini ,
1682
+ .skb_transmit_busy = mlxsw_pci_skb_transmit_busy ,
1683
+ .skb_transmit = mlxsw_pci_skb_transmit ,
1684
+ .cmd_exec = mlxsw_pci_cmd_exec ,
1685
+ .features = MLXSW_BUS_F_TXRX ,
1686
+ .reset = mlxsw_pci_reset ,
1687
+ };
1688
+
1663
1689
static int mlxsw_pci_probe (struct pci_dev * pdev , const struct pci_device_id * id )
1664
1690
{
1665
1691
const char * driver_name = pdev -> driver -> name ;
@@ -1721,7 +1747,7 @@ static int mlxsw_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
1721
1747
goto err_sw_reset ;
1722
1748
}
1723
1749
1724
- err = pci_alloc_irq_vectors ( pdev , 1 , 1 , PCI_IRQ_MSIX );
1750
+ err = mlxsw_pci_alloc_irq_vectors ( mlxsw_pci );
1725
1751
if (err < 0 ) {
1726
1752
dev_err (& pdev -> dev , "MSI-X init failed\n" );
1727
1753
goto err_msix_init ;
@@ -1730,6 +1756,7 @@ static int mlxsw_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
1730
1756
mlxsw_pci -> bus_info .device_kind = driver_name ;
1731
1757
mlxsw_pci -> bus_info .device_name = pci_name (mlxsw_pci -> pdev );
1732
1758
mlxsw_pci -> bus_info .dev = & pdev -> dev ;
1759
+ mlxsw_pci -> id = id ;
1733
1760
1734
1761
err = mlxsw_core_bus_device_register (& mlxsw_pci -> bus_info ,
1735
1762
& mlxsw_pci_bus , mlxsw_pci );
@@ -1741,7 +1768,7 @@ static int mlxsw_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
1741
1768
return 0 ;
1742
1769
1743
1770
err_bus_device_register :
1744
- pci_free_irq_vectors (mlxsw_pci -> pdev );
1771
+ mlxsw_pci_free_irq_vectors (mlxsw_pci );
1745
1772
err_msix_init :
1746
1773
err_sw_reset :
1747
1774
iounmap (mlxsw_pci -> hw_addr );
@@ -1761,7 +1788,7 @@ static void mlxsw_pci_remove(struct pci_dev *pdev)
1761
1788
struct mlxsw_pci * mlxsw_pci = pci_get_drvdata (pdev );
1762
1789
1763
1790
mlxsw_core_bus_device_unregister (mlxsw_pci -> core );
1764
- pci_free_irq_vectors (mlxsw_pci -> pdev );
1791
+ mlxsw_pci_free_irq_vectors (mlxsw_pci );
1765
1792
iounmap (mlxsw_pci -> hw_addr );
1766
1793
pci_release_regions (mlxsw_pci -> pdev );
1767
1794
pci_disable_device (mlxsw_pci -> pdev );
0 commit comments