From d2e9fda68e7b830c22f748c26a3b80c67bd3a679 Mon Sep 17 00:00:00 2001
From: "Subramanian, Kavitha" <k.subramanian@intel.com>
Date: Wed, 21 Mar 2018 06:52:00 +0100
Subject: [PATCH] Merge pull request #255 in SW_PON/linux from
 feature/DRVLIB_SW-540-switchdev_vlan_handling to xrx500

* commit '20aa70e48dd57d306bf278b6491cbc49d3b064d4':
  sqush before rebase
---
 .../ethernet/lantiq/datapath/datapath_swdev.c | 27 ++++++++++++-------
 1 file changed, 18 insertions(+), 9 deletions(-)

diff --git a/drivers/net/ethernet/lantiq/datapath/datapath_swdev.c b/drivers/net/ethernet/lantiq/datapath/datapath_swdev.c
index f9b6de7f8..e37a55231 100644
--- a/drivers/net/ethernet/lantiq/datapath/datapath_swdev.c
+++ b/drivers/net/ethernet/lantiq/datapath/datapath_swdev.c
@@ -224,17 +224,23 @@ static int dp_swdev_cfg_vlan(struct bridge_id_entry_item *br_item,
 	struct vlan_prop vlan_prop = {0};
 	struct dp_dev *dp_dev;
 	struct logic_dev *tmp = NULL;
-	u32 idx;
+	u32 idx, inst;
 	int vap, i;
 
-	//if (br_info->flag & LOGIC_DEV_REGISTER) {
+	/*br_info = dp_swdev_bridge_entry_lookup(br_item->br_device_name,
+	 *br_item->inst);
+	 *if (!br_info)
+	 *	return 0;
+	 */
+	/*if (br_info->flag & LOGIC_DEV_REGISTER) {*/
 	if (br_item->flags & LOGIC_DEV_REGISTER) {
-		//get_vlan_via_dev(dev, &vlan_prop);
+		/*get_vlan_via_dev(dev, &vlan_prop);*/
 		idx = dp_dev_hash(dev, NULL);
 		dp_dev = dp_dev_lookup(&dp_dev_list[idx], dev, NULL, 0);
+		inst = br_item->inst;
 		vap = GET_VAP(dp_dev->ctp,
-			      dp_port_info[br_item->inst][dp_dev->ep].vap_offset,
-			      dp_port_info[br_item->inst][dp_dev->ep].vap_mask);
+			      dp_port_info[inst][dp_dev->ep].vap_offset,
+			      dp_port_info[inst][dp_dev->ep].vap_mask);
 		DP_DEBUG(DP_DBG_FLAG_SWDEV, "vap=%d ep=%d bp=%d\n",
 			 vap, dp_dev->ep, dp_dev->bp);
 		dp_port_prop[br_item->inst].info.dp_cfg_vlan(br_item->inst,
@@ -456,7 +462,8 @@ static int dp_swdev_add_if(struct net_device *dev,
 	if (br_item) {
 		dp_swdev_cfg_gswip(br_item, addr);
 		if (br_item->flags & LOGIC_DEV_REGISTER)
-			dp_swdev_cfg_vlan(br_item, dev);/*only for vlan flag*/
+			/*do only for vlan flag*/
+			dp_swdev_cfg_vlan(br_item, dev);
 	}
 	swdev_unlock();
 	return 0;
@@ -485,7 +492,7 @@ static int dp_swdev_del_if(struct net_device *dev,
 			DP_DEBUG(DP_DBG_FLAG_SWDEV,
 				 "dp_get_netif_subifid failed for %s\n",
 				 dev->name);
-			if (!is_vlan_dev(dev))
+		/*	if (!is_vlan_dev(dev))*/
 				return -EINVAL;
 		}
 		br_item = kmalloc(sizeof(*br_item), GFP_KERNEL);
@@ -500,6 +507,7 @@ static int dp_swdev_del_if(struct net_device *dev,
 			br_item->inst = subif.inst;
 			/* current bridge member port*/
 			br_item->portid = subif.bport;
+			br_item->flags = BRIDGE_NO_ACTION;
 			strcpy(br_item->br_device_name,
 			       br_info->br_device_name);
 
@@ -541,7 +549,7 @@ static int dp_swdev_del_if(struct net_device *dev,
 			if (!base)
 				base = dev;
 			/*the previous sequence was running into a deadlock in
-			 *taking the swdev_lock
+			 * taking the swdev_lock
 			 */
 			dp_swdev_cfg_vlan(br_item, dev);
 			swdev_unlock();
@@ -983,7 +991,8 @@ void dp_port_register_switchdev(struct dp_dev  *dp_dev,
 		dp_dev->old_swdev_ops = NULL;
 		if (dp_port->netdev_ops)
 			SET_OPS(dp_dev->old_dev_ops,
-				(struct net_device_ops *)dp_port->netdev_ops);
+				(const struct net_device_ops *)
+				dp_port->netdev_ops);
 		if (dp_dev->old_swdev_ops)
 			SET_OPS(dp_dev->old_swdev_ops,
 				(struct switchdev_ops *)dp_port->switchdev_ops);
-- 
GitLab