Bluetooth: Refactor locking in amp_physical_cfm
[firefly-linux-kernel-4.4.55.git] / include / net / bluetooth / l2cap.h
index 7ed8e356425a16dc33c5afd5e4a80eaafdd6ea64..f57fab04e7c5ff8b77c2c06eb92fd8dddcbf0f97 100644 (file)
 /* L2CAP defaults */
 #define L2CAP_DEFAULT_MTU              672
 #define L2CAP_DEFAULT_MIN_MTU          48
-#define L2CAP_DEFAULT_FLUSH_TO         0xffff
+#define L2CAP_DEFAULT_FLUSH_TO         0xFFFF
+#define L2CAP_EFS_DEFAULT_FLUSH_TO     0xFFFFFFFF
 #define L2CAP_DEFAULT_TX_WINDOW                63
 #define L2CAP_DEFAULT_EXT_WINDOW       0x3FFF
 #define L2CAP_DEFAULT_MAX_TX           3
 #define L2CAP_DEFAULT_RETRANS_TO       2000    /* 2 seconds */
 #define L2CAP_DEFAULT_MONITOR_TO       12000   /* 12 seconds */
-#define L2CAP_DEFAULT_MAX_PDU_SIZE     1009    /* Sized for 3-DH5 packet */
+#define L2CAP_DEFAULT_MAX_PDU_SIZE     1492    /* Sized for AMP packet */
 #define L2CAP_DEFAULT_ACK_TO           200
 #define L2CAP_DEFAULT_MAX_SDU_SIZE     0xFFFF
 #define L2CAP_DEFAULT_SDU_ITIME                0xFFFFFFFF
@@ -51,6 +52,8 @@
 #define L2CAP_ENC_TIMEOUT              msecs_to_jiffies(5000)
 #define L2CAP_CONN_TIMEOUT             msecs_to_jiffies(40000)
 #define L2CAP_INFO_TIMEOUT             msecs_to_jiffies(4000)
+#define L2CAP_MOVE_TIMEOUT             msecs_to_jiffies(4000)
+#define L2CAP_MOVE_ERTX_TIMEOUT                msecs_to_jiffies(60000)
 
 #define L2CAP_A2MP_DEFAULT_MTU         670
 
@@ -433,6 +436,8 @@ struct l2cap_chan {
        struct sock *sk;
 
        struct l2cap_conn       *conn;
+       struct hci_conn         *hs_hcon;
+       struct hci_chan         *hs_hchan;
        struct kref     kref;
 
        __u8            state;
@@ -476,6 +481,12 @@ struct l2cap_chan {
        unsigned long   conn_state;
        unsigned long   flags;
 
+       __u8            remote_amp_id;
+       __u8            local_amp_id;
+       __u8            move_id;
+       __u8            move_state;
+       __u8            move_role;
+
        __u16           next_tx_seq;
        __u16           expected_ack_seq;
        __u16           expected_tx_seq;
@@ -538,6 +549,7 @@ struct l2cap_ops {
        void                    (*state_change) (struct l2cap_chan *chan,
                                                 int state);
        void                    (*ready) (struct l2cap_chan *chan);
+       void                    (*defer) (struct l2cap_chan *chan);
        struct sk_buff          *(*alloc_skb) (struct l2cap_chan *chan,
                                               unsigned long len, int nb);
 };
@@ -640,6 +652,9 @@ enum {
 enum {
        L2CAP_RX_STATE_RECV,
        L2CAP_RX_STATE_SREJ_SENT,
+       L2CAP_RX_STATE_MOVE,
+       L2CAP_RX_STATE_WAIT_P,
+       L2CAP_RX_STATE_WAIT_F,
 };
 
 enum {
@@ -670,6 +685,25 @@ enum {
        L2CAP_EV_RECV_FRAME,
 };
 
+enum {
+       L2CAP_MOVE_ROLE_NONE,
+       L2CAP_MOVE_ROLE_INITIATOR,
+       L2CAP_MOVE_ROLE_RESPONDER,
+};
+
+enum {
+       L2CAP_MOVE_STABLE,
+       L2CAP_MOVE_WAIT_REQ,
+       L2CAP_MOVE_WAIT_RSP,
+       L2CAP_MOVE_WAIT_RSP_SUCCESS,
+       L2CAP_MOVE_WAIT_CONFIRM,
+       L2CAP_MOVE_WAIT_CONFIRM_RSP,
+       L2CAP_MOVE_WAIT_LOGICAL_COMP,
+       L2CAP_MOVE_WAIT_LOGICAL_CFM,
+       L2CAP_MOVE_WAIT_LOCAL_BUSY,
+       L2CAP_MOVE_WAIT_PREPARE,
+};
+
 void l2cap_chan_hold(struct l2cap_chan *c);
 void l2cap_chan_put(struct l2cap_chan *c);
 
@@ -745,6 +779,10 @@ static inline void l2cap_chan_no_ready(struct l2cap_chan *chan)
 {
 }
 
+static inline void l2cap_chan_no_defer(struct l2cap_chan *chan)
+{
+}
+
 extern bool disable_ertm;
 
 int l2cap_init_sockets(void);
@@ -767,6 +805,12 @@ int l2cap_chan_check_security(struct l2cap_chan *chan);
 void l2cap_chan_set_defaults(struct l2cap_chan *chan);
 int l2cap_ertm_init(struct l2cap_chan *chan);
 void l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan);
+void __l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan);
 void l2cap_chan_del(struct l2cap_chan *chan, int err);
+void l2cap_send_conn_req(struct l2cap_chan *chan);
+void l2cap_move_start(struct l2cap_chan *chan);
+void l2cap_logical_cfm(struct l2cap_chan *chan, struct hci_chan *hchan,
+                      u8 status);
+void __l2cap_physical_cfm(struct l2cap_chan *chan, int result);
 
 #endif /* __L2CAP_H */