* master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6: (30 commits) [TIPC]: Initial activation message now includes TIPC version number [TIPC]: Improve response to requests for node/link information [TIPC]: Fixed skb_under_panic caused by tipc_link_bundle_buf [IrDA]: Fix the AU1000 FIR dependencies [IrDA]: Fix RCU lock pairing on error path [XFRM]: unexport xfrm_state_mtu [NET]: make skb_release_data() static [NETFILTE] ipv4: Fix typo (Bugzilla #6753) [IrDA]: MCS7780 usb_driver struct should be static [BNX2]: Turn off link during shutdown [BNX2]: Use dev_kfree_skb() instead of the _irq version [ATM]: basic sysfs support for ATM devices [ATM]: [suni] change suni_init to __devinit [ATM]: [iphase] should be __devinit not __init [ATM]: [idt77105] should be __devinit not __init [BNX2]: Add NETIF_F_TSO_ECN [NET]: Add ECN support for TSO [AF_UNIX]: Datagram getpeersec [NET]: Fix logical error in skb_gso_ok [PKT_SCHED]: PSCHED_TADD() and PSCHED_TADD2() can result,tv_usec >= 1000000 ...tirimbino
commit
74e651f0aa
@ -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); |
||||
} |
Loading…
Reference in new issue