Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2)  * Copyright (C) 2008 Felix Fietkau <nbd@openwrt.org>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  * This program is free software; you can redistribute it and/or modify
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  * it under the terms of the GNU General Public License version 2 as
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6)  * published by the Free Software Foundation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8)  * Based on minstrel.c:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9)  *   Copyright (C) 2005-2007 Derek Smithies <derek@indranet.co.nz>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10)  *   Sponsored by Indranet Technologies Ltd
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12)  * Based on sample.c:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13)  *   Copyright (c) 2005 John Bicket
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14)  *   All rights reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16)  *   Redistribution and use in source and binary forms, with or without
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17)  *   modification, are permitted provided that the following conditions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18)  *   are met:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19)  *   1. Redistributions of source code must retain the above copyright
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20)  *      notice, this list of conditions and the following disclaimer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21)  *      without modification.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22)  *   2. Redistributions in binary form must reproduce at minimum a disclaimer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23)  *      similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24)  *      redistribution must be conditioned upon including a substantially
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25)  *      similar Disclaimer requirement for further binary redistribution.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26)  *   3. Neither the names of the above-listed copyright holders nor the names
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27)  *      of any contributors may be used to endorse or promote products derived
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28)  *      from this software without specific prior written permission.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30)  *   Alternatively, this software may be distributed under the terms of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31)  *   GNU General Public License ("GPL") version 2 as published by the Free
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32)  *   Software Foundation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34)  *   NO WARRANTY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35)  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36)  *   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37)  *   LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38)  *   AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39)  *   THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40)  *   OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41)  *   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42)  *   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43)  *   IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44)  *   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45)  *   THE POSSIBILITY OF SUCH DAMAGES.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) #include <linux/netdevice.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) #include <linux/types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) #include <linux/skbuff.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) #include <linux/debugfs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) #include <linux/ieee80211.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) #include <linux/export.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) #include <net/mac80211.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) #include "rc80211_minstrel.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) minstrel_stats_open(struct inode *inode, struct file *file)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 	struct minstrel_sta_info *mi = inode->i_private;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 	struct minstrel_debugfs_info *ms;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 	unsigned int i, tp_max, tp_avg, eprob;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) 	char *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 	ms = kmalloc(2048, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) 	if (!ms)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 		return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) 	file->private_data = ms;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 	p = ms->buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 	p += sprintf(p, "\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 	p += sprintf(p,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 		     "best   __________rate_________    ____statistics___    ____last_____    ______sum-of________\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 	p += sprintf(p,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 		     "rate  [name idx airtime max_tp]  [avg(tp) avg(prob)]  [retry|suc|att]  [#success | #attempts]\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) 	for (i = 0; i < mi->n_rates; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) 		struct minstrel_rate *mr = &mi->r[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 		struct minstrel_rate_stats *mrs = &mi->r[i].stats;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 		*(p++) = (i == mi->max_tp_rate[0]) ? 'A' : ' ';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 		*(p++) = (i == mi->max_tp_rate[1]) ? 'B' : ' ';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) 		*(p++) = (i == mi->max_tp_rate[2]) ? 'C' : ' ';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 		*(p++) = (i == mi->max_tp_rate[3]) ? 'D' : ' ';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 		*(p++) = (i == mi->max_prob_rate) ? 'P' : ' ';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 		p += sprintf(p, " %3u%s ", mr->bitrate / 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 				(mr->bitrate & 1 ? ".5" : "  "));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 		p += sprintf(p, "%3u  ", i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 		p += sprintf(p, "%6u ", mr->perfect_tx_time);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 		tp_max = minstrel_get_tp_avg(mr, MINSTREL_FRAC(100,100));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 		tp_avg = minstrel_get_tp_avg(mr, mrs->prob_avg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 		eprob = MINSTREL_TRUNC(mrs->prob_avg * 1000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 		p += sprintf(p, "%4u.%1u    %4u.%1u     %3u.%1u"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 				"     %3u   %3u %-3u   "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 				"%9llu   %-9llu\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 				tp_max / 10, tp_max % 10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 				tp_avg / 10, tp_avg % 10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 				eprob / 10, eprob % 10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 				mrs->retry_count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 				mrs->last_success,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 				mrs->last_attempts,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 				(unsigned long long)mrs->succ_hist,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 				(unsigned long long)mrs->att_hist);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 	p += sprintf(p, "\nTotal packet count::    ideal %d      "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 			"lookaround %d\n\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 			mi->total_packets - mi->sample_packets,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 			mi->sample_packets);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 	ms->len = p - ms->buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 	WARN_ON(ms->len + sizeof(*ms) > 2048);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) minstrel_stats_csv_open(struct inode *inode, struct file *file)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 	struct minstrel_sta_info *mi = inode->i_private;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 	struct minstrel_debugfs_info *ms;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) 	unsigned int i, tp_max, tp_avg, eprob;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 	char *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) 	ms = kmalloc(2048, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 	if (!ms)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 		return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) 	file->private_data = ms;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 	p = ms->buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 	for (i = 0; i < mi->n_rates; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) 		struct minstrel_rate *mr = &mi->r[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) 		struct minstrel_rate_stats *mrs = &mi->r[i].stats;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) 		p += sprintf(p, "%s" ,((i == mi->max_tp_rate[0]) ? "A" : ""));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 		p += sprintf(p, "%s" ,((i == mi->max_tp_rate[1]) ? "B" : ""));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) 		p += sprintf(p, "%s" ,((i == mi->max_tp_rate[2]) ? "C" : ""));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) 		p += sprintf(p, "%s" ,((i == mi->max_tp_rate[3]) ? "D" : ""));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) 		p += sprintf(p, "%s" ,((i == mi->max_prob_rate) ? "P" : ""));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) 		p += sprintf(p, ",%u%s", mr->bitrate / 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) 				(mr->bitrate & 1 ? ".5," : ","));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 		p += sprintf(p, "%u,", i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 		p += sprintf(p, "%u,",mr->perfect_tx_time);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) 		tp_max = minstrel_get_tp_avg(mr, MINSTREL_FRAC(100,100));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 		tp_avg = minstrel_get_tp_avg(mr, mrs->prob_avg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) 		eprob = MINSTREL_TRUNC(mrs->prob_avg * 1000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) 		p += sprintf(p, "%u.%u,%u.%u,%u.%u,%u,%u,%u,"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) 				"%llu,%llu,%d,%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) 				tp_max / 10, tp_max % 10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) 				tp_avg / 10, tp_avg % 10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) 				eprob / 10, eprob % 10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) 				mrs->retry_count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) 				mrs->last_success,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) 				mrs->last_attempts,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) 				(unsigned long long)mrs->succ_hist,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) 				(unsigned long long)mrs->att_hist,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) 				mi->total_packets - mi->sample_packets,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) 				mi->sample_packets);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) 	ms->len = p - ms->buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) 	WARN_ON(ms->len + sizeof(*ms) > 2048);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) }