Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 304255
b: refs/heads/master
c: 68a75f3
h: refs/heads/master
i:
  304253: e3599f7
  304251: 7f042b1
  304247: 1c91eaf
  304239: b72ac01
  304223: 13972be
  304191: c884544
  304127: 50942c5
v: v3
  • Loading branch information
Rupesh Gujare authored and Greg Kroah-Hartman committed Apr 10, 2012
1 parent 8fbfc75 commit 1544a74
Show file tree
Hide file tree
Showing 7 changed files with 159 additions and 105 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 13c398aa5c9a7eae7792726f6229d961e2915b12
refs/heads/master: 68a75f3f1aeae099388f63e4cec3ad08aff8e7da
12 changes: 2 additions & 10 deletions trunk/drivers/staging/ozwpan/ozappif.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,13 @@
#define OZ_IOCTL_MAGIC 0xf4

struct oz_mac_addr {
unsigned char a[6];
__u8 a[6];
};

#define OZ_MAX_PDS 8

struct oz_pd_list {
int count;
__u32 count;
struct oz_mac_addr addr[OZ_MAX_PDS];
};

Expand All @@ -27,18 +27,10 @@ struct oz_binding_info {
char name[OZ_MAX_BINDING_LEN];
};

struct oz_test {
int action;
};

#define OZ_IOCTL_GET_PD_LIST _IOR(OZ_IOCTL_MAGIC, 0, struct oz_pd_list)
#define OZ_IOCTL_SET_ACTIVE_PD _IOW(OZ_IOCTL_MAGIC, 1, struct oz_mac_addr)
#define OZ_IOCTL_GET_ACTIVE_PD _IOR(OZ_IOCTL_MAGIC, 2, struct oz_mac_addr)
#define OZ_IOCTL_CLEAR_EVENTS _IO(OZ_IOCTL_MAGIC, 3)
#define OZ_IOCTL_GET_EVENTS _IOR(OZ_IOCTL_MAGIC, 4, struct oz_evtlist)
#define OZ_IOCTL_ADD_BINDING _IOW(OZ_IOCTL_MAGIC, 5, struct oz_binding_info)
#define OZ_IOCTL_TEST _IOWR(OZ_IOCTL_MAGIC, 6, struct oz_test)
#define OZ_IOCTL_SET_EVENT_MASK _IOW(OZ_IOCTL_MAGIC, 7, unsigned long)
#define OZ_IOCTL_REMOVE_BINDING _IOW(OZ_IOCTL_MAGIC, 8, struct oz_binding_info)
#define OZ_IOCTL_MAX 9

Expand Down
17 changes: 0 additions & 17 deletions trunk/drivers/staging/ozwpan/ozcdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,6 @@ struct oz_serial_ctx {
int rd_in;
int rd_out;
};
/*------------------------------------------------------------------------------
*/
int g_taction;
/*------------------------------------------------------------------------------
*/
static struct oz_cdev g_cdev;
Expand Down Expand Up @@ -276,20 +273,6 @@ long oz_cdev_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
return -EFAULT;
}
break;
#ifdef WANT_EVENT_TRACE
case OZ_IOCTL_CLEAR_EVENTS:
oz_events_clear();
break;
case OZ_IOCTL_GET_EVENTS:
rc = oz_events_copy((void __user *)arg);
break;
case OZ_IOCTL_SET_EVENT_MASK:
if (copy_from_user(&g_evt_mask, (void __user *)arg,
sizeof(unsigned long))) {
return -EFAULT;
}
break;
#endif /* WANT_EVENT_TRACE */
case OZ_IOCTL_ADD_BINDING:
case OZ_IOCTL_REMOVE_BINDING: {
struct oz_binding_info b;
Expand Down
195 changes: 137 additions & 58 deletions trunk/drivers/staging/ozwpan/ozevent.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,29 +5,46 @@
*/
#include "ozconfig.h"
#ifdef WANT_EVENT_TRACE
#include <linux/module.h>
#include <linux/debugfs.h>
#include <linux/jiffies.h>
#include <linux/uaccess.h>
#include "oztrace.h"
#include "ozevent.h"
#include "ozappif.h"
/*------------------------------------------------------------------------------
* Although the event mask is logically part of the oz_evtdev structure, it is
* needed outside of this file so define it seperately to avoid the need to
* export definition of struct oz_evtdev.
*/
unsigned long g_evt_mask = 0xffffffff;
u32 g_evt_mask;
/*------------------------------------------------------------------------------
*/
#define OZ_MAX_EVTS 2048 /* Must be power of 2 */
DEFINE_SPINLOCK(g_eventlock);
static int g_evt_in;
static int g_evt_out;
static int g_missed_events;
static struct oz_event g_events[OZ_MAX_EVTS];
struct oz_evtdev {
struct dentry *root_dir;
int evt_in;
int evt_out;
int missed_events;
int present;
atomic_t users;
spinlock_t lock;
struct oz_event evts[OZ_MAX_EVTS];
};

static struct oz_evtdev g_evtdev;

/*------------------------------------------------------------------------------
* Context: process
*/
void oz_event_init(void)
{
/* Because g_evtdev is static external all fields initally zero so no
* need to reinitialised those.
*/
oz_trace("Event tracing initialized\n");
g_evt_in = g_evt_out = 0;
g_missed_events = 0;
spin_lock_init(&g_evtdev.lock);
atomic_set(&g_evtdev.users, 0);
}
/*------------------------------------------------------------------------------
* Context: process
Expand All @@ -43,74 +60,136 @@ void oz_event_log2(u8 evt, u8 ctx1, u16 ctx2, void *ctx3, unsigned ctx4)
{
unsigned long irqstate;
int ix;
spin_lock_irqsave(&g_eventlock, irqstate);
ix = (g_evt_in + 1) & (OZ_MAX_EVTS - 1);
if (ix != g_evt_out) {
struct oz_event *e = &g_events[g_evt_in];
spin_lock_irqsave(&g_evtdev.lock, irqstate);
ix = (g_evtdev.evt_in + 1) & (OZ_MAX_EVTS - 1);
if (ix != g_evtdev.evt_out) {
struct oz_event *e = &g_evtdev.evts[g_evtdev.evt_in];
e->jiffies = jiffies;
e->evt = evt;
e->ctx1 = ctx1;
e->ctx2 = ctx2;
e->ctx3 = ctx3;
e->ctx3 = (__u32)(unsigned long)ctx3;
e->ctx4 = ctx4;
g_evt_in = ix;
g_evtdev.evt_in = ix;
} else {
g_missed_events++;
g_evtdev.missed_events++;
}
spin_unlock_irqrestore(&g_eventlock, irqstate);
spin_unlock_irqrestore(&g_evtdev.lock, irqstate);
}
/*------------------------------------------------------------------------------
* Context: process
*/
int oz_events_copy(struct oz_evtlist __user *lst)
static void oz_events_clear(struct oz_evtdev *dev)
{
int first;
int ix;
struct hdr {
int count;
int missed;
} hdr;
ix = g_evt_out;
hdr.count = g_evt_in - ix;
if (hdr.count < 0)
hdr.count += OZ_MAX_EVTS;
if (hdr.count > OZ_EVT_LIST_SZ)
hdr.count = OZ_EVT_LIST_SZ;
hdr.missed = g_missed_events;
g_missed_events = 0;
if (copy_to_user((void __user *)lst, &hdr, sizeof(hdr)))
return -EFAULT;
first = OZ_MAX_EVTS - ix;
if (first > hdr.count)
first = hdr.count;
if (first) {
int sz = first*sizeof(struct oz_event);
void __user *p = (void __user *)lst->evts;
if (copy_to_user(p, &g_events[ix], sz))
return -EFAULT;
if (hdr.count > first) {
p = (void __user *)&lst->evts[first];
sz = (hdr.count-first)*sizeof(struct oz_event);
if (copy_to_user(p, g_events, sz))
return -EFAULT;
}
unsigned long irqstate;
oz_trace("Clearing events\n");
spin_lock_irqsave(&dev->lock, irqstate);
dev->evt_in = dev->evt_out = 0;
dev->missed_events = 0;
spin_unlock_irqrestore(&dev->lock, irqstate);
}
#ifdef CONFIG_DEBUG_FS
/*------------------------------------------------------------------------------
* Context: process
*/
int oz_events_open(struct inode *inode, struct file *filp)
{
oz_trace("oz_evt_open()\n");
oz_trace("Open flags: 0x%x\n", filp->f_flags);
if (atomic_add_return(1, &g_evtdev.users) == 1) {
oz_events_clear(&g_evtdev);
return nonseekable_open(inode, filp);
} else {
atomic_dec(&g_evtdev.users);
return -EBUSY;
}
ix += hdr.count;
if (ix >= OZ_MAX_EVTS)
ix -= OZ_MAX_EVTS;
g_evt_out = ix;
}
/*------------------------------------------------------------------------------
* Context: process
*/
int oz_events_release(struct inode *inode, struct file *filp)
{
oz_events_clear(&g_evtdev);
atomic_dec(&g_evtdev.users);
g_evt_mask = 0;
oz_trace("oz_evt_release()\n");
return 0;
}
/*------------------------------------------------------------------------------
* Context: process
*/
void oz_events_clear(void)
ssize_t oz_events_read(struct file *filp, char __user *buf, size_t count,
loff_t *fpos)
{
unsigned long irqstate;
spin_lock_irqsave(&g_eventlock, irqstate);
g_evt_in = g_evt_out = 0;
g_missed_events = 0;
spin_unlock_irqrestore(&g_eventlock, irqstate);
struct oz_evtdev *dev = &g_evtdev;
int rc = 0;
int nb_evts = count / sizeof(struct oz_event);
int n;
int sz;

n = dev->evt_in - dev->evt_out;
if (n < 0)
n += OZ_MAX_EVTS;
if (nb_evts > n)
nb_evts = n;
if (nb_evts == 0)
goto out;
n = OZ_MAX_EVTS - dev->evt_out;
if (n > nb_evts)
n = nb_evts;
sz = n * sizeof(struct oz_event);
if (copy_to_user(buf, &dev->evts[dev->evt_out], sz)) {
rc = -EFAULT;
goto out;
}
if (n == nb_evts)
goto out2;
n = nb_evts - n;
if (copy_to_user(buf + sz, dev->evts, n * sizeof(struct oz_event))) {
rc = -EFAULT;
goto out;
}
out2:
dev->evt_out = (dev->evt_out + nb_evts) & (OZ_MAX_EVTS - 1);
rc = nb_evts * sizeof(struct oz_event);
out:
return rc;
}
#endif /* WANT_EVENT_TRACE */
/*------------------------------------------------------------------------------
*/
const struct file_operations oz_events_fops = {
.owner = THIS_MODULE,
.open = oz_events_open,
.release = oz_events_release,
.read = oz_events_read,
};
/*------------------------------------------------------------------------------
* Context: process
*/
void oz_debugfs_init(void)
{
struct dentry *parent;

parent = debugfs_create_dir("ozwpan", NULL);
if (parent == NULL) {
oz_trace("Failed to create debugfs directory ozmo\n");
return;
} else {
g_evtdev.root_dir = parent;
if (debugfs_create_file("events", S_IRUSR, parent, NULL,
&oz_events_fops) == NULL)
oz_trace("Failed to create file ozmo/events\n");
if (debugfs_create_x32("event_mask", S_IRUSR | S_IWUSR, parent,
&g_evt_mask) == NULL)
oz_trace("Failed to create file ozmo/event_mask\n");
}
}
/*------------------------------------------------------------------------------
* Context: process
*/
void oz_debugfs_remove(void)
{
debugfs_remove_recursive(g_evtdev.root_dir);
}
#endif /* CONFIG_DEBUG_FS */
#endif /* WANT_EVENT_TRACE */
11 changes: 6 additions & 5 deletions trunk/drivers/staging/ozwpan/ozevent.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,23 +9,24 @@
#include "ozeventdef.h"

#ifdef WANT_EVENT_TRACE
extern unsigned long g_evt_mask;
extern u32 g_evt_mask;
void oz_event_init(void);
void oz_event_term(void);
void oz_event_log2(u8 evt, u8 ctx1, u16 ctx2, void *ctx3, unsigned ctx4);
void oz_debugfs_init(void);
void oz_debugfs_remove(void);
#define oz_event_log(__evt, __ctx1, __ctx2, __ctx3, __ctx4) \
do { \
if ((1<<(__evt)) & g_evt_mask) \
oz_event_log2(__evt, __ctx1, __ctx2, __ctx3, __ctx4); \
} while (0)
int oz_events_copy(struct oz_evtlist __user *lst);
void oz_events_clear(void);

#else
#define oz_event_init()
#define oz_event_term()
#define oz_event_log(__evt, __ctx1, __ctx2, __ctx3, __ctx4)
#define oz_events_copy(__lst)
#define oz_events_clear()
#define oz_debugfs_init()
#define oz_debugfs_remove()
#endif /* WANT_EVENT_TRACE */

#endif /* _OZEVENT_H */
19 changes: 6 additions & 13 deletions trunk/drivers/staging/ozwpan/ozeventdef.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,19 +29,12 @@
#define OZ_EVT_DEBUG 20

struct oz_event {
unsigned long jiffies;
unsigned char evt;
unsigned char ctx1;
unsigned short ctx2;
void *ctx3;
unsigned ctx4;
};

#define OZ_EVT_LIST_SZ 64
struct oz_evtlist {
int count;
int missed;
struct oz_event evts[OZ_EVT_LIST_SZ];
__u32 jiffies;
__u8 evt;
__u8 ctx1;
__u16 ctx2;
__u32 ctx3;
__u32 ctx4;
};

#endif /* _OZEVENTDEF_H */
8 changes: 7 additions & 1 deletion trunk/drivers/staging/ozwpan/ozmain.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,9 @@ static int __init ozwpan_init(void)
oz_protocol_init(g_net_dev);
oz_app_enable(OZ_APPID_USB, 1);
oz_apps_init();
#ifdef CONFIG_DEBUG_FS
oz_debugfs_init();
#endif
return 0;
}
/*------------------------------------------------------------------------------
Expand All @@ -44,6 +47,9 @@ static void __exit ozwpan_exit(void)
oz_apps_term();
oz_cdev_deregister();
oz_event_term();
#ifdef CONFIG_DEBUG_FS
oz_debugfs_remove();
#endif
}
/*------------------------------------------------------------------------------
*/
Expand All @@ -53,6 +59,6 @@ module_exit(ozwpan_exit);

MODULE_AUTHOR("Chris Kelly");
MODULE_DESCRIPTION("Ozmo Devices USB over WiFi hcd driver");
MODULE_VERSION("1.0.8");
MODULE_VERSION("1.0.9");
MODULE_LICENSE("GPL");

0 comments on commit 1544a74

Please sign in to comment.