summaryrefslogtreecommitdiff
path: root/drivers/dahdi/xpp
diff options
context:
space:
mode:
authorTzafrir Cohen <tzafrir.cohen@xorcom.com>2010-07-13 08:44:36 +0000
committerTzafrir Cohen <tzafrir.cohen@xorcom.com>2010-07-13 08:44:36 +0000
commit330259c92d09fba56efca9d5be4cd2b237645725 (patch)
treefa94a11bc75abf2b9ce026a6e3d2f4bbc48f2569 /drivers/dahdi/xpp
parent5b506aee19dd5e0e7cbfb10451c05ebf2bcb9739 (diff)
Cleanup: refcount_xpd()
* Change refcount_xpd(): instead of returning a pointer to the atomic counter, return directly its value (just like refcount_xbus()) * Add a refcount_xbus and refcount_xpd attributes to sysfs (for debugging) git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/trunk@8878 a0bf4364-ded3-4de4-8d8a-66a801d63aff
Diffstat (limited to 'drivers/dahdi/xpp')
-rw-r--r--drivers/dahdi/xpp/xbus-core.c2
-rw-r--r--drivers/dahdi/xpp/xbus-sysfs.c25
-rw-r--r--drivers/dahdi/xpp/xpd.h1
-rw-r--r--drivers/dahdi/xpp/xpp_dahdi.c12
4 files changed, 35 insertions, 5 deletions
diff --git a/drivers/dahdi/xpp/xbus-core.c b/drivers/dahdi/xpp/xbus-core.c
index 22f25ef..3906f41 100644
--- a/drivers/dahdi/xpp/xbus-core.c
+++ b/drivers/dahdi/xpp/xbus-core.c
@@ -148,6 +148,8 @@ xbus_t *get_xbus(const char *msg, xbus_t *xbus)
XBUS_DBG(DEVICES, xbus, "%s: refcount_xbus=%d\n",
msg, refcount_xbus(xbus));
dev = get_device(&xbus->astribank);
+ if (!dev)
+ return NULL;
return dev_to_xbus(dev);
}
diff --git a/drivers/dahdi/xpp/xbus-sysfs.c b/drivers/dahdi/xpp/xbus-sysfs.c
index a48b806..9634cd2 100644
--- a/drivers/dahdi/xpp/xbus-sysfs.c
+++ b/drivers/dahdi/xpp/xbus-sysfs.c
@@ -205,6 +205,16 @@ static DEVICE_ATTR_READER(waitfor_xpds_show, dev, buf)
return len;
}
+static DEVICE_ATTR_READER(refcount_xbus_show, dev, buf)
+{
+ xbus_t *xbus;
+ int len;
+
+ xbus = dev_to_xbus(dev);
+ len = sprintf(buf, "%d\n", refcount_xbus(xbus));
+ return len;
+}
+
static DEVICE_ATTR_READER(driftinfo_show, dev, buf)
{
xbus_t *xbus;
@@ -290,6 +300,7 @@ static struct device_attribute xbus_dev_attrs[] = {
__ATTR_RO(label),
__ATTR_RO(status),
__ATTR_RO(timing),
+ __ATTR_RO(refcount_xbus),
__ATTR_RO(waitfor_xpds),
__ATTR_RO(driftinfo),
__ATTR(cls, S_IWUSR, NULL, cls_store),
@@ -677,6 +688,19 @@ static DEVICE_ATTR_READER(timing_priority_show, dev, buf)
return len;
}
+static DEVICE_ATTR_READER(refcount_xpd_show, dev, buf)
+{
+ xpd_t *xpd;
+ int len = 0;
+
+ BUG_ON(!dev);
+ xpd = dev_to_xpd(dev);
+ if (!xpd)
+ return -ENODEV;
+ len += sprintf(buf + len, "%d\n", refcount_xpd(xpd));
+ return len;
+}
+
static int xpd_match(struct device *dev, struct device_driver *driver)
{
struct xpd_driver *xpd_driver;
@@ -701,6 +725,7 @@ static struct device_attribute xpd_dev_attrs[] = {
__ATTR_RO(type),
__ATTR_RO(offhook),
__ATTR_RO(timing_priority),
+ __ATTR_RO(refcount_xpd),
__ATTR_NULL,
};
diff --git a/drivers/dahdi/xpp/xpd.h b/drivers/dahdi/xpp/xpd.h
index daf1954..d58b40a 100644
--- a/drivers/dahdi/xpp/xpd.h
+++ b/drivers/dahdi/xpp/xpd.h
@@ -257,6 +257,7 @@ int xpd_driver_register(struct device_driver *driver);
void xpd_driver_unregister(struct device_driver *driver);
xpd_t *get_xpd(const char *msg, xpd_t *xpd);
void put_xpd(const char *msg, xpd_t *xpd);
+int refcount_xpd(xpd_t *xpd);
#endif
diff --git a/drivers/dahdi/xpp/xpp_dahdi.c b/drivers/dahdi/xpp/xpp_dahdi.c
index 3e4b9b2..26fa223 100644
--- a/drivers/dahdi/xpp/xpp_dahdi.c
+++ b/drivers/dahdi/xpp/xpp_dahdi.c
@@ -122,11 +122,11 @@ static int proc_xpd_blink_write(struct file *file, const char __user *buffer, un
/*------------------------- XPD Management -------------------------*/
-static atomic_t *refcount_xpd(xpd_t *xpd)
+int refcount_xpd(xpd_t *xpd)
{
struct kref *kref = &xpd->xpd_dev.kobj.kref;
- return &kref->refcount;
+ return atomic_read(&kref->refcount);
}
xpd_t *get_xpd(const char *msg, xpd_t *xpd)
@@ -134,15 +134,17 @@ xpd_t *get_xpd(const char *msg, xpd_t *xpd)
struct device *dev;
XPD_DBG(DEVICES, xpd, "%s: refcount_xpd=%d\n",
- msg, atomic_read(refcount_xpd(xpd)));
+ msg, refcount_xpd(xpd));
dev = get_device(&xpd->xpd_dev);
+ if (!dev)
+ return NULL;
return dev_to_xpd(dev);
}
void put_xpd(const char *msg, xpd_t *xpd)
{
XPD_DBG(DEVICES, xpd, "%s: refcount_xpd=%d\n",
- msg, atomic_read(refcount_xpd(xpd)));
+ msg, refcount_xpd(xpd));
put_device(&xpd->xpd_dev);
}
@@ -331,7 +333,7 @@ static int xpd_read_proc(char *page, char **start, off_t off, int count, int *eo
len += sprintf(page + len, "xpd_state: %s (%d)\n",
xpd_statename(xpd->xpd_state), xpd->xpd_state);
len += sprintf(page + len, "open_counter=%d refcount=%d\n",
- atomic_read(&xpd->open_counter), atomic_read(refcount_xpd(xpd)));
+ atomic_read(&xpd->open_counter), refcount_xpd(xpd));
len += sprintf(page + len, "Address: U=%d S=%d\n", xpd->addr.unit, xpd->addr.subunit);
len += sprintf(page + len, "Subunits: %d\n", xpd->subunits);
len += sprintf(page + len, "Type: %d.%d\n\n", xpd->type, xpd->subtype);