if (pi->conf_mtu < pi->omtu)
                        result = L2CAP_CONF_UNACCEPT;
-               else
+               else {
                        pi->omtu = pi->conf_mtu;
+                       pi->conf_state |= L2CAP_CONF_OUTPUT_DONE;
+               }
 
                l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, pi->omtu);
        }
 
        l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, len, rsp);
 
-       /* Output config done. */
-       l2cap_pi(sk)->conf_state |= L2CAP_CONF_OUTPUT_DONE;
-
        /* Reset config buffer. */
        l2cap_pi(sk)->conf_len = 0;
 
+       if (!(l2cap_pi(sk)->conf_state & L2CAP_CONF_OUTPUT_DONE))
+               goto unlock;
+
        if (l2cap_pi(sk)->conf_state & L2CAP_CONF_INPUT_DONE) {
                sk->sk_state = BT_CONNECTED;
                l2cap_chan_ready(sk);
-       } else if (!(l2cap_pi(sk)->conf_state & L2CAP_CONF_REQ_SENT)) {
+               goto unlock;
+       }
+
+       if (!(l2cap_pi(sk)->conf_state & L2CAP_CONF_REQ_SENT)) {
                u8 req[64];
                l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
                                        l2cap_build_conf_req(sk, req), req);
        if (flags & 0x01)
                goto done;
 
-       /* Input config done */
        l2cap_pi(sk)->conf_state |= L2CAP_CONF_INPUT_DONE;
 
        if (l2cap_pi(sk)->conf_state & L2CAP_CONF_OUTPUT_DONE) {