1- /* Copyright (c) 2008-2014, The Linux Foundation. All rights reserved.
1+ /* Copyright (c) 2008-2014, 2017 The Linux Foundation. All rights reserved.
22 *
33 * This program is free software; you can redistribute it and/or modify
44 * it under the terms of the GNU General Public License version 2 and
@@ -248,7 +248,7 @@ static void diag_send_msg_mask_update(struct diag_smd_info *smd_info,
248248 uint8_t * buf = msg_mask .update_buf ;
249249 uint8_t * temp = NULL ;
250250 uint32_t mask_size = 0 ;
251- struct diag_msg_mask_t * mask = ( struct diag_msg_mask_t * ) msg_mask . ptr ;
251+ struct diag_msg_mask_t * mask ;
252252 struct diag_ctrl_msg_mask header ;
253253
254254 if (!smd_info )
@@ -259,7 +259,8 @@ static void diag_send_msg_mask_update(struct diag_smd_info *smd_info,
259259 __func__ , smd_info -> peripheral );
260260 return ;
261261 }
262-
262+ mutex_lock (& driver -> msg_mask_lock );
263+ mask = (struct diag_msg_mask_t * )msg_mask .ptr ;
263264 mutex_lock (& msg_mask .lock );
264265 switch (msg_mask .status ) {
265266 case DIAG_CTRL_MASK_ALL_DISABLED :
@@ -328,6 +329,7 @@ static void diag_send_msg_mask_update(struct diag_smd_info *smd_info,
328329 }
329330err :
330331 mutex_unlock (& msg_mask .lock );
332+ mutex_unlock (& driver -> msg_mask_lock );
331333}
332334
333335static void diag_send_feature_mask_update (struct diag_smd_info * smd_info )
@@ -394,7 +396,7 @@ static int diag_cmd_get_ssid_range(unsigned char *src_buf, int src_len,
394396
395397 if (!diag_apps_responds ())
396398 return 0 ;
397-
399+ mutex_lock ( & driver -> msg_mask_lock );
398400 rsp .cmd_code = DIAG_CMD_MSG_CONFIG ;
399401 rsp .sub_cmd = DIAG_CMD_OP_GET_SSID_RANGE ;
400402 rsp .status = MSG_STATUS_SUCCESS ;
@@ -415,6 +417,7 @@ static int diag_cmd_get_ssid_range(unsigned char *src_buf, int src_len,
415417 memcpy (dest_buf + write_len , & ssid_range , sizeof (ssid_range ));
416418 write_len += sizeof (ssid_range );
417419 }
420+ mutex_unlock (& driver -> msg_mask_lock );
418421
419422 return write_len ;
420423}
@@ -439,6 +442,7 @@ static int diag_cmd_get_build_mask(unsigned char *src_buf, int src_len,
439442 if (!diag_apps_responds ())
440443 return 0 ;
441444
445+ mutex_lock (& driver -> msg_mask_lock );
442446 req = (struct diag_build_mask_req_t * )src_buf ;
443447 rsp .cmd_code = DIAG_CMD_MSG_CONFIG ;
444448 rsp .sub_cmd = DIAG_CMD_OP_GET_BUILD_MASK ;
@@ -469,6 +473,7 @@ static int diag_cmd_get_build_mask(unsigned char *src_buf, int src_len,
469473 }
470474 memcpy (dest_buf , & rsp , sizeof (rsp ));
471475 write_len += sizeof (rsp );
476+ mutex_unlock (& driver -> msg_mask_lock );
472477
473478 return write_len ;
474479}
@@ -491,7 +496,7 @@ static int diag_cmd_get_msg_mask(unsigned char *src_buf, int src_len,
491496
492497 if (!diag_apps_responds ())
493498 return 0 ;
494-
499+ mutex_lock ( & driver -> msg_mask_lock );
495500 req = (struct diag_build_mask_req_t * )src_buf ;
496501 rsp .cmd_code = DIAG_CMD_MSG_CONFIG ;
497502 rsp .sub_cmd = DIAG_CMD_OP_GET_MSG_MASK ;
@@ -517,6 +522,7 @@ static int diag_cmd_get_msg_mask(unsigned char *src_buf, int src_len,
517522 }
518523 memcpy (dest_buf , & rsp , sizeof (rsp ));
519524 write_len += sizeof (rsp );
525+ mutex_unlock (& driver -> msg_mask_lock );
520526
521527 return write_len ;
522528}
@@ -541,7 +547,7 @@ static int diag_cmd_set_msg_mask(unsigned char *src_buf, int src_len,
541547 }
542548
543549 req = (struct diag_msg_build_mask_t * )src_buf ;
544-
550+ mutex_lock ( & driver -> msg_mask_lock );
545551 mutex_lock (& msg_mask .lock );
546552 mask = (struct diag_msg_mask_t * )msg_mask .ptr ;
547553 for (i = 0 ; i < driver -> msg_mask_tbl_count ; i ++ , mask ++ ) {
@@ -574,6 +580,7 @@ static int diag_cmd_set_msg_mask(unsigned char *src_buf, int src_len,
574580 break ;
575581 }
576582 mutex_unlock (& msg_mask .lock );
583+ mutex_unlock (& driver -> msg_mask_lock );
577584
578585 diag_update_userspace_clients (MSG_MASKS_TYPE );
579586
@@ -620,7 +627,7 @@ static int diag_cmd_set_all_msg_mask(unsigned char *src_buf, int src_len,
620627 }
621628
622629 req = (struct diag_msg_config_rsp_t * )src_buf ;
623-
630+ mutex_lock ( & driver -> msg_mask_lock );
624631 mutex_lock (& msg_mask .lock );
625632 msg_mask .status = (req -> rt_mask ) ? DIAG_CTRL_MASK_ALL_ENABLED :
626633 DIAG_CTRL_MASK_ALL_DISABLED ;
@@ -629,6 +636,7 @@ static int diag_cmd_set_all_msg_mask(unsigned char *src_buf, int src_len,
629636 mask -> range * sizeof (uint32_t ));
630637 }
631638 mutex_unlock (& msg_mask .lock );
639+ mutex_unlock (& driver -> msg_mask_lock );
632640
633641 diag_update_userspace_clients (MSG_MASKS_TYPE );
634642
@@ -1037,6 +1045,7 @@ static int diag_create_msg_mask_table(void)
10371045 struct diag_msg_mask_t * mask = (struct diag_msg_mask_t * )msg_mask .ptr ;
10381046 struct diag_ssid_range_t range ;
10391047
1048+ mutex_lock (& driver -> msg_mask_lock );
10401049 mutex_lock (& msg_mask .lock );
10411050 driver -> msg_mask_tbl_count = MSG_MASK_TBL_CNT ;
10421051 for (i = 0 ; i < driver -> msg_mask_tbl_count ; i ++ , mask ++ ) {
@@ -1047,6 +1056,8 @@ static int diag_create_msg_mask_table(void)
10471056 break ;
10481057 }
10491058 mutex_unlock (& msg_mask .lock );
1059+ mutex_unlock (& driver -> msg_mask_lock );
1060+
10501061 return err ;
10511062}
10521063
@@ -1059,6 +1070,7 @@ static int diag_create_build_time_mask(void)
10591070 struct diag_msg_mask_t * build_mask = NULL ;
10601071 struct diag_ssid_range_t range ;
10611072
1073+ mutex_lock (& driver -> msg_mask_lock );
10621074 mutex_lock (& msg_bt_mask .lock );
10631075 build_mask = (struct diag_msg_mask_t * )msg_bt_mask .ptr ;
10641076 for (i = 0 ; i < driver -> msg_mask_tbl_count ; i ++ , build_mask ++ ) {
@@ -1172,6 +1184,7 @@ static int diag_create_build_time_mask(void)
11721184 memcpy (build_mask -> ptr , tbl , tbl_size );
11731185 }
11741186 mutex_unlock (& msg_bt_mask .lock );
1187+ mutex_unlock (& driver -> msg_mask_lock );
11751188
11761189 return err ;
11771190}
@@ -1242,10 +1255,12 @@ static int diag_msg_mask_init(void)
12421255 pr_err ("diag: Unable to create msg masks, err: %d\n" , err );
12431256 return err ;
12441257 }
1258+ mutex_lock (& driver -> msg_mask_lock );
12451259 driver -> msg_mask = & msg_mask ;
12461260
12471261 for (i = 0 ; i < NUM_SMD_CONTROL_CHANNELS ; i ++ )
12481262 driver -> max_ssid_count [i ] = 0 ;
1263+ mutex_unlock (& driver -> msg_mask_lock );
12491264
12501265 return 0 ;
12511266}
@@ -1255,14 +1270,17 @@ static void diag_msg_mask_exit(void)
12551270 int i ;
12561271 struct diag_msg_mask_t * mask = NULL ;
12571272
1273+ mutex_lock (& driver -> msg_mask_lock );
12581274 mask = (struct diag_msg_mask_t * )(msg_mask .ptr );
12591275 if (mask ) {
12601276 for (i = 0 ; i < driver -> msg_mask_tbl_count ; i ++ , mask ++ )
12611277 kfree (mask -> ptr );
12621278 kfree (msg_mask .ptr );
1279+ msg_mask .ptr = NULL ;
12631280 }
1264-
12651281 kfree (msg_mask .update_buf );
1282+ msg_mask .update_buf = NULL ;
1283+ mutex_unlock (& driver -> msg_mask_lock );
12661284}
12671285
12681286static int diag_build_time_mask_init (void )
@@ -1287,13 +1305,15 @@ static void diag_build_time_mask_exit(void)
12871305{
12881306 int i ;
12891307 struct diag_msg_mask_t * mask = NULL ;
1290-
1308+ mutex_lock ( & driver -> msg_mask_lock );
12911309 mask = (struct diag_msg_mask_t * )(msg_bt_mask .ptr );
12921310 if (mask ) {
1293- for (i = 0 ; i < driver -> msg_mask_tbl_count ; i ++ , mask ++ )
1311+ for (i = 0 ; i < driver -> bt_msg_mask_tbl_count ; i ++ , mask ++ )
12941312 kfree (mask -> ptr );
1295- kfree (msg_mask .ptr );
1313+ kfree (msg_bt_mask .ptr );
1314+ msg_bt_mask .ptr = NULL ;
12961315 }
1316+ mutex_unlock (& driver -> msg_mask_lock );
12971317}
12981318
12991319static int diag_log_mask_init (void )
@@ -1367,7 +1387,7 @@ int diag_copy_to_user_msg_mask(char __user *buf, size_t count)
13671387
13681388 if (!buf || count == 0 )
13691389 return - EINVAL ;
1370-
1390+ mutex_lock ( & driver -> msg_mask_lock );
13711391 mutex_lock (& msg_mask .lock );
13721392 mask = (struct diag_msg_mask_t * )(msg_mask .ptr );
13731393 for (i = 0 ; i < driver -> msg_mask_tbl_count ; i ++ , mask ++ ) {
@@ -1402,6 +1422,7 @@ int diag_copy_to_user_msg_mask(char __user *buf, size_t count)
14021422 total_len += len ;
14031423 }
14041424 mutex_unlock (& msg_mask .lock );
1425+ mutex_unlock (& driver -> msg_mask_lock );
14051426
14061427 return err ? err : total_len ;
14071428}
0 commit comments