diff --git a/Rules.make b/Rules.make
index bb273a61b1b03394b9463f85b9c13f0107d576da..1fde88a519cd19e56e321768cbfdc0d0aacedd5d 100644
--- a/Rules.make
+++ b/Rules.make
@@ -43,6 +43,27 @@ obj-m := $(filter-out $(obj-y),$(obj-m))
 #
 first_rule: all_targets
 
+# Handle objects in subdirs
+# ---------------------------------------------------------------------------
+# o if we encounter foo/ in $(obj-y), replace it by foo/built-in.o
+#   and add the directory to the list of dirs to descend into: $(subdir-y)
+# o if we encounter foo/ in $(obj-m), remove it from $(obj-m) 
+#   and add the directory to the list of dirs to descend into: $(subdir-m)
+
+__subdir-y	:= $(patsubst %/,%,$(filter %/, $(obj-y)))
+subdir-y	+= $(__subdir-y)
+__subdir-m	:= $(patsubst %/,%,$(filter %/, $(obj-m)))
+subdir-m	+= $(__subdir-m)
+__subdir-n	:= $(patsubst %/,%,$(filter %/, $(obj-n)))
+subdir-n	+= $(__subdir-n)
+__subdir-	:= $(patsubst %/,%,$(filter %/, $(obj-)))
+subdir-		+= $(__subdir-)
+obj-y		:= $(patsubst %/, %/built-in.o, $(obj-y))
+obj-m		:= $(filter-out %/, $(obj-m))
+
+# If a dir is selected in $(subdir-y) and also mentioned in $(mod-subdirs),
+# add it to $(subdir-m)
+
 both-m          := $(filter $(mod-subdirs), $(subdir-y))
 SUB_DIRS	:= $(subdir-y)
 MOD_SUB_DIRS	:= $(sort $(subdir-m) $(both-m))
diff --git a/drivers/acorn/net/Makefile b/drivers/acorn/net/Makefile
index 78b25d0569337dc14f11d52cdb44441dd22ab7cc..2ee3cd707cd2b419db5a1717976fbb733386f846 100644
--- a/drivers/acorn/net/Makefile
+++ b/drivers/acorn/net/Makefile
@@ -3,7 +3,7 @@
 # Makefile for the Acorn ethercard network device drivers
 #
 
-O_TARGET := acorn-net.o
+O_TARGET := built-in.o
 
 obj-y	:=
 obj-m	:=
diff --git a/drivers/net/Makefile b/drivers/net/Makefile
index 3b7793903d5dec6f71ab6d9fbfa1068e86756294..b80a351ece9b2a7412a6e37f83b32bbe0c6a5536 100644
--- a/drivers/net/Makefile
+++ b/drivers/net/Makefile
@@ -25,18 +25,8 @@ ifeq ($(CONFIG_ISDN_PPP),y)
   obj-$(CONFIG_ISDN) += slhc.o
 endif
 
-subdir-$(CONFIG_NET_PCMCIA) += pcmcia
-subdir-$(CONFIG_NET_WIRELESS) += wireless
-
-subdir-$(CONFIG_E100) += e100
-ifeq ($(CONFIG_E100),y)
-  obj-y += e100/e100.o
-endif
-
-subdir-$(CONFIG_E1000) += e1000
-ifeq ($(CONFIG_E1000),y)
-  obj-y += e1000/e1000.o
-endif
+obj-$(CONFIG_E100) += e100/
+obj-$(CONFIG_E1000) += e1000/
 
 #
 # link order important here
@@ -75,17 +65,8 @@ obj-$(CONFIG_STNIC) += stnic.o 8390.o
 obj-$(CONFIG_FEALNX) += fealnx.o mii.o
 obj-$(CONFIG_TIGON3) += tg3.o
 obj-$(CONFIG_TC35815) += tc35815.o
-
-subdir-$(CONFIG_SK98LIN) += sk98lin
-ifeq ($(CONFIG_SK98LIN),y)
-obj-y += sk98lin/sk98lin.o
-endif
-
-subdir-$(CONFIG_SKFP) += skfp
-ifeq ($(CONFIG_SKFP),y)
-  obj-y += skfp/skfp.o
-endif
-
+obj-$(CONFIG_SK98LIN) += sk98lin/
+obj-$(CONFIG_SKFP) += skfp/
 obj-$(CONFIG_VIA_RHINE) += via-rhine.o mii.o
 obj-$(CONFIG_ADAPTEC_STARFIRE) += starfire.o
 
@@ -210,60 +191,17 @@ obj-$(CONFIG_MAC89x0) += mac89x0.o
 obj-$(CONFIG_TUN) += tun.o
 obj-$(CONFIG_DL2K) += dl2k.o
 
-subdir-$(CONFIG_ARCH_ACORN) += ../acorn/net
-ifeq ($(CONFIG_ARCH_ACORN),y)
-  obj-y		+= ../acorn/net/acorn-net.o
-endif
-
-subdir-$(CONFIG_NET_FC) += fc
-ifeq ($(CONFIG_NET_FC),y)
-  obj-y		+= fc/fc.o
-endif
-
-subdir-$(CONFIG_DEV_APPLETALK) += appletalk
-ifeq ($(CONFIG_DEV_APPLETALK),y)
-  obj-y		+= appletalk/appletalk.o
-endif
-
-subdir-$(CONFIG_TR) += tokenring
-ifeq ($(CONFIG_TR),y)
-  obj-y		+= tokenring/tr.o
-endif
-
-subdir-$(CONFIG_WAN) += wan
-ifeq ($(CONFIG_WAN),y)
-  obj-y		+= wan/wan.o
-endif
-
-subdir-$(CONFIG_ARCNET) += arcnet
-ifeq ($(CONFIG_ARCNET),y)
-  obj-y		+= arcnet/arcnetdrv.o
-endif
-
-subdir-$(CONFIG_NET_PCMCIA) += pcmcia
-ifeq ($(CONFIG_NET_PCMCIA),y)
-  obj-y		+= pcmcia/pcmcia_net.o
-endif
-
-subdir-$(CONFIG_NET_WIRELESS) += wireless
-ifeq ($(CONFIG_NET_WIRELESS),y)
-  obj-y		+= wireless/wireless_net.o
-endif
-
-subdir-$(CONFIG_NET_TULIP) += tulip
-ifeq ($(CONFIG_NET_TULIP),y)
-  obj-y		+= tulip/tulip_net.o
-endif
-
-subdir-$(CONFIG_HAMRADIO) += hamradio
-ifeq ($(CONFIG_HAMRADIO),y)
-  obj-y		+= hamradio/hamradio.o
-endif
-
-subdir-$(CONFIG_IRDA) += irda
-ifeq ($(CONFIG_IRDA),y)
-  obj-y		+= irda/irda.o
-endif
+obj-$(CONFIG_ARCH_ACORN) += ../acorn/net/
+obj-$(CONFIG_NET_FC) += fc/
+obj-$(CONFIG_DEV_APPLETALK) += appletalk/
+obj-$(CONFIG_TR) += tokenring/
+obj-$(CONFIG_WAN) += wan/
+obj-$(CONFIG_ARCNET) += arcnet/
+obj-$(CONFIG_NET_PCMCIA) += pcmcia/
+obj-$(CONFIG_NET_WIRELESS) += wireless/
+obj-$(CONFIG_NET_TULIP) += tulip/
+obj-$(CONFIG_HAMRADIO) += hamradio/
+obj-$(CONFIG_IRDA) += irda/
 
 include $(TOPDIR)/Rules.make
 
diff --git a/drivers/net/appletalk/Makefile b/drivers/net/appletalk/Makefile
index f142745095c59a9dc4cb049eb1da9f3b7952b012..557271fd291df7285bb425eb8d2efd8ec6c4e4a2 100644
--- a/drivers/net/appletalk/Makefile
+++ b/drivers/net/appletalk/Makefile
@@ -6,6 +6,8 @@
 # unless it's something special (ie not a .c file).
 #
 
+O_TARGET := built-in.o
+
 obj-y   :=
 obj-n   :=
 obj-m   :=
@@ -16,7 +18,5 @@ obj-$(CONFIG_IPDDP) += ipddp.o
 obj-$(CONFIG_COPS) += cops.o
 obj-$(CONFIG_LTPC) += ltpc.o
 
-O_TARGET := appletalk.o
-
 include $(TOPDIR)/Rules.make
 
diff --git a/drivers/net/arcnet/Makefile b/drivers/net/arcnet/Makefile
index 87d84a8448d321bf72a2cdd9b82abcbf47c97b56..58403cd6be6b1faa7b4df9151bd3c4ae8a7511c4 100644
--- a/drivers/net/arcnet/Makefile
+++ b/drivers/net/arcnet/Makefile
@@ -5,6 +5,8 @@
 # unless it's something special (ie not a .c file).
 #
 
+O_TARGET := built-in.o
+
 obj-y	:=
 obj-n	:=
 obj-m	:=
@@ -22,6 +24,4 @@ obj-$(CONFIG_ARCNET_COM20020) += com20020.o
 obj-$(CONFIG_ARCNET_COM20020_ISA) += com20020-isa.o
 obj-$(CONFIG_ARCNET_COM20020_PCI) += com20020-pci.o
 
-O_TARGET := arcnetdrv.o
-
 include $(TOPDIR)/Rules.make
diff --git a/drivers/net/e100/Makefile b/drivers/net/e100/Makefile
index 066956eac1a205a153f157906f66a586570a6514..1df67109a4f68af0f2e948bf3f8adad49a573eb3 100644
--- a/drivers/net/e100/Makefile
+++ b/drivers/net/e100/Makefile
@@ -7,10 +7,11 @@
 #
 # Note 2! The CFLAGS definitions are now in the main makefile...
 
-O_TARGET := e100.o
+O_TARGET := built-in.o
 
-obj-y   := e100_main.o e100_config.o e100_proc.o e100_phy.o \
-	   e100_eeprom.o e100_test.o
-obj-m   := $(O_TARGET)
+obj-$(CONFIG_E100) += e100.o
+
+e100-objs := e100_main.o e100_config.o e100_proc.o e100_phy.o \
+	     e100_eeprom.o e100_test.o
 
 include $(TOPDIR)/Rules.make
diff --git a/drivers/net/e1000/Makefile b/drivers/net/e1000/Makefile
index 0e99ae2369e0704f33d1412ae86b77f72f8209cc..0bd0d577bae07d399b165f89de52b8b0009df9f4 100644
--- a/drivers/net/e1000/Makefile
+++ b/drivers/net/e1000/Makefile
@@ -7,9 +7,11 @@
 #
 # Note 2! The CFLAGS definitions are now in the main makefile...
 
-O_TARGET := e1000.o
+O_TARGET := built-in.o
 
-obj-y   := e1000_main.o e1000_hw.o e1000_ethtool.o e1000_param.o e1000_proc.o
-obj-m   := $(O_TARGET)
+obj-$(CONFIG_E1000) += e1000.o
+
+e1000-objs := e1000_main.o e1000_hw.o e1000_ethtool.o e1000_param.o \
+	      e1000_proc.o
 
 include $(TOPDIR)/Rules.make
diff --git a/drivers/net/fc/Makefile b/drivers/net/fc/Makefile
index f6103ff06078e61ddc44656c643b612e3dcfe319..4f22d0694ffe29affd299ab087f30317028ad13c 100644
--- a/drivers/net/fc/Makefile
+++ b/drivers/net/fc/Makefile
@@ -5,7 +5,7 @@
 # Rewritten to use lists instead of if-statements.
 #
 
-O_TARGET := fc.o
+O_TARGET := built-in.o
 
 obj-$(CONFIG_IPHASE5526)	+= iph5526.o
 
diff --git a/drivers/net/hamradio/Makefile b/drivers/net/hamradio/Makefile
index 16c20a7c00579b84bb312db9cf7567e5b78cae7d..ccf5051739b172b1d453c1d9c6ac4d552b98a240 100644
--- a/drivers/net/hamradio/Makefile
+++ b/drivers/net/hamradio/Makefile
@@ -11,7 +11,7 @@
 #
 
 
-O_TARGET := hamradio.o
+O_TARGET := built-in.o
 
 export-objs	= hdlcdrv.o
 
@@ -26,12 +26,6 @@ obj-$(CONFIG_BAYCOM_SER_FDX)	+= baycom_ser_fdx.o	hdlcdrv.o
 obj-$(CONFIG_BAYCOM_SER_HDX)	+= baycom_ser_hdx.o	hdlcdrv.o
 obj-$(CONFIG_BAYCOM_PAR)	+= baycom_par.o		hdlcdrv.o
 obj-$(CONFIG_BAYCOM_EPP)	+= baycom_epp.o		hdlcdrv.o
-obj-$(CONFIG_SOUNDMODEM)	+= 			hdlcdrv.o
-
-subdir-$(CONFIG_SOUNDMODEM) += soundmodem
-
-ifeq ($(CONFIG_SOUNDMODEM),y)
-obj-y += soundmodem/soundmodem.o
-endif
+obj-$(CONFIG_SOUNDMODEM)	+= soundmodem/		hdlcdrv.o
 
 include $(TOPDIR)/Rules.make
diff --git a/drivers/net/hamradio/soundmodem/Makefile b/drivers/net/hamradio/soundmodem/Makefile
index 959701ab15bbf63fb20fbf43a8a9a54da52c22a8..6d1ba016ad5e1ca912502f8f1de1515460924f5e 100644
--- a/drivers/net/hamradio/soundmodem/Makefile
+++ b/drivers/net/hamradio/soundmodem/Makefile
@@ -9,20 +9,21 @@
 # parent makes..
 #
 
-O_TARGET	:= soundmodem.o
-
-obj-y		:= sm.o
-obj-$(CONFIG_SOUNDMODEM_SBC) += sm_sbc.o
-obj-$(CONFIG_SOUNDMODEM_WSS) += sm_wss.o
-obj-$(CONFIG_SOUNDMODEM_AFSK1200) += sm_afsk1200.o
-obj-$(CONFIG_SOUNDMODEM_AFSK2400_7) += sm_afsk2400_7.o
-obj-$(CONFIG_SOUNDMODEM_AFSK2400_8) += sm_afsk2400_8.o
-obj-$(CONFIG_SOUNDMODEM_AFSK2666) += sm_afsk2666.o
-obj-$(CONFIG_SOUNDMODEM_HAPN4800) += sm_hapn4800.o
-obj-$(CONFIG_SOUNDMODEM_PSK4800) += sm_psk4800.o
-obj-$(CONFIG_SOUNDMODEM_FSK9600) += sm_fsk9600.o
-
-obj-m		:= $(O_TARGET)
+O_TARGET	:= built-in.o
+
+obj-$(CONFIG_SOUNDMODEM) += soundmodem.o
+
+soundmodem-y					:= sm.o
+soundmodem-$(CONFIG_SOUNDMODEM_SBC)		+= sm_sbc.o
+soundmodem-$(CONFIG_SOUNDMODEM_WSS)		+= sm_wss.o
+soundmodem-$(CONFIG_SOUNDMODEM_AFSK1200)	+= sm_afsk1200.o
+soundmodem-$(CONFIG_SOUNDMODEM_AFSK2400_7)	+= sm_afsk2400_7.o
+soundmodem-$(CONFIG_SOUNDMODEM_AFSK2400_8)	+= sm_afsk2400_8.o
+soundmodem-$(CONFIG_SOUNDMODEM_AFSK2666)	+= sm_afsk2666.o
+soundmodem-$(CONFIG_SOUNDMODEM_HAPN4800)	+= sm_hapn4800.o
+soundmodem-$(CONFIG_SOUNDMODEM_PSK4800)		+= sm_psk4800.o
+soundmodem-$(CONFIG_SOUNDMODEM_FSK9600)		+= sm_fsk9600.o
+soundmodem-objs					:= $(soundmodem-y)
 
 all:		all_targets
 .PHONY:		all
diff --git a/drivers/net/irda/Makefile b/drivers/net/irda/Makefile
index 6b9c37a54534e2a11b2ffd2bd81844ede9aeb31b..069196f6fe02d13f0841473bef80d5fb6508ada3 100644
--- a/drivers/net/irda/Makefile
+++ b/drivers/net/irda/Makefile
@@ -6,7 +6,7 @@
 # Rewritten to use lists instead of if-statements.
 #
 
-O_TARGET := irda.o
+O_TARGET := built-in.o
 
 export-objs	= irport.o
 
diff --git a/drivers/net/pcmcia/Makefile b/drivers/net/pcmcia/Makefile
index 24712eddb2b1c6b595869bd52c941100e4823524..d97f861af7b55d3c7d431d33528d46e628d52d07 100644
--- a/drivers/net/pcmcia/Makefile
+++ b/drivers/net/pcmcia/Makefile
@@ -4,7 +4,7 @@
 # Makefile for the Linux PCMCIA network device drivers.
 #
 
-O_TARGET := pcmcia_net.o
+O_TARGET := built-in.o
 
 obj-y		:=
 obj-m		:=
diff --git a/drivers/net/sk98lin/Makefile b/drivers/net/sk98lin/Makefile
index f60d97f65802aeeb3f36f869d4b5902c7a17f54f..4869e3d5683c7c6f548a7c8957d6a0d73b0239f5 100644
--- a/drivers/net/sk98lin/Makefile
+++ b/drivers/net/sk98lin/Makefile
@@ -3,12 +3,13 @@
 # Makefile for the SysKonnect SK-98xx device driver.
 #
 
-O_TARGET := sk98lin.o
+O_TARGET := built-in.o
 
-obj-y :=     skge.o skaddr.o skgehwt.o skgeinit.o skgepnmi.o skgesirq.o \
-             ski2c.o sklm80.o skqueue.o skrlmt.o sktimer.o skvpd.o \
-             skxmac2.o skproc.o skcsum.o
-obj-m := $(O_TARGET)
+obj-$(CONFIG_SK98LIN) += sk98lin.o
+
+sk98lin-objs := skge.o skaddr.o skgehwt.o skgeinit.o skgepnmi.o skgesirq.o \
+		ski2c.o sklm80.o skqueue.o skrlmt.o sktimer.o skvpd.o \
+		skxmac2.o skproc.o skcsum.o
 
 # DBGDEF =  \
 # -DDEBUG
diff --git a/drivers/net/skfp/Makefile b/drivers/net/skfp/Makefile
index f8cc4b23a69dc36318a8a31f03db32d2715ca586..c48b89c4aff59ffbde5c284ef12aebeb65be0930 100644
--- a/drivers/net/skfp/Makefile
+++ b/drivers/net/skfp/Makefile
@@ -2,12 +2,14 @@
 # Makefile for the SysKonnect FDDI PCI adapter driver
 #
 
-O_TARGET := skfp.o
-obj-y :=      skfddi.o    hwmtm.o    fplustm.o  smt.o      cfm.o     \
+O_TARGET := built-in.o
+
+obj-$(CONFIG_SKFP) += skfp.o
+
+skfp-objs :=  skfddi.o    hwmtm.o    fplustm.o  smt.o      cfm.o     \
               ecm.o       pcmplc.o   pmf.o      queue.o    rmt.o     \
 	      smtdef.o    smtinit.o  smttimer.o srf.o      lnkstat.o \
               smtparse.o  hwt.o      drvfbi.o   ess.o
-obj-m := skfp.o
 
 # NOTE:
 #   Compiling this driver produces some warnings (and some more are 
@@ -16,7 +18,7 @@ obj-m := skfp.o
 #   drivers, and fixing it for Linux might bring problems on other
 #   projects. To keep the source common for all those drivers (and
 #   thus simplify fixes to it), please do not clean it up!
- 
+
 EXTRA_CFLAGS += -I. -DPCI -DMEM_MAPPED_IO -Wno-strict-prototypes 
 
 include $(TOPDIR)/Rules.make
diff --git a/drivers/net/tokenring/Makefile b/drivers/net/tokenring/Makefile
index 8c1c1ff5eb38e753081e06c8ffdb0da3bd7f01f9..c9bb72cf0f3c4c38c0dc74e8cb705ecf2b87e05f 100644
--- a/drivers/net/tokenring/Makefile
+++ b/drivers/net/tokenring/Makefile
@@ -6,6 +6,8 @@
 # unless it's something special (ie not a .c file).
 #
 
+O_TARGET := built-in.o
+
 obj-y   :=
 obj-n   :=
 obj-m   :=
@@ -23,6 +25,4 @@ obj-$(CONFIG_TMSISA) 	+= tmsisa.o
 obj-$(CONFIG_SMCTR) 	+= smctr.o
 obj-$(CONFIG_3C359)	+= 3c359.o
 
-O_TARGET := tr.o
-
 include $(TOPDIR)/Rules.make
diff --git a/drivers/net/tulip/Makefile b/drivers/net/tulip/Makefile
index abbcef43fa9d9dad41b1077067813b901686614c..e4f682b1425028df53cc6dab6e1ed52291a21928 100644
--- a/drivers/net/tulip/Makefile
+++ b/drivers/net/tulip/Makefile
@@ -4,7 +4,7 @@
 # Makefile for the Linux "Tulip" family network device drivers.
 #
 
-O_TARGET := tulip_net.o
+O_TARGET := built-in.o
 
 obj-y		:=
 obj-m		:=
diff --git a/drivers/net/wan/Makefile b/drivers/net/wan/Makefile
index ebf712b3b8bb440ac21d0eff9c1145b097a455ab..bc8e6ae9acb3a8947bf3e78d2c44f5bce65cea9e 100644
--- a/drivers/net/wan/Makefile
+++ b/drivers/net/wan/Makefile
@@ -5,7 +5,7 @@
 # Rewritten to use lists instead of if-statements.
 #
 
-O_TARGET := wan.o
+O_TARGET := built-in.o
 
 export-objs :=	z85230.o syncppp.o comx.o sdladrv.o cycx_drv.o hdlc_generic.o \
 		dlci.o pc300_drv.o
@@ -51,12 +51,8 @@ obj-$(CONFIG_LANMEDIA)		+=		syncppp.o
 obj-$(CONFIG_SYNCLINK_SYNCPPP)	+=		syncppp.o
 obj-$(CONFIG_X25_ASY)		+= x25_asy.o
 
-subdir-$(CONFIG_LANMEDIA) += lmc
+obj-$(CONFIG_LANMEDIA)		+= lmc/
 
-ifeq ($(CONFIG_LANMEDIA),y)
-  obj-y += lmc/lmc.o
-endif
- 
 obj-$(CONFIG_DLCI)		+= dlci.o 
 obj-$(CONFIG_SDLA)		+= sdla.o
 ifeq ($(CONFIG_WANPIPE_MULTPPP),y)
diff --git a/drivers/net/wan/lmc/Makefile b/drivers/net/wan/lmc/Makefile
index 222435477d43fae9dc5c73466f89ea65500e9682..ec5cec6735ccf514ff9f0a54c4f4e22c9c402f7c 100644
--- a/drivers/net/wan/lmc/Makefile
+++ b/drivers/net/wan/lmc/Makefile
@@ -4,10 +4,11 @@
 # Specifically the 1000,1200,5200,5245
 #
 
-O_TARGET := lmc.o
+O_TARGET := built-in.o
 
-obj-y := lmc_debug.o lmc_media.o lmc_main.o lmc_proto.o
-obj-m := lmc.o
+obj-$(CONFIG_LANMEDIA) += lmc.o
+
+lmc-objs := lmc_debug.o lmc_media.o lmc_main.o lmc_proto.o
 
 # Like above except every packet gets echoed to KERN_DEBUG
 # in hex
diff --git a/drivers/net/wireless/Makefile b/drivers/net/wireless/Makefile
index 0b9a00f68654942154807bf3cf6bd9253a665548..14b29aa75e80ef0b70268e99ebde4f934ef285d2 100644
--- a/drivers/net/wireless/Makefile
+++ b/drivers/net/wireless/Makefile
@@ -4,7 +4,7 @@
 # Makefile for the Linux Wireless network device drivers.
 #
 
-O_TARGET := wireless_net.o
+O_TARGET := built-in.o
 
 obj-y		:=
 obj-m		:=