From nobody Thu Dec 18 12:44:50 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id A57AAC32792 for ; Tue, 23 Aug 2022 09:08:19 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1347920AbiHWJIS (ORCPT ); Tue, 23 Aug 2022 05:08:18 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57382 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1347853AbiHWJGz (ORCPT ); Tue, 23 Aug 2022 05:06:55 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [IPv6:2604:1380:4601:e00::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 80B6485FA0; Tue, 23 Aug 2022 01:30:00 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id 9E11EB81C53; Tue, 23 Aug 2022 08:29:59 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id A51D8C433C1; Tue, 23 Aug 2022 08:29:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1661243398; bh=iY9qqjm22WO0N4xaF6uRhgesbdMTjscGPIG+GsL7NKk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=VzHBD3C+zwjbIxeniVTqDKtVfPCOCTdrOIV3hNjJaWz/eJ1CUELWZxBYRRwcZbPZm ZPgTLrEjNZGK8mCvZQ4wwYOSVi+i7SvoGdV+0NDqa+cWW03ZF7qIZZgEs/bUwB108C kyLdXchM99Lpelp8uN8jvpqjegcuOgkeL3eAPd2Y= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Pavel Skripkin , Sasha Levin Subject: [PATCH 5.19 263/365] staging: r8188eu: add error handling of rtw_read32 Date: Tue, 23 Aug 2022 10:02:44 +0200 Message-Id: <20220823080129.188025708@linuxfoundation.org> X-Mailer: git-send-email 2.37.2 In-Reply-To: <20220823080118.128342613@linuxfoundation.org> References: <20220823080118.128342613@linuxfoundation.org> User-Agent: quilt/0.67 MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Pavel Skripkin [ Upstream commit b9c5e272062708680d47df433bfbfe5299ad1a63 ] rtw_read32() reads data from device via USB API which may fail. In case of any failure previous code returned stack data to callers, which is wrong. Fix it by changing rtw_read32() prototype and prevent caller from touching random stack data Signed-off-by: Pavel Skripkin Link: https://lore.kernel.org/r/583c3d21c46066275e4fc8da5ba4fd0e3679335b.16= 54629778.git.paskripkin@gmail.com Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin --- drivers/staging/r8188eu/core/rtw_cmd.c | 15 +++++- drivers/staging/r8188eu/core/rtw_efuse.c | 20 ++++--- drivers/staging/r8188eu/core/rtw_fw.c | 16 ++++-- drivers/staging/r8188eu/core/rtw_mlme_ext.c | 14 ++++- drivers/staging/r8188eu/core/rtw_pwrctrl.c | 9 +++- .../r8188eu/hal/Hal8188ERateAdaptive.c | 21 ++++++-- drivers/staging/r8188eu/hal/HalPhyRf_8188e.c | 3 +- .../staging/r8188eu/hal/rtl8188e_hal_init.c | 40 +++++++++----- drivers/staging/r8188eu/hal/rtl8188e_phycfg.c | 12 ++++- drivers/staging/r8188eu/hal/usb_halinit.c | 53 ++++++++++++++++--- drivers/staging/r8188eu/hal/usb_ops_linux.c | 13 +++-- drivers/staging/r8188eu/include/rtw_io.h | 2 +- drivers/staging/r8188eu/os_dep/ioctl_linux.c | 27 ++++++++-- drivers/staging/r8188eu/os_dep/os_intfs.c | 13 ++++- 14 files changed, 202 insertions(+), 56 deletions(-) diff --git a/drivers/staging/r8188eu/core/rtw_cmd.c b/drivers/staging/r8188= eu/core/rtw_cmd.c index 06523d91939a..5b6a891b5d67 100644 --- a/drivers/staging/r8188eu/core/rtw_cmd.c +++ b/drivers/staging/r8188eu/core/rtw_cmd.c @@ -898,8 +898,12 @@ static void traffic_status_watchdog(struct adapter *pa= dapter) static void rtl8188e_sreset_xmit_status_check(struct adapter *padapter) { u32 txdma_status; + int res; + + res =3D rtw_read32(padapter, REG_TXDMA_STATUS, &txdma_status); + if (res) + return; =20 - txdma_status =3D rtw_read32(padapter, REG_TXDMA_STATUS); if (txdma_status !=3D 0x00) rtw_write32(padapter, REG_TXDMA_STATUS, txdma_status); /* total xmit irp =3D 4 */ @@ -1177,7 +1181,14 @@ u8 rtw_ps_cmd(struct adapter *padapter) =20 static bool rtw_is_hi_queue_empty(struct adapter *adapter) { - return (rtw_read32(adapter, REG_HGQ_INFORMATION) & 0x0000ff00) =3D=3D 0; + int res; + u32 reg; + + res =3D rtw_read32(adapter, REG_HGQ_INFORMATION, ®); + if (res) + return false; + + return (reg & 0x0000ff00) =3D=3D 0; } =20 static void rtw_chk_hi_queue_hdl(struct adapter *padapter) diff --git a/drivers/staging/r8188eu/core/rtw_efuse.c b/drivers/staging/r81= 88eu/core/rtw_efuse.c index a2691c7f96f6..8005ed8d3a20 100644 --- a/drivers/staging/r8188eu/core/rtw_efuse.c +++ b/drivers/staging/r8188eu/core/rtw_efuse.c @@ -46,11 +46,17 @@ ReadEFuseByte( rtw_write8(Adapter, EFUSE_CTRL + 3, (readbyte & 0x7f)); =20 /* Check bit 32 read-ready */ - retry =3D 0; - value32 =3D rtw_read32(Adapter, EFUSE_CTRL); - while (!(((value32 >> 24) & 0xff) & 0x80) && (retry < 10000)) { - value32 =3D rtw_read32(Adapter, EFUSE_CTRL); - retry++; + res =3D rtw_read32(Adapter, EFUSE_CTRL, &value32); + if (res) + return; + + for (retry =3D 0; retry < 10000; retry++) { + res =3D rtw_read32(Adapter, EFUSE_CTRL, &value32); + if (res) + continue; + + if (((value32 >> 24) & 0xff) & 0x80) + break; } =20 /* 20100205 Joseph: Add delay suggested by SD1 Victor. */ @@ -58,7 +64,9 @@ ReadEFuseByte( /* Designer says that there shall be some delay after ready bit is set, = or the */ /* result will always stay on last data we read. */ udelay(50); - value32 =3D rtw_read32(Adapter, EFUSE_CTRL); + res =3D rtw_read32(Adapter, EFUSE_CTRL, &value32); + if (res) + return; =20 *pbuf =3D (u8)(value32 & 0xff); =20 diff --git a/drivers/staging/r8188eu/core/rtw_fw.c b/drivers/staging/r8188e= u/core/rtw_fw.c index 7cf8525595c6..04f25e0b3bca 100644 --- a/drivers/staging/r8188eu/core/rtw_fw.c +++ b/drivers/staging/r8188eu/core/rtw_fw.c @@ -194,10 +194,14 @@ static int fw_free_to_go(struct adapter *padapter) { u32 counter =3D 0; u32 value32; + int res; =20 /* polling CheckSum report */ do { - value32 =3D rtw_read32(padapter, REG_MCUFWDL); + res =3D rtw_read32(padapter, REG_MCUFWDL, &value32); + if (res) + continue; + if (value32 & FWDL_CHKSUM_RPT) break; } while (counter++ < POLLING_READY_TIMEOUT_COUNT); @@ -205,7 +209,10 @@ static int fw_free_to_go(struct adapter *padapter) if (counter >=3D POLLING_READY_TIMEOUT_COUNT) return _FAIL; =20 - value32 =3D rtw_read32(padapter, REG_MCUFWDL); + res =3D rtw_read32(padapter, REG_MCUFWDL, &value32); + if (res) + return _FAIL; + value32 |=3D MCUFWDL_RDY; value32 &=3D ~WINTINI_RDY; rtw_write32(padapter, REG_MCUFWDL, value32); @@ -215,9 +222,10 @@ static int fw_free_to_go(struct adapter *padapter) /* polling for FW ready */ counter =3D 0; do { - value32 =3D rtw_read32(padapter, REG_MCUFWDL); - if (value32 & WINTINI_RDY) + res =3D rtw_read32(padapter, REG_MCUFWDL, &value32); + if (!res && value32 & WINTINI_RDY) return _SUCCESS; + udelay(5); } while (counter++ < POLLING_READY_TIMEOUT_COUNT); =20 diff --git a/drivers/staging/r8188eu/core/rtw_mlme_ext.c b/drivers/staging/= r8188eu/core/rtw_mlme_ext.c index fdb5a8cb9d69..88a4953d31d8 100644 --- a/drivers/staging/r8188eu/core/rtw_mlme_ext.c +++ b/drivers/staging/r8188eu/core/rtw_mlme_ext.c @@ -6017,6 +6017,7 @@ static void mlme_join(struct adapter *adapter, int ty= pe) { struct mlme_priv *mlmepriv =3D &adapter->mlmepriv; u8 retry_limit =3D 0x30, reg; + u32 reg32; int res; =20 switch (type) { @@ -6025,8 +6026,12 @@ static void mlme_join(struct adapter *adapter, int t= ype) /* enable to rx data frame, accept all data frame */ rtw_write16(adapter, REG_RXFLTMAP2, 0xFFFF); =20 + res =3D rtw_read32(adapter, REG_RCR, ®32); + if (res) + return; + rtw_write32(adapter, REG_RCR, - rtw_read32(adapter, REG_RCR) | RCR_CBSSID_DATA | RCR_CBSSID_BCN); + reg32 | RCR_CBSSID_DATA | RCR_CBSSID_BCN); =20 if (check_fwstate(mlmepriv, WIFI_STATION_STATE)) { retry_limit =3D 48; @@ -6839,9 +6844,14 @@ static u8 chk_ap_is_alive(struct sta_info *psta) =20 static int rtl8188e_sreset_linked_status_check(struct adapter *padapter) { - u32 rx_dma_status =3D rtw_read32(padapter, REG_RXDMA_STATUS); + u32 rx_dma_status; + int res; u8 reg; =20 + res =3D rtw_read32(padapter, REG_RXDMA_STATUS, &rx_dma_status); + if (res) + return res; + if (rx_dma_status !=3D 0x00) rtw_write32(padapter, REG_RXDMA_STATUS, rx_dma_status); =20 diff --git a/drivers/staging/r8188eu/core/rtw_pwrctrl.c b/drivers/staging/r= 8188eu/core/rtw_pwrctrl.c index 7b816b824947..45e85b593665 100644 --- a/drivers/staging/r8188eu/core/rtw_pwrctrl.c +++ b/drivers/staging/r8188eu/core/rtw_pwrctrl.c @@ -229,6 +229,9 @@ void rtw_set_ps_mode(struct adapter *padapter, u8 ps_mo= de, u8 smart_ps, u8 bcn_a =20 static bool lps_rf_on(struct adapter *adapter) { + int res; + u32 reg; + /* When we halt NIC, we should check if FW LPS is leave. */ if (adapter->pwrctrlpriv.rf_pwrstate =3D=3D rf_off) { /* If it is in HW/SW Radio OFF or IPS state, we do not check Fw LPS Lea= ve, */ @@ -236,7 +239,11 @@ static bool lps_rf_on(struct adapter *adapter) return true; } =20 - if (rtw_read32(adapter, REG_RCR) & 0x00070000) + res =3D rtw_read32(adapter, REG_RCR, ®); + if (res) + return false; + + if (reg & 0x00070000) return false; =20 return true; diff --git a/drivers/staging/r8188eu/hal/Hal8188ERateAdaptive.c b/drivers/s= taging/r8188eu/hal/Hal8188ERateAdaptive.c index 57e8f5573846..3cefdf90d6e0 100644 --- a/drivers/staging/r8188eu/hal/Hal8188ERateAdaptive.c +++ b/drivers/staging/r8188eu/hal/Hal8188ERateAdaptive.c @@ -279,6 +279,7 @@ static int odm_ARFBRefresh_8188E(struct odm_dm_struct *= dm_odm, struct odm_ra_inf { /* Wilson 2011/10/26 */ u32 MaskFromReg; s8 i; + int res; =20 switch (pRaInfo->RateID) { case RATR_INX_WIRELESS_NGB: @@ -303,19 +304,31 @@ static int odm_ARFBRefresh_8188E(struct odm_dm_struct= *dm_odm, struct odm_ra_inf pRaInfo->RAUseRate =3D (pRaInfo->RateMask) & 0x0000000d; break; case 12: - MaskFromReg =3D rtw_read32(dm_odm->Adapter, REG_ARFR0); + res =3D rtw_read32(dm_odm->Adapter, REG_ARFR0, &MaskFromReg); + if (res) + return res; + pRaInfo->RAUseRate =3D (pRaInfo->RateMask) & MaskFromReg; break; case 13: - MaskFromReg =3D rtw_read32(dm_odm->Adapter, REG_ARFR1); + res =3D rtw_read32(dm_odm->Adapter, REG_ARFR1, &MaskFromReg); + if (res) + return res; + pRaInfo->RAUseRate =3D (pRaInfo->RateMask) & MaskFromReg; break; case 14: - MaskFromReg =3D rtw_read32(dm_odm->Adapter, REG_ARFR2); + res =3D rtw_read32(dm_odm->Adapter, REG_ARFR2, &MaskFromReg); + if (res) + return res; + pRaInfo->RAUseRate =3D (pRaInfo->RateMask) & MaskFromReg; break; case 15: - MaskFromReg =3D rtw_read32(dm_odm->Adapter, REG_ARFR3); + res =3D rtw_read32(dm_odm->Adapter, REG_ARFR3, &MaskFromReg); + if (res) + return res; + pRaInfo->RAUseRate =3D (pRaInfo->RateMask) & MaskFromReg; break; default: diff --git a/drivers/staging/r8188eu/hal/HalPhyRf_8188e.c b/drivers/staging= /r8188eu/hal/HalPhyRf_8188e.c index a5b7980dfcee..525deab10820 100644 --- a/drivers/staging/r8188eu/hal/HalPhyRf_8188e.c +++ b/drivers/staging/r8188eu/hal/HalPhyRf_8188e.c @@ -483,7 +483,8 @@ static void _PHY_SaveMACRegisters( MACBackup[i] =3D reg; } =20 - MACBackup[i] =3D rtw_read32(adapt, MACReg[i]); + res =3D rtw_read32(adapt, MACReg[i], MACBackup + i); + (void)res; } =20 static void reload_adda_reg(struct adapter *adapt, u32 *ADDAReg, u32 *ADDA= Backup, u32 RegiesterNum) diff --git a/drivers/staging/r8188eu/hal/rtl8188e_hal_init.c b/drivers/stag= ing/r8188eu/hal/rtl8188e_hal_init.c index 8215ed8b506d..5549e7be334a 100644 --- a/drivers/staging/r8188eu/hal/rtl8188e_hal_init.c +++ b/drivers/staging/r8188eu/hal/rtl8188e_hal_init.c @@ -216,6 +216,7 @@ static int efuse_read_phymap_from_txpktbuf( u16 limit =3D *size; u8 reg; u8 *pos =3D content; + u32 reg32; =20 if (bcnhead < 0) { /* if not valid */ res =3D rtw_read8(adapter, REG_TDECTRL + 1, ®); @@ -246,8 +247,17 @@ static int efuse_read_phymap_from_txpktbuf( } while (time_before(jiffies, timeout)); =20 /* data from EEPROM needs to be in LE */ - lo32 =3D cpu_to_le32(rtw_read32(adapter, REG_PKTBUF_DBG_DATA_L)); - hi32 =3D cpu_to_le32(rtw_read32(adapter, REG_PKTBUF_DBG_DATA_H)); + res =3D rtw_read32(adapter, REG_PKTBUF_DBG_DATA_L, ®32); + if (res) + return res; + + lo32 =3D cpu_to_le32(reg32); + + res =3D rtw_read32(adapter, REG_PKTBUF_DBG_DATA_H, ®32); + if (res) + return res; + + hi32 =3D cpu_to_le32(reg32); =20 if (i =3D=3D 0) { u16 reg; @@ -548,8 +558,12 @@ void rtl8188e_read_chip_version(struct adapter *padapt= er) u32 value32; struct HAL_VERSION ChipVersion; struct hal_data_8188e *pHalData =3D &padapter->haldata; + int res; + + res =3D rtw_read32(padapter, REG_SYS_CFG, &value32); + if (res) + return; =20 - value32 =3D rtw_read32(padapter, REG_SYS_CFG); ChipVersion.ChipType =3D ((value32 & RTL_ID) ? TEST_CHIP : NORMAL_CHIP); =20 ChipVersion.VendorType =3D ((value32 & VENDOR_ID) ? CHIP_VENDOR_UMC : CHI= P_VENDOR_TSMC); @@ -596,26 +610,24 @@ void hal_notch_filter_8188e(struct adapter *adapter, = bool enable) /* */ static s32 _LLTWrite(struct adapter *padapter, u32 address, u32 data) { - s32 status =3D _SUCCESS; - s32 count =3D 0; + s32 count; u32 value =3D _LLT_INIT_ADDR(address) | _LLT_INIT_DATA(data) | _LLT_OP(_L= LT_WRITE_ACCESS); u16 LLTReg =3D REG_LLT_INIT; + int res; =20 rtw_write32(padapter, LLTReg, value); =20 /* polling */ - do { - value =3D rtw_read32(padapter, LLTReg); - if (_LLT_NO_ACTIVE =3D=3D _LLT_OP_VALUE(value)) - break; + for (count =3D 0; count <=3D POLLING_LLT_THRESHOLD; count++) { + res =3D rtw_read32(padapter, LLTReg, &value); + if (res) + continue; =20 - if (count > POLLING_LLT_THRESHOLD) { - status =3D _FAIL; + if (_LLT_NO_ACTIVE =3D=3D _LLT_OP_VALUE(value)) break; - } - } while (count++); + } =20 - return status; + return count > POLLING_LLT_THRESHOLD ? _FAIL : _SUCCESS; } =20 s32 InitLLTTable(struct adapter *padapter, u8 txpktbuf_bndy) diff --git a/drivers/staging/r8188eu/hal/rtl8188e_phycfg.c b/drivers/stagin= g/r8188eu/hal/rtl8188e_phycfg.c index 298c3d9bc7be..dea6d915a1f4 100644 --- a/drivers/staging/r8188eu/hal/rtl8188e_phycfg.c +++ b/drivers/staging/r8188eu/hal/rtl8188e_phycfg.c @@ -56,8 +56,12 @@ rtl8188e_PHY_QueryBBReg( ) { u32 ReturnValue =3D 0, OriginalValue, BitShift; + int res; + + res =3D rtw_read32(Adapter, RegAddr, &OriginalValue); + if (res) + return 0; =20 - OriginalValue =3D rtw_read32(Adapter, RegAddr); BitShift =3D phy_CalculateBitShift(BitMask); ReturnValue =3D (OriginalValue & BitMask) >> BitShift; return ReturnValue; @@ -84,9 +88,13 @@ rtl8188e_PHY_QueryBBReg( void rtl8188e_PHY_SetBBReg(struct adapter *Adapter, u32 RegAddr, u32 BitMa= sk, u32 Data) { u32 OriginalValue, BitShift; + int res; =20 if (BitMask !=3D bMaskDWord) { /* if not "double word" write */ - OriginalValue =3D rtw_read32(Adapter, RegAddr); + res =3D rtw_read32(Adapter, RegAddr, &OriginalValue); + if (res) + return; + BitShift =3D phy_CalculateBitShift(BitMask); Data =3D ((OriginalValue & (~BitMask)) | (Data << BitShift)); } diff --git a/drivers/staging/r8188eu/hal/usb_halinit.c b/drivers/staging/r8= 188eu/hal/usb_halinit.c index e7b51b427e8f..0afde5038b3f 100644 --- a/drivers/staging/r8188eu/hal/usb_halinit.c +++ b/drivers/staging/r8188eu/hal/usb_halinit.c @@ -297,8 +297,12 @@ static void _InitQueuePriority(struct adapter *Adapter) static void _InitNetworkType(struct adapter *Adapter) { u32 value32; + int res; + + res =3D rtw_read32(Adapter, REG_CR, &value32); + if (res) + return; =20 - value32 =3D rtw_read32(Adapter, REG_CR); /* TODO: use the other function to set network type */ value32 =3D (value32 & ~MASK_NETTYPE) | _NETTYPE(NT_LINK_AP); =20 @@ -338,9 +342,13 @@ static void _InitAdaptiveCtrl(struct adapter *Adapter) { u16 value16; u32 value32; + int res; =20 /* Response Rate Set */ - value32 =3D rtw_read32(Adapter, REG_RRSR); + res =3D rtw_read32(Adapter, REG_RRSR, &value32); + if (res) + return; + value32 &=3D ~RATE_BITMAP_ALL; value32 |=3D RATE_RRSR_CCK_ONLY_1M; rtw_write32(Adapter, REG_RRSR, value32); @@ -409,11 +417,15 @@ static void _InitRetryFunction(struct adapter *Adapte= r) static void usb_AggSettingTxUpdate(struct adapter *Adapter) { u32 value32; + int res; =20 if (Adapter->registrypriv.wifi_spec) return; =20 - value32 =3D rtw_read32(Adapter, REG_TDECTRL); + res =3D rtw_read32(Adapter, REG_TDECTRL, &value32); + if (res) + return; + value32 =3D value32 & ~(BLK_DESC_NUM_MASK << BLK_DESC_NUM_SHIFT); value32 |=3D ((USB_TXAGG_DESC_NUM & BLK_DESC_NUM_MASK) << BLK_DESC_NUM_SH= IFT); =20 @@ -521,11 +533,17 @@ static void _BBTurnOnBlock(struct adapter *Adapter) static void _InitAntenna_Selection(struct adapter *Adapter) { struct hal_data_8188e *haldata =3D &Adapter->haldata; + int res; + u32 reg; =20 if (haldata->AntDivCfg =3D=3D 0) return; =20 - rtw_write32(Adapter, REG_LEDCFG0, rtw_read32(Adapter, REG_LEDCFG0) | BIT(= 23)); + res =3D rtw_read32(Adapter, REG_LEDCFG0, ®); + if (res) + return; + + rtw_write32(Adapter, REG_LEDCFG0, reg | BIT(23)); rtl8188e_PHY_SetBBReg(Adapter, rFPGA0_XAB_RFParameter, BIT(13), 0x01); =20 if (rtl8188e_PHY_QueryBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300) =3D= =3D Antenna_A) @@ -555,6 +573,7 @@ u32 rtl8188eu_hal_init(struct adapter *Adapter) struct hal_data_8188e *haldata =3D &Adapter->haldata; struct pwrctrl_priv *pwrctrlpriv =3D &Adapter->pwrctrlpriv; struct registry_priv *pregistrypriv =3D &Adapter->registrypriv; + u32 reg; =20 if (Adapter->pwrctrlpriv.bkeepfwalive) { if (haldata->odmpriv.RFCalibrateInfo.bIQKInitialized) { @@ -752,7 +771,11 @@ u32 rtl8188eu_hal_init(struct adapter *Adapter) rtw_write8(Adapter, REG_USB_HRPWM, 0); =20 /* ack for xmit mgmt frames. */ - rtw_write32(Adapter, REG_FWHW_TXQ_CTRL, rtw_read32(Adapter, REG_FWHW_TXQ_= CTRL) | BIT(12)); + res =3D rtw_read32(Adapter, REG_FWHW_TXQ_CTRL, ®); + if (res) + return _FAIL; + + rtw_write32(Adapter, REG_FWHW_TXQ_CTRL, reg | BIT(12)); =20 exit: return status; @@ -1121,7 +1144,12 @@ void SetHwReg8188EU(struct adapter *Adapter, u8 vari= able, u8 *val) case HW_VAR_MLME_SITESURVEY: if (*((u8 *)val)) { /* under sitesurvey */ /* config RCR to receive different BSSID & not to receive data frame */ - u32 v =3D rtw_read32(Adapter, REG_RCR); + u32 v; + + res =3D rtw_read32(Adapter, REG_RCR, &v); + if (res) + return; + v &=3D ~(RCR_CBSSID_BCN); rtw_write32(Adapter, REG_RCR, v); /* reject all data frame */ @@ -1136,6 +1164,7 @@ void SetHwReg8188EU(struct adapter *Adapter, u8 varia= ble, u8 *val) } else { /* sitesurvey done */ struct mlme_ext_priv *pmlmeext =3D &Adapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo =3D &pmlmeext->mlmext_info; + u32 reg32; =20 if ((is_client_associated_to_ap(Adapter)) || ((pmlmeinfo->state & 0x03) =3D=3D WIFI_FW_ADHOC_STATE)) { @@ -1157,7 +1186,12 @@ void SetHwReg8188EU(struct adapter *Adapter, u8 vari= able, u8 *val) =20 rtw_write8(Adapter, REG_BCN_CTRL, reg & (~BIT(4))); } - rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR) | RCR_CBSSID= _BCN); + + res =3D rtw_read32(Adapter, REG_RCR, ®32); + if (res) + return; + + rtw_write32(Adapter, REG_RCR, reg32 | RCR_CBSSID_BCN); } break; case HW_VAR_SLOT_TIME: @@ -1326,7 +1360,10 @@ void SetBeaconRelatedRegisters8188EUsb(struct adapte= r *adapt) =20 rtw_write8(adapt, REG_SLOT, 0x09); =20 - value32 =3D rtw_read32(adapt, REG_TCR); + res =3D rtw_read32(adapt, REG_TCR, &value32); + if (res) + return; + value32 &=3D ~TSFRST; rtw_write32(adapt, REG_TCR, value32); =20 diff --git a/drivers/staging/r8188eu/hal/usb_ops_linux.c b/drivers/staging/= r8188eu/hal/usb_ops_linux.c index 7d62f1f3d26e..c1a4d023f627 100644 --- a/drivers/staging/r8188eu/hal/usb_ops_linux.c +++ b/drivers/staging/r8188eu/hal/usb_ops_linux.c @@ -120,16 +120,21 @@ int __must_check rtw_read16(struct adapter *adapter, = u32 addr, u16 *data) return 0; } =20 -u32 rtw_read32(struct adapter *adapter, u32 addr) +int __must_check rtw_read32(struct adapter *adapter, u32 addr, u32 *data) { struct io_priv *io_priv =3D &adapter->iopriv; struct intf_hdl *intf =3D &io_priv->intf; u16 value =3D addr & 0xffff; - __le32 data; + __le32 le_data; + int res; =20 - usb_read(intf, value, &data, 4); + res =3D usb_read(intf, value, &le_data, 4); + if (res) + return res; =20 - return le32_to_cpu(data); + *data =3D le32_to_cpu(le_data); + + return 0; } =20 int rtw_write8(struct adapter *adapter, u32 addr, u8 val) diff --git a/drivers/staging/r8188eu/include/rtw_io.h b/drivers/staging/r81= 88eu/include/rtw_io.h index ce3369e33d66..1c6097367a67 100644 --- a/drivers/staging/r8188eu/include/rtw_io.h +++ b/drivers/staging/r8188eu/include/rtw_io.h @@ -222,7 +222,7 @@ void _rtw_attrib_write(struct adapter *adapter, u32 add= r, u32 cnt, u8 *pmem); =20 int __must_check rtw_read8(struct adapter *adapter, u32 addr, u8 *data); int __must_check rtw_read16(struct adapter *adapter, u32 addr, u16 *data); -u32 rtw_read32(struct adapter *adapter, u32 addr); +int __must_check rtw_read32(struct adapter *adapter, u32 addr, u32 *data); void _rtw_read_mem(struct adapter *adapter, u32 addr, u32 cnt, u8 *pmem); u32 rtw_read_port(struct adapter *adapter, u8 *pmem); void rtw_read_port_cancel(struct adapter *adapter); diff --git a/drivers/staging/r8188eu/os_dep/ioctl_linux.c b/drivers/staging= /r8188eu/os_dep/ioctl_linux.c index 7ec363089ae0..f486870965ac 100644 --- a/drivers/staging/r8188eu/os_dep/ioctl_linux.c +++ b/drivers/staging/r8188eu/os_dep/ioctl_linux.c @@ -3126,18 +3126,29 @@ static int rtw_rereg_nd_name(struct net_device *dev, static void mac_reg_dump(struct adapter *padapter) { int i, j =3D 1; + u32 reg; + int res; + pr_info("\n =3D=3D=3D=3D=3D=3D=3D MAC REG =3D=3D=3D=3D=3D=3D=3D\n"); for (i =3D 0x0; i < 0x300; i +=3D 4) { if (j % 4 =3D=3D 1) pr_info("0x%02x", i); - pr_info(" 0x%08x ", rtw_read32(padapter, i)); + + res =3D rtw_read32(padapter, i, ®); + if (!res) + pr_info(" 0x%08x ", reg); + if ((j++) % 4 =3D=3D 0) pr_info("\n"); } for (i =3D 0x400; i < 0x800; i +=3D 4) { if (j % 4 =3D=3D 1) pr_info("0x%02x", i); - pr_info(" 0x%08x ", rtw_read32(padapter, i)); + + res =3D rtw_read32(padapter, i, ®); + if (!res) + pr_info(" 0x%08x ", reg); + if ((j++) % 4 =3D=3D 0) pr_info("\n"); } @@ -3145,13 +3156,18 @@ static void mac_reg_dump(struct adapter *padapter) =20 static void bb_reg_dump(struct adapter *padapter) { - int i, j =3D 1; + int i, j =3D 1, res; + u32 reg; + pr_info("\n =3D=3D=3D=3D=3D=3D=3D BB REG =3D=3D=3D=3D=3D=3D=3D\n"); for (i =3D 0x800; i < 0x1000; i +=3D 4) { if (j % 4 =3D=3D 1) pr_info("0x%02x", i); =20 - pr_info(" 0x%08x ", rtw_read32(padapter, i)); + res =3D rtw_read32(padapter, i, ®); + if (!res) + pr_info(" 0x%08x ", reg); + if ((j++) % 4 =3D=3D 0) pr_info("\n"); } @@ -3398,7 +3414,8 @@ static int rtw_dbg_port(struct net_device *dev, if (rtl8188e_IOL_exec_cmds_sync(padapter, xmit_frame, 5000, 0) !=3D _SU= CCESS) ret =3D -EPERM; =20 - rtw_read32(padapter, reg); + /* FIXME: is this read necessary? */ + ret =3D rtw_read32(padapter, reg, &write_num); } break; } diff --git a/drivers/staging/r8188eu/os_dep/os_intfs.c b/drivers/staging/r8= 188eu/os_dep/os_intfs.c index d9325ef6ac28..cac9553666e6 100644 --- a/drivers/staging/r8188eu/os_dep/os_intfs.c +++ b/drivers/staging/r8188eu/os_dep/os_intfs.c @@ -741,6 +741,7 @@ static void rtw_fifo_cleanup(struct adapter *adapter) struct pwrctrl_priv *pwrpriv =3D &adapter->pwrctrlpriv; u8 trycnt =3D 100; int res; + u32 reg; =20 /* pause tx */ rtw_write8(adapter, REG_TXPAUSE, 0xff); @@ -753,10 +754,18 @@ static void rtw_fifo_cleanup(struct adapter *adapter) =20 if (!pwrpriv->bkeepfwalive) { /* RX DMA stop */ + res =3D rtw_read32(adapter, REG_RXPKT_NUM, ®); + if (res) + return; + rtw_write32(adapter, REG_RXPKT_NUM, - (rtw_read32(adapter, REG_RXPKT_NUM) | RW_RELEASE_EN)); + (reg | RW_RELEASE_EN)); do { - if (!(rtw_read32(adapter, REG_RXPKT_NUM) & RXDMA_IDLE)) + res =3D rtw_read32(adapter, REG_RXPKT_NUM, ®); + if (res) + continue; + + if (!(reg & RXDMA_IDLE)) break; } while (trycnt--); =20 --=20 2.35.1