From patchwork Tue Sep 20 06:30:01 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joel Stanley X-Patchwork-Id: 672105 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 3sdXxY6fKlz9sC7 for ; Tue, 20 Sep 2016 16:32:49 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b=E8/AEjxB; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932484AbcITGab (ORCPT ); Tue, 20 Sep 2016 02:30:31 -0400 Received: from mail-pf0-f193.google.com ([209.85.192.193]:34853 "EHLO mail-pf0-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932422AbcITGa3 (ORCPT ); Tue, 20 Sep 2016 02:30:29 -0400 Received: by mail-pf0-f193.google.com with SMTP id 6so476238pfl.2; Mon, 19 Sep 2016 23:30:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=PLX7v1IYKlAQKMkydDtj8lN7DoCMtbgHJIcx7hP2J3M=; b=E8/AEjxBFuyFtEiPa6+xslVw+BMWVG1R9NK3HHn7Lsx6IlS3dBmIL/s6y9s3Si2BKV /3vgTgNdUhjYj4uYVPPs+E/MHzcX6z9PeDKPQDuybCasab/G26Co6NUpPbly4gCtHM1W ViDV4SLitYwwPLQGmsL3yb4cy+1aAn7bIWaZ8MhUpC6W3gBkWU1ok9sVRu8X/D6XB4G9 otiDa3Q0nPTw1GAcdgCxVNuAYAgn2fOI9GoX4Elszy6xvGPhZbriXNC4a8nugrmMCylk Q2hM4LIVZB5oPfswStmrMOysRIisP8tIUubtBYqZNNbNH8F3vEDQOjCCVNzM98mxYOoC 0drw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=PLX7v1IYKlAQKMkydDtj8lN7DoCMtbgHJIcx7hP2J3M=; b=E12D+tiF0J8TmN3oFiEXKrC5xlZ6t21tD5q+ZJk2YKhWJZxcw7Ggp/Z08ayW/rsn4+ KrseYZqsOeBCVkED2nCj3H8g1pkTK2Nvom8DdB2QnAuZyLJO3SEcaawe6dtwI7KMNNol NJtYsirSlu9l43iCvlA5cX4VNwKn1n3LIURSqM/O42YbUlVvgrV0ZXC1qRrZ+ndqX5kG sBQQ4s4fTiI5sXRJdVPCtsSjHFdqDeeccWxDohE3SII1cxycKBhDMM9ulhN4D10ieM9Z DtC2eBnVE7qwRWAfEn3xoPjcE3T9mUtvbQX13q3N4z3w0NJo49/ROVq7Ab0cGTyCTIXv 4PxQ== X-Gm-Message-State: AE9vXwOHfPkbkTHBy3b1CibNhmw3Ww3LNPFs1q3xpXTVx7TxYnDMoSUAopVjGosDmrVz1w== X-Received: by 10.98.86.154 with SMTP id h26mr53159381pfj.22.1474353028429; Mon, 19 Sep 2016 23:30:28 -0700 (PDT) Received: from aurora.jms.id.au ([203.0.153.9]) by smtp.gmail.com with ESMTPSA id t5sm9411376pfi.26.2016.09.19.23.30.23 (version=TLS1 cipher=AES128-SHA bits=128/128); Mon, 19 Sep 2016 23:30:27 -0700 (PDT) Received: by aurora.jms.id.au (sSMTP sendmail emulation); Tue, 20 Sep 2016 16:00:20 +0930 From: Joel Stanley To: davem@davemloft.net Cc: Andrew Jeffery , gwshan@linux.vnet.ibm.com, andrew@lunn.ch, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, benh@kernel.crashing.org Subject: [PATCH net-next 1/7] net/faraday: Separate rx page storage from rxdesc Date: Tue, 20 Sep 2016 16:00:01 +0930 Message-Id: <20160920063007.24291-2-joel@jms.id.au> X-Mailer: git-send-email 2.9.3 In-Reply-To: <20160920063007.24291-1-joel@jms.id.au> References: <20160920063007.24291-1-joel@jms.id.au> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Andrew Jeffery The ftgmac100 hardware revision in e.g. the Aspeed AST2500 no longer reserves all bits in RXDES#2 but instead uses the bottom 16 bits to store MAC frame metadata. Avoid corruption by shifting struct page pointers out to their own member in struct ftgmac100. Signed-off-by: Andrew Jeffery Signed-off-by: Joel Stanley --- drivers/net/ethernet/faraday/ftgmac100.c | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/drivers/net/ethernet/faraday/ftgmac100.c b/drivers/net/ethernet/faraday/ftgmac100.c index 36361f8bf894..40622567159a 100644 --- a/drivers/net/ethernet/faraday/ftgmac100.c +++ b/drivers/net/ethernet/faraday/ftgmac100.c @@ -60,6 +60,8 @@ struct ftgmac100 { struct ftgmac100_descs *descs; dma_addr_t descs_dma_addr; + struct page *rx_pages[RX_QUEUE_ENTRIES]; + unsigned int rx_pointer; unsigned int tx_clean_pointer; unsigned int tx_pointer; @@ -341,18 +343,27 @@ static bool ftgmac100_rxdes_ipcs_err(struct ftgmac100_rxdes *rxdes) return rxdes->rxdes1 & cpu_to_le32(FTGMAC100_RXDES1_IP_CHKSUM_ERR); } +static inline struct page **ftgmac100_rxdes_page_slot(struct ftgmac100 *priv, + struct ftgmac100_rxdes *rxdes) +{ + return &priv->rx_pages[rxdes - priv->descs->rxdes]; +} + /* * rxdes2 is not used by hardware. We use it to keep track of page. * Since hardware does not touch it, we can skip cpu_to_le32()/le32_to_cpu(). */ -static void ftgmac100_rxdes_set_page(struct ftgmac100_rxdes *rxdes, struct page *page) +static void ftgmac100_rxdes_set_page(struct ftgmac100 *priv, + struct ftgmac100_rxdes *rxdes, + struct page *page) { - rxdes->rxdes2 = (unsigned int)page; + *ftgmac100_rxdes_page_slot(priv, rxdes) = page; } -static struct page *ftgmac100_rxdes_get_page(struct ftgmac100_rxdes *rxdes) +static struct page *ftgmac100_rxdes_get_page(struct ftgmac100 *priv, + struct ftgmac100_rxdes *rxdes) { - return (struct page *)rxdes->rxdes2; + return *ftgmac100_rxdes_page_slot(priv, rxdes); } /****************************************************************************** @@ -501,7 +512,7 @@ static bool ftgmac100_rx_packet(struct ftgmac100 *priv, int *processed) do { dma_addr_t map = ftgmac100_rxdes_get_dma_addr(rxdes); - struct page *page = ftgmac100_rxdes_get_page(rxdes); + struct page *page = ftgmac100_rxdes_get_page(priv, rxdes); unsigned int size; dma_unmap_page(priv->dev, map, RX_BUF_SIZE, DMA_FROM_DEVICE); @@ -779,7 +790,7 @@ static int ftgmac100_alloc_rx_page(struct ftgmac100 *priv, return -ENOMEM; } - ftgmac100_rxdes_set_page(rxdes, page); + ftgmac100_rxdes_set_page(priv, rxdes, page); ftgmac100_rxdes_set_dma_addr(rxdes, map); ftgmac100_rxdes_set_dma_own(rxdes); return 0; @@ -791,7 +802,7 @@ static void ftgmac100_free_buffers(struct ftgmac100 *priv) for (i = 0; i < RX_QUEUE_ENTRIES; i++) { struct ftgmac100_rxdes *rxdes = &priv->descs->rxdes[i]; - struct page *page = ftgmac100_rxdes_get_page(rxdes); + struct page *page = ftgmac100_rxdes_get_page(priv, rxdes); dma_addr_t map = ftgmac100_rxdes_get_dma_addr(rxdes); if (!page)