diff -Nru a/net/bluetooth/rfcomm/core.c b/net/bluetooth/rfcomm/core.c --- a/net/bluetooth/rfcomm/core.c Thu Jul 31 02:41:29 2003 +++ b/net/bluetooth/rfcomm/core.c Thu Jul 31 02:41:29 2003 @@ -202,7 +202,7 @@ d->mtu = RFCOMM_DEFAULT_MTU; d->v24_sig = RFCOMM_V24_RTC | RFCOMM_V24_RTR | RFCOMM_V24_DV; - d->credits = RFCOMM_MAX_CREDITS; + d->credits = 0; d->rx_credits = RFCOMM_DEFAULT_CREDITS; } @@ -475,7 +475,7 @@ s->sock = sock; s->mtu = RFCOMM_DEFAULT_MTU; - s->credits = RFCOMM_MAX_CREDITS; + s->credits = 0; list_add(&s->list, &session_list); @@ -746,7 +746,7 @@ pn->ack_timer = 0; pn->max_retrans = 0; - if (d->credits) { + if (cr || d->credits) { pn->flow_ctrl = cr ? 0xf0 : 0xe0; pn->credits = RFCOMM_DEFAULT_CREDITS; } else { @@ -1135,11 +1135,15 @@ static int rfcomm_apply_pn(struct rfcomm_dlc *d, int cr, struct rfcomm_pn *pn) { + struct rfcomm_session *s = d->session; + BT_DBG("dlc %p state %ld dlci %d mtu %d fc 0x%x credits %d", d, d->state, d->dlci, pn->mtu, pn->flow_ctrl, pn->credits); if (cr) { if (pn->flow_ctrl == 0xf0) { + s->credits = RFCOMM_MAX_CREDITS; + d->credits = s->credits; d->tx_credits = pn->credits; } else { set_bit(RFCOMM_TX_THROTTLED, &d->flags); @@ -1147,6 +1151,8 @@ } } else { if (pn->flow_ctrl == 0xe0) { + s->credits = RFCOMM_MAX_CREDITS; + d->credits = s->credits; d->tx_credits = pn->credits; } else { set_bit(RFCOMM_TX_THROTTLED, &d->flags);