From 0ac79009dd3433d5e92a8311beae1041f39c3b79 Mon Sep 17 00:00:00 2001 From: Rosen Penev Date: Wed, 1 Jan 2025 11:21:49 -0800 Subject: [PATCH] ath79: fix GPIO numbering with ath9k ath9k base starts at 512. This is a problem as it uses gpio_request_one to request the GPIO, which is legacy API. This upstream pending patch needs to also be ported to mac80211. Signed-off-by: Rosen Penev Link: https://github.com/openwrt/openwrt/pull/17445 Signed-off-by: Robert Marko --- .../341-wifi-ath9k-obtain-system-gpios.patch | 233 ++++++++++++++++++ 1 file changed, 233 insertions(+) create mode 100644 target/linux/ath79/patches-6.6/341-wifi-ath9k-obtain-system-gpios.patch diff --git a/target/linux/ath79/patches-6.6/341-wifi-ath9k-obtain-system-gpios.patch b/target/linux/ath79/patches-6.6/341-wifi-ath9k-obtain-system-gpios.patch new file mode 100644 index 00000000000..a43e3537e6e --- /dev/null +++ b/target/linux/ath79/patches-6.6/341-wifi-ath9k-obtain-system-gpios.patch @@ -0,0 +1,233 @@ +From patchwork Tue Apr 23 12:12:33 2024 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +X-Patchwork-Submitter: Linus Walleij +X-Patchwork-Id: 1926515 +Return-Path: + +X-Original-To: incoming@patchwork.ozlabs.org +Delivered-To: patchwork-incoming@legolas.ozlabs.org +Authentication-Results: legolas.ozlabs.org; + dkim=pass (2048-bit key; + unprotected) header.d=linaro.org header.i=@linaro.org header.a=rsa-sha256 + header.s=google header.b=qX99TQMM; + dkim-atps=neutral +Authentication-Results: legolas.ozlabs.org; + spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org + (client-ip=2604:1380:45e3:2400::1; helo=sv.mirrors.kernel.org; + envelope-from=linux-gpio+bounces-5755-incoming=patchwork.ozlabs.org@vger.kernel.org; + receiver=patchwork.ozlabs.org) +Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org + [IPv6:2604:1380:45e3:2400::1]) + (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) + key-exchange X25519 server-signature ECDSA (secp384r1)) + (No client certificate requested) + by legolas.ozlabs.org (Postfix) with ESMTPS id 4VP1Gc6RZKz1yZP + for ; Tue, 23 Apr 2024 22:12:56 +1000 (AEST) +Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org + [52.25.139.140]) + (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) + (No client certificate requested) + by sv.mirrors.kernel.org (Postfix) with ESMTPS id 5BB9C28522A + for ; Tue, 23 Apr 2024 12:12:55 +0000 (UTC) +Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) + by smtp.subspace.kernel.org (Postfix) with ESMTP id 2F83B8563D; + Tue, 23 Apr 2024 12:12:41 +0000 (UTC) +Authentication-Results: smtp.subspace.kernel.org; + dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org + header.b="qX99TQMM" +X-Original-To: linux-gpio@vger.kernel.org +Received: from mail-lj1-f179.google.com (mail-lj1-f179.google.com + [209.85.208.179]) + (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) + (No client certificate requested) + by smtp.subspace.kernel.org (Postfix) with ESMTPS id A8F3C82865 + for ; Tue, 23 Apr 2024 12:12:37 +0000 (UTC) +Authentication-Results: smtp.subspace.kernel.org; + arc=none smtp.client-ip=209.85.208.179 +ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; + t=1713874361; cv=none; + b=d6RcvcAu8hBYAK8Io489ZHQpJVXPwuokP6iMcAkbvElCerbXD6jAdqdi+RjDlo5C49GHGO4FQ19UwQn/VE//qSwiK1ulTSBp3OkvAmyb7yYAFnDs9AVNWRw+5/NxeFNn3fj5PyvqVymIbaJKabfrOVNwkz/5JMHxEIJtr6Crmog= +ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; + s=arc-20240116; t=1713874361; c=relaxed/simple; + bh=0eXJ5AIjzz1TBGZ8SlshIPrEHZaZwZfYEdof+dSpu4Y=; + h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:To:Cc; + b=EfFtruUxRIGy+jylEiJ2rPEyPCjGCc8ptT9FVxe6s0O/kW38Y6196xVQeiSV2tSKVCEOIO+9HoqmpgdKsJE7gU9++EcrasP96MYpsklYpc2zsWW3b8QEhfxfZ9Ai/idyYihE2u9dQ7a143P/Ij/twDrZTt24wO/mtHDrE5XcCFI= +ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; + dmarc=pass (p=none dis=none) header.from=linaro.org; + spf=pass smtp.mailfrom=linaro.org; + dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org + header.b=qX99TQMM; arc=none smtp.client-ip=209.85.208.179 +Authentication-Results: smtp.subspace.kernel.org; + dmarc=pass (p=none dis=none) header.from=linaro.org +Authentication-Results: smtp.subspace.kernel.org; + spf=pass smtp.mailfrom=linaro.org +Received: by mail-lj1-f179.google.com with SMTP id + 38308e7fff4ca-2dd041acff1so40839131fa.1 + for ; + Tue, 23 Apr 2024 05:12:37 -0700 (PDT) +DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=linaro.org; s=google; t=1713874356; x=1714479156; + darn=vger.kernel.org; + h=cc:to:message-id:content-transfer-encoding:mime-version:subject + :date:from:from:to:cc:subject:date:message-id:reply-to; + bh=vysJsMiH5IVqdTs4yMwZxZ7nUmt2aG7eBhkn8qm8hvI=; + b=qX99TQMMdHbskFYUaw8c93sIJsUhKmj/WPdyahHcupUhwn5wol4aVoPczkOKYwJZhE + eoInxzjAHIl3UNKyvPPrD4MrbLcSoFT6mTFMsgRQYUghsLattmGcqIebu9XT556dBhsf + DydmpqGgnTOIa+IEknFxg24mo8Xn2LVmDC7LSGEYykUy1xLHd1NSq56YEaYXC7641xeZ + 9TOL0rZszeGld5cCS3013EmEeXQGCC3lAP83Eb48vbFXjPojkN0s40rZ2s8YpVsGT0iP + LeLVtP/E8XJqi4YipKryKSgbgOvQ1Bclle5+s+2qcJQNnSEjekMwR59BIRs3OZH2SRfN + gQdQ== +X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=1e100.net; s=20230601; t=1713874356; x=1714479156; + h=cc:to:message-id:content-transfer-encoding:mime-version:subject + :date:from:x-gm-message-state:from:to:cc:subject:date:message-id + :reply-to; + bh=vysJsMiH5IVqdTs4yMwZxZ7nUmt2aG7eBhkn8qm8hvI=; + b=jEBH4NQ7SzFi2tnb1lgL06IchnBJoscNgKesjlorvou6X/9wDE/VbgxNFKR0zWwdTk + BEjG/ifFJxLmM9jdaCKu5cJc4yiDNXp7yZd48D71V34zJ4aINAGAx4hcOKqf95neFknx + nsFPpBFnTYFEpCLF0TebVoL6h6ehPzSojmkArzsrMppNvW2cwJ5gDlkqy2y4SezLanmM + 6iU0ksnwE0bb2iLkahhgo00Ejt33yqxwa+3xBfhOe9oYKSSZYnY7qVq055SSwt9IAq+H + REGyJN+GrvupTHagiioYe3LPXDPdOui9ZixXXDllw1t1yGUy+TkJu8xSqtvHEfg81FHP + AxtA== +X-Forwarded-Encrypted: i=1; + AJvYcCUbxzPklfPYrLgyY1I0ycuj7Dh04dcGVonYocA2mzxzlAEV107o0ELlFqr3O9Td+tV/t0eV9ly9YAbTY6n1XPnFXS5dsYYAZw6RHw== +X-Gm-Message-State: AOJu0YxsC7zdakTzntbiRFnN2A7yTrR0x+IpR6ce6eGn5kHeqIBi1km+ + zTVpRulbch3JsmzVDbCbbAAYoBkNgEA568YL6zdjVARnvFwNz1cqatOrR1AXUm0= +X-Google-Smtp-Source: + AGHT+IHBRMGvaJM98f86Z6m/RfVhK2XejjNGF3EvcRq/4x3oGM0DKpd2PbeCJdgmzHjLPVVbdsNzJg== +X-Received: by 2002:a2e:9852:0:b0:2d8:a98d:18e with SMTP id + e18-20020a2e9852000000b002d8a98d018emr7955886ljj.8.1713874355700; + Tue, 23 Apr 2024 05:12:35 -0700 (PDT) +Received: from [192.168.1.140] ([85.235.12.238]) + by smtp.gmail.com with ESMTPSA id + x6-20020a2e7c06000000b002da179d8d25sm1628982ljc.64.2024.04.23.05.12.33 + (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); + Tue, 23 Apr 2024 05:12:35 -0700 (PDT) +From: Linus Walleij +Date: Tue, 23 Apr 2024 14:12:33 +0200 +Subject: [PATCH v2] wifi: ath9k: Obtain system GPIOS from descriptors +Precedence: bulk +X-Mailing-List: linux-gpio@vger.kernel.org +List-Id: +List-Subscribe: +List-Unsubscribe: +MIME-Version: 1.0 +Message-Id: <20240423-descriptors-wireless-v2-1-6d1d03b30bfa@linaro.org> +X-B4-Tracking: v=1; b=H4sIALClJ2YC/22Nyw6CMBBFf4XM2hpanrLyPwyL0o4wCaFkxqCG9 + N+txKXLc5Nz7g6CTCjQZTswbiQUlgTmlIGb7DKiIp8YTG7KXBujPIpjWh+BRT2JcUYRNbTeXir + v7FBUkNSV8U6vI3vrE08kSXgfL5v+rr9gof8HN61yhdo1rvJ125T1dabFcjgHHqGPMX4Ao4iiN + LkAAAA= +To: Kalle Valo , + Andy Shevchenko , + Arnd Bergmann , Alban Bedel , + Bartosz Golaszewski , =?utf-8?q?Toke_H=C3=B8iland-J=C3=B8rg?= + =?utf-8?q?ensen?= +Cc: linux-wireless@vger.kernel.org, brcm80211-dev-list.pdl@broadcom.com, + linux-gpio@vger.kernel.org, Linus Walleij +X-Mailer: b4 0.13.0 + +The ath9k has an odd use of system-wide GPIOs: if the chip +does not have internal GPIO capability, it will try to obtain a +GPIO line from the system GPIO controller: + + if (BIT(gpio) & ah->caps.gpio_mask) + ath9k_hw_gpio_cfg_wmac(...); + else if (AR_SREV_SOC(ah)) + ath9k_hw_gpio_cfg_soc(ah, gpio, out, label); + +Where ath9k_hw_gpio_cfg_soc() will attempt to issue +gpio_request_one() passing the local GPIO number of the controller +(0..31) to gpio_request_one(). + +This is somewhat peculiar and possibly even dangerous: there is +nowadays no guarantee of the numbering of these system-wide +GPIOs, and assuming that GPIO 0..31 as used by ath9k would +correspond to GPIOs 0..31 on the system as a whole seems a bit +wild. + +Register all 32 GPIOs at index 0..31 directly in the ATH79K +GPIO driver and associate with WIFI if and only if we are probing +ATH79K wifi from the AHB bus (used for SoCs). + +Signed-off-by: Linus Walleij +--- +Changes in v2: +- Define all the descriptors directly in the ATH79K + GPIO driver in case the driver want to request them directly. +- Link to v1: https://lore.kernel.org/r/20240131-descriptors-wireless-v1-0-e1c7c5d68746@linaro.org +--- + drivers/gpio/gpio-ath79.c | 47 ++++++++++++++++++++++++++++++++++++- + drivers/net/wireless/ath/ath9k/hw.c | 29 ++++++++++++----------- + drivers/net/wireless/ath/ath9k/hw.h | 3 ++- + 3 files changed, 63 insertions(+), 16 deletions(-) + + +--- +base-commit: 4cece764965020c22cff7665b18a012006359095 +change-id: 20240122-descriptors-wireless-b8da95dcab35 + +Best regards, + +--- a/drivers/gpio/gpio-ath79.c ++++ b/drivers/gpio/gpio-ath79.c +@@ -9,6 +9,7 @@ + */ + + #include ++#include /* For WLAN GPIOs */ + #include + #include + #include +@@ -222,6 +223,37 @@ static const struct of_device_id ath79_g + }; + MODULE_DEVICE_TABLE(of, ath79_gpio_of_match); + ++/* ++ * This registers all of the ath79k GPIOs as descriptors to be picked ++ * directly from the ATH79K wifi driver if the two are jitted together ++ * in the same SoC. ++ */ ++#define ATH79K_WIFI_DESCS 32 ++static int ath79_gpio_register_wifi_descriptors(struct device *dev, ++ const char *label) ++{ ++ struct gpiod_lookup_table *lookup; ++ int i; ++ ++ /* Create a gpiod lookup using gpiochip-local offsets + 1 for NULL */ ++ lookup = devm_kzalloc(dev, ++ struct_size(lookup, table, ATH79K_WIFI_DESCS + 1), ++ GFP_KERNEL); ++ ++ if (!lookup) ++ return -ENOMEM; ++ ++ for (i = 0; i < ATH79K_WIFI_DESCS; i++) { ++ lookup->table[i] = (struct gpiod_lookup) ++ GPIO_LOOKUP_IDX(label, i, "ath9k", i, ++ GPIO_ACTIVE_HIGH); ++ } ++ ++ gpiod_add_lookup_table(lookup); ++ ++ return 0; ++} ++ + static int ath79_gpio_probe(struct platform_device *pdev) + { + struct ath79_gpio_platform_data *pdata = dev_get_platdata(&pdev->dev); +@@ -289,7 +321,11 @@ static int ath79_gpio_probe(struct platf + girq->handler = handle_simple_irq; + } + +- return devm_gpiochip_add_data(dev, &ctrl->gc, ctrl); ++ err = devm_gpiochip_add_data(dev, &ctrl->gc, ctrl); ++ if (err) ++ return err; ++ ++ return ath79_gpio_register_wifi_descriptors(dev, ctrl->gc.label); + } + + static struct platform_driver ath79_gpio_driver = {