Lines Matching +full:0 +full:x00000000 +full:- +full:0 +full:x07ffffff

3  * Copyright (c) 2007-2013 Broadcom Corporation
32 /* Note: in the format strings below %s is replaced by the queue-name which is
34 * length does not exceed ETH_GSTRING_LEN - MAX_QUEUE_NAME_LEN + 2
196 switch (bp->link_params.phy[phy_idx].media_type) { in bnx2x_get_port_type()
228 cmd->link_modes.supported); in bnx2x_get_vf_link_ksettings()
230 cmd->link_modes.advertising); in bnx2x_get_vf_link_ksettings()
232 if (bp->state == BNX2X_STATE_OPEN) { in bnx2x_get_vf_link_ksettings()
234 &bp->vf_link_vars.link_report_flags)) in bnx2x_get_vf_link_ksettings()
235 cmd->base.duplex = DUPLEX_FULL; in bnx2x_get_vf_link_ksettings()
237 cmd->base.duplex = DUPLEX_HALF; in bnx2x_get_vf_link_ksettings()
239 cmd->base.speed = bp->vf_link_vars.line_speed; in bnx2x_get_vf_link_ksettings()
241 cmd->base.duplex = DUPLEX_UNKNOWN; in bnx2x_get_vf_link_ksettings()
242 cmd->base.speed = SPEED_UNKNOWN; in bnx2x_get_vf_link_ksettings()
245 cmd->base.port = PORT_OTHER; in bnx2x_get_vf_link_ksettings()
246 cmd->base.phy_address = 0; in bnx2x_get_vf_link_ksettings()
247 cmd->base.autoneg = AUTONEG_DISABLE; in bnx2x_get_vf_link_ksettings()
250 " supported 0x%x advertising 0x%x speed %u\n" in bnx2x_get_vf_link_ksettings()
253 cmd->base.cmd, supported, advertising, in bnx2x_get_vf_link_ksettings()
254 cmd->base.speed, in bnx2x_get_vf_link_ksettings()
255 cmd->base.duplex, cmd->base.port, cmd->base.phy_address, in bnx2x_get_vf_link_ksettings()
256 cmd->base.autoneg); in bnx2x_get_vf_link_ksettings()
258 return 0; in bnx2x_get_vf_link_ksettings()
270 cmd->link_modes.lp_advertising); in bnx2x_get_link_ksettings()
273 supported = bp->port.supported[cfg_idx] | in bnx2x_get_link_ksettings()
274 (bp->port.supported[cfg_idx ^ 1] & in bnx2x_get_link_ksettings()
276 advertising = bp->port.advertising[cfg_idx]; in bnx2x_get_link_ksettings()
277 media_type = bp->link_params.phy[bnx2x_get_cur_phy_idx(bp)].media_type; in bnx2x_get_link_ksettings()
283 if ((bp->state == BNX2X_STATE_OPEN) && bp->link_vars.link_up && in bnx2x_get_link_ksettings()
284 !(bp->flags & MF_FUNC_DIS)) { in bnx2x_get_link_ksettings()
285 cmd->base.duplex = bp->link_vars.duplex; in bnx2x_get_link_ksettings()
288 cmd->base.speed = bnx2x_get_mf_speed(bp); in bnx2x_get_link_ksettings()
290 cmd->base.speed = bp->link_vars.line_speed; in bnx2x_get_link_ksettings()
292 cmd->base.duplex = DUPLEX_UNKNOWN; in bnx2x_get_link_ksettings()
293 cmd->base.speed = SPEED_UNKNOWN; in bnx2x_get_link_ksettings()
296 cmd->base.port = bnx2x_get_port_type(bp); in bnx2x_get_link_ksettings()
298 cmd->base.phy_address = bp->mdio.prtad; in bnx2x_get_link_ksettings()
300 if (bp->link_params.req_line_speed[cfg_idx] == SPEED_AUTO_NEG) in bnx2x_get_link_ksettings()
301 cmd->base.autoneg = AUTONEG_ENABLE; in bnx2x_get_link_ksettings()
303 cmd->base.autoneg = AUTONEG_DISABLE; in bnx2x_get_link_ksettings()
306 if (bp->link_vars.link_status & LINK_STATUS_AUTO_NEGOTIATE_COMPLETE) { in bnx2x_get_link_ksettings()
307 u32 status = bp->link_vars.link_status; in bnx2x_get_link_ksettings()
349 ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.supported, in bnx2x_get_link_ksettings()
351 ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.advertising, in bnx2x_get_link_ksettings()
353 ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.lp_advertising, in bnx2x_get_link_ksettings()
357 " supported 0x%x advertising 0x%x speed %u\n" in bnx2x_get_link_ksettings()
360 cmd->base.cmd, supported, advertising, in bnx2x_get_link_ksettings()
361 cmd->base.speed, in bnx2x_get_link_ksettings()
362 cmd->base.duplex, cmd->base.port, cmd->base.phy_address, in bnx2x_get_link_ksettings()
363 cmd->base.autoneg); in bnx2x_get_link_ksettings()
365 return 0; in bnx2x_get_link_ksettings()
375 u8 duplex = cmd->base.duplex; in bnx2x_set_link_ksettings()
378 cmd->link_modes.supported); in bnx2x_set_link_ksettings()
380 cmd->link_modes.advertising); in bnx2x_set_link_ksettings()
383 return 0; in bnx2x_set_link_ksettings()
386 " supported 0x%x advertising 0x%x speed %u\n" in bnx2x_set_link_ksettings()
389 cmd->base.cmd, supported, advertising, in bnx2x_set_link_ksettings()
390 cmd->base.speed, in bnx2x_set_link_ksettings()
391 cmd->base.duplex, cmd->base.port, cmd->base.phy_address, in bnx2x_set_link_ksettings()
392 cmd->base.autoneg); in bnx2x_set_link_ksettings()
394 speed = cmd->base.speed; in bnx2x_set_link_ksettings()
402 u32 line_speed = bp->link_vars.line_speed; in bnx2x_set_link_ksettings()
408 if (bp->common.bc_ver < REQ_BC_VER_4_SET_MF_BW) { in bnx2x_set_link_ksettings()
412 return -EINVAL; in bnx2x_set_link_ksettings()
420 return -EINVAL; in bnx2x_set_link_ksettings()
423 if (bp->state != BNX2X_STATE_OPEN) in bnx2x_set_link_ksettings()
425 bp->pending_max = part; in bnx2x_set_link_ksettings()
429 return 0; in bnx2x_set_link_ksettings()
433 old_multi_phy_config = bp->link_params.multi_phy_config; in bnx2x_set_link_ksettings()
434 if (cmd->base.port != bnx2x_get_port_type(bp)) { in bnx2x_set_link_ksettings()
435 switch (cmd->base.port) { in bnx2x_set_link_ksettings()
437 if (!(bp->port.supported[0] & SUPPORTED_TP || in bnx2x_set_link_ksettings()
438 bp->port.supported[1] & SUPPORTED_TP)) { in bnx2x_set_link_ksettings()
441 return -EINVAL; in bnx2x_set_link_ksettings()
443 bp->link_params.multi_phy_config &= in bnx2x_set_link_ksettings()
445 if (bp->link_params.multi_phy_config & in bnx2x_set_link_ksettings()
447 bp->link_params.multi_phy_config |= in bnx2x_set_link_ksettings()
450 bp->link_params.multi_phy_config |= in bnx2x_set_link_ksettings()
456 if (!(bp->port.supported[0] & SUPPORTED_FIBRE || in bnx2x_set_link_ksettings()
457 bp->port.supported[1] & SUPPORTED_FIBRE)) { in bnx2x_set_link_ksettings()
460 return -EINVAL; in bnx2x_set_link_ksettings()
462 bp->link_params.multi_phy_config &= in bnx2x_set_link_ksettings()
464 if (bp->link_params.multi_phy_config & in bnx2x_set_link_ksettings()
466 bp->link_params.multi_phy_config |= in bnx2x_set_link_ksettings()
469 bp->link_params.multi_phy_config |= in bnx2x_set_link_ksettings()
474 return -EINVAL; in bnx2x_set_link_ksettings()
478 new_multi_phy_config = bp->link_params.multi_phy_config; in bnx2x_set_link_ksettings()
482 bp->link_params.multi_phy_config = old_multi_phy_config; in bnx2x_set_link_ksettings()
485 if (cmd->base.autoneg == AUTONEG_ENABLE) { in bnx2x_set_link_ksettings()
486 u32 an_supported_speed = bp->port.supported[cfg_idx]; in bnx2x_set_link_ksettings()
487 if (bp->link_params.phy[EXT_PHY1].type == in bnx2x_set_link_ksettings()
491 if (!(bp->port.supported[cfg_idx] & SUPPORTED_Autoneg)) { in bnx2x_set_link_ksettings()
493 return -EINVAL; in bnx2x_set_link_ksettings()
500 return -EINVAL; in bnx2x_set_link_ksettings()
503 bp->link_params.req_line_speed[cfg_idx] = SPEED_AUTO_NEG; in bnx2x_set_link_ksettings()
504 bp->link_params.req_duplex[cfg_idx] = duplex; in bnx2x_set_link_ksettings()
505 bp->port.advertising[cfg_idx] = (ADVERTISED_Autoneg | in bnx2x_set_link_ksettings()
509 bp->link_params.speed_cap_mask[cfg_idx] = 0; in bnx2x_set_link_ksettings()
511 bp->link_params.speed_cap_mask[cfg_idx] |= in bnx2x_set_link_ksettings()
515 bp->link_params.speed_cap_mask[cfg_idx] |= in bnx2x_set_link_ksettings()
519 bp->link_params.speed_cap_mask[cfg_idx] |= in bnx2x_set_link_ksettings()
523 bp->link_params.speed_cap_mask[cfg_idx] |= in bnx2x_set_link_ksettings()
527 bp->link_params.speed_cap_mask[cfg_idx] |= in bnx2x_set_link_ksettings()
532 bp->link_params.speed_cap_mask[cfg_idx] |= in bnx2x_set_link_ksettings()
538 bp->link_params.speed_cap_mask[cfg_idx] |= in bnx2x_set_link_ksettings()
542 bp->link_params.speed_cap_mask[cfg_idx] |= in bnx2x_set_link_ksettings()
550 if (!(bp->port.supported[cfg_idx] & in bnx2x_set_link_ksettings()
554 return -EINVAL; in bnx2x_set_link_ksettings()
560 if (!(bp->port.supported[cfg_idx] & in bnx2x_set_link_ksettings()
564 return -EINVAL; in bnx2x_set_link_ksettings()
574 if (!(bp->port.supported[cfg_idx] & in bnx2x_set_link_ksettings()
578 return -EINVAL; in bnx2x_set_link_ksettings()
584 if (!(bp->port.supported[cfg_idx] & in bnx2x_set_link_ksettings()
588 return -EINVAL; in bnx2x_set_link_ksettings()
600 return -EINVAL; in bnx2x_set_link_ksettings()
603 if (bp->port.supported[cfg_idx] & in bnx2x_set_link_ksettings()
608 } else if (bp->port.supported[cfg_idx] & in bnx2x_set_link_ksettings()
614 return -EINVAL; in bnx2x_set_link_ksettings()
623 return -EINVAL; in bnx2x_set_link_ksettings()
626 if (!(bp->port.supported[cfg_idx] in bnx2x_set_link_ksettings()
630 return -EINVAL; in bnx2x_set_link_ksettings()
641 return -EINVAL; in bnx2x_set_link_ksettings()
644 if ((bp->port.supported[cfg_idx] & in bnx2x_set_link_ksettings()
646 (bp->link_params.phy[phy_idx].media_type != in bnx2x_set_link_ksettings()
650 } else if (bp->port.supported[cfg_idx] & in bnx2x_set_link_ksettings()
657 return -EINVAL; in bnx2x_set_link_ksettings()
664 return -EINVAL; in bnx2x_set_link_ksettings()
667 bp->link_params.req_line_speed[cfg_idx] = speed; in bnx2x_set_link_ksettings()
668 bp->link_params.req_duplex[cfg_idx] = duplex; in bnx2x_set_link_ksettings()
669 bp->port.advertising[cfg_idx] = advertising; in bnx2x_set_link_ksettings()
673 " req_duplex %d advertising 0x%x\n", in bnx2x_set_link_ksettings()
674 bp->link_params.req_line_speed[cfg_idx], in bnx2x_set_link_ksettings()
675 bp->link_params.req_duplex[cfg_idx], in bnx2x_set_link_ksettings()
676 bp->port.advertising[cfg_idx]); in bnx2x_set_link_ksettings()
679 bp->link_params.multi_phy_config = new_multi_phy_config; in bnx2x_set_link_ksettings()
686 return 0; in bnx2x_set_link_ksettings()
689 #define DUMP_ALL_PRESETS 0x1FFF
695 return dump_num_registers[0][preset-1]; in __bnx2x_get_preset_regs_len()
697 return dump_num_registers[1][preset-1]; in __bnx2x_get_preset_regs_len()
699 return dump_num_registers[2][preset-1]; in __bnx2x_get_preset_regs_len()
701 return dump_num_registers[3][preset-1]; in __bnx2x_get_preset_regs_len()
703 return dump_num_registers[4][preset-1]; in __bnx2x_get_preset_regs_len()
705 return 0; in __bnx2x_get_preset_regs_len()
711 int regdump_len = 0; in __bnx2x_get_regs_len()
723 int regdump_len = 0; in bnx2x_get_regs_len()
726 return 0; in bnx2x_get_regs_len()
742 ((presets & (1 << (idx-1))) == (1 << (idx-1)))
762 return 0; in __bnx2x_get_page_reg_num()
782 return 0; in __bnx2x_get_page_write_num()
802 return 0; in __bnx2x_get_page_read_num()
809 return IS_E1_REG(reg_info->chips); in bnx2x_is_reg_in_chip()
811 return IS_E1H_REG(reg_info->chips); in bnx2x_is_reg_in_chip()
813 return IS_E2_REG(reg_info->chips); in bnx2x_is_reg_in_chip()
815 return IS_E3A0_REG(reg_info->chips); in bnx2x_is_reg_in_chip()
817 return IS_E3B0_REG(reg_info->chips); in bnx2x_is_reg_in_chip()
826 return IS_E1_REG(wreg_info->chips); in bnx2x_is_wreg_in_chip()
828 return IS_E1H_REG(wreg_info->chips); in bnx2x_is_wreg_in_chip()
830 return IS_E2_REG(wreg_info->chips); in bnx2x_is_wreg_in_chip()
832 return IS_E3A0_REG(wreg_info->chips); in bnx2x_is_wreg_in_chip()
834 return IS_E3B0_REG(wreg_info->chips); in bnx2x_is_wreg_in_chip()
840 * bnx2x_read_pages_regs - read "paged" registers
869 for (i = 0; i < num_pages; i++) { in bnx2x_read_pages_regs()
870 for (j = 0; j < write_num; j++) { in bnx2x_read_pages_regs()
873 for (k = 0; k < read_num; k++) { in bnx2x_read_pages_regs()
877 for (n = 0; n < size; n++) { in bnx2x_read_pages_regs()
904 for (i = 0; i < IDLE_REGS_COUNT; i++) { in __bnx2x_get_preset_regs()
907 for (j = 0; j < idle_reg_addrs[i].size; j++) in __bnx2x_get_preset_regs()
913 for (i = 0; i < REGS_COUNT; i++) { in __bnx2x_get_preset_regs()
916 for (j = 0; j < reg_addrs[i].size; j++) in __bnx2x_get_preset_regs()
923 IS_REG_IN_PRESET(wreg_addr_p->presets, preset)) { in __bnx2x_get_preset_regs()
924 for (i = 0; i < wreg_addr_p->size; i++) { in __bnx2x_get_preset_regs()
925 *p++ = REG_RD(bp, wreg_addr_p->addr + i*4); in __bnx2x_get_preset_regs()
930 for (j = 0; j < wreg_addr_p->read_regs_count; j++) { in __bnx2x_get_preset_regs()
931 addr = *(wreg_addr_p->read_regs); in __bnx2x_get_preset_regs()
943 return 0; in __bnx2x_get_preset_regs()
968 struct dump_header dump_hdr = {0}; in bnx2x_get_regs()
970 regs->version = 2; in bnx2x_get_regs()
971 memset(p, 0, regs->len); in bnx2x_get_regs()
973 if (!netif_running(bp->dev)) in bnx2x_get_regs()
978 * will re-enable parity attentions right after the dump. in bnx2x_get_regs()
983 dump_hdr.header_size = (sizeof(struct dump_header) / 4) - 1; in bnx2x_get_regs()
1014 /* Re-enable parity attentions */ in bnx2x_get_regs()
1022 int regdump_len = 0; in bnx2x_get_preset_regs_len()
1036 if (val->flag < 1 || val->flag > DUMP_MAX_PRESETS) in bnx2x_set_dump()
1037 return -EINVAL; in bnx2x_set_dump()
1039 bp->dump_preset_idx = val->flag; in bnx2x_set_dump()
1040 return 0; in bnx2x_set_dump()
1048 dump->version = BNX2X_DUMP_VERSION; in bnx2x_get_dump_flag()
1049 dump->flag = bp->dump_preset_idx; in bnx2x_get_dump_flag()
1051 dump->len = bnx2x_get_preset_regs_len(dev, bp->dump_preset_idx); in bnx2x_get_dump_flag()
1053 bp->dump_preset_idx, dump->len); in bnx2x_get_dump_flag()
1054 return 0; in bnx2x_get_dump_flag()
1063 struct dump_header dump_hdr = {0}; in bnx2x_get_dump_data()
1067 * will re-enable parity attentions right after the dump. in bnx2x_get_dump_data()
1072 dump_hdr.header_size = (sizeof(struct dump_header) / 4) - 1; in bnx2x_get_dump_data()
1073 dump_hdr.preset = bp->dump_preset_idx; in bnx2x_get_dump_data()
1100 /* Re-enable parity attentions */ in bnx2x_get_dump_data()
1104 return 0; in bnx2x_get_dump_data()
1115 strscpy(info->driver, DRV_MODULE_NAME, sizeof(info->driver)); in bnx2x_get_drvinfo()
1124 memset(version, 0, sizeof(version)); in bnx2x_get_drvinfo()
1126 (mbi & 0xff000000) >> 24, in bnx2x_get_drvinfo()
1127 (mbi & 0x00ff0000) >> 16, in bnx2x_get_drvinfo()
1128 (mbi & 0x0000ff00) >> 8); in bnx2x_get_drvinfo()
1129 strscpy(info->fw_version, version, in bnx2x_get_drvinfo()
1130 sizeof(info->fw_version)); in bnx2x_get_drvinfo()
1134 memset(version, 0, sizeof(version)); in bnx2x_get_drvinfo()
1136 strlcat(info->fw_version, version, sizeof(info->fw_version)); in bnx2x_get_drvinfo()
1138 strscpy(info->bus_info, pci_name(bp->pdev), sizeof(info->bus_info)); in bnx2x_get_drvinfo()
1145 if (bp->flags & NO_WOL_FLAG) { in bnx2x_get_wol()
1146 wol->supported = 0; in bnx2x_get_wol()
1147 wol->wolopts = 0; in bnx2x_get_wol()
1149 wol->supported = WAKE_MAGIC; in bnx2x_get_wol()
1150 if (bp->wol) in bnx2x_get_wol()
1151 wol->wolopts = WAKE_MAGIC; in bnx2x_get_wol()
1153 wol->wolopts = 0; in bnx2x_get_wol()
1155 memset(&wol->sopass, 0, sizeof(wol->sopass)); in bnx2x_get_wol()
1162 if (wol->wolopts & ~WAKE_MAGIC) { in bnx2x_set_wol()
1164 return -EINVAL; in bnx2x_set_wol()
1167 if (wol->wolopts & WAKE_MAGIC) { in bnx2x_set_wol()
1168 if (bp->flags & NO_WOL_FLAG) { in bnx2x_set_wol()
1170 return -EINVAL; in bnx2x_set_wol()
1172 bp->wol = 1; in bnx2x_set_wol()
1174 bp->wol = 0; in bnx2x_set_wol()
1179 return 0; in bnx2x_set_wol()
1186 return bp->msg_enable; in bnx2x_get_msglevel()
1197 bp->msg_enable = level; in bnx2x_set_msglevel()
1205 if (!bp->port.pmf) in bnx2x_nway_reset()
1206 return 0; in bnx2x_nway_reset()
1214 return 0; in bnx2x_nway_reset()
1221 if (bp->flags & MF_FUNC_DIS || (bp->state != BNX2X_STATE_OPEN)) in bnx2x_get_link()
1222 return 0; in bnx2x_get_link()
1226 &bp->vf_link_vars.link_report_flags); in bnx2x_get_link()
1228 return bp->link_vars.link_up; in bnx2x_get_link()
1235 return bp->common.flash_size; in bnx2x_get_eeprom_len()
1269 for (i = 0; i < count*10; i++) { in bnx2x_acquire_nvram_lock()
1281 return -EBUSY; in bnx2x_acquire_nvram_lock()
1284 return 0; in bnx2x_acquire_nvram_lock()
1302 for (i = 0; i < count*10; i++) { in bnx2x_release_nvram_lock()
1313 return -EBUSY; in bnx2x_release_nvram_lock()
1318 return 0; in bnx2x_release_nvram_lock()
1370 *ret_val = 0; in bnx2x_nvram_read_dword()
1371 rc = -EBUSY; in bnx2x_nvram_read_dword()
1372 for (i = 0; i < count; i++) { in bnx2x_nvram_read_dword()
1380 * converting to big-endian will do the work in bnx2x_nvram_read_dword()
1383 rc = 0; in bnx2x_nvram_read_dword()
1387 if (rc == -EBUSY) in bnx2x_nvram_read_dword()
1400 if ((offset & 0x03) || (buf_size & 0x03) || (buf_size == 0)) { in bnx2x_nvram_read()
1402 "Invalid parameter: offset 0x%x buf_size 0x%x\n", in bnx2x_nvram_read()
1404 return -EINVAL; in bnx2x_nvram_read()
1407 if (offset + buf_size > bp->common.flash_size) { in bnx2x_nvram_read()
1409 "Invalid parameter: offset (0x%x) + buf_size (0x%x) > flash_size (0x%x)\n", in bnx2x_nvram_read()
1410 offset, buf_size, bp->common.flash_size); in bnx2x_nvram_read()
1411 return -EINVAL; in bnx2x_nvram_read()
1424 while ((buf_size > sizeof(u32)) && (rc == 0)) { in bnx2x_nvram_read()
1431 buf_size -= sizeof(u32); in bnx2x_nvram_read()
1432 cmd_flags = 0; in bnx2x_nvram_read()
1435 if (rc == 0) { in bnx2x_nvram_read()
1458 while ((buf_size -= 4) >= 0) in bnx2x_nvram_read32()
1468 u16 pm = 0; in bnx2x_is_nvm_accessible()
1469 struct net_device *dev = pci_get_drvdata(bp->pdev); in bnx2x_is_nvm_accessible()
1471 if (bp->pdev->pm_cap) in bnx2x_is_nvm_accessible()
1472 rc = pci_read_config_word(bp->pdev, in bnx2x_is_nvm_accessible()
1473 bp->pdev->pm_cap + PCI_PM_CTRL, &pm); in bnx2x_is_nvm_accessible()
1490 return -EAGAIN; in bnx2x_get_eeprom()
1494 " magic 0x%x offset 0x%x (%d) len 0x%x (%d)\n", in bnx2x_get_eeprom()
1495 eeprom->cmd, eeprom->magic, eeprom->offset, eeprom->offset, in bnx2x_get_eeprom()
1496 eeprom->len, eeprom->len); in bnx2x_get_eeprom()
1500 return bnx2x_nvram_read(bp, eeprom->offset, eebuf, eeprom->len); in bnx2x_get_eeprom()
1508 int rc = -EINVAL, phy_idx; in bnx2x_get_module_eeprom()
1510 unsigned int start_addr = ee->offset, xfer_size = 0; in bnx2x_get_module_eeprom()
1515 return -EAGAIN; in bnx2x_get_module_eeprom()
1523 if (start_addr + ee->len > ETH_MODULE_SFF_8079_LEN) in bnx2x_get_module_eeprom()
1524 xfer_size = ETH_MODULE_SFF_8079_LEN - start_addr; in bnx2x_get_module_eeprom()
1526 xfer_size = ee->len; in bnx2x_get_module_eeprom()
1528 rc = bnx2x_read_sfp_module_eeprom(&bp->link_params.phy[phy_idx], in bnx2x_get_module_eeprom()
1529 &bp->link_params, in bnx2x_get_module_eeprom()
1538 return -EINVAL; in bnx2x_get_module_eeprom()
1547 xfer_size = ee->len - xfer_size; in bnx2x_get_module_eeprom()
1550 xfer_size = ETH_MODULE_SFF_8472_LEN - start_addr; in bnx2x_get_module_eeprom()
1551 start_addr -= ETH_MODULE_SFF_8079_LEN; in bnx2x_get_module_eeprom()
1553 rc = bnx2x_read_sfp_module_eeprom(&bp->link_params.phy[phy_idx], in bnx2x_get_module_eeprom()
1554 &bp->link_params, in bnx2x_get_module_eeprom()
1562 return -EINVAL; in bnx2x_get_module_eeprom()
1578 return -EAGAIN; in bnx2x_get_module_info()
1582 rc = bnx2x_read_sfp_module_eeprom(&bp->link_params.phy[phy_idx], in bnx2x_get_module_info()
1583 &bp->link_params, in bnx2x_get_module_info()
1590 DP(BNX2X_MSG_ETHTOOL, "Failed reading SFF-8472 comp field\n"); in bnx2x_get_module_info()
1591 return -EINVAL; in bnx2x_get_module_info()
1595 rc = bnx2x_read_sfp_module_eeprom(&bp->link_params.phy[phy_idx], in bnx2x_get_module_info()
1596 &bp->link_params, in bnx2x_get_module_info()
1604 return -EINVAL; in bnx2x_get_module_info()
1610 modinfo->type = ETH_MODULE_SFF_8079; in bnx2x_get_module_info()
1611 modinfo->eeprom_len = ETH_MODULE_SFF_8079_LEN; in bnx2x_get_module_info()
1613 modinfo->type = ETH_MODULE_SFF_8472; in bnx2x_get_module_info()
1614 modinfo->eeprom_len = ETH_MODULE_SFF_8472_LEN; in bnx2x_get_module_info()
1616 return 0; in bnx2x_get_module_info()
1646 rc = -EBUSY; in bnx2x_nvram_write_dword()
1647 for (i = 0; i < count; i++) { in bnx2x_nvram_write_dword()
1651 rc = 0; in bnx2x_nvram_write_dword()
1656 if (rc == -EBUSY) in bnx2x_nvram_write_dword()
1662 #define BYTE_OFFSET(offset) (8 * (offset & 0x03))
1671 if (offset + buf_size > bp->common.flash_size) { in bnx2x_nvram_write1()
1673 "Invalid parameter: offset (0x%x) + buf_size (0x%x) > flash_size (0x%x)\n", in bnx2x_nvram_write1()
1674 offset, buf_size, bp->common.flash_size); in bnx2x_nvram_write1()
1675 return -EINVAL; in bnx2x_nvram_write1()
1687 align_offset = (offset & ~0x03); in bnx2x_nvram_write1()
1690 if (rc == 0) { in bnx2x_nvram_write1()
1697 (0xff << BYTE_OFFSET(offset))); in bnx2x_nvram_write1()
1723 if ((offset & 0x03) || (buf_size & 0x03) || (buf_size == 0)) { in bnx2x_nvram_write()
1725 "Invalid parameter: offset 0x%x buf_size 0x%x\n", in bnx2x_nvram_write()
1727 return -EINVAL; in bnx2x_nvram_write()
1730 if (offset + buf_size > bp->common.flash_size) { in bnx2x_nvram_write()
1732 "Invalid parameter: offset (0x%x) + buf_size (0x%x) > flash_size (0x%x)\n", in bnx2x_nvram_write()
1733 offset, buf_size, bp->common.flash_size); in bnx2x_nvram_write()
1734 return -EINVAL; in bnx2x_nvram_write()
1745 written_so_far = 0; in bnx2x_nvram_write()
1747 while ((written_so_far < buf_size) && (rc == 0)) { in bnx2x_nvram_write()
1748 if (written_so_far == (buf_size - sizeof(u32))) in bnx2x_nvram_write()
1750 else if (((offset + 4) % BNX2X_NVRAM_PAGE_SIZE) == 0) in bnx2x_nvram_write()
1752 else if ((offset % BNX2X_NVRAM_PAGE_SIZE) == 0) in bnx2x_nvram_write()
1776 "Releasing NVM lock after offset 0x%x\n", in bnx2x_nvram_write()
1777 (u32)(offset - sizeof(u32))); in bnx2x_nvram_write()
1785 cmd_flags = 0; in bnx2x_nvram_write()
1800 int rc = 0; in bnx2x_set_eeprom()
1806 return -EAGAIN; in bnx2x_set_eeprom()
1810 " magic 0x%x offset 0x%x (%d) len 0x%x (%d)\n", in bnx2x_set_eeprom()
1811 eeprom->cmd, eeprom->magic, eeprom->offset, eeprom->offset, in bnx2x_set_eeprom()
1812 eeprom->len, eeprom->len); in bnx2x_set_eeprom()
1817 if ((eeprom->magic >= 0x50485900) && (eeprom->magic <= 0x504859FF) && in bnx2x_set_eeprom()
1818 !bp->port.pmf) { in bnx2x_set_eeprom()
1821 return -EINVAL; in bnx2x_set_eeprom()
1828 if (eeprom->magic == 0x50485950) { in bnx2x_set_eeprom()
1829 /* 'PHYP' (0x50485950): prepare phy for FW upgrade */ in bnx2x_set_eeprom()
1833 rc |= bnx2x_link_reset(&bp->link_params, in bnx2x_set_eeprom()
1834 &bp->link_vars, 0); in bnx2x_set_eeprom()
1842 } else if (eeprom->magic == 0x50485952) { in bnx2x_set_eeprom()
1843 /* 'PHYR' (0x50485952): re-init link after FW upgrade */ in bnx2x_set_eeprom()
1844 if (bp->state == BNX2X_STATE_OPEN) { in bnx2x_set_eeprom()
1846 rc |= bnx2x_link_reset(&bp->link_params, in bnx2x_set_eeprom()
1847 &bp->link_vars, 1); in bnx2x_set_eeprom()
1849 rc |= bnx2x_phy_init(&bp->link_params, in bnx2x_set_eeprom()
1850 &bp->link_vars); in bnx2x_set_eeprom()
1854 } else if (eeprom->magic == 0x53985943) { in bnx2x_set_eeprom()
1855 /* 'PHYC' (0x53985943): PHY FW upgrade completed */ in bnx2x_set_eeprom()
1866 &bp->link_params.phy[EXT_PHY1]); in bnx2x_set_eeprom()
1875 rc = bnx2x_nvram_write(bp, eeprom->offset, eebuf, eeprom->len); in bnx2x_set_eeprom()
1887 memset(coal, 0, sizeof(struct ethtool_coalesce)); in bnx2x_get_coalesce()
1889 coal->rx_coalesce_usecs = bp->rx_ticks; in bnx2x_get_coalesce()
1890 coal->tx_coalesce_usecs = bp->tx_ticks; in bnx2x_get_coalesce()
1892 return 0; in bnx2x_get_coalesce()
1902 bp->rx_ticks = (u16)coal->rx_coalesce_usecs; in bnx2x_set_coalesce()
1903 if (bp->rx_ticks > BNX2X_MAX_COALESCE_TOUT) in bnx2x_set_coalesce()
1904 bp->rx_ticks = BNX2X_MAX_COALESCE_TOUT; in bnx2x_set_coalesce()
1906 bp->tx_ticks = (u16)coal->tx_coalesce_usecs; in bnx2x_set_coalesce()
1907 if (bp->tx_ticks > BNX2X_MAX_COALESCE_TOUT) in bnx2x_set_coalesce()
1908 bp->tx_ticks = BNX2X_MAX_COALESCE_TOUT; in bnx2x_set_coalesce()
1913 return 0; in bnx2x_set_coalesce()
1923 ering->rx_max_pending = MAX_RX_AVAIL; in bnx2x_get_ringparam()
1931 if (bp->rx_ring_size) in bnx2x_get_ringparam()
1932 ering->rx_pending = bp->rx_ring_size; in bnx2x_get_ringparam()
1934 ering->rx_pending = MAX_RX_AVAIL / BNX2X_NUM_RX_QUEUES(bp); in bnx2x_get_ringparam()
1936 ering->rx_pending = MAX_RX_AVAIL; in bnx2x_get_ringparam()
1938 ering->tx_max_pending = IS_MF_FCOE_AFEX(bp) ? 0 : MAX_TX_AVAIL; in bnx2x_get_ringparam()
1939 ering->tx_pending = bp->tx_ring_size; in bnx2x_get_ringparam()
1951 ering->rx_pending, ering->tx_pending); in bnx2x_set_ringparam()
1953 if (pci_num_vf(bp->pdev)) { in bnx2x_set_ringparam()
1956 return -EPERM; in bnx2x_set_ringparam()
1959 if (bp->recovery_state != BNX2X_RECOVERY_DONE) { in bnx2x_set_ringparam()
1962 return -EAGAIN; in bnx2x_set_ringparam()
1965 if ((ering->rx_pending > MAX_RX_AVAIL) || in bnx2x_set_ringparam()
1966 (ering->rx_pending < (bp->disable_tpa ? MIN_RX_SIZE_NONTPA : in bnx2x_set_ringparam()
1968 (ering->tx_pending > (IS_MF_STORAGE_ONLY(bp) ? 0 : MAX_TX_AVAIL)) || in bnx2x_set_ringparam()
1969 (ering->tx_pending <= MAX_SKB_FRAGS + 4)) { in bnx2x_set_ringparam()
1971 return -EINVAL; in bnx2x_set_ringparam()
1974 bp->rx_ring_size = ering->rx_pending; in bnx2x_set_ringparam()
1975 bp->tx_ring_size = ering->tx_pending; in bnx2x_set_ringparam()
1987 epause->autoneg = (bp->link_params.req_flow_ctrl[cfg_idx] == in bnx2x_get_pauseparam()
1990 if (!epause->autoneg) in bnx2x_get_pauseparam()
1991 cfg_reg = bp->link_params.req_flow_ctrl[cfg_idx]; in bnx2x_get_pauseparam()
1993 cfg_reg = bp->link_params.req_fc_auto_adv; in bnx2x_get_pauseparam()
1995 epause->rx_pause = ((cfg_reg & BNX2X_FLOW_CTRL_RX) == in bnx2x_get_pauseparam()
1997 epause->tx_pause = ((cfg_reg & BNX2X_FLOW_CTRL_TX) == in bnx2x_get_pauseparam()
2002 epause->cmd, epause->autoneg, epause->rx_pause, epause->tx_pause); in bnx2x_get_pauseparam()
2011 return 0; in bnx2x_set_pauseparam()
2015 epause->cmd, epause->autoneg, epause->rx_pause, epause->tx_pause); in bnx2x_set_pauseparam()
2017 bp->link_params.req_flow_ctrl[cfg_idx] = BNX2X_FLOW_CTRL_AUTO; in bnx2x_set_pauseparam()
2019 if (epause->rx_pause) in bnx2x_set_pauseparam()
2020 bp->link_params.req_flow_ctrl[cfg_idx] |= BNX2X_FLOW_CTRL_RX; in bnx2x_set_pauseparam()
2022 if (epause->tx_pause) in bnx2x_set_pauseparam()
2023 bp->link_params.req_flow_ctrl[cfg_idx] |= BNX2X_FLOW_CTRL_TX; in bnx2x_set_pauseparam()
2025 if (bp->link_params.req_flow_ctrl[cfg_idx] == BNX2X_FLOW_CTRL_AUTO) in bnx2x_set_pauseparam()
2026 bp->link_params.req_flow_ctrl[cfg_idx] = BNX2X_FLOW_CTRL_NONE; in bnx2x_set_pauseparam()
2028 if (epause->autoneg) { in bnx2x_set_pauseparam()
2029 if (!(bp->port.supported[cfg_idx] & SUPPORTED_Autoneg)) { in bnx2x_set_pauseparam()
2031 return -EINVAL; in bnx2x_set_pauseparam()
2034 if (bp->link_params.req_line_speed[cfg_idx] == SPEED_AUTO_NEG) { in bnx2x_set_pauseparam()
2035 bp->link_params.req_flow_ctrl[cfg_idx] = in bnx2x_set_pauseparam()
2038 bp->link_params.req_fc_auto_adv = 0; in bnx2x_set_pauseparam()
2039 if (epause->rx_pause) in bnx2x_set_pauseparam()
2040 bp->link_params.req_fc_auto_adv |= BNX2X_FLOW_CTRL_RX; in bnx2x_set_pauseparam()
2042 if (epause->tx_pause) in bnx2x_set_pauseparam()
2043 bp->link_params.req_fc_auto_adv |= BNX2X_FLOW_CTRL_TX; in bnx2x_set_pauseparam()
2045 if (!bp->link_params.req_fc_auto_adv) in bnx2x_set_pauseparam()
2046 bp->link_params.req_fc_auto_adv |= BNX2X_FLOW_CTRL_NONE; in bnx2x_set_pauseparam()
2050 "req_flow_ctrl 0x%x\n", bp->link_params.req_flow_ctrl[cfg_idx]); in bnx2x_set_pauseparam()
2058 return 0; in bnx2x_set_pauseparam()
2096 u32 eee_adv = 0; in bnx2x_linkmode_to_eee()
2115 return -EOPNOTSUPP; in bnx2x_get_eee()
2118 eee_cfg = bp->link_vars.eee_status; in bnx2x_get_eee()
2120 bnx2x_eee_to_linkmode(edata->supported, in bnx2x_get_eee()
2124 bnx2x_eee_to_linkmode(edata->advertised, in bnx2x_get_eee()
2128 bnx2x_eee_to_linkmode(edata->lp_advertised, in bnx2x_get_eee()
2132 /* SHMEM value is in 16u units --> Convert to 1u units. */ in bnx2x_get_eee()
2133 edata->tx_lpi_timer = (eee_cfg & SHMEM_EEE_TIMER_MASK) << 4; in bnx2x_get_eee()
2135 edata->eee_enabled = (eee_cfg & SHMEM_EEE_REQUESTED_BIT) ? 1 : 0; in bnx2x_get_eee()
2136 edata->eee_active = (eee_cfg & SHMEM_EEE_ACTIVE_BIT) ? 1 : 0; in bnx2x_get_eee()
2137 edata->tx_lpi_enabled = (eee_cfg & SHMEM_EEE_LPI_REQUESTED_BIT) ? 1 : 0; in bnx2x_get_eee()
2139 return 0; in bnx2x_get_eee()
2149 return 0; in bnx2x_set_eee()
2153 return -EOPNOTSUPP; in bnx2x_set_eee()
2156 eee_cfg = bp->link_vars.eee_status; in bnx2x_set_eee()
2160 return -EOPNOTSUPP; in bnx2x_set_eee()
2163 advertised = bnx2x_linkmode_to_eee(edata->advertised, in bnx2x_set_eee()
2168 return -EINVAL; in bnx2x_set_eee()
2171 if (edata->tx_lpi_timer > EEE_MODE_TIMER_MASK) { in bnx2x_set_eee()
2175 return -EINVAL; in bnx2x_set_eee()
2177 if (edata->tx_lpi_enabled && in bnx2x_set_eee()
2178 (edata->tx_lpi_timer < EEE_MODE_NVRAM_AGGRESSIVE_TIME)) { in bnx2x_set_eee()
2182 return -EINVAL; in bnx2x_set_eee()
2186 if (edata->eee_enabled) in bnx2x_set_eee()
2187 bp->link_params.eee_mode |= EEE_MODE_ADV_LPI; in bnx2x_set_eee()
2189 bp->link_params.eee_mode &= ~EEE_MODE_ADV_LPI; in bnx2x_set_eee()
2191 if (edata->tx_lpi_enabled) in bnx2x_set_eee()
2192 bp->link_params.eee_mode |= EEE_MODE_ENABLE_LPI; in bnx2x_set_eee()
2194 bp->link_params.eee_mode &= ~EEE_MODE_ENABLE_LPI; in bnx2x_set_eee()
2196 bp->link_params.eee_mode &= ~EEE_MODE_TIMER_MASK; in bnx2x_set_eee()
2197 bp->link_params.eee_mode |= (edata->tx_lpi_timer & in bnx2x_set_eee()
2209 return 0; in bnx2x_set_eee()
2213 BNX2X_CHIP_E1_OFST = 0,
2227 #define BNX2X_CHIP_MASK_ALL ((1 << BNX2X_CHIP_MAX_OFST) - 1)
2232 int idx, i, rc = -ENODEV; in bnx2x_test_registers()
2233 u32 wr_val = 0, hw; in bnx2x_test_registers()
2241 /* 0 */ { BNX2X_CHIP_MASK_ALL, in bnx2x_test_registers()
2242 BRB1_REG_PAUSE_LOW_THRESHOLD_0, 4, 0x000003ff }, in bnx2x_test_registers()
2244 DORQ_REG_DB_ADDR0, 4, 0xffffffff }, in bnx2x_test_registers()
2246 HC_REG_AGG_INT_0, 4, 0x000003ff }, in bnx2x_test_registers()
2248 PBF_REG_MAC_IF0_ENABLE, 4, 0x00000001 }, in bnx2x_test_registers()
2250 PBF_REG_P0_INIT_CRD, 4, 0x000007ff }, in bnx2x_test_registers()
2252 PBF_REG_INIT_CRD_Q0, 4, 0x000007ff }, in bnx2x_test_registers()
2254 PRS_REG_CID_PORT_0, 4, 0x00ffffff }, in bnx2x_test_registers()
2256 PXP2_REG_PSWRQ_CDU0_L2P, 4, 0x000fffff }, in bnx2x_test_registers()
2258 PXP2_REG_RQ_CDU0_EFIRST_MEM_ADDR, 8, 0x0003ffff }, in bnx2x_test_registers()
2260 PXP2_REG_PSWRQ_TM0_L2P, 4, 0x000fffff }, in bnx2x_test_registers()
2262 PXP2_REG_RQ_USDM0_EFIRST_MEM_ADDR, 8, 0x0003ffff }, in bnx2x_test_registers()
2264 PXP2_REG_PSWRQ_TSDM0_L2P, 4, 0x000fffff }, in bnx2x_test_registers()
2266 QM_REG_CONNNUM_0, 4, 0x000fffff }, in bnx2x_test_registers()
2268 TM_REG_LIN0_MAX_ACTIVE_CID, 4, 0x0003ffff }, in bnx2x_test_registers()
2270 SRC_REG_KEYRSS0_0, 40, 0xffffffff }, in bnx2x_test_registers()
2272 SRC_REG_KEYRSS0_7, 40, 0xffffffff }, in bnx2x_test_registers()
2274 XCM_REG_WU_DA_SET_TMR_CNT_FLG_CMD00, 4, 0x00000001 }, in bnx2x_test_registers()
2276 XCM_REG_WU_DA_CNT_CMD00, 4, 0x00000003 }, in bnx2x_test_registers()
2278 XCM_REG_GLB_DEL_ACK_MAX_CNT_0, 4, 0x000000ff }, in bnx2x_test_registers()
2280 NIG_REG_LLH0_T_BIT, 4, 0x00000001 }, in bnx2x_test_registers()
2282 NIG_REG_EMAC0_IN_EN, 4, 0x00000001 }, in bnx2x_test_registers()
2284 NIG_REG_BMAC0_IN_EN, 4, 0x00000001 }, in bnx2x_test_registers()
2286 NIG_REG_XCM0_OUT_EN, 4, 0x00000001 }, in bnx2x_test_registers()
2288 NIG_REG_BRB0_OUT_EN, 4, 0x00000001 }, in bnx2x_test_registers()
2290 NIG_REG_LLH0_XCM_MASK, 4, 0x00000007 }, in bnx2x_test_registers()
2292 NIG_REG_LLH0_ACPI_PAT_6_LEN, 68, 0x000000ff }, in bnx2x_test_registers()
2294 NIG_REG_LLH0_ACPI_PAT_0_CRC, 68, 0xffffffff }, in bnx2x_test_registers()
2296 NIG_REG_LLH0_DEST_MAC_0_0, 160, 0xffffffff }, in bnx2x_test_registers()
2298 NIG_REG_LLH0_DEST_IP_0_1, 160, 0xffffffff }, in bnx2x_test_registers()
2300 NIG_REG_LLH0_IPV4_IPV6_0, 160, 0x00000001 }, in bnx2x_test_registers()
2302 NIG_REG_LLH0_DEST_UDP_0, 160, 0x0000ffff }, in bnx2x_test_registers()
2304 NIG_REG_LLH0_DEST_TCP_0, 160, 0x0000ffff }, in bnx2x_test_registers()
2306 NIG_REG_LLH0_VLAN_ID_0, 160, 0x00000fff }, in bnx2x_test_registers()
2308 NIG_REG_XGXS_SERDES0_MODE_SEL, 4, 0x00000001 }, in bnx2x_test_registers()
2310 NIG_REG_LED_CONTROL_OVERRIDE_TRAFFIC_P0, 4, 0x00000001}, in bnx2x_test_registers()
2312 NIG_REG_STATUS_INTERRUPT_PORT0, 4, 0x07ffffff }, in bnx2x_test_registers()
2314 NIG_REG_XGXS0_CTRL_EXTREMOTEMDIOST, 24, 0x00000001 }, in bnx2x_test_registers()
2316 NIG_REG_SERDES0_CTRL_PHY_ADDR, 16, 0x0000001f }, in bnx2x_test_registers()
2318 { BNX2X_CHIP_MASK_ALL, 0xffffffff, 0, 0x00000000 } in bnx2x_test_registers()
2339 * First by writing 0x00000000, second by writing 0xffffffff in bnx2x_test_registers()
2341 for (idx = 0; idx < 2; idx++) { in bnx2x_test_registers()
2344 case 0: in bnx2x_test_registers()
2345 wr_val = 0; in bnx2x_test_registers()
2348 wr_val = 0xffffffff; in bnx2x_test_registers()
2352 for (i = 0; reg_tbl[i].offset0 != 0xffffffff; i++) { in bnx2x_test_registers()
2372 "offset 0x%x: val 0x%x != 0x%x mask 0x%x\n", in bnx2x_test_registers()
2379 rc = 0; in bnx2x_test_registers()
2387 int i, j, rc = -ENODEV; in bnx2x_test_memory()
2401 { 0xffffffff, 0 } in bnx2x_test_memory()
2410 {0x3ffc0, 0, 0, 0} }, in bnx2x_test_memory()
2412 {0x2, 0x2, 0, 0} }, in bnx2x_test_memory()
2414 {0, 0, 0, 0} }, in bnx2x_test_memory()
2416 {0x3ffc0, 0, 0, 0} }, in bnx2x_test_memory()
2418 {0x3ffc0, 0, 0, 0} }, in bnx2x_test_memory()
2420 {0x3ffc1, 0, 0, 0} }, in bnx2x_test_memory()
2422 { NULL, 0xffffffff, {0, 0, 0, 0} } in bnx2x_test_memory()
2440 /* pre-Check the parity status */ in bnx2x_test_memory()
2441 for (i = 0; prty_tbl[i].offset != 0xffffffff; i++) { in bnx2x_test_memory()
2445 "%s is 0x%x\n", prty_tbl[i].name, val); in bnx2x_test_memory()
2451 for (i = 0; mem_tbl[i].offset != 0xffffffff; i++) in bnx2x_test_memory()
2452 for (j = 0; j < mem_tbl[i].size; j++) in bnx2x_test_memory()
2456 for (i = 0; prty_tbl[i].offset != 0xffffffff; i++) { in bnx2x_test_memory()
2460 "%s is 0x%x\n", prty_tbl[i].name, val); in bnx2x_test_memory()
2465 rc = 0; in bnx2x_test_memory()
2476 while (bnx2x_link_test(bp, is_serdes) && cnt--) in bnx2x_wait_for_link()
2479 if (cnt <= 0 && bnx2x_link_test(bp, is_serdes)) in bnx2x_wait_for_link()
2483 while (!bp->link_vars.link_up && cnt--) in bnx2x_wait_for_link()
2486 if (cnt <= 0 && !bp->link_vars.link_up) in bnx2x_wait_for_link()
2497 struct bnx2x_fastpath *fp_rx = &bp->fp[0]; in bnx2x_run_loopback()
2498 struct bnx2x_fastpath *fp_tx = &bp->fp[0]; in bnx2x_run_loopback()
2499 struct bnx2x_fp_txdata *txdata = fp_tx->txdata_ptr[0]; in bnx2x_run_loopback()
2510 int rc = -ENODEV; in bnx2x_run_loopback()
2512 struct netdev_queue *txq = netdev_get_tx_queue(bp->dev, in bnx2x_run_loopback()
2513 txdata->txq_index); in bnx2x_run_loopback()
2518 if (bp->link_params.loopback_mode != LOOPBACK_XGXS) { in bnx2x_run_loopback()
2520 return -EINVAL; in bnx2x_run_loopback()
2526 if (bp->port.supported[cfg_idx] & in bnx2x_run_loopback()
2530 bp->link_params.loopback_mode = LOOPBACK_XMAC; in bnx2x_run_loopback()
2532 bp->link_params.loopback_mode = LOOPBACK_UMAC; in bnx2x_run_loopback()
2534 bp->link_params.loopback_mode = LOOPBACK_BMAC; in bnx2x_run_loopback()
2536 bnx2x_phy_init(&bp->link_params, &bp->link_vars); in bnx2x_run_loopback()
2539 if (bp->link_params.loopback_mode != LOOPBACK_EXT) { in bnx2x_run_loopback()
2542 return -EINVAL; in bnx2x_run_loopback()
2547 return -EINVAL; in bnx2x_run_loopback()
2551 pkt_size = (((bp->dev->mtu < ETH_MAX_PACKET_SIZE) ? in bnx2x_run_loopback()
2552 bp->dev->mtu : ETH_MAX_PACKET_SIZE) + ETH_HLEN); in bnx2x_run_loopback()
2553 skb = netdev_alloc_skb(bp->dev, fp_rx->rx_buf_size); in bnx2x_run_loopback()
2556 rc = -ENOMEM; in bnx2x_run_loopback()
2560 memcpy(packet, bp->dev->dev_addr, ETH_ALEN); in bnx2x_run_loopback()
2562 memset(packet + 2*ETH_ALEN, 0x77, (ETH_HLEN - 2*ETH_ALEN)); in bnx2x_run_loopback()
2564 packet[i] = (unsigned char) (i & 0xff); in bnx2x_run_loopback()
2565 mapping = dma_map_single(&bp->pdev->dev, skb->data, in bnx2x_run_loopback()
2567 if (unlikely(dma_mapping_error(&bp->pdev->dev, mapping))) { in bnx2x_run_loopback()
2568 rc = -ENOMEM; in bnx2x_run_loopback()
2575 num_pkts = 0; in bnx2x_run_loopback()
2576 tx_start_idx = le16_to_cpu(*txdata->tx_cons_sb); in bnx2x_run_loopback()
2577 rx_start_idx = le16_to_cpu(*fp_rx->rx_cons_sb); in bnx2x_run_loopback()
2579 netdev_tx_sent_queue(txq, skb->len); in bnx2x_run_loopback()
2581 pkt_prod = txdata->tx_pkt_prod++; in bnx2x_run_loopback()
2582 tx_buf = &txdata->tx_buf_ring[TX_BD(pkt_prod)]; in bnx2x_run_loopback()
2583 tx_buf->first_bd = txdata->tx_bd_prod; in bnx2x_run_loopback()
2584 tx_buf->skb = skb; in bnx2x_run_loopback()
2585 tx_buf->flags = 0; in bnx2x_run_loopback()
2587 bd_prod = TX_BD(txdata->tx_bd_prod); in bnx2x_run_loopback()
2588 tx_start_bd = &txdata->tx_desc_ring[bd_prod].start_bd; in bnx2x_run_loopback()
2589 tx_start_bd->addr_hi = cpu_to_le32(U64_HI(mapping)); in bnx2x_run_loopback()
2590 tx_start_bd->addr_lo = cpu_to_le32(U64_LO(mapping)); in bnx2x_run_loopback()
2591 tx_start_bd->nbd = cpu_to_le16(2); /* start + pbd */ in bnx2x_run_loopback()
2592 tx_start_bd->nbytes = cpu_to_le16(skb_headlen(skb)); in bnx2x_run_loopback()
2593 tx_start_bd->vlan_or_ethertype = cpu_to_le16(pkt_prod); in bnx2x_run_loopback()
2594 tx_start_bd->bd_flags.as_bitfield = ETH_TX_BD_FLAGS_START_BD; in bnx2x_run_loopback()
2595 SET_FLAG(tx_start_bd->general_data, in bnx2x_run_loopback()
2598 SET_FLAG(tx_start_bd->general_data, in bnx2x_run_loopback()
2600 0); in bnx2x_run_loopback()
2606 u16 global_data = 0; in bnx2x_run_loopback()
2608 &txdata->tx_desc_ring[bd_prod].parse_bd_e1x; in bnx2x_run_loopback()
2609 memset(pbd_e1x, 0, sizeof(struct eth_tx_parse_bd_e1x)); in bnx2x_run_loopback()
2612 pbd_e1x->global_data = cpu_to_le16(global_data); in bnx2x_run_loopback()
2614 u32 parsing_data = 0; in bnx2x_run_loopback()
2616 &txdata->tx_desc_ring[bd_prod].parse_bd_e2; in bnx2x_run_loopback()
2617 memset(pbd_e2, 0, sizeof(struct eth_tx_parse_bd_e2)); in bnx2x_run_loopback()
2620 pbd_e2->parsing_data = cpu_to_le32(parsing_data); in bnx2x_run_loopback()
2624 txdata->tx_db.data.prod += 2; in bnx2x_run_loopback()
2627 DOORBELL_RELAXED(bp, txdata->cid, txdata->tx_db.raw); in bnx2x_run_loopback()
2632 txdata->tx_bd_prod += 2; /* start + pbd */ in bnx2x_run_loopback()
2636 tx_idx = le16_to_cpu(*txdata->tx_cons_sb); in bnx2x_run_loopback()
2644 if (bp->common.int_block == INT_BLOCK_IGU) { in bnx2x_run_loopback()
2645 /* Disable local BHes to prevent a dead-lock situation between in bnx2x_run_loopback()
2654 rx_idx = le16_to_cpu(*fp_rx->rx_cons_sb); in bnx2x_run_loopback()
2658 cqe = &fp_rx->rx_comp_ring[RCQ_BD(fp_rx->rx_comp_cons)]; in bnx2x_run_loopback()
2659 cqe_fp_flags = cqe->fast_path_cqe.type_error_flags; in bnx2x_run_loopback()
2664 len = le16_to_cpu(cqe->fast_path_cqe.pkt_len_or_gro_seg_len); in bnx2x_run_loopback()
2668 rx_buf = &fp_rx->rx_buf_ring[RX_BD(fp_rx->rx_bd_cons)]; in bnx2x_run_loopback()
2669 dma_sync_single_for_cpu(&bp->pdev->dev, in bnx2x_run_loopback()
2671 fp_rx->rx_buf_size, DMA_FROM_DEVICE); in bnx2x_run_loopback()
2672 data = rx_buf->data + NET_SKB_PAD + cqe->fast_path_cqe.placement_offset; in bnx2x_run_loopback()
2674 if (*(data + i) != (unsigned char) (i & 0xff)) in bnx2x_run_loopback()
2677 rc = 0; in bnx2x_run_loopback()
2681 fp_rx->rx_bd_cons = NEXT_RX_IDX(fp_rx->rx_bd_cons); in bnx2x_run_loopback()
2682 fp_rx->rx_bd_prod = NEXT_RX_IDX(fp_rx->rx_bd_prod); in bnx2x_run_loopback()
2683 fp_rx->rx_comp_cons = NEXT_RCQ_IDX(fp_rx->rx_comp_cons); in bnx2x_run_loopback()
2684 fp_rx->rx_comp_prod = NEXT_RCQ_IDX(fp_rx->rx_comp_prod); in bnx2x_run_loopback()
2687 bnx2x_update_rx_prod(bp, fp_rx, fp_rx->rx_bd_prod, fp_rx->rx_comp_prod, in bnx2x_run_loopback()
2688 fp_rx->rx_sge_prod); in bnx2x_run_loopback()
2691 bp->link_params.loopback_mode = LOOPBACK_NONE; in bnx2x_run_loopback()
2698 int rc = 0, res; in bnx2x_test_loopback()
2703 if (!netif_running(bp->dev)) in bnx2x_test_loopback()
2731 (bp->link_vars.link_status & LINK_STATUS_SERDES_LINK) > 0; in bnx2x_test_ext_loopback()
2734 return -ENODEV; in bnx2x_test_ext_loopback()
2736 if (!netif_running(bp->dev)) in bnx2x_test_ext_loopback()
2743 "Can't perform self-test, nic_load (for external lb) failed\n"); in bnx2x_test_ext_loopback()
2744 return -ENODEV; in bnx2x_test_ext_loopback()
2762 #define CODE_IMAGE_TYPE_MASK 0xf0800003
2763 #define CODE_IMAGE_VNTAG_PROFILES_DATA 0xd0000003
2764 #define CODE_IMAGE_LENGTH_MASK 0x007ffffc
2765 #define CODE_IMAGE_TYPE_EXTENDED_DIR 0xe0000000
2772 #define NVRAM_DIR_OFFSET 0x14
2776 (code & CODE_IMAGE_LENGTH_MASK) != 0)
2778 #define CRC32_RESIDUAL 0xdebb20e3
2786 u32 crc = ~0; in bnx2x_nvram_crc()
2787 int rc = 0, done = 0; in bnx2x_nvram_crc()
2790 "NVRAM CRC from 0x%08x to 0x%08x\n", offset, offset + size); in bnx2x_nvram_crc()
2793 int count = min_t(int, size - done, CRC_BUFF_SIZE); in bnx2x_nvram_crc()
2805 rc = -EINVAL; in bnx2x_nvram_crc()
2814 size_t size = entry->code_attribute & CODE_IMAGE_LENGTH_MASK; in bnx2x_test_nvram_dir()
2815 u32 type = entry->code_attribute & CODE_IMAGE_TYPE_MASK; in bnx2x_test_nvram_dir()
2818 /* Zero-length images and AFEX profiles do not have CRC */ in bnx2x_test_nvram_dir()
2819 if (size == 0 || type == CODE_IMAGE_VNTAG_PROFILES_DATA) in bnx2x_test_nvram_dir()
2820 return 0; in bnx2x_test_nvram_dir()
2822 rc = bnx2x_nvram_crc(bp, entry->nvm_start_addr, size, buff); in bnx2x_test_nvram_dir()
2856 return 0; in bnx2x_test_nvram_ext_dirs()
2865 for (i = 0; i < cnt && i < MAX_IMAGES_IN_EXTENDED_DIR; i++) { in bnx2x_test_nvram_ext_dirs()
2873 return 0; in bnx2x_test_nvram_ext_dirs()
2881 DP(BNX2X_MSG_ETHTOOL | BNX2X_MSG_NVM, "NVRAM DIRS CRC test-set\n"); in bnx2x_test_nvram_dirs()
2883 for (i = 0; i < CODE_ENTRY_EXTENDED_DIR_IDX; i++) { in bnx2x_test_nvram_dirs()
2904 for (i = 0; nvram_tbl[i].size; i++) { in bnx2x_test_nvram_tbl()
2915 return 0; in bnx2x_test_nvram_tbl()
2921 { 0, 0x14 }, /* bootstrap */ in bnx2x_test_nvram()
2922 { 0x14, 0xec }, /* dir */ in bnx2x_test_nvram()
2923 { 0x100, 0x350 }, /* manuf_info */ in bnx2x_test_nvram()
2924 { 0x450, 0xf0 }, /* feature_info */ in bnx2x_test_nvram()
2925 { 0x640, 0x64 }, /* upgrade_key_info */ in bnx2x_test_nvram()
2926 { 0x708, 0x70 }, /* manuf_key_info */ in bnx2x_test_nvram()
2927 { 0, 0 } in bnx2x_test_nvram()
2930 { 0x7e8, 0x350 }, /* manuf_info2 */ in bnx2x_test_nvram()
2931 { 0xb38, 0xf0 }, /* feature_info */ in bnx2x_test_nvram()
2932 { 0, 0 } in bnx2x_test_nvram()
2940 return 0; in bnx2x_test_nvram()
2945 rc = -ENOMEM; in bnx2x_test_nvram()
2949 rc = bnx2x_nvram_read32(bp, 0, &magic, sizeof(magic)); in bnx2x_test_nvram()
2956 if (magic != 0x669955aa) { in bnx2x_test_nvram()
2958 "wrong magic value (0x%08x)\n", magic); in bnx2x_test_nvram()
2959 rc = -ENODEV; in bnx2x_test_nvram()
2963 DP(BNX2X_MSG_ETHTOOL | BNX2X_MSG_NVM, "Port 0 CRC test-set\n"); in bnx2x_test_nvram()
2974 "Port 1 CRC test-set\n"); in bnx2x_test_nvram()
2993 if (!netif_running(bp->dev)) { in bnx2x_test_intr()
2996 return -ENODEV; in bnx2x_test_intr()
2999 params.q_obj = &bp->sp_objs->q_obj; in bnx2x_test_intr()
3012 int rc, cnt = 0; in bnx2x_self_test()
3014 if (pci_num_vf(bp->pdev)) { in bnx2x_self_test()
3020 if (bp->recovery_state != BNX2X_RECOVERY_DONE) { in bnx2x_self_test()
3021 netdev_err(bp->dev, in bnx2x_self_test()
3023 etest->flags |= ETH_TEST_FL_FAILED; in bnx2x_self_test()
3028 "Self-test command parameters: offline = %d, external_lb = %d\n", in bnx2x_self_test()
3029 (etest->flags & ETH_TEST_FL_OFFLINE), in bnx2x_self_test()
3030 (etest->flags & ETH_TEST_FL_EXTERNAL_LB)>>2); in bnx2x_self_test()
3032 memset(buf, 0, sizeof(u64) * BNX2X_NUM_TESTS(bp)); in bnx2x_self_test()
3034 if (bnx2x_test_nvram(bp) != 0) { in bnx2x_self_test()
3038 buf[0] = 1; in bnx2x_self_test()
3039 etest->flags |= ETH_TEST_FL_FAILED; in bnx2x_self_test()
3047 is_serdes = (bp->link_vars.link_status & LINK_STATUS_SERDES_LINK) > 0; in bnx2x_self_test()
3048 link_up = bp->link_vars.link_up; in bnx2x_self_test()
3050 if ((etest->flags & ETH_TEST_FL_OFFLINE) && !IS_MF(bp)) { in bnx2x_self_test()
3057 REG_WR(bp, NIG_REG_EGRESS_UMP0_IN_EN + port*4, 0); in bnx2x_self_test()
3062 etest->flags |= ETH_TEST_FL_FAILED; in bnx2x_self_test()
3064 "Can't perform self-test, nic_load (for offline) failed\n"); in bnx2x_self_test()
3071 if (bnx2x_test_registers(bp) != 0) { in bnx2x_self_test()
3072 buf[0] = 1; in bnx2x_self_test()
3073 etest->flags |= ETH_TEST_FL_FAILED; in bnx2x_self_test()
3075 if (bnx2x_test_memory(bp) != 0) { in bnx2x_self_test()
3077 etest->flags |= ETH_TEST_FL_FAILED; in bnx2x_self_test()
3081 if (buf[2] != 0) in bnx2x_self_test()
3082 etest->flags |= ETH_TEST_FL_FAILED; in bnx2x_self_test()
3084 if (etest->flags & ETH_TEST_FL_EXTERNAL_LB) { in bnx2x_self_test()
3086 if (buf[3] != 0) in bnx2x_self_test()
3087 etest->flags |= ETH_TEST_FL_FAILED; in bnx2x_self_test()
3088 etest->flags |= ETH_TEST_FL_EXTERNAL_LB_DONE; in bnx2x_self_test()
3097 etest->flags |= ETH_TEST_FL_FAILED; in bnx2x_self_test()
3099 "Can't perform self-test, nic_load (for online) failed\n"); in bnx2x_self_test()
3106 if (bnx2x_test_intr(bp) != 0) { in bnx2x_self_test()
3111 etest->flags |= ETH_TEST_FL_FAILED; in bnx2x_self_test()
3116 while (bnx2x_link_test(bp, is_serdes) && --cnt) in bnx2x_self_test()
3125 etest->flags |= ETH_TEST_FL_FAILED; in bnx2x_self_test()
3143 int i, num_strings = 0; in bnx2x_get_sset_count()
3151 num_strings = 0; in bnx2x_get_sset_count()
3153 for (i = 0; i < BNX2X_NUM_STATS; i++) in bnx2x_get_sset_count()
3168 return -EINVAL; in bnx2x_get_sset_count()
3175 u32 flags = 0; in bnx2x_get_private_flags()
3177 flags |= (!(bp->flags & NO_ISCSI_FLAG) ? 1 : 0) << BNX2X_PRI_FLAG_ISCSI; in bnx2x_get_private_flags()
3178 flags |= (!(bp->flags & NO_FCOE_FLAG) ? 1 : 0) << BNX2X_PRI_FLAG_FCOE; in bnx2x_get_private_flags()
3194 for (j = 0; j < BNX2X_NUM_Q_STATS; j++) { in bnx2x_get_strings()
3201 for (i = 0; i < BNX2X_NUM_STATS; i++) { in bnx2x_get_strings()
3214 start = 0; in bnx2x_get_strings()
3222 for (i = 0; i < BNX2X_PRI_FLAG_LEN; i++) in bnx2x_get_strings()
3233 int i, j, k = 0; in bnx2x_get_ethtool_stats()
3237 hw_stats = (u32 *)&bp->fp_stats[i].eth_q_stats; in bnx2x_get_ethtool_stats()
3238 for (j = 0; j < BNX2X_NUM_Q_STATS; j++) { in bnx2x_get_ethtool_stats()
3239 if (bnx2x_q_stats_arr[j].size == 0) { in bnx2x_get_ethtool_stats()
3241 buf[k + j] = 0; in bnx2x_get_ethtool_stats()
3247 /* 4-byte counter */ in bnx2x_get_ethtool_stats()
3251 /* 8-byte counter */ in bnx2x_get_ethtool_stats()
3258 hw_stats = (u32 *)&bp->eth_stats; in bnx2x_get_ethtool_stats()
3259 for (i = 0, j = 0; i < BNX2X_NUM_STATS; i++) { in bnx2x_get_ethtool_stats()
3262 if (bnx2x_stats_arr[i].size == 0) { in bnx2x_get_ethtool_stats()
3264 buf[k + j] = 0; in bnx2x_get_ethtool_stats()
3270 /* 4-byte counter */ in bnx2x_get_ethtool_stats()
3275 /* 8-byte counter */ in bnx2x_get_ethtool_stats()
3289 return -EAGAIN; in bnx2x_set_phys_id()
3298 bnx2x_set_led(&bp->link_params, &bp->link_vars, in bnx2x_set_phys_id()
3305 bnx2x_set_led(&bp->link_params, &bp->link_vars, in bnx2x_set_phys_id()
3306 LED_MODE_FRONT_PANEL_OFF, 0); in bnx2x_set_phys_id()
3312 bnx2x_set_led(&bp->link_params, &bp->link_vars, in bnx2x_set_phys_id()
3314 bp->link_vars.line_speed); in bnx2x_set_phys_id()
3318 return 0; in bnx2x_set_phys_id()
3323 switch (info->flow_type) { in bnx2x_get_rss_flags()
3326 info->data = RXH_IP_SRC | RXH_IP_DST | in bnx2x_get_rss_flags()
3330 if (bp->rss_conf_obj.udp_rss_v4) in bnx2x_get_rss_flags()
3331 info->data = RXH_IP_SRC | RXH_IP_DST | in bnx2x_get_rss_flags()
3334 info->data = RXH_IP_SRC | RXH_IP_DST; in bnx2x_get_rss_flags()
3337 if (bp->rss_conf_obj.udp_rss_v6) in bnx2x_get_rss_flags()
3338 info->data = RXH_IP_SRC | RXH_IP_DST | in bnx2x_get_rss_flags()
3341 info->data = RXH_IP_SRC | RXH_IP_DST; in bnx2x_get_rss_flags()
3345 info->data = RXH_IP_SRC | RXH_IP_DST; in bnx2x_get_rss_flags()
3348 info->data = 0; in bnx2x_get_rss_flags()
3352 return 0; in bnx2x_get_rss_flags()
3360 switch (info->cmd) { in bnx2x_get_rxnfc()
3362 info->data = BNX2X_NUM_ETH_QUEUES(bp); in bnx2x_get_rxnfc()
3363 return 0; in bnx2x_get_rxnfc()
3368 return -EOPNOTSUPP; in bnx2x_get_rxnfc()
3378 info->flow_type, info->data); in bnx2x_set_rss_flags()
3380 switch (info->flow_type) { in bnx2x_set_rss_flags()
3383 /* For TCP only 4-tupple hash is supported */ in bnx2x_set_rss_flags()
3384 if (info->data ^ (RXH_IP_SRC | RXH_IP_DST | in bnx2x_set_rss_flags()
3388 return -EINVAL; in bnx2x_set_rss_flags()
3390 return 0; in bnx2x_set_rss_flags()
3394 /* For UDP either 2-tupple hash or 4-tupple hash is supported */ in bnx2x_set_rss_flags()
3395 if (info->data == (RXH_IP_SRC | RXH_IP_DST | in bnx2x_set_rss_flags()
3398 else if (info->data == (RXH_IP_SRC | RXH_IP_DST)) in bnx2x_set_rss_flags()
3399 udp_rss_requested = 0; in bnx2x_set_rss_flags()
3401 return -EINVAL; in bnx2x_set_rss_flags()
3405 "57710, 57711 boards don't support RSS according to UDP 4-tuple\n"); in bnx2x_set_rss_flags()
3406 return -EINVAL; in bnx2x_set_rss_flags()
3409 if ((info->flow_type == UDP_V4_FLOW) && in bnx2x_set_rss_flags()
3410 (bp->rss_conf_obj.udp_rss_v4 != udp_rss_requested)) { in bnx2x_set_rss_flags()
3411 bp->rss_conf_obj.udp_rss_v4 = udp_rss_requested; in bnx2x_set_rss_flags()
3413 "rss re-configured, UDP 4-tupple %s\n", in bnx2x_set_rss_flags()
3415 if (bp->state == BNX2X_STATE_OPEN) in bnx2x_set_rss_flags()
3416 return bnx2x_rss(bp, &bp->rss_conf_obj, false, in bnx2x_set_rss_flags()
3418 } else if ((info->flow_type == UDP_V6_FLOW) && in bnx2x_set_rss_flags()
3419 (bp->rss_conf_obj.udp_rss_v6 != udp_rss_requested)) { in bnx2x_set_rss_flags()
3420 bp->rss_conf_obj.udp_rss_v6 = udp_rss_requested; in bnx2x_set_rss_flags()
3422 "rss re-configured, UDP 4-tupple %s\n", in bnx2x_set_rss_flags()
3424 if (bp->state == BNX2X_STATE_OPEN) in bnx2x_set_rss_flags()
3425 return bnx2x_rss(bp, &bp->rss_conf_obj, false, in bnx2x_set_rss_flags()
3428 return 0; in bnx2x_set_rss_flags()
3432 /* For IP only 2-tupple hash is supported */ in bnx2x_set_rss_flags()
3433 if (info->data ^ (RXH_IP_SRC | RXH_IP_DST)) { in bnx2x_set_rss_flags()
3436 return -EINVAL; in bnx2x_set_rss_flags()
3438 return 0; in bnx2x_set_rss_flags()
3451 if (info->data) { in bnx2x_set_rss_flags()
3454 return -EINVAL; in bnx2x_set_rss_flags()
3456 return 0; in bnx2x_set_rss_flags()
3459 return -EINVAL; in bnx2x_set_rss_flags()
3467 switch (info->cmd) { in bnx2x_set_rxnfc()
3472 return -EOPNOTSUPP; in bnx2x_set_rxnfc()
3485 u8 ind_table[T_ETH_INDIRECTION_TABLE_SIZE] = {0}; in bnx2x_get_rxfh()
3488 rxfh->hfunc = ETH_RSS_HASH_TOP; in bnx2x_get_rxfh()
3489 if (!rxfh->indir) in bnx2x_get_rxfh()
3490 return 0; in bnx2x_get_rxfh()
3493 bnx2x_get_rss_ind_table(&bp->rss_conf_obj, ind_table); in bnx2x_get_rxfh()
3497 * indirection table is a u8 array while indir->ring_index in bnx2x_get_rxfh()
3504 for (i = 0; i < T_ETH_INDIRECTION_TABLE_SIZE; i++) in bnx2x_get_rxfh()
3505 rxfh->indir[i] = ind_table[i] - bp->fp->cl_id; in bnx2x_get_rxfh()
3507 return 0; in bnx2x_get_rxfh()
3520 if (rxfh->key || in bnx2x_set_rxfh()
3521 (rxfh->hfunc != ETH_RSS_HASH_NO_CHANGE && in bnx2x_set_rxfh()
3522 rxfh->hfunc != ETH_RSS_HASH_TOP)) in bnx2x_set_rxfh()
3523 return -EOPNOTSUPP; in bnx2x_set_rxfh()
3525 if (!rxfh->indir) in bnx2x_set_rxfh()
3526 return 0; in bnx2x_set_rxfh()
3528 for (i = 0; i < T_ETH_INDIRECTION_TABLE_SIZE; i++) { in bnx2x_set_rxfh()
3532 * while indir->ring_index points to an array of u32. in bnx2x_set_rxfh()
3538 bp->rss_conf_obj.ind_table[i] = rxfh->indir[i] + bp->fp->cl_id; in bnx2x_set_rxfh()
3541 if (bp->state == BNX2X_STATE_OPEN) in bnx2x_set_rxfh()
3544 return 0; in bnx2x_set_rxfh()
3548 * bnx2x_get_channels - gets the number of RSS queues.
3558 channels->max_combined = BNX2X_MAX_RSS_COUNT(bp); in bnx2x_get_channels()
3559 channels->combined_count = BNX2X_NUM_ETH_QUEUES(bp); in bnx2x_get_channels()
3563 * bnx2x_change_num_queues - change the number of RSS queues.
3568 * Re-configure interrupt mode to get the new number of MSI-X
3569 * vectors and re-add NAPI objects.
3574 bp->num_ethernet_queues = num_rss; in bnx2x_change_num_queues()
3575 bp->num_queues = bp->num_ethernet_queues + bp->num_cnic_queues; in bnx2x_change_num_queues()
3576 BNX2X_DEV_INFO("set number of queues to %d\n", bp->num_queues); in bnx2x_change_num_queues()
3581 * bnx2x_set_channels - sets the number of RSS queues.
3592 "set-channels command parameters: rx = %d, tx = %d, other = %d, combined = %d\n", in bnx2x_set_channels()
3593 channels->rx_count, channels->tx_count, channels->other_count, in bnx2x_set_channels()
3594 channels->combined_count); in bnx2x_set_channels()
3596 if (pci_num_vf(bp->pdev)) { in bnx2x_set_channels()
3598 return -EPERM; in bnx2x_set_channels()
3604 if (channels->rx_count || channels->tx_count || channels->other_count in bnx2x_set_channels()
3605 || (channels->combined_count == 0) || in bnx2x_set_channels()
3606 (channels->combined_count > BNX2X_MAX_RSS_COUNT(bp))) { in bnx2x_set_channels()
3608 return -EINVAL; in bnx2x_set_channels()
3612 if (channels->combined_count == BNX2X_NUM_ETH_QUEUES(bp)) { in bnx2x_set_channels()
3614 return 0; in bnx2x_set_channels()
3622 bnx2x_change_num_queues(bp, channels->combined_count); in bnx2x_set_channels()
3623 return 0; in bnx2x_set_channels()
3626 bnx2x_change_num_queues(bp, channels->combined_count); in bnx2x_set_channels()
3635 if (bp->flags & PTP_SUPPORTED) { in bnx2x_get_ts_info()
3636 info->so_timestamping = SOF_TIMESTAMPING_TX_SOFTWARE | in bnx2x_get_ts_info()
3641 if (bp->ptp_clock) in bnx2x_get_ts_info()
3642 info->phc_index = ptp_clock_index(bp->ptp_clock); in bnx2x_get_ts_info()
3644 info->rx_filters = (1 << HWTSTAMP_FILTER_NONE) | in bnx2x_get_ts_info()
3649 info->tx_types = (1 << HWTSTAMP_TX_OFF)|(1 << HWTSTAMP_TX_ON); in bnx2x_get_ts_info()
3651 return 0; in bnx2x_get_ts_info()
3725 netdev->ethtool_ops = (IS_PF(bp)) ? in bnx2x_set_ethtool_ops()