/* SPDX-License-Identifier: GPL-2.0-or-later */ 
 | 
/* 
 | 
 * drivers/net/ethernet/ibm/emac/phy.h 
 | 
 * 
 | 
 * Driver for PowerPC 4xx on-chip ethernet controller, PHY support 
 | 
 * 
 | 
 * Copyright 2007 Benjamin Herrenschmidt, IBM Corp. 
 | 
 *                <benh@kernel.crashing.org> 
 | 
 * 
 | 
 * Based on the arch/ppc version of the driver: 
 | 
 * 
 | 
 * Benjamin Herrenschmidt <benh@kernel.crashing.org> 
 | 
 * February 2003 
 | 
 * 
 | 
 * Minor additions by Eugene Surovegin <ebs@ebshome.net>, 2004 
 | 
 * 
 | 
 * This file basically duplicates sungem_phy.{c,h} with different PHYs 
 | 
 * supported. I'm looking into merging that in a single mii layer more 
 | 
 * flexible than mii.c 
 | 
 */ 
 | 
  
 | 
#ifndef __IBM_NEWEMAC_PHY_H 
 | 
#define __IBM_NEWEMAC_PHY_H 
 | 
  
 | 
struct mii_phy; 
 | 
  
 | 
/* Operations supported by any kind of PHY */ 
 | 
struct mii_phy_ops { 
 | 
    int (*init) (struct mii_phy * phy); 
 | 
    int (*suspend) (struct mii_phy * phy, int wol_options); 
 | 
    int (*setup_aneg) (struct mii_phy * phy, u32 advertise); 
 | 
    int (*setup_forced) (struct mii_phy * phy, int speed, int fd); 
 | 
    int (*poll_link) (struct mii_phy * phy); 
 | 
    int (*read_link) (struct mii_phy * phy); 
 | 
}; 
 | 
  
 | 
/* Structure used to statically define an mii/gii based PHY */ 
 | 
struct mii_phy_def { 
 | 
    u32 phy_id;        /* Concatenated ID1 << 16 | ID2 */ 
 | 
    u32 phy_id_mask;    /* Significant bits */ 
 | 
    u32 features;        /* Ethtool SUPPORTED_* defines or 
 | 
                   0 for autodetect */ 
 | 
    int magic_aneg;        /* Autoneg does all speed test for us */ 
 | 
    const char *name; 
 | 
    const struct mii_phy_ops *ops; 
 | 
}; 
 | 
  
 | 
/* An instance of a PHY, partially borrowed from mii_if_info */ 
 | 
struct mii_phy { 
 | 
    struct mii_phy_def *def; 
 | 
    u32 advertising;    /* Ethtool ADVERTISED_* defines */ 
 | 
    u32 features;        /* Copied from mii_phy_def.features 
 | 
                   or determined automaticaly */ 
 | 
    int address;        /* PHY address */ 
 | 
    int mode;        /* PHY mode */ 
 | 
    int gpcs_address;    /* GPCS PHY address */ 
 | 
  
 | 
    /* 1: autoneg enabled, 0: disabled */ 
 | 
    int autoneg; 
 | 
  
 | 
    /* forced speed & duplex (no autoneg) 
 | 
     * partner speed & duplex & pause (autoneg) 
 | 
     */ 
 | 
    int speed; 
 | 
    int duplex; 
 | 
    int pause; 
 | 
    int asym_pause; 
 | 
  
 | 
    /* Provided by host chip */ 
 | 
    struct net_device *dev; 
 | 
    int (*mdio_read) (struct net_device * dev, int addr, int reg); 
 | 
    void (*mdio_write) (struct net_device * dev, int addr, int reg, 
 | 
                int val); 
 | 
}; 
 | 
  
 | 
/* Pass in a struct mii_phy with dev, mdio_read and mdio_write 
 | 
 * filled, the remaining fields will be filled on return 
 | 
 */ 
 | 
int emac_mii_phy_probe(struct mii_phy *phy, int address); 
 | 
int emac_mii_reset_phy(struct mii_phy *phy); 
 | 
int emac_mii_reset_gpcs(struct mii_phy *phy); 
 | 
  
 | 
#endif /* __IBM_NEWEMAC_PHY_H */ 
 |