3 int InterfaceFileDownload(PVOID arg, struct file *flp, unsigned int on_chip_loc)
5 /* unsigned int reg = 0; */
6 mm_segment_t oldfs = {0};
7 int errno = 0, len = 0; /* ,is_config_file = 0 */
9 struct bcm_interface_adapter *psIntfAdapter = (struct bcm_interface_adapter *)arg;
10 /* struct bcm_mini_adapter *Adapter = psIntfAdapter->psAdapter; */
11 char *buff = kmalloc(MAX_TRANSFER_CTRL_BYTE_USB, GFP_KERNEL);
19 len = vfs_read(flp, (void __force __user *)buff,
20 MAX_TRANSFER_CTRL_BYTE_USB, &pos);
24 BCM_DEBUG_PRINT(psIntfAdapter->psAdapter,
25 DBG_TYPE_INITEXIT, MP_INIT,
26 DBG_LVL_ALL, "len < 0");
30 BCM_DEBUG_PRINT(psIntfAdapter->psAdapter,
31 DBG_TYPE_INITEXIT, MP_INIT,
37 /* BCM_DEBUG_PRINT_BUFFER(Adapter,DBG_TYPE_INITEXIT, MP_INIT,
39 * MAX_TRANSFER_CTRL_BYTE_USB);
41 errno = InterfaceWRM(psIntfAdapter, on_chip_loc, buff, len);
43 BCM_DEBUG_PRINT(psIntfAdapter->psAdapter,
44 DBG_TYPE_PRINTK, 0, 0,
45 "WRM Failed! status: %d", errno);
48 on_chip_loc += MAX_TRANSFER_CTRL_BYTE_USB;
55 int InterfaceFileReadbackFromChip(PVOID arg, struct file *flp, unsigned int on_chip_loc)
57 char *buff, *buff_readback;
59 mm_segment_t oldfs = {0};
60 int errno = 0, len = 0, is_config_file = 0;
63 INT Status = STATUS_SUCCESS;
64 struct bcm_interface_adapter *psIntfAdapter = (struct bcm_interface_adapter *)arg;
67 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) {
76 is_config_file = (on_chip_loc == CONFIG_BEGIN_ADDR) ? 1 : 0;
78 memset(buff_readback, 0, MAX_TRANSFER_CTRL_BYTE_USB);
79 memset(buff, 0, MAX_TRANSFER_CTRL_BYTE_USB);
83 len = vfs_read(flp, (void __force __user *)buff, MAX_TRANSFER_CTRL_BYTE_USB, &pos);
89 BCM_DEBUG_PRINT(psIntfAdapter->psAdapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "len < 0");
93 BCM_DEBUG_PRINT(psIntfAdapter->psAdapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "Got end of file!");
98 bytes = InterfaceRDM(psIntfAdapter, on_chip_loc, buff_readback, len);
101 BCM_DEBUG_PRINT(psIntfAdapter->psAdapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "RDM of len %d Failed! %d", len, reg);
105 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);
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);
126 on_chip_loc += MAX_TRANSFER_CTRL_BYTE_USB;
127 } /* End of while(1) */
131 kfree(buff_readback);
135 static int bcm_download_config_file(struct bcm_mini_adapter *Adapter, struct bcm_firmware_info *psFwInfo)
137 int retval = STATUS_SUCCESS;
140 if (Adapter->pstargetparams == NULL) {
141 Adapter->pstargetparams = kmalloc(sizeof(STARGETPARAMS), GFP_KERNEL);
142 if (Adapter->pstargetparams == NULL)
146 if (psFwInfo->u32FirmwareLength != sizeof(STARGETPARAMS))
149 retval = copy_from_user(Adapter->pstargetparams, psFwInfo->pvMappedFirmwareAddress, psFwInfo->u32FirmwareLength);
151 kfree(Adapter->pstargetparams);
152 Adapter->pstargetparams = NULL;
156 /* Parse the structure and then Download the Firmware */
157 beceem_parse_target_struct(Adapter);
159 /* Initializing the NVM. */
161 retval = InitLedSettings(Adapter);
164 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "INIT LED Failed\n");
168 if (Adapter->LEDInfo.led_thread_running & BCM_LED_THREAD_RUNNING_ACTIVELY) {
169 Adapter->LEDInfo.bLedInitDone = FALSE;
170 Adapter->DriverState = DRIVER_INIT;
171 wake_up(&Adapter->LEDInfo.notify_led_event);
174 if (Adapter->LEDInfo.led_thread_running & BCM_LED_THREAD_RUNNING_ACTIVELY) {
175 Adapter->DriverState = FW_DOWNLOAD;
176 wake_up(&Adapter->LEDInfo.notify_led_event);
179 /* Initialize the DDR Controller */
180 retval = ddr_init(Adapter);
182 BCM_DEBUG_PRINT (Adapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "DDR Init Failed\n");
187 wrmalt(Adapter, EEPROM_CAL_DATA_INTERNAL_LOC - 4, &value, sizeof(value));
188 wrmalt(Adapter, EEPROM_CAL_DATA_INTERNAL_LOC - 8, &value, sizeof(value));
190 if (Adapter->eNVMType == NVM_FLASH) {
191 retval = PropagateCalParamsFromFlashToMemory(Adapter);
193 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "propagaion of cal param failed with status :%d", retval);
198 retval = buffDnldVerify(Adapter, (PUCHAR)Adapter->pstargetparams, sizeof(STARGETPARAMS), CONFIG_BEGIN_ADDR);
201 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "configuration file not downloaded properly");
203 Adapter->bCfgDownloaded = TRUE;
208 static int bcm_compare_buff_contents(unsigned char *readbackbuff, unsigned char *buff, unsigned int len)
210 int retval = STATUS_SUCCESS;
211 struct bcm_mini_adapter *Adapter = GET_BCM_ADAPTER(gblpnetdev);
212 if ((len-sizeof(unsigned int)) < 4) {
213 if (memcmp(readbackbuff , buff, 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);
232 int bcm_ioctl_fw_download(struct bcm_mini_adapter *Adapter, struct bcm_firmware_info *psFwInfo)
234 int retval = STATUS_SUCCESS;
237 /* 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
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");
248 /* If Config File, Finish the DDR Settings and then Download CFG File */
249 if (psFwInfo->u32StartingAddress == CONFIG_BEGIN_ADDR) {
250 retval = bcm_download_config_file(Adapter, psFwInfo);
252 buff = kzalloc(psFwInfo->u32FirmwareLength, GFP_KERNEL);
254 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "Failed in allocation memory");
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");
265 retval = buffDnldVerify(Adapter,
267 psFwInfo->u32FirmwareLength,
268 psFwInfo->u32StartingAddress);
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);
281 static INT buffDnld(struct bcm_mini_adapter *Adapter, PUCHAR mappedbuffer, UINT u32FirmwareLength, ULONG u32StartingAddress)
283 unsigned int len = 0;
284 int retval = STATUS_SUCCESS;
285 len = u32FirmwareLength;
287 while (u32FirmwareLength) {
288 len = MIN_VAL(u32FirmwareLength, MAX_TRANSFER_CTRL_BYTE_USB);
289 retval = wrm(Adapter, u32StartingAddress, mappedbuffer, len);
292 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "wrm failed with status :%d", retval);
295 u32StartingAddress += len;
296 u32FirmwareLength -= len;
302 static INT buffRdbkVerify(struct bcm_mini_adapter *Adapter, PUCHAR mappedbuffer, UINT u32FirmwareLength, ULONG u32StartingAddress)
304 UINT len = u32FirmwareLength;
305 INT retval = STATUS_SUCCESS;
306 PUCHAR readbackbuff = kzalloc(MAX_TRANSFER_CTRL_BYTE_USB, GFP_KERNEL);
309 if (NULL == readbackbuff) {
310 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "MEMORY ALLOCATION FAILED");
314 while (u32FirmwareLength && !retval) {
315 len = MIN_VAL(u32FirmwareLength, MAX_TRANSFER_CTRL_BYTE_USB);
316 bytes = rdm(Adapter, u32StartingAddress, readbackbuff, len);
320 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "rdm failed with status %d", retval);
324 retval = bcm_compare_buff_contents(readbackbuff, mappedbuffer, len);
325 if (STATUS_SUCCESS != retval)
328 u32StartingAddress += len;
329 u32FirmwareLength -= len;
332 } /* end of while (u32FirmwareLength && !retval) */
337 INT buffDnldVerify(struct bcm_mini_adapter *Adapter, unsigned char *mappedbuffer, unsigned int u32FirmwareLength, unsigned long u32StartingAddress)
339 INT status = STATUS_SUCCESS;
341 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");
347 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");