1d71170fbSSony Chacko #include "qlcnic.h" 2d71170fbSSony Chacko #include "qlcnic_hw.h" 3d71170fbSSony Chacko 4d71170fbSSony Chacko int qlcnic_83xx_enable_vnic_mode(struct qlcnic_adapter *adapter, int lock) 5d71170fbSSony Chacko { 6d71170fbSSony Chacko if (lock) { 7d71170fbSSony Chacko if (qlcnic_83xx_lock_driver(adapter)) 8d71170fbSSony Chacko return -EBUSY; 9d71170fbSSony Chacko } 10d71170fbSSony Chacko QLCWRX(adapter->ahw, QLC_83XX_VNIC_STATE, QLCNIC_DEV_NPAR_OPER); 11d71170fbSSony Chacko if (lock) 12d71170fbSSony Chacko qlcnic_83xx_unlock_driver(adapter); 13d71170fbSSony Chacko 14d71170fbSSony Chacko return 0; 15d71170fbSSony Chacko } 16d71170fbSSony Chacko 17d71170fbSSony Chacko int qlcnic_83xx_disable_vnic_mode(struct qlcnic_adapter *adapter, int lock) 18d71170fbSSony Chacko { 19d71170fbSSony Chacko struct qlcnic_hardware_context *ahw = adapter->ahw; 20d71170fbSSony Chacko 21d71170fbSSony Chacko if (lock) { 22d71170fbSSony Chacko if (qlcnic_83xx_lock_driver(adapter)) 23d71170fbSSony Chacko return -EBUSY; 24d71170fbSSony Chacko } 25d71170fbSSony Chacko 26d71170fbSSony Chacko QLCWRX(adapter->ahw, QLC_83XX_VNIC_STATE, QLCNIC_DEV_NPAR_NON_OPER); 27d71170fbSSony Chacko ahw->idc.vnic_state = QLCNIC_DEV_NPAR_NON_OPER; 28d71170fbSSony Chacko 29d71170fbSSony Chacko if (lock) 30d71170fbSSony Chacko qlcnic_83xx_unlock_driver(adapter); 31d71170fbSSony Chacko 32d71170fbSSony Chacko return 0; 33d71170fbSSony Chacko } 34d71170fbSSony Chacko 35d71170fbSSony Chacko static int qlcnic_83xx_set_vnic_opmode(struct qlcnic_adapter *adapter) 36d71170fbSSony Chacko { 37d71170fbSSony Chacko u8 id; 38d71170fbSSony Chacko int i, ret = -EBUSY; 39d71170fbSSony Chacko u32 data = QLCNIC_MGMT_FUNC; 40d71170fbSSony Chacko struct qlcnic_hardware_context *ahw = adapter->ahw; 41d71170fbSSony Chacko 42d71170fbSSony Chacko if (qlcnic_83xx_lock_driver(adapter)) 43d71170fbSSony Chacko return ret; 44d71170fbSSony Chacko 45d71170fbSSony Chacko if (qlcnic_config_npars) { 46d71170fbSSony Chacko for (i = 0; i < ahw->act_pci_func; i++) { 47d71170fbSSony Chacko id = adapter->npars[i].pci_func; 48d71170fbSSony Chacko if (id == ahw->pci_func) 49d71170fbSSony Chacko continue; 50d71170fbSSony Chacko data |= qlcnic_config_npars & 51d71170fbSSony Chacko QLC_83XX_SET_FUNC_OPMODE(0x3, id); 52d71170fbSSony Chacko } 53d71170fbSSony Chacko } else { 54d71170fbSSony Chacko data = QLCRDX(adapter->ahw, QLC_83XX_DRV_OP_MODE); 55d71170fbSSony Chacko data = (data & ~QLC_83XX_SET_FUNC_OPMODE(0x3, ahw->pci_func)) | 56d71170fbSSony Chacko QLC_83XX_SET_FUNC_OPMODE(QLCNIC_MGMT_FUNC, 57d71170fbSSony Chacko ahw->pci_func); 58d71170fbSSony Chacko } 59d71170fbSSony Chacko QLCWRX(adapter->ahw, QLC_83XX_DRV_OP_MODE, data); 60d71170fbSSony Chacko 61d71170fbSSony Chacko qlcnic_83xx_unlock_driver(adapter); 62d71170fbSSony Chacko 63d71170fbSSony Chacko return 0; 64d71170fbSSony Chacko } 65d71170fbSSony Chacko 66d71170fbSSony Chacko static void 67d71170fbSSony Chacko qlcnic_83xx_config_vnic_buff_descriptors(struct qlcnic_adapter *adapter) 68d71170fbSSony Chacko { 69d71170fbSSony Chacko struct qlcnic_hardware_context *ahw = adapter->ahw; 70d71170fbSSony Chacko 71d71170fbSSony Chacko if (ahw->port_type == QLCNIC_XGBE) { 72d71170fbSSony Chacko adapter->num_rxd = DEFAULT_RCV_DESCRIPTORS_VF; 73d71170fbSSony Chacko adapter->max_rxd = MAX_RCV_DESCRIPTORS_VF; 74d71170fbSSony Chacko adapter->num_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_10G; 75d71170fbSSony Chacko adapter->max_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_10G; 76d71170fbSSony Chacko 77d71170fbSSony Chacko } else if (ahw->port_type == QLCNIC_GBE) { 78d71170fbSSony Chacko adapter->num_rxd = DEFAULT_RCV_DESCRIPTORS_1G; 79d71170fbSSony Chacko adapter->num_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_1G; 80d71170fbSSony Chacko adapter->max_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_1G; 81d71170fbSSony Chacko adapter->max_rxd = MAX_RCV_DESCRIPTORS_1G; 82d71170fbSSony Chacko } 83d71170fbSSony Chacko adapter->num_txd = MAX_CMD_DESCRIPTORS; 84d71170fbSSony Chacko adapter->max_rds_rings = MAX_RDS_RINGS; 85d71170fbSSony Chacko } 86d71170fbSSony Chacko 87d71170fbSSony Chacko 88d71170fbSSony Chacko /** 89d71170fbSSony Chacko * qlcnic_83xx_init_mgmt_vnic 90d71170fbSSony Chacko * 91d71170fbSSony Chacko * @adapter: adapter structure 92d71170fbSSony Chacko * Management virtual NIC sets the operational mode of other vNIC's and 93d71170fbSSony Chacko * configures embedded switch (ESWITCH). 94d71170fbSSony Chacko * Returns: Success(0) or error code. 95d71170fbSSony Chacko * 96d71170fbSSony Chacko **/ 97d71170fbSSony Chacko static int qlcnic_83xx_init_mgmt_vnic(struct qlcnic_adapter *adapter) 98d71170fbSSony Chacko { 99d71170fbSSony Chacko int err = -EIO; 100d71170fbSSony Chacko 1014d53f40fSShahed Shaikh qlcnic_83xx_get_minidump_template(adapter); 102d71170fbSSony Chacko if (!(adapter->flags & QLCNIC_ADAPTER_INITIALIZED)) { 103d71170fbSSony Chacko if (qlcnic_init_pci_info(adapter)) 104d71170fbSSony Chacko return err; 105d71170fbSSony Chacko 106d71170fbSSony Chacko if (qlcnic_83xx_set_vnic_opmode(adapter)) 107d71170fbSSony Chacko return err; 108d71170fbSSony Chacko 109d71170fbSSony Chacko if (qlcnic_set_default_offload_settings(adapter)) 110d71170fbSSony Chacko return err; 111d71170fbSSony Chacko } else { 112d71170fbSSony Chacko if (qlcnic_reset_npar_config(adapter)) 113d71170fbSSony Chacko return err; 114d71170fbSSony Chacko } 115d71170fbSSony Chacko 116d71170fbSSony Chacko if (qlcnic_83xx_get_port_info(adapter)) 117d71170fbSSony Chacko return err; 118d71170fbSSony Chacko 119d71170fbSSony Chacko qlcnic_83xx_config_vnic_buff_descriptors(adapter); 120d71170fbSSony Chacko adapter->ahw->msix_supported = !!qlcnic_use_msi_x; 121d71170fbSSony Chacko adapter->flags |= QLCNIC_ADAPTER_INITIALIZED; 122d71170fbSSony Chacko qlcnic_83xx_enable_vnic_mode(adapter, 1); 123d71170fbSSony Chacko 124d71170fbSSony Chacko dev_info(&adapter->pdev->dev, "HAL Version: %d, Management function\n", 125d71170fbSSony Chacko adapter->ahw->fw_hal_version); 126d71170fbSSony Chacko 127d71170fbSSony Chacko return 0; 128d71170fbSSony Chacko } 129d71170fbSSony Chacko 130d71170fbSSony Chacko static int qlcnic_83xx_init_privileged_vnic(struct qlcnic_adapter *adapter) 131d71170fbSSony Chacko { 132d71170fbSSony Chacko int err = -EIO; 133d71170fbSSony Chacko 1344d53f40fSShahed Shaikh qlcnic_83xx_get_minidump_template(adapter); 135d71170fbSSony Chacko if (qlcnic_83xx_get_port_info(adapter)) 136d71170fbSSony Chacko return err; 137d71170fbSSony Chacko 138d71170fbSSony Chacko qlcnic_83xx_config_vnic_buff_descriptors(adapter); 139d71170fbSSony Chacko adapter->ahw->msix_supported = !!qlcnic_use_msi_x; 140d71170fbSSony Chacko adapter->flags |= QLCNIC_ADAPTER_INITIALIZED; 141d71170fbSSony Chacko 142d71170fbSSony Chacko dev_info(&adapter->pdev->dev, 143d71170fbSSony Chacko "HAL Version: %d, Privileged function\n", 144d71170fbSSony Chacko adapter->ahw->fw_hal_version); 145d71170fbSSony Chacko return 0; 146d71170fbSSony Chacko } 147d71170fbSSony Chacko 148d71170fbSSony Chacko static int qlcnic_83xx_init_non_privileged_vnic(struct qlcnic_adapter *adapter) 149d71170fbSSony Chacko { 150d71170fbSSony Chacko int err = -EIO; 151d71170fbSSony Chacko 152d71170fbSSony Chacko qlcnic_83xx_get_fw_version(adapter); 153d71170fbSSony Chacko if (qlcnic_set_eswitch_port_config(adapter)) 154d71170fbSSony Chacko return err; 155d71170fbSSony Chacko 156d71170fbSSony Chacko if (qlcnic_83xx_get_port_info(adapter)) 157d71170fbSSony Chacko return err; 158d71170fbSSony Chacko 159d71170fbSSony Chacko qlcnic_83xx_config_vnic_buff_descriptors(adapter); 160d71170fbSSony Chacko adapter->ahw->msix_supported = !!qlcnic_use_msi_x; 161d71170fbSSony Chacko adapter->flags |= QLCNIC_ADAPTER_INITIALIZED; 162d71170fbSSony Chacko 163d71170fbSSony Chacko dev_info(&adapter->pdev->dev, "HAL Version: %d, Virtual function\n", 164d71170fbSSony Chacko adapter->ahw->fw_hal_version); 165d71170fbSSony Chacko 166d71170fbSSony Chacko return 0; 167d71170fbSSony Chacko } 168d71170fbSSony Chacko 169d71170fbSSony Chacko /** 170d71170fbSSony Chacko * qlcnic_83xx_vnic_opmode 171d71170fbSSony Chacko * 172d71170fbSSony Chacko * @adapter: adapter structure 173d71170fbSSony Chacko * Identify virtual NIC operational modes. 174d71170fbSSony Chacko * 175d71170fbSSony Chacko * Returns: Success(0) or error code. 176d71170fbSSony Chacko * 177d71170fbSSony Chacko **/ 178d71170fbSSony Chacko int qlcnic_83xx_config_vnic_opmode(struct qlcnic_adapter *adapter) 179d71170fbSSony Chacko { 180d71170fbSSony Chacko u32 op_mode, priv_level; 181d71170fbSSony Chacko struct qlcnic_hardware_context *ahw = adapter->ahw; 182d71170fbSSony Chacko struct qlcnic_nic_template *nic_ops = adapter->nic_ops; 183d71170fbSSony Chacko 184d71170fbSSony Chacko qlcnic_get_func_no(adapter); 185d71170fbSSony Chacko op_mode = QLCRDX(adapter->ahw, QLC_83XX_DRV_OP_MODE); 186d71170fbSSony Chacko 187d71170fbSSony Chacko if (op_mode == QLC_83XX_DEFAULT_OPMODE) 188d71170fbSSony Chacko priv_level = QLCNIC_MGMT_FUNC; 189d71170fbSSony Chacko else 190d71170fbSSony Chacko priv_level = QLC_83XX_GET_FUNC_PRIVILEGE(op_mode, 191d71170fbSSony Chacko ahw->pci_func); 192d71170fbSSony Chacko 193d71170fbSSony Chacko if (priv_level == QLCNIC_NON_PRIV_FUNC) { 194d71170fbSSony Chacko ahw->op_mode = QLCNIC_NON_PRIV_FUNC; 195d71170fbSSony Chacko ahw->idc.state_entry = qlcnic_83xx_idc_ready_state_entry; 196d71170fbSSony Chacko nic_ops->init_driver = qlcnic_83xx_init_non_privileged_vnic; 197d71170fbSSony Chacko } else if (priv_level == QLCNIC_PRIV_FUNC) { 198d71170fbSSony Chacko ahw->op_mode = QLCNIC_PRIV_FUNC; 199d71170fbSSony Chacko ahw->idc.state_entry = qlcnic_83xx_idc_vnic_pf_entry; 200d71170fbSSony Chacko nic_ops->init_driver = qlcnic_83xx_init_privileged_vnic; 201d71170fbSSony Chacko } else if (priv_level == 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; 205d71170fbSSony Chacko } else { 206d71170fbSSony Chacko return -EIO; 207d71170fbSSony Chacko } 208d71170fbSSony Chacko 209d71170fbSSony Chacko if (ahw->capabilities & BIT_23) 210d71170fbSSony Chacko adapter->flags |= QLCNIC_ESWITCH_ENABLED; 211d71170fbSSony Chacko else 212d71170fbSSony Chacko adapter->flags &= ~QLCNIC_ESWITCH_ENABLED; 213d71170fbSSony Chacko 214d71170fbSSony Chacko adapter->ahw->idc.vnic_state = QLCNIC_DEV_NPAR_NON_OPER; 215d71170fbSSony Chacko adapter->ahw->idc.vnic_wait_limit = QLCNIC_DEV_NPAR_OPER_TIMEO; 216d71170fbSSony Chacko 217d71170fbSSony Chacko return 0; 218d71170fbSSony Chacko } 219