linux/drivers/staging/bcm/InterfaceDld.c
<<
>>
Prefs
   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
 403