From patchwork Sun Jan 11 10:26:12 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Malcolm Priestley X-Patchwork-Id: 5605701 Return-Path: X-Original-To: patchwork-linux-wireless@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 4D6189F357 for ; Sun, 11 Jan 2015 10:33:40 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 3FD7F20380 for ; Sun, 11 Jan 2015 10:33:39 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 49233202E6 for ; Sun, 11 Jan 2015 10:33:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751267AbbAKKdg (ORCPT ); Sun, 11 Jan 2015 05:33:36 -0500 Received: from mail-we0-f170.google.com ([74.125.82.170]:54929 "EHLO mail-we0-f170.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751239AbbAKKdf (ORCPT ); Sun, 11 Jan 2015 05:33:35 -0500 Received: by mail-we0-f170.google.com with SMTP id w61so14563200wes.1 for ; Sun, 11 Jan 2015 02:33:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=ghoUuLanGJPM4syulXLssh+DPnm8hCDXq43SWRNUmZM=; b=0wFuTIMk88Z8n5MDWZQDg18635dZ24pWwj60ZGbpWwY3zKw2rYHSPEmStZEKXG3xue zVqxUO/y5WVEL+7D3Su7u9sLcts/752fMX53TakBglNtvs2PyL9kE4Vh+rWZiweFxvGS HnCvo4Rg1DEjgjti/UfZMrUyGjwAJH3bbKmEaDVxeWyRO4gHIakCsERXiT73x750ADsU Hioe789A2Cov5N/FK753xVxT+ej59ZMiC0i2WOCsZl35vU1vt10Xvb9oumdS/XDljdYN ChcsglhYAXOZC9IXRWcKzO/VYkUmbcbcZFjiWrLC8WiqbJ9F3SeSlq7lOdfFJa/h1VxL EBNQ== X-Received: by 10.194.83.41 with SMTP id n9mr47394929wjy.133.1420972005519; Sun, 11 Jan 2015 02:26:45 -0800 (PST) Received: from tipsey.3.home (188.29.102.125.threembb.co.uk. [188.29.102.125]) by mx.google.com with ESMTPSA id n5sm5623472wic.6.2015.01.11.02.26.40 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sun, 11 Jan 2015 02:26:44 -0800 (PST) From: Malcolm Priestley To: gregkh@linuxfoundation.org Cc: linux-wireless@vger.kernel.org, Malcolm Priestley Subject: [PATCH] staging: vt6655: [BUG] Protect MACvSelectPage1 with lock. Date: Sun, 11 Jan 2015 10:26:12 +0000 Message-Id: <1420971972-3476-1-git-send-email-tvboxspy@gmail.com> X-Mailer: git-send-email 2.1.0 Sender: linux-wireless-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org X-Spam-Status: No, score=-6.8 required=5.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_HI, T_DKIM_INVALID, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP The device must not flip to page 1 while in interrupt lock causing loss of connection or dead lock. Protect from changes to page by adding lock where user can change the page in CARDvSetRSPINF, vnt_configure and set_channel Signed-off-by: Malcolm Priestley --- drivers/staging/vt6655/card.c | 5 +++++ drivers/staging/vt6655/channel.c | 6 ++++++ drivers/staging/vt6655/device_main.c | 6 ++++++ 3 files changed, 17 insertions(+) diff --git a/drivers/staging/vt6655/card.c b/drivers/staging/vt6655/card.c index a079640..47801ca 100644 --- a/drivers/staging/vt6655/card.c +++ b/drivers/staging/vt6655/card.c @@ -670,6 +670,9 @@ void CARDvSetRSPINF(struct vnt_private *pDevice, u8 bb_type) { union vnt_phy_field_swap phy; unsigned char byTxRate, byRsvTime; /* For OFDM */ + unsigned long flags; + + spin_lock_irqsave(&pDevice->lock, flags); /* Set to Page1 */ MACvSelectPage1(pDevice->PortOffset); @@ -767,6 +770,8 @@ void CARDvSetRSPINF(struct vnt_private *pDevice, u8 bb_type) VNSvOutPortW(pDevice->PortOffset + MAC_REG_RSPINF_A_72, MAKEWORD(byTxRate, byRsvTime)); /* Set to Page0 */ MACvSelectPage0(pDevice->PortOffset); + + spin_unlock_irqrestore(&pDevice->lock, flags); } void CARDvUpdateBasicTopRate(struct vnt_private *pDevice) diff --git a/drivers/staging/vt6655/channel.c b/drivers/staging/vt6655/channel.c index 70f8705..d593f5f 100644 --- a/drivers/staging/vt6655/channel.c +++ b/drivers/staging/vt6655/channel.c @@ -210,6 +210,10 @@ bool set_channel(void *pDeviceHandler, unsigned int uConnectionChannel) BBvSoftwareReset(pDevice); if (pDevice->byLocalID > REV_ID_VT3253_B1) { + unsigned long flags; + + spin_lock_irqsave(&pDevice->lock, flags); + /* set HW default power register */ MACvSelectPage1(pDevice->PortOffset); RFbSetPower(pDevice, RATE_1M, pDevice->byCurrentCh); @@ -217,6 +221,8 @@ bool set_channel(void *pDeviceHandler, unsigned int uConnectionChannel) RFbSetPower(pDevice, RATE_6M, pDevice->byCurrentCh); VNSvOutPortB(pDevice->PortOffset + MAC_REG_PWROFDM, pDevice->byCurPwr); MACvSelectPage0(pDevice->PortOffset); + + spin_unlock_irqrestore(&pDevice->lock, flags); } if (pDevice->byBBType == BB_TYPE_11B) diff --git a/drivers/staging/vt6655/device_main.c b/drivers/staging/vt6655/device_main.c index cd1a277..d5c45f8 100644 --- a/drivers/staging/vt6655/device_main.c +++ b/drivers/staging/vt6655/device_main.c @@ -1572,6 +1572,10 @@ static void vnt_configure(struct ieee80211_hw *hw, if (changed_flags & FIF_ALLMULTI) { if (*total_flags & FIF_ALLMULTI) { + unsigned long flags; + + spin_lock_irqsave(&priv->lock, flags); + if (priv->mc_list_count > 2) { MACvSelectPage1(priv->PortOffset); @@ -1593,6 +1597,8 @@ static void vnt_configure(struct ieee80211_hw *hw, MACvSelectPage0(priv->PortOffset); } + spin_unlock_irqrestore(&priv->lock, flags); + rx_mode |= RCR_MULTICAST | RCR_BROADCAST; } else { rx_mode &= ~(RCR_MULTICAST | RCR_BROADCAST);