4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * CDDL HEADER START
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * The contents of this file are subject to the terms of the
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * Common Development and Distribution License (the "License").
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * You may not use this file except in compliance with the License.
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * or http://www.opensolaris.org/os/licensing.
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * See the License for the specific language governing permissions
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * and limitations under the License.
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * When distributing Covered Code, include this CDDL HEADER in each
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * If applicable, add the following below this CDDL HEADER, with the
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * fields enclosed by brackets "[]" replaced with your own identifying
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * information: Portions Copyright [yyyy] [name of copyright owner]
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * CDDL HEADER END
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore/* Copyright © 2003-2011 Emulex. All rights reserved. */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * Source file containing the implementation of the Hardware specific
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * functions
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#include <oce_impl.h>
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#include <oce_stat.h>
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#include <oce_ioctl.h>
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanstatic ddi_device_acc_attr_t reg_accattr = {
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan DDI_DEVICE_ATTR_V1,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan DDI_STRUCTURE_LE_ACC,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan DDI_STRICTORDER_ACC,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan DDI_FLAGERR_ACC
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan};
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanextern int oce_destroy_q(struct oce_dev *dev, struct oce_mbx *mbx,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan size_t req_size, enum qtype qtype);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathanstatic int
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathanoce_map_regs(struct oce_dev *dev)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan int ret = 0;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan off_t bar_size = 0;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ASSERT(NULL != dev);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ASSERT(NULL != dev->dip);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* get number of supported bars */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ret = ddi_dev_nregs(dev->dip, &dev->num_bars);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (ret != DDI_SUCCESS) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_log(dev, CE_WARN, MOD_CONFIG,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "%d: could not retrieve num_bars", MOD_CONFIG);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (DDI_FAILURE);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* verify each bar and map it accordingly */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* PCI CFG */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ret = ddi_dev_regsize(dev->dip, OCE_DEV_CFG_BAR, &bar_size);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (ret != DDI_SUCCESS) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_log(dev, CE_WARN, MOD_CONFIG,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "Could not get sizeof BAR %d",
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan OCE_DEV_CFG_BAR);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (DDI_FAILURE);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ret = ddi_regs_map_setup(dev->dip, OCE_DEV_CFG_BAR, &dev->dev_cfg_addr,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan 0, bar_size, &reg_accattr, &dev->dev_cfg_handle);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (ret != DDI_SUCCESS) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_log(dev, CE_WARN, MOD_CONFIG,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "Could not map bar %d",
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan OCE_DEV_CFG_BAR);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (DDI_FAILURE);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* CSR */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ret = ddi_dev_regsize(dev->dip, OCE_PCI_CSR_BAR, &bar_size);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (ret != DDI_SUCCESS) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_log(dev, CE_WARN, MOD_CONFIG,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "Could not get sizeof BAR %d",
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan OCE_PCI_CSR_BAR);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (DDI_FAILURE);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ret = ddi_regs_map_setup(dev->dip, OCE_PCI_CSR_BAR, &dev->csr_addr,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan 0, bar_size, &reg_accattr, &dev->csr_handle);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (ret != DDI_SUCCESS) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_log(dev, CE_WARN, MOD_CONFIG,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "Could not map bar %d",
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan OCE_PCI_CSR_BAR);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ddi_regs_map_free(&dev->dev_cfg_handle);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (DDI_FAILURE);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* Doorbells */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ret = ddi_dev_regsize(dev->dip, OCE_PCI_DB_BAR, &bar_size);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (ret != DDI_SUCCESS) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_log(dev, CE_WARN, MOD_CONFIG,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "%d Could not get sizeof BAR %d",
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ret, OCE_PCI_DB_BAR);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ddi_regs_map_free(&dev->csr_handle);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ddi_regs_map_free(&dev->dev_cfg_handle);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (DDI_FAILURE);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ret = ddi_regs_map_setup(dev->dip, OCE_PCI_DB_BAR, &dev->db_addr,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan 0, 0, &reg_accattr, &dev->db_handle);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (ret != DDI_SUCCESS) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_log(dev, CE_WARN, MOD_CONFIG,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "Could not map bar %d", OCE_PCI_DB_BAR);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ddi_regs_map_free(&dev->csr_handle);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ddi_regs_map_free(&dev->dev_cfg_handle);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (DDI_FAILURE);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (DDI_SUCCESS);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan}
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathanstatic void
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathanoce_unmap_regs(struct oce_dev *dev)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ASSERT(NULL != dev);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ASSERT(NULL != dev->dip);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ddi_regs_map_free(&dev->db_handle);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ddi_regs_map_free(&dev->csr_handle);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ddi_regs_map_free(&dev->dev_cfg_handle);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan}
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/*
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan * function to map the device memory
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan * dev - handle to device private data structure
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathanint
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathanoce_pci_init(struct oce_dev *dev)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan int ret = 0;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan ret = oce_map_regs(dev);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan if (ret != DDI_SUCCESS) {
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan return (DDI_FAILURE);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan dev->fn = OCE_PCI_FUNC(dev);
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan if (oce_fm_check_acc_handle(dev, dev->dev_cfg_handle) != DDI_FM_OK) {
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan ddi_fm_service_impact(dev->dip, DDI_SERVICE_DEGRADED);
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan if (ret != DDI_FM_OK) {
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan oce_pci_fini(dev);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan return (DDI_FAILURE);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (DDI_SUCCESS);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan} /* oce_pci_init */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan/*
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan * function to free device memory mapping mapped using
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan * oce_pci_init
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan *
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan * dev - handle to device private data
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanvoid
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathanoce_pci_fini(struct oce_dev *dev)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan oce_unmap_regs(dev);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan} /* oce_pci_fini */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore/*
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore * function to read the PCI Bus, Device, and function numbers for the
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore * device instance.
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore *
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore * dev - handle to device private data
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore */
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amoreint
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amoreoce_get_bdf(struct oce_dev *dev)
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore{
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore pci_regspec_t *pci_rp;
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore uint32_t length;
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore int rc;
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore /* Get "reg" property */
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore rc = ddi_prop_lookup_int_array(DDI_DEV_T_ANY, dev->dip,
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore 0, "reg", (int **)&pci_rp, (uint_t *)&length);
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore if ((rc != DDI_SUCCESS) ||
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore (length < (sizeof (pci_regspec_t) / sizeof (int)))) {
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore oce_log(dev, CE_WARN, MOD_CONFIG,
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore "Failed to read \"reg\" property, Status = 0x%x", rc);
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore return (rc);
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore }
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore dev->pci_bus = PCI_REG_BUS_G(pci_rp->pci_phys_hi);
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore dev->pci_device = PCI_REG_DEV_G(pci_rp->pci_phys_hi);
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore dev->pci_function = PCI_REG_FUNC_G(pci_rp->pci_phys_hi);
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore oce_log(dev, CE_NOTE, MOD_CONFIG,
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore "\"reg\" property num=%d, Bus=%d, Device=%d, Function=%d",
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore length, dev->pci_bus, dev->pci_device, dev->pci_function);
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore /* Free the memory allocated by ddi_prop_lookup_int_array() */
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore ddi_prop_free(pci_rp);
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore return (rc);
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore}
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amoreint
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amoreoce_identify_hw(struct oce_dev *dev)
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore{
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore int ret = DDI_SUCCESS;
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore dev->vendor_id = pci_config_get16(dev->pci_cfg_handle,
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore PCI_CONF_VENID);
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore dev->device_id = pci_config_get16(dev->pci_cfg_handle,
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore PCI_CONF_DEVID);
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore dev->subsys_id = pci_config_get16(dev->pci_cfg_handle,
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore PCI_CONF_SUBSYSID);
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore dev->subvendor_id = pci_config_get16(dev->pci_cfg_handle,
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore PCI_CONF_SUBVENID);
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore switch (dev->device_id) {
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore case DEVID_TIGERSHARK:
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore dev->chip_rev = OC_CNA_GEN2;
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore break;
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore case DEVID_TOMCAT:
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore dev->chip_rev = OC_CNA_GEN3;
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore break;
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore default:
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore dev->chip_rev = 0;
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore ret = DDI_FAILURE;
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore break;
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore }
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore return (ret);
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore}
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * function to check if a reset is required
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * dev - software handle to the device
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanboolean_t
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanoce_is_reset_pci(struct oce_dev *dev)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mpu_ep_semaphore_t post_status;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ASSERT(dev != NULL);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ASSERT(dev->dip != NULL);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan post_status.dw0 = 0;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan post_status.dw0 = OCE_CSR_READ32(dev, MPU_EP_SEMAPHORE);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (post_status.bits.stage == POST_STAGE_ARMFW_READY) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (B_FALSE);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (B_TRUE);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan} /* oce_is_reset_pci */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * function to do a soft reset on the device
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * dev - software handle to the device
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanint
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanoce_pci_soft_reset(struct oce_dev *dev)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan pcicfg_soft_reset_t soft_rst;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* struct mpu_ep_control ep_control; */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* struct pcicfg_online1 online1; */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan clock_t tmo;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan clock_t earlier = ddi_get_lbolt();
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ASSERT(dev != NULL);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* issue soft reset */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan soft_rst.dw0 = OCE_CFG_READ32(dev, PCICFG_SOFT_RESET);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan soft_rst.bits.soft_reset = 0x01;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan OCE_CFG_WRITE32(dev, PCICFG_SOFT_RESET, soft_rst.dw0);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* wait till soft reset bit deasserts */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan tmo = drv_usectohz(60000000); /* 1.0min */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan do {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if ((ddi_get_lbolt() - earlier) > tmo) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan tmo = 0;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan break;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan soft_rst.dw0 = OCE_CFG_READ32(dev, PCICFG_SOFT_RESET);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (soft_rst.bits.soft_reset)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan drv_usecwait(100);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan } while (soft_rst.bits.soft_reset);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (soft_rst.bits.soft_reset) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_log(dev, CE_WARN, MOD_CONFIG,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "0x%x soft_reset"
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "bit asserted[1]. Reset failed",
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan soft_rst.dw0);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (DDI_FAILURE);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (oce_POST(dev));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan} /* oce_pci_soft_reset */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * function to trigger a POST on the device
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * dev - software handle to the device
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanint
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanoce_POST(struct oce_dev *dev)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mpu_ep_semaphore_t post_status;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan clock_t tmo;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan clock_t earlier = ddi_get_lbolt();
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* read semaphore CSR */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan post_status.dw0 = OCE_CSR_READ32(dev, MPU_EP_SEMAPHORE);
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan if (oce_fm_check_acc_handle(dev, dev->csr_handle) != DDI_FM_OK) {
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan ddi_fm_service_impact(dev->dip, DDI_SERVICE_DEGRADED);
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan return (DDI_FAILURE);
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* if host is ready then wait for fw ready else send POST */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (post_status.bits.stage <= POST_STAGE_AWAITING_HOST_RDY) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan post_status.bits.stage = POST_STAGE_CHIP_RESET;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan OCE_CSR_WRITE32(dev, MPU_EP_SEMAPHORE, post_status.dw0);
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan if (oce_fm_check_acc_handle(dev, dev->csr_handle) !=
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan DDI_FM_OK) {
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan ddi_fm_service_impact(dev->dip, DDI_SERVICE_DEGRADED);
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan return (DDI_FAILURE);
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* wait for FW ready */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan tmo = drv_usectohz(60000000); /* 1.0min */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan for (;;) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if ((ddi_get_lbolt() - earlier) > tmo) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan tmo = 0;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan break;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan post_status.dw0 = OCE_CSR_READ32(dev, MPU_EP_SEMAPHORE);
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan if (oce_fm_check_acc_handle(dev, dev->csr_handle) !=
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan DDI_FM_OK) {
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan ddi_fm_service_impact(dev->dip, DDI_SERVICE_DEGRADED);
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan return (DDI_FAILURE);
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan }
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan if (post_status.bits.error) {
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan oce_log(dev, CE_WARN, MOD_CONFIG,
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan "0x%x POST ERROR!!", post_status.dw0);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan return (DDI_FAILURE);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (post_status.bits.stage == POST_STAGE_ARMFW_READY)
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan return (DDI_SUCCESS);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan drv_usecwait(100);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan return (DDI_FAILURE);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan} /* oce_POST */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * function to modify register access attributes corresponding to the
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * FM capabilities configured by the user
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * fm_caps - fm capability configured by the user and accepted by the driver
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanvoid
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanoce_set_reg_fma_flags(int fm_caps)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (fm_caps == DDI_FM_NOT_CAPABLE) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (DDI_FM_ACC_ERR_CAP(fm_caps)) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan reg_accattr.devacc_attr_access = DDI_FLAGERR_ACC;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan } else {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan reg_accattr.devacc_attr_access = DDI_DEFAULT_ACC;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan} /* oce_set_fma_flags */
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathanint
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathanoce_create_nw_interface(struct oce_dev *dev)
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan{
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan int ret;
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan uint32_t capab_flags = OCE_CAPAB_FLAGS;
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan uint32_t capab_en_flags = OCE_CAPAB_ENABLE;
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan if (dev->rss_enable) {
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan capab_flags |= MBX_RX_IFACE_FLAGS_RSS;
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan capab_en_flags |= MBX_RX_IFACE_FLAGS_RSS;
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan }
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan /* create an interface for the device with out mac */
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan ret = oce_if_create(dev, capab_flags, capab_en_flags,
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan 0, &dev->mac_addr[0], (uint32_t *)&dev->if_id);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan if (ret != 0) {
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan oce_log(dev, CE_WARN, MOD_CONFIG,
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan "Interface creation failed: 0x%x", ret);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan return (ret);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan }
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan atomic_inc_32(&dev->nifs);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan dev->if_cap_flags = capab_en_flags;
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan /* Enable VLAN Promisc on HW */
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan ret = oce_config_vlan(dev, (uint8_t)dev->if_id, NULL, 0,
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan B_TRUE, B_TRUE);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan if (ret != 0) {
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan oce_log(dev, CE_WARN, MOD_CONFIG,
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan "Config vlan failed: %d", ret);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan oce_delete_nw_interface(dev);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan return (ret);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan }
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan /* set default flow control */
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan ret = oce_set_flow_control(dev, dev->flow_control);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan if (ret != 0) {
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan oce_log(dev, CE_NOTE, MOD_CONFIG,
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan "Set flow control failed: %d", ret);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan }
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan ret = oce_set_promiscuous(dev, dev->promisc);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan if (ret != 0) {
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan oce_log(dev, CE_NOTE, MOD_CONFIG,
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan "Set Promisc failed: %d", ret);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan }
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan return (0);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan}
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathanvoid
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathanoce_delete_nw_interface(struct oce_dev *dev) {
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan /* currently only single interface is implmeneted */
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan if (dev->nifs > 0) {
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan (void) oce_if_del(dev, dev->if_id);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan atomic_dec_32(&dev->nifs);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan }
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan}
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathanstatic void
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathanoce_create_itbl(struct oce_dev *dev, char *itbl)
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan{
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan int i;
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan struct oce_rq **rss_queuep = &dev->rq[1];
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan int nrss = dev->nrqs - 1;
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan /* fill the indirection table rq 0 is default queue */
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan for (i = 0; i < OCE_ITBL_SIZE; i++) {
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan itbl[i] = rss_queuep[i % nrss]->rss_cpuid;
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan }
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan}
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathanint
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathanoce_setup_adapter(struct oce_dev *dev)
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan{
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan int ret;
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan char itbl[OCE_ITBL_SIZE];
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan char hkey[OCE_HKEY_SIZE];
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan /* disable the interrupts here and enable in start */
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan oce_chip_di(dev);
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan ret = oce_create_nw_interface(dev);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan if (ret != DDI_SUCCESS) {
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan return (DDI_FAILURE);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan }
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan ret = oce_create_queues(dev);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan if (ret != DDI_SUCCESS) {
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan oce_delete_nw_interface(dev);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan return (DDI_FAILURE);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan }
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan if (dev->rss_enable) {
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan (void) oce_create_itbl(dev, itbl);
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan (void) oce_gen_hkey(hkey, OCE_HKEY_SIZE);
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan ret = oce_config_rss(dev, dev->if_id, hkey, itbl, OCE_ITBL_SIZE,
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan OCE_DEFAULT_RSS_TYPE, B_TRUE);
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan if (ret != DDI_SUCCESS) {
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan oce_log(dev, CE_NOTE, MOD_CONFIG, "%s",
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan "Failed to Configure RSS");
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan oce_delete_queues(dev);
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan oce_delete_nw_interface(dev);
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan return (ret);
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan }
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan }
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan ret = oce_setup_handlers(dev);
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan if (ret != DDI_SUCCESS) {
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan oce_log(dev, CE_NOTE, MOD_CONFIG, "%s",
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan "Failed to Setup handlers");
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan oce_delete_queues(dev);
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan oce_delete_nw_interface(dev);
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan return (ret);
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan }
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan return (DDI_SUCCESS);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan}
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathanvoid
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathanoce_unsetup_adapter(struct oce_dev *dev)
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan{
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan oce_remove_handler(dev);
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan if (dev->rss_enable) {
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan char itbl[OCE_ITBL_SIZE] = {0};
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan char hkey[OCE_HKEY_SIZE] = {0};
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan int ret = 0;
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan ret = oce_config_rss(dev, dev->if_id, hkey, itbl, OCE_ITBL_SIZE,
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan RSS_ENABLE_NONE, B_TRUE);
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan if (ret != DDI_SUCCESS) {
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan oce_log(dev, CE_NOTE, MOD_CONFIG, "%s",
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan "Failed to Disable RSS");
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan }
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan }
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan oce_delete_queues(dev);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan oce_delete_nw_interface(dev);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan}
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathanint
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathanoce_hw_init(struct oce_dev *dev)
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan{
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan int ret;
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan struct mac_address_format mac_addr;
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan ret = oce_POST(dev);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan if (ret != DDI_SUCCESS) {
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan oce_log(dev, CE_WARN, MOD_CONFIG, "%s",
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan "!!!HW POST1 FAILED");
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan /* ADD FM FAULT */
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan return (DDI_FAILURE);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan }
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan /* create bootstrap mailbox */
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan dev->bmbx = oce_alloc_dma_buffer(dev,
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan sizeof (struct oce_bmbx), NULL, DDI_DMA_CONSISTENT);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan if (dev->bmbx == NULL) {
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan oce_log(dev, CE_WARN, MOD_CONFIG,
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan "Failed to allocate bmbx: size = %u",
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan (uint32_t)sizeof (struct oce_bmbx));
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan return (DDI_FAILURE);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan }
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan ret = oce_reset_fun(dev);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan if (ret != 0) {
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan oce_log(dev, CE_WARN, MOD_CONFIG, "%s",
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan "!!!FUNCTION RESET FAILED");
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan goto init_fail;
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan }
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan /* reset the Endianess of BMBX */
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan ret = oce_mbox_init(dev);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan if (ret != 0) {
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan oce_log(dev, CE_WARN, MOD_CONFIG,
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan "Mailbox initialization2 Failed with %d", ret);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan goto init_fail;
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan }
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan /* read the firmware version */
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan ret = oce_get_fw_version(dev);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan if (ret != 0) {
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan oce_log(dev, CE_WARN, MOD_CONFIG,
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan "Firmaware version read failed with %d", ret);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan goto init_fail;
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan }
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan /* read the fw config */
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan ret = oce_get_fw_config(dev);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan if (ret != 0) {
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan oce_log(dev, CE_WARN, MOD_CONFIG,
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan "Firmware configuration read failed with %d", ret);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan goto init_fail;
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan }
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan /* read the Factory MAC address */
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan ret = oce_read_mac_addr(dev, 0, 1,
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan MAC_ADDRESS_TYPE_NETWORK, &mac_addr);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan if (ret != 0) {
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan oce_log(dev, CE_WARN, MOD_CONFIG,
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan "MAC address read failed with %d", ret);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan goto init_fail;
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan }
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan bcopy(&mac_addr.mac_addr[0], &dev->mac_addr[0], ETHERADDRL);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan return (DDI_SUCCESS);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathaninit_fail:
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan oce_hw_fini(dev);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan return (DDI_FAILURE);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan}
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathanvoid
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathanoce_hw_fini(struct oce_dev *dev)
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan{
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan if (dev->bmbx != NULL) {
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan oce_free_dma_buffer(dev, dev->bmbx);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan dev->bmbx = NULL;
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan }
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan}