Changeset 4510e06 in mainline


Ignore:
Timestamp:
2013-05-16T12:07:29Z (11 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
3abf0760
Parents:
7b64cf0
Message:

Allow ns8250 to be opened multiple-times.

File:
1 edited

Legend:

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

    r7b64cf0 r4510e06  
    160160        /** I/O registers **/
    161161        ns8250_regs_t *regs;
    162         /** Is there any client connected to the device? */
    163         bool client_connected;
     162        /** Are there any clients connected to the device? */
     163        unsigned client_connections;
    164164        /** The irq assigned to this device. */
    165165        int irq;
     
    753753                        uint8_t val = ns8250_read_8(regs);
    754754                       
    755                         if (ns->client_connected) {
     755                        if (ns->client_connections > 0) {
    756756                                bool buf_was_empty = buf_is_empty(&ns->input_buffer);
    757757                                if (!buf_push_back(&ns->input_buffer, val)) {
     
    914914       
    915915        fibril_mutex_lock(&ns->mutex);
    916         if (ns->client_connected) {
     916                if (ns->client_connections > 0) {
    917917                fibril_mutex_unlock(&ns->mutex);
    918918                return EBUSY;
     
    948948       
    949949        fibril_mutex_lock(&ns->mutex);
    950         if (ns->client_connected) {
    951                 res = ELIMIT;
    952         } else if (ns->removed) {
     950        if (ns->removed) {
    953951                res = ENXIO;
    954952        } else {
    955953                res = EOK;
    956                 ns->client_connected = true;
     954                ns->client_connections++;
    957955        }
    958956        fibril_mutex_unlock(&ns->mutex);
     
    974972        fibril_mutex_lock(&data->mutex);
    975973       
    976         assert(data->client_connected);
    977        
    978         data->client_connected = false;
    979         buf_clear(&data->input_buffer);
     974        assert(data->client_connections > 0);
     975       
     976        if (!(--data->client_connections))
     977                buf_clear(&data->input_buffer);
    980978       
    981979        fibril_mutex_unlock(&data->mutex);
Note: See TracChangeset for help on using the changeset viewer.