lkml.org 
[lkml]   [2019]   [Jul]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.2 008/249] ath9k: Check for errors when reading SREV register
    Date
    From: Tim Schumacher <timschumi@gmx.de>

    [ Upstream commit 2f90c7e5d09437a4d8d5546feaae9f1cf48cfbe1 ]

    Right now, if an error is encountered during the SREV register
    read (i.e. an EIO in ath9k_regread()), that error code gets
    passed all the way to __ath9k_hw_init(), where it is visible
    during the "Chip rev not supported" message.

    ath9k_htc 1-1.4:1.0: ath9k_htc: HTC initialized with 33 credits
    ath: phy2: Mac Chip Rev 0x0f.3 is not supported by this driver
    ath: phy2: Unable to initialize hardware; initialization status: -95
    ath: phy2: Unable to initialize hardware; initialization status: -95
    ath9k_htc: Failed to initialize the device

    Check for -EIO explicitly in ath9k_hw_read_revisions() and return
    a boolean based on the success of the operation. Check for that in
    __ath9k_hw_init() and abort with a more debugging-friendly message
    if reading the revisions wasn't successful.

    ath9k_htc 1-1.4:1.0: ath9k_htc: HTC initialized with 33 credits
    ath: phy2: Failed to read SREV register
    ath: phy2: Could not read hardware revision
    ath: phy2: Unable to initialize hardware; initialization status: -95
    ath: phy2: Unable to initialize hardware; initialization status: -95
    ath9k_htc: Failed to initialize the device

    This helps when debugging by directly showing the first point of
    failure and it could prevent possible errors if a 0x0f.3 revision
    is ever supported.

    Signed-off-by: Tim Schumacher <timschumi@gmx.de>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/net/wireless/ath/ath9k/hw.c | 32 +++++++++++++++++++++--------
    1 file changed, 23 insertions(+), 9 deletions(-)

    diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c
    index 8581d917635a..b6773d613f0c 100644
    --- a/drivers/net/wireless/ath/ath9k/hw.c
    +++ b/drivers/net/wireless/ath/ath9k/hw.c
    @@ -252,8 +252,9 @@ void ath9k_hw_get_channel_centers(struct ath_hw *ah,
    /* Chip Revisions */
    /******************/

    -static void ath9k_hw_read_revisions(struct ath_hw *ah)
    +static bool ath9k_hw_read_revisions(struct ath_hw *ah)
    {
    + u32 srev;
    u32 val;

    if (ah->get_mac_revision)
    @@ -269,25 +270,33 @@ static void ath9k_hw_read_revisions(struct ath_hw *ah)
    val = REG_READ(ah, AR_SREV);
    ah->hw_version.macRev = MS(val, AR_SREV_REVISION2);
    }
    - return;
    + return true;
    case AR9300_DEVID_AR9340:
    ah->hw_version.macVersion = AR_SREV_VERSION_9340;
    - return;
    + return true;
    case AR9300_DEVID_QCA955X:
    ah->hw_version.macVersion = AR_SREV_VERSION_9550;
    - return;
    + return true;
    case AR9300_DEVID_AR953X:
    ah->hw_version.macVersion = AR_SREV_VERSION_9531;
    - return;
    + return true;
    case AR9300_DEVID_QCA956X:
    ah->hw_version.macVersion = AR_SREV_VERSION_9561;
    - return;
    + return true;
    }

    - val = REG_READ(ah, AR_SREV) & AR_SREV_ID;
    + srev = REG_READ(ah, AR_SREV);
    +
    + if (srev == -EIO) {
    + ath_err(ath9k_hw_common(ah),
    + "Failed to read SREV register");
    + return false;
    + }
    +
    + val = srev & AR_SREV_ID;

    if (val == 0xFF) {
    - val = REG_READ(ah, AR_SREV);
    + val = srev;
    ah->hw_version.macVersion =
    (val & AR_SREV_VERSION2) >> AR_SREV_TYPE2_S;
    ah->hw_version.macRev = MS(val, AR_SREV_REVISION2);
    @@ -306,6 +315,8 @@ static void ath9k_hw_read_revisions(struct ath_hw *ah)
    if (ah->hw_version.macVersion == AR_SREV_VERSION_5416_PCIE)
    ah->is_pciexpress = true;
    }
    +
    + return true;
    }

    /************************************/
    @@ -559,7 +570,10 @@ static int __ath9k_hw_init(struct ath_hw *ah)
    struct ath_common *common = ath9k_hw_common(ah);
    int r = 0;

    - ath9k_hw_read_revisions(ah);
    + if (!ath9k_hw_read_revisions(ah)) {
    + ath_err(common, "Could not read hardware revisions");
    + return -EOPNOTSUPP;
    + }

    switch (ah->hw_version.macVersion) {
    case AR_SREV_VERSION_5416_PCI:
    --
    2.20.1
    \
     
     \ /
      Last update: 2019-07-15 16:15    [W:2.825 / U:0.032 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site