lkml.org 
[lkml]   [2013]   [Jan]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 01/11] staging/fwserial: Only reset port status for attached peers
    Date
    When a port has been reserved in an attempt to connect to a peer
    but that attempt does not succeed, releasing the port should not
    reset the port line status. Although resetting is functionally
    harmless, it can appear as if a remote peer dropped carrier to a
    port it was not attached to (which can be confusing).

    Signed-off-by: Peter Hurley <peter@hurleysoftware.com>
    ---
    drivers/staging/fwserial/fwserial.c | 21 ++++++++++++---------
    1 file changed, 12 insertions(+), 9 deletions(-)

    diff --git a/drivers/staging/fwserial/fwserial.c b/drivers/staging/fwserial/fwserial.c
    index 48523eb..b1482ef 100644
    --- a/drivers/staging/fwserial/fwserial.c
    +++ b/drivers/staging/fwserial/fwserial.c
    @@ -1774,10 +1774,11 @@ static struct fwtty_port *fwserial_find_port(struct fwtty_peer *peer)
    return NULL;
    }

    -static void fwserial_release_port(struct fwtty_port *port)
    +static void fwserial_release_port(struct fwtty_port *port, bool reset)
    {
    /* drop carrier (and all other line status) */
    - fwtty_update_port_status(port, 0);
    + if (reset)
    + fwtty_update_port_status(port, 0);

    spin_lock_bh(&port->lock);

    @@ -1807,7 +1808,7 @@ static void fwserial_plug_timeout(unsigned long data)
    spin_unlock_bh(&peer->lock);

    if (port)
    - fwserial_release_port(port);
    + fwserial_release_port(port, false);
    }

    /**
    @@ -1870,7 +1871,7 @@ cancel_timer:
    peer_revert_state(peer);
    release_port:
    spin_unlock_bh(&peer->lock);
    - fwserial_release_port(port);
    + fwserial_release_port(port, false);
    free_pkt:
    kfree(pkt);
    return err;
    @@ -2148,7 +2149,7 @@ static void fwserial_remove_peer(struct fwtty_peer *peer)
    spin_unlock_bh(&peer->lock);

    if (port)
    - fwserial_release_port(port);
    + fwserial_release_port(port, true);

    synchronize_rcu();
    kfree(peer);
    @@ -2608,7 +2609,7 @@ static void fwserial_handle_plug_req(struct work_struct *work)

    spin_unlock_bh(&peer->lock);
    if (port)
    - fwserial_release_port(port);
    + fwserial_release_port(port, false);

    rcode = fwserial_send_mgmt_sync(peer, pkt);

    @@ -2630,7 +2631,7 @@ static void fwserial_handle_plug_req(struct work_struct *work)
    cleanup:
    spin_unlock_bh(&peer->lock);
    if (port)
    - fwserial_release_port(port);
    + fwserial_release_port(port, false);
    kfree(pkt);
    return;
    }
    @@ -2682,7 +2683,7 @@ static void fwserial_handle_unplug_req(struct work_struct *work)
    cleanup:
    spin_unlock_bh(&peer->lock);
    if (port)
    - fwserial_release_port(port);
    + fwserial_release_port(port, true);
    kfree(pkt);
    return;
    }
    @@ -2693,6 +2694,7 @@ static int fwserial_parse_mgmt_write(struct fwtty_peer *peer,
    size_t len)
    {
    struct fwtty_port *port = NULL;
    + bool reset = false;
    int rcode;

    if (addr != fwserial_mgmt_addr_handler.offset || len < sizeof(pkt->hdr))
    @@ -2768,6 +2770,7 @@ static int fwserial_parse_mgmt_write(struct fwtty_peer *peer,
    if (be16_to_cpu(pkt->hdr.code) & FWSC_RSP_NACK)
    fwtty_notice(&peer->unit, "NACK unplug?");
    port = peer_revert_state(peer);
    + reset = true;
    }
    break;

    @@ -2779,7 +2782,7 @@ static int fwserial_parse_mgmt_write(struct fwtty_peer *peer,
    spin_unlock_bh(&peer->lock);

    if (port)
    - fwserial_release_port(port);
    + fwserial_release_port(port, reset);

    return rcode;
    }
    --
    1.8.1.1


    \
     
     \ /
      Last update: 2013-01-29 05:01    [W:4.860 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site