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 <pe...@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

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to