a7f74c3005
sparse complains about the following functions ozhcd.c:330:20: warning: symbol 'oz_uncancel_urb' was not declared. Should it be static? ozhcd.c:420:6: warning: symbol 'oz_complete_buffered_urb' was not declared. Should it be static? ozmain.c:25:6: warning: symbol 'g_net_dev' was not declared. Should it be static? ozevent.c:95:5: warning: symbol 'oz_events_open' was not declared. Should it be static? ozevent.c:110:5: warning: symbol 'oz_events_release' was not declared. Should it be static? ozevent.c:121:9: warning: symbol 'oz_events_read' was not declared. Should it be static? ozevent.c:160:30: warning: symbol 'oz_events_fops' was not declared. Should it be static? ozcdev.c:47:14: warning: symbol 'g_oz_class' was not declared. Should it be static? ozcdev.c:74:5: warning: symbol 'oz_cdev_open' was not declared. Should it be static? ozcdev.c:86:5: warning: symbol 'oz_cdev_release' was not declared. Should it be static? ozcdev.c:94:9: warning: symbol 'oz_cdev_read' was not declared. Should it be static? ozcdev.c:146:9: warning: symbol 'oz_cdev_write' was not declared. Should it be static? ozcdev.c:236:6: warning: symbol 'oz_cdev_ioctl' was not declared. Should it be static? ozcdev.c:300:14: warning: symbol 'oz_cdev_poll' was not declared. Should it be static? ozcdev.c:321:30: warning: symbol 'oz_fops' was not declared. Should it be static? ozproto.c:958:6: warning: context imbalance in 'oz_polling_lock_bh' - wrong count at exit ozproto.c:964:6: warning: context imbalance in 'oz_polling_unlock_bh' - unexpected unlock ozusbsvc1.c:308:6: warning: symbol 'oz_usb_handle_ep_data' was not declared. Should it be static? ozpd.c:410:6: warning: symbol 'oz_set_more_bit' was not declared. Should it be static? ozpd.c:418:6: warning: symbol 'oz_set_last_pkt_nb' was not declared. Should it be static? -> add static keyword to silence the warning and make sparse happy. Signed-off-by: Peter Huewe <peterhuewe@gmx.de> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
196 lines
5.3 KiB
C
196 lines
5.3 KiB
C
/* -----------------------------------------------------------------------------
|
|
* Copyright (c) 2011 Ozmo Inc
|
|
* Released under the GNU General Public License Version 2 (GPLv2).
|
|
* -----------------------------------------------------------------------------
|
|
*/
|
|
#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 separately to avoid the need to
|
|
* export definition of struct oz_evtdev.
|
|
*/
|
|
u32 g_evt_mask;
|
|
/*------------------------------------------------------------------------------
|
|
*/
|
|
#define OZ_MAX_EVTS 2048 /* Must be power of 2 */
|
|
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 initially zero so no
|
|
* need to reinitialized those.
|
|
*/
|
|
oz_trace("Event tracing initialized\n");
|
|
spin_lock_init(&g_evtdev.lock);
|
|
atomic_set(&g_evtdev.users, 0);
|
|
}
|
|
/*------------------------------------------------------------------------------
|
|
* Context: process
|
|
*/
|
|
void oz_event_term(void)
|
|
{
|
|
oz_trace("Event tracing terminated\n");
|
|
}
|
|
/*------------------------------------------------------------------------------
|
|
* Context: any
|
|
*/
|
|
void oz_event_log2(u8 evt, u8 ctx1, u16 ctx2, void *ctx3, unsigned ctx4)
|
|
{
|
|
unsigned long irqstate;
|
|
int ix;
|
|
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 = (__u32)(unsigned long)ctx3;
|
|
e->ctx4 = ctx4;
|
|
g_evtdev.evt_in = ix;
|
|
} else {
|
|
g_evtdev.missed_events++;
|
|
}
|
|
spin_unlock_irqrestore(&g_evtdev.lock, irqstate);
|
|
}
|
|
/*------------------------------------------------------------------------------
|
|
* Context: process
|
|
*/
|
|
#ifdef CONFIG_DEBUG_FS
|
|
static void oz_events_clear(struct oz_evtdev *dev)
|
|
{
|
|
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);
|
|
}
|
|
/*------------------------------------------------------------------------------
|
|
* Context: process
|
|
*/
|
|
static 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;
|
|
}
|
|
}
|
|
/*------------------------------------------------------------------------------
|
|
* Context: process
|
|
*/
|
|
static 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
|
|
*/
|
|
static ssize_t oz_events_read(struct file *filp, char __user *buf, size_t count,
|
|
loff_t *fpos)
|
|
{
|
|
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;
|
|
}
|
|
/*------------------------------------------------------------------------------
|
|
*/
|
|
static 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 */
|