Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ac34b743 authored by Sathya Perla's avatar Sathya Perla Committed by David S. Miller
Browse files

be2net: remove duplicate code in be_cmd_rx_filter()



This patch passes BE_IF_FLAGS_XXX flags to be_cmd_rx_filter() routine
instead of the IFF_XXX flags. Doing this gets rid of the code to convert
the IFF_XXX flags to the BE_IF_FLAGS_XXX used by the FW cmd. The patch
also removes code for setting if_flags_mask that was duplicated for each
filter mode.

Signed-off-by: default avatarSathya Perla <sathya.perla@emulex.com>
Signed-off-by: default avatarKalesh AP <kalesh.purayil@emulex.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 70a7b525
Loading
Loading
Loading
Loading
+19 −35
Original line number Diff line number Diff line
@@ -1886,7 +1886,7 @@ int be_cmd_vlan_config(struct be_adapter *adapter, u32 if_id, u16 *vtag_array,
	return status;
}

int be_cmd_rx_filter(struct be_adapter *adapter, u32 flags, u32 value)
static int __be_cmd_rx_filter(struct be_adapter *adapter, u32 flags, u32 value)
{
	struct be_mcc_wrb *wrb;
	struct be_dma_mem *mem = &adapter->rx_filter;
@@ -1906,31 +1906,13 @@ int be_cmd_rx_filter(struct be_adapter *adapter, u32 flags, u32 value)
			       wrb, mem);

	req->if_id = cpu_to_le32(adapter->if_handle);
	if (flags & IFF_PROMISC) {
		req->if_flags_mask = cpu_to_le32(BE_IF_FLAGS_PROMISCUOUS |
						 BE_IF_FLAGS_VLAN_PROMISCUOUS |
						 BE_IF_FLAGS_MCAST_PROMISCUOUS);
		if (value == ON)
			req->if_flags =
				cpu_to_le32(BE_IF_FLAGS_PROMISCUOUS |
					    BE_IF_FLAGS_VLAN_PROMISCUOUS |
					    BE_IF_FLAGS_MCAST_PROMISCUOUS);
	} else if (flags & IFF_ALLMULTI) {
		req->if_flags_mask = cpu_to_le32(BE_IF_FLAGS_MCAST_PROMISCUOUS);
		req->if_flags =	cpu_to_le32(BE_IF_FLAGS_MCAST_PROMISCUOUS);
	} else if (flags & BE_FLAGS_VLAN_PROMISC) {
		req->if_flags_mask = cpu_to_le32(BE_IF_FLAGS_VLAN_PROMISCUOUS);

		if (value == ON)
			req->if_flags =
				cpu_to_le32(BE_IF_FLAGS_VLAN_PROMISCUOUS);
	} else {
	req->if_flags_mask = cpu_to_le32(flags);
	req->if_flags = (value == ON) ? req->if_flags_mask : 0;

	if (flags & BE_IF_FLAGS_MULTICAST) {
		struct netdev_hw_addr *ha;
		int i = 0;

		req->if_flags_mask = cpu_to_le32(BE_IF_FLAGS_MULTICAST);
		req->if_flags =	cpu_to_le32(BE_IF_FLAGS_MULTICAST);

		/* Reset mcast promisc mode if already set by setting mask
		 * and not setting flags field
		 */
@@ -1942,24 +1924,26 @@ int be_cmd_rx_filter(struct be_adapter *adapter, u32 flags, u32 value)
			memcpy(req->mcast_mac[i++].byte, ha->addr, ETH_ALEN);
	}

	if ((req->if_flags_mask & cpu_to_le32(be_if_cap_flags(adapter))) !=
	    req->if_flags_mask) {
		dev_warn(&adapter->pdev->dev,
			 "Cannot set rx filter flags 0x%x\n",
			 req->if_flags_mask);
		dev_warn(&adapter->pdev->dev,
			 "Interface is capable of 0x%x flags only\n",
			 be_if_cap_flags(adapter));
	}
	req->if_flags_mask &= cpu_to_le32(be_if_cap_flags(adapter));

	status = be_mcc_notify_wait(adapter);

err:
	spin_unlock_bh(&adapter->mcc_lock);
	return status;
}

int be_cmd_rx_filter(struct be_adapter *adapter, u32 flags, u32 value)
{
	struct device *dev = &adapter->pdev->dev;

	if ((flags & be_if_cap_flags(adapter)) != flags) {
		dev_warn(dev, "Cannot set rx filter flags 0x%x\n", flags);
		dev_warn(dev, "Interface is capable of 0x%x flags only\n",
			 be_if_cap_flags(adapter));
	}
	flags &= be_if_cap_flags(adapter);

	return __be_cmd_rx_filter(adapter, flags, value);
}

/* Uses synchrounous mcc */
int be_cmd_set_flow_control(struct be_adapter *adapter, u32 tx_fc, u32 rx_fc)
{
+4 −0
Original line number Diff line number Diff line
@@ -586,6 +586,10 @@ enum be_if_flags {
			 BE_IF_FLAGS_PASS_L3L4_ERRORS | BE_IF_FLAGS_MULTICAST |\
			 BE_IF_FLAGS_UNTAGGED)

#define BE_IF_FLAGS_ALL_PROMISCUOUS	(BE_IF_FLAGS_PROMISCUOUS | \
					 BE_IF_FLAGS_VLAN_PROMISCUOUS |\
					 BE_IF_FLAGS_MCAST_PROMISCUOUS)

/* An RX interface is an object with one or more MAC addresses and
 * filtering capabilities. */
struct be_cmd_req_if_create {
+13 −16
Original line number Diff line number Diff line
@@ -1133,18 +1133,14 @@ static int be_vid_config(struct be_adapter *adapter)
				MCC_ADDL_STATUS_INSUFFICIENT_RESOURCES)
			goto set_vlan_promisc;
		dev_err(dev, "Setting HW VLAN filtering failed\n");
	} else {
		if (adapter->flags & BE_FLAGS_VLAN_PROMISC) {
			/* hw VLAN filtering re-enabled. */
			status = be_cmd_rx_filter(adapter,
						  BE_FLAGS_VLAN_PROMISC, OFF);
	} else if (adapter->flags & BE_FLAGS_VLAN_PROMISC) {
		status = be_cmd_rx_filter(adapter, BE_IF_FLAGS_VLAN_PROMISCUOUS,
					  OFF);
		if (!status) {
				dev_info(dev,
					 "Disabling VLAN Promiscuous mode\n");
			dev_info(dev, "Disabling VLAN Promiscuous mode\n");
			adapter->flags &= ~BE_FLAGS_VLAN_PROMISC;
		}
	}
	}

	return status;

@@ -1152,7 +1148,7 @@ static int be_vid_config(struct be_adapter *adapter)
	if (adapter->flags & BE_FLAGS_VLAN_PROMISC)
		return 0;

	status = be_cmd_rx_filter(adapter, BE_FLAGS_VLAN_PROMISC, ON);
	status = be_cmd_rx_filter(adapter, BE_IF_FLAGS_VLAN_PROMISCUOUS, ON);
	if (!status) {
		dev_info(dev, "Enable VLAN Promiscuous mode\n");
		adapter->flags |= BE_FLAGS_VLAN_PROMISC;
@@ -1204,7 +1200,7 @@ static void be_clear_promisc(struct be_adapter *adapter)
	adapter->promiscuous = false;
	adapter->flags &= ~(BE_FLAGS_VLAN_PROMISC | BE_FLAGS_MCAST_PROMISC);

	be_cmd_rx_filter(adapter, IFF_PROMISC, OFF);
	be_cmd_rx_filter(adapter, BE_IF_FLAGS_ALL_PROMISCUOUS, OFF);
}

static void be_set_rx_mode(struct net_device *netdev)
@@ -1213,7 +1209,7 @@ static void be_set_rx_mode(struct net_device *netdev)
	int status;

	if (netdev->flags & IFF_PROMISC) {
		be_cmd_rx_filter(adapter, IFF_PROMISC, ON);
		be_cmd_rx_filter(adapter, BE_IF_FLAGS_ALL_PROMISCUOUS, ON);
		adapter->promiscuous = true;
		goto done;
	}
@@ -1240,7 +1236,8 @@ static void be_set_rx_mode(struct net_device *netdev)
		}

		if (netdev_uc_count(netdev) > be_max_uc(adapter)) {
			be_cmd_rx_filter(adapter, IFF_PROMISC, ON);
			be_cmd_rx_filter(adapter, BE_IF_FLAGS_ALL_PROMISCUOUS,
					 ON);
			adapter->promiscuous = true;
			goto done;
		}
@@ -1253,7 +1250,7 @@ static void be_set_rx_mode(struct net_device *netdev)
		}
	}

	status = be_cmd_rx_filter(adapter, IFF_MULTICAST, ON);
	status = be_cmd_rx_filter(adapter, BE_IF_FLAGS_MULTICAST, ON);
	if (!status) {
		if (adapter->flags & BE_FLAGS_MCAST_PROMISC)
			adapter->flags &= ~BE_FLAGS_MCAST_PROMISC;
@@ -1267,7 +1264,7 @@ static void be_set_rx_mode(struct net_device *netdev)
	/* Set to MCAST promisc mode if setting MULTICAST address fails
	 * or if num configured exceeds what we support
	 */
	status = be_cmd_rx_filter(adapter, IFF_ALLMULTI, ON);
	status = be_cmd_rx_filter(adapter, BE_IF_FLAGS_MCAST_PROMISCUOUS, ON);
	if (!status)
		adapter->flags |= BE_FLAGS_MCAST_PROMISC;
done: