1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16#include "csr_wifi_hip_unifi.h"
17#include "unifi_priv.h"
18
19
20#define MAX_INIT_ATTEMPTS 4
21
22extern int led_mask;
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46int
47uf_init_hw(unifi_priv_t *priv)
48{
49 int attempts = 0;
50 int priv_instance;
51 CsrResult csrResult = CSR_RESULT_FAILURE;
52
53 priv_instance = uf_find_priv(priv);
54 if (priv_instance == -1) {
55 unifi_warning(priv, "uf_init_hw: Unknown priv instance, will use fw_init[0]\n");
56 priv_instance = 0;
57 }
58
59 while (1) {
60 if (attempts > MAX_INIT_ATTEMPTS) {
61 unifi_error(priv, "Failed to initialise UniFi after %d attempts, "
62 "giving up.\n",
63 attempts);
64 break;
65 }
66 attempts++;
67
68 unifi_info(priv, "Initialising UniFi, attempt %d\n", attempts);
69
70 if (fw_init[priv_instance] > 0) {
71 unifi_notice(priv, "f/w init prevented by module parameter\n");
72 break;
73 } else if (fw_init[priv_instance] == 0) {
74 fw_init[priv_instance] ++;
75 }
76
77
78
79
80
81 CsrSdioClaim(priv->sdio);
82 csrResult = unifi_init_card(priv->card, led_mask);
83 CsrSdioRelease(priv->sdio);
84
85 if (csrResult == CSR_WIFI_HIP_RESULT_NO_DEVICE) {
86 return CsrHipResultToStatus(csrResult);
87 }
88 if (csrResult == CSR_WIFI_HIP_RESULT_NOT_FOUND) {
89 unifi_error(priv, "Firmware file required, but not found.\n");
90 return CsrHipResultToStatus(csrResult);
91 }
92 if (csrResult != CSR_RESULT_SUCCESS) {
93
94 unifi_error(priv, "Failed to initialise UniFi chip.\n");
95 continue;
96 }
97
98
99 unifi_card_info(priv->card, &priv->card_info);
100
101 return CsrHipResultToStatus(csrResult);
102 }
103
104 return CsrHipResultToStatus(csrResult);
105
106}
107
108
109