get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/2218350/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 2218350,
    "url": "http://patchwork.ozlabs.org/api/patches/2218350/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/hostap/patch/20260401054901.3780435-8-peddolla.reddy@oss.qualcomm.com/",
    "project": {
        "id": 22,
        "url": "http://patchwork.ozlabs.org/api/projects/22/?format=api",
        "name": "HostAP Development",
        "link_name": "hostap",
        "list_id": "hostap.lists.infradead.org",
        "list_email": "hostap@lists.infradead.org",
        "web_url": "",
        "scm_url": "",
        "webscm_url": "",
        "list_archive_url": "",
        "list_archive_url_format": "",
        "commit_url_format": ""
    },
    "msgid": "<20260401054901.3780435-8-peddolla.reddy@oss.qualcomm.com>",
    "list_archive_url": null,
    "date": "2026-04-01T05:48:45",
    "name": "[RFC,07/23] PR: Replace format_and_bw attribute with preamble/BW bitmaps",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "4479edfc6d59d880426d44e1bff8060060e740e5",
    "submitter": {
        "id": 93026,
        "url": "http://patchwork.ozlabs.org/api/people/93026/?format=api",
        "name": "Peddolla Harshavardhan Reddy",
        "email": "peddolla.reddy@oss.qualcomm.com"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/hostap/patch/20260401054901.3780435-8-peddolla.reddy@oss.qualcomm.com/mbox/",
    "series": [
        {
            "id": 498276,
            "url": "http://patchwork.ozlabs.org/api/series/498276/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/hostap/list/?series=498276",
            "date": "2026-04-01T05:48:44",
            "name": "PR: Add nl80211 support and ranging for Proximity Detection",
            "version": 1,
            "mbox": "http://patchwork.ozlabs.org/series/498276/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/2218350/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/2218350/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "\n <hostap-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org>",
        "X-Original-To": "incoming@patchwork.ozlabs.org",
        "Delivered-To": "patchwork-incoming@legolas.ozlabs.org",
        "Authentication-Results": [
            "legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n secure) header.d=lists.infradead.org header.i=@lists.infradead.org\n header.a=rsa-sha256 header.s=bombadil.20210309 header.b=k3mTBYBz;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n unprotected) header.d=qualcomm.com header.i=@qualcomm.com header.a=rsa-sha256\n header.s=qcppdkim1 header.b=lQcputDy;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n unprotected) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com\n header.a=rsa-sha256 header.s=google header.b=AJbpuKJc;\n\tdkim-atps=neutral",
            "legolas.ozlabs.org;\n spf=none (no SPF record) smtp.mailfrom=lists.infradead.org\n (client-ip=2607:7c80:54:3::133; helo=bombadil.infradead.org;\n envelope-from=hostap-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org;\n receiver=patchwork.ozlabs.org)"
        ],
        "Received": [
            "from bombadil.infradead.org (bombadil.infradead.org\n [IPv6:2607:7c80:54:3::133])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4flvGc1wDmz1yHD\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 01 Apr 2026 16:50:29 +1100 (AEDT)",
            "from localhost ([::1] helo=bombadil.infradead.org)\n\tby bombadil.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux))\n\tid 1w7oSe-0000000E0ea-1ATO;\n\tWed, 01 Apr 2026 05:49:52 +0000",
            "from mx0b-0031df01.pphosted.com ([205.220.180.131])\n\tby bombadil.infradead.org with esmtps (Exim 4.98.2 #2 (Red Hat Linux))\n\tid 1w7oSc-0000000E0d5-0bLQ\n\tfor hostap@lists.infradead.org;\n\tWed, 01 Apr 2026 05:49:51 +0000",
            "from pps.filterd (m0279869.ppops.net [127.0.0.1])\n\tby mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id\n 6314CfRH1579362\n\tfor <hostap@lists.infradead.org>; Wed, 1 Apr 2026 05:49:49 GMT",
            "from mail-pl1-f199.google.com (mail-pl1-f199.google.com\n [209.85.214.199])\n\tby mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4d8mr2syh3-1\n\t(version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT)\n\tfor <hostap@lists.infradead.org>; Wed, 01 Apr 2026 05:49:49 +0000 (GMT)",
            "by mail-pl1-f199.google.com with SMTP id\n d9443c01a7336-2b0c96f5d9aso71673155ad.3\n        for <hostap@lists.infradead.org>;\n Tue, 31 Mar 2026 22:49:48 -0700 (PDT)",
            "from hu-peddolla-hyd.qualcomm.com ([202.46.23.25])\n        by smtp.gmail.com with ESMTPSA id\n d9443c01a7336-2b24268aa4fsm129919665ad.36.2026.03.31.22.49.45\n        (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n        Tue, 31 Mar 2026 22:49:46 -0700 (PDT)"
        ],
        "DKIM-Signature": [
            "v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed;\n\td=lists.infradead.org; s=bombadil.20210309; h=Sender:\n\tContent-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post:\n\tList-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To:\n\tMessage-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description:\n\tResent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:\n\tList-Owner; bh=Y/wQZAnLuMA2BsjcHAC684ZXs10Y2uZgWxIkUqeq/rQ=; b=k3mTBYBzuf3jNZ\n\tqaosMrVGoomgz7P+WOApuG8+ZljXMmxa/pLUTb2nwHJsDtRQOlT4N9zduE6qbNEN9/waPwIBTBaF0\n\toE73rkgOEePFdv9wPIcD1jF/oOEmIpWmlZ/ZcgO+t0HkA+7UwupO0NaV9RKb+ZU7tUgVNlrhWpzzI\n\tDgmziZhvrJ6WsiHEFLd4E9/J6WwqQxfW/uvpet1xjXo466NyzHzZrJ/6DRthQIH8s7s1ML46IV/5d\n\ti6c0096j4D8C1KltniLPBnYiCS8Ifg/BDM0mTpMbseswhkq/lSE097u7KZbTI7N44ZHDPBl5GFWJW\n\tJglHe1nRbtr1ZxsCPNaQ==;",
            "v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h=\n\tcc:content-transfer-encoding:date:from:in-reply-to:message-id\n\t:mime-version:references:subject:to; s=qcppdkim1; bh=EwsLGDo9YKj\n\t9icB+hZg8w0Wvql9eaMxsIrmgOaS07ts=; b=lQcputDy4T+0//4VFa1jzIe0BKO\n\tf117MlldsRvdIx5yi2KeCHsdYZoL9nUhoAqXU3LiUM9CKC+gDkWe+ksv8I6IJeoV\n\tnR1mb3mKgw4lF/aOjD2c9sYlG34y3N+y3hVgFJHExM88XeBYNTxh3hnzU0bnLDrt\n\t86OsS2+4iInO4jHPphC9rIlcAhh9H4CUPQhCSCwYvunX7NONn7I+iluSwNTWMTRy\n\tO7bvTJ8RnHpZXnzsifmHanvvVfDXj9Srm4ijmz7uH2HWa8WKAJvfylJX1R2yYOUC\n\tHPRnMhtm4f+HoIfpqtmrUIAeeR/bHxNwC4RyKNQ5lrTwQRsADp9Xwb3UtZg==",
            "v=1; a=rsa-sha256; c=relaxed/relaxed;\n        d=oss.qualcomm.com; s=google; t=1775022588; x=1775627388;\n darn=lists.infradead.org;\n        h=content-transfer-encoding:mime-version:references:in-reply-to\n         :message-id:date:subject:cc:to:from:from:to:cc:subject:date\n         :message-id:reply-to;\n        bh=EwsLGDo9YKj9icB+hZg8w0Wvql9eaMxsIrmgOaS07ts=;\n        b=AJbpuKJcjQI8KGDap2Lqz6CYUKRXx2IBQpp32Ft3gWPCtMtrnZMRuh/r73rwNi/1fK\n         Ovip7N3vA2gJY//bCD3NVqLggC65LTj35QgcWTDLaqDzj35YMa1VaPoa63pUafBnMJ1A\n         2QsH756OjnOO7znI/T/1Y3LiE3KU0FLsTcZhtnonN3OzXxamjiX3OGDkEIlNrj8UnhDg\n         MmF/WgTwxYaUgeJQmWf6N0PzQuykDRZLRarqgOqU2XeN680C1DYkCNysagG8CCqgqQzl\n         vtOcOsyOeVHPARw6BfA6a3ddSLXMbGd4EXOVcnbBMCYiXe5whQenWEfYmAPnN6lpuIQ7\n         STSQ=="
        ],
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n        d=1e100.net; s=20251104; t=1775022588; x=1775627388;\n        h=content-transfer-encoding:mime-version:references:in-reply-to\n         :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from\n         :to:cc:subject:date:message-id:reply-to;\n        bh=EwsLGDo9YKj9icB+hZg8w0Wvql9eaMxsIrmgOaS07ts=;\n        b=AsI9vEf0JaAl9pikiHCmCprNRFTB0Tu/nIusmLGtjck03vRGnQn3PeFfFdCeFOPSs+\n         EhHgLxempM4G9+fv0svTdiJlQU7Myj5dG2xSmaoFvLK+WcMVovQhT49rzJJCTM5Kj0ST\n         nWEAA9YWTWwY6by54wVosCiz5vAHAIvSpdOmk18bIKMrHJ/KxR6/eYwPmyTaUj59CYKC\n         4AfIS7eB68S3HNosBxh5GeVaBZPa/Q6zQi39J6ibHlZHr93YUVwG+vWLlsj8Y5n1ZgWQ\n         /ZTlckHp7u+yht1U5+1h8RcKzXMeBEu9oSnVTw1usF//oJnfPc/mkbJN+W0wVjCb3CER\n         h/Qg==",
        "X-Gm-Message-State": "AOJu0Yyvi1XqtQg06NsSdAbFgxCbW6kYU91zOFNQSXmkJLFQUswnff5I\n\td/QHzuT8qcKWnPBdWO/YtARYrt9qSQl1ylS4f5US2B9U9QeIP10jbQTi0i6TFHV2BjJYiJIdtNJ\n\t7rym7Mt//eTmV5/e9OSZ3fgWMGVXPJcQ4I5KvgCfJwQqPBwpiti91Mz8gsi4LVamNO8oH+DQ=",
        "X-Gm-Gg": "ATEYQzwJ0Tg4SbLbDfNaKCKjBAjoQnmD2MSYbNPIhhtpfFMrmlpfN5jQr7m8QCLKIs+\n\ti4oGOsI/Q3gRjVWP7KvAF8oiZBLiTX0YxnpLWN6V3+lx9KG0Ewlka3Na0RsUEgim79i0DLXW7eo\n\tPSk5krpCornp27jYtS3+ITPSosiPSmz6sjvYs///JFD2rVvN72LgZneFvkt/Zy9DO/DCC4eT29z\n\tFulcumnlXBbLt4yI7x4sww7vc0gWTgYSbmvYCmioan1K14kg6zfl1Ebie26lJE2qycIWakNRlyv\n\tgRuTHzwthCM05FE9MMAi4XL6w8r/fnqLNBs0shm+S5f2HPN3TrNs90h1VnYCDCsfda3my8mhboT\n\ttki/UfQZ4UE5hqGjVAe9RNpdHR/F6gIMFhWL51F4vdUQS+ZEPPEmM7Ms=",
        "X-Received": [
            "by 2002:a17:903:1a2e:b0:2b0:67fa:dbf8 with SMTP id\n d9443c01a7336-2b269cb54b7mr20926945ad.41.1775022588050;\n        Tue, 31 Mar 2026 22:49:48 -0700 (PDT)",
            "by 2002:a17:903:1a2e:b0:2b0:67fa:dbf8 with SMTP id\n d9443c01a7336-2b269cb54b7mr20926645ad.41.1775022587391;\n        Tue, 31 Mar 2026 22:49:47 -0700 (PDT)"
        ],
        "From": "Peddolla Harshavardhan Reddy <peddolla.reddy@oss.qualcomm.com>",
        "To": "hostap@lists.infradead.org",
        "Cc": "vjakkam@qti.qualcomm.com",
        "Subject": "[RFC PATCH 07/23] PR: Replace format_and_bw attribute with\n preamble/BW bitmaps",
        "Date": "Wed,  1 Apr 2026 11:18:45 +0530",
        "Message-Id": "<20260401054901.3780435-8-peddolla.reddy@oss.qualcomm.com>",
        "X-Mailer": "git-send-email 2.34.1",
        "In-Reply-To": "<20260401054901.3780435-1-peddolla.reddy@oss.qualcomm.com>",
        "References": "<20260401054901.3780435-1-peddolla.reddy@oss.qualcomm.com>",
        "MIME-Version": "1.0",
        "X-Authority-Analysis": "v=2.4 cv=B+O0EetM c=1 sm=1 tr=0 ts=69ccb1fd cx=c_pps\n a=JL+w9abYAAE89/QcEU+0QA==:117 a=ZePRamnt/+rB5gQjfz0u9A==:17\n a=A5OVakUREuEA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22\n a=u7WPNUs3qKkmUXheDGA7:22 a=_glEPmIy2e8OvE2BGh3C:22 a=EUspDBNiAAAA:8\n a=laRkR58e-_SVC4nc97YA:9 a=324X-CrmTo6CU4MGRt3R:22",
        "X-Proofpoint-ORIG-GUID": "eZ-TDIsEMDWGaIX6nzMlg4hbEcxjri5Q",
        "X-Proofpoint-Spam-Details-Enc": "AW1haW4tMjYwNDAxMDA0NyBTYWx0ZWRfX2ZO1u2P75YSq\n 1Gx16sfKBhGB6s9NMEHEijYOoAZi0/JcQva9br13fEbUrkY9bEo0TLRZ99TI4pdp4o38tQs2UfR\n Z7+0FXmJPht3N1w+G0IBOni8Rw2vqcGLBesXjuv18g8lzpog2Fy9Xth6eFlxLH7JSzoDHrAUA1O\n q+Jqd2iBZCQLGr0IJ1y7E8d8Jt8YOryGLtvIChFCDOmyVXgrbp2S6c/eIOuRFSXKGQn/Dw9nx+X\n PzVMpYGByREERMPmIo5msk1qSMuDLhFU3Gpskji/kawqHQaeeb7v/nWyznooG48yD4PH5s3migw\n 9g6N7xHliP2Ah8QQo1d98V8UzKT6mEbHKULGjjS9docGkxRNaZtw//eMITNoA6/UxqmBfTrL2NB\n 0CZ8evSV5aajVYqTmbSEYEnG/L/Yq2UA0x/HSYNkypKrBP3jbJlnF6cXFwthKewe4tRjiFSj6eL\n 92v7snQ2PgjlIHWfMLw==",
        "X-Proofpoint-GUID": "eZ-TDIsEMDWGaIX6nzMlg4hbEcxjri5Q",
        "X-Proofpoint-Virus-Version": "vendor=baseguard\n engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49\n definitions=2026-04-01_02,2026-03-31_02,2025-10-01_01",
        "X-Proofpoint-Spam-Details": "rule=outbound_notspam policy=outbound score=0\n priorityscore=1501 impostorscore=0 adultscore=0 malwarescore=0\n lowpriorityscore=0 spamscore=0 clxscore=1015 suspectscore=0 phishscore=0\n bulkscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound\n adjust=0 reason=mlx scancount=1 engine=8.22.0-2603050001\n definitions=main-2604010047",
        "X-CRM114-Version": "20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 ",
        "X-CRM114-CacheID": "sfid-20260331_224950_301423_F91D3EF8 ",
        "X-CRM114-Status": "GOOD (  22.67  )",
        "X-Spam-Score": "0.2 (/)",
        "X-Spam-Report": "Spam detection software,\n running on the system \"bombadil.infradead.org\",\n has NOT identified this incoming email as spam.  The original\n message has been attached to this so you can view it or label\n similar future email.  If you have any questions, see\n the administrator of that system for details.\n Content preview:  The PD ranging capability used a single\n format-and-bandwidth\n    attribute in wpa_driver_capa to represent the best supported combination.\n    This only considered the highest supported bandwidth and assumed [...]\n Content analysis details:   (0.2 points, 5.0 required)\n  pts rule name              description\n ---- ----------------------\n --------------------------------------------------\n -0.7 RCVD_IN_DNSWL_LOW      RBL: Sender listed at https://www.dnswl.org/, low\n                             trust\n                             [205.220.180.131 listed in list.dnswl.org]\n  0.0 SPF_HELO_NONE          SPF: HELO does not publish an SPF Record\n -0.0 SPF_PASS               SPF: sender matches SPF record\n  0.1 DKIM_SIGNED            Message has a DKIM or DK signature,\n not necessarily valid\n -0.1 DKIM_VALID_EF          Message has a valid DKIM or DK signature from\n                             envelope-from domain\n -0.1 DKIM_VALID_AU          Message has a valid DKIM or DK signature from\n author's\n                             domain\n -0.1 DKIM_VALID             Message has at least one valid DKIM or DK\n signature\n -1.9 BAYES_00               BODY: Bayes spam probability is 0 to 1%\n                             [score: 0.0000]\n  1.0 RCVD_IN_VALIDITY_CERTIFIED_BLOCKED RBL: ADMINISTRATOR NOTICE: The\n                             query to Validity was blocked.  See\n                             https://knowledge.validity.com/hc/en-us/articles/20961730681243\n                              for more information.\n                        [205.220.180.131 listed in\n sa-trusted.bondedsender.org]\n  1.0 RCVD_IN_VALIDITY_SAFE_BLOCKED RBL: ADMINISTRATOR NOTICE: The query to\n                              Validity was blocked.  See\n                             https://knowledge.validity.com/hc/en-us/articles/20961730681243\n                              for more information.\n                             [205.220.180.131 listed in\n sa-accredit.habeas.com]\n  1.0 RCVD_IN_VALIDITY_RPBL_BLOCKED RBL: ADMINISTRATOR NOTICE: The query to\n                              Validity was blocked.  See\n                             https://knowledge.validity.com/hc/en-us/articles/20961730681243\n                              for more information.\n                           [205.220.180.131 listed in\n bl.score.senderscore.com]",
        "X-BeenThere": "hostap@lists.infradead.org",
        "X-Mailman-Version": "2.1.34",
        "Precedence": "list",
        "List-Id": "<hostap.lists.infradead.org>",
        "List-Unsubscribe": "<http://lists.infradead.org/mailman/options/hostap>,\n <mailto:hostap-request@lists.infradead.org?subject=unsubscribe>",
        "List-Archive": "<http://lists.infradead.org/pipermail/hostap/>",
        "List-Post": "<mailto:hostap@lists.infradead.org>",
        "List-Help": "<mailto:hostap-request@lists.infradead.org?subject=help>",
        "List-Subscribe": "<http://lists.infradead.org/mailman/listinfo/hostap>,\n <mailto:hostap-request@lists.infradead.org?subject=subscribe>",
        "Content-Type": "text/plain; charset=\"us-ascii\"",
        "Content-Transfer-Encoding": "7bit",
        "Sender": "\"Hostap\" <hostap-bounces@lists.infradead.org>",
        "Errors-To": "hostap-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org"
    },
    "content": "The PD ranging capability used a single format-and-bandwidth\nattribute in wpa_driver_capa to represent the best supported\ncombination. This only considered the highest supported bandwidth\nand assumed all lower bandwidths were also supported, which is\nnot always the case. The channel population logic inherited the\nsame assumption.\n\nReplace the attribute with separate preamble and bandwidth\nbitmaps so each supported combination is explicitly represented.\nParse the corresponding nl80211 attributes to populate these\nbitmaps and remove the now redundant attribute from driver.h.\nUpdate the channel population logic to check each operating\nclass bandwidth directly against the bitmap rather than\ninferring support from the highest supported value.\n\nFixes: f45cc220e4bb (\"PR: Update PR device configs and capabilities from driver\")\nFixes: cfe7a215db0b (\"PR: Determine channels that are supported to perform ranging\")\nSigned-off-by: Peddolla Harshavardhan Reddy <peddolla.reddy@oss.qualcomm.com>\n---\n src/common/proximity_ranging.h    |   8 ++\n src/drivers/driver.h              |  28 ++++-\n src/drivers/driver_nl80211_capa.c |  12 ++\n wpa_supplicant/pr_supplicant.c    | 181 ++++++++++++++++--------------\n 4 files changed, 143 insertions(+), 86 deletions(-)",
    "diff": "diff --git a/src/common/proximity_ranging.h b/src/common/proximity_ranging.h\nindex 536d51375..57481fe4c 100644\n--- a/src/common/proximity_ranging.h\n+++ b/src/common/proximity_ranging.h\n@@ -98,6 +98,7 @@ enum edca_format_and_bw_value {\n \tEDCA_FORMAT_AND_BW_VHT80P80 = 14,\n \tEDCA_FORMAT_AND_BW_VHT160_DUAL_LO = 15,\n \tEDCA_FORMAT_AND_BW_VHT160_SINGLE_LO = 16,\n+\tEDCA_FORMAT_AND_BW_MAX,\n };\n \n /**\n@@ -114,6 +115,7 @@ enum ntb_format_and_bw_value {\n \tNTB_FORMAT_AND_BW_HE80P80 = 3,\n \tNTB_FORMAT_AND_BW_HE160_DUAL_LO = 4,\n \tNTB_FORMAT_AND_BW_HE160_SINGLE_LO = 5,\n+\tNTB_FORMAT_AND_BW_MAX,\n };\n \n struct pr_capabilities {\n@@ -356,6 +358,9 @@ struct pr_config {\n \n \tbool edca_rsta_support;\n \n+\tu32 edca_format_bw_bitmap;\n+\n+\t/* Best single format_bw value derived from edca_format_bw_bitmap */\n \tu8 edca_format_and_bw;\n \n \tu32 edca_min_ranging_interval;\n@@ -396,6 +401,9 @@ struct pr_config {\n \n \tu8 max_tx_sts_gt_80;\n \n+\tu32 ntb_format_bw_bitmap;\n+\n+\t/* Best single format_bw value derived from ntb_format_bw_bitmap */\n \tu8 ntb_format_and_bw;\n \n \tu32 ntb_min_ranging_interval;\ndiff --git a/src/drivers/driver.h b/src/drivers/driver.h\nindex 4463f6d3d..06dd21e1b 100644\n--- a/src/drivers/driver.h\n+++ b/src/drivers/driver.h\n@@ -2580,14 +2580,38 @@ struct wpa_driver_capa {\n \t * Request frames */\n \tsize_t max_probe_req_ie_len;\n \n+/**\n+ * Channel width index values used in PD ranging capability bitmaps\n+ * (pd_edca_bandwidths, pd_ntb_bandwidths).  The bit position in the bitmap\n+ * corresponds to the channel width; these values match the nl80211_chan_width\n+ * enum so that drivers can use them directly.\n+ */\n+#define WPA_PR_CHAN_WIDTH_20\t1\n+#define WPA_PR_CHAN_WIDTH_40\t2\n+#define WPA_PR_CHAN_WIDTH_80\t3\n+#define WPA_PR_CHAN_WIDTH_80P80\t4\n+#define WPA_PR_CHAN_WIDTH_160\t5\n+\n+/**\n+ * Preamble index values used in PD ranging capability bitmaps\n+ * (pd_edca_preambles, pd_ntb_preambles).  The bit position in the bitmap\n+ * corresponds to the preamble type; these values match the nl80211_preamble\n+ * enum so that drivers can use them directly.\n+ */\n+#define WPA_PR_PREAMBLE_HT\t1\n+#define WPA_PR_PREAMBLE_VHT\t2\n+#define WPA_PR_PREAMBLE_HE\t4\n+\n \t/* EDCA based ranging capabilities */\n-\tu8 edca_format_and_bw;\n+\tu32 pd_edca_preambles;\n+\tu32 pd_edca_bandwidths;\n \tu8 max_tx_antenna;\n \tu8 max_rx_antenna;\n \tu32 edca_min_ranging_interval;\n \n \t/* NTB based ranging capabilities */\n-\tu8 ntb_format_and_bw;\n+\tu32 pd_ntb_preambles;\n+\tu32 pd_ntb_bandwidths;\n \tu8 max_tx_ltf_repetations;\n \tu8 max_rx_ltf_repetations;\n \tu8 max_tx_ltf_total;\ndiff --git a/src/drivers/driver_nl80211_capa.c b/src/drivers/driver_nl80211_capa.c\nindex 0a6d999ba..6cf79032b 100644\n--- a/src/drivers/driver_nl80211_capa.c\n+++ b/src/drivers/driver_nl80211_capa.c\n@@ -1037,6 +1037,18 @@ static void pmsr_type_ftm_handler(struct wpa_driver_nl80211_data *drv,\n \tif (tb[NL80211_PMSR_FTM_CAPA_ATTR_MIN_INTERVAL_NTB])\n \t\tdrv->capa.ntb_min_ranging_interval =\n \t\t\tnla_get_u32(tb[NL80211_PMSR_FTM_CAPA_ATTR_MIN_INTERVAL_NTB]);\n+\tif (tb[NL80211_PMSR_FTM_CAPA_ATTR_PD_EDCA_PREAMBLES])\n+\t\tdrv->capa.pd_edca_preambles =\n+\t\t\tnla_get_u32(tb[NL80211_PMSR_FTM_CAPA_ATTR_PD_EDCA_PREAMBLES]);\n+\tif (tb[NL80211_PMSR_FTM_CAPA_ATTR_PD_NTB_PREAMBLES])\n+\t\tdrv->capa.pd_ntb_preambles =\n+\t\t\tnla_get_u32(tb[NL80211_PMSR_FTM_CAPA_ATTR_PD_NTB_PREAMBLES]);\n+\tif (tb[NL80211_PMSR_FTM_CAPA_ATTR_PD_EDCA_BANDWIDTHS])\n+\t\tdrv->capa.pd_edca_bandwidths =\n+\t\t\tnla_get_u32(tb[NL80211_PMSR_FTM_CAPA_ATTR_PD_EDCA_BANDWIDTHS]);\n+\tif (tb[NL80211_PMSR_FTM_CAPA_ATTR_PD_NTB_BANDWIDTHS])\n+\t\tdrv->capa.pd_ntb_bandwidths =\n+\t\t\tnla_get_u32(tb[NL80211_PMSR_FTM_CAPA_ATTR_PD_NTB_BANDWIDTHS]);\n }\n \n \ndiff --git a/wpa_supplicant/pr_supplicant.c b/wpa_supplicant/pr_supplicant.c\nindex 1d4dc9fe1..d48fefed1 100644\n--- a/wpa_supplicant/pr_supplicant.c\n+++ b/wpa_supplicant/pr_supplicant.c\n@@ -24,115 +24,118 @@ static void wpas_pr_pasn_timeout(void *eloop_ctx, void *timeout_ctx);\n #endif /* CONFIG_PASN */\n \n \n-static int wpas_pr_edca_get_bw(enum edca_format_and_bw_value format_and_bw)\n+static enum edca_format_and_bw_value\n+wpas_pr_best_edca_format_bw(u32 bw_bitmap, u32 preamble_bitmap)\n {\n-\tswitch (format_and_bw) {\n-\tcase EDCA_FORMAT_AND_BW_VHT20:\n-\t\treturn 20;\n-\tcase EDCA_FORMAT_AND_BW_HT40:\n-\tcase EDCA_FORMAT_AND_BW_VHT40:\n-\t\treturn 40;\n-\tcase EDCA_FORMAT_AND_BW_VHT80:\n-\t\treturn 80;\n-\tcase EDCA_FORMAT_AND_BW_VHT80P80:\n-\tcase EDCA_FORMAT_AND_BW_VHT160_DUAL_LO:\n-\tcase EDCA_FORMAT_AND_BW_VHT160_SINGLE_LO:\n-\t\treturn 160;\n-\tdefault:\n-\t\treturn 0;\n-\t}\n+\t/* Prefer highest bandwidth first */\n+\tif ((bw_bitmap & BIT(WPA_PR_CHAN_WIDTH_160)) &&\n+\t    (preamble_bitmap & BIT(WPA_PR_PREAMBLE_VHT)))\n+\t\treturn EDCA_FORMAT_AND_BW_VHT160_DUAL_LO;\n+\tif ((bw_bitmap & BIT(WPA_PR_CHAN_WIDTH_80P80)) &&\n+\t    (preamble_bitmap & BIT(WPA_PR_PREAMBLE_VHT)))\n+\t\treturn EDCA_FORMAT_AND_BW_VHT80P80;\n+\tif ((bw_bitmap & BIT(WPA_PR_CHAN_WIDTH_80)) &&\n+\t    (preamble_bitmap & BIT(WPA_PR_PREAMBLE_VHT)))\n+\t\treturn EDCA_FORMAT_AND_BW_VHT80;\n+\tif ((bw_bitmap & BIT(WPA_PR_CHAN_WIDTH_40)) &&\n+\t    (preamble_bitmap & BIT(WPA_PR_PREAMBLE_VHT)))\n+\t\treturn EDCA_FORMAT_AND_BW_VHT40;\n+\tif ((bw_bitmap & BIT(WPA_PR_CHAN_WIDTH_40)) &&\n+\t    (preamble_bitmap & BIT(WPA_PR_PREAMBLE_HT)))\n+\t\treturn EDCA_FORMAT_AND_BW_HT40;\n+\tif ((bw_bitmap & BIT(WPA_PR_CHAN_WIDTH_20)) &&\n+\t    (preamble_bitmap & BIT(WPA_PR_PREAMBLE_VHT)))\n+\t\treturn EDCA_FORMAT_AND_BW_VHT20;\n+\treturn EDCA_FORMAT_AND_BW_MAX;\n }\n \n \n-static int wpas_pr_ntb_get_bw(enum ntb_format_and_bw_value format_and_bw)\n+static enum ntb_format_and_bw_value\n+wpas_pr_best_ntb_format_bw(u32 bw_bitmap, u32 preamble_bitmap)\n {\n-\tswitch (format_and_bw) {\n-\tcase NTB_FORMAT_AND_BW_HE20:\n-\t\treturn 20;\n-\tcase NTB_FORMAT_AND_BW_HE40:\n-\t\treturn 40;\n-\tcase NTB_FORMAT_AND_BW_HE80:\n-\t\treturn 80;\n-\tcase NTB_FORMAT_AND_BW_HE80P80:\n-\tcase NTB_FORMAT_AND_BW_HE160_DUAL_LO:\n-\tcase NTB_FORMAT_AND_BW_HE160_SINGLE_LO:\n-\t\treturn 160;\n-\tdefault:\n-\t\treturn 0;\n-\t}\n+\tif (!(preamble_bitmap & BIT(WPA_PR_PREAMBLE_HE)))\n+\t\treturn NTB_FORMAT_AND_BW_MAX;\n+\n+\tif (bw_bitmap & BIT(WPA_PR_CHAN_WIDTH_160))\n+\t\treturn NTB_FORMAT_AND_BW_HE160_SINGLE_LO;\n+\tif (bw_bitmap & BIT(WPA_PR_CHAN_WIDTH_80P80))\n+\t\treturn NTB_FORMAT_AND_BW_HE80P80;\n+\tif (bw_bitmap & BIT(WPA_PR_CHAN_WIDTH_80))\n+\t\treturn NTB_FORMAT_AND_BW_HE80;\n+\tif (bw_bitmap & BIT(WPA_PR_CHAN_WIDTH_40))\n+\t\treturn NTB_FORMAT_AND_BW_HE40;\n+\tif (bw_bitmap & BIT(WPA_PR_CHAN_WIDTH_20))\n+\t\treturn NTB_FORMAT_AND_BW_HE20;\n+\treturn NTB_FORMAT_AND_BW_MAX;\n }\n \n \n static bool\n-wpas_pr_edca_is_valid_op_class(enum edca_format_and_bw_value format_and_bw,\n+wpas_pr_edca_is_valid_op_class(u32 bw_bitmap, u32 preamble_bitmap,\n \t\t\t       const struct oper_class_map *op_class_map)\n {\n-\tint bw = 0, op_class_bw = 0;\n-\n \tif (!op_class_map)\n \t\treturn false;\n \n-\top_class_bw = oper_class_bw_to_int(op_class_map);\n-\tbw = wpas_pr_edca_get_bw(format_and_bw);\n-\n-\tif (!op_class_bw || !bw)\n+\tswitch (op_class_map->bw) {\n+\tcase BW20:\n+\t\treturn !!(bw_bitmap & BIT(WPA_PR_CHAN_WIDTH_20)) &&\n+\t\t       !!(preamble_bitmap & BIT(WPA_PR_PREAMBLE_VHT));\n+\tcase BW40PLUS:\n+\tcase BW40MINUS:\n+\tcase BW40:\n+\t\treturn !!(bw_bitmap & BIT(WPA_PR_CHAN_WIDTH_40)) &&\n+\t\t       !!(preamble_bitmap & (BIT(WPA_PR_PREAMBLE_VHT) |\n+\t\t\t\t\t     BIT(WPA_PR_PREAMBLE_HT)));\n+\tcase BW80:\n+\t\treturn !!(bw_bitmap & BIT(WPA_PR_CHAN_WIDTH_80)) &&\n+\t\t       !!(preamble_bitmap & BIT(WPA_PR_PREAMBLE_VHT));\n+\tcase BW80P80:\n+\t\treturn !!(bw_bitmap & BIT(WPA_PR_CHAN_WIDTH_80P80)) &&\n+\t\t       !!(preamble_bitmap & BIT(WPA_PR_PREAMBLE_VHT));\n+\tcase BW160:\n+\t\treturn !!(bw_bitmap & BIT(WPA_PR_CHAN_WIDTH_160)) &&\n+\t\t       !!(preamble_bitmap & BIT(WPA_PR_PREAMBLE_VHT));\n+\tdefault:\n \t\treturn false;\n-\n-\tif (format_and_bw <= EDCA_FORMAT_AND_BW_VHT80 &&\n-\t    format_and_bw >= EDCA_FORMAT_AND_BW_VHT20 &&\n-\t    op_class_bw <= bw)\n-\t\treturn true;\n-\n-\tif (format_and_bw == EDCA_FORMAT_AND_BW_VHT80P80 &&\n-\t    (op_class_bw < bw || op_class_map->bw == BW80P80))\n-\t\treturn true;\n-\n-\tif ((format_and_bw == EDCA_FORMAT_AND_BW_VHT160_DUAL_LO ||\n-\t     format_and_bw == EDCA_FORMAT_AND_BW_VHT160_SINGLE_LO) &&\n-\t    (op_class_bw < bw || op_class_map->bw == BW160))\n-\t\treturn true;\n-\n-\treturn false;\n+\t}\n }\n \n \n static bool\n-wpas_pr_ntb_is_valid_op_class(enum ntb_format_and_bw_value format_and_bw,\n+wpas_pr_ntb_is_valid_op_class(u32 bw_bitmap, u32 preamble_bitmap,\n \t\t\t      const struct oper_class_map *op_class_map)\n {\n-\tint bw = 0, op_class_bw = 0;\n-\n \tif (!op_class_map)\n \t\treturn false;\n \n-\top_class_bw = oper_class_bw_to_int(op_class_map);\n-\tbw = wpas_pr_ntb_get_bw(format_and_bw);\n-\n-\tif (!op_class_bw || !bw)\n+\t/* NTB ranging requires HE preamble */\n+\tif (!(preamble_bitmap & BIT(WPA_PR_PREAMBLE_HE)))\n \t\treturn false;\n \n-\tif (format_and_bw <= NTB_FORMAT_AND_BW_HE80 &&\n-\t    format_and_bw >= NTB_FORMAT_AND_BW_HE20 &&\n-\t    op_class_bw <= bw)\n-\t\treturn true;\n-\n-\tif (format_and_bw == NTB_FORMAT_AND_BW_HE80P80 &&\n-\t\t   (op_class_bw < bw || op_class_map->bw == BW80P80))\n-\t\treturn true;\n-\n-\tif ((format_and_bw == NTB_FORMAT_AND_BW_HE160_DUAL_LO ||\n-\t     format_and_bw == NTB_FORMAT_AND_BW_HE160_SINGLE_LO) &&\n-\t    (op_class_bw < bw || op_class_map->bw == BW160))\n-\t\treturn true;\n-\n-\treturn false;\n+\tswitch (op_class_map->bw) {\n+\tcase BW20:\n+\t\treturn !!(bw_bitmap & BIT(WPA_PR_CHAN_WIDTH_20));\n+\tcase BW40PLUS:\n+\tcase BW40MINUS:\n+\tcase BW40:\n+\t\treturn !!(bw_bitmap & BIT(WPA_PR_CHAN_WIDTH_40));\n+\tcase BW80:\n+\t\treturn !!(bw_bitmap & BIT(WPA_PR_CHAN_WIDTH_80));\n+\tcase BW80P80:\n+\t\treturn !!(bw_bitmap & BIT(WPA_PR_CHAN_WIDTH_80P80));\n+\tcase BW160:\n+\t\treturn !!(bw_bitmap & BIT(WPA_PR_CHAN_WIDTH_160));\n+\tdefault:\n+\t\treturn false;\n+\t}\n }\n \n \n static void\n wpas_pr_setup_edca_channels(struct wpa_supplicant *wpa_s,\n \t\t\t    struct pr_channels *chan,\n-\t\t\t    enum edca_format_and_bw_value format_and_bw)\n+\t\t\t    u32 bw_bitmap, u32 preamble_bitmap)\n {\n \tstruct hostapd_hw_modes *mode;\n \tint cla = 0, i;\n@@ -145,7 +148,8 @@ wpas_pr_setup_edca_channels(struct wpa_supplicant *wpa_s,\n \t\tmode = get_mode(wpa_s->hw.modes, wpa_s->hw.num_modes, o->mode,\n \t\t\t\tis_6ghz_op_class(o->op_class));\n \t\tif (!mode || is_6ghz_op_class(o->op_class) ||\n-\t\t    !wpas_pr_edca_is_valid_op_class(format_and_bw, o))\n+\t\t    !wpas_pr_edca_is_valid_op_class(bw_bitmap, preamble_bitmap,\n+\t\t\t\t\t\t    o))\n \t\t\tcontinue;\n \n \t\tfor (ch = o->min_chan; ch <= o->max_chan; ch += o->inc) {\n@@ -191,7 +195,7 @@ wpas_pr_setup_edca_channels(struct wpa_supplicant *wpa_s,\n static void\n wpas_pr_setup_ntb_channels(struct wpa_supplicant *wpa_s,\n \t\t\t   struct pr_channels *chan,\n-\t\t\t   enum ntb_format_and_bw_value format_and_bw,\n+\t\t\t   u32 bw_bitmap, u32 preamble_bitmap,\n \t\t\t   bool allow_6ghz)\n {\n \tint cla = 0, i;\n@@ -205,7 +209,8 @@ wpas_pr_setup_ntb_channels(struct wpa_supplicant *wpa_s,\n \t\tmode = get_mode(wpa_s->hw.modes, wpa_s->hw.num_modes, o->mode,\n \t\t\t\tis_6ghz_op_class(o->op_class));\n \t\tif (!mode || (!allow_6ghz && is_6ghz_op_class(o->op_class)) ||\n-\t\t    !wpas_pr_ntb_is_valid_op_class(format_and_bw, o))\n+\t\t    !wpas_pr_ntb_is_valid_op_class(bw_bitmap, preamble_bitmap,\n+\t\t\t\t\t\t   o))\n \t\t\tcontinue;\n \n \t\tfor (ch = o->min_chan; ch <= o->max_chan; ch += o->inc) {\n@@ -351,18 +356,25 @@ int wpas_pr_init(struct wpa_global *global, struct wpa_supplicant *wpa_s,\n \t\tWPA_DRIVER_FLAGS2_FTM_INITIATOR;\n \tpr.edca_rsta_support = !!(wpa_s->drv_flags2 &\n \t\tWPA_DRIVER_FLAGS2_PR_EDCA_RSTA_SUPPORT);\n-\tpr.edca_format_and_bw = capa->edca_format_and_bw;\n+\tpr.edca_format_bw_bitmap = capa->pd_edca_bandwidths;\n+\tpr.edca_format_and_bw =\n+\t\twpas_pr_best_edca_format_bw(capa->pd_edca_bandwidths,\n+\t\t\t\t\t    capa->pd_edca_preambles);\n \tpr.max_rx_antenna = capa->max_rx_antenna;\n \tpr.max_tx_antenna = capa->max_tx_antenna;\n \n \twpas_pr_setup_edca_channels(wpa_s, &pr.edca_channels,\n-\t\t\t\t    pr.edca_format_and_bw);\n+\t\t\t\t    capa->pd_edca_bandwidths,\n+\t\t\t\t    capa->pd_edca_preambles);\n \n \tpr.ntb_ista_support = wpa_s->drv_flags2 &\n \t\tWPA_DRIVER_FLAGS2_NON_TRIGGER_BASED_INITIATOR;\n \tpr.ntb_rsta_support = wpa_s->drv_flags2 &\n \t\tWPA_DRIVER_FLAGS2_NON_TRIGGER_BASED_RESPONDER;\n-\tpr.ntb_format_and_bw = capa->ntb_format_and_bw;\n+\tpr.ntb_format_bw_bitmap = capa->pd_ntb_bandwidths;\n+\tpr.ntb_format_and_bw =\n+\t\twpas_pr_best_ntb_format_bw(capa->pd_ntb_bandwidths,\n+\t\t\t\t\t   capa->pd_ntb_preambles);\n \tpr.max_tx_ltf_repetations = capa->max_tx_ltf_repetations;\n \tpr.max_rx_ltf_repetations = capa->max_rx_ltf_repetations;\n \tpr.max_tx_ltf_total = capa->max_tx_ltf_total;\n@@ -392,7 +404,8 @@ int wpas_pr_init(struct wpa_global *global, struct wpa_supplicant *wpa_s,\n \tpr.secure_he_ltf = wpa_s->drv_flags2 & WPA_DRIVER_FLAGS2_SEC_LTF_STA;\n \n \twpas_pr_setup_ntb_channels(wpa_s, &pr.ntb_channels,\n-\t\t\t\t   pr.ntb_format_and_bw,\n+\t\t\t\t   capa->pd_ntb_bandwidths,\n+\t\t\t\t   capa->pd_ntb_preambles,\n \t\t\t\t   pr.support_6ghz);\n \n \tif (wpa_s->conf->country[0] && wpa_s->conf->country[1]) {\n",
    "prefixes": [
        "RFC",
        "07/23"
    ]
}