Commit d76f89e1 authored by David Herrmann's avatar David Herrmann Committed by Jiri Kosina

HID: wiimote: lock DRM mode during debugfs overwrite

If we write a DRM mode via debugfs, we shouldn't allow normal operations
to overwrite this DRM mode. This is important if we want to debug
3rd-party devices and we want to see what data is sent on each mode.

If we write NULL/0 as DRM, the lock is removed again so the best matching
DRM is chosen by wiimote core.
Signed-off-by: default avatarDavid Herrmann <dh.herrmann@gmail.com>
Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
parent 51103c70
...@@ -242,7 +242,9 @@ void wiiproto_req_drm(struct wiimote_data *wdata, __u8 drm) ...@@ -242,7 +242,9 @@ void wiiproto_req_drm(struct wiimote_data *wdata, __u8 drm)
{ {
__u8 cmd[3]; __u8 cmd[3];
if (drm == WIIPROTO_REQ_NULL) if (wdata->state.flags & WIIPROTO_FLAG_DRM_LOCKED)
drm = wdata->state.drm;
else if (drm == WIIPROTO_REQ_NULL)
drm = select_drm(wdata); drm = select_drm(wdata);
cmd[0] = WIIPROTO_REQ_DRM; cmd[0] = WIIPROTO_REQ_DRM;
......
...@@ -154,7 +154,10 @@ static ssize_t wiidebug_drm_write(struct file *f, const char __user *u, ...@@ -154,7 +154,10 @@ static ssize_t wiidebug_drm_write(struct file *f, const char __user *u,
i = simple_strtoul(buf, NULL, 10); i = simple_strtoul(buf, NULL, 10);
spin_lock_irqsave(&dbg->wdata->state.lock, flags); spin_lock_irqsave(&dbg->wdata->state.lock, flags);
dbg->wdata->state.flags &= ~WIIPROTO_FLAG_DRM_LOCKED;
wiiproto_req_drm(dbg->wdata, (__u8) i); wiiproto_req_drm(dbg->wdata, (__u8) i);
if (i != WIIPROTO_REQ_NULL)
dbg->wdata->state.flags |= WIIPROTO_FLAG_DRM_LOCKED;
spin_unlock_irqrestore(&dbg->wdata->state.lock, flags); spin_unlock_irqrestore(&dbg->wdata->state.lock, flags);
return len; return len;
......
...@@ -43,6 +43,7 @@ ...@@ -43,6 +43,7 @@
#define WIIPROTO_FLAG_MP_USED 0x1000 #define WIIPROTO_FLAG_MP_USED 0x1000
#define WIIPROTO_FLAG_MP_ACTIVE 0x2000 #define WIIPROTO_FLAG_MP_ACTIVE 0x2000
#define WIIPROTO_FLAG_EXITING 0x4000 #define WIIPROTO_FLAG_EXITING 0x4000
#define WIIPROTO_FLAG_DRM_LOCKED 0x8000
#define WIIPROTO_FLAGS_LEDS (WIIPROTO_FLAG_LED1 | WIIPROTO_FLAG_LED2 | \ #define WIIPROTO_FLAGS_LEDS (WIIPROTO_FLAG_LED1 | WIIPROTO_FLAG_LED2 | \
WIIPROTO_FLAG_LED3 | WIIPROTO_FLAG_LED4) WIIPROTO_FLAG_LED3 | WIIPROTO_FLAG_LED4)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment