Received: by 2002:a05:6a10:22f:0:0:0:0 with SMTP id 15csp4228506pxk; Tue, 22 Sep 2020 13:49:29 -0700 (PDT) X-Google-Smtp-Source: ABdhPJy9Lz3J7IRPQ++Vo017/XdLhZGOeOd439Q23SABVKW3SUvp8M/2dXJZhovzhN3c86a9hAvb X-Received: by 2002:a17:906:8143:: with SMTP id z3mr6810763ejw.323.1600807768888; Tue, 22 Sep 2020 13:49:28 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1600807768; cv=none; d=google.com; s=arc-20160816; b=IG6n/zgDDiJukywgUeFO59g9g4Qbv6e6om8UiJSla7Ucmw8xNMTkIUlVyHp9LWxbTJ pSdbmd3BDu0txCzu7OsHAw3wK7umYTkoa7dKUen1EdaRwUKz3OHwjXHkFuLcZx13Z66w xV1SSeJWP3xoPllYY4oqRKRGUNkmBbtx/zHzKrMoSniGgOziPd+1fo6J90DsC4+he5xa 80iD9TFnDEkH4yuWXSxLHvu75P7gZ3Il/g38i4Jpp+Em5kSE0JE4qW/DrlHTs3aMWG5K hoL4EICTgtZzmn0Nt+GufBsa7jKUxxgd6QRyNOOF3xLT2R74jndZ0obCKFv93gYaPDT1 K4GA== 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:dkim-signature:dkim-filter; bh=SNoPSqWu2jT/6XyL+1BFnGMMp/uUT7ViEd0s55uekVg=; b=Kql3UTB7e4yuXaVIKkOpbLzMNN6KSWaCjkv0du5TITP/yWFrDC/BEiJjkqfZwLemOH mx9bQCBQP0ReSD98gouYz9oxNTpnDy1o9qTfMvGqUI6GgH7XPzVNf9wuFQPvBwyi9aU6 gNZfymQSQvW6E/Fq3O1sVjYHxT0DAiHuOoaMHl7DaHibuuHitHFLgqQm+MhzAhAfHVAJ ZcyQdiet1wKxDHcvlpx+KbS8JObQu0o6abV63QPMZPKq4L+tuckfsjAyHXP/GWgDMlI6 2hE8VQVoe7noTqFTRjRJ2k+0LfdhXKjruO1ucOieZU5AmkjUs+COENuGKU++Yghf24yI AGTA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@candelatech.com header.s=default header.b=hYBm8kxy; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=candelatech.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id d23si11163742edy.117.2020.09.22.13.48.49; Tue, 22 Sep 2020 13:49:28 -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=@candelatech.com header.s=default header.b=hYBm8kxy; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=candelatech.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726576AbgIVUoo (ORCPT + 99 others); Tue, 22 Sep 2020 16:44:44 -0400 Received: from mail2.candelatech.com ([208.74.158.173]:47826 "EHLO mail3.candelatech.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726550AbgIVUoo (ORCPT ); Tue, 22 Sep 2020 16:44:44 -0400 Received: from ben-dt4.candelatech.com (50-251-239-81-static.hfc.comcastbusiness.net [50.251.239.81]) by mail3.candelatech.com (Postfix) with ESMTP id CEE3F13C2B0; Tue, 22 Sep 2020 13:44:42 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.11.0 mail3.candelatech.com CEE3F13C2B0 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=candelatech.com; s=default; t=1600807482; bh=Y7BEo9tq5oANxsd2ILjh/8oGhdaRNbkq+0SihhCM+sY=; h=From:To:Cc:Subject:Date:From; b=hYBm8kxyhfi2sSstzflNLjwZr4f4PP+VBv5xMwkakoHcv7RHQXdtjMklNIB1MLIjx rUD1nH1ZWChaosj/gHfi3hlfqFBTS7Vft2ObKual6chdWke+CozdG7MVPnO1dDYOeO InK1BwvIDbnTco1WYQnc55FyXn8rXInR3hhccius= From: greearb@candelatech.com To: linux-wireless@vger.kernel.org Cc: Ben Greear Subject: [PATCH 1/2] wireless: Add sysfs file to show if radio is unavailable Date: Tue, 22 Sep 2020 13:44:39 -0700 Message-Id: <20200922204440.25360-1-greearb@candelatech.com> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org From: Ben Greear While stress-testing an IPQ4019 based AP, sometimes the firmware and/or radio hardware crashes hard enough that it cannot recover. In this case, no wifi can work on that radio again until user-space takes some action (such as reboot, or possibly rmmod/modprobe). Provide a sysfs file so that watchdog or other tools can check to see if radios are in such a state and take appropriate action. Signed-off-by: Ben Greear --- include/net/cfg80211.h | 13 +++++++++++++ net/wireless/core.c | 6 ++++++ net/wireless/sysfs.c | 2 ++ 3 files changed, 21 insertions(+) diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index d9e6b9fbd95ba..926ba62e4b3e2 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h @@ -4778,6 +4778,8 @@ struct wiphy_iftype_akm_suites { * @max_data_retry_count: maximum supported per TID retry count for * configuration through the %NL80211_TID_CONFIG_ATTR_RETRY_SHORT and * %NL80211_TID_CONFIG_ATTR_RETRY_LONG attributes + * @unavailable: Has this radio become unavailable for some reason. + * 0: It is available, otherwise not. */ struct wiphy { /* assign these fields before you register the wiphy */ @@ -4791,6 +4793,7 @@ struct wiphy { const struct ieee80211_iface_combination *iface_combinations; int n_iface_combinations; + int unavailable; u16 software_iftypes; u16 n_addresses; @@ -7696,6 +7699,16 @@ void cfg80211_stop_iface(struct wiphy *wiphy, struct wireless_dev *wdev, */ void cfg80211_shutdown_all_interfaces(struct wiphy *wiphy); +/** + * cfg80211_set_unavailable - Set value indicating resources have become + * unavailable. + * + * This can happen if firmware crashes during restart, for instance. In this + * case, probably module rmmod/modprobe or reboot is required to get the system + * functional again. + */ +void cfg80211_set_unavailable(struct wiphy *wiphy, int value); + /** * wiphy_ext_feature_set - set the extended feature flag * diff --git a/net/wireless/core.c b/net/wireless/core.c index 354b0ccbdc240..e1c842acab796 100644 --- a/net/wireless/core.c +++ b/net/wireless/core.c @@ -259,6 +259,12 @@ void cfg80211_stop_nan(struct cfg80211_registered_device *rdev, rdev->opencount--; } +void cfg80211_set_unavailable(struct wiphy *wiphy, int value) +{ + wiphy->unavailable = value; +} +EXPORT_SYMBOL_GPL(cfg80211_set_unavailable); + void cfg80211_shutdown_all_interfaces(struct wiphy *wiphy) { struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); diff --git a/net/wireless/sysfs.c b/net/wireless/sysfs.c index 3ac1f48195d28..077ec8083b887 100644 --- a/net/wireless/sysfs.c +++ b/net/wireless/sysfs.c @@ -33,6 +33,7 @@ static ssize_t name ## _show(struct device *dev, \ static DEVICE_ATTR_RO(name) SHOW_FMT(index, "%d", wiphy_idx); +SHOW_FMT(unavailable, "%d", wiphy.unavailable); SHOW_FMT(macaddress, "%pM", wiphy.perm_addr); SHOW_FMT(address_mask, "%pM", wiphy.addr_mask); @@ -66,6 +67,7 @@ static DEVICE_ATTR_RO(addresses); static struct attribute *ieee80211_attrs[] = { &dev_attr_index.attr, + &dev_attr_unavailable.attr, &dev_attr_macaddress.attr, &dev_attr_address_mask.attr, &dev_attr_addresses.attr, -- 2.26.2