[PATCH 1/3] ath10k: embed supported chip ids in hw_params
Michal Kazior
michal.kazior at tieto.com
Mon Nov 24 06:17:24 PST 2014
This will make it easier to extend and maintain
list of supported hardware.
As a requirement this moves chip_id checking a
little later because target_version isn't known
until BMI can be queried.
Signed-off-by: Michal Kazior <michal.kazior at tieto.com>
---
drivers/net/wireless/ath/ath10k/core.c | 72 ++++++++++++++++------------------
drivers/net/wireless/ath/ath10k/core.h | 3 +-
2 files changed, 36 insertions(+), 39 deletions(-)
diff --git a/drivers/net/wireless/ath/ath10k/core.c b/drivers/net/wireless/ath/ath10k/core.c
index f660553..3904ce3 100644
--- a/drivers/net/wireless/ath/ath10k/core.c
+++ b/drivers/net/wireless/ath/ath10k/core.c
@@ -43,11 +43,21 @@ MODULE_PARM_DESC(uart_print, "Uart target debugging");
MODULE_PARM_DESC(p2p, "Enable ath10k P2P support");
MODULE_PARM_DESC(skip_otp, "Skip otp failure for calibration in testmode");
+static u32 qca988x_supported_chips[] = {
+ /* QCA988X_HW_1_0_CHIP_ID_REV is not supported. It's way too buggy and
+ * crashes because ath10k doesn't have hacks and workarounds for it.
+ */
+
+ QCA988X_HW_2_0_CHIP_ID_REV
+};
+
static const struct ath10k_hw_params ath10k_hw_params_list[] = {
{
.id = QCA988X_HW_2_0_VERSION,
.name = "qca988x hw2.0",
.patch_load_addr = QCA988X_HW_2_0_PATCH_LOAD_ADDR,
+ .supported_chips = qca988x_supported_chips,
+ .num_supported_chips = ARRAY_SIZE(qca988x_supported_chips),
.fw = {
.dir = QCA988X_HW_2_0_FW_DIR,
.fw = QCA988X_HW_2_0_FW_FILE,
@@ -719,10 +729,26 @@ static int ath10k_init_uart(struct ath10k *ar)
return 0;
}
+static int ath10k_core_check_chip_id(struct ath10k *ar, u32 chip_id,
+ const struct ath10k_hw_params *hw_params)
+{
+ u32 hw_revision = MS(chip_id, SOC_CHIP_ID_REV);
+ int i;
+
+ ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot chip_id 0x%08x hw_revision 0x%x\n",
+ chip_id, hw_revision);
+
+ for (i = 0; i < hw_params->num_supported_chips; i++)
+ if (hw_params->supported_chips[i] == hw_revision)
+ return 0;
+
+ return -ENOTSUPP;
+}
+
static int ath10k_init_hw_params(struct ath10k *ar)
{
const struct ath10k_hw_params *uninitialized_var(hw_params);
- int i;
+ int i, ret;
for (i = 0; i < ARRAY_SIZE(ath10k_hw_params_list); i++) {
hw_params = &ath10k_hw_params_list[i];
@@ -737,6 +763,13 @@ static int ath10k_init_hw_params(struct ath10k *ar)
return -EINVAL;
}
+ ret = ath10k_core_check_chip_id(ar, ar->chip_id, hw_params);
+ if (ret) {
+ ath10k_err(ar, "unsupported hardware %s chip_id 0x%08x\n",
+ hw_params->name, ar->chip_id);
+ return ret;
+ }
+
ar->hw_params = *hw_params;
ath10k_dbg(ar, ATH10K_DBG_BOOT, "Hardware name %s version 0x%x\n",
@@ -1055,34 +1088,6 @@ static int ath10k_core_probe_fw(struct ath10k *ar)
return 0;
}
-static int ath10k_core_check_chip_id(struct ath10k *ar)
-{
- u32 hw_revision = MS(ar->chip_id, SOC_CHIP_ID_REV);
-
- ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot chip_id 0x%08x hw_revision 0x%x\n",
- ar->chip_id, hw_revision);
-
- /* Check that we are not using hw1.0 (some of them have same pci id
- * as hw2.0) before doing anything else as ath10k crashes horribly
- * due to missing hw1.0 workarounds. */
- switch (hw_revision) {
- case QCA988X_HW_1_0_CHIP_ID_REV:
- ath10k_err(ar, "ERROR: qca988x hw1.0 is not supported\n");
- return -EOPNOTSUPP;
-
- case QCA988X_HW_2_0_CHIP_ID_REV:
- /* known hardware revision, continue normally */
- return 0;
-
- default:
- ath10k_warn(ar, "Warning: hardware revision unknown (0x%x), expect problems\n",
- ar->chip_id);
- return 0;
- }
-
- return 0;
-}
-
static void ath10k_core_register_work(struct work_struct *work)
{
struct ath10k *ar = container_of(work, struct ath10k, register_work);
@@ -1130,16 +1135,7 @@ err:
int ath10k_core_register(struct ath10k *ar, u32 chip_id)
{
- int status;
-
ar->chip_id = chip_id;
-
- status = ath10k_core_check_chip_id(ar);
- if (status) {
- ath10k_err(ar, "Unsupported chip id 0x%08x\n", ar->chip_id);
- return status;
- }
-
queue_work(ar->workqueue, &ar->register_work);
return 0;
diff --git a/drivers/net/wireless/ath/ath10k/core.h b/drivers/net/wireless/ath/ath10k/core.h
index 8f86bd3..d37ffd6 100644
--- a/drivers/net/wireless/ath/ath10k/core.h
+++ b/drivers/net/wireless/ath/ath10k/core.h
@@ -475,7 +475,8 @@ struct ath10k {
u32 id;
const char *name;
u32 patch_load_addr;
-
+ const u32 *supported_chips;
+ int num_supported_chips;
struct ath10k_hw_params_fw {
const char *dir;
const char *fw;
--
1.8.5.3
More information about the ath10k
mailing list