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

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
...@@ -1886,7 +1886,7 @@ int be_cmd_vlan_config(struct be_adapter *adapter, u32 if_id, u16 *vtag_array, ...@@ -1886,7 +1886,7 @@ int be_cmd_vlan_config(struct be_adapter *adapter, u32 if_id, u16 *vtag_array,
return status; 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_mcc_wrb *wrb;
struct be_dma_mem *mem = &adapter->rx_filter; 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) ...@@ -1906,31 +1906,13 @@ int be_cmd_rx_filter(struct be_adapter *adapter, u32 flags, u32 value)
wrb, mem); wrb, mem);
req->if_id = cpu_to_le32(adapter->if_handle); req->if_id = cpu_to_le32(adapter->if_handle);
if (flags & IFF_PROMISC) { req->if_flags_mask = cpu_to_le32(flags);
req->if_flags_mask = cpu_to_le32(BE_IF_FLAGS_PROMISCUOUS | req->if_flags = (value == ON) ? req->if_flags_mask : 0;
BE_IF_FLAGS_VLAN_PROMISCUOUS |
BE_IF_FLAGS_MCAST_PROMISCUOUS); if (flags & BE_IF_FLAGS_MULTICAST) {
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 {
struct netdev_hw_addr *ha; struct netdev_hw_addr *ha;
int i = 0; 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 /* Reset mcast promisc mode if already set by setting mask
* and not setting flags field * and not setting flags field
*/ */
...@@ -1942,24 +1924,26 @@ int be_cmd_rx_filter(struct be_adapter *adapter, u32 flags, u32 value) ...@@ -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); 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); status = be_mcc_notify_wait(adapter);
err: err:
spin_unlock_bh(&adapter->mcc_lock); spin_unlock_bh(&adapter->mcc_lock);
return status; 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 */ /* Uses synchrounous mcc */
int be_cmd_set_flow_control(struct be_adapter *adapter, u32 tx_fc, u32 rx_fc) int be_cmd_set_flow_control(struct be_adapter *adapter, u32 tx_fc, u32 rx_fc)
{ {
......
...@@ -586,6 +586,10 @@ enum be_if_flags { ...@@ -586,6 +586,10 @@ enum be_if_flags {
BE_IF_FLAGS_PASS_L3L4_ERRORS | BE_IF_FLAGS_MULTICAST |\ BE_IF_FLAGS_PASS_L3L4_ERRORS | BE_IF_FLAGS_MULTICAST |\
BE_IF_FLAGS_UNTAGGED) 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 /* An RX interface is an object with one or more MAC addresses and
* filtering capabilities. */ * filtering capabilities. */
struct be_cmd_req_if_create { struct be_cmd_req_if_create {
......
...@@ -1133,16 +1133,12 @@ static int be_vid_config(struct be_adapter *adapter) ...@@ -1133,16 +1133,12 @@ static int be_vid_config(struct be_adapter *adapter)
MCC_ADDL_STATUS_INSUFFICIENT_RESOURCES) MCC_ADDL_STATUS_INSUFFICIENT_RESOURCES)
goto set_vlan_promisc; goto set_vlan_promisc;
dev_err(dev, "Setting HW VLAN filtering failed\n"); dev_err(dev, "Setting HW VLAN filtering failed\n");
} else { } else if (adapter->flags & BE_FLAGS_VLAN_PROMISC) {
if (adapter->flags & BE_FLAGS_VLAN_PROMISC) { status = be_cmd_rx_filter(adapter, BE_IF_FLAGS_VLAN_PROMISCUOUS,
/* hw VLAN filtering re-enabled. */ OFF);
status = be_cmd_rx_filter(adapter, if (!status) {
BE_FLAGS_VLAN_PROMISC, OFF); dev_info(dev, "Disabling VLAN Promiscuous mode\n");
if (!status) { adapter->flags &= ~BE_FLAGS_VLAN_PROMISC;
dev_info(dev,
"Disabling VLAN Promiscuous mode\n");
adapter->flags &= ~BE_FLAGS_VLAN_PROMISC;
}
} }
} }
...@@ -1152,7 +1148,7 @@ static int be_vid_config(struct be_adapter *adapter) ...@@ -1152,7 +1148,7 @@ static int be_vid_config(struct be_adapter *adapter)
if (adapter->flags & BE_FLAGS_VLAN_PROMISC) if (adapter->flags & BE_FLAGS_VLAN_PROMISC)
return 0; 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) { if (!status) {
dev_info(dev, "Enable VLAN Promiscuous mode\n"); dev_info(dev, "Enable VLAN Promiscuous mode\n");
adapter->flags |= BE_FLAGS_VLAN_PROMISC; adapter->flags |= BE_FLAGS_VLAN_PROMISC;
...@@ -1204,7 +1200,7 @@ static void be_clear_promisc(struct be_adapter *adapter) ...@@ -1204,7 +1200,7 @@ static void be_clear_promisc(struct be_adapter *adapter)
adapter->promiscuous = false; adapter->promiscuous = false;
adapter->flags &= ~(BE_FLAGS_VLAN_PROMISC | BE_FLAGS_MCAST_PROMISC); 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) static void be_set_rx_mode(struct net_device *netdev)
...@@ -1213,7 +1209,7 @@ 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; int status;
if (netdev->flags & IFF_PROMISC) { 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; adapter->promiscuous = true;
goto done; goto done;
} }
...@@ -1240,7 +1236,8 @@ static void be_set_rx_mode(struct net_device *netdev) ...@@ -1240,7 +1236,8 @@ static void be_set_rx_mode(struct net_device *netdev)
} }
if (netdev_uc_count(netdev) > be_max_uc(adapter)) { 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; adapter->promiscuous = true;
goto done; goto done;
} }
...@@ -1253,7 +1250,7 @@ static void be_set_rx_mode(struct net_device *netdev) ...@@ -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 (!status) {
if (adapter->flags & BE_FLAGS_MCAST_PROMISC) if (adapter->flags & BE_FLAGS_MCAST_PROMISC)
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) ...@@ -1267,7 +1264,7 @@ static void be_set_rx_mode(struct net_device *netdev)
/* Set to MCAST promisc mode if setting MULTICAST address fails /* Set to MCAST promisc mode if setting MULTICAST address fails
* or if num configured exceeds what we support * 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) if (!status)
adapter->flags |= BE_FLAGS_MCAST_PROMISC; adapter->flags |= BE_FLAGS_MCAST_PROMISC;
done: done:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment