Skip to content

Commit 254528c

Browse files
committed
alsactl: fix sequence to clean card specific config files for UCM
For UCM, card-specific config files should be removed only when the fixed boot flag is set or if the card is not the primary card in a given card group. Signed-off-by: Jaroslav Kysela <[email protected]>
1 parent 120568f commit 254528c

File tree

4 files changed

+31
-14
lines changed

4 files changed

+31
-14
lines changed

alsactl/alsactl.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ int snd_card_iterator_error(struct snd_card_iterator *iter);
6868

6969
int load_configuration(const char *file, snd_config_t **top, int *open_failed);
7070
int init(const char *cfgdir, const char *file, int flags, const char *cardname);
71-
int init_ucm(int flags, int cardno);
71+
int init_ucm(const char *cfgdir, int flags, int cardno);
7272
bool validate_boot_time(long long boot_time, long long current_time, long long synctime);
7373
int read_boot_params(snd_ctl_t *handle, long long *boot_time, long long *sync_time, long long *restore_time, long long *primary_card);
7474
int write_boot_params(snd_ctl_t *handle, long long boot_time, long long sync_time, long long restore_time, long long primary_card);

alsactl/init_parse.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1761,7 +1761,7 @@ int init(const char *cfgdir, const char *filename, int flags, const char *cardna
17611761
lasterr = err;
17621762
continue;
17631763
}
1764-
err = init_ucm(flags, iter.card);
1764+
err = init_ucm(cfgdir, flags, iter.card);
17651765
if (err == 0 || card_state_is_okay(err))
17661766
continue;
17671767
err = init_space(&space, iter.card);

alsactl/init_ucm.c

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -137,11 +137,17 @@ static int reopen_ucm_manager(snd_use_case_mgr_t **uc_mgr, int cardno, int flags
137137
* Helper: Execute boot sequences
138138
* Returns: 0 on success, negative on error
139139
*/
140-
static int execute_boot_sequences(snd_use_case_mgr_t *uc_mgr, int flags, bool fixed_boot)
140+
static int execute_boot_sequences(const char *cfgdir, snd_use_case_mgr_t *uc_mgr,
141+
int cardno, int flags, bool fixed_boot)
141142
{
142143
int err = 0;
143144

144145
if (fixed_boot) {
146+
err = snd_card_clean_cfgdir(cfgdir, cardno);
147+
if (err < 0) {
148+
dbg("ucm clean cfgdir: %d", err);
149+
return err;
150+
}
145151
err = snd_use_case_set(uc_mgr, "_fboot", NULL);
146152
dbg("ucm _fboot: %d", err);
147153
if (err == -ENOENT && (flags & FLAG_UCM_BOOT) != 0) {
@@ -170,7 +176,7 @@ static int execute_boot_sequences(snd_use_case_mgr_t *uc_mgr, int flags, bool fi
170176
* Handle also card groups.
171177
* Returns: 0 = success, 1 = skip this card (e.g. linked or in-sync), negative on error
172178
*/
173-
int init_ucm(int flags, int cardno)
179+
int init_ucm(const char *cfgdir, int flags, int cardno)
174180
{
175181
snd_use_case_mgr_t *uc_mgr;
176182
char id[64];
@@ -268,7 +274,7 @@ int init_ucm(int flags, int cardno)
268274
}
269275

270276
_execute_boot:
271-
if (flags & FLAG_UCM_FBOOT)
277+
if (fixed_boot)
272278
restored = true;
273279

274280
if (boot_card_group) {
@@ -277,7 +283,7 @@ int init_ucm(int flags, int cardno)
277283
goto _error;
278284
}
279285

280-
err = execute_boot_sequences(uc_mgr, flags, fixed_boot);
286+
err = execute_boot_sequences(cfgdir, uc_mgr, cardno, flags, fixed_boot);
281287
if (err < 0)
282288
goto _error;
283289

@@ -286,6 +292,15 @@ int init_ucm(int flags, int cardno)
286292
_error:
287293
snd_use_case_mgr_close(uc_mgr);
288294
_fin:
295+
if (fixed_boot && primary_card >= 0 && primary_card != cardno) {
296+
/* remove card specific configuration files for other cards in group */
297+
int clean_err = snd_card_clean_cfgdir(cfgdir, cardno);
298+
if (clean_err < 0) {
299+
dbg("ucm clean cfgdir: %d", clean_err);
300+
if (err >= 0)
301+
err = clean_err;
302+
}
303+
}
289304
if (lock_fd >= 0)
290305
group_state_unlock(lock_fd, groupfile);
291306
if (ctl)
@@ -298,7 +313,7 @@ int init_ucm(int flags, int cardno)
298313

299314
#else
300315

301-
int init_ucm(int flags, int cardno)
316+
int init_ucm(const char *cfgdir, int flags, int cardno)
302317
{
303318
return -ENXIO;
304319
}

alsactl/state.c

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1790,18 +1790,20 @@ int load_state(const char *cfgdir, const char *file,
17901790
finalerr = lock_fd;
17911791
continue;
17921792
}
1793-
err = snd_card_clean_cfgdir(cfgdir, iter.card);
1794-
if (err < 0) {
1795-
initfailed(iter.card, "cfgdir", err);
1796-
finalerr = err;
1797-
continue;
1798-
}
17991793
/* error is ignored */
1800-
err = init_ucm(initflags | FLAG_UCM_FBOOT, iter.card);
1794+
err = init_ucm(cfgdir, initflags | FLAG_UCM_FBOOT, iter.card);
18011795
/* return code 1 and 2 -> postpone initialization */
18021796
if (card_state_is_okay(err)) {
18031797
export_card_state_set(iter.card, err);
18041798
goto unlock_card;
1799+
} else if (err < 0) {
1800+
/* no UCM - remove card specific configuration */
1801+
err = snd_card_clean_cfgdir(cfgdir, iter.card);
1802+
if (err < 0) {
1803+
initfailed(iter.card, "cfgdir", err);
1804+
finalerr = err;
1805+
continue;
1806+
}
18051807
}
18061808
/* do a check if controls matches state file */
18071809
if (do_init && set_controls(iter.card, config, 0)) {

0 commit comments

Comments
 (0)