1577ae39dSJitendra Kalsaria /* 2577ae39dSJitendra Kalsaria * QLogic qlcnic NIC Driver 3577ae39dSJitendra Kalsaria * Copyright (c) 2009-2013 QLogic Corporation 4577ae39dSJitendra Kalsaria * 5577ae39dSJitendra Kalsaria * See LICENSE.qlcnic for copyright and licensing details. 6577ae39dSJitendra Kalsaria */ 7577ae39dSJitendra Kalsaria 8d71170fbSSony Chacko #include "qlcnic.h" 9d71170fbSSony Chacko #include "qlcnic_hw.h" 10d71170fbSSony Chacko 11d71170fbSSony Chacko int qlcnic_83xx_enable_vnic_mode(struct qlcnic_adapter *adapter, int lock) 12d71170fbSSony Chacko { 13d71170fbSSony Chacko if (lock) { 14d71170fbSSony Chacko if (qlcnic_83xx_lock_driver(adapter)) 15d71170fbSSony Chacko return -EBUSY; 16d71170fbSSony Chacko } 17d71170fbSSony Chacko QLCWRX(adapter->ahw, QLC_83XX_VNIC_STATE, QLCNIC_DEV_NPAR_OPER); 18d71170fbSSony Chacko if (lock) 19d71170fbSSony Chacko qlcnic_83xx_unlock_driver(adapter); 20d71170fbSSony Chacko 21d71170fbSSony Chacko return 0; 22d71170fbSSony Chacko } 23d71170fbSSony Chacko 24d71170fbSSony Chacko int qlcnic_83xx_disable_vnic_mode(struct qlcnic_adapter *adapter, int lock) 25d71170fbSSony Chacko { 26d71170fbSSony Chacko struct qlcnic_hardware_context *ahw = adapter->ahw; 27d71170fbSSony Chacko 28d71170fbSSony Chacko if (lock) { 29d71170fbSSony Chacko if (qlcnic_83xx_lock_driver(adapter)) 30d71170fbSSony Chacko return -EBUSY; 31d71170fbSSony Chacko } 32d71170fbSSony Chacko 33d71170fbSSony Chacko QLCWRX(adapter->ahw, QLC_83XX_VNIC_STATE, QLCNIC_DEV_NPAR_NON_OPER); 34d71170fbSSony Chacko ahw->idc.vnic_state = QLCNIC_DEV_NPAR_NON_OPER; 35d71170fbSSony Chacko 36d71170fbSSony Chacko if (lock) 37d71170fbSSony Chacko qlcnic_83xx_unlock_driver(adapter); 38d71170fbSSony Chacko 39d71170fbSSony Chacko return 0; 40d71170fbSSony Chacko } 41d71170fbSSony Chacko 42486a5bc7SRajesh Borundia int qlcnic_83xx_set_vnic_opmode(struct qlcnic_adapter *adapter) 43d71170fbSSony Chacko { 44d71170fbSSony Chacko u8 id; 457e8fd003SShahed Shaikh int ret = -EBUSY; 46d71170fbSSony Chacko u32 data = QLCNIC_MGMT_FUNC; 47d71170fbSSony Chacko struct qlcnic_hardware_context *ahw = adapter->ahw; 48d71170fbSSony Chacko 49d71170fbSSony Chacko if (qlcnic_83xx_lock_driver(adapter)) 50d71170fbSSony Chacko return ret; 51d71170fbSSony Chacko 527e8fd003SShahed Shaikh id = ahw->pci_func; 53d71170fbSSony Chacko data = QLCRDX(adapter->ahw, QLC_83XX_DRV_OP_MODE); 547e8fd003SShahed Shaikh data = (data & ~QLC_83XX_SET_FUNC_OPMODE(0x3, id)) | 557e8fd003SShahed Shaikh QLC_83XX_SET_FUNC_OPMODE(QLCNIC_MGMT_FUNC, id); 567e8fd003SShahed Shaikh 57d71170fbSSony Chacko QLCWRX(adapter->ahw, QLC_83XX_DRV_OP_MODE, data); 58d71170fbSSony Chacko 59d71170fbSSony Chacko qlcnic_83xx_unlock_driver(adapter); 60d71170fbSSony Chacko 61d71170fbSSony Chacko return 0; 62d71170fbSSony Chacko } 63d71170fbSSony Chacko 64d71170fbSSony Chacko static void 65d71170fbSSony Chacko qlcnic_83xx_config_vnic_buff_descriptors(struct qlcnic_adapter *adapter) 66d71170fbSSony Chacko { 67d71170fbSSony Chacko struct qlcnic_hardware_context *ahw = adapter->ahw; 68d71170fbSSony Chacko 69d71170fbSSony Chacko if (ahw->port_type == QLCNIC_XGBE) { 70d71170fbSSony Chacko adapter->num_rxd = DEFAULT_RCV_DESCRIPTORS_VF; 71d71170fbSSony Chacko adapter->max_rxd = MAX_RCV_DESCRIPTORS_VF; 72d71170fbSSony Chacko adapter->num_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_10G; 73d71170fbSSony Chacko adapter->max_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_10G; 74d71170fbSSony Chacko 75d71170fbSSony Chacko } else if (ahw->port_type == QLCNIC_GBE) { 76d71170fbSSony Chacko adapter->num_rxd = DEFAULT_RCV_DESCRIPTORS_1G; 77d71170fbSSony Chacko adapter->num_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_1G; 78d71170fbSSony Chacko adapter->max_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_1G; 79d71170fbSSony Chacko adapter->max_rxd = MAX_RCV_DESCRIPTORS_1G; 80d71170fbSSony Chacko } 81d71170fbSSony Chacko adapter->num_txd = MAX_CMD_DESCRIPTORS; 82d71170fbSSony Chacko adapter->max_rds_rings = MAX_RDS_RINGS; 83d71170fbSSony Chacko } 84d71170fbSSony Chacko 85d71170fbSSony Chacko 86d71170fbSSony Chacko /** 87d71170fbSSony Chacko * qlcnic_83xx_init_mgmt_vnic 88d71170fbSSony Chacko * 89d71170fbSSony Chacko * @adapter: adapter structure 90d71170fbSSony Chacko * Management virtual NIC sets the operational mode of other vNIC's and 91d71170fbSSony Chacko * configures embedded switch (ESWITCH). 92d71170fbSSony Chacko * Returns: Success(0) or error code. 93d71170fbSSony Chacko * 94d71170fbSSony Chacko **/ 95d71170fbSSony Chacko static int qlcnic_83xx_init_mgmt_vnic(struct qlcnic_adapter *adapter) 96d71170fbSSony Chacko { 97d71170fbSSony Chacko int err = -EIO; 98d71170fbSSony Chacko 994d53f40fSShahed Shaikh qlcnic_83xx_get_minidump_template(adapter); 100d71170fbSSony Chacko if (!(adapter->flags & QLCNIC_ADAPTER_INITIALIZED)) { 101d71170fbSSony Chacko if (qlcnic_init_pci_info(adapter)) 102d71170fbSSony Chacko return err; 103d71170fbSSony Chacko 104d71170fbSSony Chacko if (qlcnic_83xx_set_vnic_opmode(adapter)) 105d71170fbSSony Chacko return err; 106d71170fbSSony Chacko 107d71170fbSSony Chacko if (qlcnic_set_default_offload_settings(adapter)) 108d71170fbSSony Chacko return err; 109d71170fbSSony Chacko } else { 110d71170fbSSony Chacko if (qlcnic_reset_npar_config(adapter)) 111d71170fbSSony Chacko return err; 112d71170fbSSony Chacko } 113d71170fbSSony Chacko 114d71170fbSSony Chacko if (qlcnic_83xx_get_port_info(adapter)) 115d71170fbSSony Chacko return err; 116d71170fbSSony Chacko 117d71170fbSSony Chacko qlcnic_83xx_config_vnic_buff_descriptors(adapter); 118d71170fbSSony Chacko adapter->ahw->msix_supported = !!qlcnic_use_msi_x; 119d71170fbSSony Chacko adapter->flags |= QLCNIC_ADAPTER_INITIALIZED; 120d71170fbSSony Chacko qlcnic_83xx_enable_vnic_mode(adapter, 1); 121d71170fbSSony Chacko 122d71170fbSSony Chacko dev_info(&adapter->pdev->dev, "HAL Version: %d, Management function\n", 123d71170fbSSony Chacko adapter->ahw->fw_hal_version); 124d71170fbSSony Chacko 125d71170fbSSony Chacko return 0; 126d71170fbSSony Chacko } 127d71170fbSSony Chacko 128d71170fbSSony Chacko static int qlcnic_83xx_init_privileged_vnic(struct qlcnic_adapter *adapter) 129d71170fbSSony Chacko { 130d71170fbSSony Chacko int err = -EIO; 131d71170fbSSony Chacko 1324d53f40fSShahed Shaikh qlcnic_83xx_get_minidump_template(adapter); 133d71170fbSSony Chacko if (qlcnic_83xx_get_port_info(adapter)) 134d71170fbSSony Chacko return err; 135d71170fbSSony Chacko 136d71170fbSSony Chacko qlcnic_83xx_config_vnic_buff_descriptors(adapter); 137d71170fbSSony Chacko adapter->ahw->msix_supported = !!qlcnic_use_msi_x; 138d71170fbSSony Chacko adapter->flags |= QLCNIC_ADAPTER_INITIALIZED; 139d71170fbSSony Chacko 140d71170fbSSony Chacko dev_info(&adapter->pdev->dev, 141d71170fbSSony Chacko "HAL Version: %d, Privileged function\n", 142d71170fbSSony Chacko adapter->ahw->fw_hal_version); 143d71170fbSSony Chacko return 0; 144d71170fbSSony Chacko } 145d71170fbSSony Chacko 146d71170fbSSony Chacko static int qlcnic_83xx_init_non_privileged_vnic(struct qlcnic_adapter *adapter) 147d71170fbSSony Chacko { 148d71170fbSSony Chacko int err = -EIO; 149d71170fbSSony Chacko 150d71170fbSSony Chacko qlcnic_83xx_get_fw_version(adapter); 151d71170fbSSony Chacko if (qlcnic_set_eswitch_port_config(adapter)) 152d71170fbSSony Chacko return err; 153d71170fbSSony Chacko 154d71170fbSSony Chacko if (qlcnic_83xx_get_port_info(adapter)) 155d71170fbSSony Chacko return err; 156d71170fbSSony Chacko 157d71170fbSSony Chacko qlcnic_83xx_config_vnic_buff_descriptors(adapter); 158d71170fbSSony Chacko adapter->ahw->msix_supported = !!qlcnic_use_msi_x; 159d71170fbSSony Chacko adapter->flags |= QLCNIC_ADAPTER_INITIALIZED; 160d71170fbSSony Chacko 161d71170fbSSony Chacko dev_info(&adapter->pdev->dev, "HAL Version: %d, Virtual function\n", 162d71170fbSSony Chacko adapter->ahw->fw_hal_version); 163d71170fbSSony Chacko 164d71170fbSSony Chacko return 0; 165d71170fbSSony Chacko } 166d71170fbSSony Chacko 167d71170fbSSony Chacko /** 168d71170fbSSony Chacko * qlcnic_83xx_vnic_opmode 169d71170fbSSony Chacko * 170d71170fbSSony Chacko * @adapter: adapter structure 171d71170fbSSony Chacko * Identify virtual NIC operational modes. 172d71170fbSSony Chacko * 173d71170fbSSony Chacko * Returns: Success(0) or error code. 174d71170fbSSony Chacko * 175d71170fbSSony Chacko **/ 176d71170fbSSony Chacko int qlcnic_83xx_config_vnic_opmode(struct qlcnic_adapter *adapter) 177d71170fbSSony Chacko { 178d71170fbSSony Chacko u32 op_mode, priv_level; 179d71170fbSSony Chacko struct qlcnic_hardware_context *ahw = adapter->ahw; 180d71170fbSSony Chacko struct qlcnic_nic_template *nic_ops = adapter->nic_ops; 181d71170fbSSony Chacko 182d71170fbSSony Chacko qlcnic_get_func_no(adapter); 183d71170fbSSony Chacko op_mode = QLCRDX(adapter->ahw, QLC_83XX_DRV_OP_MODE); 184d71170fbSSony Chacko 185d71170fbSSony Chacko if (op_mode == QLC_83XX_DEFAULT_OPMODE) 186d71170fbSSony Chacko priv_level = QLCNIC_MGMT_FUNC; 187d71170fbSSony Chacko else 188d71170fbSSony Chacko priv_level = QLC_83XX_GET_FUNC_PRIVILEGE(op_mode, 189d71170fbSSony Chacko ahw->pci_func); 190b17f2ccaSJitendra Kalsaria switch (priv_level) { 191b17f2ccaSJitendra Kalsaria case QLCNIC_NON_PRIV_FUNC: 192d71170fbSSony Chacko ahw->op_mode = QLCNIC_NON_PRIV_FUNC; 193d71170fbSSony Chacko ahw->idc.state_entry = qlcnic_83xx_idc_ready_state_entry; 194d71170fbSSony Chacko nic_ops->init_driver = qlcnic_83xx_init_non_privileged_vnic; 195b17f2ccaSJitendra Kalsaria break; 196b17f2ccaSJitendra Kalsaria case QLCNIC_PRIV_FUNC: 197d71170fbSSony Chacko ahw->op_mode = QLCNIC_PRIV_FUNC; 198d71170fbSSony Chacko ahw->idc.state_entry = qlcnic_83xx_idc_vnic_pf_entry; 199d71170fbSSony Chacko nic_ops->init_driver = qlcnic_83xx_init_privileged_vnic; 200b17f2ccaSJitendra Kalsaria break; 201b17f2ccaSJitendra Kalsaria case QLCNIC_MGMT_FUNC: 202d71170fbSSony Chacko ahw->op_mode = QLCNIC_MGMT_FUNC; 203d71170fbSSony Chacko ahw->idc.state_entry = qlcnic_83xx_idc_ready_state_entry; 204d71170fbSSony Chacko nic_ops->init_driver = qlcnic_83xx_init_mgmt_vnic; 205b17f2ccaSJitendra Kalsaria break; 206b17f2ccaSJitendra Kalsaria default: 207b17f2ccaSJitendra Kalsaria dev_err(&adapter->pdev->dev, "Invalid Virtual NIC opmode\n"); 208d71170fbSSony Chacko return -EIO; 209d71170fbSSony Chacko } 210d71170fbSSony Chacko 21135dafcb0SSony Chacko if (ahw->capabilities & QLC_83XX_ESWITCH_CAPABILITY) 212d71170fbSSony Chacko adapter->flags |= QLCNIC_ESWITCH_ENABLED; 213d71170fbSSony Chacko else 214d71170fbSSony Chacko adapter->flags &= ~QLCNIC_ESWITCH_ENABLED; 215d71170fbSSony Chacko 216b17f2ccaSJitendra Kalsaria ahw->idc.vnic_state = QLCNIC_DEV_NPAR_NON_OPER; 217b17f2ccaSJitendra Kalsaria ahw->idc.vnic_wait_limit = QLCNIC_DEV_NPAR_OPER_TIMEO; 218d71170fbSSony Chacko 219d71170fbSSony Chacko return 0; 220d71170fbSSony Chacko } 221486a5bc7SRajesh Borundia 222486a5bc7SRajesh Borundia int qlcnic_83xx_check_vnic_state(struct qlcnic_adapter *adapter) 223486a5bc7SRajesh Borundia { 224486a5bc7SRajesh Borundia struct qlcnic_hardware_context *ahw = adapter->ahw; 225486a5bc7SRajesh Borundia struct qlc_83xx_idc *idc = &ahw->idc; 226486a5bc7SRajesh Borundia u32 state; 227486a5bc7SRajesh Borundia 228486a5bc7SRajesh Borundia state = QLCRDX(ahw, QLC_83XX_VNIC_STATE); 229486a5bc7SRajesh Borundia while (state != QLCNIC_DEV_NPAR_OPER && idc->vnic_wait_limit--) { 230486a5bc7SRajesh Borundia msleep(1000); 231486a5bc7SRajesh Borundia state = QLCRDX(ahw, QLC_83XX_VNIC_STATE); 232486a5bc7SRajesh Borundia } 233486a5bc7SRajesh Borundia 234486a5bc7SRajesh Borundia if (!idc->vnic_wait_limit) { 235486a5bc7SRajesh Borundia dev_err(&adapter->pdev->dev, 236486a5bc7SRajesh Borundia "vNIC mode not operational, state check timed out.\n"); 237486a5bc7SRajesh Borundia return -EIO; 238486a5bc7SRajesh Borundia } 239486a5bc7SRajesh Borundia 240486a5bc7SRajesh Borundia return 0; 241486a5bc7SRajesh Borundia } 24235dafcb0SSony Chacko 24335dafcb0SSony Chacko static int qlcnic_83xx_get_eswitch_port_info(struct qlcnic_adapter *adapter, 24435dafcb0SSony Chacko int func, int *port_id) 24535dafcb0SSony Chacko { 24635dafcb0SSony Chacko struct qlcnic_info nic_info; 24735dafcb0SSony Chacko int err = 0; 24835dafcb0SSony Chacko 24935dafcb0SSony Chacko memset(&nic_info, 0, sizeof(struct qlcnic_info)); 25035dafcb0SSony Chacko 25135dafcb0SSony Chacko err = qlcnic_get_nic_info(adapter, &nic_info, func); 25235dafcb0SSony Chacko if (err) 25335dafcb0SSony Chacko return err; 25435dafcb0SSony Chacko 25535dafcb0SSony Chacko if (nic_info.capabilities & QLC_83XX_ESWITCH_CAPABILITY) 25635dafcb0SSony Chacko *port_id = nic_info.phys_port; 25735dafcb0SSony Chacko else 25835dafcb0SSony Chacko err = -EIO; 25935dafcb0SSony Chacko 26035dafcb0SSony Chacko return err; 26135dafcb0SSony Chacko } 26235dafcb0SSony Chacko 26335dafcb0SSony Chacko int qlcnic_83xx_enable_port_eswitch(struct qlcnic_adapter *adapter, int func) 26435dafcb0SSony Chacko { 26535dafcb0SSony Chacko int id, err = 0; 26635dafcb0SSony Chacko 26735dafcb0SSony Chacko err = qlcnic_83xx_get_eswitch_port_info(adapter, func, &id); 26835dafcb0SSony Chacko if (err) 26935dafcb0SSony Chacko return err; 27035dafcb0SSony Chacko 27135dafcb0SSony Chacko if (!(adapter->eswitch[id].flags & QLCNIC_SWITCH_ENABLE)) { 27235dafcb0SSony Chacko if (!qlcnic_enable_eswitch(adapter, id, 1)) 27335dafcb0SSony Chacko adapter->eswitch[id].flags |= QLCNIC_SWITCH_ENABLE; 27435dafcb0SSony Chacko else 27535dafcb0SSony Chacko err = -EIO; 27635dafcb0SSony Chacko } 27735dafcb0SSony Chacko 27835dafcb0SSony Chacko return err; 27935dafcb0SSony Chacko } 280