Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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: David Herrmann <dh.herrmann@gmail.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>

authored by

David Herrmann and committed by
Jiri Kosina
d76f89e1 51103c70

+7 -1
+3 -1
drivers/hid/hid-wiimote-core.c
··· 242 242 { 243 243 __u8 cmd[3]; 244 244 245 - if (drm == WIIPROTO_REQ_NULL) 245 + if (wdata->state.flags & WIIPROTO_FLAG_DRM_LOCKED) 246 + drm = wdata->state.drm; 247 + else if (drm == WIIPROTO_REQ_NULL) 246 248 drm = select_drm(wdata); 247 249 248 250 cmd[0] = WIIPROTO_REQ_DRM;
+3
drivers/hid/hid-wiimote-debug.c
··· 154 154 i = simple_strtoul(buf, NULL, 10); 155 155 156 156 spin_lock_irqsave(&dbg->wdata->state.lock, flags); 157 + dbg->wdata->state.flags &= ~WIIPROTO_FLAG_DRM_LOCKED; 157 158 wiiproto_req_drm(dbg->wdata, (__u8) i); 159 + if (i != WIIPROTO_REQ_NULL) 160 + dbg->wdata->state.flags |= WIIPROTO_FLAG_DRM_LOCKED; 158 161 spin_unlock_irqrestore(&dbg->wdata->state.lock, flags); 159 162 160 163 return len;
+1
drivers/hid/hid-wiimote.h
··· 43 43 #define WIIPROTO_FLAG_MP_USED 0x1000 44 44 #define WIIPROTO_FLAG_MP_ACTIVE 0x2000 45 45 #define WIIPROTO_FLAG_EXITING 0x4000 46 + #define WIIPROTO_FLAG_DRM_LOCKED 0x8000 46 47 47 48 #define WIIPROTO_FLAGS_LEDS (WIIPROTO_FLAG_LED1 | WIIPROTO_FLAG_LED2 | \ 48 49 WIIPROTO_FLAG_LED3 | WIIPROTO_FLAG_LED4)