From nobody Tue Apr 28 03:54:44 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 20FBBC43334 for ; Mon, 6 Jun 2022 19:37:08 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232483AbiFFThG (ORCPT ); Mon, 6 Jun 2022 15:37:06 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42124 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232481AbiFFThB (ORCPT ); Mon, 6 Jun 2022 15:37:01 -0400 Received: from mail-lf1-x134.google.com (mail-lf1-x134.google.com [IPv6:2a00:1450:4864:20::134]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9BC5C84A25 for ; Mon, 6 Jun 2022 12:36:57 -0700 (PDT) Received: by mail-lf1-x134.google.com with SMTP id c2so5488598lfk.0 for ; Mon, 06 Jun 2022 12:36:57 -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=26w6VMmK7MLBC1bSKvqNHgmE6sHf4PvG5g3fn6hB0gE=; b=LGnWKqxKDKd3d1Vz5xV+CvsZzoJKwL04alXrHMmw3UOwArEk6QCFTtLhRJi/i8toEV EufZMLpblI3Fh+AuO/ga1MXBVk44z+HAHwQKemYjBci/HkjA8XcQhQnJbkJ2rQ00kE3y qPJgO92cwxUaM/fI/LGwPc+m5cqnircA5ZLPNlp88HT+vbqnCQUdXIWXZ6VER6byARBe hg67EFbsC6BSNFHY2rET9lWW+VidKlfx0AvXLQ6GNSFbqVdvz5MpjzB5qPaDHRJ+Q7Nq /tgP//TJVI4lpK/QRZiDGjncfRTeQNDheL+Y0e/Nio9ND0R6kDJV334uJ0hAgG8MGPhw A8vQ== 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=26w6VMmK7MLBC1bSKvqNHgmE6sHf4PvG5g3fn6hB0gE=; b=rsP93VE/IvClUZPKhxfBcLkt6PW7cImdLRvC6u6Q+v4kXGbQplcl++zd8DdHRoSOKU jDcLeP45J4RV82aNB3DIVqIAGr50+f9Ra9/WATq76He1KrldfDqnSAaLQL8uuxvM3kHb LldNs7RWKtdcPeLikcR6HKzJExM+z4tZCpqrp+47k7kxZBd0+IYub2et6cz0o1Mgnngc 6u00bmKC5vkc2AJPGar1VoFLiVtxO04pvLsqyNKbALidV85YFleJ/hHixpwVgZEzUnpr xOfCU5im+sVWSaIeOU/YvgSSh3GRwqd5hSb8iehsxB8NphV4Gzd/g2fTO+OeQtR2cYzX QKRw== X-Gm-Message-State: AOAM5333C1oOJpQ+3P5AJ2sc28zrsRVQOLA+f905MSNDRqzdbUS+R+6n b0A9oO9eAVlTnhRiPnBZaOA= X-Google-Smtp-Source: ABdhPJwJdn06HMFXhBY7pR7eP1mSboFwG4ghcksOO75a7rmMsWEcDoPOF0F1s0OjsQQQrv1RjaRRvw== X-Received: by 2002:a05:6512:3b85:b0:478:f40f:5815 with SMTP id g5-20020a0565123b8500b00478f40f5815mr24237370lfv.679.1654544215636; Mon, 06 Jun 2022 12:36:55 -0700 (PDT) Received: from localhost.localdomain ([94.103.229.27]) by smtp.gmail.com with ESMTPSA id h16-20020ac25d70000000b0047907872b22sm2798526lft.42.2022.06.06.12.36.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 Jun 2022 12:36:55 -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 Cc: linux-kernel@vger.kernel.org, linux-staging@lists.linux.dev, Pavel Skripkin Subject: [PATCH v3 1/4] staging: r8188eu: add error handling of rtw_read8 Date: Mon, 6 Jun 2022 22:36:53 +0300 Message-Id: <6b01529709706167458c441391fc3fc2a5baf5c2.1654543286.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 --- drivers/staging/r8188eu/core/rtw_efuse.c | 13 +- drivers/staging/r8188eu/core/rtw_fw.c | 56 ++++-- drivers/staging/r8188eu/core/rtw_led.c | 16 +- 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 | 18 +- drivers/staging/r8188eu/hal/HalPwrSeqCmd.c | 9 +- drivers/staging/r8188eu/hal/hal_com.c | 27 ++- 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 | 171 +++++++++++++++--- 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 | 11 +- 16 files changed, 419 insertions(+), 102 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 0451e5177644..7cf8525595c6 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; + + res =3D rtw_read8(padapter, REG_MCUFWDL + 2, &value8); + if (res) + return _FAIL; =20 - value8 =3D (rtw_read8(padapter, REG_MCUFWDL + 2) & 0xF8) | u8Page; + 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))); } @@ -239,7 +258,7 @@ static int load_firmware(struct rt_firmware *rtfw, stru= ct device *device) int rtl8188e_firmware_download(struct adapter *padapter) { 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); @@ -269,23 +288,34 @@ int rtl8188e_firmware_download(struct adapter *padapt= er) =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 */ + ret =3D rtw_read8(padapter, REG_MCUFWDL, ®); + if (ret) { + ret =3D _FAIL; + goto exit; + } + + if (reg & RAM_DL_SEL) { /* 8051 RAM code */ rtw_write8(padapter, REG_MCUFWDL, 0x00); rtw_reset_8051(padapter); } =20 fw_download_enable(padapter, true); fwdl_timeout =3D jiffies + msecs_to_jiffies(500); - while (1) { + do { /* reset the FWDL chksum */ - rtw_write8(padapter, REG_MCUFWDL, rtw_read8(padapter, REG_MCUFWDL) | FWD= L_CHKSUM_RPT); + ret =3D rtw_read8(padapter, REG_MCUFWDL, ®); + if (ret) { + ret =3D _FAIL; + continue; + } =20 - ret =3D write_fw(padapter, fw_data, fw_size); + rtw_write8(padapter, REG_MCUFWDL, reg | FWDL_CHKSUM_RPT); =20 - if (ret =3D=3D _SUCCESS || - (time_after(jiffies, fwdl_timeout) && write_fw_retry++ >=3D 3)) + ret =3D write_fw(padapter, fw_data, fw_size); + if (ret =3D=3D _SUCCESS) break; - } + } while (!time_after(jiffies, fwdl_timeout)); + fw_download_enable(padapter, false); if (ret !=3D _SUCCESS) goto exit; diff --git a/drivers/staging/r8188eu/core/rtw_led.c b/drivers/staging/r8188= eu/core/rtw_led.c index 2f3000428af7..25989acf5259 100644 --- a/drivers/staging/r8188eu/core/rtw_led.c +++ b/drivers/staging/r8188eu/core/rtw_led.c @@ -35,11 +35,15 @@ static void ResetLedStatus(struct LED_871x *pLed) static void SwLedOn(struct adapter *padapter, struct LED_871x *pLed) { 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; } @@ -47,15 +51,21 @@ static void SwLedOn(struct adapter *padapter, struct LE= D_871x *pLed) static void SwLedOff(struct adapter *padapter, struct LED_871x *pLed) { 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 faf23fc950c5..01e5669f2421 100644 --- a/drivers/staging/r8188eu/core/rtw_mlme_ext.c +++ b/drivers/staging/r8188eu/core/rtw_mlme_ext.c @@ -5667,14 +5667,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 /*************************************************************************= *** @@ -6002,7 +6016,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: @@ -6027,7 +6042,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; @@ -6748,6 +6767,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); @@ -6756,7 +6778,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) @@ -6810,14 +6837,16 @@ static u8 chk_ap_is_alive(struct sta_info *psta) return ret; } =20 -static void rtl8188e_sreset_linked_status_check(struct adapter *padapter) +static int 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); + return rtw_read8(padapter, REG_FMETHR, ®); } =20 void linked_status_chk(struct adapter *padapter) @@ -7219,6 +7248,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); @@ -7231,7 +7261,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 392a65783f32..9bd059b86d0c 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; @@ -765,6 +774,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) { @@ -786,8 +796,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..a5b7980dfcee 100644 --- a/drivers/staging/r8188eu/hal/HalPhyRf_8188e.c +++ b/drivers/staging/r8188eu/hal/HalPhyRf_8188e.c @@ -463,6 +463,7 @@ void _PHY_SaveADDARegisters(struct adapter *adapt, u32 = *ADDAReg, u32 *ADDABackup } } =20 +/* FIXME: return an error to caller */ static void _PHY_SaveMACRegisters( struct adapter *adapt, u32 *MACReg, @@ -470,9 +471,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 +748,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 150ea380c39e..4a4563b900b3 100644 --- a/drivers/staging/r8188eu/hal/HalPwrSeqCmd.c +++ b/drivers/staging/r8188eu/hal/HalPwrSeqCmd.c @@ -12,6 +12,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]; @@ -21,7 +22,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)); @@ -33,7 +36,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..e9a32dd84a8e 100644 --- a/drivers/staging/r8188eu/hal/hal_com.c +++ b/drivers/staging/r8188eu/hal/hal_com.c @@ -303,7 +303,9 @@ s32 c2h_evt_read(struct adapter *adapter, u8 *buf) if (!buf) goto exit; =20 - trigger =3D rtw_read8(adapter, REG_C2HEVT_CLEAR); + ret =3D rtw_read8(adapter, REG_C2HEVT_CLEAR, &trigger); + if (ret) + return _FAIL; =20 if (trigger =3D=3D C2H_EVT_HOST_CLOSE) goto exit; /* Not ready */ @@ -314,13 +316,26 @@ 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); + ret =3D rtw_read8(adapter, REG_C2HEVT_MSG_NORMAL, buf); + if (ret) { + ret =3D _FAIL; + goto clear_evt; + } =20 + ret =3D rtw_read8(adapter, REG_C2HEVT_MSG_NORMAL + 1, buf + 1); + if (ret) { + ret =3D _FAIL; + goto clear_evt; + } /* 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++) { + ret =3D rtw_read8(adapter, REG_C2HEVT_MSG_NORMAL + + sizeof(*c2h_evt) + i, c2h_evt->payload + i); + if (ret) { + ret =3D _FAIL; + goto clear_evt; + } + } =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 a217272a07f8..01422d548748 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; @@ -446,9 +459,11 @@ static void InitUsbAggregationSetting(struct adapter *= Adapter) usb_AggSettingRxUpdate(Adapter); } =20 -static void _InitBeaconParameters(struct adapter *Adapter) +/* FIXME: add error handling in callers */ +static int _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 +476,19 @@ 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); + res =3D rtw_read8(Adapter, REG_FWHW_TXQ_CTRL + 2, &haldata->RegFwHwTxQCtr= l); + if (res) + return res; + + res =3D rtw_read8(Adapter, REG_TBTT_PROHIBIT + 2, &haldata->RegReg542); + if (res) + return res; + + res =3D rtw_read8(Adapter, REG_CR + 1, &haldata->RegCR_1); + if (res) + return res; + + return 0; } =20 static void _BeaconFunctionEnable(struct adapter *Adapter, @@ -514,6 +539,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 +646,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 +743,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 +760,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 +779,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 +888,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 +949,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 +998,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 +1022,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 +1051,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 +1079,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 +1109,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 +1124,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); } @@ -1190,6 +1295,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 */ @@ -1215,7 +1322,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 1b09462ca908..168f4ec99a03 100644 --- a/drivers/staging/r8188eu/os_dep/ioctl_linux.c +++ b/drivers/staging/r8188eu/os_dep/ioctl_linux.c @@ -3178,6 +3178,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: @@ -3193,7 +3194,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; @@ -3329,8 +3332,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) { @@ -3343,7 +3347,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 Tue Apr 28 03:54:44 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 B1C6BC433EF for ; Mon, 6 Jun 2022 19:37:15 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232538AbiFFThO (ORCPT ); Mon, 6 Jun 2022 15:37:14 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42846 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232489AbiFFThH (ORCPT ); Mon, 6 Jun 2022 15:37:07 -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 DA96B84A2D for ; Mon, 6 Jun 2022 12:37:03 -0700 (PDT) Received: by mail-lj1-x236.google.com with SMTP id v9so16838439lja.12 for ; Mon, 06 Jun 2022 12:37:03 -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=oI4V46VS55pBzT3fiLt9MvPf1vZu4NgtctcCu2LV5hQ=; b=IV8xp0Ndp53Z8Srqwn3rNP8dWUtc9nZFovJitTGzvOEe3iNMPGrHhocRHm+MUypm4P knJADwPRjfslXhuZuzj2HMYE3/0hK7d+W8i62U7SXQviIQF4GWwbq/i/0GOlb/F8UOSi YQElB+ARwL//Be1NiItr5syvebOW1JvxRQo1c0Xb2SpjECKgNYp/FhOkZKA0uNg+5dEA OKeF5aFYrSzdg9PEEwfvimL1tstvS89sYYRsRYKOGes19YQLf/PBNxwRBBH6jfOXc8iC DLGp7KF9wbVimjHLkOrysFDhdJj7fT2+XkAL8var6LcgxXy+/ajgGn5liAOoQ4g+uy9B seUw== 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=oI4V46VS55pBzT3fiLt9MvPf1vZu4NgtctcCu2LV5hQ=; b=d8954/Io9aabavH6IGSJ0zx2a1XWOT7o3a3tF3VjS51qhrwKy1V1owmCwf+gcXPzBI bkVfKsgCQOR1MOnyWiJmnn+XmU0VrBI900yIbr+laPiYk+wMqh83biYU7heXMEaNzmrr C6yaZzUpRcEyS3nMKKR1AcHif0ktTQKkLsRBsRnqpjFzZHijydP7n3nUEEb28IMHEKUG MWfxXnvFapEVq9z3b98kzMNBWtjGMOlvV2c7TSLScXjYYwWk0lLe6YLmXTCnIGCdYecL tOLcAfQsVYKZJ7JZ5TcTKIl8mxfSRqkC+mHgrsWb6VSBvEPf0xDeJ7VclEAy4H5DZn3s FUuw== X-Gm-Message-State: AOAM53312qW1VRWd3TZUf3DqtoI1vW+8vwjw33iq6xKEjnPBnDSSiU+6 OyEpFbsUWeoR8EP7QQUcOY0= X-Google-Smtp-Source: ABdhPJxekdIM23cVH4ltz9Lz6avUzfPPr2yhnTc1rdkvOjnPkU89WygATBfb09NTC5ik2ZKCsBKttw== X-Received: by 2002:a2e:9cda:0:b0:255:6bfd:3bd with SMTP id g26-20020a2e9cda000000b002556bfd03bdmr15034322ljj.302.1654544222112; Mon, 06 Jun 2022 12:37:02 -0700 (PDT) Received: from localhost.localdomain ([94.103.229.27]) by smtp.gmail.com with ESMTPSA id d26-20020a194f1a000000b0047862287498sm2636001lfb.208.2022.06.06.12.37.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 Jun 2022 12:37:01 -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 Cc: linux-kernel@vger.kernel.org, linux-staging@lists.linux.dev, Pavel Skripkin Subject: [PATCH v3 2/4] staging: r8188eu: add error handling of rtw_read16 Date: Mon, 6 Jun 2022 22:37:00 +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 | 29 +++++++++++++++---- 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 | 9 ++++-- drivers/staging/r8188eu/os_dep/os_intfs.c | 6 +++- 7 files changed, 73 insertions(+), 21 deletions(-) diff --git a/drivers/staging/r8188eu/hal/rtl8188e_hal_init.c b/drivers/stag= ing/r8188eu/hal/rtl8188e_hal_init.c index e67ecbd1ba79..8215ed8b506d 100644 --- a/drivers/staging/r8188eu/hal/rtl8188e_hal_init.c +++ b/drivers/staging/r8188eu/hal/rtl8188e_hal_init.c @@ -200,7 +200,8 @@ efuse_phymap_to_logical(u8 *phymap, u16 _offset, u16 _s= ize_byte, u8 *pbuf) kfree(eFuseWord); } =20 -static void efuse_read_phymap_from_txpktbuf( +/* FIXME: add error handling in callers */ +static int efuse_read_phymap_from_txpktbuf( struct adapter *adapter, int bcnhead, /* beacon head, where FW store len(2-byte) and efuse physica= l map. */ u8 *content, /* buffer to store efuse physical map */ @@ -219,7 +220,7 @@ static void efuse_read_phymap_from_txpktbuf( if (bcnhead < 0) { /* if not valid */ res =3D rtw_read8(adapter, REG_TDECTRL + 1, ®); if (res) - return; + return res; =20 bcnhead =3D reg; } @@ -249,11 +250,15 @@ 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) { + 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, ®); + if (res) + return res; =20 len =3D le32_to_cpu(lo32) & 0x0000ffff; =20 @@ -280,6 +285,8 @@ static void efuse_read_phymap_from_txpktbuf( } rtw_write8(adapter, REG_PKT_BUFF_ACCESS_CTRL, DISABLE_TRXPKT_BUF_ACCESS); *size =3D count; + + return 0; } =20 static s32 iol_read_efuse(struct adapter *padapter, u8 txpktbuf_bndy, u16 = offset, u16 size_byte, u8 *logical_map) @@ -355,25 +362,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 01422d548748..e7b51b427e8f 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) | @@ -640,7 +652,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 @@ -713,7 +728,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 168f4ec99a03..30aa2a2c0ade 100644 --- a/drivers/staging/r8188eu/os_dep/ioctl_linux.c +++ b/drivers/staging/r8188eu/os_dep/ioctl_linux.c @@ -3349,6 +3349,7 @@ static int rtw_dbg_port(struct net_device *dev, =20 /* FIXME: is this read necessary? */ res =3D rtw_read8(padapter, reg, &val8); + (void)res; } break; =20 @@ -3357,8 +3358,8 @@ static int rtw_dbg_port(struct net_device *dev, u16 reg =3D arg; u16 start_value =3D 200; u32 write_num =3D extra_arg; - - int i; + u16 val16; + int i, res; struct xmit_frame *xmit_frame; =20 xmit_frame =3D rtw_IOL_accquire_xmit_frame(padapter); @@ -3372,7 +3373,9 @@ 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); + (void)res; } 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 Tue Apr 28 03:54:44 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 94FFCC43334 for ; Mon, 6 Jun 2022 19:37:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232584AbiFFThZ (ORCPT ); Mon, 6 Jun 2022 15:37:25 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43470 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232515AbiFFThR (ORCPT ); Mon, 6 Jun 2022 15:37:17 -0400 Received: from mail-lj1-x230.google.com (mail-lj1-x230.google.com [IPv6:2a00:1450:4864:20::230]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8DEDF13E30 for ; Mon, 6 Jun 2022 12:37:10 -0700 (PDT) Received: by mail-lj1-x230.google.com with SMTP id y15so11448051ljc.0 for ; Mon, 06 Jun 2022 12:37:10 -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=YNftCWsQPjdVEtDfBkKkc1kJq46k95l2yEfGpvnU3KE=; b=hULtQQ/EqZyU3sUxsFQJ/8CeSQVyLoZJ8Vuwk/KjbxbKt0gqT7xhdn6W4vc6VVNIj8 rEr/zqX80Bk8WaMHK4OOUtIjTDYoiEgntsrO9tSThvXKRan1TUGpqy84m45Jf6dLyIzx rqAFc8yVlEO3Ii+CmVyMY2rM5g8QFMQUavYIHK/w14a9a7Rkq1FMFWDc7/lrIvxDazRX q8+deF6VpUTO5LaVnUQfl6KsOnkSn+fe1jd+w9/ernM4VCxRQFZB/mxI7Yz67sc1pOAY 4sJWRDc3FGR8pIRYSlO2kVrsAgAC2lvU+HOzPu9KBfO4jL3SkeaCp8G1omnWE601rrbn /9SQ== 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=YNftCWsQPjdVEtDfBkKkc1kJq46k95l2yEfGpvnU3KE=; b=8E6lMgp0+Y6xVOIIIeVgBm4UawXs4OGAz6iFXQ+3tZwF0AYMRd2YsHGs0XMqKBxtKJ 6Rnb31JKgtWYji4EA8wGLMIRpQ8M0l4nkDS6ImBNxdnEUS+rXkHpE5VnaZS3kSWsFoEh OxixCGHLcLsv6HOZKsxGXsvgSZx1Ej7oxZLUiudttPjcLLfb7CVp2MHFfBxYlb575I7L 6e0XJZ3aaTR73jK8/m0ig/LWn3oiKzz1QN+ichdIxiZyAH8Zeg+/TeXxRFQDfhTLN3Jn oOU499uqe9uvDCppT7Hq2SfK0npiso7T8AZ5tu8tWZ05sdnhigq6p2BdnDNtyF7jGim1 YEYA== X-Gm-Message-State: AOAM533fHYltURJ61spkdoSWEbzaOtqB+MfyrLrVknL43HqXPncCO9If Q6dDeP9AOhYUzcM/e4PZKf6I8CzT7Fo= X-Google-Smtp-Source: ABdhPJy8luz2h9UuVgxKXkGfOg0Tr4yXKppPWm0FQSiY2cE0jSJ2dfST8CcPzrQXedaRpF+qp0HU3w== X-Received: by 2002:a2e:81cc:0:b0:255:5d1c:196a with SMTP id s12-20020a2e81cc000000b002555d1c196amr18207855ljg.1.1654544228679; Mon, 06 Jun 2022 12:37:08 -0700 (PDT) Received: from localhost.localdomain ([94.103.229.27]) by smtp.gmail.com with ESMTPSA id u7-20020ac25bc7000000b00478fe690207sm1281745lfn.286.2022.06.06.12.37.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 Jun 2022 12:37: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 Cc: linux-kernel@vger.kernel.org, linux-staging@lists.linux.dev, Pavel Skripkin Subject: [PATCH v3 3/4] staging: r8188eu: add error handling of rtw_read32 Date: Mon, 6 Jun 2022 22:37:06 +0300 Message-Id: <3b43d4dfedfdf9b8e73436c317ed62117178c724.1654543286.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 | 20 ++++--- 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 | 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, 201 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 01e5669f2421..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,10 +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 30aa2a2c0ade..e95cf35949d0 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.36.1 From nobody Tue Apr 28 03:54:44 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 3027CC433EF for ; Mon, 6 Jun 2022 19:37:40 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232549AbiFFThg (ORCPT ); Mon, 6 Jun 2022 15:37:36 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43900 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232529AbiFFThY (ORCPT ); Mon, 6 Jun 2022 15:37:24 -0400 Received: from mail-lj1-x22c.google.com (mail-lj1-x22c.google.com [IPv6:2a00:1450:4864:20::22c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6E798E01C for ; Mon, 6 Jun 2022 12:37:17 -0700 (PDT) Received: by mail-lj1-x22c.google.com with SMTP id e4so918481ljl.1 for ; Mon, 06 Jun 2022 12:37:17 -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=LU+ehwQCgMw+RYAoa7UysR6sc9DbOFvZWP1+pr1tYwY=; b=lCbnKYifr76Ts+W+Qg90YlR4M6WXtHUcrsKy/4n+7CGfZnvzr3QaV5y+IRd710y+vq ZObhXIihBHKg6ecLk2vuSJpkIq7rPDnp2dVpDcA1+fx/lrQlp7vJhooYKtpbpZmbnoI0 XAyt2V0GrN8EDAzLt9/K68mHqiAuQVDlqWJ5Rn5KpQ/2HGMg7/OOOMj8QA1xEgGwHQLZ 9xXvgMWtAU7xLJhOnrBo5QGveUyjYRzFuxPYk17o7iGdLC7YGpZ1kJnUoSgR8h77FQlE FJymYiIzy0Q6ekLg3Z9OQuAdD+Pi5puRL1D8+SLH0m/vtBjQQ9QdW23o9qEMvR80mnVm KBcA== 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=LU+ehwQCgMw+RYAoa7UysR6sc9DbOFvZWP1+pr1tYwY=; b=0d9L8Dr6JqsheTcYL3admN+wXu8e5Jk4/p2t8P0Cy82KrDQ2PwGJWbS8XWI08gv35q 0GwVe5NrnUhMgDNUWClOGwZaTriqv7SbGl9p8LAdItItxrObiX7a0V9PUNUUHRK8MEXn jEHAtjRv4J4qRnx1JhUnSrsYe/ncROk+xFxgn+8MLEfP8UO9P1tx7iD/pAbFTChCZTDH YMMSxAuCCLlmop7Uv3JV2JeFcxTpcfdfPD6hMMhlrdA2EgeOgfuf0Ttd3Ntz4kZYt1dV 200+tx452o8xW94usCzSfps3AchRyxxOYFj4f4DBRJBhSNakPh89qRRNyzOBnB/ksGhv iwew== X-Gm-Message-State: AOAM5313JZa/rbjM/np6D0Oq57RQXKasiGBmUo3kvOfuFXuKCCOQ+xfO lasZfMKgfXMic6ByGdRTmdI= X-Google-Smtp-Source: ABdhPJxsCGSY9/dA+Q1B/ePGKjzzQzv5s5GxY2jagXqL8gholPFkBXGB+z4UXa3QQH6gJzNQ15qabg== X-Received: by 2002:a2e:954f:0:b0:24f:4457:950d with SMTP id t15-20020a2e954f000000b0024f4457950dmr52789784ljh.35.1654544235470; Mon, 06 Jun 2022 12:37:15 -0700 (PDT) Received: from localhost.localdomain ([94.103.229.27]) by smtp.gmail.com with ESMTPSA id j22-20020a056512345600b00478ed85bc92sm2968233lfr.249.2022.06.06.12.37.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 Jun 2022 12:37:15 -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 Cc: linux-kernel@vger.kernel.org, linux-staging@lists.linux.dev, Pavel Skripkin Subject: [PATCH v3 4/4] MAINTAINERS: add myself as r8188eu reviewer Date: Mon, 6 Jun 2022 22:37:12 +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" 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. Acked-by: Dan Carpenter Signed-off-by: Pavel Skripkin Acked-by: Phillip Potter --- 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