arm-omap: don't abuse rq->data
omap mailbox uses rq->data as the second opaque pointer to carry mbox_msg_t and rq->special message argument which is needed only for tx. Add and use omap_msg_tx_data struct for tx and use rq->special for mbox_msg_t for rx such that only rq->special is used as opaque pointer. [ Impact: cleanup rq->data usage, extra kmalloc in msg_send ] Signed-off-by: Tejun Heo <tj@kernel.org> Cc: Russell King <rmk@arm.linux.org.uk>
This commit is contained in:
Родитель
f06d9a2b52
Коммит
ec24751a6b
|
@ -147,24 +147,40 @@ static int __mbox_msg_send(struct omap_mbox *mbox, mbox_msg_t msg, void *arg)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct omap_msg_tx_data {
|
||||||
|
mbox_msg_t msg;
|
||||||
|
void *arg;
|
||||||
|
};
|
||||||
|
|
||||||
|
static void omap_msg_tx_end_io(struct request *rq, int error)
|
||||||
|
{
|
||||||
|
kfree(rq->special);
|
||||||
|
__blk_put_request(rq->q, rq);
|
||||||
|
}
|
||||||
|
|
||||||
int omap_mbox_msg_send(struct omap_mbox *mbox, mbox_msg_t msg, void* arg)
|
int omap_mbox_msg_send(struct omap_mbox *mbox, mbox_msg_t msg, void* arg)
|
||||||
{
|
{
|
||||||
|
struct omap_msg_tx_data *tx_data;
|
||||||
struct request *rq;
|
struct request *rq;
|
||||||
struct request_queue *q = mbox->txq->queue;
|
struct request_queue *q = mbox->txq->queue;
|
||||||
int ret = 0;
|
|
||||||
|
tx_data = kmalloc(sizeof(*tx_data), GFP_ATOMIC);
|
||||||
|
if (unlikely(!tx_data))
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
rq = blk_get_request(q, WRITE, GFP_ATOMIC);
|
rq = blk_get_request(q, WRITE, GFP_ATOMIC);
|
||||||
if (unlikely(!rq)) {
|
if (unlikely(!rq)) {
|
||||||
ret = -ENOMEM;
|
kfree(tx_data);
|
||||||
goto fail;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
rq->data = (void *)msg;
|
tx_data->msg = msg;
|
||||||
blk_insert_request(q, rq, 0, arg);
|
tx_data->arg = arg;
|
||||||
|
rq->end_io = omap_msg_tx_end_io;
|
||||||
|
blk_insert_request(q, rq, 0, tx_data);
|
||||||
|
|
||||||
schedule_work(&mbox->txq->work);
|
schedule_work(&mbox->txq->work);
|
||||||
fail:
|
return 0;
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(omap_mbox_msg_send);
|
EXPORT_SYMBOL(omap_mbox_msg_send);
|
||||||
|
|
||||||
|
@ -178,6 +194,8 @@ static void mbox_tx_work(struct work_struct *work)
|
||||||
struct request_queue *q = mbox->txq->queue;
|
struct request_queue *q = mbox->txq->queue;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
|
struct omap_msg_tx_data *tx_data;
|
||||||
|
|
||||||
spin_lock(q->queue_lock);
|
spin_lock(q->queue_lock);
|
||||||
rq = elv_next_request(q);
|
rq = elv_next_request(q);
|
||||||
spin_unlock(q->queue_lock);
|
spin_unlock(q->queue_lock);
|
||||||
|
@ -185,7 +203,9 @@ static void mbox_tx_work(struct work_struct *work)
|
||||||
if (!rq)
|
if (!rq)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
ret = __mbox_msg_send(mbox, (mbox_msg_t) rq->data, rq->special);
|
tx_data = rq->special;
|
||||||
|
|
||||||
|
ret = __mbox_msg_send(mbox, tx_data->msg, tx_data->arg);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
enable_mbox_irq(mbox, IRQ_TX);
|
enable_mbox_irq(mbox, IRQ_TX);
|
||||||
return;
|
return;
|
||||||
|
@ -222,7 +242,7 @@ static void mbox_rx_work(struct work_struct *work)
|
||||||
if (!rq)
|
if (!rq)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
msg = (mbox_msg_t) rq->data;
|
msg = (mbox_msg_t)rq->special;
|
||||||
blk_end_request_all(rq, 0);
|
blk_end_request_all(rq, 0);
|
||||||
mbox->rxq->callback((void *)msg);
|
mbox->rxq->callback((void *)msg);
|
||||||
}
|
}
|
||||||
|
@ -260,7 +280,6 @@ static void __mbox_rx_interrupt(struct omap_mbox *mbox)
|
||||||
goto nomem;
|
goto nomem;
|
||||||
|
|
||||||
msg = mbox_fifo_read(mbox);
|
msg = mbox_fifo_read(mbox);
|
||||||
rq->data = (void *)msg;
|
|
||||||
|
|
||||||
if (unlikely(mbox_seq_test(mbox, msg))) {
|
if (unlikely(mbox_seq_test(mbox, msg))) {
|
||||||
pr_info("mbox: Illegal seq bit!(%08x)\n", msg);
|
pr_info("mbox: Illegal seq bit!(%08x)\n", msg);
|
||||||
|
@ -268,7 +287,7 @@ static void __mbox_rx_interrupt(struct omap_mbox *mbox)
|
||||||
mbox->err_notify();
|
mbox->err_notify();
|
||||||
}
|
}
|
||||||
|
|
||||||
blk_insert_request(q, rq, 0, NULL);
|
blk_insert_request(q, rq, 0, (void *)msg);
|
||||||
if (mbox->ops->type == OMAP_MBOX_TYPE1)
|
if (mbox->ops->type == OMAP_MBOX_TYPE1)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -331,7 +350,7 @@ omap_mbox_read(struct device *dev, struct device_attribute *attr, char *buf)
|
||||||
if (!rq)
|
if (!rq)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
*p = (mbox_msg_t) rq->data;
|
*p = (mbox_msg_t)rq->special;
|
||||||
|
|
||||||
blk_end_request_all(rq, 0);
|
blk_end_request_all(rq, 0);
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче