1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
|
#define VERSION_ERROR_STRINTG "Current driver doesn't support the requested firmware"
enum {
OP_STATION_MODE = 0,
OP_AP_MODE,
OP_P2P,
OP_MAX
};
struct nmc_version {
char driver_ver[10]; // wifi driver version
char op_mode; // wifi mode
char fw_ver[10]; // wifi firmware version
u32 fw_size; // wifi firmware size
};
static struct nmc_version nmc_ver_list[] =
{
{ "9.3.0", STATION_MODE, "0", 143808},
{ "9.3.0", AP_MODE, "0", 111416},
{ "9.3.0", GO_MODE|CLIENT_MODE, "0", 141944},
{ "9.3.0", STATION_MODE, "1", 143816},
{ "9.3.0", AP_MODE, "1", 111420},
{ "9.3.0", GO_MODE|CLIENT_MODE, "1", 141864},
{ "9.3.1", STATION_MODE, "0", 143808},
{ "9.3.1", AP_MODE, "0", 111416},
{ "9.3.1", GO_MODE|CLIENT_MODE, "0", 141944},
{ "9.3.1", STATION_MODE, "1", 143816},
{ "9.3.1", AP_MODE, "1", 111420},
{ "9.3.1", GO_MODE|CLIENT_MODE, "1", 141864},
{ "9.3.2", STATION_MODE, "0", 143832},
{ "9.3.2", AP_MODE, "0", 111448},
{ "9.3.2", GO_MODE|CLIENT_MODE, "0", 141876},
{ "9.3.3", STATION_MODE, "0", 144012},
{ "9.3.3", AP_MODE, "0", 112432},
{ "9.3.3", GO_MODE|CLIENT_MODE, "0", 142084},
};
int check_firmware_version(char iftype, char* driver_version, u32 given_firmware_size)
{
int ret = -1;
int i = 0;
int cnt = 0;
cnt = sizeof(nmc_ver_list)/sizeof(struct nmc_version);
if ( ( iftype == 0 ) || ( driver_version == NULL ) || ( given_firmware_size == 0 ) )
{
printk("[NMI] invaild arguments\n");
return -1;
}
printk("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n");
printk("[NMI] iftype = %d, driver_version = %s, given_firmware_size = %d, nmc_ver_list count = %d\n", iftype, driver_version, given_firmware_size, cnt);
switch (iftype)
{
case STATION_MODE:
for ( i = OP_STATION_MODE ; i < cnt ; i += OP_MAX )
{
if ( strcmp(nmc_ver_list[i].driver_ver, driver_version) == 0 )
{
if ( nmc_ver_list[i].fw_size == given_firmware_size )
{
printk("[NMI][STATION_MODE] : firmware version level = %s for %s driver\n",nmc_ver_list[i].fw_ver, nmc_ver_list[i].driver_ver);
return ret = 0;
}
}
}
printk("[NMI][OP_STATION_MODE] : %s\n",VERSION_ERROR_STRINTG);
ret = -1;
break;
case AP_MODE:
for ( i = OP_AP_MODE ; i < cnt ; i += OP_MAX )
{
if ( strcmp(nmc_ver_list[i].driver_ver, driver_version) == 0 )
{
if ( nmc_ver_list[i].fw_size == given_firmware_size )
{
printk("[NMI][OP_AP_MODE] :firmware version level = %s for %s driver\n",nmc_ver_list[i].fw_ver, nmc_ver_list[i].driver_ver);
return ret = 0;
}
}
}
printk("[NMI][OP_AP_MODE] : %s\n",VERSION_ERROR_STRINTG);
ret = -1;
break;
case GO_MODE:
case CLIENT_MODE:
for ( i = OP_P2P ; i < cnt ; i += OP_MAX )
{
if ( strcmp(nmc_ver_list[i].driver_ver, driver_version) == 0 )
{
if ( nmc_ver_list[i].fw_size == given_firmware_size )
{
printk("[NMI][OP_P2P] : firmware version level = %s for %s driver\n",nmc_ver_list[i].fw_ver, nmc_ver_list[i].driver_ver);
return ret = 0;
}
}
}
printk("[NMI][OP_P2P] : %s\n",VERSION_ERROR_STRINTG);
ret = -1;
break;
default:
printk("[NMI][UNKNOWN Mode] : %s\n",VERSION_ERROR_STRINTG);
ret = -1;
break;
}
return ret;
}
|