From patchwork Thu May 8 06:25:51 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: cb.xiong@samsung.com X-Patchwork-Id: 4133401 Return-Path: X-Original-To: patchwork-linux-media@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id B7F84BFF02 for ; Thu, 8 May 2014 06:26:28 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id ED98B201EC for ; Thu, 8 May 2014 06:26:27 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 813B3201E7 for ; Thu, 8 May 2014 06:26:26 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752201AbaEHG0Y (ORCPT ); Thu, 8 May 2014 02:26:24 -0400 Received: from mailout3.samsung.com ([203.254.224.33]:17607 "EHLO mailout3.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751359AbaEHG0X (ORCPT ); Thu, 8 May 2014 02:26:23 -0400 Received: from epcpsbgm1.samsung.com (epcpsbgm1 [203.254.230.26]) by mailout3.samsung.com (Oracle Communications Messaging Server 7u4-24.01(7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0N5800JVISJYZM60@mailout3.samsung.com> for linux-media@vger.kernel.org; Thu, 08 May 2014 15:26:22 +0900 (KST) X-AuditID: cbfee61a-b7f2b6d000006c4d-d6-536b238ee106 Received: from epmmp1.local.host ( [203.254.227.16]) by epcpsbgm1.samsung.com (EPCPMTA) with SMTP id 8A.E4.27725.E832B635; Thu, 08 May 2014 15:26:22 +0900 (KST) Received: from localhost ([109.123.105.138]) by mmp1.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0N5800KBVSJ41YM0@mmp1.samsung.com>; Thu, 08 May 2014 15:26:22 +0900 (KST) From: Changbing Xiong To: linux-media@vger.kernel.org Cc: m.chehab@samsung.com, dheitmueller@kernellabs.com Subject: [PATCH 1/2] au0828: Fix disconnection bug of tuner Date: Thu, 08 May 2014 14:25:51 +0800 Message-id: <1399530351-6755-1-git-send-email-cb.xiong@samsung.com> X-Mailer: git-send-email 1.7.9.5 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrNJMWRmVeSWpSXmKPExsVy+t9jAd0+5exgg1P7pSxu7V7NYtGzYSur xcV18g7MHnOP9TJ69G1ZxejxeZNcAHMUl01Kak5mWWqRvl0CV8bj+Y2sBTOEK75/P8vYwDhZ oIuRk0NCwETi0/dZbBC2mMSFe+uBbC4OIYFFjBKP7u5mhXD+MEp8mL6QCaSKTUBHov/yXbAO EQF5iSe9N8BsZgFTiXsfbrCC2MIC1hI3d7Qzg9gsAqoSTb9vAvVycPAKOEt8amYHMSUEFCTm TLKZwMi9gJFhFaNoakFyQXFSeq6hXnFibnFpXrpecn7uJkawl59J7WBc2WBxiFGAg1GJhzfD OStYiDWxrLgy9xCjBAezkghvHE92sBBvSmJlVWpRfnxRaU5q8SFGaQ4WJXHeA63WgUIC6Ykl qdmpqQWpRTBZJg5OqQZGdq/8+onsGSJ3thYGOv5MObWl5MrGkylPLrZ8kywwZunNlhNVED69 puHhBMcEu/LJvxYzOvzfGbhjn+vzBdLsQv8EFF6oPH4oaFHSqB6zX1L9P+/UBDFO7y2Cjpd3 hzqE3Hhp47T0+MOV15+XHXFjtlI5xHV6ctOcacv/8QtZ6a/6bn7M+4WCEktxRqKhFnNRcSIA TBfMOu4BAAA= Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@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=unavailable 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 The driver crashed when the tuner was disconnected while restart stream operations are still being performed. Fixed by adding a flag in struct au0828_dvb to indicate whether restart stream operations can be performed. If the stream gets misaligned, the work of restart stream operations are usually scheduled for many times in a row. If tuner is disconnected at this time and some of restart stream operations are still not flushed, then the driver crashed due to accessing the resource which used in restart stream operations has been released. Signed-off-by: Changbing Xiong --- drivers/media/usb/au0828/au0828-dvb.c | 11 +++++++++++ drivers/media/usb/au0828/au0828.h | 1 + 2 files changed, 12 insertions(+) mode change 100644 => 100755 drivers/media/usb/au0828/au0828-dvb.c mode change 100644 => 100755 drivers/media/usb/au0828/au0828.h -- 1.7.9.5 -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/drivers/media/usb/au0828/au0828-dvb.c b/drivers/media/usb/au0828/au0828-dvb.c old mode 100644 new mode 100755 index 9a6f156..878f66f --- a/drivers/media/usb/au0828/au0828-dvb.c +++ b/drivers/media/usb/au0828/au0828-dvb.c @@ -280,6 +280,11 @@ static void au0828_restart_dvb_streaming(struct work_struct *work) mutex_lock(&dvb->lock); + if (dvb->fe_disconnected == true) { + mutex_unlock(&dvb->lock); + return; + } + /* Stop transport */ stop_urb_transfer(dev); au0828_write(dev, 0x608, 0x00); @@ -304,6 +309,8 @@ static int dvb_register(struct au0828_dev *dev) dprintk(1, "%s()\n", __func__); + dvb->fe_disconnected = false; + INIT_WORK(&dev->restart_streaming, au0828_restart_dvb_streaming); /* register adapter */ @@ -403,6 +410,10 @@ void au0828_dvb_unregister(struct au0828_dev *dev) if (dvb->frontend == NULL) return; + mutex_lock(&dvb->lock); + dvb->fe_disconnected = true; + mutex_unlock(&dvb->lock); + dvb_net_release(&dvb->net); dvb->demux.dmx.remove_frontend(&dvb->demux.dmx, &dvb->fe_mem); dvb->demux.dmx.remove_frontend(&dvb->demux.dmx, &dvb->fe_hw); diff --git a/drivers/media/usb/au0828/au0828.h b/drivers/media/usb/au0828/au0828.h old mode 100644 new mode 100755 index ef1f57f..9f9623a --- a/drivers/media/usb/au0828/au0828.h +++ b/drivers/media/usb/au0828/au0828.h @@ -102,6 +102,7 @@ struct au0828_dvb { struct dmx_frontend fe_mem; struct dvb_net net; int feeding; + bool fe_disconnected; }; enum au0828_stream_state {