From patchwork Thu Apr 6 01:02:44 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Benjamin Herrenschmidt X-Patchwork-Id: 747575 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 3vz4G10h38z9sCX for ; Thu, 6 Apr 2017 11:03:21 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756419AbdDFBDU (ORCPT ); Wed, 5 Apr 2017 21:03:20 -0400 Received: from gate.crashing.org ([63.228.1.57]:37912 "EHLO gate.crashing.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756375AbdDFBDO (ORCPT ); Wed, 5 Apr 2017 21:03:14 -0400 Received: from pasglop.ozlabs.ibm.com (localhost.localdomain [127.0.0.1]) by gate.crashing.org (8.14.1/8.13.8) with ESMTP id v3612slh029914; Wed, 5 Apr 2017 20:02:59 -0500 From: Benjamin Herrenschmidt To: netdev@vger.kernel.org Cc: Benjamin Herrenschmidt Subject: [PATCH 02/10] ftgmac100: Drop support for fragmented receive Date: Thu, 6 Apr 2017 11:02:44 +1000 Message-Id: <20170406010252.29208-3-benh@kernel.crashing.org> X-Mailer: git-send-email 2.9.3 In-Reply-To: <20170406010252.29208-1-benh@kernel.crashing.org> References: <20170406010252.29208-1-benh@kernel.crashing.org> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org We don't support jumbo frames, we will never receive a fragmented packet, the RX buffer is always big enough, if not then it's a runaway packet that can be dropped. So take out the loop that handles such things in ftgmac100_rx_packet() which will help with subsequent simplifications and improvements to the RX path Signed-off-by: Benjamin Herrenschmidt --- drivers/net/ethernet/faraday/ftgmac100.c | 37 ++++++++++++++++---------------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/drivers/net/ethernet/faraday/ftgmac100.c b/drivers/net/ethernet/faraday/ftgmac100.c index c77a65b..ee73a57 100644 --- a/drivers/net/ethernet/faraday/ftgmac100.c +++ b/drivers/net/ethernet/faraday/ftgmac100.c @@ -532,13 +532,19 @@ static bool ftgmac100_rx_packet(struct ftgmac100 *priv, int *processed) struct net_device *netdev = priv->netdev; struct ftgmac100_rxdes *rxdes; struct sk_buff *skb; - bool done = false; + struct page *page; + unsigned int size; + dma_addr_t map; rxdes = ftgmac100_rx_locate_first_segment(priv); if (!rxdes) return false; - if (unlikely(ftgmac100_rx_packet_error(priv, rxdes))) { + /* We don't support segmented rx frames, so drop these + * along with packets with errors. + */ + if (unlikely(!ftgmac100_rxdes_last_segment(rxdes) || + ftgmac100_rx_packet_error(priv, rxdes))) { ftgmac100_rx_drop_packet(priv); return true; } @@ -565,28 +571,21 @@ static bool ftgmac100_rx_packet(struct ftgmac100 *priv, int *processed) (ftgmac100_rxdes_is_udp(rxdes) && !ftgmac100_rxdes_udpcs_err(rxdes))) skb->ip_summed = CHECKSUM_UNNECESSARY; - do { - dma_addr_t map = ftgmac100_rxdes_get_dma_addr(rxdes); - struct page *page = ftgmac100_rxdes_get_page(priv, rxdes); - unsigned int size; + map = ftgmac100_rxdes_get_dma_addr(rxdes); - dma_unmap_page(priv->dev, map, RX_BUF_SIZE, DMA_FROM_DEVICE); - - size = ftgmac100_rxdes_data_length(rxdes); - skb_fill_page_desc(skb, skb_shinfo(skb)->nr_frags, page, 0, size); + dma_unmap_page(priv->dev, map, RX_BUF_SIZE, DMA_FROM_DEVICE); - skb->len += size; - skb->data_len += size; - skb->truesize += PAGE_SIZE; + size = ftgmac100_rxdes_data_length(rxdes); + skb_fill_page_desc(skb, skb_shinfo(skb)->nr_frags, page, 0, size); - if (ftgmac100_rxdes_last_segment(rxdes)) - done = true; + skb->len += size; + skb->data_len += size; + skb->truesize += PAGE_SIZE; - ftgmac100_alloc_rx_page(priv, rxdes, GFP_ATOMIC); + ftgmac100_alloc_rx_page(priv, rxdes, GFP_ATOMIC); - ftgmac100_rx_pointer_advance(priv); - rxdes = ftgmac100_current_rxdes(priv); - } while (!done); + ftgmac100_rx_pointer_advance(priv); + rxdes = ftgmac100_current_rxdes(priv); /* Small frames are copied into linear part of skb to free one page */ if (skb->len <= 128) {