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 = 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);
29 /* BCM_DEBUG_PRINT_BUFFER(Adapter,DBG_TYPE_INITEXIT, MP_INIT,
31 * MAX_TRANSFER_CTRL_BYTE_USB);
33 errno = InterfaceWRM(psIntfAdapter, on_chip_loc, buff, len);
36 on_chip_loc += MAX_TRANSFER_CTRL_BYTE_USB;
43 int InterfaceFileReadbackFromChip(PVOID arg, struct file *flp,
44 unsigned int on_chip_loc)
46 char *buff, *buff_readback;
48 mm_segment_t oldfs = {0};
49 int errno = 0, len = 0, is_config_file = 0;
52 INT Status = STATUS_SUCCESS;
53 struct bcm_interface_adapter *psIntfAdapter = arg;
56 buff = kzalloc(MAX_TRANSFER_CTRL_BYTE_USB, GFP_DMA);
57 buff_readback = kzalloc(MAX_TRANSFER_CTRL_BYTE_USB , GFP_DMA);
58 if (!buff || !buff_readback) {
65 is_config_file = (on_chip_loc == CONFIG_BEGIN_ADDR) ? 1 : 0;
70 len = vfs_read(flp, (void __force __user *)buff,
71 MAX_TRANSFER_CTRL_BYTE_USB, &pos);
83 bytes = InterfaceRDM(psIntfAdapter, on_chip_loc,
90 if ((len-sizeof(unsigned int)) < 4) {
91 if (memcmp(buff_readback, buff, len)) {
99 if (*(unsigned int *)&buff_readback[len] !=
100 *(unsigned int *)&buff[len]) {
107 on_chip_loc += MAX_TRANSFER_CTRL_BYTE_USB;
108 } /* End of while(1) */
112 kfree(buff_readback);
116 static int bcm_download_config_file(struct bcm_mini_adapter *Adapter,
117 struct bcm_firmware_info *psFwInfo)
119 int retval = STATUS_SUCCESS;
122 if (Adapter->pstargetparams == NULL) {
123 Adapter->pstargetparams =
124 kmalloc(sizeof(struct bcm_target_params), GFP_KERNEL);
125 if (Adapter->pstargetparams == NULL)
129 if (psFwInfo->u32FirmwareLength != sizeof(struct bcm_target_params))
132 retval = copy_from_user(Adapter->pstargetparams,
133 psFwInfo->pvMappedFirmwareAddress,
134 psFwInfo->u32FirmwareLength);
136 kfree(Adapter->pstargetparams);
137 Adapter->pstargetparams = NULL;
141 /* Parse the structure and then Download the Firmware */
142 beceem_parse_target_struct(Adapter);
144 /* Initializing the NVM. */
146 retval = InitLedSettings(Adapter);
151 if (Adapter->LEDInfo.led_thread_running &
152 BCM_LED_THREAD_RUNNING_ACTIVELY) {
153 Adapter->LEDInfo.bLedInitDone = false;
154 Adapter->DriverState = DRIVER_INIT;
155 wake_up(&Adapter->LEDInfo.notify_led_event);
158 if (Adapter->LEDInfo.led_thread_running &
159 BCM_LED_THREAD_RUNNING_ACTIVELY) {
160 Adapter->DriverState = FW_DOWNLOAD;
161 wake_up(&Adapter->LEDInfo.notify_led_event);
164 /* Initialize the DDR Controller */
165 retval = ddr_init(Adapter);
170 wrmalt(Adapter, EEPROM_CAL_DATA_INTERNAL_LOC - 4,
171 &value, sizeof(value));
172 wrmalt(Adapter, EEPROM_CAL_DATA_INTERNAL_LOC - 8,
173 &value, sizeof(value));
175 if (Adapter->eNVMType == NVM_FLASH) {
176 retval = PropagateCalParamsFromFlashToMemory(Adapter);
181 retval = buffDnldVerify(Adapter, (PUCHAR)Adapter->pstargetparams,
182 sizeof(struct bcm_target_params), CONFIG_BEGIN_ADDR);
185 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_INITEXIT,
186 MP_INIT, DBG_LVL_ALL,
187 "configuration file not downloaded properly");
189 Adapter->bCfgDownloaded = TRUE;
194 int bcm_ioctl_fw_download(struct bcm_mini_adapter *Adapter,
195 struct bcm_firmware_info *psFwInfo)
197 int retval = STATUS_SUCCESS;
200 /* Config File is needed for the Driver to download the Config file and
201 * Firmware. Check for the Config file to be first to be sent from the
204 atomic_set(&Adapter->uiMBupdate, false);
205 if (!Adapter->bCfgDownloaded &&
206 psFwInfo->u32StartingAddress != CONFIG_BEGIN_ADDR) {
207 /* Can't Download Firmware. */
211 /* If Config File, Finish the DDR Settings and then Download CFG File */
212 if (psFwInfo->u32StartingAddress == CONFIG_BEGIN_ADDR) {
213 retval = bcm_download_config_file(Adapter, psFwInfo);
215 buff = kzalloc(psFwInfo->u32FirmwareLength, GFP_KERNEL);
219 retval = copy_from_user(buff,
220 psFwInfo->pvMappedFirmwareAddress,
221 psFwInfo->u32FirmwareLength);
222 if (retval != STATUS_SUCCESS) {
227 retval = buffDnldVerify(Adapter,
229 psFwInfo->u32FirmwareLength,
230 psFwInfo->u32StartingAddress);
232 if (retval != STATUS_SUCCESS)
241 static INT buffDnld(struct bcm_mini_adapter *Adapter,
242 PUCHAR mappedbuffer, UINT u32FirmwareLength,
243 ULONG u32StartingAddress)
245 unsigned int len = 0;
246 int retval = STATUS_SUCCESS;
248 len = u32FirmwareLength;
250 while (u32FirmwareLength) {
251 len = MIN_VAL(u32FirmwareLength, MAX_TRANSFER_CTRL_BYTE_USB);
252 retval = wrm(Adapter, u32StartingAddress, mappedbuffer, len);
256 u32StartingAddress += len;
257 u32FirmwareLength -= len;
263 static INT buffRdbkVerify(struct bcm_mini_adapter *Adapter,
264 PUCHAR mappedbuffer, UINT u32FirmwareLength,
265 ULONG u32StartingAddress)
267 UINT len = u32FirmwareLength;
268 INT retval = STATUS_SUCCESS;
269 PUCHAR readbackbuff = kzalloc(MAX_TRANSFER_CTRL_BYTE_USB, GFP_KERNEL);
272 if (NULL == readbackbuff)
275 while (u32FirmwareLength && !retval) {
276 len = MIN_VAL(u32FirmwareLength, MAX_TRANSFER_CTRL_BYTE_USB);
277 bytes = rdm(Adapter, u32StartingAddress, readbackbuff, len);
284 if (memcmp(readbackbuff, mappedbuffer, len) != 0) {
285 pr_err("%s() failed. The firmware doesn't match what was written",
290 u32StartingAddress += len;
291 u32FirmwareLength -= len;
294 } /* end of while (u32FirmwareLength && !retval) */
299 INT buffDnldVerify(struct bcm_mini_adapter *Adapter,
300 unsigned char *mappedbuffer,
301 unsigned int u32FirmwareLength,
302 unsigned long u32StartingAddress)
304 INT status = STATUS_SUCCESS;
306 status = buffDnld(Adapter, mappedbuffer,
307 u32FirmwareLength, u32StartingAddress);
308 if (status != STATUS_SUCCESS)
311 status = buffRdbkVerify(Adapter, mappedbuffer,
312 u32FirmwareLength, u32StartingAddress);
313 if (status != STATUS_SUCCESS)