-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[ATM]: basic sysfs support for ATM devices
Signed-off-by: Chas Williams <chas@cmf.nrl.navy.mil> Signed-off-by: David S. Miller <davem@davemloft.net>
- Loading branch information
Roman Kagan
authored and
David S. Miller
committed
Jun 29, 2006
1 parent
d17f086
commit 656d98b
Showing
7 changed files
with
209 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,176 @@ | ||
/* ATM driver model support. */ | ||
|
||
#include <linux/config.h> | ||
#include <linux/kernel.h> | ||
#include <linux/init.h> | ||
#include <linux/kobject.h> | ||
#include <linux/atmdev.h> | ||
#include "common.h" | ||
#include "resources.h" | ||
|
||
#define to_atm_dev(cldev) container_of(cldev, struct atm_dev, class_dev) | ||
|
||
static ssize_t show_type(struct class_device *cdev, char *buf) | ||
{ | ||
struct atm_dev *adev = to_atm_dev(cdev); | ||
return sprintf(buf, "%s\n", adev->type); | ||
} | ||
|
||
static ssize_t show_address(struct class_device *cdev, char *buf) | ||
{ | ||
char *pos = buf; | ||
struct atm_dev *adev = to_atm_dev(cdev); | ||
int i; | ||
|
||
for (i = 0; i < (ESI_LEN - 1); i++) | ||
pos += sprintf(pos, "%02x:", adev->esi[i]); | ||
pos += sprintf(pos, "%02x\n", adev->esi[i]); | ||
|
||
return pos - buf; | ||
} | ||
|
||
static ssize_t show_atmaddress(struct class_device *cdev, char *buf) | ||
{ | ||
unsigned long flags; | ||
char *pos = buf; | ||
struct atm_dev *adev = to_atm_dev(cdev); | ||
struct atm_dev_addr *aaddr; | ||
int bin[] = { 1, 2, 10, 6, 1 }, *fmt = bin; | ||
int i, j; | ||
|
||
spin_lock_irqsave(&adev->lock, flags); | ||
list_for_each_entry(aaddr, &adev->local, entry) { | ||
for(i = 0, j = 0; i < ATM_ESA_LEN; ++i, ++j) { | ||
if (j == *fmt) { | ||
pos += sprintf(pos, "."); | ||
++fmt; | ||
j = 0; | ||
} | ||
pos += sprintf(pos, "%02x", aaddr->addr.sas_addr.prv[i]); | ||
} | ||
pos += sprintf(pos, "\n"); | ||
} | ||
spin_unlock_irqrestore(&adev->lock, flags); | ||
|
||
return pos - buf; | ||
} | ||
|
||
static ssize_t show_carrier(struct class_device *cdev, char *buf) | ||
{ | ||
char *pos = buf; | ||
struct atm_dev *adev = to_atm_dev(cdev); | ||
|
||
pos += sprintf(pos, "%d\n", | ||
adev->signal == ATM_PHY_SIG_LOST ? 0 : 1); | ||
|
||
return pos - buf; | ||
} | ||
|
||
static ssize_t show_link_rate(struct class_device *cdev, char *buf) | ||
{ | ||
char *pos = buf; | ||
struct atm_dev *adev = to_atm_dev(cdev); | ||
int link_rate; | ||
|
||
/* show the link rate, not the data rate */ | ||
switch (adev->link_rate) { | ||
case ATM_OC3_PCR: | ||
link_rate = 155520000; | ||
break; | ||
case ATM_OC12_PCR: | ||
link_rate = 622080000; | ||
break; | ||
case ATM_25_PCR: | ||
link_rate = 25600000; | ||
break; | ||
default: | ||
link_rate = adev->link_rate * 8 * 53; | ||
} | ||
pos += sprintf(pos, "%d\n", link_rate); | ||
|
||
return pos - buf; | ||
} | ||
|
||
static CLASS_DEVICE_ATTR(address, S_IRUGO, show_address, NULL); | ||
static CLASS_DEVICE_ATTR(atmaddress, S_IRUGO, show_atmaddress, NULL); | ||
static CLASS_DEVICE_ATTR(carrier, S_IRUGO, show_carrier, NULL); | ||
static CLASS_DEVICE_ATTR(type, S_IRUGO, show_type, NULL); | ||
static CLASS_DEVICE_ATTR(link_rate, S_IRUGO, show_link_rate, NULL); | ||
|
||
static struct class_device_attribute *atm_attrs[] = { | ||
&class_device_attr_atmaddress, | ||
&class_device_attr_address, | ||
&class_device_attr_carrier, | ||
&class_device_attr_type, | ||
&class_device_attr_link_rate, | ||
NULL | ||
}; | ||
|
||
static int atm_uevent(struct class_device *cdev, char **envp, int num_envp, char *buf, int size) | ||
{ | ||
struct atm_dev *adev; | ||
int i = 0, len = 0; | ||
|
||
if (!cdev) | ||
return -ENODEV; | ||
|
||
adev = to_atm_dev(cdev); | ||
if (!adev) | ||
return -ENODEV; | ||
|
||
if (add_uevent_var(envp, num_envp, &i, buf, size, &len, | ||
"NAME=%s%d", adev->type, adev->number)) | ||
return -ENOMEM; | ||
|
||
envp[i] = NULL; | ||
return 0; | ||
} | ||
|
||
static void atm_release(struct class_device *cdev) | ||
{ | ||
struct atm_dev *adev = to_atm_dev(cdev); | ||
|
||
kfree(adev); | ||
} | ||
|
||
static struct class atm_class = { | ||
.name = "atm", | ||
.release = atm_release, | ||
.uevent = atm_uevent, | ||
}; | ||
|
||
int atm_register_sysfs(struct atm_dev *adev) | ||
{ | ||
struct class_device *cdev = &adev->class_dev; | ||
int i, err; | ||
|
||
cdev->class = &atm_class; | ||
class_set_devdata(cdev, adev); | ||
|
||
snprintf(cdev->class_id, BUS_ID_SIZE, "%s%d", adev->type, adev->number); | ||
err = class_device_register(cdev); | ||
if (err < 0) | ||
return err; | ||
|
||
for (i = 0; atm_attrs[i]; i++) | ||
class_device_create_file(cdev, atm_attrs[i]); | ||
|
||
return 0; | ||
} | ||
|
||
void atm_unregister_sysfs(struct atm_dev *adev) | ||
{ | ||
struct class_device *cdev = &adev->class_dev; | ||
|
||
class_device_del(cdev); | ||
} | ||
|
||
int __init atm_sysfs_init(void) | ||
{ | ||
return class_register(&atm_class); | ||
} | ||
|
||
void __exit atm_sysfs_exit(void) | ||
{ | ||
class_unregister(&atm_class); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters