aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAjit Khaparde <ajit.khaparde@emulex.com>2013-11-18 11:44:24 -0500
committerDavid S. Miller <davem@davemloft.net>2013-11-18 16:25:22 -0500
commit012bd38740a9f6f956cdaa69a4b9534daddb70a5 (patch)
treea660d484fb439f63947ed05da42116fecec21289
parent0f13b66b01c6e2ec4913a7812414183844d1cc4f (diff)
be2net: Fix unconditional enabling of Rx interface options
The driver currently requests the firmware to enable rx_interface options without considering if the interface was created with that capability. This could cause commands to firmware to fail. To avoid this, enable only those options on an interface if the interface was created with that capability. Signed-off-by: Ajit Khaparde <ajit.khaparde@emulex.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/emulex/benet/be_cmds.c16
-rw-r--r--drivers/net/ethernet/emulex/benet/be_cmds.h2
-rw-r--r--drivers/net/ethernet/emulex/benet/be_main.c2
3 files changed, 16 insertions, 4 deletions
diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.c b/drivers/net/ethernet/emulex/benet/be_cmds.c
index 7fb0edfe3d24..dbcd5262c016 100644
--- a/drivers/net/ethernet/emulex/benet/be_cmds.c
+++ b/drivers/net/ethernet/emulex/benet/be_cmds.c
@@ -1758,7 +1758,7 @@ err:
1758 1758
1759/* Uses sycnhronous mcc */ 1759/* Uses sycnhronous mcc */
1760int be_cmd_vlan_config(struct be_adapter *adapter, u32 if_id, u16 *vtag_array, 1760int be_cmd_vlan_config(struct be_adapter *adapter, u32 if_id, u16 *vtag_array,
1761 u32 num, bool untagged, bool promiscuous) 1761 u32 num, bool promiscuous)
1762{ 1762{
1763 struct be_mcc_wrb *wrb; 1763 struct be_mcc_wrb *wrb;
1764 struct be_cmd_req_vlan_config *req; 1764 struct be_cmd_req_vlan_config *req;
@@ -1778,7 +1778,7 @@ int be_cmd_vlan_config(struct be_adapter *adapter, u32 if_id, u16 *vtag_array,
1778 1778
1779 req->interface_id = if_id; 1779 req->interface_id = if_id;
1780 req->promiscuous = promiscuous; 1780 req->promiscuous = promiscuous;
1781 req->untagged = untagged; 1781 req->untagged = BE_IF_FLAGS_UNTAGGED & be_if_cap_flags(adapter) ? 1 : 0;
1782 req->num_vlan = num; 1782 req->num_vlan = num;
1783 if (!promiscuous) { 1783 if (!promiscuous) {
1784 memcpy(req->normal_vlan, vtag_array, 1784 memcpy(req->normal_vlan, vtag_array,
@@ -1847,7 +1847,19 @@ int be_cmd_rx_filter(struct be_adapter *adapter, u32 flags, u32 value)
1847 memcpy(req->mcast_mac[i++].byte, ha->addr, ETH_ALEN); 1847 memcpy(req->mcast_mac[i++].byte, ha->addr, ETH_ALEN);
1848 } 1848 }
1849 1849
1850 if ((req->if_flags_mask & cpu_to_le32(be_if_cap_flags(adapter))) !=
1851 req->if_flags_mask) {
1852 dev_warn(&adapter->pdev->dev,
1853 "Cannot set rx filter flags 0x%x\n",
1854 req->if_flags_mask);
1855 dev_warn(&adapter->pdev->dev,
1856 "Interface is capable of 0x%x flags only\n",
1857 be_if_cap_flags(adapter));
1858 }
1859 req->if_flags_mask &= cpu_to_le32(be_if_cap_flags(adapter));
1860
1850 status = be_mcc_notify_wait(adapter); 1861 status = be_mcc_notify_wait(adapter);
1862
1851err: 1863err:
1852 spin_unlock_bh(&adapter->mcc_lock); 1864 spin_unlock_bh(&adapter->mcc_lock);
1853 return status; 1865 return status;
diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.h b/drivers/net/ethernet/emulex/benet/be_cmds.h
index edf3e8a0ff83..0075686276aa 100644
--- a/drivers/net/ethernet/emulex/benet/be_cmds.h
+++ b/drivers/net/ethernet/emulex/benet/be_cmds.h
@@ -1984,7 +1984,7 @@ int be_cmd_get_fw_ver(struct be_adapter *adapter, char *fw_ver,
1984 char *fw_on_flash); 1984 char *fw_on_flash);
1985int be_cmd_modify_eqd(struct be_adapter *adapter, struct be_set_eqd *, int num); 1985int be_cmd_modify_eqd(struct be_adapter *adapter, struct be_set_eqd *, int num);
1986int be_cmd_vlan_config(struct be_adapter *adapter, u32 if_id, u16 *vtag_array, 1986int be_cmd_vlan_config(struct be_adapter *adapter, u32 if_id, u16 *vtag_array,
1987 u32 num, bool untagged, bool promiscuous); 1987 u32 num, bool promiscuous);
1988int be_cmd_rx_filter(struct be_adapter *adapter, u32 flags, u32 status); 1988int be_cmd_rx_filter(struct be_adapter *adapter, u32 flags, u32 status);
1989int be_cmd_set_flow_control(struct be_adapter *adapter, u32 tx_fc, u32 rx_fc); 1989int be_cmd_set_flow_control(struct be_adapter *adapter, u32 tx_fc, u32 rx_fc);
1990int be_cmd_get_flow_control(struct be_adapter *adapter, u32 *tx_fc, u32 *rx_fc); 1990int be_cmd_get_flow_control(struct be_adapter *adapter, u32 *tx_fc, u32 *rx_fc);
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c
index 741d3bff5ae7..13818d37bbbb 100644
--- a/drivers/net/ethernet/emulex/benet/be_main.c
+++ b/drivers/net/ethernet/emulex/benet/be_main.c
@@ -1079,7 +1079,7 @@ static int be_vid_config(struct be_adapter *adapter)
1079 vids[num++] = cpu_to_le16(i); 1079 vids[num++] = cpu_to_le16(i);
1080 1080
1081 status = be_cmd_vlan_config(adapter, adapter->if_handle, 1081 status = be_cmd_vlan_config(adapter, adapter->if_handle,
1082 vids, num, 1, 0); 1082 vids, num, 0);
1083 1083
1084 if (status) { 1084 if (status) {
1085 /* Set to VLAN promisc mode as setting VLAN filter failed */ 1085 /* Set to VLAN promisc mode as setting VLAN filter failed */