hal: retry all of un-detected sound card

In corner case, card 0 and card1 just were
registered successfully between validation
of card 0 and card 1,so card 1 was found
first, but card 0 will be bypassed forever
with current retry method.

Retry all un-detected sound card to avoid
the issue in such corner case.

CRs-Fixed: 2381078
Change-Id: I47211afec5559a25ccddfdfb1199549d8231d566
diff --git a/hal/audio_extn/utils.c b/hal/audio_extn/utils.c
index 433743e..3b70c2b 100644
--- a/hal/audio_extn/utils.c
+++ b/hal/audio_extn/utils.c
@@ -2136,8 +2136,9 @@
     void *hw_info = NULL;
     struct mixer *mixer = NULL;
     int retry_num = 0;
-    int snd_card_num = 0, min_snd_card_num = 0;
+    int snd_card_num = 0;
     char* snd_card_name = NULL;
+    int snd_card_detection_info[MAX_SND_CARD] = {0};
 
     if (!mixer_handle) {
         ALOGE("invalid mixer handle");
@@ -2145,26 +2146,29 @@
     }
     *mixer_handle = NULL;
     /*
-    * Try with all the sound cards ( 0 to 8 ) and if none of them were detected
+    * Try with all the sound cards ( 0 to 7 ) and if none of them were detected
     * sleep for 1 sec and try detections with sound card 0 again.
     * If sound card gets detected, check if it is relevant, if not check with the
     * other sound cards. To ensure that the irrelevant sound card is not check again,
     * we maintain it in min_snd_card_num.
     */
     while (retry_num < RETRY_NUMBER) {
-
-        while (snd_card_num <= MAX_SND_CARD) {
-           mixer = mixer_open(snd_card_num);
-           if (!mixer)
-              snd_card_num++;
-           else
-              break;
+        snd_card_num = 0;
+        while (snd_card_num < MAX_SND_CARD) {
+            if (snd_card_detection_info[snd_card_num] == 0) {
+                mixer = mixer_open(snd_card_num);
+                if (!mixer)
+                    snd_card_num++;
+                else
+                    break;
+            } else
+                snd_card_num++;
         }
 
         if (!mixer) {
            usleep(RETRY_US);
-           snd_card_num = min_snd_card_num;
            retry_num++;
+           ALOGD("%s: retry, retry_num %d", __func__, retry_num);
            continue;
         }
 
@@ -2175,18 +2179,13 @@
             return -1;
         }
         ALOGD("%s: snd_card_name: %s", __func__, snd_card_name);
-
+        snd_card_detection_info[snd_card_num] = 1;
         hw_info = hw_info_init(snd_card_name);
         if (hw_info) {
             ALOGD("%s: Opened sound card:%d", __func__, snd_card_num);
             break;
         }
-        ALOGE("%s: Failed to init hardware info", __func__);
-        min_snd_card_num++;
-        snd_card_num = min_snd_card_num;
-
-        if (snd_card_num >= MAX_SND_CARD)
-            break;
+        ALOGE("%s: Failed to init hardware info, snd_card_num:%d", __func__, snd_card_num);
 
         free(snd_card_name);
         snd_card_name = NULL;
@@ -2200,7 +2199,7 @@
     if (hw_info)
         hw_info_deinit(hw_info);
 
-    if ((snd_card_num >= MAX_SND_CARD) || (retry_num >= RETRY_NUMBER)) {
+    if (retry_num >= RETRY_NUMBER) {
         ALOGE("%s: Unable to find correct sound card, aborting.", __func__);
         return -1;
     }