From patchwork Fri Jan 31 13:03:32 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Greg Kroah-Hartman X-Patchwork-Id: 3561521 Return-Path: X-Original-To: patchwork-linux-input@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 094569F382 for ; Fri, 31 Jan 2014 13:03:18 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id C1FA72020E for ; Fri, 31 Jan 2014 13:03:16 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id C017A20200 for ; Fri, 31 Jan 2014 13:03:11 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932274AbaAaNDE (ORCPT ); Fri, 31 Jan 2014 08:03:04 -0500 Received: from mail.linuxfoundation.org ([140.211.169.12]:47831 "EHLO mail.linuxfoundation.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932241AbaAaNDD (ORCPT ); Fri, 31 Jan 2014 08:03:03 -0500 Received: from localhost (ip-213-49-233-218.dsl.scarlet.be [213.49.233.218]) by mail.linuxfoundation.org (Postfix) with ESMTPSA id 6EF8E2B; Fri, 31 Jan 2014 13:03:02 +0000 (UTC) From: Greg Kroah-Hartman To: dmitry.torokhov@gmail.com Cc: linux-input@vger.kernel.org, "Pierre-Loup A. Griffais" , Greg Kroah-Hartman Subject: [PATCH 5/7] Input: xpad: disconnect all Wireless controllers at init Date: Fri, 31 Jan 2014 14:03:32 +0100 Message-Id: <1391173414-6199-6-git-send-email-gregkh@linuxfoundation.org> X-Mailer: git-send-email 1.8.5.3 In-Reply-To: <1391173414-6199-1-git-send-email-gregkh@linuxfoundation.org> References: <1391173414-6199-1-git-send-email-gregkh@linuxfoundation.org> Sender: linux-input-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-input@vger.kernel.org X-Spam-Status: No, score=-7.5 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: "Pierre-Loup A. Griffais" We initializing the driver/device, we really don't know how many controllers are connected. So send a "disconnect all" command to the base-station, and let the user pair the controllers in the order in which they want them assigned. Note, this means we now do not "preallocate" all 4 devices when a single wireless base station is seen, but require the device to be properly connected to the base station before that can happen. The allocation of the device happens in the next patch, not here, so in a way, this patch breaks all wireless devices... Because we want to talk to the device, we have to set up the output urbs no matter if we have CONFIG_JOYSTICK_XPAD_FF or CONFIG_JOYSTICK_XPAD_LEDS enabled not, so take out the code that allows those variables and code to be disabled (it's so small it should never matter...) Signed-off-by: "Pierre-Loup A. Griffais" Signed-off-by: Greg Kroah-Hartman --- drivers/input/joystick/xpad.c | 46 ++++++++++++++++++++++++++++++++----------- 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/drivers/input/joystick/xpad.c b/drivers/input/joystick/xpad.c index 7997ae89a877..7a07b95790d7 100644 --- a/drivers/input/joystick/xpad.c +++ b/drivers/input/joystick/xpad.c @@ -278,12 +278,10 @@ struct usb_xpad { struct urb *bulk_out; unsigned char *bdata; -#if defined(CONFIG_JOYSTICK_XPAD_FF) || defined(CONFIG_JOYSTICK_XPAD_LEDS) struct urb *irq_out; /* urb for interrupt out report */ unsigned char *odata; /* output data */ dma_addr_t odata_dma; struct mutex odata_mutex; -#endif #if defined(CONFIG_JOYSTICK_XPAD_LEDS) struct xpad_led *led; @@ -537,7 +535,6 @@ static void xpad_bulk_out(struct urb *urb) } } -#if defined(CONFIG_JOYSTICK_XPAD_FF) || defined(CONFIG_JOYSTICK_XPAD_LEDS) static void xpad_irq_out(struct urb *urb) { struct usb_xpad *xpad = urb->context; @@ -623,11 +620,6 @@ static void xpad_deinit_output(struct usb_xpad *xpad) xpad->odata, xpad->odata_dma); } } -#else -static int xpad_init_output(struct usb_interface *intf, struct usb_xpad *xpad) { return 0; } -static void xpad_deinit_output(struct usb_xpad *xpad) {} -static void xpad_stop_output(struct usb_xpad *xpad) {} -#endif #ifdef CONFIG_JOYSTICK_XPAD_FF static int xpad_play_effect(struct input_dev *dev, void *data, struct ff_effect *effect) @@ -1091,11 +1083,41 @@ static int xpad_probe(struct usb_interface *intf, const struct usb_device_id *id usb_kill_urb(xpad->irq_in); goto fail9; } + + /* + * We don't know how to check the controller state at driver + * load, so just disconnect them all, requiring the user to + * repair the device in the order they want them used. Good + * point is that we don't connect devices in "random" order, + * but the extra step seems a bit harsh as other operating + * systems don't require this at the moment. + * + * Power-off packet information came from an OS-X + * reverse-engineered driver located at: + * http://tattiebogle.net/index.php/ProjectRoot/Xbox360Controller/OsxDriver#toc1 + */ + mutex_lock(&xpad->odata_mutex); + xpad->odata[0] = 0x00; + xpad->odata[1] = 0x00; + xpad->odata[2] = 0x08; + xpad->odata[3] = 0xC0; + xpad->odata[4] = 0x00; + xpad->odata[5] = 0x00; + xpad->odata[6] = 0x00; + xpad->odata[7] = 0x00; + xpad->odata[8] = 0x00; + xpad->odata[9] = 0x00; + xpad->odata[10] = 0x00; + xpad->odata[11] = 0x00; + xpad->irq_out->transfer_buffer_length = 12; + usb_submit_urb(xpad->irq_out, GFP_KERNEL); + mutex_unlock(&xpad->odata_mutex); + } else { + xpad->pad_present = 1; + error = xpad_init_input(xpad); + if (error) + goto fail9; } - xpad->pad_present = 1; - error = xpad_init_input(xpad); - if (error) - goto fail9; return 0;