Received: by 2002:a05:6a10:5bc5:0:0:0:0 with SMTP id os5csp1245178pxb; Mon, 11 Oct 2021 01:25:45 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzswcbftV4IcRRrdz/85d9sL/okYkvwM06nIQI3/cci5MUqNrDQ6g7J7HIrezGv3PiyQZYF X-Received: by 2002:a05:6402:19b5:: with SMTP id o21mr40348863edz.214.1633940745582; Mon, 11 Oct 2021 01:25:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1633940745; cv=none; d=google.com; s=arc-20160816; b=nBjfweQjvgSoXjSbWgXsI9V6AqxowQnRm7Fhn44OD3ckkDST9rapPXYQKheEEHVLsI 9OTSB/T/PKrzqFN1S8jz+5thxIJoSxFTZ1QHxskuvYlR6FwHIJSYogWVe9rvtSW8YNeO oSUn/FNzNYNy2EANX0hntM0KRm1yY0O4Bysa1K6+G3V8BORmA4Ao6YoJ8AQjATR712V8 0iLQdAaoH7ZE2E1OqrlBCp7B9pOq+GIGsfdbepa50jV2MbP524cKazPTSb0E6+3rC5vK BXdmd28nHPlo+h8ZyWkQKY220azlLLucDKU1gkeAcb7tnQUDEqUOSPt3mkeEyZHunYMO DDuQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dmarc-filter:sender :dkim-signature; bh=XIABq1LHDIFVVelZFIGS9twDlDWU/H8kFo1zOy38pgs=; b=0NDT8INB0RXuNEB3HRni1K2VYp1JBSfcAArxy7ZvAEejZZGQ3/8NSfbAPSPJslKL5d RCY8pTy0UG/iYCzhlgVD5iw0CT4vKwZPBdBe5H8VSiwkV1iA1GxSYBpYoe5UGrSdS+lu QvkCr/chHTUJ7gL6Y1GKb/KqWIMZhZr3BeZDj4J8/1NpiywUz66GGUj/3NvfkoFQjTme 1ir/aS0sbwdRbejGdWyiaTOygotqQ90sbLeBOJfSTdwbsCpEUaWcoI7VaFMOdMoCKHVe yYc5RH0yReAKmMqf2JJw7VWIRCMFKXzc+Ly6wWeCFWVhfUJYsp0tUeT+b4kNrtIuYB1H CZHA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@mg.codeaurora.org header.s=smtp header.b=d74H8p5d; spf=pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-wireless-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id y13si12536053edd.94.2021.10.11.01.25.27; Mon, 11 Oct 2021 01:25:45 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@mg.codeaurora.org header.s=smtp header.b=d74H8p5d; spf=pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-wireless-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234964AbhJKI0o (ORCPT + 76 others); Mon, 11 Oct 2021 04:26:44 -0400 Received: from m43-7.mailgun.net ([69.72.43.7]:22314 "EHLO m43-7.mailgun.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234921AbhJKI0n (ORCPT ); Mon, 11 Oct 2021 04:26:43 -0400 DKIM-Signature: a=rsa-sha256; v=1; c=relaxed/relaxed; d=mg.codeaurora.org; q=dns/txt; s=smtp; t=1633940684; h=Content-Transfer-Encoding: MIME-Version: Message-Id: Date: Subject: Cc: To: From: Sender; bh=XIABq1LHDIFVVelZFIGS9twDlDWU/H8kFo1zOy38pgs=; b=d74H8p5dE/JBpKEPxakfglQpihVjANTPkYL6lvsCOYYhr2qbtaYYZ0t9/X2H32lGYjL6wNev G8p7EvhImNWcAvqfOrvlbN7oBQxuGTK1jF/Pegru9yn3NK7LqHWX6pZqDabdhJW524v0I5hC U4LBfgQxfhKj1EzfIgUJQu+1TgU= X-Mailgun-Sending-Ip: 69.72.43.7 X-Mailgun-Sid: WyI3YTAwOSIsICJsaW51eC13aXJlbGVzc0B2Z2VyLmtlcm5lbC5vcmciLCAiYmU5ZTRhIl0= Received: from smtp.codeaurora.org (ec2-35-166-182-171.us-west-2.compute.amazonaws.com [35.166.182.171]) by smtp-out-n02.prod.us-east-1.postgun.com with SMTP id 6163f4cc0605239689f848e9 (version=TLS1.2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256); Mon, 11 Oct 2021 08:24:44 GMT Sender: wgong=codeaurora.org@mg.codeaurora.org Received: by smtp.codeaurora.org (Postfix, from userid 1001) id 4C134C4360D; Mon, 11 Oct 2021 08:24:43 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-caf-mail-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=ALL_TRUSTED,BAYES_00,SPF_FAIL, URIBL_BLOCKED autolearn=no autolearn_force=no version=3.4.0 Received: from wgong-HP3-Z230-SFF-Workstation.qca.qualcomm.com (unknown [180.166.53.21]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: wgong) by smtp.codeaurora.org (Postfix) with ESMTPSA id D90C3C43460; Mon, 11 Oct 2021 08:24:40 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 smtp.codeaurora.org D90C3C43460 Authentication-Results: aws-us-west-2-caf-mail-1.web.codeaurora.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: aws-us-west-2-caf-mail-1.web.codeaurora.org; spf=fail smtp.mailfrom=codeaurora.org From: Wen Gong To: ath11k@lists.infradead.org Cc: linux-wireless@vger.kernel.org, wgong@codeaurora.org Subject: [PATCH] ath11k: add read variant from SMBIOS for download board data Date: Mon, 11 Oct 2021 04:24:33 -0400 Message-Id: <20211011082433.30415-1-wgong@codeaurora.org> X-Mailer: git-send-email 2.31.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org This is to read variant from SMBIOS such as read from DT, the variant string will be used to one part of string which used to search board data from board-2.bin. Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-01720.1-QCAHSPSWPL_V1_V2_SILICONZ_LITE-1 Signed-off-by: Wen Gong --- drivers/net/wireless/ath/ath11k/core.c | 74 ++++++++++++++++++++++++++ drivers/net/wireless/ath/ath11k/core.h | 11 ++++ drivers/net/wireless/ath/ath11k/qmi.c | 4 ++ 3 files changed, 89 insertions(+) diff --git a/drivers/net/wireless/ath/ath11k/core.c b/drivers/net/wireless/ath/ath11k/core.c index 354ad84a2bb8..ae2f52b4373d 100644 --- a/drivers/net/wireless/ath/ath11k/core.c +++ b/drivers/net/wireless/ath/ath11k/core.c @@ -8,6 +8,9 @@ #include #include #include +#include +#include + #include "core.h" #include "dp_tx.h" #include "dp_rx.h" @@ -372,6 +375,77 @@ int ath11k_core_resume(struct ath11k_base *ab) } EXPORT_SYMBOL(ath11k_core_resume); +static void ath11k_core_check_bdfext(const struct dmi_header *hdr, void *data) +{ + struct ath11k_base *ab = data; + const char *bdf_ext; + const char *magic = ATH11K_SMBIOS_BDF_EXT_MAGIC; + u8 bdf_enabled; + int i; + size_t len; + + if (ab->qmi.target.bdf_ext[0] != '\0') + return; + + if (hdr->type != ATH11K_SMBIOS_BDF_EXT_TYPE) + return; + + if (hdr->length != ATH11K_SMBIOS_BDF_EXT_LENGTH) { + ath11k_dbg(ab, ATH11K_DBG_BOOT, + "wrong smbios bdf ext type length (%d).\n", + hdr->length); + return; + } + + bdf_enabled = *((u8 *)hdr + ATH11K_SMBIOS_BDF_EXT_OFFSET); + if (!bdf_enabled) { + ath11k_dbg(ab, ATH11K_DBG_BOOT, "bdf variant name not found.\n"); + return; + } + + /* Only one string exists (per spec) */ + bdf_ext = (char *)hdr + hdr->length; + + if (memcmp(bdf_ext, magic, strlen(magic)) != 0) { + ath11k_dbg(ab, ATH11K_DBG_BOOT, + "bdf variant magic does not match.\n"); + return; + } + + len = strlen(bdf_ext); + for (i = 0; i < len; i++) { + if (!isascii(bdf_ext[i]) || !isprint(bdf_ext[i])) { + ath11k_dbg(ab, ATH11K_DBG_BOOT, + "bdf variant name contains non ascii chars.\n"); + return; + } + } + + /* Copy extension name without magic prefix */ + if (strscpy(ab->qmi.target.bdf_ext, bdf_ext + strlen(magic), + sizeof(ab->qmi.target.bdf_ext)) < 0) { + ath11k_dbg(ab, ATH11K_DBG_BOOT, + "bdf variant string is longer than the buffer can accommodate (variant: %s)\n", + bdf_ext); + return; + } + + ath11k_dbg(ab, ATH11K_DBG_BOOT, + "found and validated bdf variant smbios_type 0x%x bdf %s\n", + ATH11K_SMBIOS_BDF_EXT_TYPE, bdf_ext); +} + +int ath11k_core_check_smbios(struct ath11k_base *ab) +{ + ab->qmi.target.bdf_ext[0] = '\0'; + dmi_walk(ath11k_core_check_bdfext, ab); + + if (ab->qmi.target.bdf_ext[0] == '\0') + return -ENODATA; + + return 0; +} + int ath11k_core_check_dt(struct ath11k_base *ab) { size_t max_len = sizeof(ab->qmi.target.bdf_ext); diff --git a/drivers/net/wireless/ath/ath11k/core.h b/drivers/net/wireless/ath/ath11k/core.h index 63d569672cd2..dcc54d4cc096 100644 --- a/drivers/net/wireless/ath/ath11k/core.h +++ b/drivers/net/wireless/ath/ath11k/core.h @@ -1044,7 +1044,18 @@ int ath11k_core_fetch_board_data_api_1(struct ath11k_base *ab, char *name); void ath11k_core_free_bdf(struct ath11k_base *ab, struct ath11k_board_data *bd); int ath11k_core_check_dt(struct ath11k_base *ath11k); +/* SMBIOS type containing Board Data File Name Extension */ +#define ATH11K_SMBIOS_BDF_EXT_TYPE 0xF8 +/* SMBIOS type structure length (excluding strings-set) */ +#define ATH11K_SMBIOS_BDF_EXT_LENGTH 0x9 + +/* Offset pointing to Board Data File Name Extension */ +#define ATH11K_SMBIOS_BDF_EXT_OFFSET 0x8 + +/* The magic used by QCA spec */ +#define ATH11K_SMBIOS_BDF_EXT_MAGIC "BDF_" +int ath11k_core_check_smbios(struct ath11k_base *ab); void ath11k_core_halt(struct ath11k *ar); int ath11k_core_resume(struct ath11k_base *ab); int ath11k_core_suspend(struct ath11k_base *ab); diff --git a/drivers/net/wireless/ath/ath11k/qmi.c b/drivers/net/wireless/ath/ath11k/qmi.c index d9db74e597b5..77880ddc4d77 100644 --- a/drivers/net/wireless/ath/ath11k/qmi.c +++ b/drivers/net/wireless/ath/ath11k/qmi.c @@ -2089,6 +2089,10 @@ static int ath11k_qmi_request_target_cap(struct ath11k_base *ab) ab->qmi.target.fw_build_timestamp, ab->qmi.target.fw_build_id); + r = ath11k_core_check_smbios(ab); + if (r) + ath11k_dbg(ab, ATH11K_DBG_QMI, "SMBIOS bdf variant name not set.\n"); + r = ath11k_core_check_dt(ab); if (r) ath11k_dbg(ab, ATH11K_DBG_QMI, "DT bdf variant name not set.\n"); -- 2.31.1