From patchwork Mon Mar 19 13:08:36 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Pirko X-Patchwork-Id: 147504 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 1DD6FB6EE7 for ; Tue, 20 Mar 2012 00:08:50 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758743Ab2CSNIr (ORCPT ); Mon, 19 Mar 2012 09:08:47 -0400 Received: from mx1.redhat.com ([209.132.183.28]:56509 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754219Ab2CSNIq (ORCPT ); Mon, 19 Mar 2012 09:08:46 -0400 Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q2JD8cW5018051 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 19 Mar 2012 09:08:38 -0400 Received: from localhost (minipsycho.brq.redhat.com [10.34.26.17]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id q2JD8bOT019259; Mon, 19 Mar 2012 09:08:37 -0400 Date: Mon, 19 Mar 2012 14:08:36 +0100 From: Jiri Pirko To: Ben Greear Cc: e1000-devel list , netdev Subject: Re: VLAN regression caused by: e1000: do vlan cleanup (799d531). Message-ID: <20120319130836.GD2192@minipsycho.brq.redhat.com> References: <4F5E3DCF.6010307@candelatech.com> <20120313095942.GC2239@minipsycho.brq.redhat.com> <4F5F9582.60501@candelatech.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <4F5F9582.60501@candelatech.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Tue, Mar 13, 2012 at 07:44:18PM CET, greearb@candelatech.com wrote: >On 03/13/2012 02:59 AM, Jiri Pirko wrote: >>Mon, Mar 12, 2012 at 07:17:51PM CET, greearb@candelatech.com wrote: >>>This commit breaks 802.1Q VLANs on my e1000 NIC, and it remains broken in top-of-tree >>>(as of 2 days ago, at least). >>> >>>commit 5622e4044a916de1af84bfcc4d437ce0c799d531 >>>Author: Jiri Pirko >>>Date: Thu Jul 21 03:26:31 2011 +0000 >>> >>> e1000: do vlan cleanup >>> >>> - unify vlan and nonvlan rx path >>> - kill adapter->vlgrp and e1000_vlan_rx_register >>> - allow to turn on/off rx/tx vlan accel via ethtool (set_features) >>> >>> Signed-off-by: Jiri Pirko >>> Signed-off-by: David S. Miller >>> >>> >>>My OS is RH 8, 32-bit. >>> >>>My e1000 hardware is: >>> >>>05:01.0 Ethernet controller: Intel Corporation 82546GB Gigabit Ethernet Controller (rev 03) >>> Subsystem: Intel Corporation PRO/1000 MT Dual Port Server Adapter >>> Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV+ VGASnoop- ParErr+ Stepping- SERR+ FastB2B- DisINTx- >>> Status: Cap+ 66MHz+ UDF- FastB2B- ParErr- DEVSEL=medium>TAbort-SERR->> Latency: 52 (63750ns min), Cache Line Size: 32 bytes >>> Interrupt: pin A routed to IRQ 24 >>> Region 0: Memory at d8100000 (64-bit, non-prefetchable) [size=128K] >>> Region 4: I/O ports at 3000 [size=64] >>> Capabilities: [dc] Power Management version 2 >>> Flags: PMEClk- DSI+ D1- D2- AuxCurrent=0mA PME(D0+,D1-,D2-,D3hot+,D3cold+) >>> Status: D0 PME-Enable- DSel=0 DScale=1 PME- >>> Capabilities: [e4] PCI-X non-bridge device >>> Command: DPERE- ERO+ RBC=512 OST=1 >>> Status: Dev=05:01.0 64bit+ 133MHz+ SCD- USC- DC=simple DMMRBC=2048 DMOST=1 DMCRS=16 RSCEM- 266MHz- 533MHz- >>> Capabilities: [f0] Message Signalled Interrupts: Mask- 64bit+ Queue=0/0 Enable- >>> Address: 0000000000000000 Data: 0000 >>> Kernel driver in use: e1000 >>> Kernel modules: e1000 >>> >>>05:01.1 Ethernet controller: Intel Corporation 82546GB Gigabit Ethernet Controller (rev 03) >>> Subsystem: Intel Corporation PRO/1000 MT Dual Port Server Adapter >>> Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV+ VGASnoop- ParErr+ Stepping- SERR+ FastB2B- DisINTx- >>> Status: Cap+ 66MHz+ UDF- FastB2B- ParErr- DEVSEL=medium>TAbort-SERR->> Latency: 52 (63750ns min), Cache Line Size: 32 bytes >>> Interrupt: pin B routed to IRQ 25 >>> Region 0: Memory at d8120000 (64-bit, non-prefetchable) [size=128K] >>> Region 4: I/O ports at 3040 [size=64] >>> Capabilities: [dc] Power Management version 2 >>> Flags: PMEClk- DSI+ D1- D2- AuxCurrent=0mA PME(D0+,D1-,D2-,D3hot+,D3cold+) >>> Status: D0 PME-Enable- DSel=0 DScale=1 PME- >>> Capabilities: [e4] PCI-X non-bridge device >>> Command: DPERE- ERO+ RBC=512 OST=1 >>> Status: Dev=05:01.1 64bit+ 133MHz+ SCD- USC- DC=simple DMMRBC=2048 DMOST=1 DMCRS=16 RSCEM- 266MHz- 533MHz- >>> Capabilities: [f0] Message Signalled Interrupts: Mask- 64bit+ Queue=0/0 Enable- >>> Address: 0000000000000000 Data: 0000 >>> Kernel driver in use: e1000 >>> Kernel modules: e1000 >>> >>> >>>I'm attaching ethregs output from good and bad kernels, in case that helps. >>> >>>The symptom is that pkts show up as 'ISL' instead of Ethernet frames. I'm >>>including a capture of that as well. I am sending UDP pkts from one NIC to the other, >>>on vlan 8, though because ARP fails, no UDP is ever sent. The sniff shows rcvd pkts >>>as looking funky, but it could be they are transmitted badly once they hit the NIC, >>>so I don't know if it's actually rx or tx (or both) logic that is busted at this point. >>> >>>I'm using routing rules to make send-to-self work, but the kernel is un-patched. >>> >>>Please let me know if you need additional info. I'll be happy to test patches, >>>I have a good setup to reproduce this easily. >> >>Thanks for the report Ben. >> >>It would help it you try to enable/disable vlan hw accel by ethtool to >>see if it helps. >> >>I have suspition that vlan filter must be on/offed along with vlan >>accel. > >Ok, if I disable rx-vlan-hw-parse on both NICs, traffic starts working. > >And, if I re-enable rx-vlan-hw-parse on both NICs, it continues to work. > >Maybe the initialization logic needs some fixing? Could you please try following patch? --- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/drivers/net/ethernet/intel/e1000/e1000_main.c b/drivers/net/ethernet/intel/e1000/e1000_main.c index 6419a88..b06c31c 100644 --- a/drivers/net/ethernet/intel/e1000/e1000_main.c +++ b/drivers/net/ethernet/intel/e1000/e1000_main.c @@ -164,6 +164,8 @@ static int e1000_82547_fifo_workaround(struct e1000_adapter *adapter, static bool e1000_vlan_used(struct e1000_adapter *adapter); static void e1000_vlan_mode(struct net_device *netdev, netdev_features_t features); +static void e1000_vlan_filter_on_off(struct e1000_adapter *adapter, + bool filter_on); static int e1000_vlan_rx_add_vid(struct net_device *netdev, u16 vid); static int e1000_vlan_rx_kill_vid(struct net_device *netdev, u16 vid); static void e1000_restore_vlan(struct e1000_adapter *adapter); @@ -1214,7 +1216,7 @@ static int __devinit e1000_probe(struct pci_dev *pdev, if (err) goto err_register; - e1000_vlan_mode(netdev, netdev->features); + e1000_vlan_filter_on_off(adapter, false); /* print bus type/speed/width info */ e_info(probe, "(PCI%s:%dMHz:%d-bit) %pM\n", @@ -4772,6 +4774,22 @@ static bool e1000_vlan_used(struct e1000_adapter *adapter) return false; } +static void __e1000_vlan_mode(struct e1000_adapter *adapter, + netdev_features_t features) +{ + struct e1000_hw *hw = &adapter->hw; + u32 ctrl; + + ctrl = er32(CTRL); + if (features & NETIF_F_HW_VLAN_RX) { + /* enable VLAN tag insert/strip */ + ctrl |= E1000_CTRL_VME; + } else { + /* disable VLAN tag insert/strip */ + ctrl &= ~E1000_CTRL_VME; + } + ew32(CTRL, ctrl); +} static void e1000_vlan_filter_on_off(struct e1000_adapter *adapter, bool filter_on) { @@ -4781,6 +4799,7 @@ static void e1000_vlan_filter_on_off(struct e1000_adapter *adapter, if (!test_bit(__E1000_DOWN, &adapter->flags)) e1000_irq_disable(adapter); + __e1000_vlan_mode(adapter, adapter->netdev->features); if (filter_on) { /* enable VLAN receive filtering */ rctl = er32(RCTL); @@ -4801,24 +4820,14 @@ static void e1000_vlan_filter_on_off(struct e1000_adapter *adapter, } static void e1000_vlan_mode(struct net_device *netdev, - netdev_features_t features) + netdev_features_t features) { struct e1000_adapter *adapter = netdev_priv(netdev); - struct e1000_hw *hw = &adapter->hw; - u32 ctrl; if (!test_bit(__E1000_DOWN, &adapter->flags)) e1000_irq_disable(adapter); - ctrl = er32(CTRL); - if (features & NETIF_F_HW_VLAN_RX) { - /* enable VLAN tag insert/strip */ - ctrl |= E1000_CTRL_VME; - } else { - /* disable VLAN tag insert/strip */ - ctrl &= ~E1000_CTRL_VME; - } - ew32(CTRL, ctrl); + __e1000_vlan_mode(adapter, features); if (!test_bit(__E1000_DOWN, &adapter->flags)) e1000_irq_enable(adapter);