From patchwork Wed Jul 11 07:22:43 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: alex.bluesman.smirnov@gmail.com X-Patchwork-Id: 170377 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 691FB2C01B4 for ; Wed, 11 Jul 2012 17:27:00 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756613Ab2GKH05 (ORCPT ); Wed, 11 Jul 2012 03:26:57 -0400 Received: from mail-wi0-f172.google.com ([209.85.212.172]:55363 "EHLO mail-wi0-f172.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754158Ab2GKH0z (ORCPT ); Wed, 11 Jul 2012 03:26:55 -0400 Received: by wibhm11 with SMTP id hm11so5385691wib.1 for ; Wed, 11 Jul 2012 00:26:54 -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:x-mailer:in-reply-to:references; bh=yW5QlvhQV/+CFGSkUSYAR1L+k11ceenJ/MLrc6V5Lp0=; b=qAL8zqvq87Ln+77Wz8dyF4NOOV81+hpG7EY9s43f6q+DRJXykpjLNYg9NjSZaZLePz lX6RNDwUmu+s6j+UUA6C21l5mrOoHD059AvPvc07sx+s83VU63Jk0zQ6ImpNCjWUqjiE NXqQj524odpx1DK2MjGvudbBfeRzfKsDGkbmyPZOxnncOLRg/6rg5gm4kaeI4l8yrQXQ wy2ShxS1PixH3RuuKS2DyUCpC8iBrDoGudAJ7JGxtp5ftJWYWZoWNFHsQgG7aZZWFQXb KOtW41BGGWe+tXLeeq6vJI6NESshzDSUfL3U4SHvlxaV+TCS+7FEBoZzpGUfWAeAEvn2 9n1w== Received: by 10.180.98.69 with SMTP id eg5mr44740303wib.3.1341991614105; Wed, 11 Jul 2012 00:26:54 -0700 (PDT) Received: from localhost.localdomain ([91.213.169.4]) by mx.google.com with ESMTPS id t7sm3040238wix.6.2012.07.11.00.26.51 (version=TLSv1/SSLv3 cipher=OTHER); Wed, 11 Jul 2012 00:26:53 -0700 (PDT) From: Alexander Smirnov To: davem@davemloft.net, eric.dumazet@gmail.com Cc: netdev@vger.kernel.org, Alexander Smirnov Subject: [PATCH net-next v2 2/7] drivers/ieee802154/at86rf230: rework irq handler Date: Wed, 11 Jul 2012 11:22:43 +0400 Message-Id: <1341991368-11800-3-git-send-email-alex.bluesman.smirnov@gmail.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1341991368-11800-1-git-send-email-alex.bluesman.smirnov@gmail.com> References: <1341991368-11800-1-git-send-email-alex.bluesman.smirnov@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Fix LOCKDEP bug message for the irq handler spinlock. Make the irq processing code more explicit and stable. Signed-off-by: Alexander Smirnov --- drivers/ieee802154/at86rf230.c | 32 ++++++++++++++++++-------------- 1 files changed, 18 insertions(+), 14 deletions(-) diff --git a/drivers/ieee802154/at86rf230.c b/drivers/ieee802154/at86rf230.c index 902e38b..5d30940 100644 --- a/drivers/ieee802154/at86rf230.c +++ b/drivers/ieee802154/at86rf230.c @@ -543,6 +543,13 @@ at86rf230_xmit(struct ieee802154_dev *dev, struct sk_buff *skb) int rc; unsigned long flags; + spin_lock(&lp->lock); + if (lp->irq_disabled) { + spin_unlock(&lp->lock); + return -EBUSY; + } + spin_unlock(&lp->lock); + might_sleep(); rc = at86rf230_state(dev, STATE_FORCE_TX_ON); @@ -592,12 +599,8 @@ static int at86rf230_rx(struct at86rf230_local *lp) if (!skb) return -ENOMEM; - if (at86rf230_write_subreg(lp, SR_RX_PDT_DIS, 1) || - at86rf230_read_fbuf(lp, skb_put(skb, len), &len, &lqi) || - at86rf230_write_subreg(lp, SR_RX_SAFE_MODE, 1) || - at86rf230_write_subreg(lp, SR_RX_PDT_DIS, 0)) { + if (at86rf230_read_fbuf(lp, skb_put(skb, len), &len, &lqi)) goto err; - } if (len < 2) goto err; @@ -633,7 +636,6 @@ static void at86rf230_irqwork(struct work_struct *work) int rc; unsigned long flags; - spin_lock_irqsave(&lp->lock, flags); rc = at86rf230_read_subreg(lp, RG_IRQ_STATUS, 0xff, 0, &val); status |= val; @@ -643,31 +645,33 @@ static void at86rf230_irqwork(struct work_struct *work) status &= ~IRQ_TRX_UR; /* FIXME: possibly handle ???*/ if (status & IRQ_TRX_END) { + spin_lock_irqsave(&lp->lock, flags); status &= ~IRQ_TRX_END; if (lp->is_tx) { lp->is_tx = 0; + spin_unlock_irqrestore(&lp->lock, flags); complete(&lp->tx_complete); } else { + spin_unlock_irqrestore(&lp->lock, flags); at86rf230_rx(lp); } } - if (lp->irq_disabled) { - lp->irq_disabled = 0; - enable_irq(lp->spi->irq); - } + spin_lock_irqsave(&lp->lock, flags); + lp->irq_disabled = 0; spin_unlock_irqrestore(&lp->lock, flags); + + enable_irq(lp->spi->irq); } static irqreturn_t at86rf230_isr(int irq, void *data) { struct at86rf230_local *lp = data; + disable_irq_nosync(irq); + spin_lock(&lp->lock); - if (!lp->irq_disabled) { - disable_irq_nosync(irq); - lp->irq_disabled = 1; - } + lp->irq_disabled = 1; spin_unlock(&lp->lock); schedule_work(&lp->irqwork);