From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753935AbbHFBss (ORCPT ); Wed, 5 Aug 2015 21:48:48 -0400 Received: from mailout4.samsung.com ([203.254.224.34]:41800 "EHLO mailout4.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750827AbbHFBsr (ORCPT ); Wed, 5 Aug 2015 21:48:47 -0400 MIME-version: 1.0 Content-type: text/plain; charset=windows-1252 X-AuditID: cbfee68e-f79c56d000006efb-a2-55c2bcfd5fa9 Content-transfer-encoding: 8BIT Message-id: <55C2BCFD.8020905@samsung.com> Date: Thu, 06 Aug 2015 10:48:45 +0900 From: Jaehoon Chung User-Agent: Mozilla/5.0 (X11; Linux i686; rv:31.0) Gecko/20100101 Thunderbird/31.7.0 To: =?windows-1252?Q?Heiko_St=FCbner?= , Seungwon Jeon , Ulf Hansson Cc: linux-mmc@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH] mmc: dw_mmc: fix pio mode when internal dmac is enabled References: <3018549.c8iX1Dbrhm@diego> In-reply-to: <3018549.c8iX1Dbrhm@diego> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprIIsWRmVeSWpSXmKPExsWyRsSkSPfvnkOhBrOn8Vn8f/Sa1eLyrjls Fkf+9zNafLh/kdni+NpwB1aPO9f2sHn0bVnF6LH92jxmj8+b5AJYorhsUlJzMstSi/TtErgy NjWeZyvoEas4tf46awPjDcEuRk4OCQETiZ9L21khbDGJC/fWs3UxcnEICaxglPg35wczTNGs xfuhErMYJV71djGCJHgFBCV+TL7H0sXIwcEsIC9x5FI2hKkncf+iFkT5A0aJ9fumQ5VrSeyd P4MJxGYRUJV4ffIqO4jNJqAjsf3bcbC4qECYxJkZHSwgzSICbYwSq3/fAkswC1hL/PzRCnap sICPxJzulWBxIQE1iWvrToMN4hRQl3iwuBXsUAmBXewS36dfhNomIPFt8iGwQyUEZCU2HYB6 TFLi4IobLBMYxWYheWcWwjuzEN5ZwMi8ilE0tSC5oDgpvchIrzgxt7g0L10vOT93EyMwpk7/ e9a3g/HmAetDjAIcjEo8vA/WHAoVYk0sK67MPcRoCnTDRGYp0eR8YOTmlcQbGpsZWZiamBob mVuaKYnzJkj9DBYSSE8sSc1OTS1ILYovKs1JLT7EyMTBKdXAWHX9emOzWIu7SKcbe9wVvr3p HE0L5hfoeerOMtnKcfCeitS8lYF1HdJLFfeER1/yfr/NO+uq27tc4Q38E2T3ZGcbhvT75K1c tu5zI/9b/aridSci/Et//9n3/bR6eajy83e+JQ2c1lWRV1fcFHdfuOBc9KOcF19cl11aJrY2 Q38No9objr91SizFGYmGWsxFxYkAtqng4KQCAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrHIsWRmVeSWpSXmKPExsVy+t9jQd2/ew6FGtxcz2nx/9FrVovLu+aw WRz5389o8eH+RWaL42vDHVg97lzbw+bRt2UVo8f2a/OYPT5vkgtgiWpgtMlITUxJLVJIzUvO T8nMS7dV8g6Od443NTMw1DW0tDBXUshLzE21VXLxCdB1y8wB2qukUJaYUwoUCkgsLlbSt8M0 ITTETdcCpjFC1zckCK7HyAANJKxhzNjUeJ6toEes4tT666wNjDcEuxg5OSQETCRmLd7PBmGL SVy4tx7I5uIQEpjFKPGqt4sRJMErICjxY/I9li5GDg5mAXmJI5eyIUw9ifsXtSDKHzBKrN83 HapcS2Lv/BlMIDaLgKrE65NX2UFsNgEdie3fjoPFRQXCJM7M6GABaRYRaGOUWP37FliCWcBa 4uePVlYQW1jAR2JO90qwuJCAmsS1dafBBnEKqEs8WNzKNoER6EqE82YhnDcL4bwFjMyrGCVS C5ILipPSc43yUsv1ihNzi0vz0vWS83M3MYLj9pn0DsbDu9wPMQpwMCrx8D5YcyhUiDWxrLgy 9xCjBAezkgjv+w6gEG9KYmVValF+fFFpTmrxIUZToP8mMkuJJucDU0peSbyhsYmZkaWRuaGF kbG5kjivvsmmUCGB9MSS1OzU1ILUIpg+Jg5OqQZGLtn1Ko47Nwr9OPrykGb007lmf4NWn8xj 51x37orijHymAK/obUKr/jiuW3VwU++BnyKMnoILrr+wqfERCd301rw0c/ffKpuT58wnKfD+ lRLUsD57fLeliqeA6fWGxzev6K2UumOzaFlh/XkRw/ST3E6tCy+GBT5weczUk18crXTl7ayG sA/nlViKMxINtZiLihMBKV8AaPECAAA= DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi, Heiko. Applied this patch at my dw-mmc tree. I will request pull on this weekend. Thanks a lot! Best Regards, Jaehoon Chung On 08/04/2015 12:04 AM, Heiko Stübner wrote: > The dw_mci_init_dma() may decide to not use dma, but pio instead, caused > by things like wrong dma settings in the system. > > Till now the code dw_mci_init_slot() always assumed that dma is available > when CONFIG_MMC_DW_IDMAC was defined, ignoring the host->use_dma var > set during dma init. > > So when now the dma init failed for whatever reason, the transfer sizes > would still be set for dma transfers, especially including the maximum > block-count calculated from host->ring_size and resulting in a > > [ 4.991109] ------------[ cut here ]------------ > [ 4.991111] kernel BUG at drivers/mmc/core/core.c:256! > [ 4.991113] Internal error: Oops - BUG: 0 [#1] SMP ARM > > because host->ring_size is 0 in this case and the slot init code uses > the wrong code to calculate the values. > > Fix this by selecting the correct calculations using the host->use_dma > variable instead of the CONFIG_MMC_DW_IDMAC config option. > > Signed-off-by: Heiko Stuebner > --- > drivers/mmc/host/dw_mmc.c | 27 ++++++++++++++------------- > 1 file changed, 14 insertions(+), 13 deletions(-) > > diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c > index 40e9d8e..9ec3521 100644 > --- a/drivers/mmc/host/dw_mmc.c > +++ b/drivers/mmc/host/dw_mmc.c > @@ -2391,19 +2391,20 @@ static int dw_mci_init_slot(struct dw_mci *host, unsigned int id) > mmc->max_seg_size = host->pdata->blk_settings->max_seg_size; > } else { > /* Useful defaults if platform data is unset. */ > -#ifdef CONFIG_MMC_DW_IDMAC > - mmc->max_segs = host->ring_size; > - mmc->max_blk_size = 65536; > - mmc->max_seg_size = 0x1000; > - mmc->max_req_size = mmc->max_seg_size * host->ring_size; > - mmc->max_blk_count = mmc->max_req_size / 512; > -#else > - mmc->max_segs = 64; > - mmc->max_blk_size = 65536; /* BLKSIZ is 16 bits */ > - mmc->max_blk_count = 512; > - mmc->max_req_size = mmc->max_blk_size * mmc->max_blk_count; > - mmc->max_seg_size = mmc->max_req_size; > -#endif /* CONFIG_MMC_DW_IDMAC */ > + if (host->use_dma) { > + mmc->max_segs = host->ring_size; > + mmc->max_blk_size = 65536; > + mmc->max_seg_size = 0x1000; > + mmc->max_req_size = mmc->max_seg_size * host->ring_size; > + mmc->max_blk_count = mmc->max_req_size / 512; > + } else { > + mmc->max_segs = 64; > + mmc->max_blk_size = 65536; /* BLKSIZ is 16 bits */ > + mmc->max_blk_count = 512; > + mmc->max_req_size = mmc->max_blk_size * > + mmc->max_blk_count; > + mmc->max_seg_size = mmc->max_req_size; > + } > } > > if (dw_mci_get_cd(mmc)) >