1111fc64aSRaghu Vatsavayi /**********************************************************************
2111fc64aSRaghu Vatsavayi  * Author: Cavium, Inc.
3111fc64aSRaghu Vatsavayi  *
4111fc64aSRaghu Vatsavayi  * Contact: support@cavium.com
5111fc64aSRaghu Vatsavayi  *          Please include "LiquidIO" in the subject.
6111fc64aSRaghu Vatsavayi  *
7111fc64aSRaghu Vatsavayi  * Copyright (c) 2003-2016 Cavium, Inc.
8111fc64aSRaghu Vatsavayi  *
9111fc64aSRaghu Vatsavayi  * This file is free software; you can redistribute it and/or modify
10111fc64aSRaghu Vatsavayi  * it under the terms of the GNU General Public License, Version 2, as
11111fc64aSRaghu Vatsavayi  * published by the Free Software Foundation.
12111fc64aSRaghu Vatsavayi  *
13111fc64aSRaghu Vatsavayi  * This file is distributed in the hope that it will be useful, but
14111fc64aSRaghu Vatsavayi  * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
15111fc64aSRaghu Vatsavayi  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
16111fc64aSRaghu Vatsavayi  * NONINFRINGEMENT.  See the GNU General Public License for more details.
17111fc64aSRaghu Vatsavayi  ***********************************************************************/
18111fc64aSRaghu Vatsavayi #include <linux/pci.h>
19111fc64aSRaghu Vatsavayi #include <net/vxlan.h>
20111fc64aSRaghu Vatsavayi #include "liquidio_common.h"
21111fc64aSRaghu Vatsavayi #include "octeon_droq.h"
22111fc64aSRaghu Vatsavayi #include "octeon_iq.h"
23111fc64aSRaghu Vatsavayi #include "response_manager.h"
24111fc64aSRaghu Vatsavayi #include "octeon_device.h"
2569c69da3SRaghu Vatsavayi #include "octeon_main.h"
2669c69da3SRaghu Vatsavayi #include "cn23xx_vf_device.h"
27111fc64aSRaghu Vatsavayi 
28111fc64aSRaghu Vatsavayi MODULE_AUTHOR("Cavium Networks, <support@cavium.com>");
29111fc64aSRaghu Vatsavayi MODULE_DESCRIPTION("Cavium LiquidIO Intelligent Server Adapter Virtual Function Driver");
30111fc64aSRaghu Vatsavayi MODULE_LICENSE("GPL");
31111fc64aSRaghu Vatsavayi MODULE_VERSION(LIQUIDIO_VERSION);
32111fc64aSRaghu Vatsavayi 
33111fc64aSRaghu Vatsavayi struct octeon_device_priv {
34111fc64aSRaghu Vatsavayi 	/* Tasklet structures for this device. */
35111fc64aSRaghu Vatsavayi 	struct tasklet_struct droq_tasklet;
36111fc64aSRaghu Vatsavayi 	unsigned long napi_mask;
37111fc64aSRaghu Vatsavayi };
38111fc64aSRaghu Vatsavayi 
39111fc64aSRaghu Vatsavayi static int
40111fc64aSRaghu Vatsavayi liquidio_vf_probe(struct pci_dev *pdev, const struct pci_device_id *ent);
41111fc64aSRaghu Vatsavayi static void liquidio_vf_remove(struct pci_dev *pdev);
4269c69da3SRaghu Vatsavayi static int octeon_device_init(struct octeon_device *oct);
43111fc64aSRaghu Vatsavayi 
44111fc64aSRaghu Vatsavayi static const struct pci_device_id liquidio_vf_pci_tbl[] = {
45111fc64aSRaghu Vatsavayi 	{
46111fc64aSRaghu Vatsavayi 		PCI_VENDOR_ID_CAVIUM, OCTEON_CN23XX_VF_VID,
47111fc64aSRaghu Vatsavayi 		PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0
48111fc64aSRaghu Vatsavayi 	},
49111fc64aSRaghu Vatsavayi 	{
50111fc64aSRaghu Vatsavayi 		0, 0, 0, 0, 0, 0, 0
51111fc64aSRaghu Vatsavayi 	}
52111fc64aSRaghu Vatsavayi };
53111fc64aSRaghu Vatsavayi MODULE_DEVICE_TABLE(pci, liquidio_vf_pci_tbl);
54111fc64aSRaghu Vatsavayi 
55111fc64aSRaghu Vatsavayi static struct pci_driver liquidio_vf_pci_driver = {
56111fc64aSRaghu Vatsavayi 	.name		= "LiquidIO_VF",
57111fc64aSRaghu Vatsavayi 	.id_table	= liquidio_vf_pci_tbl,
58111fc64aSRaghu Vatsavayi 	.probe		= liquidio_vf_probe,
59111fc64aSRaghu Vatsavayi 	.remove		= liquidio_vf_remove,
60111fc64aSRaghu Vatsavayi };
61111fc64aSRaghu Vatsavayi 
62111fc64aSRaghu Vatsavayi /**
63111fc64aSRaghu Vatsavayi  * \brief PCI probe handler
64111fc64aSRaghu Vatsavayi  * @param pdev PCI device structure
65111fc64aSRaghu Vatsavayi  * @param ent unused
66111fc64aSRaghu Vatsavayi  */
67111fc64aSRaghu Vatsavayi static int
68111fc64aSRaghu Vatsavayi liquidio_vf_probe(struct pci_dev *pdev,
69111fc64aSRaghu Vatsavayi 		  const struct pci_device_id *ent __attribute__((unused)))
70111fc64aSRaghu Vatsavayi {
71111fc64aSRaghu Vatsavayi 	struct octeon_device *oct_dev = NULL;
72111fc64aSRaghu Vatsavayi 
73111fc64aSRaghu Vatsavayi 	oct_dev = octeon_allocate_device(pdev->device,
74111fc64aSRaghu Vatsavayi 					 sizeof(struct octeon_device_priv));
75111fc64aSRaghu Vatsavayi 
76111fc64aSRaghu Vatsavayi 	if (!oct_dev) {
77111fc64aSRaghu Vatsavayi 		dev_err(&pdev->dev, "Unable to allocate device\n");
78111fc64aSRaghu Vatsavayi 		return -ENOMEM;
79111fc64aSRaghu Vatsavayi 	}
80111fc64aSRaghu Vatsavayi 
81111fc64aSRaghu Vatsavayi 	dev_info(&pdev->dev, "Initializing device %x:%x.\n",
82111fc64aSRaghu Vatsavayi 		 (u32)pdev->vendor, (u32)pdev->device);
83111fc64aSRaghu Vatsavayi 
84111fc64aSRaghu Vatsavayi 	/* Assign octeon_device for this device to the private data area. */
85111fc64aSRaghu Vatsavayi 	pci_set_drvdata(pdev, oct_dev);
86111fc64aSRaghu Vatsavayi 
87111fc64aSRaghu Vatsavayi 	/* set linux specific device pointer */
88111fc64aSRaghu Vatsavayi 	oct_dev->pci_dev = pdev;
89111fc64aSRaghu Vatsavayi 
9069c69da3SRaghu Vatsavayi 	if (octeon_device_init(oct_dev)) {
9169c69da3SRaghu Vatsavayi 		liquidio_vf_remove(pdev);
9269c69da3SRaghu Vatsavayi 		return -ENOMEM;
9369c69da3SRaghu Vatsavayi 	}
9469c69da3SRaghu Vatsavayi 
9569c69da3SRaghu Vatsavayi 	dev_dbg(&oct_dev->pci_dev->dev, "Device is ready\n");
9669c69da3SRaghu Vatsavayi 
97111fc64aSRaghu Vatsavayi 	return 0;
98111fc64aSRaghu Vatsavayi }
99111fc64aSRaghu Vatsavayi 
100111fc64aSRaghu Vatsavayi /**
10169c69da3SRaghu Vatsavayi  * \brief PCI FLR for each Octeon device.
10269c69da3SRaghu Vatsavayi  * @param oct octeon device
10369c69da3SRaghu Vatsavayi  */
10469c69da3SRaghu Vatsavayi static void octeon_pci_flr(struct octeon_device *oct)
10569c69da3SRaghu Vatsavayi {
10669c69da3SRaghu Vatsavayi 	u16 status;
10769c69da3SRaghu Vatsavayi 
10869c69da3SRaghu Vatsavayi 	pci_save_state(oct->pci_dev);
10969c69da3SRaghu Vatsavayi 
11069c69da3SRaghu Vatsavayi 	pci_cfg_access_lock(oct->pci_dev);
11169c69da3SRaghu Vatsavayi 
11269c69da3SRaghu Vatsavayi 	/* Quiesce the device completely */
11369c69da3SRaghu Vatsavayi 	pci_write_config_word(oct->pci_dev, PCI_COMMAND,
11469c69da3SRaghu Vatsavayi 			      PCI_COMMAND_INTX_DISABLE);
11569c69da3SRaghu Vatsavayi 
11669c69da3SRaghu Vatsavayi 	/* Wait for Transaction Pending bit clean */
11769c69da3SRaghu Vatsavayi 	msleep(100);
11869c69da3SRaghu Vatsavayi 	pcie_capability_read_word(oct->pci_dev, PCI_EXP_DEVSTA, &status);
11969c69da3SRaghu Vatsavayi 	if (status & PCI_EXP_DEVSTA_TRPND) {
12069c69da3SRaghu Vatsavayi 		dev_info(&oct->pci_dev->dev, "Function reset incomplete after 100ms, sleeping for 5 seconds\n");
12169c69da3SRaghu Vatsavayi 		ssleep(5);
12269c69da3SRaghu Vatsavayi 		pcie_capability_read_word(oct->pci_dev, PCI_EXP_DEVSTA,
12369c69da3SRaghu Vatsavayi 					  &status);
12469c69da3SRaghu Vatsavayi 		if (status & PCI_EXP_DEVSTA_TRPND)
12569c69da3SRaghu Vatsavayi 			dev_info(&oct->pci_dev->dev, "Function reset still incomplete after 5s, reset anyway\n");
12669c69da3SRaghu Vatsavayi 	}
12769c69da3SRaghu Vatsavayi 	pcie_capability_set_word(oct->pci_dev, PCI_EXP_DEVCTL,
12869c69da3SRaghu Vatsavayi 				 PCI_EXP_DEVCTL_BCR_FLR);
12969c69da3SRaghu Vatsavayi 	mdelay(100);
13069c69da3SRaghu Vatsavayi 
13169c69da3SRaghu Vatsavayi 	pci_cfg_access_unlock(oct->pci_dev);
13269c69da3SRaghu Vatsavayi 
13369c69da3SRaghu Vatsavayi 	pci_restore_state(oct->pci_dev);
13469c69da3SRaghu Vatsavayi }
13569c69da3SRaghu Vatsavayi 
13669c69da3SRaghu Vatsavayi /**
13769c69da3SRaghu Vatsavayi  *\brief Destroy resources associated with octeon device
13869c69da3SRaghu Vatsavayi  * @param pdev PCI device structure
13969c69da3SRaghu Vatsavayi  * @param ent unused
14069c69da3SRaghu Vatsavayi  */
14169c69da3SRaghu Vatsavayi static void octeon_destroy_resources(struct octeon_device *oct)
14269c69da3SRaghu Vatsavayi {
1439003baf0SRaghu Vatsavayi 	int i;
1449003baf0SRaghu Vatsavayi 
14569c69da3SRaghu Vatsavayi 	switch (atomic_read(&oct->status)) {
146f7cdd64bSRaghu Vatsavayi 	case OCT_DEV_MBOX_SETUP_DONE:
147f7cdd64bSRaghu Vatsavayi 		oct->fn_list.free_mbox(oct);
148f7cdd64bSRaghu Vatsavayi 
149f7cdd64bSRaghu Vatsavayi 		/* fallthrough */
1509003baf0SRaghu Vatsavayi 	case OCT_DEV_IN_RESET:
1519003baf0SRaghu Vatsavayi 	case OCT_DEV_DROQ_INIT_DONE:
1529003baf0SRaghu Vatsavayi 		mdelay(100);
1539003baf0SRaghu Vatsavayi 		for (i = 0; i < MAX_OCTEON_OUTPUT_QUEUES(oct); i++) {
1549003baf0SRaghu Vatsavayi 			if (!(oct->io_qmask.oq & BIT_ULL(i)))
1559003baf0SRaghu Vatsavayi 				continue;
1569003baf0SRaghu Vatsavayi 			octeon_delete_droq(oct, i);
1579003baf0SRaghu Vatsavayi 		}
1589003baf0SRaghu Vatsavayi 
1599003baf0SRaghu Vatsavayi 		/* fallthrough */
1609003baf0SRaghu Vatsavayi 	case OCT_DEV_RESP_LIST_INIT_DONE:
1619003baf0SRaghu Vatsavayi 		octeon_delete_response_list(oct);
1629003baf0SRaghu Vatsavayi 
1639003baf0SRaghu Vatsavayi 		/* fallthrough */
1649003baf0SRaghu Vatsavayi 	case OCT_DEV_INSTR_QUEUE_INIT_DONE:
1659003baf0SRaghu Vatsavayi 		for (i = 0; i < MAX_OCTEON_INSTR_QUEUES(oct); i++) {
1669003baf0SRaghu Vatsavayi 			if (!(oct->io_qmask.iq & BIT_ULL(i)))
1679003baf0SRaghu Vatsavayi 				continue;
1689003baf0SRaghu Vatsavayi 			octeon_delete_instr_queue(oct, i);
1699003baf0SRaghu Vatsavayi 		}
1709003baf0SRaghu Vatsavayi 
1719003baf0SRaghu Vatsavayi 		/* fallthrough */
1729003baf0SRaghu Vatsavayi 	case OCT_DEV_SC_BUFF_POOL_INIT_DONE:
1739003baf0SRaghu Vatsavayi 		octeon_free_sc_buffer_pool(oct);
1749003baf0SRaghu Vatsavayi 
1759003baf0SRaghu Vatsavayi 		/* fallthrough */
1769003baf0SRaghu Vatsavayi 	case OCT_DEV_DISPATCH_INIT_DONE:
1779003baf0SRaghu Vatsavayi 		octeon_delete_dispatch_list(oct);
1789003baf0SRaghu Vatsavayi 		cancel_delayed_work_sync(&oct->nic_poll_work.work);
1799003baf0SRaghu Vatsavayi 
1809003baf0SRaghu Vatsavayi 		/* fallthrough */
18169c69da3SRaghu Vatsavayi 	case OCT_DEV_PCI_MAP_DONE:
18269c69da3SRaghu Vatsavayi 		octeon_unmap_pci_barx(oct, 0);
18369c69da3SRaghu Vatsavayi 		octeon_unmap_pci_barx(oct, 1);
18469c69da3SRaghu Vatsavayi 
18569c69da3SRaghu Vatsavayi 		/* fallthrough */
18669c69da3SRaghu Vatsavayi 	case OCT_DEV_PCI_ENABLE_DONE:
18769c69da3SRaghu Vatsavayi 		pci_clear_master(oct->pci_dev);
18869c69da3SRaghu Vatsavayi 		/* Disable the device, releasing the PCI INT */
18969c69da3SRaghu Vatsavayi 		pci_disable_device(oct->pci_dev);
19069c69da3SRaghu Vatsavayi 
19169c69da3SRaghu Vatsavayi 		/* fallthrough */
19269c69da3SRaghu Vatsavayi 	case OCT_DEV_BEGIN_STATE:
19369c69da3SRaghu Vatsavayi 		/* Nothing to be done here either */
19469c69da3SRaghu Vatsavayi 		break;
19569c69da3SRaghu Vatsavayi 	}
19669c69da3SRaghu Vatsavayi }
19769c69da3SRaghu Vatsavayi 
19869c69da3SRaghu Vatsavayi /**
199111fc64aSRaghu Vatsavayi  * \brief Cleans up resources at unload time
200111fc64aSRaghu Vatsavayi  * @param pdev PCI device structure
201111fc64aSRaghu Vatsavayi  */
202111fc64aSRaghu Vatsavayi static void liquidio_vf_remove(struct pci_dev *pdev)
203111fc64aSRaghu Vatsavayi {
204111fc64aSRaghu Vatsavayi 	struct octeon_device *oct_dev = pci_get_drvdata(pdev);
205111fc64aSRaghu Vatsavayi 
206111fc64aSRaghu Vatsavayi 	dev_dbg(&oct_dev->pci_dev->dev, "Stopping device\n");
207111fc64aSRaghu Vatsavayi 
20869c69da3SRaghu Vatsavayi 	/* Reset the octeon device and cleanup all memory allocated for
20969c69da3SRaghu Vatsavayi 	 * the octeon device by driver.
21069c69da3SRaghu Vatsavayi 	 */
21169c69da3SRaghu Vatsavayi 	octeon_destroy_resources(oct_dev);
21269c69da3SRaghu Vatsavayi 
21369c69da3SRaghu Vatsavayi 	dev_info(&oct_dev->pci_dev->dev, "Device removed\n");
21469c69da3SRaghu Vatsavayi 
215111fc64aSRaghu Vatsavayi 	/* This octeon device has been removed. Update the global
216111fc64aSRaghu Vatsavayi 	 * data structure to reflect this. Free the device structure.
217111fc64aSRaghu Vatsavayi 	 */
218111fc64aSRaghu Vatsavayi 	octeon_free_device_mem(oct_dev);
219111fc64aSRaghu Vatsavayi }
220111fc64aSRaghu Vatsavayi 
22169c69da3SRaghu Vatsavayi /**
22269c69da3SRaghu Vatsavayi  * \brief PCI initialization for each Octeon device.
22369c69da3SRaghu Vatsavayi  * @param oct octeon device
22469c69da3SRaghu Vatsavayi  */
22569c69da3SRaghu Vatsavayi static int octeon_pci_os_setup(struct octeon_device *oct)
22669c69da3SRaghu Vatsavayi {
22769c69da3SRaghu Vatsavayi #ifdef CONFIG_PCI_IOV
22869c69da3SRaghu Vatsavayi 	/* setup PCI stuff first */
22969c69da3SRaghu Vatsavayi 	if (!oct->pci_dev->physfn)
23069c69da3SRaghu Vatsavayi 		octeon_pci_flr(oct);
23169c69da3SRaghu Vatsavayi #endif
23269c69da3SRaghu Vatsavayi 
23369c69da3SRaghu Vatsavayi 	if (pci_enable_device(oct->pci_dev)) {
23469c69da3SRaghu Vatsavayi 		dev_err(&oct->pci_dev->dev, "pci_enable_device failed\n");
23569c69da3SRaghu Vatsavayi 		return 1;
23669c69da3SRaghu Vatsavayi 	}
23769c69da3SRaghu Vatsavayi 
23869c69da3SRaghu Vatsavayi 	if (dma_set_mask_and_coherent(&oct->pci_dev->dev, DMA_BIT_MASK(64))) {
23969c69da3SRaghu Vatsavayi 		dev_err(&oct->pci_dev->dev, "Unexpected DMA device capability\n");
24069c69da3SRaghu Vatsavayi 		pci_disable_device(oct->pci_dev);
24169c69da3SRaghu Vatsavayi 		return 1;
24269c69da3SRaghu Vatsavayi 	}
24369c69da3SRaghu Vatsavayi 
24469c69da3SRaghu Vatsavayi 	/* Enable PCI DMA Master. */
24569c69da3SRaghu Vatsavayi 	pci_set_master(oct->pci_dev);
24669c69da3SRaghu Vatsavayi 
24769c69da3SRaghu Vatsavayi 	return 0;
24869c69da3SRaghu Vatsavayi }
24969c69da3SRaghu Vatsavayi 
25069c69da3SRaghu Vatsavayi /**
25169c69da3SRaghu Vatsavayi  * \brief Device initialization for each Octeon device that is probed
25269c69da3SRaghu Vatsavayi  * @param octeon_dev  octeon device
25369c69da3SRaghu Vatsavayi  */
25469c69da3SRaghu Vatsavayi static int octeon_device_init(struct octeon_device *oct)
25569c69da3SRaghu Vatsavayi {
25669c69da3SRaghu Vatsavayi 	u32 rev_id;
25769c69da3SRaghu Vatsavayi 
25869c69da3SRaghu Vatsavayi 	atomic_set(&oct->status, OCT_DEV_BEGIN_STATE);
25969c69da3SRaghu Vatsavayi 
26069c69da3SRaghu Vatsavayi 	/* Enable access to the octeon device and make its DMA capability
26169c69da3SRaghu Vatsavayi 	 * known to the OS.
26269c69da3SRaghu Vatsavayi 	 */
26369c69da3SRaghu Vatsavayi 	if (octeon_pci_os_setup(oct))
26469c69da3SRaghu Vatsavayi 		return 1;
26569c69da3SRaghu Vatsavayi 	atomic_set(&oct->status, OCT_DEV_PCI_ENABLE_DONE);
26669c69da3SRaghu Vatsavayi 
26769c69da3SRaghu Vatsavayi 	oct->chip_id = OCTEON_CN23XX_VF_VID;
26869c69da3SRaghu Vatsavayi 	pci_read_config_dword(oct->pci_dev, 8, &rev_id);
26969c69da3SRaghu Vatsavayi 	oct->rev_id = rev_id & 0xff;
27069c69da3SRaghu Vatsavayi 
27169c69da3SRaghu Vatsavayi 	if (cn23xx_setup_octeon_vf_device(oct))
27269c69da3SRaghu Vatsavayi 		return 1;
27369c69da3SRaghu Vatsavayi 
27469c69da3SRaghu Vatsavayi 	atomic_set(&oct->status, OCT_DEV_PCI_MAP_DONE);
27569c69da3SRaghu Vatsavayi 
2769003baf0SRaghu Vatsavayi 	/* Initialize the dispatch mechanism used to push packets arriving on
2779003baf0SRaghu Vatsavayi 	 * Octeon Output queues.
2789003baf0SRaghu Vatsavayi 	 */
2799003baf0SRaghu Vatsavayi 	if (octeon_init_dispatch_list(oct))
2809003baf0SRaghu Vatsavayi 		return 1;
2819003baf0SRaghu Vatsavayi 
2829003baf0SRaghu Vatsavayi 	atomic_set(&oct->status, OCT_DEV_DISPATCH_INIT_DONE);
2839003baf0SRaghu Vatsavayi 
284c865cdf1SRaghu Vatsavayi 	if (octeon_set_io_queues_off(oct)) {
285c865cdf1SRaghu Vatsavayi 		dev_err(&oct->pci_dev->dev, "setting io queues off failed\n");
286c865cdf1SRaghu Vatsavayi 		return 1;
287c865cdf1SRaghu Vatsavayi 	}
288c865cdf1SRaghu Vatsavayi 
289da15c78bSRaghu Vatsavayi 	if (oct->fn_list.setup_device_regs(oct)) {
290da15c78bSRaghu Vatsavayi 		dev_err(&oct->pci_dev->dev, "device registers configuration failed\n");
291da15c78bSRaghu Vatsavayi 		return 1;
292da15c78bSRaghu Vatsavayi 	}
293da15c78bSRaghu Vatsavayi 
2949003baf0SRaghu Vatsavayi 	/* Initialize soft command buffer pool */
2959003baf0SRaghu Vatsavayi 	if (octeon_setup_sc_buffer_pool(oct)) {
2969003baf0SRaghu Vatsavayi 		dev_err(&oct->pci_dev->dev, "sc buffer pool allocation failed\n");
2979003baf0SRaghu Vatsavayi 		return 1;
2989003baf0SRaghu Vatsavayi 	}
2999003baf0SRaghu Vatsavayi 	atomic_set(&oct->status, OCT_DEV_SC_BUFF_POOL_INIT_DONE);
3009003baf0SRaghu Vatsavayi 
3019003baf0SRaghu Vatsavayi 	/* Setup the data structures that manage this Octeon's Input queues. */
3029003baf0SRaghu Vatsavayi 	if (octeon_setup_instr_queues(oct)) {
3039003baf0SRaghu Vatsavayi 		dev_err(&oct->pci_dev->dev, "instruction queue initialization failed\n");
3049003baf0SRaghu Vatsavayi 		return 1;
3059003baf0SRaghu Vatsavayi 	}
3069003baf0SRaghu Vatsavayi 	atomic_set(&oct->status, OCT_DEV_INSTR_QUEUE_INIT_DONE);
3079003baf0SRaghu Vatsavayi 
3089003baf0SRaghu Vatsavayi 	/* Initialize lists to manage the requests of different types that
3099003baf0SRaghu Vatsavayi 	 * arrive from user & kernel applications for this octeon device.
3109003baf0SRaghu Vatsavayi 	 */
3119003baf0SRaghu Vatsavayi 	if (octeon_setup_response_list(oct)) {
3129003baf0SRaghu Vatsavayi 		dev_err(&oct->pci_dev->dev, "Response list allocation failed\n");
3139003baf0SRaghu Vatsavayi 		return 1;
3149003baf0SRaghu Vatsavayi 	}
3159003baf0SRaghu Vatsavayi 	atomic_set(&oct->status, OCT_DEV_RESP_LIST_INIT_DONE);
3169003baf0SRaghu Vatsavayi 
3179003baf0SRaghu Vatsavayi 	if (octeon_setup_output_queues(oct)) {
3189003baf0SRaghu Vatsavayi 		dev_err(&oct->pci_dev->dev, "Output queue initialization failed\n");
3199003baf0SRaghu Vatsavayi 		return 1;
3209003baf0SRaghu Vatsavayi 	}
3219003baf0SRaghu Vatsavayi 	atomic_set(&oct->status, OCT_DEV_DROQ_INIT_DONE);
3229003baf0SRaghu Vatsavayi 
323f7cdd64bSRaghu Vatsavayi 	if (oct->fn_list.setup_mbox(oct)) {
324f7cdd64bSRaghu Vatsavayi 		dev_err(&oct->pci_dev->dev, "Mailbox setup failed\n");
325f7cdd64bSRaghu Vatsavayi 		return 1;
326f7cdd64bSRaghu Vatsavayi 	}
327f7cdd64bSRaghu Vatsavayi 	atomic_set(&oct->status, OCT_DEV_MBOX_SETUP_DONE);
328f7cdd64bSRaghu Vatsavayi 
32969c69da3SRaghu Vatsavayi 	return 0;
33069c69da3SRaghu Vatsavayi }
33169c69da3SRaghu Vatsavayi 
332111fc64aSRaghu Vatsavayi static int __init liquidio_vf_init(void)
333111fc64aSRaghu Vatsavayi {
334111fc64aSRaghu Vatsavayi 	octeon_init_device_list(0);
335111fc64aSRaghu Vatsavayi 	return pci_register_driver(&liquidio_vf_pci_driver);
336111fc64aSRaghu Vatsavayi }
337111fc64aSRaghu Vatsavayi 
338111fc64aSRaghu Vatsavayi static void __exit liquidio_vf_exit(void)
339111fc64aSRaghu Vatsavayi {
340111fc64aSRaghu Vatsavayi 	pci_unregister_driver(&liquidio_vf_pci_driver);
341111fc64aSRaghu Vatsavayi 
342111fc64aSRaghu Vatsavayi 	pr_info("LiquidIO_VF network module is now unloaded\n");
343111fc64aSRaghu Vatsavayi }
344111fc64aSRaghu Vatsavayi 
345111fc64aSRaghu Vatsavayi module_init(liquidio_vf_init);
346111fc64aSRaghu Vatsavayi module_exit(liquidio_vf_exit);
347