Merge branch 'rc14' into merge.rc24
Change-Id: I900e1b97988c4b6bdb6b0b6d49089e7cb0c2d657
diff --git a/arch/arm/mach-feroceon-kw2/include/mach/system.h b/arch/arm/mach-feroceon-kw2/include/mach/system.h
index 393cf1b..527509b 100644
--- a/arch/arm/mach-feroceon-kw2/include/mach/system.h
+++ b/arch/arm/mach-feroceon-kw2/include/mach/system.h
@@ -31,7 +31,7 @@
cpu_do_idle();
}
-#define UPON_SDK_VERSION "uPON_2.7.25_RC22"
+#define UPON_SDK_VERSION "uPON_2.7.25_RC24"
#ifdef __BIG_ENDIAN
#define MV_ARM_32BIT_LE(X) ((((X)&0xff)<<24) | \
diff --git a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_cph/mv_cph_flow.c b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_cph/mv_cph_flow.c
old mode 100755
new mode 100644
index 7014319..edc1598
--- a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_cph/mv_cph_flow.c
+++ b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_cph/mv_cph_flow.c
@@ -1298,8 +1298,10 @@
p_field += MV_IPV4_PROTO_OFFSET;
proto = *(UINT8 *)p_field;
- if (IPPROTO_IGMP == proto)
+ if (IPPROTO_IGMP == proto) {
flow->parse_bm |= CPH_FLOW_PARSE_MC_PROTO;
+ flow->ip_type = IPPROTO_IGMP;
+ }
}
else if (MV_CPH_ETH_TYPE_IPV6 == flow->eth_type) {
p_ipv6_hdr = (struct ipv6hdr *)(p_field + MV_CPH_ETH_TYPE_LEN);
@@ -1316,6 +1318,7 @@
case ICMPV6_MGM_REDUCTION:
case ICMPV6_MLD2_REPORT:
flow->parse_bm |= CPH_FLOW_PARSE_MC_PROTO;
+ flow->ip_type = IPPROTO_ICMPV6;
break;
default:
break;
@@ -1401,6 +1404,12 @@
return FALSE;
}
+ if (db_rule->parse_bm & CPH_FLOW_PARSE_MC_PROTO)
+ {
+ if (parse_rule->ip_type != db_rule->ip_type)
+ return FALSE;
+ }
+
return TRUE;
}
@@ -1434,6 +1443,11 @@
return FALSE;
}
+ if (packet_rule->parse_bm & CPH_FLOW_PARSE_MC_PROTO) {
+ if ((db_rule->ip_type != MV_CPH_IP_TYPE_ANY) && (db_rule->ip_type != packet_rule->ip_type))
+ return false;
+ }
+
/* Check MH if needed */
if ((db_rule->parse_bm & CPH_FLOW_PARSE_MH) &&
(packet_rule->parse_bm & CPH_FLOW_PARSE_MH) )
@@ -1522,6 +1536,11 @@
return FALSE;
}
+ if (packet_rule->parse_bm & CPH_FLOW_PARSE_MC_PROTO) {
+ if ((db_rule->ip_type != MV_CPH_IP_TYPE_ANY) && (db_rule->ip_type != packet_rule->ip_type))
+ return false;
+ }
+
/* Check MH if needed */
if ((db_rule->parse_bm & CPH_FLOW_PARSE_MH) &&
(packet_rule->parse_bm & CPH_FLOW_PARSE_MH) )
@@ -1997,7 +2016,7 @@
printk(KERN_INFO "-------------------------------------------------------------------------------------------------------------------------------------------------------\n");
printk(KERN_INFO " |Parse outer |Parse inner |Mod outer |Mod Inner |Forward\n");
- printk(KERN_INFO "dir default parse_bm mh ety tpid vid pbits tpid vid pbits tpid vid pbits tpid vid pbits port queue hwf_queue gem count op_type\n");
+ printk(KERN_INFO "dir default parse_bm mh ety tpid vid pbits tpid vid pbits tpid vid pbits tpid vid pbits port queue hwf_queue gem count ip_type op_type\n");
/* Traverse CPH flow rule tale */
for (idx = 0, rule_idx = 0; (idx < CPH_FLOW_ENTRY_NUM) && (rule_idx < gs_flow_table.rule_num); idx++)
{
@@ -2009,7 +2028,7 @@
rule_idx++;
printk(KERN_INFO
- "%2.2s %3.3s 0x%04x %-4d 0x%04x 0x%04x %-4d %1d 0x%04x %-4d %1d 0x%04x %-4d %1d 0x%04x %-4d %1d %1d %1d %1d %-4d %-8d %s\n",
+ "%2.2s %3.3s 0x%04x %-4d 0x%04x 0x%04x %-4d %1d 0x%04x %-4d %1d 0x%04x %-4d %1d 0x%04x %-4d %1d %1d %1d %1d %-4d %-8d %7d %s\n",
cph_app_lookup_dir(p_flow_rule->dir), (p_flow_rule->is_default == TRUE)? "Yes":"No ",
p_flow_rule->parse_bm, p_flow_rule->mh, p_flow_rule->eth_type,
p_flow_rule->parse_outer_tci.tpid, p_flow_rule->parse_outer_tci.vid, p_flow_rule->parse_outer_tci.pbits,
@@ -2017,7 +2036,7 @@
p_flow_rule->mod_outer_tci.tpid, p_flow_rule->mod_outer_tci.vid, p_flow_rule->mod_outer_tci.pbits,
p_flow_rule->mod_inner_tci.tpid, p_flow_rule->mod_inner_tci.vid, p_flow_rule->mod_inner_tci.pbits,
p_flow_rule->pkt_frwd.trg_port, p_flow_rule->pkt_frwd.trg_queue, p_flow_rule->pkt_frwd.trg_hwf_queue, p_flow_rule->pkt_frwd.gem_port,
- p_flow_rule->count, cph_flow_lookup_op_type(p_flow_rule->op_type));
+ p_flow_rule->count, p_flow_rule->ip_type, cph_flow_lookup_op_type(p_flow_rule->op_type));
}
}
diff --git a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_cph/mv_cph_flow.h b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_cph/mv_cph_flow.h
old mode 100755
new mode 100644
index 96e9ee2..39f8a05
--- a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_cph/mv_cph_flow.h
+++ b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_cph/mv_cph_flow.h
@@ -101,6 +101,8 @@
#define MV_CPH_DEFAULT_SINGLE_TAG_RULE (4096+2)/* Default sinlge tagged rule*/
#define MV_CPH_DEFAULT_DOUBLE_UNTAG_RULE (4096+3)/* Default double tagged rule*/
+#define MV_CPH_IP_TYPE_ANY (0) /* Dummy IP type, do not care IP type*/
+
/* CPH flow mapping rule definition
------------------------------------------------------------------------------*/
typedef enum
@@ -168,6 +170,7 @@
CPH_FLOW_TCI_T parse_outer_tci;
CPH_FLOW_TCI_T parse_inner_tci;
UINT16 eth_type;
+ UINT16 ip_type;
CPH_VLAN_OP_TYPE_E op_type;
CPH_FLOW_TCI_T mod_outer_tci;
CPH_FLOW_TCI_T mod_inner_tci;
diff --git a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_cph/mv_cph_netdev.c b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_cph/mv_cph_netdev.c
old mode 100755
new mode 100644
index 883620c..2049016
--- a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_cph/mv_cph_netdev.c
+++ b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_cph/mv_cph_netdev.c
@@ -630,6 +630,8 @@
BOOL l_mh;
BOOL state = FALSE;
MV_STATUS rc = MV_OK;
+ UINT16 old_vid;
+ UINT8 old_pbits;
if (MV_PON_PORT_ID != port)
return 0;
@@ -654,31 +656,46 @@
/* Get CPH data flow rule */
flow_rule.is_default = FALSE;
rc = cph_flow_get_rule(&flow_rule);
- if (rc != MV_OK)
- {
- /* Handle multicat packets as unicast one */
- if (flow_rule.parse_bm & CPH_FLOW_PARSE_MC_PROTO) {
- flow_rule.parse_bm &= ~CPH_FLOW_PARSE_MC_PROTO;
- rc = cph_flow_get_rule_by_vid(&flow_rule);
- if (rc != MV_OK)
- {
- rc = cph_flow_get_rule(&flow_rule);
+ if (rc != MV_OK) {
+ if (flow_rule.parse_bm & CPH_FLOW_PARSE_MC_PROTO) {
+ /*search */
+ flow_rule.is_default = TRUE;
+ old_vid = flow_rule.parse_outer_tci.vid;
+ old_pbits = flow_rule.parse_outer_tci.pbits;
+ flow_rule.parse_outer_tci.vid = MV_CPH_VID_NOT_CARE_VALUE;
+ flow_rule.parse_outer_tci.pbits = MV_CPH_PBITS_NOT_CARE_VALUE;
+ rc = cph_flow_get_rule(&flow_rule);
- if (rc != MV_OK)
- {
- flow_rule.is_default = TRUE;
- rc = cph_flow_get_rule(&flow_rule);
- if (rc != MV_OK)
- {
- MV_CPH_PRINT(CPH_DEBUG_LEVEL, "%s():fail to call cph_flow_get_rule, rc<%d> \n", __FUNCTION__, rc);
- return 0;
- }
- }
- }
- }
+ /* Handle multicat packets as unicast one */
+ if (rc != MV_OK)
+ {
+ flow_rule.parse_outer_tci.vid = old_vid;
+ flow_rule.parse_outer_tci.pbits = old_pbits;
+ flow_rule.is_default = FALSE;
+ flow_rule.parse_bm &= ~CPH_FLOW_PARSE_MC_PROTO;
+ rc = cph_flow_get_rule_by_vid(&flow_rule);
+ if (rc != MV_OK)
+ rc = cph_flow_get_rule(&flow_rule);
+
+ if (rc != MV_OK)
+ {
+ flow_rule.is_default = TRUE;
+ flow_rule.parse_outer_tci.vid = MV_CPH_VID_NOT_CARE_VALUE;
+ flow_rule.parse_outer_tci.pbits = MV_CPH_PBITS_NOT_CARE_VALUE;
+ rc = cph_flow_get_rule(&flow_rule);
+ if (rc != MV_OK)
+ {
+ MV_CPH_PRINT(CPH_DEBUG_LEVEL, "%s():fail to call cph_flow_get_rule, rc<%d> \n", __FUNCTION__, rc);
+ return 0;
+ }
+ }
+ }
+ }
else {
- flow_rule.is_default = TRUE;
+ flow_rule.is_default = TRUE;
+ flow_rule.parse_outer_tci.vid = MV_CPH_VID_NOT_CARE_VALUE;
+ flow_rule.parse_outer_tci.pbits = MV_CPH_PBITS_NOT_CARE_VALUE;
rc = cph_flow_get_rule(&flow_rule);
if (rc != MV_OK)
{
diff --git a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_tpm/plat/tpm_switch_mgr.c b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_tpm/plat/tpm_switch_mgr.c
old mode 100755
new mode 100644
index 0ba9472..46cf9ca
--- a/arch/arm/plat-feroceon/mv_drivers_lsp/mv_tpm/plat/tpm_switch_mgr.c
+++ b/arch/arm/plat-feroceon/mv_drivers_lsp/mv_tpm/plat/tpm_switch_mgr.c
@@ -83,6 +83,9 @@
uint32_t trace_sw_dbg_flag = 0;
+static tpm_swport_pm_1_t g_mc_tpm_swport_pm_1;
+static tpm_swport_pm_3_all_t g_mc_tpm_swport_pm_3;
+
#define IF_ERROR(ret)\
if (ret != TPM_DB_OK) {\
printk(KERN_ERR "ERROR: (%s) call not allowed, switch not initialized\n", __FUNCTION__);\
@@ -7582,6 +7585,57 @@
printk(KERN_ERR "ERROR: (%s:%d) tpm_sw_pm_3_from_gmac failed\n", __FUNCTION__, __LINE__);
return ERR_GENERAL;
}
+
+ g_mc_tpm_swport_pm_1.fcsErrors += tpm_swport_pm_1->fcsErrors;
+ g_mc_tpm_swport_pm_1.excessiveCollisionCounter += tpm_swport_pm_1->excessiveCollisionCounter;
+ g_mc_tpm_swport_pm_1.lateCollisionCounter += tpm_swport_pm_1->lateCollisionCounter;
+ g_mc_tpm_swport_pm_1.frameTooLongs += tpm_swport_pm_1->frameTooLongs;
+ g_mc_tpm_swport_pm_1.bufferOverflowsOnReceive += tpm_swport_pm_1->bufferOverflowsOnReceive;
+ g_mc_tpm_swport_pm_1.bufferOverflowsOnTransmit += tpm_swport_pm_1->bufferOverflowsOnTransmit;
+ g_mc_tpm_swport_pm_1.singleCollisionFrameCounter += tpm_swport_pm_1->singleCollisionFrameCounter;
+ g_mc_tpm_swport_pm_1.multipleCollisionsFrameCounter += tpm_swport_pm_1->multipleCollisionsFrameCounter;
+ g_mc_tpm_swport_pm_1.sqeCounter += tpm_swport_pm_1->sqeCounter;
+ g_mc_tpm_swport_pm_1.deferredTransmissionCounter += tpm_swport_pm_1->deferredTransmissionCounter;
+ g_mc_tpm_swport_pm_1.internalMacTransmitErrorCounter += tpm_swport_pm_1->internalMacTransmitErrorCounter;
+ g_mc_tpm_swport_pm_1.carrierSenseErrorCounter += tpm_swport_pm_1->carrierSenseErrorCounter;
+ g_mc_tpm_swport_pm_1.alignmentErrorCounter += tpm_swport_pm_1->alignmentErrorCounter;
+ g_mc_tpm_swport_pm_1.internalMacReceiveErrorCounter += tpm_swport_pm_1->internalMacReceiveErrorCounter;
+
+ g_mc_tpm_swport_pm_3.dropEvents += tpm_swport_pm_3.dropEvents;
+ g_mc_tpm_swport_pm_3.InGoodOctetsLo += tpm_swport_pm_3.InGoodOctetsLo;
+ g_mc_tpm_swport_pm_3.InGoodOctetsHi += tpm_swport_pm_3.InGoodOctetsHi;
+ g_mc_tpm_swport_pm_3.InBadOctets += tpm_swport_pm_3.InBadOctets;
+ g_mc_tpm_swport_pm_3.OutFCSErr += tpm_swport_pm_3.OutFCSErr;
+ g_mc_tpm_swport_pm_3.InUnicasts += tpm_swport_pm_3.InUnicasts;
+ g_mc_tpm_swport_pm_3.Deferred += tpm_swport_pm_3.Deferred;
+ g_mc_tpm_swport_pm_3.InBroadcasts += tpm_swport_pm_3.InBroadcasts;
+ g_mc_tpm_swport_pm_3.InMulticasts += tpm_swport_pm_3.InMulticasts;
+ g_mc_tpm_swport_pm_3.Octets64 += tpm_swport_pm_3.Octets64;
+ g_mc_tpm_swport_pm_3.Octets127 += tpm_swport_pm_3.Octets127;
+ g_mc_tpm_swport_pm_3.Octets255 += tpm_swport_pm_3.Octets255;
+ g_mc_tpm_swport_pm_3.Octets511 += tpm_swport_pm_3.Octets511;
+ g_mc_tpm_swport_pm_3.Octets1023 += tpm_swport_pm_3.Octets1023;
+ g_mc_tpm_swport_pm_3.OctetsMax += tpm_swport_pm_3.OctetsMax;
+ g_mc_tpm_swport_pm_3.OutOctetsLo += tpm_swport_pm_3.OutOctetsLo;
+ g_mc_tpm_swport_pm_3.OutOctetsHi += tpm_swport_pm_3.OutOctetsHi;
+ g_mc_tpm_swport_pm_3.OutUnicasts += tpm_swport_pm_3.OutUnicasts;
+ g_mc_tpm_swport_pm_3.Excessive += tpm_swport_pm_3.Excessive;
+ g_mc_tpm_swport_pm_3.OutMulticasts += tpm_swport_pm_3.OutMulticasts;
+ g_mc_tpm_swport_pm_3.OutBroadcasts += tpm_swport_pm_3.OutBroadcasts;
+ g_mc_tpm_swport_pm_3.Single += tpm_swport_pm_3.Single;
+ g_mc_tpm_swport_pm_3.OutPause += tpm_swport_pm_3.OutPause;
+ g_mc_tpm_swport_pm_3.InPause += tpm_swport_pm_3.InPause;
+ g_mc_tpm_swport_pm_3.Multiple += tpm_swport_pm_3.Multiple;
+ g_mc_tpm_swport_pm_3.Undersize += tpm_swport_pm_3.Undersize;
+ g_mc_tpm_swport_pm_3.Fragments += tpm_swport_pm_3.Fragments;
+ g_mc_tpm_swport_pm_3.Oversize += tpm_swport_pm_3.Oversize;
+ g_mc_tpm_swport_pm_3.Jabber += tpm_swport_pm_3.Jabber;
+ g_mc_tpm_swport_pm_3.InMACRcvErr += tpm_swport_pm_3.InMACRcvErr;
+ g_mc_tpm_swport_pm_3.InFCSErr += tpm_swport_pm_3.InFCSErr;
+ g_mc_tpm_swport_pm_3.Collisions += tpm_swport_pm_3.Collisions;
+ g_mc_tpm_swport_pm_3.Late += tpm_swport_pm_3.Late;
+
+ memcpy(tpm_swport_pm_1, &g_mc_tpm_swport_pm_1, sizeof(g_mc_tpm_swport_pm_1));
}
if (trace_sw_dbg_flag)
@@ -7721,6 +7775,57 @@
printk(KERN_ERR "ERROR: (%s:%d) tpm_sw_pm_3_from_gmac failed\n", __FUNCTION__, __LINE__);
return ERR_GENERAL;
}
+
+ g_mc_tpm_swport_pm_1.fcsErrors += tpm_swport_pm_1.fcsErrors;
+ g_mc_tpm_swport_pm_1.excessiveCollisionCounter += tpm_swport_pm_1.excessiveCollisionCounter;
+ g_mc_tpm_swport_pm_1.lateCollisionCounter += tpm_swport_pm_1.lateCollisionCounter;
+ g_mc_tpm_swport_pm_1.frameTooLongs += tpm_swport_pm_1.frameTooLongs;
+ g_mc_tpm_swport_pm_1.bufferOverflowsOnReceive += tpm_swport_pm_1.bufferOverflowsOnReceive;
+ g_mc_tpm_swport_pm_1.bufferOverflowsOnTransmit += tpm_swport_pm_1.bufferOverflowsOnTransmit;
+ g_mc_tpm_swport_pm_1.singleCollisionFrameCounter += tpm_swport_pm_1.singleCollisionFrameCounter;
+ g_mc_tpm_swport_pm_1.multipleCollisionsFrameCounter += tpm_swport_pm_1.multipleCollisionsFrameCounter;
+ g_mc_tpm_swport_pm_1.sqeCounter += tpm_swport_pm_1.sqeCounter;
+ g_mc_tpm_swport_pm_1.deferredTransmissionCounter += tpm_swport_pm_1.deferredTransmissionCounter;
+ g_mc_tpm_swport_pm_1.internalMacTransmitErrorCounter += tpm_swport_pm_1.internalMacTransmitErrorCounter;
+ g_mc_tpm_swport_pm_1.carrierSenseErrorCounter += tpm_swport_pm_1.carrierSenseErrorCounter;
+ g_mc_tpm_swport_pm_1.alignmentErrorCounter += tpm_swport_pm_1.alignmentErrorCounter;
+ g_mc_tpm_swport_pm_1.internalMacReceiveErrorCounter += tpm_swport_pm_1.internalMacReceiveErrorCounter;
+
+ g_mc_tpm_swport_pm_3.dropEvents += tpm_swport_pm_3->dropEvents;
+ g_mc_tpm_swport_pm_3.InGoodOctetsLo += tpm_swport_pm_3->InGoodOctetsLo;
+ g_mc_tpm_swport_pm_3.InGoodOctetsHi += tpm_swport_pm_3->InGoodOctetsHi;
+ g_mc_tpm_swport_pm_3.InBadOctets += tpm_swport_pm_3->InBadOctets;
+ g_mc_tpm_swport_pm_3.OutFCSErr += tpm_swport_pm_3->OutFCSErr;
+ g_mc_tpm_swport_pm_3.InUnicasts += tpm_swport_pm_3->InUnicasts;
+ g_mc_tpm_swport_pm_3.Deferred += tpm_swport_pm_3->Deferred;
+ g_mc_tpm_swport_pm_3.InBroadcasts += tpm_swport_pm_3->InBroadcasts;
+ g_mc_tpm_swport_pm_3.InMulticasts += tpm_swport_pm_3->InMulticasts;
+ g_mc_tpm_swport_pm_3.Octets64 += tpm_swport_pm_3->Octets64;
+ g_mc_tpm_swport_pm_3.Octets127 += tpm_swport_pm_3->Octets127;
+ g_mc_tpm_swport_pm_3.Octets255 += tpm_swport_pm_3->Octets255;
+ g_mc_tpm_swport_pm_3.Octets511 += tpm_swport_pm_3->Octets511;
+ g_mc_tpm_swport_pm_3.Octets1023 += tpm_swport_pm_3->Octets1023;
+ g_mc_tpm_swport_pm_3.OctetsMax += tpm_swport_pm_3->OctetsMax;
+ g_mc_tpm_swport_pm_3.OutOctetsLo += tpm_swport_pm_3->OutOctetsLo;
+ g_mc_tpm_swport_pm_3.OutOctetsHi += tpm_swport_pm_3->OutOctetsHi;
+ g_mc_tpm_swport_pm_3.OutUnicasts += tpm_swport_pm_3->OutUnicasts;
+ g_mc_tpm_swport_pm_3.Excessive += tpm_swport_pm_3->Excessive;
+ g_mc_tpm_swport_pm_3.OutMulticasts += tpm_swport_pm_3->OutMulticasts;
+ g_mc_tpm_swport_pm_3.OutBroadcasts += tpm_swport_pm_3->OutBroadcasts;
+ g_mc_tpm_swport_pm_3.Single += tpm_swport_pm_3->Single;
+ g_mc_tpm_swport_pm_3.OutPause += tpm_swport_pm_3->OutPause;
+ g_mc_tpm_swport_pm_3.InPause += tpm_swport_pm_3->InPause;
+ g_mc_tpm_swport_pm_3.Multiple += tpm_swport_pm_3->Multiple;
+ g_mc_tpm_swport_pm_3.Undersize += tpm_swport_pm_3->Undersize;
+ g_mc_tpm_swport_pm_3.Fragments += tpm_swport_pm_3->Fragments;
+ g_mc_tpm_swport_pm_3.Oversize += tpm_swport_pm_3->Oversize;
+ g_mc_tpm_swport_pm_3.Jabber += tpm_swport_pm_3->Jabber;
+ g_mc_tpm_swport_pm_3.InMACRcvErr += tpm_swport_pm_3->InMACRcvErr;
+ g_mc_tpm_swport_pm_3.InFCSErr += tpm_swport_pm_3->InFCSErr;
+ g_mc_tpm_swport_pm_3.Collisions += tpm_swport_pm_3->Collisions;
+ g_mc_tpm_swport_pm_3.Late += tpm_swport_pm_3->Late;
+
+ memcpy(tpm_swport_pm_3, &g_mc_tpm_swport_pm_3, sizeof(g_mc_tpm_swport_pm_3));
}
if (trace_sw_dbg_flag)