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");
392 retval
= bcm_download_buffer(Adapter
,
393 (unsigned char *)psFwInfo
->pvMappedFirmwareAddress
,
394 psFwInfo
->u32FirmwareLength
, psFwInfo
->u32StartingAddress
);
395 if(retval
!= STATUS_SUCCESS
)
397 BCM_DEBUG_PRINT(Adapter
,DBG_TYPE_INITEXIT
, MP_INIT
, DBG_LVL_ALL
, "User space buffer download fails....");
399 retval
= bcm_buffer_readback (Adapter
,
400 (unsigned char *)psFwInfo
->pvMappedFirmwareAddress
,
401 psFwInfo
->u32FirmwareLength
, psFwInfo
->u32StartingAddress
);
403 if(retval
!= STATUS_SUCCESS
)
405 BCM_DEBUG_PRINT(Adapter
,DBG_TYPE_INITEXIT
, MP_INIT
, DBG_LVL_ALL
, "read back verifier failed ....");
408 retval
= buffDnldVerify(Adapter
,
410 psFwInfo
->u32FirmwareLength
,
411 psFwInfo
->u32StartingAddress
);
412 if(retval
!= STATUS_SUCCESS
)
414 BCM_DEBUG_PRINT(Adapter
,DBG_TYPE_INITEXIT
, MP_INIT
, DBG_LVL_ALL
,"f/w download failed status :%d", retval
);
423 static INT
buffDnld(PMINI_ADAPTER Adapter
, PUCHAR mappedbuffer
, UINT u32FirmwareLength
,
424 ULONG u32StartingAddress
)
427 unsigned int len
= 0;
428 int retval
= STATUS_SUCCESS
;
429 len
= u32FirmwareLength
;
431 while(u32FirmwareLength
)
433 len
= MIN_VAL (u32FirmwareLength
, MAX_TRANSFER_CTRL_BYTE_USB
);
434 retval
= wrm (Adapter
, u32StartingAddress
, mappedbuffer
, len
);
437 BCM_DEBUG_PRINT(Adapter
,DBG_TYPE_INITEXIT
, MP_INIT
, DBG_LVL_ALL
, "wrm failed with status :%d", retval
);
440 u32StartingAddress
+= len
;
441 u32FirmwareLength
-= len
;
448 static INT
buffRdbkVerify(PMINI_ADAPTER Adapter
,
449 PUCHAR mappedbuffer
, UINT u32FirmwareLength
,
450 ULONG u32StartingAddress
)
452 PUCHAR readbackbuff
= NULL
;
453 UINT len
= u32FirmwareLength
;
454 INT retval
= STATUS_SUCCESS
;
456 readbackbuff
= (PUCHAR
)kzalloc(MAX_TRANSFER_CTRL_BYTE_USB
,GFP_KERNEL
);
457 if(NULL
== readbackbuff
)
459 BCM_DEBUG_PRINT(Adapter
,DBG_TYPE_INITEXIT
, MP_INIT
, DBG_LVL_ALL
, "MEMORY ALLOCATION FAILED");
462 while (u32FirmwareLength
&& !retval
)
465 len
= MIN_VAL (u32FirmwareLength
, MAX_TRANSFER_CTRL_BYTE_USB
);
467 retval
= rdm (Adapter
, u32StartingAddress
, readbackbuff
, len
);
470 BCM_DEBUG_PRINT(Adapter
,DBG_TYPE_INITEXIT
, MP_INIT
, DBG_LVL_ALL
, "rdm failed with status %d" ,retval
);
474 if (STATUS_SUCCESS
!= (retval
= bcm_compare_buff_contents (readbackbuff
, mappedbuffer
, len
)))
478 u32StartingAddress
+= len
;
479 u32FirmwareLength
-= len
;
481 }/* end of while (u32FirmwareLength && !retval) */
482 bcm_kfree(readbackbuff
);
486 INT
buffDnldVerify(PMINI_ADAPTER Adapter
, unsigned char *mappedbuffer
, unsigned int u32FirmwareLength
,
487 unsigned long u32StartingAddress
)
489 INT status
= STATUS_SUCCESS
;
491 status
= buffDnld(Adapter
,mappedbuffer
,u32FirmwareLength
,u32StartingAddress
);
492 if(status
!= STATUS_SUCCESS
)
494 BCM_DEBUG_PRINT(Adapter
,DBG_TYPE_INITEXIT
, MP_INIT
, DBG_LVL_ALL
,"Buffer download failed");
498 status
= buffRdbkVerify(Adapter
,mappedbuffer
,u32FirmwareLength
,u32StartingAddress
);
499 if(status
!= STATUS_SUCCESS
)
501 BCM_DEBUG_PRINT(Adapter
,DBG_TYPE_INITEXIT
, MP_INIT
, DBG_LVL_ALL
,"Buffer readback verifier failed");