Blame view

drivers/staging/bcm/InterfaceDld.c 10.7 KB
f8942e07a   Stephen Hemminger   staging: Beeceem ...
1
  #include "headers.h"
43664e14a   Marcos Paulo de Souza   drivers/staging/b...
2
  int InterfaceFileDownload(PVOID arg, struct file *flp, unsigned int on_chip_loc)
f8942e07a   Stephen Hemminger   staging: Beeceem ...
3
  {
a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
4
  	/* unsigned int reg = 0; */
43664e14a   Marcos Paulo de Souza   drivers/staging/b...
5
  	mm_segment_t oldfs = {0};
a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
6
  	int errno = 0, len = 0; /* ,is_config_file = 0 */
43664e14a   Marcos Paulo de Souza   drivers/staging/b...
7
  	loff_t pos = 0;
f8942e07a   Stephen Hemminger   staging: Beeceem ...
8
  	PS_INTERFACE_ADAPTER psIntfAdapter = (PS_INTERFACE_ADAPTER)arg;
a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
9
  	/* PMINI_ADAPTER Adapter = psIntfAdapter->psAdapter; */
43664e14a   Marcos Paulo de Souza   drivers/staging/b...
10
  	char *buff = kmalloc(MAX_TRANSFER_CTRL_BYTE_USB, GFP_KERNEL);
f8942e07a   Stephen Hemminger   staging: Beeceem ...
11

43664e14a   Marcos Paulo de Souza   drivers/staging/b...
12
13
  	if (!buff)
  		return -ENOMEM;
f8942e07a   Stephen Hemminger   staging: Beeceem ...
14

43664e14a   Marcos Paulo de Souza   drivers/staging/b...
15
16
17
18
  	while (1) {
  		oldfs = get_fs();
  		set_fs(get_ds());
  		len = vfs_read(flp, (void __force __user *)buff,
a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
19
  			MAX_TRANSFER_CTRL_BYTE_USB, &pos);
43664e14a   Marcos Paulo de Souza   drivers/staging/b...
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
  		set_fs(oldfs);
  		if (len <= 0) {
  			if (len < 0) {
  				BCM_DEBUG_PRINT(psIntfAdapter->psAdapter,
  						DBG_TYPE_INITEXIT, MP_INIT,
  						DBG_LVL_ALL, "len < 0");
  				errno = len;
  			} else {
  				errno = 0;
  				BCM_DEBUG_PRINT(psIntfAdapter->psAdapter,
  						DBG_TYPE_INITEXIT, MP_INIT,
  						DBG_LVL_ALL,
  						"Got end of file!");
  			}
  			break;
  		}
  		/* BCM_DEBUG_PRINT_BUFFER(Adapter,DBG_TYPE_INITEXIT, MP_INIT,
a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
37
38
39
  		 *			  DBG_LVL_ALL, buff,
  		 *			  MAX_TRANSFER_CTRL_BYTE_USB);
  		 */
43664e14a   Marcos Paulo de Souza   drivers/staging/b...
40
41
42
43
44
45
  		errno = InterfaceWRM(psIntfAdapter, on_chip_loc, buff, len);
  		if (errno) {
  			BCM_DEBUG_PRINT(psIntfAdapter->psAdapter,
  					DBG_TYPE_PRINTK, 0, 0,
  					"WRM Failed! status: %d", errno);
  			break;
f8942e07a   Stephen Hemminger   staging: Beeceem ...
46
  		}
43664e14a   Marcos Paulo de Souza   drivers/staging/b...
47
48
  		on_chip_loc += MAX_TRANSFER_CTRL_BYTE_USB;
  	}
f8942e07a   Stephen Hemminger   staging: Beeceem ...
49

082e889b4   Stephen Hemminger   beceem: remove OS...
50
  	kfree(buff);
43664e14a   Marcos Paulo de Souza   drivers/staging/b...
51
  	return errno;
f8942e07a   Stephen Hemminger   staging: Beeceem ...
52
  }
a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
53
  int InterfaceFileReadbackFromChip(PVOID arg, struct file *flp, unsigned int on_chip_loc)
f8942e07a   Stephen Hemminger   staging: Beeceem ...
54
  {
43664e14a   Marcos Paulo de Souza   drivers/staging/b...
55
56
  	char *buff, *buff_readback;
  	unsigned int reg = 0;
a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
57
58
59
  	mm_segment_t oldfs = {0};
  	int errno = 0, len = 0, is_config_file = 0;
  	loff_t pos = 0;
a86581829   Kevin McKinney   Staging: bcm: Fix...
60
  	static int fw_down;
a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
61
  	INT Status = STATUS_SUCCESS;
f8942e07a   Stephen Hemminger   staging: Beeceem ...
62
  	PS_INTERFACE_ADAPTER psIntfAdapter = (PS_INTERFACE_ADAPTER)arg;
41c7b7c0f   Kevin McKinney   Staging: bcm: Fix...
63
  	int bytes;
f8942e07a   Stephen Hemminger   staging: Beeceem ...
64

a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
65
66
67
68
69
  	buff = kmalloc(MAX_TRANSFER_CTRL_BYTE_USB, GFP_DMA);
  	buff_readback = kmalloc(MAX_TRANSFER_CTRL_BYTE_USB , GFP_DMA);
  	if (!buff || !buff_readback) {
  		kfree(buff);
  		kfree(buff_readback);
f8942e07a   Stephen Hemminger   staging: Beeceem ...
70

a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
71
72
  		return -ENOMEM;
  	}
f8942e07a   Stephen Hemminger   staging: Beeceem ...
73

a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
74
  	is_config_file = (on_chip_loc == CONFIG_BEGIN_ADDR) ? 1 : 0;
f8942e07a   Stephen Hemminger   staging: Beeceem ...
75
76
77
  
  	memset(buff_readback, 0, MAX_TRANSFER_CTRL_BYTE_USB);
  	memset(buff, 0, MAX_TRANSFER_CTRL_BYTE_USB);
a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
78
79
80
81
82
83
  	while (1) {
  		oldfs = get_fs();
  		set_fs(get_ds());
  		len = vfs_read(flp, (void __force __user *)buff, MAX_TRANSFER_CTRL_BYTE_USB, &pos);
  		set_fs(oldfs);
  		fw_down++;
f8942e07a   Stephen Hemminger   staging: Beeceem ...
84

a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
85
86
87
88
89
90
91
92
93
94
  		if (len <= 0) {
  			if (len < 0) {
  				BCM_DEBUG_PRINT(psIntfAdapter->psAdapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "len < 0");
  				errno = len;
  			} else {
  				errno = 0;
  				BCM_DEBUG_PRINT(psIntfAdapter->psAdapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "Got end of file!");
  			}
  			break;
  		}
f8942e07a   Stephen Hemminger   staging: Beeceem ...
95

41c7b7c0f   Kevin McKinney   Staging: bcm: Fix...
96
97
98
  		bytes = InterfaceRDM(psIntfAdapter, on_chip_loc, buff_readback, len);
  		if (bytes < 0) {
  			Status = bytes;
a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
99
  			BCM_DEBUG_PRINT(psIntfAdapter->psAdapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "RDM of len %d Failed! %d", len, reg);
f8942e07a   Stephen Hemminger   staging: Beeceem ...
100
101
102
  			goto exit;
  		}
  		reg++;
a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
103
104
105
106
  		if ((len-sizeof(unsigned int)) < 4) {
  			if (memcmp(buff_readback, buff, len)) {
  				BCM_DEBUG_PRINT(psIntfAdapter->psAdapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "Firmware Download is not proper %d", fw_down);
  				BCM_DEBUG_PRINT(psIntfAdapter->psAdapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "Length is: %d", len);
f8942e07a   Stephen Hemminger   staging: Beeceem ...
107
108
  				Status = -EIO;
  				goto exit;
a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
109
110
111
112
113
114
115
116
117
  			}
  		} else {
  			len -= 4;
  
  			while (len) {
  				if (*(unsigned int *)&buff_readback[len] != *(unsigned int *)&buff[len]) {
  					BCM_DEBUG_PRINT(psIntfAdapter->psAdapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "Firmware Download is not proper %d", fw_down);
  					BCM_DEBUG_PRINT(psIntfAdapter->psAdapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "Val from Binary %x, Val From Read Back %x ", *(unsigned int *)&buff[len], *(unsigned int*)&buff_readback[len]);
  					BCM_DEBUG_PRINT(psIntfAdapter->psAdapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "len =%x!!!", len);
f8942e07a   Stephen Hemminger   staging: Beeceem ...
118
119
  					Status = -EIO;
  					goto exit;
a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
120
121
122
123
124
125
  				}
  				len -= 4;
  			}
  		}
  		on_chip_loc += MAX_TRANSFER_CTRL_BYTE_USB;
  	} /* End of while(1) */
f8942e07a   Stephen Hemminger   staging: Beeceem ...
126
  exit:
a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
127
128
  	kfree(buff);
  	kfree(buff_readback);
f8942e07a   Stephen Hemminger   staging: Beeceem ...
129
130
  	return Status;
  }
a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
131
  static int bcm_download_config_file(PMINI_ADAPTER Adapter, FIRMWARE_INFO *psFwInfo)
f8942e07a   Stephen Hemminger   staging: Beeceem ...
132
133
134
  {
  	int retval = STATUS_SUCCESS;
  	B_UINT32 value = 0;
a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
135
  	if (Adapter->pstargetparams == NULL) {
a86581829   Kevin McKinney   Staging: bcm: Fix...
136
137
  		Adapter->pstargetparams = kmalloc(sizeof(STARGETPARAMS), GFP_KERNEL);
  		if (Adapter->pstargetparams == NULL)
a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
138
  			return -ENOMEM;
f8942e07a   Stephen Hemminger   staging: Beeceem ...
139
  	}
a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
140
141
142
143
144
145
  
  	if (psFwInfo->u32FirmwareLength != sizeof(STARGETPARAMS))
  		return -EIO;
  
  	retval = copy_from_user(Adapter->pstargetparams, psFwInfo->pvMappedFirmwareAddress, psFwInfo->u32FirmwareLength);
  	if (retval) {
082e889b4   Stephen Hemminger   beceem: remove OS...
146
  		kfree(Adapter->pstargetparams);
f8942e07a   Stephen Hemminger   staging: Beeceem ...
147
  		Adapter->pstargetparams = NULL;
ef5d20564   Dan Carpenter   Staging: bcm: ret...
148
  		return -EFAULT;
f8942e07a   Stephen Hemminger   staging: Beeceem ...
149
  	}
a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
150

f8942e07a   Stephen Hemminger   staging: Beeceem ...
151
152
  	/* Parse the structure and then Download the Firmware */
  	beceem_parse_target_struct(Adapter);
a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
153
  	/* Initializing the NVM. */
f8942e07a   Stephen Hemminger   staging: Beeceem ...
154
  	BcmInitNVM(Adapter);
a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
155
  	retval = InitLedSettings(Adapter);
f8942e07a   Stephen Hemminger   staging: Beeceem ...
156

a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
157
158
159
  	if (retval) {
  		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "INIT LED Failed
  ");
f8942e07a   Stephen Hemminger   staging: Beeceem ...
160
161
  		return retval;
  	}
a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
162
  	if (Adapter->LEDInfo.led_thread_running & BCM_LED_THREAD_RUNNING_ACTIVELY) {
f8942e07a   Stephen Hemminger   staging: Beeceem ...
163
164
165
166
  		Adapter->LEDInfo.bLedInitDone = FALSE;
  		Adapter->DriverState = DRIVER_INIT;
  		wake_up(&Adapter->LEDInfo.notify_led_event);
  	}
a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
167
  	if (Adapter->LEDInfo.led_thread_running & BCM_LED_THREAD_RUNNING_ACTIVELY) {
f8942e07a   Stephen Hemminger   staging: Beeceem ...
168
169
170
171
172
173
  		Adapter->DriverState = FW_DOWNLOAD;
  		wake_up(&Adapter->LEDInfo.notify_led_event);
  	}
  
  	/* Initialize the DDR Controller */
  	retval = ddr_init(Adapter);
a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
174
175
176
  	if (retval) {
  		BCM_DEBUG_PRINT (Adapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "DDR Init Failed
  ");
f8942e07a   Stephen Hemminger   staging: Beeceem ...
177
178
179
180
181
182
  		return retval;
  	}
  
  	value = 0;
  	wrmalt(Adapter, EEPROM_CAL_DATA_INTERNAL_LOC - 4, &value, sizeof(value));
  	wrmalt(Adapter, EEPROM_CAL_DATA_INTERNAL_LOC - 8, &value, sizeof(value));
a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
183
  	if (Adapter->eNVMType == NVM_FLASH) {
f8942e07a   Stephen Hemminger   staging: Beeceem ...
184
  		retval = PropagateCalParamsFromFlashToMemory(Adapter);
a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
185
186
  		if (retval) {
  			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "propagaion of cal param failed with status :%d", retval);
f8942e07a   Stephen Hemminger   staging: Beeceem ...
187
188
189
  			return retval;
  		}
  	}
a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
190
  	retval = buffDnldVerify(Adapter, (PUCHAR)Adapter->pstargetparams, sizeof(STARGETPARAMS), CONFIG_BEGIN_ADDR);
f8942e07a   Stephen Hemminger   staging: Beeceem ...
191

a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
192
193
  	if (retval)
  		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "configuration file not downloaded properly");
f8942e07a   Stephen Hemminger   staging: Beeceem ...
194
195
  	else
  		Adapter->bCfgDownloaded = TRUE;
f8942e07a   Stephen Hemminger   staging: Beeceem ...
196
197
  	return retval;
  }
a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
198
199
  
  static int bcm_compare_buff_contents(unsigned char *readbackbuff, unsigned char *buff, unsigned int len)
f8942e07a   Stephen Hemminger   staging: Beeceem ...
200
201
  {
  	int retval = STATUS_SUCCESS;
a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
202
203
204
205
206
207
208
209
210
211
212
213
214
  	PMINI_ADAPTER Adapter = GET_BCM_ADAPTER(gblpnetdev);
  	if ((len-sizeof(unsigned int)) < 4) {
  		if (memcmp(readbackbuff , buff, len))
  			retval = -EINVAL;
  	} else {
  		len -= 4;
  
  		while (len) {
  			if (*(unsigned int *)&readbackbuff[len] != *(unsigned int *)&buff[len]) {
  				BCM_DEBUG_PRINT(Adapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "Firmware Download is not proper");
  				BCM_DEBUG_PRINT(Adapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "Val from Binary %x, Val From Read Back %x ", *(unsigned int *)&buff[len], *(unsigned int*)&readbackbuff[len]);
  				BCM_DEBUG_PRINT(Adapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "len =%x!!!", len);
  				retval = -EINVAL;
f8942e07a   Stephen Hemminger   staging: Beeceem ...
215
216
  				break;
  			}
a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
217
  			len -= 4;
f8942e07a   Stephen Hemminger   staging: Beeceem ...
218
219
220
221
  		}
  	}
  	return retval;
  }
a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
222

f8942e07a   Stephen Hemminger   staging: Beeceem ...
223
224
225
226
  int bcm_ioctl_fw_download(PMINI_ADAPTER Adapter, FIRMWARE_INFO *psFwInfo)
  {
  	int retval = STATUS_SUCCESS;
  	PUCHAR buff = NULL;
a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
227
228
229
230
231
232
233
234
235
  	/* Config File is needed for the Driver to download the Config file and
  	 * Firmware. Check for the Config file to be first to be sent from the
  	 * Application
  	 */
  	atomic_set(&Adapter->uiMBupdate, FALSE);
  	if (!Adapter->bCfgDownloaded && psFwInfo->u32StartingAddress != CONFIG_BEGIN_ADDR) {
  		/* Can't Download Firmware. */
  		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "Download the config File first
  ");
f8942e07a   Stephen Hemminger   staging: Beeceem ...
236
237
238
239
  		return -EINVAL;
  	}
  
  	/* If Config File, Finish the DDR Settings and then Download CFG File */
a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
240
241
242
243
244
245
  	if (psFwInfo->u32StartingAddress == CONFIG_BEGIN_ADDR) {
  		retval = bcm_download_config_file(Adapter, psFwInfo);
  	} else {
  		buff = kzalloc(psFwInfo->u32FirmwareLength, GFP_KERNEL);
  		if (buff == NULL) {
  			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "Failed in allocation memory");
f8942e07a   Stephen Hemminger   staging: Beeceem ...
246
247
  			return -ENOMEM;
  		}
a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
248
249
250
251
  
  		retval = copy_from_user(buff, psFwInfo->pvMappedFirmwareAddress, psFwInfo->u32FirmwareLength);
  		if (retval != STATUS_SUCCESS) {
  			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "copying buffer from user space failed");
ef5d20564   Dan Carpenter   Staging: bcm: ret...
252
  			retval = -EFAULT;
a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
253
  			goto error;
f8942e07a   Stephen Hemminger   staging: Beeceem ...
254
  		}
f8942e07a   Stephen Hemminger   staging: Beeceem ...
255
256
257
258
  		retval = buffDnldVerify(Adapter,
  					buff,
  					psFwInfo->u32FirmwareLength,
  					psFwInfo->u32StartingAddress);
a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
259
260
261
  
  		if (retval != STATUS_SUCCESS) {
  			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "f/w download failed status :%d", retval);
f8942e07a   Stephen Hemminger   staging: Beeceem ...
262
263
264
  			goto error;
  		}
  	}
a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
265

f8942e07a   Stephen Hemminger   staging: Beeceem ...
266
  error:
082e889b4   Stephen Hemminger   beceem: remove OS...
267
  	kfree(buff);
f8942e07a   Stephen Hemminger   staging: Beeceem ...
268
269
  	return retval;
  }
a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
270
  static INT buffDnld(PMINI_ADAPTER Adapter, PUCHAR mappedbuffer, UINT u32FirmwareLength, ULONG u32StartingAddress)
f8942e07a   Stephen Hemminger   staging: Beeceem ...
271
  {
a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
272
  	unsigned int len = 0;
f8942e07a   Stephen Hemminger   staging: Beeceem ...
273
274
  	int retval = STATUS_SUCCESS;
  	len = u32FirmwareLength;
a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
275
276
277
278
279
280
  	while (u32FirmwareLength) {
  		len = MIN_VAL(u32FirmwareLength, MAX_TRANSFER_CTRL_BYTE_USB);
  		retval = wrm(Adapter, u32StartingAddress, mappedbuffer, len);
  
  		if (retval) {
  			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "wrm failed with status :%d", retval);
f8942e07a   Stephen Hemminger   staging: Beeceem ...
281
282
  			break;
  		}
a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
283
284
285
  		u32StartingAddress += len;
  		u32FirmwareLength -= len;
  		mappedbuffer += len;
f8942e07a   Stephen Hemminger   staging: Beeceem ...
286
287
  	}
  	return retval;
f8942e07a   Stephen Hemminger   staging: Beeceem ...
288
  }
a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
289
  static INT buffRdbkVerify(PMINI_ADAPTER Adapter, PUCHAR mappedbuffer, UINT u32FirmwareLength, ULONG u32StartingAddress)
f8942e07a   Stephen Hemminger   staging: Beeceem ...
290
  {
f8942e07a   Stephen Hemminger   staging: Beeceem ...
291
292
  	UINT len = u32FirmwareLength;
  	INT retval = STATUS_SUCCESS;
a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
293
  	PUCHAR readbackbuff = kzalloc(MAX_TRANSFER_CTRL_BYTE_USB, GFP_KERNEL);
41c7b7c0f   Kevin McKinney   Staging: bcm: Fix...
294
  	int bytes;
f8942e07a   Stephen Hemminger   staging: Beeceem ...
295

a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
296
297
  	if (NULL == readbackbuff) {
  		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "MEMORY ALLOCATION FAILED");
f8942e07a   Stephen Hemminger   staging: Beeceem ...
298
299
  		return -ENOMEM;
  	}
f8942e07a   Stephen Hemminger   staging: Beeceem ...
300

a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
301
302
  	while (u32FirmwareLength && !retval) {
  		len = MIN_VAL(u32FirmwareLength, MAX_TRANSFER_CTRL_BYTE_USB);
41c7b7c0f   Kevin McKinney   Staging: bcm: Fix...
303
  		bytes = rdm(Adapter, u32StartingAddress, readbackbuff, len);
f8942e07a   Stephen Hemminger   staging: Beeceem ...
304

41c7b7c0f   Kevin McKinney   Staging: bcm: Fix...
305
306
  		if (bytes < 0) {
  			retval = bytes;
a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
307
  			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "rdm failed with status %d", retval);
f8942e07a   Stephen Hemminger   staging: Beeceem ...
308
309
  			break;
  		}
a86581829   Kevin McKinney   Staging: bcm: Fix...
310
311
  		retval = bcm_compare_buff_contents(readbackbuff, mappedbuffer, len);
  		if (STATUS_SUCCESS != retval)
f8942e07a   Stephen Hemminger   staging: Beeceem ...
312
  			break;
a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
313
314
315
316
317
318
  
  		u32StartingAddress += len;
  		u32FirmwareLength -= len;
  		mappedbuffer += len;
  
  	} /* end of while (u32FirmwareLength && !retval) */
082e889b4   Stephen Hemminger   beceem: remove OS...
319
  	kfree(readbackbuff);
f8942e07a   Stephen Hemminger   staging: Beeceem ...
320
321
  	return retval;
  }
a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
322
  INT buffDnldVerify(PMINI_ADAPTER Adapter, unsigned char *mappedbuffer, unsigned int u32FirmwareLength, unsigned long u32StartingAddress)
f8942e07a   Stephen Hemminger   staging: Beeceem ...
323
324
  {
  	INT status = STATUS_SUCCESS;
a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
325
326
327
  	status = buffDnld(Adapter, mappedbuffer, u32FirmwareLength, u32StartingAddress);
  	if (status != STATUS_SUCCESS) {
  		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "Buffer download failed");
f8942e07a   Stephen Hemminger   staging: Beeceem ...
328
329
  		goto error;
  	}
a5e4b81e2   Kevin McKinney   Staging: bcm: Fix...
330
331
332
  	status = buffRdbkVerify(Adapter, mappedbuffer, u32FirmwareLength, u32StartingAddress);
  	if (status != STATUS_SUCCESS) {
  		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "Buffer readback verifier failed");
f8942e07a   Stephen Hemminger   staging: Beeceem ...
333
334
335
336
337
  		goto error;
  	}
  error:
  	return status;
  }