summaryrefslogtreecommitdiff
path: root/drivers/staging
diff options
context:
space:
mode:
authorMarian Chereji <marian.chereji@freescale.com>2014-07-21 14:43:52 (GMT)
committerMatthew Weigel <Matthew.Weigel@freescale.com>2014-12-11 18:39:27 (GMT)
commitad6a7ef8c32893a0888b46c6bff5601435178bae (patch)
tree3db74e61bdfcacf1a50f3fead04adc31fa29a6d4 /drivers/staging
parent0dc9a84aad423f8b9d87dde4df8ab46d68908895 (diff)
downloadlinux-fsl-qoriq-ad6a7ef8c32893a0888b46c6bff5601435178bae.tar.xz
dpa_offload: Add reparsing option to HM operations
Added the reparsing option to the DPA classifier driver API so that users can request a relaunch of the FMan parser immediatley after the configured header manipulation operation. Signed-off-by: Marian Chereji <marian.chereji@freescale.com> Change-Id: I3e6c9ea03da57e65e21a411fda9ba3cb5a3d5e87 Reviewed-on: http://git.am.freescale.net:8181/15221 Reviewed-by: Radu-Andrei Bulie <Radu.Bulie@freescale.com>
Diffstat (limited to 'drivers/staging')
-rw-r--r--drivers/staging/fsl_dpa_offload/dpa_classifier.c78
-rw-r--r--drivers/staging/fsl_dpa_offload/dpa_classifier_ioctl.h21
-rw-r--r--drivers/staging/fsl_dpa_offload/wrp_dpa_classifier.c33
3 files changed, 95 insertions, 37 deletions
diff --git a/drivers/staging/fsl_dpa_offload/dpa_classifier.c b/drivers/staging/fsl_dpa_offload/dpa_classifier.c
index f3dcb51..ae96fce 100644
--- a/drivers/staging/fsl_dpa_offload/dpa_classifier.c
+++ b/drivers/staging/fsl_dpa_offload/dpa_classifier.c
@@ -3742,7 +3742,6 @@ static int import_hm_nodes_to_chain(void * const *node_array,
BUG_ON(!node_array);
BUG_ON(!hm);
- /* This HM operation is linked to another HM op */
for (i = num_nodes - 1; i >= 0; i--) {
/*
* If the node is empty, save an empty space and skip
@@ -3788,6 +3787,9 @@ static int import_hm_nodes_to_chain(void * const *node_array,
hm->hm_node[i]->node = node_array[i];
INIT_LIST_HEAD(&hm->hm_node[i]->list_node);
+ /* Initialize dontParseAfterManip to TRUE */
+ hm->hm_node[i]->params.u.hdr.dontParseAfterManip = TRUE;
+
/* Add this new node to the HM chain: */
list_add(&hm->hm_node[i]->list_node,
hm->hm_chain);
@@ -4478,6 +4480,10 @@ static int nat_hm_prepare_nodes(struct dpa_cls_hm *pnat_hm,
}
INIT_LIST_HEAD(&hm_node->list_node);
+
+ /* Initialize dontParseAfterManip to TRUE */
+ hm_node->params.u.hdr.dontParseAfterManip = TRUE;
+
pnat_hm->hm_node[0] = hm_node;
if (pnat_hm->nat_params.flags &
@@ -4491,6 +4497,10 @@ static int nat_hm_prepare_nodes(struct dpa_cls_hm *pnat_hm,
}
INIT_LIST_HEAD(&hm_node->list_node);
+
+ /* Initialize dontParseAfterManip to TRUE */
+ hm_node->params.u.hdr.dontParseAfterManip = TRUE;
+
pnat_hm->hm_node[1] = hm_node;
}
@@ -4518,7 +4528,12 @@ static int nat_hm_update_params(struct dpa_cls_hm *pnat_hm)
hm_node = pnat_hm->hm_node[0];
hm_node->params.type = e_FM_PCD_MANIP_HDR;
- hm_node->params.u.hdr.dontParseAfterManip = TRUE;
+ if (pnat_hm->hm_node[1])
+ hm_node->params.u.hdr.dontParseAfterManip = TRUE;
+ else
+ hm_node->params.u.hdr.dontParseAfterManip &=
+ (pnat_hm->nat_params.reparse) ? FALSE :
+ TRUE;
if (pnat_hm->nat_params.type ==
DPA_CLS_HM_NAT_TYPE_TRADITIONAL) {
@@ -4633,10 +4648,12 @@ static int nat_hm_update_params(struct dpa_cls_hm *pnat_hm)
hm_node->params.type = e_FM_PCD_MANIP_HDR;
hm_node->params.u.hdr.fieldUpdate = TRUE;
- hm_node->params.u.hdr.dontParseAfterManip = TRUE;
hm_node->params.u.hdr.fieldUpdateParams.type =
e_FM_PCD_MANIP_HDR_FIELD_UPDATE_TCP_UDP;
+ hm_node->params.u.hdr.dontParseAfterManip &=
+ (pnat_hm->nat_params.reparse) ? FALSE : TRUE;
+
if (pnat_hm->nat_params.flags & DPA_CLS_HM_NAT_UPDATE_SPORT) {
hm_node->params.u.hdr.fieldUpdateParams.u.tcpUdp.
validUpdates |= HDR_MANIP_TCP_UDP_SRC;
@@ -4969,6 +4986,10 @@ static int fwd_hm_prepare_nodes(struct dpa_cls_hm *pfwd_hm,
}
INIT_LIST_HEAD(&hm_node->list_node);
+
+ /* Initialize dontParseAfterManip to TRUE */
+ hm_node->params.u.hdr.dontParseAfterManip = TRUE;
+
pfwd_hm->hm_node[0] = hm_node;
if (pfwd_hm->update_params.ip_frag_params.mtu) {
@@ -5007,8 +5028,10 @@ static int fwd_hm_update_params(struct dpa_cls_hm *pfwd_hm)
hm_node = pfwd_hm->hm_node[0];
- hm_node->params.type = e_FM_PCD_MANIP_HDR;
- hm_node->params.u.hdr.dontParseAfterManip = TRUE;
+ hm_node->params.type = e_FM_PCD_MANIP_HDR;
+ hm_node->params.u.hdr.dontParseAfterManip &=
+ (pfwd_hm->fwd_params.reparse) ? FALSE : TRUE;
+
switch (pfwd_hm->fwd_params.out_if_type) {
case DPA_CLS_HM_IF_TYPE_ETHERNET:
/* Update Ethernet MACS */
@@ -5016,7 +5039,6 @@ static int fwd_hm_update_params(struct dpa_cls_hm *pfwd_hm)
hm_node->params.u.hdr.insrtParams.type =
e_FM_PCD_MANIP_INSRT_GENERIC;
hm_node->params.u.hdr.insrtParams.u.generic.replace = TRUE;
- hm_node->params.u.hdr.dontParseAfterManip = TRUE;
size = (uint8_t)(sizeof(struct ethhdr) - ETHERTYPE_SIZE);
pdata = kzalloc(size, GFP_KERNEL);
@@ -5402,6 +5424,9 @@ static int remove_hm_prepare_nodes(struct dpa_cls_hm *premove_hm,
}
INIT_LIST_HEAD(&hm_node->list_node);
+
+ /* Initialize dontParseAfterManip to TRUE */
+ hm_node->params.u.hdr.dontParseAfterManip = TRUE;
}
premove_hm->hm_node[0] = hm_node;
@@ -5427,9 +5452,11 @@ static int remove_hm_update_params(struct dpa_cls_hm *premove_hm)
hm_node = premove_hm->hm_node[0];
- hm_node->params.type = e_FM_PCD_MANIP_HDR;
- hm_node->params.u.hdr.rmv = TRUE;
- hm_node->params.u.hdr.dontParseAfterManip = TRUE;
+ hm_node->params.type = e_FM_PCD_MANIP_HDR;
+ hm_node->params.u.hdr.rmv = TRUE;
+
+ hm_node->params.u.hdr.dontParseAfterManip &=
+ (premove_hm->remove_params.reparse) ? FALSE : TRUE;
switch (premove_hm->remove_params.type) {
case DPA_CLS_HM_REMOVE_ETHERNET:
@@ -5695,6 +5722,9 @@ static int insert_hm_prepare_nodes(struct dpa_cls_hm *pinsert_hm,
}
INIT_LIST_HEAD(&hm_node->list_node);
+
+ /* Initialize dontParseAfterManip to TRUE */
+ hm_node->params.u.hdr.dontParseAfterManip = TRUE;
}
pinsert_hm->hm_node[0] = hm_node;
@@ -5726,7 +5756,9 @@ static int insert_hm_update_params(struct dpa_cls_hm *pinsert_hm)
hm_node->params.type = e_FM_PCD_MANIP_HDR;
hm_node->params.u.hdr.insrt = TRUE;
hm_node->params.u.hdr.insrtParams.type = e_FM_PCD_MANIP_INSRT_GENERIC;
- hm_node->params.u.hdr.dontParseAfterManip = TRUE;
+
+ hm_node->params.u.hdr.dontParseAfterManip &=
+ (pinsert_hm->insert_params.reparse) ? FALSE : TRUE;
switch (pinsert_hm->insert_params.type) {
case DPA_CLS_HM_INSERT_ETHERNET:
@@ -6108,6 +6140,9 @@ static int update_hm_prepare_nodes(struct dpa_cls_hm *pupdate_hm,
}
INIT_LIST_HEAD(&hm_node->list_node);
+
+ /* Initialize dontParseAfterManip to TRUE */
+ hm_node->params.u.hdr.dontParseAfterManip = TRUE;
}
pupdate_hm->hm_node[0] = hm_node;
@@ -6153,10 +6188,10 @@ static int update_hm_update_params(struct dpa_cls_hm *pupdate_hm)
hm_node = pupdate_hm->hm_node[0];
+ hm_node->params.type = e_FM_PCD_MANIP_HDR;
+
if (pupdate_hm->update_params.op_flags & update_ops) {
- hm_node->params.type = e_FM_PCD_MANIP_HDR;
hm_node->params.u.hdr.fieldUpdate = TRUE;
- hm_node->params.u.hdr.dontParseAfterManip = TRUE;
if (pupdate_hm->update_params.op_flags &
DPA_CLS_HM_UPDATE_IPv4_UPDATE) {
@@ -6296,11 +6331,9 @@ static int update_hm_update_params(struct dpa_cls_hm *pupdate_hm)
}
if (pupdate_hm->update_params.op_flags & replace_ops) {
- hm_node->params.type = e_FM_PCD_MANIP_HDR;
- hm_node->params.u.hdr.custom = TRUE;
+ hm_node->params.u.hdr.custom = TRUE;
hm_node->params.u.hdr.customParams.type =
e_FM_PCD_MANIP_HDR_CUSTOM_IP_REPLACE;
- hm_node->params.u.hdr.dontParseAfterManip = TRUE;
if (pupdate_hm->update_params.op_flags &
DPA_CLS_HM_REPLACE_IPv4_BY_IPv6) {
@@ -6339,6 +6372,9 @@ static int update_hm_update_params(struct dpa_cls_hm *pupdate_hm)
}
}
+ hm_node->params.u.hdr.dontParseAfterManip &=
+ (pupdate_hm->update_params.reparse) ? FALSE : TRUE;
+
hm_node = pupdate_hm->hm_node[1];
if (pupdate_hm->update_params.ip_frag_params.mtu) {
@@ -6728,6 +6764,9 @@ static int vlan_hm_prepare_nodes(struct dpa_cls_hm *pvlan_hm,
}
INIT_LIST_HEAD(&hm_node->list_node);
+
+ /* Initialize dontParseAfterManip to TRUE */
+ hm_node->params.u.hdr.dontParseAfterManip = TRUE;
}
pvlan_hm->hm_node[0] = hm_node;
@@ -6756,6 +6795,8 @@ static int vlan_hm_update_params(struct dpa_cls_hm *pvlan_hm)
hm_node = pvlan_hm->hm_node[0];
hm_node->params.type = e_FM_PCD_MANIP_HDR;
+ hm_node->params.u.hdr.dontParseAfterManip &=
+ (pvlan_hm->vlan_params.reparse) ? FALSE : TRUE;
switch (pvlan_hm->vlan_params.type) {
case DPA_CLS_HM_VLAN_INGRESS:
@@ -6766,7 +6807,6 @@ static int vlan_hm_update_params(struct dpa_cls_hm *pvlan_hm)
e_FM_PCD_MANIP_RMV_BY_HDR_SPECIFIC_L2;
hm_node->params.u.hdr.rmvParams.u.byHdr.u.specificL2 =
e_FM_PCD_MANIP_HDR_RMV_STACKED_QTAGS;
- hm_node->params.u.hdr.dontParseAfterManip = TRUE;
break;
case DPA_CLS_HM_VLAN_EGRESS:
@@ -6808,7 +6848,6 @@ static int vlan_hm_update_params(struct dpa_cls_hm *pvlan_hm)
hm_node->params.u.hdr.fieldUpdate = TRUE;
hm_node->params.u.hdr.fieldUpdateParams.type =
e_FM_PCD_MANIP_HDR_FIELD_UPDATE_VLAN;
- hm_node->params.u.hdr.dontParseAfterManip = TRUE;
switch (pvlan_hm->vlan_params.egress.update_op) {
case DPA_CLS_HM_VLAN_UPDATE_VPri:
@@ -7123,6 +7162,9 @@ static int mpls_hm_prepare_nodes(struct dpa_cls_hm *pmpls_hm,
}
INIT_LIST_HEAD(&hm_node->list_node);
+
+ /* Initialize dontParseAfterManip to TRUE */
+ hm_node->params.u.hdr.dontParseAfterManip = TRUE;
}
pmpls_hm->hm_node[0] = hm_node;
@@ -7151,6 +7193,8 @@ static int mpls_hm_update_params(struct dpa_cls_hm *pmpls_hm)
hm_node = pmpls_hm->hm_node[0];
hm_node->params.type = e_FM_PCD_MANIP_HDR;
+ hm_node->params.u.hdr.dontParseAfterManip &=
+ (pmpls_hm->mpls_params.reparse) ? FALSE : TRUE;
switch (pmpls_hm->mpls_params.type) {
case DPA_CLS_HM_MPLS_REMOVE_ALL_LABELS:
diff --git a/drivers/staging/fsl_dpa_offload/dpa_classifier_ioctl.h b/drivers/staging/fsl_dpa_offload/dpa_classifier_ioctl.h
index 88a157c..1e73bd6 100644
--- a/drivers/staging/fsl_dpa_offload/dpa_classifier_ioctl.h
+++ b/drivers/staging/fsl_dpa_offload/dpa_classifier_ioctl.h
@@ -298,6 +298,7 @@ struct dpa_cls_compat_hm_remove_params {
enum dpa_cls_hm_remove_type type;
struct dpa_cls_hm_custom_rm_params custom;
compat_uptr_t fm_pcd;
+ bool reparse;
};
struct compat_ioc_dpa_cls_hm_remove_params {
@@ -320,14 +321,15 @@ struct dpa_cls_compat_hm_custom_ins_params {
};
struct dpa_cls_compat_hm_insert_params {
- enum dpa_cls_hm_insert_type type;
+ enum dpa_cls_hm_insert_type type;
union {
struct dpa_cls_hm_eth_ins_params eth;
- struct dpa_cls_hm_pppoe_ins_params pppoe;
- uint16_t ppp_pid;
- struct dpa_cls_compat_hm_custom_ins_params custom;
+ struct dpa_cls_hm_pppoe_ins_params pppoe;
+ uint16_t ppp_pid;
+ struct dpa_cls_compat_hm_custom_ins_params custom;
};
- compat_uptr_t fm_pcd;
+ compat_uptr_t fm_pcd;
+ bool reparse;
};
struct compat_ioc_dpa_cls_hm_insert_params {
@@ -346,6 +348,7 @@ struct dpa_cls_compat_hm_vlan_params {
struct dpa_cls_hm_egress_vlan_params egress;
};
compat_uptr_t fm_pcd;
+ bool reparse;
};
struct dpa_cls_compat_hm_vlan_resources {
@@ -377,7 +380,7 @@ struct dpa_cls_compat_hm_nat_pt_params {
};
struct dpa_cls_compat_hm_nat_params {
- int flags;
+ int flags;
enum dpa_cls_hm_nat_proto proto;
enum dpa_cls_hm_nat_type type;
union {
@@ -387,6 +390,7 @@ struct dpa_cls_compat_hm_nat_params {
uint16_t sport;
uint16_t dport;
compat_uptr_t fm_pcd;
+ bool reparse;
};
struct dpa_cls_compat_hm_nat_resources {
@@ -404,7 +408,7 @@ struct compat_ioc_dpa_cls_hm_nat_params {
};
struct dpa_cls_compat_hm_update_params {
- int op_flags;
+ int op_flags;
union {
struct compat_ipv4_header new_ipv4_hdr;
struct ipv6_header new_ipv6_hdr;
@@ -415,6 +419,7 @@ struct dpa_cls_compat_hm_update_params {
} update;
struct dpa_cls_hm_ip_frag_params ip_frag_params;
compat_uptr_t fm_pcd;
+ bool reparse;
};
struct dpa_cls_compat_hm_update_resources {
@@ -441,6 +446,7 @@ struct dpa_cls_compat_hm_fwd_params {
};
struct dpa_cls_hm_ip_frag_params ip_frag_params;
compat_uptr_t fm_pcd;
+ bool reparse;
};
struct dpa_cls_compat_hm_fwd_resources {
@@ -463,6 +469,7 @@ struct dpa_cls_compat_hm_mpls_params {
struct mpls_header mpls_hdr[DPA_CLS_HM_MAX_MPLS_LABELS];
unsigned int num_labels;
compat_uptr_t fm_pcd;
+ bool reparse;
};
struct dpa_cls_compat_hm_mpls_resources {
diff --git a/drivers/staging/fsl_dpa_offload/wrp_dpa_classifier.c b/drivers/staging/fsl_dpa_offload/wrp_dpa_classifier.c
index 1e35b09..0e08edd 100644
--- a/drivers/staging/fsl_dpa_offload/wrp_dpa_classifier.c
+++ b/drivers/staging/fsl_dpa_offload/wrp_dpa_classifier.c
@@ -2637,9 +2637,10 @@ int dpa_cls_hm_remove_params_compatcpy(
memcpy(&kparam->rm_params.custom, &uparam->rm_params.custom,
sizeof(struct dpa_cls_hm_custom_rm_params));
- kparam->rm_params.fm_pcd = compat_ptr(uparam->rm_params.fm_pcd);
- kparam->next_hmd = uparam->next_hmd;
- kparam->hmd = uparam->hmd;
+ kparam->rm_params.fm_pcd = compat_ptr(uparam->rm_params.fm_pcd);
+ kparam->rm_params.reparse = uparam->rm_params.reparse;
+ kparam->next_hmd = uparam->next_hmd;
+ kparam->hmd = uparam->hmd;
if (uparam->res.remove_node)
kparam->res.remove_node = compat_get_id2ptr(
@@ -2687,9 +2688,10 @@ int dpa_cls_hm_insert_params_compatcpy(
break;
}
- kparam->ins_params.fm_pcd = compat_ptr(uparam->ins_params.fm_pcd);
- kparam->next_hmd = uparam->next_hmd;
- kparam->hmd = uparam->hmd;
+ kparam->ins_params.fm_pcd = compat_ptr(uparam->ins_params.fm_pcd);
+ kparam->ins_params.reparse = uparam->ins_params.reparse;
+ kparam->next_hmd = uparam->next_hmd;
+ kparam->hmd = uparam->hmd;
if (uparam->res.insert_node)
kparam->res.insert_node = compat_get_id2ptr(
uparam->res.insert_node,
@@ -2727,6 +2729,7 @@ int dpa_cls_hm_vlan_params_compatcpy(
}
kparam->vlan_params.fm_pcd = compat_ptr(uparam->vlan_params.fm_pcd);
+ kparam->vlan_params.reparse = uparam->vlan_params.reparse;
kparam->next_hmd = uparam->next_hmd;
kparam->hmd = uparam->hmd;
@@ -2778,11 +2781,12 @@ int dpa_cls_hm_nat_params_compatcpy(
memcpy(&kparam->nat_params.nat, &uparam->nat_params.nat,
sizeof(struct dpa_cls_hm_traditional_nat_params));
- kparam->nat_params.fm_pcd = compat_ptr(uparam->nat_params.fm_pcd);
- kparam->nat_params.sport = uparam->nat_params.sport;
- kparam->nat_params.dport = uparam->nat_params.dport;
- kparam->next_hmd = uparam->next_hmd;
- kparam->hmd = uparam->hmd;
+ kparam->nat_params.fm_pcd = compat_ptr(uparam->nat_params.fm_pcd);
+ kparam->nat_params.reparse = uparam->nat_params.reparse;
+ kparam->nat_params.sport = uparam->nat_params.sport;
+ kparam->nat_params.dport = uparam->nat_params.dport;
+ kparam->next_hmd = uparam->next_hmd;
+ kparam->hmd = uparam->hmd;
if (uparam->res.l3_update_node)
kparam->res.l3_update_node = compat_get_id2ptr(
@@ -2840,6 +2844,7 @@ int dpa_cls_hm_update_params_compatcpy(
kparam->update_params.fm_pcd = compat_ptr(uparam->update_params.fm_pcd);
+ kparam->update_params.reparse = uparam->update_params.reparse;
kparam->next_hmd = uparam->next_hmd;
kparam->hmd = uparam->hmd;
@@ -2869,8 +2874,9 @@ int dpa_cls_hm_fwd_params_compatcpy(
{
int type;
- kparam->fwd_params.out_if_type = uparam->fwd_params.out_if_type;
- kparam->fwd_params.fm_pcd = compat_ptr(uparam->fwd_params.fm_pcd);
+ kparam->fwd_params.out_if_type = uparam->fwd_params.out_if_type;
+ kparam->fwd_params.fm_pcd = compat_ptr(uparam->fwd_params.fm_pcd);
+ kparam->fwd_params.reparse = uparam->fwd_params.reparse;
type = kparam->fwd_params.out_if_type;
switch (type) {
@@ -2932,6 +2938,7 @@ int dpa_cls_hm_mpls_params_compatcpy(
sizeof(struct mpls_header) * DPA_CLS_HM_MAX_MPLS_LABELS);
kparam->mpls_params.num_labels = uparam->mpls_params.num_labels;
kparam->mpls_params.fm_pcd = compat_ptr(uparam->mpls_params.fm_pcd);
+ kparam->mpls_params.reparse = uparam->mpls_params.reparse;
kparam->next_hmd = uparam->next_hmd;
kparam->hmd = uparam->hmd;