Lines Matching +full:num +full:- +full:rxq

1 // SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause)
3 * Copyright (c) 2015-2017 QLogic Corporation
4 * Copyright (c) 2019-2020 Marvell International Ltd.
176 "Coupled-Function",
276 if (txq->is_xdp) in qede_get_strings_stats_txq()
281 ethtool_sprintf(buf, "%d_%d: %s", txq->index, txq->cos, in qede_get_strings_stats_txq()
286 struct qede_rx_queue *rxq, u8 **buf) in qede_get_strings_stats_rxq() argument
291 ethtool_sprintf(buf, "%d: %s", rxq->rxq_id, in qede_get_strings_stats_rxq()
309 fp = &edev->fp_array[i]; in qede_get_strings_stats()
311 if (fp->type & QEDE_FASTPATH_RX) in qede_get_strings_stats()
312 qede_get_strings_stats_rxq(edev, fp->rxq, &buf); in qede_get_strings_stats()
314 if (fp->type & QEDE_FASTPATH_XDP) in qede_get_strings_stats()
315 qede_get_strings_stats_txq(edev, fp->xdp_tx, &buf); in qede_get_strings_stats()
317 if (fp->type & QEDE_FASTPATH_TX) { in qede_get_strings_stats()
322 &fp->txq[cos], &buf); in qede_get_strings_stats()
326 /* Account for non-queue statistics */ in qede_get_strings_stats()
367 static void qede_get_ethtool_stats_rxq(struct qede_rx_queue *rxq, u64 **buf) in qede_get_ethtool_stats_rxq() argument
372 **buf = *((u64 *)(((void *)rxq) + qede_rqstats_arr[i].offset)); in qede_get_ethtool_stats_rxq()
390 fp = &edev->fp_array[i]; in qede_get_ethtool_stats()
392 if (fp->type & QEDE_FASTPATH_RX) in qede_get_ethtool_stats()
393 qede_get_ethtool_stats_rxq(fp->rxq, &buf); in qede_get_ethtool_stats()
395 if (fp->type & QEDE_FASTPATH_XDP) in qede_get_ethtool_stats()
396 qede_get_ethtool_stats_txq(fp->xdp_tx, &buf); in qede_get_ethtool_stats()
398 if (fp->type & QEDE_FASTPATH_TX) { in qede_get_ethtool_stats()
402 qede_get_ethtool_stats_txq(&fp->txq[cos], &buf); in qede_get_ethtool_stats()
406 spin_lock(&edev->stats_lock); in qede_get_ethtool_stats()
411 *buf = *((u64 *)(((void *)&edev->stats) + in qede_get_ethtool_stats()
417 spin_unlock(&edev->stats_lock); in qede_get_ethtool_stats()
431 num_stats--; in qede_get_sset_count()
435 edev->dev_info.num_tc; in qede_get_sset_count()
441 if (edev->xdp_prog) in qede_get_sset_count()
455 return -EINVAL; in qede_get_sset_count()
465 if (edev->dev_info.common.num_hwfns > 1) in qede_get_priv_flags()
468 if (edev->dev_info.common.smart_an) in qede_get_priv_flags()
471 if (edev->err_flags & BIT(QEDE_ERR_IS_RECOVERABLE)) in qede_get_priv_flags()
474 if (edev->dev_info.common.esl) in qede_get_priv_flags()
477 edev->ops->common->get_esl_status(edev->cdev, &esl_active); in qede_get_priv_flags()
493 return -EINVAL; in qede_set_priv_flags()
496 set_bit(QEDE_ERR_IS_RECOVERABLE, &edev->err_flags); in qede_set_priv_flags()
498 clear_bit(QEDE_ERR_IS_RECOVERABLE, &edev->err_flags); in qede_set_priv_flags()
506 typeof(cmd->link_modes) *link_modes = &cmd->link_modes; in qede_get_link_ksettings()
507 struct ethtool_link_settings *base = &cmd->base; in qede_get_link_ksettings()
514 edev->ops->common->get_link(edev->cdev, &current_link); in qede_get_link_ksettings()
516 linkmode_copy(link_modes->supported, current_link.supported_caps); in qede_get_link_ksettings()
517 linkmode_copy(link_modes->advertising, current_link.advertised_caps); in qede_get_link_ksettings()
518 linkmode_copy(link_modes->lp_advertising, current_link.lp_caps); in qede_get_link_ksettings()
520 if ((edev->state == QEDE_STATE_OPEN) && (current_link.link_up)) { in qede_get_link_ksettings()
521 base->speed = current_link.speed; in qede_get_link_ksettings()
522 base->duplex = current_link.duplex; in qede_get_link_ksettings()
524 base->speed = SPEED_UNKNOWN; in qede_get_link_ksettings()
525 base->duplex = DUPLEX_UNKNOWN; in qede_get_link_ksettings()
530 base->port = current_link.port; in qede_get_link_ksettings()
531 base->autoneg = (current_link.autoneg) ? AUTONEG_ENABLE : in qede_get_link_ksettings()
540 const struct ethtool_link_settings *base = &cmd->base; in qede_set_link_ksettings()
547 if (!edev->ops || !edev->ops->common->can_link_change(edev->cdev)) { in qede_set_link_ksettings()
549 return -EOPNOTSUPP; in qede_set_link_ksettings()
553 edev->ops->common->get_link(edev->cdev, &current_link); in qede_set_link_ksettings()
558 if (base->autoneg == AUTONEG_ENABLE) { in qede_set_link_ksettings()
561 return -EOPNOTSUPP; in qede_set_link_ksettings()
567 linkmode_copy(params.adv_speeds, cmd->link_modes.advertising); in qede_set_link_ksettings()
571 params.forced_speed = base->speed; in qede_set_link_ksettings()
576 if (base->speed != map->speed || in qede_set_link_ksettings()
578 map->caps)) in qede_set_link_ksettings()
582 current_link.supported_caps, map->caps); in qede_set_link_ksettings()
586 DP_INFO(edev, "Unsupported speed %u\n", base->speed); in qede_set_link_ksettings()
587 return -EINVAL; in qede_set_link_ksettings()
592 edev->ops->common->set_link(edev->cdev, &params); in qede_set_link_ksettings()
604 strscpy(info->driver, "qede", sizeof(info->driver)); in qede_get_drvinfo()
607 edev->dev_info.common.fw_major, in qede_get_drvinfo()
608 edev->dev_info.common.fw_minor, in qede_get_drvinfo()
609 edev->dev_info.common.fw_rev, in qede_get_drvinfo()
610 edev->dev_info.common.fw_eng); in qede_get_drvinfo()
613 (edev->dev_info.common.mfw_rev >> 24) & 0xFF, in qede_get_drvinfo()
614 (edev->dev_info.common.mfw_rev >> 16) & 0xFF, in qede_get_drvinfo()
615 (edev->dev_info.common.mfw_rev >> 8) & 0xFF, in qede_get_drvinfo()
616 edev->dev_info.common.mfw_rev & 0xFF); in qede_get_drvinfo()
619 sizeof(info->version)) in qede_get_drvinfo()
620 snprintf(info->version, sizeof(info->version), in qede_get_drvinfo()
623 snprintf(info->version, sizeof(info->version), in qede_get_drvinfo()
626 if (edev->dev_info.common.mbi_version) { in qede_get_drvinfo()
628 (edev->dev_info.common.mbi_version & in qede_get_drvinfo()
630 (edev->dev_info.common.mbi_version & in qede_get_drvinfo()
632 (edev->dev_info.common.mbi_version & in qede_get_drvinfo()
634 snprintf(info->fw_version, sizeof(info->fw_version), in qede_get_drvinfo()
637 snprintf(info->fw_version, sizeof(info->fw_version), in qede_get_drvinfo()
641 strscpy(info->bus_info, pci_name(edev->pdev), sizeof(info->bus_info)); in qede_get_drvinfo()
648 if (edev->dev_info.common.wol_support) { in qede_get_wol()
649 wol->supported = WAKE_MAGIC; in qede_get_wol()
650 wol->wolopts = edev->wol_enabled ? WAKE_MAGIC : 0; in qede_get_wol()
660 if (wol->wolopts & ~WAKE_MAGIC) { in qede_set_wol()
662 "Can't support WoL options other than magic-packet\n"); in qede_set_wol()
663 return -EINVAL; in qede_set_wol()
666 wol_requested = !!(wol->wolopts & WAKE_MAGIC); in qede_set_wol()
667 if (wol_requested == edev->wol_enabled) in qede_set_wol()
671 if (!edev->dev_info.common.wol_support) { in qede_set_wol()
673 return -EINVAL; in qede_set_wol()
676 rc = edev->ops->common->update_wol(edev->cdev, wol_requested); in qede_set_wol()
678 edev->wol_enabled = wol_requested; in qede_set_wol()
687 return ((u32)edev->dp_level << QED_LOG_LEVEL_SHIFT) | edev->dp_module; in qede_get_msglevel()
698 edev->dp_level = dp_level; in qede_set_msglevel()
699 edev->dp_module = dp_module; in qede_set_msglevel()
700 edev->ops->common->update_msglvl(edev->cdev, in qede_set_msglevel()
710 if (!edev->ops || !edev->ops->common->can_link_change(edev->cdev)) { in qede_nway_reset()
712 return -EOPNOTSUPP; in qede_nway_reset()
719 edev->ops->common->get_link(edev->cdev, &current_link); in qede_nway_reset()
726 edev->ops->common->set_link(edev->cdev, &link_params); in qede_nway_reset()
728 edev->ops->common->set_link(edev->cdev, &link_params); in qede_nway_reset()
739 edev->ops->common->get_link(edev->cdev, &current_link); in qede_get_link()
749 return edev->ops->common->nvm_flash(edev->cdev, flash->data); in qede_flash_device()
768 if (edev->state == QEDE_STATE_OPEN) { in qede_get_coalesce()
770 fp = &edev->fp_array[i]; in qede_get_coalesce()
772 if (fp->type & QEDE_FASTPATH_RX) { in qede_get_coalesce()
773 rx_handle = fp->rxq->handle; in qede_get_coalesce()
778 rc = edev->ops->get_coalesce(edev->cdev, &rx_coal, rx_handle); in qede_get_coalesce()
787 fp = &edev->fp_array[i]; in qede_get_coalesce()
793 if (fp->type & QEDE_FASTPATH_TX) { in qede_get_coalesce()
795 tx_handle = txq->handle; in qede_get_coalesce()
800 rc = edev->ops->get_coalesce(edev->cdev, &tx_coal, tx_handle); in qede_get_coalesce()
808 coal->rx_coalesce_usecs = rx_coal; in qede_get_coalesce()
809 coal->tx_coalesce_usecs = tx_coal; in qede_get_coalesce()
810 coal->stats_block_coalesce_usecs = edev->stats_coal_usecs; in qede_get_coalesce()
824 if (edev->stats_coal_usecs != coal->stats_block_coalesce_usecs) { in qede_set_coalesce()
825 edev->stats_coal_usecs = coal->stats_block_coalesce_usecs; in qede_set_coalesce()
826 if (edev->stats_coal_usecs) { in qede_set_coalesce()
827 edev->stats_coal_ticks = usecs_to_jiffies(edev->stats_coal_usecs); in qede_set_coalesce()
828 schedule_delayed_work(&edev->periodic_task, 0); in qede_set_coalesce()
831 edev->stats_coal_ticks); in qede_set_coalesce()
833 cancel_delayed_work_sync(&edev->periodic_task); in qede_set_coalesce()
839 return -EINVAL; in qede_set_coalesce()
842 if (coal->rx_coalesce_usecs > QED_COALESCE_MAX || in qede_set_coalesce()
843 coal->tx_coalesce_usecs > QED_COALESCE_MAX) { in qede_set_coalesce()
846 coal->rx_coalesce_usecs > QED_COALESCE_MAX ? "rx" : in qede_set_coalesce()
848 return -EINVAL; in qede_set_coalesce()
851 rxc = (u16)coal->rx_coalesce_usecs; in qede_set_coalesce()
852 txc = (u16)coal->tx_coalesce_usecs; in qede_set_coalesce()
854 fp = &edev->fp_array[i]; in qede_set_coalesce()
856 if (edev->fp_array[i].type & QEDE_FASTPATH_RX) { in qede_set_coalesce()
857 rc = edev->ops->common->set_coalesce(edev->cdev, in qede_set_coalesce()
859 fp->rxq->handle); in qede_set_coalesce()
865 edev->coal_entry[i].rxc = rxc; in qede_set_coalesce()
866 edev->coal_entry[i].isvalid = true; in qede_set_coalesce()
869 if (edev->fp_array[i].type & QEDE_FASTPATH_TX) { in qede_set_coalesce()
878 rc = edev->ops->common->set_coalesce(edev->cdev, in qede_set_coalesce()
880 txq->handle); in qede_set_coalesce()
886 edev->coal_entry[i].txc = txc; in qede_set_coalesce()
887 edev->coal_entry[i].isvalid = true; in qede_set_coalesce()
901 ering->rx_max_pending = NUM_RX_BDS_MAX; in qede_get_ringparam()
902 ering->rx_pending = edev->q_num_rx_buffers; in qede_get_ringparam()
903 ering->tx_max_pending = NUM_TX_BDS_MAX; in qede_get_ringparam()
904 ering->tx_pending = edev->q_num_tx_buffers; in qede_get_ringparam()
916 ering->rx_pending, ering->tx_pending); in qede_set_ringparam()
919 if (ering->rx_pending > NUM_RX_BDS_MAX || in qede_set_ringparam()
920 ering->rx_pending < NUM_RX_BDS_MIN || in qede_set_ringparam()
921 ering->tx_pending > NUM_TX_BDS_MAX || in qede_set_ringparam()
922 ering->tx_pending < NUM_TX_BDS_MIN) { in qede_set_ringparam()
927 return -EINVAL; in qede_set_ringparam()
930 /* Change ring size and re-load */ in qede_set_ringparam()
931 edev->q_num_rx_buffers = ering->rx_pending; in qede_set_ringparam()
932 edev->q_num_tx_buffers = ering->tx_pending; in qede_set_ringparam()
946 edev->ops->common->get_link(edev->cdev, &current_link); in qede_get_pauseparam()
949 epause->autoneg = true; in qede_get_pauseparam()
951 epause->rx_pause = true; in qede_get_pauseparam()
953 epause->tx_pause = true; in qede_get_pauseparam()
957 epause->cmd, epause->autoneg, epause->rx_pause, in qede_get_pauseparam()
958 epause->tx_pause); in qede_get_pauseparam()
968 if (!edev->ops || !edev->ops->common->can_link_change(edev->cdev)) { in qede_set_pauseparam()
971 return -EOPNOTSUPP; in qede_set_pauseparam()
975 edev->ops->common->get_link(edev->cdev, &current_link); in qede_set_pauseparam()
980 if (epause->autoneg) { in qede_set_pauseparam()
983 return -EINVAL; in qede_set_pauseparam()
989 if (epause->rx_pause) in qede_set_pauseparam()
991 if (epause->tx_pause) in qede_set_pauseparam()
995 edev->ops->common->set_link(edev->cdev, &params); in qede_set_pauseparam()
1005 regs->version = 0; in qede_get_regs()
1006 memset(buffer, 0, regs->len); in qede_get_regs()
1008 if (edev->ops && edev->ops->common) in qede_get_regs()
1009 edev->ops->common->dbg_all_data(edev->cdev, buffer); in qede_get_regs()
1016 if (edev->ops && edev->ops->common) in qede_get_regs_len()
1017 return edev->ops->common->dbg_all_data_size(edev->cdev); in qede_get_regs_len()
1019 return -EINVAL; in qede_get_regs_len()
1025 WRITE_ONCE(edev->ndev->mtu, args->u.mtu); in qede_update_mtu()
1038 ndev->features &= ~NETIF_F_GRO_HW; in qede_change_mtu()
1040 /* Set the mtu field and re-start the interface if needed */ in qede_change_mtu()
1047 edev->ops->common->update_mtu(edev->cdev, new_mtu); in qede_change_mtu()
1057 channels->max_combined = QEDE_MAX_RSS_CNT(edev); in qede_get_channels()
1058 channels->max_rx = QEDE_MAX_RSS_CNT(edev); in qede_get_channels()
1059 channels->max_tx = QEDE_MAX_RSS_CNT(edev); in qede_get_channels()
1060 channels->combined_count = QEDE_QUEUE_CNT(edev) - edev->fp_num_tx - in qede_get_channels()
1061 edev->fp_num_rx; in qede_get_channels()
1062 channels->tx_count = edev->fp_num_tx; in qede_get_channels()
1063 channels->rx_count = edev->fp_num_rx; in qede_get_channels()
1073 "set-channels command parameters: rx = %d, tx = %d, other = %d, combined = %d\n", in qede_set_channels()
1074 channels->rx_count, channels->tx_count, in qede_set_channels()
1075 channels->other_count, channels->combined_count); in qede_set_channels()
1077 count = channels->rx_count + channels->tx_count + in qede_set_channels()
1078 channels->combined_count; in qede_set_channels()
1081 if (channels->other_count) { in qede_set_channels()
1084 return -EINVAL; in qede_set_channels()
1087 if (!(channels->combined_count || (channels->rx_count && in qede_set_channels()
1088 channels->tx_count))) { in qede_set_channels()
1091 return -EINVAL; in qede_set_channels()
1098 return -EINVAL; in qede_set_channels()
1103 (channels->tx_count == edev->fp_num_tx) && in qede_set_channels()
1104 (channels->rx_count == edev->fp_num_rx)) { in qede_set_channels()
1111 if ((count % edev->dev_info.common.num_hwfns) || in qede_set_channels()
1112 (channels->tx_count % edev->dev_info.common.num_hwfns) || in qede_set_channels()
1113 (channels->rx_count % edev->dev_info.common.num_hwfns)) { in qede_set_channels()
1116 edev->dev_info.common.num_hwfns); in qede_set_channels()
1117 return -EINVAL; in qede_set_channels()
1121 edev->req_queues = count; in qede_set_channels()
1122 edev->req_num_tx = channels->tx_count; in qede_set_channels()
1123 edev->req_num_rx = channels->rx_count; in qede_set_channels()
1125 if ((edev->req_queues - edev->req_num_tx) != QEDE_RSS_COUNT(edev)) { in qede_set_channels()
1126 edev->rss_params_inited &= ~QEDE_RSS_INDIR_INITED; in qede_set_channels()
1127 memset(edev->rss_ind_table, 0, sizeof(edev->rss_ind_table)); in qede_set_channels()
1166 edev->ops->common->set_led(edev->cdev, led_state); in qede_set_phys_id()
1173 info->data = RXH_IP_SRC | RXH_IP_DST; in qede_get_rss_flags()
1175 switch (info->flow_type) { in qede_get_rss_flags()
1178 info->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3; in qede_get_rss_flags()
1181 if (edev->rss_caps & QED_RSS_IPV4_UDP) in qede_get_rss_flags()
1182 info->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3; in qede_get_rss_flags()
1185 if (edev->rss_caps & QED_RSS_IPV6_UDP) in qede_get_rss_flags()
1186 info->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3; in qede_get_rss_flags()
1192 info->data = 0; in qede_get_rss_flags()
1205 switch (info->cmd) { in qede_get_rxnfc()
1207 info->data = QEDE_RSS_COUNT(edev); in qede_get_rxnfc()
1213 info->rule_cnt = qede_get_arfs_filter_count(edev); in qede_get_rxnfc()
1214 info->data = QEDE_RFS_MAX_FLTR; in qede_get_rxnfc()
1224 rc = -EOPNOTSUPP; in qede_get_rxnfc()
1238 info->flow_type, info->data); in qede_set_rss_flags()
1240 switch (info->flow_type) { in qede_set_rss_flags()
1243 /* For TCP only 4-tuple hash is supported */ in qede_set_rss_flags()
1244 if (info->data ^ (RXH_IP_SRC | RXH_IP_DST | in qede_set_rss_flags()
1247 return -EINVAL; in qede_set_rss_flags()
1251 /* For UDP either 2-tuple hash or 4-tuple hash is supported */ in qede_set_rss_flags()
1252 if (info->data == (RXH_IP_SRC | RXH_IP_DST | in qede_set_rss_flags()
1256 "UDP 4-tuple enabled\n"); in qede_set_rss_flags()
1257 } else if (info->data == (RXH_IP_SRC | RXH_IP_DST)) { in qede_set_rss_flags()
1260 "UDP 4-tuple disabled\n"); in qede_set_rss_flags()
1262 return -EINVAL; in qede_set_rss_flags()
1266 /* For UDP either 2-tuple hash or 4-tuple hash is supported */ in qede_set_rss_flags()
1267 if (info->data == (RXH_IP_SRC | RXH_IP_DST | in qede_set_rss_flags()
1271 "UDP 4-tuple enabled\n"); in qede_set_rss_flags()
1272 } else if (info->data == (RXH_IP_SRC | RXH_IP_DST)) { in qede_set_rss_flags()
1275 "UDP 4-tuple disabled\n"); in qede_set_rss_flags()
1277 return -EINVAL; in qede_set_rss_flags()
1282 /* For IP only 2-tuple hash is supported */ in qede_set_rss_flags()
1283 if (info->data ^ (RXH_IP_SRC | RXH_IP_DST)) { in qede_set_rss_flags()
1285 return -EINVAL; in qede_set_rss_flags()
1299 if (info->data) { in qede_set_rss_flags()
1301 return -EINVAL; in qede_set_rss_flags()
1305 return -EINVAL; in qede_set_rss_flags()
1309 if (edev->rss_caps == ((edev->rss_caps & ~clr_caps) | set_caps)) in qede_set_rss_flags()
1313 edev->rss_caps = ((edev->rss_caps & ~clr_caps) | set_caps); in qede_set_rss_flags()
1314 edev->rss_params_inited |= QEDE_RSS_CAPS_INITED; in qede_set_rss_flags()
1316 /* Re-configure if possible */ in qede_set_rss_flags()
1318 if (edev->state == QEDE_STATE_OPEN) { in qede_set_rss_flags()
1322 return -ENOMEM; in qede_set_rss_flags()
1324 qede_fill_rss_params(edev, &vport_update_params->rss_params, in qede_set_rss_flags()
1325 &vport_update_params->update_rss_flg); in qede_set_rss_flags()
1326 rc = edev->ops->vport_update(edev->cdev, vport_update_params); in qede_set_rss_flags()
1339 switch (info->cmd) { in qede_set_rxnfc()
1347 rc = qede_delete_flow_filter(edev, info->fs.location); in qede_set_rxnfc()
1351 rc = -EOPNOTSUPP; in qede_set_rxnfc()
1366 return sizeof(edev->rss_key); in qede_get_rxfh_key_size()
1375 rxfh->hfunc = ETH_RSS_HASH_TOP; in qede_get_rxfh()
1377 if (!rxfh->indir) in qede_get_rxfh()
1381 rxfh->indir[i] = edev->rss_ind_table[i]; in qede_get_rxfh()
1383 if (rxfh->key) in qede_get_rxfh()
1384 memcpy(rxfh->key, edev->rss_key, qede_get_rxfh_key_size(dev)); in qede_get_rxfh()
1397 if (edev->dev_info.common.num_hwfns > 1) { in qede_set_rxfh()
1400 return -EOPNOTSUPP; in qede_set_rxfh()
1403 if (rxfh->hfunc != ETH_RSS_HASH_NO_CHANGE && in qede_set_rxfh()
1404 rxfh->hfunc != ETH_RSS_HASH_TOP) in qede_set_rxfh()
1405 return -EOPNOTSUPP; in qede_set_rxfh()
1407 if (!rxfh->indir && !rxfh->key) in qede_set_rxfh()
1410 if (rxfh->indir) { in qede_set_rxfh()
1412 edev->rss_ind_table[i] = rxfh->indir[i]; in qede_set_rxfh()
1413 edev->rss_params_inited |= QEDE_RSS_INDIR_INITED; in qede_set_rxfh()
1416 if (rxfh->key) { in qede_set_rxfh()
1417 memcpy(&edev->rss_key, rxfh->key, qede_get_rxfh_key_size(dev)); in qede_set_rxfh()
1418 edev->rss_params_inited |= QEDE_RSS_KEY_INITED; in qede_set_rxfh()
1422 if (edev->state == QEDE_STATE_OPEN) { in qede_set_rxfh()
1426 return -ENOMEM; in qede_set_rxfh()
1428 qede_fill_rss_params(edev, &vport_update_params->rss_params, in qede_set_rxfh()
1429 &vport_update_params->update_rss_flg); in qede_set_rxfh()
1430 rc = edev->ops->vport_update(edev->cdev, vport_update_params); in qede_set_rxfh()
1443 if (!netif_running(edev->ndev)) in qede_netif_start()
1448 qed_sb_ack(edev->fp_array[i].sb_info, IGU_INT_ENABLE, 1); in qede_netif_start()
1449 napi_enable(&edev->fp_array[i].napi); in qede_netif_start()
1459 napi_disable(&edev->fp_array[i].napi); in qede_netif_stop()
1461 qed_sb_ack(edev->fp_array[i].sb_info, IGU_INT_DISABLE, 0); in qede_netif_stop()
1475 struct qede_fastpath *fp = &edev->fp_array[i]; in qede_selftest_transmit_traffic()
1477 if (fp->type & QEDE_FASTPATH_TX) { in qede_selftest_transmit_traffic()
1485 return -1; in qede_selftest_transmit_traffic()
1489 idx = txq->sw_tx_prod; in qede_selftest_transmit_traffic()
1490 txq->sw_tx_ring.skbs[idx].skb = skb; in qede_selftest_transmit_traffic()
1491 first_bd = qed_chain_produce(&txq->tx_pbl); in qede_selftest_transmit_traffic()
1494 first_bd->data.bd_flags.bitfields = val; in qede_selftest_transmit_traffic()
1495 val = skb->len & ETH_TX_DATA_1ST_BD_PKT_LEN_MASK; in qede_selftest_transmit_traffic()
1497 first_bd->data.bitfields |= cpu_to_le16(val); in qede_selftest_transmit_traffic()
1500 mapping = dma_map_single(&edev->pdev->dev, skb->data, in qede_selftest_transmit_traffic()
1502 if (unlikely(dma_mapping_error(&edev->pdev->dev, mapping))) { in qede_selftest_transmit_traffic()
1504 return -ENOMEM; in qede_selftest_transmit_traffic()
1508 /* update the first BD with the actual num BDs */ in qede_selftest_transmit_traffic()
1509 first_bd->data.nbds = 1; in qede_selftest_transmit_traffic()
1510 txq->sw_tx_prod = (txq->sw_tx_prod + 1) % txq->num_tx_buffers; in qede_selftest_transmit_traffic()
1512 val = qed_chain_get_prod_idx(&txq->tx_pbl); in qede_selftest_transmit_traffic()
1513 txq->tx_db.data.bd_prod = cpu_to_le16(val); in qede_selftest_transmit_traffic()
1520 writel(txq->tx_db.raw, txq->doorbell_addr); in qede_selftest_transmit_traffic()
1530 return -1; in qede_selftest_transmit_traffic()
1533 first_bd = (struct eth_tx_1st_bd *)qed_chain_consume(&txq->tx_pbl); in qede_selftest_transmit_traffic()
1534 dma_unmap_single(&edev->pdev->dev, BD_UNMAP_ADDR(first_bd), in qede_selftest_transmit_traffic()
1536 txq->sw_tx_cons = (txq->sw_tx_cons + 1) % txq->num_tx_buffers; in qede_selftest_transmit_traffic()
1537 txq->sw_tx_ring.skbs[idx].skb = NULL; in qede_selftest_transmit_traffic()
1546 struct qede_rx_queue *rxq = NULL; in qede_selftest_receive_traffic() local
1553 if (edev->fp_array[i].type & QEDE_FASTPATH_RX) { in qede_selftest_receive_traffic()
1554 rxq = edev->fp_array[i].rxq; in qede_selftest_receive_traffic()
1559 if (!rxq) { in qede_selftest_receive_traffic()
1561 return -1; in qede_selftest_receive_traffic()
1564 /* The packet is expected to receive on rx-queue 0 even though RSS is in qede_selftest_receive_traffic()
1569 if (!qede_has_rx_work(rxq)) { in qede_selftest_receive_traffic()
1575 cqe = (union eth_rx_cqe *)qed_chain_consume(&rxq->rx_comp_ring); in qede_selftest_receive_traffic()
1578 sw_rx_index = rxq->sw_rx_cons & NUM_RX_BDS_MAX; in qede_selftest_receive_traffic()
1579 sw_rx_data = &rxq->sw_rx_ring[sw_rx_index]; in qede_selftest_receive_traffic()
1580 fp_cqe = &cqe->fast_path_regular; in qede_selftest_receive_traffic()
1581 len = le16_to_cpu(fp_cqe->len_on_first_bd); in qede_selftest_receive_traffic()
1582 data_ptr = (u8 *)(page_address(sw_rx_data->data) + in qede_selftest_receive_traffic()
1583 fp_cqe->placement_offset + in qede_selftest_receive_traffic()
1584 sw_rx_data->page_offset + in qede_selftest_receive_traffic()
1585 rxq->rx_headroom); in qede_selftest_receive_traffic()
1586 if (ether_addr_equal(data_ptr, edev->ndev->dev_addr) && in qede_selftest_receive_traffic()
1588 edev->ndev->dev_addr)) { in qede_selftest_receive_traffic()
1591 rc = -1; in qede_selftest_receive_traffic()
1595 qede_recycle_rx_bd_ring(rxq, 1); in qede_selftest_receive_traffic()
1596 qed_chain_recycle_consumed(&rxq->rx_comp_ring); in qede_selftest_receive_traffic()
1601 qede_recycle_rx_bd_ring(rxq, 1); in qede_selftest_receive_traffic()
1602 qed_chain_recycle_consumed(&rxq->rx_comp_ring); in qede_selftest_receive_traffic()
1607 return -1; in qede_selftest_receive_traffic()
1610 qede_update_rx_prod(edev, rxq); in qede_selftest_receive_traffic()
1623 if (!netif_running(edev->ndev)) { in qede_selftest_run_loopback()
1625 return -EINVAL; in qede_selftest_run_loopback()
1635 edev->ops->common->set_link(edev->cdev, &link_params); in qede_selftest_run_loopback()
1643 pkt_size = (((edev->ndev->mtu < ETH_DATA_LEN) ? in qede_selftest_run_loopback()
1644 edev->ndev->mtu : ETH_DATA_LEN) + ETH_HLEN); in qede_selftest_run_loopback()
1646 skb = netdev_alloc_skb(edev->ndev, pkt_size); in qede_selftest_run_loopback()
1649 rc = -ENOMEM; in qede_selftest_run_loopback()
1653 ether_addr_copy(packet, edev->ndev->dev_addr); in qede_selftest_run_loopback()
1654 ether_addr_copy(packet + ETH_ALEN, edev->ndev->dev_addr); in qede_selftest_run_loopback()
1655 memset(packet + (2 * ETH_ALEN), 0x77, (ETH_HLEN - (2 * ETH_ALEN))); in qede_selftest_run_loopback()
1677 edev->ops->common->set_link(edev->cdev, &link_params); in qede_selftest_run_loopback()
1693 "Self-test command parameters: offline = %d, external_lb = %d\n", in qede_self_test()
1694 (etest->flags & ETH_TEST_FL_OFFLINE), in qede_self_test()
1695 (etest->flags & ETH_TEST_FL_EXTERNAL_LB) >> 2); in qede_self_test()
1699 if (etest->flags & ETH_TEST_FL_OFFLINE) { in qede_self_test()
1703 etest->flags |= ETH_TEST_FL_FAILED; in qede_self_test()
1707 if (edev->ops->common->selftest->selftest_interrupt(edev->cdev)) { in qede_self_test()
1709 etest->flags |= ETH_TEST_FL_FAILED; in qede_self_test()
1712 if (edev->ops->common->selftest->selftest_memory(edev->cdev)) { in qede_self_test()
1714 etest->flags |= ETH_TEST_FL_FAILED; in qede_self_test()
1717 if (edev->ops->common->selftest->selftest_register(edev->cdev)) { in qede_self_test()
1719 etest->flags |= ETH_TEST_FL_FAILED; in qede_self_test()
1722 if (edev->ops->common->selftest->selftest_clock(edev->cdev)) { in qede_self_test()
1724 etest->flags |= ETH_TEST_FL_FAILED; in qede_self_test()
1727 if (edev->ops->common->selftest->selftest_nvram(edev->cdev)) { in qede_self_test()
1729 etest->flags |= ETH_TEST_FL_FAILED; in qede_self_test()
1740 switch (tuna->id) { in qede_set_tunable()
1747 return -EINVAL; in qede_set_tunable()
1750 edev->rx_copybreak = *(u32 *)data; in qede_set_tunable()
1753 return -EOPNOTSUPP; in qede_set_tunable()
1764 switch (tuna->id) { in qede_get_tunable()
1766 *(u32 *)data = edev->rx_copybreak; in qede_get_tunable()
1769 return -EOPNOTSUPP; in qede_get_tunable()
1781 edev->ops->common->get_link(edev->cdev, &current_link); in qede_get_eee()
1785 return -EOPNOTSUPP; in qede_get_eee()
1789 edata->advertised, in qede_get_eee()
1792 edata->advertised, in qede_get_eee()
1796 edata->supported, in qede_get_eee()
1799 edata->supported, in qede_get_eee()
1803 edata->lp_advertised, in qede_get_eee()
1806 edata->lp_advertised, in qede_get_eee()
1809 edata->tx_lpi_timer = current_link.eee.tx_lpi_timer; in qede_get_eee()
1810 edata->eee_enabled = current_link.eee.enable; in qede_get_eee()
1811 edata->tx_lpi_enabled = current_link.eee.tx_lpi_enable; in qede_get_eee()
1812 edata->eee_active = current_link.eee_active; in qede_get_eee()
1826 if (!edev->ops->common->can_link_change(edev->cdev)) { in qede_set_eee()
1828 return -EOPNOTSUPP; in qede_set_eee()
1832 edev->ops->common->get_link(edev->cdev, &current_link); in qede_set_eee()
1836 return -EOPNOTSUPP; in qede_set_eee()
1847 unsupp = linkmode_andnot(tmp, edata->advertised, supported); in qede_set_eee()
1851 __ETHTOOL_LINK_MODE_MASK_NBITS, edata->advertised); in qede_set_eee()
1852 return -EINVAL; in qede_set_eee()
1856 edata->advertised)) in qede_set_eee()
1859 edata->advertised)) in qede_set_eee()
1862 params.eee.enable = edata->eee_enabled; in qede_set_eee()
1863 params.eee.tx_lpi_enable = edata->tx_lpi_enabled; in qede_set_eee()
1864 params.eee.tx_lpi_timer = edata->tx_lpi_timer; in qede_set_eee()
1867 edev->ops->common->set_link(edev->cdev, &params); in qede_set_eee()
1915 edev->ops->common->get_link(edev->cdev, &curr_link); in qede_get_fecparam()
1917 fecparam->active_fec = qede_link_to_ethtool_fec(curr_link.active_fec); in qede_get_fecparam()
1918 fecparam->fec = qede_link_to_ethtool_fec(curr_link.sup_fec); in qede_get_fecparam()
1929 if (!edev->ops || !edev->ops->common->can_link_change(edev->cdev)) { in qede_set_fecparam()
1931 return -EOPNOTSUPP; in qede_set_fecparam()
1936 params.fec = qede_ethtool_to_link_fec(fecparam->fec); in qede_set_fecparam()
1939 edev->ops->common->set_link(edev->cdev, &params); in qede_set_fecparam()
1952 rc = edev->ops->common->read_module_eeprom(edev->cdev, buf, in qede_get_module_info()
1960 case 0x3: /* SFP, SFP+, SFP-28 */ in qede_get_module_info()
1961 modinfo->type = ETH_MODULE_SFF_8472; in qede_get_module_info()
1962 modinfo->eeprom_len = ETH_MODULE_SFF_8472_LEN; in qede_get_module_info()
1966 modinfo->type = ETH_MODULE_SFF_8436; in qede_get_module_info()
1967 modinfo->eeprom_len = ETH_MODULE_SFF_8436_LEN; in qede_get_module_info()
1969 case 0x11: /* QSFP-28 */ in qede_get_module_info()
1970 modinfo->type = ETH_MODULE_SFF_8636; in qede_get_module_info()
1971 modinfo->eeprom_len = ETH_MODULE_SFF_8636_LEN; in qede_get_module_info()
1975 return -EINVAL; in qede_get_module_info()
1985 u32 start_addr = ee->offset, size = 0; in qede_get_module_eeprom()
1990 if (ee->offset < ETH_MODULE_SFF_8079_LEN) { in qede_get_module_eeprom()
1992 if (ee->offset + ee->len > ETH_MODULE_SFF_8079_LEN) in qede_get_module_eeprom()
1993 size = ETH_MODULE_SFF_8079_LEN - ee->offset; in qede_get_module_eeprom()
1995 size = ee->len; in qede_get_module_eeprom()
1997 rc = edev->ops->common->read_module_eeprom(edev->cdev, buf, in qede_get_module_eeprom()
2012 size = ee->len - size; in qede_get_module_eeprom()
2015 size = ETH_MODULE_SFF_8472_LEN - start_addr; in qede_get_module_eeprom()
2016 start_addr -= ETH_MODULE_SFF_8079_LEN; in qede_get_module_eeprom()
2017 rc = edev->ops->common->read_module_eeprom(edev->cdev, buf, in qede_get_module_eeprom()
2035 if (edev->dump_info.cmd == QEDE_DUMP_CMD_NONE) { in qede_set_dump()
2036 if (val->flag > QEDE_DUMP_CMD_MAX) { in qede_set_dump()
2037 DP_ERR(edev, "Invalid command %d\n", val->flag); in qede_set_dump()
2038 return -EINVAL; in qede_set_dump()
2040 edev->dump_info.cmd = val->flag; in qede_set_dump()
2041 edev->dump_info.num_args = 0; in qede_set_dump()
2045 if (edev->dump_info.num_args == QEDE_DUMP_MAX_ARGS) { in qede_set_dump()
2046 DP_ERR(edev, "Arg count = %d\n", edev->dump_info.num_args); in qede_set_dump()
2047 return -EINVAL; in qede_set_dump()
2050 switch (edev->dump_info.cmd) { in qede_set_dump()
2052 edev->dump_info.args[edev->dump_info.num_args] = val->flag; in qede_set_dump()
2053 edev->dump_info.num_args++; in qede_set_dump()
2056 rc = edev->ops->common->set_grc_config(edev->cdev, in qede_set_dump()
2057 val->flag, 1); in qede_set_dump()
2071 if (!edev->ops || !edev->ops->common) { in qede_get_dump_flag()
2073 return -EINVAL; in qede_get_dump_flag()
2076 dump->version = QEDE_DUMP_VERSION; in qede_get_dump_flag()
2077 switch (edev->dump_info.cmd) { in qede_get_dump_flag()
2079 dump->flag = QEDE_DUMP_CMD_NVM_CFG; in qede_get_dump_flag()
2080 dump->len = edev->ops->common->read_nvm_cfg_len(edev->cdev, in qede_get_dump_flag()
2081 edev->dump_info.args[0]); in qede_get_dump_flag()
2084 dump->flag = QEDE_DUMP_CMD_GRCDUMP; in qede_get_dump_flag()
2085 dump->len = edev->ops->common->dbg_all_data_size(edev->cdev); in qede_get_dump_flag()
2088 DP_ERR(edev, "Invalid cmd = %d\n", edev->dump_info.cmd); in qede_get_dump_flag()
2089 return -EINVAL; in qede_get_dump_flag()
2093 "dump->version = 0x%x dump->flag = %d dump->len = %d\n", in qede_get_dump_flag()
2094 dump->version, dump->flag, dump->len); in qede_get_dump_flag()
2104 if (!edev->ops || !edev->ops->common) { in qede_get_dump_data()
2106 rc = -EINVAL; in qede_get_dump_data()
2110 switch (edev->dump_info.cmd) { in qede_get_dump_data()
2112 if (edev->dump_info.num_args != QEDE_DUMP_NVM_ARG_COUNT) { in qede_get_dump_data()
2114 edev->dump_info.num_args, in qede_get_dump_data()
2116 rc = -EINVAL; in qede_get_dump_data()
2119 rc = edev->ops->common->read_nvm_cfg(edev->cdev, (u8 **)&buf, in qede_get_dump_data()
2120 edev->dump_info.args[0], in qede_get_dump_data()
2121 edev->dump_info.args[1]); in qede_get_dump_data()
2124 memset(buf, 0, dump->len); in qede_get_dump_data()
2125 rc = edev->ops->common->dbg_all_data(edev->cdev, buf); in qede_get_dump_data()
2128 DP_ERR(edev, "Invalid cmd = %d\n", edev->dump_info.cmd); in qede_get_dump_data()
2129 rc = -EINVAL; in qede_get_dump_data()
2134 edev->dump_info.cmd = QEDE_DUMP_CMD_NONE; in qede_get_dump_data()
2135 edev->dump_info.num_args = 0; in qede_get_dump_data()
2136 memset(edev->dump_info.args, 0, sizeof(edev->dump_info.args)); in qede_get_dump_data()
2149 if (coal->rx_coalesce_usecs > QED_COALESCE_MAX || in qede_set_per_coalesce()
2150 coal->tx_coalesce_usecs > QED_COALESCE_MAX) { in qede_set_per_coalesce()
2153 coal->rx_coalesce_usecs > QED_COALESCE_MAX ? "rx" in qede_set_per_coalesce()
2156 return -EINVAL; in qede_set_per_coalesce()
2159 rxc = (u16)coal->rx_coalesce_usecs; in qede_set_per_coalesce()
2160 txc = (u16)coal->tx_coalesce_usecs; in qede_set_per_coalesce()
2163 if (queue >= edev->num_queues) { in qede_set_per_coalesce()
2165 rc = -EINVAL; in qede_set_per_coalesce()
2169 if (edev->state != QEDE_STATE_OPEN) { in qede_set_per_coalesce()
2170 rc = -EINVAL; in qede_set_per_coalesce()
2174 fp = &edev->fp_array[queue]; in qede_set_per_coalesce()
2176 if (edev->fp_array[queue].type & QEDE_FASTPATH_RX) { in qede_set_per_coalesce()
2177 rc = edev->ops->common->set_coalesce(edev->cdev, in qede_set_per_coalesce()
2179 fp->rxq->handle); in qede_set_per_coalesce()
2185 edev->coal_entry[queue].rxc = rxc; in qede_set_per_coalesce()
2186 edev->coal_entry[queue].isvalid = true; in qede_set_per_coalesce()
2189 if (edev->fp_array[queue].type & QEDE_FASTPATH_TX) { in qede_set_per_coalesce()
2190 rc = edev->ops->common->set_coalesce(edev->cdev, in qede_set_per_coalesce()
2192 fp->txq->handle); in qede_set_per_coalesce()
2198 edev->coal_entry[queue].txc = txc; in qede_set_per_coalesce()
2199 edev->coal_entry[queue].isvalid = true; in qede_set_per_coalesce()
2223 if (queue >= edev->num_queues) { in qede_get_per_coalesce()
2225 rc = -EINVAL; in qede_get_per_coalesce()
2229 if (edev->state != QEDE_STATE_OPEN) { in qede_get_per_coalesce()
2230 rc = -EINVAL; in qede_get_per_coalesce()
2234 fp = &edev->fp_array[queue]; in qede_get_per_coalesce()
2236 if (fp->type & QEDE_FASTPATH_RX) in qede_get_per_coalesce()
2237 rx_handle = fp->rxq->handle; in qede_get_per_coalesce()
2239 rc = edev->ops->get_coalesce(edev->cdev, &rx_coal, in qede_get_per_coalesce()
2246 fp = &edev->fp_array[queue]; in qede_get_per_coalesce()
2247 if (fp->type & QEDE_FASTPATH_TX) in qede_get_per_coalesce()
2248 tx_handle = fp->txq->handle; in qede_get_per_coalesce()
2250 rc = edev->ops->get_coalesce(edev->cdev, &tx_coal, in qede_get_per_coalesce()
2258 coal->rx_coalesce_usecs = rx_coal; in qede_get_per_coalesce()
2259 coal->tx_coalesce_usecs = tx_coal; in qede_get_per_coalesce()
2351 dev->ethtool_ops = &qede_vf_ethtool_ops; in qede_set_ethtool_ops()
2353 dev->ethtool_ops = &qede_ethtool_ops; in qede_set_ethtool_ops()