Commit b1e7cc22 authored by Tim Schumacher's avatar Tim Schumacher Committed by Greg Kroah-Hartman

ath9k: Check for errors when reading SREV register

[ Upstream commit 2f90c7e5 ]

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: default avatarTim Schumacher <timschumi@gmx.de>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent aea21407
...@@ -252,8 +252,9 @@ void ath9k_hw_get_channel_centers(struct ath_hw *ah, ...@@ -252,8 +252,9 @@ void ath9k_hw_get_channel_centers(struct ath_hw *ah,
/* Chip Revisions */ /* 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; u32 val;
if (ah->get_mac_revision) if (ah->get_mac_revision)
...@@ -269,25 +270,33 @@ static void ath9k_hw_read_revisions(struct ath_hw *ah) ...@@ -269,25 +270,33 @@ static void ath9k_hw_read_revisions(struct ath_hw *ah)
val = REG_READ(ah, AR_SREV); val = REG_READ(ah, AR_SREV);
ah->hw_version.macRev = MS(val, AR_SREV_REVISION2); ah->hw_version.macRev = MS(val, AR_SREV_REVISION2);
} }
return; return true;
case AR9300_DEVID_AR9340: case AR9300_DEVID_AR9340:
ah->hw_version.macVersion = AR_SREV_VERSION_9340; ah->hw_version.macVersion = AR_SREV_VERSION_9340;
return; return true;
case AR9300_DEVID_QCA955X: case AR9300_DEVID_QCA955X:
ah->hw_version.macVersion = AR_SREV_VERSION_9550; ah->hw_version.macVersion = AR_SREV_VERSION_9550;
return; return true;
case AR9300_DEVID_AR953X: case AR9300_DEVID_AR953X:
ah->hw_version.macVersion = AR_SREV_VERSION_9531; ah->hw_version.macVersion = AR_SREV_VERSION_9531;
return; return true;
case AR9300_DEVID_QCA956X: case AR9300_DEVID_QCA956X:
ah->hw_version.macVersion = AR_SREV_VERSION_9561; 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) { if (val == 0xFF) {
val = REG_READ(ah, AR_SREV); val = srev;
ah->hw_version.macVersion = ah->hw_version.macVersion =
(val & AR_SREV_VERSION2) >> AR_SREV_TYPE2_S; (val & AR_SREV_VERSION2) >> AR_SREV_TYPE2_S;
ah->hw_version.macRev = MS(val, AR_SREV_REVISION2); ah->hw_version.macRev = MS(val, AR_SREV_REVISION2);
...@@ -306,6 +315,8 @@ static void ath9k_hw_read_revisions(struct ath_hw *ah) ...@@ -306,6 +315,8 @@ static void ath9k_hw_read_revisions(struct ath_hw *ah)
if (ah->hw_version.macVersion == AR_SREV_VERSION_5416_PCIE) if (ah->hw_version.macVersion == AR_SREV_VERSION_5416_PCIE)
ah->is_pciexpress = true; ah->is_pciexpress = true;
} }
return true;
} }
/************************************/ /************************************/
...@@ -559,7 +570,10 @@ static int __ath9k_hw_init(struct ath_hw *ah) ...@@ -559,7 +570,10 @@ static int __ath9k_hw_init(struct ath_hw *ah)
struct ath_common *common = ath9k_hw_common(ah); struct ath_common *common = ath9k_hw_common(ah);
int r = 0; 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) { switch (ah->hw_version.macVersion) {
case AR_SREV_VERSION_5416_PCI: case AR_SREV_VERSION_5416_PCI:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment