From nobody Thu May 7 21:08:47 2026 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 418EFC433F5 for ; Wed, 18 May 2022 22:12:09 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229662AbiERWMI (ORCPT ); Wed, 18 May 2022 18:12:08 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54840 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229665AbiERWMA (ORCPT ); Wed, 18 May 2022 18:12:00 -0400 Received: from mail-lf1-x133.google.com (mail-lf1-x133.google.com [IPv6:2a00:1450:4864:20::133]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B2943106A7C for ; Wed, 18 May 2022 15:11:55 -0700 (PDT) Received: by mail-lf1-x133.google.com with SMTP id bq30so5982051lfb.3 for ; Wed, 18 May 2022 15:11:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=ShEjWLHdCkNEmDqLMYUAy/x441siEBTIO9YBlH/otcw=; b=pCWwAN4ZC7E3ayvdQCb0m1pBLWWbpL/vWjaFw9TdSuC/vT0ts2JPJukLgjCVZuB+Oz GrERWJ2L1agZJBgEsIa5CpbQ9wSgvoyjD++DnP6YvLNm4k/JcCSnMmi2USGb7PZuS9P7 zoDiAH1WMWRZJ1MVOKKQ1zCiHgU3ZAA3TDPRsPzvWOD8OJV7gg27zbGqyLWbljCNOdBv fFFeJIKUDyEqI2y7EYFH2j3CZEnb2drU/KsImFfFxQxOc5RkTuY8tLMk0bXocvC2v3ZE f98sT0Ff2A7rxsjEq5XGSRaKkMYazuhVjWKHDhWKU1LlawYBnFzojSFXROcCY2mp0C5d lGOw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=ShEjWLHdCkNEmDqLMYUAy/x441siEBTIO9YBlH/otcw=; b=nGb6jwCK7C5AXSN2Lo7iujRuj+4aOAVsdo5SJlTt+oHowvn/j7NvRfJ4BzodirpYF8 vnNl2oimTUJ3/XDSmhMb8pmugJYO7sEN7mBXMC+O4wJk6EsJwzZHaOXDnPan5aLwLIwJ f+M2e+McTLEVZhpC8hHVvFNLIqYaG27S3ykqxN+0bJTgvV31t2NHwphdom92xOvNg+lk q1nm5Ag2DnTbtJxxD13M/ukPTWwiBJPvPhiBQKFDtaEH1GltONcn28iKcH0RCAZ/9UGM XfYgTVwZCIs5kc1eJswa7UHnIM6WnFl67RjSk0J4sLdgzMhPsO+AUvhiWkpD194kJnej vGuQ== X-Gm-Message-State: AOAM5333t6/xCQGD89lUxVY1gC8kjRgUdIM/SxqFTIGdyUPPto1eKCHv NVd9U1OAEgzwSuETKP9MosE= X-Google-Smtp-Source: ABdhPJwS7LQ2Ds/Ig4RjdUxQWZbdw2D3drCl6hbp7p4bVZ7aXZKOleK7aK08IwUIB0Sq/Gbt/yD3GQ== X-Received: by 2002:a05:6512:3f8b:b0:477:8c4d:30d0 with SMTP id x11-20020a0565123f8b00b004778c4d30d0mr1061392lfa.311.1652911913652; Wed, 18 May 2022 15:11:53 -0700 (PDT) Received: from localhost.localdomain ([46.235.67.4]) by smtp.gmail.com with ESMTPSA id u14-20020a056512094e00b0047255d21187sm66442lft.182.2022.05.18.15.11.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 18 May 2022 15:11:53 -0700 (PDT) From: Pavel Skripkin To: gregkh@linuxfoundation.org, Larry.Finger@lwfinger.net, phil@philpotter.co.uk, straube.linux@gmail.com, dan.carpenter@oracle.com, fmdefrancesco@gmail.com Cc: linux-kernel@vger.kernel.org, linux-staging@lists.linux.dev, Pavel Skripkin Subject: [PATCH 1/4] staging: r8188eu: add error handling of rtw_read8 Date: Thu, 19 May 2022 01:11:51 +0300 Message-Id: <1a9834b705054dcd0b0be0d929084c44a224abaa.1652911343.git.paskripkin@gmail.com> X-Mailer: git-send-email 2.36.1 In-Reply-To: References: 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" rtw_read8() 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_read8() prototype and prevent caller from touching random stack data Signed-off-by: Pavel Skripkin Reported-by: kernel test robot --- drivers/staging/r8188eu/core/rtw_efuse.c | 13 +- drivers/staging/r8188eu/core/rtw_fw.c | 46 ++++- drivers/staging/r8188eu/core/rtw_led.c | 20 ++- drivers/staging/r8188eu/core/rtw_mlme_ext.c | 49 +++++- drivers/staging/r8188eu/core/rtw_wlan_util.c | 20 ++- drivers/staging/r8188eu/hal/HalPhyRf_8188e.c | 17 +- drivers/staging/r8188eu/hal/HalPwrSeqCmd.c | 9 +- drivers/staging/r8188eu/hal/hal_com.c | 24 ++- drivers/staging/r8188eu/hal/rtl8188e_cmd.c | 37 +++- drivers/staging/r8188eu/hal/rtl8188e_dm.c | 6 +- .../staging/r8188eu/hal/rtl8188e_hal_init.c | 69 ++++++-- drivers/staging/r8188eu/hal/rtl8188e_phycfg.c | 10 +- drivers/staging/r8188eu/hal/usb_halinit.c | 159 ++++++++++++++---- drivers/staging/r8188eu/hal/usb_ops_linux.c | 7 +- drivers/staging/r8188eu/include/rtw_io.h | 2 +- drivers/staging/r8188eu/os_dep/ioctl_linux.c | 18 +- 16 files changed, 407 insertions(+), 99 deletions(-) diff --git a/drivers/staging/r8188eu/core/rtw_efuse.c b/drivers/staging/r81= 88eu/core/rtw_efuse.c index 0e0e60638880..a2691c7f96f6 100644 --- a/drivers/staging/r8188eu/core/rtw_efuse.c +++ b/drivers/staging/r8188eu/core/rtw_efuse.c @@ -28,14 +28,21 @@ ReadEFuseByte( u32 value32; u8 readbyte; u16 retry; + int res; =20 /* Write Address */ rtw_write8(Adapter, EFUSE_CTRL + 1, (_offset & 0xff)); - readbyte =3D rtw_read8(Adapter, EFUSE_CTRL + 2); + res =3D rtw_read8(Adapter, EFUSE_CTRL + 2, &readbyte); + if (res) + return; + rtw_write8(Adapter, EFUSE_CTRL + 2, ((_offset >> 8) & 0x03) | (readbyte &= 0xfc)); =20 /* Write bit 32 0 */ - readbyte =3D rtw_read8(Adapter, EFUSE_CTRL + 3); + res =3D rtw_read8(Adapter, EFUSE_CTRL + 3, &readbyte); + if (res) + return; + rtw_write8(Adapter, EFUSE_CTRL + 3, (readbyte & 0x7f)); =20 /* Check bit 32 read-ready */ @@ -54,6 +61,8 @@ ReadEFuseByte( value32 =3D rtw_read32(Adapter, EFUSE_CTRL); =20 *pbuf =3D (u8)(value32 & 0xff); + + /* FIXME: return an error to caller */ } =20 /*------------------------------------------------------------------------= ----- diff --git a/drivers/staging/r8188eu/core/rtw_fw.c b/drivers/staging/r8188e= u/core/rtw_fw.c index bf077876ed3d..701b033830bc 100644 --- a/drivers/staging/r8188eu/core/rtw_fw.c +++ b/drivers/staging/r8188eu/core/rtw_fw.c @@ -44,18 +44,28 @@ static_assert(sizeof(struct rt_firmware_hdr) =3D=3D 32); static void fw_download_enable(struct adapter *padapter, bool enable) { u8 tmp; + int res; =20 if (enable) { /* MCU firmware download enable. */ - tmp =3D rtw_read8(padapter, REG_MCUFWDL); + res =3D rtw_read8(padapter, REG_MCUFWDL, &tmp); + if (res) + return; + rtw_write8(padapter, REG_MCUFWDL, tmp | 0x01); =20 /* 8051 reset */ - tmp =3D rtw_read8(padapter, REG_MCUFWDL + 2); + res =3D rtw_read8(padapter, REG_MCUFWDL + 2, &tmp); + if (res) + return; + rtw_write8(padapter, REG_MCUFWDL + 2, tmp & 0xf7); } else { /* MCU firmware download disable. */ - tmp =3D rtw_read8(padapter, REG_MCUFWDL); + res =3D rtw_read8(padapter, REG_MCUFWDL, &tmp); + if (res) + return; + rtw_write8(padapter, REG_MCUFWDL, tmp & 0xfe); =20 /* Reserved for fw extension. */ @@ -125,8 +135,13 @@ static int page_write(struct adapter *padapter, u32 pa= ge, u8 *buffer, u32 size) { u8 value8; u8 u8Page =3D (u8)(page & 0x07); + int res; =20 - value8 =3D (rtw_read8(padapter, REG_MCUFWDL + 2) & 0xF8) | u8Page; + res =3D rtw_read8(padapter, REG_MCUFWDL + 2, &value8); + if (res) + return res; + + value8 =3D (value8 & 0xF8) | u8Page; rtw_write8(padapter, REG_MCUFWDL + 2, value8); =20 return block_write(padapter, buffer, size); @@ -165,8 +180,12 @@ static int write_fw(struct adapter *padapter, u8 *buff= er, u32 size) void rtw_reset_8051(struct adapter *padapter) { u8 val8; + int res; + + res =3D rtw_read8(padapter, REG_SYS_FUNC_EN + 1, &val8); + if (res) + return; =20 - val8 =3D rtw_read8(padapter, REG_SYS_FUNC_EN + 1); rtw_write8(padapter, REG_SYS_FUNC_EN + 1, val8 & (~BIT(2))); rtw_write8(padapter, REG_SYS_FUNC_EN + 1, val8 | (BIT(2))); } @@ -240,12 +259,14 @@ int rtl8188e_firmware_download(struct adapter *padapt= er) { int ret =3D _SUCCESS; u8 write_fw_retry =3D 0; + u8 reg; unsigned long fwdl_timeout; struct dvobj_priv *dvobj =3D adapter_to_dvobj(padapter); struct device *device =3D dvobj_to_dev(dvobj); struct rt_firmware_hdr *fwhdr =3D NULL; u8 *fw_data; u32 fw_size; + int res; =20 if (!dvobj->firmware.data) ret =3D load_firmware(&dvobj->firmware, device); @@ -269,7 +290,11 @@ int rtl8188e_firmware_download(struct adapter *padapte= r) =20 /* Suggested by Filen. If 8051 is running in RAM code, driver should inf= orm Fw to reset by itself, */ /* or it will cause download Fw fail. 2010.02.01. by tynli. */ - if (rtw_read8(padapter, REG_MCUFWDL) & RAM_DL_SEL) { /* 8051 RAM code */ + res =3D rtw_read8(padapter, REG_MCUFWDL, ®); + if (res) + goto exit; + + if (reg & RAM_DL_SEL) { /* 8051 RAM code */ rtw_write8(padapter, REG_MCUFWDL, 0x00); rtw_reset_8051(padapter); } @@ -278,7 +303,14 @@ int rtl8188e_firmware_download(struct adapter *padapte= r) fwdl_timeout =3D jiffies + msecs_to_jiffies(500); while (1) { /* reset the FWDL chksum */ - rtw_write8(padapter, REG_MCUFWDL, rtw_read8(padapter, REG_MCUFWDL) | FWD= L_CHKSUM_RPT); + res =3D rtw_read8(padapter, REG_MCUFWDL, ®); + if (res =3D=3D -ENODEV) + break; + + if (res) + continue; + + rtw_write8(padapter, REG_MCUFWDL, reg | FWDL_CHKSUM_RPT); =20 ret =3D write_fw(padapter, fw_data, fw_size); =20 diff --git a/drivers/staging/r8188eu/core/rtw_led.c b/drivers/staging/r8188= eu/core/rtw_led.c index 2f3000428af7..b532e614c5b6 100644 --- a/drivers/staging/r8188eu/core/rtw_led.c +++ b/drivers/staging/r8188eu/core/rtw_led.c @@ -34,28 +34,38 @@ static void ResetLedStatus(struct LED_871x *pLed) =20 static void SwLedOn(struct adapter *padapter, struct LED_871x *pLed) { - u8 LedCfg; + u8 LedCfg; + int res; =20 if (padapter->bSurpriseRemoved || padapter->bDriverStopped) return; =20 - LedCfg =3D rtw_read8(padapter, REG_LEDCFG2); + res =3D rtw_read8(padapter, REG_LEDCFG2, &LedCfg); + if (res) + return; + rtw_write8(padapter, REG_LEDCFG2, (LedCfg & 0xf0) | BIT(5) | BIT(6)); /* = SW control led0 on. */ pLed->bLedOn =3D true; } =20 static void SwLedOff(struct adapter *padapter, struct LED_871x *pLed) { - u8 LedCfg; + u8 LedCfg; + int res; =20 if (padapter->bSurpriseRemoved || padapter->bDriverStopped) goto exit; =20 - LedCfg =3D rtw_read8(padapter, REG_LEDCFG2);/* 0x4E */ + res =3D rtw_read8(padapter, REG_LEDCFG2, &LedCfg);/* 0x4E */ + if (res) + goto exit; =20 LedCfg &=3D 0x90; /* Set to software control. */ rtw_write8(padapter, REG_LEDCFG2, (LedCfg | BIT(3))); - LedCfg =3D rtw_read8(padapter, REG_MAC_PINMUX_CFG); + res =3D rtw_read8(padapter, REG_MAC_PINMUX_CFG, &LedCfg); + if (res) + goto exit; + LedCfg &=3D 0xFE; rtw_write8(padapter, REG_MAC_PINMUX_CFG, LedCfg); exit: diff --git a/drivers/staging/r8188eu/core/rtw_mlme_ext.c b/drivers/staging/= r8188eu/core/rtw_mlme_ext.c index 848b5051aa13..d4e59fab367c 100644 --- a/drivers/staging/r8188eu/core/rtw_mlme_ext.c +++ b/drivers/staging/r8188eu/core/rtw_mlme_ext.c @@ -5672,14 +5672,28 @@ unsigned int send_beacon(struct adapter *padapter) =20 bool get_beacon_valid_bit(struct adapter *adapter) { + int res; + u8 reg; + + res =3D rtw_read8(adapter, REG_TDECTRL + 2, ®); + if (res) + return false; + /* BIT(16) of REG_TDECTRL =3D BIT(0) of REG_TDECTRL+2 */ - return BIT(0) & rtw_read8(adapter, REG_TDECTRL + 2); + return BIT(0) & reg; } =20 void clear_beacon_valid_bit(struct adapter *adapter) { + int res; + u8 reg; + + res =3D rtw_read8(adapter, REG_TDECTRL + 2, ®); + if (res) + return; + /* BIT(16) of REG_TDECTRL =3D BIT(0) of REG_TDECTRL+2, write 1 to clear, = Clear by sw */ - rtw_write8(adapter, REG_TDECTRL + 2, rtw_read8(adapter, REG_TDECTRL + 2) = | BIT(0)); + rtw_write8(adapter, REG_TDECTRL + 2, reg | BIT(0)); } =20 /*************************************************************************= *** @@ -6007,7 +6021,8 @@ static void rtw_set_bssid(struct adapter *adapter, u8= *bssid) static void mlme_join(struct adapter *adapter, int type) { struct mlme_priv *mlmepriv =3D &adapter->mlmepriv; - u8 retry_limit =3D 0x30; + u8 retry_limit =3D 0x30, reg; + int res; =20 switch (type) { case 0: @@ -6032,7 +6047,11 @@ static void mlme_join(struct adapter *adapter, int t= ype) case 2: /* sta add event call back */ /* enable update TSF */ - rtw_write8(adapter, REG_BCN_CTRL, rtw_read8(adapter, REG_BCN_CTRL) & (~B= IT(4))); + res =3D rtw_read8(adapter, REG_BCN_CTRL, ®); + if (res) + return; + + rtw_write8(adapter, REG_BCN_CTRL, reg & (~BIT(4))); =20 if (check_fwstate(mlmepriv, WIFI_ADHOC_STATE | WIFI_ADHOC_MASTER_STATE)) retry_limit =3D 0x7; @@ -6753,6 +6772,9 @@ void mlmeext_sta_add_event_callback(struct adapter *p= adapter, struct sta_info *p =20 static void mlme_disconnect(struct adapter *adapter) { + int res; + u8 reg; + /* Set RCR to not to receive data frame when NO LINK state */ /* reject all data frames */ rtw_write16(adapter, REG_RXFLTMAP2, 0x00); @@ -6761,7 +6783,12 @@ static void mlme_disconnect(struct adapter *adapter) rtw_write8(adapter, REG_DUAL_TSF_RST, (BIT(0) | BIT(1))); =20 /* disable update TSF */ - rtw_write8(adapter, REG_BCN_CTRL, rtw_read8(adapter, REG_BCN_CTRL) | BIT(= 4)); + + res =3D rtw_read8(adapter, REG_BCN_CTRL, ®); + if (res) + return; + + rtw_write8(adapter, REG_BCN_CTRL, reg | BIT(4)); } =20 void mlmeext_sta_del_event_callback(struct adapter *padapter) @@ -6818,11 +6845,15 @@ static u8 chk_ap_is_alive(struct sta_info *psta) static void rtl8188e_sreset_linked_status_check(struct adapter *padapter) { u32 rx_dma_status =3D rtw_read32(padapter, REG_RXDMA_STATUS); + int res; + u8 reg; =20 if (rx_dma_status !=3D 0x00) rtw_write32(padapter, REG_RXDMA_STATUS, rx_dma_status); =20 - rtw_read8(padapter, REG_FMETHR); + /* FIXME: should this read be removed? */ + res =3D rtw_read8(padapter, REG_FMETHR, ®); + (void)res; } =20 void linked_status_chk(struct adapter *padapter) @@ -7224,6 +7255,7 @@ u8 disconnect_hdl(struct adapter *padapter, unsigned = char *pbuf) struct mlme_ext_info *pmlmeinfo =3D &pmlmeext->mlmext_info; struct wlan_bssid_ex *pnetwork =3D (struct wlan_bssid_ex *)(&pmlmeinfo->n= etwork); u8 val8; + int res; =20 if (is_client_associated_to_ap(padapter)) issue_deauth_ex(padapter, pnetwork->MacAddress, WLAN_REASON_DEAUTH_LEAVI= NG, param->deauth_timeout_ms / 100, 100); @@ -7236,7 +7268,10 @@ u8 disconnect_hdl(struct adapter *padapter, unsigned= char *pbuf) =20 if (((pmlmeinfo->state & 0x03) =3D=3D WIFI_FW_ADHOC_STATE) || ((pmlmeinfo= ->state & 0x03) =3D=3D WIFI_FW_AP_STATE)) { /* Stop BCN */ - val8 =3D rtw_read8(padapter, REG_BCN_CTRL); + res =3D rtw_read8(padapter, REG_BCN_CTRL, &val8); + if (res) + return H2C_DROPPED; + rtw_write8(padapter, REG_BCN_CTRL, val8 & (~(EN_BCN_FUNCTION | EN_TXBCN_= RPT))); } =20 diff --git a/drivers/staging/r8188eu/core/rtw_wlan_util.c b/drivers/staging= /r8188eu/core/rtw_wlan_util.c index 27035eac6e61..f5002c88a5ac 100644 --- a/drivers/staging/r8188eu/core/rtw_wlan_util.c +++ b/drivers/staging/r8188eu/core/rtw_wlan_util.c @@ -279,8 +279,13 @@ void Restore_DM_Func_Flag(struct adapter *padapter) void Set_MSR(struct adapter *padapter, u8 type) { u8 val8; + int res; =20 - val8 =3D rtw_read8(padapter, MSR) & 0x0c; + res =3D rtw_read8(padapter, MSR, &val8); + if (res) + return; + + val8 &=3D 0x0c; val8 |=3D type; rtw_write8(padapter, MSR, val8); } @@ -505,7 +510,11 @@ int WMM_param_handler(struct adapter *padapter, struct= ndis_802_11_var_ie *pIE) =20 static void set_acm_ctrl(struct adapter *adapter, u8 acm_mask) { - u8 acmctrl =3D rtw_read8(adapter, REG_ACMHWCTRL); + u8 acmctrl; + int res =3D rtw_read8(adapter, REG_ACMHWCTRL, &acmctrl); + + if (res) + return; =20 if (acm_mask > 1) acmctrl =3D acmctrl | 0x1; @@ -763,6 +772,7 @@ void HT_info_handler(struct adapter *padapter, struct n= dis_802_11_var_ie *pIE) static void set_min_ampdu_spacing(struct adapter *adapter, u8 spacing) { u8 sec_spacing; + int res; =20 if (spacing <=3D 7) { switch (adapter->securitypriv.dot11PrivacyAlgrthm) { @@ -784,8 +794,12 @@ static void set_min_ampdu_spacing(struct adapter *adap= ter, u8 spacing) if (spacing < sec_spacing) spacing =3D sec_spacing; =20 + res =3D rtw_read8(adapter, REG_AMPDU_MIN_SPACE, &sec_spacing); + if (res) + return; + rtw_write8(adapter, REG_AMPDU_MIN_SPACE, - (rtw_read8(adapter, REG_AMPDU_MIN_SPACE) & 0xf8) | spacing); + (sec_spacing & 0xf8) | spacing); } } =20 diff --git a/drivers/staging/r8188eu/hal/HalPhyRf_8188e.c b/drivers/staging= /r8188eu/hal/HalPhyRf_8188e.c index b944c8071a3b..aa4b4459329e 100644 --- a/drivers/staging/r8188eu/hal/HalPhyRf_8188e.c +++ b/drivers/staging/r8188eu/hal/HalPhyRf_8188e.c @@ -470,9 +470,17 @@ static void _PHY_SaveMACRegisters( ) { u32 i; + int res; =20 - for (i =3D 0; i < (IQK_MAC_REG_NUM - 1); i++) - MACBackup[i] =3D rtw_read8(adapt, MACReg[i]); + for (i =3D 0; i < (IQK_MAC_REG_NUM - 1); i++) { + u8 reg; + + res =3D rtw_read8(adapt, MACReg[i], ®); + if (res) + return; + + MACBackup[i] =3D reg; + } =20 MACBackup[i] =3D rtw_read32(adapt, MACReg[i]); } @@ -739,9 +747,12 @@ static void phy_LCCalibrate_8188E(struct adapter *adap= t) { u8 tmpreg; u32 RF_Amode =3D 0, LC_Cal; + int res; =20 /* Check continuous TX and Packet TX */ - tmpreg =3D rtw_read8(adapt, 0xd03); + res =3D rtw_read8(adapt, 0xd03, &tmpreg); + if (res) + return; =20 if ((tmpreg & 0x70) !=3D 0) /* Deal with contisuous TX case */ rtw_write8(adapt, 0xd03, tmpreg & 0x8F); /* disable all continuous TX */ diff --git a/drivers/staging/r8188eu/hal/HalPwrSeqCmd.c b/drivers/staging/r= 8188eu/hal/HalPwrSeqCmd.c index 5b91aec6a7e3..fe2fe63dbc18 100644 --- a/drivers/staging/r8188eu/hal/HalPwrSeqCmd.c +++ b/drivers/staging/r8188eu/hal/HalPwrSeqCmd.c @@ -34,6 +34,7 @@ u8 HalPwrSeqCmdParsing(struct adapter *padapter, struct w= l_pwr_cfg pwrseqcmd[]) u32 offset =3D 0; u32 poll_count =3D 0; /* polling autoload done. */ u32 max_poll_count =3D 5000; + int res; =20 do { pwrcfgcmd =3D pwrseqcmd[aryidx]; @@ -43,7 +44,9 @@ u8 HalPwrSeqCmdParsing(struct adapter *padapter, struct w= l_pwr_cfg pwrseqcmd[]) offset =3D GET_PWR_CFG_OFFSET(pwrcfgcmd); =20 /* Read the value from system register */ - value =3D rtw_read8(padapter, offset); + res =3D rtw_read8(padapter, offset, &value); + if (res) + return false; =20 value &=3D ~(GET_PWR_CFG_MASK(pwrcfgcmd)); value |=3D (GET_PWR_CFG_VALUE(pwrcfgcmd) & GET_PWR_CFG_MASK(pwrcfgcmd)); @@ -55,7 +58,9 @@ u8 HalPwrSeqCmdParsing(struct adapter *padapter, struct w= l_pwr_cfg pwrseqcmd[]) poll_bit =3D false; offset =3D GET_PWR_CFG_OFFSET(pwrcfgcmd); do { - value =3D rtw_read8(padapter, offset); + res =3D rtw_read8(padapter, offset, &value); + if (res) + return false; =20 value &=3D GET_PWR_CFG_MASK(pwrcfgcmd); if (value =3D=3D (GET_PWR_CFG_VALUE(pwrcfgcmd) & GET_PWR_CFG_MASK(pwrc= fgcmd))) diff --git a/drivers/staging/r8188eu/hal/hal_com.c b/drivers/staging/r8188e= u/hal/hal_com.c index 910cc07f656c..7717ee722cce 100644 --- a/drivers/staging/r8188eu/hal/hal_com.c +++ b/drivers/staging/r8188eu/hal/hal_com.c @@ -297,13 +297,15 @@ s32 c2h_evt_read(struct adapter *adapter, u8 *buf) { s32 ret =3D _FAIL; struct c2h_evt_hdr *c2h_evt; - int i; + int i, res; u8 trigger; =20 if (!buf) goto exit; =20 - trigger =3D rtw_read8(adapter, REG_C2HEVT_CLEAR); + res =3D rtw_read8(adapter, REG_C2HEVT_CLEAR, &trigger); + if (res) + return _FAIL; =20 if (trigger =3D=3D C2H_EVT_HOST_CLOSE) goto exit; /* Not ready */ @@ -314,13 +316,21 @@ s32 c2h_evt_read(struct adapter *adapter, u8 *buf) =20 memset(c2h_evt, 0, 16); =20 - *buf =3D rtw_read8(adapter, REG_C2HEVT_MSG_NORMAL); - *(buf + 1) =3D rtw_read8(adapter, REG_C2HEVT_MSG_NORMAL + 1); + res =3D rtw_read8(adapter, REG_C2HEVT_MSG_NORMAL, buf); + if (res) + return _FAIL; + + res =3D rtw_read8(adapter, REG_C2HEVT_MSG_NORMAL + 1, buf + 1); + if (res) + return _FAIL; =20 /* Read the content */ - for (i =3D 0; i < c2h_evt->plen; i++) - c2h_evt->payload[i] =3D rtw_read8(adapter, REG_C2HEVT_MSG_NORMAL + - sizeof(*c2h_evt) + i); + for (i =3D 0; i < c2h_evt->plen; i++) { + res =3D rtw_read8(adapter, REG_C2HEVT_MSG_NORMAL + + sizeof(*c2h_evt) + i, c2h_evt->payload + i); + if (res) + return _FAIL; + } =20 ret =3D _SUCCESS; =20 diff --git a/drivers/staging/r8188eu/hal/rtl8188e_cmd.c b/drivers/staging/r= 8188eu/hal/rtl8188e_cmd.c index 475650dc7301..b01ee1695fee 100644 --- a/drivers/staging/r8188eu/hal/rtl8188e_cmd.c +++ b/drivers/staging/r8188eu/hal/rtl8188e_cmd.c @@ -18,13 +18,18 @@ =20 static u8 _is_fw_read_cmd_down(struct adapter *adapt, u8 msgbox_num) { - u8 read_down =3D false; + u8 read_down =3D false, reg; int retry_cnts =3D 100; + int res; =20 u8 valid; =20 do { - valid =3D rtw_read8(adapt, REG_HMETFR) & BIT(msgbox_num); + res =3D rtw_read8(adapt, REG_HMETFR, ®); + if (res) + continue; + + valid =3D reg & BIT(msgbox_num); if (0 =3D=3D valid) read_down =3D true; } while ((!read_down) && (retry_cnts--)); @@ -533,6 +538,8 @@ void rtl8188e_set_FwJoinBssReport_cmd(struct adapter *a= dapt, u8 mstatus) bool bcn_valid =3D false; u8 DLBcnCount =3D 0; u32 poll =3D 0; + u8 reg; + int res; =20 if (mstatus =3D=3D 1) { /* We should set AID, correct TSF, HW seq enable before set JoinBssRepo= rt to Fw in 88/92C. */ @@ -547,8 +554,17 @@ void rtl8188e_set_FwJoinBssReport_cmd(struct adapter *= adapt, u8 mstatus) /* Disable Hw protection for a time which revserd for Hw sending beacon= . */ /* Fix download reserved page packet fail that access collision with th= e protection time. */ /* 2010.05.11. Added by tynli. */ - rtw_write8(adapt, REG_BCN_CTRL, rtw_read8(adapt, REG_BCN_CTRL) & (~BIT(3= ))); - rtw_write8(adapt, REG_BCN_CTRL, rtw_read8(adapt, REG_BCN_CTRL) | BIT(4)); + res =3D rtw_read8(adapt, REG_BCN_CTRL, ®); + if (res) + return; + + rtw_write8(adapt, REG_BCN_CTRL, reg & (~BIT(3))); + + res =3D rtw_read8(adapt, REG_BCN_CTRL, ®); + if (res) + return; + + rtw_write8(adapt, REG_BCN_CTRL, reg | BIT(4)); =20 if (haldata->RegFwHwTxQCtrl & BIT(6)) bSendBeacon =3D true; @@ -581,8 +597,17 @@ void rtl8188e_set_FwJoinBssReport_cmd(struct adapter *= adapt, u8 mstatus) /* */ =20 /* Enable Bcn */ - rtw_write8(adapt, REG_BCN_CTRL, rtw_read8(adapt, REG_BCN_CTRL) | BIT(3)); - rtw_write8(adapt, REG_BCN_CTRL, rtw_read8(adapt, REG_BCN_CTRL) & (~BIT(4= ))); + res =3D rtw_read8(adapt, REG_BCN_CTRL, ®); + if (res) + return; + + rtw_write8(adapt, REG_BCN_CTRL, reg | BIT(3)); + + res =3D rtw_read8(adapt, REG_BCN_CTRL, ®); + if (res) + return; + + rtw_write8(adapt, REG_BCN_CTRL, reg & (~BIT(4))); =20 /* To make sure that if there exists an adapter which would like to sen= d beacon. */ /* If exists, the origianl value of 0x422[6] will be 1, we should check= this to */ diff --git a/drivers/staging/r8188eu/hal/rtl8188e_dm.c b/drivers/staging/r8= 188eu/hal/rtl8188e_dm.c index 6d28e3dc0d26..0399872c4546 100644 --- a/drivers/staging/r8188eu/hal/rtl8188e_dm.c +++ b/drivers/staging/r8188eu/hal/rtl8188e_dm.c @@ -12,8 +12,12 @@ static void dm_InitGPIOSetting(struct adapter *Adapter) { u8 tmp1byte; + int res; + + res =3D rtw_read8(Adapter, REG_GPIO_MUXCFG, &tmp1byte); + if (res) + return; =20 - tmp1byte =3D rtw_read8(Adapter, REG_GPIO_MUXCFG); tmp1byte &=3D (GPIOSEL_GPIO | ~GPIOSEL_ENBT); =20 rtw_write8(Adapter, REG_GPIO_MUXCFG, tmp1byte); diff --git a/drivers/staging/r8188eu/hal/rtl8188e_hal_init.c b/drivers/stag= ing/r8188eu/hal/rtl8188e_hal_init.c index e17375a74f17..e67ecbd1ba79 100644 --- a/drivers/staging/r8188eu/hal/rtl8188e_hal_init.c +++ b/drivers/staging/r8188eu/hal/rtl8188e_hal_init.c @@ -13,10 +13,14 @@ static void iol_mode_enable(struct adapter *padapter, u8 enable) { u8 reg_0xf0 =3D 0; + int res; =20 if (enable) { /* Enable initial offload */ - reg_0xf0 =3D rtw_read8(padapter, REG_SYS_CFG); + res =3D rtw_read8(padapter, REG_SYS_CFG, ®_0xf0); + if (res) + return; + rtw_write8(padapter, REG_SYS_CFG, reg_0xf0 | SW_OFFLOAD_EN); =20 if (!padapter->bFWReady) @@ -24,7 +28,10 @@ static void iol_mode_enable(struct adapter *padapter, u8= enable) =20 } else { /* disable initial offload */ - reg_0xf0 =3D rtw_read8(padapter, REG_SYS_CFG); + res =3D rtw_read8(padapter, REG_SYS_CFG, ®_0xf0); + if (res) + return; + rtw_write8(padapter, REG_SYS_CFG, reg_0xf0 & ~SW_OFFLOAD_EN); } } @@ -34,17 +41,31 @@ static s32 iol_execute(struct adapter *padapter, u8 con= trol) s32 status =3D _FAIL; u8 reg_0x88 =3D 0; unsigned long timeout; + int res; =20 control =3D control & 0x0f; - reg_0x88 =3D rtw_read8(padapter, REG_HMEBOX_E0); + res =3D rtw_read8(padapter, REG_HMEBOX_E0, ®_0x88); + if (res) + return _FAIL; + rtw_write8(padapter, REG_HMEBOX_E0, reg_0x88 | control); =20 timeout =3D jiffies + msecs_to_jiffies(1000); - while ((reg_0x88 =3D rtw_read8(padapter, REG_HMEBOX_E0)) & control && - time_before(jiffies, timeout)) - ; =20 - reg_0x88 =3D rtw_read8(padapter, REG_HMEBOX_E0); + do { + res =3D rtw_read8(padapter, REG_HMEBOX_E0, ®_0x88); + if (res) + continue; + + if (!(reg_0x88 & control)) + break; + + } while (time_before(jiffies, timeout)); + + res =3D rtw_read8(padapter, REG_HMEBOX_E0, ®_0x88); + if (res) + return _FAIL; + status =3D (reg_0x88 & control) ? _FAIL : _SUCCESS; if (reg_0x88 & control << 4) status =3D _FAIL; @@ -190,13 +211,18 @@ static void efuse_read_phymap_from_txpktbuf( u16 dbg_addr =3D 0; __le32 lo32 =3D 0, hi32 =3D 0; u16 len =3D 0, count =3D 0; - int i =3D 0; + int i =3D 0, res; u16 limit =3D *size; - + u8 reg; u8 *pos =3D content; =20 - if (bcnhead < 0) /* if not valid */ - bcnhead =3D rtw_read8(adapter, REG_TDECTRL + 1); + if (bcnhead < 0) { /* if not valid */ + res =3D rtw_read8(adapter, REG_TDECTRL + 1, ®); + if (res) + return; + + bcnhead =3D reg; + } =20 rtw_write8(adapter, REG_PKT_BUFF_ACCESS_CTRL, TXPKT_BUF_SELECT); =20 @@ -207,8 +233,16 @@ static void efuse_read_phymap_from_txpktbuf( =20 rtw_write8(adapter, REG_TXPKTBUF_DBG, 0); timeout =3D jiffies + msecs_to_jiffies(1000); - while (!rtw_read8(adapter, REG_TXPKTBUF_DBG) && time_before(jiffies, tim= eout)) + do { + res =3D rtw_read8(adapter, REG_TXPKTBUF_DBG, ®); + if (res) + continue; + + if (reg) + break; + rtw_usleep_os(100); + } 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)); @@ -525,10 +559,17 @@ void rtl8188e_SetHalODMVar(struct adapter *Adapter, v= oid *pValue1, bool bSet) =20 void hal_notch_filter_8188e(struct adapter *adapter, bool enable) { + int res; + u8 reg; + + res =3D rtw_read8(adapter, rOFDM0_RxDSP + 1, ®); + if (res) + return; + if (enable) - rtw_write8(adapter, rOFDM0_RxDSP + 1, rtw_read8(adapter, rOFDM0_RxDSP + = 1) | BIT(1)); + rtw_write8(adapter, rOFDM0_RxDSP + 1, reg | BIT(1)); else - rtw_write8(adapter, rOFDM0_RxDSP + 1, rtw_read8(adapter, rOFDM0_RxDSP + = 1) & ~BIT(1)); + rtw_write8(adapter, rOFDM0_RxDSP + 1, reg & ~BIT(1)); } =20 /* */ diff --git a/drivers/staging/r8188eu/hal/rtl8188e_phycfg.c b/drivers/stagin= g/r8188eu/hal/rtl8188e_phycfg.c index 4864dafd887b..985339a974fc 100644 --- a/drivers/staging/r8188eu/hal/rtl8188e_phycfg.c +++ b/drivers/staging/r8188eu/hal/rtl8188e_phycfg.c @@ -594,6 +594,7 @@ _PHY_SetBWMode92C( struct hal_data_8188e *pHalData =3D &Adapter->haldata; u8 regBwOpMode; u8 regRRSR_RSC; + int res; =20 if (Adapter->bDriverStopped) return; @@ -602,8 +603,13 @@ _PHY_SetBWMode92C( /* 3<1>Set MAC register */ /* 3 */ =20 - regBwOpMode =3D rtw_read8(Adapter, REG_BWOPMODE); - regRRSR_RSC =3D rtw_read8(Adapter, REG_RRSR + 2); + res =3D rtw_read8(Adapter, REG_BWOPMODE, ®BwOpMode); + if (res) + return; + + res =3D rtw_read8(Adapter, REG_RRSR + 2, ®RRSR_RSC); + if (res) + return; =20 switch (pHalData->CurrentChannelBW) { case HT_CHANNEL_WIDTH_20: diff --git a/drivers/staging/r8188eu/hal/usb_halinit.c b/drivers/staging/r8= 188eu/hal/usb_halinit.c index b62ebd011886..6e3c8af5c4e7 100644 --- a/drivers/staging/r8188eu/hal/usb_halinit.c +++ b/drivers/staging/r8188eu/hal/usb_halinit.c @@ -81,6 +81,7 @@ static void _InitInterrupt(struct adapter *Adapter) { u32 imr, imr_ex; u8 usb_opt; + int res; =20 /* HISR write one to clear */ rtw_write32(Adapter, REG_HISR_88E, 0xFFFFFFFF); @@ -94,7 +95,9 @@ static void _InitInterrupt(struct adapter *Adapter) /* REG_USB_SPECIAL_OPTION - BIT(4) */ /* 0; Use interrupt endpoint to upload interrupt pkt */ /* 1; Use bulk endpoint to upload interrupt pkt, */ - usb_opt =3D rtw_read8(Adapter, REG_USB_SPECIAL_OPTION); + res =3D rtw_read8(Adapter, REG_USB_SPECIAL_OPTION, &usb_opt); + if (res) + return; =20 if (adapter_to_dvobj(Adapter)->pusbdev->speed =3D=3D USB_SPEED_HIGH) usb_opt =3D usb_opt | (INT_BULK_SEL); @@ -363,8 +366,12 @@ static void _InitEDCA(struct adapter *Adapter) static void _InitRetryFunction(struct adapter *Adapter) { u8 value8; + int res; + + res =3D rtw_read8(Adapter, REG_FWHW_TXQ_CTRL, &value8); + if (res) + return; =20 - value8 =3D rtw_read8(Adapter, REG_FWHW_TXQ_CTRL); value8 |=3D EN_AMPDU_RTY_NEW; rtw_write8(Adapter, REG_FWHW_TXQ_CTRL, value8); =20 @@ -423,9 +430,15 @@ usb_AggSettingRxUpdate( { u8 valueDMA; u8 valueUSB; + int res; =20 - valueDMA =3D rtw_read8(Adapter, REG_TRXDMA_CTRL); - valueUSB =3D rtw_read8(Adapter, REG_USB_SPECIAL_OPTION); + res =3D rtw_read8(Adapter, REG_TRXDMA_CTRL, &valueDMA); + if (res) + return; + + res =3D rtw_read8(Adapter, REG_USB_SPECIAL_OPTION, &valueUSB); + if (res) + return; =20 valueDMA |=3D RXDMA_AGG_EN; valueUSB &=3D ~USB_AGG_EN; @@ -449,6 +462,7 @@ static void InitUsbAggregationSetting(struct adapter *A= dapter) static void _InitBeaconParameters(struct adapter *Adapter) { struct hal_data_8188e *haldata =3D &Adapter->haldata; + int res; =20 rtw_write16(Adapter, REG_BCN_CTRL, 0x1010); =20 @@ -461,9 +475,10 @@ static void _InitBeaconParameters(struct adapter *Adap= ter) /* beacause test chip does not contension before sending beacon. by tynl= i. 2009.11.03 */ rtw_write16(Adapter, REG_BCNTCFG, 0x660F); =20 - haldata->RegFwHwTxQCtrl =3D rtw_read8(Adapter, REG_FWHW_TXQ_CTRL + 2); - haldata->RegReg542 =3D rtw_read8(Adapter, REG_TBTT_PROHIBIT + 2); - haldata->RegCR_1 =3D rtw_read8(Adapter, REG_CR + 1); + /* FIXME: return an error to caller */ + res =3D rtw_read8(Adapter, REG_FWHW_TXQ_CTRL + 2, &haldata->RegFwHwTxQCtr= l); + res =3D rtw_read8(Adapter, REG_TBTT_PROHIBIT + 2, &haldata->RegReg542); + res =3D rtw_read8(Adapter, REG_CR + 1, &haldata->RegCR_1); } =20 static void _BeaconFunctionEnable(struct adapter *Adapter, @@ -514,6 +529,7 @@ u32 rtl8188eu_hal_init(struct adapter *Adapter) u16 value16; u8 txpktbuf_bndy; u32 status =3D _SUCCESS; + int res; struct hal_data_8188e *haldata =3D &Adapter->haldata; struct pwrctrl_priv *pwrctrlpriv =3D &Adapter->pwrctrlpriv; struct registry_priv *pregistrypriv =3D &Adapter->registrypriv; @@ -620,7 +636,10 @@ u32 rtl8188eu_hal_init(struct adapter *Adapter) =20 /* Enable TX Report */ /* Enable Tx Report Timer */ - value8 =3D rtw_read8(Adapter, REG_TX_RPT_CTRL); + res =3D rtw_read8(Adapter, REG_TX_RPT_CTRL, &value8); + if (res) + return _FAIL; + rtw_write8(Adapter, REG_TX_RPT_CTRL, (value8 | BIT(1) | BIT(0))); /* Set MAX RPT MACID */ rtw_write8(Adapter, REG_TX_RPT_CTRL + 1, 2);/* FOR sta mode ,0: bc/mc ,1= :AP */ @@ -714,9 +733,13 @@ static void CardDisableRTL8188EU(struct adapter *Adapt= er) { u8 val8; struct hal_data_8188e *haldata =3D &Adapter->haldata; + int res; =20 /* Stop Tx Report Timer. 0x4EC[Bit1]=3Db'0 */ - val8 =3D rtw_read8(Adapter, REG_TX_RPT_CTRL); + res =3D rtw_read8(Adapter, REG_TX_RPT_CTRL, &val8); + if (res) + return; + rtw_write8(Adapter, REG_TX_RPT_CTRL, val8 & (~BIT(1))); =20 /* stop rx */ @@ -727,10 +750,16 @@ static void CardDisableRTL8188EU(struct adapter *Adap= ter) =20 /* 2. 0x1F[7:0] =3D 0 turn off RF */ =20 - val8 =3D rtw_read8(Adapter, REG_MCUFWDL); + res =3D rtw_read8(Adapter, REG_MCUFWDL, &val8); + if (res) + return; + if ((val8 & RAM_DL_SEL) && Adapter->bFWReady) { /* 8051 RAM code */ /* Reset MCU 0x2[10]=3D0. */ - val8 =3D rtw_read8(Adapter, REG_SYS_FUNC_EN + 1); + res =3D rtw_read8(Adapter, REG_SYS_FUNC_EN + 1, &val8); + if (res) + return; + val8 &=3D ~BIT(2); /* 0x2[10], FEN_CPUEN */ rtw_write8(Adapter, REG_SYS_FUNC_EN + 1, val8); } @@ -740,26 +769,45 @@ static void CardDisableRTL8188EU(struct adapter *Adap= ter) =20 /* YJ,add,111212 */ /* Disable 32k */ - val8 =3D rtw_read8(Adapter, REG_32K_CTRL); + res =3D rtw_read8(Adapter, REG_32K_CTRL, &val8); + if (res) + return; + rtw_write8(Adapter, REG_32K_CTRL, val8 & (~BIT(0))); =20 /* Card disable power action flow */ HalPwrSeqCmdParsing(Adapter, Rtl8188E_NIC_DISABLE_FLOW); =20 /* Reset MCU IO Wrapper */ - val8 =3D rtw_read8(Adapter, REG_RSV_CTRL + 1); + res =3D rtw_read8(Adapter, REG_RSV_CTRL + 1, &val8); + if (res) + return; + rtw_write8(Adapter, REG_RSV_CTRL + 1, (val8 & (~BIT(3)))); - val8 =3D rtw_read8(Adapter, REG_RSV_CTRL + 1); + + res =3D rtw_read8(Adapter, REG_RSV_CTRL + 1, &val8); + if (res) + return; + rtw_write8(Adapter, REG_RSV_CTRL + 1, val8 | BIT(3)); =20 /* YJ,test add, 111207. For Power Consumption. */ - val8 =3D rtw_read8(Adapter, GPIO_IN); + res =3D rtw_read8(Adapter, GPIO_IN, &val8); + if (res) + return; + rtw_write8(Adapter, GPIO_OUT, val8); rtw_write8(Adapter, GPIO_IO_SEL, 0xFF);/* Reg0x46 */ =20 - val8 =3D rtw_read8(Adapter, REG_GPIO_IO_SEL); + res =3D rtw_read8(Adapter, REG_GPIO_IO_SEL, &val8); + if (res) + return; + rtw_write8(Adapter, REG_GPIO_IO_SEL, (val8 << 4)); - val8 =3D rtw_read8(Adapter, REG_GPIO_IO_SEL + 1); + res =3D rtw_read8(Adapter, REG_GPIO_IO_SEL + 1, &val8); + if (res) + return; + rtw_write8(Adapter, REG_GPIO_IO_SEL + 1, val8 | 0x0F);/* Reg0x43 */ rtw_write32(Adapter, REG_BB_PAD_CTRL, 0x00080808);/* set LNA ,TRSW,EX_PA = Pin to output mode */ haldata->bMacPwrCtrlOn =3D false; @@ -830,9 +878,13 @@ void ReadAdapterInfo8188EU(struct adapter *Adapter) struct eeprom_priv *eeprom =3D &Adapter->eeprompriv; struct led_priv *ledpriv =3D &Adapter->ledpriv; u8 eeValue; + int res; =20 /* check system boot selection */ - eeValue =3D rtw_read8(Adapter, REG_9346CR); + res =3D rtw_read8(Adapter, REG_9346CR, &eeValue); + if (res) + return; + eeprom->EepromOrEfuse =3D (eeValue & BOOT_FROM_EEPROM); eeprom->bautoload_fail_flag =3D !(eeValue & EEPROM_EN); =20 @@ -887,12 +939,21 @@ static void hw_var_set_opmode(struct adapter *Adapter= , u8 *val) { u8 val8; u8 mode =3D *((u8 *)val); + int res; =20 /* disable Port0 TSF update */ - rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL) | BIT(= 4)); + res =3D rtw_read8(Adapter, REG_BCN_CTRL, &val8); + if (res) + return; + + rtw_write8(Adapter, REG_BCN_CTRL, val8 | BIT(4)); =20 /* set net_type */ - val8 =3D rtw_read8(Adapter, MSR) & 0x0c; + res =3D rtw_read8(Adapter, MSR, &val8); + if (res) + return; + + val8 &=3D 0x0c; val8 |=3D mode; rtw_write8(Adapter, MSR, val8); =20 @@ -927,14 +988,22 @@ static void hw_var_set_opmode(struct adapter *Adapter= , u8 *val) rtw_write8(Adapter, REG_DUAL_TSF_RST, BIT(0)); =20 /* BIT(3) - If set 0, hw will clr bcnq when tx becon ok/fail or port 0 */ - rtw_write8(Adapter, REG_MBID_NUM, rtw_read8(Adapter, REG_MBID_NUM) | BIT= (3) | BIT(4)); + res =3D rtw_read8(Adapter, REG_MBID_NUM, &val8); + if (res) + return; + + rtw_write8(Adapter, REG_MBID_NUM, val8 | BIT(3) | BIT(4)); =20 /* enable BCN0 Function for if1 */ /* don't enable update TSF0 for if1 (due to TSF update when beacon/probe= rsp are received) */ rtw_write8(Adapter, REG_BCN_CTRL, (DIS_TSF_UDT0_NORMAL_CHIP | EN_BCN_FUN= CTION | BIT(1))); =20 /* dis BCN1 ATIM WND if if2 is station */ - rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1) |= BIT(0)); + res =3D rtw_read8(Adapter, REG_BCN_CTRL_1, &val8); + if (res) + return; + + rtw_write8(Adapter, REG_BCN_CTRL_1, val8 | BIT(0)); } } =20 @@ -943,6 +1012,8 @@ void SetHwReg8188EU(struct adapter *Adapter, u8 variab= le, u8 *val) struct hal_data_8188e *haldata =3D &Adapter->haldata; struct dm_priv *pdmpriv =3D &haldata->dmpriv; struct odm_dm_struct *podmpriv =3D &haldata->odmpriv; + u8 reg; + int res; =20 switch (variable) { case HW_VAR_SET_OPMODE: @@ -970,7 +1041,11 @@ void SetHwReg8188EU(struct adapter *Adapter, u8 varia= ble, u8 *val) /* Set RRSR rate table. */ rtw_write8(Adapter, REG_RRSR, BrateCfg & 0xff); rtw_write8(Adapter, REG_RRSR + 1, (BrateCfg >> 8) & 0xff); - rtw_write8(Adapter, REG_RRSR + 2, rtw_read8(Adapter, REG_RRSR + 2) & 0x= f0); + res =3D rtw_read8(Adapter, REG_RRSR + 2, ®); + if (res) + return; + + rtw_write8(Adapter, REG_RRSR + 2, reg & 0xf0); =20 /* Set RTS initial rate */ while (BrateCfg > 0x1) { @@ -994,13 +1069,21 @@ void SetHwReg8188EU(struct adapter *Adapter, u8 vari= able, u8 *val) StopTxBeacon(Adapter); =20 /* disable related TSF function */ - rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL) & (~= BIT(3))); + res =3D rtw_read8(Adapter, REG_BCN_CTRL, ®); + if (res) + return; + + rtw_write8(Adapter, REG_BCN_CTRL, reg & (~BIT(3))); =20 rtw_write32(Adapter, REG_TSFTR, tsf); rtw_write32(Adapter, REG_TSFTR + 4, tsf >> 32); =20 /* enable related TSF function */ - rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL) | BI= T(3)); + res =3D rtw_read8(Adapter, REG_BCN_CTRL, ®); + if (res) + return; + + rtw_write8(Adapter, REG_BCN_CTRL, reg | BIT(3)); =20 if (((pmlmeinfo->state & 0x03) =3D=3D WIFI_FW_ADHOC_STATE) || ((pmlmein= fo->state & 0x03) =3D=3D WIFI_FW_AP_STATE)) ResumeTxBeacon(Adapter); @@ -1016,7 +1099,11 @@ void SetHwReg8188EU(struct adapter *Adapter, u8 vari= able, u8 *val) rtw_write16(Adapter, REG_RXFLTMAP2, 0x00); =20 /* disable update TSF */ - rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL) | BI= T(4)); + res =3D rtw_read8(Adapter, REG_BCN_CTRL, ®); + if (res) + return; + + rtw_write8(Adapter, REG_BCN_CTRL, reg | BIT(4)); } else { /* sitesurvey done */ struct mlme_ext_priv *pmlmeext =3D &Adapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo =3D &pmlmeext->mlmext_info; @@ -1027,11 +1114,19 @@ void SetHwReg8188EU(struct adapter *Adapter, u8 var= iable, u8 *val) rtw_write16(Adapter, REG_RXFLTMAP2, 0xFFFF); =20 /* enable update TSF */ - rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL) & (= ~BIT(4))); + res =3D rtw_read8(Adapter, REG_BCN_CTRL, ®); + if (res) + return; + + rtw_write8(Adapter, REG_BCN_CTRL, reg & (~BIT(4))); } else if ((pmlmeinfo->state & 0x03) =3D=3D WIFI_FW_AP_STATE) { rtw_write16(Adapter, REG_RXFLTMAP2, 0xFFFF); /* enable update TSF */ - rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL) & (= ~BIT(4))); + res =3D rtw_read8(Adapter, REG_BCN_CTRL, ®); + if (res) + return; + + rtw_write8(Adapter, REG_BCN_CTRL, reg & (~BIT(4))); } rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR) | RCR_CBSSID= _BCN); } @@ -1194,6 +1289,8 @@ void SetBeaconRelatedRegisters8188EUsb(struct adapter= *adapt) struct mlme_ext_priv *pmlmeext =3D &adapt->mlmeextpriv; struct mlme_ext_info *pmlmeinfo =3D &pmlmeext->mlmext_info; u32 bcn_ctrl_reg =3D REG_BCN_CTRL; + int res; + u8 reg; /* reset TSF, enable update TSF, correcting TSF On Beacon */ =20 /* BCN interval */ @@ -1219,7 +1316,11 @@ void SetBeaconRelatedRegisters8188EUsb(struct adapte= r *adapt) =20 ResumeTxBeacon(adapt); =20 - rtw_write8(adapt, bcn_ctrl_reg, rtw_read8(adapt, bcn_ctrl_reg) | BIT(1)); + res =3D rtw_read8(adapt, bcn_ctrl_reg, ®); + if (res) + return; + + rtw_write8(adapt, bcn_ctrl_reg, reg | BIT(1)); } =20 void rtl8188eu_init_default_value(struct adapter *adapt) diff --git a/drivers/staging/r8188eu/hal/usb_ops_linux.c b/drivers/staging/= r8188eu/hal/usb_ops_linux.c index d5e674542a78..f399a7fd8b97 100644 --- a/drivers/staging/r8188eu/hal/usb_ops_linux.c +++ b/drivers/staging/r8188eu/hal/usb_ops_linux.c @@ -94,16 +94,13 @@ static int usb_write(struct intf_hdl *intf, u16 value, = void *data, u8 size) return status; } =20 -u8 rtw_read8(struct adapter *adapter, u32 addr) +int __must_check rtw_read8(struct adapter *adapter, u32 addr, u8 *data) { struct io_priv *io_priv =3D &adapter->iopriv; struct intf_hdl *intf =3D &io_priv->intf; u16 value =3D addr & 0xffff; - u8 data; =20 - usb_read(intf, value, &data, 1); - - return data; + return usb_read(intf, value, data, 1); } =20 u16 rtw_read16(struct adapter *adapter, u32 addr) diff --git a/drivers/staging/r8188eu/include/rtw_io.h b/drivers/staging/r81= 88eu/include/rtw_io.h index 6910e2b430e2..1198d3850a6d 100644 --- a/drivers/staging/r8188eu/include/rtw_io.h +++ b/drivers/staging/r8188eu/include/rtw_io.h @@ -220,7 +220,7 @@ void unregister_intf_hdl(struct intf_hdl *pintfhdl); void _rtw_attrib_read(struct adapter *adapter, u32 addr, u32 cnt, u8 *pmem= ); void _rtw_attrib_write(struct adapter *adapter, u32 addr, u32 cnt, u8 *pme= m); =20 -u8 rtw_read8(struct adapter *adapter, u32 addr); +int __must_check rtw_read8(struct adapter *adapter, u32 addr, u8 *data); u16 rtw_read16(struct adapter *adapter, u32 addr); u32 rtw_read32(struct adapter *adapter, u32 addr); void _rtw_read_mem(struct adapter *adapter, u32 addr, u32 cnt, u8 *pmem); diff --git a/drivers/staging/r8188eu/os_dep/ioctl_linux.c b/drivers/staging= /r8188eu/os_dep/ioctl_linux.c index 42cb79cee2ae..66aac2cbe3a9 100644 --- a/drivers/staging/r8188eu/os_dep/ioctl_linux.c +++ b/drivers/staging/r8188eu/os_dep/ioctl_linux.c @@ -1912,8 +1912,11 @@ static int rtw_wx_read32(struct net_device *dev, =20 switch (bytes) { case 1: - data32 =3D rtw_read8(padapter, addr); - sprintf(extra, "0x%02X", data32); + ret =3D rtw_read8(padapter, addr, (u8 *) &data32); + if (ret) + goto err_free_ptmp; + + sprintf(extra, "0x%02X", data32 & 0xff); break; case 2: data32 =3D rtw_read16(padapter, addr); @@ -3259,6 +3262,7 @@ static void rtw_set_dynamic_functions(struct adapter = *adapter, u8 dm_func) { struct hal_data_8188e *haldata =3D &adapter->haldata; struct odm_dm_struct *odmpriv =3D &haldata->odmpriv; + int res; =20 switch (dm_func) { case 0: @@ -3274,7 +3278,9 @@ static void rtw_set_dynamic_functions(struct adapter = *adapter, u8 dm_func) if (!(odmpriv->SupportAbility & DYNAMIC_BB_DIG)) { struct rtw_dig *digtable =3D &odmpriv->DM_DigTable; =20 - digtable->CurIGValue =3D rtw_read8(adapter, 0xc50); + res =3D rtw_read8(adapter, 0xc50, &digtable->CurIGValue); + (void) res; + /* FIXME: return an error to caller */ } odmpriv->SupportAbility =3D DYNAMIC_ALL_FUNC_ENABLE; break; @@ -3410,8 +3416,9 @@ static int rtw_dbg_port(struct net_device *dev, u16 reg =3D arg; u16 start_value =3D 0; u32 write_num =3D extra_arg; - int i; + int i, res; struct xmit_frame *xmit_frame; + u8 val8; =20 xmit_frame =3D rtw_IOL_accquire_xmit_frame(padapter); if (!xmit_frame) { @@ -3424,7 +3431,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_read8(padapter, reg); + /* FIXME: is this read necessary? */ + res =3D rtw_read8(padapter, reg, &val8); } break; =20 --=20 2.36.1 From nobody Thu May 7 21:08:47 2026 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 8AB18C433F5 for ; Wed, 18 May 2022 22:12:14 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229707AbiERWMM (ORCPT ); Wed, 18 May 2022 18:12:12 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55208 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229649AbiERWMC (ORCPT ); Wed, 18 May 2022 18:12:02 -0400 Received: from mail-lf1-x130.google.com (mail-lf1-x130.google.com [IPv6:2a00:1450:4864:20::130]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id F03B8126999 for ; Wed, 18 May 2022 15:12:00 -0700 (PDT) Received: by mail-lf1-x130.google.com with SMTP id w14so5907174lfl.13 for ; Wed, 18 May 2022 15:12:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Dc/njpnQDwmDxaEnDRY1YMHC0MJdNjkPpzUo4YNvYH4=; b=EtwRx/AquV/EwG+N+1Jo9phAF7sTMFMMKZ7P3UZ8AN2aFbm5ISpLO1WE9U6t4c4sK2 mpc6FQtvSt/BXliXjRk2Tk5ukeofrcF7X0ZJ3poga+Z2r45iFja/VlEbTllAXcEmDfBw FqmJ3ir9AXGTVHqo2VA3uC49n/OHgBE1DzQnFW4VgZcAxFS8tHKIN7uQ2ZY//pDKjIdR J4f0C3ACzeCjOraXUfV8XfDCWdm738JBJytKrIPQLPbmDvU8o7S/EioCNPj4/CwSiclp vJlpa1Yd/29ElC9jgLLpoh/ZI05Ceq+RdtXGUoNUvM0f7nSAnXCpIPEFF+AjidtvNAFy 9kxg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Dc/njpnQDwmDxaEnDRY1YMHC0MJdNjkPpzUo4YNvYH4=; b=eeUpxdXWKcVPg7Mvy+E2ttBjRiVvdf+D6dWKHWW8bMNQnE7C9Mf8tT84dgg3MIrCNI yM1OS8mSJmZ4wqU4tzbgeTiQ2EQXNBt36uyt9TAzTIlPEgxlpRGzP4TvXjjq6R5IuzW1 UsgmVmnyRube0ctQd1Q26fjwwKS0F4tSmP3ewJProomypt9RxU5J+UxTFmWPHOEzPtSx 6ByJPZ0WmWzGeGSaEEuZJgFFE8vp4lN7ffebV69N1nUd31ltt9Xt3cxLehM5kUH6srGQ hfBFiqIJsOUzPWuBRck4qKt7Z4mSJbcpfogXlDlUl0mErwXkj5QJqtutSsOhtDhON3VC pYrQ== X-Gm-Message-State: AOAM533RsYsYHN1QwaNAxAo7ZhaAmzu/yx4QZZSh1rp/8TZlA+HILuoP kvYkUm4aOXnQgPFk8ye2+7Q= X-Google-Smtp-Source: ABdhPJwRkjy5KU1rdWHUYMdiVBiZlyA9Ml0GnEHaCg4m2r2r23tYNMCVjdhcDZc4zPJiqTzWvklZlw== X-Received: by 2002:a05:6512:10cf:b0:473:b735:4fae with SMTP id k15-20020a05651210cf00b00473b7354faemr1081241lfg.93.1652911919230; Wed, 18 May 2022 15:11:59 -0700 (PDT) Received: from localhost.localdomain ([46.235.67.4]) by smtp.gmail.com with ESMTPSA id y17-20020ac24471000000b0047255d21205sm63006lfl.308.2022.05.18.15.11.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 18 May 2022 15:11:58 -0700 (PDT) From: Pavel Skripkin To: gregkh@linuxfoundation.org, Larry.Finger@lwfinger.net, phil@philpotter.co.uk, straube.linux@gmail.com, dan.carpenter@oracle.com, fmdefrancesco@gmail.com Cc: linux-kernel@vger.kernel.org, linux-staging@lists.linux.dev, Pavel Skripkin Subject: [PATCH 2/4] staging: r8188eu: add error handling of rtw_read16 Date: Thu, 19 May 2022 01:11:56 +0300 Message-Id: X-Mailer: git-send-email 2.36.1 In-Reply-To: References: 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" rtw_read16() 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_read16() prototype and prevent caller from touching random stack data Signed-off-by: Pavel Skripkin --- .../staging/r8188eu/hal/rtl8188e_hal_init.c | 21 ++++++++++++--- drivers/staging/r8188eu/hal/rtl8188e_phycfg.c | 8 ++++-- drivers/staging/r8188eu/hal/usb_halinit.c | 27 ++++++++++++++++--- 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 | 11 +++++--- drivers/staging/r8188eu/os_dep/os_intfs.c | 6 ++++- 7 files changed, 69 insertions(+), 19 deletions(-) diff --git a/drivers/staging/r8188eu/hal/rtl8188e_hal_init.c b/drivers/stag= ing/r8188eu/hal/rtl8188e_hal_init.c index e67ecbd1ba79..22661c66cc18 100644 --- a/drivers/staging/r8188eu/hal/rtl8188e_hal_init.c +++ b/drivers/staging/r8188eu/hal/rtl8188e_hal_init.c @@ -249,11 +249,14 @@ static void efuse_read_phymap_from_txpktbuf( hi32 =3D cpu_to_le32(rtw_read32(adapter, REG_PKTBUF_DBG_DATA_H)); =20 if (i =3D=3D 0) { + int res; + u16 reg; /* Although lenc is only used in a debug statement, * do not remove it as the rtw_read16() call consumes * 2 bytes from the EEPROM source. */ - rtw_read16(adapter, REG_PKTBUF_DBG_DATA_L); + res =3D rtw_read16(adapter, REG_PKTBUF_DBG_DATA_L, ®); + (void) res; =20 len =3D le32_to_cpu(lo32) & 0x0000ffff; =20 @@ -355,25 +358,35 @@ int rtl8188e_IOL_exec_cmds_sync(struct adapter *adapt= er, struct xmit_frame *xmit void rtl8188e_EfusePowerSwitch(struct adapter *pAdapter, u8 PwrState) { u16 tmpV16; + int res; =20 if (PwrState) { rtw_write8(pAdapter, REG_EFUSE_ACCESS, EFUSE_ACCESS_ON); =20 /* 1.2V Power: From VDDON with Power Cut(0x0000h[15]), defualt valid */ - tmpV16 =3D rtw_read16(pAdapter, REG_SYS_ISO_CTRL); + res =3D rtw_read16(pAdapter, REG_SYS_ISO_CTRL, &tmpV16); + if (res) + return; + if (!(tmpV16 & PWC_EV12V)) { tmpV16 |=3D PWC_EV12V; rtw_write16(pAdapter, REG_SYS_ISO_CTRL, tmpV16); } /* Reset: 0x0000h[28], default valid */ - tmpV16 =3D rtw_read16(pAdapter, REG_SYS_FUNC_EN); + res =3D rtw_read16(pAdapter, REG_SYS_FUNC_EN, &tmpV16); + if (res) + return; + if (!(tmpV16 & FEN_ELDR)) { tmpV16 |=3D FEN_ELDR; rtw_write16(pAdapter, REG_SYS_FUNC_EN, tmpV16); } =20 /* Clock: Gated(0x0008h[5]) 8M(0x0008h[1]) clock from ANA, default vali= d */ - tmpV16 =3D rtw_read16(pAdapter, REG_SYS_CLKR); + res =3D rtw_read16(pAdapter, REG_SYS_CLKR, &tmpV16); + if (res) + return; + if ((!(tmpV16 & LOADER_CLK_EN)) || (!(tmpV16 & ANA8M))) { tmpV16 |=3D (LOADER_CLK_EN | ANA8M); rtw_write16(pAdapter, REG_SYS_CLKR, tmpV16); diff --git a/drivers/staging/r8188eu/hal/rtl8188e_phycfg.c b/drivers/stagin= g/r8188eu/hal/rtl8188e_phycfg.c index 985339a974fc..298c3d9bc7be 100644 --- a/drivers/staging/r8188eu/hal/rtl8188e_phycfg.c +++ b/drivers/staging/r8188eu/hal/rtl8188e_phycfg.c @@ -484,13 +484,17 @@ PHY_BBConfig8188E( { int rtStatus =3D _SUCCESS; struct hal_data_8188e *pHalData =3D &Adapter->haldata; - u32 RegVal; + u16 RegVal; u8 CrystalCap; + int res; =20 phy_InitBBRFRegisterDefinition(Adapter); =20 /* Enable BB and RF */ - RegVal =3D rtw_read16(Adapter, REG_SYS_FUNC_EN); + res =3D rtw_read16(Adapter, REG_SYS_FUNC_EN, &RegVal); + if (res) + return _FAIL; + rtw_write16(Adapter, REG_SYS_FUNC_EN, (u16)(RegVal | BIT(13) | BIT(0) | B= IT(1))); =20 /* 20090923 Joseph: Advised by Steven and Jenyu. Power sequence before i= nit RF. */ diff --git a/drivers/staging/r8188eu/hal/usb_halinit.c b/drivers/staging/r8= 188eu/hal/usb_halinit.c index 6e3c8af5c4e7..1a68e4f19dc2 100644 --- a/drivers/staging/r8188eu/hal/usb_halinit.c +++ b/drivers/staging/r8188eu/hal/usb_halinit.c @@ -52,6 +52,8 @@ void rtl8188eu_interface_configure(struct adapter *adapt) u32 rtl8188eu_InitPowerOn(struct adapter *adapt) { u16 value16; + int res; + /* HW Power on sequence */ struct hal_data_8188e *haldata =3D &adapt->haldata; if (haldata->bMacPwrCtrlOn) @@ -65,7 +67,10 @@ u32 rtl8188eu_InitPowerOn(struct adapter *adapt) rtw_write16(adapt, REG_CR, 0x00); /* suggseted by zhouzhou, by page, 201= 11230 */ =20 /* Enable MAC DMA/WMAC/SCHEDULE/SEC block */ - value16 =3D rtw_read16(adapt, REG_CR); + res =3D rtw_read16(adapt, REG_CR, &value16); + if (res) + return _FAIL; + value16 |=3D (HCI_TXDMA_EN | HCI_RXDMA_EN | TXDMA_EN | RXDMA_EN | PROTOCOL_EN | SCHEDULE_EN | ENSEC | CALTMR_EN); /* for SDIO - Set CR bit10 to enable 32k calibration. Suggested by SD1 G= immy. Added by tynli. 2011.08.31. */ @@ -166,7 +171,14 @@ static void _InitNormalChipRegPriority(struct adapter = *Adapter, u16 beQ, u16 bkQ, u16 viQ, u16 voQ, u16 mgtQ, u16 hiQ) { - u16 value16 =3D (rtw_read16(Adapter, REG_TRXDMA_CTRL) & 0x7); + u16 value16; + int res; + + res =3D rtw_read16(Adapter, REG_TRXDMA_CTRL, &value16); + if (res) + return; + + value16 &=3D 0x7; =20 value16 |=3D _TXDMA_BEQ_MAP(beQ) | _TXDMA_BKQ_MAP(bkQ) | _TXDMA_VIQ_MAP(viQ) | _TXDMA_VOQ_MAP(voQ) | @@ -630,7 +642,10 @@ u32 rtl8188eu_hal_init(struct adapter *Adapter) /* Hw bug which Hw initials RxFF boundary size to a value which is large= r than the real Rx buffer size in 88E. */ /* */ /* Enable MACTXEN/MACRXEN block */ - value16 =3D rtw_read16(Adapter, REG_CR); + res =3D rtw_read16(Adapter, REG_CR, &value16); + if (res) + return _FAIL; + value16 |=3D (MACTXEN | MACRXEN); rtw_write8(Adapter, REG_CR, value16); =20 @@ -703,7 +718,11 @@ u32 rtl8188eu_hal_init(struct adapter *Adapter) rtw_write16(Adapter, REG_TX_RPT_TIME, 0x3DF0); =20 /* enable tx DMA to drop the redundate data of packet */ - rtw_write16(Adapter, REG_TXDMA_OFFSET_CHK, (rtw_read16(Adapter, REG_TXDMA= _OFFSET_CHK) | DROP_DATA_EN)); + res =3D rtw_read16(Adapter, REG_TXDMA_OFFSET_CHK, &value16); + if (res) + return _FAIL; + + rtw_write16(Adapter, REG_TXDMA_OFFSET_CHK, (value16 | DROP_DATA_EN)); =20 /* 2010/08/26 MH Merge from 8192CE. */ if (pwrctrlpriv->rf_pwrstate =3D=3D rf_on) { diff --git a/drivers/staging/r8188eu/hal/usb_ops_linux.c b/drivers/staging/= r8188eu/hal/usb_ops_linux.c index f399a7fd8b97..7d62f1f3d26e 100644 --- a/drivers/staging/r8188eu/hal/usb_ops_linux.c +++ b/drivers/staging/r8188eu/hal/usb_ops_linux.c @@ -103,16 +103,21 @@ int __must_check rtw_read8(struct adapter *adapter, u= 32 addr, u8 *data) return usb_read(intf, value, data, 1); } =20 -u16 rtw_read16(struct adapter *adapter, u32 addr) +int __must_check rtw_read16(struct adapter *adapter, u32 addr, u16 *data) { struct io_priv *io_priv =3D &adapter->iopriv; struct intf_hdl *intf =3D &io_priv->intf; u16 value =3D addr & 0xffff; - __le16 data; + __le16 le_data; + int res; =20 - usb_read(intf, value, &data, 2); + res =3D usb_read(intf, value, &le_data, 2); + if (res) + return res; =20 - return le16_to_cpu(data); + *data =3D le16_to_cpu(le_data); + + return 0; } =20 u32 rtw_read32(struct adapter *adapter, u32 addr) diff --git a/drivers/staging/r8188eu/include/rtw_io.h b/drivers/staging/r81= 88eu/include/rtw_io.h index 1198d3850a6d..ce3369e33d66 100644 --- a/drivers/staging/r8188eu/include/rtw_io.h +++ b/drivers/staging/r8188eu/include/rtw_io.h @@ -221,7 +221,7 @@ void _rtw_attrib_read(struct adapter *adapter, u32 addr= , u32 cnt, u8 *pmem); void _rtw_attrib_write(struct adapter *adapter, u32 addr, u32 cnt, u8 *pme= m); =20 int __must_check rtw_read8(struct adapter *adapter, u32 addr, u8 *data); -u16 rtw_read16(struct adapter *adapter, u32 addr); +int __must_check rtw_read16(struct adapter *adapter, u32 addr, u16 *data); u32 rtw_read32(struct adapter *adapter, u32 addr); void _rtw_read_mem(struct adapter *adapter, u32 addr, u32 cnt, u8 *pmem); u32 rtw_read_port(struct adapter *adapter, u8 *pmem); diff --git a/drivers/staging/r8188eu/os_dep/ioctl_linux.c b/drivers/staging= /r8188eu/os_dep/ioctl_linux.c index 66aac2cbe3a9..1b35951a53cb 100644 --- a/drivers/staging/r8188eu/os_dep/ioctl_linux.c +++ b/drivers/staging/r8188eu/os_dep/ioctl_linux.c @@ -1919,7 +1919,10 @@ static int rtw_wx_read32(struct net_device *dev, sprintf(extra, "0x%02X", data32 & 0xff); break; case 2: - data32 =3D rtw_read16(padapter, addr); + ret =3D rtw_read16(padapter, addr, (u16 *) &data32); + if (ret) + goto err_free_ptmp; + sprintf(extra, "0x%04X", data32); break; case 4: @@ -3441,8 +3444,9 @@ static int rtw_dbg_port(struct net_device *dev, u16 reg =3D arg; u16 start_value =3D 200; u32 write_num =3D extra_arg; + u16 val16; =20 - int i; + int i, res; struct xmit_frame *xmit_frame; =20 xmit_frame =3D rtw_IOL_accquire_xmit_frame(padapter); @@ -3456,7 +3460,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_read16(padapter, reg); + /* FIXME: is this read necessary? */ + res =3D rtw_read16(padapter, reg, &val16); } break; case 0x08: /* continuous write dword test */ diff --git a/drivers/staging/r8188eu/os_dep/os_intfs.c b/drivers/staging/r8= 188eu/os_dep/os_intfs.c index 891c85b088ca..d9325ef6ac28 100644 --- a/drivers/staging/r8188eu/os_dep/os_intfs.c +++ b/drivers/staging/r8188eu/os_dep/os_intfs.c @@ -740,12 +740,16 @@ static void rtw_fifo_cleanup(struct adapter *adapter) { struct pwrctrl_priv *pwrpriv =3D &adapter->pwrctrlpriv; u8 trycnt =3D 100; + int res; =20 /* pause tx */ rtw_write8(adapter, REG_TXPAUSE, 0xff); =20 /* keep sn */ - adapter->xmitpriv.nqos_ssn =3D rtw_read16(adapter, REG_NQOS_SEQ); + /* FIXME: return an error to caller */ + res =3D rtw_read16(adapter, REG_NQOS_SEQ, &adapter->xmitpriv.nqos_ssn); + if (res) + return; =20 if (!pwrpriv->bkeepfwalive) { /* RX DMA stop */ --=20 2.36.1 From nobody Thu May 7 21:08:47 2026 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 1DE75C433F5 for ; Wed, 18 May 2022 22:12:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229736AbiERWMU (ORCPT ); Wed, 18 May 2022 18:12:20 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55772 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229700AbiERWMK (ORCPT ); Wed, 18 May 2022 18:12:10 -0400 Received: from mail-lj1-x236.google.com (mail-lj1-x236.google.com [IPv6:2a00:1450:4864:20::236]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3AD5713F901 for ; Wed, 18 May 2022 15:12:06 -0700 (PDT) Received: by mail-lj1-x236.google.com with SMTP id q130so4131945ljb.5 for ; Wed, 18 May 2022 15:12:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=L8KmlOFcFtWhh9Psxpo9W+w2WUzs9/+R2EfiQXK4pmc=; b=pF4GbxsKm783yiqeA6oorFjSyDizvwuXkfohqLxGG45cBEytSZi1D8kkjWDPBdhvvI vph8jWn/Ef2Eu/iSDVna5KK1ApqzniA3GNAySi12tkjIo8JyXG9o5GiI7BM5CYBauoLv RyZXdypfKIyr0ZHGE8M57k6F/lRIbW50qgQ4zkONxeUjBd0pWa6RWUeIDKrDVYJuoo9m WrjnXtQIswsRtzDpLvZEUmN8tpzWuuOUxj9pKRBZtAkgBM9rXiY0GzuFMOIM1ZqvWHws Ejp8xLm9t2KMYUn36C8iFTrScEGu4zTC2d/Jmph5uvAOdZ705UDxDAN6uRbt/dH0VoXV Wnrg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=L8KmlOFcFtWhh9Psxpo9W+w2WUzs9/+R2EfiQXK4pmc=; b=OeEcvtvNVBiV6QfryORGe8eILzXdj66+lCzEvhwoBOvW648QbyMOe50wVT6CT1vGnD GBIGFAZ4ii9pPfTxZREUx6g1Vx9bz6WDw+07FC72r+BXLjxFRBPNrhucF9GACQnXwJdE 7WPJLSQNbBz+F8xaGOZkin/vQNslHpQSHP+LJ63ZiPgyNwmaCHAOdkNK9+pZcUmXG+Lb /3uOs9VysKZWTOSE8A7+Xj2x+tznRYt6kpQk54E+jTjC3NkZH82XMRfVs313a3sHEqgV oDJjSPfgaGoSYmDd9VDqXC70G8wCU4fCxsVD8HGPB4yCh+rtOsXBghFyU+4v+XZnF0Vr 7JRA== X-Gm-Message-State: AOAM532P4qh1mLkk+vuotju9yxTcVDAST7iK6YH+jnNEQcYYsaxglwKf 5Hk/RHx+K9+pJg/4SzcKf14= X-Google-Smtp-Source: ABdhPJwokdWydUmztaO3KZgLHsDKd16CHzeJk7B/RKuibVYfEFfvbPSGZsHxmSlBxccpPx+LsNCpzQ== X-Received: by 2002:a2e:6a16:0:b0:250:85be:7574 with SMTP id f22-20020a2e6a16000000b0025085be7574mr847095ljc.209.1652911924210; Wed, 18 May 2022 15:12:04 -0700 (PDT) Received: from localhost.localdomain ([46.235.67.4]) by smtp.gmail.com with ESMTPSA id w18-20020a05651203d200b0047255d2110asm69429lfp.57.2022.05.18.15.12.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 18 May 2022 15:12:03 -0700 (PDT) From: Pavel Skripkin To: gregkh@linuxfoundation.org, Larry.Finger@lwfinger.net, phil@philpotter.co.uk, straube.linux@gmail.com, dan.carpenter@oracle.com, fmdefrancesco@gmail.com Cc: linux-kernel@vger.kernel.org, linux-staging@lists.linux.dev, Pavel Skripkin Subject: [PATCH 3/4] staging: r8188eu: add error handling of rtw_read32 Date: Thu, 19 May 2022 01:12:01 +0300 Message-Id: <5cab10528fed7d440ee57f93183d18c9de998adb.1652911343.git.paskripkin@gmail.com> X-Mailer: git-send-email 2.36.1 In-Reply-To: References: 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" 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 --- drivers/staging/r8188eu/core/rtw_cmd.c | 15 +++++- drivers/staging/r8188eu/core/rtw_efuse.c | 19 +++++-- drivers/staging/r8188eu/core/rtw_fw.c | 16 ++++-- drivers/staging/r8188eu/core/rtw_mlme_ext.c | 13 ++++- 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 | 27 ++++++++-- 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 | 32 ++++++++--- drivers/staging/r8188eu/os_dep/os_intfs.c | 13 ++++- 14 files changed, 204 insertions(+), 44 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..7105122c2ba0 100644 --- a/drivers/staging/r8188eu/core/rtw_efuse.c +++ b/drivers/staging/r8188eu/core/rtw_efuse.c @@ -47,9 +47,18 @@ ReadEFuseByte( =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); + res =3D rtw_read32(Adapter, EFUSE_CTRL, &value32); + if (res) + return; + + while (retry < 10000) { + res =3D rtw_read32(Adapter, EFUSE_CTRL, &value32); + if (res) + continue; + + if (((value32 >> 24) & 0xff) & 0x80) + break; + retry++; } =20 @@ -58,7 +67,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 701b033830bc..602b959437db 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,7 +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); + res =3D rtw_read32(padapter, REG_MCUFWDL, &value32); + if (res) + continue; + if (value32 & WINTINI_RDY) return _SUCCESS; udelay(5); diff --git a/drivers/staging/r8188eu/core/rtw_mlme_ext.c b/drivers/staging/= r8188eu/core/rtw_mlme_ext.c index d4e59fab367c..e54d4139466d 100644 --- a/drivers/staging/r8188eu/core/rtw_mlme_ext.c +++ b/drivers/staging/r8188eu/core/rtw_mlme_ext.c @@ -6023,6 +6023,7 @@ static void mlme_join(struct adapter *adapter, int ty= pe) struct mlme_priv *mlmepriv =3D &adapter->mlmepriv; u8 retry_limit =3D 0x30, reg; int res; + u32 reg32; =20 switch (type) { case 0: @@ -6030,8 +6031,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; @@ -6844,10 +6849,14 @@ static u8 chk_ap_is_alive(struct sta_info *psta) =20 static void 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; + 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 6990808ef353..1fe3d3d9cfb9 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 aa4b4459329e..a97d9c3da16d 100644 --- a/drivers/staging/r8188eu/hal/HalPhyRf_8188e.c +++ b/drivers/staging/r8188eu/hal/HalPhyRf_8188e.c @@ -482,7 +482,8 @@ static void _PHY_SaveMACRegisters( MACBackup[i] =3D reg; } =20 - MACBackup[i] =3D rtw_read32(adapt, MACReg[i]); + /* FIXME: return an error to caller */ + res =3D rtw_read32(adapt, MACReg[i], MACBackup + i); } =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 22661c66cc18..f1dd60b30533 100644 --- a/drivers/staging/r8188eu/hal/rtl8188e_hal_init.c +++ b/drivers/staging/r8188eu/hal/rtl8188e_hal_init.c @@ -215,6 +215,7 @@ static void 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, ®); @@ -245,8 +246,18 @@ static void 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; + + lo32 =3D cpu_to_le32(reg32); + + + res =3D rtw_read32(adapter, REG_PKTBUF_DBG_DATA_H, ®32); + if (res) + return; + + hi32 =3D cpu_to_le32(reg32); =20 if (i =3D=3D 0) { int res; @@ -544,8 +555,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,12 +611,16 @@ static s32 _LLTWrite(struct adapter *padapter, u32 ad= dress, u32 data) s32 count =3D 0; 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); + res =3D rtw_read32(padapter, LLTReg, &value); + if (res) + continue; + if (_LLT_NO_ACTIVE =3D=3D _LLT_OP_VALUE(value)) break; =20 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 1a68e4f19dc2..6bc04950b2c6 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 @@ -511,11 +523,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) @@ -545,6 +563,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) { @@ -742,7 +761,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; @@ -1111,7 +1134,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 */ @@ -1126,6 +1154,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)) { @@ -1147,7 +1176,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: @@ -1320,7 +1354,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 1b35951a53cb..00d1ba62c248 100644 --- a/drivers/staging/r8188eu/os_dep/ioctl_linux.c +++ b/drivers/staging/r8188eu/os_dep/ioctl_linux.c @@ -1926,7 +1926,10 @@ static int rtw_wx_read32(struct net_device *dev, sprintf(extra, "0x%04X", data32); break; case 4: - data32 =3D rtw_read32(padapter, addr); + ret =3D rtw_read32(padapter, addr, &data32); + if (ret) + goto err_free_ptmp; + sprintf(extra, "0x%08X", data32); break; default: @@ -3213,18 +3216,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"); } @@ -3232,13 +3246,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"); } @@ -3484,7 +3503,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.36.1 From nobody Thu May 7 21:08:47 2026 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 BACFFC433F5 for ; Wed, 18 May 2022 22:12:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229755AbiERWMX (ORCPT ); Wed, 18 May 2022 18:12:23 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56442 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229720AbiERWMS (ORCPT ); Wed, 18 May 2022 18:12:18 -0400 Received: from mail-lf1-x130.google.com (mail-lf1-x130.google.com [IPv6:2a00:1450:4864:20::130]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7752914AA69 for ; Wed, 18 May 2022 15:12:09 -0700 (PDT) Received: by mail-lf1-x130.google.com with SMTP id w14so5907174lfl.13 for ; Wed, 18 May 2022 15:12:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Cn63gQ8fiAaCxUAU+GTYt00yC4JfY8txZfLENC/Ur9w=; b=GQzLTFCOrNanqTm53W3JgcJ/s6SmwuCgS3A2l9Sfjr4qOIA3OtMOW46EryhNNjDLsn SdIxVDoIi9qQue2hi8jtFVzVhjh1vQOhmXFHuN7H1ijXrYgOfxbpq4LfNqCpcUEYCStN RqWhqUMpDDKculdrAtCqaQxLgo5C0Kic0ken3PECPtrlKCMBIKSjeD6rokGdwC+bwUa/ tEx1XcSx0T5s4eRe15812GAO4xpmkA/6cOco9pOmZvvuC3Aqh7cgz7Agb7cifOcydZA7 lz6jOsZQgQLCVY9o/BfL0f8EU38KI+RoEbQecYOuycx8JjFLpAsj86cwc57jnhvkHCgU 7jeQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Cn63gQ8fiAaCxUAU+GTYt00yC4JfY8txZfLENC/Ur9w=; b=2vpBLNjPFzVmCFPbodnD/yGcrBujyaVudHAK8t88LFZVRDwD+6hqPA18bqTUN2im5J XRQ/xwnHYs+fsFJpDFv1iPhv1q06O+yFbB5I4varfL9SsPrIqlDdMj5R2YZVpcXC2lOu Ixg0J61Ak3HAeNGxs2KXlFHbowAZoYuBBAEGj5KERGmNr+iAcFH8nDkAus1hwR/MiU2Z FSABaHo8HCsqnJdyVxDzlNGJK4EuHtf9xx4yWxEGSfj1gWq8TNH3Cb5MdwA7rXT4bnim 62fL1IW5CtGGHjp1j6iOwXrEN1WAbFDCa6qV3nWd1XtCptgbF7btsi1XUc/YzkKv3lVE Mocw== X-Gm-Message-State: AOAM531KO3Wx1YjxB40o4RvWznMSsfKK6XYXh/haIZNrneL2iLbutuyK CMm7P33d1oEz2NcQT6f+rs0= X-Google-Smtp-Source: ABdhPJxqQOd8gl6Gdx8ldU4/CWEFIHt5q7SkIzGwSMHTA+fcC45NmWvTJFdnaVHDZSN+e5fjJemAjw== X-Received: by 2002:a05:6512:21ad:b0:477:a61a:bfe6 with SMTP id c13-20020a05651221ad00b00477a61abfe6mr1061417lft.173.1652911929001; Wed, 18 May 2022 15:12:09 -0700 (PDT) Received: from localhost.localdomain ([46.235.67.4]) by smtp.gmail.com with ESMTPSA id o23-20020ac24e97000000b0047255d211b0sm65411lfr.223.2022.05.18.15.12.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 18 May 2022 15:12:08 -0700 (PDT) From: Pavel Skripkin To: gregkh@linuxfoundation.org, Larry.Finger@lwfinger.net, phil@philpotter.co.uk, straube.linux@gmail.com, dan.carpenter@oracle.com, fmdefrancesco@gmail.com Cc: linux-kernel@vger.kernel.org, linux-staging@lists.linux.dev, Pavel Skripkin Subject: [PATCH 4/4] MAINTAINERS: add myself as r8188eu reviewer Date: Thu, 19 May 2022 01:12:06 +0300 Message-Id: <42559eab6dd1a69c3fb11ee6ed1f33337041817d.1652911343.git.paskripkin@gmail.com> X-Mailer: git-send-email 2.36.1 In-Reply-To: References: 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" I was reviewing r8188eu patches for a while, but I am missing some of them, since I am not in CC list. I want to be CC'ed to help reviewing and testing more patches. Signed-off-by: Pavel Skripkin Acked-by: Dan Carpenter --- MAINTAINERS | 1 + 1 file changed, 1 insertion(+) diff --git a/MAINTAINERS b/MAINTAINERS index 0a635f2ae5b9..bd38a2e465cc 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -18716,6 +18716,7 @@ F: drivers/staging/olpc_dcon/ STAGING - REALTEK RTL8188EU DRIVERS M: Larry Finger M: Phillip Potter +R: Pavel Skripkin S: Supported F: drivers/staging/r8188eu/ =20 --=20 2.36.1