From patchwork Fri Aug 30 21:49:28 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rob Herring X-Patchwork-Id: 271452 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 7853F2C00C4 for ; Sat, 31 Aug 2013 07:50:28 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756148Ab3H3VuM (ORCPT ); Fri, 30 Aug 2013 17:50:12 -0400 Received: from mail-oa0-f41.google.com ([209.85.219.41]:42881 "EHLO mail-oa0-f41.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756830Ab3H3VuI (ORCPT ); Fri, 30 Aug 2013 17:50:08 -0400 Received: by mail-oa0-f41.google.com with SMTP id j17so2339566oag.0 for ; Fri, 30 Aug 2013 14:50:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=bhYMagW0MaFAJP+Y+o0ZCaDT8TiZrI4Pl+RN35rgX/w=; b=DyM8lGsaVS1UgepCQa492uhGpOry56Hz0UTGwXEHbwczfOXw976rglt7q2WApsJeDc sOgVlOZW8PzX3s41HTEimT//9pRHjPk8kIrNlTO0oPgFT1wAmtV0kU+DH9Kvv+S3MFO3 6t9i16ots2Sd2aK6pwj381dSywgsI/V1y4nb+mri2rsj5hM4ti5rVd5jqSa+Kq3PQSO5 u8AYGmd7vQrYdTMwInrWrxrcjH+0tjcnRvtkwfLXBwox4yl0NHUHOF6AKND+XuFEIoAC 7p6TSYhwYzq8LZWmmkCj0QciMVwRc4IzkfQ8c7m5TRkKBj3//2uf5Sc5Y7/ItX7IPVNt zMRA== X-Received: by 10.182.106.114 with SMTP id gt18mr8464279obb.77.1377899408175; Fri, 30 Aug 2013 14:50:08 -0700 (PDT) Received: from rob-laptop.calxeda.com ([173.226.190.126]) by mx.google.com with ESMTPSA id qi5sm47974obb.6.1969.12.31.16.00.00 (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 30 Aug 2013 14:50:07 -0700 (PDT) From: Rob Herring To: netdev@vger.kernel.org Cc: Ben Hutchings , Lennert Buytenhek , Rob Herring Subject: [PATCH v3 10/11] net: calxedaxgmac: fix rx DMA mapping API size mismatches Date: Fri, 30 Aug 2013 16:49:28 -0500 Message-Id: <1377899369-23252-10-git-send-email-robherring2@gmail.com> X-Mailer: git-send-email 1.8.1.2 In-Reply-To: <1377899369-23252-1-git-send-email-robherring2@gmail.com> References: <1377899369-23252-1-git-send-email-robherring2@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Rob Herring Fix the mismatch in the DMA mapping and unmapping sizes for receive. The unmap size must be equal to the map size and should not be the actual received frame length. The map size should also be adjusted by the NET_IP_ALIGN size since the h/w buffer size (dma_buf_sz) includes this offset. Also, add a missing dma_mapping_error check in xgmac_rx_refill. Reported-by: Lennert Buytenhek Signed-off-by: Rob Herring --- drivers/net/ethernet/calxeda/xgmac.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/drivers/net/ethernet/calxeda/xgmac.c b/drivers/net/ethernet/calxeda/xgmac.c index 04c585c..cd5010b 100644 --- a/drivers/net/ethernet/calxeda/xgmac.c +++ b/drivers/net/ethernet/calxeda/xgmac.c @@ -695,9 +695,14 @@ static void xgmac_rx_refill(struct xgmac_priv *priv) if (unlikely(skb == NULL)) break; - priv->rx_skbuff[entry] = skb; paddr = dma_map_single(priv->device, skb->data, - bufsz, DMA_FROM_DEVICE); + priv->dma_buf_sz - NET_IP_ALIGN, + DMA_FROM_DEVICE); + if (dma_mapping_error(priv->device, paddr)) { + dev_kfree_skb_any(skb); + break; + } + priv->rx_skbuff[entry] = skb; desc_set_buf_addr(p, paddr, priv->dma_buf_sz); } @@ -794,13 +799,14 @@ static void xgmac_free_rx_skbufs(struct xgmac_priv *priv) return; for (i = 0; i < DMA_RX_RING_SZ; i++) { - if (priv->rx_skbuff[i] == NULL) + struct sk_buff *skb = priv->rx_skbuff[i]; + if (skb == NULL) continue; p = priv->dma_rx + i; dma_unmap_single(priv->device, desc_get_buf_addr(p), - priv->dma_buf_sz, DMA_FROM_DEVICE); - dev_kfree_skb_any(priv->rx_skbuff[i]); + priv->dma_buf_sz - NET_IP_ALIGN, DMA_FROM_DEVICE); + dev_kfree_skb_any(skb); priv->rx_skbuff[i] = NULL; } } @@ -1187,7 +1193,7 @@ static int xgmac_rx(struct xgmac_priv *priv, int limit) skb_put(skb, frame_len); dma_unmap_single(priv->device, desc_get_buf_addr(p), - frame_len, DMA_FROM_DEVICE); + priv->dma_buf_sz - NET_IP_ALIGN, DMA_FROM_DEVICE); skb->protocol = eth_type_trans(skb, priv->dev); skb->ip_summed = ip_checksum;