Changeset 4874c2d in mainline


Ignore:
Timestamp:
2006-10-17T20:32:35Z (18 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
b14e35f2
Parents:
8513ad7
Message:

Do not copy notification config out of the IRQ structure.
Add the notify member, that toggles notifications on and off instead.
This is good for preventing other tasks from registering the notification
while the notification config is stored outside the IRQ structure.
It should also help to implement the cleanup code.

Location:
kernel
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/ppc32/src/drivers/cuda.c

    r8513ad7 r4874c2d  
    6464static volatile uint8_t *cuda = NULL;
    6565static irq_t cuda_irq;          /**< Cuda's IRQ. */
    66 
    67 static ipc_notif_cfg_t saved_notif_cfg;
    68 
    6966
    7067static char lchars[0x80] = {
     
    255252static void cuda_irq_handler(irq_t *irq, void *arg, ...)
    256253{
    257         if (irq->notif_cfg.answerbox)
     254        if (irq->notif_cfg.notify && irq->notif_cfg.answerbox)
    258255                ipc_irq_send_notif(irq);
    259256        else {
     
    277274void cuda_grab(void)
    278275{
    279         if (cuda_irq.notif_cfg.answerbox) {
    280                 saved_notif_cfg = cuda_irq.notif_cfg;
    281                 cuda_irq.notif_cfg.answerbox = NULL;
    282                 cuda_irq.notif_cfg.code = NULL;
    283                 cuda_irq.notif_cfg.method = 0;
    284                 cuda_irq.notif_cfg.counter = 0;
    285         }
     276        cuda_irq.notif_cfg.notify = false;
    286277}
    287278
     
    290281void cuda_release(void)
    291282{
    292         if (saved_notif_cfg.answerbox)
    293                 cuda_irq.notif_cfg = saved_notif_cfg;
     283        if (cuda_irq.notif_cfg.answerbox)
     284                cuda_irq.notif_cfg.notify = true;
    294285}
    295286
  • kernel/genarch/src/kbd/ns16550.c

    r8513ad7 r4874c2d  
    6262static irq_t ns16550_irq;
    6363
    64 static ipc_notif_cfg_t saved_notif_cfg;
    65 
    6664/*
    6765 * These codes read from ns16550 data register are silently ignored.
     
    8886                (void) ns16550_rbr_read(&ns16550);
    8987
    90         if (ns16550_irq.notif_cfg.answerbox) {
    91                 saved_notif_cfg = ns16550_irq.notif_cfg;
    92                 ns16550_irq.notif_cfg.answerbox = NULL;
    93                 ns16550_irq.notif_cfg.code = NULL;
    94                 ns16550_irq.notif_cfg.method = 0;
    95                 ns16550_irq.notif_cfg.counter = 0;
    96         }
     88        ns16550_irq.notif_cfg.notify = false;
    9789}
    9890
     
    10092void ns16550_release(void)
    10193{
    102         if (saved_notif_cfg.answerbox)
    103                 ns16550_irq.notif_cfg = saved_notif_cfg;
     94        if (ns16550_irq.notif_cfg.answerbox)
     95                ns16550_irq.notif_cfg.notify = true;
    10496}
    10597
     
    184176
    185177        if (ns16550_lsr_read(&ns16550) & LSR_DATA_READY) {
    186                 if (ns16550_irq.notif_cfg.answerbox) {
     178                if (ns16550_irq.notif_cfg.notify && ns16550_irq.notif_cfg.answerbox) {
    187179                        /*
    188180                         * Send IPC notification.
  • kernel/genarch/src/kbd/z8530.c

    r8513ad7 r4874c2d  
    6363static irq_t z8530_irq;         /**< z8530's IRQ. */
    6464
    65 static ipc_notif_cfg_t saved_notif_cfg;
    66 
    6765static void z8530_suspend(chardev_t *);
    6866static void z8530_resume(chardev_t *);
     
    9290        z8530_write_a(&z8530, WR9, WR9_MIE);            /* Master Interrupt Enable. */
    9391       
    94         if (z8530_irq.notif_cfg.answerbox) {
    95                 saved_notif_cfg = z8530_irq.notif_cfg;
    96                 z8530_irq.notif_cfg.answerbox = NULL;
    97                 z8530_irq.notif_cfg.code = NULL;
    98                 z8530_irq.notif_cfg.method = 0;
    99                 z8530_irq.notif_cfg.counter = 0;
    100         }
     92        z8530_irq.notif_cfg.notify = false;
    10193}
    10294
     
    10496void z8530_release(void)
    10597{
    106         if (saved_notif_cfg.answerbox)
    107                 z8530_irq.notif_cfg = saved_notif_cfg;
     98        if (z8530_irq.notif_cfg.answerbox)
     99                z8530_irq.notif_cfg.notify = true;
    108100}
    109101
     
    205197         * interrupt traps. Process the interrupt directly.
    206198         */
    207         if (irq->notif_cfg.answerbox)
     199        if (irq->notif_cfg.notify && irq->notif_cfg.answerbox)
    208200                ipc_irq_send_notif(irq);
    209201        else
  • kernel/generic/include/ipc/irq.h

    r8513ad7 r4874c2d  
    7979 */
    8080struct ipc_notif_cfg {
     81        bool notify;                    /**< When false, notifications are not sent. */
    8182        answerbox_t *answerbox;         /**< Answerbox for notifications. */
    8283        unative_t method;               /**< Method to be used for the notification. */
  • kernel/generic/src/ipc/irq.c

    r8513ad7 r4874c2d  
    177177        if (irq) {
    178178                if (irq->notif_cfg.answerbox == box) {
    179                         code_free(irq->notif_cfg.code);
     179                        irq->notif_cfg.notify = false;
     180                        irq->notif_cfg.answerbox = NULL;
    180181                        irq->notif_cfg.code = NULL;
    181                         irq->notif_cfg.answerbox = NULL;
    182182                        irq->notif_cfg.method = 0;
    183183                        irq->notif_cfg.counter = 0;
     184                        code_free(irq->notif_cfg.code);
    184185                        spinlock_unlock(&irq->lock);
    185186                }
     
    227228        }
    228229       
     230        irq->notif_cfg.notify = true;
    229231        irq->notif_cfg.answerbox = box;
    230232        irq->notif_cfg.method = method;
Note: See TracChangeset for help on using the changeset viewer.