From patchwork Mon Sep 10 20:15:50 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Bj=C3=B8rn_Mork?= X-Patchwork-Id: 182955 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 1D7B02C007B for ; Tue, 11 Sep 2012 06:16:24 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758650Ab2IJUQA (ORCPT ); Mon, 10 Sep 2012 16:16:00 -0400 Received: from canardo.mork.no ([148.122.252.1]:42596 "EHLO canardo.mork.no" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1758617Ab2IJUPz (ORCPT ); Mon, 10 Sep 2012 16:15:55 -0400 Received: from nemi.mork.no (nemi.mork.no [IPv6:2001:4620:9:2:216:eaff:feb3:788]) (authenticated bits=0) by canardo.mork.no (8.14.3/8.14.3) with ESMTP id q8AKFr5m026260 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NOT); Mon, 10 Sep 2012 22:15:53 +0200 Received: from bjorn by nemi.mork.no with local (Exim 4.80) (envelope-from ) id 1TBAOe-0004yO-Tr; Mon, 10 Sep 2012 22:15:52 +0200 From: =?UTF-8?q?Bj=C3=B8rn=20Mork?= To: netdev@vger.kernel.org Cc: linux-usb@vger.kernel.org, =?UTF-8?q?Bj=C3=B8rn=20Mork?= Subject: [PATCH net] net: qmi_wwan: call subdriver with control intf only Date: Mon, 10 Sep 2012 22:15:50 +0200 Message-Id: <1347308150-19088-1-git-send-email-bjorn@mork.no> X-Mailer: git-send-email 1.7.10.4 MIME-Version: 1.0 X-Virus-Scanned: clamav-milter 0.97.5 at canardo X-Virus-Status: Clean Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This fixes a hang on suspend due to calling wdm_suspend on the unregistered data interface. The hang should have been a NULL pointer reference had it not been for a logic error in the cdc_wdm code. commit 230718bd net: qmi_wwan: bind to both control and data interface changed qmi_wwan to use cdc_wdm as a subdriver for devices with a two-interface QMI/wwan function. The commit failed to update qmi_wwan_suspend and qmi_wwan_resume, which were written to handle either a single combined interface function, or no subdriver at all. The result was that we called into the subdriver both when the control interface was suspended and when the data interface was suspended. Calling the subdriver suspend function with an unregistered interface is not supported and will make the subdriver bug out. Signed-off-by: Bjørn Mork --- drivers/net/usb/qmi_wwan.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c index adfab3f..9d1679f 100644 --- a/drivers/net/usb/qmi_wwan.c +++ b/drivers/net/usb/qmi_wwan.c @@ -297,7 +297,7 @@ static int qmi_wwan_suspend(struct usb_interface *intf, pm_message_t message) if (ret < 0) goto err; - if (info->subdriver && info->subdriver->suspend) + if (intf == info->control && info->subdriver && info->subdriver->suspend) ret = info->subdriver->suspend(intf, message); if (ret < 0) usbnet_resume(intf); @@ -311,7 +311,7 @@ static int qmi_wwan_resume(struct usb_interface *intf) struct qmi_wwan_state *info = (void *)&dev->data; int ret = 0; - if (info->subdriver && info->subdriver->resume) + if (intf == info->control && info->subdriver && info->subdriver->resume) ret = info->subdriver->resume(intf); if (ret < 0) goto err;