xref: /freebsd/sys/contrib/dev/mediatek/mt76/debugfs.c (revision cbb3ec25)
16c92544dSBjoern A. Zeeb // SPDX-License-Identifier: ISC
26c92544dSBjoern A. Zeeb /*
36c92544dSBjoern A. Zeeb  * Copyright (C) 2016 Felix Fietkau <nbd@nbd.name>
46c92544dSBjoern A. Zeeb  */
56c92544dSBjoern A. Zeeb #include "mt76.h"
66c92544dSBjoern A. Zeeb 
76c92544dSBjoern A. Zeeb static int
mt76_reg_set(void * data,u64 val)86c92544dSBjoern A. Zeeb mt76_reg_set(void *data, u64 val)
96c92544dSBjoern A. Zeeb {
106c92544dSBjoern A. Zeeb 	struct mt76_dev *dev = data;
116c92544dSBjoern A. Zeeb 
126c92544dSBjoern A. Zeeb 	__mt76_wr(dev, dev->debugfs_reg, val);
136c92544dSBjoern A. Zeeb 	return 0;
146c92544dSBjoern A. Zeeb }
156c92544dSBjoern A. Zeeb 
166c92544dSBjoern A. Zeeb static int
mt76_reg_get(void * data,u64 * val)176c92544dSBjoern A. Zeeb mt76_reg_get(void *data, u64 *val)
186c92544dSBjoern A. Zeeb {
196c92544dSBjoern A. Zeeb 	struct mt76_dev *dev = data;
206c92544dSBjoern A. Zeeb 
216c92544dSBjoern A. Zeeb 	*val = __mt76_rr(dev, dev->debugfs_reg);
226c92544dSBjoern A. Zeeb 	return 0;
236c92544dSBjoern A. Zeeb }
246c92544dSBjoern A. Zeeb 
256c92544dSBjoern A. Zeeb DEFINE_DEBUGFS_ATTRIBUTE(fops_regval, mt76_reg_get, mt76_reg_set,
266c92544dSBjoern A. Zeeb 			 "0x%08llx\n");
276c92544dSBjoern A. Zeeb 
286c92544dSBjoern A. Zeeb static int
mt76_napi_threaded_set(void * data,u64 val)296c92544dSBjoern A. Zeeb mt76_napi_threaded_set(void *data, u64 val)
306c92544dSBjoern A. Zeeb {
316c92544dSBjoern A. Zeeb 	struct mt76_dev *dev = data;
326c92544dSBjoern A. Zeeb 
336c92544dSBjoern A. Zeeb 	if (!mt76_is_mmio(dev))
346c92544dSBjoern A. Zeeb 		return -EOPNOTSUPP;
356c92544dSBjoern A. Zeeb 
366c92544dSBjoern A. Zeeb 	if (dev->napi_dev.threaded != val)
376c92544dSBjoern A. Zeeb 		return dev_set_threaded(&dev->napi_dev, val);
386c92544dSBjoern A. Zeeb 
396c92544dSBjoern A. Zeeb 	return 0;
406c92544dSBjoern A. Zeeb }
416c92544dSBjoern A. Zeeb 
426c92544dSBjoern A. Zeeb static int
mt76_napi_threaded_get(void * data,u64 * val)436c92544dSBjoern A. Zeeb mt76_napi_threaded_get(void *data, u64 *val)
446c92544dSBjoern A. Zeeb {
456c92544dSBjoern A. Zeeb 	struct mt76_dev *dev = data;
466c92544dSBjoern A. Zeeb 
476c92544dSBjoern A. Zeeb 	*val = dev->napi_dev.threaded;
486c92544dSBjoern A. Zeeb 	return 0;
496c92544dSBjoern A. Zeeb }
506c92544dSBjoern A. Zeeb 
516c92544dSBjoern A. Zeeb DEFINE_DEBUGFS_ATTRIBUTE(fops_napi_threaded, mt76_napi_threaded_get,
526c92544dSBjoern A. Zeeb 			 mt76_napi_threaded_set, "%llu\n");
536c92544dSBjoern A. Zeeb 
mt76_queues_read(struct seq_file * s,void * data)546c92544dSBjoern A. Zeeb int mt76_queues_read(struct seq_file *s, void *data)
556c92544dSBjoern A. Zeeb {
566c92544dSBjoern A. Zeeb 	struct mt76_dev *dev = dev_get_drvdata(s->private);
576c92544dSBjoern A. Zeeb 	int i;
586c92544dSBjoern A. Zeeb 
596c92544dSBjoern A. Zeeb 	seq_puts(s, "     queue | hw-queued |      head |      tail |\n");
606c92544dSBjoern A. Zeeb 	for (i = 0; i < ARRAY_SIZE(dev->phy.q_tx); i++) {
616c92544dSBjoern A. Zeeb 		struct mt76_queue *q = dev->phy.q_tx[i];
626c92544dSBjoern A. Zeeb 
636c92544dSBjoern A. Zeeb 		if (!q)
646c92544dSBjoern A. Zeeb 			continue;
656c92544dSBjoern A. Zeeb 
666c92544dSBjoern A. Zeeb 		seq_printf(s, " %9d | %9d | %9d | %9d |\n",
676c92544dSBjoern A. Zeeb 			   i, q->queued, q->head, q->tail);
686c92544dSBjoern A. Zeeb 	}
696c92544dSBjoern A. Zeeb 
706c92544dSBjoern A. Zeeb 	return 0;
716c92544dSBjoern A. Zeeb }
726c92544dSBjoern A. Zeeb EXPORT_SYMBOL_GPL(mt76_queues_read);
736c92544dSBjoern A. Zeeb 
mt76_rx_queues_read(struct seq_file * s,void * data)746c92544dSBjoern A. Zeeb static int mt76_rx_queues_read(struct seq_file *s, void *data)
756c92544dSBjoern A. Zeeb {
766c92544dSBjoern A. Zeeb 	struct mt76_dev *dev = dev_get_drvdata(s->private);
776c92544dSBjoern A. Zeeb 	int i, queued;
786c92544dSBjoern A. Zeeb 
796c92544dSBjoern A. Zeeb 	seq_puts(s, "     queue | hw-queued |      head |      tail |\n");
806c92544dSBjoern A. Zeeb 	mt76_for_each_q_rx(dev, i) {
816c92544dSBjoern A. Zeeb 		struct mt76_queue *q = &dev->q_rx[i];
826c92544dSBjoern A. Zeeb 
836c92544dSBjoern A. Zeeb 		queued = mt76_is_usb(dev) ? q->ndesc - q->queued : q->queued;
846c92544dSBjoern A. Zeeb 		seq_printf(s, " %9d | %9d | %9d | %9d |\n",
856c92544dSBjoern A. Zeeb 			   i, queued, q->head, q->tail);
866c92544dSBjoern A. Zeeb 	}
876c92544dSBjoern A. Zeeb 
886c92544dSBjoern A. Zeeb 	return 0;
896c92544dSBjoern A. Zeeb }
906c92544dSBjoern A. Zeeb 
mt76_seq_puts_array(struct seq_file * file,const char * str,s8 * val,int len)916c92544dSBjoern A. Zeeb void mt76_seq_puts_array(struct seq_file *file, const char *str,
926c92544dSBjoern A. Zeeb 			 s8 *val, int len)
936c92544dSBjoern A. Zeeb {
946c92544dSBjoern A. Zeeb 	int i;
956c92544dSBjoern A. Zeeb 
966c92544dSBjoern A. Zeeb 	seq_printf(file, "%10s:", str);
976c92544dSBjoern A. Zeeb 	for (i = 0; i < len; i++)
986c92544dSBjoern A. Zeeb 		seq_printf(file, " %2d", val[i]);
996c92544dSBjoern A. Zeeb 	seq_puts(file, "\n");
1006c92544dSBjoern A. Zeeb }
1016c92544dSBjoern A. Zeeb EXPORT_SYMBOL_GPL(mt76_seq_puts_array);
1026c92544dSBjoern A. Zeeb 
1036c92544dSBjoern A. Zeeb struct dentry *
mt76_register_debugfs_fops(struct mt76_phy * phy,const struct file_operations * ops)1046c92544dSBjoern A. Zeeb mt76_register_debugfs_fops(struct mt76_phy *phy,
1056c92544dSBjoern A. Zeeb 			   const struct file_operations *ops)
1066c92544dSBjoern A. Zeeb {
1076c92544dSBjoern A. Zeeb 	const struct file_operations *fops = ops ? ops : &fops_regval;
1086c92544dSBjoern A. Zeeb 	struct mt76_dev *dev = phy->dev;
1096c92544dSBjoern A. Zeeb 	struct dentry *dir;
1106c92544dSBjoern A. Zeeb 
1116c92544dSBjoern A. Zeeb 	dir = debugfs_create_dir("mt76", phy->hw->wiphy->debugfsdir);
1126c92544dSBjoern A. Zeeb 	if (!dir)
1136c92544dSBjoern A. Zeeb 		return NULL;
1146c92544dSBjoern A. Zeeb 
115cbb3ec25SBjoern A. Zeeb 	debugfs_create_u8("led_pin", 0600, dir, &phy->leds.pin);
1166c92544dSBjoern A. Zeeb 	debugfs_create_u32("regidx", 0600, dir, &dev->debugfs_reg);
1176c92544dSBjoern A. Zeeb 	debugfs_create_file_unsafe("regval", 0600, dir, dev, fops);
1186c92544dSBjoern A. Zeeb 	debugfs_create_file_unsafe("napi_threaded", 0600, dir, dev,
1196c92544dSBjoern A. Zeeb 				   &fops_napi_threaded);
1206c92544dSBjoern A. Zeeb 	debugfs_create_blob("eeprom", 0400, dir, &dev->eeprom);
1216c92544dSBjoern A. Zeeb 	if (dev->otp.data)
1226c92544dSBjoern A. Zeeb 		debugfs_create_blob("otp", 0400, dir, &dev->otp);
1236c92544dSBjoern A. Zeeb 	debugfs_create_devm_seqfile(dev->dev, "rx-queues", dir,
1246c92544dSBjoern A. Zeeb 				    mt76_rx_queues_read);
1256c92544dSBjoern A. Zeeb 
1266c92544dSBjoern A. Zeeb 	return dir;
1276c92544dSBjoern A. Zeeb }
1286c92544dSBjoern A. Zeeb EXPORT_SYMBOL_GPL(mt76_register_debugfs_fops);
129