Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/ipc/irq.c

    r1d432f9 r8add9ca5  
    4242 *
    4343 * The structure of a notification message is as follows:
    44  * - METHOD: method as registered by the SYS_IPC_REGISTER_IRQ syscall
     44 * - IMETHOD: interface and method as registered by the SYS_REGISTER_IRQ
     45 *            syscall
    4546 * - ARG1: payload modified by a 'top-half' handler
    4647 * - ARG2: payload modified by a 'top-half' handler
     
    4950 * - ARG5: payload modified by a 'top-half' handler
    5051 * - in_phone_hash: interrupt counter (may be needed to assure correct order
    51  *         in multithreaded drivers)
     52 *                  in multithreaded drivers)
    5253 *
    5354 * Note on synchronization for ipc_irq_register(), ipc_irq_unregister(),
     
    130131/** Register an answerbox as a receiving end for IRQ notifications.
    131132 *
    132  * @param box    Receiving answerbox.
    133  * @param inr    IRQ number.
    134  * @param devno  Device number.
    135  * @param method Method to be associated with the notification.
    136  * @param ucode  Uspace pointer to top-half pseudocode.
    137  *
    138  * @return EBADMEM, ENOENT or EEXISTS on failure or 0 on success.
     133 * @param box           Receiving answerbox.
     134 * @param inr           IRQ number.
     135 * @param devno         Device number.
     136 * @param imethod       Interface and method to be associated with the
     137 *                      notification.
     138 * @param ucode         Uspace pointer to top-half pseudocode.
     139 * @return              EOK on success or a negative error code.
    139140 *
    140141 */
    141142int ipc_irq_register(answerbox_t *box, inr_t inr, devno_t devno,
    142     unative_t method, irq_code_t *ucode)
    143 {
    144         unative_t key[] = {
    145                 (unative_t) inr,
    146                 (unative_t) devno
     143    sysarg_t imethod, irq_code_t *ucode)
     144{
     145        sysarg_t key[] = {
     146                (sysarg_t) inr,
     147                (sysarg_t) devno
    147148        };
     149
     150        if ((inr < 0) || (inr > last_inr))
     151                return ELIMIT;
    148152       
    149153        irq_code_t *code;
     
    167171        irq->notif_cfg.notify = true;
    168172        irq->notif_cfg.answerbox = box;
    169         irq->notif_cfg.method = method;
     173        irq->notif_cfg.imethod = imethod;
    170174        irq->notif_cfg.code = code;
    171175        irq->notif_cfg.counter = 0;
     
    206210/** Unregister task from IRQ notification.
    207211 *
    208  * @param box   Answerbox associated with the notification.
    209  * @param inr   IRQ number.
    210  * @param devno Device number.
    211  *
     212 * @param box           Answerbox associated with the notification.
     213 * @param inr           IRQ number.
     214 * @param devno         Device number.
     215 * @return              EOK on success or a negative error code.
    212216 */
    213217int ipc_irq_unregister(answerbox_t *box, inr_t inr, devno_t devno)
    214218{
    215         unative_t key[] = {
    216                 (unative_t) inr,
    217                 (unative_t) devno
     219        sysarg_t key[] = {
     220                (sysarg_t) inr,
     221                (sysarg_t) devno
    218222        };
     223
     224        if ((inr < 0) || (inr > last_inr))
     225                return ELIMIT;
    219226       
    220227        irq_spinlock_lock(&irq_uspace_hash_table_lock, true);
     
    290297                }
    291298               
    292                 unative_t key[2];
     299                sysarg_t key[2];
    293300                key[0] = irq->inr;
    294301                key[1] = irq->devno;
     
    397404                            (uint32_t) code->cmds[i].value);
    398405                        break;
     406                case CMD_PIO_WRITE_A_8:
     407                        if (srcarg) {
     408                                pio_write_8((ioport8_t *) code->cmds[i].addr,
     409                                    (uint8_t) scratch[srcarg]);
     410                        }
     411                        break;
     412                case CMD_PIO_WRITE_A_16:
     413                        if (srcarg) {
     414                                pio_write_16((ioport16_t *) code->cmds[i].addr,
     415                                    (uint16_t) scratch[srcarg]);
     416                        }
     417                        break;
     418                case CMD_PIO_WRITE_A_32:
     419                        if (srcarg) {
     420                                pio_write_32((ioport32_t *) code->cmds[i].addr,
     421                                    (uint32_t) scratch[srcarg]);
     422                        }
     423                        break;
    399424                case CMD_BTEST:
    400425                        if ((srcarg) && (dstarg)) {
     
    444469               
    445470                /* Set up args */
    446                 IPC_SET_METHOD(call->data, irq->notif_cfg.method);
     471                IPC_SET_IMETHOD(call->data, irq->notif_cfg.imethod);
    447472                IPC_SET_ARG1(call->data, irq->notif_cfg.scratch[1]);
    448473                IPC_SET_ARG2(call->data, irq->notif_cfg.scratch[2]);
     
    465490 *
    466491 */
    467 void ipc_irq_send_msg(irq_t *irq, unative_t a1, unative_t a2, unative_t a3,
    468     unative_t a4, unative_t a5)
     492void ipc_irq_send_msg(irq_t *irq, sysarg_t a1, sysarg_t a2, sysarg_t a3,
     493    sysarg_t a4, sysarg_t a5)
    469494{
    470495        irq_spinlock_lock(&irq->lock, true);
     
    481506                call->priv = ++irq->notif_cfg.counter;
    482507               
    483                 IPC_SET_METHOD(call->data, irq->notif_cfg.method);
     508                IPC_SET_IMETHOD(call->data, irq->notif_cfg.imethod);
    484509                IPC_SET_ARG1(call->data, a1);
    485510                IPC_SET_ARG2(call->data, a2);
Note: See TracChangeset for help on using the changeset viewer.