net: eth: fbnic: Consolidate register reads for ids and devs

Consolidate the register reads for boiler plate registers
to reduce LOC and cleanup pcs reads for DEVS1 to
fetch overrides for reserved bits that the hardware does not
return.

Signed-off-by: Mike Marciniszyn (Meta) <mike.marciniszyn@gmail.com>
Link: https://patch.msgid.link/20260430150802.3521-3-mike.marciniszyn@gmail.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
Mike Marciniszyn (Meta) 2026-04-30 11:08:01 -04:00 committed by Paolo Abeni
parent ca283942e5
commit d7dbf00b4a

View File

@ -11,6 +11,26 @@
#define FBNIC_PCS_VENDOR BIT(9)
#define FBNIC_PCS_ZERO_MASK (DW_VENDOR - FBNIC_PCS_VENDOR)
static int
fbnic_mdio_ids(int id, int regnum)
{
/* return correct IDs */
switch (regnum) {
case MDIO_DEVID1:
return id >> 16;
case MDIO_DEVID2:
return id & 0xffff;
case MDIO_DEVS1:
return MDIO_DEVS_SEP_PMA1 | MDIO_DEVS_PMAPMD | MDIO_DEVS_PCS;
case MDIO_DEVS2:
return 0;
case MDIO_STAT2:
return MDIO_STAT2_DEVPRST_VAL;
}
return 0;
}
static int
fbnic_mdio_read_pmd(struct fbnic_dev *fbd, int addr, int regnum)
{
@ -29,18 +49,6 @@ fbnic_mdio_read_pmd(struct fbnic_dev *fbd, int addr, int regnum)
}
switch (regnum) {
case MDIO_DEVID1:
ret = MP_FBNIC_XPCS_PMA_100G_ID >> 16;
break;
case MDIO_DEVID2:
ret = MP_FBNIC_XPCS_PMA_100G_ID & 0xffff;
break;
case MDIO_DEVS1:
ret = MDIO_DEVS_PMAPMD | MDIO_DEVS_PCS;
break;
case MDIO_STAT2:
ret = MDIO_STAT2_DEVPRST_VAL;
break;
case MDIO_PMA_RXDET:
/* If training isn't complete default to 0 */
if (fbd->pmd_state != FBNIC_PMD_SEND_DATA)
@ -51,6 +59,7 @@ fbnic_mdio_read_pmd(struct fbnic_dev *fbd, int addr, int regnum)
(MDIO_PMD_RXDET_1 / FBNIC_AUI_MODE_R2));
break;
default:
ret = fbnic_mdio_ids(MP_FBNIC_XPCS_PMA_100G_ID, regnum);
break;
}
@ -64,7 +73,7 @@ fbnic_mdio_read_pmd(struct fbnic_dev *fbd, int addr, int regnum)
static int
fbnic_mdio_read_pcs(struct fbnic_dev *fbd, int addr, int regnum)
{
int ret, offset = 0;
int ret, offset = 0, overrides = 0;
/* We will need access to both PCS instances to get config info */
if (addr >= 2)
@ -75,18 +84,25 @@ fbnic_mdio_read_pcs(struct fbnic_dev *fbd, int addr, int regnum)
return 0;
/* Intercept and return correct ID for PCS */
if (regnum == MDIO_DEVID1)
return DW_XPCS_ID >> 16;
if (regnum == MDIO_DEVID2)
return DW_XPCS_ID & 0xffff;
if (regnum == MDIO_DEVS1)
return MDIO_DEVS_PMAPMD | MDIO_DEVS_PCS;
switch (regnum) {
case MDIO_DEVID1 ... MDIO_DEVID2:
ret = fbnic_mdio_ids(DW_XPCS_ID, regnum);
break;
case MDIO_DEVS1:
/* DW IP returns MDIO_DEVS_SEP_PMA1, MDIO_DEVS_PMAPMD,
* and MDIO_DEVS_PCS as 0
*/
overrides = fbnic_mdio_ids(DW_XPCS_ID, regnum);
fallthrough;
default:
/* Swap vendor page bit for FBNIC PCS vendor page bit */
if (regnum & DW_VENDOR)
offset ^= DW_VENDOR | FBNIC_PCS_VENDOR;
/* Swap vendor page bit for FBNIC PCS vendor page bit */
if (regnum & DW_VENDOR)
offset ^= DW_VENDOR | FBNIC_PCS_VENDOR;
ret = fbnic_rd32(fbd, FBNIC_PCS_PAGE(addr) + (regnum ^ offset));
ret = fbnic_rd32(fbd, FBNIC_PCS_PAGE(addr) + (regnum ^ offset));
ret |= overrides;
break;
}
dev_dbg(fbd->dev,
"SWMII PCS Rd: Addr: %d RegNum: %d Value: 0x%04x\n",