From patchwork Fri Feb 27 07:29:25 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hiroshi Shimamoto X-Patchwork-Id: 444167 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3C346140111 for ; Fri, 27 Feb 2015 18:31:49 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754331AbbB0Hbb (ORCPT ); Fri, 27 Feb 2015 02:31:31 -0500 Received: from TYO201.gate.nec.co.jp ([210.143.35.51]:63299 "EHLO tyo201.gate.nec.co.jp" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751232AbbB0Hb3 (ORCPT ); Fri, 27 Feb 2015 02:31:29 -0500 Received: from mailgate3.nec.co.jp ([10.7.69.160]) by tyo201.gate.nec.co.jp (8.13.8/8.13.4) with ESMTP id t1R7V7Oq006515; Fri, 27 Feb 2015 16:31:07 +0900 (JST) Received: from mailsv3.nec.co.jp (imss63.nec.co.jp [10.7.69.158]) by mailgate3.nec.co.jp (8.11.7/3.7W-MAILGATE-NEC) with ESMTP id t1R7V6721712; Fri, 27 Feb 2015 16:31:06 +0900 (JST) Received: from mail01b.kamome.nec.co.jp (mail01b.kamome.nec.co.jp [10.25.43.2]) by mailsv3.nec.co.jp (8.13.8/8.13.4) with ESMTP id t1R7V6Th002348; Fri, 27 Feb 2015 16:31:06 +0900 (JST) Received: from bpxc99gp.gisp.nec.co.jp ([10.38.151.142] [10.38.151.142]) by mail01b.kamome.nec.co.jp with ESMTP id BT-MMP-2408882; Fri, 27 Feb 2015 16:29:26 +0900 Received: from BPXM14GP.gisp.nec.co.jp ([169.254.1.73]) by BPXC14GP.gisp.nec.co.jp ([10.38.151.142]) with mapi id 14.03.0174.002; Fri, 27 Feb 2015 16:29:25 +0900 From: Hiroshi Shimamoto To: Jeff Kirsher CC: "e1000-devel@lists.sourceforge.net" , "netdev@vger.kernel.org" , "Choi, Sy Jong" , Hayato Momma , "linux-kernel@vger.kernel.org" , "ben@decadent.org.uk" Subject: [PATCH v2] ixgbe: make VLAN filter conditional Thread-Topic: [PATCH v2] ixgbe: make VLAN filter conditional Thread-Index: AdBSXtoNifcpq7mwQEq7areXIbWZZw== Date: Fri, 27 Feb 2015 07:29:25 +0000 Message-ID: <7F861DC0615E0C47A872E6F3C5FCDDBD05E45319@BPXM14GP.gisp.nec.co.jp> Accept-Language: ja-JP, en-US Content-Language: ja-JP X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.205.5.123] MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Hiroshi Shimamoto Disable hardware VLAN filtering if netdev->features VLAN flag is dropped. In SR-IOV case, there is a use case which needs to disable VLAN filter. For example, we need to make a network function with VF in virtualized environment. That network function may be a software switch, a router or etc. It means that that network function will be an end point which terminates many VLANs. In the current implementation, VLAN filtering always be turned on and VF can receive only 63 VLANs. It means that only 63 VLANs can be terminated in one NIC. With this patch, if the user turns VLAN filtering off on the host, VF can receive every VLAN packet. This VLAN filtering can be turned on or off when SR-IOV is disabled, if not the operation is rejected. Signed-off-by: Hiroshi Shimamoto Reviewed-by: Hayato Momma CC: Choi, Sy Jong --- drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 23 +++++++++++++++++++++++ drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c | 4 ++++ 2 files changed, 27 insertions(+) -- 2.1.0 diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c index f690f5d..9593366 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c @@ -4081,6 +4081,10 @@ void ixgbe_set_rx_mode(struct net_device *netdev) hw->addr_ctrl.user_set_promisc = false; } + /* Disable hardware VLAN filter if the feature flag is dropped */ + if (!(netdev->features & NETIF_F_HW_VLAN_CTAG_FILTER)) + vlnctrl &= ~(IXGBE_VLNCTRL_VFE | IXGBE_VLNCTRL_CFIEN); + /* * Write addresses to available RAR registers, if there is not * sufficient space to store all the addresses then enable @@ -7734,6 +7738,26 @@ static int ixgbe_set_features(struct net_device *netdev, netdev_features_t changed = netdev->features ^ features; bool need_reset = false; + if (changed & NETIF_F_HW_VLAN_CTAG_FILTER) { + int vlan_filter = features & NETIF_F_HW_VLAN_CTAG_FILTER; + + /* Prevent controlling VLAN filter if VFs exist */ + if (adapter->num_vfs > 0) { + e_dev_info("%s HW VLAN filter is not allowed when " + "SR-IOV enabled.\n", + vlan_filter ? "Enabling" : "Disabling"); + return -EINVAL; + } + if (!vlan_filter) { + e_dev_warn("Disabling HW VLAN filter. All VFs cannot " + "set VLAN filter from VF driver.\n"); + e_dev_warn("All VLAN packets are delivered to " + "every VF.\n"); + } + /* reset if HW VLAN filter is changed */ + need_reset = true; + } + /* Make sure RSC matches LRO, reset if change */ if (!(features & NETIF_F_LRO)) { if (adapter->flags2 & IXGBE_FLAG2_RSC_ENABLED) diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c index 288f39f..9ad45738 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c @@ -839,6 +839,10 @@ static int ixgbe_set_vf_vlan_msg(struct ixgbe_adapter *adapter, u32 bits; u8 tcs = netdev_get_num_tc(adapter->netdev); + /* Ignore if VLAN filter is disabled */ + if (!(adapter->netdev->features & NETIF_F_HW_VLAN_CTAG_FILTER)) + return 0; + if (adapter->vfinfo[vf].pf_vlan || tcs) { e_warn(drv, "VF %d attempted to override administratively set VLAN configuration\n"