On Fri, Oct 09, 2020 at 11:07:14AM +0200, Loic Poulain wrote: > Some MHI device drivers need to stop the channels in their driver > remove callback (e.g. module unloading), but the unprepare function > is aborted because MHI core moved the channels to suspended state > prior calling driver remove callback. This prevents the driver to > send a proper MHI RESET CHAN command to the device. Device is then > unaware of the stopped state of these channels. > > This causes issue when driver tries to start the channels again (e.g. > module is reloaded), since device considers channels as already > started (inconsistent state). > > Fix this by allowing channel reset when channel is suspended. > > Signed-off-by: Loic Poulain <loic.poulain@xxxxxxxxxx> Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@xxxxxxxxxx> Thanks, Mani > --- > drivers/bus/mhi/core/main.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/drivers/bus/mhi/core/main.c b/drivers/bus/mhi/core/main.c > index d20967a..a588eac 100644 > --- a/drivers/bus/mhi/core/main.c > +++ b/drivers/bus/mhi/core/main.c > @@ -1232,7 +1232,8 @@ static void __mhi_unprepare_channel(struct mhi_controller *mhi_cntrl, > /* no more processing events for this channel */ > mutex_lock(&mhi_chan->mutex); > write_lock_irq(&mhi_chan->lock); > - if (mhi_chan->ch_state != MHI_CH_STATE_ENABLED) { > + if (mhi_chan->ch_state != MHI_CH_STATE_ENABLED && > + mhi_chan->ch_state != MHI_CH_STATE_SUSPENDED) { > write_unlock_irq(&mhi_chan->lock); > mutex_unlock(&mhi_chan->mutex); > return; > -- > 2.7.4 >