diff options
Diffstat (limited to 'drivers/net/vxge/vxge-config.c')
-rw-r--r-- | drivers/net/vxge/vxge-config.c | 183 |
1 files changed, 182 insertions, 1 deletions
diff --git a/drivers/net/vxge/vxge-config.c b/drivers/net/vxge/vxge-config.c index c822463faf01..7761b9e0ad84 100644 --- a/drivers/net/vxge/vxge-config.c +++ b/drivers/net/vxge/vxge-config.c | |||
@@ -155,7 +155,6 @@ __vxge_hw_vpath_reset_check(struct __vxge_hw_virtualpath *vpath); | |||
155 | static enum vxge_hw_status | 155 | static enum vxge_hw_status |
156 | __vxge_hw_vpath_sw_reset(struct __vxge_hw_device *devh, u32 vp_id); | 156 | __vxge_hw_vpath_sw_reset(struct __vxge_hw_device *devh, u32 vp_id); |
157 | 157 | ||
158 | |||
159 | static enum vxge_hw_status | 158 | static enum vxge_hw_status |
160 | __vxge_hw_vpath_mac_configure(struct __vxge_hw_device *devh, u32 vp_id); | 159 | __vxge_hw_vpath_mac_configure(struct __vxge_hw_device *devh, u32 vp_id); |
161 | 160 | ||
@@ -322,6 +321,188 @@ out: | |||
322 | return status; | 321 | return status; |
323 | } | 322 | } |
324 | 323 | ||
324 | enum vxge_hw_status | ||
325 | vxge_hw_upgrade_read_version(struct __vxge_hw_device *hldev, u32 *major, | ||
326 | u32 *minor, u32 *build) | ||
327 | { | ||
328 | u64 data0 = 0, data1 = 0, steer_ctrl = 0; | ||
329 | struct __vxge_hw_virtualpath *vpath; | ||
330 | enum vxge_hw_status status; | ||
331 | |||
332 | vpath = &hldev->virtual_paths[hldev->first_vp_id]; | ||
333 | |||
334 | status = vxge_hw_vpath_fw_api(vpath, | ||
335 | VXGE_HW_FW_UPGRADE_ACTION, | ||
336 | VXGE_HW_FW_UPGRADE_MEMO, | ||
337 | VXGE_HW_FW_UPGRADE_OFFSET_READ, | ||
338 | &data0, &data1, &steer_ctrl); | ||
339 | if (status != VXGE_HW_OK) | ||
340 | return status; | ||
341 | |||
342 | *major = VXGE_HW_RTS_ACCESS_STEER_DATA0_GET_FW_VER_MAJOR(data0); | ||
343 | *minor = VXGE_HW_RTS_ACCESS_STEER_DATA0_GET_FW_VER_MINOR(data0); | ||
344 | *build = VXGE_HW_RTS_ACCESS_STEER_DATA0_GET_FW_VER_BUILD(data0); | ||
345 | |||
346 | return status; | ||
347 | } | ||
348 | |||
349 | enum vxge_hw_status vxge_hw_flash_fw(struct __vxge_hw_device *hldev) | ||
350 | { | ||
351 | u64 data0 = 0, data1 = 0, steer_ctrl = 0; | ||
352 | struct __vxge_hw_virtualpath *vpath; | ||
353 | enum vxge_hw_status status; | ||
354 | u32 ret; | ||
355 | |||
356 | vpath = &hldev->virtual_paths[hldev->first_vp_id]; | ||
357 | |||
358 | status = vxge_hw_vpath_fw_api(vpath, | ||
359 | VXGE_HW_FW_UPGRADE_ACTION, | ||
360 | VXGE_HW_FW_UPGRADE_MEMO, | ||
361 | VXGE_HW_FW_UPGRADE_OFFSET_COMMIT, | ||
362 | &data0, &data1, &steer_ctrl); | ||
363 | if (status != VXGE_HW_OK) { | ||
364 | vxge_debug_init(VXGE_ERR, "%s: FW upgrade failed", __func__); | ||
365 | goto exit; | ||
366 | } | ||
367 | |||
368 | ret = VXGE_HW_RTS_ACCESS_STEER_CTRL_GET_ACTION(steer_ctrl) & 0x7F; | ||
369 | if (ret != 1) { | ||
370 | vxge_debug_init(VXGE_ERR, "%s: FW commit failed with error %d", | ||
371 | __func__, ret); | ||
372 | status = VXGE_HW_FAIL; | ||
373 | } | ||
374 | |||
375 | exit: | ||
376 | return status; | ||
377 | } | ||
378 | |||
379 | enum vxge_hw_status | ||
380 | vxge_update_fw_image(struct __vxge_hw_device *hldev, const u8 *fwdata, int size) | ||
381 | { | ||
382 | u64 data0 = 0, data1 = 0, steer_ctrl = 0; | ||
383 | struct __vxge_hw_virtualpath *vpath; | ||
384 | enum vxge_hw_status status; | ||
385 | int ret_code, sec_code; | ||
386 | |||
387 | vpath = &hldev->virtual_paths[hldev->first_vp_id]; | ||
388 | |||
389 | /* send upgrade start command */ | ||
390 | status = vxge_hw_vpath_fw_api(vpath, | ||
391 | VXGE_HW_FW_UPGRADE_ACTION, | ||
392 | VXGE_HW_FW_UPGRADE_MEMO, | ||
393 | VXGE_HW_FW_UPGRADE_OFFSET_START, | ||
394 | &data0, &data1, &steer_ctrl); | ||
395 | if (status != VXGE_HW_OK) { | ||
396 | vxge_debug_init(VXGE_ERR, " %s: Upgrade start cmd failed", | ||
397 | __func__); | ||
398 | return status; | ||
399 | } | ||
400 | |||
401 | /* Transfer fw image to adapter 16 bytes at a time */ | ||
402 | for (; size > 0; size -= VXGE_HW_FW_UPGRADE_BLK_SIZE) { | ||
403 | steer_ctrl = 0; | ||
404 | |||
405 | /* The next 128bits of fwdata to be loaded onto the adapter */ | ||
406 | data0 = *((u64 *)fwdata); | ||
407 | data1 = *((u64 *)fwdata + 1); | ||
408 | |||
409 | status = vxge_hw_vpath_fw_api(vpath, | ||
410 | VXGE_HW_FW_UPGRADE_ACTION, | ||
411 | VXGE_HW_FW_UPGRADE_MEMO, | ||
412 | VXGE_HW_FW_UPGRADE_OFFSET_SEND, | ||
413 | &data0, &data1, &steer_ctrl); | ||
414 | if (status != VXGE_HW_OK) { | ||
415 | vxge_debug_init(VXGE_ERR, "%s: Upgrade send failed", | ||
416 | __func__); | ||
417 | goto out; | ||
418 | } | ||
419 | |||
420 | ret_code = VXGE_HW_UPGRADE_GET_RET_ERR_CODE(data0); | ||
421 | switch (ret_code) { | ||
422 | case VXGE_HW_FW_UPGRADE_OK: | ||
423 | /* All OK, send next 16 bytes. */ | ||
424 | break; | ||
425 | case VXGE_FW_UPGRADE_BYTES2SKIP: | ||
426 | /* skip bytes in the stream */ | ||
427 | fwdata += (data0 >> 8) & 0xFFFFFFFF; | ||
428 | break; | ||
429 | case VXGE_HW_FW_UPGRADE_DONE: | ||
430 | goto out; | ||
431 | case VXGE_HW_FW_UPGRADE_ERR: | ||
432 | sec_code = VXGE_HW_UPGRADE_GET_SEC_ERR_CODE(data0); | ||
433 | switch (sec_code) { | ||
434 | case VXGE_HW_FW_UPGRADE_ERR_CORRUPT_DATA_1: | ||
435 | case VXGE_HW_FW_UPGRADE_ERR_CORRUPT_DATA_7: | ||
436 | printk(KERN_ERR | ||
437 | "corrupted data from .ncf file\n"); | ||
438 | break; | ||
439 | case VXGE_HW_FW_UPGRADE_ERR_INV_NCF_FILE_3: | ||
440 | case VXGE_HW_FW_UPGRADE_ERR_INV_NCF_FILE_4: | ||
441 | case VXGE_HW_FW_UPGRADE_ERR_INV_NCF_FILE_5: | ||
442 | case VXGE_HW_FW_UPGRADE_ERR_INV_NCF_FILE_6: | ||
443 | case VXGE_HW_FW_UPGRADE_ERR_INV_NCF_FILE_8: | ||
444 | printk(KERN_ERR "invalid .ncf file\n"); | ||
445 | break; | ||
446 | case VXGE_HW_FW_UPGRADE_ERR_BUFFER_OVERFLOW: | ||
447 | printk(KERN_ERR "buffer overflow\n"); | ||
448 | break; | ||
449 | case VXGE_HW_FW_UPGRADE_ERR_FAILED_TO_FLASH: | ||
450 | printk(KERN_ERR "failed to flash the image\n"); | ||
451 | break; | ||
452 | case VXGE_HW_FW_UPGRADE_ERR_GENERIC_ERROR_UNKNOWN: | ||
453 | printk(KERN_ERR | ||
454 | "generic error. Unknown error type\n"); | ||
455 | break; | ||
456 | default: | ||
457 | printk(KERN_ERR "Unknown error of type %d\n", | ||
458 | sec_code); | ||
459 | break; | ||
460 | } | ||
461 | status = VXGE_HW_FAIL; | ||
462 | goto out; | ||
463 | default: | ||
464 | printk(KERN_ERR "Unknown FW error: %d\n", ret_code); | ||
465 | status = VXGE_HW_FAIL; | ||
466 | goto out; | ||
467 | } | ||
468 | /* point to next 16 bytes */ | ||
469 | fwdata += VXGE_HW_FW_UPGRADE_BLK_SIZE; | ||
470 | } | ||
471 | out: | ||
472 | return status; | ||
473 | } | ||
474 | |||
475 | enum vxge_hw_status | ||
476 | vxge_hw_vpath_eprom_img_ver_get(struct __vxge_hw_device *hldev, | ||
477 | struct eprom_image *img) | ||
478 | { | ||
479 | u64 data0 = 0, data1 = 0, steer_ctrl = 0; | ||
480 | struct __vxge_hw_virtualpath *vpath; | ||
481 | enum vxge_hw_status status; | ||
482 | int i; | ||
483 | |||
484 | vpath = &hldev->virtual_paths[hldev->first_vp_id]; | ||
485 | |||
486 | for (i = 0; i < VXGE_HW_MAX_ROM_IMAGES; i++) { | ||
487 | data0 = VXGE_HW_RTS_ACCESS_STEER_ROM_IMAGE_INDEX(i); | ||
488 | data1 = steer_ctrl = 0; | ||
489 | |||
490 | status = vxge_hw_vpath_fw_api(vpath, | ||
491 | VXGE_HW_RTS_ACCESS_STEER_CTRL_DATA_STRUCT_SEL_FW_MEMO, | ||
492 | VXGE_HW_FW_API_GET_EPROM_REV, | ||
493 | 0, &data0, &data1, &steer_ctrl); | ||
494 | if (status != VXGE_HW_OK) | ||
495 | break; | ||
496 | |||
497 | img[i].is_valid = VXGE_HW_GET_EPROM_IMAGE_VALID(data0); | ||
498 | img[i].index = VXGE_HW_GET_EPROM_IMAGE_INDEX(data0); | ||
499 | img[i].type = VXGE_HW_GET_EPROM_IMAGE_TYPE(data0); | ||
500 | img[i].version = VXGE_HW_GET_EPROM_IMAGE_REV(data0); | ||
501 | } | ||
502 | |||
503 | return status; | ||
504 | } | ||
505 | |||
325 | /* | 506 | /* |
326 | * __vxge_hw_channel_allocate - Allocate memory for channel | 507 | * __vxge_hw_channel_allocate - Allocate memory for channel |
327 | * This function allocates required memory for the channel and various arrays | 508 | * This function allocates required memory for the channel and various arrays |