1 /* 2 * QLogic qlcnic NIC Driver 3 * Copyright (c) 2009-2013 QLogic Corporation 4 * 5 * See LICENSE.qlcnic for copyright and licensing details. 6 */ 7 8 #include <linux/if_vlan.h> 9 #include <linux/ipv6.h> 10 #include <linux/ethtool.h> 11 #include <linux/interrupt.h> 12 #include <linux/aer.h> 13 14 #include "qlcnic.h" 15 #include "qlcnic_sriov.h" 16 17 static void __qlcnic_83xx_process_aen(struct qlcnic_adapter *); 18 static int qlcnic_83xx_clear_lb_mode(struct qlcnic_adapter *, u8); 19 static void qlcnic_83xx_configure_mac(struct qlcnic_adapter *, u8 *, u8, 20 struct qlcnic_cmd_args *); 21 static int qlcnic_83xx_get_port_config(struct qlcnic_adapter *); 22 static irqreturn_t qlcnic_83xx_handle_aen(int, void *); 23 static pci_ers_result_t qlcnic_83xx_io_error_detected(struct pci_dev *, 24 pci_channel_state_t); 25 static int qlcnic_83xx_set_port_config(struct qlcnic_adapter *); 26 static pci_ers_result_t qlcnic_83xx_io_slot_reset(struct pci_dev *); 27 static void qlcnic_83xx_io_resume(struct pci_dev *); 28 static int qlcnic_83xx_set_lb_mode(struct qlcnic_adapter *, u8); 29 static void qlcnic_83xx_set_mac_filter_count(struct qlcnic_adapter *); 30 static int qlcnic_83xx_resume(struct qlcnic_adapter *); 31 static int qlcnic_83xx_shutdown(struct pci_dev *); 32 static void qlcnic_83xx_get_beacon_state(struct qlcnic_adapter *); 33 34 #define RSS_HASHTYPE_IP_TCP 0x3 35 #define QLC_83XX_FW_MBX_CMD 0 36 #define QLC_SKIP_INACTIVE_PCI_REGS 7 37 #define QLC_MAX_LEGACY_FUNC_SUPP 8 38 39 /* 83xx Module type */ 40 #define QLC_83XX_MODULE_FIBRE_10GBASE_LRM 0x1 /* 10GBase-LRM */ 41 #define QLC_83XX_MODULE_FIBRE_10GBASE_LR 0x2 /* 10GBase-LR */ 42 #define QLC_83XX_MODULE_FIBRE_10GBASE_SR 0x3 /* 10GBase-SR */ 43 #define QLC_83XX_MODULE_DA_10GE_PASSIVE_CP 0x4 /* 10GE passive 44 * copper(compliant) 45 */ 46 #define QLC_83XX_MODULE_DA_10GE_ACTIVE_CP 0x5 /* 10GE active limiting 47 * copper(compliant) 48 */ 49 #define QLC_83XX_MODULE_DA_10GE_LEGACY_CP 0x6 /* 10GE passive copper 50 * (legacy, best effort) 51 */ 52 #define QLC_83XX_MODULE_FIBRE_1000BASE_SX 0x7 /* 1000Base-SX */ 53 #define QLC_83XX_MODULE_FIBRE_1000BASE_LX 0x8 /* 1000Base-LX */ 54 #define QLC_83XX_MODULE_FIBRE_1000BASE_CX 0x9 /* 1000Base-CX */ 55 #define QLC_83XX_MODULE_TP_1000BASE_T 0xa /* 1000Base-T*/ 56 #define QLC_83XX_MODULE_DA_1GE_PASSIVE_CP 0xb /* 1GE passive copper 57 * (legacy, best effort) 58 */ 59 #define QLC_83XX_MODULE_UNKNOWN 0xf /* Unknown module type */ 60 61 /* Port types */ 62 #define QLC_83XX_10_CAPABLE BIT_8 63 #define QLC_83XX_100_CAPABLE BIT_9 64 #define QLC_83XX_1G_CAPABLE BIT_10 65 #define QLC_83XX_10G_CAPABLE BIT_11 66 #define QLC_83XX_AUTONEG_ENABLE BIT_15 67 68 static const struct qlcnic_mailbox_metadata qlcnic_83xx_mbx_tbl[] = { 69 {QLCNIC_CMD_CONFIGURE_IP_ADDR, 6, 1}, 70 {QLCNIC_CMD_CONFIG_INTRPT, 18, 34}, 71 {QLCNIC_CMD_CREATE_RX_CTX, 136, 27}, 72 {QLCNIC_CMD_DESTROY_RX_CTX, 2, 1}, 73 {QLCNIC_CMD_CREATE_TX_CTX, 54, 18}, 74 {QLCNIC_CMD_DESTROY_TX_CTX, 2, 1}, 75 {QLCNIC_CMD_CONFIGURE_MAC_LEARNING, 2, 1}, 76 {QLCNIC_CMD_INTRPT_TEST, 22, 12}, 77 {QLCNIC_CMD_SET_MTU, 3, 1}, 78 {QLCNIC_CMD_READ_PHY, 4, 2}, 79 {QLCNIC_CMD_WRITE_PHY, 5, 1}, 80 {QLCNIC_CMD_READ_HW_REG, 4, 1}, 81 {QLCNIC_CMD_GET_FLOW_CTL, 4, 2}, 82 {QLCNIC_CMD_SET_FLOW_CTL, 4, 1}, 83 {QLCNIC_CMD_READ_MAX_MTU, 4, 2}, 84 {QLCNIC_CMD_READ_MAX_LRO, 4, 2}, 85 {QLCNIC_CMD_MAC_ADDRESS, 4, 3}, 86 {QLCNIC_CMD_GET_PCI_INFO, 1, 129}, 87 {QLCNIC_CMD_GET_NIC_INFO, 2, 19}, 88 {QLCNIC_CMD_SET_NIC_INFO, 32, 1}, 89 {QLCNIC_CMD_GET_ESWITCH_CAPABILITY, 4, 3}, 90 {QLCNIC_CMD_TOGGLE_ESWITCH, 4, 1}, 91 {QLCNIC_CMD_GET_ESWITCH_STATUS, 4, 3}, 92 {QLCNIC_CMD_SET_PORTMIRRORING, 4, 1}, 93 {QLCNIC_CMD_CONFIGURE_ESWITCH, 4, 1}, 94 {QLCNIC_CMD_GET_ESWITCH_PORT_CONFIG, 4, 3}, 95 {QLCNIC_CMD_GET_ESWITCH_STATS, 5, 1}, 96 {QLCNIC_CMD_CONFIG_PORT, 4, 1}, 97 {QLCNIC_CMD_TEMP_SIZE, 1, 4}, 98 {QLCNIC_CMD_GET_TEMP_HDR, 5, 5}, 99 {QLCNIC_CMD_GET_LINK_EVENT, 2, 1}, 100 {QLCNIC_CMD_CONFIG_MAC_VLAN, 4, 3}, 101 {QLCNIC_CMD_CONFIG_INTR_COAL, 6, 1}, 102 {QLCNIC_CMD_CONFIGURE_RSS, 14, 1}, 103 {QLCNIC_CMD_CONFIGURE_LED, 2, 1}, 104 {QLCNIC_CMD_CONFIGURE_MAC_RX_MODE, 2, 1}, 105 {QLCNIC_CMD_CONFIGURE_HW_LRO, 2, 1}, 106 {QLCNIC_CMD_GET_STATISTICS, 2, 80}, 107 {QLCNIC_CMD_SET_PORT_CONFIG, 2, 1}, 108 {QLCNIC_CMD_GET_PORT_CONFIG, 2, 2}, 109 {QLCNIC_CMD_GET_LINK_STATUS, 2, 4}, 110 {QLCNIC_CMD_IDC_ACK, 5, 1}, 111 {QLCNIC_CMD_INIT_NIC_FUNC, 3, 1}, 112 {QLCNIC_CMD_STOP_NIC_FUNC, 2, 1}, 113 {QLCNIC_CMD_SET_LED_CONFIG, 5, 1}, 114 {QLCNIC_CMD_GET_LED_CONFIG, 1, 5}, 115 {QLCNIC_CMD_83XX_SET_DRV_VER, 4, 1}, 116 {QLCNIC_CMD_ADD_RCV_RINGS, 130, 26}, 117 {QLCNIC_CMD_CONFIG_VPORT, 4, 4}, 118 {QLCNIC_CMD_BC_EVENT_SETUP, 2, 1}, 119 {QLCNIC_CMD_DCB_QUERY_CAP, 1, 2}, 120 {QLCNIC_CMD_DCB_QUERY_PARAM, 1, 50}, 121 {QLCNIC_CMD_SET_INGRESS_ENCAP, 2, 1}, 122 {QLCNIC_CMD_83XX_EXTEND_ISCSI_DUMP_CAP, 4, 1}, 123 }; 124 125 const u32 qlcnic_83xx_ext_reg_tbl[] = { 126 0x38CC, /* Global Reset */ 127 0x38F0, /* Wildcard */ 128 0x38FC, /* Informant */ 129 0x3038, /* Host MBX ctrl */ 130 0x303C, /* FW MBX ctrl */ 131 0x355C, /* BOOT LOADER ADDRESS REG */ 132 0x3560, /* BOOT LOADER SIZE REG */ 133 0x3564, /* FW IMAGE ADDR REG */ 134 0x1000, /* MBX intr enable */ 135 0x1200, /* Default Intr mask */ 136 0x1204, /* Default Interrupt ID */ 137 0x3780, /* QLC_83XX_IDC_MAJ_VERSION */ 138 0x3784, /* QLC_83XX_IDC_DEV_STATE */ 139 0x3788, /* QLC_83XX_IDC_DRV_PRESENCE */ 140 0x378C, /* QLC_83XX_IDC_DRV_ACK */ 141 0x3790, /* QLC_83XX_IDC_CTRL */ 142 0x3794, /* QLC_83XX_IDC_DRV_AUDIT */ 143 0x3798, /* QLC_83XX_IDC_MIN_VERSION */ 144 0x379C, /* QLC_83XX_RECOVER_DRV_LOCK */ 145 0x37A0, /* QLC_83XX_IDC_PF_0 */ 146 0x37A4, /* QLC_83XX_IDC_PF_1 */ 147 0x37A8, /* QLC_83XX_IDC_PF_2 */ 148 0x37AC, /* QLC_83XX_IDC_PF_3 */ 149 0x37B0, /* QLC_83XX_IDC_PF_4 */ 150 0x37B4, /* QLC_83XX_IDC_PF_5 */ 151 0x37B8, /* QLC_83XX_IDC_PF_6 */ 152 0x37BC, /* QLC_83XX_IDC_PF_7 */ 153 0x37C0, /* QLC_83XX_IDC_PF_8 */ 154 0x37C4, /* QLC_83XX_IDC_PF_9 */ 155 0x37C8, /* QLC_83XX_IDC_PF_10 */ 156 0x37CC, /* QLC_83XX_IDC_PF_11 */ 157 0x37D0, /* QLC_83XX_IDC_PF_12 */ 158 0x37D4, /* QLC_83XX_IDC_PF_13 */ 159 0x37D8, /* QLC_83XX_IDC_PF_14 */ 160 0x37DC, /* QLC_83XX_IDC_PF_15 */ 161 0x37E0, /* QLC_83XX_IDC_DEV_PARTITION_INFO_1 */ 162 0x37E4, /* QLC_83XX_IDC_DEV_PARTITION_INFO_2 */ 163 0x37F0, /* QLC_83XX_DRV_OP_MODE */ 164 0x37F4, /* QLC_83XX_VNIC_STATE */ 165 0x3868, /* QLC_83XX_DRV_LOCK */ 166 0x386C, /* QLC_83XX_DRV_UNLOCK */ 167 0x3504, /* QLC_83XX_DRV_LOCK_ID */ 168 0x34A4, /* QLC_83XX_ASIC_TEMP */ 169 }; 170 171 const u32 qlcnic_83xx_reg_tbl[] = { 172 0x34A8, /* PEG_HALT_STAT1 */ 173 0x34AC, /* PEG_HALT_STAT2 */ 174 0x34B0, /* FW_HEARTBEAT */ 175 0x3500, /* FLASH LOCK_ID */ 176 0x3528, /* FW_CAPABILITIES */ 177 0x3538, /* Driver active, DRV_REG0 */ 178 0x3540, /* Device state, DRV_REG1 */ 179 0x3544, /* Driver state, DRV_REG2 */ 180 0x3548, /* Driver scratch, DRV_REG3 */ 181 0x354C, /* Device partiton info, DRV_REG4 */ 182 0x3524, /* Driver IDC ver, DRV_REG5 */ 183 0x3550, /* FW_VER_MAJOR */ 184 0x3554, /* FW_VER_MINOR */ 185 0x3558, /* FW_VER_SUB */ 186 0x359C, /* NPAR STATE */ 187 0x35FC, /* FW_IMG_VALID */ 188 0x3650, /* CMD_PEG_STATE */ 189 0x373C, /* RCV_PEG_STATE */ 190 0x37B4, /* ASIC TEMP */ 191 0x356C, /* FW API */ 192 0x3570, /* DRV OP MODE */ 193 0x3850, /* FLASH LOCK */ 194 0x3854, /* FLASH UNLOCK */ 195 }; 196 197 static struct qlcnic_hardware_ops qlcnic_83xx_hw_ops = { 198 .read_crb = qlcnic_83xx_read_crb, 199 .write_crb = qlcnic_83xx_write_crb, 200 .read_reg = qlcnic_83xx_rd_reg_indirect, 201 .write_reg = qlcnic_83xx_wrt_reg_indirect, 202 .get_mac_address = qlcnic_83xx_get_mac_address, 203 .setup_intr = qlcnic_83xx_setup_intr, 204 .alloc_mbx_args = qlcnic_83xx_alloc_mbx_args, 205 .mbx_cmd = qlcnic_83xx_issue_cmd, 206 .get_func_no = qlcnic_83xx_get_func_no, 207 .api_lock = qlcnic_83xx_cam_lock, 208 .api_unlock = qlcnic_83xx_cam_unlock, 209 .add_sysfs = qlcnic_83xx_add_sysfs, 210 .remove_sysfs = qlcnic_83xx_remove_sysfs, 211 .process_lb_rcv_ring_diag = qlcnic_83xx_process_rcv_ring_diag, 212 .create_rx_ctx = qlcnic_83xx_create_rx_ctx, 213 .create_tx_ctx = qlcnic_83xx_create_tx_ctx, 214 .del_rx_ctx = qlcnic_83xx_del_rx_ctx, 215 .del_tx_ctx = qlcnic_83xx_del_tx_ctx, 216 .setup_link_event = qlcnic_83xx_setup_link_event, 217 .get_nic_info = qlcnic_83xx_get_nic_info, 218 .get_pci_info = qlcnic_83xx_get_pci_info, 219 .set_nic_info = qlcnic_83xx_set_nic_info, 220 .change_macvlan = qlcnic_83xx_sre_macaddr_change, 221 .napi_enable = qlcnic_83xx_napi_enable, 222 .napi_disable = qlcnic_83xx_napi_disable, 223 .config_intr_coal = qlcnic_83xx_config_intr_coal, 224 .config_rss = qlcnic_83xx_config_rss, 225 .config_hw_lro = qlcnic_83xx_config_hw_lro, 226 .config_promisc_mode = qlcnic_83xx_nic_set_promisc, 227 .change_l2_filter = qlcnic_83xx_change_l2_filter, 228 .get_board_info = qlcnic_83xx_get_port_info, 229 .set_mac_filter_count = qlcnic_83xx_set_mac_filter_count, 230 .free_mac_list = qlcnic_82xx_free_mac_list, 231 .io_error_detected = qlcnic_83xx_io_error_detected, 232 .io_slot_reset = qlcnic_83xx_io_slot_reset, 233 .io_resume = qlcnic_83xx_io_resume, 234 .get_beacon_state = qlcnic_83xx_get_beacon_state, 235 .enable_sds_intr = qlcnic_83xx_enable_sds_intr, 236 .disable_sds_intr = qlcnic_83xx_disable_sds_intr, 237 .enable_tx_intr = qlcnic_83xx_enable_tx_intr, 238 .disable_tx_intr = qlcnic_83xx_disable_tx_intr, 239 .get_saved_state = qlcnic_83xx_get_saved_state, 240 .set_saved_state = qlcnic_83xx_set_saved_state, 241 .cache_tmpl_hdr_values = qlcnic_83xx_cache_tmpl_hdr_values, 242 .get_cap_size = qlcnic_83xx_get_cap_size, 243 .set_sys_info = qlcnic_83xx_set_sys_info, 244 .store_cap_mask = qlcnic_83xx_store_cap_mask, 245 }; 246 247 static struct qlcnic_nic_template qlcnic_83xx_ops = { 248 .config_bridged_mode = qlcnic_config_bridged_mode, 249 .config_led = qlcnic_config_led, 250 .request_reset = qlcnic_83xx_idc_request_reset, 251 .cancel_idc_work = qlcnic_83xx_idc_exit, 252 .napi_add = qlcnic_83xx_napi_add, 253 .napi_del = qlcnic_83xx_napi_del, 254 .config_ipaddr = qlcnic_83xx_config_ipaddr, 255 .clear_legacy_intr = qlcnic_83xx_clear_legacy_intr, 256 .shutdown = qlcnic_83xx_shutdown, 257 .resume = qlcnic_83xx_resume, 258 }; 259 260 void qlcnic_83xx_register_map(struct qlcnic_hardware_context *ahw) 261 { 262 ahw->hw_ops = &qlcnic_83xx_hw_ops; 263 ahw->reg_tbl = (u32 *)qlcnic_83xx_reg_tbl; 264 ahw->ext_reg_tbl = (u32 *)qlcnic_83xx_ext_reg_tbl; 265 } 266 267 int qlcnic_83xx_get_fw_version(struct qlcnic_adapter *adapter) 268 { 269 u32 fw_major, fw_minor, fw_build; 270 struct pci_dev *pdev = adapter->pdev; 271 272 fw_major = QLC_SHARED_REG_RD32(adapter, QLCNIC_FW_VERSION_MAJOR); 273 fw_minor = QLC_SHARED_REG_RD32(adapter, QLCNIC_FW_VERSION_MINOR); 274 fw_build = QLC_SHARED_REG_RD32(adapter, QLCNIC_FW_VERSION_SUB); 275 adapter->fw_version = QLCNIC_VERSION_CODE(fw_major, fw_minor, fw_build); 276 277 dev_info(&pdev->dev, "Driver v%s, firmware version %d.%d.%d\n", 278 QLCNIC_LINUX_VERSIONID, fw_major, fw_minor, fw_build); 279 280 return adapter->fw_version; 281 } 282 283 static int __qlcnic_set_win_base(struct qlcnic_adapter *adapter, u32 addr) 284 { 285 void __iomem *base; 286 u32 val; 287 288 base = adapter->ahw->pci_base0 + 289 QLC_83XX_CRB_WIN_FUNC(adapter->ahw->pci_func); 290 writel(addr, base); 291 val = readl(base); 292 if (val != addr) 293 return -EIO; 294 295 return 0; 296 } 297 298 int qlcnic_83xx_rd_reg_indirect(struct qlcnic_adapter *adapter, ulong addr, 299 int *err) 300 { 301 struct qlcnic_hardware_context *ahw = adapter->ahw; 302 303 *err = __qlcnic_set_win_base(adapter, (u32) addr); 304 if (!*err) { 305 return QLCRDX(ahw, QLCNIC_WILDCARD); 306 } else { 307 dev_err(&adapter->pdev->dev, 308 "%s failed, addr = 0x%lx\n", __func__, addr); 309 return -EIO; 310 } 311 } 312 313 int qlcnic_83xx_wrt_reg_indirect(struct qlcnic_adapter *adapter, ulong addr, 314 u32 data) 315 { 316 int err; 317 struct qlcnic_hardware_context *ahw = adapter->ahw; 318 319 err = __qlcnic_set_win_base(adapter, (u32) addr); 320 if (!err) { 321 QLCWRX(ahw, QLCNIC_WILDCARD, data); 322 return 0; 323 } else { 324 dev_err(&adapter->pdev->dev, 325 "%s failed, addr = 0x%x data = 0x%x\n", 326 __func__, (int)addr, data); 327 return err; 328 } 329 } 330 331 static void qlcnic_83xx_enable_legacy(struct qlcnic_adapter *adapter) 332 { 333 struct qlcnic_hardware_context *ahw = adapter->ahw; 334 335 /* MSI-X enablement failed, use legacy interrupt */ 336 adapter->tgt_status_reg = ahw->pci_base0 + QLC_83XX_INTX_PTR; 337 adapter->tgt_mask_reg = ahw->pci_base0 + QLC_83XX_INTX_MASK; 338 adapter->isr_int_vec = ahw->pci_base0 + QLC_83XX_INTX_TRGR; 339 adapter->msix_entries[0].vector = adapter->pdev->irq; 340 dev_info(&adapter->pdev->dev, "using legacy interrupt\n"); 341 } 342 343 static int qlcnic_83xx_calculate_msix_vector(struct qlcnic_adapter *adapter) 344 { 345 int num_msix; 346 347 num_msix = adapter->drv_sds_rings; 348 349 /* account for AEN interrupt MSI-X based interrupts */ 350 num_msix += 1; 351 352 if (!(adapter->flags & QLCNIC_TX_INTR_SHARED)) 353 num_msix += adapter->drv_tx_rings; 354 355 return num_msix; 356 } 357 358 int qlcnic_83xx_setup_intr(struct qlcnic_adapter *adapter) 359 { 360 struct qlcnic_hardware_context *ahw = adapter->ahw; 361 int err, i, num_msix; 362 363 if (adapter->flags & QLCNIC_TSS_RSS) { 364 err = qlcnic_setup_tss_rss_intr(adapter); 365 if (err < 0) 366 return err; 367 num_msix = ahw->num_msix; 368 } else { 369 num_msix = qlcnic_83xx_calculate_msix_vector(adapter); 370 371 err = qlcnic_enable_msix(adapter, num_msix); 372 if (err == -ENOMEM) 373 return err; 374 375 if (adapter->flags & QLCNIC_MSIX_ENABLED) { 376 num_msix = ahw->num_msix; 377 } else { 378 if (qlcnic_sriov_vf_check(adapter)) 379 return -EINVAL; 380 num_msix = 1; 381 adapter->drv_sds_rings = QLCNIC_SINGLE_RING; 382 adapter->drv_tx_rings = QLCNIC_SINGLE_RING; 383 } 384 } 385 386 /* setup interrupt mapping table for fw */ 387 ahw->intr_tbl = vzalloc(num_msix * 388 sizeof(struct qlcnic_intrpt_config)); 389 if (!ahw->intr_tbl) 390 return -ENOMEM; 391 392 if (!(adapter->flags & QLCNIC_MSIX_ENABLED)) { 393 if (adapter->ahw->pci_func >= QLC_MAX_LEGACY_FUNC_SUPP) { 394 dev_err(&adapter->pdev->dev, "PCI function number 8 and higher are not supported with legacy interrupt, func 0x%x\n", 395 ahw->pci_func); 396 return -EOPNOTSUPP; 397 } 398 399 qlcnic_83xx_enable_legacy(adapter); 400 } 401 402 for (i = 0; i < num_msix; i++) { 403 if (adapter->flags & QLCNIC_MSIX_ENABLED) 404 ahw->intr_tbl[i].type = QLCNIC_INTRPT_MSIX; 405 else 406 ahw->intr_tbl[i].type = QLCNIC_INTRPT_INTX; 407 ahw->intr_tbl[i].id = i; 408 ahw->intr_tbl[i].src = 0; 409 } 410 411 return 0; 412 } 413 414 static inline void qlcnic_83xx_clear_legacy_intr_mask(struct qlcnic_adapter *adapter) 415 { 416 writel(0, adapter->tgt_mask_reg); 417 } 418 419 static inline void qlcnic_83xx_set_legacy_intr_mask(struct qlcnic_adapter *adapter) 420 { 421 if (adapter->tgt_mask_reg) 422 writel(1, adapter->tgt_mask_reg); 423 } 424 425 static inline void qlcnic_83xx_enable_legacy_msix_mbx_intr(struct qlcnic_adapter 426 *adapter) 427 { 428 u32 mask; 429 430 /* Mailbox in MSI-x mode and Legacy Interrupt share the same 431 * source register. We could be here before contexts are created 432 * and sds_ring->crb_intr_mask has not been initialized, calculate 433 * BAR offset for Interrupt Source Register 434 */ 435 mask = QLCRDX(adapter->ahw, QLCNIC_DEF_INT_MASK); 436 writel(0, adapter->ahw->pci_base0 + mask); 437 } 438 439 void qlcnic_83xx_disable_mbx_intr(struct qlcnic_adapter *adapter) 440 { 441 u32 mask; 442 443 mask = QLCRDX(adapter->ahw, QLCNIC_DEF_INT_MASK); 444 writel(1, adapter->ahw->pci_base0 + mask); 445 QLCWRX(adapter->ahw, QLCNIC_MBX_INTR_ENBL, 0); 446 } 447 448 static inline void qlcnic_83xx_get_mbx_data(struct qlcnic_adapter *adapter, 449 struct qlcnic_cmd_args *cmd) 450 { 451 int i; 452 453 if (cmd->op_type == QLC_83XX_MBX_POST_BC_OP) 454 return; 455 456 for (i = 0; i < cmd->rsp.num; i++) 457 cmd->rsp.arg[i] = readl(QLCNIC_MBX_FW(adapter->ahw, i)); 458 } 459 460 irqreturn_t qlcnic_83xx_clear_legacy_intr(struct qlcnic_adapter *adapter) 461 { 462 u32 intr_val; 463 struct qlcnic_hardware_context *ahw = adapter->ahw; 464 int retries = 0; 465 466 intr_val = readl(adapter->tgt_status_reg); 467 468 if (!QLC_83XX_VALID_INTX_BIT31(intr_val)) 469 return IRQ_NONE; 470 471 if (QLC_83XX_INTX_FUNC(intr_val) != adapter->ahw->pci_func) { 472 adapter->stats.spurious_intr++; 473 return IRQ_NONE; 474 } 475 /* The barrier is required to ensure writes to the registers */ 476 wmb(); 477 478 /* clear the interrupt trigger control register */ 479 writel(0, adapter->isr_int_vec); 480 intr_val = readl(adapter->isr_int_vec); 481 do { 482 intr_val = readl(adapter->tgt_status_reg); 483 if (QLC_83XX_INTX_FUNC(intr_val) != ahw->pci_func) 484 break; 485 retries++; 486 } while (QLC_83XX_VALID_INTX_BIT30(intr_val) && 487 (retries < QLC_83XX_LEGACY_INTX_MAX_RETRY)); 488 489 return IRQ_HANDLED; 490 } 491 492 static inline void qlcnic_83xx_notify_mbx_response(struct qlcnic_mailbox *mbx) 493 { 494 mbx->rsp_status = QLC_83XX_MBX_RESPONSE_ARRIVED; 495 complete(&mbx->completion); 496 } 497 498 static void qlcnic_83xx_poll_process_aen(struct qlcnic_adapter *adapter) 499 { 500 u32 resp, event, rsp_status = QLC_83XX_MBX_RESPONSE_ARRIVED; 501 struct qlcnic_mailbox *mbx = adapter->ahw->mailbox; 502 unsigned long flags; 503 504 spin_lock_irqsave(&mbx->aen_lock, flags); 505 resp = QLCRDX(adapter->ahw, QLCNIC_FW_MBX_CTRL); 506 if (!(resp & QLCNIC_SET_OWNER)) 507 goto out; 508 509 event = readl(QLCNIC_MBX_FW(adapter->ahw, 0)); 510 if (event & QLCNIC_MBX_ASYNC_EVENT) { 511 __qlcnic_83xx_process_aen(adapter); 512 } else { 513 if (mbx->rsp_status != rsp_status) 514 qlcnic_83xx_notify_mbx_response(mbx); 515 } 516 out: 517 qlcnic_83xx_enable_legacy_msix_mbx_intr(adapter); 518 spin_unlock_irqrestore(&mbx->aen_lock, flags); 519 } 520 521 irqreturn_t qlcnic_83xx_intr(int irq, void *data) 522 { 523 struct qlcnic_adapter *adapter = data; 524 struct qlcnic_host_sds_ring *sds_ring; 525 struct qlcnic_hardware_context *ahw = adapter->ahw; 526 527 if (qlcnic_83xx_clear_legacy_intr(adapter) == IRQ_NONE) 528 return IRQ_NONE; 529 530 qlcnic_83xx_poll_process_aen(adapter); 531 532 if (ahw->diag_test) { 533 if (ahw->diag_test == QLCNIC_INTERRUPT_TEST) 534 ahw->diag_cnt++; 535 qlcnic_83xx_enable_legacy_msix_mbx_intr(adapter); 536 return IRQ_HANDLED; 537 } 538 539 if (!test_bit(__QLCNIC_DEV_UP, &adapter->state)) { 540 qlcnic_83xx_enable_legacy_msix_mbx_intr(adapter); 541 } else { 542 sds_ring = &adapter->recv_ctx->sds_rings[0]; 543 napi_schedule(&sds_ring->napi); 544 } 545 546 return IRQ_HANDLED; 547 } 548 549 irqreturn_t qlcnic_83xx_tmp_intr(int irq, void *data) 550 { 551 struct qlcnic_host_sds_ring *sds_ring = data; 552 struct qlcnic_adapter *adapter = sds_ring->adapter; 553 554 if (adapter->flags & QLCNIC_MSIX_ENABLED) 555 goto done; 556 557 if (adapter->nic_ops->clear_legacy_intr(adapter) == IRQ_NONE) 558 return IRQ_NONE; 559 560 done: 561 adapter->ahw->diag_cnt++; 562 qlcnic_enable_sds_intr(adapter, sds_ring); 563 564 return IRQ_HANDLED; 565 } 566 567 void qlcnic_83xx_free_mbx_intr(struct qlcnic_adapter *adapter) 568 { 569 u32 num_msix; 570 571 if (!(adapter->flags & QLCNIC_MSIX_ENABLED)) 572 qlcnic_83xx_set_legacy_intr_mask(adapter); 573 574 qlcnic_83xx_disable_mbx_intr(adapter); 575 576 if (adapter->flags & QLCNIC_MSIX_ENABLED) 577 num_msix = adapter->ahw->num_msix - 1; 578 else 579 num_msix = 0; 580 581 msleep(20); 582 583 if (adapter->msix_entries) { 584 synchronize_irq(adapter->msix_entries[num_msix].vector); 585 free_irq(adapter->msix_entries[num_msix].vector, adapter); 586 } 587 } 588 589 int qlcnic_83xx_setup_mbx_intr(struct qlcnic_adapter *adapter) 590 { 591 irq_handler_t handler; 592 u32 val; 593 int err = 0; 594 unsigned long flags = 0; 595 596 if (!(adapter->flags & QLCNIC_MSI_ENABLED) && 597 !(adapter->flags & QLCNIC_MSIX_ENABLED)) 598 flags |= IRQF_SHARED; 599 600 if (adapter->flags & QLCNIC_MSIX_ENABLED) { 601 handler = qlcnic_83xx_handle_aen; 602 val = adapter->msix_entries[adapter->ahw->num_msix - 1].vector; 603 err = request_irq(val, handler, flags, "qlcnic-MB", adapter); 604 if (err) { 605 dev_err(&adapter->pdev->dev, 606 "failed to register MBX interrupt\n"); 607 return err; 608 } 609 } else { 610 handler = qlcnic_83xx_intr; 611 val = adapter->msix_entries[0].vector; 612 err = request_irq(val, handler, flags, "qlcnic", adapter); 613 if (err) { 614 dev_err(&adapter->pdev->dev, 615 "failed to register INTx interrupt\n"); 616 return err; 617 } 618 qlcnic_83xx_clear_legacy_intr_mask(adapter); 619 } 620 621 /* Enable mailbox interrupt */ 622 qlcnic_83xx_enable_mbx_interrupt(adapter); 623 624 return err; 625 } 626 627 void qlcnic_83xx_get_func_no(struct qlcnic_adapter *adapter) 628 { 629 u32 val = QLCRDX(adapter->ahw, QLCNIC_INFORMANT); 630 adapter->ahw->pci_func = (val >> 24) & 0xff; 631 } 632 633 int qlcnic_83xx_cam_lock(struct qlcnic_adapter *adapter) 634 { 635 void __iomem *addr; 636 u32 val, limit = 0; 637 638 struct qlcnic_hardware_context *ahw = adapter->ahw; 639 640 addr = ahw->pci_base0 + QLC_83XX_SEM_LOCK_FUNC(ahw->pci_func); 641 do { 642 val = readl(addr); 643 if (val) { 644 /* write the function number to register */ 645 QLC_SHARED_REG_WR32(adapter, QLCNIC_FLASH_LOCK_OWNER, 646 ahw->pci_func); 647 return 0; 648 } 649 usleep_range(1000, 2000); 650 } while (++limit <= QLCNIC_PCIE_SEM_TIMEOUT); 651 652 return -EIO; 653 } 654 655 void qlcnic_83xx_cam_unlock(struct qlcnic_adapter *adapter) 656 { 657 void __iomem *addr; 658 u32 val; 659 struct qlcnic_hardware_context *ahw = adapter->ahw; 660 661 addr = ahw->pci_base0 + QLC_83XX_SEM_UNLOCK_FUNC(ahw->pci_func); 662 val = readl(addr); 663 } 664 665 void qlcnic_83xx_read_crb(struct qlcnic_adapter *adapter, char *buf, 666 loff_t offset, size_t size) 667 { 668 int ret = 0; 669 u32 data; 670 671 if (qlcnic_api_lock(adapter)) { 672 dev_err(&adapter->pdev->dev, 673 "%s: failed to acquire lock. addr offset 0x%x\n", 674 __func__, (u32)offset); 675 return; 676 } 677 678 data = QLCRD32(adapter, (u32) offset, &ret); 679 qlcnic_api_unlock(adapter); 680 681 if (ret == -EIO) { 682 dev_err(&adapter->pdev->dev, 683 "%s: failed. addr offset 0x%x\n", 684 __func__, (u32)offset); 685 return; 686 } 687 memcpy(buf, &data, size); 688 } 689 690 void qlcnic_83xx_write_crb(struct qlcnic_adapter *adapter, char *buf, 691 loff_t offset, size_t size) 692 { 693 u32 data; 694 695 memcpy(&data, buf, size); 696 qlcnic_83xx_wrt_reg_indirect(adapter, (u32) offset, data); 697 } 698 699 int qlcnic_83xx_get_port_info(struct qlcnic_adapter *adapter) 700 { 701 struct qlcnic_hardware_context *ahw = adapter->ahw; 702 int status; 703 704 status = qlcnic_83xx_get_port_config(adapter); 705 if (status) { 706 dev_err(&adapter->pdev->dev, 707 "Get Port Info failed\n"); 708 } else { 709 710 if (ahw->port_config & QLC_83XX_10G_CAPABLE) { 711 ahw->port_type = QLCNIC_XGBE; 712 } else if (ahw->port_config & QLC_83XX_10_CAPABLE || 713 ahw->port_config & QLC_83XX_100_CAPABLE || 714 ahw->port_config & QLC_83XX_1G_CAPABLE) { 715 ahw->port_type = QLCNIC_GBE; 716 } else { 717 ahw->port_type = QLCNIC_XGBE; 718 } 719 720 if (QLC_83XX_AUTONEG(ahw->port_config)) 721 ahw->link_autoneg = AUTONEG_ENABLE; 722 723 } 724 return status; 725 } 726 727 static void qlcnic_83xx_set_mac_filter_count(struct qlcnic_adapter *adapter) 728 { 729 struct qlcnic_hardware_context *ahw = adapter->ahw; 730 u16 act_pci_fn = ahw->total_nic_func; 731 u16 count; 732 733 ahw->max_mc_count = QLC_83XX_MAX_MC_COUNT; 734 if (act_pci_fn <= 2) 735 count = (QLC_83XX_MAX_UC_COUNT - QLC_83XX_MAX_MC_COUNT) / 736 act_pci_fn; 737 else 738 count = (QLC_83XX_LB_MAX_FILTERS - QLC_83XX_MAX_MC_COUNT) / 739 act_pci_fn; 740 ahw->max_uc_count = count; 741 } 742 743 void qlcnic_83xx_enable_mbx_interrupt(struct qlcnic_adapter *adapter) 744 { 745 u32 val; 746 747 if (adapter->flags & QLCNIC_MSIX_ENABLED) 748 val = BIT_2 | ((adapter->ahw->num_msix - 1) << 8); 749 else 750 val = BIT_2; 751 752 QLCWRX(adapter->ahw, QLCNIC_MBX_INTR_ENBL, val); 753 qlcnic_83xx_enable_legacy_msix_mbx_intr(adapter); 754 } 755 756 void qlcnic_83xx_check_vf(struct qlcnic_adapter *adapter, 757 const struct pci_device_id *ent) 758 { 759 u32 op_mode, priv_level; 760 struct qlcnic_hardware_context *ahw = adapter->ahw; 761 762 ahw->fw_hal_version = 2; 763 qlcnic_get_func_no(adapter); 764 765 if (qlcnic_sriov_vf_check(adapter)) { 766 qlcnic_sriov_vf_set_ops(adapter); 767 return; 768 } 769 770 /* Determine function privilege level */ 771 op_mode = QLCRDX(adapter->ahw, QLC_83XX_DRV_OP_MODE); 772 if (op_mode == QLC_83XX_DEFAULT_OPMODE) 773 priv_level = QLCNIC_MGMT_FUNC; 774 else 775 priv_level = QLC_83XX_GET_FUNC_PRIVILEGE(op_mode, 776 ahw->pci_func); 777 778 if (priv_level == QLCNIC_NON_PRIV_FUNC) { 779 ahw->op_mode = QLCNIC_NON_PRIV_FUNC; 780 dev_info(&adapter->pdev->dev, 781 "HAL Version: %d Non Privileged function\n", 782 ahw->fw_hal_version); 783 adapter->nic_ops = &qlcnic_vf_ops; 784 } else { 785 if (pci_find_ext_capability(adapter->pdev, 786 PCI_EXT_CAP_ID_SRIOV)) 787 set_bit(__QLCNIC_SRIOV_CAPABLE, &adapter->state); 788 adapter->nic_ops = &qlcnic_83xx_ops; 789 } 790 } 791 792 static void qlcnic_83xx_handle_link_aen(struct qlcnic_adapter *adapter, 793 u32 data[]); 794 static void qlcnic_83xx_handle_idc_comp_aen(struct qlcnic_adapter *adapter, 795 u32 data[]); 796 797 void qlcnic_dump_mbx(struct qlcnic_adapter *adapter, 798 struct qlcnic_cmd_args *cmd) 799 { 800 int i; 801 802 if (cmd->op_type == QLC_83XX_MBX_POST_BC_OP) 803 return; 804 805 dev_info(&adapter->pdev->dev, 806 "Host MBX regs(%d)\n", cmd->req.num); 807 for (i = 0; i < cmd->req.num; i++) { 808 if (i && !(i % 8)) 809 pr_info("\n"); 810 pr_info("%08x ", cmd->req.arg[i]); 811 } 812 pr_info("\n"); 813 dev_info(&adapter->pdev->dev, 814 "FW MBX regs(%d)\n", cmd->rsp.num); 815 for (i = 0; i < cmd->rsp.num; i++) { 816 if (i && !(i % 8)) 817 pr_info("\n"); 818 pr_info("%08x ", cmd->rsp.arg[i]); 819 } 820 pr_info("\n"); 821 } 822 823 static void qlcnic_83xx_poll_for_mbx_completion(struct qlcnic_adapter *adapter, 824 struct qlcnic_cmd_args *cmd) 825 { 826 struct qlcnic_hardware_context *ahw = adapter->ahw; 827 int opcode = LSW(cmd->req.arg[0]); 828 unsigned long max_loops; 829 830 max_loops = cmd->total_cmds * QLC_83XX_MBX_CMD_LOOP; 831 832 for (; max_loops; max_loops--) { 833 if (atomic_read(&cmd->rsp_status) == 834 QLC_83XX_MBX_RESPONSE_ARRIVED) 835 return; 836 837 udelay(1); 838 } 839 840 dev_err(&adapter->pdev->dev, 841 "%s: Mailbox command timed out, cmd_op=0x%x, cmd_type=0x%x, pci_func=0x%x, op_mode=0x%x\n", 842 __func__, opcode, cmd->type, ahw->pci_func, ahw->op_mode); 843 flush_workqueue(ahw->mailbox->work_q); 844 return; 845 } 846 847 int qlcnic_83xx_issue_cmd(struct qlcnic_adapter *adapter, 848 struct qlcnic_cmd_args *cmd) 849 { 850 struct qlcnic_mailbox *mbx = adapter->ahw->mailbox; 851 struct qlcnic_hardware_context *ahw = adapter->ahw; 852 int cmd_type, err, opcode; 853 unsigned long timeout; 854 855 if (!mbx) 856 return -EIO; 857 858 opcode = LSW(cmd->req.arg[0]); 859 cmd_type = cmd->type; 860 err = mbx->ops->enqueue_cmd(adapter, cmd, &timeout); 861 if (err) { 862 dev_err(&adapter->pdev->dev, 863 "%s: Mailbox not available, cmd_op=0x%x, cmd_context=0x%x, pci_func=0x%x, op_mode=0x%x\n", 864 __func__, opcode, cmd->type, ahw->pci_func, 865 ahw->op_mode); 866 return err; 867 } 868 869 switch (cmd_type) { 870 case QLC_83XX_MBX_CMD_WAIT: 871 if (!wait_for_completion_timeout(&cmd->completion, timeout)) { 872 dev_err(&adapter->pdev->dev, 873 "%s: Mailbox command timed out, cmd_op=0x%x, cmd_type=0x%x, pci_func=0x%x, op_mode=0x%x\n", 874 __func__, opcode, cmd_type, ahw->pci_func, 875 ahw->op_mode); 876 flush_workqueue(mbx->work_q); 877 } 878 break; 879 case QLC_83XX_MBX_CMD_NO_WAIT: 880 return 0; 881 case QLC_83XX_MBX_CMD_BUSY_WAIT: 882 qlcnic_83xx_poll_for_mbx_completion(adapter, cmd); 883 break; 884 default: 885 dev_err(&adapter->pdev->dev, 886 "%s: Invalid mailbox command, cmd_op=0x%x, cmd_type=0x%x, pci_func=0x%x, op_mode=0x%x\n", 887 __func__, opcode, cmd_type, ahw->pci_func, 888 ahw->op_mode); 889 qlcnic_83xx_detach_mailbox_work(adapter); 890 } 891 892 return cmd->rsp_opcode; 893 } 894 895 int qlcnic_83xx_alloc_mbx_args(struct qlcnic_cmd_args *mbx, 896 struct qlcnic_adapter *adapter, u32 type) 897 { 898 int i, size; 899 u32 temp; 900 const struct qlcnic_mailbox_metadata *mbx_tbl; 901 902 memset(mbx, 0, sizeof(struct qlcnic_cmd_args)); 903 mbx_tbl = qlcnic_83xx_mbx_tbl; 904 size = ARRAY_SIZE(qlcnic_83xx_mbx_tbl); 905 for (i = 0; i < size; i++) { 906 if (type == mbx_tbl[i].cmd) { 907 mbx->op_type = QLC_83XX_FW_MBX_CMD; 908 mbx->req.num = mbx_tbl[i].in_args; 909 mbx->rsp.num = mbx_tbl[i].out_args; 910 mbx->req.arg = kcalloc(mbx->req.num, sizeof(u32), 911 GFP_ATOMIC); 912 if (!mbx->req.arg) 913 return -ENOMEM; 914 mbx->rsp.arg = kcalloc(mbx->rsp.num, sizeof(u32), 915 GFP_ATOMIC); 916 if (!mbx->rsp.arg) { 917 kfree(mbx->req.arg); 918 mbx->req.arg = NULL; 919 return -ENOMEM; 920 } 921 temp = adapter->ahw->fw_hal_version << 29; 922 mbx->req.arg[0] = (type | (mbx->req.num << 16) | temp); 923 mbx->cmd_op = type; 924 return 0; 925 } 926 } 927 928 dev_err(&adapter->pdev->dev, "%s: Invalid mailbox command opcode 0x%x\n", 929 __func__, type); 930 return -EINVAL; 931 } 932 933 void qlcnic_83xx_idc_aen_work(struct work_struct *work) 934 { 935 struct qlcnic_adapter *adapter; 936 struct qlcnic_cmd_args cmd; 937 int i, err = 0; 938 939 adapter = container_of(work, struct qlcnic_adapter, idc_aen_work.work); 940 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_IDC_ACK); 941 if (err) 942 return; 943 944 for (i = 1; i < QLC_83XX_MBX_AEN_CNT; i++) 945 cmd.req.arg[i] = adapter->ahw->mbox_aen[i]; 946 947 err = qlcnic_issue_cmd(adapter, &cmd); 948 if (err) 949 dev_info(&adapter->pdev->dev, 950 "%s: Mailbox IDC ACK failed.\n", __func__); 951 qlcnic_free_mbx_args(&cmd); 952 } 953 954 static void qlcnic_83xx_handle_idc_comp_aen(struct qlcnic_adapter *adapter, 955 u32 data[]) 956 { 957 dev_dbg(&adapter->pdev->dev, "Completion AEN:0x%x.\n", 958 QLCNIC_MBX_RSP(data[0])); 959 clear_bit(QLC_83XX_IDC_COMP_AEN, &adapter->ahw->idc.status); 960 return; 961 } 962 963 static void __qlcnic_83xx_process_aen(struct qlcnic_adapter *adapter) 964 { 965 struct qlcnic_hardware_context *ahw = adapter->ahw; 966 u32 event[QLC_83XX_MBX_AEN_CNT]; 967 int i; 968 969 for (i = 0; i < QLC_83XX_MBX_AEN_CNT; i++) 970 event[i] = readl(QLCNIC_MBX_FW(ahw, i)); 971 972 switch (QLCNIC_MBX_RSP(event[0])) { 973 974 case QLCNIC_MBX_LINK_EVENT: 975 qlcnic_83xx_handle_link_aen(adapter, event); 976 break; 977 case QLCNIC_MBX_COMP_EVENT: 978 qlcnic_83xx_handle_idc_comp_aen(adapter, event); 979 break; 980 case QLCNIC_MBX_REQUEST_EVENT: 981 for (i = 0; i < QLC_83XX_MBX_AEN_CNT; i++) 982 adapter->ahw->mbox_aen[i] = QLCNIC_MBX_RSP(event[i]); 983 queue_delayed_work(adapter->qlcnic_wq, 984 &adapter->idc_aen_work, 0); 985 break; 986 case QLCNIC_MBX_TIME_EXTEND_EVENT: 987 ahw->extend_lb_time = event[1] >> 8 & 0xf; 988 break; 989 case QLCNIC_MBX_BC_EVENT: 990 qlcnic_sriov_handle_bc_event(adapter, event[1]); 991 break; 992 case QLCNIC_MBX_SFP_INSERT_EVENT: 993 dev_info(&adapter->pdev->dev, "SFP+ Insert AEN:0x%x.\n", 994 QLCNIC_MBX_RSP(event[0])); 995 break; 996 case QLCNIC_MBX_SFP_REMOVE_EVENT: 997 dev_info(&adapter->pdev->dev, "SFP Removed AEN:0x%x.\n", 998 QLCNIC_MBX_RSP(event[0])); 999 break; 1000 case QLCNIC_MBX_DCBX_CONFIG_CHANGE_EVENT: 1001 qlcnic_dcb_aen_handler(adapter->dcb, (void *)&event[1]); 1002 break; 1003 default: 1004 dev_dbg(&adapter->pdev->dev, "Unsupported AEN:0x%x.\n", 1005 QLCNIC_MBX_RSP(event[0])); 1006 break; 1007 } 1008 1009 QLCWRX(ahw, QLCNIC_FW_MBX_CTRL, QLCNIC_CLR_OWNER); 1010 } 1011 1012 static void qlcnic_83xx_process_aen(struct qlcnic_adapter *adapter) 1013 { 1014 u32 resp, event, rsp_status = QLC_83XX_MBX_RESPONSE_ARRIVED; 1015 struct qlcnic_hardware_context *ahw = adapter->ahw; 1016 struct qlcnic_mailbox *mbx = ahw->mailbox; 1017 unsigned long flags; 1018 1019 spin_lock_irqsave(&mbx->aen_lock, flags); 1020 resp = QLCRDX(ahw, QLCNIC_FW_MBX_CTRL); 1021 if (resp & QLCNIC_SET_OWNER) { 1022 event = readl(QLCNIC_MBX_FW(ahw, 0)); 1023 if (event & QLCNIC_MBX_ASYNC_EVENT) { 1024 __qlcnic_83xx_process_aen(adapter); 1025 } else { 1026 if (mbx->rsp_status != rsp_status) 1027 qlcnic_83xx_notify_mbx_response(mbx); 1028 } 1029 } 1030 spin_unlock_irqrestore(&mbx->aen_lock, flags); 1031 } 1032 1033 static void qlcnic_83xx_mbx_poll_work(struct work_struct *work) 1034 { 1035 struct qlcnic_adapter *adapter; 1036 1037 adapter = container_of(work, struct qlcnic_adapter, mbx_poll_work.work); 1038 1039 if (!test_bit(__QLCNIC_MBX_POLL_ENABLE, &adapter->state)) 1040 return; 1041 1042 qlcnic_83xx_process_aen(adapter); 1043 queue_delayed_work(adapter->qlcnic_wq, &adapter->mbx_poll_work, 1044 (HZ / 10)); 1045 } 1046 1047 void qlcnic_83xx_enable_mbx_poll(struct qlcnic_adapter *adapter) 1048 { 1049 if (test_and_set_bit(__QLCNIC_MBX_POLL_ENABLE, &adapter->state)) 1050 return; 1051 1052 INIT_DELAYED_WORK(&adapter->mbx_poll_work, qlcnic_83xx_mbx_poll_work); 1053 queue_delayed_work(adapter->qlcnic_wq, &adapter->mbx_poll_work, 0); 1054 } 1055 1056 void qlcnic_83xx_disable_mbx_poll(struct qlcnic_adapter *adapter) 1057 { 1058 if (!test_and_clear_bit(__QLCNIC_MBX_POLL_ENABLE, &adapter->state)) 1059 return; 1060 cancel_delayed_work_sync(&adapter->mbx_poll_work); 1061 } 1062 1063 static int qlcnic_83xx_add_rings(struct qlcnic_adapter *adapter) 1064 { 1065 int index, i, err, sds_mbx_size; 1066 u32 *buf, intrpt_id, intr_mask; 1067 u16 context_id; 1068 u8 num_sds; 1069 struct qlcnic_cmd_args cmd; 1070 struct qlcnic_host_sds_ring *sds; 1071 struct qlcnic_sds_mbx sds_mbx; 1072 struct qlcnic_add_rings_mbx_out *mbx_out; 1073 struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx; 1074 struct qlcnic_hardware_context *ahw = adapter->ahw; 1075 1076 sds_mbx_size = sizeof(struct qlcnic_sds_mbx); 1077 context_id = recv_ctx->context_id; 1078 num_sds = adapter->drv_sds_rings - QLCNIC_MAX_SDS_RINGS; 1079 ahw->hw_ops->alloc_mbx_args(&cmd, adapter, 1080 QLCNIC_CMD_ADD_RCV_RINGS); 1081 cmd.req.arg[1] = 0 | (num_sds << 8) | (context_id << 16); 1082 1083 /* set up status rings, mbx 2-81 */ 1084 index = 2; 1085 for (i = 8; i < adapter->drv_sds_rings; i++) { 1086 memset(&sds_mbx, 0, sds_mbx_size); 1087 sds = &recv_ctx->sds_rings[i]; 1088 sds->consumer = 0; 1089 memset(sds->desc_head, 0, STATUS_DESC_RINGSIZE(sds)); 1090 sds_mbx.phy_addr_low = LSD(sds->phys_addr); 1091 sds_mbx.phy_addr_high = MSD(sds->phys_addr); 1092 sds_mbx.sds_ring_size = sds->num_desc; 1093 1094 if (adapter->flags & QLCNIC_MSIX_ENABLED) 1095 intrpt_id = ahw->intr_tbl[i].id; 1096 else 1097 intrpt_id = QLCRDX(ahw, QLCNIC_DEF_INT_ID); 1098 1099 if (adapter->ahw->diag_test != QLCNIC_LOOPBACK_TEST) 1100 sds_mbx.intrpt_id = intrpt_id; 1101 else 1102 sds_mbx.intrpt_id = 0xffff; 1103 sds_mbx.intrpt_val = 0; 1104 buf = &cmd.req.arg[index]; 1105 memcpy(buf, &sds_mbx, sds_mbx_size); 1106 index += sds_mbx_size / sizeof(u32); 1107 } 1108 1109 /* send the mailbox command */ 1110 err = ahw->hw_ops->mbx_cmd(adapter, &cmd); 1111 if (err) { 1112 dev_err(&adapter->pdev->dev, 1113 "Failed to add rings %d\n", err); 1114 goto out; 1115 } 1116 1117 mbx_out = (struct qlcnic_add_rings_mbx_out *)&cmd.rsp.arg[1]; 1118 index = 0; 1119 /* status descriptor ring */ 1120 for (i = 8; i < adapter->drv_sds_rings; i++) { 1121 sds = &recv_ctx->sds_rings[i]; 1122 sds->crb_sts_consumer = ahw->pci_base0 + 1123 mbx_out->host_csmr[index]; 1124 if (adapter->flags & QLCNIC_MSIX_ENABLED) 1125 intr_mask = ahw->intr_tbl[i].src; 1126 else 1127 intr_mask = QLCRDX(ahw, QLCNIC_DEF_INT_MASK); 1128 1129 sds->crb_intr_mask = ahw->pci_base0 + intr_mask; 1130 index++; 1131 } 1132 out: 1133 qlcnic_free_mbx_args(&cmd); 1134 return err; 1135 } 1136 1137 void qlcnic_83xx_del_rx_ctx(struct qlcnic_adapter *adapter) 1138 { 1139 int err; 1140 u32 temp = 0; 1141 struct qlcnic_cmd_args cmd; 1142 struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx; 1143 1144 if (qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_DESTROY_RX_CTX)) 1145 return; 1146 1147 if (qlcnic_sriov_pf_check(adapter) || qlcnic_sriov_vf_check(adapter)) 1148 cmd.req.arg[0] |= (0x3 << 29); 1149 1150 if (qlcnic_sriov_pf_check(adapter)) 1151 qlcnic_pf_set_interface_id_del_rx_ctx(adapter, &temp); 1152 1153 cmd.req.arg[1] = recv_ctx->context_id | temp; 1154 err = qlcnic_issue_cmd(adapter, &cmd); 1155 if (err) 1156 dev_err(&adapter->pdev->dev, 1157 "Failed to destroy rx ctx in firmware\n"); 1158 1159 recv_ctx->state = QLCNIC_HOST_CTX_STATE_FREED; 1160 qlcnic_free_mbx_args(&cmd); 1161 } 1162 1163 int qlcnic_83xx_create_rx_ctx(struct qlcnic_adapter *adapter) 1164 { 1165 int i, err, index, sds_mbx_size, rds_mbx_size; 1166 u8 num_sds, num_rds; 1167 u32 *buf, intrpt_id, intr_mask, cap = 0; 1168 struct qlcnic_host_sds_ring *sds; 1169 struct qlcnic_host_rds_ring *rds; 1170 struct qlcnic_sds_mbx sds_mbx; 1171 struct qlcnic_rds_mbx rds_mbx; 1172 struct qlcnic_cmd_args cmd; 1173 struct qlcnic_rcv_mbx_out *mbx_out; 1174 struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx; 1175 struct qlcnic_hardware_context *ahw = adapter->ahw; 1176 num_rds = adapter->max_rds_rings; 1177 1178 if (adapter->drv_sds_rings <= QLCNIC_MAX_SDS_RINGS) 1179 num_sds = adapter->drv_sds_rings; 1180 else 1181 num_sds = QLCNIC_MAX_SDS_RINGS; 1182 1183 sds_mbx_size = sizeof(struct qlcnic_sds_mbx); 1184 rds_mbx_size = sizeof(struct qlcnic_rds_mbx); 1185 cap = QLCNIC_CAP0_LEGACY_CONTEXT; 1186 1187 if (adapter->flags & QLCNIC_FW_LRO_MSS_CAP) 1188 cap |= QLC_83XX_FW_CAP_LRO_MSS; 1189 1190 /* set mailbox hdr and capabilities */ 1191 err = qlcnic_alloc_mbx_args(&cmd, adapter, 1192 QLCNIC_CMD_CREATE_RX_CTX); 1193 if (err) 1194 return err; 1195 1196 if (qlcnic_sriov_pf_check(adapter) || qlcnic_sriov_vf_check(adapter)) 1197 cmd.req.arg[0] |= (0x3 << 29); 1198 1199 cmd.req.arg[1] = cap; 1200 cmd.req.arg[5] = 1 | (num_rds << 5) | (num_sds << 8) | 1201 (QLC_83XX_HOST_RDS_MODE_UNIQUE << 16); 1202 1203 if (qlcnic_sriov_pf_check(adapter)) 1204 qlcnic_pf_set_interface_id_create_rx_ctx(adapter, 1205 &cmd.req.arg[6]); 1206 /* set up status rings, mbx 8-57/87 */ 1207 index = QLC_83XX_HOST_SDS_MBX_IDX; 1208 for (i = 0; i < num_sds; i++) { 1209 memset(&sds_mbx, 0, sds_mbx_size); 1210 sds = &recv_ctx->sds_rings[i]; 1211 sds->consumer = 0; 1212 memset(sds->desc_head, 0, STATUS_DESC_RINGSIZE(sds)); 1213 sds_mbx.phy_addr_low = LSD(sds->phys_addr); 1214 sds_mbx.phy_addr_high = MSD(sds->phys_addr); 1215 sds_mbx.sds_ring_size = sds->num_desc; 1216 if (adapter->flags & QLCNIC_MSIX_ENABLED) 1217 intrpt_id = ahw->intr_tbl[i].id; 1218 else 1219 intrpt_id = QLCRDX(ahw, QLCNIC_DEF_INT_ID); 1220 if (adapter->ahw->diag_test != QLCNIC_LOOPBACK_TEST) 1221 sds_mbx.intrpt_id = intrpt_id; 1222 else 1223 sds_mbx.intrpt_id = 0xffff; 1224 sds_mbx.intrpt_val = 0; 1225 buf = &cmd.req.arg[index]; 1226 memcpy(buf, &sds_mbx, sds_mbx_size); 1227 index += sds_mbx_size / sizeof(u32); 1228 } 1229 /* set up receive rings, mbx 88-111/135 */ 1230 index = QLCNIC_HOST_RDS_MBX_IDX; 1231 rds = &recv_ctx->rds_rings[0]; 1232 rds->producer = 0; 1233 memset(&rds_mbx, 0, rds_mbx_size); 1234 rds_mbx.phy_addr_reg_low = LSD(rds->phys_addr); 1235 rds_mbx.phy_addr_reg_high = MSD(rds->phys_addr); 1236 rds_mbx.reg_ring_sz = rds->dma_size; 1237 rds_mbx.reg_ring_len = rds->num_desc; 1238 /* Jumbo ring */ 1239 rds = &recv_ctx->rds_rings[1]; 1240 rds->producer = 0; 1241 rds_mbx.phy_addr_jmb_low = LSD(rds->phys_addr); 1242 rds_mbx.phy_addr_jmb_high = MSD(rds->phys_addr); 1243 rds_mbx.jmb_ring_sz = rds->dma_size; 1244 rds_mbx.jmb_ring_len = rds->num_desc; 1245 buf = &cmd.req.arg[index]; 1246 memcpy(buf, &rds_mbx, rds_mbx_size); 1247 1248 /* send the mailbox command */ 1249 err = ahw->hw_ops->mbx_cmd(adapter, &cmd); 1250 if (err) { 1251 dev_err(&adapter->pdev->dev, 1252 "Failed to create Rx ctx in firmware%d\n", err); 1253 goto out; 1254 } 1255 mbx_out = (struct qlcnic_rcv_mbx_out *)&cmd.rsp.arg[1]; 1256 recv_ctx->context_id = mbx_out->ctx_id; 1257 recv_ctx->state = mbx_out->state; 1258 recv_ctx->virt_port = mbx_out->vport_id; 1259 dev_info(&adapter->pdev->dev, "Rx Context[%d] Created, state:0x%x\n", 1260 recv_ctx->context_id, recv_ctx->state); 1261 /* Receive descriptor ring */ 1262 /* Standard ring */ 1263 rds = &recv_ctx->rds_rings[0]; 1264 rds->crb_rcv_producer = ahw->pci_base0 + 1265 mbx_out->host_prod[0].reg_buf; 1266 /* Jumbo ring */ 1267 rds = &recv_ctx->rds_rings[1]; 1268 rds->crb_rcv_producer = ahw->pci_base0 + 1269 mbx_out->host_prod[0].jmb_buf; 1270 /* status descriptor ring */ 1271 for (i = 0; i < num_sds; i++) { 1272 sds = &recv_ctx->sds_rings[i]; 1273 sds->crb_sts_consumer = ahw->pci_base0 + 1274 mbx_out->host_csmr[i]; 1275 if (adapter->flags & QLCNIC_MSIX_ENABLED) 1276 intr_mask = ahw->intr_tbl[i].src; 1277 else 1278 intr_mask = QLCRDX(ahw, QLCNIC_DEF_INT_MASK); 1279 sds->crb_intr_mask = ahw->pci_base0 + intr_mask; 1280 } 1281 1282 if (adapter->drv_sds_rings > QLCNIC_MAX_SDS_RINGS) 1283 err = qlcnic_83xx_add_rings(adapter); 1284 out: 1285 qlcnic_free_mbx_args(&cmd); 1286 return err; 1287 } 1288 1289 void qlcnic_83xx_del_tx_ctx(struct qlcnic_adapter *adapter, 1290 struct qlcnic_host_tx_ring *tx_ring) 1291 { 1292 struct qlcnic_cmd_args cmd; 1293 u32 temp = 0; 1294 1295 if (qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_DESTROY_TX_CTX)) 1296 return; 1297 1298 if (qlcnic_sriov_pf_check(adapter) || qlcnic_sriov_vf_check(adapter)) 1299 cmd.req.arg[0] |= (0x3 << 29); 1300 1301 if (qlcnic_sriov_pf_check(adapter)) 1302 qlcnic_pf_set_interface_id_del_tx_ctx(adapter, &temp); 1303 1304 cmd.req.arg[1] = tx_ring->ctx_id | temp; 1305 if (qlcnic_issue_cmd(adapter, &cmd)) 1306 dev_err(&adapter->pdev->dev, 1307 "Failed to destroy tx ctx in firmware\n"); 1308 qlcnic_free_mbx_args(&cmd); 1309 } 1310 1311 int qlcnic_83xx_create_tx_ctx(struct qlcnic_adapter *adapter, 1312 struct qlcnic_host_tx_ring *tx, int ring) 1313 { 1314 int err; 1315 u16 msix_id; 1316 u32 *buf, intr_mask, temp = 0; 1317 struct qlcnic_cmd_args cmd; 1318 struct qlcnic_tx_mbx mbx; 1319 struct qlcnic_tx_mbx_out *mbx_out; 1320 struct qlcnic_hardware_context *ahw = adapter->ahw; 1321 u32 msix_vector; 1322 1323 /* Reset host resources */ 1324 tx->producer = 0; 1325 tx->sw_consumer = 0; 1326 *(tx->hw_consumer) = 0; 1327 1328 memset(&mbx, 0, sizeof(struct qlcnic_tx_mbx)); 1329 1330 /* setup mailbox inbox registerss */ 1331 mbx.phys_addr_low = LSD(tx->phys_addr); 1332 mbx.phys_addr_high = MSD(tx->phys_addr); 1333 mbx.cnsmr_index_low = LSD(tx->hw_cons_phys_addr); 1334 mbx.cnsmr_index_high = MSD(tx->hw_cons_phys_addr); 1335 mbx.size = tx->num_desc; 1336 if (adapter->flags & QLCNIC_MSIX_ENABLED) { 1337 if (!(adapter->flags & QLCNIC_TX_INTR_SHARED)) 1338 msix_vector = adapter->drv_sds_rings + ring; 1339 else 1340 msix_vector = adapter->drv_sds_rings - 1; 1341 msix_id = ahw->intr_tbl[msix_vector].id; 1342 } else { 1343 msix_id = QLCRDX(ahw, QLCNIC_DEF_INT_ID); 1344 } 1345 1346 if (adapter->ahw->diag_test != QLCNIC_LOOPBACK_TEST) 1347 mbx.intr_id = msix_id; 1348 else 1349 mbx.intr_id = 0xffff; 1350 mbx.src = 0; 1351 1352 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CREATE_TX_CTX); 1353 if (err) 1354 return err; 1355 1356 if (qlcnic_sriov_pf_check(adapter) || qlcnic_sriov_vf_check(adapter)) 1357 cmd.req.arg[0] |= (0x3 << 29); 1358 1359 if (qlcnic_sriov_pf_check(adapter)) 1360 qlcnic_pf_set_interface_id_create_tx_ctx(adapter, &temp); 1361 1362 cmd.req.arg[1] = QLCNIC_CAP0_LEGACY_CONTEXT; 1363 cmd.req.arg[5] = QLCNIC_SINGLE_RING | temp; 1364 1365 buf = &cmd.req.arg[6]; 1366 memcpy(buf, &mbx, sizeof(struct qlcnic_tx_mbx)); 1367 /* send the mailbox command*/ 1368 err = qlcnic_issue_cmd(adapter, &cmd); 1369 if (err) { 1370 netdev_err(adapter->netdev, 1371 "Failed to create Tx ctx in firmware 0x%x\n", err); 1372 goto out; 1373 } 1374 mbx_out = (struct qlcnic_tx_mbx_out *)&cmd.rsp.arg[2]; 1375 tx->crb_cmd_producer = ahw->pci_base0 + mbx_out->host_prod; 1376 tx->ctx_id = mbx_out->ctx_id; 1377 if ((adapter->flags & QLCNIC_MSIX_ENABLED) && 1378 !(adapter->flags & QLCNIC_TX_INTR_SHARED)) { 1379 intr_mask = ahw->intr_tbl[adapter->drv_sds_rings + ring].src; 1380 tx->crb_intr_mask = ahw->pci_base0 + intr_mask; 1381 } 1382 netdev_info(adapter->netdev, 1383 "Tx Context[0x%x] Created, state:0x%x\n", 1384 tx->ctx_id, mbx_out->state); 1385 out: 1386 qlcnic_free_mbx_args(&cmd); 1387 return err; 1388 } 1389 1390 static int qlcnic_83xx_diag_alloc_res(struct net_device *netdev, int test, 1391 u8 num_sds_ring) 1392 { 1393 struct qlcnic_adapter *adapter = netdev_priv(netdev); 1394 struct qlcnic_host_sds_ring *sds_ring; 1395 struct qlcnic_host_rds_ring *rds_ring; 1396 u16 adapter_state = adapter->is_up; 1397 u8 ring; 1398 int ret; 1399 1400 netif_device_detach(netdev); 1401 1402 if (netif_running(netdev)) 1403 __qlcnic_down(adapter, netdev); 1404 1405 qlcnic_detach(adapter); 1406 1407 adapter->drv_sds_rings = QLCNIC_SINGLE_RING; 1408 adapter->ahw->diag_test = test; 1409 adapter->ahw->linkup = 0; 1410 1411 ret = qlcnic_attach(adapter); 1412 if (ret) { 1413 netif_device_attach(netdev); 1414 return ret; 1415 } 1416 1417 ret = qlcnic_fw_create_ctx(adapter); 1418 if (ret) { 1419 qlcnic_detach(adapter); 1420 if (adapter_state == QLCNIC_ADAPTER_UP_MAGIC) { 1421 adapter->drv_sds_rings = num_sds_ring; 1422 qlcnic_attach(adapter); 1423 } 1424 netif_device_attach(netdev); 1425 return ret; 1426 } 1427 1428 for (ring = 0; ring < adapter->max_rds_rings; ring++) { 1429 rds_ring = &adapter->recv_ctx->rds_rings[ring]; 1430 qlcnic_post_rx_buffers(adapter, rds_ring, ring); 1431 } 1432 1433 if (adapter->ahw->diag_test == QLCNIC_INTERRUPT_TEST) { 1434 for (ring = 0; ring < adapter->drv_sds_rings; ring++) { 1435 sds_ring = &adapter->recv_ctx->sds_rings[ring]; 1436 qlcnic_enable_sds_intr(adapter, sds_ring); 1437 } 1438 } 1439 1440 if (adapter->ahw->diag_test == QLCNIC_LOOPBACK_TEST) { 1441 adapter->ahw->loopback_state = 0; 1442 adapter->ahw->hw_ops->setup_link_event(adapter, 1); 1443 } 1444 1445 set_bit(__QLCNIC_DEV_UP, &adapter->state); 1446 return 0; 1447 } 1448 1449 static void qlcnic_83xx_diag_free_res(struct net_device *netdev, 1450 u8 drv_sds_rings) 1451 { 1452 struct qlcnic_adapter *adapter = netdev_priv(netdev); 1453 struct qlcnic_host_sds_ring *sds_ring; 1454 int ring; 1455 1456 clear_bit(__QLCNIC_DEV_UP, &adapter->state); 1457 if (adapter->ahw->diag_test == QLCNIC_INTERRUPT_TEST) { 1458 for (ring = 0; ring < adapter->drv_sds_rings; ring++) { 1459 sds_ring = &adapter->recv_ctx->sds_rings[ring]; 1460 if (adapter->flags & QLCNIC_MSIX_ENABLED) 1461 qlcnic_disable_sds_intr(adapter, sds_ring); 1462 } 1463 } 1464 1465 qlcnic_fw_destroy_ctx(adapter); 1466 qlcnic_detach(adapter); 1467 1468 adapter->ahw->diag_test = 0; 1469 adapter->drv_sds_rings = drv_sds_rings; 1470 1471 if (qlcnic_attach(adapter)) 1472 goto out; 1473 1474 if (netif_running(netdev)) 1475 __qlcnic_up(adapter, netdev); 1476 1477 out: 1478 netif_device_attach(netdev); 1479 } 1480 1481 static void qlcnic_83xx_get_beacon_state(struct qlcnic_adapter *adapter) 1482 { 1483 struct qlcnic_hardware_context *ahw = adapter->ahw; 1484 struct qlcnic_cmd_args cmd; 1485 u8 beacon_state; 1486 int err = 0; 1487 1488 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_LED_CONFIG); 1489 if (!err) { 1490 err = qlcnic_issue_cmd(adapter, &cmd); 1491 if (!err) { 1492 beacon_state = cmd.rsp.arg[4]; 1493 if (beacon_state == QLCNIC_BEACON_DISABLE) 1494 ahw->beacon_state = QLC_83XX_BEACON_OFF; 1495 else if (beacon_state == QLC_83XX_ENABLE_BEACON) 1496 ahw->beacon_state = QLC_83XX_BEACON_ON; 1497 } 1498 } else { 1499 netdev_err(adapter->netdev, "Get beacon state failed, err=%d\n", 1500 err); 1501 } 1502 1503 qlcnic_free_mbx_args(&cmd); 1504 1505 return; 1506 } 1507 1508 int qlcnic_83xx_config_led(struct qlcnic_adapter *adapter, u32 state, 1509 u32 beacon) 1510 { 1511 struct qlcnic_cmd_args cmd; 1512 u32 mbx_in; 1513 int i, status = 0; 1514 1515 if (state) { 1516 /* Get LED configuration */ 1517 status = qlcnic_alloc_mbx_args(&cmd, adapter, 1518 QLCNIC_CMD_GET_LED_CONFIG); 1519 if (status) 1520 return status; 1521 1522 status = qlcnic_issue_cmd(adapter, &cmd); 1523 if (status) { 1524 dev_err(&adapter->pdev->dev, 1525 "Get led config failed.\n"); 1526 goto mbx_err; 1527 } else { 1528 for (i = 0; i < 4; i++) 1529 adapter->ahw->mbox_reg[i] = cmd.rsp.arg[i+1]; 1530 } 1531 qlcnic_free_mbx_args(&cmd); 1532 /* Set LED Configuration */ 1533 mbx_in = (LSW(QLC_83XX_LED_CONFIG) << 16) | 1534 LSW(QLC_83XX_LED_CONFIG); 1535 status = qlcnic_alloc_mbx_args(&cmd, adapter, 1536 QLCNIC_CMD_SET_LED_CONFIG); 1537 if (status) 1538 return status; 1539 1540 cmd.req.arg[1] = mbx_in; 1541 cmd.req.arg[2] = mbx_in; 1542 cmd.req.arg[3] = mbx_in; 1543 if (beacon) 1544 cmd.req.arg[4] = QLC_83XX_ENABLE_BEACON; 1545 status = qlcnic_issue_cmd(adapter, &cmd); 1546 if (status) { 1547 dev_err(&adapter->pdev->dev, 1548 "Set led config failed.\n"); 1549 } 1550 mbx_err: 1551 qlcnic_free_mbx_args(&cmd); 1552 return status; 1553 1554 } else { 1555 /* Restoring default LED configuration */ 1556 status = qlcnic_alloc_mbx_args(&cmd, adapter, 1557 QLCNIC_CMD_SET_LED_CONFIG); 1558 if (status) 1559 return status; 1560 1561 cmd.req.arg[1] = adapter->ahw->mbox_reg[0]; 1562 cmd.req.arg[2] = adapter->ahw->mbox_reg[1]; 1563 cmd.req.arg[3] = adapter->ahw->mbox_reg[2]; 1564 if (beacon) 1565 cmd.req.arg[4] = adapter->ahw->mbox_reg[3]; 1566 status = qlcnic_issue_cmd(adapter, &cmd); 1567 if (status) 1568 dev_err(&adapter->pdev->dev, 1569 "Restoring led config failed.\n"); 1570 qlcnic_free_mbx_args(&cmd); 1571 return status; 1572 } 1573 } 1574 1575 int qlcnic_83xx_set_led(struct net_device *netdev, 1576 enum ethtool_phys_id_state state) 1577 { 1578 struct qlcnic_adapter *adapter = netdev_priv(netdev); 1579 int err = -EIO, active = 1; 1580 1581 if (adapter->ahw->op_mode == QLCNIC_NON_PRIV_FUNC) { 1582 netdev_warn(netdev, 1583 "LED test is not supported in non-privileged mode\n"); 1584 return -EOPNOTSUPP; 1585 } 1586 1587 switch (state) { 1588 case ETHTOOL_ID_ACTIVE: 1589 if (test_and_set_bit(__QLCNIC_LED_ENABLE, &adapter->state)) 1590 return -EBUSY; 1591 1592 if (test_bit(__QLCNIC_RESETTING, &adapter->state)) 1593 break; 1594 1595 err = qlcnic_83xx_config_led(adapter, active, 0); 1596 if (err) 1597 netdev_err(netdev, "Failed to set LED blink state\n"); 1598 break; 1599 case ETHTOOL_ID_INACTIVE: 1600 active = 0; 1601 1602 if (test_bit(__QLCNIC_RESETTING, &adapter->state)) 1603 break; 1604 1605 err = qlcnic_83xx_config_led(adapter, active, 0); 1606 if (err) 1607 netdev_err(netdev, "Failed to reset LED blink state\n"); 1608 break; 1609 1610 default: 1611 return -EINVAL; 1612 } 1613 1614 if (!active || err) 1615 clear_bit(__QLCNIC_LED_ENABLE, &adapter->state); 1616 1617 return err; 1618 } 1619 1620 void qlcnic_83xx_initialize_nic(struct qlcnic_adapter *adapter, int enable) 1621 { 1622 struct qlcnic_cmd_args cmd; 1623 int status; 1624 1625 if (qlcnic_sriov_vf_check(adapter)) 1626 return; 1627 1628 if (enable) 1629 status = qlcnic_alloc_mbx_args(&cmd, adapter, 1630 QLCNIC_CMD_INIT_NIC_FUNC); 1631 else 1632 status = qlcnic_alloc_mbx_args(&cmd, adapter, 1633 QLCNIC_CMD_STOP_NIC_FUNC); 1634 1635 if (status) 1636 return; 1637 1638 cmd.req.arg[1] = QLC_REGISTER_LB_IDC | QLC_INIT_FW_RESOURCES; 1639 1640 if (adapter->dcb) 1641 cmd.req.arg[1] |= QLC_REGISTER_DCB_AEN; 1642 1643 status = qlcnic_issue_cmd(adapter, &cmd); 1644 if (status) 1645 dev_err(&adapter->pdev->dev, 1646 "Failed to %s in NIC IDC function event.\n", 1647 (enable ? "register" : "unregister")); 1648 1649 qlcnic_free_mbx_args(&cmd); 1650 } 1651 1652 static int qlcnic_83xx_set_port_config(struct qlcnic_adapter *adapter) 1653 { 1654 struct qlcnic_cmd_args cmd; 1655 int err; 1656 1657 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_SET_PORT_CONFIG); 1658 if (err) 1659 return err; 1660 1661 cmd.req.arg[1] = adapter->ahw->port_config; 1662 err = qlcnic_issue_cmd(adapter, &cmd); 1663 if (err) 1664 dev_info(&adapter->pdev->dev, "Set Port Config failed.\n"); 1665 qlcnic_free_mbx_args(&cmd); 1666 return err; 1667 } 1668 1669 static int qlcnic_83xx_get_port_config(struct qlcnic_adapter *adapter) 1670 { 1671 struct qlcnic_cmd_args cmd; 1672 int err; 1673 1674 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_PORT_CONFIG); 1675 if (err) 1676 return err; 1677 1678 err = qlcnic_issue_cmd(adapter, &cmd); 1679 if (err) 1680 dev_info(&adapter->pdev->dev, "Get Port config failed\n"); 1681 else 1682 adapter->ahw->port_config = cmd.rsp.arg[1]; 1683 qlcnic_free_mbx_args(&cmd); 1684 return err; 1685 } 1686 1687 int qlcnic_83xx_setup_link_event(struct qlcnic_adapter *adapter, int enable) 1688 { 1689 int err; 1690 u32 temp; 1691 struct qlcnic_cmd_args cmd; 1692 1693 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_LINK_EVENT); 1694 if (err) 1695 return err; 1696 1697 temp = adapter->recv_ctx->context_id << 16; 1698 cmd.req.arg[1] = (enable ? 1 : 0) | BIT_8 | temp; 1699 err = qlcnic_issue_cmd(adapter, &cmd); 1700 if (err) 1701 dev_info(&adapter->pdev->dev, 1702 "Setup linkevent mailbox failed\n"); 1703 qlcnic_free_mbx_args(&cmd); 1704 return err; 1705 } 1706 1707 static void qlcnic_83xx_set_interface_id_promisc(struct qlcnic_adapter *adapter, 1708 u32 *interface_id) 1709 { 1710 if (qlcnic_sriov_pf_check(adapter)) { 1711 qlcnic_alloc_lb_filters_mem(adapter); 1712 qlcnic_pf_set_interface_id_promisc(adapter, interface_id); 1713 adapter->rx_mac_learn = true; 1714 } else { 1715 if (!qlcnic_sriov_vf_check(adapter)) 1716 *interface_id = adapter->recv_ctx->context_id << 16; 1717 } 1718 } 1719 1720 int qlcnic_83xx_nic_set_promisc(struct qlcnic_adapter *adapter, u32 mode) 1721 { 1722 struct qlcnic_cmd_args *cmd = NULL; 1723 u32 temp = 0; 1724 int err; 1725 1726 if (adapter->recv_ctx->state == QLCNIC_HOST_CTX_STATE_FREED) 1727 return -EIO; 1728 1729 cmd = kzalloc(sizeof(*cmd), GFP_ATOMIC); 1730 if (!cmd) 1731 return -ENOMEM; 1732 1733 err = qlcnic_alloc_mbx_args(cmd, adapter, 1734 QLCNIC_CMD_CONFIGURE_MAC_RX_MODE); 1735 if (err) 1736 goto out; 1737 1738 cmd->type = QLC_83XX_MBX_CMD_NO_WAIT; 1739 qlcnic_83xx_set_interface_id_promisc(adapter, &temp); 1740 1741 if (qlcnic_84xx_check(adapter) && qlcnic_sriov_pf_check(adapter)) 1742 mode = VPORT_MISS_MODE_ACCEPT_ALL; 1743 1744 cmd->req.arg[1] = mode | temp; 1745 err = qlcnic_issue_cmd(adapter, cmd); 1746 if (!err) 1747 return err; 1748 1749 qlcnic_free_mbx_args(cmd); 1750 1751 out: 1752 kfree(cmd); 1753 return err; 1754 } 1755 1756 int qlcnic_83xx_loopback_test(struct net_device *netdev, u8 mode) 1757 { 1758 struct qlcnic_adapter *adapter = netdev_priv(netdev); 1759 struct qlcnic_hardware_context *ahw = adapter->ahw; 1760 u8 drv_sds_rings = adapter->drv_sds_rings; 1761 u8 drv_tx_rings = adapter->drv_tx_rings; 1762 int ret = 0, loop = 0; 1763 1764 if (ahw->op_mode == QLCNIC_NON_PRIV_FUNC) { 1765 netdev_warn(netdev, 1766 "Loopback test not supported in non privileged mode\n"); 1767 return -ENOTSUPP; 1768 } 1769 1770 if (test_bit(__QLCNIC_RESETTING, &adapter->state)) { 1771 netdev_info(netdev, "Device is resetting\n"); 1772 return -EBUSY; 1773 } 1774 1775 if (qlcnic_get_diag_lock(adapter)) { 1776 netdev_info(netdev, "Device is in diagnostics mode\n"); 1777 return -EBUSY; 1778 } 1779 1780 netdev_info(netdev, "%s loopback test in progress\n", 1781 mode == QLCNIC_ILB_MODE ? "internal" : "external"); 1782 1783 ret = qlcnic_83xx_diag_alloc_res(netdev, QLCNIC_LOOPBACK_TEST, 1784 drv_sds_rings); 1785 if (ret) 1786 goto fail_diag_alloc; 1787 1788 ret = qlcnic_83xx_set_lb_mode(adapter, mode); 1789 if (ret) 1790 goto free_diag_res; 1791 1792 /* Poll for link up event before running traffic */ 1793 do { 1794 msleep(QLC_83XX_LB_MSLEEP_COUNT); 1795 1796 if (test_bit(__QLCNIC_RESETTING, &adapter->state)) { 1797 netdev_info(netdev, 1798 "Device is resetting, free LB test resources\n"); 1799 ret = -EBUSY; 1800 goto free_diag_res; 1801 } 1802 if (loop++ > QLC_83XX_LB_WAIT_COUNT) { 1803 netdev_info(netdev, 1804 "Firmware didn't sent link up event to loopback request\n"); 1805 ret = -ETIMEDOUT; 1806 qlcnic_83xx_clear_lb_mode(adapter, mode); 1807 goto free_diag_res; 1808 } 1809 } while ((adapter->ahw->linkup && ahw->has_link_events) != 1); 1810 1811 ret = qlcnic_do_lb_test(adapter, mode); 1812 1813 qlcnic_83xx_clear_lb_mode(adapter, mode); 1814 1815 free_diag_res: 1816 qlcnic_83xx_diag_free_res(netdev, drv_sds_rings); 1817 1818 fail_diag_alloc: 1819 adapter->drv_sds_rings = drv_sds_rings; 1820 adapter->drv_tx_rings = drv_tx_rings; 1821 qlcnic_release_diag_lock(adapter); 1822 return ret; 1823 } 1824 1825 static void qlcnic_extend_lb_idc_cmpltn_wait(struct qlcnic_adapter *adapter, 1826 u32 *max_wait_count) 1827 { 1828 struct qlcnic_hardware_context *ahw = adapter->ahw; 1829 int temp; 1830 1831 netdev_info(adapter->netdev, "Received loopback IDC time extend event for 0x%x seconds\n", 1832 ahw->extend_lb_time); 1833 temp = ahw->extend_lb_time * 1000; 1834 *max_wait_count += temp / QLC_83XX_LB_MSLEEP_COUNT; 1835 ahw->extend_lb_time = 0; 1836 } 1837 1838 static int qlcnic_83xx_set_lb_mode(struct qlcnic_adapter *adapter, u8 mode) 1839 { 1840 struct qlcnic_hardware_context *ahw = adapter->ahw; 1841 struct net_device *netdev = adapter->netdev; 1842 u32 config, max_wait_count; 1843 int status = 0, loop = 0; 1844 1845 ahw->extend_lb_time = 0; 1846 max_wait_count = QLC_83XX_LB_WAIT_COUNT; 1847 status = qlcnic_83xx_get_port_config(adapter); 1848 if (status) 1849 return status; 1850 1851 config = ahw->port_config; 1852 1853 /* Check if port is already in loopback mode */ 1854 if ((config & QLC_83XX_CFG_LOOPBACK_HSS) || 1855 (config & QLC_83XX_CFG_LOOPBACK_EXT)) { 1856 netdev_err(netdev, 1857 "Port already in Loopback mode.\n"); 1858 return -EINPROGRESS; 1859 } 1860 1861 set_bit(QLC_83XX_IDC_COMP_AEN, &ahw->idc.status); 1862 1863 if (mode == QLCNIC_ILB_MODE) 1864 ahw->port_config |= QLC_83XX_CFG_LOOPBACK_HSS; 1865 if (mode == QLCNIC_ELB_MODE) 1866 ahw->port_config |= QLC_83XX_CFG_LOOPBACK_EXT; 1867 1868 status = qlcnic_83xx_set_port_config(adapter); 1869 if (status) { 1870 netdev_err(netdev, 1871 "Failed to Set Loopback Mode = 0x%x.\n", 1872 ahw->port_config); 1873 ahw->port_config = config; 1874 clear_bit(QLC_83XX_IDC_COMP_AEN, &ahw->idc.status); 1875 return status; 1876 } 1877 1878 /* Wait for Link and IDC Completion AEN */ 1879 do { 1880 msleep(QLC_83XX_LB_MSLEEP_COUNT); 1881 1882 if (test_bit(__QLCNIC_RESETTING, &adapter->state)) { 1883 netdev_info(netdev, 1884 "Device is resetting, free LB test resources\n"); 1885 clear_bit(QLC_83XX_IDC_COMP_AEN, &ahw->idc.status); 1886 return -EBUSY; 1887 } 1888 1889 if (ahw->extend_lb_time) 1890 qlcnic_extend_lb_idc_cmpltn_wait(adapter, 1891 &max_wait_count); 1892 1893 if (loop++ > max_wait_count) { 1894 netdev_err(netdev, "%s: Did not receive loopback IDC completion AEN\n", 1895 __func__); 1896 clear_bit(QLC_83XX_IDC_COMP_AEN, &ahw->idc.status); 1897 qlcnic_83xx_clear_lb_mode(adapter, mode); 1898 return -ETIMEDOUT; 1899 } 1900 } while (test_bit(QLC_83XX_IDC_COMP_AEN, &ahw->idc.status)); 1901 1902 qlcnic_sre_macaddr_change(adapter, adapter->mac_addr, 0, 1903 QLCNIC_MAC_ADD); 1904 return status; 1905 } 1906 1907 static int qlcnic_83xx_clear_lb_mode(struct qlcnic_adapter *adapter, u8 mode) 1908 { 1909 struct qlcnic_hardware_context *ahw = adapter->ahw; 1910 u32 config = ahw->port_config, max_wait_count; 1911 struct net_device *netdev = adapter->netdev; 1912 int status = 0, loop = 0; 1913 1914 ahw->extend_lb_time = 0; 1915 max_wait_count = QLC_83XX_LB_WAIT_COUNT; 1916 set_bit(QLC_83XX_IDC_COMP_AEN, &ahw->idc.status); 1917 if (mode == QLCNIC_ILB_MODE) 1918 ahw->port_config &= ~QLC_83XX_CFG_LOOPBACK_HSS; 1919 if (mode == QLCNIC_ELB_MODE) 1920 ahw->port_config &= ~QLC_83XX_CFG_LOOPBACK_EXT; 1921 1922 status = qlcnic_83xx_set_port_config(adapter); 1923 if (status) { 1924 netdev_err(netdev, 1925 "Failed to Clear Loopback Mode = 0x%x.\n", 1926 ahw->port_config); 1927 ahw->port_config = config; 1928 clear_bit(QLC_83XX_IDC_COMP_AEN, &ahw->idc.status); 1929 return status; 1930 } 1931 1932 /* Wait for Link and IDC Completion AEN */ 1933 do { 1934 msleep(QLC_83XX_LB_MSLEEP_COUNT); 1935 1936 if (test_bit(__QLCNIC_RESETTING, &adapter->state)) { 1937 netdev_info(netdev, 1938 "Device is resetting, free LB test resources\n"); 1939 clear_bit(QLC_83XX_IDC_COMP_AEN, &ahw->idc.status); 1940 return -EBUSY; 1941 } 1942 1943 if (ahw->extend_lb_time) 1944 qlcnic_extend_lb_idc_cmpltn_wait(adapter, 1945 &max_wait_count); 1946 1947 if (loop++ > max_wait_count) { 1948 netdev_err(netdev, "%s: Did not receive loopback IDC completion AEN\n", 1949 __func__); 1950 clear_bit(QLC_83XX_IDC_COMP_AEN, &ahw->idc.status); 1951 return -ETIMEDOUT; 1952 } 1953 } while (test_bit(QLC_83XX_IDC_COMP_AEN, &ahw->idc.status)); 1954 1955 qlcnic_sre_macaddr_change(adapter, adapter->mac_addr, 0, 1956 QLCNIC_MAC_DEL); 1957 return status; 1958 } 1959 1960 static void qlcnic_83xx_set_interface_id_ipaddr(struct qlcnic_adapter *adapter, 1961 u32 *interface_id) 1962 { 1963 if (qlcnic_sriov_pf_check(adapter)) { 1964 qlcnic_pf_set_interface_id_ipaddr(adapter, interface_id); 1965 } else { 1966 if (!qlcnic_sriov_vf_check(adapter)) 1967 *interface_id = adapter->recv_ctx->context_id << 16; 1968 } 1969 } 1970 1971 void qlcnic_83xx_config_ipaddr(struct qlcnic_adapter *adapter, __be32 ip, 1972 int mode) 1973 { 1974 int err; 1975 u32 temp = 0, temp_ip; 1976 struct qlcnic_cmd_args cmd; 1977 1978 err = qlcnic_alloc_mbx_args(&cmd, adapter, 1979 QLCNIC_CMD_CONFIGURE_IP_ADDR); 1980 if (err) 1981 return; 1982 1983 qlcnic_83xx_set_interface_id_ipaddr(adapter, &temp); 1984 1985 if (mode == QLCNIC_IP_UP) 1986 cmd.req.arg[1] = 1 | temp; 1987 else 1988 cmd.req.arg[1] = 2 | temp; 1989 1990 /* 1991 * Adapter needs IP address in network byte order. 1992 * But hardware mailbox registers go through writel(), hence IP address 1993 * gets swapped on big endian architecture. 1994 * To negate swapping of writel() on big endian architecture 1995 * use swab32(value). 1996 */ 1997 1998 temp_ip = swab32(ntohl(ip)); 1999 memcpy(&cmd.req.arg[2], &temp_ip, sizeof(u32)); 2000 err = qlcnic_issue_cmd(adapter, &cmd); 2001 if (err != QLCNIC_RCODE_SUCCESS) 2002 dev_err(&adapter->netdev->dev, 2003 "could not notify %s IP 0x%x request\n", 2004 (mode == QLCNIC_IP_UP) ? "Add" : "Remove", ip); 2005 2006 qlcnic_free_mbx_args(&cmd); 2007 } 2008 2009 int qlcnic_83xx_config_hw_lro(struct qlcnic_adapter *adapter, int mode) 2010 { 2011 int err; 2012 u32 temp, arg1; 2013 struct qlcnic_cmd_args cmd; 2014 int lro_bit_mask; 2015 2016 lro_bit_mask = (mode ? (BIT_0 | BIT_1 | BIT_2 | BIT_3) : 0); 2017 2018 if (adapter->recv_ctx->state == QLCNIC_HOST_CTX_STATE_FREED) 2019 return 0; 2020 2021 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CONFIGURE_HW_LRO); 2022 if (err) 2023 return err; 2024 2025 temp = adapter->recv_ctx->context_id << 16; 2026 arg1 = lro_bit_mask | temp; 2027 cmd.req.arg[1] = arg1; 2028 2029 err = qlcnic_issue_cmd(adapter, &cmd); 2030 if (err) 2031 dev_info(&adapter->pdev->dev, "LRO config failed\n"); 2032 qlcnic_free_mbx_args(&cmd); 2033 2034 return err; 2035 } 2036 2037 int qlcnic_83xx_config_rss(struct qlcnic_adapter *adapter, int enable) 2038 { 2039 int err; 2040 u32 word; 2041 struct qlcnic_cmd_args cmd; 2042 const u64 key[] = { 0xbeac01fa6a42b73bULL, 0x8030f20c77cb2da3ULL, 2043 0xae7b30b4d0ca2bcbULL, 0x43a38fb04167253dULL, 2044 0x255b0ec26d5a56daULL }; 2045 2046 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CONFIGURE_RSS); 2047 if (err) 2048 return err; 2049 /* 2050 * RSS request: 2051 * bits 3-0: Rsvd 2052 * 5-4: hash_type_ipv4 2053 * 7-6: hash_type_ipv6 2054 * 8: enable 2055 * 9: use indirection table 2056 * 16-31: indirection table mask 2057 */ 2058 word = ((u32)(RSS_HASHTYPE_IP_TCP & 0x3) << 4) | 2059 ((u32)(RSS_HASHTYPE_IP_TCP & 0x3) << 6) | 2060 ((u32)(enable & 0x1) << 8) | 2061 ((0x7ULL) << 16); 2062 cmd.req.arg[1] = (adapter->recv_ctx->context_id); 2063 cmd.req.arg[2] = word; 2064 memcpy(&cmd.req.arg[4], key, sizeof(key)); 2065 2066 err = qlcnic_issue_cmd(adapter, &cmd); 2067 2068 if (err) 2069 dev_info(&adapter->pdev->dev, "RSS config failed\n"); 2070 qlcnic_free_mbx_args(&cmd); 2071 2072 return err; 2073 2074 } 2075 2076 static void qlcnic_83xx_set_interface_id_macaddr(struct qlcnic_adapter *adapter, 2077 u32 *interface_id) 2078 { 2079 if (qlcnic_sriov_pf_check(adapter)) { 2080 qlcnic_pf_set_interface_id_macaddr(adapter, interface_id); 2081 } else { 2082 if (!qlcnic_sriov_vf_check(adapter)) 2083 *interface_id = adapter->recv_ctx->context_id << 16; 2084 } 2085 } 2086 2087 int qlcnic_83xx_sre_macaddr_change(struct qlcnic_adapter *adapter, u8 *addr, 2088 u16 vlan_id, u8 op) 2089 { 2090 struct qlcnic_cmd_args *cmd = NULL; 2091 struct qlcnic_macvlan_mbx mv; 2092 u32 *buf, temp = 0; 2093 int err; 2094 2095 if (adapter->recv_ctx->state == QLCNIC_HOST_CTX_STATE_FREED) 2096 return -EIO; 2097 2098 cmd = kzalloc(sizeof(*cmd), GFP_ATOMIC); 2099 if (!cmd) 2100 return -ENOMEM; 2101 2102 err = qlcnic_alloc_mbx_args(cmd, adapter, QLCNIC_CMD_CONFIG_MAC_VLAN); 2103 if (err) 2104 goto out; 2105 2106 cmd->type = QLC_83XX_MBX_CMD_NO_WAIT; 2107 2108 if (vlan_id) 2109 op = (op == QLCNIC_MAC_ADD || op == QLCNIC_MAC_VLAN_ADD) ? 2110 QLCNIC_MAC_VLAN_ADD : QLCNIC_MAC_VLAN_DEL; 2111 2112 cmd->req.arg[1] = op | (1 << 8); 2113 qlcnic_83xx_set_interface_id_macaddr(adapter, &temp); 2114 cmd->req.arg[1] |= temp; 2115 mv.vlan = vlan_id; 2116 mv.mac_addr0 = addr[0]; 2117 mv.mac_addr1 = addr[1]; 2118 mv.mac_addr2 = addr[2]; 2119 mv.mac_addr3 = addr[3]; 2120 mv.mac_addr4 = addr[4]; 2121 mv.mac_addr5 = addr[5]; 2122 buf = &cmd->req.arg[2]; 2123 memcpy(buf, &mv, sizeof(struct qlcnic_macvlan_mbx)); 2124 err = qlcnic_issue_cmd(adapter, cmd); 2125 if (!err) 2126 return err; 2127 2128 qlcnic_free_mbx_args(cmd); 2129 out: 2130 kfree(cmd); 2131 return err; 2132 } 2133 2134 void qlcnic_83xx_change_l2_filter(struct qlcnic_adapter *adapter, u64 *addr, 2135 u16 vlan_id) 2136 { 2137 u8 mac[ETH_ALEN]; 2138 memcpy(&mac, addr, ETH_ALEN); 2139 qlcnic_83xx_sre_macaddr_change(adapter, mac, vlan_id, QLCNIC_MAC_ADD); 2140 } 2141 2142 static void qlcnic_83xx_configure_mac(struct qlcnic_adapter *adapter, u8 *mac, 2143 u8 type, struct qlcnic_cmd_args *cmd) 2144 { 2145 switch (type) { 2146 case QLCNIC_SET_STATION_MAC: 2147 case QLCNIC_SET_FAC_DEF_MAC: 2148 memcpy(&cmd->req.arg[2], mac, sizeof(u32)); 2149 memcpy(&cmd->req.arg[3], &mac[4], sizeof(u16)); 2150 break; 2151 } 2152 cmd->req.arg[1] = type; 2153 } 2154 2155 int qlcnic_83xx_get_mac_address(struct qlcnic_adapter *adapter, u8 *mac, 2156 u8 function) 2157 { 2158 int err, i; 2159 struct qlcnic_cmd_args cmd; 2160 u32 mac_low, mac_high; 2161 2162 function = 0; 2163 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_MAC_ADDRESS); 2164 if (err) 2165 return err; 2166 2167 qlcnic_83xx_configure_mac(adapter, mac, QLCNIC_GET_CURRENT_MAC, &cmd); 2168 err = qlcnic_issue_cmd(adapter, &cmd); 2169 2170 if (err == QLCNIC_RCODE_SUCCESS) { 2171 mac_low = cmd.rsp.arg[1]; 2172 mac_high = cmd.rsp.arg[2]; 2173 2174 for (i = 0; i < 2; i++) 2175 mac[i] = (u8) (mac_high >> ((1 - i) * 8)); 2176 for (i = 2; i < 6; i++) 2177 mac[i] = (u8) (mac_low >> ((5 - i) * 8)); 2178 } else { 2179 dev_err(&adapter->pdev->dev, "Failed to get mac address%d\n", 2180 err); 2181 err = -EIO; 2182 } 2183 qlcnic_free_mbx_args(&cmd); 2184 return err; 2185 } 2186 2187 static int qlcnic_83xx_set_rx_intr_coal(struct qlcnic_adapter *adapter) 2188 { 2189 struct qlcnic_nic_intr_coalesce *coal = &adapter->ahw->coal; 2190 struct qlcnic_cmd_args cmd; 2191 u16 temp; 2192 int err; 2193 2194 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CONFIG_INTR_COAL); 2195 if (err) 2196 return err; 2197 2198 temp = adapter->recv_ctx->context_id; 2199 cmd.req.arg[1] = QLCNIC_INTR_COAL_TYPE_RX | temp << 16; 2200 temp = coal->rx_time_us; 2201 cmd.req.arg[2] = coal->rx_packets | temp << 16; 2202 cmd.req.arg[3] = coal->flag; 2203 2204 err = qlcnic_issue_cmd(adapter, &cmd); 2205 if (err != QLCNIC_RCODE_SUCCESS) 2206 netdev_err(adapter->netdev, 2207 "failed to set interrupt coalescing parameters\n"); 2208 2209 qlcnic_free_mbx_args(&cmd); 2210 2211 return err; 2212 } 2213 2214 static int qlcnic_83xx_set_tx_intr_coal(struct qlcnic_adapter *adapter) 2215 { 2216 struct qlcnic_nic_intr_coalesce *coal = &adapter->ahw->coal; 2217 struct qlcnic_cmd_args cmd; 2218 u16 temp; 2219 int err; 2220 2221 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CONFIG_INTR_COAL); 2222 if (err) 2223 return err; 2224 2225 temp = adapter->tx_ring->ctx_id; 2226 cmd.req.arg[1] = QLCNIC_INTR_COAL_TYPE_TX | temp << 16; 2227 temp = coal->tx_time_us; 2228 cmd.req.arg[2] = coal->tx_packets | temp << 16; 2229 cmd.req.arg[3] = coal->flag; 2230 2231 err = qlcnic_issue_cmd(adapter, &cmd); 2232 if (err != QLCNIC_RCODE_SUCCESS) 2233 netdev_err(adapter->netdev, 2234 "failed to set interrupt coalescing parameters\n"); 2235 2236 qlcnic_free_mbx_args(&cmd); 2237 2238 return err; 2239 } 2240 2241 int qlcnic_83xx_set_rx_tx_intr_coal(struct qlcnic_adapter *adapter) 2242 { 2243 int err = 0; 2244 2245 err = qlcnic_83xx_set_rx_intr_coal(adapter); 2246 if (err) 2247 netdev_err(adapter->netdev, 2248 "failed to set Rx coalescing parameters\n"); 2249 2250 err = qlcnic_83xx_set_tx_intr_coal(adapter); 2251 if (err) 2252 netdev_err(adapter->netdev, 2253 "failed to set Tx coalescing parameters\n"); 2254 2255 return err; 2256 } 2257 2258 int qlcnic_83xx_config_intr_coal(struct qlcnic_adapter *adapter, 2259 struct ethtool_coalesce *ethcoal) 2260 { 2261 struct qlcnic_nic_intr_coalesce *coal = &adapter->ahw->coal; 2262 u32 rx_coalesce_usecs, rx_max_frames; 2263 u32 tx_coalesce_usecs, tx_max_frames; 2264 int err; 2265 2266 if (adapter->recv_ctx->state == QLCNIC_HOST_CTX_STATE_FREED) 2267 return -EIO; 2268 2269 tx_coalesce_usecs = ethcoal->tx_coalesce_usecs; 2270 tx_max_frames = ethcoal->tx_max_coalesced_frames; 2271 rx_coalesce_usecs = ethcoal->rx_coalesce_usecs; 2272 rx_max_frames = ethcoal->rx_max_coalesced_frames; 2273 coal->flag = QLCNIC_INTR_DEFAULT; 2274 2275 if ((coal->rx_time_us == rx_coalesce_usecs) && 2276 (coal->rx_packets == rx_max_frames)) { 2277 coal->type = QLCNIC_INTR_COAL_TYPE_TX; 2278 coal->tx_time_us = tx_coalesce_usecs; 2279 coal->tx_packets = tx_max_frames; 2280 } else if ((coal->tx_time_us == tx_coalesce_usecs) && 2281 (coal->tx_packets == tx_max_frames)) { 2282 coal->type = QLCNIC_INTR_COAL_TYPE_RX; 2283 coal->rx_time_us = rx_coalesce_usecs; 2284 coal->rx_packets = rx_max_frames; 2285 } else { 2286 coal->type = QLCNIC_INTR_COAL_TYPE_RX_TX; 2287 coal->rx_time_us = rx_coalesce_usecs; 2288 coal->rx_packets = rx_max_frames; 2289 coal->tx_time_us = tx_coalesce_usecs; 2290 coal->tx_packets = tx_max_frames; 2291 } 2292 2293 switch (coal->type) { 2294 case QLCNIC_INTR_COAL_TYPE_RX: 2295 err = qlcnic_83xx_set_rx_intr_coal(adapter); 2296 break; 2297 case QLCNIC_INTR_COAL_TYPE_TX: 2298 err = qlcnic_83xx_set_tx_intr_coal(adapter); 2299 break; 2300 case QLCNIC_INTR_COAL_TYPE_RX_TX: 2301 err = qlcnic_83xx_set_rx_tx_intr_coal(adapter); 2302 break; 2303 default: 2304 err = -EINVAL; 2305 netdev_err(adapter->netdev, 2306 "Invalid Interrupt coalescing type\n"); 2307 break; 2308 } 2309 2310 return err; 2311 } 2312 2313 static void qlcnic_83xx_handle_link_aen(struct qlcnic_adapter *adapter, 2314 u32 data[]) 2315 { 2316 struct qlcnic_hardware_context *ahw = adapter->ahw; 2317 u8 link_status, duplex; 2318 /* link speed */ 2319 link_status = LSB(data[3]) & 1; 2320 if (link_status) { 2321 ahw->link_speed = MSW(data[2]); 2322 duplex = LSB(MSW(data[3])); 2323 if (duplex) 2324 ahw->link_duplex = DUPLEX_FULL; 2325 else 2326 ahw->link_duplex = DUPLEX_HALF; 2327 } else { 2328 ahw->link_speed = SPEED_UNKNOWN; 2329 ahw->link_duplex = DUPLEX_UNKNOWN; 2330 } 2331 2332 ahw->link_autoneg = MSB(MSW(data[3])); 2333 ahw->module_type = MSB(LSW(data[3])); 2334 ahw->has_link_events = 1; 2335 ahw->lb_mode = data[4] & QLCNIC_LB_MODE_MASK; 2336 qlcnic_advert_link_change(adapter, link_status); 2337 } 2338 2339 static irqreturn_t qlcnic_83xx_handle_aen(int irq, void *data) 2340 { 2341 u32 mask, resp, event, rsp_status = QLC_83XX_MBX_RESPONSE_ARRIVED; 2342 struct qlcnic_adapter *adapter = data; 2343 struct qlcnic_mailbox *mbx; 2344 unsigned long flags; 2345 2346 mbx = adapter->ahw->mailbox; 2347 spin_lock_irqsave(&mbx->aen_lock, flags); 2348 resp = QLCRDX(adapter->ahw, QLCNIC_FW_MBX_CTRL); 2349 if (!(resp & QLCNIC_SET_OWNER)) 2350 goto out; 2351 2352 event = readl(QLCNIC_MBX_FW(adapter->ahw, 0)); 2353 if (event & QLCNIC_MBX_ASYNC_EVENT) { 2354 __qlcnic_83xx_process_aen(adapter); 2355 } else { 2356 if (mbx->rsp_status != rsp_status) 2357 qlcnic_83xx_notify_mbx_response(mbx); 2358 else 2359 adapter->stats.mbx_spurious_intr++; 2360 } 2361 2362 out: 2363 mask = QLCRDX(adapter->ahw, QLCNIC_DEF_INT_MASK); 2364 writel(0, adapter->ahw->pci_base0 + mask); 2365 spin_unlock_irqrestore(&mbx->aen_lock, flags); 2366 return IRQ_HANDLED; 2367 } 2368 2369 int qlcnic_83xx_set_nic_info(struct qlcnic_adapter *adapter, 2370 struct qlcnic_info *nic) 2371 { 2372 int i, err = -EIO; 2373 struct qlcnic_cmd_args cmd; 2374 2375 if (adapter->ahw->op_mode != QLCNIC_MGMT_FUNC) { 2376 dev_err(&adapter->pdev->dev, 2377 "%s: Error, invoked by non management func\n", 2378 __func__); 2379 return err; 2380 } 2381 2382 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_SET_NIC_INFO); 2383 if (err) 2384 return err; 2385 2386 cmd.req.arg[1] = (nic->pci_func << 16); 2387 cmd.req.arg[2] = 0x1 << 16; 2388 cmd.req.arg[3] = nic->phys_port | (nic->switch_mode << 16); 2389 cmd.req.arg[4] = nic->capabilities; 2390 cmd.req.arg[5] = (nic->max_mac_filters & 0xFF) | ((nic->max_mtu) << 16); 2391 cmd.req.arg[6] = (nic->max_tx_ques) | ((nic->max_rx_ques) << 16); 2392 cmd.req.arg[7] = (nic->min_tx_bw) | ((nic->max_tx_bw) << 16); 2393 for (i = 8; i < 32; i++) 2394 cmd.req.arg[i] = 0; 2395 2396 err = qlcnic_issue_cmd(adapter, &cmd); 2397 2398 if (err != QLCNIC_RCODE_SUCCESS) { 2399 dev_err(&adapter->pdev->dev, "Failed to set nic info%d\n", 2400 err); 2401 err = -EIO; 2402 } 2403 2404 qlcnic_free_mbx_args(&cmd); 2405 2406 return err; 2407 } 2408 2409 int qlcnic_83xx_get_nic_info(struct qlcnic_adapter *adapter, 2410 struct qlcnic_info *npar_info, u8 func_id) 2411 { 2412 int err; 2413 u32 temp; 2414 u8 op = 0; 2415 struct qlcnic_cmd_args cmd; 2416 struct qlcnic_hardware_context *ahw = adapter->ahw; 2417 2418 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_NIC_INFO); 2419 if (err) 2420 return err; 2421 2422 if (func_id != ahw->pci_func) { 2423 temp = func_id << 16; 2424 cmd.req.arg[1] = op | BIT_31 | temp; 2425 } else { 2426 cmd.req.arg[1] = ahw->pci_func << 16; 2427 } 2428 err = qlcnic_issue_cmd(adapter, &cmd); 2429 if (err) { 2430 dev_info(&adapter->pdev->dev, 2431 "Failed to get nic info %d\n", err); 2432 goto out; 2433 } 2434 2435 npar_info->op_type = cmd.rsp.arg[1]; 2436 npar_info->pci_func = cmd.rsp.arg[2] & 0xFFFF; 2437 npar_info->op_mode = (cmd.rsp.arg[2] & 0xFFFF0000) >> 16; 2438 npar_info->phys_port = cmd.rsp.arg[3] & 0xFFFF; 2439 npar_info->switch_mode = (cmd.rsp.arg[3] & 0xFFFF0000) >> 16; 2440 npar_info->capabilities = cmd.rsp.arg[4]; 2441 npar_info->max_mac_filters = cmd.rsp.arg[5] & 0xFF; 2442 npar_info->max_mtu = (cmd.rsp.arg[5] & 0xFFFF0000) >> 16; 2443 npar_info->max_tx_ques = cmd.rsp.arg[6] & 0xFFFF; 2444 npar_info->max_rx_ques = (cmd.rsp.arg[6] & 0xFFFF0000) >> 16; 2445 npar_info->min_tx_bw = cmd.rsp.arg[7] & 0xFFFF; 2446 npar_info->max_tx_bw = (cmd.rsp.arg[7] & 0xFFFF0000) >> 16; 2447 if (cmd.rsp.arg[8] & 0x1) 2448 npar_info->max_bw_reg_offset = (cmd.rsp.arg[8] & 0x7FFE) >> 1; 2449 if (cmd.rsp.arg[8] & 0x10000) { 2450 temp = (cmd.rsp.arg[8] & 0x7FFE0000) >> 17; 2451 npar_info->max_linkspeed_reg_offset = temp; 2452 } 2453 2454 memcpy(ahw->extra_capability, &cmd.rsp.arg[16], 2455 sizeof(ahw->extra_capability)); 2456 2457 out: 2458 qlcnic_free_mbx_args(&cmd); 2459 return err; 2460 } 2461 2462 int qlcnic_get_pci_func_type(struct qlcnic_adapter *adapter, u16 type, 2463 u16 *nic, u16 *fcoe, u16 *iscsi) 2464 { 2465 struct device *dev = &adapter->pdev->dev; 2466 int err = 0; 2467 2468 switch (type) { 2469 case QLCNIC_TYPE_NIC: 2470 (*nic)++; 2471 break; 2472 case QLCNIC_TYPE_FCOE: 2473 (*fcoe)++; 2474 break; 2475 case QLCNIC_TYPE_ISCSI: 2476 (*iscsi)++; 2477 break; 2478 default: 2479 dev_err(dev, "%s: Unknown PCI type[%x]\n", 2480 __func__, type); 2481 err = -EIO; 2482 } 2483 2484 return err; 2485 } 2486 2487 int qlcnic_83xx_get_pci_info(struct qlcnic_adapter *adapter, 2488 struct qlcnic_pci_info *pci_info) 2489 { 2490 struct qlcnic_hardware_context *ahw = adapter->ahw; 2491 struct device *dev = &adapter->pdev->dev; 2492 u16 nic = 0, fcoe = 0, iscsi = 0; 2493 struct qlcnic_cmd_args cmd; 2494 int i, err = 0, j = 0; 2495 u32 temp; 2496 2497 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_PCI_INFO); 2498 if (err) 2499 return err; 2500 2501 err = qlcnic_issue_cmd(adapter, &cmd); 2502 2503 ahw->total_nic_func = 0; 2504 if (err == QLCNIC_RCODE_SUCCESS) { 2505 ahw->max_pci_func = cmd.rsp.arg[1] & 0xFF; 2506 for (i = 2, j = 0; j < ahw->max_vnic_func; j++, pci_info++) { 2507 pci_info->id = cmd.rsp.arg[i] & 0xFFFF; 2508 pci_info->active = (cmd.rsp.arg[i] & 0xFFFF0000) >> 16; 2509 i++; 2510 if (!pci_info->active) { 2511 i += QLC_SKIP_INACTIVE_PCI_REGS; 2512 continue; 2513 } 2514 pci_info->type = cmd.rsp.arg[i] & 0xFFFF; 2515 err = qlcnic_get_pci_func_type(adapter, pci_info->type, 2516 &nic, &fcoe, &iscsi); 2517 temp = (cmd.rsp.arg[i] & 0xFFFF0000) >> 16; 2518 pci_info->default_port = temp; 2519 i++; 2520 pci_info->tx_min_bw = cmd.rsp.arg[i] & 0xFFFF; 2521 temp = (cmd.rsp.arg[i] & 0xFFFF0000) >> 16; 2522 pci_info->tx_max_bw = temp; 2523 i = i + 2; 2524 memcpy(pci_info->mac, &cmd.rsp.arg[i], ETH_ALEN - 2); 2525 i++; 2526 memcpy(pci_info->mac + sizeof(u32), &cmd.rsp.arg[i], 2); 2527 i = i + 3; 2528 } 2529 } else { 2530 dev_err(dev, "Failed to get PCI Info, error = %d\n", err); 2531 err = -EIO; 2532 } 2533 2534 ahw->total_nic_func = nic; 2535 ahw->total_pci_func = nic + fcoe + iscsi; 2536 if (ahw->total_nic_func == 0 || ahw->total_pci_func == 0) { 2537 dev_err(dev, "%s: Invalid function count: total nic func[%x], total pci func[%x]\n", 2538 __func__, ahw->total_nic_func, ahw->total_pci_func); 2539 err = -EIO; 2540 } 2541 qlcnic_free_mbx_args(&cmd); 2542 2543 return err; 2544 } 2545 2546 int qlcnic_83xx_config_intrpt(struct qlcnic_adapter *adapter, bool op_type) 2547 { 2548 int i, index, err; 2549 u8 max_ints; 2550 u32 val, temp, type; 2551 struct qlcnic_cmd_args cmd; 2552 2553 max_ints = adapter->ahw->num_msix - 1; 2554 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CONFIG_INTRPT); 2555 if (err) 2556 return err; 2557 2558 cmd.req.arg[1] = max_ints; 2559 2560 if (qlcnic_sriov_vf_check(adapter)) 2561 cmd.req.arg[1] |= (adapter->ahw->pci_func << 8) | BIT_16; 2562 2563 for (i = 0, index = 2; i < max_ints; i++) { 2564 type = op_type ? QLCNIC_INTRPT_ADD : QLCNIC_INTRPT_DEL; 2565 val = type | (adapter->ahw->intr_tbl[i].type << 4); 2566 if (adapter->ahw->intr_tbl[i].type == QLCNIC_INTRPT_MSIX) 2567 val |= (adapter->ahw->intr_tbl[i].id << 16); 2568 cmd.req.arg[index++] = val; 2569 } 2570 err = qlcnic_issue_cmd(adapter, &cmd); 2571 if (err) { 2572 dev_err(&adapter->pdev->dev, 2573 "Failed to configure interrupts 0x%x\n", err); 2574 goto out; 2575 } 2576 2577 max_ints = cmd.rsp.arg[1]; 2578 for (i = 0, index = 2; i < max_ints; i++, index += 2) { 2579 val = cmd.rsp.arg[index]; 2580 if (LSB(val)) { 2581 dev_info(&adapter->pdev->dev, 2582 "Can't configure interrupt %d\n", 2583 adapter->ahw->intr_tbl[i].id); 2584 continue; 2585 } 2586 if (op_type) { 2587 adapter->ahw->intr_tbl[i].id = MSW(val); 2588 adapter->ahw->intr_tbl[i].enabled = 1; 2589 temp = cmd.rsp.arg[index + 1]; 2590 adapter->ahw->intr_tbl[i].src = temp; 2591 } else { 2592 adapter->ahw->intr_tbl[i].id = i; 2593 adapter->ahw->intr_tbl[i].enabled = 0; 2594 adapter->ahw->intr_tbl[i].src = 0; 2595 } 2596 } 2597 out: 2598 qlcnic_free_mbx_args(&cmd); 2599 return err; 2600 } 2601 2602 int qlcnic_83xx_lock_flash(struct qlcnic_adapter *adapter) 2603 { 2604 int id, timeout = 0; 2605 u32 status = 0; 2606 2607 while (status == 0) { 2608 status = QLC_SHARED_REG_RD32(adapter, QLCNIC_FLASH_LOCK); 2609 if (status) 2610 break; 2611 2612 if (++timeout >= QLC_83XX_FLASH_LOCK_TIMEOUT) { 2613 id = QLC_SHARED_REG_RD32(adapter, 2614 QLCNIC_FLASH_LOCK_OWNER); 2615 dev_err(&adapter->pdev->dev, 2616 "%s: failed, lock held by %d\n", __func__, id); 2617 return -EIO; 2618 } 2619 usleep_range(1000, 2000); 2620 } 2621 2622 QLC_SHARED_REG_WR32(adapter, QLCNIC_FLASH_LOCK_OWNER, adapter->portnum); 2623 return 0; 2624 } 2625 2626 void qlcnic_83xx_unlock_flash(struct qlcnic_adapter *adapter) 2627 { 2628 QLC_SHARED_REG_RD32(adapter, QLCNIC_FLASH_UNLOCK); 2629 QLC_SHARED_REG_WR32(adapter, QLCNIC_FLASH_LOCK_OWNER, 0xFF); 2630 } 2631 2632 int qlcnic_83xx_lockless_flash_read32(struct qlcnic_adapter *adapter, 2633 u32 flash_addr, u8 *p_data, 2634 int count) 2635 { 2636 u32 word, range, flash_offset, addr = flash_addr, ret; 2637 ulong indirect_add, direct_window; 2638 int i, err = 0; 2639 2640 flash_offset = addr & (QLCNIC_FLASH_SECTOR_SIZE - 1); 2641 if (addr & 0x3) { 2642 dev_err(&adapter->pdev->dev, "Illegal addr = 0x%x\n", addr); 2643 return -EIO; 2644 } 2645 2646 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_DIRECT_WINDOW, 2647 (addr & 0xFFFF0000)); 2648 2649 range = flash_offset + (count * sizeof(u32)); 2650 /* Check if data is spread across multiple sectors */ 2651 if (range > (QLCNIC_FLASH_SECTOR_SIZE - 1)) { 2652 2653 /* Multi sector read */ 2654 for (i = 0; i < count; i++) { 2655 indirect_add = QLC_83XX_FLASH_DIRECT_DATA(addr); 2656 ret = QLCRD32(adapter, indirect_add, &err); 2657 if (err == -EIO) 2658 return err; 2659 2660 word = ret; 2661 *(u32 *)p_data = word; 2662 p_data = p_data + 4; 2663 addr = addr + 4; 2664 flash_offset = flash_offset + 4; 2665 2666 if (flash_offset > (QLCNIC_FLASH_SECTOR_SIZE - 1)) { 2667 direct_window = QLC_83XX_FLASH_DIRECT_WINDOW; 2668 /* This write is needed once for each sector */ 2669 qlcnic_83xx_wrt_reg_indirect(adapter, 2670 direct_window, 2671 (addr)); 2672 flash_offset = 0; 2673 } 2674 } 2675 } else { 2676 /* Single sector read */ 2677 for (i = 0; i < count; i++) { 2678 indirect_add = QLC_83XX_FLASH_DIRECT_DATA(addr); 2679 ret = QLCRD32(adapter, indirect_add, &err); 2680 if (err == -EIO) 2681 return err; 2682 2683 word = ret; 2684 *(u32 *)p_data = word; 2685 p_data = p_data + 4; 2686 addr = addr + 4; 2687 } 2688 } 2689 2690 return 0; 2691 } 2692 2693 static int qlcnic_83xx_poll_flash_status_reg(struct qlcnic_adapter *adapter) 2694 { 2695 u32 status; 2696 int retries = QLC_83XX_FLASH_READ_RETRY_COUNT; 2697 int err = 0; 2698 2699 do { 2700 status = QLCRD32(adapter, QLC_83XX_FLASH_STATUS, &err); 2701 if (err == -EIO) 2702 return err; 2703 2704 if ((status & QLC_83XX_FLASH_STATUS_READY) == 2705 QLC_83XX_FLASH_STATUS_READY) 2706 break; 2707 2708 usleep_range(1000, 1100); 2709 } while (--retries); 2710 2711 if (!retries) 2712 return -EIO; 2713 2714 return 0; 2715 } 2716 2717 int qlcnic_83xx_enable_flash_write(struct qlcnic_adapter *adapter) 2718 { 2719 int ret; 2720 u32 cmd; 2721 cmd = adapter->ahw->fdt.write_statusreg_cmd; 2722 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_ADDR, 2723 (QLC_83XX_FLASH_FDT_WRITE_DEF_SIG | cmd)); 2724 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_WRDATA, 2725 adapter->ahw->fdt.write_enable_bits); 2726 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_CONTROL, 2727 QLC_83XX_FLASH_SECOND_ERASE_MS_VAL); 2728 ret = qlcnic_83xx_poll_flash_status_reg(adapter); 2729 if (ret) 2730 return -EIO; 2731 2732 return 0; 2733 } 2734 2735 int qlcnic_83xx_disable_flash_write(struct qlcnic_adapter *adapter) 2736 { 2737 int ret; 2738 2739 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_ADDR, 2740 (QLC_83XX_FLASH_FDT_WRITE_DEF_SIG | 2741 adapter->ahw->fdt.write_statusreg_cmd)); 2742 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_WRDATA, 2743 adapter->ahw->fdt.write_disable_bits); 2744 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_CONTROL, 2745 QLC_83XX_FLASH_SECOND_ERASE_MS_VAL); 2746 ret = qlcnic_83xx_poll_flash_status_reg(adapter); 2747 if (ret) 2748 return -EIO; 2749 2750 return 0; 2751 } 2752 2753 int qlcnic_83xx_read_flash_mfg_id(struct qlcnic_adapter *adapter) 2754 { 2755 int ret, err = 0; 2756 u32 mfg_id; 2757 2758 if (qlcnic_83xx_lock_flash(adapter)) 2759 return -EIO; 2760 2761 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_ADDR, 2762 QLC_83XX_FLASH_FDT_READ_MFG_ID_VAL); 2763 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_CONTROL, 2764 QLC_83XX_FLASH_READ_CTRL); 2765 ret = qlcnic_83xx_poll_flash_status_reg(adapter); 2766 if (ret) { 2767 qlcnic_83xx_unlock_flash(adapter); 2768 return -EIO; 2769 } 2770 2771 mfg_id = QLCRD32(adapter, QLC_83XX_FLASH_RDDATA, &err); 2772 if (err == -EIO) { 2773 qlcnic_83xx_unlock_flash(adapter); 2774 return err; 2775 } 2776 2777 adapter->flash_mfg_id = (mfg_id & 0xFF); 2778 qlcnic_83xx_unlock_flash(adapter); 2779 2780 return 0; 2781 } 2782 2783 int qlcnic_83xx_read_flash_descriptor_table(struct qlcnic_adapter *adapter) 2784 { 2785 int count, fdt_size, ret = 0; 2786 2787 fdt_size = sizeof(struct qlcnic_fdt); 2788 count = fdt_size / sizeof(u32); 2789 2790 if (qlcnic_83xx_lock_flash(adapter)) 2791 return -EIO; 2792 2793 memset(&adapter->ahw->fdt, 0, fdt_size); 2794 ret = qlcnic_83xx_lockless_flash_read32(adapter, QLCNIC_FDT_LOCATION, 2795 (u8 *)&adapter->ahw->fdt, 2796 count); 2797 qlcnic_swap32_buffer((u32 *)&adapter->ahw->fdt, count); 2798 qlcnic_83xx_unlock_flash(adapter); 2799 return ret; 2800 } 2801 2802 int qlcnic_83xx_erase_flash_sector(struct qlcnic_adapter *adapter, 2803 u32 sector_start_addr) 2804 { 2805 u32 reversed_addr, addr1, addr2, cmd; 2806 int ret = -EIO; 2807 2808 if (qlcnic_83xx_lock_flash(adapter) != 0) 2809 return -EIO; 2810 2811 if (adapter->ahw->fdt.mfg_id == adapter->flash_mfg_id) { 2812 ret = qlcnic_83xx_enable_flash_write(adapter); 2813 if (ret) { 2814 qlcnic_83xx_unlock_flash(adapter); 2815 dev_err(&adapter->pdev->dev, 2816 "%s failed at %d\n", 2817 __func__, __LINE__); 2818 return ret; 2819 } 2820 } 2821 2822 ret = qlcnic_83xx_poll_flash_status_reg(adapter); 2823 if (ret) { 2824 qlcnic_83xx_unlock_flash(adapter); 2825 dev_err(&adapter->pdev->dev, 2826 "%s: failed at %d\n", __func__, __LINE__); 2827 return -EIO; 2828 } 2829 2830 addr1 = (sector_start_addr & 0xFF) << 16; 2831 addr2 = (sector_start_addr & 0xFF0000) >> 16; 2832 reversed_addr = addr1 | addr2 | (sector_start_addr & 0xFF00); 2833 2834 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_WRDATA, 2835 reversed_addr); 2836 cmd = QLC_83XX_FLASH_FDT_ERASE_DEF_SIG | adapter->ahw->fdt.erase_cmd; 2837 if (adapter->ahw->fdt.mfg_id == adapter->flash_mfg_id) 2838 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_ADDR, cmd); 2839 else 2840 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_ADDR, 2841 QLC_83XX_FLASH_OEM_ERASE_SIG); 2842 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_CONTROL, 2843 QLC_83XX_FLASH_LAST_ERASE_MS_VAL); 2844 2845 ret = qlcnic_83xx_poll_flash_status_reg(adapter); 2846 if (ret) { 2847 qlcnic_83xx_unlock_flash(adapter); 2848 dev_err(&adapter->pdev->dev, 2849 "%s: failed at %d\n", __func__, __LINE__); 2850 return -EIO; 2851 } 2852 2853 if (adapter->ahw->fdt.mfg_id == adapter->flash_mfg_id) { 2854 ret = qlcnic_83xx_disable_flash_write(adapter); 2855 if (ret) { 2856 qlcnic_83xx_unlock_flash(adapter); 2857 dev_err(&adapter->pdev->dev, 2858 "%s: failed at %d\n", __func__, __LINE__); 2859 return ret; 2860 } 2861 } 2862 2863 qlcnic_83xx_unlock_flash(adapter); 2864 2865 return 0; 2866 } 2867 2868 int qlcnic_83xx_flash_write32(struct qlcnic_adapter *adapter, u32 addr, 2869 u32 *p_data) 2870 { 2871 int ret = -EIO; 2872 u32 addr1 = 0x00800000 | (addr >> 2); 2873 2874 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_ADDR, addr1); 2875 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_WRDATA, *p_data); 2876 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_CONTROL, 2877 QLC_83XX_FLASH_LAST_ERASE_MS_VAL); 2878 ret = qlcnic_83xx_poll_flash_status_reg(adapter); 2879 if (ret) { 2880 dev_err(&adapter->pdev->dev, 2881 "%s: failed at %d\n", __func__, __LINE__); 2882 return -EIO; 2883 } 2884 2885 return 0; 2886 } 2887 2888 int qlcnic_83xx_flash_bulk_write(struct qlcnic_adapter *adapter, u32 addr, 2889 u32 *p_data, int count) 2890 { 2891 u32 temp; 2892 int ret = -EIO, err = 0; 2893 2894 if ((count < QLC_83XX_FLASH_WRITE_MIN) || 2895 (count > QLC_83XX_FLASH_WRITE_MAX)) { 2896 dev_err(&adapter->pdev->dev, 2897 "%s: Invalid word count\n", __func__); 2898 return -EIO; 2899 } 2900 2901 temp = QLCRD32(adapter, QLC_83XX_FLASH_SPI_CONTROL, &err); 2902 if (err == -EIO) 2903 return err; 2904 2905 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_SPI_CONTROL, 2906 (temp | QLC_83XX_FLASH_SPI_CTRL)); 2907 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_ADDR, 2908 QLC_83XX_FLASH_ADDR_TEMP_VAL); 2909 2910 /* First DWORD write */ 2911 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_WRDATA, *p_data++); 2912 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_CONTROL, 2913 QLC_83XX_FLASH_FIRST_MS_PATTERN); 2914 ret = qlcnic_83xx_poll_flash_status_reg(adapter); 2915 if (ret) { 2916 dev_err(&adapter->pdev->dev, 2917 "%s: failed at %d\n", __func__, __LINE__); 2918 return -EIO; 2919 } 2920 2921 count--; 2922 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_ADDR, 2923 QLC_83XX_FLASH_ADDR_SECOND_TEMP_VAL); 2924 /* Second to N-1 DWORD writes */ 2925 while (count != 1) { 2926 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_WRDATA, 2927 *p_data++); 2928 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_CONTROL, 2929 QLC_83XX_FLASH_SECOND_MS_PATTERN); 2930 ret = qlcnic_83xx_poll_flash_status_reg(adapter); 2931 if (ret) { 2932 dev_err(&adapter->pdev->dev, 2933 "%s: failed at %d\n", __func__, __LINE__); 2934 return -EIO; 2935 } 2936 count--; 2937 } 2938 2939 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_ADDR, 2940 QLC_83XX_FLASH_ADDR_TEMP_VAL | 2941 (addr >> 2)); 2942 /* Last DWORD write */ 2943 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_WRDATA, *p_data++); 2944 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_CONTROL, 2945 QLC_83XX_FLASH_LAST_MS_PATTERN); 2946 ret = qlcnic_83xx_poll_flash_status_reg(adapter); 2947 if (ret) { 2948 dev_err(&adapter->pdev->dev, 2949 "%s: failed at %d\n", __func__, __LINE__); 2950 return -EIO; 2951 } 2952 2953 ret = QLCRD32(adapter, QLC_83XX_FLASH_SPI_STATUS, &err); 2954 if (err == -EIO) 2955 return err; 2956 2957 if ((ret & QLC_83XX_FLASH_SPI_CTRL) == QLC_83XX_FLASH_SPI_CTRL) { 2958 dev_err(&adapter->pdev->dev, "%s: failed at %d\n", 2959 __func__, __LINE__); 2960 /* Operation failed, clear error bit */ 2961 temp = QLCRD32(adapter, QLC_83XX_FLASH_SPI_CONTROL, &err); 2962 if (err == -EIO) 2963 return err; 2964 2965 qlcnic_83xx_wrt_reg_indirect(adapter, 2966 QLC_83XX_FLASH_SPI_CONTROL, 2967 (temp | QLC_83XX_FLASH_SPI_CTRL)); 2968 } 2969 2970 return 0; 2971 } 2972 2973 static void qlcnic_83xx_recover_driver_lock(struct qlcnic_adapter *adapter) 2974 { 2975 u32 val, id; 2976 2977 val = QLCRDX(adapter->ahw, QLC_83XX_RECOVER_DRV_LOCK); 2978 2979 /* Check if recovery need to be performed by the calling function */ 2980 if ((val & QLC_83XX_DRV_LOCK_RECOVERY_STATUS_MASK) == 0) { 2981 val = val & ~0x3F; 2982 val = val | ((adapter->portnum << 2) | 2983 QLC_83XX_NEED_DRV_LOCK_RECOVERY); 2984 QLCWRX(adapter->ahw, QLC_83XX_RECOVER_DRV_LOCK, val); 2985 dev_info(&adapter->pdev->dev, 2986 "%s: lock recovery initiated\n", __func__); 2987 msleep(QLC_83XX_DRV_LOCK_RECOVERY_DELAY); 2988 val = QLCRDX(adapter->ahw, QLC_83XX_RECOVER_DRV_LOCK); 2989 id = ((val >> 2) & 0xF); 2990 if (id == adapter->portnum) { 2991 val = val & ~QLC_83XX_DRV_LOCK_RECOVERY_STATUS_MASK; 2992 val = val | QLC_83XX_DRV_LOCK_RECOVERY_IN_PROGRESS; 2993 QLCWRX(adapter->ahw, QLC_83XX_RECOVER_DRV_LOCK, val); 2994 /* Force release the lock */ 2995 QLCRDX(adapter->ahw, QLC_83XX_DRV_UNLOCK); 2996 /* Clear recovery bits */ 2997 val = val & ~0x3F; 2998 QLCWRX(adapter->ahw, QLC_83XX_RECOVER_DRV_LOCK, val); 2999 dev_info(&adapter->pdev->dev, 3000 "%s: lock recovery completed\n", __func__); 3001 } else { 3002 dev_info(&adapter->pdev->dev, 3003 "%s: func %d to resume lock recovery process\n", 3004 __func__, id); 3005 } 3006 } else { 3007 dev_info(&adapter->pdev->dev, 3008 "%s: lock recovery initiated by other functions\n", 3009 __func__); 3010 } 3011 } 3012 3013 int qlcnic_83xx_lock_driver(struct qlcnic_adapter *adapter) 3014 { 3015 u32 lock_alive_counter, val, id, i = 0, status = 0, temp = 0; 3016 int max_attempt = 0; 3017 3018 while (status == 0) { 3019 status = QLCRDX(adapter->ahw, QLC_83XX_DRV_LOCK); 3020 if (status) 3021 break; 3022 3023 msleep(QLC_83XX_DRV_LOCK_WAIT_DELAY); 3024 i++; 3025 3026 if (i == 1) 3027 temp = QLCRDX(adapter->ahw, QLC_83XX_DRV_LOCK_ID); 3028 3029 if (i == QLC_83XX_DRV_LOCK_WAIT_COUNTER) { 3030 val = QLCRDX(adapter->ahw, QLC_83XX_DRV_LOCK_ID); 3031 if (val == temp) { 3032 id = val & 0xFF; 3033 dev_info(&adapter->pdev->dev, 3034 "%s: lock to be recovered from %d\n", 3035 __func__, id); 3036 qlcnic_83xx_recover_driver_lock(adapter); 3037 i = 0; 3038 max_attempt++; 3039 } else { 3040 dev_err(&adapter->pdev->dev, 3041 "%s: failed to get lock\n", __func__); 3042 return -EIO; 3043 } 3044 } 3045 3046 /* Force exit from while loop after few attempts */ 3047 if (max_attempt == QLC_83XX_MAX_DRV_LOCK_RECOVERY_ATTEMPT) { 3048 dev_err(&adapter->pdev->dev, 3049 "%s: failed to get lock\n", __func__); 3050 return -EIO; 3051 } 3052 } 3053 3054 val = QLCRDX(adapter->ahw, QLC_83XX_DRV_LOCK_ID); 3055 lock_alive_counter = val >> 8; 3056 lock_alive_counter++; 3057 val = lock_alive_counter << 8 | adapter->portnum; 3058 QLCWRX(adapter->ahw, QLC_83XX_DRV_LOCK_ID, val); 3059 3060 return 0; 3061 } 3062 3063 void qlcnic_83xx_unlock_driver(struct qlcnic_adapter *adapter) 3064 { 3065 u32 val, lock_alive_counter, id; 3066 3067 val = QLCRDX(adapter->ahw, QLC_83XX_DRV_LOCK_ID); 3068 id = val & 0xFF; 3069 lock_alive_counter = val >> 8; 3070 3071 if (id != adapter->portnum) 3072 dev_err(&adapter->pdev->dev, 3073 "%s:Warning func %d is unlocking lock owned by %d\n", 3074 __func__, adapter->portnum, id); 3075 3076 val = (lock_alive_counter << 8) | 0xFF; 3077 QLCWRX(adapter->ahw, QLC_83XX_DRV_LOCK_ID, val); 3078 QLCRDX(adapter->ahw, QLC_83XX_DRV_UNLOCK); 3079 } 3080 3081 int qlcnic_ms_mem_write128(struct qlcnic_adapter *adapter, u64 addr, 3082 u32 *data, u32 count) 3083 { 3084 int i, j, ret = 0; 3085 u32 temp; 3086 3087 /* Check alignment */ 3088 if (addr & 0xF) 3089 return -EIO; 3090 3091 mutex_lock(&adapter->ahw->mem_lock); 3092 qlcnic_ind_wr(adapter, QLCNIC_MS_ADDR_HI, 0); 3093 3094 for (i = 0; i < count; i++, addr += 16) { 3095 if (!((ADDR_IN_RANGE(addr, QLCNIC_ADDR_QDR_NET, 3096 QLCNIC_ADDR_QDR_NET_MAX)) || 3097 (ADDR_IN_RANGE(addr, QLCNIC_ADDR_DDR_NET, 3098 QLCNIC_ADDR_DDR_NET_MAX)))) { 3099 mutex_unlock(&adapter->ahw->mem_lock); 3100 return -EIO; 3101 } 3102 3103 qlcnic_ind_wr(adapter, QLCNIC_MS_ADDR_LO, addr); 3104 qlcnic_ind_wr(adapter, QLCNIC_MS_WRTDATA_LO, *data++); 3105 qlcnic_ind_wr(adapter, QLCNIC_MS_WRTDATA_HI, *data++); 3106 qlcnic_ind_wr(adapter, QLCNIC_MS_WRTDATA_ULO, *data++); 3107 qlcnic_ind_wr(adapter, QLCNIC_MS_WRTDATA_UHI, *data++); 3108 qlcnic_ind_wr(adapter, QLCNIC_MS_CTRL, QLCNIC_TA_WRITE_ENABLE); 3109 qlcnic_ind_wr(adapter, QLCNIC_MS_CTRL, QLCNIC_TA_WRITE_START); 3110 3111 for (j = 0; j < MAX_CTL_CHECK; j++) { 3112 temp = qlcnic_ind_rd(adapter, QLCNIC_MS_CTRL); 3113 3114 if ((temp & TA_CTL_BUSY) == 0) 3115 break; 3116 } 3117 3118 /* Status check failure */ 3119 if (j >= MAX_CTL_CHECK) { 3120 printk_ratelimited(KERN_WARNING 3121 "MS memory write failed\n"); 3122 mutex_unlock(&adapter->ahw->mem_lock); 3123 return -EIO; 3124 } 3125 } 3126 3127 mutex_unlock(&adapter->ahw->mem_lock); 3128 3129 return ret; 3130 } 3131 3132 int qlcnic_83xx_flash_read32(struct qlcnic_adapter *adapter, u32 flash_addr, 3133 u8 *p_data, int count) 3134 { 3135 u32 word, addr = flash_addr, ret; 3136 ulong indirect_addr; 3137 int i, err = 0; 3138 3139 if (qlcnic_83xx_lock_flash(adapter) != 0) 3140 return -EIO; 3141 3142 if (addr & 0x3) { 3143 dev_err(&adapter->pdev->dev, "Illegal addr = 0x%x\n", addr); 3144 qlcnic_83xx_unlock_flash(adapter); 3145 return -EIO; 3146 } 3147 3148 for (i = 0; i < count; i++) { 3149 if (qlcnic_83xx_wrt_reg_indirect(adapter, 3150 QLC_83XX_FLASH_DIRECT_WINDOW, 3151 (addr))) { 3152 qlcnic_83xx_unlock_flash(adapter); 3153 return -EIO; 3154 } 3155 3156 indirect_addr = QLC_83XX_FLASH_DIRECT_DATA(addr); 3157 ret = QLCRD32(adapter, indirect_addr, &err); 3158 if (err == -EIO) 3159 return err; 3160 3161 word = ret; 3162 *(u32 *)p_data = word; 3163 p_data = p_data + 4; 3164 addr = addr + 4; 3165 } 3166 3167 qlcnic_83xx_unlock_flash(adapter); 3168 3169 return 0; 3170 } 3171 3172 int qlcnic_83xx_test_link(struct qlcnic_adapter *adapter) 3173 { 3174 u8 pci_func; 3175 int err; 3176 u32 config = 0, state; 3177 struct qlcnic_cmd_args cmd; 3178 struct qlcnic_hardware_context *ahw = adapter->ahw; 3179 3180 if (qlcnic_sriov_vf_check(adapter)) 3181 pci_func = adapter->portnum; 3182 else 3183 pci_func = ahw->pci_func; 3184 3185 state = readl(ahw->pci_base0 + QLC_83XX_LINK_STATE(pci_func)); 3186 if (!QLC_83xx_FUNC_VAL(state, pci_func)) { 3187 dev_info(&adapter->pdev->dev, "link state down\n"); 3188 return config; 3189 } 3190 3191 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_LINK_STATUS); 3192 if (err) 3193 return err; 3194 3195 err = qlcnic_issue_cmd(adapter, &cmd); 3196 if (err) { 3197 dev_info(&adapter->pdev->dev, 3198 "Get Link Status Command failed: 0x%x\n", err); 3199 goto out; 3200 } else { 3201 config = cmd.rsp.arg[1]; 3202 switch (QLC_83XX_CURRENT_LINK_SPEED(config)) { 3203 case QLC_83XX_10M_LINK: 3204 ahw->link_speed = SPEED_10; 3205 break; 3206 case QLC_83XX_100M_LINK: 3207 ahw->link_speed = SPEED_100; 3208 break; 3209 case QLC_83XX_1G_LINK: 3210 ahw->link_speed = SPEED_1000; 3211 break; 3212 case QLC_83XX_10G_LINK: 3213 ahw->link_speed = SPEED_10000; 3214 break; 3215 default: 3216 ahw->link_speed = 0; 3217 break; 3218 } 3219 config = cmd.rsp.arg[3]; 3220 switch (QLC_83XX_SFP_MODULE_TYPE(config)) { 3221 case QLC_83XX_MODULE_FIBRE_10GBASE_LRM: 3222 case QLC_83XX_MODULE_FIBRE_10GBASE_LR: 3223 case QLC_83XX_MODULE_FIBRE_10GBASE_SR: 3224 ahw->supported_type = PORT_FIBRE; 3225 ahw->port_type = QLCNIC_XGBE; 3226 break; 3227 case QLC_83XX_MODULE_FIBRE_1000BASE_SX: 3228 case QLC_83XX_MODULE_FIBRE_1000BASE_LX: 3229 case QLC_83XX_MODULE_FIBRE_1000BASE_CX: 3230 ahw->supported_type = PORT_FIBRE; 3231 ahw->port_type = QLCNIC_GBE; 3232 break; 3233 case QLC_83XX_MODULE_TP_1000BASE_T: 3234 ahw->supported_type = PORT_TP; 3235 ahw->port_type = QLCNIC_GBE; 3236 break; 3237 case QLC_83XX_MODULE_DA_10GE_PASSIVE_CP: 3238 case QLC_83XX_MODULE_DA_10GE_ACTIVE_CP: 3239 case QLC_83XX_MODULE_DA_10GE_LEGACY_CP: 3240 case QLC_83XX_MODULE_DA_1GE_PASSIVE_CP: 3241 ahw->supported_type = PORT_DA; 3242 ahw->port_type = QLCNIC_XGBE; 3243 break; 3244 default: 3245 ahw->supported_type = PORT_OTHER; 3246 ahw->port_type = QLCNIC_XGBE; 3247 } 3248 if (config & 1) 3249 err = 1; 3250 } 3251 out: 3252 qlcnic_free_mbx_args(&cmd); 3253 return config; 3254 } 3255 3256 int qlcnic_83xx_get_settings(struct qlcnic_adapter *adapter, 3257 struct ethtool_cmd *ecmd) 3258 { 3259 struct qlcnic_hardware_context *ahw = adapter->ahw; 3260 u32 config = 0; 3261 int status = 0; 3262 3263 if (!test_bit(__QLCNIC_MAINTENANCE_MODE, &adapter->state)) { 3264 /* Get port configuration info */ 3265 status = qlcnic_83xx_get_port_info(adapter); 3266 /* Get Link Status related info */ 3267 config = qlcnic_83xx_test_link(adapter); 3268 ahw->module_type = QLC_83XX_SFP_MODULE_TYPE(config); 3269 } 3270 3271 /* hard code until there is a way to get it from flash */ 3272 ahw->board_type = QLCNIC_BRDTYPE_83XX_10G; 3273 3274 if (netif_running(adapter->netdev) && ahw->has_link_events) { 3275 ethtool_cmd_speed_set(ecmd, ahw->link_speed); 3276 ecmd->duplex = ahw->link_duplex; 3277 ecmd->autoneg = ahw->link_autoneg; 3278 } else { 3279 ethtool_cmd_speed_set(ecmd, SPEED_UNKNOWN); 3280 ecmd->duplex = DUPLEX_UNKNOWN; 3281 ecmd->autoneg = AUTONEG_DISABLE; 3282 } 3283 3284 ecmd->supported = (SUPPORTED_10baseT_Full | 3285 SUPPORTED_100baseT_Full | 3286 SUPPORTED_1000baseT_Full | 3287 SUPPORTED_10000baseT_Full | 3288 SUPPORTED_Autoneg); 3289 3290 if (ecmd->autoneg == AUTONEG_ENABLE) { 3291 if (ahw->port_config & QLC_83XX_10_CAPABLE) 3292 ecmd->advertising |= SUPPORTED_10baseT_Full; 3293 if (ahw->port_config & QLC_83XX_100_CAPABLE) 3294 ecmd->advertising |= SUPPORTED_100baseT_Full; 3295 if (ahw->port_config & QLC_83XX_1G_CAPABLE) 3296 ecmd->advertising |= SUPPORTED_1000baseT_Full; 3297 if (ahw->port_config & QLC_83XX_10G_CAPABLE) 3298 ecmd->advertising |= SUPPORTED_10000baseT_Full; 3299 if (ahw->port_config & QLC_83XX_AUTONEG_ENABLE) 3300 ecmd->advertising |= ADVERTISED_Autoneg; 3301 } else { 3302 switch (ahw->link_speed) { 3303 case SPEED_10: 3304 ecmd->advertising = SUPPORTED_10baseT_Full; 3305 break; 3306 case SPEED_100: 3307 ecmd->advertising = SUPPORTED_100baseT_Full; 3308 break; 3309 case SPEED_1000: 3310 ecmd->advertising = SUPPORTED_1000baseT_Full; 3311 break; 3312 case SPEED_10000: 3313 ecmd->advertising = SUPPORTED_10000baseT_Full; 3314 break; 3315 default: 3316 break; 3317 } 3318 3319 } 3320 3321 switch (ahw->supported_type) { 3322 case PORT_FIBRE: 3323 ecmd->supported |= SUPPORTED_FIBRE; 3324 ecmd->advertising |= ADVERTISED_FIBRE; 3325 ecmd->port = PORT_FIBRE; 3326 ecmd->transceiver = XCVR_EXTERNAL; 3327 break; 3328 case PORT_TP: 3329 ecmd->supported |= SUPPORTED_TP; 3330 ecmd->advertising |= ADVERTISED_TP; 3331 ecmd->port = PORT_TP; 3332 ecmd->transceiver = XCVR_INTERNAL; 3333 break; 3334 case PORT_DA: 3335 ecmd->supported |= SUPPORTED_FIBRE; 3336 ecmd->advertising |= ADVERTISED_FIBRE; 3337 ecmd->port = PORT_DA; 3338 ecmd->transceiver = XCVR_EXTERNAL; 3339 break; 3340 default: 3341 ecmd->supported |= SUPPORTED_FIBRE; 3342 ecmd->advertising |= ADVERTISED_FIBRE; 3343 ecmd->port = PORT_OTHER; 3344 ecmd->transceiver = XCVR_EXTERNAL; 3345 break; 3346 } 3347 ecmd->phy_address = ahw->physical_port; 3348 return status; 3349 } 3350 3351 int qlcnic_83xx_set_settings(struct qlcnic_adapter *adapter, 3352 struct ethtool_cmd *ecmd) 3353 { 3354 struct qlcnic_hardware_context *ahw = adapter->ahw; 3355 u32 config = adapter->ahw->port_config; 3356 int status = 0; 3357 3358 /* 83xx devices do not support Half duplex */ 3359 if (ecmd->duplex == DUPLEX_HALF) { 3360 netdev_info(adapter->netdev, 3361 "Half duplex mode not supported\n"); 3362 return -EINVAL; 3363 } 3364 3365 if (ecmd->autoneg) { 3366 ahw->port_config |= QLC_83XX_AUTONEG_ENABLE; 3367 ahw->port_config |= (QLC_83XX_100_CAPABLE | 3368 QLC_83XX_1G_CAPABLE | 3369 QLC_83XX_10G_CAPABLE); 3370 } else { /* force speed */ 3371 ahw->port_config &= ~QLC_83XX_AUTONEG_ENABLE; 3372 switch (ethtool_cmd_speed(ecmd)) { 3373 case SPEED_10: 3374 ahw->port_config &= ~(QLC_83XX_100_CAPABLE | 3375 QLC_83XX_1G_CAPABLE | 3376 QLC_83XX_10G_CAPABLE); 3377 ahw->port_config |= QLC_83XX_10_CAPABLE; 3378 break; 3379 case SPEED_100: 3380 ahw->port_config &= ~(QLC_83XX_10_CAPABLE | 3381 QLC_83XX_1G_CAPABLE | 3382 QLC_83XX_10G_CAPABLE); 3383 ahw->port_config |= QLC_83XX_100_CAPABLE; 3384 break; 3385 case SPEED_1000: 3386 ahw->port_config &= ~(QLC_83XX_10_CAPABLE | 3387 QLC_83XX_100_CAPABLE | 3388 QLC_83XX_10G_CAPABLE); 3389 ahw->port_config |= QLC_83XX_1G_CAPABLE; 3390 break; 3391 case SPEED_10000: 3392 ahw->port_config &= ~(QLC_83XX_10_CAPABLE | 3393 QLC_83XX_100_CAPABLE | 3394 QLC_83XX_1G_CAPABLE); 3395 ahw->port_config |= QLC_83XX_10G_CAPABLE; 3396 break; 3397 default: 3398 return -EINVAL; 3399 } 3400 } 3401 status = qlcnic_83xx_set_port_config(adapter); 3402 if (status) { 3403 netdev_info(adapter->netdev, 3404 "Failed to Set Link Speed and autoneg.\n"); 3405 ahw->port_config = config; 3406 } 3407 3408 return status; 3409 } 3410 3411 static inline u64 *qlcnic_83xx_copy_stats(struct qlcnic_cmd_args *cmd, 3412 u64 *data, int index) 3413 { 3414 u32 low, hi; 3415 u64 val; 3416 3417 low = cmd->rsp.arg[index]; 3418 hi = cmd->rsp.arg[index + 1]; 3419 val = (((u64) low) | (((u64) hi) << 32)); 3420 *data++ = val; 3421 return data; 3422 } 3423 3424 static u64 *qlcnic_83xx_fill_stats(struct qlcnic_adapter *adapter, 3425 struct qlcnic_cmd_args *cmd, u64 *data, 3426 int type, int *ret) 3427 { 3428 int err, k, total_regs; 3429 3430 *ret = 0; 3431 err = qlcnic_issue_cmd(adapter, cmd); 3432 if (err != QLCNIC_RCODE_SUCCESS) { 3433 dev_info(&adapter->pdev->dev, 3434 "Error in get statistics mailbox command\n"); 3435 *ret = -EIO; 3436 return data; 3437 } 3438 total_regs = cmd->rsp.num; 3439 switch (type) { 3440 case QLC_83XX_STAT_MAC: 3441 /* fill in MAC tx counters */ 3442 for (k = 2; k < 28; k += 2) 3443 data = qlcnic_83xx_copy_stats(cmd, data, k); 3444 /* skip 24 bytes of reserved area */ 3445 /* fill in MAC rx counters */ 3446 for (k += 6; k < 60; k += 2) 3447 data = qlcnic_83xx_copy_stats(cmd, data, k); 3448 /* skip 24 bytes of reserved area */ 3449 /* fill in MAC rx frame stats */ 3450 for (k += 6; k < 80; k += 2) 3451 data = qlcnic_83xx_copy_stats(cmd, data, k); 3452 /* fill in eSwitch stats */ 3453 for (; k < total_regs; k += 2) 3454 data = qlcnic_83xx_copy_stats(cmd, data, k); 3455 break; 3456 case QLC_83XX_STAT_RX: 3457 for (k = 2; k < 8; k += 2) 3458 data = qlcnic_83xx_copy_stats(cmd, data, k); 3459 /* skip 8 bytes of reserved data */ 3460 for (k += 2; k < 24; k += 2) 3461 data = qlcnic_83xx_copy_stats(cmd, data, k); 3462 /* skip 8 bytes containing RE1FBQ error data */ 3463 for (k += 2; k < total_regs; k += 2) 3464 data = qlcnic_83xx_copy_stats(cmd, data, k); 3465 break; 3466 case QLC_83XX_STAT_TX: 3467 for (k = 2; k < 10; k += 2) 3468 data = qlcnic_83xx_copy_stats(cmd, data, k); 3469 /* skip 8 bytes of reserved data */ 3470 for (k += 2; k < total_regs; k += 2) 3471 data = qlcnic_83xx_copy_stats(cmd, data, k); 3472 break; 3473 default: 3474 dev_warn(&adapter->pdev->dev, "Unknown get statistics mode\n"); 3475 *ret = -EIO; 3476 } 3477 return data; 3478 } 3479 3480 void qlcnic_83xx_get_stats(struct qlcnic_adapter *adapter, u64 *data) 3481 { 3482 struct qlcnic_cmd_args cmd; 3483 struct net_device *netdev = adapter->netdev; 3484 int ret = 0; 3485 3486 ret = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_STATISTICS); 3487 if (ret) 3488 return; 3489 /* Get Tx stats */ 3490 cmd.req.arg[1] = BIT_1 | (adapter->tx_ring->ctx_id << 16); 3491 cmd.rsp.num = QLC_83XX_TX_STAT_REGS; 3492 data = qlcnic_83xx_fill_stats(adapter, &cmd, data, 3493 QLC_83XX_STAT_TX, &ret); 3494 if (ret) { 3495 netdev_err(netdev, "Error getting Tx stats\n"); 3496 goto out; 3497 } 3498 /* Get MAC stats */ 3499 cmd.req.arg[1] = BIT_2 | (adapter->portnum << 16); 3500 cmd.rsp.num = QLC_83XX_MAC_STAT_REGS; 3501 memset(cmd.rsp.arg, 0, sizeof(u32) * cmd.rsp.num); 3502 data = qlcnic_83xx_fill_stats(adapter, &cmd, data, 3503 QLC_83XX_STAT_MAC, &ret); 3504 if (ret) { 3505 netdev_err(netdev, "Error getting MAC stats\n"); 3506 goto out; 3507 } 3508 /* Get Rx stats */ 3509 cmd.req.arg[1] = adapter->recv_ctx->context_id << 16; 3510 cmd.rsp.num = QLC_83XX_RX_STAT_REGS; 3511 memset(cmd.rsp.arg, 0, sizeof(u32) * cmd.rsp.num); 3512 data = qlcnic_83xx_fill_stats(adapter, &cmd, data, 3513 QLC_83XX_STAT_RX, &ret); 3514 if (ret) 3515 netdev_err(netdev, "Error getting Rx stats\n"); 3516 out: 3517 qlcnic_free_mbx_args(&cmd); 3518 } 3519 3520 #define QLCNIC_83XX_ADD_PORT0 BIT_0 3521 #define QLCNIC_83XX_ADD_PORT1 BIT_1 3522 #define QLCNIC_83XX_EXTENDED_MEM_SIZE 13 /* In MB */ 3523 int qlcnic_83xx_extend_md_capab(struct qlcnic_adapter *adapter) 3524 { 3525 struct qlcnic_cmd_args cmd; 3526 int err; 3527 3528 err = qlcnic_alloc_mbx_args(&cmd, adapter, 3529 QLCNIC_CMD_83XX_EXTEND_ISCSI_DUMP_CAP); 3530 if (err) 3531 return err; 3532 3533 cmd.req.arg[1] = (QLCNIC_83XX_ADD_PORT0 | QLCNIC_83XX_ADD_PORT1); 3534 cmd.req.arg[2] = QLCNIC_83XX_EXTENDED_MEM_SIZE; 3535 cmd.req.arg[3] = QLCNIC_83XX_EXTENDED_MEM_SIZE; 3536 3537 err = qlcnic_issue_cmd(adapter, &cmd); 3538 if (err) 3539 dev_err(&adapter->pdev->dev, 3540 "failed to issue extend iSCSI minidump capability\n"); 3541 3542 return err; 3543 } 3544 3545 int qlcnic_83xx_reg_test(struct qlcnic_adapter *adapter) 3546 { 3547 u32 major, minor, sub; 3548 3549 major = QLC_SHARED_REG_RD32(adapter, QLCNIC_FW_VERSION_MAJOR); 3550 minor = QLC_SHARED_REG_RD32(adapter, QLCNIC_FW_VERSION_MINOR); 3551 sub = QLC_SHARED_REG_RD32(adapter, QLCNIC_FW_VERSION_SUB); 3552 3553 if (adapter->fw_version != QLCNIC_VERSION_CODE(major, minor, sub)) { 3554 dev_info(&adapter->pdev->dev, "%s: Reg test failed\n", 3555 __func__); 3556 return 1; 3557 } 3558 return 0; 3559 } 3560 3561 inline int qlcnic_83xx_get_regs_len(struct qlcnic_adapter *adapter) 3562 { 3563 return (ARRAY_SIZE(qlcnic_83xx_ext_reg_tbl) * 3564 sizeof(*adapter->ahw->ext_reg_tbl)) + 3565 (ARRAY_SIZE(qlcnic_83xx_reg_tbl) * 3566 sizeof(*adapter->ahw->reg_tbl)); 3567 } 3568 3569 int qlcnic_83xx_get_registers(struct qlcnic_adapter *adapter, u32 *regs_buff) 3570 { 3571 int i, j = 0; 3572 3573 for (i = QLCNIC_DEV_INFO_SIZE + 1; 3574 j < ARRAY_SIZE(qlcnic_83xx_reg_tbl); i++, j++) 3575 regs_buff[i] = QLC_SHARED_REG_RD32(adapter, j); 3576 3577 for (j = 0; j < ARRAY_SIZE(qlcnic_83xx_ext_reg_tbl); j++) 3578 regs_buff[i++] = QLCRDX(adapter->ahw, j); 3579 return i; 3580 } 3581 3582 int qlcnic_83xx_interrupt_test(struct net_device *netdev) 3583 { 3584 struct qlcnic_adapter *adapter = netdev_priv(netdev); 3585 struct qlcnic_hardware_context *ahw = adapter->ahw; 3586 struct qlcnic_cmd_args cmd; 3587 u8 val, drv_sds_rings = adapter->drv_sds_rings; 3588 u8 drv_tx_rings = adapter->drv_tx_rings; 3589 u32 data; 3590 u16 intrpt_id, id; 3591 int ret; 3592 3593 if (test_bit(__QLCNIC_RESETTING, &adapter->state)) { 3594 netdev_info(netdev, "Device is resetting\n"); 3595 return -EBUSY; 3596 } 3597 3598 if (qlcnic_get_diag_lock(adapter)) { 3599 netdev_info(netdev, "Device in diagnostics mode\n"); 3600 return -EBUSY; 3601 } 3602 3603 ret = qlcnic_83xx_diag_alloc_res(netdev, QLCNIC_INTERRUPT_TEST, 3604 drv_sds_rings); 3605 if (ret) 3606 goto fail_diag_irq; 3607 3608 ahw->diag_cnt = 0; 3609 ret = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_INTRPT_TEST); 3610 if (ret) 3611 goto fail_diag_irq; 3612 3613 if (adapter->flags & QLCNIC_MSIX_ENABLED) 3614 intrpt_id = ahw->intr_tbl[0].id; 3615 else 3616 intrpt_id = QLCRDX(ahw, QLCNIC_DEF_INT_ID); 3617 3618 cmd.req.arg[1] = 1; 3619 cmd.req.arg[2] = intrpt_id; 3620 cmd.req.arg[3] = BIT_0; 3621 3622 ret = qlcnic_issue_cmd(adapter, &cmd); 3623 data = cmd.rsp.arg[2]; 3624 id = LSW(data); 3625 val = LSB(MSW(data)); 3626 if (id != intrpt_id) 3627 dev_info(&adapter->pdev->dev, 3628 "Interrupt generated: 0x%x, requested:0x%x\n", 3629 id, intrpt_id); 3630 if (val) 3631 dev_err(&adapter->pdev->dev, 3632 "Interrupt test error: 0x%x\n", val); 3633 if (ret) 3634 goto done; 3635 3636 msleep(20); 3637 ret = !ahw->diag_cnt; 3638 3639 done: 3640 qlcnic_free_mbx_args(&cmd); 3641 qlcnic_83xx_diag_free_res(netdev, drv_sds_rings); 3642 3643 fail_diag_irq: 3644 adapter->drv_sds_rings = drv_sds_rings; 3645 adapter->drv_tx_rings = drv_tx_rings; 3646 qlcnic_release_diag_lock(adapter); 3647 return ret; 3648 } 3649 3650 void qlcnic_83xx_get_pauseparam(struct qlcnic_adapter *adapter, 3651 struct ethtool_pauseparam *pause) 3652 { 3653 struct qlcnic_hardware_context *ahw = adapter->ahw; 3654 int status = 0; 3655 u32 config; 3656 3657 status = qlcnic_83xx_get_port_config(adapter); 3658 if (status) { 3659 dev_err(&adapter->pdev->dev, 3660 "%s: Get Pause Config failed\n", __func__); 3661 return; 3662 } 3663 config = ahw->port_config; 3664 if (config & QLC_83XX_CFG_STD_PAUSE) { 3665 switch (MSW(config)) { 3666 case QLC_83XX_TX_PAUSE: 3667 pause->tx_pause = 1; 3668 break; 3669 case QLC_83XX_RX_PAUSE: 3670 pause->rx_pause = 1; 3671 break; 3672 case QLC_83XX_TX_RX_PAUSE: 3673 default: 3674 /* Backward compatibility for existing 3675 * flash definitions 3676 */ 3677 pause->tx_pause = 1; 3678 pause->rx_pause = 1; 3679 } 3680 } 3681 3682 if (QLC_83XX_AUTONEG(config)) 3683 pause->autoneg = 1; 3684 } 3685 3686 int qlcnic_83xx_set_pauseparam(struct qlcnic_adapter *adapter, 3687 struct ethtool_pauseparam *pause) 3688 { 3689 struct qlcnic_hardware_context *ahw = adapter->ahw; 3690 int status = 0; 3691 u32 config; 3692 3693 status = qlcnic_83xx_get_port_config(adapter); 3694 if (status) { 3695 dev_err(&adapter->pdev->dev, 3696 "%s: Get Pause Config failed.\n", __func__); 3697 return status; 3698 } 3699 config = ahw->port_config; 3700 3701 if (ahw->port_type == QLCNIC_GBE) { 3702 if (pause->autoneg) 3703 ahw->port_config |= QLC_83XX_ENABLE_AUTONEG; 3704 if (!pause->autoneg) 3705 ahw->port_config &= ~QLC_83XX_ENABLE_AUTONEG; 3706 } else if ((ahw->port_type == QLCNIC_XGBE) && (pause->autoneg)) { 3707 return -EOPNOTSUPP; 3708 } 3709 3710 if (!(config & QLC_83XX_CFG_STD_PAUSE)) 3711 ahw->port_config |= QLC_83XX_CFG_STD_PAUSE; 3712 3713 if (pause->rx_pause && pause->tx_pause) { 3714 ahw->port_config |= QLC_83XX_CFG_STD_TX_RX_PAUSE; 3715 } else if (pause->rx_pause && !pause->tx_pause) { 3716 ahw->port_config &= ~QLC_83XX_CFG_STD_TX_PAUSE; 3717 ahw->port_config |= QLC_83XX_CFG_STD_RX_PAUSE; 3718 } else if (pause->tx_pause && !pause->rx_pause) { 3719 ahw->port_config &= ~QLC_83XX_CFG_STD_RX_PAUSE; 3720 ahw->port_config |= QLC_83XX_CFG_STD_TX_PAUSE; 3721 } else if (!pause->rx_pause && !pause->tx_pause) { 3722 ahw->port_config &= ~(QLC_83XX_CFG_STD_TX_RX_PAUSE | 3723 QLC_83XX_CFG_STD_PAUSE); 3724 } 3725 status = qlcnic_83xx_set_port_config(adapter); 3726 if (status) { 3727 dev_err(&adapter->pdev->dev, 3728 "%s: Set Pause Config failed.\n", __func__); 3729 ahw->port_config = config; 3730 } 3731 return status; 3732 } 3733 3734 static int qlcnic_83xx_read_flash_status_reg(struct qlcnic_adapter *adapter) 3735 { 3736 int ret, err = 0; 3737 u32 temp; 3738 3739 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_ADDR, 3740 QLC_83XX_FLASH_OEM_READ_SIG); 3741 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_CONTROL, 3742 QLC_83XX_FLASH_READ_CTRL); 3743 ret = qlcnic_83xx_poll_flash_status_reg(adapter); 3744 if (ret) 3745 return -EIO; 3746 3747 temp = QLCRD32(adapter, QLC_83XX_FLASH_RDDATA, &err); 3748 if (err == -EIO) 3749 return err; 3750 3751 return temp & 0xFF; 3752 } 3753 3754 int qlcnic_83xx_flash_test(struct qlcnic_adapter *adapter) 3755 { 3756 int status; 3757 3758 status = qlcnic_83xx_read_flash_status_reg(adapter); 3759 if (status == -EIO) { 3760 dev_info(&adapter->pdev->dev, "%s: EEPROM test failed.\n", 3761 __func__); 3762 return 1; 3763 } 3764 return 0; 3765 } 3766 3767 static int qlcnic_83xx_shutdown(struct pci_dev *pdev) 3768 { 3769 struct qlcnic_adapter *adapter = pci_get_drvdata(pdev); 3770 struct net_device *netdev = adapter->netdev; 3771 int retval; 3772 3773 netif_device_detach(netdev); 3774 qlcnic_cancel_idc_work(adapter); 3775 3776 if (netif_running(netdev)) 3777 qlcnic_down(adapter, netdev); 3778 3779 qlcnic_83xx_disable_mbx_intr(adapter); 3780 cancel_delayed_work_sync(&adapter->idc_aen_work); 3781 3782 retval = pci_save_state(pdev); 3783 if (retval) 3784 return retval; 3785 3786 return 0; 3787 } 3788 3789 static int qlcnic_83xx_resume(struct qlcnic_adapter *adapter) 3790 { 3791 struct qlcnic_hardware_context *ahw = adapter->ahw; 3792 struct qlc_83xx_idc *idc = &ahw->idc; 3793 int err = 0; 3794 3795 err = qlcnic_83xx_idc_init(adapter); 3796 if (err) 3797 return err; 3798 3799 if (ahw->nic_mode == QLCNIC_VNIC_MODE) { 3800 if (ahw->op_mode == QLCNIC_MGMT_FUNC) { 3801 qlcnic_83xx_set_vnic_opmode(adapter); 3802 } else { 3803 err = qlcnic_83xx_check_vnic_state(adapter); 3804 if (err) 3805 return err; 3806 } 3807 } 3808 3809 err = qlcnic_83xx_idc_reattach_driver(adapter); 3810 if (err) 3811 return err; 3812 3813 qlcnic_schedule_work(adapter, qlcnic_83xx_idc_poll_dev_state, 3814 idc->delay); 3815 return err; 3816 } 3817 3818 void qlcnic_83xx_reinit_mbx_work(struct qlcnic_mailbox *mbx) 3819 { 3820 reinit_completion(&mbx->completion); 3821 set_bit(QLC_83XX_MBX_READY, &mbx->status); 3822 } 3823 3824 void qlcnic_83xx_free_mailbox(struct qlcnic_mailbox *mbx) 3825 { 3826 if (!mbx) 3827 return; 3828 3829 destroy_workqueue(mbx->work_q); 3830 kfree(mbx); 3831 } 3832 3833 static inline void 3834 qlcnic_83xx_notify_cmd_completion(struct qlcnic_adapter *adapter, 3835 struct qlcnic_cmd_args *cmd) 3836 { 3837 atomic_set(&cmd->rsp_status, QLC_83XX_MBX_RESPONSE_ARRIVED); 3838 3839 if (cmd->type == QLC_83XX_MBX_CMD_NO_WAIT) { 3840 qlcnic_free_mbx_args(cmd); 3841 kfree(cmd); 3842 return; 3843 } 3844 complete(&cmd->completion); 3845 } 3846 3847 static void qlcnic_83xx_flush_mbx_queue(struct qlcnic_adapter *adapter) 3848 { 3849 struct qlcnic_mailbox *mbx = adapter->ahw->mailbox; 3850 struct list_head *head = &mbx->cmd_q; 3851 struct qlcnic_cmd_args *cmd = NULL; 3852 3853 spin_lock(&mbx->queue_lock); 3854 3855 while (!list_empty(head)) { 3856 cmd = list_entry(head->next, struct qlcnic_cmd_args, list); 3857 dev_info(&adapter->pdev->dev, "%s: Mailbox command 0x%x\n", 3858 __func__, cmd->cmd_op); 3859 list_del(&cmd->list); 3860 mbx->num_cmds--; 3861 qlcnic_83xx_notify_cmd_completion(adapter, cmd); 3862 } 3863 3864 spin_unlock(&mbx->queue_lock); 3865 } 3866 3867 static int qlcnic_83xx_check_mbx_status(struct qlcnic_adapter *adapter) 3868 { 3869 struct qlcnic_hardware_context *ahw = adapter->ahw; 3870 struct qlcnic_mailbox *mbx = ahw->mailbox; 3871 u32 host_mbx_ctrl; 3872 3873 if (!test_bit(QLC_83XX_MBX_READY, &mbx->status)) 3874 return -EBUSY; 3875 3876 host_mbx_ctrl = QLCRDX(ahw, QLCNIC_HOST_MBX_CTRL); 3877 if (host_mbx_ctrl) { 3878 clear_bit(QLC_83XX_MBX_READY, &mbx->status); 3879 ahw->idc.collect_dump = 1; 3880 return -EIO; 3881 } 3882 3883 return 0; 3884 } 3885 3886 static inline void qlcnic_83xx_signal_mbx_cmd(struct qlcnic_adapter *adapter, 3887 u8 issue_cmd) 3888 { 3889 if (issue_cmd) 3890 QLCWRX(adapter->ahw, QLCNIC_HOST_MBX_CTRL, QLCNIC_SET_OWNER); 3891 else 3892 QLCWRX(adapter->ahw, QLCNIC_FW_MBX_CTRL, QLCNIC_CLR_OWNER); 3893 } 3894 3895 static void qlcnic_83xx_dequeue_mbx_cmd(struct qlcnic_adapter *adapter, 3896 struct qlcnic_cmd_args *cmd) 3897 { 3898 struct qlcnic_mailbox *mbx = adapter->ahw->mailbox; 3899 3900 spin_lock(&mbx->queue_lock); 3901 3902 list_del(&cmd->list); 3903 mbx->num_cmds--; 3904 3905 spin_unlock(&mbx->queue_lock); 3906 3907 qlcnic_83xx_notify_cmd_completion(adapter, cmd); 3908 } 3909 3910 static void qlcnic_83xx_encode_mbx_cmd(struct qlcnic_adapter *adapter, 3911 struct qlcnic_cmd_args *cmd) 3912 { 3913 u32 mbx_cmd, fw_hal_version, hdr_size, total_size, tmp; 3914 struct qlcnic_hardware_context *ahw = adapter->ahw; 3915 int i, j; 3916 3917 if (cmd->op_type != QLC_83XX_MBX_POST_BC_OP) { 3918 mbx_cmd = cmd->req.arg[0]; 3919 writel(mbx_cmd, QLCNIC_MBX_HOST(ahw, 0)); 3920 for (i = 1; i < cmd->req.num; i++) 3921 writel(cmd->req.arg[i], QLCNIC_MBX_HOST(ahw, i)); 3922 } else { 3923 fw_hal_version = ahw->fw_hal_version; 3924 hdr_size = sizeof(struct qlcnic_bc_hdr) / sizeof(u32); 3925 total_size = cmd->pay_size + hdr_size; 3926 tmp = QLCNIC_CMD_BC_EVENT_SETUP | total_size << 16; 3927 mbx_cmd = tmp | fw_hal_version << 29; 3928 writel(mbx_cmd, QLCNIC_MBX_HOST(ahw, 0)); 3929 3930 /* Back channel specific operations bits */ 3931 mbx_cmd = 0x1 | 1 << 4; 3932 3933 if (qlcnic_sriov_pf_check(adapter)) 3934 mbx_cmd |= cmd->func_num << 5; 3935 3936 writel(mbx_cmd, QLCNIC_MBX_HOST(ahw, 1)); 3937 3938 for (i = 2, j = 0; j < hdr_size; i++, j++) 3939 writel(*(cmd->hdr++), QLCNIC_MBX_HOST(ahw, i)); 3940 for (j = 0; j < cmd->pay_size; j++, i++) 3941 writel(*(cmd->pay++), QLCNIC_MBX_HOST(ahw, i)); 3942 } 3943 } 3944 3945 void qlcnic_83xx_detach_mailbox_work(struct qlcnic_adapter *adapter) 3946 { 3947 struct qlcnic_mailbox *mbx = adapter->ahw->mailbox; 3948 3949 if (!mbx) 3950 return; 3951 3952 clear_bit(QLC_83XX_MBX_READY, &mbx->status); 3953 complete(&mbx->completion); 3954 cancel_work_sync(&mbx->work); 3955 flush_workqueue(mbx->work_q); 3956 qlcnic_83xx_flush_mbx_queue(adapter); 3957 } 3958 3959 static int qlcnic_83xx_enqueue_mbx_cmd(struct qlcnic_adapter *adapter, 3960 struct qlcnic_cmd_args *cmd, 3961 unsigned long *timeout) 3962 { 3963 struct qlcnic_mailbox *mbx = adapter->ahw->mailbox; 3964 3965 if (test_bit(QLC_83XX_MBX_READY, &mbx->status)) { 3966 atomic_set(&cmd->rsp_status, QLC_83XX_MBX_RESPONSE_WAIT); 3967 init_completion(&cmd->completion); 3968 cmd->rsp_opcode = QLC_83XX_MBX_RESPONSE_UNKNOWN; 3969 3970 spin_lock(&mbx->queue_lock); 3971 3972 list_add_tail(&cmd->list, &mbx->cmd_q); 3973 mbx->num_cmds++; 3974 cmd->total_cmds = mbx->num_cmds; 3975 *timeout = cmd->total_cmds * QLC_83XX_MBX_TIMEOUT; 3976 queue_work(mbx->work_q, &mbx->work); 3977 3978 spin_unlock(&mbx->queue_lock); 3979 3980 return 0; 3981 } 3982 3983 return -EBUSY; 3984 } 3985 3986 static int qlcnic_83xx_check_mac_rcode(struct qlcnic_adapter *adapter, 3987 struct qlcnic_cmd_args *cmd) 3988 { 3989 u8 mac_cmd_rcode; 3990 u32 fw_data; 3991 3992 if (cmd->cmd_op == QLCNIC_CMD_CONFIG_MAC_VLAN) { 3993 fw_data = readl(QLCNIC_MBX_FW(adapter->ahw, 2)); 3994 mac_cmd_rcode = (u8)fw_data; 3995 if (mac_cmd_rcode == QLC_83XX_NO_NIC_RESOURCE || 3996 mac_cmd_rcode == QLC_83XX_MAC_PRESENT || 3997 mac_cmd_rcode == QLC_83XX_MAC_ABSENT) { 3998 cmd->rsp_opcode = QLCNIC_RCODE_SUCCESS; 3999 return QLCNIC_RCODE_SUCCESS; 4000 } 4001 } 4002 4003 return -EINVAL; 4004 } 4005 4006 static void qlcnic_83xx_decode_mbx_rsp(struct qlcnic_adapter *adapter, 4007 struct qlcnic_cmd_args *cmd) 4008 { 4009 struct qlcnic_hardware_context *ahw = adapter->ahw; 4010 struct device *dev = &adapter->pdev->dev; 4011 u8 mbx_err_code; 4012 u32 fw_data; 4013 4014 fw_data = readl(QLCNIC_MBX_FW(ahw, 0)); 4015 mbx_err_code = QLCNIC_MBX_STATUS(fw_data); 4016 qlcnic_83xx_get_mbx_data(adapter, cmd); 4017 4018 switch (mbx_err_code) { 4019 case QLCNIC_MBX_RSP_OK: 4020 case QLCNIC_MBX_PORT_RSP_OK: 4021 cmd->rsp_opcode = QLCNIC_RCODE_SUCCESS; 4022 break; 4023 default: 4024 if (!qlcnic_83xx_check_mac_rcode(adapter, cmd)) 4025 break; 4026 4027 dev_err(dev, "%s: Mailbox command failed, opcode=0x%x, cmd_type=0x%x, func=0x%x, op_mode=0x%x, error=0x%x\n", 4028 __func__, cmd->cmd_op, cmd->type, ahw->pci_func, 4029 ahw->op_mode, mbx_err_code); 4030 cmd->rsp_opcode = QLC_83XX_MBX_RESPONSE_FAILED; 4031 qlcnic_dump_mbx(adapter, cmd); 4032 } 4033 4034 return; 4035 } 4036 4037 static inline void qlcnic_dump_mailbox_registers(struct qlcnic_adapter *adapter) 4038 { 4039 struct qlcnic_hardware_context *ahw = adapter->ahw; 4040 u32 offset; 4041 4042 offset = QLCRDX(ahw, QLCNIC_DEF_INT_MASK); 4043 dev_info(&adapter->pdev->dev, "Mbx interrupt mask=0x%x, Mbx interrupt enable=0x%x, Host mbx control=0x%x, Fw mbx control=0x%x", 4044 readl(ahw->pci_base0 + offset), 4045 QLCRDX(ahw, QLCNIC_MBX_INTR_ENBL), 4046 QLCRDX(ahw, QLCNIC_HOST_MBX_CTRL), 4047 QLCRDX(ahw, QLCNIC_FW_MBX_CTRL)); 4048 } 4049 4050 static void qlcnic_83xx_mailbox_worker(struct work_struct *work) 4051 { 4052 struct qlcnic_mailbox *mbx = container_of(work, struct qlcnic_mailbox, 4053 work); 4054 struct qlcnic_adapter *adapter = mbx->adapter; 4055 const struct qlcnic_mbx_ops *mbx_ops = mbx->ops; 4056 struct device *dev = &adapter->pdev->dev; 4057 struct list_head *head = &mbx->cmd_q; 4058 struct qlcnic_hardware_context *ahw; 4059 struct qlcnic_cmd_args *cmd = NULL; 4060 unsigned long flags; 4061 4062 ahw = adapter->ahw; 4063 4064 while (true) { 4065 if (qlcnic_83xx_check_mbx_status(adapter)) { 4066 qlcnic_83xx_flush_mbx_queue(adapter); 4067 return; 4068 } 4069 4070 spin_lock_irqsave(&mbx->aen_lock, flags); 4071 mbx->rsp_status = QLC_83XX_MBX_RESPONSE_WAIT; 4072 spin_unlock_irqrestore(&mbx->aen_lock, flags); 4073 4074 spin_lock(&mbx->queue_lock); 4075 4076 if (list_empty(head)) { 4077 spin_unlock(&mbx->queue_lock); 4078 return; 4079 } 4080 cmd = list_entry(head->next, struct qlcnic_cmd_args, list); 4081 4082 spin_unlock(&mbx->queue_lock); 4083 4084 mbx_ops->encode_cmd(adapter, cmd); 4085 mbx_ops->nofity_fw(adapter, QLC_83XX_MBX_REQUEST); 4086 4087 if (wait_for_completion_timeout(&mbx->completion, 4088 QLC_83XX_MBX_TIMEOUT)) { 4089 mbx_ops->decode_resp(adapter, cmd); 4090 mbx_ops->nofity_fw(adapter, QLC_83XX_MBX_COMPLETION); 4091 } else { 4092 dev_err(dev, "%s: Mailbox command timeout, opcode=0x%x, cmd_type=0x%x, func=0x%x, op_mode=0x%x\n", 4093 __func__, cmd->cmd_op, cmd->type, ahw->pci_func, 4094 ahw->op_mode); 4095 clear_bit(QLC_83XX_MBX_READY, &mbx->status); 4096 qlcnic_dump_mailbox_registers(adapter); 4097 qlcnic_83xx_get_mbx_data(adapter, cmd); 4098 qlcnic_dump_mbx(adapter, cmd); 4099 qlcnic_83xx_idc_request_reset(adapter, 4100 QLCNIC_FORCE_FW_DUMP_KEY); 4101 cmd->rsp_opcode = QLCNIC_RCODE_TIMEOUT; 4102 } 4103 mbx_ops->dequeue_cmd(adapter, cmd); 4104 } 4105 } 4106 4107 static const struct qlcnic_mbx_ops qlcnic_83xx_mbx_ops = { 4108 .enqueue_cmd = qlcnic_83xx_enqueue_mbx_cmd, 4109 .dequeue_cmd = qlcnic_83xx_dequeue_mbx_cmd, 4110 .decode_resp = qlcnic_83xx_decode_mbx_rsp, 4111 .encode_cmd = qlcnic_83xx_encode_mbx_cmd, 4112 .nofity_fw = qlcnic_83xx_signal_mbx_cmd, 4113 }; 4114 4115 int qlcnic_83xx_init_mailbox_work(struct qlcnic_adapter *adapter) 4116 { 4117 struct qlcnic_hardware_context *ahw = adapter->ahw; 4118 struct qlcnic_mailbox *mbx; 4119 4120 ahw->mailbox = kzalloc(sizeof(*mbx), GFP_KERNEL); 4121 if (!ahw->mailbox) 4122 return -ENOMEM; 4123 4124 mbx = ahw->mailbox; 4125 mbx->ops = &qlcnic_83xx_mbx_ops; 4126 mbx->adapter = adapter; 4127 4128 spin_lock_init(&mbx->queue_lock); 4129 spin_lock_init(&mbx->aen_lock); 4130 INIT_LIST_HEAD(&mbx->cmd_q); 4131 init_completion(&mbx->completion); 4132 4133 mbx->work_q = create_singlethread_workqueue("qlcnic_mailbox"); 4134 if (mbx->work_q == NULL) { 4135 kfree(mbx); 4136 return -ENOMEM; 4137 } 4138 4139 INIT_WORK(&mbx->work, qlcnic_83xx_mailbox_worker); 4140 set_bit(QLC_83XX_MBX_READY, &mbx->status); 4141 return 0; 4142 } 4143 4144 static pci_ers_result_t qlcnic_83xx_io_error_detected(struct pci_dev *pdev, 4145 pci_channel_state_t state) 4146 { 4147 struct qlcnic_adapter *adapter = pci_get_drvdata(pdev); 4148 4149 if (state == pci_channel_io_perm_failure) 4150 return PCI_ERS_RESULT_DISCONNECT; 4151 4152 if (state == pci_channel_io_normal) 4153 return PCI_ERS_RESULT_RECOVERED; 4154 4155 set_bit(__QLCNIC_AER, &adapter->state); 4156 set_bit(__QLCNIC_RESETTING, &adapter->state); 4157 4158 qlcnic_83xx_aer_stop_poll_work(adapter); 4159 4160 pci_save_state(pdev); 4161 pci_disable_device(pdev); 4162 4163 return PCI_ERS_RESULT_NEED_RESET; 4164 } 4165 4166 static pci_ers_result_t qlcnic_83xx_io_slot_reset(struct pci_dev *pdev) 4167 { 4168 struct qlcnic_adapter *adapter = pci_get_drvdata(pdev); 4169 int err = 0; 4170 4171 pdev->error_state = pci_channel_io_normal; 4172 err = pci_enable_device(pdev); 4173 if (err) 4174 goto disconnect; 4175 4176 pci_set_power_state(pdev, PCI_D0); 4177 pci_set_master(pdev); 4178 pci_restore_state(pdev); 4179 4180 err = qlcnic_83xx_aer_reset(adapter); 4181 if (err == 0) 4182 return PCI_ERS_RESULT_RECOVERED; 4183 disconnect: 4184 clear_bit(__QLCNIC_AER, &adapter->state); 4185 clear_bit(__QLCNIC_RESETTING, &adapter->state); 4186 return PCI_ERS_RESULT_DISCONNECT; 4187 } 4188 4189 static void qlcnic_83xx_io_resume(struct pci_dev *pdev) 4190 { 4191 struct qlcnic_adapter *adapter = pci_get_drvdata(pdev); 4192 4193 pci_cleanup_aer_uncorrect_error_status(pdev); 4194 if (test_and_clear_bit(__QLCNIC_AER, &adapter->state)) 4195 qlcnic_83xx_aer_start_poll_work(adapter); 4196 } 4197