diff options
author | Manish Chopra <manish.chopra@qlogic.com> | 2013-07-26 16:24:02 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-07-27 23:03:02 -0400 |
commit | 7cfc1cebdaee367c30e8944dd5adf2f6bbae8123 (patch) | |
tree | 25e2ac3ae75db08ac692f201399fde15a1bef090 | |
parent | 6226204bcf20d2bb8e47e996c1688186355c1db4 (diff) |
qlcnic: Fix setting Guest VLAN
o When configuring guest VLAN after PVID configuration, VF was loading
with previously configured PVID. Clear the PVID which was previously
configured before configuring guest VLAN.
o Display guest VLAN when it is configured
Signed-off-by: Manish Chopra <manish.chopra@qlogic.com>
Signed-off-by: Himanshu Madhani <himanshu.madhani@qlogic.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c index 9bdd51e6b44c..eb49cd65378c 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c | |||
@@ -1749,6 +1749,7 @@ int qlcnic_sriov_set_vf_vlan(struct net_device *netdev, int vf, | |||
1749 | 1749 | ||
1750 | switch (vlan) { | 1750 | switch (vlan) { |
1751 | case 4095: | 1751 | case 4095: |
1752 | vp->vlan = 0; | ||
1752 | vp->vlan_mode = QLC_GUEST_VLAN_MODE; | 1753 | vp->vlan_mode = QLC_GUEST_VLAN_MODE; |
1753 | break; | 1754 | break; |
1754 | case 0: | 1755 | case 0: |
@@ -1767,6 +1768,29 @@ int qlcnic_sriov_set_vf_vlan(struct net_device *netdev, int vf, | |||
1767 | return 0; | 1768 | return 0; |
1768 | } | 1769 | } |
1769 | 1770 | ||
1771 | static inline __u32 qlcnic_sriov_get_vf_vlan(struct qlcnic_adapter *adapter, | ||
1772 | struct qlcnic_vport *vp, int vf) | ||
1773 | { | ||
1774 | __u32 vlan = 0; | ||
1775 | |||
1776 | switch (vp->vlan_mode) { | ||
1777 | case QLC_PVID_MODE: | ||
1778 | vlan = vp->vlan; | ||
1779 | break; | ||
1780 | case QLC_GUEST_VLAN_MODE: | ||
1781 | vlan = MAX_VLAN_ID; | ||
1782 | break; | ||
1783 | case QLC_NO_VLAN_MODE: | ||
1784 | vlan = 0; | ||
1785 | break; | ||
1786 | default: | ||
1787 | netdev_info(adapter->netdev, "Invalid VLAN mode = %d for VF %d\n", | ||
1788 | vp->vlan_mode, vf); | ||
1789 | } | ||
1790 | |||
1791 | return vlan; | ||
1792 | } | ||
1793 | |||
1770 | int qlcnic_sriov_get_vf_config(struct net_device *netdev, | 1794 | int qlcnic_sriov_get_vf_config(struct net_device *netdev, |
1771 | int vf, struct ifla_vf_info *ivi) | 1795 | int vf, struct ifla_vf_info *ivi) |
1772 | { | 1796 | { |
@@ -1782,7 +1806,7 @@ int qlcnic_sriov_get_vf_config(struct net_device *netdev, | |||
1782 | 1806 | ||
1783 | vp = sriov->vf_info[vf].vp; | 1807 | vp = sriov->vf_info[vf].vp; |
1784 | memcpy(&ivi->mac, vp->mac, ETH_ALEN); | 1808 | memcpy(&ivi->mac, vp->mac, ETH_ALEN); |
1785 | ivi->vlan = vp->vlan; | 1809 | ivi->vlan = qlcnic_sriov_get_vf_vlan(adapter, vp, vf); |
1786 | ivi->qos = vp->qos; | 1810 | ivi->qos = vp->qos; |
1787 | ivi->spoofchk = vp->spoofchk; | 1811 | ivi->spoofchk = vp->spoofchk; |
1788 | if (vp->max_tx_bw == MAX_BW) | 1812 | if (vp->max_tx_bw == MAX_BW) |