Changeset 9298


Ignore:
Timestamp:
2007-10-14T02:07:43+02:00 (10 years ago)
Author:
blogic
Message:

converted atheros ethernet driver to phy layer

Location:
trunk/target/linux/atheros
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/atheros/config-2.6.23

    r9273 r9298  
    1111CONFIG_BASE_SMALL=0 
    1212CONFIG_BITREVERSE=y 
     13# CONFIG_BROADCOM_PHY is not set 
    1314# CONFIG_BT is not set 
    1415CONFIG_CMDLINE="console=ttyS0,9600 rootfstype=squashfs,jffs2 init=/etc/preinit" 
     
    4647CONFIG_DMA_NEED_PCI_MAP_STATE=y 
    4748CONFIG_DMA_NONCOHERENT=y 
     49# CONFIG_FIXED_PHY is not set 
    4850CONFIG_FS_POSIX_ACL=y 
    4951CONFIG_GENERIC_FIND_NEXT_BIT=y 
     
    5254CONFIG_HAS_IOMEM=y 
    5355CONFIG_HAS_IOPORT=y 
    54 CONFIG_HAVE_STD_PC_SERIAL_PORT=y 
    5556# CONFIG_HOSTAP is not set 
    5657CONFIG_HW_RANDOM=y 
    5758# CONFIG_I2C is not set 
     59CONFIG_ICPLUS_PHY=y 
    5860# CONFIG_IDE is not set 
    5961# CONFIG_IEEE80211 is not set 
     
    128130# CONFIG_MTD_SLRAM is not set 
    129131CONFIG_MTD_SPIFLASH=y 
     132CONFIG_NETDEV_1000=y 
     133CONFIG_NET_ACT_POLICE=y 
     134CONFIG_NET_SCH_FIFO=y 
     135CONFIG_NF_CT_PROTO_GRE=m 
     136CONFIG_NF_NAT_PROTO_GRE=m 
    130137# CONFIG_NO_IOPORT is not set 
    131138# CONFIG_PAGE_SIZE_16KB is not set 
     
    133140# CONFIG_PAGE_SIZE_64KB is not set 
    134141# CONFIG_PAGE_SIZE_8KB is not set 
     142CONFIG_PHYLIB=y 
    135143# CONFIG_PMC_MSP is not set 
    136144# CONFIG_PMC_YOSEMITE is not set 
    137145# CONFIG_PNX8550_JBS is not set 
    138146# CONFIG_PNX8550_STB810 is not set 
     147# CONFIG_QSEMI_PHY is not set 
    139148# CONFIG_RTC is not set 
    140149CONFIG_RWSEM_GENERIC_SPINLOCK=y 
     
    156165# CONFIG_SIBYTE_SENTOSA is not set 
    157166# CONFIG_SIBYTE_SWARM is not set 
     167# CONFIG_SMSC_PHY is not set 
    158168# CONFIG_SOFT_WATCHDOG is not set 
    159169# CONFIG_SPARSEMEM_STATIC is not set 
  • trunk/target/linux/atheros/files/drivers/net/ar2313/ar2313.c

    r7747 r9298  
    3737#include <linux/compile.h> 
    3838#include <linux/mii.h> 
     39#include <linux/phy.h> 
    3940#include <linux/ethtool.h> 
    4041#include <linux/ctype.h> 
     
    145146 
    146147// prototypes 
    147 static short armiiread(struct net_device *dev, short phy, short reg); 
    148 static void armiiwrite(struct net_device *dev, short phy, short reg, 
    149                                            short data); 
    150148#ifdef TX_TIMEOUT 
    151149static void ar2313_tx_timeout(struct net_device *dev); 
     
    153151static void ar2313_halt(struct net_device *dev); 
    154152static void rx_tasklet_func(unsigned long data); 
     153static void rx_tasklet_cleanup(struct net_device *dev); 
    155154static void ar2313_multicast_list(struct net_device *dev); 
     155 
     156static int mdiobus_read(struct mii_bus *bus, int phy_addr, int regnum); 
     157static int mdiobus_write(struct mii_bus *bus, int phy_addr, int regnum, u16 value); 
     158static int mdiobus_reset(struct mii_bus *bus); 
     159static int mdiobus_probe (struct net_device *dev); 
     160static void ar2313_adjust_link(struct net_device *dev); 
    156161 
    157162#ifndef ERR 
     
    278283                   dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5], dev->irq); 
    279284 
    280         /* start link poll timer */ 
    281         ar2313_setup_timer(dev); 
    282  
     285        sp->mii_bus.priv = dev; 
     286        sp->mii_bus.read = mdiobus_read; 
     287        sp->mii_bus.write = mdiobus_write; 
     288        sp->mii_bus.reset = mdiobus_reset; 
     289        sp->mii_bus.name = "ar2313_eth_mii"; 
     290        sp->mii_bus.id = 0; 
     291        sp->mii_bus.irq = kmalloc(sizeof(int), GFP_KERNEL); 
     292        *sp->mii_bus.irq = PHY_POLL; 
     293         
     294        mdiobus_register(&sp->mii_bus); 
     295 
     296        if (mdiobus_probe(dev) != 0) { 
     297                printk(KERN_ERR "ar2313: mdiobus_probe failed"); 
     298                rx_tasklet_cleanup(dev); 
     299                ar2313_init_cleanup(dev); 
     300                unregister_netdev(dev); 
     301                kfree(dev); 
     302        } else { 
     303                /* start link poll timer */ 
     304                ar2313_setup_timer(dev); 
     305        } 
     306         
    283307        return 0; 
    284308} 
     
    592616        u16 phyData; 
    593617 
    594         phyData = armiiread(dev, sp->phy, MII_BMSR); 
     618        phyData = mdiobus_read(&sp->mii_bus, sp->phy, MII_BMSR); 
    595619        if (sp->phyData != phyData) { 
    596620                if (phyData & BMSR_LSTATUS) { 
     
    601625 
    602626                        sp->link = 1; 
    603                         reg = armiiread(dev, sp->phy, MII_BMCR); 
     627                        reg = mdiobus_read(&sp->mii_bus, sp->phy, MII_BMCR); 
    604628                        if (reg & BMCR_ANENABLE) { 
    605629                                /* auto neg enabled */ 
    606                                 reg = armiiread(dev, sp->phy, MII_LPA); 
     630                                reg = mdiobus_read(&sp->mii_bus, sp->phy, MII_LPA); 
    607631                                duplex = (reg & (LPA_100FULL | LPA_10FULL)) ? 1 : 0; 
    608632                        } else { 
     
    12181242} 
    12191243 
    1220 static int netdev_get_ecmd(struct net_device *dev, 
    1221                                                    struct ethtool_cmd *ecmd) 
    1222 { 
    1223         struct ar2313_private *np = dev->priv; 
    1224         u32 tmp; 
    1225  
    1226         ecmd->supported = 
    1227                 (SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full | 
    1228                  SUPPORTED_100baseT_Half | SUPPORTED_100baseT_Full | 
    1229                  SUPPORTED_Autoneg | SUPPORTED_TP | SUPPORTED_MII); 
    1230  
    1231         ecmd->port = PORT_TP; 
    1232         /* only supports internal transceiver */ 
    1233         ecmd->transceiver = XCVR_INTERNAL; 
    1234         /* not sure what this is for */ 
    1235         ecmd->phy_address = 1; 
    1236  
    1237         ecmd->advertising = ADVERTISED_MII; 
    1238         tmp = armiiread(dev, np->phy, MII_ADVERTISE); 
    1239         if (tmp & ADVERTISE_10HALF) 
    1240                 ecmd->advertising |= ADVERTISED_10baseT_Half; 
    1241         if (tmp & ADVERTISE_10FULL) 
    1242                 ecmd->advertising |= ADVERTISED_10baseT_Full; 
    1243         if (tmp & ADVERTISE_100HALF) 
    1244                 ecmd->advertising |= ADVERTISED_100baseT_Half; 
    1245         if (tmp & ADVERTISE_100FULL) 
    1246                 ecmd->advertising |= ADVERTISED_100baseT_Full; 
    1247  
    1248         tmp = armiiread(dev, np->phy, MII_BMCR); 
    1249         if (tmp & BMCR_ANENABLE) { 
    1250                 ecmd->advertising |= ADVERTISED_Autoneg; 
    1251                 ecmd->autoneg = AUTONEG_ENABLE; 
    1252         } else { 
    1253                 ecmd->autoneg = AUTONEG_DISABLE; 
    1254         } 
    1255  
    1256         if (ecmd->autoneg == AUTONEG_ENABLE) { 
    1257                 tmp = armiiread(dev, np->phy, MII_LPA); 
    1258                 if (tmp & (LPA_100FULL | LPA_10FULL)) { 
    1259                         ecmd->duplex = DUPLEX_FULL; 
    1260                 } else { 
    1261                         ecmd->duplex = DUPLEX_HALF; 
    1262                 } 
    1263                 if (tmp & (LPA_100FULL | LPA_100HALF)) { 
    1264                         ecmd->speed = SPEED_100; 
    1265                 } else { 
    1266                         ecmd->speed = SPEED_10; 
    1267                 } 
    1268         } else { 
    1269                 if (tmp & BMCR_FULLDPLX) { 
    1270                         ecmd->duplex = DUPLEX_FULL; 
    1271                 } else { 
    1272                         ecmd->duplex = DUPLEX_HALF; 
    1273                 } 
    1274                 if (tmp & BMCR_SPEED100) { 
    1275                         ecmd->speed = SPEED_100; 
    1276                 } else { 
    1277                         ecmd->speed = SPEED_10; 
    1278                 } 
    1279         } 
    1280  
    1281         /* ignore maxtxpkt, maxrxpkt for now */ 
    1282  
    1283         return 0; 
    1284 } 
    1285  
    1286 static int netdev_set_ecmd(struct net_device *dev, 
    1287                                                    struct ethtool_cmd *ecmd) 
    1288 { 
    1289         struct ar2313_private *np = dev->priv; 
    1290         u32 tmp; 
    1291  
    1292         if (ecmd->speed != SPEED_10 && ecmd->speed != SPEED_100) 
    1293                 return -EINVAL; 
    1294         if (ecmd->duplex != DUPLEX_HALF && ecmd->duplex != DUPLEX_FULL) 
    1295                 return -EINVAL; 
    1296         if (ecmd->port != PORT_TP) 
    1297                 return -EINVAL; 
    1298         if (ecmd->transceiver != XCVR_INTERNAL) 
    1299                 return -EINVAL; 
    1300         if (ecmd->autoneg != AUTONEG_DISABLE 
    1301                 && ecmd->autoneg != AUTONEG_ENABLE) 
    1302                 return -EINVAL; 
    1303         /* ignore phy_address, maxtxpkt, maxrxpkt for now */ 
    1304  
    1305         /* WHEW! now lets bang some bits */ 
    1306  
    1307         tmp = armiiread(dev, np->phy, MII_BMCR); 
    1308         if (ecmd->autoneg == AUTONEG_ENABLE) { 
    1309                 /* turn on autonegotiation */ 
    1310                 tmp |= BMCR_ANENABLE; 
    1311                 printk("%s: Enabling auto-neg\n", dev->name); 
    1312         } else { 
    1313                 /* turn off auto negotiation, set speed and duplexity */ 
    1314                 tmp &= ~(BMCR_ANENABLE | BMCR_SPEED100 | BMCR_FULLDPLX); 
    1315                 if (ecmd->speed == SPEED_100) 
    1316                         tmp |= BMCR_SPEED100; 
    1317                 if (ecmd->duplex == DUPLEX_FULL) 
    1318                         tmp |= BMCR_FULLDPLX; 
    1319                 printk("%s: Hard coding %d/%s\n", dev->name, 
    1320                            (ecmd->speed == SPEED_100) ? 100 : 10, 
    1321                            (ecmd->duplex == DUPLEX_FULL) ? "full" : "half"); 
    1322         } 
    1323         armiiwrite(dev, np->phy, MII_BMCR, tmp); 
    1324         np->phyData = 0; 
    1325         return 0; 
    1326 } 
    1327  
    1328 static int netdev_ethtool_ioctl(struct net_device *dev, void *useraddr) 
    1329 { 
    1330         struct ar2313_private *np = dev->priv; 
    1331         u32 cmd; 
    1332  
    1333         if (get_user(cmd, (u32 *) useraddr)) 
    1334                 return -EFAULT; 
    1335  
     1244static int ar2313_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) 
     1245{ 
     1246        struct mii_ioctl_data *data = (struct mii_ioctl_data *) &ifr->ifr_data; 
     1247        struct ar2313_private *sp = dev->priv; 
     1248        int ret; 
     1249         
    13361250        switch (cmd) { 
    1337                 /* get settings */ 
    1338         case ETHTOOL_GSET:{ 
    1339                         struct ethtool_cmd ecmd = { ETHTOOL_GSET }; 
    1340                         spin_lock_irq(&np->lock); 
    1341                         netdev_get_ecmd(dev, &ecmd); 
    1342                         spin_unlock_irq(&np->lock); 
    1343                         if (copy_to_user(useraddr, &ecmd, sizeof(ecmd))) 
    1344                                 return -EFAULT; 
    1345                         return 0; 
    1346                 } 
    1347                 /* set settings */ 
    1348         case ETHTOOL_SSET:{ 
    1349                         struct ethtool_cmd ecmd; 
    1350                         int r; 
    1351                         if (copy_from_user(&ecmd, useraddr, sizeof(ecmd))) 
    1352                                 return -EFAULT; 
    1353                         spin_lock_irq(&np->lock); 
    1354                         r = netdev_set_ecmd(dev, &ecmd); 
    1355                         spin_unlock_irq(&np->lock); 
    1356                         return r; 
    1357                 } 
    1358                 /* restart autonegotiation */ 
    1359         case ETHTOOL_NWAY_RST:{ 
    1360                         int tmp; 
    1361                         int r = -EINVAL; 
    1362                         /* if autoneg is off, it's an error */ 
    1363                         tmp = armiiread(dev, np->phy, MII_BMCR); 
    1364                         if (tmp & BMCR_ANENABLE) { 
    1365                                 tmp |= (BMCR_ANRESTART); 
    1366                                 armiiwrite(dev, np->phy, MII_BMCR, tmp); 
    1367                                 r = 0; 
    1368                         } 
    1369                         return r; 
    1370                 } 
    1371                 /* get link status */ 
    1372         case ETHTOOL_GLINK:{ 
    1373                         struct ethtool_value edata = { ETHTOOL_GLINK }; 
    1374                         edata.data = 
    1375                                 (armiiread(dev, np->phy, MII_BMSR) & BMSR_LSTATUS) ? 1 : 0; 
    1376                         if (copy_to_user(useraddr, &edata, sizeof(edata))) 
    1377                                 return -EFAULT; 
    1378                         return 0; 
    1379                 } 
    1380         } 
    1381  
    1382         return -EOPNOTSUPP; 
    1383 } 
    1384  
    1385 static int ar2313_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) 
    1386 { 
    1387         struct mii_ioctl_data *data = (struct mii_ioctl_data *) &ifr->ifr_data; 
    1388  
    1389         switch (cmd) { 
    13901251 
    13911252        case SIOCETHTOOL: 
    1392                 return netdev_ethtool_ioctl(dev, (void *) ifr->ifr_data); 
    1393  
    1394         case SIOCGMIIPHY:                       /* Get address of MII PHY in use. */ 
    1395                 data->phy_id = 1; 
    1396                 /* Fall Through */ 
    1397  
    1398         case SIOCGMIIREG:                       /* Read MII PHY register. */ 
    1399                 data->val_out = armiiread(dev, data->phy_id & 0x1f, 
    1400                                                                   data->reg_num & 0x1f); 
    1401                 return 0; 
    1402         case SIOCSMIIREG:                       /* Write MII PHY register. */ 
    1403                 if (!capable(CAP_NET_ADMIN)) 
    1404                         return -EPERM; 
    1405                 armiiwrite(dev, data->phy_id & 0x1f, 
    1406                                    data->reg_num & 0x1f, data->val_in); 
    1407                 return 0; 
     1253                spin_lock_irq(&sp->lock); 
     1254                ret = phy_ethtool_ioctl(sp->phy_dev, (void *) ifr->ifr_data); 
     1255                spin_unlock_irq(&sp->lock); 
     1256                return ret; 
    14081257 
    14091258        case SIOCSIFHWADDR: 
     
    14181267                        return -EFAULT; 
    14191268                return 0; 
    1420  
     1269         
     1270        case SIOCGMIIPHY: 
     1271        case SIOCGMIIREG: 
     1272        case SIOCSMIIREG: 
     1273                return phy_mii_ioctl(sp->phy_dev, data, cmd); 
     1274         
    14211275        default: 
    14221276                break; 
     
    14331287 
    14341288 
     1289static void ar2313_adjust_link(struct net_device *dev) 
     1290{ 
     1291        printk(KERN_ERR " ar2313_adjust_link implementation missing\n"); 
     1292} 
     1293 
    14351294#define MII_ADDR(phy, reg) \ 
    14361295        ((reg << MII_ADDR_REG_SHIFT) | (phy << MII_ADDR_PHY_SHIFT)) 
    14371296 
    1438 static short armiiread(struct net_device *dev, short phy, short reg) 
    1439 { 
     1297static int  
     1298mdiobus_read(struct mii_bus *bus, int phy_addr, int regnum) 
     1299{ 
     1300        struct net_device *const dev = bus->priv; 
    14401301        struct ar2313_private *sp = (struct ar2313_private *) dev->priv; 
    14411302        volatile ETHERNET_STRUCT *ethernet = sp->phy_regs; 
    14421303 
    1443         ethernet->mii_addr = MII_ADDR(phy, reg); 
     1304        ethernet->mii_addr = MII_ADDR(phy_addr, regnum); 
    14441305        while (ethernet->mii_addr & MII_ADDR_BUSY); 
    14451306        return (ethernet->mii_data >> MII_DATA_SHIFT); 
    14461307} 
    14471308 
    1448 static void 
    1449 armiiwrite(struct net_device *dev, short phy, short reg, short data) 
    1450 { 
     1309static int  
     1310mdiobus_write(struct mii_bus *bus, int phy_addr, int regnum, 
     1311             u16 value) 
     1312{ 
     1313        struct net_device *const dev = bus->priv; 
    14511314        struct ar2313_private *sp = (struct ar2313_private *) dev->priv; 
    14521315        volatile ETHERNET_STRUCT *ethernet = sp->phy_regs; 
    14531316 
    14541317        while (ethernet->mii_addr & MII_ADDR_BUSY); 
    1455         ethernet->mii_data = data << MII_DATA_SHIFT; 
    1456         ethernet->mii_addr = MII_ADDR(phy, reg) | MII_ADDR_WRITE; 
    1457 } 
     1318        ethernet->mii_data = value << MII_DATA_SHIFT; 
     1319        ethernet->mii_addr = MII_ADDR(phy_addr, regnum) | MII_ADDR_WRITE; 
     1320 
     1321        return 0; 
     1322} 
     1323 
     1324static int mdiobus_reset(struct mii_bus *bus) 
     1325{ 
     1326        struct net_device *const dev = bus->priv; 
     1327 
     1328        ar2313_reset_reg(dev); 
     1329         
     1330        return 0; 
     1331} 
     1332 
     1333static int mdiobus_probe (struct net_device *dev) 
     1334{ 
     1335        struct ar2313_private *const sp = (struct ar2313_private *) dev->priv; 
     1336        struct phy_device *phydev = NULL; 
     1337        int phy_addr; 
     1338 
     1339        /* find the first (lowest address) PHY on the current MAC's MII bus */ 
     1340        for (phy_addr = 0; phy_addr < PHY_MAX_ADDR; phy_addr++) 
     1341                if (sp->mii_bus.phy_map[phy_addr]) { 
     1342                        phydev = sp->mii_bus.phy_map[phy_addr]; 
     1343                        break; /* break out with first one found */ 
     1344                } 
     1345         
     1346        if (!phydev) { 
     1347                printk (KERN_ERR "ar2313:%s: no PHY found\n", dev->name); 
     1348                return -1; 
     1349        } 
     1350         
     1351        /* now we are supposed to have a proper phydev, to attach to... */ 
     1352        BUG_ON(!phydev); 
     1353        BUG_ON(phydev->attached_dev); 
     1354         
     1355        phydev = phy_connect(dev, phydev->dev.bus_id, &ar2313_adjust_link, 0, 
     1356                PHY_INTERFACE_MODE_MII); 
     1357         
     1358        if (IS_ERR(phydev)) { 
     1359                printk(KERN_ERR "%s: Could not attach to PHY\n", dev->name); 
     1360                return PTR_ERR(phydev); 
     1361        } 
     1362 
     1363        /* mask with MAC supported features */ 
     1364        phydev->supported &= (SUPPORTED_10baseT_Half 
     1365                | SUPPORTED_10baseT_Full 
     1366                | SUPPORTED_100baseT_Half 
     1367                | SUPPORTED_100baseT_Full 
     1368                | SUPPORTED_Autoneg 
     1369                /* | SUPPORTED_Pause | SUPPORTED_Asym_Pause */ 
     1370                | SUPPORTED_MII 
     1371                | SUPPORTED_TP); 
     1372         
     1373        phydev->advertising = phydev->supported; 
     1374         
     1375        //sp->old_link = 0; 
     1376        //sp->old_speed = 0; 
     1377        //sp->old_duplex = -1; 
     1378        sp->phy_dev = phydev; 
     1379         
     1380        printk(KERN_INFO "%s: attached PHY driver [%s] " 
     1381                "(mii_bus:phy_addr=%s)\n", 
     1382                dev->name, phydev->drv->name, phydev->dev.bus_id); 
     1383         
     1384        return 0; 
     1385} 
     1386 
  • trunk/target/linux/atheros/patches/130-ar2313_ethernet.patch

    r7936 r9298  
    1 diff -urN linux.old/drivers/net/Kconfig linux.eth/drivers/net/Kconfig 
    2 --- linux.old/drivers/net/Kconfig       2006-12-14 23:53:29.000000000 +0100 
    3 +++ linux.eth/drivers/net/Kconfig       2006-12-16 04:30:11.000000000 +0100 
    4 @@ -324,6 +324,12 @@ 
    5   
    6  source "drivers/net/arm/Kconfig" 
     1Index: linux-2.6.23/drivers/net/Kconfig 
     2=================================================================== 
     3--- linux-2.6.23.orig/drivers/net/Kconfig       2007-10-14 00:55:22.000000000 +0200 
     4+++ linux-2.6.23/drivers/net/Kconfig    2007-10-14 00:56:32.000000000 +0200 
     5@@ -348,6 +348,12 @@ 
     6          AX88796 driver, using platform bus to provide 
     7          chip detection and resources 
    78  
    89+config AR2313 
     
    1415 config MACE 
    1516        tristate "MACE (Power Mac ethernet) support" 
    16         depends on NET_ETHERNET && PPC_PMAC && PPC32 
    17 diff -urN linux.old/drivers/net/Makefile linux.eth/drivers/net/Makefile 
    18 --- linux.old/drivers/net/Makefile      2006-12-14 23:53:29.000000000 +0100 
    19 +++ linux.eth/drivers/net/Makefile      2006-12-16 04:30:11.000000000 +0100 
    20 @@ -11,6 +11,7 @@ 
    21  obj-$(CONFIG_BONDING) += bonding/ 
    22  obj-$(CONFIG_ATL1) += atl1/ 
    23  obj-$(CONFIG_GIANFAR) += gianfar_driver.o 
     17        depends on PPC_PMAC && PPC32 
     18Index: linux-2.6.23/drivers/net/Makefile 
     19=================================================================== 
     20--- linux-2.6.23.orig/drivers/net/Makefile      2007-10-14 00:55:22.000000000 +0200 
     21+++ linux-2.6.23/drivers/net/Makefile   2007-10-14 00:56:55.000000000 +0200 
     22@@ -182,6 +182,7 @@ 
     23 obj-$(CONFIG_LGUEST_NET) += lguest_net.o 
     24 obj-$(CONFIG_MIPS_JAZZ_SONIC) += jazzsonic.o 
     25 obj-$(CONFIG_MIPS_AU1X00_ENET) += au1000_eth.o 
    2426+obj-$(CONFIG_AR2313) += ar2313/ 
    25   
    26  gianfar_driver-objs := gianfar.o \ 
    27                 gianfar_ethtool.o \ 
     27 obj-$(CONFIG_MIPS_SIM_NET) += mipsnet.o 
     28 obj-$(CONFIG_SGI_IOC3_ETH) += ioc3-eth.o 
     29 obj-$(CONFIG_DECLANCE) += declance.o 
Note: See TracChangeset for help on using the changeset viewer.