1df69ba43SShannon Nelson // SPDX-License-Identifier: GPL-2.0
2df69ba43SShannon Nelson /* Copyright(c) 2017 - 2019 Pensando Systems, Inc */
3df69ba43SShannon Nelson 
4df69ba43SShannon Nelson #include <linux/module.h>
5df69ba43SShannon Nelson #include <linux/netdevice.h>
6df69ba43SShannon Nelson #include <linux/etherdevice.h>
7df69ba43SShannon Nelson #include <linux/pci.h>
8df69ba43SShannon Nelson 
9df69ba43SShannon Nelson #include "ionic.h"
10df69ba43SShannon Nelson #include "ionic_bus.h"
11df69ba43SShannon Nelson 
12df69ba43SShannon Nelson /* Supported devices */
13df69ba43SShannon Nelson static const struct pci_device_id ionic_id_table[] = {
14df69ba43SShannon Nelson 	{ PCI_VDEVICE(PENSANDO, PCI_DEVICE_ID_PENSANDO_IONIC_ETH_PF) },
15df69ba43SShannon Nelson 	{ PCI_VDEVICE(PENSANDO, PCI_DEVICE_ID_PENSANDO_IONIC_ETH_VF) },
16df69ba43SShannon Nelson 	{ 0, }	/* end of table */
17df69ba43SShannon Nelson };
18df69ba43SShannon Nelson MODULE_DEVICE_TABLE(pci, ionic_id_table);
19df69ba43SShannon Nelson 
20df69ba43SShannon Nelson static int ionic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
21df69ba43SShannon Nelson {
22df69ba43SShannon Nelson 	struct device *dev = &pdev->dev;
23df69ba43SShannon Nelson 	struct ionic *ionic;
24df69ba43SShannon Nelson 
25df69ba43SShannon Nelson 	ionic = ionic_devlink_alloc(dev);
26df69ba43SShannon Nelson 	if (!ionic)
27df69ba43SShannon Nelson 		return -ENOMEM;
28df69ba43SShannon Nelson 
29df69ba43SShannon Nelson 	ionic->pdev = pdev;
30df69ba43SShannon Nelson 	ionic->dev = dev;
31df69ba43SShannon Nelson 	pci_set_drvdata(pdev, ionic);
32df69ba43SShannon Nelson 
33df69ba43SShannon Nelson 	return 0;
34df69ba43SShannon Nelson }
35df69ba43SShannon Nelson 
36df69ba43SShannon Nelson static void ionic_remove(struct pci_dev *pdev)
37df69ba43SShannon Nelson {
38df69ba43SShannon Nelson 	struct ionic *ionic = pci_get_drvdata(pdev);
39df69ba43SShannon Nelson 
40df69ba43SShannon Nelson 	ionic_devlink_free(ionic);
41df69ba43SShannon Nelson }
42df69ba43SShannon Nelson 
43df69ba43SShannon Nelson static struct pci_driver ionic_driver = {
44df69ba43SShannon Nelson 	.name = IONIC_DRV_NAME,
45df69ba43SShannon Nelson 	.id_table = ionic_id_table,
46df69ba43SShannon Nelson 	.probe = ionic_probe,
47df69ba43SShannon Nelson 	.remove = ionic_remove,
48df69ba43SShannon Nelson };
49df69ba43SShannon Nelson 
50df69ba43SShannon Nelson int ionic_bus_register_driver(void)
51df69ba43SShannon Nelson {
52df69ba43SShannon Nelson 	return pci_register_driver(&ionic_driver);
53df69ba43SShannon Nelson }
54df69ba43SShannon Nelson 
55df69ba43SShannon Nelson void ionic_bus_unregister_driver(void)
56df69ba43SShannon Nelson {
57df69ba43SShannon Nelson 	pci_unregister_driver(&ionic_driver);
58df69ba43SShannon Nelson }
59