Received: by 2002:a25:c205:0:0:0:0:0 with SMTP id s5csp3653051ybf; Tue, 3 Mar 2020 09:51:03 -0800 (PST) X-Google-Smtp-Source: ADFU+vsVyQMdtpodqahxpmABuRXhiDTcGTOfrbWTaCpsXLoPHo0fnjnoTAolyDiAy9hz6YrQgXZN X-Received: by 2002:a9d:554a:: with SMTP id h10mr4051233oti.344.1583257863054; Tue, 03 Mar 2020 09:51:03 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1583257863; cv=none; d=google.com; s=arc-20160816; b=syYsmojN5nmtng4RQYEdPdKru+NUQw157a3zZ4StB7UkxKOCIUYXu3b1SCUEPwTVPa JutUEZF4RtFFOlpXfB70czshRK9OV5UGrMR1WVo1KBfCZEjb235JJOCgAwdF2YinMui+ w/Zq+190AaYa4CXsTUxYTeMhNLfGwpWmliMJITfR6GBwS672gVsgeuga3MNGizRmCKUU hLsnqFXpvQhA/CVhZ58euYKTmzN5U4fyNPx+LtAwMsl0gs+6SxqojkDYha9p8NO21FSQ pSbGYbJ7v5eonpidVG/MSXwA5Ca5pueiYm0Q+UP0XNEQwMXFatPCAZ6PHyr7pkWAXtke vJ3g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=q7r1QSJC8aPPeW3kg82iB5Y0vbgP4IhHYvOp1Fu3qh0=; b=UEZoA1PMh4wSdd0pOrv7Fre4QFdVQf+sDMV6y1ERS/3q0AWjUAXnRvTAO08g3Bbg1R +8//IM+JZ85kfkHpgWqhJjOp8cwm1ddILh22saXPVXK/6zzcFx7pL/Yu5QV0qmPqzoHm NqEWWq2egWX57MV2jfOsJIyNiO+YqMPGJmla3/ZqIfxaavUihX3IN7Lr0dRL9aheeWiT opIqKvFtbmJVou3+dVhP5yM0//+GolBLE+2IVSeeSdZv0cyZraZbfTYwlu4hDT2/Km0k k3m62abacVj1iVLKgnxEwW1FutDchcPTkUqHNzQHfGuEoCQB25O9yGE3Z3X+/F9G8YXE LQIQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=H0tVnCth; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id k9si8416701oiw.262.2020.03.03.09.50.51; Tue, 03 Mar 2020 09:51:03 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=H0tVnCth; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729853AbgCCRts (ORCPT + 99 others); Tue, 3 Mar 2020 12:49:48 -0500 Received: from mail.kernel.org ([198.145.29.99]:57088 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730096AbgCCRtq (ORCPT ); Tue, 3 Mar 2020 12:49:46 -0500 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id BA4492146E; Tue, 3 Mar 2020 17:49:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1583257784; bh=4ISSmUk3GQEPzgk7PG6P3uUSjVVpssrs3uevj0Z/Es0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=H0tVnCthiY+bpvlCZcWi3Rg+k7I4vC+1FW0KYjxF1nGHgtSD3+EsrvPLm3nDshL1v GVtWILjnpeeTZiuRWb7eSlgy91VomxSLE9cvrZajGX6L5Z4ik/YGG7n+cFYOYtpbaQ SvTgGGGUqdw48Kd23ixW+Z8MIXoRE0Di8/9vl82w= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Dmitry Bezrukov , Igor Russkikh , Dmitry Bogdanov , "David S. Miller" Subject: [PATCH 5.5 127/176] net: atlantic: checksum compat issue Date: Tue, 3 Mar 2020 18:43:11 +0100 Message-Id: <20200303174319.445748656@linuxfoundation.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200303174304.593872177@linuxfoundation.org> References: <20200303174304.593872177@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Dmitry Bezrukov commit 15beab0a9d797be1b7c67458da007a62269be29a upstream. Yet another checksum offload compatibility issue was found. The known issue is that AQC HW marks tcp packets with 0xFFFF checksum as invalid (1). This is workarounded in driver, passing all the suspicious packets up to the stack for further csum validation. Another HW problem (2) is that it hides invalid csum of LRO aggregated packets inside of the individual descriptors. That was workarounded by forced scan of all LRO descriptors for checksum errors. However the scan logic was joint for both LRO and multi-descriptor packets (jumbos). And this causes the issue. We have to drop LRO packets with the detected bad checksum because of (2), but we have to pass jumbo packets to stack because of (1). When using windows tcp partner with jumbo frames but with LSO disabled driver discards such frames as bad checksummed. But only LRO frames should be dropped, not jumbos. On such a configurations tcp stream have a chance of drops and stucks. (1) 76f254d4afe2 ("net: aquantia: tcp checksum 0xffff being handled incorrectly") (2) d08b9a0a3ebd ("net: aquantia: do not pass lro session with invalid tcp checksum") Fixes: d08b9a0a3ebd ("net: aquantia: do not pass lro session with invalid tcp checksum") Signed-off-by: Dmitry Bezrukov Signed-off-by: Igor Russkikh Signed-off-by: Dmitry Bogdanov Signed-off-by: David S. Miller Signed-off-by: Greg Kroah-Hartman --- drivers/net/ethernet/aquantia/atlantic/aq_ring.c | 3 ++- drivers/net/ethernet/aquantia/atlantic/aq_ring.h | 3 ++- drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c | 5 +++-- 3 files changed, 7 insertions(+), 4 deletions(-) --- a/drivers/net/ethernet/aquantia/atlantic/aq_ring.c +++ b/drivers/net/ethernet/aquantia/atlantic/aq_ring.c @@ -351,7 +351,8 @@ int aq_ring_rx_clean(struct aq_ring_s *s err = 0; goto err_exit; } - if (buff->is_error || buff->is_cso_err) { + if (buff->is_error || + (buff->is_lro && buff->is_cso_err)) { buff_ = buff; do { next_ = buff_->next, --- a/drivers/net/ethernet/aquantia/atlantic/aq_ring.h +++ b/drivers/net/ethernet/aquantia/atlantic/aq_ring.h @@ -78,7 +78,8 @@ struct __packed aq_ring_buff_s { u32 is_cleaned:1; u32 is_error:1; u32 is_vlan:1; - u32 rsvd3:4; + u32 is_lro:1; + u32 rsvd3:3; u16 eop_index; u16 rsvd4; }; --- a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c +++ b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c @@ -823,6 +823,8 @@ static int hw_atl_b0_hw_ring_rx_receive( } } + buff->is_lro = !!(HW_ATL_B0_RXD_WB_STAT2_RSCCNT & + rxd_wb->status); if (HW_ATL_B0_RXD_WB_STAT2_EOP & rxd_wb->status) { buff->len = rxd_wb->pkt_len % AQ_CFG_RX_FRAME_MAX; @@ -835,8 +837,7 @@ static int hw_atl_b0_hw_ring_rx_receive( rxd_wb->pkt_len > AQ_CFG_RX_FRAME_MAX ? AQ_CFG_RX_FRAME_MAX : rxd_wb->pkt_len; - if (HW_ATL_B0_RXD_WB_STAT2_RSCCNT & - rxd_wb->status) { + if (buff->is_lro) { /* LRO */ buff->next = rxd_wb->next_desc_ptr; ++ring->stats.rx.lro_packets;