114b24e2bSVaishali Kulkarni /*
214b24e2bSVaishali Kulkarni * CDDL HEADER START
314b24e2bSVaishali Kulkarni *
414b24e2bSVaishali Kulkarni * The contents of this file are subject to the terms of the
514b24e2bSVaishali Kulkarni * Common Development and Distribution License, v.1,  (the "License").
614b24e2bSVaishali Kulkarni * You may not use this file except in compliance with the License.
714b24e2bSVaishali Kulkarni *
814b24e2bSVaishali Kulkarni * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
914b24e2bSVaishali Kulkarni * or http://opensource.org/licenses/CDDL-1.0.
1014b24e2bSVaishali Kulkarni * See the License for the specific language governing permissions
1114b24e2bSVaishali Kulkarni * and limitations under the License.
1214b24e2bSVaishali Kulkarni *
1314b24e2bSVaishali Kulkarni * When distributing Covered Code, include this CDDL HEADER in each
1414b24e2bSVaishali Kulkarni * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1514b24e2bSVaishali Kulkarni * If applicable, add the following below this CDDL HEADER, with the
1614b24e2bSVaishali Kulkarni * fields enclosed by brackets "[]" replaced with your own identifying
1714b24e2bSVaishali Kulkarni * information: Portions Copyright [yyyy] [name of copyright owner]
1814b24e2bSVaishali Kulkarni *
1914b24e2bSVaishali Kulkarni * CDDL HEADER END
2014b24e2bSVaishali Kulkarni */
2114b24e2bSVaishali Kulkarni 
2214b24e2bSVaishali Kulkarni /*
2314b24e2bSVaishali Kulkarni * Copyright 2014-2017 Cavium, Inc.
2414b24e2bSVaishali Kulkarni * The contents of this file are subject to the terms of the Common Development
2514b24e2bSVaishali Kulkarni * and Distribution License, v.1,  (the "License").
2614b24e2bSVaishali Kulkarni 
2714b24e2bSVaishali Kulkarni * You may not use this file except in compliance with the License.
2814b24e2bSVaishali Kulkarni 
2914b24e2bSVaishali Kulkarni * You can obtain a copy of the License at available
3014b24e2bSVaishali Kulkarni * at http://opensource.org/licenses/CDDL-1.0
3114b24e2bSVaishali Kulkarni 
3214b24e2bSVaishali Kulkarni * See the License for the specific language governing permissions and
3314b24e2bSVaishali Kulkarni * limitations under the License.
3414b24e2bSVaishali Kulkarni */
3514b24e2bSVaishali Kulkarni 
36b68ddc76SJohn Levon /*
37b68ddc76SJohn Levon  * Copyright 2018 Joyent, Inc.
38b68ddc76SJohn Levon  */
39b68ddc76SJohn Levon 
4014b24e2bSVaishali Kulkarni #include "bcm_osal.h"
4114b24e2bSVaishali Kulkarni #include "ecore.h"
4214b24e2bSVaishali Kulkarni #include "reg_addr.h"
4314b24e2bSVaishali Kulkarni #include "ecore_hw.h"
4414b24e2bSVaishali Kulkarni #include "ecore_hsi_common.h"
4514b24e2bSVaishali Kulkarni #include "ecore_mcp.h"
4614b24e2bSVaishali Kulkarni #include "nvm_cfg.h"
4714b24e2bSVaishali Kulkarni #include "ecore_phy_api.h"
4814b24e2bSVaishali Kulkarni 
4914b24e2bSVaishali Kulkarni #define SERDESID 0x900e
5014b24e2bSVaishali Kulkarni 
5114b24e2bSVaishali Kulkarni 
ecore_phy_read(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 port,u32 lane,u32 addr,u32 cmd,u8 * buf)5214b24e2bSVaishali Kulkarni enum _ecore_status_t ecore_phy_read(struct ecore_hwfn *p_hwfn,
5314b24e2bSVaishali Kulkarni 				    struct ecore_ptt *p_ptt, u32 port, u32 lane,
5414b24e2bSVaishali Kulkarni 				    u32 addr, u32 cmd, u8 *buf)
5514b24e2bSVaishali Kulkarni {
5614b24e2bSVaishali Kulkarni 	return ecore_mcp_phy_read(p_hwfn->p_dev, cmd,
5714b24e2bSVaishali Kulkarni 			addr | (lane << 16) | (1<<29) | (port << 30), buf, 8);
5814b24e2bSVaishali Kulkarni }
5914b24e2bSVaishali Kulkarni 
ecore_phy_write(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 port,u32 lane,u32 addr,u32 data_lo,u32 data_hi,u32 cmd)6014b24e2bSVaishali Kulkarni enum _ecore_status_t ecore_phy_write(struct ecore_hwfn *p_hwfn,
6114b24e2bSVaishali Kulkarni 				     struct ecore_ptt *p_ptt, u32 port,
6214b24e2bSVaishali Kulkarni 				     u32 lane, u32 addr, u32 data_lo,
6314b24e2bSVaishali Kulkarni 				     u32 data_hi, u32 cmd)
6414b24e2bSVaishali Kulkarni {
6514b24e2bSVaishali Kulkarni 	u8 buf64[8] = {0};
6614b24e2bSVaishali Kulkarni 
6714b24e2bSVaishali Kulkarni 	OSAL_MEMCPY(buf64, &data_lo, 4);
6814b24e2bSVaishali Kulkarni 	OSAL_MEMCPY(buf64 + 4, &data_hi, 4);
6914b24e2bSVaishali Kulkarni 
7014b24e2bSVaishali Kulkarni 	return ecore_mcp_phy_write(p_hwfn->p_dev, cmd,
7114b24e2bSVaishali Kulkarni 			addr | (lane << 16) | (1<<29) | (port << 30),
7214b24e2bSVaishali Kulkarni 				 buf64, 8);
7314b24e2bSVaishali Kulkarni }
7414b24e2bSVaishali Kulkarni 
7514b24e2bSVaishali Kulkarni /* phy core write */
ecore_phy_core_write(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 port,u32 addr,u32 data_lo,u32 data_hi,char * p_phy_result_buf)7614b24e2bSVaishali Kulkarni int ecore_phy_core_write(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt,
7714b24e2bSVaishali Kulkarni 			  u32 port, u32 addr, u32 data_lo, u32 data_hi,
7814b24e2bSVaishali Kulkarni 			  char *p_phy_result_buf)
7914b24e2bSVaishali Kulkarni {
8014b24e2bSVaishali Kulkarni 	enum _ecore_status_t rc = ECORE_INVAL;
8114b24e2bSVaishali Kulkarni 
8214b24e2bSVaishali Kulkarni 	if (port > 3) {
8314b24e2bSVaishali Kulkarni 		OSAL_SPRINTF(p_phy_result_buf,
8414b24e2bSVaishali Kulkarni 			     "ERROR! Port must be in range of 0..3\n");
8514b24e2bSVaishali Kulkarni 		return rc;
8614b24e2bSVaishali Kulkarni 	}
8714b24e2bSVaishali Kulkarni 
8814b24e2bSVaishali Kulkarni 	/* write to address */
8914b24e2bSVaishali Kulkarni 	rc = ecore_phy_write(p_hwfn, p_ptt, port, 0 /* lane */, addr, data_lo,
9014b24e2bSVaishali Kulkarni 			     data_hi, ECORE_PHY_CORE_WRITE);
9114b24e2bSVaishali Kulkarni 	if (rc == ECORE_SUCCESS)
9214b24e2bSVaishali Kulkarni 		OSAL_SPRINTF(p_phy_result_buf, "0\n");
9314b24e2bSVaishali Kulkarni 	else
9414b24e2bSVaishali Kulkarni 		OSAL_SPRINTF(p_phy_result_buf,
9514b24e2bSVaishali Kulkarni 			     "Failed placing phy_core command\n");
9614b24e2bSVaishali Kulkarni 
9714b24e2bSVaishali Kulkarni 	return rc;
9814b24e2bSVaishali Kulkarni }
9914b24e2bSVaishali Kulkarni 
10014b24e2bSVaishali Kulkarni /* phy core read */
ecore_phy_core_read(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 port,u32 addr,char * p_phy_result_buf)10114b24e2bSVaishali Kulkarni int ecore_phy_core_read(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt,
10214b24e2bSVaishali Kulkarni 			 u32 port, u32 addr, char *p_phy_result_buf)
10314b24e2bSVaishali Kulkarni {
10414b24e2bSVaishali Kulkarni 	enum _ecore_status_t rc = ECORE_INVAL;
10514b24e2bSVaishali Kulkarni 	u8 buf64[8] = {0};
10614b24e2bSVaishali Kulkarni 	u8 data_hi[4];
10714b24e2bSVaishali Kulkarni 	u8 data_lo[4];
10814b24e2bSVaishali Kulkarni 
10914b24e2bSVaishali Kulkarni 	if (port > 3) {
11014b24e2bSVaishali Kulkarni 		OSAL_SPRINTF(p_phy_result_buf,
11114b24e2bSVaishali Kulkarni 			     "ERROR! Port must be in range of 0..3\n");
11214b24e2bSVaishali Kulkarni 		return rc;
11314b24e2bSVaishali Kulkarni 	}
11414b24e2bSVaishali Kulkarni 
11514b24e2bSVaishali Kulkarni 	/* read from address */
11614b24e2bSVaishali Kulkarni 	rc = ecore_phy_read(p_hwfn, p_ptt, port, 0 /* lane */ , addr,
11714b24e2bSVaishali Kulkarni 			    ECORE_PHY_CORE_READ, buf64);
11814b24e2bSVaishali Kulkarni 	if (rc == ECORE_SUCCESS) {
11914b24e2bSVaishali Kulkarni 		OSAL_MEMCPY(data_lo, buf64, 4);
12014b24e2bSVaishali Kulkarni 		OSAL_MEMCPY(data_hi, (buf64 + 4), 4);
12114b24e2bSVaishali Kulkarni 		OSAL_SPRINTF(p_phy_result_buf, "0x%08x%08x\n",
12214b24e2bSVaishali Kulkarni 			     *(u32 *)data_hi, *(u32 *)data_lo);
12314b24e2bSVaishali Kulkarni 	}
12414b24e2bSVaishali Kulkarni 	else
12514b24e2bSVaishali Kulkarni 		OSAL_SPRINTF(p_phy_result_buf, "Failed placing phy_core command\n");
12614b24e2bSVaishali Kulkarni 
12714b24e2bSVaishali Kulkarni 	return rc;
12814b24e2bSVaishali Kulkarni }
12914b24e2bSVaishali Kulkarni 
13014b24e2bSVaishali Kulkarni /* phy raw write */
ecore_phy_raw_write(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 port,u32 lane,u32 addr,u32 data_lo,u32 data_hi,char * p_phy_result_buf)13114b24e2bSVaishali Kulkarni int ecore_phy_raw_write(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt,
13214b24e2bSVaishali Kulkarni 			 u32 port, u32 lane, u32 addr, u32 data_lo,
13314b24e2bSVaishali Kulkarni 			 u32 data_hi, char *p_phy_result_buf)
13414b24e2bSVaishali Kulkarni {
13514b24e2bSVaishali Kulkarni 	enum _ecore_status_t rc = ECORE_INVAL;
13614b24e2bSVaishali Kulkarni 
13714b24e2bSVaishali Kulkarni 	/* check if the enterd port is in the range */
13814b24e2bSVaishali Kulkarni 	if (port > 3) {
13914b24e2bSVaishali Kulkarni 		OSAL_SPRINTF(p_phy_result_buf,
14014b24e2bSVaishali Kulkarni 			     "Port must be in range of 0..3\n");
14114b24e2bSVaishali Kulkarni 		return rc;
14214b24e2bSVaishali Kulkarni 	}
14314b24e2bSVaishali Kulkarni 
14414b24e2bSVaishali Kulkarni 	/* check if the enterd lane is in the range */
14514b24e2bSVaishali Kulkarni 	if (lane > 6) {
14614b24e2bSVaishali Kulkarni 		OSAL_SPRINTF(p_phy_result_buf,
14714b24e2bSVaishali Kulkarni 			     "Lane must be in range of 0..6\n");
14814b24e2bSVaishali Kulkarni 		return rc;
14914b24e2bSVaishali Kulkarni 	}
15014b24e2bSVaishali Kulkarni 
15114b24e2bSVaishali Kulkarni 	/* write to address*/
15214b24e2bSVaishali Kulkarni 	rc = ecore_phy_write(p_hwfn,p_ptt, port, lane, addr, data_lo,
15314b24e2bSVaishali Kulkarni 			     data_hi, ECORE_PHY_RAW_WRITE);
15414b24e2bSVaishali Kulkarni 	if (rc == ECORE_SUCCESS)
15514b24e2bSVaishali Kulkarni 		OSAL_SPRINTF(p_phy_result_buf, "0\n");
15614b24e2bSVaishali Kulkarni 	else
15714b24e2bSVaishali Kulkarni 		OSAL_SPRINTF(p_phy_result_buf,
15814b24e2bSVaishali Kulkarni 			     "Failed placing phy_core command\n");
15914b24e2bSVaishali Kulkarni 
16014b24e2bSVaishali Kulkarni 	return rc;
16114b24e2bSVaishali Kulkarni }
16214b24e2bSVaishali Kulkarni 
16314b24e2bSVaishali Kulkarni /* phy raw read */
ecore_phy_raw_read(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 port,u32 lane,u32 addr,char * p_phy_result_buf)16414b24e2bSVaishali Kulkarni int ecore_phy_raw_read(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt,
16514b24e2bSVaishali Kulkarni 			u32 port, u32 lane, u32 addr, char *p_phy_result_buf)
16614b24e2bSVaishali Kulkarni {
16714b24e2bSVaishali Kulkarni 	enum _ecore_status_t rc = ECORE_INVAL;
16814b24e2bSVaishali Kulkarni 	u8 buf64[8] = {0};
16914b24e2bSVaishali Kulkarni 	u8 data_hi[4];
17014b24e2bSVaishali Kulkarni 	u8 data_lo[4];
17114b24e2bSVaishali Kulkarni 
17214b24e2bSVaishali Kulkarni 	/* check if the enterd port is in the range */
17314b24e2bSVaishali Kulkarni 	if (port > 3) {
17414b24e2bSVaishali Kulkarni 		OSAL_SPRINTF(p_phy_result_buf,
17514b24e2bSVaishali Kulkarni 			     "Port must be in range of 0..3\n");
17614b24e2bSVaishali Kulkarni 		return rc;
17714b24e2bSVaishali Kulkarni 	}
17814b24e2bSVaishali Kulkarni 
17914b24e2bSVaishali Kulkarni 	/* check if the enterd lane is in the range */
18014b24e2bSVaishali Kulkarni 	if (lane > 6) {
18114b24e2bSVaishali Kulkarni 		OSAL_SPRINTF(p_phy_result_buf,
18214b24e2bSVaishali Kulkarni 			     "Lane must be in range of 0..6\n");
18314b24e2bSVaishali Kulkarni 		return rc;
18414b24e2bSVaishali Kulkarni 	}
18514b24e2bSVaishali Kulkarni 
18614b24e2bSVaishali Kulkarni 	/* read from address */
18714b24e2bSVaishali Kulkarni 	rc = ecore_phy_read(p_hwfn,p_ptt, port, lane, addr, ECORE_PHY_RAW_READ,
18814b24e2bSVaishali Kulkarni 			    buf64);
18914b24e2bSVaishali Kulkarni 	if (rc == ECORE_SUCCESS) {
19014b24e2bSVaishali Kulkarni 		OSAL_MEMCPY(data_lo, buf64, 4);
19114b24e2bSVaishali Kulkarni 		OSAL_MEMCPY(data_hi, (buf64 + 4), 4);
19214b24e2bSVaishali Kulkarni 		OSAL_SPRINTF(p_phy_result_buf, "0x%08x%08x\n",
19314b24e2bSVaishali Kulkarni 			     *(u32 *)data_hi, *(u32 *)data_lo);
19414b24e2bSVaishali Kulkarni 	} else {
19514b24e2bSVaishali Kulkarni 		OSAL_SPRINTF(p_phy_result_buf,
19614b24e2bSVaishali Kulkarni 			     "Failed placing phy_core command\n");
19714b24e2bSVaishali Kulkarni 	}
19814b24e2bSVaishali Kulkarni 
19914b24e2bSVaishali Kulkarni 	return rc;
20014b24e2bSVaishali Kulkarni }
20114b24e2bSVaishali Kulkarni 
ecore_phy_get_nvm_cfg1_addr(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt)20214b24e2bSVaishali Kulkarni static u32 ecore_phy_get_nvm_cfg1_addr(struct ecore_hwfn *p_hwfn,
20314b24e2bSVaishali Kulkarni 				       struct ecore_ptt *p_ptt)
20414b24e2bSVaishali Kulkarni {
20514b24e2bSVaishali Kulkarni 	u32 nvm_cfg_addr, nvm_cfg1_offset;
20614b24e2bSVaishali Kulkarni 
20714b24e2bSVaishali Kulkarni 	nvm_cfg_addr = ecore_rd(p_hwfn, p_ptt, MISC_REG_GEN_PURP_CR0);
20814b24e2bSVaishali Kulkarni 	nvm_cfg1_offset = ecore_rd(p_hwfn, p_ptt, nvm_cfg_addr +
20914b24e2bSVaishali Kulkarni 				   offsetof(struct nvm_cfg,
21014b24e2bSVaishali Kulkarni 					    sections_offset[NVM_CFG_SECTION_NVM_CFG1]));
21114b24e2bSVaishali Kulkarni 	return MCP_REG_SCRATCH + nvm_cfg1_offset;
21214b24e2bSVaishali Kulkarni }
21314b24e2bSVaishali Kulkarni 
21414b24e2bSVaishali Kulkarni /* get phy info */
ecore_phy_info(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,char * p_phy_result_buf)21514b24e2bSVaishali Kulkarni int ecore_phy_info(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt,
21614b24e2bSVaishali Kulkarni 		    char *p_phy_result_buf)
21714b24e2bSVaishali Kulkarni {
21814b24e2bSVaishali Kulkarni 	u32 nvm_cfg1_addr = ecore_phy_get_nvm_cfg1_addr(p_hwfn, p_ptt);
21914b24e2bSVaishali Kulkarni 	u32 port_mode, port, max_ports, core_cfg, length = 0;
22014b24e2bSVaishali Kulkarni 	enum _ecore_status_t rc = ECORE_INVAL;
22114b24e2bSVaishali Kulkarni 	u8 buf64[8] = {0};
22214b24e2bSVaishali Kulkarni 	u8 data_hi[4];
22314b24e2bSVaishali Kulkarni 	u8 data_lo[4];
22414b24e2bSVaishali Kulkarni 
22514b24e2bSVaishali Kulkarni 	u8 is_bb = ((ecore_rd(p_hwfn, p_ptt, MISCS_REG_CHIP_NUM) & 0x8070)
22614b24e2bSVaishali Kulkarni 		    != 0x8070);
22714b24e2bSVaishali Kulkarni 
22814b24e2bSVaishali Kulkarni 	if (is_bb)
22914b24e2bSVaishali Kulkarni 		length += OSAL_SPRINTF(&p_phy_result_buf[length],
23014b24e2bSVaishali Kulkarni 				       "Device: BB ");
23114b24e2bSVaishali Kulkarni 	else
23214b24e2bSVaishali Kulkarni 		length += OSAL_SPRINTF(&p_phy_result_buf[length],
23314b24e2bSVaishali Kulkarni 				       "Device: AH ");
23414b24e2bSVaishali Kulkarni 
23514b24e2bSVaishali Kulkarni 	core_cfg = ecore_rd(p_hwfn, p_ptt, nvm_cfg1_addr +
23614b24e2bSVaishali Kulkarni 			    offsetof(struct nvm_cfg1, glob.core_cfg));
23714b24e2bSVaishali Kulkarni 	port_mode = (core_cfg & NVM_CFG1_GLOB_NETWORK_PORT_MODE_MASK) >>
23814b24e2bSVaishali Kulkarni 		NVM_CFG1_GLOB_NETWORK_PORT_MODE_OFFSET;
23914b24e2bSVaishali Kulkarni 	switch (port_mode) {
24014b24e2bSVaishali Kulkarni 	case NVM_CFG1_GLOB_NETWORK_PORT_MODE_BB_1X100G:
24114b24e2bSVaishali Kulkarni 		length += OSAL_SPRINTF(&p_phy_result_buf[length], "1x100G\n");
24214b24e2bSVaishali Kulkarni 		max_ports = 1;
24314b24e2bSVaishali Kulkarni 		break;
24414b24e2bSVaishali Kulkarni 	case NVM_CFG1_GLOB_NETWORK_PORT_MODE_1X40G:
24514b24e2bSVaishali Kulkarni 		length += OSAL_SPRINTF(&p_phy_result_buf[length], "1x40G\n");
24614b24e2bSVaishali Kulkarni 		max_ports = 1;
24714b24e2bSVaishali Kulkarni 		break;
24814b24e2bSVaishali Kulkarni 	case NVM_CFG1_GLOB_NETWORK_PORT_MODE_1X25G:
24914b24e2bSVaishali Kulkarni 		length += OSAL_SPRINTF(&p_phy_result_buf[length], "1x25G\n");
25014b24e2bSVaishali Kulkarni 		max_ports = 1;
25114b24e2bSVaishali Kulkarni 		break;
25214b24e2bSVaishali Kulkarni 	case NVM_CFG1_GLOB_NETWORK_PORT_MODE_BB_2X40G:
25314b24e2bSVaishali Kulkarni 		length += OSAL_SPRINTF(&p_phy_result_buf[length], "2x40G\n");
25414b24e2bSVaishali Kulkarni 		max_ports = 2;
25514b24e2bSVaishali Kulkarni 		break;
25614b24e2bSVaishali Kulkarni 	case NVM_CFG1_GLOB_NETWORK_PORT_MODE_2X50G:
25714b24e2bSVaishali Kulkarni 		length += OSAL_SPRINTF(&p_phy_result_buf[length], "2x50G\n");
25814b24e2bSVaishali Kulkarni 		max_ports = 2;
25914b24e2bSVaishali Kulkarni 		break;
26014b24e2bSVaishali Kulkarni 	case NVM_CFG1_GLOB_NETWORK_PORT_MODE_2X25G:
26114b24e2bSVaishali Kulkarni 		length += OSAL_SPRINTF(&p_phy_result_buf[length], "2x25G\n");
26214b24e2bSVaishali Kulkarni 		max_ports = 2;
26314b24e2bSVaishali Kulkarni 		break;
26414b24e2bSVaishali Kulkarni 	case NVM_CFG1_GLOB_NETWORK_PORT_MODE_2X10G:
26514b24e2bSVaishali Kulkarni 		length += OSAL_SPRINTF(&p_phy_result_buf[length], "2x10G\n");
26614b24e2bSVaishali Kulkarni 		max_ports = 2;
26714b24e2bSVaishali Kulkarni 		break;
26814b24e2bSVaishali Kulkarni 	case NVM_CFG1_GLOB_NETWORK_PORT_MODE_4X10G_F:
26914b24e2bSVaishali Kulkarni 		length += OSAL_SPRINTF(&p_phy_result_buf[length], "4x10G\n");
27014b24e2bSVaishali Kulkarni 		max_ports = 4;
27114b24e2bSVaishali Kulkarni 		break;
27214b24e2bSVaishali Kulkarni 	case NVM_CFG1_GLOB_NETWORK_PORT_MODE_BB_4X10G_E:
27314b24e2bSVaishali Kulkarni 		length += OSAL_SPRINTF(&p_phy_result_buf[length], "4x10G\n");
27414b24e2bSVaishali Kulkarni 		max_ports = 4;
27514b24e2bSVaishali Kulkarni 		break;
27614b24e2bSVaishali Kulkarni 	case NVM_CFG1_GLOB_NETWORK_PORT_MODE_BB_4X20G:
27714b24e2bSVaishali Kulkarni 		length += OSAL_SPRINTF(&p_phy_result_buf[length], "4x20G\n");
27814b24e2bSVaishali Kulkarni 		max_ports = 4;
27914b24e2bSVaishali Kulkarni 		break;
28014b24e2bSVaishali Kulkarni 	case NVM_CFG1_GLOB_NETWORK_PORT_MODE_4X25G:
28114b24e2bSVaishali Kulkarni 		length += OSAL_SPRINTF(&p_phy_result_buf[length], "4x25G\n");
28214b24e2bSVaishali Kulkarni 		max_ports = 4;
28314b24e2bSVaishali Kulkarni 		break;
28414b24e2bSVaishali Kulkarni 	default:
28514b24e2bSVaishali Kulkarni 		length += OSAL_SPRINTF(&p_phy_result_buf[length],
28614b24e2bSVaishali Kulkarni 				      "Wrong port mode\n");
28714b24e2bSVaishali Kulkarni 		return rc;
28814b24e2bSVaishali Kulkarni 	}
28914b24e2bSVaishali Kulkarni 
29014b24e2bSVaishali Kulkarni 	if (is_bb) {
29114b24e2bSVaishali Kulkarni 		for (port = 0; port < max_ports; port++) {
29214b24e2bSVaishali Kulkarni 			rc = ecore_phy_read(p_hwfn, p_ptt, port, 0, SERDESID,
29314b24e2bSVaishali Kulkarni 					    DRV_MSG_CODE_PHY_RAW_READ, buf64);
29414b24e2bSVaishali Kulkarni 			if (rc == ECORE_SUCCESS) {
29514b24e2bSVaishali Kulkarni 				length += OSAL_SPRINTF(
29614b24e2bSVaishali Kulkarni 					&p_phy_result_buf[length],
29714b24e2bSVaishali Kulkarni 					"Port %d is in ", port);
29814b24e2bSVaishali Kulkarni 				OSAL_MEMCPY(data_lo, buf64, 4);
29914b24e2bSVaishali Kulkarni 				OSAL_MEMCPY(data_hi, (buf64 + 4), 4);
30014b24e2bSVaishali Kulkarni 				if ((data_lo[0] & 0x3f) == 0x14)
30114b24e2bSVaishali Kulkarni 					length += OSAL_SPRINTF(
30214b24e2bSVaishali Kulkarni 						&p_phy_result_buf[length],
30314b24e2bSVaishali Kulkarni 						"Falcon\n");
30414b24e2bSVaishali Kulkarni 				else
30514b24e2bSVaishali Kulkarni 					length += OSAL_SPRINTF(
30614b24e2bSVaishali Kulkarni 						&p_phy_result_buf[length],
30714b24e2bSVaishali Kulkarni 						"Eagle\n");
30814b24e2bSVaishali Kulkarni 			}
30914b24e2bSVaishali Kulkarni 		}
31014b24e2bSVaishali Kulkarni 	} else {
31114b24e2bSVaishali Kulkarni 		/* @@@TMP until ecore_phy_read() on AH is supported */
31214b24e2bSVaishali Kulkarni 		for (port = 0; port < max_ports; port++)
31314b24e2bSVaishali Kulkarni 			length += OSAL_SPRINTF(&p_phy_result_buf[length],
31414b24e2bSVaishali Kulkarni 					       "Port %d is in MPS25\n", port);
31514b24e2bSVaishali Kulkarni 		rc = ECORE_SUCCESS;
31614b24e2bSVaishali Kulkarni 	}
31714b24e2bSVaishali Kulkarni 
31814b24e2bSVaishali Kulkarni 	return rc;
31914b24e2bSVaishali Kulkarni }
32014b24e2bSVaishali Kulkarni 
32114b24e2bSVaishali Kulkarni struct tsc_stat {
32214b24e2bSVaishali Kulkarni 	u32 reg;
32314b24e2bSVaishali Kulkarni 	char *name;
32414b24e2bSVaishali Kulkarni 	char *desc;
32514b24e2bSVaishali Kulkarni };
32614b24e2bSVaishali Kulkarni 
32714b24e2bSVaishali Kulkarni static struct tsc_stat ah_stat_regs[] = {
32814b24e2bSVaishali Kulkarni 	{0x000100, "ETHERSTATSOCTETS               ", "total, good and bad"},
32914b24e2bSVaishali Kulkarni /*	{0x000104, "ETHERSTATSOCTETS_H             ", "total, good and bad"},*/
33014b24e2bSVaishali Kulkarni 	{0x000108, "OCTETSOK                       ", "total, good"},
33114b24e2bSVaishali Kulkarni /*	{0x00010c, "OCTETSOK_H                     ", "total, good"}, */
33214b24e2bSVaishali Kulkarni 	{0x000110, "AALIGNMENTERRORS               ", "Wrong SFD detected"},
33314b24e2bSVaishali Kulkarni /*	{0x000114, "AALIGNMENTERRORS_H             ", "Wrong SFD detected"}, */
33414b24e2bSVaishali Kulkarni 	{0x000118, "APAUSEMACCTRLFRAMES            ", "Good Pause frames received"},
33514b24e2bSVaishali Kulkarni /*	{0x00011c, "APAUSEMACCTRLFRAMES_H          ", "Good Pause frames received"}, */
33614b24e2bSVaishali Kulkarni 	{0x000120, "FRAMESOK                       ", "Good frames received"},
33714b24e2bSVaishali Kulkarni /*	{0x000124, "FRAMESOK_H                     ", "Good frames received"}, */
33814b24e2bSVaishali Kulkarni 	{0x000128, "CRCERRORS                      ", "wrong CRC and good length received"},
33914b24e2bSVaishali Kulkarni /*	{0x00012c, "CRCERRORS_H                    ", "wrong CRC and good length received"}, */
34014b24e2bSVaishali Kulkarni 	{0x000130, "VLANOK                         ", "Good Frames with VLAN tag received"},
34114b24e2bSVaishali Kulkarni /*	{0x000134, "VLANOK_H                       ", "Good Frames with VLAN tag received"}, */
34214b24e2bSVaishali Kulkarni 	{0x000138, "IFINERRORS                     ", "Errored frames received"},
34314b24e2bSVaishali Kulkarni /*	{0x00013c, "IFINERRORS_H                   ", "Errored frames received"}, */
34414b24e2bSVaishali Kulkarni 	{0x000140, "IFINUCASTPKTS                  ", "Good Unicast received"},
34514b24e2bSVaishali Kulkarni /*	{0x000144, "IFINUCASTPKTS_H                ", "Good Unicast received"}, */
34614b24e2bSVaishali Kulkarni 	{0x000148, "IFINMCASTPKTS                  ", "Good Multicast received"},
34714b24e2bSVaishali Kulkarni /*	{0x00014c, "IFINMCASTPKTS_H                ", "Good Multicast received"}, */
34814b24e2bSVaishali Kulkarni 	{0x000150, "IFINBCASTPKTS                  ", "Good Broadcast received"},
34914b24e2bSVaishali Kulkarni /*	{0x000154, "IFINBCASTPKTS_H                ", "Good Broadcast received"}, */
35014b24e2bSVaishali Kulkarni 	{0x000158, "ETHERSTATSDROPEVENTS           ", "Dropped frames"},
35114b24e2bSVaishali Kulkarni /*	{0x00015c, "ETHERSTATSDROPEVENTS_H         ", "Dropped frames"}, */
35214b24e2bSVaishali Kulkarni 	{0x000160, "ETHERSTATSPKTS                 ", "Frames received, good and bad"},
35314b24e2bSVaishali Kulkarni /*	{0x000164, "ETHERSTATSPKTS_H               ", "Frames received, good and bad"}, */
35414b24e2bSVaishali Kulkarni 	{0x000168, "ETHERSTATSUNDERSIZEPKTS        ", "Frames received less 64 with good crc"},
35514b24e2bSVaishali Kulkarni /*	{0x00016c, "ETHERSTATSUNDERSIZEPKTS_H      ", "Frames received less 64 with good crc"}, */
35614b24e2bSVaishali Kulkarni 	{0x000170, "ETHERSTATSPKTS64               ", "Frames of 64 octets received"},
35714b24e2bSVaishali Kulkarni /*	{0x000174, "ETHERSTATSPKTS64_H             ", "Frames of 64 octets received"}, */
35814b24e2bSVaishali Kulkarni 	{0x000178, "ETHERSTATSPKTS65TO127          ", "Frames of 65 to 127 octets received"},
35914b24e2bSVaishali Kulkarni /*       {0x00017c, "ETHERSTATSPKTS65TO127_H        ", "Frames of 65 to 127 octets received"}, */
36014b24e2bSVaishali Kulkarni 	{0x000180, "ETHERSTATSPKTS128TO255         ", "Frames of 128 to 255 octets received"},
36114b24e2bSVaishali Kulkarni /*	{0x000184, "ETHERSTATSPKTS128TO255_H       ", "Frames of 128 to 255 octets received"}, */
36214b24e2bSVaishali Kulkarni 	{0x000188, "ETHERSTATSPKTS256TO511         ", "Frames of 256 to 511 octets received"},
36314b24e2bSVaishali Kulkarni /*	{0x00018c, "ETHERSTATSPKTS256TO511_H       ", "Frames of 256 to 511 octets received"},*/
36414b24e2bSVaishali Kulkarni 	{0x000190, "ETHERSTATSPKTS512TO1023        ", "Frames of 512 to 1023 octets received"},
36514b24e2bSVaishali Kulkarni /*	{0x000194, "ETHERSTATSPKTS512TO1023_H      ", "Frames of 512 to 1023 octets received"},*/
36614b24e2bSVaishali Kulkarni 	{0x000198, "ETHERSTATSPKTS1024TO1518       ", "Frames of 1024 to 1518 octets received"},
36714b24e2bSVaishali Kulkarni /*	{0x00019c, "ETHERSTATSPKTS1024TO1518_H     ", "Frames of 1024 to 1518 octets received"},*/
36814b24e2bSVaishali Kulkarni 	{0x0001a0, "ETHERSTATSPKTS1519TOMAX        ", "Frames of 1519 to FRM_LENGTH octets received"},
36914b24e2bSVaishali Kulkarni /*	{0x0001a4, "ETHERSTATSPKTS1519TOMAX_H      ", "Frames of 1519 to FRM_LENGTH octets received"},*/
37014b24e2bSVaishali Kulkarni 	{0x0001a8, "ETHERSTATSPKTSOVERSIZE         ", "Frames greater FRM_LENGTH and good CRC received"},
37114b24e2bSVaishali Kulkarni /*	{0x0001ac, "ETHERSTATSPKTSOVERSIZE_H       ", "Frames greater FRM_LENGTH and good CRC received"},*/
37214b24e2bSVaishali Kulkarni 	{0x0001b0, "ETHERSTATSJABBERS              ", "Frames greater FRM_LENGTH and bad CRC received"},
37314b24e2bSVaishali Kulkarni /*	{0x0001b4, "ETHERSTATSJABBERS_H            ", "Frames greater FRM_LENGTH and bad CRC received"},*/
37414b24e2bSVaishali Kulkarni 	{0x0001b8, "ETHERSTATSFRAGMENTS            ", "Frames less 64 and bad CRC received"},
37514b24e2bSVaishali Kulkarni /*	{0x0001bc, "ETHERSTATSFRAGMENTS_H          ", "Frames less 64 and bad CRC received"},*/
37614b24e2bSVaishali Kulkarni 	{0x0001c0, "AMACCONTROLFRAMES              ", "Good frames received of type 0x8808 but not Pause"},
37714b24e2bSVaishali Kulkarni /*	{0x0001c4, "AMACCONTROLFRAMES_H            ", "Good frames received of type 0x8808 but not Pause"},*/
37814b24e2bSVaishali Kulkarni 	{0x0001c8, "AFRAMETOOLONG                  ", "Good and bad frames exceeding FRM_LENGTH received"},
37914b24e2bSVaishali Kulkarni /*	{0x0001cc, "AFRAMETOOLONG_H                ", "Good and bad frames exceeding FRM_LENGTH received"},*/
38014b24e2bSVaishali Kulkarni 	{0x0001d0, "AINRANGELENGTHERROR            ", "Good frames with invalid length field (not supported)"},
38114b24e2bSVaishali Kulkarni /*	{0x0001d4, "AINRANGELENGTHERROR_H          ", "Good frames with invalid length field (not supported)"},*/
38214b24e2bSVaishali Kulkarni 	{0x000200, "TXETHERSTATSOCTETS             ", "total, good and bad"},
38314b24e2bSVaishali Kulkarni /*	{0x000204, "TXETHERSTATSOCTETS_H           ", "total, good and bad"},*/
38414b24e2bSVaishali Kulkarni 	{0x000208, "TXOCTETSOK                     ", "total, good"},
38514b24e2bSVaishali Kulkarni /*	{0x00020c, "TXOCTETSOK_H                   ", "total, good"},*/
38614b24e2bSVaishali Kulkarni 	{0x000218, "TXAPAUSEMACCTRLFRAMES          ", "Good Pause frames transmitted"},
38714b24e2bSVaishali Kulkarni /*	{0x00021c, "TXAPAUSEMACCTRLFRAMES_H        ", "Good Pause frames transmitted"},*/
38814b24e2bSVaishali Kulkarni 	{0x000220, "TXFRAMESOK                     ", "Good frames transmitted"},
38914b24e2bSVaishali Kulkarni /*	{0x000224, "TXFRAMESOK_H                   ", "Good frames transmitted"},*/
39014b24e2bSVaishali Kulkarni 	{0x000228, "TXCRCERRORS                    ", "wrong CRC transmitted"},
39114b24e2bSVaishali Kulkarni /*	{0x00022c, "TXCRCERRORS_H                  ", "wrong CRC transmitted"},*/
39214b24e2bSVaishali Kulkarni 	{0x000230, "TXVLANOK                       ", "Good Frames with VLAN tag transmitted"},
39314b24e2bSVaishali Kulkarni /*	{0x000234, "TXVLANOK_H                     ", "Good Frames with VLAN tag transmitted"},*/
39414b24e2bSVaishali Kulkarni 	{0x000238, "IFOUTERRORS                    ", "Errored frames transmitted"},
39514b24e2bSVaishali Kulkarni /*	{0x00023c, "IFOUTERRORS_H                  ", "Errored frames transmitted"},*/
39614b24e2bSVaishali Kulkarni 	{0x000240, "IFOUTUCASTPKTS                 ", "Good Unicast transmitted"},
39714b24e2bSVaishali Kulkarni /*	{0x000244, "IFOUTUCASTPKTS_H               ", "Good Unicast transmitted"},*/
39814b24e2bSVaishali Kulkarni 	{0x000248, "IFOUTMCASTPKTS                 ", "Good Multicast transmitted"},
39914b24e2bSVaishali Kulkarni /*	{0x00024c, "IFOUTMCASTPKTS_H               ", "Good Multicast transmitted"},*/
40014b24e2bSVaishali Kulkarni 	{0x000250, "IFOUTBCASTPKTS                 ", "Good Broadcast transmitted"},
40114b24e2bSVaishali Kulkarni /*	{0x000254, "IFOUTBCASTPKTS_H               ", "Good Broadcast transmitted"},*/
40214b24e2bSVaishali Kulkarni 	{0x000258, "TXETHERSTATSDROPEVENTS         ", "Dropped frames (unused, reserved)"},
40314b24e2bSVaishali Kulkarni /*	{0x00025c, "TXETHERSTATSDROPEVENTS_H       ", "Dropped frames (unused, reserved)"},*/
40414b24e2bSVaishali Kulkarni 	{0x000260, "TXETHERSTATSPKTS               ", "Frames transmitted, good and bad"},
40514b24e2bSVaishali Kulkarni /*	{0x000264, "TXETHERSTATSPKTS_H             ", "Frames transmitted, good and bad"},*/
40614b24e2bSVaishali Kulkarni 	{0x000268, "TXETHERSTATSUNDERSIZEPKTS      ", "Frames transmitted less 64"},
40714b24e2bSVaishali Kulkarni /*	{0x00026c, "TXETHERSTATSUNDERSIZEPKTS_H    ", "Frames transmitted less 64"},*/
40814b24e2bSVaishali Kulkarni 	{0x000270, "TXETHERSTATSPKTS64             ", "Frames of 64 octets transmitted"},
40914b24e2bSVaishali Kulkarni /*	{0x000274, "TXETHERSTATSPKTS64_H           ", "Frames of 64 octets transmitted"},*/
41014b24e2bSVaishali Kulkarni 	{0x000278, "TXETHERSTATSPKTS65TO127        ", "Frames of 65 to 127 octets transmitted"},
41114b24e2bSVaishali Kulkarni /*	{0x00027c, "TXETHERSTATSPKTS65TO127_H      ", "Frames of 65 to 127 octets transmitted"},*/
41214b24e2bSVaishali Kulkarni 	{0x000280, "TXETHERSTATSPKTS128TO255       ", "Frames of 128 to 255 octets transmitted"},
41314b24e2bSVaishali Kulkarni /*	{0x000284, "TXETHERSTATSPKTS128TO255_H     ", "Frames of 128 to 255 octets transmitted"},*/
41414b24e2bSVaishali Kulkarni 	{0x000288, "TXETHERSTATSPKTS256TO511       ", "Frames of 256 to 511 octets transmitted"},
41514b24e2bSVaishali Kulkarni /*	{0x00028c, "TXETHERSTATSPKTS256TO511_H     ", "Frames of 256 to 511 octets transmitted"},*/
41614b24e2bSVaishali Kulkarni 	{0x000290, "TXETHERSTATSPKTS512TO1023      ", "Frames of 512 to 1023 octets transmitted"},
41714b24e2bSVaishali Kulkarni /*	{0x000294, "TXETHERSTATSPKTS512TO1023_H    ", "Frames of 512 to 1023 octets transmitted"},*/
41814b24e2bSVaishali Kulkarni 	{0x000298, "TXETHERSTATSPKTS1024TO1518     ", "Frames of 1024 to 1518 octets transmitted"},
41914b24e2bSVaishali Kulkarni /*	{0x00029c, "TXETHERSTATSPKTS1024TO1518_H   ", "Frames of 1024 to 1518 octets transmitted"},*/
42014b24e2bSVaishali Kulkarni 	{0x0002a0, "TXETHERSTATSPKTS1519TOTX_MTU   ", "Frames of 1519 to FRM_LENGTH.TX_MTU octets transmitted"},
42114b24e2bSVaishali Kulkarni /*	{0x0002a4, "TXETHERSTATSPKTS1519TOTX_MTU_H ", "Frames of 1519 to FRM_LENGTH.TX_MTU octets transmitted"},*/
42214b24e2bSVaishali Kulkarni 	{0x0002c0, "TXAMACCONTROLFRAMES            ", "Good frames transmitted of type 0x8808 but not Pause"},
42314b24e2bSVaishali Kulkarni /*	{0x0002c4, "TXAMACCONTROLFRAMES_H          ", "Good frames transmitted of type 0x8808 but not Pause"},*/
42414b24e2bSVaishali Kulkarni 	{0x000380, "ACBFCPAUSEFRAMESRECEIVED_0     ", "Set of 8 objects recording the number of CBFC (Class Based Flow Control) pause frames received for each class."},
42514b24e2bSVaishali Kulkarni /*	{0x000384, "ACBFCPAUSEFRAMESRECEIVED_0_H   ", "Upper 32bit of 64bit counter."},*/
42614b24e2bSVaishali Kulkarni 	{0x000388, "ACBFCPAUSEFRAMESRECEIVED_1     ", "Set of 8 objects recording the number of CBFC (Class Based Flow Control) pause frames received for each class."},
42714b24e2bSVaishali Kulkarni /*	{0x00038c, "ACBFCPAUSEFRAMESRECEIVED_1_H   ", "Upper 32bit of 64bit counter."},*/
42814b24e2bSVaishali Kulkarni 	{0x000390, "ACBFCPAUSEFRAMESRECEIVED_2     ", "Set of 8 objects recording the number of CBFC (Class Based Flow Control) pause frames received for each class."},
42914b24e2bSVaishali Kulkarni /*	{0x000394, "ACBFCPAUSEFRAMESRECEIVED_2_H   ", "Upper 32bit of 64bit counter."},*/
43014b24e2bSVaishali Kulkarni 	{0x000398, "ACBFCPAUSEFRAMESRECEIVED_3     ", "Set of 8 objects recording the number of CBFC (Class Based Flow Control) pause frames received for each class."},
43114b24e2bSVaishali Kulkarni /*	{0x00039c, "ACBFCPAUSEFRAMESRECEIVED_3_H   ", "Upper 32bit of 64bit counter."},*/
43214b24e2bSVaishali Kulkarni 	{0x0003a0, "ACBFCPAUSEFRAMESRECEIVED_4     ", "Set of 8 objects recording the number of CBFC (Class Based Flow Control) pause frames received for each class."},
43314b24e2bSVaishali Kulkarni /*	{0x0003a4, "ACBFCPAUSEFRAMESRECEIVED_4_H   ", "Upper 32bit of 64bit counter."},*/
43414b24e2bSVaishali Kulkarni 	{0x0003a8, "ACBFCPAUSEFRAMESRECEIVED_5     ", "Set of 8 objects recording the number of CBFC (Class Based Flow Control) pause frames received for each class."},
43514b24e2bSVaishali Kulkarni /*	{0x0003ac, "ACBFCPAUSEFRAMESRECEIVED_5_H   ", "Upper 32bit of 64bit counter."},*/
43614b24e2bSVaishali Kulkarni 	{0x0003b0, "ACBFCPAUSEFRAMESRECEIVED_6     ", "Set of 8 objects recording the number of CBFC (Class Based Flow Control) pause frames received for each class."},
43714b24e2bSVaishali Kulkarni /*	{0x0003b4, "ACBFCPAUSEFRAMESRECEIVED_6_H   ", "Upper 32bit of 64bit counter."},*/
43814b24e2bSVaishali Kulkarni 	{0x0003b8, "ACBFCPAUSEFRAMESRECEIVED_7     ", "Set of 8 objects recording the number of CBFC (Class Based Flow Control) pause frames received for each class."},
43914b24e2bSVaishali Kulkarni /*	{0x0003bc, "ACBFCPAUSEFRAMESRECEIVED_7_H   ", "Upper 32bit of 64bit counter."},*/
44014b24e2bSVaishali Kulkarni 	{0x0003c0, "ACBFCPAUSEFRAMESTRANSMITTED_0  ", "Set of 8 objects recording the number of CBFC (Class Based Flow Control) pause frames transmitted for each class."},
44114b24e2bSVaishali Kulkarni /*	{0x0003c4, "ACBFCPAUSEFRAMESTRANSMITTED_0_H", "Upper 32bit of 64bit counter."},*/
44214b24e2bSVaishali Kulkarni 	{0x0003c8, "ACBFCPAUSEFRAMESTRANSMITTED_1  ", "Set of 8 objects recording the number of CBFC (Class Based Flow Control) pause frames transmitted for each class."},
44314b24e2bSVaishali Kulkarni /*	{0x0003cc, "ACBFCPAUSEFRAMESTRANSMITTED_1_H", "Upper 32bit of 64bit counter."},*/
44414b24e2bSVaishali Kulkarni 	{0x0003d0, "ACBFCPAUSEFRAMESTRANSMITTED_2  ", "Set of 8 objects recording the number of CBFC (Class Based Flow Control) pause frames transmitted for each class."},
44514b24e2bSVaishali Kulkarni /*	{0x0003d4, "ACBFCPAUSEFRAMESTRANSMITTED_2_H", "Upper 32bit of 64bit counter."},*/
44614b24e2bSVaishali Kulkarni 	{0x0003d8, "ACBFCPAUSEFRAMESTRANSMITTED_3  ", "Set of 8 objects recording the number of CBFC (Class Based Flow Control) pause frames transmitted for each class."},
44714b24e2bSVaishali Kulkarni /*	{0x0003dc, "ACBFCPAUSEFRAMESTRANSMITTED_3_H", "Upper 32bit of 64bit counter."},*/
44814b24e2bSVaishali Kulkarni 	{0x0003e0, "ACBFCPAUSEFRAMESTRANSMITTED_4  ", "Set of 8 objects recording the number of CBFC (Class Based Flow Control) pause frames transmitted for each class."},
44914b24e2bSVaishali Kulkarni /*	{0x0003e4, "ACBFCPAUSEFRAMESTRANSMITTED_4_H", "Upper 32bit of 64bit counter."},*/
45014b24e2bSVaishali Kulkarni 	{0x0003e8, "ACBFCPAUSEFRAMESTRANSMITTED_5  ", "Set of 8 objects recording the number of CBFC (Class Based Flow Control) pause frames transmitted for each class."},
45114b24e2bSVaishali Kulkarni /*	{0x0003ec, "ACBFCPAUSEFRAMESTRANSMITTED_5_H", "Upper 32bit of 64bit counter."},*/
45214b24e2bSVaishali Kulkarni 	{0x0003f0, "ACBFCPAUSEFRAMESTRANSMITTED_6  ", "Set of 8 objects recording the number of CBFC (Class Based Flow Control) pause frames transmitted for each class."},
45314b24e2bSVaishali Kulkarni /*	{0x0003f4, "ACBFCPAUSEFRAMESTRANSMITTED_6_H", "Upper 32bit of 64bit counter."},*/
45414b24e2bSVaishali Kulkarni 	{0x0003f8, "ACBFCPAUSEFRAMESTRANSMITTED_7  ", "Set of 8 objects recording the number of CBFC (Class Based Flow Control) pause frames transmitted for each class."},
45514b24e2bSVaishali Kulkarni /*	{0x0003fc, "ACBFCPAUSEFRAMESTRANSMITTED_7_H", "Upper 32bit of 64bit counter."}*/
45614b24e2bSVaishali Kulkarni };
45714b24e2bSVaishali Kulkarni static struct tsc_stat bb_stat_regs[] = {
45814b24e2bSVaishali Kulkarni     {0x00000000, "GRX64","RX 64-byte frame counter" },
45914b24e2bSVaishali Kulkarni     {0x00000001, "GRX127","RX 65 to 127 byte frame counter" },
46014b24e2bSVaishali Kulkarni     {0x00000002, "GRX255","RX 128 to 255 byte frame counter" },
46114b24e2bSVaishali Kulkarni     {0x00000003, "GRX511","RX 256 to 511 byte frame counter" },
46214b24e2bSVaishali Kulkarni     {0x00000004, "GRX1023","RX 512 to 1023 byte frame counter" },
46314b24e2bSVaishali Kulkarni     {0x00000005, "GRX1518","RX 1024 to 1518 byte frame counter" },
46414b24e2bSVaishali Kulkarni     {0x00000006, "GRX1522","RX 1519 to 1522 byte VLAN-tagged frame counter" },
46514b24e2bSVaishali Kulkarni     {0x00000007, "GRX2047","RX 1519 to 2047 byte frame counter" },
46614b24e2bSVaishali Kulkarni     {0x00000008, "GRX4095","RX 2048 to 4095 byte frame counter" },
46714b24e2bSVaishali Kulkarni     {0x00000009, "GRX9216","RX 4096 to 9216 byte frame counter" },
46814b24e2bSVaishali Kulkarni     {0x0000000a, "GRX16383","RX 9217 to 16383 byte frame counter" },
46914b24e2bSVaishali Kulkarni     {0x0000000b, "GRXPKT","RX frame counter (all packets)" },
47014b24e2bSVaishali Kulkarni     {0x0000000c, "GRXUCA","RX UC frame counter" },
47114b24e2bSVaishali Kulkarni     {0x0000000d, "GRXMCA","RX MC frame counter" },
47214b24e2bSVaishali Kulkarni     {0x0000000e, "GRXBCA","RX BC frame counter" },
47314b24e2bSVaishali Kulkarni     {0x0000000f, "GRXFCS","RX FCS error frame counter" },
47414b24e2bSVaishali Kulkarni     {0x00000010, "GRXCF","RX control frame counter" },
47514b24e2bSVaishali Kulkarni     {0x00000011, "GRXPF","RX pause frame counter" },
47614b24e2bSVaishali Kulkarni     {0x00000012, "GRXPP","RX PFC frame counter" },
47714b24e2bSVaishali Kulkarni     {0x00000013, "GRXUO","RX unsupported opcode frame counter" },
47814b24e2bSVaishali Kulkarni     {0x00000014, "GRXUDA","RX unsupported DA for pause/PFC frame counter" },
47914b24e2bSVaishali Kulkarni     {0x00000015, "GRXWSA","RX incorrect SA counter" },
48014b24e2bSVaishali Kulkarni     {0x00000016, "GRXALN","RX alignment error counter" },
48114b24e2bSVaishali Kulkarni     {0x00000017, "GRXFLR","RX out-of-range length frame counter" },
48214b24e2bSVaishali Kulkarni     {0x00000018, "GRXFRERR","RX code error frame counter" },
48314b24e2bSVaishali Kulkarni     {0x00000019, "GRXFCR","RX false carrier counter" },
48414b24e2bSVaishali Kulkarni     {0x0000001a, "GRXOVR","RX oversized frame counter" },
48514b24e2bSVaishali Kulkarni     {0x0000001b, "GRXJBR","RX jabber frame counter" },
48614b24e2bSVaishali Kulkarni     {0x0000001c, "GRXMTUE","RX MTU check error frame counter" },
48714b24e2bSVaishali Kulkarni     {0x0000001d, "GRXMCRC",
48814b24e2bSVaishali Kulkarni 	    "RX packet with 4-Byte CRC matching MACSEC_PROG_TX_CRC." },
48914b24e2bSVaishali Kulkarni     {0x0000001e, "GRXPRM","RX promiscuous packet counter" },
49014b24e2bSVaishali Kulkarni     {0x0000001f, "GRXVLN","RX single and double VLAN tagged frame counter" },
49114b24e2bSVaishali Kulkarni     {0x00000020, "GRXDVLN","RX double VLANG tagged frame counter" },
49214b24e2bSVaishali Kulkarni     {0x00000021, "GRXTRFU","RX truncated frame (due to RX FIFO full) counter" },
49314b24e2bSVaishali Kulkarni     {0x00000022, "GRXPOK","RX good frame (good CRC, not oversized, no ERROR)" },
49414b24e2bSVaishali Kulkarni     {0x00000023, "GRXPFCOFF0",
49514b24e2bSVaishali Kulkarni 	    "RX PFC frame transition XON to XOFF for Priority0" },
49614b24e2bSVaishali Kulkarni     {0x00000024, "GRXPFCOFF1",
49714b24e2bSVaishali Kulkarni 	    "RX PFC frame transition XON to XOFF for Priority1" },
49814b24e2bSVaishali Kulkarni     {0x00000025, "GRXPFCOFF2",
49914b24e2bSVaishali Kulkarni 	    "RX PFC frame transition XON to XOFF for Priority2" },
50014b24e2bSVaishali Kulkarni     {0x00000026, "GRXPFCOFF3",
50114b24e2bSVaishali Kulkarni 	    "RX PFC frame transition XON to XOFF for Priority3" },
50214b24e2bSVaishali Kulkarni     {0x00000027, "GRXPFCOFF4",
50314b24e2bSVaishali Kulkarni 	    "RX PFC frame transition XON to XOFF for Priority4" },
50414b24e2bSVaishali Kulkarni     {0x00000028, "GRXPFCOFF5",
50514b24e2bSVaishali Kulkarni 	    "RX PFC frame transition XON to XOFF for Priority5" },
50614b24e2bSVaishali Kulkarni     {0x00000029, "GRXPFCOFF6",
50714b24e2bSVaishali Kulkarni 	    "RX PFC frame transition XON to XOFF for Priority6" },
50814b24e2bSVaishali Kulkarni     {0x0000002a, "GRXPFCOFF7",
50914b24e2bSVaishali Kulkarni 	    "RX PFC frame transition XON to XOFF for Priority7" },
51014b24e2bSVaishali Kulkarni     {0x0000002b, "GRXPFCP0","RX PFC frame with enable bit set for Priority0" },
51114b24e2bSVaishali Kulkarni     {0x0000002c, "GRXPFCP1","RX PFC frame with enable bit set for Priority1" },
51214b24e2bSVaishali Kulkarni     {0x0000002d, "GRXPFCP2","RX PFC frame with enable bit set for Priority2" },
51314b24e2bSVaishali Kulkarni     {0x0000002e, "GRXPFCP3","RX PFC frame with enable bit set for Priority3" },
51414b24e2bSVaishali Kulkarni     {0x0000002f, "GRXPFCP4","RX PFC frame with enable bit set for Priority4" },
51514b24e2bSVaishali Kulkarni     {0x00000030, "GRXPFCP5","RX PFC frame with enable bit set for Priority5" },
51614b24e2bSVaishali Kulkarni     {0x00000031, "GRXPFCP6","RX PFC frame with enable bit set for Priority6" },
51714b24e2bSVaishali Kulkarni     {0x00000032, "GRXPFCP7","RX PFC frame with enable bit set for Priority7" },
51814b24e2bSVaishali Kulkarni     {0x00000033, "GRXSCHCRC","RX frame with SCH CRC error. For LH mode only" },
51914b24e2bSVaishali Kulkarni     {0x00000034, "GRXUND","RX undersized frame counter" },
52014b24e2bSVaishali Kulkarni     {0x00000035, "GRXFRG","RX fragment counter" },
52114b24e2bSVaishali Kulkarni     {0x00000036, "RXEEELPI", "RX EEE LPI counter"},
52214b24e2bSVaishali Kulkarni     {0x00000037, "RXEEELPIDU", "RX EEE LPI duration counter"},
52314b24e2bSVaishali Kulkarni     {0x00000038, "RXLLFCPHY", "RX LLFC PHY COUNTER"},
52414b24e2bSVaishali Kulkarni     {0x00000039, "RXLLFCLOG", "RX LLFC LOG COUNTER"},
52514b24e2bSVaishali Kulkarni     {0x0000003a, "RXLLFCCRC", "RX LLFC CRC COUNTER"},
52614b24e2bSVaishali Kulkarni     {0x0000003b, "RXHCFC", "RX HCFC COUNTER"},
52714b24e2bSVaishali Kulkarni     {0x0000003c, "RXHCFCCRC", "RX HCFC CRC COUNTER"},
52814b24e2bSVaishali Kulkarni     {0x0000003d, "GRXBYT", "RX byte counter"},
52914b24e2bSVaishali Kulkarni     {0x0000003e, "GRXRBYT", "RX runt byte counter"},
53014b24e2bSVaishali Kulkarni     {0x0000003f, "GRXRPKT", "RX packet counter"},
53114b24e2bSVaishali Kulkarni     {0x00000040, "GTX64", "TX 64-byte frame counter"},
53214b24e2bSVaishali Kulkarni     {0x00000041, "GTX127", "TX 65 to 127 byte frame counter"},
53314b24e2bSVaishali Kulkarni     {0x00000042, "GTX255", "TX 128 to 255 byte frame counter"},
53414b24e2bSVaishali Kulkarni     {0x00000043, "GTX511", "TX 256 to 511 byte frame counter"},
53514b24e2bSVaishali Kulkarni     {0x00000044, "GTX1023", "TX 512 to 1023 byte frame counter"},
53614b24e2bSVaishali Kulkarni     {0x00000045, "GTX1518", "TX 1024 to 1518 byte frame counter"},
53714b24e2bSVaishali Kulkarni     {0x00000046, "GTX1522", "TX 1519 to 1522 byte VLAN-tagged frame counter"},
53814b24e2bSVaishali Kulkarni     {0x00000047, "GTX2047", "TX 1519 to 2047 byte frame counter"},
53914b24e2bSVaishali Kulkarni     {0x00000048, "GTX4095", "TX 2048 to 4095 byte frame counte"},
54014b24e2bSVaishali Kulkarni     {0x00000049, "GTX9216", "TX 4096 to 9216 byte frame counter"},
54114b24e2bSVaishali Kulkarni     {0x0000004a, "GTX16383", "TX 9217 to 16383 byte frame counter"},
54214b24e2bSVaishali Kulkarni     {0x0000004b, "GTXPOK", "TX good frame counter"},
54314b24e2bSVaishali Kulkarni     {0x0000004c, "GTXPKT", "TX frame counter (all packets"},
54414b24e2bSVaishali Kulkarni     {0x0000004d, "GTXUCA", "TX UC frame counter"},
54514b24e2bSVaishali Kulkarni     {0x0000004e, "GTXMCA", "TX MC frame counter"},
54614b24e2bSVaishali Kulkarni     {0x0000004f, "GTXBCA", "TX BC frame counter"},
54714b24e2bSVaishali Kulkarni     {0x00000050, "GTXPF", "TX pause frame counter"},
54814b24e2bSVaishali Kulkarni     {0x00000051, "GTXPP", "TX PFC frame counter"},
54914b24e2bSVaishali Kulkarni     {0x00000052, "GTXJBR", "TX jabber counter"},
55014b24e2bSVaishali Kulkarni     {0x00000053, "GTXFCS", "TX FCS error counter"},
55114b24e2bSVaishali Kulkarni     {0x00000054, "GTXCF", "TX control frame counter"},
55214b24e2bSVaishali Kulkarni     {0x00000055, "GTXOVR", "TX oversize packet counter"},
55314b24e2bSVaishali Kulkarni     {0x00000056, "GTXDFR", "TX Single Deferral Frame Counter"},
55414b24e2bSVaishali Kulkarni     {0x00000057, "GTXEDF", "TX Multiple Deferral Frame Counter"},
55514b24e2bSVaishali Kulkarni     {0x00000058, "GTXSCL", "TX Single Collision Frame Counter"},
55614b24e2bSVaishali Kulkarni     {0x00000059, "GTXMCL", "TX Multiple Collision Frame Counter"},
55714b24e2bSVaishali Kulkarni     {0x0000005a, "GTXLCL", "TX Late Collision Frame Counter"},
55814b24e2bSVaishali Kulkarni     {0x0000005b, "GTXXCL", "TX Excessive Collision Frame Counter"},
55914b24e2bSVaishali Kulkarni     {0x0000005c, "GTXFRG", "TX fragment counter"},
56014b24e2bSVaishali Kulkarni     {0x0000005d, "GTXERR", "TX error (set by system) frame counter"},
56114b24e2bSVaishali Kulkarni     {0x0000005e, "GTXVLN", "TX VLAN Tag Frame Counter"},
56214b24e2bSVaishali Kulkarni     {0x0000005f, "GTXDVLN", "TX Double VLAN Tag Frame Counter"},
56314b24e2bSVaishali Kulkarni     {0x00000060, "GTXRPKT", "TX RUNT Frame Counter"},
56414b24e2bSVaishali Kulkarni     {0x00000061, "GTXUFL", "TX FIFO Underrun Counter"},
56514b24e2bSVaishali Kulkarni     {0x00000062, "GTXPFCP0", "TX PFC frame with enable bit set for Priority0"},
56614b24e2bSVaishali Kulkarni     {0x00000063, "GTXPFCP1", "TX PFC frame with enable bit set for Priority1"},
56714b24e2bSVaishali Kulkarni     {0x00000064, "GTXPFCP2", "TX PFC frame with enable bit set for Priority2"},
56814b24e2bSVaishali Kulkarni     {0x00000065, "GTXPFCP3", "TX PFC frame with enable bit set for Priority3"},
56914b24e2bSVaishali Kulkarni     {0x00000066, "GTXPFCP4", "TX PFC frame with enable bit set for Priority4"},
57014b24e2bSVaishali Kulkarni     {0x00000067, "GTXPFCP5", "TX PFC frame with enable bit set for Priority5"},
57114b24e2bSVaishali Kulkarni     {0x00000068, "GTXPFCP6", "TX PFC frame with enable bit set for Priority6"},
57214b24e2bSVaishali Kulkarni     {0x00000069, "GTXPFCP7", "TX PFC frame with enable bit set for Priority7"},
57314b24e2bSVaishali Kulkarni     {0x0000006a, "TXEEELPI", "TX EEE LPI Event Counter"},
57414b24e2bSVaishali Kulkarni     {0x0000006b, "TXEEELPIDU", "TX EEE LPI Duration Counter"},
57514b24e2bSVaishali Kulkarni     {0x0000006c, "TXLLFCLOG", "Transmit Logical Type LLFC message counter"},
57614b24e2bSVaishali Kulkarni     {0x0000006d, "TXHCFC", "Transmit Logical Type LLFC message counter"},
57714b24e2bSVaishali Kulkarni     {0x0000006e, "GTXNCL", "Transmit Total Collision Counter"},
57814b24e2bSVaishali Kulkarni     {0x0000006f, "GTXBYT", "TX byte counter"}
57914b24e2bSVaishali Kulkarni };
58014b24e2bSVaishali Kulkarni 
58114b24e2bSVaishali Kulkarni /* get mac status */
ecore_bb_phy_mac_stat(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 port,char * p_phy_result_buf)58214b24e2bSVaishali Kulkarni static int ecore_bb_phy_mac_stat(struct ecore_hwfn *p_hwfn,
58314b24e2bSVaishali Kulkarni 				 struct ecore_ptt *p_ptt,
58414b24e2bSVaishali Kulkarni 				 u32 port, char *p_phy_result_buf)
58514b24e2bSVaishali Kulkarni {
58614b24e2bSVaishali Kulkarni 	u8 buf64[8] = {0}, data_hi[4], data_lo[4];
58714b24e2bSVaishali Kulkarni 	bool b_false_alarm = false;
58814b24e2bSVaishali Kulkarni 	u32 length, reg_id, addr;
58914b24e2bSVaishali Kulkarni 	enum _ecore_status_t rc = ECORE_INVAL;
59014b24e2bSVaishali Kulkarni 
59114b24e2bSVaishali Kulkarni 	length = OSAL_SPRINTF(p_phy_result_buf,
59214b24e2bSVaishali Kulkarni 			       "MAC stats for port %d (only non-zero)\n", port);
59314b24e2bSVaishali Kulkarni 
59414b24e2bSVaishali Kulkarni 	for (reg_id = 0; reg_id < OSAL_ARRAY_SIZE(bb_stat_regs); reg_id++) {
59514b24e2bSVaishali Kulkarni 		addr = bb_stat_regs[reg_id].reg;
59614b24e2bSVaishali Kulkarni 		rc = ecore_phy_read(p_hwfn, p_ptt, port, 0 /*lane*/, addr,
59714b24e2bSVaishali Kulkarni 				    ECORE_PHY_CORE_READ, buf64);
59814b24e2bSVaishali Kulkarni 
59914b24e2bSVaishali Kulkarni 		OSAL_MEMCPY(data_lo, buf64, 4);
60014b24e2bSVaishali Kulkarni 		OSAL_MEMCPY(data_hi, (buf64 + 4), 4);
60114b24e2bSVaishali Kulkarni 
60214b24e2bSVaishali Kulkarni 		if (rc == ECORE_SUCCESS) {
60314b24e2bSVaishali Kulkarni 			if (*(u32 *)data_lo != 0) {  /* Only non-zero */
60414b24e2bSVaishali Kulkarni 				length += OSAL_SPRINTF(&p_phy_result_buf[length],
60514b24e2bSVaishali Kulkarni 						       "%-10s: 0x%08x (%s)\n",
60614b24e2bSVaishali Kulkarni 						       bb_stat_regs[reg_id].name,
60714b24e2bSVaishali Kulkarni 						       *(u32 *)data_lo,
60814b24e2bSVaishali Kulkarni 						       bb_stat_regs[reg_id].desc);
60914b24e2bSVaishali Kulkarni 				if ((bb_stat_regs[reg_id].reg == 0x0000000f) ||
61014b24e2bSVaishali Kulkarni 				    (bb_stat_regs[reg_id].reg == 0x00000018) ||
61114b24e2bSVaishali Kulkarni 				    (bb_stat_regs[reg_id].reg == 0x00000035))
61214b24e2bSVaishali Kulkarni 					b_false_alarm = true;
61314b24e2bSVaishali Kulkarni 			}
61414b24e2bSVaishali Kulkarni 		} else {
61514b24e2bSVaishali Kulkarni 			OSAL_SPRINTF(p_phy_result_buf, "Failed reading stat 0x%x\n\n",
61614b24e2bSVaishali Kulkarni 				     addr);
61714b24e2bSVaishali Kulkarni 		}
61814b24e2bSVaishali Kulkarni 	}
61914b24e2bSVaishali Kulkarni 
62014b24e2bSVaishali Kulkarni 	if (b_false_alarm)
62114b24e2bSVaishali Kulkarni 		length += OSAL_SPRINTF(&p_phy_result_buf[length],
62214b24e2bSVaishali Kulkarni 				       "Note: GRXFCS/GRXFRERR/GRXFRG may "
62314b24e2bSVaishali Kulkarni 				       "increment when the port shuts down\n");
62414b24e2bSVaishali Kulkarni 
62514b24e2bSVaishali Kulkarni 	return rc;
62614b24e2bSVaishali Kulkarni }
62714b24e2bSVaishali Kulkarni 
62814b24e2bSVaishali Kulkarni /* get mac status */
ecore_ah_e5_phy_mac_stat(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 port,char * p_phy_result_buf)62914b24e2bSVaishali Kulkarni static int ecore_ah_e5_phy_mac_stat(struct ecore_hwfn *p_hwfn,
63014b24e2bSVaishali Kulkarni 				    struct ecore_ptt *p_ptt, u32 port,
63114b24e2bSVaishali Kulkarni 				    char *p_phy_result_buf)
63214b24e2bSVaishali Kulkarni {
633b68ddc76SJohn Levon 	u32 length, reg_id, addr, data_hi __unused, data_lo;
63414b24e2bSVaishali Kulkarni 
63514b24e2bSVaishali Kulkarni 	length = OSAL_SPRINTF(p_phy_result_buf,
63614b24e2bSVaishali Kulkarni 			       "MAC stats for port %d (only non-zero)\n", port);
63714b24e2bSVaishali Kulkarni 
63814b24e2bSVaishali Kulkarni 	for (reg_id = 0; reg_id < OSAL_ARRAY_SIZE(ah_stat_regs); reg_id++) {
63914b24e2bSVaishali Kulkarni 		addr = ah_stat_regs[reg_id].reg;
64014b24e2bSVaishali Kulkarni 		data_lo = ecore_rd(p_hwfn, p_ptt,
64114b24e2bSVaishali Kulkarni 				   NWM_REG_MAC0_K2_E5 +
64214b24e2bSVaishali Kulkarni 				   NWM_REG_MAC0_SIZE * 4 * port +
64314b24e2bSVaishali Kulkarni 				   addr);
64414b24e2bSVaishali Kulkarni 		data_hi = ecore_rd(p_hwfn, p_ptt,
64514b24e2bSVaishali Kulkarni 				   NWM_REG_MAC0_K2_E5 +
64614b24e2bSVaishali Kulkarni 				   NWM_REG_MAC0_SIZE * 4 * port +
64714b24e2bSVaishali Kulkarni 				   addr + 4);
64814b24e2bSVaishali Kulkarni 
64914b24e2bSVaishali Kulkarni 		if (data_lo) {  /* Only non-zero */
65014b24e2bSVaishali Kulkarni 			length += OSAL_SPRINTF(&p_phy_result_buf[length],
65114b24e2bSVaishali Kulkarni 					       "%-10s: 0x%08x (%s)\n",
65214b24e2bSVaishali Kulkarni 					       ah_stat_regs[reg_id].name,
65314b24e2bSVaishali Kulkarni 					       data_lo,
65414b24e2bSVaishali Kulkarni 					       ah_stat_regs[reg_id].desc);
65514b24e2bSVaishali Kulkarni 		}
65614b24e2bSVaishali Kulkarni 	}
65714b24e2bSVaishali Kulkarni 
65814b24e2bSVaishali Kulkarni 	return ECORE_SUCCESS;
65914b24e2bSVaishali Kulkarni }
66014b24e2bSVaishali Kulkarni 
ecore_phy_mac_stat(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 port,char * p_phy_result_buf)66114b24e2bSVaishali Kulkarni int ecore_phy_mac_stat(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt,
66214b24e2bSVaishali Kulkarni 			u32 port, char *p_phy_result_buf)
66314b24e2bSVaishali Kulkarni {
66414b24e2bSVaishali Kulkarni 	int num_ports = ecore_device_num_ports(p_hwfn->p_dev);
66514b24e2bSVaishali Kulkarni 
66614b24e2bSVaishali Kulkarni 	if (port >= (u32)num_ports) {
66714b24e2bSVaishali Kulkarni 		OSAL_SPRINTF(p_phy_result_buf,
66814b24e2bSVaishali Kulkarni 			     "Port must be in range of 0..%d\n", num_ports);
66914b24e2bSVaishali Kulkarni 		return ECORE_INVAL;
67014b24e2bSVaishali Kulkarni 	}
67114b24e2bSVaishali Kulkarni 
67214b24e2bSVaishali Kulkarni 	if (ECORE_IS_BB(p_hwfn->p_dev))
67314b24e2bSVaishali Kulkarni 		return ecore_bb_phy_mac_stat(p_hwfn, p_ptt, port,
67414b24e2bSVaishali Kulkarni 					     p_phy_result_buf);
67514b24e2bSVaishali Kulkarni 	else
67614b24e2bSVaishali Kulkarni 		return ecore_ah_e5_phy_mac_stat(p_hwfn, p_ptt, port,
67714b24e2bSVaishali Kulkarni 						p_phy_result_buf);
67814b24e2bSVaishali Kulkarni }
67914b24e2bSVaishali Kulkarni 
68014b24e2bSVaishali Kulkarni #define SFP_RX_LOS_OFFSET 110
68114b24e2bSVaishali Kulkarni #define SFP_TX_DISABLE_OFFSET 110
68214b24e2bSVaishali Kulkarni #define SFP_TX_FAULT_OFFSET 110
68314b24e2bSVaishali Kulkarni 
68414b24e2bSVaishali Kulkarni #define QSFP_RX_LOS_OFFSET 3
68514b24e2bSVaishali Kulkarni #define QSFP_TX_DISABLE_OFFSET 86
68614b24e2bSVaishali Kulkarni #define QSFP_TX_FAULT_OFFSET 4
68714b24e2bSVaishali Kulkarni 
68814b24e2bSVaishali Kulkarni /* Set SFP error string */
ecore_sfp_set_error(enum _ecore_status_t rc,u32 offset,char * p_phy_result_buf,char * p_err_str)68914b24e2bSVaishali Kulkarni static int ecore_sfp_set_error(enum _ecore_status_t rc, u32 offset,
69014b24e2bSVaishali Kulkarni 			       char *p_phy_result_buf, char *p_err_str)
69114b24e2bSVaishali Kulkarni {
69214b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS) {
69314b24e2bSVaishali Kulkarni 		if (rc == ECORE_NODEV)
69414b24e2bSVaishali Kulkarni 			OSAL_SPRINTF((char *)&p_phy_result_buf[offset],
69514b24e2bSVaishali Kulkarni 				     "Transceiver is unplugged.\n");
69614b24e2bSVaishali Kulkarni 		else
69714b24e2bSVaishali Kulkarni 			OSAL_SPRINTF((char *)&p_phy_result_buf[offset], "%s",
69814b24e2bSVaishali Kulkarni 				     p_err_str);
69914b24e2bSVaishali Kulkarni 
70014b24e2bSVaishali Kulkarni 		return ECORE_UNKNOWN_ERROR;
70114b24e2bSVaishali Kulkarni 	}
70214b24e2bSVaishali Kulkarni 
70314b24e2bSVaishali Kulkarni 	return rc;
70414b24e2bSVaishali Kulkarni }
70514b24e2bSVaishali Kulkarni 
70614b24e2bSVaishali Kulkarni /* Validate SFP port */
ecore_validate_sfp_port(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 port,char * p_phy_result_buf)70714b24e2bSVaishali Kulkarni static int ecore_validate_sfp_port(struct ecore_hwfn *p_hwfn,
70814b24e2bSVaishali Kulkarni 				   struct ecore_ptt *p_ptt,
70914b24e2bSVaishali Kulkarni 				   u32 port, char *p_phy_result_buf)
71014b24e2bSVaishali Kulkarni {
71114b24e2bSVaishali Kulkarni 	/* Verify <port> field is between 0 and number of ports */
71214b24e2bSVaishali Kulkarni 	u32 num_ports = ecore_device_num_ports(p_hwfn->p_dev);
71314b24e2bSVaishali Kulkarni 
71414b24e2bSVaishali Kulkarni 	if (port >= num_ports) {
71514b24e2bSVaishali Kulkarni 		if (num_ports == 1)
71614b24e2bSVaishali Kulkarni 			OSAL_SPRINTF(p_phy_result_buf,
71714b24e2bSVaishali Kulkarni 				     "Bad port number, must be 0.\n");
71814b24e2bSVaishali Kulkarni 		else
71914b24e2bSVaishali Kulkarni 			OSAL_SPRINTF(p_phy_result_buf,
72014b24e2bSVaishali Kulkarni 				     "Bad port number, must be between 0 and %d.\n",
72114b24e2bSVaishali Kulkarni 				     num_ports-1);
72214b24e2bSVaishali Kulkarni 
72314b24e2bSVaishali Kulkarni 		return ECORE_INVAL;
72414b24e2bSVaishali Kulkarni 	}
72514b24e2bSVaishali Kulkarni 
72614b24e2bSVaishali Kulkarni 	return ECORE_SUCCESS;
72714b24e2bSVaishali Kulkarni }
72814b24e2bSVaishali Kulkarni 
72914b24e2bSVaishali Kulkarni /* Validate SFP parameters */
ecore_validate_sfp_parameters(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 port,u32 addr,u32 offset,u32 size,char * p_phy_result_buf)73014b24e2bSVaishali Kulkarni static int ecore_validate_sfp_parameters(struct ecore_hwfn *p_hwfn,
73114b24e2bSVaishali Kulkarni 					 struct ecore_ptt *p_ptt,
73214b24e2bSVaishali Kulkarni 					 u32 port, u32 addr, u32 offset,
73314b24e2bSVaishali Kulkarni 					 u32 size, char *p_phy_result_buf)
73414b24e2bSVaishali Kulkarni {
73514b24e2bSVaishali Kulkarni 	enum _ecore_status_t rc;
73614b24e2bSVaishali Kulkarni 
73714b24e2bSVaishali Kulkarni 	/* Verify <port> field is between 0 and number of ports */
73814b24e2bSVaishali Kulkarni 	rc = ecore_validate_sfp_port(p_hwfn, p_ptt, port, p_phy_result_buf);
73914b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
74014b24e2bSVaishali Kulkarni 		return rc;
74114b24e2bSVaishali Kulkarni 
74214b24e2bSVaishali Kulkarni 	/* Verify <I2C> field is 0xA0 or 0xA2 */
74314b24e2bSVaishali Kulkarni 	if ((addr != 0xA0) && (addr != 0xA2)) {
74414b24e2bSVaishali Kulkarni 		OSAL_SPRINTF(p_phy_result_buf,
74514b24e2bSVaishali Kulkarni 			     "Bad I2C address, must be 0xA0 or 0xA2.\n");
74614b24e2bSVaishali Kulkarni 		return ECORE_INVAL;
74714b24e2bSVaishali Kulkarni 	}
74814b24e2bSVaishali Kulkarni 
74914b24e2bSVaishali Kulkarni 	/* Verify <size> field is 1 - MAX_I2C_TRANSCEIVER_PAGE_SIZE */
75014b24e2bSVaishali Kulkarni 	if ((size == 0) || (size > MAX_I2C_TRANSCEIVER_PAGE_SIZE)) {
75114b24e2bSVaishali Kulkarni 		OSAL_SPRINTF(p_phy_result_buf,
75214b24e2bSVaishali Kulkarni 			     "Bad size, must be between 1 and %d.\n",
75314b24e2bSVaishali Kulkarni 			     MAX_I2C_TRANSCEIVER_PAGE_SIZE);
75414b24e2bSVaishali Kulkarni 		return ECORE_INVAL;
75514b24e2bSVaishali Kulkarni 	}
75614b24e2bSVaishali Kulkarni 
75714b24e2bSVaishali Kulkarni 	/* Verify <offset> + <size> <= MAX_I2C_TRANSCEIVER_PAGE_SIZE */
75814b24e2bSVaishali Kulkarni 	if (offset + size > MAX_I2C_TRANSCEIVER_PAGE_SIZE) {
75914b24e2bSVaishali Kulkarni 		OSAL_SPRINTF(p_phy_result_buf,
76014b24e2bSVaishali Kulkarni 			     "Bad offset and size, must not exceed %d.\n",
76114b24e2bSVaishali Kulkarni 			     MAX_I2C_TRANSCEIVER_PAGE_SIZE);
76214b24e2bSVaishali Kulkarni 		return ECORE_INVAL;
76314b24e2bSVaishali Kulkarni 	}
76414b24e2bSVaishali Kulkarni 
76514b24e2bSVaishali Kulkarni 	return rc;
76614b24e2bSVaishali Kulkarni }
76714b24e2bSVaishali Kulkarni 
76814b24e2bSVaishali Kulkarni /* Write to SFP */
ecore_phy_sfp_write(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 port,u32 addr,u32 offset,u32 size,u32 val,char * p_phy_result_buf)76914b24e2bSVaishali Kulkarni int ecore_phy_sfp_write(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt,
77014b24e2bSVaishali Kulkarni 			u32 port, u32 addr, u32 offset, u32 size,
77114b24e2bSVaishali Kulkarni 			u32 val, char *p_phy_result_buf)
77214b24e2bSVaishali Kulkarni {
77314b24e2bSVaishali Kulkarni 	enum _ecore_status_t rc;
77414b24e2bSVaishali Kulkarni 
77514b24e2bSVaishali Kulkarni 	rc = ecore_validate_sfp_parameters(p_hwfn, p_ptt, port, addr,
77614b24e2bSVaishali Kulkarni 					   offset, size, p_phy_result_buf);
77714b24e2bSVaishali Kulkarni 	if (rc == ECORE_SUCCESS)
77814b24e2bSVaishali Kulkarni 	{
77914b24e2bSVaishali Kulkarni 		rc = ecore_mcp_phy_sfp_write(p_hwfn, p_ptt, port, addr,
78014b24e2bSVaishali Kulkarni 					     offset, size, (u8 *)&val);
78114b24e2bSVaishali Kulkarni 
78214b24e2bSVaishali Kulkarni 		if (rc != ECORE_SUCCESS)
78314b24e2bSVaishali Kulkarni 			return ecore_sfp_set_error(rc, 0, p_phy_result_buf,
78414b24e2bSVaishali Kulkarni 						   "Error writing to transceiver.\n");
78514b24e2bSVaishali Kulkarni 
78614b24e2bSVaishali Kulkarni 		OSAL_SPRINTF(p_phy_result_buf,
78714b24e2bSVaishali Kulkarni 			     "Written successfully to transceiver.\n");
78814b24e2bSVaishali Kulkarni 	}
78914b24e2bSVaishali Kulkarni 
79014b24e2bSVaishali Kulkarni 	return rc;
79114b24e2bSVaishali Kulkarni }
79214b24e2bSVaishali Kulkarni 
79314b24e2bSVaishali Kulkarni /* Read from SFP */
ecore_phy_sfp_read(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 port,u32 addr,u32 offset,u32 size,char * p_phy_result_buf)79414b24e2bSVaishali Kulkarni int ecore_phy_sfp_read(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt,
79514b24e2bSVaishali Kulkarni 		       u32 port, u32 addr, u32 offset,
79614b24e2bSVaishali Kulkarni 		       u32 size, char *p_phy_result_buf)
79714b24e2bSVaishali Kulkarni {
79814b24e2bSVaishali Kulkarni 	enum _ecore_status_t rc;
79914b24e2bSVaishali Kulkarni 	u32 i;
80014b24e2bSVaishali Kulkarni 
80114b24e2bSVaishali Kulkarni 	rc = ecore_validate_sfp_parameters(p_hwfn, p_ptt, port, addr,
80214b24e2bSVaishali Kulkarni 					   offset, size, p_phy_result_buf);
80314b24e2bSVaishali Kulkarni 	if (rc == ECORE_SUCCESS)
80414b24e2bSVaishali Kulkarni 	{
80514b24e2bSVaishali Kulkarni 		int length = 0;
80614b24e2bSVaishali Kulkarni 		u8 buf[MAX_I2C_TRANSCEIVER_PAGE_SIZE];
80714b24e2bSVaishali Kulkarni 
80814b24e2bSVaishali Kulkarni 		rc = ecore_mcp_phy_sfp_read(p_hwfn, p_ptt, port, addr,
80914b24e2bSVaishali Kulkarni 					    offset, size, buf);
81014b24e2bSVaishali Kulkarni 		if (rc != ECORE_SUCCESS)
81114b24e2bSVaishali Kulkarni 			return ecore_sfp_set_error(rc, 0, p_phy_result_buf,
81214b24e2bSVaishali Kulkarni 						   "Error reading from transceiver.\n");
81314b24e2bSVaishali Kulkarni 		for (i = 0; i < size; i++)
81414b24e2bSVaishali Kulkarni 			length += OSAL_SPRINTF(
81514b24e2bSVaishali Kulkarni 				(char *)&p_phy_result_buf[length],
81614b24e2bSVaishali Kulkarni 				"%02x ", buf[i]);
81714b24e2bSVaishali Kulkarni 	}
81814b24e2bSVaishali Kulkarni 
81914b24e2bSVaishali Kulkarni 	return rc;
82014b24e2bSVaishali Kulkarni }
82114b24e2bSVaishali Kulkarni 
ecore_decode_sfp_info(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 port,u32 length,char * p_phy_result_buf)82214b24e2bSVaishali Kulkarni static enum _ecore_status_t ecore_decode_sfp_info(struct ecore_hwfn *p_hwfn,
82314b24e2bSVaishali Kulkarni 						  struct ecore_ptt *p_ptt,
82414b24e2bSVaishali Kulkarni 						  u32 port, u32 length,
82514b24e2bSVaishali Kulkarni 						  char *p_phy_result_buf)
82614b24e2bSVaishali Kulkarni {
82714b24e2bSVaishali Kulkarni 	/* SFP EEPROM contents are described in SFF-8024 and SFF-8472 */
82814b24e2bSVaishali Kulkarni 	/***********************************************/
82914b24e2bSVaishali Kulkarni 	/* SFP DATA and locations                      */
83014b24e2bSVaishali Kulkarni 	/* get specification complianace bytes 3-10    */
83114b24e2bSVaishali Kulkarni 	/* get signal rate byte 12                     */
83214b24e2bSVaishali Kulkarni 	/* get extended compliance code byte 36        */
83314b24e2bSVaishali Kulkarni 	/* get vendor length bytes 14-19               */
83414b24e2bSVaishali Kulkarni 	/* get vendor name bytes bytes 20-35           */
83514b24e2bSVaishali Kulkarni 	/* get vendor OUI bytes 37-39                  */
83614b24e2bSVaishali Kulkarni 	/* get vendor PN  bytes 40-55                  */
83714b24e2bSVaishali Kulkarni 	/* get vendor REV bytes 56-59                  */
83814b24e2bSVaishali Kulkarni 	/* validated                                   */
83914b24e2bSVaishali Kulkarni 	/***********************************************/
84014b24e2bSVaishali Kulkarni 	enum _ecore_status_t rc;
84114b24e2bSVaishali Kulkarni 	u8 buf[32];
84214b24e2bSVaishali Kulkarni 
84314b24e2bSVaishali Kulkarni 	/* Read byte 12 - signal rate, and if nothing matches */
84414b24e2bSVaishali Kulkarni 	/* check byte 8 for 10G copper                        */
84514b24e2bSVaishali Kulkarni 	rc = ecore_mcp_phy_sfp_read(p_hwfn, p_ptt, port, I2C_TRANSCEIVER_ADDR,
84614b24e2bSVaishali Kulkarni 				    12, 1, buf);
84714b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
84814b24e2bSVaishali Kulkarni 		return ecore_sfp_set_error(rc, length, p_phy_result_buf,
84914b24e2bSVaishali Kulkarni 					   "Error reading specification compliance field.\n");
85014b24e2bSVaishali Kulkarni 
85114b24e2bSVaishali Kulkarni 	length += OSAL_SPRINTF(&p_phy_result_buf[length],
85214b24e2bSVaishali Kulkarni 			       "BYTE 12 signal rate: %d\n", buf[0]);
85314b24e2bSVaishali Kulkarni 
85414b24e2bSVaishali Kulkarni 	if (buf[0] >= 250) {
85514b24e2bSVaishali Kulkarni 		length += OSAL_SPRINTF(&p_phy_result_buf[length],
85614b24e2bSVaishali Kulkarni 				       "25G signal rate: %d\n", buf[0]);
85714b24e2bSVaishali Kulkarni 		/* 25G - This should be copper - could double check */
85814b24e2bSVaishali Kulkarni 		/* Read byte 3 - optics, and if nothing matches     */
85914b24e2bSVaishali Kulkarni 		/* check byte 8 for 10G copper                      */
86014b24e2bSVaishali Kulkarni 		rc = ecore_mcp_phy_sfp_read(p_hwfn, p_ptt, port,
86114b24e2bSVaishali Kulkarni 					    I2C_TRANSCEIVER_ADDR, 3, 1, buf);
86214b24e2bSVaishali Kulkarni 		if (rc != ECORE_SUCCESS)
86314b24e2bSVaishali Kulkarni 			return ecore_sfp_set_error(rc, length,
86414b24e2bSVaishali Kulkarni 						   p_phy_result_buf,
86514b24e2bSVaishali Kulkarni 						   "Error reading optics field.\n");
86614b24e2bSVaishali Kulkarni 
86714b24e2bSVaishali Kulkarni 		switch (buf[0]) {
86814b24e2bSVaishali Kulkarni 		case 1:
86914b24e2bSVaishali Kulkarni 			length += OSAL_SPRINTF(&p_phy_result_buf[length],
87014b24e2bSVaishali Kulkarni 					       "25G Passive copper detected\n");
87114b24e2bSVaishali Kulkarni 			break;
87214b24e2bSVaishali Kulkarni 		case 2:
87314b24e2bSVaishali Kulkarni 			length += OSAL_SPRINTF(&p_phy_result_buf[length],
87414b24e2bSVaishali Kulkarni 					       "25G Active copper detected\n");
87514b24e2bSVaishali Kulkarni 			break;
87614b24e2bSVaishali Kulkarni 		default:
87714b24e2bSVaishali Kulkarni 			length += OSAL_SPRINTF(&p_phy_result_buf[length],
87814b24e2bSVaishali Kulkarni 					       "UNKNOWN 25G cable detected: %x\n",
87914b24e2bSVaishali Kulkarni 					       buf[0]);
88014b24e2bSVaishali Kulkarni 			break;
88114b24e2bSVaishali Kulkarni 		}
88214b24e2bSVaishali Kulkarni 
88314b24e2bSVaishali Kulkarni 	} else if (buf[3] >= 100) {
88414b24e2bSVaishali Kulkarni 		length += OSAL_SPRINTF(&p_phy_result_buf[length],
88514b24e2bSVaishali Kulkarni 				       "10G signal rate: %d\n", buf[0]);
88614b24e2bSVaishali Kulkarni 		/* 10G - Read byte 3 for optics and byte 8 for copper, and */
88714b24e2bSVaishali Kulkarni 		/* byte 2 for AOC                                          */
88814b24e2bSVaishali Kulkarni 		/* Read byte 3 - optics, and if nothing matches check byte */
88914b24e2bSVaishali Kulkarni 		/* 8 for 10G copper                                        */
89014b24e2bSVaishali Kulkarni 		rc = ecore_mcp_phy_sfp_read(p_hwfn, p_ptt, port,
89114b24e2bSVaishali Kulkarni 					I2C_TRANSCEIVER_ADDR, 3, 1, buf);
89214b24e2bSVaishali Kulkarni 		if (rc != ECORE_SUCCESS)
89314b24e2bSVaishali Kulkarni 			return ecore_sfp_set_error(rc, length,
89414b24e2bSVaishali Kulkarni 						   p_phy_result_buf,
89514b24e2bSVaishali Kulkarni 						   "Error reading optics field.\n");
89614b24e2bSVaishali Kulkarni 
89714b24e2bSVaishali Kulkarni 		switch (buf[0]) {
89814b24e2bSVaishali Kulkarni 		case 0x10:
89914b24e2bSVaishali Kulkarni 			/* 10G SR */
90014b24e2bSVaishali Kulkarni 			length += OSAL_SPRINTF(&p_phy_result_buf[length],
90114b24e2bSVaishali Kulkarni 					       "10G SR detected\n");
90214b24e2bSVaishali Kulkarni 			break;
90314b24e2bSVaishali Kulkarni 		case 0x20:
90414b24e2bSVaishali Kulkarni 			/* 10G LR */
90514b24e2bSVaishali Kulkarni 			length += OSAL_SPRINTF(&p_phy_result_buf[length],
90614b24e2bSVaishali Kulkarni 					       "10G LR detected\n");
90714b24e2bSVaishali Kulkarni 			break;
90814b24e2bSVaishali Kulkarni 		case 0x40:
90914b24e2bSVaishali Kulkarni 			/* 10G LRM */
91014b24e2bSVaishali Kulkarni 			length += OSAL_SPRINTF(&p_phy_result_buf[length],
91114b24e2bSVaishali Kulkarni 					       "10G LRM detected\n");
91214b24e2bSVaishali Kulkarni 			break;
91314b24e2bSVaishali Kulkarni 		case 0x80:
91414b24e2bSVaishali Kulkarni 			length += OSAL_SPRINTF(&p_phy_result_buf[length],
91514b24e2bSVaishali Kulkarni 					       "10G ER detected\n");
91614b24e2bSVaishali Kulkarni 			break;
91714b24e2bSVaishali Kulkarni 		default:
91814b24e2bSVaishali Kulkarni 			length += OSAL_SPRINTF(&p_phy_result_buf[length],
91914b24e2bSVaishali Kulkarni 					       "SFP/SFP+/SFP-28 transceiver type 0x%x not known...  Check for 10G copper.\n",
92014b24e2bSVaishali Kulkarni 					       buf[0]);
92114b24e2bSVaishali Kulkarni 			/* Read 3, check 8 too */
92214b24e2bSVaishali Kulkarni 			rc = ecore_mcp_phy_sfp_read(p_hwfn, p_ptt, port,
92314b24e2bSVaishali Kulkarni 						    I2C_TRANSCEIVER_ADDR,
92414b24e2bSVaishali Kulkarni 						    8, 1, buf);
92514b24e2bSVaishali Kulkarni 			if (rc != ECORE_SUCCESS)
92614b24e2bSVaishali Kulkarni 				return ecore_sfp_set_error(rc, length,
92714b24e2bSVaishali Kulkarni 							   p_phy_result_buf,
92814b24e2bSVaishali Kulkarni 							   "Error reading 10G copper field.\n");
92914b24e2bSVaishali Kulkarni 
93014b24e2bSVaishali Kulkarni 			switch (buf[0]) {
93114b24e2bSVaishali Kulkarni 			case 0x04:
93214b24e2bSVaishali Kulkarni 			case 0x84:
93314b24e2bSVaishali Kulkarni 				length += OSAL_SPRINTF(
93414b24e2bSVaishali Kulkarni 					&p_phy_result_buf[length],
93514b24e2bSVaishali Kulkarni 					"10G Passive copper detected\n");
93614b24e2bSVaishali Kulkarni 				break;
93714b24e2bSVaishali Kulkarni 			case 0x08:
93814b24e2bSVaishali Kulkarni 			case 0x88:
93914b24e2bSVaishali Kulkarni 				length += OSAL_SPRINTF(
94014b24e2bSVaishali Kulkarni 					&p_phy_result_buf[length],
94114b24e2bSVaishali Kulkarni 					"10G Active copper detected\n");
94214b24e2bSVaishali Kulkarni 				break;
94314b24e2bSVaishali Kulkarni 			default:
94414b24e2bSVaishali Kulkarni 				length += OSAL_SPRINTF(
94514b24e2bSVaishali Kulkarni 					&p_phy_result_buf[length],
94614b24e2bSVaishali Kulkarni 					"Unexpected SFP/SFP+/SFP-28 transceiver type 0x%x\n",
94714b24e2bSVaishali Kulkarni 					buf[3]);
94814b24e2bSVaishali Kulkarni 				break;
94914b24e2bSVaishali Kulkarni 			} /* switch byte 8 */
95014b24e2bSVaishali Kulkarni 
95114b24e2bSVaishali Kulkarni 		} /* switch byte 3 */
95214b24e2bSVaishali Kulkarni 
95314b24e2bSVaishali Kulkarni 	} else if (buf[0] >= 10) {
95414b24e2bSVaishali Kulkarni 		length += OSAL_SPRINTF(&p_phy_result_buf[length],
95514b24e2bSVaishali Kulkarni 				       "1G signal rate: %d\n", buf[3]);
95614b24e2bSVaishali Kulkarni 		/* 1G -  Read byte 6 for optics and byte 8 for copper */
95714b24e2bSVaishali Kulkarni 		rc = ecore_mcp_phy_sfp_read(p_hwfn, p_ptt, port,
95814b24e2bSVaishali Kulkarni 					    I2C_TRANSCEIVER_ADDR, 6, 1, buf);
95914b24e2bSVaishali Kulkarni 		if (rc != ECORE_SUCCESS)
96014b24e2bSVaishali Kulkarni 			return ecore_sfp_set_error(rc, length,
96114b24e2bSVaishali Kulkarni 						   p_phy_result_buf,
96214b24e2bSVaishali Kulkarni 						   "Error reading optics field.\n");
96314b24e2bSVaishali Kulkarni 
96414b24e2bSVaishali Kulkarni 		switch (buf[0]) {
96514b24e2bSVaishali Kulkarni 		case 1:
96614b24e2bSVaishali Kulkarni 			length += OSAL_SPRINTF(&p_phy_result_buf[length],
96714b24e2bSVaishali Kulkarni 					       "1G SX detected\n");
96814b24e2bSVaishali Kulkarni 			break;
96914b24e2bSVaishali Kulkarni 		case 2:
97014b24e2bSVaishali Kulkarni 			length += OSAL_SPRINTF(&p_phy_result_buf[length],
97114b24e2bSVaishali Kulkarni 					       "1G LX detected\n");
97214b24e2bSVaishali Kulkarni 			break;
97314b24e2bSVaishali Kulkarni 		default:
97414b24e2bSVaishali Kulkarni 			length += OSAL_SPRINTF(&p_phy_result_buf[length],
97514b24e2bSVaishali Kulkarni 					       "Assume 1G Passive copper detected\n");
97614b24e2bSVaishali Kulkarni 			break;
97714b24e2bSVaishali Kulkarni 		}
97814b24e2bSVaishali Kulkarni 	}
97914b24e2bSVaishali Kulkarni 
98014b24e2bSVaishali Kulkarni 	/* get vendor length bytes 14-19 */
98114b24e2bSVaishali Kulkarni 	rc = ecore_mcp_phy_sfp_read(p_hwfn, p_ptt, port, I2C_TRANSCEIVER_ADDR,
98214b24e2bSVaishali Kulkarni 				    14, 6, buf);
98314b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
98414b24e2bSVaishali Kulkarni 		return ecore_sfp_set_error(rc, length, p_phy_result_buf,
98514b24e2bSVaishali Kulkarni 					   "Error reading vendor length bytes.\n");
98614b24e2bSVaishali Kulkarni 
98714b24e2bSVaishali Kulkarni 	length += OSAL_SPRINTF(&p_phy_result_buf[length],
98814b24e2bSVaishali Kulkarni 			       "Length (SMF, km) 0x%x\n", buf[0]);
98914b24e2bSVaishali Kulkarni 	length += OSAL_SPRINTF(&p_phy_result_buf[length],
99014b24e2bSVaishali Kulkarni 			       "Length (SMF) 0x%x\n", buf[1]);
99114b24e2bSVaishali Kulkarni 	length += OSAL_SPRINTF(&p_phy_result_buf[length],
99214b24e2bSVaishali Kulkarni 			       "Length (50 um) 0x%x\n", buf[2]);
99314b24e2bSVaishali Kulkarni 	length += OSAL_SPRINTF(&p_phy_result_buf[length],
99414b24e2bSVaishali Kulkarni 			       "Length (62.5 um) 0x%x\n", buf[3]);
99514b24e2bSVaishali Kulkarni 	length += OSAL_SPRINTF(&p_phy_result_buf[length],
99614b24e2bSVaishali Kulkarni 			       "Length (OM4 or copper cable) 0x%x\n", buf[4]);
99714b24e2bSVaishali Kulkarni 	length += OSAL_SPRINTF(&p_phy_result_buf[length],
99814b24e2bSVaishali Kulkarni 			       "Length (OM3) 0x%x\n", buf[5]);
99914b24e2bSVaishali Kulkarni 
100014b24e2bSVaishali Kulkarni 	/* get vendor name bytes bytes 20-35 */
100114b24e2bSVaishali Kulkarni 	rc = ecore_mcp_phy_sfp_read(p_hwfn, p_ptt, port, I2C_TRANSCEIVER_ADDR,
100214b24e2bSVaishali Kulkarni 				    20, 16, buf);
100314b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
100414b24e2bSVaishali Kulkarni 		return ecore_sfp_set_error(rc, length, p_phy_result_buf,
100514b24e2bSVaishali Kulkarni 					   "Error reading vendor name.\n");
100614b24e2bSVaishali Kulkarni 
100714b24e2bSVaishali Kulkarni 	buf[16] = 0;
100814b24e2bSVaishali Kulkarni 	length += OSAL_SPRINTF(&p_phy_result_buf[length],
100914b24e2bSVaishali Kulkarni 			       "Vendor name: %s\n", buf);
101014b24e2bSVaishali Kulkarni 
101114b24e2bSVaishali Kulkarni 	/* get vendor OUI bytes 37-39 */
101214b24e2bSVaishali Kulkarni 	rc = ecore_mcp_phy_sfp_read(p_hwfn, p_ptt, port, I2C_TRANSCEIVER_ADDR,
101314b24e2bSVaishali Kulkarni 				    37, 3, buf);
101414b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
101514b24e2bSVaishali Kulkarni 		return ecore_sfp_set_error(rc, length, p_phy_result_buf,
101614b24e2bSVaishali Kulkarni 					   "Error reading vendor OUI.\n");
101714b24e2bSVaishali Kulkarni 
101814b24e2bSVaishali Kulkarni 	length += OSAL_SPRINTF(&p_phy_result_buf[length],
101914b24e2bSVaishali Kulkarni 			       "Vendor OUI: %02x%02x%02x\n",
102014b24e2bSVaishali Kulkarni 			       buf[0], buf[1], buf[2]);
102114b24e2bSVaishali Kulkarni 
102214b24e2bSVaishali Kulkarni 	/* get vendor PN  bytes 40-55 */
102314b24e2bSVaishali Kulkarni 	rc = ecore_mcp_phy_sfp_read(p_hwfn, p_ptt, port, I2C_TRANSCEIVER_ADDR,
102414b24e2bSVaishali Kulkarni 				    40, 16, buf);
102514b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
102614b24e2bSVaishali Kulkarni 		return ecore_sfp_set_error(rc, length, p_phy_result_buf,
102714b24e2bSVaishali Kulkarni 					   "Error reading vendor PN.\n");
102814b24e2bSVaishali Kulkarni 
102914b24e2bSVaishali Kulkarni 	buf[16] = 0;
103014b24e2bSVaishali Kulkarni 	length += OSAL_SPRINTF(&p_phy_result_buf[length],
103114b24e2bSVaishali Kulkarni 			       "Vendor PN: %s\n", buf);
103214b24e2bSVaishali Kulkarni 
103314b24e2bSVaishali Kulkarni 	/* get vendor REV bytes 56-59 */
103414b24e2bSVaishali Kulkarni 	rc = ecore_mcp_phy_sfp_read(p_hwfn, p_ptt, port, I2C_TRANSCEIVER_ADDR,
103514b24e2bSVaishali Kulkarni 				    56, 4, buf);
103614b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
103714b24e2bSVaishali Kulkarni 		return ecore_sfp_set_error(rc, length, p_phy_result_buf,
103814b24e2bSVaishali Kulkarni 					   "Error reading vendor rev.\n");
103914b24e2bSVaishali Kulkarni 
104014b24e2bSVaishali Kulkarni 	buf[4] = 0;
104114b24e2bSVaishali Kulkarni 	length += OSAL_SPRINTF(&p_phy_result_buf[length],
104214b24e2bSVaishali Kulkarni 			       "Vendor rev: %s\n", buf);
104314b24e2bSVaishali Kulkarni 
104414b24e2bSVaishali Kulkarni 	return rc;
104514b24e2bSVaishali Kulkarni }
104614b24e2bSVaishali Kulkarni 
ecore_decode_qsfp_info(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 port,u32 length,char * p_phy_result_buf)104714b24e2bSVaishali Kulkarni static enum _ecore_status_t ecore_decode_qsfp_info(struct ecore_hwfn *p_hwfn,
104814b24e2bSVaishali Kulkarni 						   struct ecore_ptt *p_ptt,
104914b24e2bSVaishali Kulkarni 						   u32 port, u32 length,
105014b24e2bSVaishali Kulkarni 						   char *p_phy_result_buf)
105114b24e2bSVaishali Kulkarni {
105214b24e2bSVaishali Kulkarni 	/* QSFP EEPROM contents are described in SFF-8024 and SFF-8636 */
105314b24e2bSVaishali Kulkarni 	/***********************************************/
105414b24e2bSVaishali Kulkarni 	/* QSFP DATA and locations                     */
105514b24e2bSVaishali Kulkarni 	/* get specification complianace bytes 131-138 */
105614b24e2bSVaishali Kulkarni 	/* get extended rate select bytes 141          */
105714b24e2bSVaishali Kulkarni 	/* get vendor length bytes 142-146             */
105814b24e2bSVaishali Kulkarni 	/* get device technology byte 147              */
105914b24e2bSVaishali Kulkarni 	/* get vendor name bytes bytes 148-163         */
106014b24e2bSVaishali Kulkarni 	/* get vendor OUI bytes 165-167                */
106114b24e2bSVaishali Kulkarni 	/* get vendor PN  bytes 168-183                */
106214b24e2bSVaishali Kulkarni 	/* get vendor REV bytes 184-185                */
106314b24e2bSVaishali Kulkarni 	/* validated                                   */
106414b24e2bSVaishali Kulkarni 	/***********************************************/
106514b24e2bSVaishali Kulkarni 	enum _ecore_status_t rc;
106614b24e2bSVaishali Kulkarni 	u8 buf[32];
106714b24e2bSVaishali Kulkarni 
106814b24e2bSVaishali Kulkarni 	rc = ecore_mcp_phy_sfp_read(p_hwfn, p_ptt, port, I2C_TRANSCEIVER_ADDR,
106914b24e2bSVaishali Kulkarni 				    131, 1, buf);
107014b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
107114b24e2bSVaishali Kulkarni 		return ecore_sfp_set_error(rc, length, p_phy_result_buf,
107214b24e2bSVaishali Kulkarni 					   "Error reading transceiver compliance code.\n");
107314b24e2bSVaishali Kulkarni 
107414b24e2bSVaishali Kulkarni 	length += OSAL_SPRINTF(&p_phy_result_buf[length],
107514b24e2bSVaishali Kulkarni 			       "Transceiver compliance code 0x%x\n", buf[0]);
107614b24e2bSVaishali Kulkarni 
107714b24e2bSVaishali Kulkarni 	switch (buf[0]) {
107814b24e2bSVaishali Kulkarni 	case 0x1:
107914b24e2bSVaishali Kulkarni 		/* 40G Active (XLPPI) */
108014b24e2bSVaishali Kulkarni 		length += OSAL_SPRINTF(&p_phy_result_buf[length],
108114b24e2bSVaishali Kulkarni 				       "40G Active (XLPPI) detected.\n");
108214b24e2bSVaishali Kulkarni 		break;
108314b24e2bSVaishali Kulkarni 	case 0x2:
108414b24e2bSVaishali Kulkarni 		/* 40G LR-4 */
108514b24e2bSVaishali Kulkarni 		length += OSAL_SPRINTF(&p_phy_result_buf[length],
108614b24e2bSVaishali Kulkarni 				       "40G LR-4 detected.\n");
108714b24e2bSVaishali Kulkarni 		break;
108814b24e2bSVaishali Kulkarni 	case 0x4:
108914b24e2bSVaishali Kulkarni 		/* 40G SR-4 */
109014b24e2bSVaishali Kulkarni 		length += OSAL_SPRINTF(&p_phy_result_buf[length],
109114b24e2bSVaishali Kulkarni 				       "40G SR-4 detected.\n");
109214b24e2bSVaishali Kulkarni 		break;
109314b24e2bSVaishali Kulkarni 	case 0x8:
109414b24e2bSVaishali Kulkarni 		/* 40G CR-4 */
109514b24e2bSVaishali Kulkarni 		length += OSAL_SPRINTF(&p_phy_result_buf[length],
109614b24e2bSVaishali Kulkarni 				       "40G CR-4 detected.\n");
109714b24e2bSVaishali Kulkarni 		break;
109814b24e2bSVaishali Kulkarni 	case 0x10:
109914b24e2bSVaishali Kulkarni 		/* 10G SR */
110014b24e2bSVaishali Kulkarni 		length += OSAL_SPRINTF(&p_phy_result_buf[length],
110114b24e2bSVaishali Kulkarni 				       "10G SR detected.\n");
110214b24e2bSVaishali Kulkarni 		break;
110314b24e2bSVaishali Kulkarni 	case 0x20:
110414b24e2bSVaishali Kulkarni 		/* 10G LR */
110514b24e2bSVaishali Kulkarni 		length += OSAL_SPRINTF(&p_phy_result_buf[length],
110614b24e2bSVaishali Kulkarni 				       "10G LR detected.\n");
110714b24e2bSVaishali Kulkarni 		break;
110814b24e2bSVaishali Kulkarni 	case 0x40:
110914b24e2bSVaishali Kulkarni 		/* 10G LRM */
111014b24e2bSVaishali Kulkarni 		length += OSAL_SPRINTF(&p_phy_result_buf[length],
111114b24e2bSVaishali Kulkarni 				       "10G LRM detected.\n");
111214b24e2bSVaishali Kulkarni 		break;
111314b24e2bSVaishali Kulkarni 	case 0x88: /* Could be 40G/100G CR4 cable, check 192 for 100G CR4 */
111414b24e2bSVaishali Kulkarni 		length += OSAL_SPRINTF(&p_phy_result_buf[length],
111514b24e2bSVaishali Kulkarni 				       "Multi-rate transceiver: 40G CR-4 detected...\n");
111614b24e2bSVaishali Kulkarni 		break;
111714b24e2bSVaishali Kulkarni 	case 0x80:
111814b24e2bSVaishali Kulkarni 		/* Use extended technology field */
111914b24e2bSVaishali Kulkarni 		length += OSAL_SPRINTF(&p_phy_result_buf[length],
112014b24e2bSVaishali Kulkarni 				       "Use extended technology field\n");
112114b24e2bSVaishali Kulkarni 		/* Byte 93 & 129 is supposed to have power info. During    */
112214b24e2bSVaishali Kulkarni 		/* testing all reads 0.  Ignore for now                    */
112314b24e2bSVaishali Kulkarni 		/* 0-127 is in the first page  this in high region -       */
112414b24e2bSVaishali Kulkarni 		/* see what page it is.                                    */
112514b24e2bSVaishali Kulkarni 		/*  buf[3] = 0;                                            */
112614b24e2bSVaishali Kulkarni 		/*  ret_val = read_transceiver_data(g_port, i2c_addr, 129, */
112714b24e2bSVaishali Kulkarni 		/*  buf, 1);                                               */
112814b24e2bSVaishali Kulkarni 		/*  length += OSAL_SPRINTF(&p_phy_result_buf[length],      */
112914b24e2bSVaishali Kulkarni 		/*  "Read transceiver power data.  Value read: 0x%hx\n\n", */
113014b24e2bSVaishali Kulkarni 		/*  buf[3]);                                               */
113114b24e2bSVaishali Kulkarni 
113214b24e2bSVaishali Kulkarni 		rc = ecore_mcp_phy_sfp_read(p_hwfn, p_ptt, port,
113314b24e2bSVaishali Kulkarni 					    I2C_TRANSCEIVER_ADDR, 192, 1, buf);
113414b24e2bSVaishali Kulkarni 		if (rc != ECORE_SUCCESS)
113514b24e2bSVaishali Kulkarni 			return ecore_sfp_set_error(rc, length, p_phy_result_buf,
113614b24e2bSVaishali Kulkarni 						   "Error reading technology compliance field.\n");
113714b24e2bSVaishali Kulkarni 
113814b24e2bSVaishali Kulkarni 		switch (buf[0]) {
113914b24e2bSVaishali Kulkarni 		case 0:
114014b24e2bSVaishali Kulkarni 			/* Unspecified */
114114b24e2bSVaishali Kulkarni 			length += OSAL_SPRINTF(&p_phy_result_buf[length],
114214b24e2bSVaishali Kulkarni 					       "Unspecified detected.\n");
114314b24e2bSVaishali Kulkarni 			break;
114414b24e2bSVaishali Kulkarni 		case 0x1:
114514b24e2bSVaishali Kulkarni 			/* 100G AOC (active optical cable) */
114614b24e2bSVaishali Kulkarni 			length += OSAL_SPRINTF(&p_phy_result_buf[length],
114714b24e2bSVaishali Kulkarni 					       "100G AOC (active optical cable) detected\n");
114814b24e2bSVaishali Kulkarni 			break;
114914b24e2bSVaishali Kulkarni 		case 0x2:
115014b24e2bSVaishali Kulkarni 			/* 100G SR-4 */
115114b24e2bSVaishali Kulkarni 			length += OSAL_SPRINTF(&p_phy_result_buf[length],
115214b24e2bSVaishali Kulkarni 					       "100G SR-4 detected\n");
115314b24e2bSVaishali Kulkarni 			break;
115414b24e2bSVaishali Kulkarni 		case 0x3:
115514b24e2bSVaishali Kulkarni 			/* 100G LR-4 */
115614b24e2bSVaishali Kulkarni 			length += OSAL_SPRINTF(&p_phy_result_buf[length],
115714b24e2bSVaishali Kulkarni 					       "100G LR-4 detected\n");
115814b24e2bSVaishali Kulkarni 			break;
115914b24e2bSVaishali Kulkarni 		case 0x4:
116014b24e2bSVaishali Kulkarni 			/* 100G ER-4 */
116114b24e2bSVaishali Kulkarni 			length += OSAL_SPRINTF(&p_phy_result_buf[length],
116214b24e2bSVaishali Kulkarni 					       "100G ER-4 detected\n");
116314b24e2bSVaishali Kulkarni 			break;
116414b24e2bSVaishali Kulkarni 		case 0x8:
116514b24e2bSVaishali Kulkarni 			/* 100G ACC (active copper cable) */
116614b24e2bSVaishali Kulkarni 			length += OSAL_SPRINTF(&p_phy_result_buf[length],
116714b24e2bSVaishali Kulkarni 					       "100G ACC (active copper cable detected\n");
116814b24e2bSVaishali Kulkarni 			break;
116914b24e2bSVaishali Kulkarni 		case 0xb:
117014b24e2bSVaishali Kulkarni 			/* 100G CR-4 */
117114b24e2bSVaishali Kulkarni 			length += OSAL_SPRINTF(&p_phy_result_buf[length],
117214b24e2bSVaishali Kulkarni 					       "100G CR-4 detected\n");
117314b24e2bSVaishali Kulkarni 			break;
117414b24e2bSVaishali Kulkarni 		case 0x11:
117514b24e2bSVaishali Kulkarni 			/* 4x10G SR */
117614b24e2bSVaishali Kulkarni 			length += OSAL_SPRINTF(&p_phy_result_buf[length],
117714b24e2bSVaishali Kulkarni 					       "4x10G SR detected\n");
117814b24e2bSVaishali Kulkarni 			break;
117914b24e2bSVaishali Kulkarni 		default:
118014b24e2bSVaishali Kulkarni 			length += OSAL_SPRINTF(&p_phy_result_buf[length],
118114b24e2bSVaishali Kulkarni 					       "Unexpected technology. NEW COMPLIANCE CODE TO SUPPORT 0x%x\n",
118214b24e2bSVaishali Kulkarni 					       buf[0]);
118314b24e2bSVaishali Kulkarni 			break;
118414b24e2bSVaishali Kulkarni 		}
118514b24e2bSVaishali Kulkarni 		break;
118614b24e2bSVaishali Kulkarni 	default:
118714b24e2bSVaishali Kulkarni 		/* Unexpected technology compliance field */
118814b24e2bSVaishali Kulkarni 		length += OSAL_SPRINTF(&p_phy_result_buf[length],
118914b24e2bSVaishali Kulkarni 				       "WARNING: Unexpected technology compliance field detected 0x%x\n",
119014b24e2bSVaishali Kulkarni 				       buf[0]);
119114b24e2bSVaishali Kulkarni 		length += OSAL_SPRINTF(&p_phy_result_buf[length],
119214b24e2bSVaishali Kulkarni 				       "Assume SR-4 detected\n");
119314b24e2bSVaishali Kulkarni 		break;
119414b24e2bSVaishali Kulkarni 	}
119514b24e2bSVaishali Kulkarni 
119614b24e2bSVaishali Kulkarni 	/* get extended rate select bytes 141 */
119714b24e2bSVaishali Kulkarni 	/* get vendor length bytes 142-146 */
119814b24e2bSVaishali Kulkarni 	/* get device technology byte 147 */
119914b24e2bSVaishali Kulkarni 	rc = ecore_mcp_phy_sfp_read(p_hwfn, p_ptt, port, I2C_TRANSCEIVER_ADDR,
120014b24e2bSVaishali Kulkarni 				    141, 7, buf);
120114b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
120214b24e2bSVaishali Kulkarni 		return ecore_sfp_set_error(rc, length, p_phy_result_buf,
120314b24e2bSVaishali Kulkarni 					   "Error reading extended rate select bytes.\n");
120414b24e2bSVaishali Kulkarni 
120514b24e2bSVaishali Kulkarni 	length += OSAL_SPRINTF(&p_phy_result_buf[length],
120614b24e2bSVaishali Kulkarni 			       "Extended rate select bytes 0x%x\n", buf[0]);
120714b24e2bSVaishali Kulkarni 	length += OSAL_SPRINTF(&p_phy_result_buf[length],
120814b24e2bSVaishali Kulkarni 			       "Length (SMF) 0x%x\n", buf[1]);
120914b24e2bSVaishali Kulkarni 	length += OSAL_SPRINTF(&p_phy_result_buf[length],
121014b24e2bSVaishali Kulkarni 			       "Length (OM3 50 um) 0x%x\n", buf[2]);
121114b24e2bSVaishali Kulkarni 	length += OSAL_SPRINTF(&p_phy_result_buf[length],
121214b24e2bSVaishali Kulkarni 			       "Length (OM2 50 um) 0x%x\n", buf[3]);
121314b24e2bSVaishali Kulkarni 	length += OSAL_SPRINTF(&p_phy_result_buf[length],
121414b24e2bSVaishali Kulkarni 			       "Length (OM1 62.5 um) 0x%x\n", buf[4]);
121514b24e2bSVaishali Kulkarni 	length += OSAL_SPRINTF(&p_phy_result_buf[length],
121614b24e2bSVaishali Kulkarni 			       "Length (Passive or active) 0x%x\n", buf[5]);
121714b24e2bSVaishali Kulkarni 	length += OSAL_SPRINTF(&p_phy_result_buf[length],
121814b24e2bSVaishali Kulkarni 			       "Device technology byte 0x%x\n", buf[6]);
121914b24e2bSVaishali Kulkarni 
122014b24e2bSVaishali Kulkarni 	/* get vendor name bytes bytes 148-163 */
122114b24e2bSVaishali Kulkarni 	rc = ecore_mcp_phy_sfp_read(p_hwfn, p_ptt, port, I2C_TRANSCEIVER_ADDR,
122214b24e2bSVaishali Kulkarni 				    148, 16, buf);
122314b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
122414b24e2bSVaishali Kulkarni 		return ecore_sfp_set_error(rc, length, p_phy_result_buf,
122514b24e2bSVaishali Kulkarni 					   "Error reading vendor name.\n");
122614b24e2bSVaishali Kulkarni 
122714b24e2bSVaishali Kulkarni 	buf[16] = 0;
122814b24e2bSVaishali Kulkarni 	length += OSAL_SPRINTF(&p_phy_result_buf[length],
122914b24e2bSVaishali Kulkarni 			       "Vendor name: %s\n", buf);
123014b24e2bSVaishali Kulkarni 
123114b24e2bSVaishali Kulkarni 	/* get vendor OUI bytes 165-167 */
123214b24e2bSVaishali Kulkarni 	rc = ecore_mcp_phy_sfp_read(p_hwfn, p_ptt, port, I2C_TRANSCEIVER_ADDR,
123314b24e2bSVaishali Kulkarni 				    165, 3, buf);
123414b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
123514b24e2bSVaishali Kulkarni 		return ecore_sfp_set_error(rc, length, p_phy_result_buf,
123614b24e2bSVaishali Kulkarni 					   "Error reading vendor OUI.\n");
123714b24e2bSVaishali Kulkarni 
123814b24e2bSVaishali Kulkarni 	length += OSAL_SPRINTF(&p_phy_result_buf[length],
123914b24e2bSVaishali Kulkarni 			       "Vendor OUI: %02x%02x%02x\n",
124014b24e2bSVaishali Kulkarni 			       buf[0], buf[1], buf[2]);
124114b24e2bSVaishali Kulkarni 
124214b24e2bSVaishali Kulkarni 	/* get vendor PN  bytes 168-183 */
124314b24e2bSVaishali Kulkarni 	rc = ecore_mcp_phy_sfp_read(p_hwfn, p_ptt, port, I2C_TRANSCEIVER_ADDR,
124414b24e2bSVaishali Kulkarni 				    168, 16, buf);
124514b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
124614b24e2bSVaishali Kulkarni 		return ecore_sfp_set_error(rc, length, p_phy_result_buf,
124714b24e2bSVaishali Kulkarni 					   "Error reading vendor PN.\n");
124814b24e2bSVaishali Kulkarni 
124914b24e2bSVaishali Kulkarni 	buf[16] = 0;
125014b24e2bSVaishali Kulkarni 	length += OSAL_SPRINTF(&p_phy_result_buf[length],
125114b24e2bSVaishali Kulkarni 			       "Vendor PN: %s\n", buf);
125214b24e2bSVaishali Kulkarni 
125314b24e2bSVaishali Kulkarni 	/* get vendor REV bytes 184-185 */
125414b24e2bSVaishali Kulkarni 	rc = ecore_mcp_phy_sfp_read(p_hwfn, p_ptt, port, I2C_TRANSCEIVER_ADDR,
125514b24e2bSVaishali Kulkarni 				    184, 2, buf);
125614b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
125714b24e2bSVaishali Kulkarni 		return ecore_sfp_set_error(rc, length, p_phy_result_buf,
125814b24e2bSVaishali Kulkarni 					   "Error reading vendor rev.\n");
125914b24e2bSVaishali Kulkarni 
126014b24e2bSVaishali Kulkarni 	buf[2] = 0;
126114b24e2bSVaishali Kulkarni 	length += OSAL_SPRINTF(&p_phy_result_buf[length],
126214b24e2bSVaishali Kulkarni 			       "Vendor rev: %s\n", buf);
126314b24e2bSVaishali Kulkarni 
126414b24e2bSVaishali Kulkarni 	return rc;
126514b24e2bSVaishali Kulkarni }
126614b24e2bSVaishali Kulkarni 
126714b24e2bSVaishali Kulkarni /* Decode SFP information */
ecore_phy_sfp_decode(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 port,char * p_phy_result_buf)126814b24e2bSVaishali Kulkarni int ecore_phy_sfp_decode(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt,
126914b24e2bSVaishali Kulkarni 			 u32 port, char *p_phy_result_buf)
127014b24e2bSVaishali Kulkarni {
127114b24e2bSVaishali Kulkarni 	enum _ecore_status_t rc;
127214b24e2bSVaishali Kulkarni 	u32 length = 0;
127314b24e2bSVaishali Kulkarni 	u8 buf[4];
127414b24e2bSVaishali Kulkarni 
127514b24e2bSVaishali Kulkarni 	/* Verify <port> field is between 0 and number of ports */
127614b24e2bSVaishali Kulkarni 	rc = ecore_validate_sfp_port(p_hwfn, p_ptt, port, p_phy_result_buf);
127714b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
127814b24e2bSVaishali Kulkarni 		return rc;
127914b24e2bSVaishali Kulkarni 
128014b24e2bSVaishali Kulkarni 	rc = ecore_mcp_phy_sfp_read(p_hwfn, p_ptt, port, I2C_TRANSCEIVER_ADDR,
128114b24e2bSVaishali Kulkarni 				    0, 1, buf);
128214b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
128314b24e2bSVaishali Kulkarni 		return ecore_sfp_set_error(rc, length, p_phy_result_buf,
128414b24e2bSVaishali Kulkarni 					   "Error reading transceiver identification field.\n");
128514b24e2bSVaishali Kulkarni 
128614b24e2bSVaishali Kulkarni 	switch (buf[0]) {
128714b24e2bSVaishali Kulkarni 	case 0x3: /* SFP, SFP+, SFP-28 */
128814b24e2bSVaishali Kulkarni 		length += OSAL_SPRINTF(&p_phy_result_buf[length],
128914b24e2bSVaishali Kulkarni 				       "SFP, SFP+ or SFP-28 inserted.\n");
129014b24e2bSVaishali Kulkarni 		rc = ecore_decode_sfp_info(p_hwfn, p_ptt, port,
129114b24e2bSVaishali Kulkarni 					   length, p_phy_result_buf);
129214b24e2bSVaishali Kulkarni 		break;
129314b24e2bSVaishali Kulkarni 	case 0xc: /* QSFP */
129414b24e2bSVaishali Kulkarni 		length += OSAL_SPRINTF(&p_phy_result_buf[length],
129514b24e2bSVaishali Kulkarni 				       "QSFP inserted.\n");
129614b24e2bSVaishali Kulkarni 		rc = ecore_decode_qsfp_info(p_hwfn, p_ptt, port,
129714b24e2bSVaishali Kulkarni 					    length, p_phy_result_buf);
129814b24e2bSVaishali Kulkarni 		break;
129914b24e2bSVaishali Kulkarni 	case 0xd: /* QSFP+ */
130014b24e2bSVaishali Kulkarni 		length += OSAL_SPRINTF(&p_phy_result_buf[length],
130114b24e2bSVaishali Kulkarni 				       "QSFP+ inserted.\n");
130214b24e2bSVaishali Kulkarni 		rc = ecore_decode_qsfp_info(p_hwfn, p_ptt, port,
130314b24e2bSVaishali Kulkarni 					    length, p_phy_result_buf);
130414b24e2bSVaishali Kulkarni 		break;
130514b24e2bSVaishali Kulkarni 	case 0x11: /* QSFP-28 */
130614b24e2bSVaishali Kulkarni 		length += OSAL_SPRINTF(&p_phy_result_buf[length],
130714b24e2bSVaishali Kulkarni 				       "QSFP-28 inserted.\n");
130814b24e2bSVaishali Kulkarni 		rc = ecore_decode_qsfp_info(p_hwfn, p_ptt, port,
130914b24e2bSVaishali Kulkarni 					    length, p_phy_result_buf);
131014b24e2bSVaishali Kulkarni 		break;
131114b24e2bSVaishali Kulkarni 	case 0x12: /* CXP2 (CXP-28) */
131214b24e2bSVaishali Kulkarni 		OSAL_SPRINTF(p_phy_result_buf,
131314b24e2bSVaishali Kulkarni 			     "CXP2 (CXP-28) inserted.\n");
131414b24e2bSVaishali Kulkarni 		rc = ECORE_UNKNOWN_ERROR;
131514b24e2bSVaishali Kulkarni 		break;
131614b24e2bSVaishali Kulkarni 	default:
131714b24e2bSVaishali Kulkarni 		OSAL_SPRINTF(p_phy_result_buf,
131814b24e2bSVaishali Kulkarni 			     "Unknown transceiver type inserted.\n");
131914b24e2bSVaishali Kulkarni 		rc = ECORE_UNKNOWN_ERROR;
132014b24e2bSVaishali Kulkarni 		break;
132114b24e2bSVaishali Kulkarni 	}
132214b24e2bSVaishali Kulkarni 
132314b24e2bSVaishali Kulkarni 	return rc;
132414b24e2bSVaishali Kulkarni }
132514b24e2bSVaishali Kulkarni 
132614b24e2bSVaishali Kulkarni /* Get SFP inserted status */
ecore_phy_sfp_get_inserted(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 port,char * p_phy_result_buf)132714b24e2bSVaishali Kulkarni int ecore_phy_sfp_get_inserted(struct ecore_hwfn *p_hwfn,
132814b24e2bSVaishali Kulkarni 			       struct ecore_ptt *p_ptt,
132914b24e2bSVaishali Kulkarni 			       u32 port, char *p_phy_result_buf)
133014b24e2bSVaishali Kulkarni {
133114b24e2bSVaishali Kulkarni 	u32 transceiver_state;
133214b24e2bSVaishali Kulkarni 	u32 addr = SECTION_OFFSIZE_ADDR(p_hwfn->mcp_info->public_base,
133314b24e2bSVaishali Kulkarni 					PUBLIC_PORT);
133414b24e2bSVaishali Kulkarni 	u32 mfw_mb_offsize = ecore_rd(p_hwfn, p_ptt, addr);
133514b24e2bSVaishali Kulkarni 	u32 port_addr = SECTION_ADDR(mfw_mb_offsize, port);
133614b24e2bSVaishali Kulkarni 
133714b24e2bSVaishali Kulkarni 	transceiver_state = ecore_rd(p_hwfn, p_ptt,
133814b24e2bSVaishali Kulkarni 				     port_addr +
1339*04443fdeSToomas Soome 				     offsetof(struct public_port,
134014b24e2bSVaishali Kulkarni 					      transceiver_data));
134114b24e2bSVaishali Kulkarni 
134214b24e2bSVaishali Kulkarni 	transceiver_state = GET_FIELD(transceiver_state, ETH_TRANSCEIVER_STATE);
134314b24e2bSVaishali Kulkarni 
134414b24e2bSVaishali Kulkarni 	OSAL_SPRINTF(p_phy_result_buf, "%d",
134514b24e2bSVaishali Kulkarni 		     (transceiver_state == ETH_TRANSCEIVER_STATE_PRESENT));
134614b24e2bSVaishali Kulkarni 
134714b24e2bSVaishali Kulkarni 	return ECORE_SUCCESS;
134814b24e2bSVaishali Kulkarni }
134914b24e2bSVaishali Kulkarni 
135014b24e2bSVaishali Kulkarni /* Get SFP TX disable status */
ecore_phy_sfp_get_txdisable(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 port,char * p_phy_result_buf)135114b24e2bSVaishali Kulkarni int ecore_phy_sfp_get_txdisable(struct ecore_hwfn *p_hwfn,
135214b24e2bSVaishali Kulkarni 				struct ecore_ptt *p_ptt,
135314b24e2bSVaishali Kulkarni 				u32 port, char *p_phy_result_buf)
135414b24e2bSVaishali Kulkarni {
135514b24e2bSVaishali Kulkarni 	enum _ecore_status_t rc;
135614b24e2bSVaishali Kulkarni 	u32 length = 0;
135714b24e2bSVaishali Kulkarni 	u8 buf[4];
135814b24e2bSVaishali Kulkarni 
135914b24e2bSVaishali Kulkarni 	/* Verify <port> field is between 0 and number of ports */
136014b24e2bSVaishali Kulkarni 	rc = ecore_validate_sfp_port(p_hwfn, p_ptt, port, p_phy_result_buf);
136114b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
136214b24e2bSVaishali Kulkarni 		return rc;
136314b24e2bSVaishali Kulkarni 
136414b24e2bSVaishali Kulkarni 	rc = ecore_mcp_phy_sfp_read(p_hwfn, p_ptt, port, I2C_TRANSCEIVER_ADDR,
136514b24e2bSVaishali Kulkarni 				    0, 1, buf);
136614b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
136714b24e2bSVaishali Kulkarni 		return ecore_sfp_set_error(rc, length, p_phy_result_buf,
136814b24e2bSVaishali Kulkarni 					   "Error reading transceiver identification field.\n");
136914b24e2bSVaishali Kulkarni 
137014b24e2bSVaishali Kulkarni 	switch (buf[0]) {
137114b24e2bSVaishali Kulkarni 	case 0x3: /* SFP, SFP+, SFP-28 */
137214b24e2bSVaishali Kulkarni 		rc = ecore_mcp_phy_sfp_read(p_hwfn, p_ptt, port,
137314b24e2bSVaishali Kulkarni 					    I2C_TRANSCEIVER_ADDR, 110, 1, buf);
137414b24e2bSVaishali Kulkarni 		if (rc != ECORE_SUCCESS)
137514b24e2bSVaishali Kulkarni 			return ecore_sfp_set_error(rc, length, p_phy_result_buf,
137614b24e2bSVaishali Kulkarni 						   "Error reading transceiver tx disable status field.\n");
137714b24e2bSVaishali Kulkarni 		OSAL_SPRINTF(p_phy_result_buf, "%d",
137814b24e2bSVaishali Kulkarni 			     ((buf[0] & 0xC0) ? 1 : 0));
137914b24e2bSVaishali Kulkarni 		break;
138014b24e2bSVaishali Kulkarni 	case 0xc: /* QSFP */
138114b24e2bSVaishali Kulkarni 	case 0xd: /* QSFP+ */
138214b24e2bSVaishali Kulkarni 	case 0x11: /* QSFP-28 */
138314b24e2bSVaishali Kulkarni 		rc = ecore_mcp_phy_sfp_read(p_hwfn, p_ptt, port,
138414b24e2bSVaishali Kulkarni 					    I2C_TRANSCEIVER_ADDR, 86, 1, buf);
138514b24e2bSVaishali Kulkarni 		if (rc != ECORE_SUCCESS)
138614b24e2bSVaishali Kulkarni 			return ecore_sfp_set_error(rc, length, p_phy_result_buf,
138714b24e2bSVaishali Kulkarni 						   "Error reading transceiver tx disable status field.\n");
138814b24e2bSVaishali Kulkarni 		OSAL_SPRINTF(p_phy_result_buf, "%d",
138914b24e2bSVaishali Kulkarni 			     ((buf[0] & ((1 << port))) ? 1 : 0));
139014b24e2bSVaishali Kulkarni 		break;
139114b24e2bSVaishali Kulkarni 	default:
139214b24e2bSVaishali Kulkarni 		OSAL_SPRINTF(p_phy_result_buf,
139314b24e2bSVaishali Kulkarni 			     "Unknown transceiver type inserted.\n");
139414b24e2bSVaishali Kulkarni 		rc = ECORE_UNKNOWN_ERROR;
139514b24e2bSVaishali Kulkarni 		break;
139614b24e2bSVaishali Kulkarni 	}
139714b24e2bSVaishali Kulkarni 
139814b24e2bSVaishali Kulkarni 	return rc;
139914b24e2bSVaishali Kulkarni }
140014b24e2bSVaishali Kulkarni 
140114b24e2bSVaishali Kulkarni /* Set SFP TX disable */
ecore_phy_sfp_set_txdisable(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 port,u8 txdisable,char * p_phy_result_buf)140214b24e2bSVaishali Kulkarni int ecore_phy_sfp_set_txdisable(struct ecore_hwfn *p_hwfn,
140314b24e2bSVaishali Kulkarni 				struct ecore_ptt *p_ptt,
140414b24e2bSVaishali Kulkarni 				u32 port, u8 txdisable,
140514b24e2bSVaishali Kulkarni 				char *p_phy_result_buf)
140614b24e2bSVaishali Kulkarni {
140714b24e2bSVaishali Kulkarni 	enum _ecore_status_t rc;
140814b24e2bSVaishali Kulkarni 	u32 length = 0;
140914b24e2bSVaishali Kulkarni 	u8 buf[4];
141014b24e2bSVaishali Kulkarni 
141114b24e2bSVaishali Kulkarni 	/* Verify <txdisable> field is between 0 and 1 */
141214b24e2bSVaishali Kulkarni 	if (txdisable > 1) {
141314b24e2bSVaishali Kulkarni 		OSAL_SPRINTF(p_phy_result_buf,
141414b24e2bSVaishali Kulkarni 			     "Bad tx disable value, must be 0 or 1.\n");
141514b24e2bSVaishali Kulkarni 		return ECORE_INVAL;
141614b24e2bSVaishali Kulkarni 	}
141714b24e2bSVaishali Kulkarni 
141814b24e2bSVaishali Kulkarni 	/* Verify <port> field is between 0 and number of ports */
141914b24e2bSVaishali Kulkarni 	rc = ecore_validate_sfp_port(p_hwfn, p_ptt, port,
142014b24e2bSVaishali Kulkarni 				     p_phy_result_buf);
142114b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
142214b24e2bSVaishali Kulkarni 		return rc;
142314b24e2bSVaishali Kulkarni 
142414b24e2bSVaishali Kulkarni 	rc = ecore_mcp_phy_sfp_read(p_hwfn, p_ptt, port, I2C_TRANSCEIVER_ADDR,
142514b24e2bSVaishali Kulkarni 				    0, 1, buf);
142614b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
142714b24e2bSVaishali Kulkarni 		return ecore_sfp_set_error(rc, length, p_phy_result_buf,
142814b24e2bSVaishali Kulkarni 					   "Error reading transceiver identification field.\n");
142914b24e2bSVaishali Kulkarni 
143014b24e2bSVaishali Kulkarni 	switch (buf[0]) {
143114b24e2bSVaishali Kulkarni 	case 0x3: /* SFP, SFP+, SFP-28 */
143214b24e2bSVaishali Kulkarni 		rc = ecore_mcp_phy_sfp_read(p_hwfn, p_ptt, port,
143314b24e2bSVaishali Kulkarni 					    I2C_TRANSCEIVER_ADDR,
143414b24e2bSVaishali Kulkarni 					    SFP_TX_DISABLE_OFFSET, 1, buf);
143514b24e2bSVaishali Kulkarni 		if (rc != ECORE_SUCCESS)
143614b24e2bSVaishali Kulkarni 			return ecore_sfp_set_error(rc, length, p_phy_result_buf,
143714b24e2bSVaishali Kulkarni 						   "Error reading transceiver tx disable status field.\n");
143814b24e2bSVaishali Kulkarni 
143914b24e2bSVaishali Kulkarni 		if (((buf[0] & 0x40) >> 6) != txdisable) {
144014b24e2bSVaishali Kulkarni 			buf[0] ^= 0x40;
144114b24e2bSVaishali Kulkarni 			rc = ecore_mcp_phy_sfp_write(p_hwfn, p_ptt, port,
144214b24e2bSVaishali Kulkarni 						     I2C_TRANSCEIVER_ADDR,
144314b24e2bSVaishali Kulkarni 						     SFP_TX_DISABLE_OFFSET,
144414b24e2bSVaishali Kulkarni 						     1, buf);
144514b24e2bSVaishali Kulkarni 			if (rc != ECORE_SUCCESS)
144614b24e2bSVaishali Kulkarni 				OSAL_SPRINTF(&p_phy_result_buf[length],
144714b24e2bSVaishali Kulkarni 					     "Error setting transceiver tx disable status field.\n");
144814b24e2bSVaishali Kulkarni 		}
144914b24e2bSVaishali Kulkarni 
145014b24e2bSVaishali Kulkarni 		if (((buf[0] & 0x80) >> 7) != txdisable) {
145114b24e2bSVaishali Kulkarni 			u32 nvm_cfg_addr, nvm_cfg1_offset, port_cfg_addr;
145214b24e2bSVaishali Kulkarni 			u16 gpio;
145314b24e2bSVaishali Kulkarni 
145414b24e2bSVaishali Kulkarni 			nvm_cfg_addr = ecore_rd(p_hwfn, p_ptt,
145514b24e2bSVaishali Kulkarni 						MISC_REG_GEN_PURP_CR0);
145614b24e2bSVaishali Kulkarni 			nvm_cfg1_offset = ecore_rd(p_hwfn, p_ptt,
145714b24e2bSVaishali Kulkarni 						   nvm_cfg_addr + 4);
145814b24e2bSVaishali Kulkarni 			port_cfg_addr = MCP_REG_SCRATCH + nvm_cfg1_offset +
1459*04443fdeSToomas Soome 					offsetof(struct nvm_cfg1, port[port]);
146014b24e2bSVaishali Kulkarni 			gpio = (u16)ecore_rd(p_hwfn, p_ptt,
146114b24e2bSVaishali Kulkarni 					     port_cfg_addr +
1462*04443fdeSToomas Soome 					     offsetof(struct nvm_cfg1_port,
146314b24e2bSVaishali Kulkarni 						      transceiver_00));
146414b24e2bSVaishali Kulkarni 			gpio &= NVM_CFG1_PORT_TRANS_MODULE_ABS_MASK;
146514b24e2bSVaishali Kulkarni 			rc = ecore_phy_gpio_write(p_hwfn, p_ptt, gpio,
146614b24e2bSVaishali Kulkarni 						  txdisable,
146714b24e2bSVaishali Kulkarni 						  p_phy_result_buf);
146814b24e2bSVaishali Kulkarni 			if (rc != ECORE_SUCCESS)
146914b24e2bSVaishali Kulkarni 				OSAL_SPRINTF(&p_phy_result_buf[length],
147014b24e2bSVaishali Kulkarni 					     "Error setting transceiver tx disable status field.\n");
147114b24e2bSVaishali Kulkarni 		}
147214b24e2bSVaishali Kulkarni 		break;
147314b24e2bSVaishali Kulkarni 	case 0xc: /* QSFP */
147414b24e2bSVaishali Kulkarni 	case 0xd: /* QSFP+ */
147514b24e2bSVaishali Kulkarni 	case 0x11: /* QSFP-28 */
147614b24e2bSVaishali Kulkarni 		rc = ecore_mcp_phy_sfp_read(p_hwfn, p_ptt, port,
147714b24e2bSVaishali Kulkarni 					    I2C_TRANSCEIVER_ADDR,
147814b24e2bSVaishali Kulkarni 					    QSFP_TX_DISABLE_OFFSET, 1, buf);
147914b24e2bSVaishali Kulkarni 		if (rc != ECORE_SUCCESS)
148014b24e2bSVaishali Kulkarni 			return ecore_sfp_set_error(rc, length,
148114b24e2bSVaishali Kulkarni 						   p_phy_result_buf,
148214b24e2bSVaishali Kulkarni 						   "Error reading transceiver tx disable status field.\n");
148314b24e2bSVaishali Kulkarni 		if (((buf[0] & (1 << port)) >> port) != txdisable) {
148414b24e2bSVaishali Kulkarni 			buf[0] ^= (1 << port);
148514b24e2bSVaishali Kulkarni 			rc = ecore_mcp_phy_sfp_write(p_hwfn, p_ptt, port,
148614b24e2bSVaishali Kulkarni 						     I2C_TRANSCEIVER_ADDR,
148714b24e2bSVaishali Kulkarni 						     QSFP_TX_DISABLE_OFFSET,
148814b24e2bSVaishali Kulkarni 						     1, buf);
148914b24e2bSVaishali Kulkarni 			if (rc != ECORE_SUCCESS)
149014b24e2bSVaishali Kulkarni 				OSAL_SPRINTF(&p_phy_result_buf[length],
149114b24e2bSVaishali Kulkarni 					     "Error setting transceiver tx disable status field.\n");
149214b24e2bSVaishali Kulkarni 		}
149314b24e2bSVaishali Kulkarni 		break;
149414b24e2bSVaishali Kulkarni 	default:
149514b24e2bSVaishali Kulkarni 		OSAL_SPRINTF(p_phy_result_buf,
149614b24e2bSVaishali Kulkarni 			     "Unknown transceiver type inserted.\n");
149714b24e2bSVaishali Kulkarni 		rc = ECORE_UNKNOWN_ERROR;
149814b24e2bSVaishali Kulkarni 		break;
149914b24e2bSVaishali Kulkarni 	}
150014b24e2bSVaishali Kulkarni 
150114b24e2bSVaishali Kulkarni 	return rc;
150214b24e2bSVaishali Kulkarni }
150314b24e2bSVaishali Kulkarni 
150414b24e2bSVaishali Kulkarni /* Get SFP TX fault status */
ecore_phy_sfp_get_txreset(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 port,char * p_phy_result_buf)150514b24e2bSVaishali Kulkarni int ecore_phy_sfp_get_txreset(struct ecore_hwfn *p_hwfn,
150614b24e2bSVaishali Kulkarni 			      struct ecore_ptt *p_ptt,
150714b24e2bSVaishali Kulkarni 			      u32 port, char *p_phy_result_buf)
150814b24e2bSVaishali Kulkarni {
150914b24e2bSVaishali Kulkarni 	enum _ecore_status_t rc;
151014b24e2bSVaishali Kulkarni 	u32 length = 0;
151114b24e2bSVaishali Kulkarni 	u8 buf[4];
151214b24e2bSVaishali Kulkarni 
151314b24e2bSVaishali Kulkarni 	/* Verify <port> field is between 0 and number of ports */
151414b24e2bSVaishali Kulkarni 	rc = ecore_validate_sfp_port(p_hwfn, p_ptt, port, p_phy_result_buf);
151514b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
151614b24e2bSVaishali Kulkarni 		return rc;
151714b24e2bSVaishali Kulkarni 
151814b24e2bSVaishali Kulkarni 	rc = ecore_mcp_phy_sfp_read(p_hwfn, p_ptt, port, I2C_TRANSCEIVER_ADDR,
151914b24e2bSVaishali Kulkarni 				    0, 1, buf);
152014b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
152114b24e2bSVaishali Kulkarni 		return ecore_sfp_set_error(rc, length, p_phy_result_buf,
152214b24e2bSVaishali Kulkarni 					   "Error reading transceiver identification field.\n");
152314b24e2bSVaishali Kulkarni 
152414b24e2bSVaishali Kulkarni 	switch (buf[0]) {
152514b24e2bSVaishali Kulkarni 	case 0x3: /* SFP, SFP+, SFP-28 */
152614b24e2bSVaishali Kulkarni 		rc = ecore_mcp_phy_sfp_read(p_hwfn, p_ptt, port,
152714b24e2bSVaishali Kulkarni 					    I2C_TRANSCEIVER_ADDR,
152814b24e2bSVaishali Kulkarni 					    SFP_TX_FAULT_OFFSET, 1, buf);
152914b24e2bSVaishali Kulkarni 		if (rc != ECORE_SUCCESS)
153014b24e2bSVaishali Kulkarni 			return ecore_sfp_set_error(rc, length, p_phy_result_buf,
153114b24e2bSVaishali Kulkarni 						   "Error reading transceiver tx fault status field.\n");
153214b24e2bSVaishali Kulkarni 		OSAL_SPRINTF(p_phy_result_buf, "%d",
153314b24e2bSVaishali Kulkarni 			     ((buf[0] & 0x02) ? 1 : 0));
153414b24e2bSVaishali Kulkarni 		break;
153514b24e2bSVaishali Kulkarni 	case 0xc: /* QSFP */
153614b24e2bSVaishali Kulkarni 	case 0xd: /* QSFP+ */
153714b24e2bSVaishali Kulkarni 	case 0x11: /* QSFP-28 */
153814b24e2bSVaishali Kulkarni 		rc = ecore_mcp_phy_sfp_read(p_hwfn, p_ptt, port,
153914b24e2bSVaishali Kulkarni 					    I2C_TRANSCEIVER_ADDR,
154014b24e2bSVaishali Kulkarni 					    QSFP_TX_FAULT_OFFSET, 1, buf);
154114b24e2bSVaishali Kulkarni 		if (rc != ECORE_SUCCESS)
154214b24e2bSVaishali Kulkarni 			return ecore_sfp_set_error(rc, length, p_phy_result_buf,
154314b24e2bSVaishali Kulkarni 						   "Error reading transceiver tx fault status field.\n");
154414b24e2bSVaishali Kulkarni 		OSAL_SPRINTF(p_phy_result_buf, "%d",
154514b24e2bSVaishali Kulkarni 			     ((buf[0] & (1 << port)) ? 1 : 0));
154614b24e2bSVaishali Kulkarni 		break;
154714b24e2bSVaishali Kulkarni 	default:
154814b24e2bSVaishali Kulkarni 		OSAL_SPRINTF(p_phy_result_buf,
154914b24e2bSVaishali Kulkarni 			     "Unknown transceiver type inserted.\n");
155014b24e2bSVaishali Kulkarni 		rc = ECORE_UNKNOWN_ERROR;
155114b24e2bSVaishali Kulkarni 		break;
155214b24e2bSVaishali Kulkarni 	}
155314b24e2bSVaishali Kulkarni 
155414b24e2bSVaishali Kulkarni 	return rc;
155514b24e2bSVaishali Kulkarni }
155614b24e2bSVaishali Kulkarni 
155714b24e2bSVaishali Kulkarni /* Get SFP RX los status */
ecore_phy_sfp_get_rxlos(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 port,char * p_phy_result_buf)155814b24e2bSVaishali Kulkarni int ecore_phy_sfp_get_rxlos(struct ecore_hwfn *p_hwfn,
155914b24e2bSVaishali Kulkarni 			    struct ecore_ptt *p_ptt,
156014b24e2bSVaishali Kulkarni 			    u32 port, char *p_phy_result_buf)
156114b24e2bSVaishali Kulkarni {
156214b24e2bSVaishali Kulkarni 	enum _ecore_status_t rc;
156314b24e2bSVaishali Kulkarni 	u32 length = 0;
156414b24e2bSVaishali Kulkarni 	u8 buf[4];
156514b24e2bSVaishali Kulkarni 
156614b24e2bSVaishali Kulkarni 	/* Verify <port> field is between 0 and number of ports */
156714b24e2bSVaishali Kulkarni 	rc = ecore_validate_sfp_port(p_hwfn, p_ptt, port, p_phy_result_buf);
156814b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
156914b24e2bSVaishali Kulkarni 		return rc;
157014b24e2bSVaishali Kulkarni 
157114b24e2bSVaishali Kulkarni 	rc = ecore_mcp_phy_sfp_read(p_hwfn, p_ptt, port, I2C_TRANSCEIVER_ADDR,
157214b24e2bSVaishali Kulkarni 				    0, 1, buf);
157314b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
157414b24e2bSVaishali Kulkarni 		return ecore_sfp_set_error(rc, length, p_phy_result_buf,
157514b24e2bSVaishali Kulkarni 					   "Error reading transceiver identification field.\n");
157614b24e2bSVaishali Kulkarni 
157714b24e2bSVaishali Kulkarni 	switch (buf[0]) {
157814b24e2bSVaishali Kulkarni 	case 0x3: /* SFP, SFP+, SFP-28 */
157914b24e2bSVaishali Kulkarni 		rc = ecore_mcp_phy_sfp_read(p_hwfn, p_ptt, port,
158014b24e2bSVaishali Kulkarni 					    I2C_TRANSCEIVER_ADDR,
158114b24e2bSVaishali Kulkarni 					    SFP_RX_LOS_OFFSET, 1, buf);
158214b24e2bSVaishali Kulkarni 		if (rc != ECORE_SUCCESS)
158314b24e2bSVaishali Kulkarni 			return ecore_sfp_set_error(rc, length, p_phy_result_buf,
158414b24e2bSVaishali Kulkarni 						   "Error reading transceiver rx los status field.\n");
158514b24e2bSVaishali Kulkarni 		OSAL_SPRINTF(p_phy_result_buf, "%d",
158614b24e2bSVaishali Kulkarni 			     ((buf[0] & 0x01) ? 1 : 0));
158714b24e2bSVaishali Kulkarni 		break;
158814b24e2bSVaishali Kulkarni 	case 0xc: /* QSFP */
158914b24e2bSVaishali Kulkarni 	case 0xd: /* QSFP+ */
159014b24e2bSVaishali Kulkarni 	case 0x11: /* QSFP-28 */
159114b24e2bSVaishali Kulkarni 		rc = ecore_mcp_phy_sfp_read(p_hwfn, p_ptt, port,
159214b24e2bSVaishali Kulkarni 					    I2C_TRANSCEIVER_ADDR,
159314b24e2bSVaishali Kulkarni 					    QSFP_RX_LOS_OFFSET, 1, buf);
159414b24e2bSVaishali Kulkarni 		if (rc != ECORE_SUCCESS)
159514b24e2bSVaishali Kulkarni 			return ecore_sfp_set_error(rc, length, p_phy_result_buf,
159614b24e2bSVaishali Kulkarni 						   "Error reading transceiver rx los status field.\n");
159714b24e2bSVaishali Kulkarni 		OSAL_SPRINTF(p_phy_result_buf, "%d",
159814b24e2bSVaishali Kulkarni 			     ((buf[0] & (1 << port)) ? 1 : 0));
159914b24e2bSVaishali Kulkarni 		break;
160014b24e2bSVaishali Kulkarni 	default:
160114b24e2bSVaishali Kulkarni 		OSAL_SPRINTF(p_phy_result_buf,
160214b24e2bSVaishali Kulkarni 			     "Unknown transceiver type inserted.\n");
160314b24e2bSVaishali Kulkarni 		rc = ECORE_UNKNOWN_ERROR;
160414b24e2bSVaishali Kulkarni 		break;
160514b24e2bSVaishali Kulkarni 	}
160614b24e2bSVaishali Kulkarni 
160714b24e2bSVaishali Kulkarni 	return rc;
160814b24e2bSVaishali Kulkarni }
160914b24e2bSVaishali Kulkarni 
161014b24e2bSVaishali Kulkarni /* Get SFP EEPROM memory dump */
ecore_phy_sfp_get_eeprom(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u32 port,char * p_phy_result_buf)161114b24e2bSVaishali Kulkarni int ecore_phy_sfp_get_eeprom(struct ecore_hwfn *p_hwfn,
161214b24e2bSVaishali Kulkarni 			     struct ecore_ptt *p_ptt,
161314b24e2bSVaishali Kulkarni 			     u32 port, char *p_phy_result_buf)
161414b24e2bSVaishali Kulkarni {
161514b24e2bSVaishali Kulkarni 	enum _ecore_status_t rc;
161614b24e2bSVaishali Kulkarni 	u8 buf[4];
161714b24e2bSVaishali Kulkarni 
161814b24e2bSVaishali Kulkarni 	/* Verify <port> field is between 0 and number of ports */
161914b24e2bSVaishali Kulkarni 	rc = ecore_validate_sfp_port(p_hwfn, p_ptt, port, p_phy_result_buf);
162014b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
162114b24e2bSVaishali Kulkarni 		return rc;
162214b24e2bSVaishali Kulkarni 
162314b24e2bSVaishali Kulkarni 	rc = ecore_mcp_phy_sfp_read(p_hwfn, p_ptt, port, I2C_TRANSCEIVER_ADDR,
162414b24e2bSVaishali Kulkarni 				    0, 1, buf);
162514b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
162614b24e2bSVaishali Kulkarni 		return ecore_sfp_set_error(rc, 0, p_phy_result_buf,
162714b24e2bSVaishali Kulkarni 					   "Error reading transceiver identification field.\n");
162814b24e2bSVaishali Kulkarni 
162914b24e2bSVaishali Kulkarni 	switch (buf[0]) {
163014b24e2bSVaishali Kulkarni 	case 0x3: /* SFP, SFP+, SFP-28 */
163114b24e2bSVaishali Kulkarni 	case 0xc: /* QSFP */
163214b24e2bSVaishali Kulkarni 	case 0xd: /* QSFP+ */
163314b24e2bSVaishali Kulkarni 	case 0x11: /* QSFP-28 */
163414b24e2bSVaishali Kulkarni 		rc = ecore_phy_sfp_read(p_hwfn, p_ptt, port,
163514b24e2bSVaishali Kulkarni 					I2C_TRANSCEIVER_ADDR, 0,
163614b24e2bSVaishali Kulkarni 					MAX_I2C_TRANSCEIVER_PAGE_SIZE,
163714b24e2bSVaishali Kulkarni 					p_phy_result_buf);
163814b24e2bSVaishali Kulkarni 		break;
163914b24e2bSVaishali Kulkarni 	default:
164014b24e2bSVaishali Kulkarni 		OSAL_SPRINTF(p_phy_result_buf,
164114b24e2bSVaishali Kulkarni 			     "Unknown transceiver type inserted.\n");
164214b24e2bSVaishali Kulkarni 		rc = ECORE_UNKNOWN_ERROR;
164314b24e2bSVaishali Kulkarni 		break;
164414b24e2bSVaishali Kulkarni 	}
164514b24e2bSVaishali Kulkarni 
164614b24e2bSVaishali Kulkarni 	return rc;
164714b24e2bSVaishali Kulkarni }
164814b24e2bSVaishali Kulkarni 
164914b24e2bSVaishali Kulkarni /* Write to gpio */
ecore_phy_gpio_write(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u16 gpio,u16 gpio_val,char * p_phy_result_buf)165014b24e2bSVaishali Kulkarni int ecore_phy_gpio_write(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt,
165114b24e2bSVaishali Kulkarni 			 u16 gpio, u16 gpio_val, char *p_phy_result_buf)
165214b24e2bSVaishali Kulkarni {
165314b24e2bSVaishali Kulkarni 	enum _ecore_status_t rc;
165414b24e2bSVaishali Kulkarni 
165514b24e2bSVaishali Kulkarni 	rc = ecore_mcp_gpio_write(p_hwfn, p_ptt, gpio, gpio_val);
165614b24e2bSVaishali Kulkarni 
165714b24e2bSVaishali Kulkarni 	if (rc == ECORE_SUCCESS)
165814b24e2bSVaishali Kulkarni 		OSAL_SPRINTF(p_phy_result_buf,
165914b24e2bSVaishali Kulkarni 			     "Written successfully to gpio number %d.\n",
166014b24e2bSVaishali Kulkarni 			     gpio);
166114b24e2bSVaishali Kulkarni 	else
166214b24e2bSVaishali Kulkarni 		OSAL_SPRINTF(p_phy_result_buf,
166314b24e2bSVaishali Kulkarni 			     "Can't write to gpio %d\n", gpio);
166414b24e2bSVaishali Kulkarni 
166514b24e2bSVaishali Kulkarni 	return rc;
166614b24e2bSVaishali Kulkarni }
166714b24e2bSVaishali Kulkarni 
166814b24e2bSVaishali Kulkarni /* Read from gpio */
ecore_phy_gpio_read(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u16 gpio,char * p_phy_result_buf)166914b24e2bSVaishali Kulkarni int ecore_phy_gpio_read(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt,
167014b24e2bSVaishali Kulkarni 			u16 gpio, char *p_phy_result_buf)
167114b24e2bSVaishali Kulkarni {
167214b24e2bSVaishali Kulkarni 	enum _ecore_status_t rc;
167314b24e2bSVaishali Kulkarni 	u32 param;
167414b24e2bSVaishali Kulkarni 
167514b24e2bSVaishali Kulkarni 	rc = ecore_mcp_gpio_read(p_hwfn, p_ptt, gpio, &param);
167614b24e2bSVaishali Kulkarni 
167714b24e2bSVaishali Kulkarni 	if (rc == ECORE_SUCCESS)
167814b24e2bSVaishali Kulkarni 		OSAL_SPRINTF(p_phy_result_buf, "%x", param);
167914b24e2bSVaishali Kulkarni 	else
168014b24e2bSVaishali Kulkarni 		OSAL_SPRINTF(p_phy_result_buf,
168114b24e2bSVaishali Kulkarni 			     "Can't read from gpio %d\n", gpio);
168214b24e2bSVaishali Kulkarni 
168314b24e2bSVaishali Kulkarni 	return rc;
168414b24e2bSVaishali Kulkarni }
168514b24e2bSVaishali Kulkarni 
168614b24e2bSVaishali Kulkarni /* Get information from gpio */
ecore_phy_gpio_info(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u16 gpio,char * p_phy_result_buf)168714b24e2bSVaishali Kulkarni int ecore_phy_gpio_info(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt,
168814b24e2bSVaishali Kulkarni 			u16 gpio, char *p_phy_result_buf)
168914b24e2bSVaishali Kulkarni {
169014b24e2bSVaishali Kulkarni 	u32 direction, ctrl, length = 0;
169114b24e2bSVaishali Kulkarni 	enum _ecore_status_t rc;
169214b24e2bSVaishali Kulkarni 
169314b24e2bSVaishali Kulkarni 	rc = ecore_mcp_gpio_info(p_hwfn, p_ptt, gpio, &direction, &ctrl);
169414b24e2bSVaishali Kulkarni 
169514b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS) {
169614b24e2bSVaishali Kulkarni 		OSAL_SPRINTF(p_phy_result_buf,
169714b24e2bSVaishali Kulkarni 			     "Can't get information for gpio %d\n", gpio);
169814b24e2bSVaishali Kulkarni 		return rc;
169914b24e2bSVaishali Kulkarni 	}
170014b24e2bSVaishali Kulkarni 
170114b24e2bSVaishali Kulkarni 	length = OSAL_SPRINTF(p_phy_result_buf, "Gpio %d is %s - ",
170214b24e2bSVaishali Kulkarni 			      gpio,
170314b24e2bSVaishali Kulkarni 			      ((direction == 0) ? "output" : "input"));
170414b24e2bSVaishali Kulkarni 	switch (ctrl) {
170514b24e2bSVaishali Kulkarni 	case 0:
170614b24e2bSVaishali Kulkarni 		OSAL_SPRINTF(&p_phy_result_buf[length],
170714b24e2bSVaishali Kulkarni 			     "control is uninitialized\n");
170814b24e2bSVaishali Kulkarni 		break;
170914b24e2bSVaishali Kulkarni 	case 1:
171014b24e2bSVaishali Kulkarni 		OSAL_SPRINTF(&p_phy_result_buf[length],
171114b24e2bSVaishali Kulkarni 			     "control is path 0\n");
171214b24e2bSVaishali Kulkarni 		break;
171314b24e2bSVaishali Kulkarni 	case 2:
171414b24e2bSVaishali Kulkarni 		OSAL_SPRINTF(&p_phy_result_buf[length],
171514b24e2bSVaishali Kulkarni 			     "control is path 1\n");
171614b24e2bSVaishali Kulkarni 		break;
171714b24e2bSVaishali Kulkarni 	case 3:
171814b24e2bSVaishali Kulkarni 		OSAL_SPRINTF(&p_phy_result_buf[length],
171914b24e2bSVaishali Kulkarni 			     "control is shared\n");
172014b24e2bSVaishali Kulkarni 		break;
172114b24e2bSVaishali Kulkarni 	default:
172214b24e2bSVaishali Kulkarni 		OSAL_SPRINTF(&p_phy_result_buf[length],
172314b24e2bSVaishali Kulkarni 			     "\nError - control is invalid\n");
172414b24e2bSVaishali Kulkarni 		break;
172514b24e2bSVaishali Kulkarni 	}
172614b24e2bSVaishali Kulkarni 
172714b24e2bSVaishali Kulkarni 	return ECORE_SUCCESS;
172814b24e2bSVaishali Kulkarni }
172914b24e2bSVaishali Kulkarni 
173014b24e2bSVaishali Kulkarni /* Get information from gpio */
ecore_phy_extphy_read(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u16 port,u16 devad,u16 reg,char * p_phy_result_buf)173114b24e2bSVaishali Kulkarni int ecore_phy_extphy_read(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt,
173214b24e2bSVaishali Kulkarni 			  u16 port, u16 devad, u16 reg, char *p_phy_result_buf)
173314b24e2bSVaishali Kulkarni {
173414b24e2bSVaishali Kulkarni 	enum _ecore_status_t rc;
173514b24e2bSVaishali Kulkarni 	u32 resp_cmd;
173614b24e2bSVaishali Kulkarni 	u32 val;
173714b24e2bSVaishali Kulkarni 
173814b24e2bSVaishali Kulkarni 	rc = ecore_mcp_cmd(p_hwfn, p_ptt, DRV_MSG_CODE_EXT_PHY_READ,
173914b24e2bSVaishali Kulkarni 			   ((port << DRV_MB_PARAM_PORT_SHIFT) |
174014b24e2bSVaishali Kulkarni 			    (devad << DRV_MB_PARAM_DEVAD_SHIFT) |
174114b24e2bSVaishali Kulkarni 			    (reg << DRV_MB_PARAM_ADDR_SHIFT)),
174214b24e2bSVaishali Kulkarni 			   &resp_cmd,
174314b24e2bSVaishali Kulkarni 			   &val);
174414b24e2bSVaishali Kulkarni 
174514b24e2bSVaishali Kulkarni 	if ((rc != ECORE_SUCCESS) || (resp_cmd != FW_MSG_CODE_PHY_OK)) {
174614b24e2bSVaishali Kulkarni 		OSAL_SPRINTF(p_phy_result_buf,
174714b24e2bSVaishali Kulkarni 			     "Failed reading external PHY\n");
174814b24e2bSVaishali Kulkarni 		return rc;
174914b24e2bSVaishali Kulkarni 	}
175014b24e2bSVaishali Kulkarni 	OSAL_SPRINTF(p_phy_result_buf, "0x%04x\n", val);
175114b24e2bSVaishali Kulkarni 	return ECORE_SUCCESS;
175214b24e2bSVaishali Kulkarni }
175314b24e2bSVaishali Kulkarni 
175414b24e2bSVaishali Kulkarni /* Get information from gpio */
ecore_phy_extphy_write(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,u16 port,u16 devad,u16 reg,u16 val,char * p_phy_result_buf)175514b24e2bSVaishali Kulkarni int ecore_phy_extphy_write(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt,
175614b24e2bSVaishali Kulkarni 			   u16 port, u16 devad, u16 reg, u16 val,
175714b24e2bSVaishali Kulkarni 			   char *p_phy_result_buf)
175814b24e2bSVaishali Kulkarni {
175914b24e2bSVaishali Kulkarni 	enum _ecore_status_t rc;
176014b24e2bSVaishali Kulkarni 	u32 resp_cmd;
176114b24e2bSVaishali Kulkarni 	u32 fw_param;
176214b24e2bSVaishali Kulkarni 
176314b24e2bSVaishali Kulkarni 	rc = ecore_mcp_nvm_wr_cmd(p_hwfn, p_ptt, DRV_MSG_CODE_EXT_PHY_WRITE,
176414b24e2bSVaishali Kulkarni 				  ((port << DRV_MB_PARAM_PORT_SHIFT) |
176514b24e2bSVaishali Kulkarni 				   (devad << DRV_MB_PARAM_DEVAD_SHIFT) |
176614b24e2bSVaishali Kulkarni 				   (reg << DRV_MB_PARAM_ADDR_SHIFT)),
176714b24e2bSVaishali Kulkarni 				  &resp_cmd,
176814b24e2bSVaishali Kulkarni 				  &fw_param,
176914b24e2bSVaishali Kulkarni 				  sizeof(u32),
177014b24e2bSVaishali Kulkarni 				  (u32 *)&val);
177114b24e2bSVaishali Kulkarni 
177214b24e2bSVaishali Kulkarni 	if ((rc != ECORE_SUCCESS) || (resp_cmd != FW_MSG_CODE_PHY_OK)) {
177314b24e2bSVaishali Kulkarni 		OSAL_SPRINTF(p_phy_result_buf,
177414b24e2bSVaishali Kulkarni 			     "Failed writing external PHY\n");
177514b24e2bSVaishali Kulkarni 		return rc;
177614b24e2bSVaishali Kulkarni 	}
177714b24e2bSVaishali Kulkarni 	OSAL_SPRINTF(p_phy_result_buf, "0\n");
177814b24e2bSVaishali Kulkarni 	return ECORE_SUCCESS;
177914b24e2bSVaishali Kulkarni }
1780