Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/char/pl050/pl050.c

    rd51838f rdd8ab1c  
    3535#include <stdio.h>
    3636#include <errno.h>
     37#include <str_error.h>
    3738#include <ddf/driver.h>
    3839#include <ddf/interrupt.h>
     
    5455static int pl050_fun_offline(ddf_fun_t *);
    5556static void pl050_char_conn(ipc_callid_t, ipc_call_t *, void *);
    56 static int pl050_read(chardev_srv_t *, void *, size_t);
    57 static int pl050_write(chardev_srv_t *, const void *, size_t);
     57static int pl050_read(chardev_srv_t *, void *, size_t, size_t *);
     58static int pl050_write(chardev_srv_t *, const void *, size_t, size_t *);
    5859
    5960static driver_ops_t driver_ops = {
     
    137138}
    138139
    139 static void pl050_interrupt(ipc_callid_t iid, ipc_call_t *call, ddf_dev_t *dev)
     140static void pl050_interrupt(ipc_call_t *call, ddf_dev_t *dev)
    140141{
    141142        pl050_t *pl050 = (pl050_t *)ddf_dev_data_get(dev);
     
    212213        pl050->regs = regs;
    213214
    214         const int irq_cap = register_interrupt_handler(pl050->dev,
    215             res.irqs.irqs[0], pl050_interrupt, &pl050_irq_code);
    216         if (irq_cap < 0) {
    217                 rc = irq_cap;
    218                 ddf_msg(LVL_ERROR, "Failed registering interrupt handler. (%d)",
    219                     rc);
     215        int irq_cap;
     216        rc = register_interrupt_handler(pl050->dev,
     217            res.irqs.irqs[0], pl050_interrupt, &pl050_irq_code, &irq_cap);
     218        if (rc != EOK) {
     219                ddf_msg(LVL_ERROR, "Failed registering interrupt handler. (%s)",
     220                    str_error_name(rc));
    220221                goto error;
    221222        }
     
    223224        rc = hw_res_enable_interrupt(pl050->parent_sess, res.irqs.irqs[0]);
    224225        if (rc != EOK) {
    225                 ddf_msg(LVL_ERROR, "Failed enabling interrupt. (%d)", rc);
     226                ddf_msg(LVL_ERROR, "Failed enabling interrupt: %s", str_error(rc));
    226227                goto error;
    227228        }
     
    236237}
    237238
    238 static int pl050_read(chardev_srv_t *srv, void *buffer, size_t size)
     239static int pl050_read(chardev_srv_t *srv, void *buffer, size_t size,
     240    size_t *nread)
    239241{
    240242        pl050_t *pl050 = (pl050_t *)srv->srvs->sarg;
     
    246248        left = size;
    247249        while (left > 0) {
    248                 while (pl050->buf_rp == pl050->buf_wp)
     250                while (left == size && pl050->buf_rp == pl050->buf_wp)
    249251                        fibril_condvar_wait(&pl050->buf_cv, &pl050->buf_lock);
     252                if (pl050->buf_rp == pl050->buf_wp)
     253                        break;
    250254                *bp++ = pl050->buffer[pl050->buf_rp];
    251255                --left;
     
    255259        fibril_mutex_unlock(&pl050->buf_lock);
    256260
    257         return size;
    258 }
    259 
    260 static int pl050_write(chardev_srv_t *srv, const void *data, size_t size)
     261        *nread = size - left;
     262        return EOK;
     263}
     264
     265static int pl050_write(chardev_srv_t *srv, const void *data, size_t size,
     266    size_t *nwritten)
    261267{
    262268        pl050_t *pl050 = (pl050_t *)srv->srvs->sarg;
     
    276282        ddf_msg(LVL_NOTE, "%s/pl050_write() success", pl050->name);
    277283
    278         return size;
     284        *nwritten = size;
     285        return EOK;
    279286}
    280287
     
    343350        rc = ddf_fun_bind(fun_a);
    344351        if (rc != EOK) {
    345                 ddf_msg(LVL_ERROR, "Failed binding function 'a'. (%d)", rc);
     352                ddf_msg(LVL_ERROR, "Failed binding function 'a': %s", str_error(rc));
    346353                ddf_fun_destroy(fun_a);
    347354                goto error;
Note: See TracChangeset for help on using the changeset viewer.