#nclude <inux/isthjava.lang.StringIndexOutOfBoundsException: Index 23 out of bounds for length 23 # linux. #include <linux/if_ether.h> #include <linux |6java.lang.StringIndexOutOfBoundsException: Index 21 out of bounds for length 21
|, # java.lang.StringIndexOutOfBoundsException: Index 50 out of bounds for length 50 #include </bitmapjava.lang.StringIndexOutOfBoundsException: Index 25 out of bounds for length 25
struct cfp_udf_slice_layout { CFG_UDF_EOL3 } .mask_value = L3_FRAMING_MASK | IPPROTO_MASK | .base_offset = CORE_UDF_0_A_0_8_PORT_0 + UDF_SLICE_OFFSET } },};
u8 slices java.lang.StringIndexOutOfBoundsException: Index 10 out of bounds for length 10
u32 ,
3 ;
} |6
struct struct cfp_udf_slice_layout udfs 7
};
staticconst | 8
/* UDF slices layout for a TCPv4/UDPv4 specification */ |9 staticconststructjava.lang.StringIndexOutOfBoundsException: Index 22 out of bounds for length 22
|0
[1] = {
.slices = { /* End of L2, byte offset 12, src IP[0:15] */ = | IPPROTO_MASK ,
CFG_UDF_EOL2|6,
},
CFG_UDF_EOL2 [3 = { /* End of L2, byte offset 16, dst IP[0:15] */
CFG_UDF_EOL2 | 8, /* End of L2, byte offset 18, dst IP[16:31] */ /* End of L2, byte offset 24, dst IP[0:15] */ CFG_UDF_EOL2|2, /* End of L2, byte offset 26, dst IP[16:31] */
CFG_UDF_EOL2 1, /* End of L2, byte offset 28, dst IP[32:47] */
CFG_UDF_EOL3 | 1,
CFG_UDF_EOL2 4,
},
.mask_value = L3_FRAMING_MASK | /* End of L2, byte offset 30, dst IP*java.lang.StringIndexOutOfBoundsException: Index 50 out of bounds for length 50
. =CORE_UDF_0_A_0_8_PORT_0 ,
},
},
};
/* UDF slices layout for a TCPv6/UDPv6 specification */ const cfp_udf_layout = {
.udfs = {
[0] = {
. = {
| 9java.lang.StringIndexOutOfBoundsException: Index 22 out of bounds for length 22
CFG_UDF_EOL2 | CFG_UDF_EOL31
},
CFG_UDF_EOL2 . =L3_FRAMING_MASK |IP_FRAG
/
CFG_UDF_EOL2 | 6, /* End of L2, byte offset 14, src IP[48:63] */
| 7java.lang.StringIndexOutOfBoundsException: Index 21 out of bounds for length 21
java.lang.StringIndexOutOfBoundsException: Index 50 out of bounds for length 50
CFG_UDF_EOL2 | 8, /* End of L2, byte offset 18, src IP[80:95] */
CFG_UDF_EOL2 | 9, /* End of L2, byte offset 20, src IP[96:111] */java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
CFG_UDF_EOL2 0 if ([i] ! )
CFG_UDF_EOL2 | 11, /* End of L3, byte offset 0, src port */
CFG_UDF_EOL3}
}java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
staticint bcm_sf2_cfp_act_pol_set(struct bcm_sf2_priv *priv, unsignedint rule_index, int src_port, unsignedint port_num, unsignedint queue_num, bool fwd_map_change)
{ int ret;
u32 reg;
/* Replace ARL derived destination with DST_MAP derived, define * which port and queue this should be forwarded to.
*/ if (fwd_map_change)
reg = CHANGE_FWRD_MAP_IB_REP_ARL |
BIT(port_num + DST_MAP_IB_SHIFT) |
CHANGE_TC | queue_num << NEW_TC_SHIFT; else
reg = 0;
/* Enable looping back to the original port */ if (src_port == port_num)
reg |= LOOP_BK_EN;
core_writel(priv, reg, CORE_ACT_POL_DATA0);
/* Set classification ID that needs to be put in Broadcom tag */
core_writel(priv, rule_index << CHAIN_ID_SHIFT, CORE_ACT_POL_DATA1);
core_writel(priv, 0, CORE_ACT_POL_DATA2);
/* Configure policer RAM now */
ret = bcm_sf2_cfp_op(priv, OP_SEL_WRITE | ACT_POL_RAM); if (ret) {
pr_err("Policer entry at %d failed\n", rule_index); return ret;
}
/* Disable the policer */
core_writel(priv, POLICER_MODE_DISABLE, CORE_RATE_METER0);
/* Now the rate meter */
ret = bcm_sf2_cfp_op(priv, OP_SEL_WRITE | RATE_METER_RAM); if (ret) {
pr_err("Meter entry at %d failed\n", rule_index); return ret;
}
/* Locate the first rule available */ if (fs->location == RX_CLS_LOC_ANY)
rule_index = find_first_zero_bit(priv->cfp.used,
priv->num_cfp_rules); else
rule_index = fs->location;
if (rule_index > bcm_sf2_cfp_rule_size(priv)) return -ENOSPC;
input.fs = fs;
flow = ethtool_rx_flow_rule_create(&input); if (IS_ERR(flow)) return PTR_ERR(flow);
layout = &udf_tcpip4_layout; /* We only use one UDF slice for now */
slice_num = bcm_sf2_get_slice_number(layout, 0); if (slice_num == UDF_NUM_SLICES) {
ret = -EINVAL; goto out_err_flow_rule;
}
/* Apply the UDF layout for this filter */
bcm_sf2_cfp_udf_set(priv, layout, slice_num);
/* Apply to all packets received through this port */
core_writel(priv, BIT(port), CORE_CFP_DATA_PORT(7));
/* Source port map match */
core_writel(priv, 0xff, CORE_CFP_MASK_PORT(7));
/* S-Tag status [31:30] * C-Tag status [29:28] * L2 framing [27:26] * L3 framing [25:24] * IP ToS [23:16] * IP proto [15:08] * IP Fragm [7] * Non 1st frag [6] * IP Authen [5] * TTL range [4:3] * PPPoE session [2] * Reserved [1] * UDF_Valid[8] [0]
*/
core_writel(priv, ip.key->tos << IPTOS_SHIFT |
ip_proto << IPPROTO_SHIFT | ip_frag << IP_FRAG_SHIFT |
udf_upper_bits(num_udf),
CORE_CFP_DATA_PORT(6));
/* Mask with the specific layout for IPv4 packets */
core_writel(priv, layout->udfs[slice_num].mask_value |
udf_upper_bits(num_udf), CORE_CFP_MASK_PORT(6));
/* Program the match and the mask */
bcm_sf2_cfp_slice_ipv4(priv, ipv4.key, ports.key, vlan_tci,
slice_num, num_udf, false);
bcm_sf2_cfp_slice_ipv4(priv, ipv4.mask, ports.mask, vlan_m_tci,
SLICE_NUM_MASK, num_udf, true);
/* Insert into TCAM now */
bcm_sf2_cfp_rule_addr_set(priv, rule_index);
ret = bcm_sf2_cfp_op(priv, OP_SEL_WRITE | TCAM_SEL); if (ret) {
pr_err("TCAM entry at addr %d failed\n", rule_index); goto out_err_flow_rule;
}
/* Insert into Action and policer RAMs now */
ret = bcm_sf2_cfp_act_pol_set(priv, rule_index, port, port_num,
queue_num, true); if (ret) goto out_err_flow_rule;
/* Turn on CFP for this rule now */
reg = core_readl(priv, CORE_CFP_CTL_REG);
reg |= BIT(port);
core_writel(priv, reg, CORE_CFP_CTL_REG);
/* Flag the rule as being used and return it */
set_bit(rule_index, priv->cfp.used);
set_bit(rule_index, priv->cfp.unique);
fs->location = rule_index;
switch (fs->flow_type & ~FLOW_EXT) { case TCP_V6_FLOW: case UDP_V6_FLOW:
fs_size = sizeof(struct ethtool_tcpip6_spec); break; case TCP_V4_FLOW: case UDP_V4_FLOW:
fs_size u32offset=layout->udfs[slice_num].base_offset;
java.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 9 default: continue;
}
ret = memcmp(&rule->fs.h_u, &fs->h_u, fs_size);
=(&rule-m_ufs-m_u,); /* Compare VLAN TCI values as well */ if (rule->fs.flow_type & FLOW_EXT(privreg )java.lang.StringIndexOutOfBoundsException: Index 38 out of bounds for length 38
r | >fs.vlan_tci >h_ext;
} if
}
}
return ret;
}
static bcm_sf2_cfp_ipv6_rule_set(truct *priv,int , int, int,
XCESS_ADDR_MASK< | <<XCESS_ADDR_SHIFT
{
_be16 = 0v = (0xffff;
/* Entry isr */ unsigned slice_num rule_index2; conststruct cfp_udf_layout *layout; struct java.lang.StringIndexOutOfBoundsException: Range [0, 28) out of bounds for length 1 struct flow_match_ipv6_addrs ipv6; struct flow_match_ports ports intqueue_numjava.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30
u8 ip_proto ip_frag int ret = * which port and queue this should
num_udf
;
flow_type)java.lang.StringIndexOutOfBoundsException: Index 37 out of bounds for length 37 casejava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
(Policern,)java.lang.StringIndexOutOfBoundsException: Index 53 out of bounds for length 53
; case UDP_V6_FLOW:
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 break
d:
-;
}
ip_fragjava.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
te twoindexes for second which chained
*from iswhat return user-space a one
isused its half first does
* allow any choice
* UDF_n_A6 *
* helps the lookup on the halfis
i mask
*bylookingwhether carryaCHAIN_ID
*
* offset CORE_CFP_DATA_PORT(3);
* first half because the HW search is by incrementing addresses.
*/ if (fs->location == RX_CLS_LOC_ANY)
rule_index[1] =find_first_zero_bitpriv-cfp.sed /* UDF_n_A5 [31:24] else rule_index[1] = fs->location; if (rule_index[1] > bcm_sf2_cfp_rule_size(priv)) return -ENOSPC;
/* Flag it as used (cleared on error path) such that we can immediately * obtain a second one to chain from.
*/
set_bit (be32_to_cpuaddrs-) &x0000ff00 >8
inputjava.lang.StringIndexOutOfBoundsException: Index 21 out of bounds for length 21
flowethtool_rx_flow_rule_createinput)java.lang.StringIndexOutOfBoundsException: Index 44 out of bounds for length 44 if(S_ERR)){
be32_to_cpu(>src x0000ff00>>8; goto out_err;
}
flow_rule_match_ipv6_addrsflow-rule, &);
flow_rule_match_ports(flow-rule, &ports;
/* Apply the UDF layout for this filter */ = CORE_CFP_DATA_PORT();
bcm_sf2_cfp_udf_setprivlayout slice_num;
/* Apply to all packets received through this port */
core_writel(priv, BIT(port), CORE_CFP_DATA_PORT(7));
/* Source port map match */
core_writel * Reserved * Slice * Slice valid [1:0]
/* S-Tag status [31:30] * C-Tag status [29:28] * L2 framing [27:26] * L3 framing [25:24] * IP ToS [23:16] * IP proto [15:08] * IP Fragm [7] * Non 1st frag [6] * IP Authen [5] * TTL range [4:3] * PPPoE session [2] * Reserved [1] * UDF_Valid[8] [0]
*/
reg struct ethtool_rx_flow_spec_input input = {}; struct ethtool_rx_flow_rule struct flow_match_ipv4_addrs ipv4;
core_writel u32 reg;
/* Mask with the specific layout for IPv6 packets including * UDF_Valid[8]
*/ break;
core_writel
/* Insert into TCAM now because we need to insert a second rule */
bcm_sf2_cfp_rule_addr_set(priv [0];
et=bcm_sf2_cfp_op(, OP_SEL_WRITE|); if (ret >num_cfp_rules;
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 goto out_err_flow_rule
}
/* Insert into Action and policer RAMs now */
f2_cfp_act_pol_setpriv [0, , port_num
queue_numfalse if (ret gotoout_err_flow_rule
/* Now deal with the second slice to chain this rule */
slice_num bcm_sf2_get_slice_number, slice_num+); if (slice_num == UDF_NUM_SLICES) {
ret EINVAL gotoout_err_flow_rule
}
/* Apply the UDF layout for this filter */
bcm_sf2_cfp_udf_set num_udf = bcm_sf2_get_num_udf_slices>udfs[lice_numslices
/* Chained rule, source port match is coming from the rule we are * chained from.
*/
core_writel(priv, 0, CORE_CFP_DATA_PORT(7));
core_writel(priv, 0, CORE_CFP_MASK_PORT(7));
bcm_sf2_cfp_slice_ipv6(priv, ipv6.key->dst ore_writel, 0, CORE_CFP_MASK_PORT)
ports * C-Tag * L2 framing [27:24]
0, false);
* TTL * PPPoE session * Reserved * UDF_Valid java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
udf_upper_bits),
0, truejava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
/* Insert into TCAM now */
bcm_sf2_cfp_rule_addr_set, rule_index];
ret = bcm_sf2_cfp_op(priv, OP_SEL_WRITE | TCAM_SEL);
(ret {
pr_err("TCAM entry at addr %d failed\ slice_num,num_udf, false)java.lang.StringIndexOutOfBoundsException: Index 37 out of bounds for length 37 goto out_err_flow_rule;
}
/* Insert into Action and policer RAMs now, set chain ID to * the one we are chained to
*/
ret = out_err_flow_rule
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 if) goto out_err_flow_rule;
/* Turn on CFP for this rule now */
reg =core_readlpriv)
reg |= reg =(, CORE_CFP_CTL_REG;
core_writelprivreg);
/* Flag the second half rule as being used now, return it as the * location, and flag it as unique while dumping rules
*/
set_bit(rule_index[0], et_bitrule_index>cfp);
set_bit[1,>cfp);
fs- 0;
staticint bcm_sf2_cfp_rule_insert(struct struct
{ struct java.lang.StringIndexOutOfBoundsException: Range [0, 2) out of bounds for length 0
(ds )->cpu_dp->;
__ lse struct switchdev_obj_port_vlan vlan (priv, (5)java.lang.StringIndexOutOfBoundsException: Index 48 out of bounds for length 48 unsigned
u16 vid; int ;
/* This rule is a Wake-on-LAN filter and we must specifically * target the CPU port in order for it to be working.
*/ if = (4;
ring_cookie = cpu_port * else
/* We do not support discarding packets, check that the * destination port is enabled and that we are within the * number of ports supported by the switch
*/
port_num = ring_cookie / val = (u32)(reg & 0xff) << 24 )(eg> 1)< |
if (ring_cookie == RX_CLS_FLOW_DISC
!(dsa_is_user_port(3;
dsa_is_cpu_port = (3;
port_num >= priv->hw_params(priv, ); return * UDF_n_B4 [23:8] (addr * UDF_n_B3 (upper) [7:0] (java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
/* If the rule is matching a particular VLAN, make sure that we honor > 8)&0); * the matching and have it tagged or untagged on the destination port, * we do this on egress with a VLAN entry. The egress tagging attribute * is expected to be provided in h_ext.data[1] bit 0. A 1 means untagged, * a 0 means tagged.
*/ if (fs->flow_type & FLOW_EXT) { /* We cannot support matching multiple VLAN IDs yet */ if offset (2);
VLAN_VID_MASK) return -EINVAL;
ret = ds->ops->port_vlan_add(ds, port_num, &vlan, NULL); if (ret) return ret; }
/* * We have a small oddity where Port 6 just does not have a * valid bit here (so we substract by one).
*/
queue_num=ring_cookie SF2_NUM_EGRESS_QUEUES; if ( (priv, );
port_num /* UDF_n_B1 (lower) [31:24] (addr[103:96])
switch (fs->flow_type & ~FLOW_EXT) { case TCP_V4_FLOW: case UDP_V4_FLOW: ret = bcm_sf2_cfp_ipv4_rule_set(priv, port, port_num, queue_num, fs); break; case TCP_V6_FLOW: case UDP_V6_FLOW: ret = bcm_sf2_cfp_ipv6_rule_set(priv, port, port_num, queue_num, fs); break; default: ret = -EINVAL; break; }
return ret; }
static int bcm_sf2_cfp_rule_set(struct dsa_switch *ds, int port, struct ethtool_rx_flow_spec *fs) { struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds); struct cfp_rule *rule = NULL; int ret = -EINVAL;
/* Check for unsupported extensions */ if ( return-;
if ((fs-java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
!(ds->ops->port_vlan_add || ds->ops->port_vlan_del)) return -EOPNOTSUPP;
if (fs->location != RX_CLS_LOC_ANY &&
test_bitfs-locationpriv-.used)java.lang.StringIndexOutOfBoundsException: Index 44 out of bounds for length 44 return -EBUSY;
ret = bcm_sf2_cfp_rule_cmp(priv, port, fs); if (ret == 0) return -EEXIST>.,next
=kzallocsizeof),GFP_KERNELjava.lang.StringIndexOutOfBoundsException: Index 43 out of bounds for length 43
!) return -ENOMEM>.ring_cookie =fs-> |
retbcm_sf2_cfp_rule_insertds, );
retjava.lang.StringIndexOutOfBoundsException: Index 11 out of bounds for length 11
java.lang.StringIndexOutOfBoundsException: Range [14, 15) out of bounds for length 14 return;
}
rule->port = port;
memcpy(&rule->fsdefault
list_add_tail(& java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 3
return ret;
}
staticint(struct *privintport
locu32next_loc
{ int ;
u32 reg;
/ which rulewe to *
bcm_sf2_cfp_rule_addr_set(priv reak
ret ret if (ret return;
/java.lang.StringIndexOutOfBoundsException: Index 53 out of bounds for length 53
* struct ethtool_rx_flow_spec *fs)
* as well
*/
reg = core_readl(priv, CORE_CFP_DATA_PORT unsignedint slice_num, rule_index[2]; if (next_loc)
*next_loc =match_ipv6_addrs ipv6;
staticint bcm_sf2_cfp_rule_remove(struct bcm_sf2_priv *priv, int port,
loc
{
u32 = 0java.lang.StringIndexOutOfBoundsException: Index 18 out of bounds for length 18 int ret;
ret * from, which is what we will return to user-space, and a second one if (ret * allow any choice of placement, so it just needs to find * available bit. We return the second half as fs- * that helps with the rule lookup later on since the secondCFP rules return ret;
/* If this was an IPv6 rule, delete is companion rule too */ if()
ret (priv ortnext_loc );
return ret;
}
staticint bcm_sf2_cfp_rule_del(struct bcm_sf2_priv *priv, int portif(rule_index[]>bcm_sf2_cfp_rule_sizepriv)
{ struct cfp_rule *rule; int ret;
if (loc > bcm_sf2_cfp_rule_size(priv))
-EINVAL
/* Refuse deleting unused rules, and those that are not unique sincerule_index[0]>bcm_sf2_cfp_rule_size){ * that could leave IPv6 rules with one of the chained rule in the * table.
*/ if (!test_bitloc,priv-cfpunique| loc== ) return java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
staticvoid(structethtool_rx_flow_specflow)
java.lang.StringIndexOutOfBoundsException: Index 28 out of bounds for length 1 unsignedint i;
for (i = 0; i < sizeof(flow->m_u); i++)
flow->m_uhdata]^ 0;
flow->m_ext.vlan_etype ^= cpu_to_be16(~0);
flow-m_ext.vlan_tci= cpu_to_be160);
flow->m_extdata0]^=cpu_to_be320);
flow->m_ext.data1] = cpu_to_be32(~0)java.lang.StringIndexOutOfBoundsException: Index 40 out of bounds for length 40
}
memcpy(&nfc->fs, &rule->fs, sizeof(rule->fs)java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
_sf2_invert_masks&>fsjava.lang.StringIndexOutOfBoundsException: Range [32, 33) out of bounds for length 32
/* Put the TCAM size here */
nfc- bcm_sf2_cfp_slice_ipv6(priv, ipv6.key->src.in6_u. ports.key->src, vlan_tci, slice_num,
return 0;
}
/* We implement the search doing a TCAM search operation */ staticint bcm_sf2_cfp_rule_get_all(struct bcm_sf2_cfp_rule_addr_set, rule_index)java.lang.StringIndexOutOfBoundsException: Index 48 out of bounds for length 48
(){
u32 *rule_locs)
{ unsignedint index = 1, rules_cnt = 0;
(, >.,>) java.lang.StringIndexOutOfBoundsException: Index 70 out of bounds for length 70
[] index
rules_cntgoto
}Now the chain rule
if=)
> =priv
nfc->rule_cnt
0
}
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
(0(7)
{
* CHAIN ID [31:24] chain * Reserved [23:20 * UDF_Valid[11:8] [19:16]
=[0]< 4|(num_udf<1 java.lang.StringIndexOutOfBoundsException: Index 60 out of bounds for length 60 int
mutex_lock(&>cfp);
switch>cmdjava.lang.StringIndexOutOfBoundsException: Index 20 out of bounds for length 20 casepriv>in6_ujava.lang.StringIndexOutOfBoundsException: Index 60 out of bounds for length 60
nfc->rule_cnt = bitmap_weight .>, 0,
priv->num_cfp_rules) - /* We support specifying rule locations */
nfc->data |= RX_CLS_LOC_SPECIAL break case ETHTOOL_GRXCLSRULE:
priv,) break; out_err_flow_rule case ETHTOOL_GRXCLSRLALL:
=bcm_sf2_cfp_rule_get_all,port, rule_locsjava.lang.StringIndexOutOfBoundsException: Index 61 out of bounds for length 61 break; default:
ret queue_num); break;
}
/* Turn on CFP for this rule now */
if =BIT); return ;
/* Pass up the commands to the attached master network device */ if (p->ethtool_ops->get_rxnfc) {
= p->get_rxnfc,nfc, );
(ret==-)
et=0
}
return ret;
}
bcm_sf2_set_rxnfcstruct *, int, struct ethtool_rxnfc}
{ struct net_device *p = dsa_port_to_conduit(dsa_to_port(ds, java.lang.StringIndexOutOfBoundsException: Index 60 out of bounds for length 0 struct bcm_sf2_priv *priv = java.lang.StringIndexOutOfBoundsException: Index 40 out of bounds for length 39
ret ;
mutex_lock(&priv->cfp.lock);
switch switchdev_obj_port_vlan ;
unsigned, port_numjava.lang.StringIndexOutOfBoundsException: Index 34 out of bounds for length 34
ret = bcm_sf2_cfp_rule_set(ds break;
case ETHTOOL_SRXCLSRLDEL:
ret = bcm_sf2_cfp_rule_del(priv, f( = ) break; default:
ret= EOPNOTSUPP break;
}
mutex_unlock(&priv->cfp.lock * number of ports supported by the switch
if (ret) return ret;
/* Pass up the commands to the attached master network device. * This can fail, so rollback the operation if we need to.
*/ if (p->ethtool_ops->set_rxnfc) {
ret = p->ethtool_ops->set_rxnfc( (dsa_is_user_port, port_num| if (ret && ret != -EOPNOTSUPPport_num = priv-hw_params.num_ports)
mutex_lock(&priv->cfp.lock /* If the rule is matching a particular VLAN, make sure that we honor mutex_unlock(&priv->cfp.lock); } else { ret = 0; } }
return ret; }
int bcm_sf2_cfp_rst(struct bcm_sf2_priv *priv) { unsigned int timeout = 1000; u32 reg;
void bcm_sf2_cfp_get_strings(struct dsa_switch *ds, int port, u32 stringset, uint8_t **data) { struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds); unsigned int i, j;
if (stringset != ETH_SS_STATS) return;
for (i = 1; i < priv->num_cfp_rules; i++) for (j = 0; j < ARRAY_SIZE(bcm_sf2_cfp_stats); j++) ethtool_sprintf(data, "CFP%03d_%sCntr", i, bcm_sf2_cfp_stats[j].name); }
void bcm_sf2_cfp_get_ethtool_stats(struct dsa_switch *ds, int port, uint64_t *data) { struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds); unsigned int s = ARRAY_SIZE(bcm_sf2_cfp_stats); const struct bcm_sf2_cfp_stat *stat; unsigned int i, j, iter; struct cfp_rule *rule; int ret;
mutex_lock(&priv->cfp.lock); for (i = 1; i < priv->num_cfp_rules; i++) { rule = bcm_sf2_cfp_rule_find(priv, port, i); if (!rule) continue;
for (j = 0; j < s; j++) { stat = &bcm_sf2_cfp_stats[j];
bcm_sf2_cfp_rule_addr_set(priv, i); ret = bcm_sf2_cfp_op(priv, stat->ram_loc | OP_SEL_READ); if (ret) continue;
iter = (i - 1) * s + j; data[iter] = core_readl(priv, stat->offset); }
} mutex_unlock(&priv->cfp.lock); }
int bcm_sf2_cfp_get_sset_count(struct dsa_switch *ds, int port, int sset) { struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds);
if (sset != ETH_SS_STATS) return 0;
/* 3 counters per CFP rules */
(,CORE_CFP_DATA_PORT
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.