1*d8064c10SSean Anderson // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0-or-later 2*d8064c10SSean Anderson /* 3*d8064c10SSean 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 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", 21846a86e2SMadalin Bucur (unsigned long long)mac_dev->res->start); 22846a86e2SMadalin Bucur else 23846a86e2SMadalin Bucur return sprintf(buf, "none"); 24846a86e2SMadalin Bucur } 25846a86e2SMadalin Bucur 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 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 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 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