static void mbox_tx_work(struct work_struct *work) { int ret; struct request *rq; struct omap_mbox_queue *mq = container_of(work, struct omap_mbox_queue, work); struct omap_mbox *mbox = mq->queue->queuedata; struct request_queue *q = mbox->txq->queue; while (1) { spin_lock(q->queue_lock); rq = elv_next_request(q); spin_unlock(q->queue_lock); if (!rq) break; ret = __mbox_msg_send(mbox, (mbox_msg_t) rq->data, rq->special); if (ret) { enable_mbox_irq(mbox, IRQ_TX); return; } spin_lock(q->queue_lock); if (__blk_end_request(rq, 0, 0)) BUG(); spin_unlock(q->queue_lock); } }
static void mbox_tx_tasklet(unsigned long tx_data) { int ret; struct request *rq; struct omap_mbox *mbox = (struct omap_mbox *)tx_data; struct request_queue *q = mbox->txq->queue; while (1) { rq = blk_fetch_request(q); if (!rq) break; ret = __mbox_msg_send(mbox, (mbox_msg_t)rq->special); if (ret) { omap_mbox_enable_irq(mbox, IRQ_TX); blk_requeue_request(q, rq); return; } blk_end_request_all(rq, 0); } }