Lines Matching +full:self +full:- +full:advertising

1 /* Broadcom NetXtreme-C/E network driver.
3 * Copyright (c) 2014-2016 Broadcom Corporation
4 * Copyright (c) 2016-2017 Broadcom Limited
50 return bp->msg_enable; in bnxt_get_msglevel()
57 bp->msg_enable = value; in bnxt_set_msglevel()
71 coal->use_adaptive_rx_coalesce = bp->flags & BNXT_FLAG_DIM; in bnxt_get_coalesce()
73 hw_coal = &bp->rx_coal; in bnxt_get_coalesce()
74 mult = hw_coal->bufs_per_record; in bnxt_get_coalesce()
75 coal->rx_coalesce_usecs = hw_coal->coal_ticks; in bnxt_get_coalesce()
76 coal->rx_max_coalesced_frames = hw_coal->coal_bufs / mult; in bnxt_get_coalesce()
77 coal->rx_coalesce_usecs_irq = hw_coal->coal_ticks_irq; in bnxt_get_coalesce()
78 coal->rx_max_coalesced_frames_irq = hw_coal->coal_bufs_irq / mult; in bnxt_get_coalesce()
79 if (hw_coal->flags & in bnxt_get_coalesce()
81 kernel_coal->use_cqe_mode_rx = true; in bnxt_get_coalesce()
83 hw_coal = &bp->tx_coal; in bnxt_get_coalesce()
84 mult = hw_coal->bufs_per_record; in bnxt_get_coalesce()
85 coal->tx_coalesce_usecs = hw_coal->coal_ticks; in bnxt_get_coalesce()
86 coal->tx_max_coalesced_frames = hw_coal->coal_bufs / mult; in bnxt_get_coalesce()
87 coal->tx_coalesce_usecs_irq = hw_coal->coal_ticks_irq; in bnxt_get_coalesce()
88 coal->tx_max_coalesced_frames_irq = hw_coal->coal_bufs_irq / mult; in bnxt_get_coalesce()
89 if (hw_coal->flags & in bnxt_get_coalesce()
91 kernel_coal->use_cqe_mode_tx = true; in bnxt_get_coalesce()
93 coal->stats_block_coalesce_usecs = bp->stats_coal_ticks; in bnxt_get_coalesce()
109 if (coal->use_adaptive_rx_coalesce) { in bnxt_set_coalesce()
110 bp->flags |= BNXT_FLAG_DIM; in bnxt_set_coalesce()
112 if (bp->flags & BNXT_FLAG_DIM) { in bnxt_set_coalesce()
113 bp->flags &= ~(BNXT_FLAG_DIM); in bnxt_set_coalesce()
118 if ((kernel_coal->use_cqe_mode_rx || kernel_coal->use_cqe_mode_tx) && in bnxt_set_coalesce()
119 !(bp->coal_cap.cmpl_params & in bnxt_set_coalesce()
121 return -EOPNOTSUPP; in bnxt_set_coalesce()
123 hw_coal = &bp->rx_coal; in bnxt_set_coalesce()
124 mult = hw_coal->bufs_per_record; in bnxt_set_coalesce()
125 hw_coal->coal_ticks = coal->rx_coalesce_usecs; in bnxt_set_coalesce()
126 hw_coal->coal_bufs = coal->rx_max_coalesced_frames * mult; in bnxt_set_coalesce()
127 hw_coal->coal_ticks_irq = coal->rx_coalesce_usecs_irq; in bnxt_set_coalesce()
128 hw_coal->coal_bufs_irq = coal->rx_max_coalesced_frames_irq * mult; in bnxt_set_coalesce()
129 hw_coal->flags &= in bnxt_set_coalesce()
131 if (kernel_coal->use_cqe_mode_rx) in bnxt_set_coalesce()
132 hw_coal->flags |= in bnxt_set_coalesce()
135 hw_coal = &bp->tx_coal; in bnxt_set_coalesce()
136 mult = hw_coal->bufs_per_record; in bnxt_set_coalesce()
137 hw_coal->coal_ticks = coal->tx_coalesce_usecs; in bnxt_set_coalesce()
138 hw_coal->coal_bufs = coal->tx_max_coalesced_frames * mult; in bnxt_set_coalesce()
139 hw_coal->coal_ticks_irq = coal->tx_coalesce_usecs_irq; in bnxt_set_coalesce()
140 hw_coal->coal_bufs_irq = coal->tx_max_coalesced_frames_irq * mult; in bnxt_set_coalesce()
141 hw_coal->flags &= in bnxt_set_coalesce()
143 if (kernel_coal->use_cqe_mode_tx) in bnxt_set_coalesce()
144 hw_coal->flags |= in bnxt_set_coalesce()
147 if (bp->stats_coal_ticks != coal->stats_block_coalesce_usecs) { in bnxt_set_coalesce()
148 u32 stats_ticks = coal->stats_block_coalesce_usecs; in bnxt_set_coalesce()
156 bp->stats_coal_ticks = stats_ticks; in bnxt_set_coalesce()
157 if (bp->stats_coal_ticks) in bnxt_set_coalesce()
158 bp->current_interval = in bnxt_set_coalesce()
159 bp->stats_coal_ticks * HZ / 1000000; in bnxt_set_coalesce()
161 bp->current_interval = BNXT_TIMER_INTERVAL; in bnxt_set_coalesce()
166 if (test_bit(BNXT_STATE_OPEN, &bp->state)) { in bnxt_set_coalesce()
513 if (bp->max_tpa_v2) { in bnxt_get_num_tpa_ring_stats()
531 return rx * bp->rx_nr_rings + in bnxt_get_num_ring_stats()
532 tx * (bp->tx_nr_rings_xdp + bp->tx_nr_rings_per_tc) + in bnxt_get_num_ring_stats()
533 cmn * bp->cp_nr_rings; in bnxt_get_num_ring_stats()
543 if (bp->flags & BNXT_FLAG_PORT_STATS) in bnxt_get_num_stats()
546 if (bp->flags & BNXT_FLAG_PORT_STATS_EXT) { in bnxt_get_num_stats()
547 len = min_t(int, bp->fw_rx_stats_ext_size, in bnxt_get_num_stats()
550 len = min_t(int, bp->fw_tx_stats_ext_size, in bnxt_get_num_stats()
553 if (bp->pri2cos_valid) in bnxt_get_num_stats()
568 if (!bp->num_tests) in bnxt_get_sset_count()
569 return -EOPNOTSUPP; in bnxt_get_sset_count()
570 return bp->num_tests; in bnxt_get_sset_count()
572 return -EOPNOTSUPP; in bnxt_get_sset_count()
578 return ring_num < bp->rx_nr_rings; in is_rx_ring()
585 if (!(bp->flags & BNXT_FLAG_SHARED_RINGS)) in is_tx_ring()
586 tx_base = bp->rx_nr_rings; in is_tx_ring()
588 if (ring_num >= tx_base && ring_num < (tx_base + bp->tx_nr_rings)) in is_tx_ring()
602 if (!bp->bnapi) { in bnxt_get_ethtool_stats()
608 for (i = 0; i < bp->cp_nr_rings; i++) { in bnxt_get_ethtool_stats()
609 struct bnxt_napi *bnapi = bp->bnapi[i]; in bnxt_get_ethtool_stats()
610 struct bnxt_cp_ring_info *cpr = &bnapi->cp_ring; in bnxt_get_ethtool_stats()
611 u64 *sw_stats = cpr->stats.sw_stats; in bnxt_get_ethtool_stats()
634 sw = (u64 *)&cpr->sw_stats.rx; in bnxt_get_ethtool_stats()
640 sw = (u64 *)&cpr->sw_stats.cmn; in bnxt_get_ethtool_stats()
649 prev = &bp->ring_err_stats_prev.rx_total_l4_csum_errors; in bnxt_get_ethtool_stats()
653 if (bp->flags & BNXT_FLAG_PORT_STATS) { in bnxt_get_ethtool_stats()
654 u64 *port_stats = bp->port_stats.sw_stats; in bnxt_get_ethtool_stats()
659 if (bp->flags & BNXT_FLAG_PORT_STATS_EXT) { in bnxt_get_ethtool_stats()
660 u64 *rx_port_stats_ext = bp->rx_port_stats_ext.sw_stats; in bnxt_get_ethtool_stats()
661 u64 *tx_port_stats_ext = bp->tx_port_stats_ext.sw_stats; in bnxt_get_ethtool_stats()
664 len = min_t(u32, bp->fw_rx_stats_ext_size, in bnxt_get_ethtool_stats()
670 len = min_t(u32, bp->fw_tx_stats_ext_size, in bnxt_get_ethtool_stats()
676 if (bp->pri2cos_valid) { in bnxt_get_ethtool_stats()
679 bp->pri2cos_idx[i]; in bnxt_get_ethtool_stats()
685 bp->pri2cos_idx[i]; in bnxt_get_ethtool_stats()
691 bp->pri2cos_idx[i]; in bnxt_get_ethtool_stats()
697 bp->pri2cos_idx[i]; in bnxt_get_ethtool_stats()
713 for (i = 0; i < bp->cp_nr_rings; i++) { in bnxt_get_strings()
734 if (bp->max_tpa_v2) in bnxt_get_strings()
764 if (bp->flags & BNXT_FLAG_PORT_STATS) { in bnxt_get_strings()
770 if (bp->flags & BNXT_FLAG_PORT_STATS_EXT) { in bnxt_get_strings()
773 len = min_t(u32, bp->fw_rx_stats_ext_size, in bnxt_get_strings()
779 len = min_t(u32, bp->fw_tx_stats_ext_size, in bnxt_get_strings()
786 if (bp->pri2cos_valid) { in bnxt_get_strings()
811 if (bp->num_tests) in bnxt_get_strings()
812 memcpy(buf, bp->test_info->string, in bnxt_get_strings()
813 bp->num_tests * ETH_GSTRING_LEN); in bnxt_get_strings()
816 netdev_err(bp->dev, "bnxt_get_strings invalid request %x\n", in bnxt_get_strings()
829 if (bp->flags & BNXT_FLAG_AGG_RINGS) { in bnxt_get_ringparam()
830 ering->rx_max_pending = BNXT_MAX_RX_DESC_CNT_JUM_ENA; in bnxt_get_ringparam()
831 ering->rx_jumbo_max_pending = BNXT_MAX_RX_JUM_DESC_CNT; in bnxt_get_ringparam()
832 kernel_ering->tcp_data_split = ETHTOOL_TCP_DATA_SPLIT_ENABLED; in bnxt_get_ringparam()
834 ering->rx_max_pending = BNXT_MAX_RX_DESC_CNT; in bnxt_get_ringparam()
835 ering->rx_jumbo_max_pending = 0; in bnxt_get_ringparam()
836 kernel_ering->tcp_data_split = ETHTOOL_TCP_DATA_SPLIT_DISABLED; in bnxt_get_ringparam()
838 ering->tx_max_pending = BNXT_MAX_TX_DESC_CNT; in bnxt_get_ringparam()
840 ering->rx_pending = bp->rx_ring_size; in bnxt_get_ringparam()
841 ering->rx_jumbo_pending = bp->rx_agg_ring_size; in bnxt_get_ringparam()
842 ering->tx_pending = bp->tx_ring_size; in bnxt_get_ringparam()
852 if ((ering->rx_pending > BNXT_MAX_RX_DESC_CNT) || in bnxt_set_ringparam()
853 (ering->tx_pending > BNXT_MAX_TX_DESC_CNT) || in bnxt_set_ringparam()
854 (ering->tx_pending < BNXT_MIN_TX_DESC_CNT)) in bnxt_set_ringparam()
855 return -EINVAL; in bnxt_set_ringparam()
860 bp->rx_ring_size = ering->rx_pending; in bnxt_set_ringparam()
861 bp->tx_ring_size = ering->tx_pending; in bnxt_set_ringparam()
874 struct bnxt_hw_resc *hw_resc = &bp->hw_resc; in bnxt_get_channels()
878 /* Get the most up-to-date max_tx_sch_inputs. */ in bnxt_get_channels()
881 max_tx_sch_inputs = hw_resc->max_tx_sch_inputs; in bnxt_get_channels()
887 tcs = bp->num_tc; in bnxt_get_channels()
889 if (bp->tx_nr_rings_xdp) in bnxt_get_channels()
892 channel->max_combined = min_t(int, max_rx_rings, max_tx_rings); in bnxt_get_channels()
904 channel->max_rx = max_rx_rings; in bnxt_get_channels()
905 channel->max_tx = max_tx_rings; in bnxt_get_channels()
906 channel->max_other = 0; in bnxt_get_channels()
907 if (bp->flags & BNXT_FLAG_SHARED_RINGS) { in bnxt_get_channels()
908 channel->combined_count = bp->rx_nr_rings; in bnxt_get_channels()
910 channel->combined_count--; in bnxt_get_channels()
913 channel->rx_count = bp->rx_nr_rings; in bnxt_get_channels()
914 channel->tx_count = bp->tx_nr_rings_per_tc; in bnxt_get_channels()
929 if (channel->other_count) in bnxt_set_channels()
930 return -EINVAL; in bnxt_set_channels()
932 if (!channel->combined_count && in bnxt_set_channels()
933 (!channel->rx_count || !channel->tx_count)) in bnxt_set_channels()
934 return -EINVAL; in bnxt_set_channels()
936 if (channel->combined_count && in bnxt_set_channels()
937 (channel->rx_count || channel->tx_count)) in bnxt_set_channels()
938 return -EINVAL; in bnxt_set_channels()
940 if (BNXT_CHIP_TYPE_NITRO_A0(bp) && (channel->rx_count || in bnxt_set_channels()
941 channel->tx_count)) in bnxt_set_channels()
942 return -EINVAL; in bnxt_set_channels()
944 if (channel->combined_count) in bnxt_set_channels()
947 tcs = bp->num_tc; in bnxt_set_channels()
949 req_tx_rings = sh ? channel->combined_count : channel->tx_count; in bnxt_set_channels()
950 req_rx_rings = sh ? channel->combined_count : channel->rx_count; in bnxt_set_channels()
951 if (bp->tx_nr_rings_xdp) { in bnxt_set_channels()
954 return -EINVAL; in bnxt_set_channels()
965 bnxt_get_nr_rss_ctxs(bp, bp->rx_nr_rings) && in bnxt_set_channels()
968 return -EINVAL; in bnxt_set_channels()
981 bp->flags |= BNXT_FLAG_SHARED_RINGS; in bnxt_set_channels()
982 bp->rx_nr_rings = channel->combined_count; in bnxt_set_channels()
983 bp->tx_nr_rings_per_tc = channel->combined_count; in bnxt_set_channels()
985 bp->flags &= ~BNXT_FLAG_SHARED_RINGS; in bnxt_set_channels()
986 bp->rx_nr_rings = channel->rx_count; in bnxt_set_channels()
987 bp->tx_nr_rings_per_tc = channel->tx_count; in bnxt_set_channels()
989 bp->tx_nr_rings_xdp = tx_xdp; in bnxt_set_channels()
990 bp->tx_nr_rings = bp->tx_nr_rings_per_tc + tx_xdp; in bnxt_set_channels()
992 bp->tx_nr_rings = bp->tx_nr_rings_per_tc * tcs + tx_xdp; in bnxt_set_channels()
994 tx_cp = bnxt_num_tx_to_cp(bp, bp->tx_nr_rings); in bnxt_set_channels()
995 bp->cp_nr_rings = sh ? max_t(int, tx_cp, bp->rx_nr_rings) : in bnxt_set_channels()
996 tx_cp + bp->rx_nr_rings; in bnxt_set_channels()
1028 if (!fltr->flags || in bnxt_get_all_fltr_ids_rcu()
1029 test_bit(BNXT_FLTR_FW_DELETED, &fltr->state)) in bnxt_get_all_fltr_ids_rcu()
1031 ids[j++] = fltr->sw_id; in bnxt_get_all_fltr_ids_rcu()
1051 if (fltr->flags && fltr->sw_id == id) in bnxt_get_one_fltr_rcu()
1061 cmd->data = bp->ntp_fltr_count; in bnxt_grxclsrlall()
1063 cmd->rule_cnt = bnxt_get_all_fltr_ids_rcu(bp, bp->ntp_fltr_hash_tbl, in bnxt_grxclsrlall()
1065 rule_locs, 0, cmd->rule_cnt); in bnxt_grxclsrlall()
1074 (struct ethtool_rx_flow_spec *)&cmd->fs; in bnxt_grxclsrule()
1078 int rc = -EINVAL; in bnxt_grxclsrule()
1080 if (fs->location >= BNXT_NTP_FLTR_MAX_FLTR) in bnxt_grxclsrule()
1084 fltr_base = bnxt_get_one_fltr_rcu(bp, bp->ntp_fltr_hash_tbl, in bnxt_grxclsrule()
1086 fs->location); in bnxt_grxclsrule()
1093 fkeys = &fltr->fkeys; in bnxt_grxclsrule()
1094 if (fkeys->basic.n_proto == htons(ETH_P_IP)) { in bnxt_grxclsrule()
1095 if (fkeys->basic.ip_proto == IPPROTO_TCP) in bnxt_grxclsrule()
1096 fs->flow_type = TCP_V4_FLOW; in bnxt_grxclsrule()
1097 else if (fkeys->basic.ip_proto == IPPROTO_UDP) in bnxt_grxclsrule()
1098 fs->flow_type = UDP_V4_FLOW; in bnxt_grxclsrule()
1102 if (fltr->ntuple_flags & BNXT_NTUPLE_MATCH_SRC_IP) { in bnxt_grxclsrule()
1103 fs->h_u.tcp_ip4_spec.ip4src = fkeys->addrs.v4addrs.src; in bnxt_grxclsrule()
1104 fs->m_u.tcp_ip4_spec.ip4src = cpu_to_be32(~0); in bnxt_grxclsrule()
1106 if (fltr->ntuple_flags & BNXT_NTUPLE_MATCH_DST_IP) { in bnxt_grxclsrule()
1107 fs->h_u.tcp_ip4_spec.ip4dst = fkeys->addrs.v4addrs.dst; in bnxt_grxclsrule()
1108 fs->m_u.tcp_ip4_spec.ip4dst = cpu_to_be32(~0); in bnxt_grxclsrule()
1110 if (fltr->ntuple_flags & BNXT_NTUPLE_MATCH_SRC_PORT) { in bnxt_grxclsrule()
1111 fs->h_u.tcp_ip4_spec.psrc = fkeys->ports.src; in bnxt_grxclsrule()
1112 fs->m_u.tcp_ip4_spec.psrc = cpu_to_be16(~0); in bnxt_grxclsrule()
1114 if (fltr->ntuple_flags & BNXT_NTUPLE_MATCH_DST_PORT) { in bnxt_grxclsrule()
1115 fs->h_u.tcp_ip4_spec.pdst = fkeys->ports.dst; in bnxt_grxclsrule()
1116 fs->m_u.tcp_ip4_spec.pdst = cpu_to_be16(~0); in bnxt_grxclsrule()
1119 if (fkeys->basic.ip_proto == IPPROTO_TCP) in bnxt_grxclsrule()
1120 fs->flow_type = TCP_V6_FLOW; in bnxt_grxclsrule()
1121 else if (fkeys->basic.ip_proto == IPPROTO_UDP) in bnxt_grxclsrule()
1122 fs->flow_type = UDP_V6_FLOW; in bnxt_grxclsrule()
1126 if (fltr->ntuple_flags & BNXT_NTUPLE_MATCH_SRC_IP) { in bnxt_grxclsrule()
1127 *(struct in6_addr *)&fs->h_u.tcp_ip6_spec.ip6src[0] = in bnxt_grxclsrule()
1128 fkeys->addrs.v6addrs.src; in bnxt_grxclsrule()
1129 bnxt_fill_ipv6_mask(fs->m_u.tcp_ip6_spec.ip6src); in bnxt_grxclsrule()
1131 if (fltr->ntuple_flags & BNXT_NTUPLE_MATCH_DST_IP) { in bnxt_grxclsrule()
1132 *(struct in6_addr *)&fs->h_u.tcp_ip6_spec.ip6dst[0] = in bnxt_grxclsrule()
1133 fkeys->addrs.v6addrs.dst; in bnxt_grxclsrule()
1134 bnxt_fill_ipv6_mask(fs->m_u.tcp_ip6_spec.ip6dst); in bnxt_grxclsrule()
1136 if (fltr->ntuple_flags & BNXT_NTUPLE_MATCH_SRC_PORT) { in bnxt_grxclsrule()
1137 fs->h_u.tcp_ip6_spec.psrc = fkeys->ports.src; in bnxt_grxclsrule()
1138 fs->m_u.tcp_ip6_spec.psrc = cpu_to_be16(~0); in bnxt_grxclsrule()
1140 if (fltr->ntuple_flags & BNXT_NTUPLE_MATCH_DST_PORT) { in bnxt_grxclsrule()
1141 fs->h_u.tcp_ip6_spec.pdst = fkeys->ports.dst; in bnxt_grxclsrule()
1142 fs->m_u.tcp_ip6_spec.pdst = cpu_to_be16(~0); in bnxt_grxclsrule()
1146 fs->ring_cookie = fltr->base.rxq; in bnxt_grxclsrule()
1171 u8 vf = ethtool_get_flow_spec_ring_vf(fs->ring_cookie); in bnxt_add_ntuple_cls_rule()
1172 u32 ring = ethtool_get_flow_spec_ring(fs->ring_cookie); in bnxt_add_ntuple_cls_rule()
1175 u32 flow_type = fs->flow_type; in bnxt_add_ntuple_cls_rule()
1180 if (!bp->vnic_info) in bnxt_add_ntuple_cls_rule()
1181 return -EAGAIN; in bnxt_add_ntuple_cls_rule()
1184 return -EOPNOTSUPP; in bnxt_add_ntuple_cls_rule()
1188 return -ENOMEM; in bnxt_add_ntuple_cls_rule()
1190 l2_fltr = bp->vnic_info[0].l2_filters[0]; in bnxt_add_ntuple_cls_rule()
1191 atomic_inc(&l2_fltr->refcnt); in bnxt_add_ntuple_cls_rule()
1192 new_fltr->l2_fltr = l2_fltr; in bnxt_add_ntuple_cls_rule()
1193 fkeys = &new_fltr->fkeys; in bnxt_add_ntuple_cls_rule()
1195 rc = -EOPNOTSUPP; in bnxt_add_ntuple_cls_rule()
1199 struct ethtool_tcpip4_spec *ip_spec = &fs->h_u.tcp_ip4_spec; in bnxt_add_ntuple_cls_rule()
1200 struct ethtool_tcpip4_spec *ip_mask = &fs->m_u.tcp_ip4_spec; in bnxt_add_ntuple_cls_rule()
1202 fkeys->basic.ip_proto = IPPROTO_TCP; in bnxt_add_ntuple_cls_rule()
1204 fkeys->basic.ip_proto = IPPROTO_UDP; in bnxt_add_ntuple_cls_rule()
1205 fkeys->basic.n_proto = htons(ETH_P_IP); in bnxt_add_ntuple_cls_rule()
1207 if (ip_mask->ip4src == IPV4_ALL_MASK) { in bnxt_add_ntuple_cls_rule()
1208 fkeys->addrs.v4addrs.src = ip_spec->ip4src; in bnxt_add_ntuple_cls_rule()
1209 new_fltr->ntuple_flags |= BNXT_NTUPLE_MATCH_SRC_IP; in bnxt_add_ntuple_cls_rule()
1210 } else if (ip_mask->ip4src) { in bnxt_add_ntuple_cls_rule()
1213 if (ip_mask->ip4dst == IPV4_ALL_MASK) { in bnxt_add_ntuple_cls_rule()
1214 fkeys->addrs.v4addrs.dst = ip_spec->ip4dst; in bnxt_add_ntuple_cls_rule()
1215 new_fltr->ntuple_flags |= BNXT_NTUPLE_MATCH_DST_IP; in bnxt_add_ntuple_cls_rule()
1216 } else if (ip_mask->ip4dst) { in bnxt_add_ntuple_cls_rule()
1220 if (ip_mask->psrc == L4_PORT_ALL_MASK) { in bnxt_add_ntuple_cls_rule()
1221 fkeys->ports.src = ip_spec->psrc; in bnxt_add_ntuple_cls_rule()
1222 new_fltr->ntuple_flags |= BNXT_NTUPLE_MATCH_SRC_PORT; in bnxt_add_ntuple_cls_rule()
1223 } else if (ip_mask->psrc) { in bnxt_add_ntuple_cls_rule()
1226 if (ip_mask->pdst == L4_PORT_ALL_MASK) { in bnxt_add_ntuple_cls_rule()
1227 fkeys->ports.dst = ip_spec->pdst; in bnxt_add_ntuple_cls_rule()
1228 new_fltr->ntuple_flags |= BNXT_NTUPLE_MATCH_DST_PORT; in bnxt_add_ntuple_cls_rule()
1229 } else if (ip_mask->pdst) { in bnxt_add_ntuple_cls_rule()
1236 struct ethtool_tcpip6_spec *ip_spec = &fs->h_u.tcp_ip6_spec; in bnxt_add_ntuple_cls_rule()
1237 struct ethtool_tcpip6_spec *ip_mask = &fs->m_u.tcp_ip6_spec; in bnxt_add_ntuple_cls_rule()
1239 fkeys->basic.ip_proto = IPPROTO_TCP; in bnxt_add_ntuple_cls_rule()
1241 fkeys->basic.ip_proto = IPPROTO_UDP; in bnxt_add_ntuple_cls_rule()
1242 fkeys->basic.n_proto = htons(ETH_P_IPV6); in bnxt_add_ntuple_cls_rule()
1244 if (ipv6_mask_is_full(ip_mask->ip6src)) { in bnxt_add_ntuple_cls_rule()
1245 fkeys->addrs.v6addrs.src = in bnxt_add_ntuple_cls_rule()
1246 *(struct in6_addr *)&ip_spec->ip6src; in bnxt_add_ntuple_cls_rule()
1247 new_fltr->ntuple_flags |= BNXT_NTUPLE_MATCH_SRC_IP; in bnxt_add_ntuple_cls_rule()
1248 } else if (!ipv6_mask_is_zero(ip_mask->ip6src)) { in bnxt_add_ntuple_cls_rule()
1251 if (ipv6_mask_is_full(ip_mask->ip6dst)) { in bnxt_add_ntuple_cls_rule()
1252 fkeys->addrs.v6addrs.dst = in bnxt_add_ntuple_cls_rule()
1253 *(struct in6_addr *)&ip_spec->ip6dst; in bnxt_add_ntuple_cls_rule()
1254 new_fltr->ntuple_flags |= BNXT_NTUPLE_MATCH_DST_IP; in bnxt_add_ntuple_cls_rule()
1255 } else if (!ipv6_mask_is_zero(ip_mask->ip6dst)) { in bnxt_add_ntuple_cls_rule()
1259 if (ip_mask->psrc == L4_PORT_ALL_MASK) { in bnxt_add_ntuple_cls_rule()
1260 fkeys->ports.src = ip_spec->psrc; in bnxt_add_ntuple_cls_rule()
1261 new_fltr->ntuple_flags |= BNXT_NTUPLE_MATCH_SRC_PORT; in bnxt_add_ntuple_cls_rule()
1262 } else if (ip_mask->psrc) { in bnxt_add_ntuple_cls_rule()
1265 if (ip_mask->pdst == L4_PORT_ALL_MASK) { in bnxt_add_ntuple_cls_rule()
1266 fkeys->ports.dst = ip_spec->pdst; in bnxt_add_ntuple_cls_rule()
1267 new_fltr->ntuple_flags |= BNXT_NTUPLE_MATCH_DST_PORT; in bnxt_add_ntuple_cls_rule()
1268 } else if (ip_mask->pdst) { in bnxt_add_ntuple_cls_rule()
1274 rc = -EOPNOTSUPP; in bnxt_add_ntuple_cls_rule()
1277 if (!new_fltr->ntuple_flags) in bnxt_add_ntuple_cls_rule()
1285 rc = -EEXIST; in bnxt_add_ntuple_cls_rule()
1290 new_fltr->base.rxq = ring; in bnxt_add_ntuple_cls_rule()
1291 new_fltr->base.flags = BNXT_ACT_NO_AGING; in bnxt_add_ntuple_cls_rule()
1292 __set_bit(BNXT_FLTR_VALID, &new_fltr->base.state); in bnxt_add_ntuple_cls_rule()
1300 fs->location = new_fltr->base.sw_id; in bnxt_add_ntuple_cls_rule()
1305 atomic_dec(&l2_fltr->refcnt); in bnxt_add_ntuple_cls_rule()
1312 struct ethtool_rx_flow_spec *fs = &cmd->fs; in bnxt_srxclsrlins()
1317 if (!netif_running(bp->dev)) in bnxt_srxclsrlins()
1318 return -EAGAIN; in bnxt_srxclsrlins()
1319 if (!(bp->flags & BNXT_FLAG_RFS)) in bnxt_srxclsrlins()
1320 return -EPERM; in bnxt_srxclsrlins()
1321 if (fs->location != RX_CLS_LOC_ANY) in bnxt_srxclsrlins()
1322 return -EINVAL; in bnxt_srxclsrlins()
1324 ring = ethtool_get_flow_spec_ring(fs->ring_cookie); in bnxt_srxclsrlins()
1325 vf = ethtool_get_flow_spec_ring_vf(fs->ring_cookie); in bnxt_srxclsrlins()
1327 return -EINVAL; in bnxt_srxclsrlins()
1328 if (BNXT_PF(bp) && vf > bp->pf.active_vfs) in bnxt_srxclsrlins()
1329 return -EINVAL; in bnxt_srxclsrlins()
1330 if (!vf && ring >= bp->rx_nr_rings) in bnxt_srxclsrlins()
1331 return -EINVAL; in bnxt_srxclsrlins()
1333 flow_type = fs->flow_type; in bnxt_srxclsrlins()
1335 return -EINVAL; in bnxt_srxclsrlins()
1338 rc = -EOPNOTSUPP; in bnxt_srxclsrlins()
1346 struct ethtool_rx_flow_spec *fs = &cmd->fs; in bnxt_srxclsrldel()
1351 fltr_base = bnxt_get_one_fltr_rcu(bp, bp->ntp_fltr_hash_tbl, in bnxt_srxclsrldel()
1353 fs->location); in bnxt_srxclsrldel()
1356 return -ENOENT; in bnxt_srxclsrldel()
1360 if (!(fltr->base.flags & BNXT_ACT_NO_AGING)) { in bnxt_srxclsrldel()
1362 return -EINVAL; in bnxt_srxclsrldel()
1372 if (bp->rss_hash_cfg & VNIC_RSS_CFG_REQ_HASH_TYPE_IPV4) in get_ethtool_ipv4_rss()
1379 if (bp->rss_hash_cfg & VNIC_RSS_CFG_REQ_HASH_TYPE_IPV6) in get_ethtool_ipv6_rss()
1386 cmd->data = 0; in bnxt_grxfh()
1387 switch (cmd->flow_type) { in bnxt_grxfh()
1389 if (bp->rss_hash_cfg & VNIC_RSS_CFG_REQ_HASH_TYPE_TCP_IPV4) in bnxt_grxfh()
1390 cmd->data |= RXH_IP_SRC | RXH_IP_DST | in bnxt_grxfh()
1392 cmd->data |= get_ethtool_ipv4_rss(bp); in bnxt_grxfh()
1395 if (bp->rss_hash_cfg & VNIC_RSS_CFG_REQ_HASH_TYPE_UDP_IPV4) in bnxt_grxfh()
1396 cmd->data |= RXH_IP_SRC | RXH_IP_DST | in bnxt_grxfh()
1404 cmd->data |= get_ethtool_ipv4_rss(bp); in bnxt_grxfh()
1408 if (bp->rss_hash_cfg & VNIC_RSS_CFG_REQ_HASH_TYPE_TCP_IPV6) in bnxt_grxfh()
1409 cmd->data |= RXH_IP_SRC | RXH_IP_DST | in bnxt_grxfh()
1411 cmd->data |= get_ethtool_ipv6_rss(bp); in bnxt_grxfh()
1414 if (bp->rss_hash_cfg & VNIC_RSS_CFG_REQ_HASH_TYPE_UDP_IPV6) in bnxt_grxfh()
1415 cmd->data |= RXH_IP_SRC | RXH_IP_DST | in bnxt_grxfh()
1423 cmd->data |= get_ethtool_ipv6_rss(bp); in bnxt_grxfh()
1434 u32 rss_hash_cfg = bp->rss_hash_cfg; in bnxt_srxfh()
1437 if (cmd->data == RXH_4TUPLE) in bnxt_srxfh()
1439 else if (cmd->data == RXH_2TUPLE) in bnxt_srxfh()
1441 else if (!cmd->data) in bnxt_srxfh()
1444 return -EINVAL; in bnxt_srxfh()
1446 if (cmd->flow_type == TCP_V4_FLOW) { in bnxt_srxfh()
1450 } else if (cmd->flow_type == UDP_V4_FLOW) { in bnxt_srxfh()
1451 if (tuple == 4 && !(bp->rss_cap & BNXT_RSS_CAP_UDP_RSS_CAP)) in bnxt_srxfh()
1452 return -EINVAL; in bnxt_srxfh()
1456 } else if (cmd->flow_type == TCP_V6_FLOW) { in bnxt_srxfh()
1460 } else if (cmd->flow_type == UDP_V6_FLOW) { in bnxt_srxfh()
1461 if (tuple == 4 && !(bp->rss_cap & BNXT_RSS_CAP_UDP_RSS_CAP)) in bnxt_srxfh()
1462 return -EINVAL; in bnxt_srxfh()
1467 return -EINVAL; in bnxt_srxfh()
1470 switch (cmd->flow_type) { in bnxt_srxfh()
1498 if (bp->rss_hash_cfg == rss_hash_cfg) in bnxt_srxfh()
1501 if (bp->rss_cap & BNXT_RSS_CAP_RSS_HASH_TYPE_DELTA) in bnxt_srxfh()
1502 bp->rss_hash_delta = bp->rss_hash_cfg ^ rss_hash_cfg; in bnxt_srxfh()
1503 bp->rss_hash_cfg = rss_hash_cfg; in bnxt_srxfh()
1504 if (netif_running(bp->dev)) { in bnxt_srxfh()
1517 switch (cmd->cmd) { in bnxt_get_rxnfc()
1519 cmd->data = bp->rx_nr_rings; in bnxt_get_rxnfc()
1523 cmd->rule_cnt = bp->ntp_fltr_count; in bnxt_get_rxnfc()
1524 cmd->data = BNXT_NTP_FLTR_MAX_FLTR | RX_CLS_LOC_SPECIAL; in bnxt_get_rxnfc()
1540 rc = -EOPNOTSUPP; in bnxt_get_rxnfc()
1552 switch (cmd->cmd) { in bnxt_set_rxnfc()
1566 rc = -EOPNOTSUPP; in bnxt_set_rxnfc()
1576 if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS) in bnxt_get_rxfh_indir_size()
1577 return bnxt_get_nr_rss_ctxs(bp, bp->rx_nr_rings) * in bnxt_get_rxfh_indir_size()
1594 rxfh->hfunc = ETH_RSS_HASH_TOP; in bnxt_get_rxfh()
1596 if (!bp->vnic_info) in bnxt_get_rxfh()
1599 vnic = &bp->vnic_info[0]; in bnxt_get_rxfh()
1600 if (rxfh->indir && bp->rss_indir_tbl) { in bnxt_get_rxfh()
1603 rxfh->indir[i] = bp->rss_indir_tbl[i]; in bnxt_get_rxfh()
1606 if (rxfh->key && vnic->rss_hash_key) in bnxt_get_rxfh()
1607 memcpy(rxfh->key, vnic->rss_hash_key, HW_HASH_KEY_SIZE); in bnxt_get_rxfh()
1619 if (rxfh->hfunc && rxfh->hfunc != ETH_RSS_HASH_TOP) in bnxt_set_rxfh()
1620 return -EOPNOTSUPP; in bnxt_set_rxfh()
1622 if (rxfh->key) in bnxt_set_rxfh()
1623 return -EOPNOTSUPP; in bnxt_set_rxfh()
1625 if (rxfh->indir) { in bnxt_set_rxfh()
1629 bp->rss_indir_tbl[i] = rxfh->indir[i]; in bnxt_set_rxfh()
1630 pad = bp->rss_indir_tbl_entries - tbl_size; in bnxt_set_rxfh()
1632 memset(&bp->rss_indir_tbl[i], 0, pad * sizeof(u16)); in bnxt_set_rxfh()
1635 if (netif_running(bp->dev)) { in bnxt_set_rxfh()
1647 strscpy(info->driver, DRV_MODULE_NAME, sizeof(info->driver)); in bnxt_get_drvinfo()
1648 strscpy(info->fw_version, bp->fw_ver_str, sizeof(info->fw_version)); in bnxt_get_drvinfo()
1649 strscpy(info->bus_info, pci_name(bp->pdev), sizeof(info->bus_info)); in bnxt_get_drvinfo()
1650 info->n_stats = bnxt_get_num_stats(bp); in bnxt_get_drvinfo()
1651 info->testinfo_len = bp->num_tests; in bnxt_get_drvinfo()
1653 info->eedump_len = 0; in bnxt_get_drvinfo()
1655 info->regdump_len = 0; in bnxt_get_drvinfo()
1664 return -EOPNOTSUPP; in bnxt_get_regs_len()
1668 if (bp->fw_cap & BNXT_FW_CAP_PCIE_STATS_SUPPORTED) in bnxt_get_regs_len()
1683 regs->version = 0; in bnxt_get_regs()
1686 if (!(bp->fw_cap & BNXT_FW_CAP_PCIE_STATS_SUPPORTED)) in bnxt_get_regs()
1699 regs->version = 1; in bnxt_get_regs()
1701 req->pcie_stat_size = cpu_to_le16(sizeof(*hw_pcie_stats)); in bnxt_get_regs()
1702 req->pcie_stat_host_addr = cpu_to_le64(hw_pcie_stats_addr); in bnxt_get_regs()
1719 wol->supported = 0; in bnxt_get_wol()
1720 wol->wolopts = 0; in bnxt_get_wol()
1721 memset(&wol->sopass, 0, sizeof(wol->sopass)); in bnxt_get_wol()
1722 if (bp->flags & BNXT_FLAG_WOL_CAP) { in bnxt_get_wol()
1723 wol->supported = WAKE_MAGIC; in bnxt_get_wol()
1724 if (bp->wol) in bnxt_get_wol()
1725 wol->wolopts = WAKE_MAGIC; in bnxt_get_wol()
1733 if (wol->wolopts & ~WAKE_MAGIC) in bnxt_set_wol()
1734 return -EINVAL; in bnxt_set_wol()
1736 if (wol->wolopts & WAKE_MAGIC) { in bnxt_set_wol()
1737 if (!(bp->flags & BNXT_FLAG_WOL_CAP)) in bnxt_set_wol()
1738 return -EINVAL; in bnxt_set_wol()
1739 if (!bp->wol) { in bnxt_set_wol()
1741 return -EBUSY; in bnxt_set_wol()
1742 bp->wol = 1; in bnxt_set_wol()
1745 if (bp->wol) { in bnxt_set_wol()
1747 return -EBUSY; in bnxt_set_wol()
1748 bp->wol = 0; in bnxt_set_wol()
1853 switch (link_info->media_type) { in bnxt_get_media()
1859 if (link_info->phy_type < ARRAY_SIZE(bnxt_phy_types)) in bnxt_get_media()
1860 return bnxt_phy_types[link_info->phy_type]; in bnxt_get_media()
2011 #define BNXT_LINK_MODE_UNKNOWN -1
2021 if (link_info->phy_link_status != BNXT_LINK_LINK) in bnxt_get_link_mode()
2025 if (BNXT_AUTO_MODE(link_info->auto_mode)) { in bnxt_get_link_mode()
2026 speed = bnxt_fw_speed_idx(link_info->link_speed); in bnxt_get_link_mode()
2027 sig_mode = link_info->active_fec_sig_mode & in bnxt_get_link_mode()
2030 speed = bnxt_fw_speed_idx(link_info->req_link_speed); in bnxt_get_link_mode()
2031 sig_mode = link_info->req_signal_mode; in bnxt_get_link_mode()
2046 if (~link_info->duplex & BNXT_LINK_DUPLEX_FULL) in bnxt_get_link_mode()
2050 if (~link_info->duplex & BNXT_LINK_DUPLEX_FULL) in bnxt_get_link_mode()
2065 if (!(bp->phy_flags & BNXT_PHY_FL_NO_PAUSE)) { in bnxt_get_ethtool_modes()
2067 lk_ksettings->link_modes.supported); in bnxt_get_ethtool_modes()
2069 lk_ksettings->link_modes.supported); in bnxt_get_ethtool_modes()
2072 if (link_info->support_auto_speeds || link_info->support_auto_speeds2 || in bnxt_get_ethtool_modes()
2073 link_info->support_pam4_auto_speeds) in bnxt_get_ethtool_modes()
2075 lk_ksettings->link_modes.supported); in bnxt_get_ethtool_modes()
2077 if (~link_info->autoneg & BNXT_AUTONEG_FLOW_CTRL) in bnxt_get_ethtool_modes()
2080 if (link_info->auto_pause_setting & BNXT_LINK_PAUSE_RX) in bnxt_get_ethtool_modes()
2082 lk_ksettings->link_modes.advertising); in bnxt_get_ethtool_modes()
2083 if (hweight8(link_info->auto_pause_setting & BNXT_LINK_PAUSE_BOTH) == 1) in bnxt_get_ethtool_modes()
2085 lk_ksettings->link_modes.advertising); in bnxt_get_ethtool_modes()
2086 if (link_info->lp_pause & BNXT_LINK_PAUSE_RX) in bnxt_get_ethtool_modes()
2088 lk_ksettings->link_modes.lp_advertising); in bnxt_get_ethtool_modes()
2089 if (hweight8(link_info->lp_pause & BNXT_LINK_PAUSE_BOTH) == 1) in bnxt_get_ethtool_modes()
2091 lk_ksettings->link_modes.lp_advertising); in bnxt_get_ethtool_modes()
2102 [__BNXT_LINK_SPEED_END - 1] = 0 /* make any legal speed a valid index */
2109 [__BNXT_LINK_SPEED_END - 1] = 0 /* make any legal speed a valid index */
2119 [__BNXT_LINK_SPEED_END - 1] = 0 /* make any legal speed a valid index */
2222 u16 phy_flags = bp->phy_flags; in bnxt_get_all_ethtool_support_speeds()
2225 sp_nrz = link_info->support_speeds2; in bnxt_get_all_ethtool_support_speeds()
2226 sp_pam4 = link_info->support_speeds2; in bnxt_get_all_ethtool_support_speeds()
2227 sp_pam4_112 = link_info->support_speeds2; in bnxt_get_all_ethtool_support_speeds()
2229 sp_nrz = link_info->support_speeds; in bnxt_get_all_ethtool_support_speeds()
2230 sp_pam4 = link_info->support_pam4_speeds; in bnxt_get_all_ethtool_support_speeds()
2233 lk_ksettings->link_modes.supported); in bnxt_get_all_ethtool_support_speeds()
2235 lk_ksettings->link_modes.supported); in bnxt_get_all_ethtool_support_speeds()
2237 phy_flags, lk_ksettings->link_modes.supported); in bnxt_get_all_ethtool_support_speeds()
2247 u16 phy_flags = bp->phy_flags; in bnxt_get_all_ethtool_adv_speeds()
2249 sp_nrz = link_info->advertising; in bnxt_get_all_ethtool_adv_speeds()
2251 sp_pam4 = link_info->advertising; in bnxt_get_all_ethtool_adv_speeds()
2252 sp_pam4_112 = link_info->advertising; in bnxt_get_all_ethtool_adv_speeds()
2254 sp_pam4 = link_info->advertising_pam4; in bnxt_get_all_ethtool_adv_speeds()
2257 lk_ksettings->link_modes.advertising); in bnxt_get_all_ethtool_adv_speeds()
2259 lk_ksettings->link_modes.advertising); in bnxt_get_all_ethtool_adv_speeds()
2261 phy_flags, lk_ksettings->link_modes.advertising); in bnxt_get_all_ethtool_adv_speeds()
2270 u16 phy_flags = bp->phy_flags; in bnxt_get_all_ethtool_lp_speeds()
2272 bnxt_get_ethtool_speeds(link_info->lp_auto_link_speeds, media, in bnxt_get_all_ethtool_lp_speeds()
2274 lk_ksettings->link_modes.lp_advertising); in bnxt_get_all_ethtool_lp_speeds()
2275 bnxt_get_ethtool_speeds(link_info->lp_auto_pam4_link_speeds, media, in bnxt_get_all_ethtool_lp_speeds()
2277 lk_ksettings->link_modes.lp_advertising); in bnxt_get_all_ethtool_lp_speeds()
2315 adv = &link_info->advertising; in bnxt_set_ethtool_speeds()
2316 if (bp->phy_flags & BNXT_PHY_FL_SPEEDS2) { in bnxt_set_ethtool_speeds()
2317 adv_pam4 = &link_info->advertising; in bnxt_set_ethtool_speeds()
2318 adv_pam4_112 = &link_info->advertising; in bnxt_set_ethtool_speeds()
2323 adv_pam4 = &link_info->advertising_pam4; in bnxt_set_ethtool_speeds()
2349 u16 fec_cfg = link_info->fec_cfg; in bnxt_fw_to_ethtool_advertised_fec()
2353 lk_ksettings->link_modes.advertising); in bnxt_fw_to_ethtool_advertised_fec()
2358 lk_ksettings->link_modes.advertising); in bnxt_fw_to_ethtool_advertised_fec()
2361 lk_ksettings->link_modes.advertising); in bnxt_fw_to_ethtool_advertised_fec()
2364 lk_ksettings->link_modes.advertising); in bnxt_fw_to_ethtool_advertised_fec()
2370 u16 fec_cfg = link_info->fec_cfg; in bnxt_fw_to_ethtool_support_fec()
2374 lk_ksettings->link_modes.supported); in bnxt_fw_to_ethtool_support_fec()
2379 lk_ksettings->link_modes.supported); in bnxt_fw_to_ethtool_support_fec()
2382 lk_ksettings->link_modes.supported); in bnxt_fw_to_ethtool_support_fec()
2385 lk_ksettings->link_modes.supported); in bnxt_fw_to_ethtool_support_fec()
2428 struct ethtool_link_settings *base = &lk_ksettings->base; in bnxt_get_default_speeds()
2430 if (link_info->link_state == BNXT_LINK_STATE_UP) { in bnxt_get_default_speeds()
2431 base->speed = bnxt_fw_to_ethtool_speed(link_info->link_speed); in bnxt_get_default_speeds()
2432 base->duplex = DUPLEX_HALF; in bnxt_get_default_speeds()
2433 if (link_info->duplex & BNXT_LINK_DUPLEX_FULL) in bnxt_get_default_speeds()
2434 base->duplex = DUPLEX_FULL; in bnxt_get_default_speeds()
2435 lk_ksettings->lanes = link_info->active_lanes; in bnxt_get_default_speeds()
2436 } else if (!link_info->autoneg) { in bnxt_get_default_speeds()
2437 base->speed = bnxt_fw_to_ethtool_speed(link_info->req_link_speed); in bnxt_get_default_speeds()
2438 base->duplex = DUPLEX_HALF; in bnxt_get_default_speeds()
2439 if (link_info->req_duplex == BNXT_LINK_DUPLEX_FULL) in bnxt_get_default_speeds()
2440 base->duplex = DUPLEX_FULL; in bnxt_get_default_speeds()
2447 struct ethtool_link_settings *base = &lk_ksettings->base; in bnxt_get_link_ksettings()
2454 ethtool_link_ksettings_zero_link_mode(lk_ksettings, advertising); in bnxt_get_link_ksettings()
2456 base->duplex = DUPLEX_UNKNOWN; in bnxt_get_link_ksettings()
2457 base->speed = SPEED_UNKNOWN; in bnxt_get_link_ksettings()
2458 link_info = &bp->link_info; in bnxt_get_link_ksettings()
2460 mutex_lock(&bp->link_lock); in bnxt_get_link_ksettings()
2471 if (link_info->autoneg) { in bnxt_get_link_ksettings()
2474 lk_ksettings->link_modes.advertising); in bnxt_get_link_ksettings()
2475 base->autoneg = AUTONEG_ENABLE; in bnxt_get_link_ksettings()
2477 if (link_info->phy_link_status == BNXT_LINK_LINK) in bnxt_get_link_ksettings()
2481 base->autoneg = AUTONEG_DISABLE; in bnxt_get_link_ksettings()
2484 base->port = PORT_NONE; in bnxt_get_link_ksettings()
2485 if (link_info->media_type == PORT_PHY_QCFG_RESP_MEDIA_TYPE_TP) { in bnxt_get_link_ksettings()
2486 base->port = PORT_TP; in bnxt_get_link_ksettings()
2488 lk_ksettings->link_modes.supported); in bnxt_get_link_ksettings()
2490 lk_ksettings->link_modes.advertising); in bnxt_get_link_ksettings()
2493 lk_ksettings->link_modes.supported); in bnxt_get_link_ksettings()
2495 lk_ksettings->link_modes.advertising); in bnxt_get_link_ksettings()
2497 if (link_info->media_type == PORT_PHY_QCFG_RESP_MEDIA_TYPE_DAC) in bnxt_get_link_ksettings()
2498 base->port = PORT_DA; in bnxt_get_link_ksettings()
2500 base->port = PORT_FIBRE; in bnxt_get_link_ksettings()
2502 base->phy_address = link_info->phy_addr; in bnxt_get_link_ksettings()
2503 mutex_unlock(&bp->link_lock); in bnxt_get_link_ksettings()
2512 struct bnxt_link_info *link_info = &bp->link_info; in bnxt_force_link_speed()
2513 u16 support_pam4_spds = link_info->support_pam4_speeds; in bnxt_force_link_speed()
2514 u16 support_spds2 = link_info->support_speeds2; in bnxt_force_link_speed()
2515 u16 support_spds = link_info->support_speeds; in bnxt_force_link_speed()
2623 return -EINVAL; in bnxt_force_link_speed()
2628 return -EINVAL; in bnxt_force_link_speed()
2631 if (link_info->req_link_speed == fw_speed && in bnxt_force_link_speed()
2632 link_info->req_signal_mode == sig_mode && in bnxt_force_link_speed()
2633 link_info->autoneg == 0) in bnxt_force_link_speed()
2634 return -EALREADY; in bnxt_force_link_speed()
2636 link_info->req_link_speed = fw_speed; in bnxt_force_link_speed()
2637 link_info->req_signal_mode = sig_mode; in bnxt_force_link_speed()
2638 link_info->req_duplex = BNXT_LINK_DUPLEX_FULL; in bnxt_force_link_speed()
2639 link_info->autoneg = 0; in bnxt_force_link_speed()
2640 link_info->advertising = 0; in bnxt_force_link_speed()
2641 link_info->advertising_pam4 = 0; in bnxt_force_link_speed()
2646 u16 bnxt_get_fw_auto_link_speeds(u32 advertising) in bnxt_get_fw_auto_link_speeds() argument
2651 if (advertising & (ADVERTISED_100baseT_Full | in bnxt_get_fw_auto_link_speeds()
2655 if (advertising & (ADVERTISED_1000baseT_Full | in bnxt_get_fw_auto_link_speeds()
2659 if (advertising & ADVERTISED_10000baseT_Full) in bnxt_get_fw_auto_link_speeds()
2662 if (advertising & ADVERTISED_40000baseCR4_Full) in bnxt_get_fw_auto_link_speeds()
2672 struct bnxt_link_info *link_info = &bp->link_info; in bnxt_set_link_ksettings()
2673 const struct ethtool_link_settings *base = &lk_ksettings->base; in bnxt_set_link_ksettings()
2679 return -EOPNOTSUPP; in bnxt_set_link_ksettings()
2681 mutex_lock(&bp->link_lock); in bnxt_set_link_ksettings()
2682 if (base->autoneg == AUTONEG_ENABLE) { in bnxt_set_link_ksettings()
2684 lk_ksettings->link_modes.advertising); in bnxt_set_link_ksettings()
2685 link_info->autoneg |= BNXT_AUTONEG_SPEED; in bnxt_set_link_ksettings()
2686 if (!link_info->advertising && !link_info->advertising_pam4) { in bnxt_set_link_ksettings()
2687 link_info->advertising = link_info->support_auto_speeds; in bnxt_set_link_ksettings()
2688 link_info->advertising_pam4 = in bnxt_set_link_ksettings()
2689 link_info->support_pam4_auto_speeds; in bnxt_set_link_ksettings()
2694 if (!(bp->phy_flags & BNXT_PHY_FL_NO_PAUSE)) in bnxt_set_link_ksettings()
2697 u8 phy_type = link_info->phy_type; in bnxt_set_link_ksettings()
2701 link_info->media_type == PORT_PHY_QCFG_RESP_MEDIA_TYPE_TP) { in bnxt_set_link_ksettings()
2702 netdev_err(dev, "10GBase-T devices must autoneg\n"); in bnxt_set_link_ksettings()
2703 rc = -EINVAL; in bnxt_set_link_ksettings()
2706 if (base->duplex == DUPLEX_HALF) { in bnxt_set_link_ksettings()
2708 rc = -EINVAL; in bnxt_set_link_ksettings()
2711 speed = base->speed; in bnxt_set_link_ksettings()
2712 lanes = lk_ksettings->lanes; in bnxt_set_link_ksettings()
2715 if (rc == -EALREADY) in bnxt_set_link_ksettings()
2725 mutex_unlock(&bp->link_lock); in bnxt_set_link_ksettings()
2737 link_info = &bp->link_info; in bnxt_get_fecparam()
2738 fec_cfg = link_info->fec_cfg; in bnxt_get_fecparam()
2739 active_fec = link_info->active_fec_sig_mode & in bnxt_get_fecparam()
2742 fec->fec = ETHTOOL_FEC_NONE; in bnxt_get_fecparam()
2743 fec->active_fec = ETHTOOL_FEC_NONE; in bnxt_get_fecparam()
2747 fec->fec |= ETHTOOL_FEC_AUTO; in bnxt_get_fecparam()
2749 fec->fec |= ETHTOOL_FEC_BASER; in bnxt_get_fecparam()
2751 fec->fec |= ETHTOOL_FEC_RS; in bnxt_get_fecparam()
2753 fec->fec |= ETHTOOL_FEC_LLRS; in bnxt_get_fecparam()
2757 fec->active_fec |= ETHTOOL_FEC_BASER; in bnxt_get_fecparam()
2762 fec->active_fec |= ETHTOOL_FEC_RS; in bnxt_get_fecparam()
2766 fec->active_fec |= ETHTOOL_FEC_LLRS; in bnxt_get_fecparam()
2769 fec->active_fec |= ETHTOOL_FEC_OFF; in bnxt_get_fecparam()
2781 if (BNXT_VF(bp) || !(bp->flags & BNXT_FLAG_PORT_STATS_EXT)) in bnxt_get_fec_stats()
2784 rx = bp->rx_port_stats_ext.sw_stats; in bnxt_get_fec_stats()
2785 fec_stats->corrected_bits.total = in bnxt_get_fec_stats()
2788 if (bp->fw_rx_stats_ext_size <= BNXT_RX_STATS_EXT_NUM_LEGACY) in bnxt_get_fec_stats()
2791 fec_stats->corrected_blocks.total = in bnxt_get_fec_stats()
2793 fec_stats->uncorrectable_blocks.total = in bnxt_get_fec_stats()
2817 u32 new_cfg, fec = fecparam->fec; in bnxt_set_fecparam()
2821 link_info = &bp->link_info; in bnxt_set_fecparam()
2822 fec_cfg = link_info->fec_cfg; in bnxt_set_fecparam()
2824 return -EOPNOTSUPP; in bnxt_set_fecparam()
2835 return -EINVAL; in bnxt_set_fecparam()
2838 if (!link_info->autoneg) in bnxt_set_fecparam()
2839 return -EINVAL; in bnxt_set_fecparam()
2849 req->flags = cpu_to_le32(new_cfg | PORT_PHY_CFG_REQ_FLAGS_RESET_PHY); in bnxt_set_fecparam()
2853 mutex_lock(&bp->link_lock); in bnxt_set_fecparam()
2855 mutex_unlock(&bp->link_lock); in bnxt_set_fecparam()
2864 struct bnxt_link_info *link_info = &bp->link_info; in bnxt_get_pauseparam()
2868 epause->autoneg = !!(link_info->autoneg & BNXT_AUTONEG_FLOW_CTRL); in bnxt_get_pauseparam()
2869 epause->rx_pause = !!(link_info->req_flow_ctrl & BNXT_LINK_PAUSE_RX); in bnxt_get_pauseparam()
2870 epause->tx_pause = !!(link_info->req_flow_ctrl & BNXT_LINK_PAUSE_TX); in bnxt_get_pauseparam()
2879 if (BNXT_VF(bp) || !(bp->flags & BNXT_FLAG_PORT_STATS)) in bnxt_get_pause_stats()
2882 rx = bp->port_stats.sw_stats; in bnxt_get_pause_stats()
2883 tx = bp->port_stats.sw_stats + BNXT_TX_PORT_STATS_BYTE_OFFSET / 8; in bnxt_get_pause_stats()
2885 epstat->rx_pause_frames = BNXT_GET_RX_PORT_STATS64(rx, rx_pause_frames); in bnxt_get_pause_stats()
2886 epstat->tx_pause_frames = BNXT_GET_TX_PORT_STATS64(tx, tx_pause_frames); in bnxt_get_pause_stats()
2894 struct bnxt_link_info *link_info = &bp->link_info; in bnxt_set_pauseparam()
2896 if (!BNXT_PHY_CFG_ABLE(bp) || (bp->phy_flags & BNXT_PHY_FL_NO_PAUSE)) in bnxt_set_pauseparam()
2897 return -EOPNOTSUPP; in bnxt_set_pauseparam()
2899 mutex_lock(&bp->link_lock); in bnxt_set_pauseparam()
2900 if (epause->autoneg) { in bnxt_set_pauseparam()
2901 if (!(link_info->autoneg & BNXT_AUTONEG_SPEED)) { in bnxt_set_pauseparam()
2902 rc = -EINVAL; in bnxt_set_pauseparam()
2906 link_info->autoneg |= BNXT_AUTONEG_FLOW_CTRL; in bnxt_set_pauseparam()
2907 link_info->req_flow_ctrl = 0; in bnxt_set_pauseparam()
2912 if (link_info->autoneg & BNXT_AUTONEG_FLOW_CTRL) in bnxt_set_pauseparam()
2913 link_info->force_link_chng = true; in bnxt_set_pauseparam()
2914 link_info->autoneg &= ~BNXT_AUTONEG_FLOW_CTRL; in bnxt_set_pauseparam()
2915 link_info->req_flow_ctrl = 0; in bnxt_set_pauseparam()
2917 if (epause->rx_pause) in bnxt_set_pauseparam()
2918 link_info->req_flow_ctrl |= BNXT_LINK_PAUSE_RX; in bnxt_set_pauseparam()
2920 if (epause->tx_pause) in bnxt_set_pauseparam()
2921 link_info->req_flow_ctrl |= BNXT_LINK_PAUSE_TX; in bnxt_set_pauseparam()
2927 mutex_unlock(&bp->link_lock); in bnxt_set_pauseparam()
2947 return -EOPNOTSUPP; in bnxt_hwrm_nvm_get_dev_info()
2963 netdev_info(bp->dev, "PF does not have admin privileges to flash or reset the device\n"); in bnxt_print_admin_err()
2990 return -ENOMEM; in bnxt_flash_nvram()
2993 req->dir_data_length = cpu_to_le32(data_len); in bnxt_flash_nvram()
2996 req->host_src_addr = cpu_to_le64(dma_handle); in bnxt_flash_nvram()
2999 hwrm_req_timeout(bp, req, bp->hwrm_cmd_max_timeout); in bnxt_flash_nvram()
3000 req->dir_type = cpu_to_le16(dir_type); in bnxt_flash_nvram()
3001 req->dir_ordinal = cpu_to_le16(dir_ordinal); in bnxt_flash_nvram()
3002 req->dir_ext = cpu_to_le16(dir_ext); in bnxt_flash_nvram()
3003 req->dir_attr = cpu_to_le16(dir_attr); in bnxt_flash_nvram()
3004 req->dir_item_length = cpu_to_le32(dir_item_len); in bnxt_flash_nvram()
3007 if (rc == -EACCES) in bnxt_flash_nvram()
3020 netdev_warn(bp->dev, "Reset denied by firmware, it may be inhibited by remote driver"); in bnxt_hwrm_firmware_reset()
3021 return -EPERM; in bnxt_hwrm_firmware_reset()
3028 req->embedded_proc_type = proc_type; in bnxt_hwrm_firmware_reset()
3029 req->selfrst_status = self_reset; in bnxt_hwrm_firmware_reset()
3030 req->flags = flags; in bnxt_hwrm_firmware_reset()
3036 if (rc == -EACCES) in bnxt_hwrm_firmware_reset()
3048 /* TODO: Address self-reset of APE/KONG/BONO/TANG or ungraceful reset */ in bnxt_firmware_reset()
3055 /* Self-reset ChiMP upon next PCIe reset: */ in bnxt_firmware_reset()
3061 /* Self-reset APE upon next PCIe reset: */ in bnxt_firmware_reset()
3073 return -EINVAL; in bnxt_firmware_reset()
3084 if (bp->fw_cap & BNXT_FW_CAP_HOT_RESET) in bnxt_firmware_reset_chip()
3140 return -EINVAL; in bnxt_flash_firmware()
3145 return -EINVAL; in bnxt_flash_firmware()
3147 if (header->signature != cpu_to_le32(BNXT_FIRMWARE_BIN_SIGNATURE)) { in bnxt_flash_firmware()
3149 le32_to_cpu(header->signature)); in bnxt_flash_firmware()
3150 return -EINVAL; in bnxt_flash_firmware()
3152 if (header->code_type != code_type) { in bnxt_flash_firmware()
3154 code_type, header->code_type); in bnxt_flash_firmware()
3155 return -EINVAL; in bnxt_flash_firmware()
3157 if (header->device != DEVICE_CUMULUS_FAMILY) { in bnxt_flash_firmware()
3159 DEVICE_CUMULUS_FAMILY, header->device); in bnxt_flash_firmware()
3160 return -EINVAL; in bnxt_flash_firmware()
3163 stored_crc = le32_to_cpu(*(__le32 *)(fw_data + fw_size - in bnxt_flash_firmware()
3165 calculated_crc = ~crc32(~0, fw_data, fw_size - sizeof(stored_crc)); in bnxt_flash_firmware()
3170 return -EINVAL; in bnxt_flash_firmware()
3193 return -EINVAL; in bnxt_flash_microcode()
3195 trailer = (struct bnxt_ucode_trailer *)(fw_data + (fw_size - in bnxt_flash_microcode()
3197 if (trailer->sig != cpu_to_le32(BNXT_UCODE_TRAILER_SIGNATURE)) { in bnxt_flash_microcode()
3199 le32_to_cpu(trailer->sig)); in bnxt_flash_microcode()
3200 return -EINVAL; in bnxt_flash_microcode()
3202 if (le16_to_cpu(trailer->dir_type) != dir_type) { in bnxt_flash_microcode()
3204 dir_type, le16_to_cpu(trailer->dir_type)); in bnxt_flash_microcode()
3205 return -EINVAL; in bnxt_flash_microcode()
3207 if (le16_to_cpu(trailer->trailer_length) < in bnxt_flash_microcode()
3210 le16_to_cpu(trailer->trailer_length)); in bnxt_flash_microcode()
3211 return -EINVAL; in bnxt_flash_microcode()
3215 stored_crc = le32_to_cpu(*(__le32 *)(fw_data + fw_size - in bnxt_flash_microcode()
3217 calculated_crc = ~crc32(~0, fw_data, fw_size - sizeof(stored_crc)); in bnxt_flash_microcode()
3223 return -EINVAL; in bnxt_flash_microcode()
3280 rc = request_firmware(&fw, filename, &dev->dev); in bnxt_flash_firmware_from_file()
3287 rc = bnxt_flash_firmware(dev, dir_type, fw->data, fw->size); in bnxt_flash_firmware_from_file()
3289 rc = bnxt_flash_microcode(dev, dir_type, fw->data, fw->size); in bnxt_flash_firmware_from_file()
3292 0, 0, 0, fw->data, fw->size); in bnxt_flash_firmware_from_file()
3305 #define MSG_ANTI_ROLLBACK_ERR "HWRM_NVM_INSTALL_UPDATE failure due to Anti-rollback detected"
3319 return -EINVAL; in nvm_update_err_to_stderr()
3334 return -ENOPKG; in nvm_update_err_to_stderr()
3337 return -EPERM; in nvm_update_err_to_stderr()
3344 return -EOPNOTSUPP; in nvm_update_err_to_stderr()
3347 return -EIO; in nvm_update_err_to_stderr()
3398 rc = bnxt_resize_update_entry(dev, fw->size, extack); in bnxt_flash_package_from_fw_obj()
3411 modify_len = roundup_pow_of_two(fw->size); in bnxt_flash_package_from_fw_obj()
3422 return -ENOMEM; in bnxt_flash_package_from_fw_obj()
3431 hwrm_req_timeout(bp, modify, bp->hwrm_cmd_max_timeout); in bnxt_flash_package_from_fw_obj()
3432 hwrm_req_timeout(bp, install, bp->hwrm_cmd_max_timeout); in bnxt_flash_package_from_fw_obj()
3435 modify->host_src_addr = cpu_to_le64(dma_handle); in bnxt_flash_package_from_fw_obj()
3440 install->install_type = cpu_to_le32(install_type); in bnxt_flash_package_from_fw_obj()
3453 if (fw->size > item_len) { in bnxt_flash_package_from_fw_obj()
3455 rc = -EFBIG; in bnxt_flash_package_from_fw_obj()
3459 modify->dir_idx = cpu_to_le16(index); in bnxt_flash_package_from_fw_obj()
3461 if (fw->size > modify_len) in bnxt_flash_package_from_fw_obj()
3462 modify->flags = BNXT_NVM_MORE_FLAG; in bnxt_flash_package_from_fw_obj()
3463 while (copied < fw->size) { in bnxt_flash_package_from_fw_obj()
3464 u32 balance = fw->size - copied; in bnxt_flash_package_from_fw_obj()
3469 modify->flags |= BNXT_NVM_LAST_FLAG; in bnxt_flash_package_from_fw_obj()
3471 memcpy(kmem, fw->data + copied, len); in bnxt_flash_package_from_fw_obj()
3472 modify->len = cpu_to_le32(len); in bnxt_flash_package_from_fw_obj()
3473 modify->offset = cpu_to_le32(copied); in bnxt_flash_package_from_fw_obj()
3491 cmd_err = ((struct hwrm_err_output *)resp)->cmd_err; in bnxt_flash_package_from_fw_obj()
3496 rc = -EALREADY; in bnxt_flash_package_from_fw_obj()
3499 install->flags = in bnxt_flash_package_from_fw_obj()
3506 cmd_err = ((struct hwrm_err_output *)resp)->cmd_err; in bnxt_flash_package_from_fw_obj()
3513 install->flags = 0; in bnxt_flash_package_from_fw_obj()
3514 rc = bnxt_flash_nvram(bp->dev, in bnxt_flash_package_from_fw_obj()
3531 if (resp->result) { in bnxt_flash_package_from_fw_obj()
3533 (s8)resp->result, (int)resp->problem_item); in bnxt_flash_package_from_fw_obj()
3534 rc = nvm_update_err_to_stderr(dev, resp->result, extack); in bnxt_flash_package_from_fw_obj()
3536 if (rc == -EACCES) in bnxt_flash_package_from_fw_obj()
3547 rc = request_firmware(&fw, filename, &dev->dev); in bnxt_flash_package_from_file()
3566 return -EINVAL; in bnxt_flash_device()
3569 if (flash->region == ETHTOOL_FLASH_ALL_REGIONS || in bnxt_flash_device()
3570 flash->region > 0xffff) in bnxt_flash_device()
3571 return bnxt_flash_package_from_file(dev, flash->data, in bnxt_flash_device()
3572 flash->region, NULL); in bnxt_flash_device()
3574 return bnxt_flash_firmware_from_file(dev, flash->region, flash->data); in bnxt_flash_device()
3591 *entries = le32_to_cpu(output->entries); in nvm_get_dir_info()
3592 *length = le32_to_cpu(output->entry_length); in nvm_get_dir_info()
3605 /* The -1 return value allows the entire 32-bit range of offsets to be in bnxt_get_eeprom_len()
3606 * passed via the ethtool command-line utility. in bnxt_get_eeprom_len()
3608 return -1; in bnxt_get_eeprom_len()
3627 return -EIO; in bnxt_get_nvram_directory()
3631 return -EINVAL; in bnxt_get_nvram_directory()
3635 len -= 2; in bnxt_get_nvram_directory()
3646 return -ENOMEM; in bnxt_get_nvram_directory()
3648 req->host_dest_addr = cpu_to_le64(dma_handle); in bnxt_get_nvram_directory()
3668 return -EINVAL; in bnxt_get_nvram_item()
3677 return -ENOMEM; in bnxt_get_nvram_item()
3680 req->host_dest_addr = cpu_to_le64(dma_handle); in bnxt_get_nvram_item()
3681 req->dir_idx = cpu_to_le16(index); in bnxt_get_nvram_item()
3682 req->offset = cpu_to_le32(offset); in bnxt_get_nvram_item()
3683 req->len = cpu_to_le32(length); in bnxt_get_nvram_item()
3706 req->enables = 0; in bnxt_find_nvram_item()
3707 req->dir_idx = 0; in bnxt_find_nvram_item()
3708 req->dir_type = cpu_to_le16(type); in bnxt_find_nvram_item()
3709 req->dir_ordinal = cpu_to_le16(ordinal); in bnxt_find_nvram_item()
3710 req->dir_ext = cpu_to_le16(ext); in bnxt_find_nvram_item()
3711 req->opt_ordinal = NVM_FIND_DIR_ENTRY_REQ_OPT_ORDINAL_EQ; in bnxt_find_nvram_item()
3716 *index = le16_to_cpu(output->dir_idx); in bnxt_find_nvram_item()
3718 *item_length = le32_to_cpu(output->dir_item_length); in bnxt_find_nvram_item()
3720 *data_length = le32_to_cpu(output->dir_data_length); in bnxt_find_nvram_item()
3735 /* null-terminate the log data (removing last '\n'): */ in bnxt_parse_pkglog()
3736 data[datalen - 1] = 0; in bnxt_parse_pkglog()
3776 dev_err(&bp->pdev->dev, "Unable to allocate memory for pkg version, length = %u\n", in bnxt_get_pkginfo()
3778 return -ENOMEM; in bnxt_get_pkginfo()
3790 rc = -ENOENT; in bnxt_get_pkginfo()
3805 len = strlen(bp->fw_ver_str); in bnxt_get_pkgver()
3806 snprintf(bp->fw_ver_str + len, FW_VER_STR_LEN - len - 1, in bnxt_get_pkgver()
3818 if (eeprom->offset == 0) /* special offset value to get directory */ in bnxt_get_eeprom()
3819 return bnxt_get_nvram_directory(dev, eeprom->len, data); in bnxt_get_eeprom()
3821 index = eeprom->offset >> 24; in bnxt_get_eeprom()
3822 offset = eeprom->offset & 0xffffff; in bnxt_get_eeprom()
3826 return -EINVAL; in bnxt_get_eeprom()
3829 return bnxt_get_nvram_item(dev, index - 1, offset, eeprom->len, data); in bnxt_get_eeprom()
3842 req->dir_idx = cpu_to_le16(index); in bnxt_erase_nvram_directory()
3856 return -EINVAL; in bnxt_set_eeprom()
3859 type = eeprom->magic >> 16; in bnxt_set_eeprom()
3862 index = eeprom->magic & 0xff; in bnxt_set_eeprom()
3863 dir_op = eeprom->magic >> 8; in bnxt_set_eeprom()
3865 return -EINVAL; in bnxt_set_eeprom()
3868 if (eeprom->offset != ~eeprom->magic) in bnxt_set_eeprom()
3869 return -EINVAL; in bnxt_set_eeprom()
3870 return bnxt_erase_nvram_directory(dev, index - 1); in bnxt_set_eeprom()
3872 return -EINVAL; in bnxt_set_eeprom()
3876 /* Create or re-write an NVM item: */ in bnxt_set_eeprom()
3878 return -EOPNOTSUPP; in bnxt_set_eeprom()
3879 ext = eeprom->magic & 0xffff; in bnxt_set_eeprom()
3880 ordinal = eeprom->offset >> 16; in bnxt_set_eeprom()
3881 attr = eeprom->offset & 0xffff; in bnxt_set_eeprom()
3884 eeprom->len); in bnxt_set_eeprom()
3890 struct ethtool_eee *eee = &bp->eee; in bnxt_set_eee()
3891 struct bnxt_link_info *link_info = &bp->link_info; in bnxt_set_eee()
3892 u32 advertising; in bnxt_set_eee() local
3896 return -EOPNOTSUPP; in bnxt_set_eee()
3898 if (!(bp->phy_flags & BNXT_PHY_FL_EEE_CAP)) in bnxt_set_eee()
3899 return -EOPNOTSUPP; in bnxt_set_eee()
3901 mutex_lock(&bp->link_lock); in bnxt_set_eee()
3902 advertising = _bnxt_fw_to_ethtool_adv_spds(link_info->advertising, 0); in bnxt_set_eee()
3903 if (!edata->eee_enabled) in bnxt_set_eee()
3906 if (!(link_info->autoneg & BNXT_AUTONEG_SPEED)) { in bnxt_set_eee()
3908 rc = -EINVAL; in bnxt_set_eee()
3911 if (edata->tx_lpi_enabled) { in bnxt_set_eee()
3912 if (bp->lpi_tmr_hi && (edata->tx_lpi_timer > bp->lpi_tmr_hi || in bnxt_set_eee()
3913 edata->tx_lpi_timer < bp->lpi_tmr_lo)) { in bnxt_set_eee()
3915 bp->lpi_tmr_lo, bp->lpi_tmr_hi); in bnxt_set_eee()
3916 rc = -EINVAL; in bnxt_set_eee()
3918 } else if (!bp->lpi_tmr_hi) { in bnxt_set_eee()
3919 edata->tx_lpi_timer = eee->tx_lpi_timer; in bnxt_set_eee()
3922 if (!edata->advertised) { in bnxt_set_eee()
3923 edata->advertised = advertising & eee->supported; in bnxt_set_eee()
3924 } else if (edata->advertised & ~advertising) { in bnxt_set_eee()
3926 edata->advertised, advertising); in bnxt_set_eee()
3927 rc = -EINVAL; in bnxt_set_eee()
3931 eee->advertised = edata->advertised; in bnxt_set_eee()
3932 eee->tx_lpi_enabled = edata->tx_lpi_enabled; in bnxt_set_eee()
3933 eee->tx_lpi_timer = edata->tx_lpi_timer; in bnxt_set_eee()
3935 eee->eee_enabled = edata->eee_enabled; in bnxt_set_eee()
3941 mutex_unlock(&bp->link_lock); in bnxt_set_eee()
3949 if (!(bp->phy_flags & BNXT_PHY_FL_EEE_CAP)) in bnxt_get_eee()
3950 return -EOPNOTSUPP; in bnxt_get_eee()
3952 *edata = bp->eee; in bnxt_get_eee()
3953 if (!bp->eee.eee_enabled) { in bnxt_get_eee()
3955 * by default when it is re-enabled. in bnxt_get_eee()
3957 edata->advertised = 0; in bnxt_get_eee()
3958 edata->tx_lpi_enabled = 0; in bnxt_get_eee()
3961 if (!bp->eee.eee_active) in bnxt_get_eee()
3962 edata->lp_advertised = 0; in bnxt_get_eee()
3981 req->i2c_slave_addr = i2c_addr; in bnxt_read_sfp_module_eeprom_info()
3982 req->page_number = cpu_to_le16(page_number); in bnxt_read_sfp_module_eeprom_info()
3983 req->port_id = cpu_to_le16(bp->pf.port_id); in bnxt_read_sfp_module_eeprom_info()
3988 data_length -= xfer_size; in bnxt_read_sfp_module_eeprom_info()
3989 req->page_offset = cpu_to_le16(start_addr + byte_offset); in bnxt_read_sfp_module_eeprom_info()
3990 req->data_length = xfer_size; in bnxt_read_sfp_module_eeprom_info()
3991 req->enables = in bnxt_read_sfp_module_eeprom_info()
4000 memcpy(buf + byte_offset, output->data, xfer_size); in bnxt_read_sfp_module_eeprom_info()
4017 * if it is of type 10GBase-T in bnxt_get_module_info()
4019 if (bp->link_info.module_status > in bnxt_get_module_info()
4021 return -EOPNOTSUPP; in bnxt_get_module_info()
4024 if (bp->hwrm_spec_code < 0x10202) in bnxt_get_module_info()
4025 return -EOPNOTSUPP; in bnxt_get_module_info()
4036 modinfo->type = ETH_MODULE_SFF_8472; in bnxt_get_module_info()
4037 modinfo->eeprom_len = ETH_MODULE_SFF_8472_LEN; in bnxt_get_module_info()
4039 modinfo->eeprom_len = ETH_MODULE_SFF_8436_LEN; in bnxt_get_module_info()
4043 modinfo->type = ETH_MODULE_SFF_8436; in bnxt_get_module_info()
4044 modinfo->eeprom_len = ETH_MODULE_SFF_8436_LEN; in bnxt_get_module_info()
4047 modinfo->type = ETH_MODULE_SFF_8636; in bnxt_get_module_info()
4048 modinfo->eeprom_len = ETH_MODULE_SFF_8636_LEN; in bnxt_get_module_info()
4051 rc = -EOPNOTSUPP; in bnxt_get_module_info()
4063 u16 start = eeprom->offset, length = eeprom->len; in bnxt_get_module_eeprom()
4066 memset(data, 0, eeprom->len); in bnxt_get_module_eeprom()
4070 if (start + eeprom->len > ETH_MODULE_SFF_8436_LEN) in bnxt_get_module_eeprom()
4071 length = ETH_MODULE_SFF_8436_LEN - start; in bnxt_get_module_eeprom()
4078 length = eeprom->len - length; in bnxt_get_module_eeprom()
4083 start -= ETH_MODULE_SFF_8436_LEN; in bnxt_get_module_eeprom()
4092 if (bp->link_info.module_status <= in bnxt_get_module_status()
4096 switch (bp->link_info.module_status) { in bnxt_get_module_status()
4110 return -EINVAL; in bnxt_get_module_status()
4124 if (bp->hwrm_spec_code < 0x10202) { in bnxt_get_module_eeprom_by_page()
4126 return -EINVAL; in bnxt_get_module_eeprom_by_page()
4129 if (page_data->bank && !(bp->phy_flags & BNXT_PHY_FL_BANK_SEL)) { in bnxt_get_module_eeprom_by_page()
4131 return -EINVAL; in bnxt_get_module_eeprom_by_page()
4134 rc = bnxt_read_sfp_module_eeprom_info(bp, page_data->i2c_address << 1, in bnxt_get_module_eeprom_by_page()
4135 page_data->page, page_data->bank, in bnxt_get_module_eeprom_by_page()
4136 page_data->offset, in bnxt_get_module_eeprom_by_page()
4137 page_data->length, in bnxt_get_module_eeprom_by_page()
4138 page_data->data); in bnxt_get_module_eeprom_by_page()
4143 return page_data->length; in bnxt_get_module_eeprom_by_page()
4151 struct bnxt_link_info *link_info = &bp->link_info; in bnxt_nway_reset()
4154 return -EOPNOTSUPP; in bnxt_nway_reset()
4156 if (!(link_info->autoneg & BNXT_AUTONEG_SPEED)) in bnxt_nway_reset()
4157 return -EINVAL; in bnxt_nway_reset()
4170 struct bnxt_pf_info *pf = &bp->pf; in bnxt_set_phys_id()
4176 if (!bp->num_leds || BNXT_VF(bp)) in bnxt_set_phys_id()
4177 return -EOPNOTSUPP; in bnxt_set_phys_id()
4186 return -EINVAL; in bnxt_set_phys_id()
4192 req->port_id = cpu_to_le16(pf->port_id); in bnxt_set_phys_id()
4193 req->num_leds = bp->num_leds; in bnxt_set_phys_id()
4194 led_cfg = (struct bnxt_led_cfg *)&req->led0_id; in bnxt_set_phys_id()
4195 for (i = 0; i < bp->num_leds; i++, led_cfg++) { in bnxt_set_phys_id()
4196 req->enables |= BNXT_LED_DFLT_ENABLES(i); in bnxt_set_phys_id()
4197 led_cfg->led_id = bp->leds[i].led_id; in bnxt_set_phys_id()
4198 led_cfg->led_state = led_state; in bnxt_set_phys_id()
4199 led_cfg->led_blink_on = duration; in bnxt_set_phys_id()
4200 led_cfg->led_blink_off = duration; in bnxt_set_phys_id()
4201 led_cfg->led_group_id = bp->leds[i].led_group_id; in bnxt_set_phys_id()
4215 req->cmpl_ring = cpu_to_le16(cmpl_ring); in bnxt_hwrm_selftest_irq()
4223 for (i = 0; i < bp->cp_nr_rings; i++) { in bnxt_test_irq()
4224 u16 cmpl_ring = bp->grp_info[i].cp_fw_ring_id; in bnxt_test_irq()
4243 req->enables = cpu_to_le32(PORT_MAC_CFG_REQ_ENABLES_LPBK); in bnxt_hwrm_mac_loopback()
4245 req->lpbk = PORT_MAC_CFG_REQ_LPBK_LOCAL; in bnxt_hwrm_mac_loopback()
4247 req->lpbk = PORT_MAC_CFG_REQ_LPBK_NONE; in bnxt_hwrm_mac_loopback()
4264 *force_speeds = le16_to_cpu(resp->supported_speeds_force_mode); in bnxt_query_force_speeds()
4273 struct bnxt_link_info *link_info = &bp->link_info; in bnxt_disable_an_for_lpbk()
4278 if (!link_info->autoneg || in bnxt_disable_an_for_lpbk()
4279 (bp->phy_flags & BNXT_PHY_FL_AN_PHY_LPBK)) in bnxt_disable_an_for_lpbk()
4288 fw_speed = bp->link_info.link_speed; in bnxt_disable_an_for_lpbk()
4298 req->force_link_speed = cpu_to_le16(fw_speed); in bnxt_disable_an_for_lpbk()
4299 req->flags |= cpu_to_le32(PORT_PHY_CFG_REQ_FLAGS_FORCE | in bnxt_disable_an_for_lpbk()
4302 req->flags = 0; in bnxt_disable_an_for_lpbk()
4303 req->force_link_speed = cpu_to_le16(0); in bnxt_disable_an_for_lpbk()
4322 req->lpbk = PORT_PHY_CFG_REQ_LPBK_EXTERNAL; in bnxt_hwrm_phy_loopback()
4324 req->lpbk = PORT_PHY_CFG_REQ_LPBK_LOCAL; in bnxt_hwrm_phy_loopback()
4326 req->lpbk = PORT_PHY_CFG_REQ_LPBK_NONE; in bnxt_hwrm_phy_loopback()
4328 req->enables = cpu_to_le32(PORT_PHY_CFG_REQ_ENABLES_LPBK); in bnxt_hwrm_phy_loopback()
4337 struct bnxt_napi *bnapi = cpr->bnapi; in bnxt_rx_loopback()
4346 rxr = bnapi->rx_ring; in bnxt_rx_loopback()
4349 &cpr->cp_desc_ring[CP_RING(cp_cons)][CP_IDX(cp_cons)]; in bnxt_rx_loopback()
4350 cons = rxcmp->rx_cmp_opaque; in bnxt_rx_loopback()
4351 rx_buf = &rxr->rx_buf_ring[cons]; in bnxt_rx_loopback()
4352 data = rx_buf->data_ptr; in bnxt_rx_loopback()
4353 len = le32_to_cpu(rxcmp->rx_cmp_len_flags_type) >> RX_CMP_LEN_SHIFT; in bnxt_rx_loopback()
4355 return -EIO; in bnxt_rx_loopback()
4357 if (!ether_addr_equal(data + i, bnapi->bp->dev->dev_addr)) in bnxt_rx_loopback()
4358 return -EIO; in bnxt_rx_loopback()
4362 return -EIO; in bnxt_rx_loopback()
4371 int rc = -EIO; in bnxt_poll_loopback()
4376 raw_cons = cpr->cp_raw_cons; in bnxt_poll_loopback()
4379 txcmp = &cpr->cp_desc_ring[CP_RING(cons)][CP_IDX(cons)]; in bnxt_poll_loopback()
4399 cpr->cp_raw_cons = raw_cons; in bnxt_poll_loopback()
4405 struct bnxt_tx_ring_info *txr = &bp->tx_ring[0]; in bnxt_run_loopback()
4406 struct bnxt_rx_ring_info *rxr = &bp->rx_ring[0]; in bnxt_run_loopback()
4414 cpr = &rxr->bnapi->cp_ring; in bnxt_run_loopback()
4415 if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS) in bnxt_run_loopback()
4416 cpr = rxr->rx_cpr; in bnxt_run_loopback()
4417 pkt_size = min(bp->dev->mtu + ETH_HLEN, bp->rx_copy_thresh); in bnxt_run_loopback()
4418 skb = netdev_alloc_skb(bp->dev, pkt_size); in bnxt_run_loopback()
4420 return -ENOMEM; in bnxt_run_loopback()
4422 ether_addr_copy(&data[i], bp->dev->dev_addr); in bnxt_run_loopback()
4424 ether_addr_copy(&data[i], bp->dev->dev_addr); in bnxt_run_loopback()
4429 map = dma_map_single(&bp->pdev->dev, skb->data, pkt_size, in bnxt_run_loopback()
4431 if (dma_mapping_error(&bp->pdev->dev, map)) { in bnxt_run_loopback()
4433 return -EIO; in bnxt_run_loopback()
4440 bnxt_db_write(bp, &txr->tx_db, txr->tx_prod); in bnxt_run_loopback()
4443 dma_unmap_single(&bp->pdev->dev, map, pkt_size, DMA_TO_DEVICE); in bnxt_run_loopback()
4458 hwrm_req_timeout(bp, req, bp->test_info->timeout); in bnxt_run_fw_tests()
4459 req->flags = test_mask; in bnxt_run_fw_tests()
4463 *test_results = resp->test_success; in bnxt_run_fw_tests()
4469 #define BNXT_MACLPBK_TEST_IDX (bp->num_tests - BNXT_DRV_TESTS)
4484 if (!bp->num_tests || !BNXT_PF(bp)) in bnxt_self_test()
4486 memset(buf, 0, sizeof(u64) * bp->num_tests); in bnxt_self_test()
4488 etest->flags |= ETH_TEST_FL_FAILED; in bnxt_self_test()
4492 if ((etest->flags & ETH_TEST_FL_EXTERNAL_LB) && in bnxt_self_test()
4493 (bp->phy_flags & BNXT_PHY_FL_EXT_LPBK)) in bnxt_self_test()
4496 if (etest->flags & ETH_TEST_FL_OFFLINE) { in bnxt_self_test()
4497 if (bp->pf.active_vfs || !BNXT_SINGLE_PF(bp)) { in bnxt_self_test()
4498 etest->flags |= ETH_TEST_FL_FAILED; in bnxt_self_test()
4505 for (i = 0; i < bp->num_tests - BNXT_DRV_TESTS; i++) { in bnxt_self_test()
4508 if (!(bp->test_info->offline_mask & bit_val)) in bnxt_self_test()
4526 etest->flags |= ETH_TEST_FL_FAILED; in bnxt_self_test()
4531 etest->flags |= ETH_TEST_FL_FAILED; in bnxt_self_test()
4540 etest->flags |= ETH_TEST_FL_FAILED; in bnxt_self_test()
4543 etest->flags |= ETH_TEST_FL_EXTERNAL_LB_DONE; in bnxt_self_test()
4548 etest->flags |= ETH_TEST_FL_FAILED; in bnxt_self_test()
4558 etest->flags |= ETH_TEST_FL_FAILED; in bnxt_self_test()
4560 for (i = 0; i < bp->num_tests - BNXT_DRV_TESTS; i++) { in bnxt_self_test()
4565 etest->flags |= ETH_TEST_FL_FAILED; in bnxt_self_test()
4577 return -EINVAL; in bnxt_reset()
4581 return -EOPNOTSUPP; in bnxt_reset()
4584 if (pci_vfs_assigned(bp->pdev) && in bnxt_reset()
4585 !(bp->fw_cap & BNXT_FW_CAP_HOT_RESET)) { in bnxt_reset()
4588 return -EBUSY; in bnxt_reset()
4593 if (bp->hwrm_spec_code >= 0x10803) { in bnxt_reset()
4596 if (!(bp->fw_cap & BNXT_FW_CAP_HOT_RESET)) in bnxt_reset()
4601 return -EOPNOTSUPP; /* only request, fail hard */ in bnxt_reset()
4607 if (bp->hwrm_spec_code >= 0x10803) { in bnxt_reset()
4614 return -EOPNOTSUPP; /* only request, fail hard */ in bnxt_reset()
4628 if (dump->flag > BNXT_DUMP_CRASH) { in bnxt_set_dump()
4630 return -EINVAL; in bnxt_set_dump()
4633 if (!IS_ENABLED(CONFIG_TEE_BNXT_FW) && dump->flag == BNXT_DUMP_CRASH) { in bnxt_set_dump()
4635 return -EOPNOTSUPP; in bnxt_set_dump()
4638 bp->dump_flag = dump->flag; in bnxt_set_dump()
4646 if (bp->hwrm_spec_code < 0x10801) in bnxt_get_dump_flag()
4647 return -EOPNOTSUPP; in bnxt_get_dump_flag()
4649 dump->version = bp->ver_resp.hwrm_fw_maj_8b << 24 | in bnxt_get_dump_flag()
4650 bp->ver_resp.hwrm_fw_min_8b << 16 | in bnxt_get_dump_flag()
4651 bp->ver_resp.hwrm_fw_bld_8b << 8 | in bnxt_get_dump_flag()
4652 bp->ver_resp.hwrm_fw_rsvd_8b; in bnxt_get_dump_flag()
4654 dump->flag = bp->dump_flag; in bnxt_get_dump_flag()
4655 dump->len = bnxt_get_coredump_length(bp, bp->dump_flag); in bnxt_get_dump_flag()
4664 if (bp->hwrm_spec_code < 0x10801) in bnxt_get_dump_data()
4665 return -EOPNOTSUPP; in bnxt_get_dump_data()
4667 memset(buf, 0, dump->len); in bnxt_get_dump_data()
4669 dump->flag = bp->dump_flag; in bnxt_get_dump_data()
4670 return bnxt_get_coredump(bp, dump->flag, buf, &dump->len); in bnxt_get_dump_data()
4679 ptp = bp->ptp_cfg; in bnxt_get_ts_info()
4680 info->so_timestamping = SOF_TIMESTAMPING_TX_SOFTWARE | in bnxt_get_ts_info()
4684 info->phc_index = -1; in bnxt_get_ts_info()
4688 info->so_timestamping |= SOF_TIMESTAMPING_TX_HARDWARE | in bnxt_get_ts_info()
4691 if (ptp->ptp_clock) in bnxt_get_ts_info()
4692 info->phc_index = ptp_clock_index(ptp->ptp_clock); in bnxt_get_ts_info()
4694 info->tx_types = (1 << HWTSTAMP_TX_OFF) | (1 << HWTSTAMP_TX_ON); in bnxt_get_ts_info()
4696 info->rx_filters = (1 << HWTSTAMP_FILTER_NONE) | in bnxt_get_ts_info()
4700 if (bp->fw_cap & BNXT_FW_CAP_RX_ALL_PKT_TS) in bnxt_get_ts_info()
4701 info->rx_filters |= (1 << HWTSTAMP_FILTER_ALL); in bnxt_get_ts_info()
4710 struct net_device *dev = bp->dev; in bnxt_ethtool_init()
4713 if (!(bp->fw_cap & BNXT_FW_CAP_PKG_VER)) in bnxt_ethtool_init()
4716 bp->num_tests = 0; in bnxt_ethtool_init()
4717 if (bp->hwrm_spec_code < 0x10704 || !BNXT_PF(bp)) in bnxt_ethtool_init()
4720 test_info = bp->test_info; in bnxt_ethtool_init()
4722 test_info = kzalloc(sizeof(*bp->test_info), GFP_KERNEL); in bnxt_ethtool_init()
4725 bp->test_info = test_info; in bnxt_ethtool_init()
4736 bp->num_tests = resp->num_tests + BNXT_DRV_TESTS; in bnxt_ethtool_init()
4737 if (bp->num_tests > BNXT_MAX_TEST) in bnxt_ethtool_init()
4738 bp->num_tests = BNXT_MAX_TEST; in bnxt_ethtool_init()
4740 test_info->offline_mask = resp->offline_tests; in bnxt_ethtool_init()
4741 test_info->timeout = le16_to_cpu(resp->test_timeout); in bnxt_ethtool_init()
4742 if (!test_info->timeout) in bnxt_ethtool_init()
4743 test_info->timeout = HWRM_CMD_TIMEOUT; in bnxt_ethtool_init()
4744 for (i = 0; i < bp->num_tests; i++) { in bnxt_ethtool_init()
4745 char *str = test_info->string[i]; in bnxt_ethtool_init()
4746 char *fw_str = resp->test_name[i]; in bnxt_ethtool_init()
4758 fw_str, test_info->offline_mask & (1 << i) ? in bnxt_ethtool_init()
4773 if (BNXT_VF(bp) || !(bp->flags & BNXT_FLAG_PORT_STATS_EXT)) in bnxt_get_eth_phy_stats()
4776 rx = bp->rx_port_stats_ext.sw_stats; in bnxt_get_eth_phy_stats()
4777 phy_stats->SymbolErrorDuringCarrier = in bnxt_get_eth_phy_stats()
4787 if (BNXT_VF(bp) || !(bp->flags & BNXT_FLAG_PORT_STATS)) in bnxt_get_eth_mac_stats()
4790 rx = bp->port_stats.sw_stats; in bnxt_get_eth_mac_stats()
4791 tx = bp->port_stats.sw_stats + BNXT_TX_PORT_STATS_BYTE_OFFSET / 8; in bnxt_get_eth_mac_stats()
4793 mac_stats->FramesReceivedOK = in bnxt_get_eth_mac_stats()
4795 mac_stats->FramesTransmittedOK = in bnxt_get_eth_mac_stats()
4797 mac_stats->FrameCheckSequenceErrors = in bnxt_get_eth_mac_stats()
4799 mac_stats->AlignmentErrors = in bnxt_get_eth_mac_stats()
4801 mac_stats->OutOfRangeLengthField = in bnxt_get_eth_mac_stats()
4811 if (BNXT_VF(bp) || !(bp->flags & BNXT_FLAG_PORT_STATS)) in bnxt_get_eth_ctrl_stats()
4814 rx = bp->port_stats.sw_stats; in bnxt_get_eth_ctrl_stats()
4815 ctrl_stats->MACControlFramesReceived = in bnxt_get_eth_ctrl_stats()
4840 if (BNXT_VF(bp) || !(bp->flags & BNXT_FLAG_PORT_STATS)) in bnxt_get_rmon_stats()
4843 rx = bp->port_stats.sw_stats; in bnxt_get_rmon_stats()
4844 tx = bp->port_stats.sw_stats + BNXT_TX_PORT_STATS_BYTE_OFFSET / 8; in bnxt_get_rmon_stats()
4846 rmon_stats->jabbers = in bnxt_get_rmon_stats()
4848 rmon_stats->oversize_pkts = in bnxt_get_rmon_stats()
4850 rmon_stats->undersize_pkts = in bnxt_get_rmon_stats()
4853 rmon_stats->hist[0] = BNXT_GET_RX_PORT_STATS64(rx, rx_64b_frames); in bnxt_get_rmon_stats()
4854 rmon_stats->hist[1] = BNXT_GET_RX_PORT_STATS64(rx, rx_65b_127b_frames); in bnxt_get_rmon_stats()
4855 rmon_stats->hist[2] = BNXT_GET_RX_PORT_STATS64(rx, rx_128b_255b_frames); in bnxt_get_rmon_stats()
4856 rmon_stats->hist[3] = BNXT_GET_RX_PORT_STATS64(rx, rx_256b_511b_frames); in bnxt_get_rmon_stats()
4857 rmon_stats->hist[4] = in bnxt_get_rmon_stats()
4859 rmon_stats->hist[5] = in bnxt_get_rmon_stats()
4861 rmon_stats->hist[6] = in bnxt_get_rmon_stats()
4863 rmon_stats->hist[7] = in bnxt_get_rmon_stats()
4865 rmon_stats->hist[8] = in bnxt_get_rmon_stats()
4867 rmon_stats->hist[9] = in bnxt_get_rmon_stats()
4870 rmon_stats->hist_tx[0] = in bnxt_get_rmon_stats()
4872 rmon_stats->hist_tx[1] = in bnxt_get_rmon_stats()
4874 rmon_stats->hist_tx[2] = in bnxt_get_rmon_stats()
4876 rmon_stats->hist_tx[3] = in bnxt_get_rmon_stats()
4878 rmon_stats->hist_tx[4] = in bnxt_get_rmon_stats()
4880 rmon_stats->hist_tx[5] = in bnxt_get_rmon_stats()
4882 rmon_stats->hist_tx[6] = in bnxt_get_rmon_stats()
4884 rmon_stats->hist_tx[7] = in bnxt_get_rmon_stats()
4886 rmon_stats->hist_tx[8] = in bnxt_get_rmon_stats()
4888 rmon_stats->hist_tx[9] = in bnxt_get_rmon_stats()
4900 if (BNXT_VF(bp) || !(bp->flags & BNXT_FLAG_PORT_STATS_EXT)) in bnxt_get_link_ext_stats()
4903 rx = bp->rx_port_stats_ext.sw_stats; in bnxt_get_link_ext_stats()
4904 stats->link_down_events = in bnxt_get_link_ext_stats()
4910 kfree(bp->test_info); in bnxt_ethtool_free()
4911 bp->test_info = NULL; in bnxt_ethtool_free()