1 /* 2 * drivers/net/ethernet/ibm/emac/phy.h 3 * 4 * Driver for PowerPC 4xx on-chip ethernet controller, PHY support 5 * 6 * Copyright 2007 Benjamin Herrenschmidt, IBM Corp. 7 * <benh@kernel.crashing.org> 8 * 9 * Based on the arch/ppc version of the driver: 10 * 11 * Benjamin Herrenschmidt <benh@kernel.crashing.org> 12 * February 2003 13 * 14 * Minor additions by Eugene Surovegin <ebs@ebshome.net>, 2004 15 * 16 * This program is free software; you can redistribute it and/or modify it 17 * under the terms of the GNU General Public License as published by the 18 * Free Software Foundation; either version 2 of the License, or (at your 19 * option) any later version. 20 * 21 * This file basically duplicates sungem_phy.{c,h} with different PHYs 22 * supported. I'm looking into merging that in a single mii layer more 23 * flexible than mii.c 24 */ 25 26 #ifndef __IBM_NEWEMAC_PHY_H 27 #define __IBM_NEWEMAC_PHY_H 28 29 struct mii_phy; 30 31 /* Operations supported by any kind of PHY */ 32 struct mii_phy_ops { 33 int (*init) (struct mii_phy * phy); 34 int (*suspend) (struct mii_phy * phy, int wol_options); 35 int (*setup_aneg) (struct mii_phy * phy, u32 advertise); 36 int (*setup_forced) (struct mii_phy * phy, int speed, int fd); 37 int (*poll_link) (struct mii_phy * phy); 38 int (*read_link) (struct mii_phy * phy); 39 }; 40 41 /* Structure used to statically define an mii/gii based PHY */ 42 struct mii_phy_def { 43 u32 phy_id; /* Concatenated ID1 << 16 | ID2 */ 44 u32 phy_id_mask; /* Significant bits */ 45 u32 features; /* Ethtool SUPPORTED_* defines or 46 0 for autodetect */ 47 int magic_aneg; /* Autoneg does all speed test for us */ 48 const char *name; 49 const struct mii_phy_ops *ops; 50 }; 51 52 /* An instance of a PHY, partially borrowed from mii_if_info */ 53 struct mii_phy { 54 struct mii_phy_def *def; 55 u32 advertising; /* Ethtool ADVERTISED_* defines */ 56 u32 features; /* Copied from mii_phy_def.features 57 or determined automaticaly */ 58 int address; /* PHY address */ 59 int mode; /* PHY mode */ 60 int gpcs_address; /* GPCS PHY address */ 61 62 /* 1: autoneg enabled, 0: disabled */ 63 int autoneg; 64 65 /* forced speed & duplex (no autoneg) 66 * partner speed & duplex & pause (autoneg) 67 */ 68 int speed; 69 int duplex; 70 int pause; 71 int asym_pause; 72 73 /* Provided by host chip */ 74 struct net_device *dev; 75 int (*mdio_read) (struct net_device * dev, int addr, int reg); 76 void (*mdio_write) (struct net_device * dev, int addr, int reg, 77 int val); 78 }; 79 80 /* Pass in a struct mii_phy with dev, mdio_read and mdio_write 81 * filled, the remaining fields will be filled on return 82 */ 83 int emac_mii_phy_probe(struct mii_phy *phy, int address); 84 int emac_mii_reset_phy(struct mii_phy *phy); 85 int emac_mii_reset_gpcs(struct mii_phy *phy); 86 87 #endif /* __IBM_NEWEMAC_PHY_H */ 88