aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorManish Chopra <manish.chopra@qlogic.com>2013-07-26 16:24:02 -0400
committerDavid S. Miller <davem@davemloft.net>2013-07-27 23:03:02 -0400
commit7cfc1cebdaee367c30e8944dd5adf2f6bbae8123 (patch)
tree25e2ac3ae75db08ac692f201399fde15a1bef090
parent6226204bcf20d2bb8e47e996c1688186355c1db4 (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.c26
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
1771static 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
1770int qlcnic_sriov_get_vf_config(struct net_device *netdev, 1794int 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)