1d8064c10SSean Anderson // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0-or-later
2d8064c10SSean Anderson /*
3d8064c10SSean Anderson  * Copyright 2008 - 2016 Freescale Semiconductor Inc.
4846a86e2SMadalin Bucur  */
5846a86e2SMadalin Bucur 
6846a86e2SMadalin Bucur #include <linux/init.h>
7846a86e2SMadalin Bucur #include <linux/module.h>
8846a86e2SMadalin Bucur #include <linux/io.h>
9846a86e2SMadalin Bucur #include <linux/of_net.h>
10846a86e2SMadalin Bucur #include "dpaa_eth.h"
11846a86e2SMadalin Bucur #include "mac.h"
12846a86e2SMadalin Bucur 
dpaa_eth_show_addr(struct device * dev,struct device_attribute * attr,char * buf)13846a86e2SMadalin Bucur static ssize_t dpaa_eth_show_addr(struct device *dev,
14846a86e2SMadalin Bucur 				  struct device_attribute *attr, char *buf)
15846a86e2SMadalin Bucur {
16846a86e2SMadalin Bucur 	struct dpaa_priv *priv = netdev_priv(to_net_dev(dev));
17846a86e2SMadalin Bucur 	struct mac_device *mac_dev = priv->mac_dev;
18846a86e2SMadalin Bucur 
19846a86e2SMadalin Bucur 	if (mac_dev)
20846a86e2SMadalin Bucur 		return sprintf(buf, "%llx",
21*c99f0f7eSSean Anderson 				(unsigned long long)mac_dev->res->start);
22846a86e2SMadalin Bucur 	else
23846a86e2SMadalin Bucur 		return sprintf(buf, "none");
24846a86e2SMadalin Bucur }
25846a86e2SMadalin Bucur 
dpaa_eth_show_fqids(struct device * dev,struct device_attribute * attr,char * buf)26846a86e2SMadalin Bucur static ssize_t dpaa_eth_show_fqids(struct device *dev,
27846a86e2SMadalin Bucur 				   struct device_attribute *attr, char *buf)
28846a86e2SMadalin Bucur {
29846a86e2SMadalin Bucur 	struct dpaa_priv *priv = netdev_priv(to_net_dev(dev));
30846a86e2SMadalin Bucur 	struct dpaa_fq *prev = NULL;
31846a86e2SMadalin Bucur 	char *prevstr = NULL;
32846a86e2SMadalin Bucur 	struct dpaa_fq *tmp;
33846a86e2SMadalin Bucur 	struct dpaa_fq *fq;
34846a86e2SMadalin Bucur 	u32 first_fqid = 0;
35846a86e2SMadalin Bucur 	u32 last_fqid = 0;
36846a86e2SMadalin Bucur 	ssize_t bytes = 0;
37846a86e2SMadalin Bucur 	char *str;
38846a86e2SMadalin Bucur 	int i = 0;
39846a86e2SMadalin Bucur 
40846a86e2SMadalin Bucur 	list_for_each_entry_safe(fq, tmp, &priv->dpaa_fq_list, list) {
41846a86e2SMadalin Bucur 		switch (fq->fq_type) {
42846a86e2SMadalin Bucur 		case FQ_TYPE_RX_DEFAULT:
43846a86e2SMadalin Bucur 			str = "Rx default";
44846a86e2SMadalin Bucur 			break;
45846a86e2SMadalin Bucur 		case FQ_TYPE_RX_ERROR:
46846a86e2SMadalin Bucur 			str = "Rx error";
47846a86e2SMadalin Bucur 			break;
483150b7c2SMadalin Bucur 		case FQ_TYPE_RX_PCD:
493150b7c2SMadalin Bucur 			str = "Rx PCD";
503150b7c2SMadalin Bucur 			break;
51846a86e2SMadalin Bucur 		case FQ_TYPE_TX_CONFIRM:
52846a86e2SMadalin Bucur 			str = "Tx default confirmation";
53846a86e2SMadalin Bucur 			break;
54846a86e2SMadalin Bucur 		case FQ_TYPE_TX_CONF_MQ:
55846a86e2SMadalin Bucur 			str = "Tx confirmation (mq)";
56846a86e2SMadalin Bucur 			break;
57846a86e2SMadalin Bucur 		case FQ_TYPE_TX_ERROR:
58846a86e2SMadalin Bucur 			str = "Tx error";
59846a86e2SMadalin Bucur 			break;
60846a86e2SMadalin Bucur 		case FQ_TYPE_TX:
61846a86e2SMadalin Bucur 			str = "Tx";
62846a86e2SMadalin Bucur 			break;
63846a86e2SMadalin Bucur 		default:
64846a86e2SMadalin Bucur 			str = "Unknown";
65846a86e2SMadalin Bucur 		}
66846a86e2SMadalin Bucur 
67846a86e2SMadalin Bucur 		if (prev && (abs(fq->fqid - prev->fqid) != 1 ||
68846a86e2SMadalin Bucur 			     str != prevstr)) {
69846a86e2SMadalin Bucur 			if (last_fqid == first_fqid)
70846a86e2SMadalin Bucur 				bytes += sprintf(buf + bytes,
71846a86e2SMadalin Bucur 					"%s: %d\n", prevstr, prev->fqid);
72846a86e2SMadalin Bucur 			else
73846a86e2SMadalin Bucur 				bytes += sprintf(buf + bytes,
74846a86e2SMadalin Bucur 					"%s: %d - %d\n", prevstr,
75846a86e2SMadalin Bucur 					first_fqid, last_fqid);
76846a86e2SMadalin Bucur 		}
77846a86e2SMadalin Bucur 
78846a86e2SMadalin Bucur 		if (prev && abs(fq->fqid - prev->fqid) == 1 &&
79846a86e2SMadalin Bucur 		    str == prevstr) {
80846a86e2SMadalin Bucur 			last_fqid = fq->fqid;
81846a86e2SMadalin Bucur 		} else {
82846a86e2SMadalin Bucur 			first_fqid = fq->fqid;
83846a86e2SMadalin Bucur 			last_fqid = fq->fqid;
84846a86e2SMadalin Bucur 		}
85846a86e2SMadalin Bucur 
86846a86e2SMadalin Bucur 		prev = fq;
87846a86e2SMadalin Bucur 		prevstr = str;
88846a86e2SMadalin Bucur 		i++;
89846a86e2SMadalin Bucur 	}
90846a86e2SMadalin Bucur 
91846a86e2SMadalin Bucur 	if (prev) {
92846a86e2SMadalin Bucur 		if (last_fqid == first_fqid)
93846a86e2SMadalin Bucur 			bytes += sprintf(buf + bytes, "%s: %d\n", prevstr,
94846a86e2SMadalin Bucur 					prev->fqid);
95846a86e2SMadalin Bucur 		else
96846a86e2SMadalin Bucur 			bytes += sprintf(buf + bytes, "%s: %d - %d\n", prevstr,
97846a86e2SMadalin Bucur 					first_fqid, last_fqid);
98846a86e2SMadalin Bucur 	}
99846a86e2SMadalin Bucur 
100846a86e2SMadalin Bucur 	return bytes;
101846a86e2SMadalin Bucur }
102846a86e2SMadalin Bucur 
dpaa_eth_show_bpids(struct device * dev,struct device_attribute * attr,char * buf)103846a86e2SMadalin Bucur static ssize_t dpaa_eth_show_bpids(struct device *dev,
104846a86e2SMadalin Bucur 				   struct device_attribute *attr, char *buf)
105846a86e2SMadalin Bucur {
106846a86e2SMadalin Bucur 	struct dpaa_priv *priv = netdev_priv(to_net_dev(dev));
107846a86e2SMadalin Bucur 	ssize_t bytes = 0;
108846a86e2SMadalin Bucur 
109846a86e2SMadalin Bucur 	bytes += snprintf(buf + bytes, PAGE_SIZE - bytes, "%u\n",
110f07f3004SMadalin Bucur 				  priv->dpaa_bp->bpid);
111846a86e2SMadalin Bucur 
112846a86e2SMadalin Bucur 	return bytes;
113846a86e2SMadalin Bucur }
114846a86e2SMadalin Bucur 
115846a86e2SMadalin Bucur static struct device_attribute dpaa_eth_attrs[] = {
116846a86e2SMadalin Bucur 	__ATTR(device_addr, 0444, dpaa_eth_show_addr, NULL),
117846a86e2SMadalin Bucur 	__ATTR(fqids, 0444, dpaa_eth_show_fqids, NULL),
118846a86e2SMadalin Bucur 	__ATTR(bpids, 0444, dpaa_eth_show_bpids, NULL),
119846a86e2SMadalin Bucur };
120846a86e2SMadalin Bucur 
dpaa_eth_sysfs_init(struct device * dev)121846a86e2SMadalin Bucur void dpaa_eth_sysfs_init(struct device *dev)
122846a86e2SMadalin Bucur {
123846a86e2SMadalin Bucur 	int i;
124846a86e2SMadalin Bucur 
125846a86e2SMadalin Bucur 	for (i = 0; i < ARRAY_SIZE(dpaa_eth_attrs); i++)
126846a86e2SMadalin Bucur 		if (device_create_file(dev, &dpaa_eth_attrs[i])) {
127846a86e2SMadalin Bucur 			dev_err(dev, "Error creating sysfs file\n");
128846a86e2SMadalin Bucur 			while (i > 0)
129846a86e2SMadalin Bucur 				device_remove_file(dev, &dpaa_eth_attrs[--i]);
130846a86e2SMadalin Bucur 			return;
131846a86e2SMadalin Bucur 		}
132846a86e2SMadalin Bucur }
133846a86e2SMadalin Bucur 
dpaa_eth_sysfs_remove(struct device * dev)134846a86e2SMadalin Bucur void dpaa_eth_sysfs_remove(struct device *dev)
135846a86e2SMadalin Bucur {
136846a86e2SMadalin Bucur 	int i;
137846a86e2SMadalin Bucur 
138846a86e2SMadalin Bucur 	for (i = 0; i < ARRAY_SIZE(dpaa_eth_attrs); i++)
139846a86e2SMadalin Bucur 		device_remove_file(dev, &dpaa_eth_attrs[i]);
140846a86e2SMadalin Bucur }
141