diff options
| author | Trond Myklebust <Trond.Myklebust@netapp.com> | 2006-07-05 13:13:03 -0400 | 
|---|---|---|
| committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2006-07-05 13:13:03 -0400 | 
| commit | 5e66dd6d66ffe758b39b6dcadf2330753ee1159b (patch) | |
| tree | a72cdcff4448e4af9425cc213ddf56ab23e697fe /net/bluetooth/rfcomm/core.c | |
| parent | 026477c1141b67e98e3bd8bdedb7d4b88a3ecd09 (diff) | |
| parent | ca78f6baca863afe2e6a244a0fe94b3a70211d46 (diff) | |
Merge branch 'master' of /home/trondmy/kernel/linux-2.6/
Diffstat (limited to 'net/bluetooth/rfcomm/core.c')
| -rw-r--r-- | net/bluetooth/rfcomm/core.c | 27 | 
1 files changed, 20 insertions, 7 deletions
| diff --git a/net/bluetooth/rfcomm/core.c b/net/bluetooth/rfcomm/core.c index bd46e8927f29..155a2b93760e 100644 --- a/net/bluetooth/rfcomm/core.c +++ b/net/bluetooth/rfcomm/core.c @@ -52,8 +52,9 @@  #define BT_DBG(D...)  #endif -#define VERSION "1.7" +#define VERSION "1.8" +static int disable_cfc = 0;  static unsigned int l2cap_mtu = RFCOMM_MAX_L2CAP_MTU;  static struct task_struct *rfcomm_thread; @@ -533,7 +534,7 @@ static struct rfcomm_session *rfcomm_session_add(struct socket *sock, int state)  	s->sock  = sock;  	s->mtu = RFCOMM_DEFAULT_MTU; -	s->cfc = RFCOMM_CFC_UNKNOWN; +	s->cfc = disable_cfc ? RFCOMM_CFC_DISABLED : RFCOMM_CFC_UNKNOWN;  	/* Do not increment module usage count for listening sessions.  	 * Otherwise we won't be able to unload the module. */ @@ -1149,6 +1150,8 @@ static inline int rfcomm_check_link_mode(struct rfcomm_dlc *d)  static void rfcomm_dlc_accept(struct rfcomm_dlc *d)  { +	struct sock *sk = d->session->sock->sk; +  	BT_DBG("dlc %p", d);  	rfcomm_send_ua(d->session, d->dlci); @@ -1158,6 +1161,9 @@ static void rfcomm_dlc_accept(struct rfcomm_dlc *d)  	d->state_change(d, 0);  	rfcomm_dlc_unlock(d); +	if (d->link_mode & RFCOMM_LM_MASTER) +		hci_conn_switch_role(l2cap_pi(sk)->conn->hcon, 0x00); +  	rfcomm_send_msc(d->session, 1, d->dlci, d->v24_sig);  } @@ -1222,14 +1228,18 @@ static int rfcomm_apply_pn(struct rfcomm_dlc *d, int cr, struct rfcomm_pn *pn)  	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 (pn->flow_ctrl == 0xf0 || pn->flow_ctrl == 0xe0) { -		d->cfc = s->cfc = RFCOMM_CFC_ENABLED; +	if ((pn->flow_ctrl == 0xf0 && s->cfc != RFCOMM_CFC_DISABLED) || +						pn->flow_ctrl == 0xe0) { +		d->cfc = RFCOMM_CFC_ENABLED;  		d->tx_credits = pn->credits;  	} else { -		d->cfc = s->cfc = RFCOMM_CFC_DISABLED; +		d->cfc = RFCOMM_CFC_DISABLED;  		set_bit(RFCOMM_TX_THROTTLED, &d->flags);  	} +	if (s->cfc == RFCOMM_CFC_UNKNOWN) +		s->cfc = d->cfc; +  	d->priority = pn->priority;  	d->mtu = s->mtu = btohs(pn->mtu); @@ -2035,7 +2045,7 @@ static int __init rfcomm_init(void)  	kernel_thread(rfcomm_run, NULL, CLONE_KERNEL); -	class_create_file(&bt_class, &class_attr_rfcomm_dlc); +	class_create_file(bt_class, &class_attr_rfcomm_dlc);  	rfcomm_init_sockets(); @@ -2050,7 +2060,7 @@ static int __init rfcomm_init(void)  static void __exit rfcomm_exit(void)  { -	class_remove_file(&bt_class, &class_attr_rfcomm_dlc); +	class_remove_file(bt_class, &class_attr_rfcomm_dlc);  	hci_unregister_cb(&rfcomm_cb); @@ -2073,6 +2083,9 @@ static void __exit rfcomm_exit(void)  module_init(rfcomm_init);  module_exit(rfcomm_exit); +module_param(disable_cfc, bool, 0644); +MODULE_PARM_DESC(disable_cfc, "Disable credit based flow control"); +  module_param(l2cap_mtu, uint, 0644);  MODULE_PARM_DESC(l2cap_mtu, "Default MTU for the L2CAP connection"); | 
