3 #ifndef BCM_SHM_INTERFACE
5 int InterfaceFileDownload( PVOID arg,
7 unsigned int on_chip_loc)
10 // unsigned int reg=0;
11 mm_segment_t oldfs={0};
12 int errno=0, len=0 /*,is_config_file = 0*/;
14 PS_INTERFACE_ADAPTER psIntfAdapter = (PS_INTERFACE_ADAPTER)arg;
15 //PMINI_ADAPTER Adapter = psIntfAdapter->psAdapter;
17 buff=(PCHAR)kmalloc(MAX_TRANSFER_CTRL_BYTE_USB, GFP_KERNEL);
24 oldfs=get_fs(); set_fs(get_ds());
25 len=vfs_read(flp, (void __force __user *)buff, MAX_TRANSFER_CTRL_BYTE_USB, &pos);
31 BCM_DEBUG_PRINT(psIntfAdapter->psAdapter,DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "len < 0");
37 BCM_DEBUG_PRINT(psIntfAdapter->psAdapter,DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "Got end of file!");
41 //BCM_DEBUG_PRINT_BUFFER(Adapter,DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, buff, MAX_TRANSFER_CTRL_BYTE_USB);
42 errno = InterfaceWRM(psIntfAdapter, on_chip_loc, buff, len) ;
45 BCM_DEBUG_PRINT(psIntfAdapter->psAdapter,DBG_TYPE_PRINTK, 0, 0, "WRM Failed! status: %d", errno);
49 on_chip_loc+=MAX_TRANSFER_CTRL_BYTE_USB;
56 int InterfaceFileReadbackFromChip( PVOID arg,
58 unsigned int on_chip_loc)
60 char *buff=NULL, *buff_readback=NULL;
62 mm_segment_t oldfs={0};
63 int errno=0, len=0, is_config_file = 0;
65 static int fw_down = 0;
66 INT Status = STATUS_SUCCESS;
67 PS_INTERFACE_ADAPTER psIntfAdapter = (PS_INTERFACE_ADAPTER)arg;
69 buff=(PCHAR)kmalloc(MAX_TRANSFER_CTRL_BYTE_USB, GFP_DMA);
70 buff_readback=(PCHAR)kmalloc(MAX_TRANSFER_CTRL_BYTE_USB , GFP_DMA);
71 if(!buff || !buff_readback)
74 bcm_kfree(buff_readback);
79 is_config_file = (on_chip_loc == CONFIG_BEGIN_ADDR)? 1:0;
81 memset(buff_readback, 0, MAX_TRANSFER_CTRL_BYTE_USB);
82 memset(buff, 0, MAX_TRANSFER_CTRL_BYTE_USB);
85 oldfs=get_fs(); set_fs(get_ds());
86 len=vfs_read(flp, (void __force __user *)buff, MAX_TRANSFER_CTRL_BYTE_USB, &pos);
93 BCM_DEBUG_PRINT(psIntfAdapter->psAdapter,DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "len < 0");
99 BCM_DEBUG_PRINT(psIntfAdapter->psAdapter,DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "Got end of file!");
105 Status = InterfaceRDM(psIntfAdapter, on_chip_loc, buff_readback, len);
108 BCM_DEBUG_PRINT(psIntfAdapter->psAdapter,DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "RDM of len %d Failed! %d", len, reg);
112 if((len-sizeof(unsigned int))<4)
114 if(memcmp(buff_readback, buff, len))
116 BCM_DEBUG_PRINT(psIntfAdapter->psAdapter,DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "Firmware Download is not proper %d", fw_down);
117 BCM_DEBUG_PRINT(psIntfAdapter->psAdapter,DBG_TYPE_INITEXIT, MP_INIT,DBG_LVL_ALL,"Length is: %d",len);
127 if(*(unsigned int*)&buff_readback[len] != *(unsigned int *)&buff[len])
129 BCM_DEBUG_PRINT(psIntfAdapter->psAdapter,DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "Firmware Download is not proper %d", fw_down);
130 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]);
131 BCM_DEBUG_PRINT(psIntfAdapter->psAdapter,DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "len =%x!!!", len);
138 on_chip_loc+=MAX_TRANSFER_CTRL_BYTE_USB;
139 }/* End of while(1)*/
142 bcm_kfree(buff_readback);
146 static int bcm_download_config_file(PMINI_ADAPTER Adapter,
147 FIRMWARE_INFO *psFwInfo)
149 int retval = STATUS_SUCCESS;
152 if(Adapter->pstargetparams == NULL)
154 if((Adapter->pstargetparams =
155 kmalloc(sizeof(STARGETPARAMS), GFP_KERNEL)) == NULL)
160 if(psFwInfo->u32FirmwareLength != sizeof(STARGETPARAMS))
164 retval = copy_from_user(Adapter->pstargetparams,
165 psFwInfo->pvMappedFirmwareAddress, psFwInfo->u32FirmwareLength);
168 bcm_kfree (Adapter->pstargetparams);
169 Adapter->pstargetparams = NULL;
172 /* Parse the structure and then Download the Firmware */
173 beceem_parse_target_struct(Adapter);
175 //Initializing the NVM.
178 retval = InitLedSettings (Adapter);
182 BCM_DEBUG_PRINT (Adapter,DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "INIT LED Failed\n");
186 if(Adapter->LEDInfo.led_thread_running & BCM_LED_THREAD_RUNNING_ACTIVELY)
188 Adapter->LEDInfo.bLedInitDone = FALSE;
189 Adapter->DriverState = DRIVER_INIT;
190 wake_up(&Adapter->LEDInfo.notify_led_event);
193 if(Adapter->LEDInfo.led_thread_running & BCM_LED_THREAD_RUNNING_ACTIVELY)
195 Adapter->DriverState = FW_DOWNLOAD;
196 wake_up(&Adapter->LEDInfo.notify_led_event);
199 /* Initialize the DDR Controller */
200 retval = ddr_init(Adapter);
203 BCM_DEBUG_PRINT (Adapter,DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "DDR Init Failed\n");
208 wrmalt(Adapter, EEPROM_CAL_DATA_INTERNAL_LOC - 4, &value, sizeof(value));
209 wrmalt(Adapter, EEPROM_CAL_DATA_INTERNAL_LOC - 8, &value, sizeof(value));
211 if(Adapter->eNVMType == NVM_FLASH)
213 retval = PropagateCalParamsFromFlashToMemory(Adapter);
216 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL,"propagaion of cal param failed with status :%d", retval);
222 retval =buffDnldVerify(Adapter,(PUCHAR)Adapter->pstargetparams,sizeof(STARGETPARAMS),CONFIG_BEGIN_ADDR);
226 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "configuration file not downloaded properly");
229 Adapter->bCfgDownloaded = TRUE;
235 static int bcm_download_buffer(PMINI_ADAPTER Adapter,
236 unsigned char *mappedbuffer, unsigned int u32FirmwareLength,
237 unsigned long u32StartingAddress)
240 unsigned int len = 0;
241 int retval = STATUS_SUCCESS;
242 buff = kzalloc(MAX_TRANSFER_CTRL_BYTE_USB, GFP_KERNEL);
244 len = u32FirmwareLength;
246 while(u32FirmwareLength)
248 len = MIN_VAL (u32FirmwareLength, MAX_TRANSFER_CTRL_BYTE_USB);
249 if(STATUS_SUCCESS != (retval = copy_from_user(buff,
250 (unsigned char *)mappedbuffer, len)))
252 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "copy_from_user failed\n");
255 retval = wrm (Adapter, u32StartingAddress, buff, len);
258 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "wrm failed\n");
261 u32StartingAddress += len;
262 u32FirmwareLength -= len;
269 static int bcm_compare_buff_contents(unsigned char *readbackbuff,
270 unsigned char *buff,unsigned int len)
272 int retval = STATUS_SUCCESS;
273 PMINI_ADAPTER Adapter = GET_BCM_ADAPTER(gblpnetdev);
274 if((len-sizeof(unsigned int))<4)
276 if(memcmp(readbackbuff , buff, len))
286 if(*(unsigned int*)&readbackbuff[len] !=
287 *(unsigned int *)&buff[len])
289 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "Firmware Download is not proper");
290 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]);
291 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "len =%x!!!", len);
301 static int bcm_buffer_readback(PMINI_ADAPTER Adapter,
302 unsigned char *mappedbuffer, unsigned int u32FirmwareLength,
303 unsigned long u32StartingAddress)
305 unsigned char *buff = NULL;
306 unsigned char *readbackbuff = NULL;
307 unsigned int len = u32FirmwareLength;
308 int retval = STATUS_SUCCESS;
310 buff=(unsigned char *)kzalloc(MAX_TRANSFER_CTRL_BYTE_USB, GFP_KERNEL);
313 readbackbuff = (unsigned char *)kzalloc(MAX_TRANSFER_CTRL_BYTE_USB,
315 if(NULL == readbackbuff)
320 while (u32FirmwareLength && !retval)
322 len = MIN_VAL (u32FirmwareLength, MAX_TRANSFER_CTRL_BYTE_USB);
324 /* read from the appl buff and then read from the target, compare */
325 if(STATUS_SUCCESS != (retval = copy_from_user(buff,
326 (unsigned char *)mappedbuffer, len)))
328 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "copy_from_user failed\n");
331 retval = rdm (Adapter, u32StartingAddress, readbackbuff, len);
334 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "rdm failed\n");
338 if (STATUS_SUCCESS !=
339 (retval = bcm_compare_buff_contents (readbackbuff, buff, len)))
343 u32StartingAddress += len;
344 u32FirmwareLength -= len;
346 }/* end of while (u32FirmwareLength && !retval) */
348 bcm_kfree(readbackbuff);
352 int bcm_ioctl_fw_download(PMINI_ADAPTER Adapter, FIRMWARE_INFO *psFwInfo)
354 int retval = STATUS_SUCCESS;
357 /* Config File is needed for the Driver to download the Config file and
358 Firmware. Check for the Config file to be first to be sent from the
361 atomic_set (&Adapter->uiMBupdate, FALSE);
362 if(!Adapter->bCfgDownloaded &&
363 psFwInfo->u32StartingAddress != CONFIG_BEGIN_ADDR)
365 /*Can't Download Firmware.*/
366 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL,"Download the config File first\n");
370 /* If Config File, Finish the DDR Settings and then Download CFG File */
371 if(psFwInfo->u32StartingAddress == CONFIG_BEGIN_ADDR)
373 retval = bcm_download_config_file (Adapter, psFwInfo);
378 buff = (PUCHAR)kzalloc(psFwInfo->u32FirmwareLength,GFP_KERNEL);
381 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL,"Failed in allocation memory");
384 retval = copy_from_user(buff,psFwInfo->pvMappedFirmwareAddress, psFwInfo->u32FirmwareLength);
385 if(retval != STATUS_SUCCESS)
387 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "copying buffer from user space failed");
393 retval = bcm_download_buffer(Adapter,
394 (unsigned char *)psFwInfo->pvMappedFirmwareAddress,
395 psFwInfo->u32FirmwareLength, psFwInfo->u32StartingAddress);
396 if(retval != STATUS_SUCCESS)
398 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "User space buffer download fails....");
400 retval = bcm_buffer_readback (Adapter,
401 (unsigned char *)psFwInfo->pvMappedFirmwareAddress,
402 psFwInfo->u32FirmwareLength, psFwInfo->u32StartingAddress);
404 if(retval != STATUS_SUCCESS)
406 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "read back verifier failed ....");
409 retval = buffDnldVerify(Adapter,
411 psFwInfo->u32FirmwareLength,
412 psFwInfo->u32StartingAddress);
413 if(retval != STATUS_SUCCESS)
415 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL,"f/w download failed status :%d", retval);
424 static INT buffDnld(PMINI_ADAPTER Adapter, PUCHAR mappedbuffer, UINT u32FirmwareLength,
425 ULONG u32StartingAddress)
428 unsigned int len = 0;
429 int retval = STATUS_SUCCESS;
430 len = u32FirmwareLength;
432 while(u32FirmwareLength)
434 len = MIN_VAL (u32FirmwareLength, MAX_TRANSFER_CTRL_BYTE_USB);
435 retval = wrm (Adapter, u32StartingAddress, mappedbuffer, len);
438 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "wrm failed with status :%d", retval);
441 u32StartingAddress += len;
442 u32FirmwareLength -= len;
449 static INT buffRdbkVerify(PMINI_ADAPTER Adapter,
450 PUCHAR mappedbuffer, UINT u32FirmwareLength,
451 ULONG u32StartingAddress)
453 PUCHAR readbackbuff = NULL;
454 UINT len = u32FirmwareLength;
455 INT retval = STATUS_SUCCESS;
457 readbackbuff = (PUCHAR)kzalloc(MAX_TRANSFER_CTRL_BYTE_USB,GFP_KERNEL);
458 if(NULL == readbackbuff)
460 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "MEMORY ALLOCATION FAILED");
463 while (u32FirmwareLength && !retval)
466 len = MIN_VAL (u32FirmwareLength, MAX_TRANSFER_CTRL_BYTE_USB);
468 retval = rdm (Adapter, u32StartingAddress, readbackbuff, len);
471 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "rdm failed with status %d" ,retval);
475 if (STATUS_SUCCESS != (retval = bcm_compare_buff_contents (readbackbuff, mappedbuffer, len)))
479 u32StartingAddress += len;
480 u32FirmwareLength -= len;
482 }/* end of while (u32FirmwareLength && !retval) */
483 bcm_kfree(readbackbuff);
487 INT buffDnldVerify(PMINI_ADAPTER Adapter, unsigned char *mappedbuffer, unsigned int u32FirmwareLength,
488 unsigned long u32StartingAddress)
490 INT status = STATUS_SUCCESS;
492 status = buffDnld(Adapter,mappedbuffer,u32FirmwareLength,u32StartingAddress);
493 if(status != STATUS_SUCCESS)
495 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL,"Buffer download failed");
499 status= buffRdbkVerify(Adapter,mappedbuffer,u32FirmwareLength,u32StartingAddress);
500 if(status != STATUS_SUCCESS)
502 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL,"Buffer readback verifier failed");