aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/qlogic/qed/qed_mcp.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/ethernet/qlogic/qed/qed_mcp.c')
-rw-r--r--drivers/net/ethernet/qlogic/qed/qed_mcp.c49
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
2466int 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, &param, &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
2466int qed_mcp_bist_register_test(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt) 2515int 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;