xref: /openbmc/linux/net/atm/atm_sysfs.c (revision 23680f0b)
1b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0
2656d98b0SRoman Kagan /* ATM driver model support. */
3656d98b0SRoman Kagan 
4656d98b0SRoman Kagan #include <linux/kernel.h>
55a0e3ad6STejun Heo #include <linux/slab.h>
6656d98b0SRoman Kagan #include <linux/init.h>
7656d98b0SRoman Kagan #include <linux/kobject.h>
8656d98b0SRoman Kagan #include <linux/atmdev.h>
9656d98b0SRoman Kagan #include "common.h"
10656d98b0SRoman Kagan #include "resources.h"
11656d98b0SRoman Kagan 
12656d98b0SRoman Kagan #define to_atm_dev(cldev) container_of(cldev, struct atm_dev, class_dev)
13656d98b0SRoman Kagan 
type_show(struct device * cdev,struct device_attribute * attr,char * buf)1448afdaeaSYueHaibing static ssize_t type_show(struct device *cdev,
15ef39592fSKay Sievers 			 struct device_attribute *attr, char *buf)
16656d98b0SRoman Kagan {
17656d98b0SRoman Kagan 	struct atm_dev *adev = to_atm_dev(cdev);
183c417771Schas williams - CONTRACTOR 
193c417771Schas williams - CONTRACTOR 	return scnprintf(buf, PAGE_SIZE, "%s\n", adev->type);
20656d98b0SRoman Kagan }
21656d98b0SRoman Kagan 
address_show(struct device * cdev,struct device_attribute * attr,char * buf)2248afdaeaSYueHaibing static ssize_t address_show(struct device *cdev,
23ef39592fSKay Sievers 			    struct device_attribute *attr, char *buf)
24656d98b0SRoman Kagan {
25656d98b0SRoman Kagan 	struct atm_dev *adev = to_atm_dev(cdev);
26656d98b0SRoman Kagan 
273c417771Schas williams - CONTRACTOR 	return scnprintf(buf, PAGE_SIZE, "%pM\n", adev->esi);
28656d98b0SRoman Kagan }
29656d98b0SRoman Kagan 
atmaddress_show(struct device * cdev,struct device_attribute * attr,char * buf)3048afdaeaSYueHaibing static ssize_t atmaddress_show(struct device *cdev,
31ef39592fSKay Sievers 			       struct device_attribute *attr, char *buf)
32656d98b0SRoman Kagan {
33656d98b0SRoman Kagan 	unsigned long flags;
34656d98b0SRoman Kagan 	struct atm_dev *adev = to_atm_dev(cdev);
35656d98b0SRoman Kagan 	struct atm_dev_addr *aaddr;
3679ac5224SAndy Shevchenko 	int count = 0;
37656d98b0SRoman Kagan 
38656d98b0SRoman Kagan 	spin_lock_irqsave(&adev->lock, flags);
39656d98b0SRoman Kagan 	list_for_each_entry(aaddr, &adev->local, entry) {
4079ac5224SAndy Shevchenko 		count += scnprintf(buf + count, PAGE_SIZE - count,
4179ac5224SAndy Shevchenko 				   "%1phN.%2phN.%10phN.%6phN.%1phN\n",
4279ac5224SAndy Shevchenko 				   &aaddr->addr.sas_addr.prv[0],
4379ac5224SAndy Shevchenko 				   &aaddr->addr.sas_addr.prv[1],
4479ac5224SAndy Shevchenko 				   &aaddr->addr.sas_addr.prv[3],
4579ac5224SAndy Shevchenko 				   &aaddr->addr.sas_addr.prv[13],
4679ac5224SAndy Shevchenko 				   &aaddr->addr.sas_addr.prv[19]);
47656d98b0SRoman Kagan 	}
48656d98b0SRoman Kagan 	spin_unlock_irqrestore(&adev->lock, flags);
49656d98b0SRoman Kagan 
503c417771Schas williams - CONTRACTOR 	return count;
51656d98b0SRoman Kagan }
52656d98b0SRoman Kagan 
atmindex_show(struct device * cdev,struct device_attribute * attr,char * buf)5348afdaeaSYueHaibing static ssize_t atmindex_show(struct device *cdev,
54e7a46b4dSDan Williams 			     struct device_attribute *attr, char *buf)
55e7a46b4dSDan Williams {
56e7a46b4dSDan Williams 	struct atm_dev *adev = to_atm_dev(cdev);
57e7a46b4dSDan Williams 
583c417771Schas williams - CONTRACTOR 	return scnprintf(buf, PAGE_SIZE, "%d\n", adev->number);
59e7a46b4dSDan Williams }
60e7a46b4dSDan Williams 
carrier_show(struct device * cdev,struct device_attribute * attr,char * buf)6148afdaeaSYueHaibing static ssize_t carrier_show(struct device *cdev,
62ef39592fSKay Sievers 			    struct device_attribute *attr, char *buf)
63656d98b0SRoman Kagan {
64656d98b0SRoman Kagan 	struct atm_dev *adev = to_atm_dev(cdev);
65656d98b0SRoman Kagan 
663c417771Schas williams - CONTRACTOR 	return scnprintf(buf, PAGE_SIZE, "%d\n",
67656d98b0SRoman Kagan 			 adev->signal == ATM_PHY_SIG_LOST ? 0 : 1);
68656d98b0SRoman Kagan }
69656d98b0SRoman Kagan 
link_rate_show(struct device * cdev,struct device_attribute * attr,char * buf)7048afdaeaSYueHaibing static ssize_t link_rate_show(struct device *cdev,
71ef39592fSKay Sievers 			      struct device_attribute *attr, char *buf)
72656d98b0SRoman Kagan {
73656d98b0SRoman Kagan 	struct atm_dev *adev = to_atm_dev(cdev);
74656d98b0SRoman Kagan 	int link_rate;
75656d98b0SRoman Kagan 
76656d98b0SRoman Kagan 	/* show the link rate, not the data rate */
77656d98b0SRoman Kagan 	switch (adev->link_rate) {
78656d98b0SRoman Kagan 	case ATM_OC3_PCR:
79656d98b0SRoman Kagan 		link_rate = 155520000;
80656d98b0SRoman Kagan 		break;
81656d98b0SRoman Kagan 	case ATM_OC12_PCR:
82656d98b0SRoman Kagan 		link_rate = 622080000;
83656d98b0SRoman Kagan 		break;
84656d98b0SRoman Kagan 	case ATM_25_PCR:
85656d98b0SRoman Kagan 		link_rate = 25600000;
86656d98b0SRoman Kagan 		break;
87656d98b0SRoman Kagan 	default:
88656d98b0SRoman Kagan 		link_rate = adev->link_rate * 8 * 53;
89656d98b0SRoman Kagan 	}
903c417771Schas williams - CONTRACTOR 	return scnprintf(buf, PAGE_SIZE, "%d\n", link_rate);
91656d98b0SRoman Kagan }
92656d98b0SRoman Kagan 
9348afdaeaSYueHaibing static DEVICE_ATTR_RO(address);
9448afdaeaSYueHaibing static DEVICE_ATTR_RO(atmaddress);
9548afdaeaSYueHaibing static DEVICE_ATTR_RO(atmindex);
9648afdaeaSYueHaibing static DEVICE_ATTR_RO(carrier);
9748afdaeaSYueHaibing static DEVICE_ATTR_RO(type);
9848afdaeaSYueHaibing static DEVICE_ATTR_RO(link_rate);
99656d98b0SRoman Kagan 
100ef39592fSKay Sievers static struct device_attribute *atm_attrs[] = {
101ef39592fSKay Sievers 	&dev_attr_atmaddress,
102ef39592fSKay Sievers 	&dev_attr_address,
103e7a46b4dSDan Williams 	&dev_attr_atmindex,
104ef39592fSKay Sievers 	&dev_attr_carrier,
105ef39592fSKay Sievers 	&dev_attr_type,
106ef39592fSKay Sievers 	&dev_attr_link_rate,
107656d98b0SRoman Kagan 	NULL
108656d98b0SRoman Kagan };
109656d98b0SRoman Kagan 
110ef39592fSKay Sievers 
atm_uevent(const struct device * cdev,struct kobj_uevent_env * env)111*23680f0bSGreg Kroah-Hartman static int atm_uevent(const struct device *cdev, struct kobj_uevent_env *env)
112656d98b0SRoman Kagan {
113*23680f0bSGreg Kroah-Hartman 	const struct atm_dev *adev;
114656d98b0SRoman Kagan 
115656d98b0SRoman Kagan 	if (!cdev)
116656d98b0SRoman Kagan 		return -ENODEV;
117656d98b0SRoman Kagan 
118656d98b0SRoman Kagan 	adev = to_atm_dev(cdev);
119656d98b0SRoman Kagan 	if (!adev)
120656d98b0SRoman Kagan 		return -ENODEV;
121656d98b0SRoman Kagan 
1227eff2e7aSKay Sievers 	if (add_uevent_var(env, "NAME=%s%d", adev->type, adev->number))
123656d98b0SRoman Kagan 		return -ENOMEM;
124656d98b0SRoman Kagan 
125656d98b0SRoman Kagan 	return 0;
126656d98b0SRoman Kagan }
127656d98b0SRoman Kagan 
atm_release(struct device * cdev)128ef39592fSKay Sievers static void atm_release(struct device *cdev)
129656d98b0SRoman Kagan {
130656d98b0SRoman Kagan 	struct atm_dev *adev = to_atm_dev(cdev);
131656d98b0SRoman Kagan 
132656d98b0SRoman Kagan 	kfree(adev);
133656d98b0SRoman Kagan }
134656d98b0SRoman Kagan 
135656d98b0SRoman Kagan static struct class atm_class = {
136656d98b0SRoman Kagan 	.name		= "atm",
137ef39592fSKay Sievers 	.dev_release	= atm_release,
138ef39592fSKay Sievers 	.dev_uevent		= atm_uevent,
139656d98b0SRoman Kagan };
140656d98b0SRoman Kagan 
atm_register_sysfs(struct atm_dev * adev,struct device * parent)141d9ca676bSDan Williams int atm_register_sysfs(struct atm_dev *adev, struct device *parent)
142656d98b0SRoman Kagan {
143ef39592fSKay Sievers 	struct device *cdev = &adev->class_dev;
14497f80bc6SJeff Garzik 	int i, j, err;
145656d98b0SRoman Kagan 
146656d98b0SRoman Kagan 	cdev->class = &atm_class;
147d9ca676bSDan Williams 	cdev->parent = parent;
148ef39592fSKay Sievers 	dev_set_drvdata(cdev, adev);
149656d98b0SRoman Kagan 
150fb28ad35SKay Sievers 	dev_set_name(cdev, "%s%d", adev->type, adev->number);
151ef39592fSKay Sievers 	err = device_register(cdev);
152656d98b0SRoman Kagan 	if (err < 0)
153656d98b0SRoman Kagan 		return err;
154656d98b0SRoman Kagan 
15597f80bc6SJeff Garzik 	for (i = 0; atm_attrs[i]; i++) {
156ef39592fSKay Sievers 		err = device_create_file(cdev, atm_attrs[i]);
15797f80bc6SJeff Garzik 		if (err)
15897f80bc6SJeff Garzik 			goto err_out;
15997f80bc6SJeff Garzik 	}
160656d98b0SRoman Kagan 
161656d98b0SRoman Kagan 	return 0;
16297f80bc6SJeff Garzik 
16397f80bc6SJeff Garzik err_out:
16497f80bc6SJeff Garzik 	for (j = 0; j < i; j++)
165ef39592fSKay Sievers 		device_remove_file(cdev, atm_attrs[j]);
166ef39592fSKay Sievers 	device_del(cdev);
16797f80bc6SJeff Garzik 	return err;
168656d98b0SRoman Kagan }
169656d98b0SRoman Kagan 
atm_unregister_sysfs(struct atm_dev * adev)170656d98b0SRoman Kagan void atm_unregister_sysfs(struct atm_dev *adev)
171656d98b0SRoman Kagan {
172ef39592fSKay Sievers 	struct device *cdev = &adev->class_dev;
173656d98b0SRoman Kagan 
174ef39592fSKay Sievers 	device_del(cdev);
175656d98b0SRoman Kagan }
176656d98b0SRoman Kagan 
atm_sysfs_init(void)177656d98b0SRoman Kagan int __init atm_sysfs_init(void)
178656d98b0SRoman Kagan {
179656d98b0SRoman Kagan 	return class_register(&atm_class);
180656d98b0SRoman Kagan }
181656d98b0SRoman Kagan 
atm_sysfs_exit(void)182656d98b0SRoman Kagan void __exit atm_sysfs_exit(void)
183656d98b0SRoman Kagan {
184656d98b0SRoman Kagan 	class_unregister(&atm_class);
185656d98b0SRoman Kagan }
186