diff options
Diffstat (limited to 'drivers/net/ethernet/qlogic/qed/qed_mcp.c')
-rw-r--r-- | drivers/net/ethernet/qlogic/qed/qed_mcp.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/drivers/net/ethernet/qlogic/qed/qed_mcp.c b/drivers/net/ethernet/qlogic/qed/qed_mcp.c index 4e0b443c9519..62a220fce6e1 100644 --- a/drivers/net/ethernet/qlogic/qed/qed_mcp.c +++ b/drivers/net/ethernet/qlogic/qed/qed_mcp.c | |||
@@ -2463,6 +2463,55 @@ out: | |||
2463 | return rc; | 2463 | return rc; |
2464 | } | 2464 | } |
2465 | 2465 | ||
2466 | int qed_mcp_phy_sfp_read(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt, | ||
2467 | u32 port, u32 addr, u32 offset, u32 len, u8 *p_buf) | ||
2468 | { | ||
2469 | u32 bytes_left, bytes_to_copy, buf_size, nvm_offset = 0; | ||
2470 | u32 resp, param; | ||
2471 | int rc; | ||
2472 | |||
2473 | nvm_offset |= (port << DRV_MB_PARAM_TRANSCEIVER_PORT_OFFSET) & | ||
2474 | DRV_MB_PARAM_TRANSCEIVER_PORT_MASK; | ||
2475 | nvm_offset |= (addr << DRV_MB_PARAM_TRANSCEIVER_I2C_ADDRESS_OFFSET) & | ||
2476 | DRV_MB_PARAM_TRANSCEIVER_I2C_ADDRESS_MASK; | ||
2477 | |||
2478 | addr = offset; | ||
2479 | offset = 0; | ||
2480 | bytes_left = len; | ||
2481 | while (bytes_left > 0) { | ||
2482 | bytes_to_copy = min_t(u32, bytes_left, | ||
2483 | MAX_I2C_TRANSACTION_SIZE); | ||
2484 | nvm_offset &= (DRV_MB_PARAM_TRANSCEIVER_I2C_ADDRESS_MASK | | ||
2485 | DRV_MB_PARAM_TRANSCEIVER_PORT_MASK); | ||
2486 | nvm_offset |= ((addr + offset) << | ||
2487 | DRV_MB_PARAM_TRANSCEIVER_OFFSET_OFFSET) & | ||
2488 | DRV_MB_PARAM_TRANSCEIVER_OFFSET_MASK; | ||
2489 | nvm_offset |= (bytes_to_copy << | ||
2490 | DRV_MB_PARAM_TRANSCEIVER_SIZE_OFFSET) & | ||
2491 | DRV_MB_PARAM_TRANSCEIVER_SIZE_MASK; | ||
2492 | rc = qed_mcp_nvm_rd_cmd(p_hwfn, p_ptt, | ||
2493 | DRV_MSG_CODE_TRANSCEIVER_READ, | ||
2494 | nvm_offset, &resp, ¶m, &buf_size, | ||
2495 | (u32 *)(p_buf + offset)); | ||
2496 | if (rc) { | ||
2497 | DP_NOTICE(p_hwfn, | ||
2498 | "Failed to send a transceiver read command to the MFW. rc = %d.\n", | ||
2499 | rc); | ||
2500 | return rc; | ||
2501 | } | ||
2502 | |||
2503 | if (resp == FW_MSG_CODE_TRANSCEIVER_NOT_PRESENT) | ||
2504 | return -ENODEV; | ||
2505 | else if (resp != FW_MSG_CODE_TRANSCEIVER_DIAG_OK) | ||
2506 | return -EINVAL; | ||
2507 | |||
2508 | offset += buf_size; | ||
2509 | bytes_left -= buf_size; | ||
2510 | } | ||
2511 | |||
2512 | return 0; | ||
2513 | } | ||
2514 | |||
2466 | int qed_mcp_bist_register_test(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt) | 2515 | int qed_mcp_bist_register_test(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt) |
2467 | { | 2516 | { |
2468 | u32 drv_mb_param = 0, rsp, param; | 2517 | u32 drv_mb_param = 0, rsp, param; |