/** * mei_poll - the poll function * * @file: pointer to file structure * @wait: pointer to poll_table structure * * returns poll mask */ static unsigned int mei_poll(struct file *file, poll_table *wait) { struct mei_cl *cl = file->private_data; struct mei_device *dev; unsigned int mask = 0; if (WARN_ON(!cl || !cl->dev)) return mask; dev = cl->dev; mutex_lock(&dev->device_lock); if (dev->dev_state != MEI_DEV_ENABLED) goto out; if (cl == &dev->iamthif_cl) { mask = mei_amthif_poll(dev, file, wait); goto out; } mutex_unlock(&dev->device_lock); poll_wait(file, &cl->tx_wait, wait); mutex_lock(&dev->device_lock); if (MEI_WRITE_COMPLETE == cl->writing_state) mask |= (POLLIN | POLLRDNORM); out: mutex_unlock(&dev->device_lock); return mask; }
/** * mei_poll - the poll function * * @file: pointer to file structure * @wait: pointer to poll_table structure * * Return: poll mask */ static unsigned int mei_poll(struct file *file, poll_table *wait) { unsigned long req_events = poll_requested_events(wait); struct mei_cl *cl = file->private_data; struct mei_device *dev; unsigned int mask = 0; bool notify_en; if (WARN_ON(!cl || !cl->dev)) return POLLERR; dev = cl->dev; mutex_lock(&dev->device_lock); notify_en = cl->notify_en && (req_events & POLLPRI); if (dev->dev_state != MEI_DEV_ENABLED || !mei_cl_is_connected(cl)) { mask = POLLERR; goto out; } if (notify_en) { poll_wait(file, &cl->ev_wait, wait); if (cl->notify_ev) mask |= POLLPRI; } if (cl == &dev->iamthif_cl) { mask |= mei_amthif_poll(file, wait); goto out; } if (req_events & (POLLIN | POLLRDNORM)) { poll_wait(file, &cl->rx_wait, wait); if (!list_empty(&cl->rd_completed)) mask |= POLLIN | POLLRDNORM; else mei_cl_read_start(cl, mei_cl_mtu(cl), file); } out: mutex_unlock(&dev->device_lock); return mask; }
/** * mei_poll - the poll function * * @file: pointer to file structure * @wait: pointer to poll_table structure * * returns poll mask */ static unsigned int mei_poll(struct file *file, poll_table *wait) { struct mei_cl *cl = file->private_data; struct mei_device *dev; unsigned int mask = 0; if (WARN_ON(!cl || !cl->dev)) return POLLERR; dev = cl->dev; mutex_lock(&dev->device_lock); if (!mei_cl_is_connected(cl)) { mask = POLLERR; goto out; } mutex_unlock(&dev->device_lock); if (cl == &dev->iamthif_cl) return mei_amthif_poll(dev, file, wait); poll_wait(file, &cl->tx_wait, wait); mutex_lock(&dev->device_lock); if (!mei_cl_is_connected(cl)) { mask = POLLERR; goto out; } mask |= (POLLIN | POLLRDNORM); out: mutex_unlock(&dev->device_lock); return mask; }