diff options
Diffstat (limited to 'net/bluetooth/rfcomm')
-rw-r--r-- | net/bluetooth/rfcomm/core.c | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/net/bluetooth/rfcomm/core.c b/net/bluetooth/rfcomm/core.c index 6de33fe7bf5b..fe18dc2dd3c1 100644 --- a/net/bluetooth/rfcomm/core.c +++ b/net/bluetooth/rfcomm/core.c | |||
@@ -52,8 +52,9 @@ | |||
52 | #define BT_DBG(D...) | 52 | #define BT_DBG(D...) |
53 | #endif | 53 | #endif |
54 | 54 | ||
55 | #define VERSION "1.7" | 55 | #define VERSION "1.8" |
56 | 56 | ||
57 | static int disable_cfc = 0; | ||
57 | static unsigned int l2cap_mtu = RFCOMM_MAX_L2CAP_MTU; | 58 | static unsigned int l2cap_mtu = RFCOMM_MAX_L2CAP_MTU; |
58 | 59 | ||
59 | static struct task_struct *rfcomm_thread; | 60 | static struct task_struct *rfcomm_thread; |
@@ -533,7 +534,7 @@ static struct rfcomm_session *rfcomm_session_add(struct socket *sock, int state) | |||
533 | s->sock = sock; | 534 | s->sock = sock; |
534 | 535 | ||
535 | s->mtu = RFCOMM_DEFAULT_MTU; | 536 | s->mtu = RFCOMM_DEFAULT_MTU; |
536 | s->cfc = RFCOMM_CFC_UNKNOWN; | 537 | s->cfc = disable_cfc ? RFCOMM_CFC_DISABLED : RFCOMM_CFC_UNKNOWN; |
537 | 538 | ||
538 | /* Do not increment module usage count for listening sessions. | 539 | /* Do not increment module usage count for listening sessions. |
539 | * Otherwise we won't be able to unload the module. */ | 540 | * Otherwise we won't be able to unload the module. */ |
@@ -1222,14 +1223,18 @@ static int rfcomm_apply_pn(struct rfcomm_dlc *d, int cr, struct rfcomm_pn *pn) | |||
1222 | BT_DBG("dlc %p state %ld dlci %d mtu %d fc 0x%x credits %d", | 1223 | BT_DBG("dlc %p state %ld dlci %d mtu %d fc 0x%x credits %d", |
1223 | d, d->state, d->dlci, pn->mtu, pn->flow_ctrl, pn->credits); | 1224 | d, d->state, d->dlci, pn->mtu, pn->flow_ctrl, pn->credits); |
1224 | 1225 | ||
1225 | if (pn->flow_ctrl == 0xf0 || pn->flow_ctrl == 0xe0) { | 1226 | if ((pn->flow_ctrl == 0xf0 && s->cfc != RFCOMM_CFC_DISABLED) || |
1226 | d->cfc = s->cfc = RFCOMM_CFC_ENABLED; | 1227 | pn->flow_ctrl == 0xe0) { |
1228 | d->cfc = RFCOMM_CFC_ENABLED; | ||
1227 | d->tx_credits = pn->credits; | 1229 | d->tx_credits = pn->credits; |
1228 | } else { | 1230 | } else { |
1229 | d->cfc = s->cfc = RFCOMM_CFC_DISABLED; | 1231 | d->cfc = RFCOMM_CFC_DISABLED; |
1230 | set_bit(RFCOMM_TX_THROTTLED, &d->flags); | 1232 | set_bit(RFCOMM_TX_THROTTLED, &d->flags); |
1231 | } | 1233 | } |
1232 | 1234 | ||
1235 | if (s->cfc == RFCOMM_CFC_UNKNOWN) | ||
1236 | s->cfc = d->cfc; | ||
1237 | |||
1233 | d->priority = pn->priority; | 1238 | d->priority = pn->priority; |
1234 | 1239 | ||
1235 | d->mtu = s->mtu = btohs(pn->mtu); | 1240 | d->mtu = s->mtu = btohs(pn->mtu); |
@@ -2073,6 +2078,9 @@ static void __exit rfcomm_exit(void) | |||
2073 | module_init(rfcomm_init); | 2078 | module_init(rfcomm_init); |
2074 | module_exit(rfcomm_exit); | 2079 | module_exit(rfcomm_exit); |
2075 | 2080 | ||
2081 | module_param(disable_cfc, bool, 0644); | ||
2082 | MODULE_PARM_DESC(disable_cfc, "Disable credit based flow control"); | ||
2083 | |||
2076 | module_param(l2cap_mtu, uint, 0644); | 2084 | module_param(l2cap_mtu, uint, 0644); |
2077 | MODULE_PARM_DESC(l2cap_mtu, "Default MTU for the L2CAP connection"); | 2085 | MODULE_PARM_DESC(l2cap_mtu, "Default MTU for the L2CAP connection"); |
2078 | 2086 | ||