struct wiimote_state state;
 };
 
-#define WIIPROTO_FLAG_LED1 0x01
-#define WIIPROTO_FLAG_LED2 0x02
-#define WIIPROTO_FLAG_LED3 0x04
-#define WIIPROTO_FLAG_LED4 0x08
+#define WIIPROTO_FLAG_LED1             0x01
+#define WIIPROTO_FLAG_LED2             0x02
+#define WIIPROTO_FLAG_LED3             0x04
+#define WIIPROTO_FLAG_LED4             0x08
+#define WIIPROTO_FLAG_RUMBLE           0x10
 #define WIIPROTO_FLAGS_LEDS (WIIPROTO_FLAG_LED1 | WIIPROTO_FLAG_LED2 | \
                                        WIIPROTO_FLAG_LED3 | WIIPROTO_FLAG_LED4)
 
 
 enum wiiproto_reqs {
        WIIPROTO_REQ_NULL = 0x0,
+       WIIPROTO_REQ_RUMBLE = 0x10,
        WIIPROTO_REQ_LED = 0x11,
        WIIPROTO_REQ_DRM = 0x12,
        WIIPROTO_REQ_STATUS = 0x20,
        spin_unlock_irqrestore(&wdata->qlock, flags);
 }
 
+/*
+ * This sets the rumble bit on the given output report if rumble is
+ * currently enabled.
+ * \cmd1 must point to the second byte in the output report => &cmd[1]
+ * This must be called on nearly every output report before passing it
+ * into the output queue!
+ */
+static inline void wiiproto_keep_rumble(struct wiimote_data *wdata, __u8 *cmd1)
+{
+       if (wdata->state.flags & WIIPROTO_FLAG_RUMBLE)
+               *cmd1 |= 0x01;
+}
+
+static void wiiproto_req_rumble(struct wiimote_data *wdata, __u8 rumble)
+{
+       __u8 cmd[2];
+
+       rumble = !!rumble;
+       if (rumble == !!(wdata->state.flags & WIIPROTO_FLAG_RUMBLE))
+               return;
+
+       if (rumble)
+               wdata->state.flags |= WIIPROTO_FLAG_RUMBLE;
+       else
+               wdata->state.flags &= ~WIIPROTO_FLAG_RUMBLE;
+
+       cmd[0] = WIIPROTO_REQ_RUMBLE;
+       cmd[1] = 0;
+
+       wiiproto_keep_rumble(wdata, &cmd[1]);
+       wiimote_queue(wdata, cmd, sizeof(cmd));
+}
+
 static void wiiproto_req_leds(struct wiimote_data *wdata, int leds)
 {
        __u8 cmd[2];
        if (leds & WIIPROTO_FLAG_LED4)
                cmd[1] |= 0x80;
 
+       wiiproto_keep_rumble(wdata, &cmd[1]);
        wiimote_queue(wdata, cmd, sizeof(cmd));
 }
 
        cmd[1] = 0;
        cmd[2] = drm;
 
+       wiiproto_keep_rumble(wdata, &cmd[1]);
        wiimote_queue(wdata, cmd, sizeof(cmd));
 }