| Andy Fleming | 00db818 | 2005-07-30 19:31:23 -0400 | [diff] [blame] | 1 |  | 
|  | 2 | ------- | 
|  | 3 | PHY Abstraction Layer | 
| Andy Fleming | e8a2b6a | 2006-12-01 12:01:06 -0600 | [diff] [blame] | 4 | (Updated 2006-11-30) | 
| Andy Fleming | 00db818 | 2005-07-30 19:31:23 -0400 | [diff] [blame] | 5 |  | 
|  | 6 | Purpose | 
|  | 7 |  | 
|  | 8 | Most network devices consist of set of registers which provide an interface | 
|  | 9 | to a MAC layer, which communicates with the physical connection through a | 
|  | 10 | PHY.  The PHY concerns itself with negotiating link parameters with the link | 
|  | 11 | partner on the other side of the network connection (typically, an ethernet | 
|  | 12 | cable), and provides a register interface to allow drivers to determine what | 
|  | 13 | settings were chosen, and to configure what settings are allowed. | 
|  | 14 |  | 
|  | 15 | While these devices are distinct from the network devices, and conform to a | 
|  | 16 | standard layout for the registers, it has been common practice to integrate | 
|  | 17 | the PHY management code with the network driver.  This has resulted in large | 
|  | 18 | amounts of redundant code.  Also, on embedded systems with multiple (and | 
|  | 19 | sometimes quite different) ethernet controllers connected to the same | 
|  | 20 | management bus, it is difficult to ensure safe use of the bus. | 
|  | 21 |  | 
|  | 22 | Since the PHYs are devices, and the management busses through which they are | 
|  | 23 | accessed are, in fact, busses, the PHY Abstraction Layer treats them as such. | 
|  | 24 | In doing so, it has these goals: | 
|  | 25 |  | 
|  | 26 | 1) Increase code-reuse | 
|  | 27 | 2) Increase overall code-maintainability | 
|  | 28 | 3) Speed development time for new network drivers, and for new systems | 
|  | 29 |  | 
|  | 30 | Basically, this layer is meant to provide an interface to PHY devices which | 
|  | 31 | allows network driver writers to write as little code as possible, while | 
|  | 32 | still providing a full feature set. | 
|  | 33 |  | 
|  | 34 | The MDIO bus | 
|  | 35 |  | 
|  | 36 | Most network devices are connected to a PHY by means of a management bus. | 
|  | 37 | Different devices use different busses (though some share common interfaces). | 
|  | 38 | In order to take advantage of the PAL, each bus interface needs to be | 
|  | 39 | registered as a distinct device. | 
|  | 40 |  | 
|  | 41 | 1) read and write functions must be implemented.  Their prototypes are: | 
|  | 42 |  | 
|  | 43 | int write(struct mii_bus *bus, int mii_id, int regnum, u16 value); | 
|  | 44 | int read(struct mii_bus *bus, int mii_id, int regnum); | 
|  | 45 |  | 
|  | 46 | mii_id is the address on the bus for the PHY, and regnum is the register | 
|  | 47 | number.  These functions are guaranteed not to be called from interrupt | 
|  | 48 | time, so it is safe for them to block, waiting for an interrupt to signal | 
|  | 49 | the operation is complete | 
|  | 50 |  | 
|  | 51 | 2) A reset function is necessary.  This is used to return the bus to an | 
|  | 52 | initialized state. | 
|  | 53 |  | 
|  | 54 | 3) A probe function is needed.  This function should set up anything the bus | 
|  | 55 | driver needs, setup the mii_bus structure, and register with the PAL using | 
|  | 56 | mdiobus_register.  Similarly, there's a remove function to undo all of | 
|  | 57 | that (use mdiobus_unregister). | 
|  | 58 |  | 
|  | 59 | 4) Like any driver, the device_driver structure must be configured, and init | 
|  | 60 | exit functions are used to register the driver. | 
|  | 61 |  | 
|  | 62 | 5) The bus must also be declared somewhere as a device, and registered. | 
|  | 63 |  | 
|  | 64 | As an example for how one driver implemented an mdio bus driver, see | 
|  | 65 | drivers/net/gianfar_mii.c and arch/ppc/syslib/mpc85xx_devices.c | 
|  | 66 |  | 
|  | 67 | Connecting to a PHY | 
|  | 68 |  | 
|  | 69 | Sometime during startup, the network driver needs to establish a connection | 
|  | 70 | between the PHY device, and the network device.  At this time, the PHY's bus | 
|  | 71 | and drivers need to all have been loaded, so it is ready for the connection. | 
|  | 72 | At this point, there are several ways to connect to the PHY: | 
|  | 73 |  | 
|  | 74 | 1) The PAL handles everything, and only calls the network driver when | 
|  | 75 | the link state changes, so it can react. | 
|  | 76 |  | 
|  | 77 | 2) The PAL handles everything except interrupts (usually because the | 
|  | 78 | controller has the interrupt registers). | 
|  | 79 |  | 
|  | 80 | 3) The PAL handles everything, but checks in with the driver every second, | 
|  | 81 | allowing the network driver to react first to any changes before the PAL | 
|  | 82 | does. | 
|  | 83 |  | 
|  | 84 | 4) The PAL serves only as a library of functions, with the network device | 
|  | 85 | manually calling functions to update status, and configure the PHY | 
|  | 86 |  | 
|  | 87 |  | 
|  | 88 | Letting the PHY Abstraction Layer do Everything | 
|  | 89 |  | 
|  | 90 | If you choose option 1 (The hope is that every driver can, but to still be | 
|  | 91 | useful to drivers that can't), connecting to the PHY is simple: | 
|  | 92 |  | 
|  | 93 | First, you need a function to react to changes in the link state.  This | 
|  | 94 | function follows this protocol: | 
|  | 95 |  | 
|  | 96 | static void adjust_link(struct net_device *dev); | 
|  | 97 |  | 
|  | 98 | Next, you need to know the device name of the PHY connected to this device. | 
|  | 99 | The name will look something like, "phy0:0", where the first number is the | 
| Andy Fleming | e8a2b6a | 2006-12-01 12:01:06 -0600 | [diff] [blame] | 100 | bus id, and the second is the PHY's address on that bus.  Typically, | 
|  | 101 | the bus is responsible for making its ID unique. | 
| Andy Fleming | 00db818 | 2005-07-30 19:31:23 -0400 | [diff] [blame] | 102 |  | 
|  | 103 | Now, to connect, just call this function: | 
|  | 104 |  | 
| Andy Fleming | e8a2b6a | 2006-12-01 12:01:06 -0600 | [diff] [blame] | 105 | phydev = phy_connect(dev, phy_name, &adjust_link, flags, interface); | 
| Andy Fleming | 00db818 | 2005-07-30 19:31:23 -0400 | [diff] [blame] | 106 |  | 
|  | 107 | phydev is a pointer to the phy_device structure which represents the PHY.  If | 
|  | 108 | phy_connect is successful, it will return the pointer.  dev, here, is the | 
|  | 109 | pointer to your net_device.  Once done, this function will have started the | 
|  | 110 | PHY's software state machine, and registered for the PHY's interrupt, if it | 
|  | 111 | has one.  The phydev structure will be populated with information about the | 
|  | 112 | current state, though the PHY will not yet be truly operational at this | 
|  | 113 | point. | 
|  | 114 |  | 
|  | 115 | flags is a u32 which can optionally contain phy-specific flags. | 
|  | 116 | This is useful if the system has put hardware restrictions on | 
|  | 117 | the PHY/controller, of which the PHY needs to be aware. | 
|  | 118 |  | 
| Andy Fleming | e8a2b6a | 2006-12-01 12:01:06 -0600 | [diff] [blame] | 119 | interface is a u32 which specifies the connection type used | 
|  | 120 | between the controller and the PHY.  Examples are GMII, MII, | 
|  | 121 | RGMII, and SGMII.  For a full list, see include/linux/phy.h | 
|  | 122 |  | 
| Andy Fleming | 00db818 | 2005-07-30 19:31:23 -0400 | [diff] [blame] | 123 | Now just make sure that phydev->supported and phydev->advertising have any | 
|  | 124 | values pruned from them which don't make sense for your controller (a 10/100 | 
|  | 125 | controller may be connected to a gigabit capable PHY, so you would need to | 
|  | 126 | mask off SUPPORTED_1000baseT*).  See include/linux/ethtool.h for definitions | 
|  | 127 | for these bitfields. Note that you should not SET any bits, or the PHY may | 
|  | 128 | get put into an unsupported state. | 
|  | 129 |  | 
|  | 130 | Lastly, once the controller is ready to handle network traffic, you call | 
|  | 131 | phy_start(phydev).  This tells the PAL that you are ready, and configures the | 
|  | 132 | PHY to connect to the network.  If you want to handle your own interrupts, | 
|  | 133 | just set phydev->irq to PHY_IGNORE_INTERRUPT before you call phy_start. | 
|  | 134 | Similarly, if you don't want to use interrupts, set phydev->irq to PHY_POLL. | 
|  | 135 |  | 
|  | 136 | When you want to disconnect from the network (even if just briefly), you call | 
|  | 137 | phy_stop(phydev). | 
|  | 138 |  | 
|  | 139 | Keeping Close Tabs on the PAL | 
|  | 140 |  | 
|  | 141 | It is possible that the PAL's built-in state machine needs a little help to | 
|  | 142 | keep your network device and the PHY properly in sync.  If so, you can | 
|  | 143 | register a helper function when connecting to the PHY, which will be called | 
|  | 144 | every second before the state machine reacts to any changes.  To do this, you | 
|  | 145 | need to manually call phy_attach() and phy_prepare_link(), and then call | 
|  | 146 | phy_start_machine() with the second argument set to point to your special | 
|  | 147 | handler. | 
|  | 148 |  | 
|  | 149 | Currently there are no examples of how to use this functionality, and testing | 
|  | 150 | on it has been limited because the author does not have any drivers which use | 
|  | 151 | it (they all use option 1).  So Caveat Emptor. | 
|  | 152 |  | 
|  | 153 | Doing it all yourself | 
|  | 154 |  | 
|  | 155 | There's a remote chance that the PAL's built-in state machine cannot track | 
|  | 156 | the complex interactions between the PHY and your network device.  If this is | 
|  | 157 | so, you can simply call phy_attach(), and not call phy_start_machine or | 
|  | 158 | phy_prepare_link().  This will mean that phydev->state is entirely yours to | 
|  | 159 | handle (phy_start and phy_stop toggle between some of the states, so you | 
|  | 160 | might need to avoid them). | 
|  | 161 |  | 
|  | 162 | An effort has been made to make sure that useful functionality can be | 
|  | 163 | accessed without the state-machine running, and most of these functions are | 
|  | 164 | descended from functions which did not interact with a complex state-machine. | 
|  | 165 | However, again, no effort has been made so far to test running without the | 
|  | 166 | state machine, so tryer beware. | 
|  | 167 |  | 
|  | 168 | Here is a brief rundown of the functions: | 
|  | 169 |  | 
|  | 170 | int phy_read(struct phy_device *phydev, u16 regnum); | 
|  | 171 | int phy_write(struct phy_device *phydev, u16 regnum, u16 val); | 
|  | 172 |  | 
|  | 173 | Simple read/write primitives.  They invoke the bus's read/write function | 
|  | 174 | pointers. | 
|  | 175 |  | 
|  | 176 | void phy_print_status(struct phy_device *phydev); | 
|  | 177 |  | 
|  | 178 | A convenience function to print out the PHY status neatly. | 
|  | 179 |  | 
|  | 180 | int phy_clear_interrupt(struct phy_device *phydev); | 
|  | 181 | int phy_config_interrupt(struct phy_device *phydev, u32 interrupts); | 
|  | 182 |  | 
|  | 183 | Clear the PHY's interrupt, and configure which ones are allowed, | 
|  | 184 | respectively.  Currently only supports all on, or all off. | 
|  | 185 |  | 
|  | 186 | int phy_enable_interrupts(struct phy_device *phydev); | 
|  | 187 | int phy_disable_interrupts(struct phy_device *phydev); | 
|  | 188 |  | 
|  | 189 | Functions which enable/disable PHY interrupts, clearing them | 
|  | 190 | before and after, respectively. | 
|  | 191 |  | 
|  | 192 | int phy_start_interrupts(struct phy_device *phydev); | 
|  | 193 | int phy_stop_interrupts(struct phy_device *phydev); | 
|  | 194 |  | 
|  | 195 | Requests the IRQ for the PHY interrupts, then enables them for | 
|  | 196 | start, or disables then frees them for stop. | 
|  | 197 |  | 
|  | 198 | struct phy_device * phy_attach(struct net_device *dev, const char *phy_id, | 
| Andy Fleming | e8a2b6a | 2006-12-01 12:01:06 -0600 | [diff] [blame] | 199 | u32 flags, phy_interface_t interface); | 
| Andy Fleming | 00db818 | 2005-07-30 19:31:23 -0400 | [diff] [blame] | 200 |  | 
|  | 201 | Attaches a network device to a particular PHY, binding the PHY to a generic | 
|  | 202 | driver if none was found during bus initialization.  Passes in | 
|  | 203 | any phy-specific flags as needed. | 
|  | 204 |  | 
|  | 205 | int phy_start_aneg(struct phy_device *phydev); | 
|  | 206 |  | 
|  | 207 | Using variables inside the phydev structure, either configures advertising | 
|  | 208 | and resets autonegotiation, or disables autonegotiation, and configures | 
|  | 209 | forced settings. | 
|  | 210 |  | 
|  | 211 | static inline int phy_read_status(struct phy_device *phydev); | 
|  | 212 |  | 
|  | 213 | Fills the phydev structure with up-to-date information about the current | 
|  | 214 | settings in the PHY. | 
|  | 215 |  | 
|  | 216 | void phy_sanitize_settings(struct phy_device *phydev) | 
|  | 217 |  | 
|  | 218 | Resolves differences between currently desired settings, and | 
|  | 219 | supported settings for the given PHY device.  Does not make | 
|  | 220 | the changes in the hardware, though. | 
|  | 221 |  | 
|  | 222 | int phy_ethtool_sset(struct phy_device *phydev, struct ethtool_cmd *cmd); | 
|  | 223 | int phy_ethtool_gset(struct phy_device *phydev, struct ethtool_cmd *cmd); | 
|  | 224 |  | 
|  | 225 | Ethtool convenience functions. | 
|  | 226 |  | 
|  | 227 | int phy_mii_ioctl(struct phy_device *phydev, | 
|  | 228 | struct mii_ioctl_data *mii_data, int cmd); | 
|  | 229 |  | 
|  | 230 | The MII ioctl.  Note that this function will completely screw up the state | 
|  | 231 | machine if you write registers like BMCR, BMSR, ADVERTISE, etc.  Best to | 
|  | 232 | use this only to write registers which are not standard, and don't set off | 
|  | 233 | a renegotiation. | 
|  | 234 |  | 
|  | 235 |  | 
|  | 236 | PHY Device Drivers | 
|  | 237 |  | 
|  | 238 | With the PHY Abstraction Layer, adding support for new PHYs is | 
|  | 239 | quite easy.  In some cases, no work is required at all!  However, | 
|  | 240 | many PHYs require a little hand-holding to get up-and-running. | 
|  | 241 |  | 
|  | 242 | Generic PHY driver | 
|  | 243 |  | 
|  | 244 | If the desired PHY doesn't have any errata, quirks, or special | 
|  | 245 | features you want to support, then it may be best to not add | 
|  | 246 | support, and let the PHY Abstraction Layer's Generic PHY Driver | 
|  | 247 | do all of the work. | 
|  | 248 |  | 
|  | 249 | Writing a PHY driver | 
|  | 250 |  | 
|  | 251 | If you do need to write a PHY driver, the first thing to do is | 
|  | 252 | make sure it can be matched with an appropriate PHY device. | 
|  | 253 | This is done during bus initialization by reading the device's | 
|  | 254 | UID (stored in registers 2 and 3), then comparing it to each | 
|  | 255 | driver's phy_id field by ANDing it with each driver's | 
|  | 256 | phy_id_mask field.  Also, it needs a name.  Here's an example: | 
|  | 257 |  | 
|  | 258 | static struct phy_driver dm9161_driver = { | 
|  | 259 | .phy_id         = 0x0181b880, | 
|  | 260 | .name           = "Davicom DM9161E", | 
|  | 261 | .phy_id_mask    = 0x0ffffff0, | 
|  | 262 | ... | 
|  | 263 | } | 
|  | 264 |  | 
|  | 265 | Next, you need to specify what features (speed, duplex, autoneg, | 
|  | 266 | etc) your PHY device and driver support.  Most PHYs support | 
|  | 267 | PHY_BASIC_FEATURES, but you can look in include/mii.h for other | 
|  | 268 | features. | 
|  | 269 |  | 
|  | 270 | Each driver consists of a number of function pointers: | 
|  | 271 |  | 
|  | 272 | config_init: configures PHY into a sane state after a reset. | 
|  | 273 | For instance, a Davicom PHY requires descrambling disabled. | 
|  | 274 | probe: Does any setup needed by the driver | 
|  | 275 | suspend/resume: power management | 
|  | 276 | config_aneg: Changes the speed/duplex/negotiation settings | 
|  | 277 | read_status: Reads the current speed/duplex/negotiation settings | 
|  | 278 | ack_interrupt: Clear a pending interrupt | 
|  | 279 | config_intr: Enable or disable interrupts | 
|  | 280 | remove: Does any driver take-down | 
|  | 281 |  | 
|  | 282 | Of these, only config_aneg and read_status are required to be | 
|  | 283 | assigned by the driver code.  The rest are optional.  Also, it is | 
|  | 284 | preferred to use the generic phy driver's versions of these two | 
|  | 285 | functions if at all possible: genphy_read_status and | 
|  | 286 | genphy_config_aneg.  If this is not possible, it is likely that | 
|  | 287 | you only need to perform some actions before and after invoking | 
|  | 288 | these functions, and so your functions will wrap the generic | 
|  | 289 | ones. | 
|  | 290 |  | 
|  | 291 | Feel free to look at the Marvell, Cicada, and Davicom drivers in | 
|  | 292 | drivers/net/phy/ for examples (the lxt and qsemi drivers have | 
|  | 293 | not been tested as of this writing) |