0001
0002
0003
0004
0005
0006
0007 #include "qlcnic.h"
0008 #include "qlcnic_hw.h"
0009
0010 static int qlcnic_83xx_enable_vnic_mode(struct qlcnic_adapter *adapter, int lock)
0011 {
0012 if (lock) {
0013 if (qlcnic_83xx_lock_driver(adapter))
0014 return -EBUSY;
0015 }
0016 QLCWRX(adapter->ahw, QLC_83XX_VNIC_STATE, QLCNIC_DEV_NPAR_OPER);
0017 if (lock)
0018 qlcnic_83xx_unlock_driver(adapter);
0019
0020 return 0;
0021 }
0022
0023 int qlcnic_83xx_disable_vnic_mode(struct qlcnic_adapter *adapter, int lock)
0024 {
0025 struct qlcnic_hardware_context *ahw = adapter->ahw;
0026
0027 if (lock) {
0028 if (qlcnic_83xx_lock_driver(adapter))
0029 return -EBUSY;
0030 }
0031
0032 QLCWRX(adapter->ahw, QLC_83XX_VNIC_STATE, QLCNIC_DEV_NPAR_NON_OPER);
0033 ahw->idc.vnic_state = QLCNIC_DEV_NPAR_NON_OPER;
0034
0035 if (lock)
0036 qlcnic_83xx_unlock_driver(adapter);
0037
0038 return 0;
0039 }
0040
0041 int qlcnic_83xx_set_vnic_opmode(struct qlcnic_adapter *adapter)
0042 {
0043 u8 id;
0044 int ret = -EBUSY;
0045 u32 data = QLCNIC_MGMT_FUNC;
0046 struct qlcnic_hardware_context *ahw = adapter->ahw;
0047
0048 if (qlcnic_83xx_lock_driver(adapter))
0049 return ret;
0050
0051 id = ahw->pci_func;
0052 data = QLCRDX(adapter->ahw, QLC_83XX_DRV_OP_MODE);
0053 data = (data & ~QLC_83XX_SET_FUNC_OPMODE(0x3, id)) |
0054 QLC_83XX_SET_FUNC_OPMODE(QLCNIC_MGMT_FUNC, id);
0055
0056 QLCWRX(adapter->ahw, QLC_83XX_DRV_OP_MODE, data);
0057
0058 qlcnic_83xx_unlock_driver(adapter);
0059
0060 return 0;
0061 }
0062
0063 static void
0064 qlcnic_83xx_config_vnic_buff_descriptors(struct qlcnic_adapter *adapter)
0065 {
0066 struct qlcnic_hardware_context *ahw = adapter->ahw;
0067
0068 if (ahw->port_type == QLCNIC_XGBE) {
0069 adapter->num_rxd = DEFAULT_RCV_DESCRIPTORS_VF;
0070 adapter->max_rxd = MAX_RCV_DESCRIPTORS_VF;
0071 adapter->num_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_10G;
0072 adapter->max_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_10G;
0073
0074 } else if (ahw->port_type == QLCNIC_GBE) {
0075 adapter->num_rxd = DEFAULT_RCV_DESCRIPTORS_1G;
0076 adapter->num_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_1G;
0077 adapter->max_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_1G;
0078 adapter->max_rxd = MAX_RCV_DESCRIPTORS_1G;
0079 }
0080 adapter->num_txd = MAX_CMD_DESCRIPTORS;
0081 adapter->max_rds_rings = MAX_RDS_RINGS;
0082 }
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094 static int qlcnic_83xx_init_mgmt_vnic(struct qlcnic_adapter *adapter)
0095 {
0096 struct qlcnic_hardware_context *ahw = adapter->ahw;
0097 struct device *dev = &adapter->pdev->dev;
0098 struct qlcnic_npar_info *npar;
0099 int i, err = -EIO;
0100
0101 qlcnic_83xx_get_minidump_template(adapter);
0102
0103 if (!(adapter->flags & QLCNIC_ADAPTER_INITIALIZED)) {
0104 if (qlcnic_init_pci_info(adapter))
0105 return err;
0106
0107 npar = adapter->npars;
0108
0109 for (i = 0; i < ahw->total_nic_func; i++, npar++) {
0110 dev_info(dev, "id:%d active:%d type:%d port:%d min_bw:%d max_bw:%d mac_addr:%pM\n",
0111 npar->pci_func, npar->active, npar->type,
0112 npar->phy_port, npar->min_bw, npar->max_bw,
0113 npar->mac);
0114 }
0115
0116 dev_info(dev, "Max functions = %d, active functions = %d\n",
0117 ahw->max_pci_func, ahw->total_nic_func);
0118
0119 if (qlcnic_83xx_set_vnic_opmode(adapter))
0120 return err;
0121
0122 if (qlcnic_set_default_offload_settings(adapter))
0123 return err;
0124 } else {
0125 if (qlcnic_reset_npar_config(adapter))
0126 return err;
0127 }
0128
0129 if (qlcnic_83xx_get_port_info(adapter))
0130 return err;
0131
0132 qlcnic_83xx_config_vnic_buff_descriptors(adapter);
0133 ahw->msix_supported = qlcnic_use_msi_x ? 1 : 0;
0134 adapter->flags |= QLCNIC_ADAPTER_INITIALIZED;
0135 qlcnic_83xx_enable_vnic_mode(adapter, 1);
0136
0137 dev_info(dev, "HAL Version: %d, Management function\n",
0138 ahw->fw_hal_version);
0139
0140 return 0;
0141 }
0142
0143 static int qlcnic_83xx_init_privileged_vnic(struct qlcnic_adapter *adapter)
0144 {
0145 int err = -EIO;
0146
0147 qlcnic_83xx_get_minidump_template(adapter);
0148 if (qlcnic_83xx_get_port_info(adapter))
0149 return err;
0150
0151 qlcnic_83xx_config_vnic_buff_descriptors(adapter);
0152 adapter->ahw->msix_supported = !!qlcnic_use_msi_x;
0153 adapter->flags |= QLCNIC_ADAPTER_INITIALIZED;
0154
0155 dev_info(&adapter->pdev->dev,
0156 "HAL Version: %d, Privileged function\n",
0157 adapter->ahw->fw_hal_version);
0158 return 0;
0159 }
0160
0161 static int qlcnic_83xx_init_non_privileged_vnic(struct qlcnic_adapter *adapter)
0162 {
0163 int err = -EIO;
0164
0165 qlcnic_83xx_get_fw_version(adapter);
0166 if (qlcnic_set_eswitch_port_config(adapter))
0167 return err;
0168
0169 if (qlcnic_83xx_get_port_info(adapter))
0170 return err;
0171
0172 qlcnic_83xx_config_vnic_buff_descriptors(adapter);
0173 adapter->ahw->msix_supported = !!qlcnic_use_msi_x;
0174 adapter->flags |= QLCNIC_ADAPTER_INITIALIZED;
0175
0176 dev_info(&adapter->pdev->dev, "HAL Version: %d, Virtual function\n",
0177 adapter->ahw->fw_hal_version);
0178
0179 return 0;
0180 }
0181
0182
0183
0184
0185
0186
0187
0188
0189
0190
0191 int qlcnic_83xx_config_vnic_opmode(struct qlcnic_adapter *adapter)
0192 {
0193 u32 op_mode, priv_level;
0194 struct qlcnic_hardware_context *ahw = adapter->ahw;
0195 struct qlcnic_nic_template *nic_ops = adapter->nic_ops;
0196
0197 qlcnic_get_func_no(adapter);
0198 op_mode = QLCRDX(adapter->ahw, QLC_83XX_DRV_OP_MODE);
0199
0200 if (op_mode == QLC_83XX_DEFAULT_OPMODE)
0201 priv_level = QLCNIC_MGMT_FUNC;
0202 else
0203 priv_level = QLC_83XX_GET_FUNC_PRIVILEGE(op_mode,
0204 ahw->pci_func);
0205 switch (priv_level) {
0206 case QLCNIC_NON_PRIV_FUNC:
0207 ahw->op_mode = QLCNIC_NON_PRIV_FUNC;
0208 ahw->idc.state_entry = qlcnic_83xx_idc_ready_state_entry;
0209 nic_ops->init_driver = qlcnic_83xx_init_non_privileged_vnic;
0210 break;
0211 case QLCNIC_PRIV_FUNC:
0212 ahw->op_mode = QLCNIC_PRIV_FUNC;
0213 ahw->idc.state_entry = qlcnic_83xx_idc_vnic_pf_entry;
0214 nic_ops->init_driver = qlcnic_83xx_init_privileged_vnic;
0215 break;
0216 case QLCNIC_MGMT_FUNC:
0217 ahw->op_mode = QLCNIC_MGMT_FUNC;
0218 ahw->idc.state_entry = qlcnic_83xx_idc_ready_state_entry;
0219 nic_ops->init_driver = qlcnic_83xx_init_mgmt_vnic;
0220 break;
0221 default:
0222 dev_err(&adapter->pdev->dev, "Invalid Virtual NIC opmode\n");
0223 return -EIO;
0224 }
0225
0226 if (ahw->capabilities & QLC_83XX_ESWITCH_CAPABILITY) {
0227 adapter->flags |= QLCNIC_ESWITCH_ENABLED;
0228 if (adapter->drv_mac_learn)
0229 adapter->rx_mac_learn = true;
0230 } else {
0231 adapter->flags &= ~QLCNIC_ESWITCH_ENABLED;
0232 adapter->rx_mac_learn = false;
0233 }
0234
0235 ahw->idc.vnic_state = QLCNIC_DEV_NPAR_NON_OPER;
0236 ahw->idc.vnic_wait_limit = QLCNIC_DEV_NPAR_OPER_TIMEO;
0237
0238 return 0;
0239 }
0240
0241 int qlcnic_83xx_check_vnic_state(struct qlcnic_adapter *adapter)
0242 {
0243 struct qlcnic_hardware_context *ahw = adapter->ahw;
0244 struct qlc_83xx_idc *idc = &ahw->idc;
0245 u32 state;
0246
0247 state = QLCRDX(ahw, QLC_83XX_VNIC_STATE);
0248 while (state != QLCNIC_DEV_NPAR_OPER && idc->vnic_wait_limit) {
0249 idc->vnic_wait_limit--;
0250 msleep(1000);
0251 state = QLCRDX(ahw, QLC_83XX_VNIC_STATE);
0252 }
0253
0254 if (state != QLCNIC_DEV_NPAR_OPER) {
0255 dev_err(&adapter->pdev->dev,
0256 "vNIC mode not operational, state check timed out.\n");
0257 return -EIO;
0258 }
0259
0260 return 0;
0261 }
0262
0263 int qlcnic_83xx_set_port_eswitch_status(struct qlcnic_adapter *adapter,
0264 int func, int *port_id)
0265 {
0266 struct qlcnic_info nic_info;
0267 int err = 0;
0268
0269 memset(&nic_info, 0, sizeof(struct qlcnic_info));
0270
0271 err = qlcnic_get_nic_info(adapter, &nic_info, func);
0272 if (err)
0273 return err;
0274
0275 if (nic_info.capabilities & QLC_83XX_ESWITCH_CAPABILITY)
0276 *port_id = nic_info.phys_port;
0277 else
0278 err = -EIO;
0279
0280 if (!err)
0281 adapter->eswitch[*port_id].flags |= QLCNIC_SWITCH_ENABLE;
0282
0283 return err;
0284 }