aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/vxge/vxge-config.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/vxge/vxge-config.c')
-rw-r--r--drivers/net/vxge/vxge-config.c183
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);
155static enum vxge_hw_status 155static 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
159static enum vxge_hw_status 158static 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
324enum vxge_hw_status
325vxge_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
349enum 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
375exit:
376 return status;
377}
378
379enum vxge_hw_status
380vxge_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 }
471out:
472 return status;
473}
474
475enum vxge_hw_status
476vxge_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