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