lkml.org 
[lkml]   [2016]   [Jan]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[char-misc-next 3/6 RESEND] mei: prevent queuing new flow control credit.
    Date
    From: Alexander Usyskin <alexander.usyskin@intel.com>

    The MEI FW can receive only one flow control for read.
    Currently the driver only checks if a flow control credit was already
    sent and read is pending in the rd_pending queue, but it also has to
    check if flow control credit already queued in the write control queue
    to prevent sending more than one flow control credits.

    Signed-off-by: Alexander Usyskin <alexander.usyskin@intel.com>
    Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
    ---
    drivers/misc/mei/client.c | 21 ++++++++++++++++++++-
    1 file changed, 20 insertions(+), 1 deletion(-)

    diff --git a/drivers/misc/mei/client.c b/drivers/misc/mei/client.c
    index a6c87c713193..72e32615acd9 100644
    --- a/drivers/misc/mei/client.c
    +++ b/drivers/misc/mei/client.c
    @@ -1422,6 +1422,25 @@ out:
    }

    /**
    + * mei_cl_is_read_fc_cb - check if read cb is waiting for flow control
    + * for given host client
    + *
    + * @cl: host client
    + *
    + * Return: true, if found at least one cb.
    + */
    +static bool mei_cl_is_read_fc_cb(struct mei_cl *cl)
    +{
    + struct mei_device *dev = cl->dev;
    + struct mei_cl_cb *cb;
    +
    + list_for_each_entry(cb, &dev->ctrl_wr_list.list, list)
    + if (cb->fop_type == MEI_FOP_READ && cb->cl == cl)
    + return true;
    + return false;
    +}
    +
    +/**
    * mei_cl_read_start - the start read client message function.
    *
    * @cl: host client
    @@ -1445,7 +1464,7 @@ int mei_cl_read_start(struct mei_cl *cl, size_t length, struct file *fp)
    return -ENODEV;

    /* HW currently supports only one pending read */
    - if (!list_empty(&cl->rd_pending))
    + if (!list_empty(&cl->rd_pending) || mei_cl_is_read_fc_cb(cl))
    return -EBUSY;

    if (!mei_me_cl_is_active(cl->me_cl)) {
    --
    2.4.3


    \
     
     \ /
      Last update: 2016-01-07 14:41    [W:3.745 / U:0.032 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site