Changeset 35559


Ignore:
Timestamp:
2013-02-11T17:11:30+01:00 (5 years ago)
Author:
juhosg
Message:

generic: ar8216: reuse the private data from ar8216_probe

The private data of the switch is already
allocated in ar8216_priv, assign that to
each PHY on the same MDIO bus. Also remove
the redundant code from ar8216_config_init.

Signed-off-by: Gabor Juhos <juhosg@…>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/generic/files/drivers/net/phy/ar8216.c

    r35555 r35559  
    101101        int mib_next_port; 
    102102        u64 *mib_stats; 
     103 
     104        struct list_head list; 
     105        unsigned int use_count; 
    103106 
    104107        /* all fields below are cleared on reset */ 
     
    199202}; 
    200203 
     204static DEFINE_MUTEX(ar8xxx_dev_list_lock); 
     205static LIST_HEAD(ar8xxx_dev_list); 
     206 
    201207static inline struct ar8216_priv * 
    202208swdev_to_ar8216(struct switch_dev *swdev) 
     
    18491855        int ret; 
    18501856 
    1851         if (!priv) { 
    1852                 priv = ar8xxx_create_mii(phydev->bus); 
    1853                 if (priv == NULL) 
    1854                         return -ENOMEM; 
    1855  
    1856                 ret = ar8xxx_probe_switch(priv); 
    1857                 if (ret) 
    1858                         goto err_free_priv; 
    1859         } 
     1857        if (WARN_ON(!priv)) 
     1858                return -ENODEV; 
    18601859 
    18611860        priv->phy = phydev; 
     
    18651864                        /* check if we're attaching to the switch twice */ 
    18661865                        phydev = phydev->bus->phy_map[0]; 
    1867                         if (!phydev) { 
    1868                                 ar8xxx_free(priv); 
     1866                        if (!phydev) 
    18691867                                return 0; 
    1870                         } 
    18711868 
    18721869                        /* switch device has not been initialized, reuse priv */ 
     
    18741871                                priv->port4_phy = true; 
    18751872                                priv->dev.ports = (AR8216_NUM_PORTS - 1); 
    1876                                 phydev->priv = priv; 
    18771873                                return 0; 
    18781874                        } 
    18791875 
    1880                         ar8xxx_free(priv); 
    1881  
    18821876                        /* switch device has been initialized, reinit */ 
    1883                         priv = phydev->priv; 
    18841877                        priv->dev.ports = (AR8216_NUM_PORTS - 1); 
    18851878                        priv->initialized = false; 
     
    18891882                } 
    18901883 
    1891                 ar8xxx_free(priv); 
    18921884                return 0; 
    18931885        } 
    1894  
    1895         phydev->priv = priv; 
    18961886 
    18971887        swdev = &priv->dev; 
    18981888        ret = register_switch(swdev, phydev->attached_dev); 
    18991889        if (ret) 
    1900                 goto err_free_priv; 
     1890                goto err; 
    19011891 
    19021892        pr_info("%s: %s switch driver attached.\n", 
     
    19291919err_unregister_switch: 
    19301920        unregister_switch(&priv->dev); 
    1931 err_free_priv: 
    1932         ar8xxx_free(priv); 
    1933         phydev->priv = NULL; 
     1921err: 
    19341922        return ret; 
    19351923} 
     
    20372025                return -ENODEV; 
    20382026 
     2027        mutex_lock(&ar8xxx_dev_list_lock); 
     2028        list_for_each_entry(priv, &ar8xxx_dev_list, list) 
     2029                if (priv->mii_bus == phydev->bus) 
     2030                        goto found; 
     2031 
    20392032        priv = ar8xxx_create_mii(phydev->bus); 
    2040         if (priv == NULL) 
    2041                 return -ENOMEM; 
    2042  
    2043         priv->phy = phydev; 
     2033        if (priv == NULL) { 
     2034                ret = -ENOMEM; 
     2035                goto unlock; 
     2036        } 
    20442037 
    20452038        ret = ar8xxx_probe_switch(priv); 
    20462039        if (ret) 
    2047                 goto out; 
    2048  
     2040                goto free_priv; 
     2041 
     2042found: 
    20492043        if (phydev->addr == 0) { 
    20502044                if (ar8xxx_has_gige(priv)) { 
     
    20622056        } 
    20632057 
    2064         ret = 0; 
    2065  
    2066 out: 
     2058        phydev->priv = priv; 
     2059        priv->use_count++; 
     2060 
     2061        list_add(&priv->list, &ar8xxx_dev_list); 
     2062 
     2063        mutex_unlock(&ar8xxx_dev_list_lock); 
     2064 
     2065        return 0; 
     2066 
     2067free_priv: 
    20672068        ar8xxx_free(priv); 
     2069unlock: 
     2070        mutex_unlock(&ar8xxx_dev_list_lock); 
    20682071        return ret; 
    20692072} 
     
    20882091        struct ar8216_priv *priv = phydev->priv; 
    20892092 
    2090         if (!priv) 
     2093        if (WARN_ON(!priv)) 
    20912094                return; 
    20922095 
    20932096        phydev->priv = NULL; 
    2094  
    2095         if (phydev->addr == 0) 
    2096                 unregister_switch(&priv->dev); 
    2097  
     2097        if (--priv->use_count > 0) 
     2098                return; 
     2099 
     2100        mutex_lock(&ar8xxx_dev_list_lock); 
     2101        list_del(&priv->list); 
     2102        mutex_unlock(&ar8xxx_dev_list_lock); 
     2103 
     2104        unregister_switch(&priv->dev); 
    20982105        ar8xxx_mib_stop(priv); 
    20992106        ar8xxx_free(priv); 
Note: See TracChangeset for help on using the changeset viewer.