LCOV - code coverage report
Current view: top level - drivers/net/phy - phy_device.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 24 359 6.7 %
Date: 2014-04-07 Functions: 2 37 5.4 %
Branches: 13 213 6.1 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :  * drivers/net/phy/phy_device.c
       3                 :            :  *
       4                 :            :  * Framework for finding and configuring PHYs.
       5                 :            :  * Also contains generic PHY driver
       6                 :            :  *
       7                 :            :  * Author: Andy Fleming
       8                 :            :  *
       9                 :            :  * Copyright (c) 2004 Freescale Semiconductor, Inc.
      10                 :            :  *
      11                 :            :  * This program is free software; you can redistribute  it and/or modify it
      12                 :            :  * under  the terms of  the GNU General  Public License as published by the
      13                 :            :  * Free Software Foundation;  either version 2 of the  License, or (at your
      14                 :            :  * option) any later version.
      15                 :            :  *
      16                 :            :  */
      17                 :            : 
      18                 :            : #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
      19                 :            : 
      20                 :            : #include <linux/kernel.h>
      21                 :            : #include <linux/string.h>
      22                 :            : #include <linux/errno.h>
      23                 :            : #include <linux/unistd.h>
      24                 :            : #include <linux/slab.h>
      25                 :            : #include <linux/interrupt.h>
      26                 :            : #include <linux/init.h>
      27                 :            : #include <linux/delay.h>
      28                 :            : #include <linux/netdevice.h>
      29                 :            : #include <linux/etherdevice.h>
      30                 :            : #include <linux/skbuff.h>
      31                 :            : #include <linux/mm.h>
      32                 :            : #include <linux/module.h>
      33                 :            : #include <linux/mii.h>
      34                 :            : #include <linux/ethtool.h>
      35                 :            : #include <linux/phy.h>
      36                 :            : 
      37                 :            : #include <asm/io.h>
      38                 :            : #include <asm/irq.h>
      39                 :            : #include <asm/uaccess.h>
      40                 :            : 
      41                 :            : MODULE_DESCRIPTION("PHY library");
      42                 :            : MODULE_AUTHOR("Andy Fleming");
      43                 :            : MODULE_LICENSE("GPL");
      44                 :            : 
      45                 :          0 : void phy_device_free(struct phy_device *phydev)
      46                 :            : {
      47                 :          0 :         put_device(&phydev->dev);
      48                 :          0 : }
      49                 :            : EXPORT_SYMBOL(phy_device_free);
      50                 :            : 
      51                 :          0 : static void phy_device_release(struct device *dev)
      52                 :            : {
      53                 :          0 :         kfree(to_phy_device(dev));
      54                 :          0 : }
      55                 :            : 
      56                 :            : static struct phy_driver genphy_driver;
      57                 :            : extern int mdio_bus_init(void);
      58                 :            : extern void mdio_bus_exit(void);
      59                 :            : 
      60                 :            : static LIST_HEAD(phy_fixup_list);
      61                 :            : static DEFINE_MUTEX(phy_fixup_lock);
      62                 :            : 
      63                 :            : static int phy_attach_direct(struct net_device *dev, struct phy_device *phydev,
      64                 :            :                              u32 flags, phy_interface_t interface);
      65                 :            : 
      66                 :            : /*
      67                 :            :  * Creates a new phy_fixup and adds it to the list
      68                 :            :  * @bus_id: A string which matches phydev->dev.bus_id (or PHY_ANY_ID)
      69                 :            :  * @phy_uid: Used to match against phydev->phy_id (the UID of the PHY)
      70                 :            :  *      It can also be PHY_ANY_UID
      71                 :            :  * @phy_uid_mask: Applied to phydev->phy_id and fixup->phy_uid before
      72                 :            :  *      comparison
      73                 :            :  * @run: The actual code to be run when a matching PHY is found
      74                 :            :  */
      75                 :          0 : int phy_register_fixup(const char *bus_id, u32 phy_uid, u32 phy_uid_mask,
      76                 :            :                 int (*run)(struct phy_device *))
      77                 :            : {
      78                 :            :         struct phy_fixup *fixup;
      79                 :            : 
      80                 :            :         fixup = kzalloc(sizeof(struct phy_fixup), GFP_KERNEL);
      81         [ #  # ]:          0 :         if (!fixup)
      82                 :            :                 return -ENOMEM;
      83                 :            : 
      84                 :          0 :         strlcpy(fixup->bus_id, bus_id, sizeof(fixup->bus_id));
      85                 :          0 :         fixup->phy_uid = phy_uid;
      86                 :          0 :         fixup->phy_uid_mask = phy_uid_mask;
      87                 :          0 :         fixup->run = run;
      88                 :            : 
      89                 :          0 :         mutex_lock(&phy_fixup_lock);
      90                 :          0 :         list_add_tail(&fixup->list, &phy_fixup_list);
      91                 :          0 :         mutex_unlock(&phy_fixup_lock);
      92                 :            : 
      93                 :          0 :         return 0;
      94                 :            : }
      95                 :            : EXPORT_SYMBOL(phy_register_fixup);
      96                 :            : 
      97                 :            : /* Registers a fixup to be run on any PHY with the UID in phy_uid */
      98                 :          0 : int phy_register_fixup_for_uid(u32 phy_uid, u32 phy_uid_mask,
      99                 :            :                 int (*run)(struct phy_device *))
     100                 :            : {
     101                 :          0 :         return phy_register_fixup(PHY_ANY_ID, phy_uid, phy_uid_mask, run);
     102                 :            : }
     103                 :            : EXPORT_SYMBOL(phy_register_fixup_for_uid);
     104                 :            : 
     105                 :            : /* Registers a fixup to be run on the PHY with id string bus_id */
     106                 :          0 : int phy_register_fixup_for_id(const char *bus_id,
     107                 :            :                 int (*run)(struct phy_device *))
     108                 :            : {
     109                 :          0 :         return phy_register_fixup(bus_id, PHY_ANY_UID, 0xffffffff, run);
     110                 :            : }
     111                 :            : EXPORT_SYMBOL(phy_register_fixup_for_id);
     112                 :            : 
     113                 :            : /*
     114                 :            :  * Returns 1 if fixup matches phydev in bus_id and phy_uid.
     115                 :            :  * Fixups can be set to match any in one or more fields.
     116                 :            :  */
     117                 :          0 : static int phy_needs_fixup(struct phy_device *phydev, struct phy_fixup *fixup)
     118                 :            : {
     119         [ #  # ]:          0 :         if (strcmp(fixup->bus_id, dev_name(&phydev->dev)) != 0)
     120         [ #  # ]:          0 :                 if (strcmp(fixup->bus_id, PHY_ANY_ID) != 0)
     121                 :            :                         return 0;
     122                 :            : 
     123         [ #  # ]:          0 :         if ((fixup->phy_uid & fixup->phy_uid_mask) !=
     124                 :          0 :                         (phydev->phy_id & fixup->phy_uid_mask))
     125         [ #  # ]:          0 :                 if (fixup->phy_uid != PHY_ANY_UID)
     126                 :            :                         return 0;
     127                 :            : 
     128                 :          0 :         return 1;
     129                 :            : }
     130                 :            : 
     131                 :            : /* Runs any matching fixups for this phydev */
     132                 :          0 : int phy_scan_fixups(struct phy_device *phydev)
     133                 :            : {
     134                 :            :         struct phy_fixup *fixup;
     135                 :            : 
     136                 :          0 :         mutex_lock(&phy_fixup_lock);
     137         [ #  # ]:          0 :         list_for_each_entry(fixup, &phy_fixup_list, list) {
     138         [ #  # ]:          0 :                 if (phy_needs_fixup(phydev, fixup)) {
     139                 :            :                         int err;
     140                 :            : 
     141                 :          0 :                         err = fixup->run(phydev);
     142                 :            : 
     143         [ #  # ]:          0 :                         if (err < 0) {
     144                 :          0 :                                 mutex_unlock(&phy_fixup_lock);
     145                 :          0 :                                 return err;
     146                 :            :                         }
     147                 :            :                 }
     148                 :            :         }
     149                 :          0 :         mutex_unlock(&phy_fixup_lock);
     150                 :            : 
     151                 :          0 :         return 0;
     152                 :            : }
     153                 :            : EXPORT_SYMBOL(phy_scan_fixups);
     154                 :            : 
     155                 :          0 : struct phy_device *phy_device_create(struct mii_bus *bus, int addr, int phy_id,
     156                 :            :                         bool is_c45, struct phy_c45_device_ids *c45_ids)
     157                 :            : {
     158                 :            :         struct phy_device *dev;
     159                 :            : 
     160                 :            :         /* We allocate the device, and initialize the
     161                 :            :          * default values */
     162                 :            :         dev = kzalloc(sizeof(*dev), GFP_KERNEL);
     163                 :            : 
     164         [ #  # ]:          0 :         if (NULL == dev)
     165                 :            :                 return (struct phy_device*) PTR_ERR((void*)-ENOMEM);
     166                 :            : 
     167                 :          0 :         dev->dev.release = phy_device_release;
     168                 :            : 
     169                 :          0 :         dev->speed = 0;
     170                 :          0 :         dev->duplex = -1;
     171                 :          0 :         dev->pause = dev->asym_pause = 0;
     172                 :          0 :         dev->link = 1;
     173                 :          0 :         dev->interface = PHY_INTERFACE_MODE_GMII;
     174                 :            : 
     175                 :          0 :         dev->autoneg = AUTONEG_ENABLE;
     176                 :            : 
     177                 :          0 :         dev->is_c45 = is_c45;
     178                 :          0 :         dev->addr = addr;
     179                 :          0 :         dev->phy_id = phy_id;
     180         [ #  # ]:          0 :         if (c45_ids)
     181                 :          0 :                 dev->c45_ids = *c45_ids;
     182                 :          0 :         dev->bus = bus;
     183                 :          0 :         dev->dev.parent = bus->parent;
     184                 :          0 :         dev->dev.bus = &mdio_bus_type;
     185         [ #  # ]:          0 :         dev->irq = bus->irq != NULL ? bus->irq[addr] : PHY_POLL;
     186                 :          0 :         dev_set_name(&dev->dev, PHY_ID_FMT, bus->id, addr);
     187                 :            : 
     188                 :          0 :         dev->state = PHY_DOWN;
     189                 :            : 
     190                 :          0 :         mutex_init(&dev->lock);
     191                 :          0 :         INIT_DELAYED_WORK(&dev->state_queue, phy_state_machine);
     192                 :          0 :         INIT_WORK(&dev->phy_queue, phy_change);
     193                 :            : 
     194                 :            :         /* Request the appropriate module unconditionally; don't
     195                 :            :            bother trying to do so only if it isn't already loaded,
     196                 :            :            because that gets complicated. A hotplug event would have
     197                 :            :            done an unconditional modprobe anyway.
     198                 :            :            We don't do normal hotplug because it won't work for MDIO
     199                 :            :            -- because it relies on the device staying around for long
     200                 :            :            enough for the driver to get loaded. With MDIO, the NIC
     201                 :            :            driver will get bored and give up as soon as it finds that
     202                 :            :            there's no driver _already_ loaded. */
     203                 :          0 :         request_module(MDIO_MODULE_PREFIX MDIO_ID_FMT, MDIO_ID_ARGS(phy_id));
     204                 :            : 
     205                 :          0 :         device_initialize(&dev->dev);
     206                 :            : 
     207                 :          0 :         return dev;
     208                 :            : }
     209                 :            : EXPORT_SYMBOL(phy_device_create);
     210                 :            : 
     211                 :            : /**
     212                 :            :  * get_phy_c45_ids - reads the specified addr for its 802.3-c45 IDs.
     213                 :            :  * @bus: the target MII bus
     214                 :            :  * @addr: PHY address on the MII bus
     215                 :            :  * @phy_id: where to store the ID retrieved.
     216                 :            :  * @c45_ids: where to store the c45 ID information.
     217                 :            :  *
     218                 :            :  *   If the PHY devices-in-package appears to be valid, it and the
     219                 :            :  *   corresponding identifiers are stored in @c45_ids, zero is stored
     220                 :            :  *   in @phy_id.  Otherwise 0xffffffff is stored in @phy_id.  Returns
     221                 :            :  *   zero on success.
     222                 :            :  *
     223                 :            :  */
     224                 :          0 : static int get_phy_c45_ids(struct mii_bus *bus, int addr, u32 *phy_id,
     225                 :            :                            struct phy_c45_device_ids *c45_ids) {
     226                 :            :         int phy_reg;
     227                 :            :         int i, reg_addr;
     228                 :            :         const int num_ids = ARRAY_SIZE(c45_ids->device_ids);
     229                 :            : 
     230                 :            :         /* Find first non-zero Devices In package.  Device
     231                 :            :          * zero is reserved, so don't probe it.
     232                 :            :          */
     233         [ #  # ]:          0 :         for (i = 1;
     234         [ #  # ]:          0 :              i < num_ids && c45_ids->devices_in_package == 0;
     235                 :          0 :              i++) {
     236                 :          0 :                 reg_addr = MII_ADDR_C45 | i << 16 | 6;
     237                 :          0 :                 phy_reg = mdiobus_read(bus, addr, reg_addr);
     238         [ #  # ]:          0 :                 if (phy_reg < 0)
     239                 :            :                         return -EIO;
     240                 :          0 :                 c45_ids->devices_in_package = (phy_reg & 0xffff) << 16;
     241                 :            : 
     242                 :          0 :                 reg_addr = MII_ADDR_C45 | i << 16 | 5;
     243                 :          0 :                 phy_reg = mdiobus_read(bus, addr, reg_addr);
     244         [ #  # ]:          0 :                 if (phy_reg < 0)
     245                 :            :                         return -EIO;
     246                 :          0 :                 c45_ids->devices_in_package |= (phy_reg & 0xffff);
     247                 :            : 
     248                 :            :                 /* If mostly Fs, there is no device there,
     249                 :            :                  * let's get out of here.
     250                 :            :                  */
     251         [ #  # ]:          0 :                 if ((c45_ids->devices_in_package & 0x1fffffff) == 0x1fffffff) {
     252                 :          0 :                         *phy_id = 0xffffffff;
     253                 :          0 :                         return 0;
     254                 :            :                 }
     255                 :            :         }
     256                 :            : 
     257                 :            :         /* Now probe Device Identifiers for each device present. */
     258         [ #  # ]:          0 :         for (i = 1; i < num_ids; i++) {
     259         [ #  # ]:          0 :                 if (!(c45_ids->devices_in_package & (1 << i)))
     260                 :          0 :                         continue;
     261                 :            : 
     262                 :          0 :                 reg_addr = MII_ADDR_C45 | i << 16 | MII_PHYSID1;
     263                 :          0 :                 phy_reg = mdiobus_read(bus, addr, reg_addr);
     264         [ #  # ]:          0 :                 if (phy_reg < 0)
     265                 :            :                         return -EIO;
     266                 :          0 :                 c45_ids->device_ids[i] = (phy_reg & 0xffff) << 16;
     267                 :            : 
     268                 :          0 :                 reg_addr = MII_ADDR_C45 | i << 16 | MII_PHYSID2;
     269                 :          0 :                 phy_reg = mdiobus_read(bus, addr, reg_addr);
     270         [ #  # ]:          0 :                 if (phy_reg < 0)
     271                 :            :                         return -EIO;
     272                 :          0 :                 c45_ids->device_ids[i] |= (phy_reg & 0xffff);
     273                 :            :         }
     274                 :          0 :         *phy_id = 0;
     275                 :          0 :         return 0;
     276                 :            : }
     277                 :            : 
     278                 :            : /**
     279                 :            :  * get_phy_id - reads the specified addr for its ID.
     280                 :            :  * @bus: the target MII bus
     281                 :            :  * @addr: PHY address on the MII bus
     282                 :            :  * @phy_id: where to store the ID retrieved.
     283                 :            :  * @is_c45: If true the PHY uses the 802.3 clause 45 protocol
     284                 :            :  * @c45_ids: where to store the c45 ID information.
     285                 :            :  *
     286                 :            :  * Description: In the case of a 802.3-c22 PHY, reads the ID registers
     287                 :            :  *   of the PHY at @addr on the @bus, stores it in @phy_id and returns
     288                 :            :  *   zero on success.
     289                 :            :  *
     290                 :            :  *   In the case of a 802.3-c45 PHY, get_phy_c45_ids() is invoked, and
     291                 :            :  *   its return value is in turn returned.
     292                 :            :  *
     293                 :            :  */
     294                 :          0 : static int get_phy_id(struct mii_bus *bus, int addr, u32 *phy_id,
     295                 :            :                       bool is_c45, struct phy_c45_device_ids *c45_ids)
     296                 :            : {
     297                 :            :         int phy_reg;
     298                 :            : 
     299         [ #  # ]:          0 :         if (is_c45)
     300                 :          0 :                 return get_phy_c45_ids(bus, addr, phy_id, c45_ids);
     301                 :            : 
     302                 :            :         /* Grab the bits from PHYIR1, and put them
     303                 :            :          * in the upper half */
     304                 :          0 :         phy_reg = mdiobus_read(bus, addr, MII_PHYSID1);
     305                 :            : 
     306         [ #  # ]:          0 :         if (phy_reg < 0)
     307                 :            :                 return -EIO;
     308                 :            : 
     309                 :          0 :         *phy_id = (phy_reg & 0xffff) << 16;
     310                 :            : 
     311                 :            :         /* Grab the bits from PHYIR2, and put them in the lower half */
     312                 :          0 :         phy_reg = mdiobus_read(bus, addr, MII_PHYSID2);
     313                 :            : 
     314         [ #  # ]:          0 :         if (phy_reg < 0)
     315                 :            :                 return -EIO;
     316                 :            : 
     317                 :          0 :         *phy_id |= (phy_reg & 0xffff);
     318                 :            : 
     319                 :          0 :         return 0;
     320                 :            : }
     321                 :            : 
     322                 :            : /**
     323                 :            :  * get_phy_device - reads the specified PHY device and returns its @phy_device struct
     324                 :            :  * @bus: the target MII bus
     325                 :            :  * @addr: PHY address on the MII bus
     326                 :            :  * @is_c45: If true the PHY uses the 802.3 clause 45 protocol
     327                 :            :  *
     328                 :            :  * Description: Reads the ID registers of the PHY at @addr on the
     329                 :            :  *   @bus, then allocates and returns the phy_device to represent it.
     330                 :            :  */
     331                 :          0 : struct phy_device *get_phy_device(struct mii_bus *bus, int addr, bool is_c45)
     332                 :            : {
     333                 :          0 :         struct phy_c45_device_ids c45_ids = {0};
     334                 :            :         struct phy_device *dev = NULL;
     335                 :          0 :         u32 phy_id = 0;
     336                 :            :         int r;
     337                 :            : 
     338                 :          0 :         r = get_phy_id(bus, addr, &phy_id, is_c45, &c45_ids);
     339         [ #  # ]:          0 :         if (r)
     340                 :          0 :                 return ERR_PTR(r);
     341                 :            : 
     342                 :            :         /* If the phy_id is mostly Fs, there is no device there */
     343         [ #  # ]:          0 :         if ((phy_id & 0x1fffffff) == 0x1fffffff)
     344                 :            :                 return NULL;
     345                 :            : 
     346                 :          0 :         dev = phy_device_create(bus, addr, phy_id, is_c45, &c45_ids);
     347                 :            : 
     348                 :          0 :         return dev;
     349                 :            : }
     350                 :            : EXPORT_SYMBOL(get_phy_device);
     351                 :            : 
     352                 :            : /**
     353                 :            :  * phy_device_register - Register the phy device on the MDIO bus
     354                 :            :  * @phydev: phy_device structure to be added to the MDIO bus
     355                 :            :  */
     356                 :          0 : int phy_device_register(struct phy_device *phydev)
     357                 :            : {
     358                 :            :         int err;
     359                 :            : 
     360                 :            :         /* Don't register a phy if one is already registered at this
     361                 :            :          * address */
     362         [ #  # ]:          0 :         if (phydev->bus->phy_map[phydev->addr])
     363                 :            :                 return -EINVAL;
     364                 :          0 :         phydev->bus->phy_map[phydev->addr] = phydev;
     365                 :            : 
     366                 :            :         /* Run all of the fixups for this PHY */
     367                 :          0 :         phy_scan_fixups(phydev);
     368                 :            : 
     369                 :          0 :         err = device_add(&phydev->dev);
     370         [ #  # ]:          0 :         if (err) {
     371                 :          0 :                 pr_err("PHY %d failed to add\n", phydev->addr);
     372                 :            :                 goto out;
     373                 :            :         }
     374                 :            : 
     375                 :            :         return 0;
     376                 :            : 
     377                 :            :  out:
     378                 :          0 :         phydev->bus->phy_map[phydev->addr] = NULL;
     379                 :          0 :         return err;
     380                 :            : }
     381                 :            : EXPORT_SYMBOL(phy_device_register);
     382                 :            : 
     383                 :            : /**
     384                 :            :  * phy_find_first - finds the first PHY device on the bus
     385                 :            :  * @bus: the target MII bus
     386                 :            :  */
     387                 :          0 : struct phy_device *phy_find_first(struct mii_bus *bus)
     388                 :            : {
     389                 :            :         int addr;
     390                 :            : 
     391         [ #  # ]:          0 :         for (addr = 0; addr < PHY_MAX_ADDR; addr++) {
     392         [ #  # ]:          0 :                 if (bus->phy_map[addr])
     393                 :            :                         return bus->phy_map[addr];
     394                 :            :         }
     395                 :            :         return NULL;
     396                 :            : }
     397                 :            : EXPORT_SYMBOL(phy_find_first);
     398                 :            : 
     399                 :            : /**
     400                 :            :  * phy_prepare_link - prepares the PHY layer to monitor link status
     401                 :            :  * @phydev: target phy_device struct
     402                 :            :  * @handler: callback function for link status change notifications
     403                 :            :  *
     404                 :            :  * Description: Tells the PHY infrastructure to handle the
     405                 :            :  *   gory details on monitoring link status (whether through
     406                 :            :  *   polling or an interrupt), and to call back to the
     407                 :            :  *   connected device driver when the link status changes.
     408                 :            :  *   If you want to monitor your own link state, don't call
     409                 :            :  *   this function.
     410                 :            :  */
     411                 :            : static void phy_prepare_link(struct phy_device *phydev,
     412                 :            :                 void (*handler)(struct net_device *))
     413                 :            : {
     414                 :          0 :         phydev->adjust_link = handler;
     415                 :            : }
     416                 :            : 
     417                 :            : /**
     418                 :            :  * phy_connect_direct - connect an ethernet device to a specific phy_device
     419                 :            :  * @dev: the network device to connect
     420                 :            :  * @phydev: the pointer to the phy device
     421                 :            :  * @handler: callback function for state change notifications
     422                 :            :  * @interface: PHY device's interface
     423                 :            :  */
     424                 :          0 : int phy_connect_direct(struct net_device *dev, struct phy_device *phydev,
     425                 :            :                        void (*handler)(struct net_device *),
     426                 :            :                        phy_interface_t interface)
     427                 :            : {
     428                 :            :         int rc;
     429                 :            : 
     430                 :          0 :         rc = phy_attach_direct(dev, phydev, phydev->dev_flags, interface);
     431         [ #  # ]:          0 :         if (rc)
     432                 :            :                 return rc;
     433                 :            : 
     434                 :            :         phy_prepare_link(phydev, handler);
     435                 :          0 :         phy_start_machine(phydev, NULL);
     436         [ #  # ]:          0 :         if (phydev->irq > 0)
     437                 :          0 :                 phy_start_interrupts(phydev);
     438                 :            : 
     439                 :            :         return 0;
     440                 :            : }
     441                 :            : EXPORT_SYMBOL(phy_connect_direct);
     442                 :            : 
     443                 :            : /**
     444                 :            :  * phy_connect - connect an ethernet device to a PHY device
     445                 :            :  * @dev: the network device to connect
     446                 :            :  * @bus_id: the id string of the PHY device to connect
     447                 :            :  * @handler: callback function for state change notifications
     448                 :            :  * @interface: PHY device's interface
     449                 :            :  *
     450                 :            :  * Description: Convenience function for connecting ethernet
     451                 :            :  *   devices to PHY devices.  The default behavior is for
     452                 :            :  *   the PHY infrastructure to handle everything, and only notify
     453                 :            :  *   the connected driver when the link status changes.  If you
     454                 :            :  *   don't want, or can't use the provided functionality, you may
     455                 :            :  *   choose to call only the subset of functions which provide
     456                 :            :  *   the desired functionality.
     457                 :            :  */
     458                 :          0 : struct phy_device * phy_connect(struct net_device *dev, const char *bus_id,
     459                 :            :                 void (*handler)(struct net_device *),
     460                 :            :                 phy_interface_t interface)
     461                 :            : {
     462                 :            :         struct phy_device *phydev;
     463                 :            :         struct device *d;
     464                 :            :         int rc;
     465                 :            : 
     466                 :            :         /* Search the list of PHY devices on the mdio bus for the
     467                 :            :          * PHY with the requested name */
     468                 :          0 :         d = bus_find_device_by_name(&mdio_bus_type, NULL, bus_id);
     469         [ #  # ]:          0 :         if (!d) {
     470                 :          0 :                 pr_err("PHY %s not found\n", bus_id);
     471                 :          0 :                 return ERR_PTR(-ENODEV);
     472                 :            :         }
     473                 :          0 :         phydev = to_phy_device(d);
     474                 :            : 
     475                 :          0 :         rc = phy_connect_direct(dev, phydev, handler, interface);
     476         [ #  # ]:          0 :         if (rc)
     477                 :          0 :                 return ERR_PTR(rc);
     478                 :            : 
     479                 :            :         return phydev;
     480                 :            : }
     481                 :            : EXPORT_SYMBOL(phy_connect);
     482                 :            : 
     483                 :            : /**
     484                 :            :  * phy_disconnect - disable interrupts, stop state machine, and detach a PHY device
     485                 :            :  * @phydev: target phy_device struct
     486                 :            :  */
     487                 :          0 : void phy_disconnect(struct phy_device *phydev)
     488                 :            : {
     489         [ #  # ]:          0 :         if (phydev->irq > 0)
     490                 :          0 :                 phy_stop_interrupts(phydev);
     491                 :            : 
     492                 :          0 :         phy_stop_machine(phydev);
     493                 :            :         
     494                 :          0 :         phydev->adjust_link = NULL;
     495                 :            : 
     496                 :            :         phy_detach(phydev);
     497                 :          0 : }
     498                 :            : EXPORT_SYMBOL(phy_disconnect);
     499                 :            : 
     500                 :          0 : int phy_init_hw(struct phy_device *phydev)
     501                 :            : {
     502                 :            :         int ret;
     503                 :            : 
     504 [ #  # ][ #  # ]:          0 :         if (!phydev->drv || !phydev->drv->config_init)
     505                 :            :                 return 0;
     506                 :            : 
     507                 :          0 :         ret = phy_scan_fixups(phydev);
     508         [ #  # ]:          0 :         if (ret < 0)
     509                 :            :                 return ret;
     510                 :            : 
     511                 :          0 :         return phydev->drv->config_init(phydev);
     512                 :            : }
     513                 :            : 
     514                 :            : /**
     515                 :            :  * phy_attach_direct - attach a network device to a given PHY device pointer
     516                 :            :  * @dev: network device to attach
     517                 :            :  * @phydev: Pointer to phy_device to attach
     518                 :            :  * @flags: PHY device's dev_flags
     519                 :            :  * @interface: PHY device's interface
     520                 :            :  *
     521                 :            :  * Description: Called by drivers to attach to a particular PHY
     522                 :            :  *     device. The phy_device is found, and properly hooked up
     523                 :            :  *     to the phy_driver.  If no driver is attached, then the
     524                 :            :  *     genphy_driver is used.  The phy_device is given a ptr to
     525                 :            :  *     the attaching device, and given a callback for link status
     526                 :            :  *     change.  The phy_device is returned to the attaching driver.
     527                 :            :  */
     528                 :          0 : static int phy_attach_direct(struct net_device *dev, struct phy_device *phydev,
     529                 :            :                              u32 flags, phy_interface_t interface)
     530                 :            : {
     531                 :          0 :         struct device *d = &phydev->dev;
     532                 :            :         int err;
     533                 :            : 
     534                 :            :         /* Assume that if there is no driver, that it doesn't
     535                 :            :          * exist, and we should use the genphy driver. */
     536         [ #  # ]:          0 :         if (NULL == d->driver) {
     537         [ #  # ]:          0 :                 if (phydev->is_c45) {
     538                 :          0 :                         pr_err("No driver for phy %x\n", phydev->phy_id);
     539                 :          0 :                         return -ENODEV;
     540                 :            :                 }
     541                 :            : 
     542                 :          0 :                 d->driver = &genphy_driver.driver;
     543                 :            : 
     544                 :          0 :                 err = d->driver->probe(d);
     545         [ #  # ]:          0 :                 if (err >= 0)
     546                 :          0 :                         err = device_bind_driver(d);
     547                 :            : 
     548         [ #  # ]:          0 :                 if (err)
     549                 :            :                         return err;
     550                 :            :         }
     551                 :            : 
     552         [ #  # ]:          0 :         if (phydev->attached_dev) {
     553                 :          0 :                 dev_err(&dev->dev, "PHY already attached\n");
     554                 :          0 :                 return -EBUSY;
     555                 :            :         }
     556                 :            : 
     557                 :          0 :         phydev->attached_dev = dev;
     558                 :          0 :         dev->phydev = phydev;
     559                 :            : 
     560                 :          0 :         phydev->dev_flags = flags;
     561                 :            : 
     562                 :          0 :         phydev->interface = interface;
     563                 :            : 
     564                 :          0 :         phydev->state = PHY_READY;
     565                 :            : 
     566                 :            :         /* Do initial configuration here, now that
     567                 :            :          * we have certain key parameters
     568                 :            :          * (dev_flags and interface) */
     569                 :          0 :         err = phy_init_hw(phydev);
     570         [ #  # ]:          0 :         if (err)
     571                 :            :                 phy_detach(phydev);
     572                 :            : 
     573                 :          0 :         return err;
     574                 :            : }
     575                 :            : 
     576                 :            : /**
     577                 :            :  * phy_attach - attach a network device to a particular PHY device
     578                 :            :  * @dev: network device to attach
     579                 :            :  * @bus_id: Bus ID of PHY device to attach
     580                 :            :  * @interface: PHY device's interface
     581                 :            :  *
     582                 :            :  * Description: Same as phy_attach_direct() except that a PHY bus_id
     583                 :            :  *     string is passed instead of a pointer to a struct phy_device.
     584                 :            :  */
     585                 :          0 : struct phy_device *phy_attach(struct net_device *dev,
     586                 :            :                 const char *bus_id, phy_interface_t interface)
     587                 :            : {
     588                 :            :         struct bus_type *bus = &mdio_bus_type;
     589                 :            :         struct phy_device *phydev;
     590                 :            :         struct device *d;
     591                 :            :         int rc;
     592                 :            : 
     593                 :            :         /* Search the list of PHY devices on the mdio bus for the
     594                 :            :          * PHY with the requested name */
     595                 :          0 :         d = bus_find_device_by_name(bus, NULL, bus_id);
     596         [ #  # ]:          0 :         if (!d) {
     597                 :          0 :                 pr_err("PHY %s not found\n", bus_id);
     598                 :          0 :                 return ERR_PTR(-ENODEV);
     599                 :            :         }
     600                 :          0 :         phydev = to_phy_device(d);
     601                 :            : 
     602                 :          0 :         rc = phy_attach_direct(dev, phydev, phydev->dev_flags, interface);
     603         [ #  # ]:          0 :         if (rc)
     604                 :          0 :                 return ERR_PTR(rc);
     605                 :            : 
     606                 :            :         return phydev;
     607                 :            : }
     608                 :            : EXPORT_SYMBOL(phy_attach);
     609                 :            : 
     610                 :            : /**
     611                 :            :  * phy_detach - detach a PHY device from its network device
     612                 :            :  * @phydev: target phy_device struct
     613                 :            :  */
     614                 :          0 : void phy_detach(struct phy_device *phydev)
     615                 :            : {
     616                 :          0 :         phydev->attached_dev->phydev = NULL;
     617                 :          0 :         phydev->attached_dev = NULL;
     618                 :            : 
     619                 :            :         /* If the device had no specific driver before (i.e. - it
     620                 :            :          * was using the generic driver), we unbind the device
     621                 :            :          * from the generic driver so that there's a chance a
     622                 :            :          * real driver could be loaded */
     623         [ #  # ]:          0 :         if (phydev->dev.driver == &genphy_driver.driver)
           [ #  #  #  # ]
     624                 :          0 :                 device_release_driver(&phydev->dev);
     625                 :          0 : }
     626                 :            : EXPORT_SYMBOL(phy_detach);
     627                 :            : 
     628                 :            : 
     629                 :            : /* Generic PHY support and helper functions */
     630                 :            : 
     631                 :            : /**
     632                 :            :  * genphy_config_advert - sanitize and advertise auto-negotiation parameters
     633                 :            :  * @phydev: target phy_device struct
     634                 :            :  *
     635                 :            :  * Description: Writes MII_ADVERTISE with the appropriate values,
     636                 :            :  *   after sanitizing the values to make sure we only advertise
     637                 :            :  *   what is supported.  Returns < 0 on error, 0 if the PHY's advertisement
     638                 :            :  *   hasn't changed, and > 0 if it has changed.
     639                 :            :  */
     640                 :          0 : static int genphy_config_advert(struct phy_device *phydev)
     641                 :            : {
     642                 :            :         u32 advertise;
     643                 :            :         int oldadv, adv;
     644                 :            :         int err, changed = 0;
     645                 :            : 
     646                 :            :         /* Only allow advertising what
     647                 :            :          * this PHY supports */
     648                 :          0 :         phydev->advertising &= phydev->supported;
     649                 :            :         advertise = phydev->advertising;
     650                 :            : 
     651                 :            :         /* Setup standard advertisement */
     652                 :            :         oldadv = adv = phy_read(phydev, MII_ADVERTISE);
     653                 :            : 
     654         [ #  # ]:          0 :         if (adv < 0)
     655                 :            :                 return adv;
     656                 :            : 
     657                 :          0 :         adv &= ~(ADVERTISE_ALL | ADVERTISE_100BASE4 | ADVERTISE_PAUSE_CAP |
     658                 :            :                  ADVERTISE_PAUSE_ASYM);
     659                 :          0 :         adv |= ethtool_adv_to_mii_adv_t(advertise);
     660                 :            : 
     661         [ #  # ]:          0 :         if (adv != oldadv) {
     662                 :          0 :                 err = phy_write(phydev, MII_ADVERTISE, adv);
     663                 :            : 
     664         [ #  # ]:          0 :                 if (err < 0)
     665                 :            :                         return err;
     666                 :            :                 changed = 1;
     667                 :            :         }
     668                 :            : 
     669                 :            :         /* Configure gigabit if it's supported */
     670         [ #  # ]:          0 :         if (phydev->supported & (SUPPORTED_1000baseT_Half |
     671                 :            :                                 SUPPORTED_1000baseT_Full)) {
     672                 :            :                 oldadv = adv = phy_read(phydev, MII_CTRL1000);
     673                 :            : 
     674         [ #  # ]:          0 :                 if (adv < 0)
     675                 :            :                         return adv;
     676                 :            : 
     677                 :          0 :                 adv &= ~(ADVERTISE_1000FULL | ADVERTISE_1000HALF);
     678                 :          0 :                 adv |= ethtool_adv_to_mii_ctrl1000_t(advertise);
     679                 :            : 
     680         [ #  # ]:          0 :                 if (adv != oldadv) {
     681                 :          0 :                         err = phy_write(phydev, MII_CTRL1000, adv);
     682                 :            : 
     683         [ #  # ]:          0 :                         if (err < 0)
     684                 :            :                                 return err;
     685                 :            :                         changed = 1;
     686                 :            :                 }
     687                 :            :         }
     688                 :            : 
     689                 :          0 :         return changed;
     690                 :            : }
     691                 :            : 
     692                 :            : /**
     693                 :            :  * genphy_setup_forced - configures/forces speed/duplex from @phydev
     694                 :            :  * @phydev: target phy_device struct
     695                 :            :  *
     696                 :            :  * Description: Configures MII_BMCR to force speed/duplex
     697                 :            :  *   to the values in phydev. Assumes that the values are valid.
     698                 :            :  *   Please see phy_sanitize_settings().
     699                 :            :  */
     700                 :          0 : int genphy_setup_forced(struct phy_device *phydev)
     701                 :            : {
     702                 :            :         int err;
     703                 :            :         int ctl = 0;
     704                 :            : 
     705                 :          0 :         phydev->pause = phydev->asym_pause = 0;
     706                 :            : 
     707         [ #  # ]:          0 :         if (SPEED_1000 == phydev->speed)
     708                 :            :                 ctl |= BMCR_SPEED1000;
     709         [ #  # ]:          0 :         else if (SPEED_100 == phydev->speed)
     710                 :            :                 ctl |= BMCR_SPEED100;
     711                 :            : 
     712         [ #  # ]:          0 :         if (DUPLEX_FULL == phydev->duplex)
     713                 :          0 :                 ctl |= BMCR_FULLDPLX;
     714                 :            :         
     715                 :          0 :         err = phy_write(phydev, MII_BMCR, ctl);
     716                 :            : 
     717                 :          0 :         return err;
     718                 :            : }
     719                 :            : EXPORT_SYMBOL(genphy_setup_forced);
     720                 :            : 
     721                 :            : /**
     722                 :            :  * genphy_restart_aneg - Enable and Restart Autonegotiation
     723                 :            :  * @phydev: target phy_device struct
     724                 :            :  */
     725                 :          0 : int genphy_restart_aneg(struct phy_device *phydev)
     726                 :            : {
     727                 :            :         int ctl;
     728                 :            : 
     729                 :            :         ctl = phy_read(phydev, MII_BMCR);
     730                 :            : 
     731         [ #  # ]:          0 :         if (ctl < 0)
     732                 :            :                 return ctl;
     733                 :            : 
     734                 :            :         ctl |= (BMCR_ANENABLE | BMCR_ANRESTART);
     735                 :            : 
     736                 :            :         /* Don't isolate the PHY if we're negotiating */
     737                 :          0 :         ctl &= ~(BMCR_ISOLATE);
     738                 :            : 
     739                 :          0 :         ctl = phy_write(phydev, MII_BMCR, ctl);
     740                 :            : 
     741                 :          0 :         return ctl;
     742                 :            : }
     743                 :            : EXPORT_SYMBOL(genphy_restart_aneg);
     744                 :            : 
     745                 :            : 
     746                 :            : /**
     747                 :            :  * genphy_config_aneg - restart auto-negotiation or write BMCR
     748                 :            :  * @phydev: target phy_device struct
     749                 :            :  *
     750                 :            :  * Description: If auto-negotiation is enabled, we configure the
     751                 :            :  *   advertising, and then restart auto-negotiation.  If it is not
     752                 :            :  *   enabled, then we write the BMCR.
     753                 :            :  */
     754                 :          0 : int genphy_config_aneg(struct phy_device *phydev)
     755                 :            : {
     756                 :            :         int result;
     757                 :            : 
     758         [ #  # ]:          0 :         if (AUTONEG_ENABLE != phydev->autoneg)
     759                 :          0 :                 return genphy_setup_forced(phydev);
     760                 :            : 
     761                 :          0 :         result = genphy_config_advert(phydev);
     762                 :            : 
     763         [ #  # ]:          0 :         if (result < 0) /* error */
     764                 :            :                 return result;
     765                 :            : 
     766         [ #  # ]:          0 :         if (result == 0) {
     767                 :            :                 /* Advertisement hasn't changed, but maybe aneg was never on to
     768                 :            :                  * begin with?  Or maybe phy was isolated? */
     769                 :            :                 int ctl = phy_read(phydev, MII_BMCR);
     770                 :            : 
     771         [ #  # ]:          0 :                 if (ctl < 0)
     772                 :            :                         return ctl;
     773                 :            : 
     774         [ #  # ]:          0 :                 if (!(ctl & BMCR_ANENABLE) || (ctl & BMCR_ISOLATE))
     775                 :            :                         result = 1; /* do restart aneg */
     776                 :            :         }
     777                 :            : 
     778                 :            :         /* Only restart aneg if we are advertising something different
     779                 :            :          * than we were before.  */
     780         [ #  # ]:          0 :         if (result > 0)
     781                 :          0 :                 result = genphy_restart_aneg(phydev);
     782                 :            : 
     783                 :          0 :         return result;
     784                 :            : }
     785                 :            : EXPORT_SYMBOL(genphy_config_aneg);
     786                 :            : 
     787                 :            : /**
     788                 :            :  * genphy_update_link - update link status in @phydev
     789                 :            :  * @phydev: target phy_device struct
     790                 :            :  *
     791                 :            :  * Description: Update the value in phydev->link to reflect the
     792                 :            :  *   current link value.  In order to do this, we need to read
     793                 :            :  *   the status register twice, keeping the second value.
     794                 :            :  */
     795                 :          0 : int genphy_update_link(struct phy_device *phydev)
     796                 :            : {
     797                 :            :         int status;
     798                 :            : 
     799                 :            :         /* Do a fake read */
     800                 :            :         status = phy_read(phydev, MII_BMSR);
     801                 :            : 
     802         [ +  - ]:      76068 :         if (status < 0)
     803                 :            :                 return status;
     804                 :            : 
     805                 :            :         /* Read link and autonegotiation status */
     806                 :            :         status = phy_read(phydev, MII_BMSR);
     807                 :            : 
     808            [ + ]:      76068 :         if (status < 0)
     809                 :            :                 return status;
     810                 :            : 
     811         [ -  + ]:     152136 :         if ((status & BMSR_LSTATUS) == 0)
     812                 :          0 :                 phydev->link = 0;
     813                 :            :         else
     814                 :      76068 :                 phydev->link = 1;
     815                 :            : 
     816                 :            :         return 0;
     817                 :            : }
     818                 :            : EXPORT_SYMBOL(genphy_update_link);
     819                 :            : 
     820                 :            : /**
     821                 :            :  * genphy_read_status - check the link status and update current link state
     822                 :            :  * @phydev: target phy_device struct
     823                 :            :  *
     824                 :            :  * Description: Check the link, then figure out the current state
     825                 :            :  *   by comparing what we advertise with what the link partner
     826                 :            :  *   advertises.  Start by checking the gigabit possibilities,
     827                 :            :  *   then move on to 10/100.
     828                 :            :  */
     829                 :          0 : int genphy_read_status(struct phy_device *phydev)
     830                 :            : {
     831                 :            :         int adv;
     832                 :            :         int err;
     833                 :            :         int lpa;
     834                 :            :         int lpagb = 0;
     835                 :            : 
     836                 :            :         /* Update the link, but return if there
     837                 :            :          * was an error */
     838                 :      76068 :         err = genphy_update_link(phydev);
     839         [ +  - ]:      76068 :         if (err)
     840                 :            :                 return err;
     841                 :            : 
     842         [ +  - ]:      76068 :         if (AUTONEG_ENABLE == phydev->autoneg) {
     843         [ -  + ]:      76068 :                 if (phydev->supported & (SUPPORTED_1000baseT_Half
     844                 :            :                                         | SUPPORTED_1000baseT_Full)) {
     845                 :            :                         lpagb = phy_read(phydev, MII_STAT1000);
     846                 :            : 
     847         [ #  # ]:          0 :                         if (lpagb < 0)
     848                 :            :                                 return lpagb;
     849                 :            : 
     850                 :            :                         adv = phy_read(phydev, MII_CTRL1000);
     851                 :            : 
     852         [ #  # ]:          0 :                         if (adv < 0)
     853                 :            :                                 return adv;
     854                 :            : 
     855                 :          0 :                         lpagb &= adv << 2;
     856                 :            :                 }
     857                 :            : 
     858                 :            :                 lpa = phy_read(phydev, MII_LPA);
     859                 :            : 
     860         [ +  - ]:      76068 :                 if (lpa < 0)
     861                 :            :                         return lpa;
     862                 :            : 
     863                 :            :                 adv = phy_read(phydev, MII_ADVERTISE);
     864                 :            : 
     865         [ +  - ]:      76068 :                 if (adv < 0)
     866                 :            :                         return adv;
     867                 :            : 
     868                 :      76068 :                 lpa &= adv;
     869                 :            : 
     870                 :      76068 :                 phydev->speed = SPEED_10;
     871                 :      76068 :                 phydev->duplex = DUPLEX_HALF;
     872                 :      76068 :                 phydev->pause = phydev->asym_pause = 0;
     873                 :            : 
     874         [ -  + ]:      76068 :                 if (lpagb & (LPA_1000FULL | LPA_1000HALF)) {
     875                 :          0 :                         phydev->speed = SPEED_1000;
     876                 :            : 
     877         [ #  # ]:          0 :                         if (lpagb & LPA_1000FULL)
     878                 :          0 :                                 phydev->duplex = DUPLEX_FULL;
     879         [ +  - ]:      76068 :                 } else if (lpa & (LPA_100FULL | LPA_100HALF)) {
     880                 :      76068 :                         phydev->speed = SPEED_100;
     881                 :            :                         
     882         [ +  - ]:      76068 :                         if (lpa & LPA_100FULL)
     883                 :      76068 :                                 phydev->duplex = DUPLEX_FULL;
     884                 :            :                 } else
     885         [ #  # ]:          0 :                         if (lpa & LPA_10FULL)
     886                 :          0 :                                 phydev->duplex = DUPLEX_FULL;
     887                 :            : 
     888         [ +  - ]:      76068 :                 if (phydev->duplex == DUPLEX_FULL){
     889                 :      76068 :                         phydev->pause = lpa & LPA_PAUSE_CAP ? 1 : 0;
     890                 :      76068 :                         phydev->asym_pause = lpa & LPA_PAUSE_ASYM ? 1 : 0;
     891                 :            :                 }
     892                 :            :         } else {
     893                 :            :                 int bmcr = phy_read(phydev, MII_BMCR);
     894         [ #  # ]:          0 :                 if (bmcr < 0)
     895                 :            :                         return bmcr;
     896                 :            : 
     897         [ +  - ]:      76068 :                 if (bmcr & BMCR_FULLDPLX)
     898                 :      76068 :                         phydev->duplex = DUPLEX_FULL;
     899                 :            :                 else
     900                 :          0 :                         phydev->duplex = DUPLEX_HALF;
     901                 :            : 
     902         [ #  # ]:          0 :                 if (bmcr & BMCR_SPEED1000)
     903                 :          0 :                         phydev->speed = SPEED_1000;
     904         [ #  # ]:          0 :                 else if (bmcr & BMCR_SPEED100)
     905                 :          0 :                         phydev->speed = SPEED_100;
     906                 :            :                 else
     907                 :          0 :                         phydev->speed = SPEED_10;
     908                 :            : 
     909                 :          0 :                 phydev->pause = phydev->asym_pause = 0;
     910                 :            :         }
     911                 :            : 
     912                 :            :         return 0;
     913                 :            : }
     914                 :            : EXPORT_SYMBOL(genphy_read_status);
     915                 :            : 
     916                 :          0 : static int genphy_config_init(struct phy_device *phydev)
     917                 :            : {
     918                 :            :         int val;
     919                 :            :         u32 features;
     920                 :            : 
     921                 :            :         /* For now, I'll claim that the generic driver supports
     922                 :            :          * all possible port types */
     923                 :            :         features = (SUPPORTED_TP | SUPPORTED_MII
     924                 :            :                         | SUPPORTED_AUI | SUPPORTED_FIBRE |
     925                 :            :                         SUPPORTED_BNC);
     926                 :            : 
     927                 :            :         /* Do we support autonegotiation? */
     928                 :            :         val = phy_read(phydev, MII_BMSR);
     929                 :            : 
     930         [ #  # ]:          0 :         if (val < 0)
     931                 :            :                 return val;
     932                 :            : 
     933         [ #  # ]:          0 :         if (val & BMSR_ANEGCAPABLE)
     934                 :            :                 features |= SUPPORTED_Autoneg;
     935                 :            : 
     936         [ #  # ]:          0 :         if (val & BMSR_100FULL)
     937                 :          0 :                 features |= SUPPORTED_100baseT_Full;
     938         [ #  # ]:          0 :         if (val & BMSR_100HALF)
     939                 :          0 :                 features |= SUPPORTED_100baseT_Half;
     940         [ #  # ]:          0 :         if (val & BMSR_10FULL)
     941                 :          0 :                 features |= SUPPORTED_10baseT_Full;
     942         [ #  # ]:          0 :         if (val & BMSR_10HALF)
     943                 :          0 :                 features |= SUPPORTED_10baseT_Half;
     944                 :            : 
     945         [ #  # ]:          0 :         if (val & BMSR_ESTATEN) {
     946                 :            :                 val = phy_read(phydev, MII_ESTATUS);
     947                 :            : 
     948         [ #  # ]:          0 :                 if (val < 0)
     949                 :            :                         return val;
     950                 :            : 
     951         [ #  # ]:          0 :                 if (val & ESTATUS_1000_TFULL)
     952                 :          0 :                         features |= SUPPORTED_1000baseT_Full;
     953         [ #  # ]:          0 :                 if (val & ESTATUS_1000_THALF)
     954                 :          0 :                         features |= SUPPORTED_1000baseT_Half;
     955                 :            :         }
     956                 :            : 
     957                 :          0 :         phydev->supported = features;
     958                 :          0 :         phydev->advertising = features;
     959                 :            : 
     960                 :          0 :         return 0;
     961                 :            : }
     962                 :          0 : int genphy_suspend(struct phy_device *phydev)
     963                 :            : {
     964                 :            :         int value;
     965                 :            : 
     966                 :          0 :         mutex_lock(&phydev->lock);
     967                 :            : 
     968                 :            :         value = phy_read(phydev, MII_BMCR);
     969                 :          0 :         phy_write(phydev, MII_BMCR, (value | BMCR_PDOWN));
     970                 :            : 
     971                 :          0 :         mutex_unlock(&phydev->lock);
     972                 :            : 
     973                 :          0 :         return 0;
     974                 :            : }
     975                 :            : EXPORT_SYMBOL(genphy_suspend);
     976                 :            : 
     977                 :          0 : int genphy_resume(struct phy_device *phydev)
     978                 :            : {
     979                 :            :         int value;
     980                 :            : 
     981                 :          0 :         mutex_lock(&phydev->lock);
     982                 :            : 
     983                 :            :         value = phy_read(phydev, MII_BMCR);
     984                 :          0 :         phy_write(phydev, MII_BMCR, (value & ~BMCR_PDOWN));
     985                 :            : 
     986                 :          0 :         mutex_unlock(&phydev->lock);
     987                 :            : 
     988                 :          0 :         return 0;
     989                 :            : }
     990                 :            : EXPORT_SYMBOL(genphy_resume);
     991                 :            : 
     992                 :            : /**
     993                 :            :  * phy_probe - probe and init a PHY device
     994                 :            :  * @dev: device to probe and init
     995                 :            :  *
     996                 :            :  * Description: Take care of setting up the phy_device structure,
     997                 :            :  *   set the state to READY (the driver's init function should
     998                 :            :  *   set it to STARTING if needed).
     999                 :            :  */
    1000                 :          0 : static int phy_probe(struct device *dev)
    1001                 :            : {
    1002                 :          0 :         struct phy_device *phydev;
    1003                 :            :         struct phy_driver *phydrv;
    1004                 :            :         struct device_driver *drv;
    1005                 :            :         int err = 0;
    1006                 :            : 
    1007                 :          0 :         phydev = to_phy_device(dev);
    1008                 :            : 
    1009                 :          0 :         drv = phydev->dev.driver;
    1010                 :          0 :         phydrv = to_phy_driver(drv);
    1011                 :          0 :         phydev->drv = phydrv;
    1012                 :            : 
    1013                 :            :         /* Disable the interrupt if the PHY doesn't support it
    1014                 :            :          * but the interrupt is still a valid one
    1015                 :            :          */
    1016 [ #  # ][ #  # ]:          0 :         if (!(phydrv->flags & PHY_HAS_INTERRUPT) &&
    1017                 :            :                         phy_interrupt_is_valid(phydev))
    1018                 :          0 :                 phydev->irq = PHY_POLL;
    1019                 :            : 
    1020         [ #  # ]:          0 :         if (phydrv->flags & PHY_IS_INTERNAL)
    1021                 :          0 :                 phydev->is_internal = true;
    1022                 :            : 
    1023                 :          0 :         mutex_lock(&phydev->lock);
    1024                 :            : 
    1025                 :            :         /* Start out supporting everything. Eventually,
    1026                 :            :          * a controller will attach, and may modify one
    1027                 :            :          * or both of these values */
    1028                 :          0 :         phydev->supported = phydrv->features;
    1029                 :          0 :         phydev->advertising = phydrv->features;
    1030                 :            : 
    1031                 :            :         /* Set the state to READY by default */
    1032                 :          0 :         phydev->state = PHY_READY;
    1033                 :            : 
    1034         [ #  # ]:          0 :         if (phydev->drv->probe)
    1035                 :          0 :                 err = phydev->drv->probe(phydev);
    1036                 :            : 
    1037                 :          0 :         mutex_unlock(&phydev->lock);
    1038                 :            : 
    1039                 :          0 :         return err;
    1040                 :            : 
    1041                 :            : }
    1042                 :            : 
    1043                 :          0 : static int phy_remove(struct device *dev)
    1044                 :            : {
    1045                 :            :         struct phy_device *phydev;
    1046                 :            : 
    1047                 :          0 :         phydev = to_phy_device(dev);
    1048                 :            : 
    1049                 :          0 :         mutex_lock(&phydev->lock);
    1050                 :          0 :         phydev->state = PHY_DOWN;
    1051                 :          0 :         mutex_unlock(&phydev->lock);
    1052                 :            : 
    1053         [ #  # ]:          0 :         if (phydev->drv->remove)
    1054                 :          0 :                 phydev->drv->remove(phydev);
    1055                 :          0 :         phydev->drv = NULL;
    1056                 :            : 
    1057                 :          0 :         return 0;
    1058                 :            : }
    1059                 :            : 
    1060                 :            : /**
    1061                 :            :  * phy_driver_register - register a phy_driver with the PHY layer
    1062                 :            :  * @new_driver: new phy_driver to register
    1063                 :            :  */
    1064                 :          0 : int phy_driver_register(struct phy_driver *new_driver)
    1065                 :            : {
    1066                 :            :         int retval;
    1067                 :            : 
    1068                 :          0 :         new_driver->driver.name = new_driver->name;
    1069                 :          0 :         new_driver->driver.bus = &mdio_bus_type;
    1070                 :          0 :         new_driver->driver.probe = phy_probe;
    1071                 :          0 :         new_driver->driver.remove = phy_remove;
    1072                 :            : 
    1073                 :          0 :         retval = driver_register(&new_driver->driver);
    1074                 :            : 
    1075         [ #  # ]:          0 :         if (retval) {
    1076                 :          0 :                 pr_err("%s: Error %d in registering driver\n",
    1077                 :            :                        new_driver->name, retval);
    1078                 :            : 
    1079                 :          0 :                 return retval;
    1080                 :            :         }
    1081                 :            : 
    1082                 :            :         pr_debug("%s: Registered new driver\n", new_driver->name);
    1083                 :            : 
    1084                 :            :         return 0;
    1085                 :            : }
    1086                 :            : EXPORT_SYMBOL(phy_driver_register);
    1087                 :            : 
    1088                 :          0 : int phy_drivers_register(struct phy_driver *new_driver, int n)
    1089                 :            : {
    1090                 :            :         int i, ret = 0;
    1091                 :            : 
    1092         [ #  # ]:          0 :         for (i = 0; i < n; i++) {
    1093                 :          0 :                 ret = phy_driver_register(new_driver + i);
    1094         [ #  # ]:          0 :                 if (ret) {
    1095         [ #  # ]:          0 :                         while (i-- > 0)
    1096                 :          0 :                                 phy_driver_unregister(new_driver + i);
    1097                 :            :                         break;
    1098                 :            :                 }
    1099                 :            :         }
    1100                 :          0 :         return ret;
    1101                 :            : }
    1102                 :            : EXPORT_SYMBOL(phy_drivers_register);
    1103                 :            : 
    1104                 :          0 : void phy_driver_unregister(struct phy_driver *drv)
    1105                 :            : {
    1106                 :          0 :         driver_unregister(&drv->driver);
    1107                 :          0 : }
    1108                 :            : EXPORT_SYMBOL(phy_driver_unregister);
    1109                 :            : 
    1110                 :          0 : void phy_drivers_unregister(struct phy_driver *drv, int n)
    1111                 :            : {
    1112                 :            :         int i;
    1113         [ #  # ]:          0 :         for (i = 0; i < n; i++) {
    1114                 :          0 :                 phy_driver_unregister(drv + i);
    1115                 :            :         }
    1116                 :          0 : }
    1117                 :            : EXPORT_SYMBOL(phy_drivers_unregister);
    1118                 :            : 
    1119                 :            : static struct phy_driver genphy_driver = {
    1120                 :            :         .phy_id         = 0xffffffff,
    1121                 :            :         .phy_id_mask    = 0xffffffff,
    1122                 :            :         .name           = "Generic PHY",
    1123                 :            :         .config_init    = genphy_config_init,
    1124                 :            :         .features       = 0,
    1125                 :            :         .config_aneg    = genphy_config_aneg,
    1126                 :            :         .read_status    = genphy_read_status,
    1127                 :            :         .suspend        = genphy_suspend,
    1128                 :            :         .resume         = genphy_resume,
    1129                 :            :         .driver         = {.owner= THIS_MODULE, },
    1130                 :            : };
    1131                 :            : 
    1132                 :          0 : static int __init phy_init(void)
    1133                 :            : {
    1134                 :            :         int rc;
    1135                 :            : 
    1136                 :          0 :         rc = mdio_bus_init();
    1137         [ #  # ]:          0 :         if (rc)
    1138                 :            :                 return rc;
    1139                 :            : 
    1140                 :          0 :         rc = phy_driver_register(&genphy_driver);
    1141         [ #  # ]:          0 :         if (rc)
    1142                 :          0 :                 mdio_bus_exit();
    1143                 :            : 
    1144                 :          0 :         return rc;
    1145                 :            : }
    1146                 :            : 
    1147                 :          0 : static void __exit phy_exit(void)
    1148                 :            : {
    1149                 :            :         phy_driver_unregister(&genphy_driver);
    1150                 :          0 :         mdio_bus_exit();
    1151                 :          0 : }
    1152                 :            : 
    1153                 :            : subsys_initcall(phy_init);
    1154                 :            : module_exit(phy_exit);

Generated by: LCOV version 1.9