123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- From 88001968245c42c26416476bf0ef960442371605 Mon Sep 17 00:00:00 2001
- From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
- Date: Mon, 14 May 2018 08:48:20 +0200
- Subject: [PATCH] brcmfmac: add debugfs entry for reading firmware capabilities
- MIME-Version: 1.0
- Content-Type: text/plain; charset=UTF-8
- Content-Transfer-Encoding: 8bit
- This allows reading all capabilities as reported by a firmware. They are
- printed using native (raw) names, just like developers like it the most.
- It's how firmware reports support for various features, e.g. supported
- modes, supported standards, power saving details, max BSS-es.
- Access to all that info is useful for trying new firmwares, comparing
- them and debugging features AKA bugs.
- Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
- Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com>
- Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
- ---
- .../wireless/broadcom/brcm80211/brcmfmac/feature.c | 36 ++++++++++++++++++++++
- 1 file changed, 36 insertions(+)
- --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
- +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
- @@ -138,6 +138,41 @@ static void brcmf_feat_firmware_capabili
- }
- }
-
- +/**
- + * brcmf_feat_fwcap_debugfs_read() - expose firmware capabilities to debugfs.
- + *
- + * @seq: sequence for debugfs entry.
- + * @data: raw data pointer.
- + */
- +static int brcmf_feat_fwcap_debugfs_read(struct seq_file *seq, void *data)
- +{
- + struct brcmf_bus *bus_if = dev_get_drvdata(seq->private);
- + struct brcmf_if *ifp = brcmf_get_ifp(bus_if->drvr, 0);
- + char caps[MAX_CAPS_BUFFER_SIZE + 1] = { };
- + char *tmp;
- + int err;
- +
- + err = brcmf_fil_iovar_data_get(ifp, "cap", caps, sizeof(caps));
- + if (err) {
- + brcmf_err("could not get firmware cap (%d)\n", err);
- + return err;
- + }
- +
- + /* Put every capability in a new line */
- + for (tmp = caps; *tmp; tmp++) {
- + if (*tmp == ' ')
- + *tmp = '\n';
- + }
- +
- + /* Usually there is a space at the end of capabilities string */
- + seq_printf(seq, "%s", caps);
- + /* So make sure we don't print two line breaks */
- + if (tmp > caps && *(tmp - 1) != '\n')
- + seq_printf(seq, "\n");
- +
- + return 0;
- +}
- +
- void brcmf_feat_attach(struct brcmf_pub *drvr)
- {
- struct brcmf_if *ifp = brcmf_get_ifp(drvr, 0);
- @@ -196,6 +231,7 @@ void brcmf_feat_attach(struct brcmf_pub
- }
-
- brcmf_debugfs_add_entry(drvr, "features", brcmf_feat_debugfs_read);
- + brcmf_debugfs_add_entry(drvr, "fwcap", brcmf_feat_fwcap_debugfs_read);
- }
-
- bool brcmf_feat_is_enabled(struct brcmf_if *ifp, enum brcmf_feat_id id)
|