Linux Audio

Check our new training course

Loading...
Note: File does not exist in v6.9.4.
  1#include "headers.h"
  2
  3
  4int InterfaceFileDownload( PVOID arg,
  5                        struct file *flp,
  6                        unsigned int on_chip_loc)
  7{
  8   // unsigned int    reg=0;
  9    mm_segment_t    oldfs={0};
 10    int             errno=0, len=0 /*,is_config_file = 0*/;
 11    loff_t          pos=0;
 12	PS_INTERFACE_ADAPTER psIntfAdapter = (PS_INTERFACE_ADAPTER)arg;
 13	//PMINI_ADAPTER Adapter = psIntfAdapter->psAdapter;
 14    char            *buff=kmalloc(MAX_TRANSFER_CTRL_BYTE_USB, GFP_KERNEL);
 15
 16    if(!buff)
 17    {
 18        return -ENOMEM;
 19    }
 20    while(1)
 21    {
 22        oldfs=get_fs(); set_fs(get_ds());
 23        len=vfs_read(flp, (void __force __user *)buff, MAX_TRANSFER_CTRL_BYTE_USB, &pos);
 24        set_fs(oldfs);
 25        if(len<=0)
 26        {
 27            if(len<0)
 28            {
 29                BCM_DEBUG_PRINT(psIntfAdapter->psAdapter,DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "len < 0");
 30                errno=len;
 31            }
 32            else
 33            {
 34                errno = 0;
 35                BCM_DEBUG_PRINT(psIntfAdapter->psAdapter,DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "Got end of file!");
 36            }
 37            break;
 38        }
 39        //BCM_DEBUG_PRINT_BUFFER(Adapter,DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, buff, MAX_TRANSFER_CTRL_BYTE_USB);
 40        errno = InterfaceWRM(psIntfAdapter, on_chip_loc, buff, len) ;
 41		if(errno)
 42		{
 43            BCM_DEBUG_PRINT(psIntfAdapter->psAdapter,DBG_TYPE_PRINTK, 0, 0, "WRM Failed! status: %d", errno);
 44			break;
 45
 46		}
 47        on_chip_loc+=MAX_TRANSFER_CTRL_BYTE_USB;
 48	}/* End of for(;;)*/
 49
 50	kfree(buff);
 51    return errno;
 52}
 53
 54int InterfaceFileReadbackFromChip( PVOID arg,
 55                        struct file *flp,
 56                        unsigned int on_chip_loc)
 57{
 58    char            *buff, *buff_readback;
 59    unsigned int    reg=0;
 60    mm_segment_t    oldfs={0};
 61    int             errno=0, len=0, is_config_file = 0;
 62    loff_t          pos=0;
 63    static int fw_down = 0;
 64	INT				Status = STATUS_SUCCESS;
 65	PS_INTERFACE_ADAPTER psIntfAdapter = (PS_INTERFACE_ADAPTER)arg;
 66
 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)
 70    {
 71        kfree(buff);
 72        kfree(buff_readback);
 73
 74        return -ENOMEM;
 75    }
 76
 77	is_config_file = (on_chip_loc == CONFIG_BEGIN_ADDR)? 1:0;
 78
 79	memset(buff_readback, 0, MAX_TRANSFER_CTRL_BYTE_USB);
 80	memset(buff, 0, MAX_TRANSFER_CTRL_BYTE_USB);
 81    while(1)
 82    {
 83        oldfs=get_fs(); set_fs(get_ds());
 84        len=vfs_read(flp, (void __force __user *)buff, MAX_TRANSFER_CTRL_BYTE_USB, &pos);
 85        set_fs(oldfs);
 86        fw_down++;
 87        if(len<=0)
 88        {
 89            if(len<0)
 90            {
 91                BCM_DEBUG_PRINT(psIntfAdapter->psAdapter,DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "len < 0");
 92                errno=len;
 93            }
 94            else
 95            {
 96                errno = 0;
 97                BCM_DEBUG_PRINT(psIntfAdapter->psAdapter,DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "Got end of file!");
 98            }
 99            break;
100        }
101
102
103		Status = InterfaceRDM(psIntfAdapter, on_chip_loc, buff_readback, len);
104		if(Status)
105		{
106            BCM_DEBUG_PRINT(psIntfAdapter->psAdapter,DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "RDM of len %d Failed! %d", len, reg);
107			goto exit;
108		}
109		reg++;
110        if((len-sizeof(unsigned int))<4)
111        {
112            if(memcmp(buff_readback, buff, len))
113            {
114                BCM_DEBUG_PRINT(psIntfAdapter->psAdapter,DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "Firmware Download is not proper %d", fw_down);
115				BCM_DEBUG_PRINT(psIntfAdapter->psAdapter,DBG_TYPE_INITEXIT, MP_INIT,DBG_LVL_ALL,"Length is: %d",len);
116				Status = -EIO;
117				goto exit;
118            }
119        }
120        else
121        {
122            len-=4;
123            while(len)
124            {
125                if(*(unsigned int*)&buff_readback[len] != *(unsigned int *)&buff[len])
126                {
127                    BCM_DEBUG_PRINT(psIntfAdapter->psAdapter,DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "Firmware Download is not proper %d", fw_down);
128                    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]);
129                    BCM_DEBUG_PRINT(psIntfAdapter->psAdapter,DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "len =%x!!!", len);
130					Status = -EIO;
131					goto exit;
132                }
133                len-=4;
134            }
135        }
136        on_chip_loc+=MAX_TRANSFER_CTRL_BYTE_USB;
137    }/* End of while(1)*/
138exit:
139    kfree(buff);
140    kfree(buff_readback);
141	return Status;
142}
143
144static int bcm_download_config_file(PMINI_ADAPTER Adapter,
145								FIRMWARE_INFO *psFwInfo)
146{
147	int retval = STATUS_SUCCESS;
148	B_UINT32 value = 0;
149
150	if(Adapter->pstargetparams == NULL)
151    {
152        if((Adapter->pstargetparams =
153            kmalloc(sizeof(STARGETPARAMS), GFP_KERNEL)) == NULL)
154        {
155            return -ENOMEM;
156        }
157    }
158	if(psFwInfo->u32FirmwareLength != sizeof(STARGETPARAMS))
159	{
160		return -EIO;
161	}
162	retval = copy_from_user(Adapter->pstargetparams,
163			psFwInfo->pvMappedFirmwareAddress, psFwInfo->u32FirmwareLength);
164	if(retval)
165	{
166		kfree(Adapter->pstargetparams);
167		Adapter->pstargetparams = NULL;
168		return -EFAULT;
169	}
170	/* Parse the structure and then Download the Firmware */
171	beceem_parse_target_struct(Adapter);
172
173	//Initializing the NVM.
174	BcmInitNVM(Adapter);
175
176	retval = InitLedSettings (Adapter);
177
178	if(retval)
179	{
180		BCM_DEBUG_PRINT (Adapter,DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "INIT LED Failed\n");
181		return retval;
182	}
183
184	if(Adapter->LEDInfo.led_thread_running & BCM_LED_THREAD_RUNNING_ACTIVELY)
185	{
186		Adapter->LEDInfo.bLedInitDone = FALSE;
187		Adapter->DriverState = DRIVER_INIT;
188		wake_up(&Adapter->LEDInfo.notify_led_event);
189	}
190
191	if(Adapter->LEDInfo.led_thread_running & BCM_LED_THREAD_RUNNING_ACTIVELY)
192	{
193		Adapter->DriverState = FW_DOWNLOAD;
194		wake_up(&Adapter->LEDInfo.notify_led_event);
195	}
196
197	/* Initialize the DDR Controller */
198	retval = ddr_init(Adapter);
199	if(retval)
200	{
201		BCM_DEBUG_PRINT (Adapter,DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "DDR Init Failed\n");
202		return retval;
203	}
204
205	value = 0;
206	wrmalt(Adapter, EEPROM_CAL_DATA_INTERNAL_LOC - 4, &value, sizeof(value));
207	wrmalt(Adapter, EEPROM_CAL_DATA_INTERNAL_LOC - 8, &value, sizeof(value));
208
209	if(Adapter->eNVMType == NVM_FLASH)
210	{
211		retval = PropagateCalParamsFromFlashToMemory(Adapter);
212		if(retval)
213		{
214			BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL,"propagaion of cal param failed with status :%d", retval);
215			return retval;
216		}
217	}
218
219
220	retval =buffDnldVerify(Adapter,(PUCHAR)Adapter->pstargetparams,sizeof(STARGETPARAMS),CONFIG_BEGIN_ADDR);
221
222	if(retval)
223	{
224		BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "configuration file not downloaded properly");
225	}
226	else
227		Adapter->bCfgDownloaded = TRUE;
228
229
230	return retval;
231}
232static int bcm_compare_buff_contents(unsigned char *readbackbuff,
233	unsigned char *buff,unsigned int len)
234{
235	int retval = STATUS_SUCCESS;
236    PMINI_ADAPTER Adapter = GET_BCM_ADAPTER(gblpnetdev);
237    if((len-sizeof(unsigned int))<4)
238	{
239		if(memcmp(readbackbuff , buff, len))
240		{
241			retval=-EINVAL;
242		}
243	}
244	else
245	{
246		len-=4;
247		while(len)
248		{
249			if(*(unsigned int*)&readbackbuff[len] !=
250					*(unsigned int *)&buff[len])
251			{
252				BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "Firmware Download is not proper");
253				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]);
254				BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "len =%x!!!", len);
255				retval=-EINVAL;
256				break;
257			}
258			len-=4;
259		}
260	}
261	return retval;
262}
263int bcm_ioctl_fw_download(PMINI_ADAPTER Adapter, FIRMWARE_INFO *psFwInfo)
264{
265	int retval = STATUS_SUCCESS;
266	PUCHAR buff = NULL;
267
268	/*  Config File is needed for the Driver to download the Config file and
269		Firmware. Check for the Config file to be first to be sent from the
270		Application
271	*/
272	atomic_set (&Adapter->uiMBupdate, FALSE);
273	if(!Adapter->bCfgDownloaded &&
274		psFwInfo->u32StartingAddress != CONFIG_BEGIN_ADDR)
275	{
276		/*Can't Download Firmware.*/
277		BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL,"Download the config File first\n");
278		return -EINVAL;
279	}
280
281	/* If Config File, Finish the DDR Settings and then Download CFG File */
282    if(psFwInfo->u32StartingAddress == CONFIG_BEGIN_ADDR)
283    {
284		retval = bcm_download_config_file (Adapter, psFwInfo);
285	}
286	else
287	{
288
289		buff = kzalloc(psFwInfo->u32FirmwareLength,GFP_KERNEL);
290		if(buff==NULL)
291		{
292			BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL,"Failed in allocation memory");
293			return -ENOMEM;
294		}
295		retval = copy_from_user(buff,psFwInfo->pvMappedFirmwareAddress, psFwInfo->u32FirmwareLength);
296		if(retval != STATUS_SUCCESS)
297		{
298			BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "copying buffer from user space failed");
299			retval = -EFAULT;
300			goto error ;
301		}
302
303		retval = buffDnldVerify(Adapter,
304					buff,
305					psFwInfo->u32FirmwareLength,
306					psFwInfo->u32StartingAddress);
307		if(retval != STATUS_SUCCESS)
308		{
309			BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL,"f/w download failed status :%d", retval);
310			goto error;
311		}
312	}
313error:
314	kfree(buff);
315	return retval;
316}
317
318static INT buffDnld(PMINI_ADAPTER Adapter, PUCHAR mappedbuffer, UINT u32FirmwareLength,
319		ULONG u32StartingAddress)
320{
321
322	unsigned int	len = 0;
323	int retval = STATUS_SUCCESS;
324	len = u32FirmwareLength;
325
326	while(u32FirmwareLength)
327	{
328		len = MIN_VAL (u32FirmwareLength, MAX_TRANSFER_CTRL_BYTE_USB);
329		retval = wrm (Adapter, u32StartingAddress, mappedbuffer, len);
330		if(retval)
331		{
332			BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "wrm failed with status :%d", retval);
333			break;
334		}
335		u32StartingAddress	+= len;
336		u32FirmwareLength	-= len;
337		mappedbuffer		+=len;
338	}
339	return retval;
340
341}
342
343static INT buffRdbkVerify(PMINI_ADAPTER Adapter,
344			PUCHAR mappedbuffer, UINT u32FirmwareLength,
345			ULONG u32StartingAddress)
346{
347	UINT len = u32FirmwareLength;
348	INT retval = STATUS_SUCCESS;
349	PUCHAR readbackbuff = kzalloc(MAX_TRANSFER_CTRL_BYTE_USB,GFP_KERNEL);
350
351	if(NULL == readbackbuff)
352	{
353		BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "MEMORY ALLOCATION FAILED");
354		return -ENOMEM;
355	}
356	while (u32FirmwareLength && !retval)
357	{
358
359		len = MIN_VAL (u32FirmwareLength, MAX_TRANSFER_CTRL_BYTE_USB);
360
361		retval = rdm (Adapter, u32StartingAddress, readbackbuff, len);
362		if(retval)
363		{
364			BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "rdm failed with status %d" ,retval);
365			break;
366		}
367
368		if (STATUS_SUCCESS != (retval = bcm_compare_buff_contents (readbackbuff, mappedbuffer, len)))
369		{
370			break;
371		}
372		u32StartingAddress 	+= len;
373		u32FirmwareLength  	-= len;
374		mappedbuffer	   	+=len;
375	}/* end of while (u32FirmwareLength && !retval) */
376	kfree(readbackbuff);
377	return retval;
378}
379
380INT buffDnldVerify(PMINI_ADAPTER Adapter, unsigned char *mappedbuffer, unsigned int u32FirmwareLength,
381		unsigned long u32StartingAddress)
382{
383	INT status = STATUS_SUCCESS;
384
385	status = buffDnld(Adapter,mappedbuffer,u32FirmwareLength,u32StartingAddress);
386	if(status != STATUS_SUCCESS)
387	{
388		BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL,"Buffer download failed");
389		goto error;
390	}
391
392	status= buffRdbkVerify(Adapter,mappedbuffer,u32FirmwareLength,u32StartingAddress);
393	if(status != STATUS_SUCCESS)
394	{
395		BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL,"Buffer readback verifier failed");
396		goto error;
397	}
398error:
399	return status;
400}
401
402