On 01/17/2014 12:20 PM, Michal Nazarewicz wrote:
> On Fri, Jan 17 2014, Robert Baldyga wrote:
>> This patch adds poll function for file representing ep0.
>>
>> Ability of read from or write to ep0 file is related with actual state of 
>> ffs:
>> - When desctiptors or strings are not written yet, POLLOUT flag is set.
>> - If there is any event to read, POLLIN flag is set.
>> - If setup request was read, POLLIN and POLLOUT flag is set, to allow
>>   send response (by performing I/O operation consistent with setup request
>>   direction) or set stall (by performing I/O operation opposite  setup
>>   request direction).
>>
>> Signed-off-by: Robert Baldyga <r.bald...@samsung.com>
>> ---
>>  drivers/usb/gadget/f_fs.c |   42 ++++++++++++++++++++++++++++++++++++++++++
>>  1 file changed, 42 insertions(+)
>>
>> diff --git a/drivers/usb/gadget/f_fs.c b/drivers/usb/gadget/f_fs.c
>> @@ -558,6 +560,45 @@ static long ffs_ep0_ioctl(struct file *file, unsigned 
>> code, unsigned long value)
>>      return ret;
>>  }
>>  
>> +static unsigned int ffs_ep0_poll(struct file *file, poll_table *wait)
>> +{
>> +    struct ffs_data *ffs = file->private_data;
>> +    unsigned int mask = POLLWRNORM;
>> +    int ret;
>> +
>> +    ret = ffs_mutex_lock(&ffs->mutex, file->f_flags & O_NONBLOCK);
>> +    if (unlikely(ret < 0))
>> +            return mask;
>> +
>> +    switch (ffs->state) {
>> +    case FFS_READ_DESCRIPTORS:
>> +    case FFS_READ_STRINGS:
>> +            mask |= POLLOUT;
>> +            break;
>> +
>> +    case FFS_ACTIVE:
>> +            switch (FFS_SETUP_STATE(ffs)) {
>> +            case FFS_NO_SETUP:
>> +                    if (ffs->ev.count)
>> +                            mask |= POLLIN;
>> +                    break;
>> +
>> +            case FFS_SETUP_PENDING:
>> +                    mask |= (POLLIN | POLLOUT);
>> +                    break;
>> +
>> +            case FFS_SETUP_CANCELED:
> 
> The FFS_SETUP_CANCELED and FFS_SETUP_PENDING are the same case.  ep0
> never recovers from FFS_SETUP_CANCELED on its own, it waits for user
> space to attempt to read or write something.  So unless I'm missing
> something the two cases should be merged together and in both POLLIN and
> POLLOUT needs to be set.
> 

Hmm, it seems like it doesn't work this way. In both read and write
functions in ep0 file operations, there is check at the beginning:

if (FFS_SETUP_STATE(ffs) == FFS_SETUP_CANCELED)
        return -EIDRM;

So read/write does nothing when FFS_SETUP_CANCELED state is set.

>> +                    break;
>> +            }
>> +    case FFS_CLOSING:
>> +            break;
>> +    }
>> +
>> +    mutex_unlock(&ffs->mutex);
>> +
>> +    return mask;
>> +}
>> +
>>  static const struct file_operations ffs_ep0_operations = {
>>      .llseek =       no_llseek,
>>  
> 
> 
> 

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to