@@ -1181,9 +1181,129 @@ static int hci_set_adv_set_random_addr_sync(struct hci_dev *hdev, u8 instance,
1181
1181
sizeof (cp ), & cp , HCI_CMD_TIMEOUT );
1182
1182
}
1183
1183
1184
+ static int
1185
+ hci_set_ext_adv_params_sync (struct hci_dev * hdev , struct adv_info * adv ,
1186
+ const struct hci_cp_le_set_ext_adv_params * cp ,
1187
+ struct hci_rp_le_set_ext_adv_params * rp )
1188
+ {
1189
+ struct sk_buff * skb ;
1190
+
1191
+ skb = __hci_cmd_sync (hdev , HCI_OP_LE_SET_EXT_ADV_PARAMS , sizeof (* cp ),
1192
+ cp , HCI_CMD_TIMEOUT );
1193
+
1194
+ /* If command return a status event, skb will be set to -ENODATA */
1195
+ if (skb == ERR_PTR (- ENODATA ))
1196
+ return 0 ;
1197
+
1198
+ if (IS_ERR (skb )) {
1199
+ bt_dev_err (hdev , "Opcode 0x%4.4x failed: %ld" ,
1200
+ HCI_OP_LE_SET_EXT_ADV_PARAMS , PTR_ERR (skb ));
1201
+ return PTR_ERR (skb );
1202
+ }
1203
+
1204
+ if (skb -> len != sizeof (* rp )) {
1205
+ bt_dev_err (hdev , "Invalid response length for 0x%4.4x: %u" ,
1206
+ HCI_OP_LE_SET_EXT_ADV_PARAMS , skb -> len );
1207
+ kfree_skb (skb );
1208
+ return - EIO ;
1209
+ }
1210
+
1211
+ memcpy (rp , skb -> data , sizeof (* rp ));
1212
+ kfree_skb (skb );
1213
+
1214
+ if (!rp -> status ) {
1215
+ hdev -> adv_addr_type = cp -> own_addr_type ;
1216
+ if (!cp -> handle ) {
1217
+ /* Store in hdev for instance 0 */
1218
+ hdev -> adv_tx_power = rp -> tx_power ;
1219
+ } else if (adv ) {
1220
+ adv -> tx_power = rp -> tx_power ;
1221
+ }
1222
+ }
1223
+
1224
+ return rp -> status ;
1225
+ }
1226
+
1227
+ static int hci_set_ext_adv_data_sync (struct hci_dev * hdev , u8 instance )
1228
+ {
1229
+ struct {
1230
+ struct hci_cp_le_set_ext_adv_data cp ;
1231
+ u8 data [HCI_MAX_EXT_AD_LENGTH ];
1232
+ } pdu ;
1233
+ u8 len ;
1234
+ struct adv_info * adv = NULL ;
1235
+ int err ;
1236
+
1237
+ memset (& pdu , 0 , sizeof (pdu ));
1238
+
1239
+ if (instance ) {
1240
+ adv = hci_find_adv_instance (hdev , instance );
1241
+ if (!adv || !adv -> adv_data_changed )
1242
+ return 0 ;
1243
+ }
1244
+
1245
+ len = eir_create_adv_data (hdev , instance , pdu .data );
1246
+
1247
+ pdu .cp .length = len ;
1248
+ pdu .cp .handle = instance ;
1249
+ pdu .cp .operation = LE_SET_ADV_DATA_OP_COMPLETE ;
1250
+ pdu .cp .frag_pref = LE_SET_ADV_DATA_NO_FRAG ;
1251
+
1252
+ err = __hci_cmd_sync_status (hdev , HCI_OP_LE_SET_EXT_ADV_DATA ,
1253
+ sizeof (pdu .cp ) + len , & pdu .cp ,
1254
+ HCI_CMD_TIMEOUT );
1255
+ if (err )
1256
+ return err ;
1257
+
1258
+ /* Update data if the command succeed */
1259
+ if (adv ) {
1260
+ adv -> adv_data_changed = false;
1261
+ } else {
1262
+ memcpy (hdev -> adv_data , pdu .data , len );
1263
+ hdev -> adv_data_len = len ;
1264
+ }
1265
+
1266
+ return 0 ;
1267
+ }
1268
+
1269
+ static int hci_set_adv_data_sync (struct hci_dev * hdev , u8 instance )
1270
+ {
1271
+ struct hci_cp_le_set_adv_data cp ;
1272
+ u8 len ;
1273
+
1274
+ memset (& cp , 0 , sizeof (cp ));
1275
+
1276
+ len = eir_create_adv_data (hdev , instance , cp .data );
1277
+
1278
+ /* There's nothing to do if the data hasn't changed */
1279
+ if (hdev -> adv_data_len == len &&
1280
+ memcmp (cp .data , hdev -> adv_data , len ) == 0 )
1281
+ return 0 ;
1282
+
1283
+ memcpy (hdev -> adv_data , cp .data , sizeof (cp .data ));
1284
+ hdev -> adv_data_len = len ;
1285
+
1286
+ cp .length = len ;
1287
+
1288
+ return __hci_cmd_sync_status (hdev , HCI_OP_LE_SET_ADV_DATA ,
1289
+ sizeof (cp ), & cp , HCI_CMD_TIMEOUT );
1290
+ }
1291
+
1292
+ int hci_update_adv_data_sync (struct hci_dev * hdev , u8 instance )
1293
+ {
1294
+ if (!hci_dev_test_flag (hdev , HCI_LE_ENABLED ))
1295
+ return 0 ;
1296
+
1297
+ if (ext_adv_capable (hdev ))
1298
+ return hci_set_ext_adv_data_sync (hdev , instance );
1299
+
1300
+ return hci_set_adv_data_sync (hdev , instance );
1301
+ }
1302
+
1184
1303
int hci_setup_ext_adv_instance_sync (struct hci_dev * hdev , u8 instance )
1185
1304
{
1186
1305
struct hci_cp_le_set_ext_adv_params cp ;
1306
+ struct hci_rp_le_set_ext_adv_params rp ;
1187
1307
bool connectable ;
1188
1308
u32 flags ;
1189
1309
bdaddr_t random_addr ;
@@ -1290,8 +1410,12 @@ int hci_setup_ext_adv_instance_sync(struct hci_dev *hdev, u8 instance)
1290
1410
cp .secondary_phy = HCI_ADV_PHY_1M ;
1291
1411
}
1292
1412
1293
- err = __hci_cmd_sync_status (hdev , HCI_OP_LE_SET_EXT_ADV_PARAMS ,
1294
- sizeof (cp ), & cp , HCI_CMD_TIMEOUT );
1413
+ err = hci_set_ext_adv_params_sync (hdev , adv , & cp , & rp );
1414
+ if (err )
1415
+ return err ;
1416
+
1417
+ /* Update adv data as tx power is known now */
1418
+ err = hci_set_ext_adv_data_sync (hdev , cp .handle );
1295
1419
if (err )
1296
1420
return err ;
1297
1421
@@ -1815,82 +1939,6 @@ int hci_le_terminate_big_sync(struct hci_dev *hdev, u8 handle, u8 reason)
1815
1939
sizeof (cp ), & cp , HCI_CMD_TIMEOUT );
1816
1940
}
1817
1941
1818
- static int hci_set_ext_adv_data_sync (struct hci_dev * hdev , u8 instance )
1819
- {
1820
- struct {
1821
- struct hci_cp_le_set_ext_adv_data cp ;
1822
- u8 data [HCI_MAX_EXT_AD_LENGTH ];
1823
- } pdu ;
1824
- u8 len ;
1825
- struct adv_info * adv = NULL ;
1826
- int err ;
1827
-
1828
- memset (& pdu , 0 , sizeof (pdu ));
1829
-
1830
- if (instance ) {
1831
- adv = hci_find_adv_instance (hdev , instance );
1832
- if (!adv || !adv -> adv_data_changed )
1833
- return 0 ;
1834
- }
1835
-
1836
- len = eir_create_adv_data (hdev , instance , pdu .data );
1837
-
1838
- pdu .cp .length = len ;
1839
- pdu .cp .handle = instance ;
1840
- pdu .cp .operation = LE_SET_ADV_DATA_OP_COMPLETE ;
1841
- pdu .cp .frag_pref = LE_SET_ADV_DATA_NO_FRAG ;
1842
-
1843
- err = __hci_cmd_sync_status (hdev , HCI_OP_LE_SET_EXT_ADV_DATA ,
1844
- sizeof (pdu .cp ) + len , & pdu .cp ,
1845
- HCI_CMD_TIMEOUT );
1846
- if (err )
1847
- return err ;
1848
-
1849
- /* Update data if the command succeed */
1850
- if (adv ) {
1851
- adv -> adv_data_changed = false;
1852
- } else {
1853
- memcpy (hdev -> adv_data , pdu .data , len );
1854
- hdev -> adv_data_len = len ;
1855
- }
1856
-
1857
- return 0 ;
1858
- }
1859
-
1860
- static int hci_set_adv_data_sync (struct hci_dev * hdev , u8 instance )
1861
- {
1862
- struct hci_cp_le_set_adv_data cp ;
1863
- u8 len ;
1864
-
1865
- memset (& cp , 0 , sizeof (cp ));
1866
-
1867
- len = eir_create_adv_data (hdev , instance , cp .data );
1868
-
1869
- /* There's nothing to do if the data hasn't changed */
1870
- if (hdev -> adv_data_len == len &&
1871
- memcmp (cp .data , hdev -> adv_data , len ) == 0 )
1872
- return 0 ;
1873
-
1874
- memcpy (hdev -> adv_data , cp .data , sizeof (cp .data ));
1875
- hdev -> adv_data_len = len ;
1876
-
1877
- cp .length = len ;
1878
-
1879
- return __hci_cmd_sync_status (hdev , HCI_OP_LE_SET_ADV_DATA ,
1880
- sizeof (cp ), & cp , HCI_CMD_TIMEOUT );
1881
- }
1882
-
1883
- int hci_update_adv_data_sync (struct hci_dev * hdev , u8 instance )
1884
- {
1885
- if (!hci_dev_test_flag (hdev , HCI_LE_ENABLED ))
1886
- return 0 ;
1887
-
1888
- if (ext_adv_capable (hdev ))
1889
- return hci_set_ext_adv_data_sync (hdev , instance );
1890
-
1891
- return hci_set_adv_data_sync (hdev , instance );
1892
- }
1893
-
1894
1942
int hci_schedule_adv_instance_sync (struct hci_dev * hdev , u8 instance ,
1895
1943
bool force )
1896
1944
{
@@ -6127,6 +6175,7 @@ static int hci_le_ext_directed_advertising_sync(struct hci_dev *hdev,
6127
6175
struct hci_conn * conn )
6128
6176
{
6129
6177
struct hci_cp_le_set_ext_adv_params cp ;
6178
+ struct hci_rp_le_set_ext_adv_params rp ;
6130
6179
int err ;
6131
6180
bdaddr_t random_addr ;
6132
6181
u8 own_addr_type ;
@@ -6169,8 +6218,12 @@ static int hci_le_ext_directed_advertising_sync(struct hci_dev *hdev,
6169
6218
if (err )
6170
6219
return err ;
6171
6220
6172
- err = __hci_cmd_sync_status (hdev , HCI_OP_LE_SET_EXT_ADV_PARAMS ,
6173
- sizeof (cp ), & cp , HCI_CMD_TIMEOUT );
6221
+ err = hci_set_ext_adv_params_sync (hdev , NULL , & cp , & rp );
6222
+ if (err )
6223
+ return err ;
6224
+
6225
+ /* Update adv data as tx power is known now */
6226
+ err = hci_set_ext_adv_data_sync (hdev , cp .handle );
6174
6227
if (err )
6175
6228
return err ;
6176
6229
0 commit comments