Setting default Link Policy according to the chip supported features

By default all features are enabled (RSWITCH, HOLD, PARK, SNIFF).
When "read local supported features" complete event occurs, not supported
features are disabled and then "Write default link policy" command with
supported features is sent.

On behalf of ST-Ericsson SA
diff --git a/plugins/hciops.c b/plugins/hciops.c
index 4af137c..ff5f39c 100644
--- a/plugins/hciops.c
+++ b/plugins/hciops.c
@@ -297,6 +297,7 @@
 {
 	uint8_t events[8] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00 };
 	uint8_t inqmode;
+	uint16_t policy;
 
 	if (VER(index).lmp_ver > 1) {
 		if (FEATURES(index)[5] & LMP_SNIFF_SUBR)
@@ -345,6 +346,20 @@
 		hci_send_cmd(SK(index), OGF_HOST_CTL,
 				OCF_READ_INQ_RESPONSE_TX_POWER_LEVEL, 0, NULL);
 
+	/* Set default link policy */
+	if (!(FEATURES(index)[0] & LMP_RSWITCH))
+		main_opts.link_policy &= ~HCI_LP_RSWITCH;
+	if (!(FEATURES(index)[0] & LMP_HOLD))
+		main_opts.link_policy &= ~HCI_LP_HOLD;
+	if (!(FEATURES(index)[0] & LMP_SNIFF))
+		main_opts.link_policy &= ~HCI_LP_SNIFF;
+	if (!(FEATURES(index)[1] & LMP_PARK))
+		main_opts.link_policy &= ~HCI_LP_PARK;
+
+	policy = htobs(main_opts.link_policy);
+	hci_send_cmd(SK(index), OGF_LINK_POLICY, OCF_WRITE_DEFAULT_LINK_POLICY,
+						sizeof(policy), &policy);
+
 	CURRENT_COD(index) = 0;
 	memset(EIR(index), 0, sizeof(EIR(index)));
 
@@ -1949,7 +1964,6 @@
 static void device_devup_setup(int index)
 {
 	struct hci_dev_info di;
-	uint16_t policy;
 	read_stored_link_key_cp cp;
 
 	DBG("hci%d", index);
@@ -1972,11 +1986,6 @@
 					WRITE_PAGE_TIMEOUT_CP_SIZE, &cp);
 	}
 
-	/* Set default link policy */
-	policy = htobs(main_opts.link_policy);
-	hci_send_cmd(SK(index), OGF_LINK_POLICY,
-				OCF_WRITE_DEFAULT_LINK_POLICY, 2, &policy);
-
 	bacpy(&cp.bdaddr, BDADDR_ANY);
 	cp.read_all = 1;
 	hci_send_cmd(SK(index), OGF_HOST_CTL, OCF_READ_STORED_LINK_KEY,
@@ -1997,7 +2006,6 @@
 static void init_device(int index)
 {
 	struct hci_dev_req dr;
-	struct hci_dev_info di;
 	int dd;
 	pid_t pid;
 
@@ -2042,19 +2050,6 @@
 		error("Can't set link mode on hci%d: %s (%d)",
 						index, strerror(errno), errno);
 
-	/* Set link policy for BR/EDR HCI devices */
-	if (hci_devinfo(index, &di) < 0)
-		goto fail;
-
-	if (!ignore_device(&di)) {
-		dr.dev_opt = main_opts.link_policy;
-		if (ioctl(dd, HCISETLINKPOL, (unsigned long) &dr) < 0 &&
-							errno != ENETDOWN) {
-			error("Can't set link policy on hci%d: %s (%d)",
-						index, strerror(errno), errno);
-		}
-	}
-
 	/* Start HCI device */
 	if (ioctl(dd, HCIDEVUP, index) < 0 && errno != EALREADY) {
 		error("Can't init device hci%d: %s (%d)",