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