static void __mbox_rx_interrupt(struct omap_mbox *mbox) { struct request *rq; mbox_msg_t msg; struct request_queue *q = mbox->rxq->queue; disable_mbox_irq(mbox, IRQ_RX); while (!mbox_fifo_empty(mbox)) { rq = blk_get_request(q, WRITE, GFP_ATOMIC); if (unlikely(!rq)) goto nomem; msg = mbox_fifo_read(mbox); rq->data = (void *)msg; if (unlikely(mbox_seq_test(mbox, msg))) { pr_info("mbox: Illegal seq bit!(%08x)\n", msg); if (mbox->err_notify) mbox->err_notify(); } blk_insert_request(q, rq, 0, NULL); if (mbox->ops->type == OMAP_MBOX_TYPE1) break; } /* no more messages in the fifo. clear IRQ source. */ ack_mbox_irq(mbox, IRQ_RX); enable_mbox_irq(mbox, IRQ_RX); nomem: schedule_work(&mbox->rxq->work); }
int omap_mbox_msg_send(struct omap_mbox *mbox, mbox_msg_t msg) { struct request *rq; struct request_queue *q = mbox->txq->queue; rq = blk_get_request(q, WRITE, GFP_ATOMIC); if (unlikely(!rq)) return -ENOMEM; blk_insert_request(q, rq, 0, (void *) msg); tasklet_schedule(&mbox->txq->tasklet); return 0; }
int omap_mbox_msg_send(struct omap_mbox *mbox, mbox_msg_t msg, void* arg) { struct request *rq; struct request_queue *q = mbox->txq->queue; int ret = 0; rq = blk_get_request(q, WRITE, GFP_ATOMIC); if (unlikely(!rq)) { ret = -ENOMEM; goto fail; } rq->data = (void *)msg; blk_insert_request(q, rq, 0, arg); schedule_work(&mbox->txq->work); fail: return ret; }
static void __mbox_rx_interrupt(struct omap_mbox *mbox) { struct request *rq; mbox_msg_t msg; struct request_queue *q = mbox->rxq->queue; while (!mbox_fifo_empty(mbox)) { rq = blk_get_request(q, WRITE, GFP_ATOMIC); if (unlikely(!rq)) goto nomem; msg = mbox_fifo_read(mbox); blk_insert_request(q, rq, 0, (void *)msg); if (mbox->ops->type == OMAP_MBOX_TYPE1) break; } /* no more messages in the fifo. clear IRQ source. */ ack_mbox_irq(mbox, IRQ_RX); nomem: schedule_work(&mbox->rxq->work); }