Пример #1
0
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);
    }
}
Пример #2
0
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);
	}
}