@@ -1447,22 +1447,17 @@ static void settings_rsp(struct mgmt_pending_cmd *cmd, void *data)
1447
1447
1448
1448
send_settings_rsp (cmd -> sk , cmd -> opcode , match -> hdev );
1449
1449
1450
- list_del (& cmd -> list );
1451
-
1452
1450
if (match -> sk == NULL ) {
1453
1451
match -> sk = cmd -> sk ;
1454
1452
sock_hold (match -> sk );
1455
1453
}
1456
-
1457
- mgmt_pending_free (cmd );
1458
1454
}
1459
1455
1460
1456
static void cmd_status_rsp (struct mgmt_pending_cmd * cmd , void * data )
1461
1457
{
1462
1458
u8 * status = data ;
1463
1459
1464
- mgmt_cmd_status (cmd -> sk , cmd -> index , cmd -> opcode , * status );
1465
- mgmt_pending_remove (cmd );
1460
+ mgmt_cmd_status (cmd -> sk , cmd -> hdev -> id , cmd -> opcode , * status );
1466
1461
}
1467
1462
1468
1463
static void cmd_complete_rsp (struct mgmt_pending_cmd * cmd , void * data )
@@ -1476,8 +1471,6 @@ static void cmd_complete_rsp(struct mgmt_pending_cmd *cmd, void *data)
1476
1471
1477
1472
if (cmd -> cmd_complete ) {
1478
1473
cmd -> cmd_complete (cmd , match -> mgmt_status );
1479
- mgmt_pending_remove (cmd );
1480
-
1481
1474
return ;
1482
1475
}
1483
1476
@@ -1486,13 +1479,13 @@ static void cmd_complete_rsp(struct mgmt_pending_cmd *cmd, void *data)
1486
1479
1487
1480
static int generic_cmd_complete (struct mgmt_pending_cmd * cmd , u8 status )
1488
1481
{
1489
- return mgmt_cmd_complete (cmd -> sk , cmd -> index , cmd -> opcode , status ,
1482
+ return mgmt_cmd_complete (cmd -> sk , cmd -> hdev -> id , cmd -> opcode , status ,
1490
1483
cmd -> param , cmd -> param_len );
1491
1484
}
1492
1485
1493
1486
static int addr_cmd_complete (struct mgmt_pending_cmd * cmd , u8 status )
1494
1487
{
1495
- return mgmt_cmd_complete (cmd -> sk , cmd -> index , cmd -> opcode , status ,
1488
+ return mgmt_cmd_complete (cmd -> sk , cmd -> hdev -> id , cmd -> opcode , status ,
1496
1489
cmd -> param , sizeof (struct mgmt_addr_info ));
1497
1490
}
1498
1491
@@ -1532,7 +1525,7 @@ static void mgmt_set_discoverable_complete(struct hci_dev *hdev, void *data,
1532
1525
1533
1526
if (err ) {
1534
1527
u8 mgmt_err = mgmt_status (err );
1535
- mgmt_cmd_status (cmd -> sk , cmd -> index , cmd -> opcode , mgmt_err );
1528
+ mgmt_cmd_status (cmd -> sk , cmd -> hdev -> id , cmd -> opcode , mgmt_err );
1536
1529
hci_dev_clear_flag (hdev , HCI_LIMITED_DISCOVERABLE );
1537
1530
goto done ;
1538
1531
}
@@ -1707,7 +1700,7 @@ static void mgmt_set_connectable_complete(struct hci_dev *hdev, void *data,
1707
1700
1708
1701
if (err ) {
1709
1702
u8 mgmt_err = mgmt_status (err );
1710
- mgmt_cmd_status (cmd -> sk , cmd -> index , cmd -> opcode , mgmt_err );
1703
+ mgmt_cmd_status (cmd -> sk , cmd -> hdev -> id , cmd -> opcode , mgmt_err );
1711
1704
goto done ;
1712
1705
}
1713
1706
@@ -1943,8 +1936,8 @@ static void set_ssp_complete(struct hci_dev *hdev, void *data, int err)
1943
1936
new_settings (hdev , NULL );
1944
1937
}
1945
1938
1946
- mgmt_pending_foreach (MGMT_OP_SET_SSP , hdev , cmd_status_rsp ,
1947
- & mgmt_err );
1939
+ mgmt_pending_foreach (MGMT_OP_SET_SSP , hdev , true ,
1940
+ cmd_status_rsp , & mgmt_err );
1948
1941
return ;
1949
1942
}
1950
1943
@@ -1954,7 +1947,7 @@ static void set_ssp_complete(struct hci_dev *hdev, void *data, int err)
1954
1947
changed = hci_dev_test_and_clear_flag (hdev , HCI_SSP_ENABLED );
1955
1948
}
1956
1949
1957
- mgmt_pending_foreach (MGMT_OP_SET_SSP , hdev , settings_rsp , & match );
1950
+ mgmt_pending_foreach (MGMT_OP_SET_SSP , hdev , true, settings_rsp , & match );
1958
1951
1959
1952
if (changed )
1960
1953
new_settings (hdev , match .sk );
@@ -2074,12 +2067,12 @@ static void set_le_complete(struct hci_dev *hdev, void *data, int err)
2074
2067
bt_dev_dbg (hdev , "err %d" , err );
2075
2068
2076
2069
if (status ) {
2077
- mgmt_pending_foreach (MGMT_OP_SET_LE , hdev , cmd_status_rsp ,
2078
- & status );
2070
+ mgmt_pending_foreach (MGMT_OP_SET_LE , hdev , true, cmd_status_rsp ,
2071
+ & status );
2079
2072
return ;
2080
2073
}
2081
2074
2082
- mgmt_pending_foreach (MGMT_OP_SET_LE , hdev , settings_rsp , & match );
2075
+ mgmt_pending_foreach (MGMT_OP_SET_LE , hdev , true, settings_rsp , & match );
2083
2076
2084
2077
new_settings (hdev , match .sk );
2085
2078
@@ -2138,7 +2131,7 @@ static void set_mesh_complete(struct hci_dev *hdev, void *data, int err)
2138
2131
struct sock * sk = cmd -> sk ;
2139
2132
2140
2133
if (status ) {
2141
- mgmt_pending_foreach (MGMT_OP_SET_MESH_RECEIVER , hdev ,
2134
+ mgmt_pending_foreach (MGMT_OP_SET_MESH_RECEIVER , hdev , true,
2142
2135
cmd_status_rsp , & status );
2143
2136
return ;
2144
2137
}
@@ -2638,7 +2631,7 @@ static void mgmt_class_complete(struct hci_dev *hdev, void *data, int err)
2638
2631
2639
2632
bt_dev_dbg (hdev , "err %d" , err );
2640
2633
2641
- mgmt_cmd_complete (cmd -> sk , cmd -> index , cmd -> opcode ,
2634
+ mgmt_cmd_complete (cmd -> sk , cmd -> hdev -> id , cmd -> opcode ,
2642
2635
mgmt_status (err ), hdev -> dev_class , 3 );
2643
2636
2644
2637
mgmt_pending_free (cmd );
@@ -3427,7 +3420,7 @@ static int pairing_complete(struct mgmt_pending_cmd *cmd, u8 status)
3427
3420
bacpy (& rp .addr .bdaddr , & conn -> dst );
3428
3421
rp .addr .type = link_to_bdaddr (conn -> type , conn -> dst_type );
3429
3422
3430
- err = mgmt_cmd_complete (cmd -> sk , cmd -> index , MGMT_OP_PAIR_DEVICE ,
3423
+ err = mgmt_cmd_complete (cmd -> sk , cmd -> hdev -> id , MGMT_OP_PAIR_DEVICE ,
3431
3424
status , & rp , sizeof (rp ));
3432
3425
3433
3426
/* So we don't get further callbacks for this connection */
@@ -5186,7 +5179,7 @@ static void mgmt_add_adv_patterns_monitor_complete(struct hci_dev *hdev,
5186
5179
hci_update_passive_scan (hdev );
5187
5180
}
5188
5181
5189
- mgmt_cmd_complete (cmd -> sk , cmd -> index , cmd -> opcode ,
5182
+ mgmt_cmd_complete (cmd -> sk , cmd -> hdev -> id , cmd -> opcode ,
5190
5183
mgmt_status (status ), & rp , sizeof (rp ));
5191
5184
mgmt_pending_remove (cmd );
5192
5185
@@ -5401,7 +5394,7 @@ static void mgmt_remove_adv_monitor_complete(struct hci_dev *hdev,
5401
5394
hci_update_passive_scan (hdev );
5402
5395
}
5403
5396
5404
- mgmt_cmd_complete (cmd -> sk , cmd -> index , cmd -> opcode ,
5397
+ mgmt_cmd_complete (cmd -> sk , cmd -> hdev -> id , cmd -> opcode ,
5405
5398
mgmt_status (status ), & rp , sizeof (rp ));
5406
5399
mgmt_pending_free (cmd );
5407
5400
@@ -5777,7 +5770,7 @@ static void start_discovery_complete(struct hci_dev *hdev, void *data, int err)
5777
5770
cmd != pending_find (MGMT_OP_START_SERVICE_DISCOVERY , hdev ))
5778
5771
return ;
5779
5772
5780
- mgmt_cmd_complete (cmd -> sk , cmd -> index , cmd -> opcode , mgmt_status (err ),
5773
+ mgmt_cmd_complete (cmd -> sk , cmd -> hdev -> id , cmd -> opcode , mgmt_status (err ),
5781
5774
cmd -> param , 1 );
5782
5775
mgmt_pending_remove (cmd );
5783
5776
@@ -5998,7 +5991,7 @@ static void stop_discovery_complete(struct hci_dev *hdev, void *data, int err)
5998
5991
5999
5992
bt_dev_dbg (hdev , "err %d" , err );
6000
5993
6001
- mgmt_cmd_complete (cmd -> sk , cmd -> index , cmd -> opcode , mgmt_status (err ),
5994
+ mgmt_cmd_complete (cmd -> sk , cmd -> hdev -> id , cmd -> opcode , mgmt_status (err ),
6002
5995
cmd -> param , 1 );
6003
5996
mgmt_pending_remove (cmd );
6004
5997
@@ -6223,7 +6216,7 @@ static void set_advertising_complete(struct hci_dev *hdev, void *data, int err)
6223
6216
u8 status = mgmt_status (err );
6224
6217
6225
6218
if (status ) {
6226
- mgmt_pending_foreach (MGMT_OP_SET_ADVERTISING , hdev ,
6219
+ mgmt_pending_foreach (MGMT_OP_SET_ADVERTISING , hdev , true,
6227
6220
cmd_status_rsp , & status );
6228
6221
return ;
6229
6222
}
@@ -6233,7 +6226,7 @@ static void set_advertising_complete(struct hci_dev *hdev, void *data, int err)
6233
6226
else
6234
6227
hci_dev_clear_flag (hdev , HCI_ADVERTISING );
6235
6228
6236
- mgmt_pending_foreach (MGMT_OP_SET_ADVERTISING , hdev , settings_rsp ,
6229
+ mgmt_pending_foreach (MGMT_OP_SET_ADVERTISING , hdev , true, settings_rsp ,
6237
6230
& match );
6238
6231
6239
6232
new_settings (hdev , match .sk );
@@ -6577,7 +6570,7 @@ static void set_bredr_complete(struct hci_dev *hdev, void *data, int err)
6577
6570
*/
6578
6571
hci_dev_clear_flag (hdev , HCI_BREDR_ENABLED );
6579
6572
6580
- mgmt_cmd_status (cmd -> sk , cmd -> index , cmd -> opcode , mgmt_err );
6573
+ mgmt_cmd_status (cmd -> sk , cmd -> hdev -> id , cmd -> opcode , mgmt_err );
6581
6574
} else {
6582
6575
send_settings_rsp (cmd -> sk , MGMT_OP_SET_BREDR , hdev );
6583
6576
new_settings (hdev , cmd -> sk );
@@ -6714,7 +6707,7 @@ static void set_secure_conn_complete(struct hci_dev *hdev, void *data, int err)
6714
6707
if (err ) {
6715
6708
u8 mgmt_err = mgmt_status (err );
6716
6709
6717
- mgmt_cmd_status (cmd -> sk , cmd -> index , cmd -> opcode , mgmt_err );
6710
+ mgmt_cmd_status (cmd -> sk , cmd -> hdev -> id , cmd -> opcode , mgmt_err );
6718
6711
goto done ;
6719
6712
}
6720
6713
@@ -7161,7 +7154,7 @@ static void get_conn_info_complete(struct hci_dev *hdev, void *data, int err)
7161
7154
rp .max_tx_power = HCI_TX_POWER_INVALID ;
7162
7155
}
7163
7156
7164
- mgmt_cmd_complete (cmd -> sk , cmd -> index , MGMT_OP_GET_CONN_INFO , status ,
7157
+ mgmt_cmd_complete (cmd -> sk , cmd -> hdev -> id , MGMT_OP_GET_CONN_INFO , status ,
7165
7158
& rp , sizeof (rp ));
7166
7159
7167
7160
mgmt_pending_free (cmd );
@@ -7321,7 +7314,7 @@ static void get_clock_info_complete(struct hci_dev *hdev, void *data, int err)
7321
7314
}
7322
7315
7323
7316
complete :
7324
- mgmt_cmd_complete (cmd -> sk , cmd -> index , cmd -> opcode , status , & rp ,
7317
+ mgmt_cmd_complete (cmd -> sk , cmd -> hdev -> id , cmd -> opcode , status , & rp ,
7325
7318
sizeof (rp ));
7326
7319
7327
7320
mgmt_pending_free (cmd );
@@ -8571,10 +8564,10 @@ static void add_advertising_complete(struct hci_dev *hdev, void *data, int err)
8571
8564
rp .instance = cp -> instance ;
8572
8565
8573
8566
if (err )
8574
- mgmt_cmd_status (cmd -> sk , cmd -> index , cmd -> opcode ,
8567
+ mgmt_cmd_status (cmd -> sk , cmd -> hdev -> id , cmd -> opcode ,
8575
8568
mgmt_status (err ));
8576
8569
else
8577
- mgmt_cmd_complete (cmd -> sk , cmd -> index , cmd -> opcode ,
8570
+ mgmt_cmd_complete (cmd -> sk , cmd -> hdev -> id , cmd -> opcode ,
8578
8571
mgmt_status (err ), & rp , sizeof (rp ));
8579
8572
8580
8573
add_adv_complete (hdev , cmd -> sk , cp -> instance , err );
@@ -8762,10 +8755,10 @@ static void add_ext_adv_params_complete(struct hci_dev *hdev, void *data,
8762
8755
8763
8756
hci_remove_adv_instance (hdev , cp -> instance );
8764
8757
8765
- mgmt_cmd_status (cmd -> sk , cmd -> index , cmd -> opcode ,
8758
+ mgmt_cmd_status (cmd -> sk , cmd -> hdev -> id , cmd -> opcode ,
8766
8759
mgmt_status (err ));
8767
8760
} else {
8768
- mgmt_cmd_complete (cmd -> sk , cmd -> index , cmd -> opcode ,
8761
+ mgmt_cmd_complete (cmd -> sk , cmd -> hdev -> id , cmd -> opcode ,
8769
8762
mgmt_status (err ), & rp , sizeof (rp ));
8770
8763
}
8771
8764
@@ -8912,10 +8905,10 @@ static void add_ext_adv_data_complete(struct hci_dev *hdev, void *data, int err)
8912
8905
rp .instance = cp -> instance ;
8913
8906
8914
8907
if (err )
8915
- mgmt_cmd_status (cmd -> sk , cmd -> index , cmd -> opcode ,
8908
+ mgmt_cmd_status (cmd -> sk , cmd -> hdev -> id , cmd -> opcode ,
8916
8909
mgmt_status (err ));
8917
8910
else
8918
- mgmt_cmd_complete (cmd -> sk , cmd -> index , cmd -> opcode ,
8911
+ mgmt_cmd_complete (cmd -> sk , cmd -> hdev -> id , cmd -> opcode ,
8919
8912
mgmt_status (err ), & rp , sizeof (rp ));
8920
8913
8921
8914
mgmt_pending_free (cmd );
@@ -9074,10 +9067,10 @@ static void remove_advertising_complete(struct hci_dev *hdev, void *data,
9074
9067
rp .instance = cp -> instance ;
9075
9068
9076
9069
if (err )
9077
- mgmt_cmd_status (cmd -> sk , cmd -> index , cmd -> opcode ,
9070
+ mgmt_cmd_status (cmd -> sk , cmd -> hdev -> id , cmd -> opcode ,
9078
9071
mgmt_status (err ));
9079
9072
else
9080
- mgmt_cmd_complete (cmd -> sk , cmd -> index , cmd -> opcode ,
9073
+ mgmt_cmd_complete (cmd -> sk , cmd -> hdev -> id , cmd -> opcode ,
9081
9074
MGMT_STATUS_SUCCESS , & rp , sizeof (rp ));
9082
9075
9083
9076
mgmt_pending_free (cmd );
@@ -9349,7 +9342,7 @@ void mgmt_index_removed(struct hci_dev *hdev)
9349
9342
if (test_bit (HCI_QUIRK_RAW_DEVICE , & hdev -> quirks ))
9350
9343
return ;
9351
9344
9352
- mgmt_pending_foreach (0 , hdev , cmd_complete_rsp , & match );
9345
+ mgmt_pending_foreach (0 , hdev , true, cmd_complete_rsp , & match );
9353
9346
9354
9347
if (hci_dev_test_flag (hdev , HCI_UNCONFIGURED )) {
9355
9348
mgmt_index_event (MGMT_EV_UNCONF_INDEX_REMOVED , hdev , NULL , 0 ,
@@ -9387,7 +9380,8 @@ void mgmt_power_on(struct hci_dev *hdev, int err)
9387
9380
hci_update_passive_scan (hdev );
9388
9381
}
9389
9382
9390
- mgmt_pending_foreach (MGMT_OP_SET_POWERED , hdev , settings_rsp , & match );
9383
+ mgmt_pending_foreach (MGMT_OP_SET_POWERED , hdev , true, settings_rsp ,
9384
+ & match );
9391
9385
9392
9386
new_settings (hdev , match .sk );
9393
9387
@@ -9402,7 +9396,8 @@ void __mgmt_power_off(struct hci_dev *hdev)
9402
9396
struct cmd_lookup match = { NULL , hdev };
9403
9397
u8 zero_cod [] = { 0 , 0 , 0 };
9404
9398
9405
- mgmt_pending_foreach (MGMT_OP_SET_POWERED , hdev , settings_rsp , & match );
9399
+ mgmt_pending_foreach (MGMT_OP_SET_POWERED , hdev , true, settings_rsp ,
9400
+ & match );
9406
9401
9407
9402
/* If the power off is because of hdev unregistration let
9408
9403
* use the appropriate INVALID_INDEX status. Otherwise use
@@ -9416,7 +9411,7 @@ void __mgmt_power_off(struct hci_dev *hdev)
9416
9411
else
9417
9412
match .mgmt_status = MGMT_STATUS_NOT_POWERED ;
9418
9413
9419
- mgmt_pending_foreach (0 , hdev , cmd_complete_rsp , & match );
9414
+ mgmt_pending_foreach (0 , hdev , true, cmd_complete_rsp , & match );
9420
9415
9421
9416
if (memcmp (hdev -> dev_class , zero_cod , sizeof (zero_cod )) != 0 ) {
9422
9417
mgmt_limited_event (MGMT_EV_CLASS_OF_DEV_CHANGED , hdev ,
@@ -9657,7 +9652,6 @@ static void unpair_device_rsp(struct mgmt_pending_cmd *cmd, void *data)
9657
9652
device_unpaired (hdev , & cp -> addr .bdaddr , cp -> addr .type , cmd -> sk );
9658
9653
9659
9654
cmd -> cmd_complete (cmd , 0 );
9660
- mgmt_pending_remove (cmd );
9661
9655
}
9662
9656
9663
9657
bool mgmt_powering_down (struct hci_dev * hdev )
@@ -9713,8 +9707,8 @@ void mgmt_disconnect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr,
9713
9707
struct mgmt_cp_disconnect * cp ;
9714
9708
struct mgmt_pending_cmd * cmd ;
9715
9709
9716
- mgmt_pending_foreach (MGMT_OP_UNPAIR_DEVICE , hdev , unpair_device_rsp ,
9717
- hdev );
9710
+ mgmt_pending_foreach (MGMT_OP_UNPAIR_DEVICE , hdev , true ,
9711
+ unpair_device_rsp , hdev );
9718
9712
9719
9713
cmd = pending_find (MGMT_OP_DISCONNECT , hdev );
9720
9714
if (!cmd )
@@ -9907,7 +9901,7 @@ void mgmt_auth_enable_complete(struct hci_dev *hdev, u8 status)
9907
9901
9908
9902
if (status ) {
9909
9903
u8 mgmt_err = mgmt_status (status );
9910
- mgmt_pending_foreach (MGMT_OP_SET_LINK_SECURITY , hdev ,
9904
+ mgmt_pending_foreach (MGMT_OP_SET_LINK_SECURITY , hdev , true,
9911
9905
cmd_status_rsp , & mgmt_err );
9912
9906
return ;
9913
9907
}
@@ -9917,8 +9911,8 @@ void mgmt_auth_enable_complete(struct hci_dev *hdev, u8 status)
9917
9911
else
9918
9912
changed = hci_dev_test_and_clear_flag (hdev , HCI_LINK_SECURITY );
9919
9913
9920
- mgmt_pending_foreach (MGMT_OP_SET_LINK_SECURITY , hdev , settings_rsp ,
9921
- & match );
9914
+ mgmt_pending_foreach (MGMT_OP_SET_LINK_SECURITY , hdev , true ,
9915
+ settings_rsp , & match );
9922
9916
9923
9917
if (changed )
9924
9918
new_settings (hdev , match .sk );
@@ -9942,9 +9936,12 @@ void mgmt_set_class_of_dev_complete(struct hci_dev *hdev, u8 *dev_class,
9942
9936
{
9943
9937
struct cmd_lookup match = { NULL , hdev , mgmt_status (status ) };
9944
9938
9945
- mgmt_pending_foreach (MGMT_OP_SET_DEV_CLASS , hdev , sk_lookup , & match );
9946
- mgmt_pending_foreach (MGMT_OP_ADD_UUID , hdev , sk_lookup , & match );
9947
- mgmt_pending_foreach (MGMT_OP_REMOVE_UUID , hdev , sk_lookup , & match );
9939
+ mgmt_pending_foreach (MGMT_OP_SET_DEV_CLASS , hdev , false, sk_lookup ,
9940
+ & match );
9941
+ mgmt_pending_foreach (MGMT_OP_ADD_UUID , hdev , false, sk_lookup ,
9942
+ & match );
9943
+ mgmt_pending_foreach (MGMT_OP_REMOVE_UUID , hdev , false, sk_lookup ,
9944
+ & match );
9948
9945
9949
9946
if (!status ) {
9950
9947
mgmt_limited_event (MGMT_EV_CLASS_OF_DEV_CHANGED , hdev , dev_class ,
0 commit comments