* [PATCH 0/2] mxcmmc driver fixes
@ 2014-09-30 14:59 Matteo Facchinetti
2014-09-30 14:59 ` [PATCH 1/2] mmc: mxcmmc: fix race condition when dma finish a data transfer Matteo Facchinetti
` (2 more replies)
0 siblings, 3 replies; 7+ messages in thread
From: Matteo Facchinetti @ 2014-09-30 14:59 UTC (permalink / raw)
To: chris, ulf.hansson
Cc: shc_work, s.hauer, peter.griffin, linux-mmc, linux-kernel,
linucppc-dev, agust, gsi, sbabic, Matteo Facchinetti
From: Matteo Facchinetti <matteo.facchinetti@sirius-es.it>
Hi,
this patchset contains fixes for the mxcmmc driver.
*Patch 1:
fix a rare race condition that breaks a data trasfer when mxcmmc
driver use dma.
To reproduce this error, use mmc as rootfs and start at boot time
a realtime Xenomai application.
The realtime it's not directly related but entropy produced by
ipipe scheduler highlights the problem.
When this event occurs, the mxcmmc watchdog expires,
this cause a read error and application doesn't run.
*Patch 2:
fix the default value for available voltages into mxcmci_probe
Applied to mainline Linux-3.17.0-rc6-next on arch mpc512x.
Tested on mpc5125twr evaluation board
Applied to custom Linux-3.9.4 on arch mpc512x
Tested on a mpc5125 custom board.
Regards,
Matteo Facchinetti
Sirius Electronic Systems
Matteo Facchinetti (2):
mmc: mxcmmc: fix race condition when dma finish a data transfer
mmc: mxcmmc: fix the default value for available voltages into
mxcmci_probe
drivers/mmc/host/mxcmmc.c | 27 ++++++++++-----------------
1 file changed, 10 insertions(+), 17 deletions(-)
--
1.8.3.2
^ permalink raw reply [flat|nested] 7+ messages in thread* [PATCH 1/2] mmc: mxcmmc: fix race condition when dma finish a data transfer 2014-09-30 14:59 [PATCH 0/2] mxcmmc driver fixes Matteo Facchinetti @ 2014-09-30 14:59 ` Matteo Facchinetti 2014-10-08 6:49 ` Sascha Hauer 2014-10-27 12:12 ` Ulf Hansson 2014-09-30 14:59 ` [PATCH 2/2] mmc: mxcmmc: fix the default value for available voltages into mxcmci_probe Matteo Facchinetti 2014-10-07 12:50 ` [PATCH 0/2] mxcmmc driver fixes Matteo Facchinetti 2 siblings, 2 replies; 7+ messages in thread From: Matteo Facchinetti @ 2014-09-30 14:59 UTC (permalink / raw) To: chris, ulf.hansson Cc: shc_work, s.hauer, peter.griffin, linux-mmc, linux-kernel, linucppc-dev, agust, gsi, sbabic, Matteo Facchinetti From: Matteo Facchinetti <matteo.facchinetti@sirius-es.it> During a read of data block using dma, driver might have two ways to finish to read and free the resources: 1) checking STATUS_DATA_TRANS_DONE mask, in the mxcmci_irq() routine (pending to mmc irq) 2) mxmmc driver, registers also a mxcmci_dma_callback() and when transfer is finished, dma driver calls this callback. (pending to dma irq) Both ways are concurrent with each other. Race condition happens when following events occur: /* (1) mxcmci driver start data transfer */ 158.418970: mpc_dma_execute: mpc_dma_execute(): will_access_peripheral start cid=31 158.418976: mpc_dma_issue_pending <-mxcmci_request 158.418983: mxcmci_start_cmd <-mxcmci_request /* (2) mxcmci driver receive mmc irq */ 158.419656: mxcmci_irq <-handle_irq_event_percpu 158.419692: mxcmci_read_response <-mxcmci_irq /* (3) mxcmci driver checks that transfer is complete and call mxcmci_finish_data() */ 158.419726: mxcmci_data_done <-mxcmci_irq 158.419729: mxcmci_finish_data <-mxcmci_data_done 158.419733: dma_direct_unmap_sg <-mxcmci_finish_data 158.419736: mxcmci_swap_buffers.isra.24 <-mxcmci_finish_data 158.419762: mxcmci_read_response <-mxcmci_data_done /* (4) mxcmci driver (no dma): send stop command */ 158.419765: mxcmci_start_cmd <-mxcmci_data_done /* (5) mxcmci driver (no dma): receive the stop command irq response */ 158.419782: mxcmci_irq <-handle_irq_event_percpu 158.419812: mxcmci_read_response <-mxcmci_irq 158.419843: mxcmci_finish_request <-mxcmci_irq /* (6) dma driver: receive dma irq (finish data transfer) related by request on step 1 */ 158.419853: mpc_dma_irq <-handle_irq_event_percpu 158.420001: mpc_dma_irq_process <-mpc_dma_irq 158.420004: mpc_dma_irq_process <-mpc_dma_irq /* (7) dma driver: start dma tasklet to finish the dma irq handling */ 158.420008: mpc_dma_irq_process: mpc_dma_irq_process(): completed ch:31 /* (8) mxcmci driver: start next data transfer using dma */ 158.420174: mxcmci_request <-mmc_start_req 158.420182: dma_direct_map_sg <-mxcmci_request 158.420192: mpc_dma_prep_slave_sg <-mxcmci_request /* (9) dma driver: schedule irq tasklet and execute mxcmci dma driver callback */ 158.420250: mpc_dma_tasklet <-tasklet_action 158.420254: mpc_dma_process_completed <-tasklet_action 158.420267: mxcmci_dma_callback <-mpc_dma_process_completed /* ERROR!!! (10) mxcmci driver callback works on dma data related to the step 1 that is already finished */ 158.420271: mxcmci_data_done <-mpc_dma_process_completed 158.420273: mxcmci_finish_data <-mxcmci_data_done /* ERROR!!! (11) mxcmci driver: clear data that should be used by step 8 and send an other mmc stop command (already sended on step 4) */ 158.420276: dma_direct_unmap_sg <-mxcmci_finish_data 158.420279: mxcmci_swap_buffers.isra.24 <-mxcmci_finish_data 158.420330: mxcmci_read_response <-mxcmci_data_done 158.420333: mxcmci_start_cmd <-mxcmci_data_done 158.420338: dma_run_dependencies <-mpc_dma_process_completed ... ... ... 168.474223: mxcmci_watchdog <-call_timer_fn 168.474236: mxcmci_watchdog: mxcmci_watchdog 168.474397: mpc_dma_device_control <-mxcmci_watchdog In accordance with the other drivers that using the dma engine, fix it, leaving *only* to dma driver the complete control to ending the read operation. Removing STATUS_READ_OP_DONE event activation, has as effect to force mxcmci driver to handle the finish data transfer only by mxcmci dma callback. Signed-off-by: Matteo Facchinetti <matteo.facchinetti@sirius-es.it> --- drivers/mmc/host/mxcmmc.c | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/drivers/mmc/host/mxcmmc.c b/drivers/mmc/host/mxcmmc.c index ad11142..536a898 100644 --- a/drivers/mmc/host/mxcmmc.c +++ b/drivers/mmc/host/mxcmmc.c @@ -373,13 +373,9 @@ static void mxcmci_dma_callback(void *data) del_timer(&host->watchdog); stat = mxcmci_readl(host, MMC_REG_STATUS); - mxcmci_writel(host, stat & ~STATUS_DATA_TRANS_DONE, MMC_REG_STATUS); dev_dbg(mmc_dev(host->mmc), "%s: 0x%08x\n", __func__, stat); - if (stat & STATUS_READ_OP_DONE) - mxcmci_writel(host, STATUS_READ_OP_DONE, MMC_REG_STATUS); - mxcmci_data_done(host, stat); } @@ -743,10 +739,8 @@ static irqreturn_t mxcmci_irq(int irq, void *devid) sdio_irq = (stat & STATUS_SDIO_INT_ACTIVE) && host->use_sdio; spin_unlock_irqrestore(&host->lock, flags); - if (mxcmci_use_dma(host) && - (stat & (STATUS_READ_OP_DONE | STATUS_WRITE_OP_DONE))) - mxcmci_writel(host, STATUS_READ_OP_DONE | STATUS_WRITE_OP_DONE, - MMC_REG_STATUS); + if (mxcmci_use_dma(host) && (stat & (STATUS_WRITE_OP_DONE))) + mxcmci_writel(host, STATUS_WRITE_OP_DONE, MMC_REG_STATUS); if (sdio_irq) { mxcmci_writel(host, STATUS_SDIO_INT_ACTIVE, MMC_REG_STATUS); @@ -756,8 +750,7 @@ static irqreturn_t mxcmci_irq(int irq, void *devid) if (stat & STATUS_END_CMD_RESP) mxcmci_cmd_done(host, stat); - if (mxcmci_use_dma(host) && - (stat & (STATUS_DATA_TRANS_DONE | STATUS_WRITE_OP_DONE))) { + if (mxcmci_use_dma(host) && (stat & STATUS_WRITE_OP_DONE)) { del_timer(&host->watchdog); mxcmci_data_done(host, stat); } -- 1.8.3.2 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH 1/2] mmc: mxcmmc: fix race condition when dma finish a data transfer 2014-09-30 14:59 ` [PATCH 1/2] mmc: mxcmmc: fix race condition when dma finish a data transfer Matteo Facchinetti @ 2014-10-08 6:49 ` Sascha Hauer 2014-10-27 12:12 ` Ulf Hansson 1 sibling, 0 replies; 7+ messages in thread From: Sascha Hauer @ 2014-10-08 6:49 UTC (permalink / raw) To: Matteo Facchinetti Cc: chris, ulf.hansson, shc_work, peter.griffin, linux-mmc, linux-kernel, linucppc-dev, agust, gsi, sbabic On Tue, Sep 30, 2014 at 04:59:37PM +0200, Matteo Facchinetti wrote: > From: Matteo Facchinetti <matteo.facchinetti@sirius-es.it> > > In accordance with the other drivers that using the dma engine, > fix it, leaving *only* to dma driver the complete control to > ending the read operation. > > Removing STATUS_READ_OP_DONE event activation, has as effect > to force mxcmci driver to handle the finish data transfer only > by mxcmci dma callback. > > Signed-off-by: Matteo Facchinetti <matteo.facchinetti@sirius-es.it> I can't test this currently, but it looks sane to me and I assume you invested quite some time to make sure the patch behaves correctly. Acked-by: Sascha Hauer <s.hauer@pengutronix.de> Sascha -- Pengutronix e.K. | | Industrial Linux Solutions | http://www.pengutronix.de/ | Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 1/2] mmc: mxcmmc: fix race condition when dma finish a data transfer 2014-09-30 14:59 ` [PATCH 1/2] mmc: mxcmmc: fix race condition when dma finish a data transfer Matteo Facchinetti 2014-10-08 6:49 ` Sascha Hauer @ 2014-10-27 12:12 ` Ulf Hansson 1 sibling, 0 replies; 7+ messages in thread From: Ulf Hansson @ 2014-10-27 12:12 UTC (permalink / raw) To: Matteo Facchinetti Cc: Chris Ball, Alexander Shiyan, Sascha Hauer, Peter Griffin, linux-mmc, linux-kernel@vger.kernel.org, linucppc-dev, Anatolij Gustschin, gsi, sbabic On 30 September 2014 16:59, Matteo Facchinetti <matteo.facchinetti@sirius-es.it> wrote: > From: Matteo Facchinetti <matteo.facchinetti@sirius-es.it> > > During a read of data block using dma, driver might have two ways to finish to read > and free the resources: > 1) checking STATUS_DATA_TRANS_DONE mask, in the mxcmci_irq() routine > (pending to mmc irq) > 2) mxmmc driver, registers also a mxcmci_dma_callback() and when transfer is finished, > dma driver calls this callback. (pending to dma irq) > Both ways are concurrent with each other. > > Race condition happens when following events occur: > /* (1) mxcmci driver start data transfer */ > 158.418970: mpc_dma_execute: mpc_dma_execute(): will_access_peripheral start cid=31 > 158.418976: mpc_dma_issue_pending <-mxcmci_request > 158.418983: mxcmci_start_cmd <-mxcmci_request > /* (2) mxcmci driver receive mmc irq */ > 158.419656: mxcmci_irq <-handle_irq_event_percpu > 158.419692: mxcmci_read_response <-mxcmci_irq > /* (3) mxcmci driver checks that transfer is complete and call mxcmci_finish_data() */ > 158.419726: mxcmci_data_done <-mxcmci_irq > 158.419729: mxcmci_finish_data <-mxcmci_data_done > 158.419733: dma_direct_unmap_sg <-mxcmci_finish_data > 158.419736: mxcmci_swap_buffers.isra.24 <-mxcmci_finish_data > 158.419762: mxcmci_read_response <-mxcmci_data_done > /* (4) mxcmci driver (no dma): send stop command */ > 158.419765: mxcmci_start_cmd <-mxcmci_data_done > /* (5) mxcmci driver (no dma): receive the stop command irq response */ > 158.419782: mxcmci_irq <-handle_irq_event_percpu > 158.419812: mxcmci_read_response <-mxcmci_irq > 158.419843: mxcmci_finish_request <-mxcmci_irq > /* (6) dma driver: receive dma irq (finish data transfer) related by request on step 1 */ > 158.419853: mpc_dma_irq <-handle_irq_event_percpu > 158.420001: mpc_dma_irq_process <-mpc_dma_irq > 158.420004: mpc_dma_irq_process <-mpc_dma_irq > /* (7) dma driver: start dma tasklet to finish the dma irq handling */ > 158.420008: mpc_dma_irq_process: mpc_dma_irq_process(): completed ch:31 > /* (8) mxcmci driver: start next data transfer using dma */ > 158.420174: mxcmci_request <-mmc_start_req > 158.420182: dma_direct_map_sg <-mxcmci_request > 158.420192: mpc_dma_prep_slave_sg <-mxcmci_request > /* (9) dma driver: schedule irq tasklet and execute mxcmci dma driver callback */ > 158.420250: mpc_dma_tasklet <-tasklet_action > 158.420254: mpc_dma_process_completed <-tasklet_action > 158.420267: mxcmci_dma_callback <-mpc_dma_process_completed > /* ERROR!!! (10) mxcmci driver callback works on dma data related to the step 1 > that is already finished */ > 158.420271: mxcmci_data_done <-mpc_dma_process_completed > 158.420273: mxcmci_finish_data <-mxcmci_data_done > /* ERROR!!! (11) mxcmci driver: clear data that should be used by step 8 and > send an other mmc stop command (already sended on step 4) */ > 158.420276: dma_direct_unmap_sg <-mxcmci_finish_data > 158.420279: mxcmci_swap_buffers.isra.24 <-mxcmci_finish_data > 158.420330: mxcmci_read_response <-mxcmci_data_done > 158.420333: mxcmci_start_cmd <-mxcmci_data_done > 158.420338: dma_run_dependencies <-mpc_dma_process_completed > ... > ... > ... > 168.474223: mxcmci_watchdog <-call_timer_fn > 168.474236: mxcmci_watchdog: mxcmci_watchdog > 168.474397: mpc_dma_device_control <-mxcmci_watchdog > > > In accordance with the other drivers that using the dma engine, > fix it, leaving *only* to dma driver the complete control to > ending the read operation. > > Removing STATUS_READ_OP_DONE event activation, has as effect > to force mxcmci driver to handle the finish data transfer only > by mxcmci dma callback. > > Signed-off-by: Matteo Facchinetti <matteo.facchinetti@sirius-es.it> Thanks! Applied for next! Kind regards Uffe > --- > drivers/mmc/host/mxcmmc.c | 13 +++---------- > 1 file changed, 3 insertions(+), 10 deletions(-) > > diff --git a/drivers/mmc/host/mxcmmc.c b/drivers/mmc/host/mxcmmc.c > index ad11142..536a898 100644 > --- a/drivers/mmc/host/mxcmmc.c > +++ b/drivers/mmc/host/mxcmmc.c > @@ -373,13 +373,9 @@ static void mxcmci_dma_callback(void *data) > del_timer(&host->watchdog); > > stat = mxcmci_readl(host, MMC_REG_STATUS); > - mxcmci_writel(host, stat & ~STATUS_DATA_TRANS_DONE, MMC_REG_STATUS); > > dev_dbg(mmc_dev(host->mmc), "%s: 0x%08x\n", __func__, stat); > > - if (stat & STATUS_READ_OP_DONE) > - mxcmci_writel(host, STATUS_READ_OP_DONE, MMC_REG_STATUS); > - > mxcmci_data_done(host, stat); > } > > @@ -743,10 +739,8 @@ static irqreturn_t mxcmci_irq(int irq, void *devid) > sdio_irq = (stat & STATUS_SDIO_INT_ACTIVE) && host->use_sdio; > spin_unlock_irqrestore(&host->lock, flags); > > - if (mxcmci_use_dma(host) && > - (stat & (STATUS_READ_OP_DONE | STATUS_WRITE_OP_DONE))) > - mxcmci_writel(host, STATUS_READ_OP_DONE | STATUS_WRITE_OP_DONE, > - MMC_REG_STATUS); > + if (mxcmci_use_dma(host) && (stat & (STATUS_WRITE_OP_DONE))) > + mxcmci_writel(host, STATUS_WRITE_OP_DONE, MMC_REG_STATUS); > > if (sdio_irq) { > mxcmci_writel(host, STATUS_SDIO_INT_ACTIVE, MMC_REG_STATUS); > @@ -756,8 +750,7 @@ static irqreturn_t mxcmci_irq(int irq, void *devid) > if (stat & STATUS_END_CMD_RESP) > mxcmci_cmd_done(host, stat); > > - if (mxcmci_use_dma(host) && > - (stat & (STATUS_DATA_TRANS_DONE | STATUS_WRITE_OP_DONE))) { > + if (mxcmci_use_dma(host) && (stat & STATUS_WRITE_OP_DONE)) { > del_timer(&host->watchdog); > mxcmci_data_done(host, stat); > } > -- > 1.8.3.2 > ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 2/2] mmc: mxcmmc: fix the default value for available voltages into mxcmci_probe 2014-09-30 14:59 [PATCH 0/2] mxcmmc driver fixes Matteo Facchinetti 2014-09-30 14:59 ` [PATCH 1/2] mmc: mxcmmc: fix race condition when dma finish a data transfer Matteo Facchinetti @ 2014-09-30 14:59 ` Matteo Facchinetti 2014-10-08 6:46 ` Sascha Hauer 2014-10-07 12:50 ` [PATCH 0/2] mxcmmc driver fixes Matteo Facchinetti 2 siblings, 1 reply; 7+ messages in thread From: Matteo Facchinetti @ 2014-09-30 14:59 UTC (permalink / raw) To: chris, ulf.hansson Cc: shc_work, s.hauer, peter.griffin, linux-mmc, linux-kernel, linucppc-dev, agust, gsi, sbabic, Matteo Facchinetti From: Matteo Facchinetti <matteo.facchinetti@sirius-es.it> If available voltages are not given, mmc_regulator_get_supply() function returns 0 and mxcmmc driver doesn't set a value for ocr_avail mask. In accordance with the comment in platform_data/mmc-mxcmmc.h, fix it, assuming MMC_VDD_32_33 | MMC_VDD_33_34 as default value. Signed-off-by: Matteo Facchinetti <matteo.facchinetti@sirius-es.it> --- drivers/mmc/host/mxcmmc.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/drivers/mmc/host/mxcmmc.c b/drivers/mmc/host/mxcmmc.c index 536a898..5350dc5 100644 --- a/drivers/mmc/host/mxcmmc.c +++ b/drivers/mmc/host/mxcmmc.c @@ -1077,13 +1077,13 @@ static int mxcmci_probe(struct platform_device *pdev) dat3_card_detect = true; ret = mmc_regulator_get_supply(mmc); - if (ret) { - if (pdata && ret != -EPROBE_DEFER) - mmc->ocr_avail = pdata->ocr_avail ? : - MMC_VDD_32_33 | MMC_VDD_33_34; - else - goto out_free; - } + if (ret == -EPROBE_DEFER) + goto out_free; + + if (pdata && pdata->ocr_avail) + mmc->ocr_avail = pdata->ocr_avail; + else + mmc->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34; if (dat3_card_detect) host->default_irq_mask = -- 1.8.3.2 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH 2/2] mmc: mxcmmc: fix the default value for available voltages into mxcmci_probe 2014-09-30 14:59 ` [PATCH 2/2] mmc: mxcmmc: fix the default value for available voltages into mxcmci_probe Matteo Facchinetti @ 2014-10-08 6:46 ` Sascha Hauer 0 siblings, 0 replies; 7+ messages in thread From: Sascha Hauer @ 2014-10-08 6:46 UTC (permalink / raw) To: Matteo Facchinetti Cc: chris, ulf.hansson, shc_work, peter.griffin, linux-mmc, linux-kernel, linucppc-dev, agust, gsi, sbabic On Tue, Sep 30, 2014 at 04:59:38PM +0200, Matteo Facchinetti wrote: > From: Matteo Facchinetti <matteo.facchinetti@sirius-es.it> > > If available voltages are not given, mmc_regulator_get_supply() function > returns 0 and mxcmmc driver doesn't set a value for ocr_avail mask. > > In accordance with the comment in platform_data/mmc-mxcmmc.h, > fix it, assuming MMC_VDD_32_33 | MMC_VDD_33_34 as default value. > > Signed-off-by: Matteo Facchinetti <matteo.facchinetti@sirius-es.it> > --- > drivers/mmc/host/mxcmmc.c | 14 +++++++------- > 1 file changed, 7 insertions(+), 7 deletions(-) > > diff --git a/drivers/mmc/host/mxcmmc.c b/drivers/mmc/host/mxcmmc.c > index 536a898..5350dc5 100644 > --- a/drivers/mmc/host/mxcmmc.c > +++ b/drivers/mmc/host/mxcmmc.c > @@ -1077,13 +1077,13 @@ static int mxcmci_probe(struct platform_device *pdev) > dat3_card_detect = true; > > ret = mmc_regulator_get_supply(mmc); mmc_regulator_get_supply() sets mmc->ocr_avail based on the information of the vmmc regulator if present... > - if (ret) { > - if (pdata && ret != -EPROBE_DEFER) > - mmc->ocr_avail = pdata->ocr_avail ? : > - MMC_VDD_32_33 | MMC_VDD_33_34; > - else > - goto out_free; > - } > + if (ret == -EPROBE_DEFER) > + goto out_free; > + > + if (pdata && pdata->ocr_avail) > + mmc->ocr_avail = pdata->ocr_avail; > + else > + mmc->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34; ... and here mmc->ocr_avail is overwritten unconditionally. Unfortunately the return value of mmc_regulator_get_supply() doesn't indicate if it was successful in setting a ocr_avail. So I think the best you can do here is: if (!mmc->ocr_avail) { if (pdata && pdata->ocr_avail) mmc->ocr_avail = pdata->ocr_avail; else mmc->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34; } Sascha -- Pengutronix e.K. | | Industrial Linux Solutions | http://www.pengutronix.de/ | Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 0/2] mxcmmc driver fixes 2014-09-30 14:59 [PATCH 0/2] mxcmmc driver fixes Matteo Facchinetti 2014-09-30 14:59 ` [PATCH 1/2] mmc: mxcmmc: fix race condition when dma finish a data transfer Matteo Facchinetti 2014-09-30 14:59 ` [PATCH 2/2] mmc: mxcmmc: fix the default value for available voltages into mxcmci_probe Matteo Facchinetti @ 2014-10-07 12:50 ` Matteo Facchinetti 2 siblings, 0 replies; 7+ messages in thread From: Matteo Facchinetti @ 2014-10-07 12:50 UTC (permalink / raw) To: chris, ulf.hansson Cc: shc_work, s.hauer, peter.griffin, linux-mmc, linux-kernel, agust, gsi, sbabic Does anyone have any comments? On 30/09/2014 16:59, Matteo Facchinetti wrote: > From: Matteo Facchinetti <matteo.facchinetti@sirius-es.it> > > Hi, > > this patchset contains fixes for the mxcmmc driver. > > *Patch 1: > fix a rare race condition that breaks a data trasfer when mxcmmc > driver use dma. > To reproduce this error, use mmc as rootfs and start at boot time > a realtime Xenomai application. > The realtime it's not directly related but entropy produced by > ipipe scheduler highlights the problem. > When this event occurs, the mxcmmc watchdog expires, > this cause a read error and application doesn't run. > > *Patch 2: > fix the default value for available voltages into mxcmci_probe > > Applied to mainline Linux-3.17.0-rc6-next on arch mpc512x. > Tested on mpc5125twr evaluation board > > Applied to custom Linux-3.9.4 on arch mpc512x > Tested on a mpc5125 custom board. > > Regards, > Matteo Facchinetti > Sirius Electronic Systems > > > Matteo Facchinetti (2): > mmc: mxcmmc: fix race condition when dma finish a data transfer > mmc: mxcmmc: fix the default value for available voltages into > mxcmci_probe > > drivers/mmc/host/mxcmmc.c | 27 ++++++++++----------------- > 1 file changed, 10 insertions(+), 17 deletions(-) > ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2014-10-27 12:12 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2014-09-30 14:59 [PATCH 0/2] mxcmmc driver fixes Matteo Facchinetti 2014-09-30 14:59 ` [PATCH 1/2] mmc: mxcmmc: fix race condition when dma finish a data transfer Matteo Facchinetti 2014-10-08 6:49 ` Sascha Hauer 2014-10-27 12:12 ` Ulf Hansson 2014-09-30 14:59 ` [PATCH 2/2] mmc: mxcmmc: fix the default value for available voltages into mxcmci_probe Matteo Facchinetti 2014-10-08 6:46 ` Sascha Hauer 2014-10-07 12:50 ` [PATCH 0/2] mxcmmc driver fixes Matteo Facchinetti
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox