pi->imtu = l2cap_pi(parent)->imtu;
                pi->omtu = l2cap_pi(parent)->omtu;
+               pi->mode = l2cap_pi(parent)->mode;
+               pi->fcs  = l2cap_pi(parent)->fcs;
                pi->sec_level = l2cap_pi(parent)->sec_level;
                pi->role_switch = l2cap_pi(parent)->role_switch;
                pi->force_reliable = l2cap_pi(parent)->force_reliable;
        } else {
                pi->imtu = L2CAP_DEFAULT_MTU;
                pi->omtu = 0;
+               pi->mode = L2CAP_MODE_BASIC;
+               pi->fcs  = L2CAP_FCS_CRC16;
                pi->sec_level = BT_SECURITY_LOW;
                pi->role_switch = 0;
                pi->force_reliable = 0;
                goto done;
        }
 
+       switch (l2cap_pi(sk)->mode) {
+       case L2CAP_MODE_BASIC:
+               break;
+       case L2CAP_MODE_ERTM:
+               if (enable_ertm)
+                       break;
+               /* fall through */
+       default:
+               err = -ENOTSUPP;
+               goto done;
+       }
+
        switch (sk->sk_state) {
        case BT_CONNECT:
        case BT_CONNECT2:
                goto done;
        }
 
+       switch (l2cap_pi(sk)->mode) {
+       case L2CAP_MODE_BASIC:
+               break;
+       case L2CAP_MODE_ERTM:
+               if (enable_ertm)
+                       break;
+               /* fall through */
+       default:
+               err = -ENOTSUPP;
+               goto done;
+       }
+
        if (!l2cap_pi(sk)->psm) {
                bdaddr_t *src = &bt_sk(sk)->src;
                u16 psm;
                opts.imtu     = l2cap_pi(sk)->imtu;
                opts.omtu     = l2cap_pi(sk)->omtu;
                opts.flush_to = l2cap_pi(sk)->flush_to;
-               opts.mode     = L2CAP_MODE_BASIC;
+               opts.mode     = l2cap_pi(sk)->mode;
 
                len = min_t(unsigned int, sizeof(opts), optlen);
                if (copy_from_user((char *) &opts, optval, len)) {
                        break;
                }
 
-               l2cap_pi(sk)->imtu  = opts.imtu;
-               l2cap_pi(sk)->omtu  = opts.omtu;
+               l2cap_pi(sk)->imtu = opts.imtu;
+               l2cap_pi(sk)->omtu = opts.omtu;
+               l2cap_pi(sk)->mode = opts.mode;
                break;
 
        case L2CAP_LM:
                opts.imtu     = l2cap_pi(sk)->imtu;
                opts.omtu     = l2cap_pi(sk)->omtu;
                opts.flush_to = l2cap_pi(sk)->flush_to;
-               opts.mode     = L2CAP_MODE_BASIC;
+               opts.mode     = l2cap_pi(sk)->mode;
 
                len = min_t(unsigned int, len, sizeof(opts));
                if (copy_to_user(optval, (char *) &opts, len))