[APPLIED] [PATCH 10/10] omap mailbox: OMAP4 Mailbox-driver Patch to support tasklet implementation
This patch has been applied to the linux-omap by youw fwiendly patch wobot. Branch in linux-omap: for-next Initial commit ID (Likely to change): 02a9bc601402df9544f35820fbef72c1b096344c PatchWorks http://patchwork.kernel.org/patch/59793/ Git (Likely to change, and takes a while to get mirrored) http://git.kernel.org/?p=linux/kernel/git/tmlind/linux-omap-2.6.git;a=commit;h=02a9bc601402df9544f35820fbef72c1b096344c -- To unsubscribe from this list: send the line unsubscribe linux-omap in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 10/10] omap mailbox: OMAP4 Mailbox-driver Patch to support tasklet implementation
From 5fd7c2bfae11879edfcae7db073deb11bea1f584 Mon Sep 17 00:00:00 2001 From: C A Subramaniam subramaniam...@ti.com Date: Fri, 13 Nov 2009 15:59:58 +0530 Subject: [PATCH 10/10] omap mailbox: OMAP4 Mailbox-driver Patch to support tasklet implementation This patch uses a tasklet implementation for sending mailbox messages. Signed-off-by: C A Subramaniam subramaniam...@ti.com Signed-off-by: Ramesh Gupta G grgu...@ti.com Signed-off-by: Hiroshi DOYU hiroshi.d...@nokia.com --- arch/arm/plat-omap/include/plat/mailbox.h |8 +++- arch/arm/plat-omap/mailbox.c | 59 2 files changed, 23 insertions(+), 44 deletions(-) diff --git a/arch/arm/plat-omap/include/plat/mailbox.h b/arch/arm/plat-omap/include/plat/mailbox.h index bf06953..729166b 100644 --- a/arch/arm/plat-omap/include/plat/mailbox.h +++ b/arch/arm/plat-omap/include/plat/mailbox.h @@ -6,6 +6,7 @@ #include linux/wait.h #include linux/workqueue.h #include linux/blkdev.h +#include linux/interrupt.h typedef u32 mbox_msg_t; struct omap_mbox; @@ -28,8 +29,10 @@ struct omap_mbox_ops { int (*fifo_empty)(struct omap_mbox *mbox); int (*fifo_full)(struct omap_mbox *mbox); /* irq */ - void(*enable_irq)(struct omap_mbox *mbox, omap_mbox_irq_t irq); - void(*disable_irq)(struct omap_mbox *mbox, omap_mbox_irq_t irq); + void(*enable_irq)(struct omap_mbox *mbox, + omap_mbox_irq_t irq); + void(*disable_irq)(struct omap_mbox *mbox, + omap_mbox_irq_t irq); void(*ack_irq)(struct omap_mbox *mbox, omap_mbox_irq_t irq); int (*is_irq)(struct omap_mbox *mbox, omap_mbox_irq_t irq); /* ctx */ @@ -41,6 +44,7 @@ struct omap_mbox_queue { spinlock_t lock; struct request_queue*queue; struct work_struct work; + struct tasklet_struct tasklet; int (*callback)(void *); struct omap_mbox*mbox; }; diff --git a/arch/arm/plat-omap/mailbox.c b/arch/arm/plat-omap/mailbox.c index 4d7947e..8e90633 100644 --- a/arch/arm/plat-omap/mailbox.c +++ b/arch/arm/plat-omap/mailbox.c @@ -80,74 +80,45 @@ static int __mbox_msg_send(struct omap_mbox *mbox, mbox_msg_t msg) return ret; } -struct omap_msg_tx_data { - mbox_msg_t msg; -}; - -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) { - struct omap_msg_tx_data *tx_data; + struct request *rq; struct request_queue *q = mbox-txq-queue; - tx_data = kmalloc(sizeof(*tx_data), GFP_ATOMIC); - if (unlikely(!tx_data)) - return -ENOMEM; - rq = blk_get_request(q, WRITE, GFP_ATOMIC); - if (unlikely(!rq)) { - kfree(tx_data); + if (unlikely(!rq)) return -ENOMEM; - } - tx_data-msg = msg; - rq-end_io = omap_msg_tx_end_io; - blk_insert_request(q, rq, 0, tx_data); + blk_insert_request(q, rq, 0, (void *) msg); + tasklet_schedule(mbox-txq-tasklet); - schedule_work(mbox-txq-work); return 0; } EXPORT_SYMBOL(omap_mbox_msg_send); -static void mbox_tx_work(struct work_struct *work) +static void mbox_tx_tasklet(unsigned long tx_data) { 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 omap_mbox *mbox = (struct omap_mbox *)tx_data; struct request_queue *q = mbox-txq-queue; while (1) { - struct omap_msg_tx_data *tx_data; - spin_lock(q-queue_lock); rq = blk_fetch_request(q); - spin_unlock(q-queue_lock); if (!rq) break; - tx_data = rq-special; - - ret = __mbox_msg_send(mbox, tx_data-msg); + ret = __mbox_msg_send(mbox, (mbox_msg_t)rq-special); if (ret) { omap_mbox_enable_irq(mbox, IRQ_TX); - spin_lock(q-queue_lock); blk_requeue_request(q, rq); - spin_unlock(q-queue_lock); return; } - - spin_lock(q-queue_lock); - __blk_end_request_all(rq, 0); - spin_unlock(q-queue_lock); + blk_end_request_all(rq, 0); } } @@ -192,7 +163,7 @@ static void __mbox_tx_interrupt(struct omap_mbox *mbox) { omap_mbox_disable_irq(mbox, IRQ_TX); ack_mbox_irq(mbox, IRQ_TX); - schedule_work(mbox-txq-work); + tasklet_schedule(mbox
RE: [PATCH 10/10] omap mailbox: OMAP4 Mailbox-driver Patch to support tasklet implementation
Hi Hiroshi, Sorry for the delayed response. -Original Message- From: Hiroshi DOYU [mailto:hiroshi.d...@nokia.com] Sent: Thursday, September 10, 2009 5:59 PM To: C.A, Subramaniam Cc: linux-omap@vger.kernel.org; t...@atomide.com; r...@arm.linux.org.uk; Kanigeri, Hari; Gupta, Ramesh Subject: Re: [PATCH 10/10] omap mailbox: OMAP4 Mailbox-driver Patch to support tasklet implementation From: ext C.A, Subramaniam subramaniam...@ti.com Subject: RE: [PATCH 10/10] omap mailbox: OMAP4 Mailbox-driver Patch to support tasklet implementation Date: Thu, 10 Sep 2009 13:46:53 +0200 Hi Hiroshi, -Original Message- From: Hiroshi DOYU [mailto:hiroshi.d...@nokia.com] Sent: Wednesday, September 09, 2009 2:32 PM To: C.A, Subramaniam Cc: linux-omap@vger.kernel.org; t...@atomide.com; r...@arm.linux.org.uk; Kanigeri, Hari; Gupta, Ramesh Subject: Re: [PATCH 10/10] omap mailbox: OMAP4 Mailbox-driver Patch to support tasklet implementation Hi Subbu, From: ext C.A, Subramaniam subramaniam...@ti.com Subject: RE: [PATCH 10/10] omap mailbox: OMAP4 Mailbox-driver Patch to support tasklet implementation Date: Tue, 8 Sep 2009 19:43:48 +0200 [...] As I described in the comment on [PATCH 8/10], I think that it would be better to keep mach-omap2/mailbox.c simple and to add some additional logic on plat-omap/mailbox.c. Would it be possbile to move this tasklet implementation to plat-omap/mailbox.c? The implementation of the tasklet itself is maintained in plat-omap/mailbox.c Since, I wanted to maintain a separate tasklet for each mailbox instance used to send messages from MPU, I had to associate the the tasklet to the mailbox. Hence, the changes were done in mach-omap2/mailbox.c Please give your comments on this approach. Wouldn't just converting work_queue to tasklet work like below? (I havne't tested this at all, though...) diff --git a/arch/arm/plat-omap/include/mach/mailbox.h b/arch/arm/plat-omap/include/mach/mailbox.h index b7a6991..1f4e53e 100644 --- a/arch/arm/plat-omap/include/mach/mailbox.h +++ b/arch/arm/plat-omap/include/mach/mailbox.h @@ -52,6 +52,8 @@ struct omap_mbox { struct omap_mbox_queue *txq, *rxq; + struct tasklet_struct tx_tasklet; + struct omap_mbox_ops*ops; mbox_msg_t seq_snd, seq_rcv; Moved the tasklet structure to the omap_mbox_queue as follows: This is better. @@ -40,7 +43,8 @@ struct omap_mbox_ops { struct omap_mbox_queue { spinlock_t lock; struct request_queue*queue; - struct work_struct work; + struct work_struct rx_work; + struct tasklet_struct tx_tasklet; int (*callback)(void *); struct omap_mbox*mbox; }; I think that rx_/tx_ prefix may not be necessary if you add tasklet feature in omap_mbox_queue as followed since omap_mbox_queue can be considered as s/w queue which can evoke workqueue/tasklet accordingly. + struct work_struct work; + struct tasklet_struct tasklet; int (*callback)(void *); struct omap_mbox*mbox; }; This is fine. Will remove rx_ and tx_ prefix. Also chagned the omap_mbox_msg_send(). Removed the struct omap_msg_tx_data. int omap_mbox_msg_send(struct omap_mbox *mbox, mbox_msg_t msg) { - struct omap_msg_tx_data *tx_data; + struct request *rq; struct request_queue *q = mbox-txq-queue; - tx_data = kmalloc(sizeof(*tx_data), GFP_ATOMIC); - if (unlikely(!tx_data)) - return -ENOMEM; - rq = blk_get_request(q, WRITE, GFP_ATOMIC); - if (unlikely(!rq)) { - kfree(tx_data); + if (unlikely(!rq)) return -ENOMEM; - } - tx_data-msg = msg; - rq-end_io = omap_msg_tx_end_io; - blk_insert_request(q, rq, 0, tx_data); + blk_insert_request(q, rq, 0, (void *) msg); + tasklet_schedule(mbox-txq-tx_tasklet); - schedule_work(mbox-txq-work); return 0; } EXPORT_SYMBOL(omap_mbox_msg_send); diff --git a/arch/arm/plat-omap/mailbox.c b/arch/arm/plat-omap/mailbox.c index 40424ed..37267ca 100644 --- a/arch/arm/plat-omap/mailbox.c +++ b/arch/arm/plat-omap/mailbox.c @@ -184,22 +184,17 @@ int omap_mbox_msg_send(struct omap_mbox *mbox, mbox_msg_t msg, void* arg) } EXPORT_SYMBOL(omap_mbox_msg_send); -static void mbox_tx_work(struct work_struct *work) +static void mbox_tx_tasklet(unsigned long data) { 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 omap_mbox *mbox = (struct omap_mbox *)data; struct request_queue *q = mbox-txq-queue
RE: [PATCH 10/10] omap mailbox: OMAP4 Mailbox-driver Patch to support tasklet implementation
Hi Hiroshi, -Original Message- From: Hiroshi DOYU [mailto:hiroshi.d...@nokia.com] Sent: Wednesday, September 09, 2009 2:32 PM To: C.A, Subramaniam Cc: linux-omap@vger.kernel.org; t...@atomide.com; r...@arm.linux.org.uk; Kanigeri, Hari; Gupta, Ramesh Subject: Re: [PATCH 10/10] omap mailbox: OMAP4 Mailbox-driver Patch to support tasklet implementation Hi Subbu, From: ext C.A, Subramaniam subramaniam...@ti.com Subject: RE: [PATCH 10/10] omap mailbox: OMAP4 Mailbox-driver Patch to support tasklet implementation Date: Tue, 8 Sep 2009 19:43:48 +0200 [...] As I described in the comment on [PATCH 8/10], I think that it would be better to keep mach-omap2/mailbox.c simple and to add some additional logic on plat-omap/mailbox.c. Would it be possbile to move this tasklet implementation to plat-omap/mailbox.c? The implementation of the tasklet itself is maintained in plat-omap/mailbox.c Since, I wanted to maintain a separate tasklet for each mailbox instance used to send messages from MPU, I had to associate the the tasklet to the mailbox. Hence, the changes were done in mach-omap2/mailbox.c Please give your comments on this approach. Wouldn't just converting work_queue to tasklet work like below? (I havne't tested this at all, though...) diff --git a/arch/arm/plat-omap/include/mach/mailbox.h b/arch/arm/plat-omap/include/mach/mailbox.h index b7a6991..1f4e53e 100644 --- a/arch/arm/plat-omap/include/mach/mailbox.h +++ b/arch/arm/plat-omap/include/mach/mailbox.h @@ -52,6 +52,8 @@ struct omap_mbox { struct omap_mbox_queue *txq, *rxq; + struct tasklet_struct tx_tasklet; + struct omap_mbox_ops*ops; mbox_msg_t seq_snd, seq_rcv; Moved the tasklet structure to the omap_mbox_queue as follows: @@ -40,7 +43,8 @@ struct omap_mbox_ops { struct omap_mbox_queue { spinlock_t lock; struct request_queue*queue; - struct work_struct work; + struct work_struct rx_work; + struct tasklet_struct tx_tasklet; int (*callback)(void *); struct omap_mbox*mbox; }; Also chagned the omap_mbox_msg_send(). Removed the struct omap_msg_tx_data. int omap_mbox_msg_send(struct omap_mbox *mbox, mbox_msg_t msg) { - struct omap_msg_tx_data *tx_data; + struct request *rq; struct request_queue *q = mbox-txq-queue; - tx_data = kmalloc(sizeof(*tx_data), GFP_ATOMIC); - if (unlikely(!tx_data)) - return -ENOMEM; - rq = blk_get_request(q, WRITE, GFP_ATOMIC); - if (unlikely(!rq)) { - kfree(tx_data); + if (unlikely(!rq)) return -ENOMEM; - } - tx_data-msg = msg; - rq-end_io = omap_msg_tx_end_io; - blk_insert_request(q, rq, 0, tx_data); + blk_insert_request(q, rq, 0, (void *) msg); + tasklet_schedule(mbox-txq-tx_tasklet); - schedule_work(mbox-txq-work); return 0; } EXPORT_SYMBOL(omap_mbox_msg_send); diff --git a/arch/arm/plat-omap/mailbox.c b/arch/arm/plat-omap/mailbox.c index 40424ed..37267ca 100644 --- a/arch/arm/plat-omap/mailbox.c +++ b/arch/arm/plat-omap/mailbox.c @@ -184,22 +184,17 @@ int omap_mbox_msg_send(struct omap_mbox *mbox, mbox_msg_t msg, void* arg) } EXPORT_SYMBOL(omap_mbox_msg_send); -static void mbox_tx_work(struct work_struct *work) +static void mbox_tx_tasklet(unsigned long data) { 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 omap_mbox *mbox = (struct omap_mbox *)data; struct request_queue *q = mbox-txq-queue; while (1) { struct omap_msg_tx_data *tx_data; - spin_lock(q-queue_lock); rq = blk_fetch_request(q); - spin_unlock(q-queue_lock); - if (!rq) break; @@ -208,15 +203,10 @@ static void mbox_tx_work(struct work_struct *work) ret = __mbox_msg_send(mbox, tx_data-msg, tx_data-arg); if (ret) { enable_mbox_irq(mbox, IRQ_TX); - spin_lock(q-queue_lock); blk_requeue_request(q, rq); - spin_unlock(q-queue_lock); return; } - - spin_lock(q-queue_lock); __blk_end_request_all(rq, 0); - spin_unlock(q-queue_lock); } } Changed the mbox_tx_tasklet as follows: -static void mbox_tx_work(struct work_struct *work) +static void mbox_tx_tasklet(unsigned long tx_data) { int ret; struct request *rq; - struct omap_mbox_queue *mq = container_of(work, - struct omap_mbox_queue, work); - struct
Re: [PATCH 10/10] omap mailbox: OMAP4 Mailbox-driver Patch to support tasklet implementation
From: ext C.A, Subramaniam subramaniam...@ti.com Subject: RE: [PATCH 10/10] omap mailbox: OMAP4 Mailbox-driver Patch to support tasklet implementation Date: Thu, 10 Sep 2009 13:46:53 +0200 Hi Hiroshi, -Original Message- From: Hiroshi DOYU [mailto:hiroshi.d...@nokia.com] Sent: Wednesday, September 09, 2009 2:32 PM To: C.A, Subramaniam Cc: linux-omap@vger.kernel.org; t...@atomide.com; r...@arm.linux.org.uk; Kanigeri, Hari; Gupta, Ramesh Subject: Re: [PATCH 10/10] omap mailbox: OMAP4 Mailbox-driver Patch to support tasklet implementation Hi Subbu, From: ext C.A, Subramaniam subramaniam...@ti.com Subject: RE: [PATCH 10/10] omap mailbox: OMAP4 Mailbox-driver Patch to support tasklet implementation Date: Tue, 8 Sep 2009 19:43:48 +0200 [...] As I described in the comment on [PATCH 8/10], I think that it would be better to keep mach-omap2/mailbox.c simple and to add some additional logic on plat-omap/mailbox.c. Would it be possbile to move this tasklet implementation to plat-omap/mailbox.c? The implementation of the tasklet itself is maintained in plat-omap/mailbox.c Since, I wanted to maintain a separate tasklet for each mailbox instance used to send messages from MPU, I had to associate the the tasklet to the mailbox. Hence, the changes were done in mach-omap2/mailbox.c Please give your comments on this approach. Wouldn't just converting work_queue to tasklet work like below? (I havne't tested this at all, though...) diff --git a/arch/arm/plat-omap/include/mach/mailbox.h b/arch/arm/plat-omap/include/mach/mailbox.h index b7a6991..1f4e53e 100644 --- a/arch/arm/plat-omap/include/mach/mailbox.h +++ b/arch/arm/plat-omap/include/mach/mailbox.h @@ -52,6 +52,8 @@ struct omap_mbox { struct omap_mbox_queue *txq, *rxq; + struct tasklet_struct tx_tasklet; + struct omap_mbox_ops*ops; mbox_msg_t seq_snd, seq_rcv; Moved the tasklet structure to the omap_mbox_queue as follows: This is better. @@ -40,7 +43,8 @@ struct omap_mbox_ops { struct omap_mbox_queue { spinlock_t lock; struct request_queue*queue; - struct work_struct work; + struct work_struct rx_work; + struct tasklet_struct tx_tasklet; int (*callback)(void *); struct omap_mbox*mbox; }; I think that rx_/tx_ prefix may not be necessary if you add tasklet feature in omap_mbox_queue as followed since omap_mbox_queue can be considered as s/w queue which can evoke workqueue/tasklet accordingly. + struct work_struct work; + struct tasklet_struct tasklet; int (*callback)(void *); struct omap_mbox*mbox; }; Also chagned the omap_mbox_msg_send(). Removed the struct omap_msg_tx_data. int omap_mbox_msg_send(struct omap_mbox *mbox, mbox_msg_t msg) { - struct omap_msg_tx_data *tx_data; + struct request *rq; struct request_queue *q = mbox-txq-queue; - tx_data = kmalloc(sizeof(*tx_data), GFP_ATOMIC); - if (unlikely(!tx_data)) - return -ENOMEM; - rq = blk_get_request(q, WRITE, GFP_ATOMIC); - if (unlikely(!rq)) { - kfree(tx_data); + if (unlikely(!rq)) return -ENOMEM; - } - tx_data-msg = msg; - rq-end_io = omap_msg_tx_end_io; - blk_insert_request(q, rq, 0, tx_data); + blk_insert_request(q, rq, 0, (void *) msg); + tasklet_schedule(mbox-txq-tx_tasklet); - schedule_work(mbox-txq-work); return 0; } EXPORT_SYMBOL(omap_mbox_msg_send); diff --git a/arch/arm/plat-omap/mailbox.c b/arch/arm/plat-omap/mailbox.c index 40424ed..37267ca 100644 --- a/arch/arm/plat-omap/mailbox.c +++ b/arch/arm/plat-omap/mailbox.c @@ -184,22 +184,17 @@ int omap_mbox_msg_send(struct omap_mbox *mbox, mbox_msg_t msg, void* arg) } EXPORT_SYMBOL(omap_mbox_msg_send); -static void mbox_tx_work(struct work_struct *work) +static void mbox_tx_tasklet(unsigned long data) { 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 omap_mbox *mbox = (struct omap_mbox *)data; struct request_queue *q = mbox-txq-queue; while (1) { struct omap_msg_tx_data *tx_data; - spin_lock(q-queue_lock); rq = blk_fetch_request(q); - spin_unlock(q-queue_lock); - if (!rq) break; @@ -208,15 +203,10 @@ static void mbox_tx_work(struct work_struct *work) ret = __mbox_msg_send(mbox, tx_data-msg, tx_data-arg); if (ret) { enable_mbox_irq(mbox, IRQ_TX); - spin_lock(q-queue_lock
RE: [PATCH 10/10] omap mailbox: OMAP4 Mailbox-driver Patch to support tasklet implementation
Hi Hiroshi, -Original Message- From: Hiroshi DOYU [mailto:hiroshi.d...@nokia.com] Sent: Wednesday, September 09, 2009 2:32 PM To: C.A, Subramaniam Cc: linux-omap@vger.kernel.org; t...@atomide.com; r...@arm.linux.org.uk; Kanigeri, Hari; Gupta, Ramesh Subject: Re: [PATCH 10/10] omap mailbox: OMAP4 Mailbox-driver Patch to support tasklet implementation Hi Subbu, From: ext C.A, Subramaniam subramaniam...@ti.com Subject: RE: [PATCH 10/10] omap mailbox: OMAP4 Mailbox-driver Patch to support tasklet implementation Date: Tue, 8 Sep 2009 19:43:48 +0200 [...] As I described in the comment on [PATCH 8/10], I think that it would be better to keep mach-omap2/mailbox.c simple and to add some additional logic on plat-omap/mailbox.c. Would it be possbile to move this tasklet implementation to plat-omap/mailbox.c? The implementation of the tasklet itself is maintained in plat-omap/mailbox.c Since, I wanted to maintain a separate tasklet for each mailbox instance used to send messages from MPU, I had to associate the the tasklet to the mailbox. Hence, the changes were done in mach-omap2/mailbox.c Please give your comments on this approach. Wouldn't just converting work_queue to tasklet work like below? (I havne't tested this at all, though...) I will try that out and let you know. Also your approach seems better as you are replacing the work queue implementaion as well. diff --git a/arch/arm/plat-omap/include/mach/mailbox.h b/arch/arm/plat-omap/include/mach/mailbox.h index b7a6991..1f4e53e 100644 --- a/arch/arm/plat-omap/include/mach/mailbox.h +++ b/arch/arm/plat-omap/include/mach/mailbox.h @@ -52,6 +52,8 @@ struct omap_mbox { struct omap_mbox_queue *txq, *rxq; + struct tasklet_struct tx_tasklet; + struct omap_mbox_ops*ops; mbox_msg_t seq_snd, seq_rcv; diff --git a/arch/arm/plat-omap/mailbox.c b/arch/arm/plat-omap/mailbox.c index 40424ed..37267ca 100644 --- a/arch/arm/plat-omap/mailbox.c +++ b/arch/arm/plat-omap/mailbox.c @@ -184,22 +184,17 @@ int omap_mbox_msg_send(struct omap_mbox *mbox, mbox_msg_t msg, void* arg) } EXPORT_SYMBOL(omap_mbox_msg_send); -static void mbox_tx_work(struct work_struct *work) +static void mbox_tx_tasklet(unsigned long data) { 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 omap_mbox *mbox = (struct omap_mbox *)data; struct request_queue *q = mbox-txq-queue; while (1) { struct omap_msg_tx_data *tx_data; - spin_lock(q-queue_lock); rq = blk_fetch_request(q); - spin_unlock(q-queue_lock); - if (!rq) break; @@ -208,15 +203,10 @@ static void mbox_tx_work(struct work_struct *work) ret = __mbox_msg_send(mbox, tx_data-msg, tx_data-arg); if (ret) { enable_mbox_irq(mbox, IRQ_TX); - spin_lock(q-queue_lock); blk_requeue_request(q, rq); - spin_unlock(q-queue_lock); return; } - - spin_lock(q-queue_lock); __blk_end_request_all(rq, 0); - spin_unlock(q-queue_lock); } } @@ -266,7 +256,7 @@ static void __mbox_tx_interrupt(struct omap_mbox *mbox) { disable_mbox_irq(mbox, IRQ_TX); ack_mbox_irq(mbox, IRQ_TX); - schedule_work(mbox-txq-work); + tasklet_schedule(mbox-tx_tasklet); } static void __mbox_rx_interrupt(struct omap_mbox *mbox) @@ -434,7 +424,9 @@ static int omap_mbox_init(struct omap_mbox *mbox) goto fail_request_irq; } - mq = mbox_queue_alloc(mbox, mbox_txq_fn, mbox_tx_work); + tasklet_init(mbox-tx_tasklet, mbox_tx_tasklet, (unsigned long)mbox); + + mq = mbox_queue_alloc(mbox, mbox_txq_fn, NULL); if (!mq) { ret = -ENOMEM; goto fail_alloc_txq; -- To unsubscribe from this list: send the line unsubscribe linux-omap in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
RE: [PATCH 10/10] omap mailbox: OMAP4 Mailbox-driver Patch to support tasklet implementation
Hi Hiroshi, -Original Message- From: Hiroshi DOYU [mailto:hiroshi.d...@nokia.com] Sent: Monday, September 07, 2009 2:20 PM To: C.A, Subramaniam Cc: linux-omap@vger.kernel.org; t...@atomide.com; r...@arm.linux.org.uk; Kanigeri, Hari; Gupta, Ramesh Subject: Re: [PATCH 10/10] omap mailbox: OMAP4 Mailbox-driver Patch to support tasklet implementation From: ext C.A, Subramaniam subramaniam...@ti.com Subject: [PATCH 10/10] omap mailbox: OMAP4 Mailbox-driver Patch to support tasklet implementation Date: Fri, 4 Sep 2009 13:48:45 +0200 From e759173e77f73fabce5177b4f685df20b16c6922 Mon Sep 17 00:00:00 2001 From: C A Subramaniam subramaniam...@ti.com Date: Thu, 3 Sep 2009 17:42:35 +0530 Subject: [PATCH 10/10] omap mailbox: OMAP4 Mailbox-driver Patch to support tasklet implementation This patch uses a tasklet implementation for sending mailbox messages. Signed-off-by: C A Subramaniam subramaniam...@ti.com Signed-off-by: Ramesh Gupta G grgu...@ti.com --- arch/arm/mach-omap2/mailbox.c | 43 ++- arch/arm/plat-omap/include/mach/mailbox.h | 16 +- arch/arm/plat-omap/mailbox.c | 80 ++--- 3 files changed, 81 insertions(+), 58 deletions(-) diff --git a/arch/arm/mach-omap2/mailbox.c b/arch/arm/mach-omap2/mailbox.c index 52a1670..45aea98 100644 --- a/arch/arm/mach-omap2/mailbox.c +++ b/arch/arm/mach-omap2/mailbox.c @@ -236,6 +237,17 @@ static struct omap_mbox_ops omap2_mbox_ops = { .restore_ctx= omap2_mbox_restore_ctx, }; + +static struct omap_mbox_task omap_mbox_1_tasklet = { + .arg= NULL, +}; + +static struct omap_mbox_task omap_mbox_2_tasklet = { + .arg= NULL, +}; As I described in the comment on [PATCH 8/10], I think that it would be better to keep mach-omap2/mailbox.c simple and to add some additional logic on plat-omap/mailbox.c. Would it be possbile to move this tasklet implementation to plat-omap/mailbox.c? The implementation of the tasklet itself is maintained in plat-omap/mailbox.c Since, I wanted to maintain a separate tasklet for each mailbox instance used to send messages from MPU, I had to associate the the tasklet to the mailbox. Hence, the changes were done in mach-omap2/mailbox.c Please give your comments on this approach. + + + /* * MAILBOX 0: ARM - DSP, * MAILBOX 1: ARM - DSP. @@ -272,6 +284,7 @@ struct omap_mbox mbox_1_info = { .name = mailbox-1, .ops= omap2_mbox_ops, .priv = omap2_mbox_1_priv, + .tx_tasklet = omap_mbox_1_tasklet, }; EXPORT_SYMBOL(mbox_1_info); #else @@ -305,8 +318,10 @@ struct omap_mbox mbox_2_info = { .name = mailbox-2, .ops= omap2_mbox_ops, .priv = omap2_mbox_2_priv, + .tx_tasklet = omap_mbox_2_tasklet, }; EXPORT_SYMBOL(mbox_2_info); + #endif diff --git a/arch/arm/plat-omap/include/mach/mailbox.h b/arch/arm/plat-omap/include/mach/mailbox.h index bf06953..5271345 100644 --- a/arch/arm/plat-omap/include/mach/mailbox.h +++ b/arch/arm/plat-omap/include/mach/mailbox.h @@ -28,8 +28,10 @@ struct omap_mbox_ops { int (*fifo_empty)(struct omap_mbox *mbox); int (*fifo_full)(struct omap_mbox *mbox); /* irq */ - void(*enable_irq)(struct omap_mbox *mbox, omap_mbox_irq_t irq); - void(*disable_irq)(struct omap_mbox *mbox, omap_mbox_irq_t irq); + void(*enable_irq)(struct omap_mbox *mbox, + omap_mbox_irq_t irq); + void(*disable_irq)(struct omap_mbox *mbox, + omap_mbox_irq_t irq); void(*ack_irq)(struct omap_mbox *mbox, omap_mbox_irq_t irq); int (*is_irq)(struct omap_mbox *mbox, omap_mbox_irq_t irq); /* ctx */ @@ -45,12 +47,22 @@ struct omap_mbox_queue { struct omap_mbox*mbox; }; +struct omap_mbox_task{ + spinlock_t lock; + struct tasklet_struct *t; + mbox_msg_t msg; + void*arg; +}; + + struct omap_mbox { char*name; unsigned intirq; struct omap_mbox_queue *txq, *rxq; + struct omap_mbox_task *tx_tasklet; + struct omap_mbox_ops*ops; mbox_msg_t seq_snd, seq_rcv; diff --git a/arch/arm/plat-omap/mailbox.c b/arch/arm/plat-omap/mailbox.c index 84cf6af..b5e53d4 100644 --- a/arch/arm/plat-omap/mailbox.c +++ b/arch/arm/plat-omap/mailbox.c @@ -63,60 +63,49 @@ static inline int is_mbox_irq(struct omap_mbox *mbox, omap_mbox_irq_t irq) /* * message sender */ -static int __mbox_msg_send(struct omap_mbox *mbox, mbox_msg_t msg) +static void __mbox_msg_send(unsigned long tx) { + struct omap_mbox_task *tx_data
Re: [PATCH 10/10] omap mailbox: OMAP4 Mailbox-driver Patch to support tasklet implementation
From: ext C.A, Subramaniam subramaniam...@ti.com Subject: [PATCH 10/10] omap mailbox: OMAP4 Mailbox-driver Patch to support tasklet implementation Date: Fri, 4 Sep 2009 13:48:45 +0200 From e759173e77f73fabce5177b4f685df20b16c6922 Mon Sep 17 00:00:00 2001 From: C A Subramaniam subramaniam...@ti.com Date: Thu, 3 Sep 2009 17:42:35 +0530 Subject: [PATCH 10/10] omap mailbox: OMAP4 Mailbox-driver Patch to support tasklet implementation This patch uses a tasklet implementation for sending mailbox messages. Signed-off-by: C A Subramaniam subramaniam...@ti.com Signed-off-by: Ramesh Gupta G grgu...@ti.com --- arch/arm/mach-omap2/mailbox.c | 43 ++- arch/arm/plat-omap/include/mach/mailbox.h | 16 +- arch/arm/plat-omap/mailbox.c | 80 ++--- 3 files changed, 81 insertions(+), 58 deletions(-) diff --git a/arch/arm/mach-omap2/mailbox.c b/arch/arm/mach-omap2/mailbox.c index 52a1670..45aea98 100644 --- a/arch/arm/mach-omap2/mailbox.c +++ b/arch/arm/mach-omap2/mailbox.c @@ -236,6 +237,17 @@ static struct omap_mbox_ops omap2_mbox_ops = { .restore_ctx= omap2_mbox_restore_ctx, }; + +static struct omap_mbox_task omap_mbox_1_tasklet = { + .arg= NULL, +}; + +static struct omap_mbox_task omap_mbox_2_tasklet = { + .arg= NULL, +}; As I described in the comment on [PATCH 8/10], I think that it would be better to keep mach-omap2/mailbox.c simple and to add some additional logic on plat-omap/mailbox.c. Would it be possbile to move this tasklet implementation to plat-omap/mailbox.c? + + + /* * MAILBOX 0: ARM - DSP, * MAILBOX 1: ARM - DSP. @@ -272,6 +284,7 @@ struct omap_mbox mbox_1_info = { .name = mailbox-1, .ops= omap2_mbox_ops, .priv = omap2_mbox_1_priv, + .tx_tasklet = omap_mbox_1_tasklet, }; EXPORT_SYMBOL(mbox_1_info); #else @@ -305,8 +318,10 @@ struct omap_mbox mbox_2_info = { .name = mailbox-2, .ops= omap2_mbox_ops, .priv = omap2_mbox_2_priv, + .tx_tasklet = omap_mbox_2_tasklet, }; EXPORT_SYMBOL(mbox_2_info); + #endif diff --git a/arch/arm/plat-omap/include/mach/mailbox.h b/arch/arm/plat-omap/include/mach/mailbox.h index bf06953..5271345 100644 --- a/arch/arm/plat-omap/include/mach/mailbox.h +++ b/arch/arm/plat-omap/include/mach/mailbox.h @@ -28,8 +28,10 @@ struct omap_mbox_ops { int (*fifo_empty)(struct omap_mbox *mbox); int (*fifo_full)(struct omap_mbox *mbox); /* irq */ - void(*enable_irq)(struct omap_mbox *mbox, omap_mbox_irq_t irq); - void(*disable_irq)(struct omap_mbox *mbox, omap_mbox_irq_t irq); + void(*enable_irq)(struct omap_mbox *mbox, + omap_mbox_irq_t irq); + void(*disable_irq)(struct omap_mbox *mbox, + omap_mbox_irq_t irq); void(*ack_irq)(struct omap_mbox *mbox, omap_mbox_irq_t irq); int (*is_irq)(struct omap_mbox *mbox, omap_mbox_irq_t irq); /* ctx */ @@ -45,12 +47,22 @@ struct omap_mbox_queue { struct omap_mbox*mbox; }; +struct omap_mbox_task{ + spinlock_t lock; + struct tasklet_struct *t; + mbox_msg_t msg; + void*arg; +}; + + struct omap_mbox { char*name; unsigned intirq; struct omap_mbox_queue *txq, *rxq; + struct omap_mbox_task *tx_tasklet; + struct omap_mbox_ops*ops; mbox_msg_t seq_snd, seq_rcv; diff --git a/arch/arm/plat-omap/mailbox.c b/arch/arm/plat-omap/mailbox.c index 84cf6af..b5e53d4 100644 --- a/arch/arm/plat-omap/mailbox.c +++ b/arch/arm/plat-omap/mailbox.c @@ -63,60 +63,49 @@ static inline int is_mbox_irq(struct omap_mbox *mbox, omap_mbox_irq_t irq) /* * message sender */ -static int __mbox_msg_send(struct omap_mbox *mbox, mbox_msg_t msg) +static void __mbox_msg_send(unsigned long tx) { + struct omap_mbox_task *tx_data = (struct omap_mbox_task *)tx; + struct omap_mbox *mbox = (struct omap_mbox *)tx_data-arg; + mbox_msg_t msg = tx_data-msg; int ret = 0, i = 1000; while (mbox_fifo_full(mbox)) { - if (mbox-ops-type == OMAP_MBOX_TYPE2) - return -1; - if (--i == 0) - return -1; + if (mbox-ops-type == OMAP_MBOX_TYPE2) { + printk(KERN_ERR Invalid mailbox type\n); + return ; + } + if (--i == 0) { + printk(KERN_ERR Time out writing to mailbox\n); + return ; + } udelay(1); } mbox_fifo_write(mbox, msg); - return ret; -} - -struct
[PATCH 10/10] omap mailbox: OMAP4 Mailbox-driver Patch to support tasklet implementation
From e759173e77f73fabce5177b4f685df20b16c6922 Mon Sep 17 00:00:00 2001 From: C A Subramaniam subramaniam...@ti.com Date: Thu, 3 Sep 2009 17:42:35 +0530 Subject: [PATCH 10/10] omap mailbox: OMAP4 Mailbox-driver Patch to support tasklet implementation This patch uses a tasklet implementation for sending mailbox messages. Signed-off-by: C A Subramaniam subramaniam...@ti.com Signed-off-by: Ramesh Gupta G grgu...@ti.com --- arch/arm/mach-omap2/mailbox.c | 43 ++- arch/arm/plat-omap/include/mach/mailbox.h | 16 +- arch/arm/plat-omap/mailbox.c | 80 ++--- 3 files changed, 81 insertions(+), 58 deletions(-) diff --git a/arch/arm/mach-omap2/mailbox.c b/arch/arm/mach-omap2/mailbox.c index 52a1670..45aea98 100644 --- a/arch/arm/mach-omap2/mailbox.c +++ b/arch/arm/mach-omap2/mailbox.c @@ -236,6 +237,17 @@ static struct omap_mbox_ops omap2_mbox_ops = { .restore_ctx= omap2_mbox_restore_ctx, }; + +static struct omap_mbox_task omap_mbox_1_tasklet = { + .arg= NULL, +}; + +static struct omap_mbox_task omap_mbox_2_tasklet = { + .arg= NULL, +}; + + + /* * MAILBOX 0: ARM - DSP, * MAILBOX 1: ARM - DSP. @@ -272,6 +284,7 @@ struct omap_mbox mbox_1_info = { .name = mailbox-1, .ops= omap2_mbox_ops, .priv = omap2_mbox_1_priv, + .tx_tasklet = omap_mbox_1_tasklet, }; EXPORT_SYMBOL(mbox_1_info); #else @@ -305,8 +318,10 @@ struct omap_mbox mbox_2_info = { .name = mailbox-2, .ops= omap2_mbox_ops, .priv = omap2_mbox_2_priv, + .tx_tasklet = omap_mbox_2_tasklet, }; EXPORT_SYMBOL(mbox_2_info); + #endif diff --git a/arch/arm/plat-omap/include/mach/mailbox.h b/arch/arm/plat-omap/include/mach/mailbox.h index bf06953..5271345 100644 --- a/arch/arm/plat-omap/include/mach/mailbox.h +++ b/arch/arm/plat-omap/include/mach/mailbox.h @@ -28,8 +28,10 @@ struct omap_mbox_ops { int (*fifo_empty)(struct omap_mbox *mbox); int (*fifo_full)(struct omap_mbox *mbox); /* irq */ - void(*enable_irq)(struct omap_mbox *mbox, omap_mbox_irq_t irq); - void(*disable_irq)(struct omap_mbox *mbox, omap_mbox_irq_t irq); + void(*enable_irq)(struct omap_mbox *mbox, + omap_mbox_irq_t irq); + void(*disable_irq)(struct omap_mbox *mbox, + omap_mbox_irq_t irq); void(*ack_irq)(struct omap_mbox *mbox, omap_mbox_irq_t irq); int (*is_irq)(struct omap_mbox *mbox, omap_mbox_irq_t irq); /* ctx */ @@ -45,12 +47,22 @@ struct omap_mbox_queue { struct omap_mbox*mbox; }; +struct omap_mbox_task{ + spinlock_t lock; + struct tasklet_struct *t; + mbox_msg_t msg; + void*arg; +}; + + struct omap_mbox { char*name; unsigned intirq; struct omap_mbox_queue *txq, *rxq; + struct omap_mbox_task *tx_tasklet; + struct omap_mbox_ops*ops; mbox_msg_t seq_snd, seq_rcv; diff --git a/arch/arm/plat-omap/mailbox.c b/arch/arm/plat-omap/mailbox.c index 84cf6af..b5e53d4 100644 --- a/arch/arm/plat-omap/mailbox.c +++ b/arch/arm/plat-omap/mailbox.c @@ -63,60 +63,49 @@ static inline int is_mbox_irq(struct omap_mbox *mbox, omap_mbox_irq_t irq) /* * message sender */ -static int __mbox_msg_send(struct omap_mbox *mbox, mbox_msg_t msg) +static void __mbox_msg_send(unsigned long tx) { + struct omap_mbox_task *tx_data = (struct omap_mbox_task *)tx; + struct omap_mbox *mbox = (struct omap_mbox *)tx_data-arg; + mbox_msg_t msg = tx_data-msg; int ret = 0, i = 1000; while (mbox_fifo_full(mbox)) { - if (mbox-ops-type == OMAP_MBOX_TYPE2) - return -1; - if (--i == 0) - return -1; + if (mbox-ops-type == OMAP_MBOX_TYPE2) { + printk(KERN_ERR Invalid mailbox type\n); + return ; + } + if (--i == 0) { + printk(KERN_ERR Time out writing to mailbox\n); + return ; + } udelay(1); } mbox_fifo_write(mbox, msg); - return ret; -} - -struct omap_msg_tx_data { - mbox_msg_t msg; - void*arg; -}; + tx_data-arg = NULL; + spin_unlock((mbox-tx_tasklet-lock)); -static void omap_msg_tx_end_io(struct request *rq, int error) -{ - kfree(rq-special); - __blk_put_request(rq-q, rq); + return; } + int omap_mbox_msg_send(struct omap_mbox *mbox, mbox_msg_t msg) { - struct omap_msg_tx_data *tx_data; - struct request *rq; - struct