blob: 87117a797d5bff1b78efec79d342eb133f010df8 [file] [log] [blame]
Stephen Hemmingerf8942e02010-09-08 14:46:36 -07001#include "headers.h"
2
Marcos Paulo de Souza43664e12011-09-23 00:20:09 -03003int InterfaceFileDownload(PVOID arg, struct file *flp, unsigned int on_chip_loc)
Stephen Hemmingerf8942e02010-09-08 14:46:36 -07004{
Kevin McKinneya5e4b812011-10-20 08:15:22 -04005 /* unsigned int reg = 0; */
Marcos Paulo de Souza43664e12011-09-23 00:20:09 -03006 mm_segment_t oldfs = {0};
Kevin McKinneya5e4b812011-10-20 08:15:22 -04007 int errno = 0, len = 0; /* ,is_config_file = 0 */
Marcos Paulo de Souza43664e12011-09-23 00:20:09 -03008 loff_t pos = 0;
Kevin McKinneyd6861cf2012-11-01 23:42:21 -04009 struct bcm_interface_adapter *psIntfAdapter = (struct bcm_interface_adapter *)arg;
Kevin McKinney29794602012-05-26 12:05:12 -040010 /* struct bcm_mini_adapter *Adapter = psIntfAdapter->psAdapter; */
Marcos Paulo de Souza43664e12011-09-23 00:20:09 -030011 char *buff = kmalloc(MAX_TRANSFER_CTRL_BYTE_USB, GFP_KERNEL);
Stephen Hemmingerf8942e02010-09-08 14:46:36 -070012
Marcos Paulo de Souza43664e12011-09-23 00:20:09 -030013 if (!buff)
14 return -ENOMEM;
15
16 while (1) {
17 oldfs = get_fs();
18 set_fs(get_ds());
19 len = vfs_read(flp, (void __force __user *)buff,
Kevin McKinneya5e4b812011-10-20 08:15:22 -040020 MAX_TRANSFER_CTRL_BYTE_USB, &pos);
Marcos Paulo de Souza43664e12011-09-23 00:20:09 -030021 set_fs(oldfs);
22 if (len <= 0) {
23 if (len < 0) {
24 BCM_DEBUG_PRINT(psIntfAdapter->psAdapter,
25 DBG_TYPE_INITEXIT, MP_INIT,
26 DBG_LVL_ALL, "len < 0");
27 errno = len;
28 } else {
29 errno = 0;
30 BCM_DEBUG_PRINT(psIntfAdapter->psAdapter,
31 DBG_TYPE_INITEXIT, MP_INIT,
32 DBG_LVL_ALL,
33 "Got end of file!");
34 }
Stephen Hemmingerf8942e02010-09-08 14:46:36 -070035 break;
Stephen Hemmingerf8942e02010-09-08 14:46:36 -070036 }
Marcos Paulo de Souza43664e12011-09-23 00:20:09 -030037 /* BCM_DEBUG_PRINT_BUFFER(Adapter,DBG_TYPE_INITEXIT, MP_INIT,
Kevin McKinneya5e4b812011-10-20 08:15:22 -040038 * DBG_LVL_ALL, buff,
39 * MAX_TRANSFER_CTRL_BYTE_USB);
40 */
Marcos Paulo de Souza43664e12011-09-23 00:20:09 -030041 errno = InterfaceWRM(psIntfAdapter, on_chip_loc, buff, len);
42 if (errno) {
43 BCM_DEBUG_PRINT(psIntfAdapter->psAdapter,
44 DBG_TYPE_PRINTK, 0, 0,
45 "WRM Failed! status: %d", errno);
46 break;
47 }
48 on_chip_loc += MAX_TRANSFER_CTRL_BYTE_USB;
49 }
Stephen Hemmingerf8942e02010-09-08 14:46:36 -070050
Stephen Hemminger082e8892010-11-01 09:35:21 -040051 kfree(buff);
Marcos Paulo de Souza43664e12011-09-23 00:20:09 -030052 return errno;
Stephen Hemmingerf8942e02010-09-08 14:46:36 -070053}
54
Kevin McKinneya5e4b812011-10-20 08:15:22 -040055int InterfaceFileReadbackFromChip(PVOID arg, struct file *flp, unsigned int on_chip_loc)
Stephen Hemmingerf8942e02010-09-08 14:46:36 -070056{
Marcos Paulo de Souza43664e12011-09-23 00:20:09 -030057 char *buff, *buff_readback;
58 unsigned int reg = 0;
Kevin McKinneya5e4b812011-10-20 08:15:22 -040059 mm_segment_t oldfs = {0};
60 int errno = 0, len = 0, is_config_file = 0;
61 loff_t pos = 0;
Kevin McKinneya8658182011-10-20 08:15:23 -040062 static int fw_down;
Kevin McKinneya5e4b812011-10-20 08:15:22 -040063 INT Status = STATUS_SUCCESS;
Kevin McKinneyd6861cf2012-11-01 23:42:21 -040064 struct bcm_interface_adapter *psIntfAdapter = (struct bcm_interface_adapter *)arg;
Kevin McKinney41c7b7c2011-11-06 09:40:11 -050065 int bytes;
Stephen Hemmingerf8942e02010-09-08 14:46:36 -070066
Kevin McKinneya5e4b812011-10-20 08:15:22 -040067 buff = kmalloc(MAX_TRANSFER_CTRL_BYTE_USB, GFP_DMA);
68 buff_readback = kmalloc(MAX_TRANSFER_CTRL_BYTE_USB , GFP_DMA);
69 if (!buff || !buff_readback) {
70 kfree(buff);
71 kfree(buff_readback);
Stephen Hemmingerf8942e02010-09-08 14:46:36 -070072
Kevin McKinneya5e4b812011-10-20 08:15:22 -040073 return -ENOMEM;
74 }
Stephen Hemmingerf8942e02010-09-08 14:46:36 -070075
Kevin McKinneya5e4b812011-10-20 08:15:22 -040076 is_config_file = (on_chip_loc == CONFIG_BEGIN_ADDR) ? 1 : 0;
Stephen Hemmingerf8942e02010-09-08 14:46:36 -070077
78 memset(buff_readback, 0, MAX_TRANSFER_CTRL_BYTE_USB);
79 memset(buff, 0, MAX_TRANSFER_CTRL_BYTE_USB);
Kevin McKinneya5e4b812011-10-20 08:15:22 -040080 while (1) {
81 oldfs = get_fs();
82 set_fs(get_ds());
83 len = vfs_read(flp, (void __force __user *)buff, MAX_TRANSFER_CTRL_BYTE_USB, &pos);
84 set_fs(oldfs);
85 fw_down++;
Stephen Hemmingerf8942e02010-09-08 14:46:36 -070086
Kevin McKinneya5e4b812011-10-20 08:15:22 -040087 if (len <= 0) {
88 if (len < 0) {
89 BCM_DEBUG_PRINT(psIntfAdapter->psAdapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "len < 0");
90 errno = len;
91 } else {
92 errno = 0;
93 BCM_DEBUG_PRINT(psIntfAdapter->psAdapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "Got end of file!");
94 }
95 break;
96 }
Stephen Hemmingerf8942e02010-09-08 14:46:36 -070097
Kevin McKinney41c7b7c2011-11-06 09:40:11 -050098 bytes = InterfaceRDM(psIntfAdapter, on_chip_loc, buff_readback, len);
99 if (bytes < 0) {
100 Status = bytes;
Kevin McKinneya5e4b812011-10-20 08:15:22 -0400101 BCM_DEBUG_PRINT(psIntfAdapter->psAdapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "RDM of len %d Failed! %d", len, reg);
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700102 goto exit;
103 }
104 reg++;
Kevin McKinneya5e4b812011-10-20 08:15:22 -0400105 if ((len-sizeof(unsigned int)) < 4) {
106 if (memcmp(buff_readback, buff, len)) {
107 BCM_DEBUG_PRINT(psIntfAdapter->psAdapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "Firmware Download is not proper %d", fw_down);
108 BCM_DEBUG_PRINT(psIntfAdapter->psAdapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "Length is: %d", len);
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700109 Status = -EIO;
110 goto exit;
Kevin McKinneya5e4b812011-10-20 08:15:22 -0400111 }
112 } else {
113 len -= 4;
114
115 while (len) {
116 if (*(unsigned int *)&buff_readback[len] != *(unsigned int *)&buff[len]) {
117 BCM_DEBUG_PRINT(psIntfAdapter->psAdapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "Firmware Download is not proper %d", fw_down);
118 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]);
119 BCM_DEBUG_PRINT(psIntfAdapter->psAdapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "len =%x!!!", len);
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700120 Status = -EIO;
121 goto exit;
Kevin McKinneya5e4b812011-10-20 08:15:22 -0400122 }
123 len -= 4;
124 }
125 }
126 on_chip_loc += MAX_TRANSFER_CTRL_BYTE_USB;
127 } /* End of while(1) */
128
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700129exit:
Kevin McKinneya5e4b812011-10-20 08:15:22 -0400130 kfree(buff);
131 kfree(buff_readback);
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700132 return Status;
133}
134
Kevin McKinney29794602012-05-26 12:05:12 -0400135static int bcm_download_config_file(struct bcm_mini_adapter *Adapter, struct bcm_firmware_info *psFwInfo)
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700136{
137 int retval = STATUS_SUCCESS;
138 B_UINT32 value = 0;
139
Kevin McKinneya5e4b812011-10-20 08:15:22 -0400140 if (Adapter->pstargetparams == NULL) {
Kevin McKinneya8658182011-10-20 08:15:23 -0400141 Adapter->pstargetparams = kmalloc(sizeof(STARGETPARAMS), GFP_KERNEL);
142 if (Adapter->pstargetparams == NULL)
Kevin McKinneya5e4b812011-10-20 08:15:22 -0400143 return -ENOMEM;
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700144 }
Kevin McKinneya5e4b812011-10-20 08:15:22 -0400145
146 if (psFwInfo->u32FirmwareLength != sizeof(STARGETPARAMS))
147 return -EIO;
148
149 retval = copy_from_user(Adapter->pstargetparams, psFwInfo->pvMappedFirmwareAddress, psFwInfo->u32FirmwareLength);
150 if (retval) {
Stephen Hemminger082e8892010-11-01 09:35:21 -0400151 kfree(Adapter->pstargetparams);
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700152 Adapter->pstargetparams = NULL;
Dan Carpenteref5d2052010-10-08 14:56:58 +0200153 return -EFAULT;
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700154 }
Kevin McKinneya5e4b812011-10-20 08:15:22 -0400155
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700156 /* Parse the structure and then Download the Firmware */
157 beceem_parse_target_struct(Adapter);
158
Kevin McKinneya5e4b812011-10-20 08:15:22 -0400159 /* Initializing the NVM. */
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700160 BcmInitNVM(Adapter);
Kevin McKinneya5e4b812011-10-20 08:15:22 -0400161 retval = InitLedSettings(Adapter);
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700162
Kevin McKinneya5e4b812011-10-20 08:15:22 -0400163 if (retval) {
164 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "INIT LED Failed\n");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700165 return retval;
166 }
167
Kevin McKinneya5e4b812011-10-20 08:15:22 -0400168 if (Adapter->LEDInfo.led_thread_running & BCM_LED_THREAD_RUNNING_ACTIVELY) {
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700169 Adapter->LEDInfo.bLedInitDone = FALSE;
170 Adapter->DriverState = DRIVER_INIT;
171 wake_up(&Adapter->LEDInfo.notify_led_event);
172 }
173
Kevin McKinneya5e4b812011-10-20 08:15:22 -0400174 if (Adapter->LEDInfo.led_thread_running & BCM_LED_THREAD_RUNNING_ACTIVELY) {
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700175 Adapter->DriverState = FW_DOWNLOAD;
176 wake_up(&Adapter->LEDInfo.notify_led_event);
177 }
178
179 /* Initialize the DDR Controller */
180 retval = ddr_init(Adapter);
Kevin McKinneya5e4b812011-10-20 08:15:22 -0400181 if (retval) {
182 BCM_DEBUG_PRINT (Adapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "DDR Init Failed\n");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700183 return retval;
184 }
185
186 value = 0;
187 wrmalt(Adapter, EEPROM_CAL_DATA_INTERNAL_LOC - 4, &value, sizeof(value));
188 wrmalt(Adapter, EEPROM_CAL_DATA_INTERNAL_LOC - 8, &value, sizeof(value));
189
Kevin McKinneya5e4b812011-10-20 08:15:22 -0400190 if (Adapter->eNVMType == NVM_FLASH) {
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700191 retval = PropagateCalParamsFromFlashToMemory(Adapter);
Kevin McKinneya5e4b812011-10-20 08:15:22 -0400192 if (retval) {
193 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "propagaion of cal param failed with status :%d", retval);
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700194 return retval;
195 }
196 }
197
Kevin McKinneya5e4b812011-10-20 08:15:22 -0400198 retval = buffDnldVerify(Adapter, (PUCHAR)Adapter->pstargetparams, sizeof(STARGETPARAMS), CONFIG_BEGIN_ADDR);
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700199
Kevin McKinneya5e4b812011-10-20 08:15:22 -0400200 if (retval)
201 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "configuration file not downloaded properly");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700202 else
203 Adapter->bCfgDownloaded = TRUE;
204
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700205 return retval;
206}
Kevin McKinneya5e4b812011-10-20 08:15:22 -0400207
208static int bcm_compare_buff_contents(unsigned char *readbackbuff, unsigned char *buff, unsigned int len)
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700209{
210 int retval = STATUS_SUCCESS;
Kevin McKinney29794602012-05-26 12:05:12 -0400211 struct bcm_mini_adapter *Adapter = GET_BCM_ADAPTER(gblpnetdev);
Kevin McKinneya5e4b812011-10-20 08:15:22 -0400212 if ((len-sizeof(unsigned int)) < 4) {
213 if (memcmp(readbackbuff , buff, len))
214 retval = -EINVAL;
215 } else {
216 len -= 4;
217
218 while (len) {
219 if (*(unsigned int *)&readbackbuff[len] != *(unsigned int *)&buff[len]) {
220 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "Firmware Download is not proper");
221 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]);
222 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "len =%x!!!", len);
223 retval = -EINVAL;
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700224 break;
225 }
Kevin McKinneya5e4b812011-10-20 08:15:22 -0400226 len -= 4;
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700227 }
228 }
229 return retval;
230}
Kevin McKinneya5e4b812011-10-20 08:15:22 -0400231
Kevin McKinney29794602012-05-26 12:05:12 -0400232int bcm_ioctl_fw_download(struct bcm_mini_adapter *Adapter, struct bcm_firmware_info *psFwInfo)
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700233{
234 int retval = STATUS_SUCCESS;
235 PUCHAR buff = NULL;
236
Kevin McKinneya5e4b812011-10-20 08:15:22 -0400237 /* Config File is needed for the Driver to download the Config file and
238 * Firmware. Check for the Config file to be first to be sent from the
239 * Application
240 */
241 atomic_set(&Adapter->uiMBupdate, FALSE);
242 if (!Adapter->bCfgDownloaded && psFwInfo->u32StartingAddress != CONFIG_BEGIN_ADDR) {
243 /* Can't Download Firmware. */
244 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "Download the config File first\n");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700245 return -EINVAL;
246 }
247
248 /* If Config File, Finish the DDR Settings and then Download CFG File */
Kevin McKinneya5e4b812011-10-20 08:15:22 -0400249 if (psFwInfo->u32StartingAddress == CONFIG_BEGIN_ADDR) {
250 retval = bcm_download_config_file(Adapter, psFwInfo);
251 } else {
252 buff = kzalloc(psFwInfo->u32FirmwareLength, GFP_KERNEL);
253 if (buff == NULL) {
254 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "Failed in allocation memory");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700255 return -ENOMEM;
256 }
Kevin McKinneya5e4b812011-10-20 08:15:22 -0400257
258 retval = copy_from_user(buff, psFwInfo->pvMappedFirmwareAddress, psFwInfo->u32FirmwareLength);
259 if (retval != STATUS_SUCCESS) {
260 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "copying buffer from user space failed");
Dan Carpenteref5d2052010-10-08 14:56:58 +0200261 retval = -EFAULT;
Kevin McKinneya5e4b812011-10-20 08:15:22 -0400262 goto error;
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700263 }
264
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700265 retval = buffDnldVerify(Adapter,
266 buff,
267 psFwInfo->u32FirmwareLength,
268 psFwInfo->u32StartingAddress);
Kevin McKinneya5e4b812011-10-20 08:15:22 -0400269
270 if (retval != STATUS_SUCCESS) {
271 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "f/w download failed status :%d", retval);
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700272 goto error;
273 }
274 }
Kevin McKinneya5e4b812011-10-20 08:15:22 -0400275
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700276error:
Stephen Hemminger082e8892010-11-01 09:35:21 -0400277 kfree(buff);
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700278 return retval;
279}
280
Kevin McKinney29794602012-05-26 12:05:12 -0400281static INT buffDnld(struct bcm_mini_adapter *Adapter, PUCHAR mappedbuffer, UINT u32FirmwareLength, ULONG u32StartingAddress)
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700282{
Kevin McKinneya5e4b812011-10-20 08:15:22 -0400283 unsigned int len = 0;
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700284 int retval = STATUS_SUCCESS;
285 len = u32FirmwareLength;
286
Kevin McKinneya5e4b812011-10-20 08:15:22 -0400287 while (u32FirmwareLength) {
288 len = MIN_VAL(u32FirmwareLength, MAX_TRANSFER_CTRL_BYTE_USB);
289 retval = wrm(Adapter, u32StartingAddress, mappedbuffer, len);
290
291 if (retval) {
292 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "wrm failed with status :%d", retval);
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700293 break;
294 }
Kevin McKinneya5e4b812011-10-20 08:15:22 -0400295 u32StartingAddress += len;
296 u32FirmwareLength -= len;
297 mappedbuffer += len;
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700298 }
299 return retval;
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700300}
301
Kevin McKinney29794602012-05-26 12:05:12 -0400302static INT buffRdbkVerify(struct bcm_mini_adapter *Adapter, PUCHAR mappedbuffer, UINT u32FirmwareLength, ULONG u32StartingAddress)
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700303{
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700304 UINT len = u32FirmwareLength;
305 INT retval = STATUS_SUCCESS;
Kevin McKinneya5e4b812011-10-20 08:15:22 -0400306 PUCHAR readbackbuff = kzalloc(MAX_TRANSFER_CTRL_BYTE_USB, GFP_KERNEL);
Kevin McKinney41c7b7c2011-11-06 09:40:11 -0500307 int bytes;
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700308
Kevin McKinneya5e4b812011-10-20 08:15:22 -0400309 if (NULL == readbackbuff) {
310 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "MEMORY ALLOCATION FAILED");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700311 return -ENOMEM;
312 }
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700313
Kevin McKinneya5e4b812011-10-20 08:15:22 -0400314 while (u32FirmwareLength && !retval) {
315 len = MIN_VAL(u32FirmwareLength, MAX_TRANSFER_CTRL_BYTE_USB);
Kevin McKinney41c7b7c2011-11-06 09:40:11 -0500316 bytes = rdm(Adapter, u32StartingAddress, readbackbuff, len);
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700317
Kevin McKinney41c7b7c2011-11-06 09:40:11 -0500318 if (bytes < 0) {
319 retval = bytes;
Kevin McKinneya5e4b812011-10-20 08:15:22 -0400320 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "rdm failed with status %d", retval);
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700321 break;
322 }
323
Kevin McKinneya8658182011-10-20 08:15:23 -0400324 retval = bcm_compare_buff_contents(readbackbuff, mappedbuffer, len);
325 if (STATUS_SUCCESS != retval)
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700326 break;
Kevin McKinneya5e4b812011-10-20 08:15:22 -0400327
328 u32StartingAddress += len;
329 u32FirmwareLength -= len;
330 mappedbuffer += len;
331
332 } /* end of while (u32FirmwareLength && !retval) */
Stephen Hemminger082e8892010-11-01 09:35:21 -0400333 kfree(readbackbuff);
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700334 return retval;
335}
336
Kevin McKinney29794602012-05-26 12:05:12 -0400337INT buffDnldVerify(struct bcm_mini_adapter *Adapter, unsigned char *mappedbuffer, unsigned int u32FirmwareLength, unsigned long u32StartingAddress)
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700338{
339 INT status = STATUS_SUCCESS;
340
Kevin McKinneya5e4b812011-10-20 08:15:22 -0400341 status = buffDnld(Adapter, mappedbuffer, u32FirmwareLength, u32StartingAddress);
342 if (status != STATUS_SUCCESS) {
343 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "Buffer download failed");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700344 goto error;
345 }
346
Kevin McKinneya5e4b812011-10-20 08:15:22 -0400347 status = buffRdbkVerify(Adapter, mappedbuffer, u32FirmwareLength, u32StartingAddress);
348 if (status != STATUS_SUCCESS) {
349 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "Buffer readback verifier failed");
Stephen Hemmingerf8942e02010-09-08 14:46:36 -0700350 goto error;
351 }
352error:
353 return status;
354}