Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset 5d50c419 in mainline


Ignore:
Timestamp:
2017-11-19T21:14:19Z (4 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master
Children:
c657bd7
Parents:
75fcf9b
Message:

Chardev API should separate error code from number of bytes transferred. This is cleaner, allows the code to be more independent of Exxx sign and allows for partial success (some bytes successfully transferred and then an error occurred.)

Location:
uspace
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/hid/atkbd/atkbd.c

    r75fcf9b r5d50c419  
    203203{
    204204        at_kbd_t *kbd = arg;
     205        size_t nwr;
     206        int rc;
    205207       
    206208        while (true) {
    207209                uint8_t code = 0;
    208                 ssize_t size = chardev_read(kbd->chardev, &code, 1);
    209                 if (size != 1)
     210                rc = chardev_read(kbd->chardev, &code, 1, &nwr);
     211                if (rc != EOK)
    210212                        return EIO;
    211213               
     
    217219                        map_size = sizeof(scanmap_e0) / sizeof(unsigned int);
    218220                       
    219                         size = chardev_read(kbd->chardev, &code, 1);
    220                         if (size != 1)
     221                        rc = chardev_read(kbd->chardev, &code, 1, &nwr);
     222                        if (rc != EOK)
    221223                                return EIO;
    222224                } else if (code == KBD_SCANCODE_SET_EXTENDED_SPECIAL) {
    223                         size = chardev_read(kbd->chardev, &code, 1);
    224                         if (size != 1)
     225                        rc = chardev_read(kbd->chardev, &code, 1, &nwr);
     226                        if (rc != EOK)
    225227                                return EIO;
    226228                        if (code != 0x14)
    227229                                continue;
    228230
    229                         size = chardev_read(kbd->chardev, &code, 1);
    230                         if (size != 1)
     231                        rc = chardev_read(kbd->chardev, &code, 1, &nwr);
     232                        if (rc != EOK)
    231233                                return EIO;
    232234                        if (code != 0x77)
    233235                                continue;
    234236
    235                         size = chardev_read(kbd->chardev, &code, 1);
    236                         if (size != 1)
     237                        rc = chardev_read(kbd->chardev, &code, 1, &nwr);
     238                        if (rc != EOK)
    237239                                return EIO;
    238240                        if (code != 0xe1)
    239241                                continue;
    240242
    241                         size = chardev_read(kbd->chardev, &code, 1);
    242                         if (size != 1)
     243                        rc = chardev_read(kbd->chardev, &code, 1, &nwr);
     244                        if (rc != EOK)
    243245                                return EIO;
    244246                        if (code != 0xf0)
    245247                                continue;
    246248
    247                         size = chardev_read(kbd->chardev, &code, 1);
    248                         if (size != 1)
     249                        rc = chardev_read(kbd->chardev, &code, 1, &nwr);
     250                        if (rc != EOK)
    249251                                return EIO;
    250252                        if (code != 0x14)
    251253                                continue;
    252254
    253                         size = chardev_read(kbd->chardev, &code, 1);
    254                         if (size != 1)
     255                        rc = chardev_read(kbd->chardev, &code, 1, &nwr);
     256                        if (rc != EOK)
    255257                                return EIO;
    256258                        if (code != 0xf0)
    257259                                continue;
    258260
    259                         size = chardev_read(kbd->chardev, &code, 1);
    260                         if (size != 1)
     261                        rc = chardev_read(kbd->chardev, &code, 1, &nwr);
     262                        if (rc != EOK)
    261263                                return EIO;
    262264                        if (code == 0x77)
     
    272274                if (code == KBD_SCANCODE_KEY_RELEASE) {
    273275                        type = KEY_RELEASE;
    274                         size = chardev_read(kbd->chardev, &code, 1);
    275                         if (size != 1)
     276                        rc = chardev_read(kbd->chardev, &code, 1, &nwr);
     277                        if (rc != EOK)
    276278                                return EIO;
    277279                } else {
  • uspace/drv/hid/ps2mouse/ps2mouse.c

    r75fcf9b r5d50c419  
    7575        uint8_t value = (value_); \
    7676        uint8_t data = 0; \
    77         const ssize_t size = chardev_read((mouse)->chardev, &data, 1); \
    78         if (size != 1) { \
    79                 ddf_msg(LVL_ERROR, "Failed reading byte: %zd)", size);\
    80                 return size < 0 ? size : EIO; \
     77        size_t nread; \
     78        const int rc = chardev_read((mouse)->chardev, &data, 1, &nread); \
     79        if (rc != EOK) { \
     80                ddf_msg(LVL_ERROR, "Failed reading byte: %d", rc);\
     81                return rc; \
    8182        } \
    8283        if (data != value) { \
     
    9192        uint8_t value = (value_); \
    9293        uint8_t data = (value); \
    93         const ssize_t size = chardev_write((mouse)->chardev, &data, 1); \
    94         if (size < 0 ) { \
    95                 ddf_msg(LVL_ERROR, "Failed writing byte: %hhx", value); \
    96                 return size; \
     94        size_t nwr; \
     95        const int rc = chardev_write((mouse)->chardev, &data, 1, &nwr); \
     96        if (rc != EOK) { \
     97                ddf_msg(LVL_ERROR, "Failed writing byte: %d", rc); \
     98                return rc; \
    9799        } \
    98100} while (0)
     
    172174        /* Enable mouse data reporting. */
    173175        uint8_t report = PS2_MOUSE_ENABLE_DATA_REPORT;
    174         ssize_t size = chardev_write(mouse->chardev, &report, 1);
    175         if (size != 1) {
     176        size_t nwr;
     177        rc = chardev_write(mouse->chardev, &report, 1, &nwr);
     178        if (rc != EOK) {
    176179                ddf_msg(LVL_ERROR, "Failed to enable data reporting.");
    177180                rc = EIO;
     
    179182        }
    180183
    181         size = chardev_read(mouse->chardev, &report, 1);
    182         if (size != 1 || report != PS2_MOUSE_ACK) {
     184        size_t nread;
     185        rc = chardev_read(mouse->chardev, &report, 1, &nread);
     186        if (rc != EOK || report != PS2_MOUSE_ACK) {
    183187                ddf_msg(LVL_ERROR, "Failed to confirm data reporting: %hhx.",
    184188                    report);
     
    215219{
    216220        ps2_mouse_t *mouse = (ps2_mouse_t *) arg;
     221        size_t nread;
     222        int rc;
    217223
    218224        bool buttons[PS2_BUTTON_COUNT] = {};
    219225        while (1) {
    220226                uint8_t packet[PS2_BUFSIZE] = {};
    221                 const ssize_t size =
    222                     chardev_read(mouse->chardev, packet, PS2_BUFSIZE);
    223 
    224                 if (size != PS2_BUFSIZE) {
    225                         ddf_msg(LVL_WARN, "Incorrect packet size: %zd.", size);
     227                rc = chardev_read(mouse->chardev, packet, PS2_BUFSIZE, &nread);
     228                if (rc != EOK || nread != PS2_BUFSIZE) {
     229                        ddf_msg(LVL_WARN, "Incorrect packet size: %zd.", nread);
    226230                        continue;
    227231                }
     232
    228233                ddf_msg(LVL_DEBUG2, "Got packet: %hhx:%hhx:%hhx.",
    229234                    packet[0], packet[1], packet[2]);
     
    269274{
    270275        ps2_mouse_t *mouse = (ps2_mouse_t *) arg;
     276        size_t nread;
     277        int rc;
    271278
    272279        bool buttons[INTELLIMOUSE_BUTTON_COUNT] = {};
    273280        while (1) {
    274281                uint8_t packet[INTELLIMOUSE_BUFSIZE] = {};
    275                 const ssize_t size = chardev_read(
    276                     mouse->chardev, packet, INTELLIMOUSE_BUFSIZE);
    277 
    278                 if (size != INTELLIMOUSE_BUFSIZE) {
    279                         ddf_msg(LVL_WARN, "Incorrect packet size: %zd.", size);
     282                rc = chardev_read(mouse->chardev, packet, INTELLIMOUSE_BUFSIZE,
     283                    &nread);
     284                if (rc != EOK || nread != INTELLIMOUSE_BUFSIZE) {
     285                        ddf_msg(LVL_WARN, "Incorrect packet size: %zd.", nread);
    280286                        continue;
    281287                }
  • uspace/drv/hid/xtkbd/xtkbd.c

    r75fcf9b r5d50c419  
    208208{
    209209        xt_kbd_t *kbd = arg;
     210        size_t nread;
     211        int rc;
    210212       
    211213        while (true) {
     
    214216               
    215217                uint8_t code = 0;
    216                 ssize_t size = chardev_read(kbd->chardev, &code, 1);
    217                 if (size != 1)
     218                rc = chardev_read(kbd->chardev, &code, 1, &nread);
     219                if (rc != EOK)
    218220                        return EIO;
    219221               
     
    227229                        map_size = sizeof(scanmap_e0) / sizeof(unsigned int);
    228230                       
    229                         size = chardev_read(kbd->chardev, &code, 1);
    230                         if (size != 1)
     231                        rc = chardev_read(kbd->chardev, &code, 1, &nread);
     232                        if (rc != EOK)
    231233                                return EIO;
    232234                       
     
    234236                       
    235237                        if (code == 0x2a) {  /* Print Screen */
    236                                 size = chardev_read(kbd->chardev, &code, 1);
    237                                 if (size != 1)
     238                                rc = chardev_read(kbd->chardev, &code, 1, &nread);
     239                                if (rc != EOK)
    238240                                        return EIO;
    239241                               
     
    241243                                        continue;
    242244                               
    243                                 size = chardev_read(kbd->chardev, &code, 1);
    244                                 if (size != 1)
     245                                rc = chardev_read(kbd->chardev, &code, 1, &nread);
     246                                if (rc != EOK)
    245247                                        return EIO;
    246248                               
     
    252254                       
    253255                        if (code == 0x46) {  /* Break */
    254                                 size = chardev_read(kbd->chardev, &code, 1);
    255                                 if (size != 1)
     256                                rc = chardev_read(kbd->chardev, &code, 1, &nread);
     257                                if (rc != EOK)
    256258                                        return EIO;
    257259                               
     
    259261                                        continue;
    260262                               
    261                                 size = chardev_read(kbd->chardev, &code, 1);
    262                                 if (size != 1)
     263                                rc = chardev_read(kbd->chardev, &code, 1, &nread);
     264                                if (rc != EOK)
    263265                                        return EIO;
    264266                               
     
    272274                /* Extended special set */
    273275                if (code == KBD_SCANCODE_SET_EXTENDED_SPECIAL) {
    274                         size = chardev_read(kbd->chardev, &code, 1);
    275                         if (size != 1)
     276                        rc = chardev_read(kbd->chardev, &code, 1, &nread);
     277                        if (rc != EOK)
    276278                                return EIO;
    277279                       
     
    279281                                continue;
    280282                       
    281                         size = chardev_read(kbd->chardev, &code, 1);
    282                         if (size != 1)
     283                        rc = chardev_read(kbd->chardev, &code, 1, &nread);
     284                        if (rc != EOK)
    283285                                return EIO;
    284286                       
     
    286288                                continue;
    287289                       
    288                         size = chardev_read(kbd->chardev, &code, 1);
    289                         if (size != 1)
     290                        rc = chardev_read(kbd->chardev, &code, 1, &nread);
     291                        if (rc != EOK)
    290292                                return EIO;
    291293                       
     
    293295                                continue;
    294296                       
    295                         size = chardev_read(kbd->chardev, &code, 1);
    296                         if (size != 1)
     297                        rc = chardev_read(kbd->chardev, &code, 1, &nread);
     298                        if (rc != EOK)
    297299                                return EIO;
    298300                       
     
    300302                                continue;
    301303                       
    302                         size = chardev_read(kbd->chardev, &code, 1);
    303                         if (size != 1)
     304                        rc = chardev_read(kbd->chardev, &code, 1, &nread);
     305                        if (rc != EOK)
    304306                                return EIO;
    305307                       
     
    350352                uint8_t cmds[] = { KBD_CMD_SET_LEDS, status };
    351353               
    352                 ssize_t size = chardev_write(kbd->chardev, cmds, sizeof(cmds));
    353                
    354                 async_answer_0(icallid, size < 0 ? size : EOK);
     354                size_t nwr;
     355                int rc = chardev_write(kbd->chardev, cmds, sizeof(cmds), &nwr);
     356                if (nwr != sizeof(cmds))
     357                        rc = EIO;
     358
     359                async_answer_0(icallid, rc);
    355360                break;
    356361        }
  • uspace/lib/c/generic/io/chardev.c

    r75fcf9b r5d50c419  
    4040#include <io/chardev.h>
    4141#include <ipc/chardev.h>
     42#include <stddef.h>
    4243#include <stdlib.h>
    4344
     
    7677}
    7778
    78 ssize_t chardev_read(chardev_t *chardev, void *data, size_t size)
     79int chardev_read(chardev_t *chardev, void *data, size_t size, size_t *nread)
    7980{
    8081        if (size > 4 * sizeof(sysarg_t))
     
    8889        if (ret > 0 && (size_t)ret <= size)
    8990                memcpy(data, message, size);
    90         return ret;
     91
     92        if (ret < 0) {
     93                *nread = 0;
     94                return ret;
     95        }
     96
     97        *nread = ret;
     98        return EOK;
    9199}
    92100
    93 ssize_t chardev_write(chardev_t *chardev, const void *data, size_t size)
     101int chardev_write(chardev_t *chardev, const void *data, size_t size,
     102    size_t *nwritten)
    94103{
    95104        int ret;
     
    104113            message[0], message[1], message[2]);
    105114        async_exchange_end(exch);
    106         return ret;
     115
     116        if (ret < 0) {
     117                *nwritten = 0;
     118                return ret;
     119        }
     120
     121        *nwritten = ret;
     122        return EOK;
    107123}
    108124
  • uspace/lib/c/include/io/chardev.h

    r75fcf9b r5d50c419  
    3535
    3636#include <async.h>
    37 #include <types/common.h>
     37#include <stddef.h>
    3838
    3939typedef struct {
     
    4343extern int chardev_open(async_sess_t *, chardev_t **);
    4444extern void chardev_close(chardev_t *);
    45 extern ssize_t chardev_read(chardev_t *, void *, size_t);
    46 extern ssize_t chardev_write(chardev_t *, const void *, size_t);
     45extern int chardev_read(chardev_t *, void *, size_t, size_t *);
     46extern int chardev_write(chardev_t *, const void *, size_t, size_t *);
    4747
    4848#endif
Note: See TracChangeset for help on using the changeset viewer.