All of lore.kernel.org
 help / color / mirror / Atom feed
From: Larry Finger <Larry.Finger@lwfinger.net>
To: andrea merello <andrea.merello@gmail.com>, linville@tuxdriver.com
Cc: linux-wireless@vger.kernel.org
Subject: Re: [PATCH 2/4]  Add error check for pci_map_single return value in rtl8180 RX path
Date: Thu, 06 Feb 2014 14:33:14 -0600	[thread overview]
Message-ID: <52F3F18A.1020301@lwfinger.net> (raw)
In-Reply-To: <1391636287-17712-3-git-send-email-andrea.merello@gmail.com>

On 02/05/2014 03:38 PM, andrea merello wrote:
> From: "andrea.merello" <andrea.merello@gmail.com>
>
> In original code the old RX DMA buffer is unmapped and processed and at the end
> of the isr a new buffer is mapped with pci_map_single and attached to the RX
> descriptor.
>
> If pci_map_single fails then the RX descriptor remains with no valid DMA buffer
> attached.
> In this condition the DMA will target where it shouldn't with obvious evil
> consequences.
>
> Simply avoiding re-arming the descriptor will prevent buggy DMA but it will
> result soon in RX stuck.
>
> This patch move the DMA mapping of the new buffer at the beginning of the ISR
> (and it adds error check for pci_map_single success/fail).
>
> If the DMA mapping fails then we do not unmap the old buffer and we re-arm the
> descriptor without processing it, with the old DMA buffer still attached.
>
> In this way we lose the currently RX-ed packet, but whenever next calls to
> pci_map_single will succeed again,then the RX process will go on without stuck.
>
> Signed-off-by: andrea.merello <andrea.merello@gmail.com>
> Signed-off-by: andrea merello <andrea.merello@gmail.com>

I have no way to test this patch, but it looks OK.

Larry

> ---
>   drivers/net/wireless/rtl818x/rtl8180/dev.c | 16 +++++++++++++---
>   1 file changed, 13 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/net/wireless/rtl818x/rtl8180/dev.c b/drivers/net/wireless/rtl818x/rtl8180/dev.c
> index 79b9398..1c6ac25 100644
> --- a/drivers/net/wireless/rtl818x/rtl8180/dev.c
> +++ b/drivers/net/wireless/rtl818x/rtl8180/dev.c
> @@ -107,6 +107,7 @@ static void rtl8180_handle_rx(struct ieee80211_hw *dev)
>   	struct rtl8180_priv *priv = dev->priv;
>   	unsigned int count = 32;
>   	u8 signal, agc, sq;
> +	dma_addr_t mapping;
>
>   	while (count--) {
>   		struct rtl8180_rx_desc *entry = &priv->rx_ring[priv->rx_idx];
> @@ -128,6 +129,17 @@ static void rtl8180_handle_rx(struct ieee80211_hw *dev)
>   			if (unlikely(!new_skb))
>   				goto done;
>
> +			mapping = pci_map_single(priv->pdev,
> +					       skb_tail_pointer(new_skb),
> +					       MAX_RX_SIZE, PCI_DMA_FROMDEVICE);
> +
> +			if (pci_dma_mapping_error(priv->pdev, mapping)) {
> +				kfree_skb(new_skb);
> +				dev_err(&priv->pdev->dev, "RX DMA map error\n");
> +
> +				goto done;
> +			}
> +
>   			pci_unmap_single(priv->pdev,
>   					 *((dma_addr_t *)skb->cb),
>   					 MAX_RX_SIZE, PCI_DMA_FROMDEVICE);
> @@ -158,9 +170,7 @@ static void rtl8180_handle_rx(struct ieee80211_hw *dev)
>
>   			skb = new_skb;
>   			priv->rx_buf[priv->rx_idx] = skb;
> -			*((dma_addr_t *) skb->cb) =
> -				pci_map_single(priv->pdev, skb_tail_pointer(skb),
> -					       MAX_RX_SIZE, PCI_DMA_FROMDEVICE);
> +			*((dma_addr_t *) skb->cb) = mapping;
>   		}
>
>   	done:
>


  reply	other threads:[~2014-02-06 20:33 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-02-05 21:38 [PATCH 0/4] rtl818x: port fixes from rtl8187se merge process andrea merello
2014-02-05 21:38 ` [PATCH 1/4] In rtl8180/rtl8187 drivers, few register bit definitions have misleading names. Fix them andrea merello
2014-02-06 20:30   ` Larry Finger
2014-02-05 21:38 ` [PATCH 2/4] Add error check for pci_map_single return value in rtl8180 RX path andrea merello
2014-02-06 20:33   ` Larry Finger [this message]
2014-02-05 21:38 ` [PATCH 3/4] Add error check for pci_map_single return value in rtl8180 TX path andrea merello
2014-02-06 20:35   ` Larry Finger
2014-02-05 21:38 ` [PATCH 4/4] Write beacon interval register when beacon interval changes andrea merello

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=52F3F18A.1020301@lwfinger.net \
    --to=larry.finger@lwfinger.net \
    --cc=andrea.merello@gmail.com \
    --cc=linux-wireless@vger.kernel.org \
    --cc=linville@tuxdriver.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.