ath9k: Check for errors when reading SREV register
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>
This commit is contained in:
parent
389b72e582
commit
2f90c7e5d0
1 changed files with 23 additions and 9 deletions
|
@ -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)
|
||||||
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)
|
||||||
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)
|
||||||
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:
|
||||||
|
|
Loading…
Add table
Reference in a new issue