aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJean Delvare <khali@linux-fr.org>2007-03-06 05:45:12 -0500
committerGreg Kroah-Hartman <gregkh@suse.de>2007-05-02 22:02:35 -0400
commit6473d160b4aba8023bcf38519a5989694dfd51a7 (patch)
tree5a3fe32ecc3d846b9de00ad5ba726314ca79f15b
parenta9dfd281a7e12f6d9b53b5a28649b3a3c76a70e6 (diff)
PCI: Cleanup the includes of <linux/pci.h>
I noticed that many source files include <linux/pci.h> while they do not appear to need it. Here is an attempt to clean it all up. In order to find all possibly affected files, I searched for all files including <linux/pci.h> but without any other occurence of "pci" or "PCI". I removed the include statement from all of these, then I compiled an allmodconfig kernel on both i386 and x86_64 and fixed the false positives manually. My tests covered 66% of the affected files, so there could be false positives remaining. Untested files are: arch/alpha/kernel/err_common.c arch/alpha/kernel/err_ev6.c arch/alpha/kernel/err_ev7.c arch/ia64/sn/kernel/huberror.c arch/ia64/sn/kernel/xpnet.c arch/m68knommu/kernel/dma.c arch/mips/lib/iomap.c arch/powerpc/platforms/pseries/ras.c arch/ppc/8260_io/enet.c arch/ppc/8260_io/fcc_enet.c arch/ppc/8xx_io/enet.c arch/ppc/syslib/ppc4xx_sgdma.c arch/sh64/mach-cayman/iomap.c arch/xtensa/kernel/xtensa_ksyms.c arch/xtensa/platform-iss/setup.c drivers/i2c/busses/i2c-at91.c drivers/i2c/busses/i2c-mpc.c drivers/media/video/saa711x.c drivers/misc/hdpuftrs/hdpu_cpustate.c drivers/misc/hdpuftrs/hdpu_nexus.c drivers/net/au1000_eth.c drivers/net/fec_8xx/fec_main.c drivers/net/fec_8xx/fec_mii.c drivers/net/fs_enet/fs_enet-main.c drivers/net/fs_enet/mac-fcc.c drivers/net/fs_enet/mac-fec.c drivers/net/fs_enet/mac-scc.c drivers/net/fs_enet/mii-bitbang.c drivers/net/fs_enet/mii-fec.c drivers/net/ibm_emac/ibm_emac_core.c drivers/net/lasi_82596.c drivers/parisc/hppb.c drivers/sbus/sbus.c drivers/video/g364fb.c drivers/video/platinumfb.c drivers/video/stifb.c drivers/video/valkyriefb.c include/asm-arm/arch-ixp4xx/dma.h sound/oss/au1550_ac97.c I would welcome test reports for these files. I am fine with removing the untested files from the patch if the general opinion is that these changes aren't safe. The tested part would still be nice to have. Note that this patch depends on another header fixup patch I submitted to LKML yesterday: [PATCH] scatterlist.h needs types.h http://lkml.org/lkml/2007/3/01/141 Signed-off-by: Jean Delvare <khali@linux-fr.org> Cc: Badari Pulavarty <pbadari@us.ibm.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r--arch/alpha/kernel/err_common.c1
-rw-r--r--arch/alpha/kernel/err_ev6.c1
-rw-r--r--arch/alpha/kernel/err_ev7.c1
-rw-r--r--arch/i386/kernel/cpu/cpufreq/speedstep-lib.c1
-rw-r--r--arch/i386/kernel/cpu/cpufreq/speedstep-smi.c2
-rw-r--r--arch/ia64/sn/kernel/huberror.c1
-rw-r--r--arch/ia64/sn/kernel/xpnet.c1
-rw-r--r--arch/m68knommu/kernel/dma.c1
-rw-r--r--arch/mips/lib/iomap.c1
-rw-r--r--arch/powerpc/platforms/pseries/ras.c1
-rw-r--r--arch/ppc/8260_io/enet.c1
-rw-r--r--arch/ppc/8260_io/fcc_enet.c1
-rw-r--r--arch/ppc/8xx_io/enet.c1
-rw-r--r--arch/ppc/syslib/ppc4xx_sgdma.c1
-rw-r--r--arch/sh64/mach-cayman/iomap.c1
-rw-r--r--arch/xtensa/kernel/xtensa_ksyms.c1
-rw-r--r--arch/xtensa/platform-iss/setup.c1
-rw-r--r--drivers/atm/adummy.c1
-rw-r--r--drivers/char/hw_random/via-rng.c1
-rw-r--r--drivers/char/pcmcia/synclink_cs.c1
-rw-r--r--drivers/char/tpm/tpm.h1
-rw-r--r--drivers/char/watchdog/sc1200wdt.c1
-rw-r--r--drivers/char/watchdog/scx200_wdt.c2
-rw-r--r--drivers/i2c/busses/i2c-at91.c1
-rw-r--r--drivers/i2c/busses/i2c-mpc.c1
-rw-r--r--drivers/i2c/busses/i2c-pca-isa.c1
-rw-r--r--drivers/ieee1394/hosts.c1
-rw-r--r--drivers/infiniband/core/cm.c1
-rw-r--r--drivers/infiniband/core/iwcm.c1
-rw-r--r--drivers/infiniband/core/mad_priv.h1
-rw-r--r--drivers/infiniband/core/multicast.c1
-rw-r--r--drivers/infiniband/core/sa_query.c1
-rw-r--r--drivers/infiniband/core/user_mad.c1
-rw-r--r--drivers/infiniband/hw/ipath/ipath_fs.c1
-rw-r--r--drivers/infiniband/hw/ipath/ipath_layer.c1
-rw-r--r--drivers/infiniband/hw/ipath/ipath_stats.c2
-rw-r--r--drivers/infiniband/hw/ipath/ipath_sysfs.c1
-rw-r--r--drivers/infiniband/hw/mthca/mthca_memfree.h1
-rw-r--r--drivers/infiniband/ulp/ipoib/ipoib.h1
-rw-r--r--drivers/isdn/hisax/netjet.c1
-rw-r--r--drivers/isdn/hysdn/hysdn_proclog.c1
-rw-r--r--drivers/media/dvb/cinergyT2/cinergyT2.c2
-rw-r--r--drivers/media/video/adv7170.c1
-rw-r--r--drivers/media/video/adv7175.c1
-rw-r--r--drivers/media/video/bt819.c1
-rw-r--r--drivers/media/video/bt856.c1
-rw-r--r--drivers/media/video/bt866.c1
-rw-r--r--drivers/media/video/cx88/cx88-tvaudio.c1
-rw-r--r--drivers/media/video/em28xx/em28xx-cards.c1
-rw-r--r--drivers/media/video/saa7111.c1
-rw-r--r--drivers/media/video/saa7114.c1
-rw-r--r--drivers/media/video/saa711x.c1
-rw-r--r--drivers/media/video/saa7185.c1
-rw-r--r--drivers/misc/hdpuftrs/hdpu_cpustate.c1
-rw-r--r--drivers/misc/hdpuftrs/hdpu_nexus.c1
-rw-r--r--drivers/mtd/devices/doc2000.c1
-rw-r--r--drivers/mtd/devices/doc2001.c1
-rw-r--r--drivers/mtd/devices/doc2001plus.c1
-rw-r--r--drivers/mtd/devices/docecc.c1
-rw-r--r--drivers/mtd/inftlmount.c1
-rw-r--r--drivers/mtd/nand/cs553x_nand.c1
-rw-r--r--drivers/mtd/nftlcore.c1
-rw-r--r--drivers/net/atl1/atl1_param.c1
-rw-r--r--drivers/net/au1000_eth.c1
-rw-r--r--drivers/net/fec_8xx/fec_main.c1
-rw-r--r--drivers/net/fec_8xx/fec_mii.c1
-rw-r--r--drivers/net/fs_enet/fs_enet-main.c1
-rw-r--r--drivers/net/fs_enet/mac-fcc.c1
-rw-r--r--drivers/net/fs_enet/mac-fec.c1
-rw-r--r--drivers/net/fs_enet/mac-scc.c1
-rw-r--r--drivers/net/fs_enet/mii-bitbang.c1
-rw-r--r--drivers/net/fs_enet/mii-fec.c1
-rw-r--r--drivers/net/ibm_emac/ibm_emac_core.c1
-rw-r--r--drivers/net/ixgb/ixgb_osdep.h1
-rw-r--r--drivers/net/lasi_82596.c1
-rw-r--r--drivers/net/tokenring/madgemc.c1
-rw-r--r--drivers/net/tokenring/smctr.c1
-rw-r--r--drivers/net/tulip/21142.c1
-rw-r--r--drivers/net/tulip/pnic.c1
-rw-r--r--drivers/net/tulip/pnic2.c1
-rw-r--r--drivers/net/tulip/timer.c1
-rw-r--r--drivers/net/tulip/tulip.h1
-rw-r--r--drivers/net/wan/lmc/lmc_media.c1
-rw-r--r--drivers/net/wan/lmc/lmc_proto.c1
-rw-r--r--drivers/net/wan/pc300_tty.c1
-rw-r--r--drivers/parisc/hppb.c2
-rw-r--r--drivers/pcmcia/cs.c1
-rw-r--r--drivers/pcmcia/socket_sysfs.c1
-rw-r--r--drivers/sbus/sbus.c1
-rw-r--r--drivers/scsi/aacraid/dpcsup.c1
-rw-r--r--drivers/scsi/aacraid/sa.c1
-rw-r--r--drivers/scsi/aha1542.c1
-rw-r--r--drivers/scsi/aic94xx/aic94xx_scb.c1
-rw-r--r--drivers/scsi/arcmsr/arcmsr_attr.c1
-rw-r--r--drivers/scsi/libsas/sas_expander.c1
-rw-r--r--drivers/scsi/libsrp.c1
-rw-r--r--drivers/usb/net/kaweth.c1
-rw-r--r--drivers/video/aty/radeon_i2c.c1
-rw-r--r--drivers/video/g364fb.c1
-rw-r--r--drivers/video/platinumfb.c1
-rw-r--r--drivers/video/stifb.c1
-rw-r--r--drivers/video/valkyriefb.c1
-rw-r--r--include/asm-arm/arch-ixp4xx/dma.h1
-rw-r--r--include/rdma/ib_mad.h2
-rw-r--r--sound/core/init.c1
-rw-r--r--sound/oss/au1550_ac97.c1
-rw-r--r--sound/oss/soundcard.c1
-rw-r--r--sound/pci/ca0106/ca0106_mixer.c2
-rw-r--r--sound/pci/ca0106/ca0106_proc.c2
-rw-r--r--sound/pci/cs46xx/dsp_spos.c1
-rw-r--r--sound/pci/cs46xx/dsp_spos_scb_lib.c1
-rw-r--r--sound/pci/hda/hda_generic.c1
-rw-r--r--sound/pci/hda/hda_proc.c1
-rw-r--r--sound/pci/hda/patch_atihdmi.c1
-rw-r--r--sound/pci/hda/patch_si3054.c1
-rw-r--r--sound/pci/hda/patch_via.c1
116 files changed, 7 insertions, 117 deletions
diff --git a/arch/alpha/kernel/err_common.c b/arch/alpha/kernel/err_common.c
index 687580b16b41..13d53b1c9657 100644
--- a/arch/alpha/kernel/err_common.c
+++ b/arch/alpha/kernel/err_common.c
@@ -7,7 +7,6 @@
7 */ 7 */
8 8
9#include <linux/init.h> 9#include <linux/init.h>
10#include <linux/pci.h>
11#include <linux/sched.h> 10#include <linux/sched.h>
12 11
13#include <asm/io.h> 12#include <asm/io.h>
diff --git a/arch/alpha/kernel/err_ev6.c b/arch/alpha/kernel/err_ev6.c
index 69b5f4ea7355..11aee012a8ae 100644
--- a/arch/alpha/kernel/err_ev6.c
+++ b/arch/alpha/kernel/err_ev6.c
@@ -7,7 +7,6 @@
7 */ 7 */
8 8
9#include <linux/init.h> 9#include <linux/init.h>
10#include <linux/pci.h>
11#include <linux/sched.h> 10#include <linux/sched.h>
12 11
13#include <asm/io.h> 12#include <asm/io.h>
diff --git a/arch/alpha/kernel/err_ev7.c b/arch/alpha/kernel/err_ev7.c
index 95463ab1cf35..bc799f72d8c1 100644
--- a/arch/alpha/kernel/err_ev7.c
+++ b/arch/alpha/kernel/err_ev7.c
@@ -7,7 +7,6 @@
7 */ 7 */
8 8
9#include <linux/init.h> 9#include <linux/init.h>
10#include <linux/pci.h>
11#include <linux/sched.h> 10#include <linux/sched.h>
12 11
13#include <asm/io.h> 12#include <asm/io.h>
diff --git a/arch/i386/kernel/cpu/cpufreq/speedstep-lib.c b/arch/i386/kernel/cpu/cpufreq/speedstep-lib.c
index d59277c00911..b1acc8ce3167 100644
--- a/arch/i386/kernel/cpu/cpufreq/speedstep-lib.c
+++ b/arch/i386/kernel/cpu/cpufreq/speedstep-lib.c
@@ -13,7 +13,6 @@
13#include <linux/moduleparam.h> 13#include <linux/moduleparam.h>
14#include <linux/init.h> 14#include <linux/init.h>
15#include <linux/cpufreq.h> 15#include <linux/cpufreq.h>
16#include <linux/pci.h>
17#include <linux/slab.h> 16#include <linux/slab.h>
18 17
19#include <asm/msr.h> 18#include <asm/msr.h>
diff --git a/arch/i386/kernel/cpu/cpufreq/speedstep-smi.c b/arch/i386/kernel/cpu/cpufreq/speedstep-smi.c
index ff0d89806114..e1c509aa3054 100644
--- a/arch/i386/kernel/cpu/cpufreq/speedstep-smi.c
+++ b/arch/i386/kernel/cpu/cpufreq/speedstep-smi.c
@@ -17,10 +17,10 @@
17#include <linux/moduleparam.h> 17#include <linux/moduleparam.h>
18#include <linux/init.h> 18#include <linux/init.h>
19#include <linux/cpufreq.h> 19#include <linux/cpufreq.h>
20#include <linux/pci.h>
21#include <linux/slab.h> 20#include <linux/slab.h>
22#include <linux/delay.h> 21#include <linux/delay.h>
23#include <asm/ist.h> 22#include <asm/ist.h>
23#include <asm/io.h>
24 24
25#include "speedstep-lib.h" 25#include "speedstep-lib.h"
26 26
diff --git a/arch/ia64/sn/kernel/huberror.c b/arch/ia64/sn/kernel/huberror.c
index fcf7f93c4b61..2c3f9dfca78b 100644
--- a/arch/ia64/sn/kernel/huberror.c
+++ b/arch/ia64/sn/kernel/huberror.c
@@ -8,7 +8,6 @@
8 8
9#include <linux/types.h> 9#include <linux/types.h>
10#include <linux/interrupt.h> 10#include <linux/interrupt.h>
11#include <linux/pci.h>
12#include <asm/delay.h> 11#include <asm/delay.h>
13#include <asm/sn/sn_sal.h> 12#include <asm/sn/sn_sal.h>
14#include "ioerror.h" 13#include "ioerror.h"
diff --git a/arch/ia64/sn/kernel/xpnet.c b/arch/ia64/sn/kernel/xpnet.c
index 5419acb89a8c..88fad85ceeff 100644
--- a/arch/ia64/sn/kernel/xpnet.c
+++ b/arch/ia64/sn/kernel/xpnet.c
@@ -24,7 +24,6 @@
24 24
25#include <linux/module.h> 25#include <linux/module.h>
26#include <linux/kernel.h> 26#include <linux/kernel.h>
27#include <linux/pci.h>
28#include <linux/init.h> 27#include <linux/init.h>
29#include <linux/ioport.h> 28#include <linux/ioport.h>
30#include <linux/netdevice.h> 29#include <linux/netdevice.h>
diff --git a/arch/m68knommu/kernel/dma.c b/arch/m68knommu/kernel/dma.c
index 14b19c4161f4..0a25874a2aae 100644
--- a/arch/m68knommu/kernel/dma.c
+++ b/arch/m68knommu/kernel/dma.c
@@ -8,7 +8,6 @@
8#include <linux/types.h> 8#include <linux/types.h>
9#include <linux/mm.h> 9#include <linux/mm.h>
10#include <linux/string.h> 10#include <linux/string.h>
11#include <linux/pci.h>
12#include <asm/io.h> 11#include <asm/io.h>
13 12
14void *dma_alloc_coherent(struct device *dev, size_t size, 13void *dma_alloc_coherent(struct device *dev, size_t size,
diff --git a/arch/mips/lib/iomap.c b/arch/mips/lib/iomap.c
index d51d5cb0a4a9..e3acb2dad33a 100644
--- a/arch/mips/lib/iomap.c
+++ b/arch/mips/lib/iomap.c
@@ -6,7 +6,6 @@
6 * (C) Copyright 2007 MIPS Technologies, Inc. 6 * (C) Copyright 2007 MIPS Technologies, Inc.
7 * written by Ralf Baechle <ralf@linux-mips.org> 7 * written by Ralf Baechle <ralf@linux-mips.org>
8 */ 8 */
9#include <linux/pci.h>
10#include <linux/module.h> 9#include <linux/module.h>
11#include <asm/io.h> 10#include <asm/io.h>
12 11
diff --git a/arch/powerpc/platforms/pseries/ras.c b/arch/powerpc/platforms/pseries/ras.c
index 53aa04101ced..3a393c7f390e 100644
--- a/arch/powerpc/platforms/pseries/ras.c
+++ b/arch/powerpc/platforms/pseries/ras.c
@@ -31,7 +31,6 @@
31#include <linux/timex.h> 31#include <linux/timex.h>
32#include <linux/init.h> 32#include <linux/init.h>
33#include <linux/slab.h> 33#include <linux/slab.h>
34#include <linux/pci.h>
35#include <linux/delay.h> 34#include <linux/delay.h>
36#include <linux/irq.h> 35#include <linux/irq.h>
37#include <linux/random.h> 36#include <linux/random.h>
diff --git a/arch/ppc/8260_io/enet.c b/arch/ppc/8260_io/enet.c
index 48ce84f5be93..4c0a7d732f69 100644
--- a/arch/ppc/8260_io/enet.c
+++ b/arch/ppc/8260_io/enet.c
@@ -32,7 +32,6 @@
32#include <linux/ioport.h> 32#include <linux/ioport.h>
33#include <linux/slab.h> 33#include <linux/slab.h>
34#include <linux/interrupt.h> 34#include <linux/interrupt.h>
35#include <linux/pci.h>
36#include <linux/init.h> 35#include <linux/init.h>
37#include <linux/delay.h> 36#include <linux/delay.h>
38#include <linux/netdevice.h> 37#include <linux/netdevice.h>
diff --git a/arch/ppc/8260_io/fcc_enet.c b/arch/ppc/8260_io/fcc_enet.c
index 9db825fe37f0..cab395da25da 100644
--- a/arch/ppc/8260_io/fcc_enet.c
+++ b/arch/ppc/8260_io/fcc_enet.c
@@ -29,7 +29,6 @@
29#include <linux/ioport.h> 29#include <linux/ioport.h>
30#include <linux/slab.h> 30#include <linux/slab.h>
31#include <linux/interrupt.h> 31#include <linux/interrupt.h>
32#include <linux/pci.h>
33#include <linux/init.h> 32#include <linux/init.h>
34#include <linux/delay.h> 33#include <linux/delay.h>
35#include <linux/netdevice.h> 34#include <linux/netdevice.h>
diff --git a/arch/ppc/8xx_io/enet.c b/arch/ppc/8xx_io/enet.c
index bfa3f52996d1..e58288e14369 100644
--- a/arch/ppc/8xx_io/enet.c
+++ b/arch/ppc/8xx_io/enet.c
@@ -30,7 +30,6 @@
30#include <linux/ioport.h> 30#include <linux/ioport.h>
31#include <linux/slab.h> 31#include <linux/slab.h>
32#include <linux/interrupt.h> 32#include <linux/interrupt.h>
33#include <linux/pci.h>
34#include <linux/init.h> 33#include <linux/init.h>
35#include <linux/delay.h> 34#include <linux/delay.h>
36#include <linux/netdevice.h> 35#include <linux/netdevice.h>
diff --git a/arch/ppc/syslib/ppc4xx_sgdma.c b/arch/ppc/syslib/ppc4xx_sgdma.c
index 939abe3c1f45..5dadca3e0d61 100644
--- a/arch/ppc/syslib/ppc4xx_sgdma.c
+++ b/arch/ppc/syslib/ppc4xx_sgdma.c
@@ -23,7 +23,6 @@
23#include <linux/mm.h> 23#include <linux/mm.h>
24#include <linux/init.h> 24#include <linux/init.h>
25#include <linux/module.h> 25#include <linux/module.h>
26#include <linux/pci.h>
27 26
28#include <asm/system.h> 27#include <asm/system.h>
29#include <asm/io.h> 28#include <asm/io.h>
diff --git a/arch/sh64/mach-cayman/iomap.c b/arch/sh64/mach-cayman/iomap.c
index 2d06e9a55137..a5c645f02d57 100644
--- a/arch/sh64/mach-cayman/iomap.c
+++ b/arch/sh64/mach-cayman/iomap.c
@@ -9,7 +9,6 @@
9 * License. See the file "COPYING" in the main directory of this archive 9 * License. See the file "COPYING" in the main directory of this archive
10 * for more details. 10 * for more details.
11 */ 11 */
12#include <linux/pci.h>
13#include <asm/io.h> 12#include <asm/io.h>
14#include <asm/cayman.h> 13#include <asm/cayman.h>
15 14
diff --git a/arch/xtensa/kernel/xtensa_ksyms.c b/arch/xtensa/kernel/xtensa_ksyms.c
index 0b4cb93db5a3..cd7e6a020602 100644
--- a/arch/xtensa/kernel/xtensa_ksyms.c
+++ b/arch/xtensa/kernel/xtensa_ksyms.c
@@ -18,7 +18,6 @@
18#include <linux/interrupt.h> 18#include <linux/interrupt.h>
19#include <asm/irq.h> 19#include <asm/irq.h>
20#include <linux/in6.h> 20#include <linux/in6.h>
21#include <linux/pci.h>
22#include <linux/ide.h> 21#include <linux/ide.h>
23 22
24#include <asm/uaccess.h> 23#include <asm/uaccess.h>
diff --git a/arch/xtensa/platform-iss/setup.c b/arch/xtensa/platform-iss/setup.c
index c8a42b60c57a..f60c8cf6dfbe 100644
--- a/arch/xtensa/platform-iss/setup.c
+++ b/arch/xtensa/platform-iss/setup.c
@@ -20,7 +20,6 @@
20#include <linux/init.h> 20#include <linux/init.h>
21#include <linux/errno.h> 21#include <linux/errno.h>
22#include <linux/reboot.h> 22#include <linux/reboot.h>
23#include <linux/pci.h>
24#include <linux/kdev_t.h> 23#include <linux/kdev_t.h>
25#include <linux/types.h> 24#include <linux/types.h>
26#include <linux/major.h> 25#include <linux/major.h>
diff --git a/drivers/atm/adummy.c b/drivers/atm/adummy.c
index 8d60c4eb54fe..2ebd07f2ef81 100644
--- a/drivers/atm/adummy.c
+++ b/drivers/atm/adummy.c
@@ -6,7 +6,6 @@
6#include <linux/version.h> 6#include <linux/version.h>
7#include <linux/kernel.h> 7#include <linux/kernel.h>
8#include <linux/skbuff.h> 8#include <linux/skbuff.h>
9#include <linux/pci.h>
10#include <linux/errno.h> 9#include <linux/errno.h>
11#include <linux/types.h> 10#include <linux/types.h>
12#include <linux/string.h> 11#include <linux/string.h>
diff --git a/drivers/char/hw_random/via-rng.c b/drivers/char/hw_random/via-rng.c
index 9ebf84d18655..ec435cb25c4f 100644
--- a/drivers/char/hw_random/via-rng.c
+++ b/drivers/char/hw_random/via-rng.c
@@ -26,7 +26,6 @@
26 26
27#include <linux/module.h> 27#include <linux/module.h>
28#include <linux/kernel.h> 28#include <linux/kernel.h>
29#include <linux/pci.h>
30#include <linux/hw_random.h> 29#include <linux/hw_random.h>
31#include <asm/io.h> 30#include <asm/io.h>
32#include <asm/msr.h> 31#include <asm/msr.h>
diff --git a/drivers/char/pcmcia/synclink_cs.c b/drivers/char/pcmcia/synclink_cs.c
index 157b1d09ab55..13808f6083a0 100644
--- a/drivers/char/pcmcia/synclink_cs.c
+++ b/drivers/char/pcmcia/synclink_cs.c
@@ -42,7 +42,6 @@
42#include <linux/timer.h> 42#include <linux/timer.h>
43#include <linux/time.h> 43#include <linux/time.h>
44#include <linux/interrupt.h> 44#include <linux/interrupt.h>
45#include <linux/pci.h>
46#include <linux/tty.h> 45#include <linux/tty.h>
47#include <linux/tty_flip.h> 46#include <linux/tty_flip.h>
48#include <linux/serial.h> 47#include <linux/serial.h>
diff --git a/drivers/char/tpm/tpm.h b/drivers/char/tpm/tpm.h
index bb9a43c6cf3d..9f273f032b0f 100644
--- a/drivers/char/tpm/tpm.h
+++ b/drivers/char/tpm/tpm.h
@@ -19,7 +19,6 @@
19 * 19 *
20 */ 20 */
21#include <linux/module.h> 21#include <linux/module.h>
22#include <linux/pci.h>
23#include <linux/delay.h> 22#include <linux/delay.h>
24#include <linux/fs.h> 23#include <linux/fs.h>
25#include <linux/sched.h> 24#include <linux/sched.h>
diff --git a/drivers/char/watchdog/sc1200wdt.c b/drivers/char/watchdog/sc1200wdt.c
index 1e4a8d751a71..2f7ba7a514fe 100644
--- a/drivers/char/watchdog/sc1200wdt.c
+++ b/drivers/char/watchdog/sc1200wdt.c
@@ -38,7 +38,6 @@
38#include <linux/init.h> 38#include <linux/init.h>
39#include <linux/pnp.h> 39#include <linux/pnp.h>
40#include <linux/fs.h> 40#include <linux/fs.h>
41#include <linux/pci.h>
42 41
43#include <asm/semaphore.h> 42#include <asm/semaphore.h>
44#include <asm/io.h> 43#include <asm/io.h>
diff --git a/drivers/char/watchdog/scx200_wdt.c b/drivers/char/watchdog/scx200_wdt.c
index fc0e0347f9d2..d4fd0fa2f176 100644
--- a/drivers/char/watchdog/scx200_wdt.c
+++ b/drivers/char/watchdog/scx200_wdt.c
@@ -25,7 +25,7 @@
25#include <linux/notifier.h> 25#include <linux/notifier.h>
26#include <linux/reboot.h> 26#include <linux/reboot.h>
27#include <linux/fs.h> 27#include <linux/fs.h>
28#include <linux/pci.h> 28#include <linux/ioport.h>
29#include <linux/scx200.h> 29#include <linux/scx200.h>
30 30
31#include <asm/uaccess.h> 31#include <asm/uaccess.h>
diff --git a/drivers/i2c/busses/i2c-at91.c b/drivers/i2c/busses/i2c-at91.c
index 67f91bdda089..f35156c58922 100644
--- a/drivers/i2c/busses/i2c-at91.c
+++ b/drivers/i2c/busses/i2c-at91.c
@@ -17,7 +17,6 @@
17#include <linux/version.h> 17#include <linux/version.h>
18#include <linux/kernel.h> 18#include <linux/kernel.h>
19#include <linux/slab.h> 19#include <linux/slab.h>
20#include <linux/pci.h>
21#include <linux/types.h> 20#include <linux/types.h>
22#include <linux/delay.h> 21#include <linux/delay.h>
23#include <linux/i2c.h> 22#include <linux/i2c.h>
diff --git a/drivers/i2c/busses/i2c-mpc.c b/drivers/i2c/busses/i2c-mpc.c
index ee65aa1be13a..c6b6898592b1 100644
--- a/drivers/i2c/busses/i2c-mpc.c
+++ b/drivers/i2c/busses/i2c-mpc.c
@@ -17,7 +17,6 @@
17#include <linux/module.h> 17#include <linux/module.h>
18#include <linux/sched.h> 18#include <linux/sched.h>
19#include <linux/init.h> 19#include <linux/init.h>
20#include <linux/pci.h>
21#include <linux/platform_device.h> 20#include <linux/platform_device.h>
22 21
23#include <asm/io.h> 22#include <asm/io.h>
diff --git a/drivers/i2c/busses/i2c-pca-isa.c b/drivers/i2c/busses/i2c-pca-isa.c
index cc6536a19eca..6b03e0d0a8e3 100644
--- a/drivers/i2c/busses/i2c-pca-isa.c
+++ b/drivers/i2c/busses/i2c-pca-isa.c
@@ -25,7 +25,6 @@
25#include <linux/slab.h> 25#include <linux/slab.h>
26#include <linux/init.h> 26#include <linux/init.h>
27#include <linux/interrupt.h> 27#include <linux/interrupt.h>
28#include <linux/pci.h>
29#include <linux/wait.h> 28#include <linux/wait.h>
30 29
31#include <linux/i2c.h> 30#include <linux/i2c.h>
diff --git a/drivers/ieee1394/hosts.c b/drivers/ieee1394/hosts.c
index 6164a9a83396..bd0755c789c5 100644
--- a/drivers/ieee1394/hosts.c
+++ b/drivers/ieee1394/hosts.c
@@ -15,7 +15,6 @@
15#include <linux/list.h> 15#include <linux/list.h>
16#include <linux/init.h> 16#include <linux/init.h>
17#include <linux/slab.h> 17#include <linux/slab.h>
18#include <linux/pci.h>
19#include <linux/timer.h> 18#include <linux/timer.h>
20#include <linux/jiffies.h> 19#include <linux/jiffies.h>
21#include <linux/mutex.h> 20#include <linux/mutex.h>
diff --git a/drivers/infiniband/core/cm.c b/drivers/infiniband/core/cm.c
index 842cd0b53e91..eff591deeb46 100644
--- a/drivers/infiniband/core/cm.c
+++ b/drivers/infiniband/core/cm.c
@@ -40,7 +40,6 @@
40#include <linux/err.h> 40#include <linux/err.h>
41#include <linux/idr.h> 41#include <linux/idr.h>
42#include <linux/interrupt.h> 42#include <linux/interrupt.h>
43#include <linux/pci.h>
44#include <linux/random.h> 43#include <linux/random.h>
45#include <linux/rbtree.h> 44#include <linux/rbtree.h>
46#include <linux/spinlock.h> 45#include <linux/spinlock.h>
diff --git a/drivers/infiniband/core/iwcm.c b/drivers/infiniband/core/iwcm.c
index 891d1fa7b2eb..223b1aa7d92b 100644
--- a/drivers/infiniband/core/iwcm.c
+++ b/drivers/infiniband/core/iwcm.c
@@ -39,7 +39,6 @@
39#include <linux/err.h> 39#include <linux/err.h>
40#include <linux/idr.h> 40#include <linux/idr.h>
41#include <linux/interrupt.h> 41#include <linux/interrupt.h>
42#include <linux/pci.h>
43#include <linux/rbtree.h> 42#include <linux/rbtree.h>
44#include <linux/spinlock.h> 43#include <linux/spinlock.h>
45#include <linux/workqueue.h> 44#include <linux/workqueue.h>
diff --git a/drivers/infiniband/core/mad_priv.h b/drivers/infiniband/core/mad_priv.h
index de89717f49fe..9be5cc00a3a9 100644
--- a/drivers/infiniband/core/mad_priv.h
+++ b/drivers/infiniband/core/mad_priv.h
@@ -39,7 +39,6 @@
39 39
40#include <linux/completion.h> 40#include <linux/completion.h>
41#include <linux/err.h> 41#include <linux/err.h>
42#include <linux/pci.h>
43#include <linux/workqueue.h> 42#include <linux/workqueue.h>
44#include <rdma/ib_mad.h> 43#include <rdma/ib_mad.h>
45#include <rdma/ib_smi.h> 44#include <rdma/ib_smi.h>
diff --git a/drivers/infiniband/core/multicast.c b/drivers/infiniband/core/multicast.c
index 4a579b3a1c90..1e13ab42b70b 100644
--- a/drivers/infiniband/core/multicast.c
+++ b/drivers/infiniband/core/multicast.c
@@ -34,7 +34,6 @@
34#include <linux/dma-mapping.h> 34#include <linux/dma-mapping.h>
35#include <linux/err.h> 35#include <linux/err.h>
36#include <linux/interrupt.h> 36#include <linux/interrupt.h>
37#include <linux/pci.h>
38#include <linux/bitops.h> 37#include <linux/bitops.h>
39#include <linux/random.h> 38#include <linux/random.h>
40 39
diff --git a/drivers/infiniband/core/sa_query.c b/drivers/infiniband/core/sa_query.c
index 9a7eaadb1688..6469406ea9d8 100644
--- a/drivers/infiniband/core/sa_query.c
+++ b/drivers/infiniband/core/sa_query.c
@@ -40,7 +40,6 @@
40#include <linux/random.h> 40#include <linux/random.h>
41#include <linux/spinlock.h> 41#include <linux/spinlock.h>
42#include <linux/slab.h> 42#include <linux/slab.h>
43#include <linux/pci.h>
44#include <linux/dma-mapping.h> 43#include <linux/dma-mapping.h>
45#include <linux/kref.h> 44#include <linux/kref.h>
46#include <linux/idr.h> 45#include <linux/idr.h>
diff --git a/drivers/infiniband/core/user_mad.c b/drivers/infiniband/core/user_mad.c
index 8199b83052a9..d97ded25c4ff 100644
--- a/drivers/infiniband/core/user_mad.c
+++ b/drivers/infiniband/core/user_mad.c
@@ -40,7 +40,6 @@
40#include <linux/err.h> 40#include <linux/err.h>
41#include <linux/fs.h> 41#include <linux/fs.h>
42#include <linux/cdev.h> 42#include <linux/cdev.h>
43#include <linux/pci.h>
44#include <linux/dma-mapping.h> 43#include <linux/dma-mapping.h>
45#include <linux/poll.h> 44#include <linux/poll.h>
46#include <linux/rwsem.h> 45#include <linux/rwsem.h>
diff --git a/drivers/infiniband/hw/ipath/ipath_fs.c b/drivers/infiniband/hw/ipath/ipath_fs.c
index ed55979bfd34..036ed1ef1796 100644
--- a/drivers/infiniband/hw/ipath/ipath_fs.c
+++ b/drivers/infiniband/hw/ipath/ipath_fs.c
@@ -38,7 +38,6 @@
38#include <linux/pagemap.h> 38#include <linux/pagemap.h>
39#include <linux/init.h> 39#include <linux/init.h>
40#include <linux/namei.h> 40#include <linux/namei.h>
41#include <linux/pci.h>
42 41
43#include "ipath_kernel.h" 42#include "ipath_kernel.h"
44 43
diff --git a/drivers/infiniband/hw/ipath/ipath_layer.c b/drivers/infiniband/hw/ipath/ipath_layer.c
index e46aa4ed2a7e..05a1d2b01d9d 100644
--- a/drivers/infiniband/hw/ipath/ipath_layer.c
+++ b/drivers/infiniband/hw/ipath/ipath_layer.c
@@ -37,7 +37,6 @@
37 */ 37 */
38 38
39#include <linux/io.h> 39#include <linux/io.h>
40#include <linux/pci.h>
41#include <asm/byteorder.h> 40#include <asm/byteorder.h>
42 41
43#include "ipath_kernel.h" 42#include "ipath_kernel.h"
diff --git a/drivers/infiniband/hw/ipath/ipath_stats.c b/drivers/infiniband/hw/ipath/ipath_stats.c
index 9307f7187ca5..d8b5e4cefe25 100644
--- a/drivers/infiniband/hw/ipath/ipath_stats.c
+++ b/drivers/infiniband/hw/ipath/ipath_stats.c
@@ -31,8 +31,6 @@
31 * SOFTWARE. 31 * SOFTWARE.
32 */ 32 */
33 33
34#include <linux/pci.h>
35
36#include "ipath_kernel.h" 34#include "ipath_kernel.h"
37 35
38struct infinipath_stats ipath_stats; 36struct infinipath_stats ipath_stats;
diff --git a/drivers/infiniband/hw/ipath/ipath_sysfs.c b/drivers/infiniband/hw/ipath/ipath_sysfs.c
index ffa6318ad0cc..4dc398d5e011 100644
--- a/drivers/infiniband/hw/ipath/ipath_sysfs.c
+++ b/drivers/infiniband/hw/ipath/ipath_sysfs.c
@@ -32,7 +32,6 @@
32 */ 32 */
33 33
34#include <linux/ctype.h> 34#include <linux/ctype.h>
35#include <linux/pci.h>
36 35
37#include "ipath_kernel.h" 36#include "ipath_kernel.h"
38#include "ipath_common.h" 37#include "ipath_common.h"
diff --git a/drivers/infiniband/hw/mthca/mthca_memfree.h b/drivers/infiniband/hw/mthca/mthca_memfree.h
index 594144145f45..a1ab06847b75 100644
--- a/drivers/infiniband/hw/mthca/mthca_memfree.h
+++ b/drivers/infiniband/hw/mthca/mthca_memfree.h
@@ -38,7 +38,6 @@
38#define MTHCA_MEMFREE_H 38#define MTHCA_MEMFREE_H
39 39
40#include <linux/list.h> 40#include <linux/list.h>
41#include <linux/pci.h>
42#include <linux/mutex.h> 41#include <linux/mutex.h>
43 42
44#define MTHCA_ICM_CHUNK_LEN \ 43#define MTHCA_ICM_CHUNK_LEN \
diff --git a/drivers/infiniband/ulp/ipoib/ipoib.h b/drivers/infiniband/ulp/ipoib/ipoib.h
index fd558267d1cb..d8f6bb4f53fc 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib.h
+++ b/drivers/infiniband/ulp/ipoib/ipoib.h
@@ -41,7 +41,6 @@
41#include <linux/skbuff.h> 41#include <linux/skbuff.h>
42#include <linux/netdevice.h> 42#include <linux/netdevice.h>
43#include <linux/workqueue.h> 43#include <linux/workqueue.h>
44#include <linux/pci.h>
45#include <linux/kref.h> 44#include <linux/kref.h>
46#include <linux/if_infiniband.h> 45#include <linux/if_infiniband.h>
47#include <linux/mutex.h> 46#include <linux/mutex.h>
diff --git a/drivers/isdn/hisax/netjet.c b/drivers/isdn/hisax/netjet.c
index 38f648f9b0ed..02c6fbaeccf8 100644
--- a/drivers/isdn/hisax/netjet.c
+++ b/drivers/isdn/hisax/netjet.c
@@ -19,7 +19,6 @@
19#include "isac.h" 19#include "isac.h"
20#include "hscx.h" 20#include "hscx.h"
21#include "isdnl1.h" 21#include "isdnl1.h"
22#include <linux/pci.h>
23#include <linux/interrupt.h> 22#include <linux/interrupt.h>
24#include <linux/ppp_defs.h> 23#include <linux/ppp_defs.h>
25#include <asm/io.h> 24#include <asm/io.h>
diff --git a/drivers/isdn/hysdn/hysdn_proclog.c b/drivers/isdn/hysdn/hysdn_proclog.c
index f7e83a86f444..4c7dedac0e51 100644
--- a/drivers/isdn/hysdn/hysdn_proclog.c
+++ b/drivers/isdn/hysdn/hysdn_proclog.c
@@ -13,7 +13,6 @@
13#include <linux/module.h> 13#include <linux/module.h>
14#include <linux/poll.h> 14#include <linux/poll.h>
15#include <linux/proc_fs.h> 15#include <linux/proc_fs.h>
16#include <linux/pci.h>
17#include <linux/smp_lock.h> 16#include <linux/smp_lock.h>
18 17
19#include "hysdn_defs.h" 18#include "hysdn_defs.h"
diff --git a/drivers/media/dvb/cinergyT2/cinergyT2.c b/drivers/media/dvb/cinergyT2/cinergyT2.c
index a6cbbdd262d6..34d7abc900d7 100644
--- a/drivers/media/dvb/cinergyT2/cinergyT2.c
+++ b/drivers/media/dvb/cinergyT2/cinergyT2.c
@@ -26,11 +26,11 @@
26#include <linux/module.h> 26#include <linux/module.h>
27#include <linux/slab.h> 27#include <linux/slab.h>
28#include <linux/usb.h> 28#include <linux/usb.h>
29#include <linux/pci.h>
30#include <linux/input.h> 29#include <linux/input.h>
31#include <linux/dvb/frontend.h> 30#include <linux/dvb/frontend.h>
32#include <linux/mutex.h> 31#include <linux/mutex.h>
33#include <linux/mm.h> 32#include <linux/mm.h>
33#include <asm/io.h>
34 34
35#include "dmxdev.h" 35#include "dmxdev.h"
36#include "dvb_demux.h" 36#include "dvb_demux.h"
diff --git a/drivers/media/video/adv7170.c b/drivers/media/video/adv7170.c
index 2aa9ce920607..823cd6cc471e 100644
--- a/drivers/media/video/adv7170.c
+++ b/drivers/media/video/adv7170.c
@@ -37,7 +37,6 @@
37#include <linux/major.h> 37#include <linux/major.h>
38#include <linux/slab.h> 38#include <linux/slab.h>
39#include <linux/mm.h> 39#include <linux/mm.h>
40#include <linux/pci.h>
41#include <linux/signal.h> 40#include <linux/signal.h>
42#include <asm/io.h> 41#include <asm/io.h>
43#include <asm/pgtable.h> 42#include <asm/pgtable.h>
diff --git a/drivers/media/video/adv7175.c b/drivers/media/video/adv7175.c
index a3246a283aa4..05c7820fe53e 100644
--- a/drivers/media/video/adv7175.c
+++ b/drivers/media/video/adv7175.c
@@ -33,7 +33,6 @@
33#include <linux/major.h> 33#include <linux/major.h>
34#include <linux/slab.h> 34#include <linux/slab.h>
35#include <linux/mm.h> 35#include <linux/mm.h>
36#include <linux/pci.h>
37#include <linux/signal.h> 36#include <linux/signal.h>
38#include <asm/io.h> 37#include <asm/io.h>
39#include <asm/pgtable.h> 38#include <asm/pgtable.h>
diff --git a/drivers/media/video/bt819.c b/drivers/media/video/bt819.c
index 68673863d5c9..59a43603b5cb 100644
--- a/drivers/media/video/bt819.c
+++ b/drivers/media/video/bt819.c
@@ -37,7 +37,6 @@
37#include <linux/major.h> 37#include <linux/major.h>
38#include <linux/slab.h> 38#include <linux/slab.h>
39#include <linux/mm.h> 39#include <linux/mm.h>
40#include <linux/pci.h>
41#include <linux/signal.h> 40#include <linux/signal.h>
42#include <asm/io.h> 41#include <asm/io.h>
43#include <asm/pgtable.h> 42#include <asm/pgtable.h>
diff --git a/drivers/media/video/bt856.c b/drivers/media/video/bt856.c
index 42e2299dcb22..853b1a3d6a1d 100644
--- a/drivers/media/video/bt856.c
+++ b/drivers/media/video/bt856.c
@@ -37,7 +37,6 @@
37#include <linux/major.h> 37#include <linux/major.h>
38#include <linux/slab.h> 38#include <linux/slab.h>
39#include <linux/mm.h> 39#include <linux/mm.h>
40#include <linux/pci.h>
41#include <linux/signal.h> 40#include <linux/signal.h>
42#include <asm/io.h> 41#include <asm/io.h>
43#include <asm/pgtable.h> 42#include <asm/pgtable.h>
diff --git a/drivers/media/video/bt866.c b/drivers/media/video/bt866.c
index 772fd52d551a..2e4cf1efdd21 100644
--- a/drivers/media/video/bt866.c
+++ b/drivers/media/video/bt866.c
@@ -37,7 +37,6 @@
37#include <linux/major.h> 37#include <linux/major.h>
38#include <linux/slab.h> 38#include <linux/slab.h>
39#include <linux/mm.h> 39#include <linux/mm.h>
40#include <linux/pci.h>
41#include <linux/signal.h> 40#include <linux/signal.h>
42#include <asm/io.h> 41#include <asm/io.h>
43#include <asm/pgtable.h> 42#include <asm/pgtable.h>
diff --git a/drivers/media/video/cx88/cx88-tvaudio.c b/drivers/media/video/cx88/cx88-tvaudio.c
index 97ef421dd093..e627062fde3a 100644
--- a/drivers/media/video/cx88/cx88-tvaudio.c
+++ b/drivers/media/video/cx88/cx88-tvaudio.c
@@ -43,7 +43,6 @@
43#include <linux/slab.h> 43#include <linux/slab.h>
44#include <linux/mm.h> 44#include <linux/mm.h>
45#include <linux/poll.h> 45#include <linux/poll.h>
46#include <linux/pci.h>
47#include <linux/signal.h> 46#include <linux/signal.h>
48#include <linux/ioport.h> 47#include <linux/ioport.h>
49#include <linux/types.h> 48#include <linux/types.h>
diff --git a/drivers/media/video/em28xx/em28xx-cards.c b/drivers/media/video/em28xx/em28xx-cards.c
index ed882ebc7b95..418ea8b7f85a 100644
--- a/drivers/media/video/em28xx/em28xx-cards.c
+++ b/drivers/media/video/em28xx/em28xx-cards.c
@@ -23,7 +23,6 @@
23 23
24#include <linux/init.h> 24#include <linux/init.h>
25#include <linux/module.h> 25#include <linux/module.h>
26#include <linux/pci.h>
27#include <linux/delay.h> 26#include <linux/delay.h>
28#include <linux/i2c.h> 27#include <linux/i2c.h>
29#include <linux/usb.h> 28#include <linux/usb.h>
diff --git a/drivers/media/video/saa7111.c b/drivers/media/video/saa7111.c
index 44dc7479119c..74839f98b7c4 100644
--- a/drivers/media/video/saa7111.c
+++ b/drivers/media/video/saa7111.c
@@ -36,7 +36,6 @@
36#include <linux/major.h> 36#include <linux/major.h>
37#include <linux/slab.h> 37#include <linux/slab.h>
38#include <linux/mm.h> 38#include <linux/mm.h>
39#include <linux/pci.h>
40#include <linux/signal.h> 39#include <linux/signal.h>
41#include <asm/io.h> 40#include <asm/io.h>
42#include <asm/pgtable.h> 41#include <asm/pgtable.h>
diff --git a/drivers/media/video/saa7114.c b/drivers/media/video/saa7114.c
index 2ce3321ab995..87c3144ec7fc 100644
--- a/drivers/media/video/saa7114.c
+++ b/drivers/media/video/saa7114.c
@@ -39,7 +39,6 @@
39#include <linux/slab.h> 39#include <linux/slab.h>
40 40
41#include <linux/mm.h> 41#include <linux/mm.h>
42#include <linux/pci.h>
43#include <linux/signal.h> 42#include <linux/signal.h>
44#include <asm/io.h> 43#include <asm/io.h>
45#include <asm/pgtable.h> 44#include <asm/pgtable.h>
diff --git a/drivers/media/video/saa711x.c b/drivers/media/video/saa711x.c
index 269d7114a93a..80bf91187856 100644
--- a/drivers/media/video/saa711x.c
+++ b/drivers/media/video/saa711x.c
@@ -30,7 +30,6 @@
30#include <linux/major.h> 30#include <linux/major.h>
31#include <linux/slab.h> 31#include <linux/slab.h>
32#include <linux/mm.h> 32#include <linux/mm.h>
33#include <linux/pci.h>
34#include <linux/signal.h> 33#include <linux/signal.h>
35#include <asm/io.h> 34#include <asm/io.h>
36#include <asm/pgtable.h> 35#include <asm/pgtable.h>
diff --git a/drivers/media/video/saa7185.c b/drivers/media/video/saa7185.c
index e0fdb1ab7580..339592e7722d 100644
--- a/drivers/media/video/saa7185.c
+++ b/drivers/media/video/saa7185.c
@@ -33,7 +33,6 @@
33#include <linux/major.h> 33#include <linux/major.h>
34#include <linux/slab.h> 34#include <linux/slab.h>
35#include <linux/mm.h> 35#include <linux/mm.h>
36#include <linux/pci.h>
37#include <linux/signal.h> 36#include <linux/signal.h>
38#include <asm/io.h> 37#include <asm/io.h>
39#include <asm/pgtable.h> 38#include <asm/pgtable.h>
diff --git a/drivers/misc/hdpuftrs/hdpu_cpustate.c b/drivers/misc/hdpuftrs/hdpu_cpustate.c
index ca86f113f36a..276ba3c5143f 100644
--- a/drivers/misc/hdpuftrs/hdpu_cpustate.c
+++ b/drivers/misc/hdpuftrs/hdpu_cpustate.c
@@ -18,7 +18,6 @@
18#include <linux/kernel.h> 18#include <linux/kernel.h>
19#include <linux/spinlock.h> 19#include <linux/spinlock.h>
20#include <linux/miscdevice.h> 20#include <linux/miscdevice.h>
21#include <linux/pci.h>
22#include <linux/proc_fs.h> 21#include <linux/proc_fs.h>
23#include <linux/platform_device.h> 22#include <linux/platform_device.h>
24#include <asm/uaccess.h> 23#include <asm/uaccess.h>
diff --git a/drivers/misc/hdpuftrs/hdpu_nexus.c b/drivers/misc/hdpuftrs/hdpu_nexus.c
index 6a51e99a8079..60c8b26f0678 100644
--- a/drivers/misc/hdpuftrs/hdpu_nexus.c
+++ b/drivers/misc/hdpuftrs/hdpu_nexus.c
@@ -18,7 +18,6 @@
18#include <linux/kernel.h> 18#include <linux/kernel.h>
19#include <linux/proc_fs.h> 19#include <linux/proc_fs.h>
20#include <linux/hdpu_features.h> 20#include <linux/hdpu_features.h>
21#include <linux/pci.h>
22 21
23#include <linux/platform_device.h> 22#include <linux/platform_device.h>
24 23
diff --git a/drivers/mtd/devices/doc2000.c b/drivers/mtd/devices/doc2000.c
index 8a0c4dec6351..c73e96bfafc6 100644
--- a/drivers/mtd/devices/doc2000.c
+++ b/drivers/mtd/devices/doc2000.c
@@ -13,7 +13,6 @@
13#include <asm/io.h> 13#include <asm/io.h>
14#include <asm/uaccess.h> 14#include <asm/uaccess.h>
15#include <linux/miscdevice.h> 15#include <linux/miscdevice.h>
16#include <linux/pci.h>
17#include <linux/delay.h> 16#include <linux/delay.h>
18#include <linux/slab.h> 17#include <linux/slab.h>
19#include <linux/sched.h> 18#include <linux/sched.h>
diff --git a/drivers/mtd/devices/doc2001.c b/drivers/mtd/devices/doc2001.c
index 6f368aec5d5d..6413efc045e0 100644
--- a/drivers/mtd/devices/doc2001.c
+++ b/drivers/mtd/devices/doc2001.c
@@ -13,7 +13,6 @@
13#include <asm/io.h> 13#include <asm/io.h>
14#include <asm/uaccess.h> 14#include <asm/uaccess.h>
15#include <linux/miscdevice.h> 15#include <linux/miscdevice.h>
16#include <linux/pci.h>
17#include <linux/delay.h> 16#include <linux/delay.h>
18#include <linux/slab.h> 17#include <linux/slab.h>
19#include <linux/init.h> 18#include <linux/init.h>
diff --git a/drivers/mtd/devices/doc2001plus.c b/drivers/mtd/devices/doc2001plus.c
index 88ba82df0fbb..2b30b587c6e8 100644
--- a/drivers/mtd/devices/doc2001plus.c
+++ b/drivers/mtd/devices/doc2001plus.c
@@ -17,7 +17,6 @@
17#include <asm/io.h> 17#include <asm/io.h>
18#include <asm/uaccess.h> 18#include <asm/uaccess.h>
19#include <linux/miscdevice.h> 19#include <linux/miscdevice.h>
20#include <linux/pci.h>
21#include <linux/delay.h> 20#include <linux/delay.h>
22#include <linux/slab.h> 21#include <linux/slab.h>
23#include <linux/init.h> 22#include <linux/init.h>
diff --git a/drivers/mtd/devices/docecc.c b/drivers/mtd/devices/docecc.c
index 52b5d638077f..fd8a8daba3a8 100644
--- a/drivers/mtd/devices/docecc.c
+++ b/drivers/mtd/devices/docecc.c
@@ -29,7 +29,6 @@
29#include <asm/io.h> 29#include <asm/io.h>
30#include <asm/uaccess.h> 30#include <asm/uaccess.h>
31#include <linux/miscdevice.h> 31#include <linux/miscdevice.h>
32#include <linux/pci.h>
33#include <linux/delay.h> 32#include <linux/delay.h>
34#include <linux/slab.h> 33#include <linux/slab.h>
35#include <linux/init.h> 34#include <linux/init.h>
diff --git a/drivers/mtd/inftlmount.c b/drivers/mtd/inftlmount.c
index acf3ba223298..ecac0e438f49 100644
--- a/drivers/mtd/inftlmount.c
+++ b/drivers/mtd/inftlmount.c
@@ -31,7 +31,6 @@
31#include <asm/io.h> 31#include <asm/io.h>
32#include <asm/uaccess.h> 32#include <asm/uaccess.h>
33#include <linux/miscdevice.h> 33#include <linux/miscdevice.h>
34#include <linux/pci.h>
35#include <linux/delay.h> 34#include <linux/delay.h>
36#include <linux/slab.h> 35#include <linux/slab.h>
37#include <linux/init.h> 36#include <linux/init.h>
diff --git a/drivers/mtd/nand/cs553x_nand.c b/drivers/mtd/nand/cs553x_nand.c
index 8296305c8297..89deff007116 100644
--- a/drivers/mtd/nand/cs553x_nand.c
+++ b/drivers/mtd/nand/cs553x_nand.c
@@ -20,7 +20,6 @@
20#include <linux/init.h> 20#include <linux/init.h>
21#include <linux/module.h> 21#include <linux/module.h>
22#include <linux/delay.h> 22#include <linux/delay.h>
23#include <linux/pci.h>
24#include <linux/mtd/mtd.h> 23#include <linux/mtd/mtd.h>
25#include <linux/mtd/nand.h> 24#include <linux/mtd/nand.h>
26#include <linux/mtd/nand_ecc.h> 25#include <linux/mtd/nand_ecc.h>
diff --git a/drivers/mtd/nftlcore.c b/drivers/mtd/nftlcore.c
index e6ef7d7f9f14..0c9ce19ea27a 100644
--- a/drivers/mtd/nftlcore.c
+++ b/drivers/mtd/nftlcore.c
@@ -17,7 +17,6 @@
17#include <asm/io.h> 17#include <asm/io.h>
18#include <asm/uaccess.h> 18#include <asm/uaccess.h>
19#include <linux/miscdevice.h> 19#include <linux/miscdevice.h>
20#include <linux/pci.h>
21#include <linux/delay.h> 20#include <linux/delay.h>
22#include <linux/slab.h> 21#include <linux/slab.h>
23#include <linux/init.h> 22#include <linux/init.h>
diff --git a/drivers/net/atl1/atl1_param.c b/drivers/net/atl1/atl1_param.c
index c407214339f6..bcd0bd891722 100644
--- a/drivers/net/atl1/atl1_param.c
+++ b/drivers/net/atl1/atl1_param.c
@@ -22,7 +22,6 @@
22 */ 22 */
23 23
24#include <linux/types.h> 24#include <linux/types.h>
25#include <linux/pci.h>
26#include <linux/moduleparam.h> 25#include <linux/moduleparam.h>
27#include "atl1.h" 26#include "atl1.h"
28 27
diff --git a/drivers/net/au1000_eth.c b/drivers/net/au1000_eth.c
index d10fb80e9a63..c39ab803c5d8 100644
--- a/drivers/net/au1000_eth.c
+++ b/drivers/net/au1000_eth.c
@@ -45,7 +45,6 @@
45#include <linux/bitops.h> 45#include <linux/bitops.h>
46#include <linux/slab.h> 46#include <linux/slab.h>
47#include <linux/interrupt.h> 47#include <linux/interrupt.h>
48#include <linux/pci.h>
49#include <linux/init.h> 48#include <linux/init.h>
50#include <linux/netdevice.h> 49#include <linux/netdevice.h>
51#include <linux/etherdevice.h> 50#include <linux/etherdevice.h>
diff --git a/drivers/net/fec_8xx/fec_main.c b/drivers/net/fec_8xx/fec_main.c
index e824d5d231af..88efe9731bab 100644
--- a/drivers/net/fec_8xx/fec_main.c
+++ b/drivers/net/fec_8xx/fec_main.c
@@ -19,7 +19,6 @@
19#include <linux/ioport.h> 19#include <linux/ioport.h>
20#include <linux/slab.h> 20#include <linux/slab.h>
21#include <linux/interrupt.h> 21#include <linux/interrupt.h>
22#include <linux/pci.h>
23#include <linux/init.h> 22#include <linux/init.h>
24#include <linux/delay.h> 23#include <linux/delay.h>
25#include <linux/netdevice.h> 24#include <linux/netdevice.h>
diff --git a/drivers/net/fec_8xx/fec_mii.c b/drivers/net/fec_8xx/fec_mii.c
index e79700abf7b6..b3fa0d6a159c 100644
--- a/drivers/net/fec_8xx/fec_mii.c
+++ b/drivers/net/fec_8xx/fec_mii.c
@@ -19,7 +19,6 @@
19#include <linux/ioport.h> 19#include <linux/ioport.h>
20#include <linux/slab.h> 20#include <linux/slab.h>
21#include <linux/interrupt.h> 21#include <linux/interrupt.h>
22#include <linux/pci.h>
23#include <linux/init.h> 22#include <linux/init.h>
24#include <linux/delay.h> 23#include <linux/delay.h>
25#include <linux/netdevice.h> 24#include <linux/netdevice.h>
diff --git a/drivers/net/fs_enet/fs_enet-main.c b/drivers/net/fs_enet/fs_enet-main.c
index e2ddd617493a..a4a2a0ea43d3 100644
--- a/drivers/net/fs_enet/fs_enet-main.c
+++ b/drivers/net/fs_enet/fs_enet-main.c
@@ -24,7 +24,6 @@
24#include <linux/ioport.h> 24#include <linux/ioport.h>
25#include <linux/slab.h> 25#include <linux/slab.h>
26#include <linux/interrupt.h> 26#include <linux/interrupt.h>
27#include <linux/pci.h>
28#include <linux/init.h> 27#include <linux/init.h>
29#include <linux/delay.h> 28#include <linux/delay.h>
30#include <linux/netdevice.h> 29#include <linux/netdevice.h>
diff --git a/drivers/net/fs_enet/mac-fcc.c b/drivers/net/fs_enet/mac-fcc.c
index 8545e84fc9a0..5603121132cd 100644
--- a/drivers/net/fs_enet/mac-fcc.c
+++ b/drivers/net/fs_enet/mac-fcc.c
@@ -21,7 +21,6 @@
21#include <linux/ioport.h> 21#include <linux/ioport.h>
22#include <linux/slab.h> 22#include <linux/slab.h>
23#include <linux/interrupt.h> 23#include <linux/interrupt.h>
24#include <linux/pci.h>
25#include <linux/init.h> 24#include <linux/init.h>
26#include <linux/delay.h> 25#include <linux/delay.h>
27#include <linux/netdevice.h> 26#include <linux/netdevice.h>
diff --git a/drivers/net/fs_enet/mac-fec.c b/drivers/net/fs_enet/mac-fec.c
index cdcfb96f360f..04b4f80a1cde 100644
--- a/drivers/net/fs_enet/mac-fec.c
+++ b/drivers/net/fs_enet/mac-fec.c
@@ -21,7 +21,6 @@
21#include <linux/ioport.h> 21#include <linux/ioport.h>
22#include <linux/slab.h> 22#include <linux/slab.h>
23#include <linux/interrupt.h> 23#include <linux/interrupt.h>
24#include <linux/pci.h>
25#include <linux/init.h> 24#include <linux/init.h>
26#include <linux/delay.h> 25#include <linux/delay.h>
27#include <linux/netdevice.h> 26#include <linux/netdevice.h>
diff --git a/drivers/net/fs_enet/mac-scc.c b/drivers/net/fs_enet/mac-scc.c
index 65925b5a224f..d0f28981b55a 100644
--- a/drivers/net/fs_enet/mac-scc.c
+++ b/drivers/net/fs_enet/mac-scc.c
@@ -21,7 +21,6 @@
21#include <linux/ioport.h> 21#include <linux/ioport.h>
22#include <linux/slab.h> 22#include <linux/slab.h>
23#include <linux/interrupt.h> 23#include <linux/interrupt.h>
24#include <linux/pci.h>
25#include <linux/init.h> 24#include <linux/init.h>
26#include <linux/delay.h> 25#include <linux/delay.h>
27#include <linux/netdevice.h> 26#include <linux/netdevice.h>
diff --git a/drivers/net/fs_enet/mii-bitbang.c b/drivers/net/fs_enet/mii-bitbang.c
index f91447837fd4..d3840108ffbd 100644
--- a/drivers/net/fs_enet/mii-bitbang.c
+++ b/drivers/net/fs_enet/mii-bitbang.c
@@ -22,7 +22,6 @@
22#include <linux/ioport.h> 22#include <linux/ioport.h>
23#include <linux/slab.h> 23#include <linux/slab.h>
24#include <linux/interrupt.h> 24#include <linux/interrupt.h>
25#include <linux/pci.h>
26#include <linux/init.h> 25#include <linux/init.h>
27#include <linux/delay.h> 26#include <linux/delay.h>
28#include <linux/netdevice.h> 27#include <linux/netdevice.h>
diff --git a/drivers/net/fs_enet/mii-fec.c b/drivers/net/fs_enet/mii-fec.c
index 235b177fb9ac..0a563a83016f 100644
--- a/drivers/net/fs_enet/mii-fec.c
+++ b/drivers/net/fs_enet/mii-fec.c
@@ -21,7 +21,6 @@
21#include <linux/ioport.h> 21#include <linux/ioport.h>
22#include <linux/slab.h> 22#include <linux/slab.h>
23#include <linux/interrupt.h> 23#include <linux/interrupt.h>
24#include <linux/pci.h>
25#include <linux/init.h> 24#include <linux/init.h>
26#include <linux/delay.h> 25#include <linux/delay.h>
27#include <linux/netdevice.h> 26#include <linux/netdevice.h>
diff --git a/drivers/net/ibm_emac/ibm_emac_core.c b/drivers/net/ibm_emac/ibm_emac_core.c
index 3d82d46f4998..50035ebd4f52 100644
--- a/drivers/net/ibm_emac/ibm_emac_core.c
+++ b/drivers/net/ibm_emac/ibm_emac_core.c
@@ -27,7 +27,6 @@
27#include <linux/delay.h> 27#include <linux/delay.h>
28#include <linux/init.h> 28#include <linux/init.h>
29#include <linux/types.h> 29#include <linux/types.h>
30#include <linux/pci.h>
31#include <linux/netdevice.h> 30#include <linux/netdevice.h>
32#include <linux/etherdevice.h> 31#include <linux/etherdevice.h>
33#include <linux/skbuff.h> 32#include <linux/skbuff.h>
diff --git a/drivers/net/ixgb/ixgb_osdep.h b/drivers/net/ixgb/ixgb_osdep.h
index 8434d752fd81..9e04a6b3ae0d 100644
--- a/drivers/net/ixgb/ixgb_osdep.h
+++ b/drivers/net/ixgb/ixgb_osdep.h
@@ -34,7 +34,6 @@
34#define _IXGB_OSDEP_H_ 34#define _IXGB_OSDEP_H_
35 35
36#include <linux/types.h> 36#include <linux/types.h>
37#include <linux/pci.h>
38#include <linux/delay.h> 37#include <linux/delay.h>
39#include <asm/io.h> 38#include <asm/io.h>
40#include <linux/interrupt.h> 39#include <linux/interrupt.h>
diff --git a/drivers/net/lasi_82596.c b/drivers/net/lasi_82596.c
index 0edcd125fd61..6b49fc4bd1a1 100644
--- a/drivers/net/lasi_82596.c
+++ b/drivers/net/lasi_82596.c
@@ -81,7 +81,6 @@
81#include <linux/etherdevice.h> 81#include <linux/etherdevice.h>
82#include <linux/skbuff.h> 82#include <linux/skbuff.h>
83#include <linux/init.h> 83#include <linux/init.h>
84#include <linux/pci.h>
85#include <linux/types.h> 84#include <linux/types.h>
86#include <linux/bitops.h> 85#include <linux/bitops.h>
87 86
diff --git a/drivers/net/tokenring/madgemc.c b/drivers/net/tokenring/madgemc.c
index ed274d6909d0..f8f4d74f01f1 100644
--- a/drivers/net/tokenring/madgemc.c
+++ b/drivers/net/tokenring/madgemc.c
@@ -23,7 +23,6 @@ static const char version[] = "madgemc.c: v0.91 23/01/2000 by Adam Fritzler\n";
23#include <linux/mca.h> 23#include <linux/mca.h>
24#include <linux/kernel.h> 24#include <linux/kernel.h>
25#include <linux/errno.h> 25#include <linux/errno.h>
26#include <linux/pci.h>
27#include <linux/init.h> 26#include <linux/init.h>
28#include <linux/netdevice.h> 27#include <linux/netdevice.h>
29#include <linux/trdevice.h> 28#include <linux/trdevice.h>
diff --git a/drivers/net/tokenring/smctr.c b/drivers/net/tokenring/smctr.c
index 9bbea5c8acf4..58d7e5d452fa 100644
--- a/drivers/net/tokenring/smctr.c
+++ b/drivers/net/tokenring/smctr.c
@@ -41,7 +41,6 @@
41#include <linux/time.h> 41#include <linux/time.h>
42#include <linux/errno.h> 42#include <linux/errno.h>
43#include <linux/init.h> 43#include <linux/init.h>
44#include <linux/pci.h>
45#include <linux/mca-legacy.h> 44#include <linux/mca-legacy.h>
46#include <linux/delay.h> 45#include <linux/delay.h>
47#include <linux/netdevice.h> 46#include <linux/netdevice.h>
diff --git a/drivers/net/tulip/21142.c b/drivers/net/tulip/21142.c
index 942b839ccc5b..6c400ccd38b4 100644
--- a/drivers/net/tulip/21142.c
+++ b/drivers/net/tulip/21142.c
@@ -14,7 +14,6 @@
14 14
15*/ 15*/
16 16
17#include <linux/pci.h>
18#include <linux/delay.h> 17#include <linux/delay.h>
19#include "tulip.h" 18#include "tulip.h"
20 19
diff --git a/drivers/net/tulip/pnic.c b/drivers/net/tulip/pnic.c
index 85a521e0d052..be82a2effee3 100644
--- a/drivers/net/tulip/pnic.c
+++ b/drivers/net/tulip/pnic.c
@@ -15,7 +15,6 @@
15*/ 15*/
16 16
17#include <linux/kernel.h> 17#include <linux/kernel.h>
18#include <linux/pci.h>
19#include <linux/jiffies.h> 18#include <linux/jiffies.h>
20#include "tulip.h" 19#include "tulip.h"
21 20
diff --git a/drivers/net/tulip/pnic2.c b/drivers/net/tulip/pnic2.c
index c31be0e377a8..4e4a879c3fa5 100644
--- a/drivers/net/tulip/pnic2.c
+++ b/drivers/net/tulip/pnic2.c
@@ -76,7 +76,6 @@
76 76
77 77
78 78
79#include <linux/pci.h>
80#include "tulip.h" 79#include "tulip.h"
81#include <linux/delay.h> 80#include <linux/delay.h>
82 81
diff --git a/drivers/net/tulip/timer.c b/drivers/net/tulip/timer.c
index df326fe1cc8f..d2c1f42109b0 100644
--- a/drivers/net/tulip/timer.c
+++ b/drivers/net/tulip/timer.c
@@ -14,7 +14,6 @@
14 14
15*/ 15*/
16 16
17#include <linux/pci.h>
18#include "tulip.h" 17#include "tulip.h"
19 18
20 19
diff --git a/drivers/net/tulip/tulip.h b/drivers/net/tulip/tulip.h
index c840d2e67b23..16f26a8364f0 100644
--- a/drivers/net/tulip/tulip.h
+++ b/drivers/net/tulip/tulip.h
@@ -22,6 +22,7 @@
22#include <linux/netdevice.h> 22#include <linux/netdevice.h>
23#include <linux/timer.h> 23#include <linux/timer.h>
24#include <linux/delay.h> 24#include <linux/delay.h>
25#include <linux/pci.h>
25#include <asm/io.h> 26#include <asm/io.h>
26#include <asm/irq.h> 27#include <asm/irq.h>
27 28
diff --git a/drivers/net/wan/lmc/lmc_media.c b/drivers/net/wan/lmc/lmc_media.c
index ae01555d24cf..574737b55f39 100644
--- a/drivers/net/wan/lmc/lmc_media.c
+++ b/drivers/net/wan/lmc/lmc_media.c
@@ -8,7 +8,6 @@
8#include <linux/ioport.h> 8#include <linux/ioport.h>
9#include <linux/slab.h> 9#include <linux/slab.h>
10#include <linux/interrupt.h> 10#include <linux/interrupt.h>
11#include <linux/pci.h>
12#include <linux/in.h> 11#include <linux/in.h>
13#include <linux/if_arp.h> 12#include <linux/if_arp.h>
14#include <linux/netdevice.h> 13#include <linux/netdevice.h>
diff --git a/drivers/net/wan/lmc/lmc_proto.c b/drivers/net/wan/lmc/lmc_proto.c
index 74876c0073e8..31e1799571ad 100644
--- a/drivers/net/wan/lmc/lmc_proto.c
+++ b/drivers/net/wan/lmc/lmc_proto.c
@@ -27,7 +27,6 @@
27#include <linux/ioport.h> 27#include <linux/ioport.h>
28#include <linux/slab.h> 28#include <linux/slab.h>
29#include <linux/interrupt.h> 29#include <linux/interrupt.h>
30#include <linux/pci.h>
31#include <linux/in.h> 30#include <linux/in.h>
32#include <linux/if_arp.h> 31#include <linux/if_arp.h>
33#include <linux/netdevice.h> 32#include <linux/netdevice.h>
diff --git a/drivers/net/wan/pc300_tty.c b/drivers/net/wan/pc300_tty.c
index 07dbdfbfc15d..e24a7b095dd6 100644
--- a/drivers/net/wan/pc300_tty.c
+++ b/drivers/net/wan/pc300_tty.c
@@ -38,7 +38,6 @@
38 38
39#include <linux/module.h> 39#include <linux/module.h>
40#include <linux/kernel.h> 40#include <linux/kernel.h>
41#include <linux/pci.h>
42#include <linux/errno.h> 41#include <linux/errno.h>
43#include <linux/string.h> 42#include <linux/string.h>
44#include <linux/init.h> 43#include <linux/init.h>
diff --git a/drivers/parisc/hppb.c b/drivers/parisc/hppb.c
index 9bb4db552f3c..a68b3b3761a2 100644
--- a/drivers/parisc/hppb.c
+++ b/drivers/parisc/hppb.c
@@ -22,8 +22,6 @@
22#include <asm/hardware.h> 22#include <asm/hardware.h>
23#include <asm/parisc-device.h> 23#include <asm/parisc-device.h>
24 24
25#include <linux/pci.h>
26
27struct hppb_card { 25struct hppb_card {
28 unsigned long hpa; 26 unsigned long hpa;
29 struct resource mmio_region; 27 struct resource mmio_region;
diff --git a/drivers/pcmcia/cs.c b/drivers/pcmcia/cs.c
index ac004248324a..50cad3a59a6c 100644
--- a/drivers/pcmcia/cs.c
+++ b/drivers/pcmcia/cs.c
@@ -26,7 +26,6 @@
26#include <linux/ioport.h> 26#include <linux/ioport.h>
27#include <linux/delay.h> 27#include <linux/delay.h>
28#include <linux/pm.h> 28#include <linux/pm.h>
29#include <linux/pci.h>
30#include <linux/device.h> 29#include <linux/device.h>
31#include <linux/kthread.h> 30#include <linux/kthread.h>
32#include <linux/freezer.h> 31#include <linux/freezer.h>
diff --git a/drivers/pcmcia/socket_sysfs.c b/drivers/pcmcia/socket_sysfs.c
index ea5765c3bdc0..a2bb46526b56 100644
--- a/drivers/pcmcia/socket_sysfs.c
+++ b/drivers/pcmcia/socket_sysfs.c
@@ -22,7 +22,6 @@
22#include <linux/ioport.h> 22#include <linux/ioport.h>
23#include <linux/delay.h> 23#include <linux/delay.h>
24#include <linux/pm.h> 24#include <linux/pm.h>
25#include <linux/pci.h>
26#include <linux/device.h> 25#include <linux/device.h>
27#include <linux/mutex.h> 26#include <linux/mutex.h>
28#include <asm/system.h> 27#include <asm/system.h>
diff --git a/drivers/sbus/sbus.c b/drivers/sbus/sbus.c
index eee590a51d8a..002643392d42 100644
--- a/drivers/sbus/sbus.c
+++ b/drivers/sbus/sbus.c
@@ -6,7 +6,6 @@
6#include <linux/kernel.h> 6#include <linux/kernel.h>
7#include <linux/slab.h> 7#include <linux/slab.h>
8#include <linux/init.h> 8#include <linux/init.h>
9#include <linux/pci.h>
10#include <linux/device.h> 9#include <linux/device.h>
11 10
12#include <asm/system.h> 11#include <asm/system.h>
diff --git a/drivers/scsi/aacraid/dpcsup.c b/drivers/scsi/aacraid/dpcsup.c
index d38b628be1ad..66aeb57dcc2d 100644
--- a/drivers/scsi/aacraid/dpcsup.c
+++ b/drivers/scsi/aacraid/dpcsup.c
@@ -32,7 +32,6 @@
32#include <linux/kernel.h> 32#include <linux/kernel.h>
33#include <linux/init.h> 33#include <linux/init.h>
34#include <linux/types.h> 34#include <linux/types.h>
35#include <linux/pci.h>
36#include <linux/spinlock.h> 35#include <linux/spinlock.h>
37#include <linux/slab.h> 36#include <linux/slab.h>
38#include <linux/completion.h> 37#include <linux/completion.h>
diff --git a/drivers/scsi/aacraid/sa.c b/drivers/scsi/aacraid/sa.c
index 6f1a1780efce..f4b5e9742ab0 100644
--- a/drivers/scsi/aacraid/sa.c
+++ b/drivers/scsi/aacraid/sa.c
@@ -31,7 +31,6 @@
31#include <linux/kernel.h> 31#include <linux/kernel.h>
32#include <linux/init.h> 32#include <linux/init.h>
33#include <linux/types.h> 33#include <linux/types.h>
34#include <linux/pci.h>
35#include <linux/spinlock.h> 34#include <linux/spinlock.h>
36#include <linux/slab.h> 35#include <linux/slab.h>
37#include <linux/blkdev.h> 36#include <linux/blkdev.h>
diff --git a/drivers/scsi/aha1542.c b/drivers/scsi/aha1542.c
index 1d239f6c0103..cbbfbc9f3e0f 100644
--- a/drivers/scsi/aha1542.c
+++ b/drivers/scsi/aha1542.c
@@ -35,7 +35,6 @@
35#include <linux/proc_fs.h> 35#include <linux/proc_fs.h>
36#include <linux/init.h> 36#include <linux/init.h>
37#include <linux/spinlock.h> 37#include <linux/spinlock.h>
38#include <linux/pci.h>
39#include <linux/isapnp.h> 38#include <linux/isapnp.h>
40#include <linux/blkdev.h> 39#include <linux/blkdev.h>
41#include <linux/mca.h> 40#include <linux/mca.h>
diff --git a/drivers/scsi/aic94xx/aic94xx_scb.c b/drivers/scsi/aic94xx/aic94xx_scb.c
index 8f43ff772f23..db6ab1a3b81e 100644
--- a/drivers/scsi/aic94xx/aic94xx_scb.c
+++ b/drivers/scsi/aic94xx/aic94xx_scb.c
@@ -24,7 +24,6 @@
24 * 24 *
25 */ 25 */
26 26
27#include <linux/pci.h>
28#include <scsi/scsi_host.h> 27#include <scsi/scsi_host.h>
29 28
30#include "aic94xx.h" 29#include "aic94xx.h"
diff --git a/drivers/scsi/arcmsr/arcmsr_attr.c b/drivers/scsi/arcmsr/arcmsr_attr.c
index 12497da5529d..03bfed61bffc 100644
--- a/drivers/scsi/arcmsr/arcmsr_attr.c
+++ b/drivers/scsi/arcmsr/arcmsr_attr.c
@@ -49,7 +49,6 @@
49#include <linux/init.h> 49#include <linux/init.h>
50#include <linux/errno.h> 50#include <linux/errno.h>
51#include <linux/delay.h> 51#include <linux/delay.h>
52#include <linux/pci.h>
53 52
54#include <scsi/scsi_cmnd.h> 53#include <scsi/scsi_cmnd.h>
55#include <scsi/scsi_device.h> 54#include <scsi/scsi_device.h>
diff --git a/drivers/scsi/libsas/sas_expander.c b/drivers/scsi/libsas/sas_expander.c
index dc70c180e115..e34442e405e8 100644
--- a/drivers/scsi/libsas/sas_expander.c
+++ b/drivers/scsi/libsas/sas_expander.c
@@ -22,7 +22,6 @@
22 * 22 *
23 */ 23 */
24 24
25#include <linux/pci.h>
26#include <linux/scatterlist.h> 25#include <linux/scatterlist.h>
27 26
28#include "sas_internal.h" 27#include "sas_internal.h"
diff --git a/drivers/scsi/libsrp.c b/drivers/scsi/libsrp.c
index 89403b00e042..6335830df810 100644
--- a/drivers/scsi/libsrp.c
+++ b/drivers/scsi/libsrp.c
@@ -22,7 +22,6 @@
22#include <linux/kfifo.h> 22#include <linux/kfifo.h>
23#include <linux/scatterlist.h> 23#include <linux/scatterlist.h>
24#include <linux/dma-mapping.h> 24#include <linux/dma-mapping.h>
25#include <linux/pci.h>
26#include <scsi/scsi.h> 25#include <scsi/scsi.h>
27#include <scsi/scsi_cmnd.h> 26#include <scsi/scsi_cmnd.h>
28#include <scsi/scsi_tcq.h> 27#include <scsi/scsi_tcq.h>
diff --git a/drivers/usb/net/kaweth.c b/drivers/usb/net/kaweth.c
index a0cc05d21a6a..60d29440f316 100644
--- a/drivers/usb/net/kaweth.c
+++ b/drivers/usb/net/kaweth.c
@@ -55,7 +55,6 @@
55#include <linux/usb.h> 55#include <linux/usb.h>
56#include <linux/types.h> 56#include <linux/types.h>
57#include <linux/ethtool.h> 57#include <linux/ethtool.h>
58#include <linux/pci.h>
59#include <linux/dma-mapping.h> 58#include <linux/dma-mapping.h>
60#include <linux/wait.h> 59#include <linux/wait.h>
61#include <asm/uaccess.h> 60#include <asm/uaccess.h>
diff --git a/drivers/video/aty/radeon_i2c.c b/drivers/video/aty/radeon_i2c.c
index 508479920705..7db9de681716 100644
--- a/drivers/video/aty/radeon_i2c.c
+++ b/drivers/video/aty/radeon_i2c.c
@@ -1,7 +1,6 @@
1#include <linux/module.h> 1#include <linux/module.h>
2#include <linux/kernel.h> 2#include <linux/kernel.h>
3#include <linux/delay.h> 3#include <linux/delay.h>
4#include <linux/pci.h>
5#include <linux/fb.h> 4#include <linux/fb.h>
6 5
7 6
diff --git a/drivers/video/g364fb.c b/drivers/video/g364fb.c
index ca93a75f2997..b7655c05da53 100644
--- a/drivers/video/g364fb.c
+++ b/drivers/video/g364fb.c
@@ -26,7 +26,6 @@
26#include <linux/interrupt.h> 26#include <linux/interrupt.h>
27#include <linux/fb.h> 27#include <linux/fb.h>
28#include <linux/init.h> 28#include <linux/init.h>
29#include <linux/pci.h>
30#include <asm/io.h> 29#include <asm/io.h>
31#include <asm/jazz.h> 30#include <asm/jazz.h>
32 31
diff --git a/drivers/video/platinumfb.c b/drivers/video/platinumfb.c
index 233871655824..e64f8b5d0056 100644
--- a/drivers/video/platinumfb.c
+++ b/drivers/video/platinumfb.c
@@ -28,7 +28,6 @@
28#include <linux/interrupt.h> 28#include <linux/interrupt.h>
29#include <linux/fb.h> 29#include <linux/fb.h>
30#include <linux/init.h> 30#include <linux/init.h>
31#include <linux/pci.h>
32#include <linux/nvram.h> 31#include <linux/nvram.h>
33#include <asm/io.h> 32#include <asm/io.h>
34#include <asm/prom.h> 33#include <asm/prom.h>
diff --git a/drivers/video/stifb.c b/drivers/video/stifb.c
index 69f3b264a22e..c97709ecbad0 100644
--- a/drivers/video/stifb.c
+++ b/drivers/video/stifb.c
@@ -64,7 +64,6 @@
64#include <linux/fb.h> 64#include <linux/fb.h>
65#include <linux/init.h> 65#include <linux/init.h>
66#include <linux/ioport.h> 66#include <linux/ioport.h>
67#include <linux/pci.h>
68 67
69#include <asm/grfioctl.h> /* for HP-UX compatibility */ 68#include <asm/grfioctl.h> /* for HP-UX compatibility */
70#include <asm/uaccess.h> 69#include <asm/uaccess.h>
diff --git a/drivers/video/valkyriefb.c b/drivers/video/valkyriefb.c
index 06fc19a61192..ad66f070acb8 100644
--- a/drivers/video/valkyriefb.c
+++ b/drivers/video/valkyriefb.c
@@ -51,7 +51,6 @@
51#include <linux/fb.h> 51#include <linux/fb.h>
52#include <linux/selection.h> 52#include <linux/selection.h>
53#include <linux/init.h> 53#include <linux/init.h>
54#include <linux/pci.h>
55#include <linux/nvram.h> 54#include <linux/nvram.h>
56#include <linux/adb.h> 55#include <linux/adb.h>
57#include <linux/cuda.h> 56#include <linux/cuda.h>
diff --git a/include/asm-arm/arch-ixp4xx/dma.h b/include/asm-arm/arch-ixp4xx/dma.h
index 789f7f53c357..2c7f5327d80f 100644
--- a/include/asm-arm/arch-ixp4xx/dma.h
+++ b/include/asm-arm/arch-ixp4xx/dma.h
@@ -12,7 +12,6 @@
12#define __ASM_ARCH_DMA_H 12#define __ASM_ARCH_DMA_H
13 13
14#include <linux/device.h> 14#include <linux/device.h>
15#include <linux/pci.h>
16#include <asm/page.h> 15#include <asm/page.h>
17#include <asm/sizes.h> 16#include <asm/sizes.h>
18#include <asm/hardware.h> 17#include <asm/hardware.h>
diff --git a/include/rdma/ib_mad.h b/include/rdma/ib_mad.h
index 585d28e960dd..739fa4d0e539 100644
--- a/include/rdma/ib_mad.h
+++ b/include/rdma/ib_mad.h
@@ -39,8 +39,6 @@
39#if !defined( IB_MAD_H ) 39#if !defined( IB_MAD_H )
40#define IB_MAD_H 40#define IB_MAD_H
41 41
42#include <linux/pci.h>
43
44#include <rdma/ib_verbs.h> 42#include <rdma/ib_verbs.h>
45 43
46/* Management base version */ 44/* Management base version */
diff --git a/sound/core/init.c b/sound/core/init.c
index 4a431e3ea3a2..f2fe35737186 100644
--- a/sound/core/init.c
+++ b/sound/core/init.c
@@ -26,7 +26,6 @@
26#include <linux/slab.h> 26#include <linux/slab.h>
27#include <linux/time.h> 27#include <linux/time.h>
28#include <linux/ctype.h> 28#include <linux/ctype.h>
29#include <linux/pci.h>
30#include <linux/pm.h> 29#include <linux/pm.h>
31 30
32#include <sound/core.h> 31#include <sound/core.h>
diff --git a/sound/oss/au1550_ac97.c b/sound/oss/au1550_ac97.c
index a339f0c0d512..23018a7c063a 100644
--- a/sound/oss/au1550_ac97.c
+++ b/sound/oss/au1550_ac97.c
@@ -47,7 +47,6 @@
47#include <linux/interrupt.h> 47#include <linux/interrupt.h>
48#include <linux/kernel.h> 48#include <linux/kernel.h>
49#include <linux/poll.h> 49#include <linux/poll.h>
50#include <linux/pci.h>
51#include <linux/bitops.h> 50#include <linux/bitops.h>
52#include <linux/spinlock.h> 51#include <linux/spinlock.h>
53#include <linux/smp_lock.h> 52#include <linux/smp_lock.h>
diff --git a/sound/oss/soundcard.c b/sound/oss/soundcard.c
index dcd8d6d2f56f..a9c23b2502ad 100644
--- a/sound/oss/soundcard.c
+++ b/sound/oss/soundcard.c
@@ -44,6 +44,7 @@
44#include <linux/smp_lock.h> 44#include <linux/smp_lock.h>
45#include <linux/module.h> 45#include <linux/module.h>
46#include <linux/mm.h> 46#include <linux/mm.h>
47#include <linux/device.h>
47 48
48/* 49/*
49 * This ought to be moved into include/asm/dma.h 50 * This ought to be moved into include/asm/dma.h
diff --git a/sound/pci/ca0106/ca0106_mixer.c b/sound/pci/ca0106/ca0106_mixer.c
index b913a1fb8c21..9c3a9c8d1dc2 100644
--- a/sound/pci/ca0106/ca0106_mixer.c
+++ b/sound/pci/ca0106/ca0106_mixer.c
@@ -62,7 +62,6 @@
62#include <linux/delay.h> 62#include <linux/delay.h>
63#include <linux/init.h> 63#include <linux/init.h>
64#include <linux/interrupt.h> 64#include <linux/interrupt.h>
65#include <linux/pci.h>
66#include <linux/slab.h> 65#include <linux/slab.h>
67#include <linux/moduleparam.h> 66#include <linux/moduleparam.h>
68#include <sound/core.h> 67#include <sound/core.h>
@@ -71,6 +70,7 @@
71#include <sound/ac97_codec.h> 70#include <sound/ac97_codec.h>
72#include <sound/info.h> 71#include <sound/info.h>
73#include <sound/tlv.h> 72#include <sound/tlv.h>
73#include <asm/io.h>
74 74
75#include "ca0106.h" 75#include "ca0106.h"
76 76
diff --git a/sound/pci/ca0106/ca0106_proc.c b/sound/pci/ca0106/ca0106_proc.c
index 75ca421eb3a1..ae80f51d8c4f 100644
--- a/sound/pci/ca0106/ca0106_proc.c
+++ b/sound/pci/ca0106/ca0106_proc.c
@@ -64,7 +64,6 @@
64#include <linux/delay.h> 64#include <linux/delay.h>
65#include <linux/init.h> 65#include <linux/init.h>
66#include <linux/interrupt.h> 66#include <linux/interrupt.h>
67#include <linux/pci.h>
68#include <linux/slab.h> 67#include <linux/slab.h>
69#include <linux/moduleparam.h> 68#include <linux/moduleparam.h>
70#include <sound/core.h> 69#include <sound/core.h>
@@ -73,6 +72,7 @@
73#include <sound/ac97_codec.h> 72#include <sound/ac97_codec.h>
74#include <sound/info.h> 73#include <sound/info.h>
75#include <sound/asoundef.h> 74#include <sound/asoundef.h>
75#include <asm/io.h>
76 76
77#include "ca0106.h" 77#include "ca0106.h"
78 78
diff --git a/sound/pci/cs46xx/dsp_spos.c b/sound/pci/cs46xx/dsp_spos.c
index 89c402770a1d..336e77e2600c 100644
--- a/sound/pci/cs46xx/dsp_spos.c
+++ b/sound/pci/cs46xx/dsp_spos.c
@@ -23,7 +23,6 @@
23#include <sound/driver.h> 23#include <sound/driver.h>
24#include <asm/io.h> 24#include <asm/io.h>
25#include <linux/delay.h> 25#include <linux/delay.h>
26#include <linux/pci.h>
27#include <linux/pm.h> 26#include <linux/pm.h>
28#include <linux/init.h> 27#include <linux/init.h>
29#include <linux/slab.h> 28#include <linux/slab.h>
diff --git a/sound/pci/cs46xx/dsp_spos_scb_lib.c b/sound/pci/cs46xx/dsp_spos_scb_lib.c
index 343f51d5311b..57e357de1500 100644
--- a/sound/pci/cs46xx/dsp_spos_scb_lib.c
+++ b/sound/pci/cs46xx/dsp_spos_scb_lib.c
@@ -24,7 +24,6 @@
24#include <sound/driver.h> 24#include <sound/driver.h>
25#include <asm/io.h> 25#include <asm/io.h>
26#include <linux/delay.h> 26#include <linux/delay.h>
27#include <linux/pci.h>
28#include <linux/pm.h> 27#include <linux/pm.h>
29#include <linux/init.h> 28#include <linux/init.h>
30#include <linux/slab.h> 29#include <linux/slab.h>
diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c
index 1589d2f2917f..1e5ff0cd3709 100644
--- a/sound/pci/hda/hda_generic.c
+++ b/sound/pci/hda/hda_generic.c
@@ -23,7 +23,6 @@
23#include <sound/driver.h> 23#include <sound/driver.h>
24#include <linux/init.h> 24#include <linux/init.h>
25#include <linux/slab.h> 25#include <linux/slab.h>
26#include <linux/pci.h>
27#include <sound/core.h> 26#include <sound/core.h>
28#include "hda_codec.h" 27#include "hda_codec.h"
29#include "hda_local.h" 28#include "hda_local.h"
diff --git a/sound/pci/hda/hda_proc.c b/sound/pci/hda/hda_proc.c
index 17df4d0fe135..e313e685f161 100644
--- a/sound/pci/hda/hda_proc.c
+++ b/sound/pci/hda/hda_proc.c
@@ -23,7 +23,6 @@
23 23
24#include <sound/driver.h> 24#include <sound/driver.h>
25#include <linux/init.h> 25#include <linux/init.h>
26#include <linux/pci.h>
27#include <sound/core.h> 26#include <sound/core.h>
28#include "hda_codec.h" 27#include "hda_codec.h"
29#include "hda_local.h" 28#include "hda_local.h"
diff --git a/sound/pci/hda/patch_atihdmi.c b/sound/pci/hda/patch_atihdmi.c
index 7333f275decd..831469d3a923 100644
--- a/sound/pci/hda/patch_atihdmi.c
+++ b/sound/pci/hda/patch_atihdmi.c
@@ -25,7 +25,6 @@
25#include <linux/init.h> 25#include <linux/init.h>
26#include <linux/delay.h> 26#include <linux/delay.h>
27#include <linux/slab.h> 27#include <linux/slab.h>
28#include <linux/pci.h>
29#include <sound/core.h> 28#include <sound/core.h>
30#include "hda_codec.h" 29#include "hda_codec.h"
31#include "hda_local.h" 30#include "hda_local.h"
diff --git a/sound/pci/hda/patch_si3054.c b/sound/pci/hda/patch_si3054.c
index ed5e45e35963..6fcda9bcf0cf 100644
--- a/sound/pci/hda/patch_si3054.c
+++ b/sound/pci/hda/patch_si3054.c
@@ -26,7 +26,6 @@
26#include <linux/init.h> 26#include <linux/init.h>
27#include <linux/delay.h> 27#include <linux/delay.h>
28#include <linux/slab.h> 28#include <linux/slab.h>
29#include <linux/pci.h>
30#include <sound/core.h> 29#include <sound/core.h>
31#include "hda_codec.h" 30#include "hda_codec.h"
32#include "hda_local.h" 31#include "hda_local.h"
diff --git a/sound/pci/hda/patch_via.c b/sound/pci/hda/patch_via.c
index 4c839b031729..2b11ac8689b9 100644
--- a/sound/pci/hda/patch_via.c
+++ b/sound/pci/hda/patch_via.c
@@ -35,7 +35,6 @@
35#include <linux/init.h> 35#include <linux/init.h>
36#include <linux/delay.h> 36#include <linux/delay.h>
37#include <linux/slab.h> 37#include <linux/slab.h>
38#include <linux/pci.h>
39#include <sound/core.h> 38#include <sound/core.h>
40#include "hda_codec.h" 39#include "hda_codec.h"
41#include "hda_local.h" 40#include "hda_local.h"
sion * SubType Bit 15 - RQ_INIT_PDU( Request Initialization) * Changed from RQ_INIT_PDU to * TRC_Status_Changed_Indicate */ case ISB_IMC_MAC_TYPE_2: err = smctr_issue_read_ring_status_cmd(dev); break; /* Type 0x05 - TX Frame Interrupt (FI). */ case ISB_IMC_TX_FRAME: /* BUG QUEUE for TRC stuck receive BUG */ if(isb_subtype & TX_PENDING_PRIORITY_2) { if((err = smctr_tx_complete(dev, BUG_QUEUE)) != SUCCESS) break; } /* NON-MAC frames only */ if(isb_subtype & TX_PENDING_PRIORITY_1) { if((err = smctr_tx_complete(dev, NON_MAC_QUEUE)) != SUCCESS) break; } /* MAC frames only */ if(isb_subtype & TX_PENDING_PRIORITY_0) err = smctr_tx_complete(dev, MAC_QUEUE); break; /* Type 0x06 - TX END OF QUEUE (FE) */ case ISB_IMC_END_OF_TX_QUEUE: /* BUG queue */ if(isb_subtype & TX_PENDING_PRIORITY_2) { /* ok to clear Receive FIFO overrun * imask send_BUG now completes. */ interrupt_unmask_bits |= 0x800; tp->tx_queue_status[BUG_QUEUE] = NOT_TRANSMITING; if((err = smctr_tx_complete(dev, BUG_QUEUE)) != SUCCESS) break; if((err = smctr_restart_tx_chain(dev, BUG_QUEUE)) != SUCCESS) break; } /* NON-MAC queue only */ if(isb_subtype & TX_PENDING_PRIORITY_1) { tp->tx_queue_status[NON_MAC_QUEUE] = NOT_TRANSMITING; if((err = smctr_tx_complete(dev, NON_MAC_QUEUE)) != SUCCESS) break; if((err = smctr_restart_tx_chain(dev, NON_MAC_QUEUE)) != SUCCESS) break; } /* MAC queue only */ if(isb_subtype & TX_PENDING_PRIORITY_0) { tp->tx_queue_status[MAC_QUEUE] = NOT_TRANSMITING; if((err = smctr_tx_complete(dev, MAC_QUEUE)) != SUCCESS) break; err = smctr_restart_tx_chain(dev, MAC_QUEUE); } break; /* Type 0x07 - NON-MAC RX Resource Interrupt * Subtype bit 12 - (BW) BDB warning * Subtype bit 13 - (FW) FCB warning * Subtype bit 14 - (BE) BDB End of chain * Subtype bit 15 - (FE) FCB End of chain */ case ISB_IMC_NON_MAC_RX_RESOURCE: tp->rx_fifo_overrun_count = 0; tp->receive_queue_number = NON_MAC_QUEUE; err1 = smctr_rx_frame(dev); if(isb_subtype & NON_MAC_RX_RESOURCE_FE) { if((err = smctr_issue_resume_rx_fcb_cmd( dev, NON_MAC_QUEUE)) != SUCCESS) break; if(tp->ptr_rx_fcb_overruns) (*tp->ptr_rx_fcb_overruns)++; } if(isb_subtype & NON_MAC_RX_RESOURCE_BE) { if((err = smctr_issue_resume_rx_bdb_cmd( dev, NON_MAC_QUEUE)) != SUCCESS) break; if(tp->ptr_rx_bdb_overruns) (*tp->ptr_rx_bdb_overruns)++; } err = err1; break; /* Type 0x08 - MAC RX Resource Interrupt * Subtype bit 12 - (BW) BDB warning * Subtype bit 13 - (FW) FCB warning * Subtype bit 14 - (BE) BDB End of chain * Subtype bit 15 - (FE) FCB End of chain */ case ISB_IMC_MAC_RX_RESOURCE: tp->receive_queue_number = MAC_QUEUE; err1 = smctr_rx_frame(dev); if(isb_subtype & MAC_RX_RESOURCE_FE) { if((err = smctr_issue_resume_rx_fcb_cmd( dev, MAC_QUEUE)) != SUCCESS) break; if(tp->ptr_rx_fcb_overruns) (*tp->ptr_rx_fcb_overruns)++; } if(isb_subtype & MAC_RX_RESOURCE_BE) { if((err = smctr_issue_resume_rx_bdb_cmd( dev, MAC_QUEUE)) != SUCCESS) break; if(tp->ptr_rx_bdb_overruns) (*tp->ptr_rx_bdb_overruns)++; } err = err1; break; /* Type 0x09 - NON_MAC RX Frame Interrupt */ case ISB_IMC_NON_MAC_RX_FRAME: tp->rx_fifo_overrun_count = 0; tp->receive_queue_number = NON_MAC_QUEUE; err = smctr_rx_frame(dev); break; /* Type 0x0A - MAC RX Frame Interrupt */ case ISB_IMC_MAC_RX_FRAME: tp->receive_queue_number = MAC_QUEUE; err = smctr_rx_frame(dev); break; /* Type 0x0B - TRC status * TRC has encountered an error condition * subtype bit 14 - transmit FIFO underrun * subtype bit 15 - receive FIFO overrun */ case ISB_IMC_TRC_FIFO_STATUS: if(isb_subtype & TRC_FIFO_STATUS_TX_UNDERRUN) { if(tp->ptr_tx_fifo_underruns) (*tp->ptr_tx_fifo_underruns)++; } if(isb_subtype & TRC_FIFO_STATUS_RX_OVERRUN) { /* update overrun stuck receive counter * if >= 3, has to clear it by sending * back to back frames. We pick * DAT(duplicate address MAC frame) */ tp->rx_fifo_overrun_count++; if(tp->rx_fifo_overrun_count >= 3) { tp->rx_fifo_overrun_count = 0; /* delay clearing fifo overrun * imask till send_BUG tx * complete posted */ interrupt_unmask_bits &= (~0x800); printk(KERN_CRIT "Jay please send bug\n");// smctr_send_bug(dev); } if(tp->ptr_rx_fifo_overruns) (*tp->ptr_rx_fifo_overruns)++; } err = SUCCESS; break; /* Type 0x0C - Action Command Status Interrupt * Subtype bit 14 - CB end of command chain (CE) * Subtype bit 15 - CB command interrupt (CI) */ case ISB_IMC_COMMAND_STATUS: err = SUCCESS; if(tp->acb_head->cmd == ACB_CMD_HIC_NOP) { printk(KERN_ERR "i1\n"); smctr_disable_16bit(dev); /* XXXXXXXXXXXXXXXXX */ /* err = UM_Interrupt(dev); */ smctr_enable_16bit(dev); } else { if((tp->acb_head->cmd == ACB_CMD_READ_TRC_STATUS) && (tp->acb_head->subcmd == RW_TRC_STATUS_BLOCK)) { if(tp->ptr_bcn_type != 0) { *(tp->ptr_bcn_type) = (__u32)((SBlock *)tp->misc_command_data)->BCN_Type; } if(((SBlock *)tp->misc_command_data)->Status_CHG_Indicate & ERROR_COUNTERS_CHANGED) { smctr_update_err_stats(dev); } if(((SBlock *)tp->misc_command_data)->Status_CHG_Indicate & TI_NDIS_RING_STATUS_CHANGED) { tp->ring_status = ((SBlock*)tp->misc_command_data)->TI_NDIS_Ring_Status; smctr_disable_16bit(dev); err = smctr_ring_status_chg(dev); smctr_enable_16bit(dev); if((tp->ring_status & REMOVE_RECEIVED) && (tp->config_word0 & NO_AUTOREMOVE)) { smctr_issue_remove_cmd(dev); } if(err != SUCCESS) { tp->acb_pending = 0; break; } } if(((SBlock *)tp->misc_command_data)->Status_CHG_Indicate & UNA_CHANGED) { if(tp->ptr_una) { tp->ptr_una[0] = SWAP_BYTES(((SBlock *)tp->misc_command_data)->UNA[0]); tp->ptr_una[1] = SWAP_BYTES(((SBlock *)tp->misc_command_data)->UNA[1]); tp->ptr_una[2] = SWAP_BYTES(((SBlock *)tp->misc_command_data)->UNA[2]); } } if(((SBlock *)tp->misc_command_data)->Status_CHG_Indicate & READY_TO_SEND_RQ_INIT) { err = smctr_send_rq_init(dev); } } } tp->acb_pending = 0; break; /* Type 0x0D - MAC Type 1 interrupt * Subtype -- 00 FR_BCN received at S12 * 01 FR_BCN received at S21 * 02 FR_DAT(DA=MA, A<>0) received at S21 * 03 TSM_EXP at S21 * 04 FR_REMOVE received at S42 * 05 TBR_EXP, BR_FLAG_SET at S42 * 06 TBT_EXP at S53 */ case ISB_IMC_MAC_TYPE_1: if(isb_subtype > 8) { err = HARDWARE_FAILED; break; } err = SUCCESS; switch(isb_subtype) { case 0: tp->join_state = JS_BYPASS_STATE; if(tp->status != CLOSED) { tp->status = CLOSED; err = smctr_status_chg(dev); } break; case 1: tp->join_state = JS_LOBE_TEST_STATE; break; case 2: tp->join_state = JS_DETECT_MONITOR_PRESENT_STATE; break; case 3: tp->join_state = JS_AWAIT_NEW_MONITOR_STATE; break; case 4: tp->join_state = JS_DUPLICATE_ADDRESS_TEST_STATE; break; case 5: tp->join_state = JS_NEIGHBOR_NOTIFICATION_STATE; break; case 6: tp->join_state = JS_REQUEST_INITIALIZATION_STATE; break; case 7: tp->join_state = JS_JOIN_COMPLETE_STATE; tp->status = OPEN; err = smctr_status_chg(dev); break; case 8: tp->join_state = JS_BYPASS_WAIT_STATE; break; } break ; /* Type 0x0E - TRC Initialization Sequence Interrupt * Subtype -- 00-FF Initializatin sequence complete */ case ISB_IMC_TRC_INTRNL_TST_STATUS: tp->status = INITIALIZED; smctr_disable_16bit(dev); err = smctr_status_chg(dev); smctr_enable_16bit(dev); break; /* other interrupt types, illegal */ default: break; } if(err != SUCCESS) break; } /* Checking the ack code instead of the unmask bits here is because : * while fixing the stuck receive, DAT frame are sent and mask off * FIFO overrun interrupt temporarily (interrupt_unmask_bits = 0) * but we still want to issue ack to ISB */ if(!(interrupt_ack_code & 0xff00)) smctr_issue_int_ack(dev, interrupt_ack_code, interrupt_unmask_bits); smctr_disable_16bit(dev); smctr_enable_bic_int(dev); spin_unlock(&tp->lock); return IRQ_HANDLED; } static int smctr_issue_enable_int_cmd(struct net_device *dev, __u16 interrupt_enable_mask) { struct net_local *tp = netdev_priv(dev); int err; if((err = smctr_wait_while_cbusy(dev))) return (err); tp->sclb_ptr->int_mask_control = interrupt_enable_mask; tp->sclb_ptr->valid_command = SCLB_VALID | SCLB_CMD_CLEAR_INTERRUPT_MASK; smctr_set_ctrl_attention(dev); return (0); } static int smctr_issue_int_ack(struct net_device *dev, __u16 iack_code, __u16 ibits) { struct net_local *tp = netdev_priv(dev); if(smctr_wait_while_cbusy(dev)) return (-1); tp->sclb_ptr->int_mask_control = ibits; tp->sclb_ptr->iack_code = iack_code << 1; /* use the offset from base */ tp->sclb_ptr->resume_control = 0; tp->sclb_ptr->valid_command = SCLB_VALID | SCLB_IACK_CODE_VALID | SCLB_CMD_CLEAR_INTERRUPT_MASK; smctr_set_ctrl_attention(dev); return (0); } static int smctr_issue_init_timers_cmd(struct net_device *dev) { struct net_local *tp = netdev_priv(dev); unsigned int i; int err; __u16 *pTimer_Struc = (__u16 *)tp->misc_command_data; if((err = smctr_wait_while_cbusy(dev))) return (err); if((err = smctr_wait_cmd(dev))) return (err); tp->config_word0 = THDREN | DMA_TRIGGER | USETPT | NO_AUTOREMOVE; tp->config_word1 = 0; if((tp->media_type == MEDIA_STP_16) || (tp->media_type == MEDIA_UTP_16) || (tp->media_type == MEDIA_STP_16_UTP_16)) { tp->config_word0 |= FREQ_16MB_BIT; } if(tp->mode_bits & EARLY_TOKEN_REL) tp->config_word0 |= ETREN; if(tp->mode_bits & LOOPING_MODE_MASK) tp->config_word0 |= RX_OWN_BIT; else tp->config_word0 &= ~RX_OWN_BIT; if(tp->receive_mask & PROMISCUOUS_MODE) tp->config_word0 |= PROMISCUOUS_BIT; else tp->config_word0 &= ~PROMISCUOUS_BIT; if(tp->receive_mask & ACCEPT_ERR_PACKETS) tp->config_word0 |= SAVBAD_BIT; else tp->config_word0 &= ~SAVBAD_BIT; if(tp->receive_mask & ACCEPT_ATT_MAC_FRAMES) tp->config_word0 |= RXATMAC; else tp->config_word0 &= ~RXATMAC; if(tp->receive_mask & ACCEPT_MULTI_PROM) tp->config_word1 |= MULTICAST_ADDRESS_BIT; else tp->config_word1 &= ~MULTICAST_ADDRESS_BIT; if(tp->receive_mask & ACCEPT_SOURCE_ROUTING_SPANNING) tp->config_word1 |= SOURCE_ROUTING_SPANNING_BITS; else { if(tp->receive_mask & ACCEPT_SOURCE_ROUTING) tp->config_word1 |= SOURCE_ROUTING_EXPLORER_BIT; else tp->config_word1 &= ~SOURCE_ROUTING_SPANNING_BITS; } if((tp->media_type == MEDIA_STP_16) || (tp->media_type == MEDIA_UTP_16) || (tp->media_type == MEDIA_STP_16_UTP_16)) { tp->config_word1 |= INTERFRAME_SPACING_16; } else tp->config_word1 |= INTERFRAME_SPACING_4; *pTimer_Struc++ = tp->config_word0; *pTimer_Struc++ = tp->config_word1; if((tp->media_type == MEDIA_STP_4) || (tp->media_type == MEDIA_UTP_4) || (tp->media_type == MEDIA_STP_4_UTP_4)) { *pTimer_Struc++ = 0x00FA; /* prescale */ *pTimer_Struc++ = 0x2710; /* TPT_limit */ *pTimer_Struc++ = 0x2710; /* TQP_limit */ *pTimer_Struc++ = 0x0A28; /* TNT_limit */ *pTimer_Struc++ = 0x3E80; /* TBT_limit */ *pTimer_Struc++ = 0x3A98; /* TSM_limit */ *pTimer_Struc++ = 0x1B58; /* TAM_limit */ *pTimer_Struc++ = 0x00C8; /* TBR_limit */ *pTimer_Struc++ = 0x07D0; /* TER_limit */ *pTimer_Struc++ = 0x000A; /* TGT_limit */ *pTimer_Struc++ = 0x1162; /* THT_limit */ *pTimer_Struc++ = 0x07D0; /* TRR_limit */ *pTimer_Struc++ = 0x1388; /* TVX_limit */ *pTimer_Struc++ = 0x0000; /* reserved */ } else { *pTimer_Struc++ = 0x03E8; /* prescale */ *pTimer_Struc++ = 0x9C40; /* TPT_limit */ *pTimer_Struc++ = 0x9C40; /* TQP_limit */ *pTimer_Struc++ = 0x0A28; /* TNT_limit */ *pTimer_Struc++ = 0x3E80; /* TBT_limit */ *pTimer_Struc++ = 0x3A98; /* TSM_limit */ *pTimer_Struc++ = 0x1B58; /* TAM_limit */ *pTimer_Struc++ = 0x00C8; /* TBR_limit */ *pTimer_Struc++ = 0x07D0; /* TER_limit */ *pTimer_Struc++ = 0x000A; /* TGT_limit */ *pTimer_Struc++ = 0x4588; /* THT_limit */ *pTimer_Struc++ = 0x1F40; /* TRR_limit */ *pTimer_Struc++ = 0x4E20; /* TVX_limit */ *pTimer_Struc++ = 0x0000; /* reserved */ } /* Set node address. */ *pTimer_Struc++ = dev->dev_addr[0] << 8 | (dev->dev_addr[1] & 0xFF); *pTimer_Struc++ = dev->dev_addr[2] << 8 | (dev->dev_addr[3] & 0xFF); *pTimer_Struc++ = dev->dev_addr[4] << 8 | (dev->dev_addr[5] & 0xFF); /* Set group address. */ *pTimer_Struc++ = tp->group_address_0 << 8 | tp->group_address_0 >> 8; *pTimer_Struc++ = tp->group_address[0] << 8 | tp->group_address[0] >> 8; *pTimer_Struc++ = tp->group_address[1] << 8 | tp->group_address[1] >> 8; /* Set functional address. */ *pTimer_Struc++ = tp->functional_address_0 << 8 | tp->functional_address_0 >> 8; *pTimer_Struc++ = tp->functional_address[0] << 8 | tp->functional_address[0] >> 8; *pTimer_Struc++ = tp->functional_address[1] << 8 | tp->functional_address[1] >> 8; /* Set Bit-Wise group address. */ *pTimer_Struc++ = tp->bitwise_group_address[0] << 8 | tp->bitwise_group_address[0] >> 8; *pTimer_Struc++ = tp->bitwise_group_address[1] << 8 | tp->bitwise_group_address[1] >> 8; /* Set ring number address. */ *pTimer_Struc++ = tp->source_ring_number; *pTimer_Struc++ = tp->target_ring_number; /* Physical drop number. */ *pTimer_Struc++ = (unsigned short)0; *pTimer_Struc++ = (unsigned short)0; /* Product instance ID. */ for(i = 0; i < 9; i++) *pTimer_Struc++ = (unsigned short)0; err = smctr_setup_single_cmd_w_data(dev, ACB_CMD_INIT_TRC_TIMERS, 0); return (err); } static int smctr_issue_init_txrx_cmd(struct net_device *dev) { struct net_local *tp = netdev_priv(dev); unsigned int i; int err; void **txrx_ptrs = (void *)tp->misc_command_data; if((err = smctr_wait_while_cbusy(dev))) return (err); if((err = smctr_wait_cmd(dev))) { printk(KERN_ERR "%s: Hardware failure\n", dev->name); return (err); } /* Initialize Transmit Queue Pointers that are used, to point to * a single FCB. */ for(i = 0; i < NUM_TX_QS_USED; i++) *txrx_ptrs++ = (void *)TRC_POINTER(tp->tx_fcb_head[i]); /* Initialize Transmit Queue Pointers that are NOT used to ZERO. */ for(; i < MAX_TX_QS; i++) *txrx_ptrs++ = (void *)0; /* Initialize Receive Queue Pointers (MAC and Non-MAC) that are * used, to point to a single FCB and a BDB chain of buffers. */ for(i = 0; i < NUM_RX_QS_USED; i++) { *txrx_ptrs++ = (void *)TRC_POINTER(tp->rx_fcb_head[i]); *txrx_ptrs++ = (void *)TRC_POINTER(tp->rx_bdb_head[i]); } /* Initialize Receive Queue Pointers that are NOT used to ZERO. */ for(; i < MAX_RX_QS; i++) { *txrx_ptrs++ = (void *)0; *txrx_ptrs++ = (void *)0; } err = smctr_setup_single_cmd_w_data(dev, ACB_CMD_INIT_TX_RX, 0); return (err); } static int smctr_issue_insert_cmd(struct net_device *dev) { int err; err = smctr_setup_single_cmd(dev, ACB_CMD_INSERT, ACB_SUB_CMD_NOP); return (err); } static int smctr_issue_read_ring_status_cmd(struct net_device *dev) { int err; if((err = smctr_wait_while_cbusy(dev))) return (err); if((err = smctr_wait_cmd(dev))) return (err); err = smctr_setup_single_cmd_w_data(dev, ACB_CMD_READ_TRC_STATUS, RW_TRC_STATUS_BLOCK); return (err); } static int smctr_issue_read_word_cmd(struct net_device *dev, __u16 aword_cnt) { int err; if((err = smctr_wait_while_cbusy(dev))) return (err); if((err = smctr_wait_cmd(dev))) return (err); err = smctr_setup_single_cmd_w_data(dev, ACB_CMD_MCT_READ_VALUE, aword_cnt); return (err); } static int smctr_issue_remove_cmd(struct net_device *dev) { struct net_local *tp = netdev_priv(dev); int err; if((err = smctr_wait_while_cbusy(dev))) return (err); tp->sclb_ptr->resume_control = 0; tp->sclb_ptr->valid_command = SCLB_VALID | SCLB_CMD_REMOVE; smctr_set_ctrl_attention(dev); return (0); } static int smctr_issue_resume_acb_cmd(struct net_device *dev) { struct net_local *tp = netdev_priv(dev); int err; if((err = smctr_wait_while_cbusy(dev))) return (err); tp->sclb_ptr->resume_control = SCLB_RC_ACB; tp->sclb_ptr->valid_command = SCLB_VALID | SCLB_RESUME_CONTROL_VALID; tp->acb_pending = 1; smctr_set_ctrl_attention(dev); return (0); } static int smctr_issue_resume_rx_bdb_cmd(struct net_device *dev, __u16 queue) { struct net_local *tp = netdev_priv(dev); int err; if((err = smctr_wait_while_cbusy(dev))) return (err); if(queue == MAC_QUEUE) tp->sclb_ptr->resume_control = SCLB_RC_RX_MAC_BDB; else tp->sclb_ptr->resume_control = SCLB_RC_RX_NON_MAC_BDB; tp->sclb_ptr->valid_command = SCLB_VALID | SCLB_RESUME_CONTROL_VALID; smctr_set_ctrl_attention(dev); return (0); } static int smctr_issue_resume_rx_fcb_cmd(struct net_device *dev, __u16 queue) { struct net_local *tp = netdev_priv(dev); if(smctr_debug > 10) printk(KERN_DEBUG "%s: smctr_issue_resume_rx_fcb_cmd\n", dev->name); if(smctr_wait_while_cbusy(dev)) return (-1); if(queue == MAC_QUEUE) tp->sclb_ptr->resume_control = SCLB_RC_RX_MAC_FCB; else tp->sclb_ptr->resume_control = SCLB_RC_RX_NON_MAC_FCB; tp->sclb_ptr->valid_command = SCLB_VALID | SCLB_RESUME_CONTROL_VALID; smctr_set_ctrl_attention(dev); return (0); } static int smctr_issue_resume_tx_fcb_cmd(struct net_device *dev, __u16 queue) { struct net_local *tp = netdev_priv(dev); if(smctr_debug > 10) printk(KERN_DEBUG "%s: smctr_issue_resume_tx_fcb_cmd\n", dev->name); if(smctr_wait_while_cbusy(dev)) return (-1); tp->sclb_ptr->resume_control = (SCLB_RC_TFCB0 << queue); tp->sclb_ptr->valid_command = SCLB_RESUME_CONTROL_VALID | SCLB_VALID; smctr_set_ctrl_attention(dev); return (0); } static int smctr_issue_test_internal_rom_cmd(struct net_device *dev) { int err; err = smctr_setup_single_cmd(dev, ACB_CMD_MCT_TEST, TRC_INTERNAL_ROM_TEST); return (err); } static int smctr_issue_test_hic_cmd(struct net_device *dev) { int err; err = smctr_setup_single_cmd(dev, ACB_CMD_HIC_TEST, TRC_HOST_INTERFACE_REG_TEST); return (err); } static int smctr_issue_test_mac_reg_cmd(struct net_device *dev) { int err; err = smctr_setup_single_cmd(dev, ACB_CMD_MCT_TEST, TRC_MAC_REGISTERS_TEST); return (err); } static int smctr_issue_trc_loopback_cmd(struct net_device *dev) { int err; err = smctr_setup_single_cmd(dev, ACB_CMD_MCT_TEST, TRC_INTERNAL_LOOPBACK); return (err); } static int smctr_issue_tri_loopback_cmd(struct net_device *dev) { int err; err = smctr_setup_single_cmd(dev, ACB_CMD_MCT_TEST, TRC_TRI_LOOPBACK); return (err); } static int smctr_issue_write_byte_cmd(struct net_device *dev, short aword_cnt, void *byte) { struct net_local *tp = netdev_priv(dev); unsigned int iword, ibyte; int err; if((err = smctr_wait_while_cbusy(dev))) return (err); if((err = smctr_wait_cmd(dev))) return (err); for(iword = 0, ibyte = 0; iword < (unsigned int)(aword_cnt & 0xff); iword++, ibyte += 2) { tp->misc_command_data[iword] = (*((__u8 *)byte + ibyte) << 8) | (*((__u8 *)byte + ibyte + 1)); } return (smctr_setup_single_cmd_w_data(dev, ACB_CMD_MCT_WRITE_VALUE, aword_cnt)); } static int smctr_issue_write_word_cmd(struct net_device *dev, short aword_cnt, void *word) { struct net_local *tp = netdev_priv(dev); unsigned int i, err; if((err = smctr_wait_while_cbusy(dev))) return (err); if((err = smctr_wait_cmd(dev))) return (err); for(i = 0; i < (unsigned int)(aword_cnt & 0xff); i++) tp->misc_command_data[i] = *((__u16 *)word + i); err = smctr_setup_single_cmd_w_data(dev, ACB_CMD_MCT_WRITE_VALUE, aword_cnt); return (err); } static int smctr_join_complete_state(struct net_device *dev) { int err; err = smctr_setup_single_cmd(dev, ACB_CMD_CHANGE_JOIN_STATE, JS_JOIN_COMPLETE_STATE); return (err); } static int smctr_link_tx_fcbs_to_bdbs(struct net_device *dev) { struct net_local *tp = netdev_priv(dev); unsigned int i, j; FCBlock *fcb; BDBlock *bdb; for(i = 0; i < NUM_TX_QS_USED; i++) { fcb = tp->tx_fcb_head[i]; bdb = tp->tx_bdb_head[i]; for(j = 0; j < tp->num_tx_fcbs[i]; j++) { fcb->bdb_ptr = bdb; fcb->trc_bdb_ptr = TRC_POINTER(bdb); fcb = (FCBlock *)((char *)fcb + sizeof(FCBlock)); bdb = (BDBlock *)((char *)bdb + sizeof(BDBlock)); } } return (0); } static int smctr_load_firmware(struct net_device *dev) { struct net_local *tp = netdev_priv(dev); __u16 i, checksum = 0; int err = 0; if(smctr_debug > 10) printk(KERN_DEBUG "%s: smctr_load_firmware\n", dev->name); tp->ptr_ucode = smctr_code; tp->num_of_tx_buffs = 4; tp->mode_bits |= UMAC; tp->receive_mask = 0; tp->max_packet_size = 4177; /* Can only upload the firmware once per adapter reset. */ if(tp->microcode_version != 0) return (UCODE_PRESENT); /* Verify the firmware exists and is there in the right amount. */ if((tp->ptr_ucode == 0L) || (*(tp->ptr_ucode + UCODE_VERSION_OFFSET) < UCODE_VERSION)) { return (UCODE_NOT_PRESENT); } /* UCODE_SIZE is not included in Checksum. */ for(i = 0; i < *((__u16 *)(tp->ptr_ucode + UCODE_SIZE_OFFSET)); i += 2) checksum += *((__u16 *)(tp->ptr_ucode + 2 + i)); if(checksum) return (UCODE_NOT_PRESENT); /* At this point we have a valid firmware image, lets kick it on up. */ smctr_enable_adapter_ram(dev); smctr_enable_16bit(dev); smctr_set_page(dev, (__u8 *)tp->ram_access); if((smctr_checksum_firmware(dev)) || (*(tp->ptr_ucode + UCODE_VERSION_OFFSET) > tp->microcode_version)) { smctr_enable_adapter_ctrl_store(dev); /* Zero out ram space for firmware. */ for(i = 0; i < CS_RAM_SIZE; i += 2) *((__u16 *)(tp->ram_access + i)) = 0; smctr_decode_firmware(dev); tp->microcode_version = *(tp->ptr_ucode + UCODE_VERSION_OFFSET); *((__u16 *)(tp->ram_access + CS_RAM_VERSION_OFFSET)) = (tp->microcode_version << 8); *((__u16 *)(tp->ram_access + CS_RAM_CHECKSUM_OFFSET)) = ~(tp->microcode_version << 8) + 1; smctr_disable_adapter_ctrl_store(dev); if(smctr_checksum_firmware(dev)) err = HARDWARE_FAILED; } else err = UCODE_PRESENT; smctr_disable_16bit(dev); return (err); } static int smctr_load_node_addr(struct net_device *dev) { int ioaddr = dev->base_addr; unsigned int i; __u8 r; for(i = 0; i < 6; i++) { r = inb(ioaddr + LAR0 + i); dev->dev_addr[i] = (char)r; } dev->addr_len = 6; return (0); } /* Lobe Media Test. * During the transmission of the initial 1500 lobe media MAC frames, * the phase lock loop in the 805 chip may lock, and then un-lock, causing * the 825 to go into a PURGE state. When performing a PURGE, the MCT * microcode will not transmit any frames given to it by the host, and * will consequently cause a timeout. * * NOTE 1: If the monitor_state is MS_BEACON_TEST_STATE, all transmit * queues other then the one used for the lobe_media_test should be * disabled.!? * * NOTE 2: If the monitor_state is MS_BEACON_TEST_STATE and the receive_mask * has any multi-cast or promiscous bits set, the receive_mask needs to * be changed to clear the multi-cast or promiscous mode bits, the lobe_test * run, and then the receive mask set back to its original value if the test * is successful. */ static int smctr_lobe_media_test(struct net_device *dev) { struct net_local *tp = netdev_priv(dev); unsigned int i, perror = 0; unsigned short saved_rcv_mask; if(smctr_debug > 10) printk(KERN_DEBUG "%s: smctr_lobe_media_test\n", dev->name); /* Clear receive mask for lobe test. */ saved_rcv_mask = tp->receive_mask; tp->receive_mask = 0; smctr_chg_rx_mask(dev); /* Setup the lobe media test. */ smctr_lobe_media_test_cmd(dev); if(smctr_wait_cmd(dev)) { smctr_reset_adapter(dev); tp->status = CLOSED; return (LOBE_MEDIA_TEST_FAILED); } /* Tx lobe media test frames. */ for(i = 0; i < 1500; ++i) { if(smctr_send_lobe_media_test(dev)) { if(perror) { smctr_reset_adapter(dev); tp->state = CLOSED; return (LOBE_MEDIA_TEST_FAILED); } else { perror = 1; if(smctr_lobe_media_test_cmd(dev)) { smctr_reset_adapter(dev); tp->state = CLOSED; return (LOBE_MEDIA_TEST_FAILED); } } } } if(smctr_send_dat(dev)) { if(smctr_send_dat(dev)) { smctr_reset_adapter(dev); tp->state = CLOSED; return (LOBE_MEDIA_TEST_FAILED); } } /* Check if any frames received during test. */ if((tp->rx_fcb_curr[MAC_QUEUE]->frame_status) || (tp->rx_fcb_curr[NON_MAC_QUEUE]->frame_status)) { smctr_reset_adapter(dev); tp->state = CLOSED; return (LOBE_MEDIA_TEST_FAILED); } /* Set receive mask to "Promisc" mode. */ tp->receive_mask = saved_rcv_mask; smctr_chg_rx_mask(dev); return (0); } static int smctr_lobe_media_test_cmd(struct net_device *dev) { struct net_local *tp = netdev_priv(dev); int err; if(smctr_debug > 10) printk(KERN_DEBUG "%s: smctr_lobe_media_test_cmd\n", dev->name); /* Change to lobe media test state. */ if(tp->monitor_state != MS_BEACON_TEST_STATE) { smctr_lobe_media_test_state(dev); if(smctr_wait_cmd(dev)) { printk(KERN_ERR "Lobe Failed test state\n"); return (LOBE_MEDIA_TEST_FAILED); } } err = smctr_setup_single_cmd(dev, ACB_CMD_MCT_TEST, TRC_LOBE_MEDIA_TEST); return (err); } static int smctr_lobe_media_test_state(struct net_device *dev) { int err; err = smctr_setup_single_cmd(dev, ACB_CMD_CHANGE_JOIN_STATE, JS_LOBE_TEST_STATE); return (err); } static int smctr_make_8025_hdr(struct net_device *dev, MAC_HEADER *rmf, MAC_HEADER *tmf, __u16 ac_fc) { tmf->ac = MSB(ac_fc); /* msb is access control */ tmf->fc = LSB(ac_fc); /* lsb is frame control */ tmf->sa[0] = dev->dev_addr[0]; tmf->sa[1] = dev->dev_addr[1]; tmf->sa[2] = dev->dev_addr[2]; tmf->sa[3] = dev->dev_addr[3]; tmf->sa[4] = dev->dev_addr[4]; tmf->sa[5] = dev->dev_addr[5]; switch(tmf->vc) { /* Send RQ_INIT to RPS */ case RQ_INIT: tmf->da[0] = 0xc0; tmf->da[1] = 0x00; tmf->da[2] = 0x00; tmf->da[3] = 0x00; tmf->da[4] = 0x00; tmf->da[5] = 0x02; break; /* Send RPT_TX_FORWARD to CRS */ case RPT_TX_FORWARD: tmf->da[0] = 0xc0; tmf->da[1] = 0x00; tmf->da[2] = 0x00; tmf->da[3] = 0x00; tmf->da[4] = 0x00; tmf->da[5] = 0x10; break; /* Everything else goes to sender */ default: tmf->da[0] = rmf->sa[0]; tmf->da[1] = rmf->sa[1]; tmf->da[2] = rmf->sa[2]; tmf->da[3] = rmf->sa[3]; tmf->da[4] = rmf->sa[4]; tmf->da[5] = rmf->sa[5]; break; } return (0); } static int smctr_make_access_pri(struct net_device *dev, MAC_SUB_VECTOR *tsv) { struct net_local *tp = netdev_priv(dev); tsv->svi = AUTHORIZED_ACCESS_PRIORITY; tsv->svl = S_AUTHORIZED_ACCESS_PRIORITY; tsv->svv[0] = MSB(tp->authorized_access_priority); tsv->svv[1] = LSB(tp->authorized_access_priority); return (0); } static int smctr_make_addr_mod(struct net_device *dev, MAC_SUB_VECTOR *tsv) { tsv->svi = ADDRESS_MODIFER; tsv->svl = S_ADDRESS_MODIFER; tsv->svv[0] = 0; tsv->svv[1] = 0; return (0); } static int smctr_make_auth_funct_class(struct net_device *dev, MAC_SUB_VECTOR *tsv) { struct net_local *tp = netdev_priv(dev); tsv->svi = AUTHORIZED_FUNCTION_CLASS; tsv->svl = S_AUTHORIZED_FUNCTION_CLASS; tsv->svv[0] = MSB(tp->authorized_function_classes); tsv->svv[1] = LSB(tp->authorized_function_classes); return (0); } static int smctr_make_corr(struct net_device *dev, MAC_SUB_VECTOR *tsv, __u16 correlator) { tsv->svi = CORRELATOR; tsv->svl = S_CORRELATOR; tsv->svv[0] = MSB(correlator); tsv->svv[1] = LSB(correlator); return (0); } static int smctr_make_funct_addr(struct net_device *dev, MAC_SUB_VECTOR *tsv) { struct net_local *tp = netdev_priv(dev); smctr_get_functional_address(dev); tsv->svi = FUNCTIONAL_ADDRESS; tsv->svl = S_FUNCTIONAL_ADDRESS; tsv->svv[0] = MSB(tp->misc_command_data[0]); tsv->svv[1] = LSB(tp->misc_command_data[0]); tsv->svv[2] = MSB(tp->misc_command_data[1]); tsv->svv[3] = LSB(tp->misc_command_data[1]); return (0); } static int smctr_make_group_addr(struct net_device *dev, MAC_SUB_VECTOR *tsv) { struct net_local *tp = netdev_priv(dev); smctr_get_group_address(dev); tsv->svi = GROUP_ADDRESS; tsv->svl = S_GROUP_ADDRESS; tsv->svv[0] = MSB(tp->misc_command_data[0]); tsv->svv[1] = LSB(tp->misc_command_data[0]); tsv->svv[2] = MSB(tp->misc_command_data[1]); tsv->svv[3] = LSB(tp->misc_command_data[1]); /* Set Group Address Sub-vector to all zeros if only the * Group Address/Functional Address Indicator is set. */ if(tsv->svv[0] == 0x80 && tsv->svv[1] == 0x00 && tsv->svv[2] == 0x00 && tsv->svv[3] == 0x00) tsv->svv[0] = 0x00; return (0); } static int smctr_make_phy_drop_num(struct net_device *dev, MAC_SUB_VECTOR *tsv) { struct net_local *tp = netdev_priv(dev); smctr_get_physical_drop_number(dev); tsv->svi = PHYSICAL_DROP; tsv->svl = S_PHYSICAL_DROP; tsv->svv[0] = MSB(tp->misc_command_data[0]); tsv->svv[1] = LSB(tp->misc_command_data[0]); tsv->svv[2] = MSB(tp->misc_command_data[1]); tsv->svv[3] = LSB(tp->misc_command_data[1]); return (0); } static int smctr_make_product_id(struct net_device *dev, MAC_SUB_VECTOR *tsv) { int i; tsv->svi = PRODUCT_INSTANCE_ID; tsv->svl = S_PRODUCT_INSTANCE_ID; for(i = 0; i < 18; i++) tsv->svv[i] = 0xF0; return (0); } static int smctr_make_station_id(struct net_device *dev, MAC_SUB_VECTOR *tsv) { struct net_local *tp = netdev_priv(dev); smctr_get_station_id(dev); tsv->svi = STATION_IDENTIFER; tsv->svl = S_STATION_IDENTIFER; tsv->svv[0] = MSB(tp->misc_command_data[0]); tsv->svv[1] = LSB(tp->misc_command_data[0]); tsv->svv[2] = MSB(tp->misc_command_data[1]); tsv->svv[3] = LSB(tp->misc_command_data[1]); tsv->svv[4] = MSB(tp->misc_command_data[2]); tsv->svv[5] = LSB(tp->misc_command_data[2]); return (0); } static int smctr_make_ring_station_status(struct net_device *dev, MAC_SUB_VECTOR * tsv) { tsv->svi = RING_STATION_STATUS; tsv->svl = S_RING_STATION_STATUS; tsv->svv[0] = 0; tsv->svv[1] = 0; tsv->svv[2] = 0; tsv->svv[3] = 0; tsv->svv[4] = 0; tsv->svv[5] = 0; return (0); } static int smctr_make_ring_station_version(struct net_device *dev, MAC_SUB_VECTOR *tsv) { struct net_local *tp = netdev_priv(dev); tsv->svi = RING_STATION_VERSION_NUMBER; tsv->svl = S_RING_STATION_VERSION_NUMBER; tsv->svv[0] = 0xe2; /* EBCDIC - S */ tsv->svv[1] = 0xd4; /* EBCDIC - M */ tsv->svv[2] = 0xc3; /* EBCDIC - C */ tsv->svv[3] = 0x40; /* EBCDIC - */ tsv->svv[4] = 0xe5; /* EBCDIC - V */ tsv->svv[5] = 0xF0 + (tp->microcode_version >> 4); tsv->svv[6] = 0xF0 + (tp->microcode_version & 0x0f); tsv->svv[7] = 0x40; /* EBCDIC - */ tsv->svv[8] = 0xe7; /* EBCDIC - X */ if(tp->extra_info & CHIP_REV_MASK) tsv->svv[9] = 0xc5; /* EBCDIC - E */ else tsv->svv[9] = 0xc4; /* EBCDIC - D */ return (0); } static int smctr_make_tx_status_code(struct net_device *dev, MAC_SUB_VECTOR *tsv, __u16 tx_fstatus) { tsv->svi = TRANSMIT_STATUS_CODE; tsv->svl = S_TRANSMIT_STATUS_CODE; tsv->svv[0] = ((tx_fstatus & 0x0100 >> 6) || IBM_PASS_SOURCE_ADDR); /* Stripped frame status of Transmitted Frame */ tsv->svv[1] = tx_fstatus & 0xff; return (0); } static int smctr_make_upstream_neighbor_addr(struct net_device *dev, MAC_SUB_VECTOR *tsv) { struct net_local *tp = netdev_priv(dev); smctr_get_upstream_neighbor_addr(dev); tsv->svi = UPSTREAM_NEIGHBOR_ADDRESS; tsv->svl = S_UPSTREAM_NEIGHBOR_ADDRESS; tsv->svv[0] = MSB(tp->misc_command_data[0]); tsv->svv[1] = LSB(tp->misc_command_data[0]); tsv->svv[2] = MSB(tp->misc_command_data[1]); tsv->svv[3] = LSB(tp->misc_command_data[1]); tsv->svv[4] = MSB(tp->misc_command_data[2]); tsv->svv[5] = LSB(tp->misc_command_data[2]); return (0); } static int smctr_make_wrap_data(struct net_device *dev, MAC_SUB_VECTOR *tsv) { tsv->svi = WRAP_DATA; tsv->svl = S_WRAP_DATA; return (0); } /* * Open/initialize the board. This is called sometime after * booting when the 'ifconfig' program is run. * * This routine should set everything up anew at each open, even * registers that "should" only need to be set once at boot, so that * there is non-reboot way to recover if something goes wrong. */ static int smctr_open(struct net_device *dev) { int err; if(smctr_debug > 10) printk(KERN_DEBUG "%s: smctr_open\n", dev->name); err = smctr_init_adapter(dev); if(err < 0) return (err); return (err); } /* Interrupt driven open of Token card. */ static int smctr_open_tr(struct net_device *dev) { struct net_local *tp = netdev_priv(dev); unsigned long flags; int err; if(smctr_debug > 10) printk(KERN_DEBUG "%s: smctr_open_tr\n", dev->name); /* Now we can actually open the adapter. */ if(tp->status == OPEN) return (0); if(tp->status != INITIALIZED) return (-1); /* FIXME: it would work a lot better if we masked the irq sources on the card here, then we could skip the locking and poll nicely */ spin_lock_irqsave(&tp->lock, flags); smctr_set_page(dev, (__u8 *)tp->ram_access); if((err = smctr_issue_resume_rx_fcb_cmd(dev, (short)MAC_QUEUE))) goto out; if((err = smctr_issue_resume_rx_bdb_cmd(dev, (short)MAC_QUEUE))) goto out; if((err = smctr_issue_resume_rx_fcb_cmd(dev, (short)NON_MAC_QUEUE))) goto out; if((err = smctr_issue_resume_rx_bdb_cmd(dev, (short)NON_MAC_QUEUE))) goto out; tp->status = CLOSED; /* Insert into the Ring or Enter Loopback Mode. */ if((tp->mode_bits & LOOPING_MODE_MASK) == LOOPBACK_MODE_1) { tp->status = CLOSED; if(!(err = smctr_issue_trc_loopback_cmd(dev))) { if(!(err = smctr_wait_cmd(dev))) tp->status = OPEN; } smctr_status_chg(dev); } else { if((tp->mode_bits & LOOPING_MODE_MASK) == LOOPBACK_MODE_2) { tp->status = CLOSED; if(!(err = smctr_issue_tri_loopback_cmd(dev))) { if(!(err = smctr_wait_cmd(dev))) tp->status = OPEN; } smctr_status_chg(dev); } else { if((tp->mode_bits & LOOPING_MODE_MASK) == LOOPBACK_MODE_3) { tp->status = CLOSED; if(!(err = smctr_lobe_media_test_cmd(dev))) { if(!(err = smctr_wait_cmd(dev))) tp->status = OPEN; } smctr_status_chg(dev); } else { if(!(err = smctr_lobe_media_test(dev))) err = smctr_issue_insert_cmd(dev); else { if(err == LOBE_MEDIA_TEST_FAILED) printk(KERN_WARNING "%s: Lobe Media Test Failure - Check cable?\n", dev->name); } } } } out: spin_unlock_irqrestore(&tp->lock, flags); return (err); } /* Check for a network adapter of this type, * and return device structure if one exists. */ struct net_device __init *smctr_probe(int unit) { struct net_device *dev = alloc_trdev(sizeof(struct net_local)); static const unsigned ports[] = { 0x200, 0x220, 0x240, 0x260, 0x280, 0x2A0, 0x2C0, 0x2E0, 0x300, 0x320, 0x340, 0x360, 0x380, 0 }; const unsigned *port; int err = 0; if (!dev) return ERR_PTR(-ENOMEM); SET_MODULE_OWNER(dev); if (unit >= 0) { sprintf(dev->name, "tr%d", unit); netdev_boot_setup_check(dev); } if (dev->base_addr > 0x1ff) /* Check a single specified location. */ err = smctr_probe1(dev, dev->base_addr); else if(dev->base_addr != 0) /* Don't probe at all. */ err =-ENXIO; else { for (port = ports; *port; port++) { err = smctr_probe1(dev, *port); if (!err) break; } } if (err) goto out; err = register_netdev(dev); if (err) goto out1; return dev; out1: #ifdef CONFIG_MCA_LEGACY { struct net_local *tp = netdev_priv(dev); if (tp->slot_num) mca_mark_as_unused(tp->slot_num); } #endif release_region(dev->base_addr, SMCTR_IO_EXTENT); free_irq(dev->irq, dev); out: free_netdev(dev); return ERR_PTR(err); } static int __init smctr_probe1(struct net_device *dev, int ioaddr) { static unsigned version_printed; struct net_local *tp = netdev_priv(dev); int err; __u32 *ram; if(smctr_debug && version_printed++ == 0) printk(version); spin_lock_init(&tp->lock); dev->base_addr = ioaddr; /* Actually detect an adapter now. */ err = smctr_chk_isa(dev); if(err < 0) { if ((err = smctr_chk_mca(dev)) < 0) { err = -ENODEV; goto out; } } tp = netdev_priv(dev); dev->mem_start = tp->ram_base; dev->mem_end = dev->mem_start + 0x10000; ram = (__u32 *)phys_to_virt(dev->mem_start); tp->ram_access = *(__u32 *)&ram; tp->status = NOT_INITIALIZED; err = smctr_load_firmware(dev); if(err != UCODE_PRESENT && err != SUCCESS) { printk(KERN_ERR "%s: Firmware load failed (%d)\n", dev->name, err); err = -EIO; goto out; } /* Allow user to specify ring speed on module insert. */ if(ringspeed == 4) tp->media_type = MEDIA_UTP_4; else tp->media_type = MEDIA_UTP_16; printk(KERN_INFO "%s: %s %s at Io %#4x, Irq %d, Rom %#4x, Ram %#4x.\n", dev->name, smctr_name, smctr_model, (unsigned int)dev->base_addr, dev->irq, tp->rom_base, tp->ram_base); dev->open = smctr_open; dev->stop = smctr_close; dev->hard_start_xmit = smctr_send_packet; dev->tx_timeout = smctr_timeout; dev->watchdog_timeo = HZ; dev->get_stats = smctr_get_stats; dev->set_multicast_list = &smctr_set_multicast_list; return (0); out: return err; } static int smctr_process_rx_packet(MAC_HEADER *rmf, __u16 size, struct net_device *dev, __u16 rx_status) { struct net_local *tp = netdev_priv(dev); struct sk_buff *skb; __u16 rcode, correlator; int err = 0; __u8 xframe = 1; __u16 tx_fstatus; rmf->vl = SWAP_BYTES(rmf->vl); if(rx_status & FCB_RX_STATUS_DA_MATCHED) { switch(rmf->vc) { /* Received MAC Frames Processed by RS. */ case INIT: if((rcode = smctr_rcv_init(dev, rmf, &correlator)) == HARDWARE_FAILED) { return (rcode); } if((err = smctr_send_rsp(dev, rmf, rcode, correlator))) { return (err); } break; case CHG_PARM: if((rcode = smctr_rcv_chg_param(dev, rmf, &correlator)) ==HARDWARE_FAILED) { return (rcode); } if((err = smctr_send_rsp(dev, rmf, rcode, correlator))) { return (err); } break; case RQ_ADDR: if((rcode = smctr_rcv_rq_addr_state_attch(dev, rmf, &correlator)) != POSITIVE_ACK) { if(rcode == HARDWARE_FAILED) return (rcode); else return (smctr_send_rsp(dev, rmf, rcode, correlator)); } if((err = smctr_send_rpt_addr(dev, rmf, correlator))) { return (err); } break; case RQ_ATTCH: if((rcode = smctr_rcv_rq_addr_state_attch(dev, rmf, &correlator)) != POSITIVE_ACK) { if(rcode == HARDWARE_FAILED) return (rcode); else return (smctr_send_rsp(dev, rmf, rcode, correlator)); } if((err = smctr_send_rpt_attch(dev, rmf, correlator))) { return (err); } break; case RQ_STATE: if((rcode = smctr_rcv_rq_addr_state_attch(dev, rmf, &correlator)) != POSITIVE_ACK) { if(rcode == HARDWARE_FAILED) return (rcode); else return (smctr_send_rsp(dev, rmf, rcode, correlator)); } if((err = smctr_send_rpt_state(dev, rmf, correlator))) { return (err); } break; case TX_FORWARD: if((rcode = smctr_rcv_tx_forward(dev, rmf)) != POSITIVE_ACK) { if(rcode == HARDWARE_FAILED) return (rcode); else return (smctr_send_rsp(dev, rmf, rcode, correlator)); } if((err = smctr_send_tx_forward(dev, rmf, &tx_fstatus)) == HARDWARE_FAILED) { return (err); } if(err == A_FRAME_WAS_FORWARDED) { if((err = smctr_send_rpt_tx_forward(dev, rmf, tx_fstatus)) == HARDWARE_FAILED) { return (err); } } break; /* Received MAC Frames Processed by CRS/REM/RPS. */ case RSP: case RQ_INIT: case RPT_NEW_MON: case RPT_SUA_CHG: case RPT_ACTIVE_ERR: case RPT_NN_INCMP: case RPT_ERROR: case RPT_ATTCH: case RPT_STATE: case RPT_ADDR: break; /* Rcvd Att. MAC Frame (if RXATMAC set) or UNKNOWN */ default: xframe = 0; if(!(tp->receive_mask & ACCEPT_ATT_MAC_FRAMES)) { rcode = smctr_rcv_unknown(dev, rmf, &correlator); if((err = smctr_send_rsp(dev, rmf,rcode, correlator))) { return (err); } } break; } } else { /* 1. DA doesn't match (Promiscuous Mode). * 2. Parse for Extended MAC Frame Type. */ switch(rmf->vc) { case RSP: case INIT: case RQ_INIT: case RQ_ADDR: case RQ_ATTCH: case RQ_STATE: case CHG_PARM: case RPT_ADDR: case RPT_ERROR: case RPT_ATTCH: case RPT_STATE: case RPT_NEW_MON: case RPT_SUA_CHG: case RPT_NN_INCMP: case RPT_ACTIVE_ERR: break; default: xframe = 0; break; } } /* NOTE: UNKNOWN MAC frames will NOT be passed up unless * ACCEPT_ATT_MAC_FRAMES is set. */ if(((tp->receive_mask & ACCEPT_ATT_MAC_FRAMES) && (xframe == (__u8)0)) || ((tp->receive_mask & ACCEPT_EXT_MAC_FRAMES) && (xframe == (__u8)1))) { rmf->vl = SWAP_BYTES(rmf->vl); if (!(skb = dev_alloc_skb(size))) return -ENOMEM; skb->len = size; /* Slide data into a sleek skb. */ skb_put(skb, skb->len); memcpy(skb->data, rmf, skb->len); /* Update Counters */ tp->MacStat.rx_packets++; tp->MacStat.rx_bytes += skb->len; /* Kick the packet on up. */ skb->dev = dev; skb->protocol = tr_type_trans(skb, dev); netif_rx(skb); dev->last_rx = jiffies; err = 0; } return (err); } /* Adapter RAM test. Incremental word ODD boundary data test. */ static int smctr_ram_memory_test(struct net_device *dev) { struct net_local *tp = netdev_priv(dev); __u16 page, pages_of_ram, start_pattern = 0, word_pattern = 0, word_read = 0, err_word = 0, err_pattern = 0; unsigned int err_offset; __u32 j, pword; __u8 err = 0; if(smctr_debug > 10) printk(KERN_DEBUG "%s: smctr_ram_memory_test\n", dev->name); start_pattern = 0x0001; pages_of_ram = tp->ram_size / tp->ram_usable; pword = tp->ram_access; /* Incremental word ODD boundary test. */ for(page = 0; (page < pages_of_ram) && (~err); page++, start_pattern += 0x8000) { smctr_set_page(dev, (__u8 *)(tp->ram_access + (page * tp->ram_usable * 1024) + 1)); word_pattern = start_pattern; for(j = 1; j < (__u32)(tp->ram_usable * 1024) - 1; j += 2) *(__u16 *)(pword + j) = word_pattern++; word_pattern = start_pattern; for(j = 1; j < (__u32)(tp->ram_usable * 1024) - 1 && (~err); j += 2, word_pattern++) { word_read = *(__u16 *)(pword + j); if(word_read != word_pattern) { err = (__u8)1; err_offset = j; err_word = word_read; err_pattern = word_pattern; return (RAM_TEST_FAILED); } } } /* Zero out memory. */ for(page = 0; page < pages_of_ram && (~err); page++) { smctr_set_page(dev, (__u8 *)(tp->ram_access + (page * tp->ram_usable * 1024))); word_pattern = 0; for(j = 0; j < (__u32)tp->ram_usable * 1024; j +=2) *(__u16 *)(pword + j) = word_pattern; for(j =0; j < (__u32)tp->ram_usable * 1024 && (~err); j += 2) { word_read = *(__u16 *)(pword + j); if(word_read != word_pattern) { err = (__u8)1; err_offset = j; err_word = word_read; err_pattern = word_pattern; return (RAM_TEST_FAILED); } } } smctr_set_page(dev, (__u8 *)tp->ram_access); return (0); } static int smctr_rcv_chg_param(struct net_device *dev, MAC_HEADER *rmf, __u16 *correlator) { MAC_SUB_VECTOR *rsv; signed short vlen; __u16 rcode = POSITIVE_ACK; unsigned int svectors = F_NO_SUB_VECTORS_FOUND; /* This Frame can only come from a CRS */ if((rmf->dc_sc & SC_MASK) != SC_CRS) return(E_INAPPROPRIATE_SOURCE_CLASS); /* Remove MVID Length from total length. */ vlen = (signed short)rmf->vl - 4; /* Point to First SVID */ rsv = (MAC_SUB_VECTOR *)((__u32)rmf + sizeof(MAC_HEADER)); /* Search for Appropriate SVID's. */ while((vlen > 0) && (rcode == POSITIVE_ACK)) { switch(rsv->svi) { case CORRELATOR: svectors |= F_CORRELATOR; rcode = smctr_set_corr(dev, rsv, correlator); break; case LOCAL_RING_NUMBER: svectors |= F_LOCAL_RING_NUMBER; rcode = smctr_set_local_ring_num(dev, rsv); break; case ASSIGN_PHYSICAL_DROP: svectors |= F_ASSIGN_PHYSICAL_DROP; rcode = smctr_set_phy_drop(dev, rsv); break; case ERROR_TIMER_VALUE: svectors |= F_ERROR_TIMER_VALUE; rcode = smctr_set_error_timer_value(dev, rsv); break; case AUTHORIZED_FUNCTION_CLASS: svectors |= F_AUTHORIZED_FUNCTION_CLASS; rcode = smctr_set_auth_funct_class(dev, rsv); break; case AUTHORIZED_ACCESS_PRIORITY: svectors |= F_AUTHORIZED_ACCESS_PRIORITY; rcode = smctr_set_auth_access_pri(dev, rsv); break; default: rcode = E_SUB_VECTOR_UNKNOWN; break; } /* Let Sender Know if SUM of SV length's is * larger then length in MVID length field */ if((vlen -= rsv->svl) < 0) rcode = E_VECTOR_LENGTH_ERROR; rsv = (MAC_SUB_VECTOR *)((__u32)rsv + rsv->svl); } if(rcode == POSITIVE_ACK) { /* Let Sender Know if MVID length field * is larger then SUM of SV length's */ if(vlen != 0) rcode = E_VECTOR_LENGTH_ERROR; else { /* Let Sender Know if Expected SVID Missing */ if((svectors & R_CHG_PARM) ^ R_CHG_PARM) rcode = E_MISSING_SUB_VECTOR; } } return (rcode); } static int smctr_rcv_init(struct net_device *dev, MAC_HEADER *rmf, __u16 *correlator) { MAC_SUB_VECTOR *rsv; signed short vlen; __u16 rcode = POSITIVE_ACK; unsigned int svectors = F_NO_SUB_VECTORS_FOUND; /* This Frame can only come from a RPS */ if((rmf->dc_sc & SC_MASK) != SC_RPS) return (E_INAPPROPRIATE_SOURCE_CLASS); /* Remove MVID Length from total length. */ vlen = (signed short)rmf->vl - 4; /* Point to First SVID */ rsv = (MAC_SUB_VECTOR *)((__u32)rmf + sizeof(MAC_HEADER)); /* Search for Appropriate SVID's */ while((vlen > 0) && (rcode == POSITIVE_ACK)) { switch(rsv->svi) { case CORRELATOR: svectors |= F_CORRELATOR; rcode = smctr_set_corr(dev, rsv, correlator); break; case LOCAL_RING_NUMBER: svectors |= F_LOCAL_RING_NUMBER; rcode = smctr_set_local_ring_num(dev, rsv); break; case ASSIGN_PHYSICAL_DROP: svectors |= F_ASSIGN_PHYSICAL_DROP; rcode = smctr_set_phy_drop(dev, rsv); break; case ERROR_TIMER_VALUE: svectors |= F_ERROR_TIMER_VALUE; rcode = smctr_set_error_timer_value(dev, rsv); break; default: rcode = E_SUB_VECTOR_UNKNOWN; break; } /* Let Sender Know if SUM of SV length's is * larger then length in MVID length field */ if((vlen -= rsv->svl) < 0) rcode = E_VECTOR_LENGTH_ERROR; rsv = (MAC_SUB_VECTOR *)((__u32)rsv + rsv->svl); } if(rcode == POSITIVE_ACK) { /* Let Sender Know if MVID length field * is larger then SUM of SV length's */ if(vlen != 0) rcode = E_VECTOR_LENGTH_ERROR; else { /* Let Sender Know if Expected SV Missing */ if((svectors & R_INIT) ^ R_INIT) rcode = E_MISSING_SUB_VECTOR; } } return (rcode); } static int smctr_rcv_tx_forward(struct net_device *dev, MAC_HEADER *rmf) { MAC_SUB_VECTOR *rsv; signed short vlen; __u16 rcode = POSITIVE_ACK; unsigned int svectors = F_NO_SUB_VECTORS_FOUND; /* This Frame can only come from a CRS */ if((rmf->dc_sc & SC_MASK) != SC_CRS) return (E_INAPPROPRIATE_SOURCE_CLASS); /* Remove MVID Length from total length */ vlen = (signed short)rmf->vl - 4; /* Point to First SVID */ rsv = (MAC_SUB_VECTOR *)((__u32)rmf + sizeof(MAC_HEADER)); /* Search for Appropriate SVID's */ while((vlen > 0) && (rcode == POSITIVE_ACK)) { switch(rsv->svi) { case FRAME_FORWARD: svectors |= F_FRAME_FORWARD; rcode = smctr_set_frame_forward(dev, rsv, rmf->dc_sc); break; default: rcode = E_SUB_VECTOR_UNKNOWN; break; } /* Let Sender Know if SUM of SV length's is * larger then length in MVID length field */ if((vlen -= rsv->svl) < 0) rcode = E_VECTOR_LENGTH_ERROR; rsv = (MAC_SUB_VECTOR *)((__u32)rsv + rsv->svl); } if(rcode == POSITIVE_ACK) { /* Let Sender Know if MVID length field * is larger then SUM of SV length's */ if(vlen != 0) rcode = E_VECTOR_LENGTH_ERROR; else { /* Let Sender Know if Expected SV Missing */ if((svectors & R_TX_FORWARD) ^ R_TX_FORWARD) rcode = E_MISSING_SUB_VECTOR; } } return (rcode); } static int smctr_rcv_rq_addr_state_attch(struct net_device *dev, MAC_HEADER *rmf, __u16 *correlator) { MAC_SUB_VECTOR *rsv; signed short vlen; __u16 rcode = POSITIVE_ACK; unsigned int svectors = F_NO_SUB_VECTORS_FOUND; /* Remove MVID Length from total length */ vlen = (signed short)rmf->vl - 4; /* Point to First SVID */ rsv = (MAC_SUB_VECTOR *)((__u32)rmf + sizeof(MAC_HEADER)); /* Search for Appropriate SVID's */ while((vlen > 0) && (rcode == POSITIVE_ACK)) { switch(rsv->svi) { case CORRELATOR: svectors |= F_CORRELATOR; rcode = smctr_set_corr(dev, rsv, correlator); break; default: rcode = E_SUB_VECTOR_UNKNOWN; break; } /* Let Sender Know if SUM of SV length's is * larger then length in MVID length field */ if((vlen -= rsv->svl) < 0) rcode = E_VECTOR_LENGTH_ERROR; rsv = (MAC_SUB_VECTOR *)((__u32)rsv + rsv->svl); } if(rcode == POSITIVE_ACK) { /* Let Sender Know if MVID length field * is larger then SUM of SV length's */ if(vlen != 0) rcode = E_VECTOR_LENGTH_ERROR; else { /* Let Sender Know if Expected SVID Missing */ if((svectors & R_RQ_ATTCH_STATE_ADDR) ^ R_RQ_ATTCH_STATE_ADDR) rcode = E_MISSING_SUB_VECTOR; } } return (rcode); } static int smctr_rcv_unknown(struct net_device *dev, MAC_HEADER *rmf, __u16 *correlator) { MAC_SUB_VECTOR *rsv; signed short vlen; *correlator = 0; /* Remove MVID Length from total length */ vlen = (signed short)rmf->vl - 4; /* Point to First SVID */ rsv = (MAC_SUB_VECTOR *)((__u32)rmf + sizeof(MAC_HEADER)); /* Search for CORRELATOR for RSP to UNKNOWN */ while((vlen > 0) && (*correlator == 0)) { switch(rsv->svi) { case CORRELATOR: smctr_set_corr(dev, rsv, correlator); break; default: break; } vlen -= rsv->svl; rsv = (MAC_SUB_VECTOR *)((__u32)rsv + rsv->svl); } return (E_UNRECOGNIZED_VECTOR_ID); } /* * Reset the 825 NIC and exit w: * 1. The NIC reset cleared (non-reset state), halted and un-initialized. * 2. TINT masked. * 3. CBUSY masked. * 4. TINT clear. * 5. CBUSY clear. */ static int smctr_reset_adapter(struct net_device *dev) { struct net_local *tp = netdev_priv(dev); int ioaddr = dev->base_addr; /* Reseting the NIC will put it in a halted and un-initialized state. */ smctr_set_trc_reset(ioaddr); mdelay(200); /* ~2 ms */ smctr_clear_trc_reset(ioaddr); mdelay(200); /* ~2 ms */ /* Remove any latched interrupts that occurred prior to reseting the * adapter or possibily caused by line glitches due to the reset. */ outb(tp->trc_mask | CSR_CLRTINT | CSR_CLRCBUSY, ioaddr + CSR); return (0); } static int smctr_restart_tx_chain(struct net_device *dev, short queue) { struct net_local *tp = netdev_priv(dev); int err = 0; if(smctr_debug > 10) printk(KERN_DEBUG "%s: smctr_restart_tx_chain\n", dev->name); if(tp->num_tx_fcbs_used[queue] != 0 && tp->tx_queue_status[queue] == NOT_TRANSMITING) { tp->tx_queue_status[queue] = TRANSMITING; err = smctr_issue_resume_tx_fcb_cmd(dev, queue); } return (err); } static int smctr_ring_status_chg(struct net_device *dev) { struct net_local *tp = netdev_priv(dev); if(smctr_debug > 10) printk(KERN_DEBUG "%s: smctr_ring_status_chg\n", dev->name); /* Check for ring_status_flag: whenever MONITOR_STATE_BIT * Bit is set, check value of monitor_state, only then we * enable and start transmit/receive timeout (if and only * if it is MS_ACTIVE_MONITOR_STATE or MS_STANDBY_MONITOR_STATE) */ if(tp->ring_status_flags == MONITOR_STATE_CHANGED) { if((tp->monitor_state == MS_ACTIVE_MONITOR_STATE) || (tp->monitor_state == MS_STANDBY_MONITOR_STATE)) { tp->monitor_state_ready = 1; } else { /* if adapter is NOT in either active monitor * or standby monitor state => Disable * transmit/receive timeout. */ tp->monitor_state_ready = 0; /* Ring speed problem, switching to auto mode. */ if(tp->monitor_state == MS_MONITOR_FSM_INACTIVE && !tp->cleanup) { printk(KERN_INFO "%s: Incorrect ring speed switching.\n", dev->name); smctr_set_ring_speed(dev); } } } if(!(tp->ring_status_flags & RING_STATUS_CHANGED)) return (0); switch(tp->ring_status) { case RING_RECOVERY: printk(KERN_INFO "%s: Ring Recovery\n", dev->name); tp->current_ring_status |= RING_RECOVERY; break; case SINGLE_STATION: printk(KERN_INFO "%s: Single Statinon\n", dev->name); tp->current_ring_status |= SINGLE_STATION; break; case COUNTER_OVERFLOW: printk(KERN_INFO "%s: Counter Overflow\n", dev->name); tp->current_ring_status |= COUNTER_OVERFLOW; break; case REMOVE_RECEIVED: printk(KERN_INFO "%s: Remove Received\n", dev->name); tp->current_ring_status |= REMOVE_RECEIVED; break; case AUTO_REMOVAL_ERROR: printk(KERN_INFO "%s: Auto Remove Error\n", dev->name); tp->current_ring_status |= AUTO_REMOVAL_ERROR; break; case LOBE_WIRE_FAULT: printk(KERN_INFO "%s: Lobe Wire Fault\n", dev->name); tp->current_ring_status |= LOBE_WIRE_FAULT; break; case TRANSMIT_BEACON: printk(KERN_INFO "%s: Transmit Beacon\n", dev->name); tp->current_ring_status |= TRANSMIT_BEACON; break; case SOFT_ERROR: printk(KERN_INFO "%s: Soft Error\n", dev->name); tp->current_ring_status |= SOFT_ERROR; break; case HARD_ERROR: printk(KERN_INFO "%s: Hard Error\n", dev->name); tp->current_ring_status |= HARD_ERROR; break; case SIGNAL_LOSS: printk(KERN_INFO "%s: Signal Loss\n", dev->name); tp->current_ring_status |= SIGNAL_LOSS; break; default: printk(KERN_INFO "%s: Unknown ring status change\n", dev->name); break; } return (0); } static int smctr_rx_frame(struct net_device *dev) { struct net_local *tp = netdev_priv(dev); __u16 queue, status, rx_size, err = 0; __u8 *pbuff; if(smctr_debug > 10) printk(KERN_DEBUG "%s: smctr_rx_frame\n", dev->name); queue = tp->receive_queue_number; while((status = tp->rx_fcb_curr[queue]->frame_status) != SUCCESS) { err = HARDWARE_FAILED; if(((status & 0x007f) == 0) || ((tp->receive_mask & ACCEPT_ERR_PACKETS) != 0)) { /* frame length less the CRC (4 bytes) + FS (1 byte) */ rx_size = tp->rx_fcb_curr[queue]->frame_length - 5; pbuff = smctr_get_rx_pointer(dev, queue); smctr_set_page(dev, pbuff); smctr_disable_16bit(dev); /* pbuff points to addr within one page */ pbuff = (__u8 *)PAGE_POINTER(pbuff); if(queue == NON_MAC_QUEUE) { struct sk_buff *skb; skb = dev_alloc_skb(rx_size); if (skb) { skb_put(skb, rx_size); memcpy(skb->data, pbuff, rx_size); /* Update Counters */ tp->MacStat.rx_packets++; tp->MacStat.rx_bytes += skb->len; /* Kick the packet on up. */ skb->dev = dev; skb->protocol = tr_type_trans(skb, dev); netif_rx(skb); dev->last_rx = jiffies; } else { } } else smctr_process_rx_packet((MAC_HEADER *)pbuff, rx_size, dev, status); } smctr_enable_16bit(dev); smctr_set_page(dev, (__u8 *)tp->ram_access); smctr_update_rx_chain(dev, queue); if(err != SUCCESS) break; } return (err); } static int smctr_send_dat(struct net_device *dev) { struct net_local *tp = netdev_priv(dev); unsigned int i, err; MAC_HEADER *tmf; FCBlock *fcb; if(smctr_debug > 10) printk(KERN_DEBUG "%s: smctr_send_dat\n", dev->name); if((fcb = smctr_get_tx_fcb(dev, MAC_QUEUE, sizeof(MAC_HEADER))) == (FCBlock *)(-1L)) { return (OUT_OF_RESOURCES); } /* Initialize DAT Data Fields. */ tmf = (MAC_HEADER *)fcb->bdb_ptr->data_block_ptr; tmf->ac = MSB(AC_FC_DAT); tmf->fc = LSB(AC_FC_DAT); for(i = 0; i < 6; i++) { tmf->sa[i] = dev->dev_addr[i]; tmf->da[i] = dev->dev_addr[i]; } tmf->vc = DAT; tmf->dc_sc = DC_RS | SC_RS; tmf->vl = 4; tmf->vl = SWAP_BYTES(tmf->vl); /* Start Transmit. */ if((err = smctr_trc_send_packet(dev, fcb, MAC_QUEUE))) return (err); /* Wait for Transmit to Complete */ for(i = 0; i < 10000; i++) { if(fcb->frame_status & FCB_COMMAND_DONE) break; mdelay(1); } /* Check if GOOD frame Tx'ed. */ if(!(fcb->frame_status & FCB_COMMAND_DONE) || fcb->frame_status & (FCB_TX_STATUS_E | FCB_TX_AC_BITS)) { return (INITIALIZE_FAILED); } /* De-allocated Tx FCB and Frame Buffer * The FCB must be de-allocated manually if executing with * interrupts disabled, other wise the ISR (LM_Service_Events) * will de-allocate it when the interrupt occurs. */ tp->tx_queue_status[MAC_QUEUE] = NOT_TRANSMITING; smctr_update_tx_chain(dev, fcb, MAC_QUEUE); return (0); } static void smctr_timeout(struct net_device *dev) { /* * If we get here, some higher level has decided we are broken. * There should really be a "kick me" function call instead. * * Resetting the token ring adapter takes a long time so just * fake transmission time and go on trying. Our own timeout * routine is in sktr_timer_chk() */ dev->trans_start = jiffies; netif_wake_queue(dev); } /* * Gets skb from system, queues it and checks if it can be sent */ static int smctr_send_packet(struct sk_buff *skb, struct net_device *dev) { struct net_local *tp = netdev_priv(dev); if(smctr_debug > 10) printk(KERN_DEBUG "%s: smctr_send_packet\n", dev->name); /* * Block a transmit overlap */ netif_stop_queue(dev); if(tp->QueueSkb == 0) return (1); /* Return with tbusy set: queue full */ tp->QueueSkb--; skb_queue_tail(&tp->SendSkbQueue, skb); smctr_hardware_send_packet(dev, tp); if(tp->QueueSkb > 0) netif_wake_queue(dev); return (0); } static int smctr_send_lobe_media_test(struct net_device *dev) { struct net_local *tp = netdev_priv(dev); MAC_SUB_VECTOR *tsv; MAC_HEADER *tmf; FCBlock *fcb; __u32 i; int err; if(smctr_debug > 15) printk(KERN_DEBUG "%s: smctr_send_lobe_media_test\n", dev->name); if((fcb = smctr_get_tx_fcb(dev, MAC_QUEUE, sizeof(struct trh_hdr) + S_WRAP_DATA + S_WRAP_DATA)) == (FCBlock *)(-1L)) { return (OUT_OF_RESOURCES); } /* Initialize DAT Data Fields. */ tmf = (MAC_HEADER *)fcb->bdb_ptr->data_block_ptr; tmf->ac = MSB(AC_FC_LOBE_MEDIA_TEST); tmf->fc = LSB(AC_FC_LOBE_MEDIA_TEST); for(i = 0; i < 6; i++) { tmf->da[i] = 0; tmf->sa[i] = dev->dev_addr[i]; } tmf->vc = LOBE_MEDIA_TEST; tmf->dc_sc = DC_RS | SC_RS; tmf->vl = 4; tsv = (MAC_SUB_VECTOR *)((__u32)tmf + sizeof(MAC_HEADER)); smctr_make_wrap_data(dev, tsv); tmf->vl += tsv->svl; tsv = (MAC_SUB_VECTOR *)((__u32)tsv + tsv->svl); smctr_make_wrap_data(dev, tsv); tmf->vl += tsv->svl; /* Start Transmit. */ tmf->vl = SWAP_BYTES(tmf->vl); if((err = smctr_trc_send_packet(dev, fcb, MAC_QUEUE))) return (err); /* Wait for Transmit to Complete. (10 ms). */ for(i=0; i < 10000; i++) { if(fcb->frame_status & FCB_COMMAND_DONE) break; mdelay(1); } /* Check if GOOD frame Tx'ed */ if(!(fcb->frame_status & FCB_COMMAND_DONE) || fcb->frame_status & (FCB_TX_STATUS_E | FCB_TX_AC_BITS)) { return (LOBE_MEDIA_TEST_FAILED); } /* De-allocated Tx FCB and Frame Buffer * The FCB must be de-allocated manually if executing with * interrupts disabled, other wise the ISR (LM_Service_Events) * will de-allocate it when the interrupt occurs. */ tp->tx_queue_status[MAC_QUEUE] = NOT_TRANSMITING; smctr_update_tx_chain(dev, fcb, MAC_QUEUE); return (0); } static int smctr_send_rpt_addr(struct net_device *dev, MAC_HEADER *rmf, __u16 correlator) { MAC_HEADER *tmf; MAC_SUB_VECTOR *tsv; FCBlock *fcb; if((fcb = smctr_get_tx_fcb(dev, MAC_QUEUE, sizeof(MAC_HEADER) + S_CORRELATOR + S_PHYSICAL_DROP + S_UPSTREAM_NEIGHBOR_ADDRESS + S_ADDRESS_MODIFER + S_GROUP_ADDRESS + S_FUNCTIONAL_ADDRESS)) == (FCBlock *)(-1L)) { return (0); } tmf = (MAC_HEADER *)fcb->bdb_ptr->data_block_ptr; tmf->vc = RPT_ADDR; tmf->dc_sc = (rmf->dc_sc & SC_MASK) << 4; tmf->vl = 4; smctr_make_8025_hdr(dev, rmf, tmf, AC_FC_RPT_ADDR); tsv = (MAC_SUB_VECTOR *)((__u32)tmf + sizeof(MAC_HEADER)); smctr_make_corr(dev, tsv, correlator); tmf->vl += tsv->svl; tsv = (MAC_SUB_VECTOR *)((__u32)tsv + tsv->svl); smctr_make_phy_drop_num(dev, tsv); tmf->vl += tsv->svl; tsv = (MAC_SUB_VECTOR *)((__u32)tsv + tsv->svl); smctr_make_upstream_neighbor_addr(dev, tsv); tmf->vl += tsv->svl; tsv = (MAC_SUB_VECTOR *)((__u32)tsv + tsv->svl); smctr_make_addr_mod(dev, tsv); tmf->vl += tsv->svl; tsv = (MAC_SUB_VECTOR *)((__u32)tsv + tsv->svl); smctr_make_group_addr(dev, tsv); tmf->vl += tsv->svl; tsv = (MAC_SUB_VECTOR *)((__u32)tsv + tsv->svl); smctr_make_funct_addr(dev, tsv); tmf->vl += tsv->svl; /* Subtract out MVID and MVL which is * include in both vl and MAC_HEADER */ /* fcb->frame_length = tmf->vl + sizeof(MAC_HEADER) - 4; fcb->bdb_ptr->buffer_length = tmf->vl + sizeof(MAC_HEADER) - 4; */ tmf->vl = SWAP_BYTES(tmf->vl); return (smctr_trc_send_packet(dev, fcb, MAC_QUEUE)); } static int smctr_send_rpt_attch(struct net_device *dev, MAC_HEADER *rmf, __u16 correlator) { MAC_HEADER *tmf; MAC_SUB_VECTOR *tsv; FCBlock *fcb; if((fcb = smctr_get_tx_fcb(dev, MAC_QUEUE, sizeof(MAC_HEADER) + S_CORRELATOR + S_PRODUCT_INSTANCE_ID + S_FUNCTIONAL_ADDRESS + S_AUTHORIZED_FUNCTION_CLASS + S_AUTHORIZED_ACCESS_PRIORITY)) == (FCBlock *)(-1L)) { return (0); } tmf = (MAC_HEADER *)fcb->bdb_ptr->data_block_ptr; tmf->vc = RPT_ATTCH; tmf->dc_sc = (rmf->dc_sc & SC_MASK) << 4; tmf->vl = 4; smctr_make_8025_hdr(dev, rmf, tmf, AC_FC_RPT_ATTCH); tsv = (MAC_SUB_VECTOR *)((__u32)tmf + sizeof(MAC_HEADER)); smctr_make_corr(dev, tsv, correlator); tmf->vl += tsv->svl; tsv = (MAC_SUB_VECTOR *)((__u32)tsv + tsv->svl); smctr_make_product_id(dev, tsv); tmf->vl += tsv->svl; tsv = (MAC_SUB_VECTOR *)((__u32)tsv + tsv->svl); smctr_make_funct_addr(dev, tsv); tmf->vl += tsv->svl; tsv = (MAC_SUB_VECTOR *)((__u32)tsv + tsv->svl); smctr_make_auth_funct_class(dev, tsv); tmf->vl += tsv->svl; tsv = (MAC_SUB_VECTOR *)((__u32)tsv + tsv->svl); smctr_make_access_pri(dev, tsv); tmf->vl += tsv->svl; /* Subtract out MVID and MVL which is * include in both vl and MAC_HEADER */ /* fcb->frame_length = tmf->vl + sizeof(MAC_HEADER) - 4; fcb->bdb_ptr->buffer_length = tmf->vl + sizeof(MAC_HEADER) - 4; */ tmf->vl = SWAP_BYTES(tmf->vl); return (smctr_trc_send_packet(dev, fcb, MAC_QUEUE)); } static int smctr_send_rpt_state(struct net_device *dev, MAC_HEADER *rmf, __u16 correlator) { MAC_HEADER *tmf; MAC_SUB_VECTOR *tsv; FCBlock *fcb; if((fcb = smctr_get_tx_fcb(dev, MAC_QUEUE, sizeof(MAC_HEADER) + S_CORRELATOR + S_RING_STATION_VERSION_NUMBER + S_RING_STATION_STATUS + S_STATION_IDENTIFER)) == (FCBlock *)(-1L)) { return (0); } tmf = (MAC_HEADER *)fcb->bdb_ptr->data_block_ptr; tmf->vc = RPT_STATE; tmf->dc_sc = (rmf->dc_sc & SC_MASK) << 4; tmf->vl = 4; smctr_make_8025_hdr(dev, rmf, tmf, AC_FC_RPT_STATE); tsv = (MAC_SUB_VECTOR *)((__u32)tmf + sizeof(MAC_HEADER)); smctr_make_corr(dev, tsv, correlator); tmf->vl += tsv->svl; tsv = (MAC_SUB_VECTOR *)((__u32)tsv + tsv->svl); smctr_make_ring_station_version(dev, tsv); tmf->vl += tsv->svl; tsv = (MAC_SUB_VECTOR *)((__u32)tsv + tsv->svl); smctr_make_ring_station_status(dev, tsv); tmf->vl += tsv->svl; tsv = (MAC_SUB_VECTOR *)((__u32)tsv + tsv->svl); smctr_make_station_id(dev, tsv); tmf->vl += tsv->svl; /* Subtract out MVID and MVL which is * include in both vl and MAC_HEADER */ /* fcb->frame_length = tmf->vl + sizeof(MAC_HEADER) - 4; fcb->bdb_ptr->buffer_length = tmf->vl + sizeof(MAC_HEADER) - 4; */ tmf->vl = SWAP_BYTES(tmf->vl); return (smctr_trc_send_packet(dev, fcb, MAC_QUEUE)); } static int smctr_send_rpt_tx_forward(struct net_device *dev, MAC_HEADER *rmf, __u16 tx_fstatus) { MAC_HEADER *tmf; MAC_SUB_VECTOR *tsv; FCBlock *fcb; if((fcb = smctr_get_tx_fcb(dev, MAC_QUEUE, sizeof(MAC_HEADER) + S_TRANSMIT_STATUS_CODE)) == (FCBlock *)(-1L)) { return (0); } tmf = (MAC_HEADER *)fcb->bdb_ptr->data_block_ptr; tmf->vc = RPT_TX_FORWARD; tmf->dc_sc = (rmf->dc_sc & SC_MASK) << 4; tmf->vl = 4; smctr_make_8025_hdr(dev, rmf, tmf, AC_FC_RPT_TX_FORWARD); tsv = (MAC_SUB_VECTOR *)((__u32)tmf + sizeof(MAC_HEADER)); smctr_make_tx_status_code(dev, tsv, tx_fstatus); tmf->vl += tsv->svl; /* Subtract out MVID and MVL which is * include in both vl and MAC_HEADER */ /* fcb->frame_length = tmf->vl + sizeof(MAC_HEADER) - 4; fcb->bdb_ptr->buffer_length = tmf->vl + sizeof(MAC_HEADER) - 4; */ tmf->vl = SWAP_BYTES(tmf->vl); return(smctr_trc_send_packet(dev, fcb, MAC_QUEUE)); } static int smctr_send_rsp(struct net_device *dev, MAC_HEADER *rmf, __u16 rcode, __u16 correlator) { MAC_HEADER *tmf; MAC_SUB_VECTOR *tsv; FCBlock *fcb; if((fcb = smctr_get_tx_fcb(dev, MAC_QUEUE, sizeof(MAC_HEADER) + S_CORRELATOR + S_RESPONSE_CODE)) == (FCBlock *)(-1L)) { return (0); } tmf = (MAC_HEADER *)fcb->bdb_ptr->data_block_ptr; tmf->vc = RSP; tmf->dc_sc = (rmf->dc_sc & SC_MASK) << 4; tmf->vl = 4; smctr_make_8025_hdr(dev, rmf, tmf, AC_FC_RSP); tsv = (MAC_SUB_VECTOR *)((__u32)tmf + sizeof(MAC_HEADER)); smctr_make_corr(dev, tsv, correlator); return (0); } static int smctr_send_rq_init(struct net_device *dev) { struct net_local *tp = netdev_priv(dev); MAC_HEADER *tmf; MAC_SUB_VECTOR *tsv; FCBlock *fcb; unsigned int i, count = 0; __u16 fstatus; int err; do { if(((fcb = smctr_get_tx_fcb(dev, MAC_QUEUE, sizeof(MAC_HEADER) + S_PRODUCT_INSTANCE_ID + S_UPSTREAM_NEIGHBOR_ADDRESS + S_RING_STATION_VERSION_NUMBER + S_ADDRESS_MODIFER)) == (FCBlock *)(-1L))) { return (0); } tmf = (MAC_HEADER *)fcb->bdb_ptr->data_block_ptr; tmf->vc = RQ_INIT; tmf->dc_sc = DC_RPS | SC_RS; tmf->vl = 4; smctr_make_8025_hdr(dev, NULL, tmf, AC_FC_RQ_INIT); tsv = (MAC_SUB_VECTOR *)((__u32)tmf + sizeof(MAC_HEADER)); smctr_make_product_id(dev, tsv); tmf->vl += tsv->svl; tsv = (MAC_SUB_VECTOR *)((__u32)tsv + tsv->svl); smctr_make_upstream_neighbor_addr(dev, tsv); tmf->vl += tsv->svl; tsv = (MAC_SUB_VECTOR *)((__u32)tsv + tsv->svl); smctr_make_ring_station_version(dev, tsv); tmf->vl += tsv->svl; tsv = (MAC_SUB_VECTOR *)((__u32)tsv + tsv->svl); smctr_make_addr_mod(dev, tsv); tmf->vl += tsv->svl; /* Subtract out MVID and MVL which is * include in both vl and MAC_HEADER */ /* fcb->frame_length = tmf->vl + sizeof(MAC_HEADER) - 4; fcb->bdb_ptr->buffer_length = tmf->vl + sizeof(MAC_HEADER) - 4; */ tmf->vl = SWAP_BYTES(tmf->vl); if((err = smctr_trc_send_packet(dev, fcb, MAC_QUEUE))) return (err); /* Wait for Transmit to Complete */ for(i = 0; i < 10000; i++) { if(fcb->frame_status & FCB_COMMAND_DONE) break; mdelay(1); } /* Check if GOOD frame Tx'ed */ fstatus = fcb->frame_status; if(!(fstatus & FCB_COMMAND_DONE)) return (HARDWARE_FAILED); if(!(fstatus & FCB_TX_STATUS_E)) count++; /* De-allocated Tx FCB and Frame Buffer * The FCB must be de-allocated manually if executing with * interrupts disabled, other wise the ISR (LM_Service_Events) * will de-allocate it when the interrupt occurs. */ tp->tx_queue_status[MAC_QUEUE] = NOT_TRANSMITING; smctr_update_tx_chain(dev, fcb, MAC_QUEUE); } while(count < 4 && ((fstatus & FCB_TX_AC_BITS) ^ FCB_TX_AC_BITS)); return (smctr_join_complete_state(dev)); } static int smctr_send_tx_forward(struct net_device *dev, MAC_HEADER *rmf, __u16 *tx_fstatus) { struct net_local *tp = netdev_priv(dev); FCBlock *fcb; unsigned int i; int err; /* Check if this is the END POINT of the Transmit Forward Chain. */ if(rmf->vl <= 18) return (0); /* Allocate Transmit FCB only by requesting 0 bytes * of data buffer. */ if((fcb = smctr_get_tx_fcb(dev, MAC_QUEUE, 0)) == (FCBlock *)(-1L)) return (0); /* Set pointer to Transmit Frame Buffer to the data * portion of the received TX Forward frame, making * sure to skip over the Vector Code (vc) and Vector * length (vl). */ fcb->bdb_ptr->trc_data_block_ptr = TRC_POINTER((__u32)rmf + sizeof(MAC_HEADER) + 2); fcb->bdb_ptr->data_block_ptr = (__u16 *)((__u32)rmf + sizeof(MAC_HEADER) + 2); fcb->frame_length = rmf->vl - 4 - 2; fcb->bdb_ptr->buffer_length = rmf->vl - 4 - 2; if((err = smctr_trc_send_packet(dev, fcb, MAC_QUEUE))) return (err); /* Wait for Transmit to Complete */ for(i = 0; i < 10000; i++) { if(fcb->frame_status & FCB_COMMAND_DONE) break; mdelay(1); } /* Check if GOOD frame Tx'ed */ if(!(fcb->frame_status & FCB_COMMAND_DONE)) { if((err = smctr_issue_resume_tx_fcb_cmd(dev, MAC_QUEUE))) return (err); for(i = 0; i < 10000; i++) { if(fcb->frame_status & FCB_COMMAND_DONE) break; mdelay(1); } if(!(fcb->frame_status & FCB_COMMAND_DONE)) return (HARDWARE_FAILED); } *tx_fstatus = fcb->frame_status; return (A_FRAME_WAS_FORWARDED); } static int smctr_set_auth_access_pri(struct net_device *dev, MAC_SUB_VECTOR *rsv) { struct net_local *tp = netdev_priv(dev); if(rsv->svl != S_AUTHORIZED_ACCESS_PRIORITY) return (E_SUB_VECTOR_LENGTH_ERROR); tp->authorized_access_priority = (rsv->svv[0] << 8 | rsv->svv[1]); return (POSITIVE_ACK); } static int smctr_set_auth_funct_class(struct net_device *dev, MAC_SUB_VECTOR *rsv) { struct net_local *tp = netdev_priv(dev); if(rsv->svl != S_AUTHORIZED_FUNCTION_CLASS) return (E_SUB_VECTOR_LENGTH_ERROR); tp->authorized_function_classes = (rsv->svv[0] << 8 | rsv->svv[1]); return (POSITIVE_ACK); } static int smctr_set_corr(struct net_device *dev, MAC_SUB_VECTOR *rsv, __u16 *correlator) { if(rsv->svl != S_CORRELATOR) return (E_SUB_VECTOR_LENGTH_ERROR); *correlator = (rsv->svv[0] << 8 | rsv->svv[1]); return (POSITIVE_ACK); } static int smctr_set_error_timer_value(struct net_device *dev, MAC_SUB_VECTOR *rsv) { __u16 err_tval; int err; if(rsv->svl != S_ERROR_TIMER_VALUE) return (E_SUB_VECTOR_LENGTH_ERROR); err_tval = (rsv->svv[0] << 8 | rsv->svv[1])*10; smctr_issue_write_word_cmd(dev, RW_TER_THRESHOLD, &err_tval); if((err = smctr_wait_cmd(dev))) return (err); return (POSITIVE_ACK); } static int smctr_set_frame_forward(struct net_device *dev, MAC_SUB_VECTOR *rsv, __u8 dc_sc) { if((rsv->svl < 2) || (rsv->svl > S_FRAME_FORWARD)) return (E_SUB_VECTOR_LENGTH_ERROR); if((dc_sc & DC_MASK) != DC_CRS) { if(rsv->svl >= 2 && rsv->svl < 20) return (E_TRANSMIT_FORWARD_INVALID); if((rsv->svv[0] != 0) || (rsv->svv[1] != 0)) return (E_TRANSMIT_FORWARD_INVALID); } return (POSITIVE_ACK); } static int smctr_set_local_ring_num(struct net_device *dev, MAC_SUB_VECTOR *rsv) { struct net_local *tp = netdev_priv(dev); if(rsv->svl != S_LOCAL_RING_NUMBER) return (E_SUB_VECTOR_LENGTH_ERROR); if(tp->ptr_local_ring_num) *(__u16 *)(tp->ptr_local_ring_num) = (rsv->svv[0] << 8 | rsv->svv[1]); return (POSITIVE_ACK); } static unsigned short smctr_set_ctrl_attention(struct net_device *dev) { struct net_local *tp = netdev_priv(dev); int ioaddr = dev->base_addr; if(tp->bic_type == BIC_585_CHIP) outb((tp->trc_mask | HWR_CA), ioaddr + HWR); else { outb((tp->trc_mask | CSR_CA), ioaddr + CSR); outb(tp->trc_mask, ioaddr + CSR); } return (0); } static void smctr_set_multicast_list(struct net_device *dev) { if(smctr_debug > 10) printk(KERN_DEBUG "%s: smctr_set_multicast_list\n", dev->name); return; } static int smctr_set_page(struct net_device *dev, __u8 *buf) { struct net_local *tp = netdev_priv(dev); __u8 amask; __u32 tptr; tptr = (__u32)buf - (__u32)tp->ram_access; amask = (__u8)((tptr & PR_PAGE_MASK) >> 8); outb(amask, dev->base_addr + PR); return (0); } static int smctr_set_phy_drop(struct net_device *dev, MAC_SUB_VECTOR *rsv) { int err; if(rsv->svl != S_PHYSICAL_DROP) return (E_SUB_VECTOR_LENGTH_ERROR); smctr_issue_write_byte_cmd(dev, RW_PHYSICAL_DROP_NUMBER, &rsv->svv[0]); if((err = smctr_wait_cmd(dev))) return (err); return (POSITIVE_ACK); } /* Reset the ring speed to the opposite of what it was. This auto-pilot * mode requires a complete reset and re-init of the adapter. */ static int smctr_set_ring_speed(struct net_device *dev) { struct net_local *tp = netdev_priv(dev); int err; if(tp->media_type == MEDIA_UTP_16) tp->media_type = MEDIA_UTP_4; else tp->media_type = MEDIA_UTP_16; smctr_enable_16bit(dev); /* Re-Initialize adapter's internal registers */ smctr_reset_adapter(dev); if((err = smctr_init_card_real(dev))) return (err); smctr_enable_bic_int(dev); if((err = smctr_issue_enable_int_cmd(dev, TRC_INTERRUPT_ENABLE_MASK))) return (err); smctr_disable_16bit(dev); return (0); } static int smctr_set_rx_look_ahead(struct net_device *dev) { struct net_local *tp = netdev_priv(dev); __u16 sword, rword; if(smctr_debug > 10) printk(KERN_DEBUG "%s: smctr_set_rx_look_ahead_flag\n", dev->name); tp->adapter_flags &= ~(FORCED_16BIT_MODE); tp->adapter_flags |= RX_VALID_LOOKAHEAD; if(tp->adapter_bus == BUS_ISA16_TYPE) { sword = *((__u16 *)(tp->ram_access)); *((__u16 *)(tp->ram_access)) = 0x1234; smctr_disable_16bit(dev); rword = *((__u16 *)(tp->ram_access)); smctr_enable_16bit(dev); if(rword != 0x1234) tp->adapter_flags |= FORCED_16BIT_MODE; *((__u16 *)(tp->ram_access)) = sword; } return (0); } static int smctr_set_trc_reset(int ioaddr) { __u8 r; r = inb(ioaddr + MSR); outb(MSR_RST | r, ioaddr + MSR); return (0); } /* * This function can be called if the adapter is busy or not. */ static int smctr_setup_single_cmd(struct net_device *dev, __u16 command, __u16 subcommand) { struct net_local *tp = netdev_priv(dev); unsigned int err; if(smctr_debug > 10) printk(KERN_DEBUG "%s: smctr_setup_single_cmd\n", dev->name); if((err = smctr_wait_while_cbusy(dev))) return (err); if((err = (unsigned int)smctr_wait_cmd(dev))) return (err); tp->acb_head->cmd_done_status = 0; tp->acb_head->cmd = command; tp->acb_head->subcmd = subcommand; err = smctr_issue_resume_acb_cmd(dev); return (err); } /* * This function can not be called with the adapter busy. */ static int smctr_setup_single_cmd_w_data(struct net_device *dev, __u16 command, __u16 subcommand) { struct net_local *tp = netdev_priv(dev); tp->acb_head->cmd_done_status = ACB_COMMAND_NOT_DONE; tp->acb_head->cmd = command; tp->acb_head->subcmd = subcommand; tp->acb_head->data_offset_lo = (__u16)TRC_POINTER(tp->misc_command_data); return(smctr_issue_resume_acb_cmd(dev)); } static char *smctr_malloc(struct net_device *dev, __u16 size) { struct net_local *tp = netdev_priv(dev); char *m; m = (char *)(tp->ram_access + tp->sh_mem_used); tp->sh_mem_used += (__u32)size; return (m); } static int smctr_status_chg(struct net_device *dev) { struct net_local *tp = netdev_priv(dev); if(smctr_debug > 10) printk(KERN_DEBUG "%s: smctr_status_chg\n", dev->name); switch(tp->status) { case OPEN: break; case CLOSED: break; /* Interrupt driven open() completion. XXX */ case INITIALIZED: tp->group_address_0 = 0; tp->group_address[0] = 0; tp->group_address[1] = 0; tp->functional_address_0 = 0; tp->functional_address[0] = 0; tp->functional_address[1] = 0; smctr_open_tr(dev); break; default: printk(KERN_INFO "%s: status change unknown %x\n", dev->name, tp->status); break; } return (0); } static int smctr_trc_send_packet(struct net_device *dev, FCBlock *fcb, __u16 queue) { struct net_local *tp = netdev_priv(dev); int err = 0; if(smctr_debug > 10) printk(KERN_DEBUG "%s: smctr_trc_send_packet\n", dev->name); fcb->info = FCB_CHAIN_END | FCB_ENABLE_TFS; if(tp->num_tx_fcbs[queue] != 1) fcb->back_ptr->info = FCB_INTERRUPT_ENABLE | FCB_ENABLE_TFS; if(tp->tx_queue_status[queue] == NOT_TRANSMITING) { tp->tx_queue_status[queue] = TRANSMITING; err = smctr_issue_resume_tx_fcb_cmd(dev, queue); } return (err); } static __u16 smctr_tx_complete(struct net_device *dev, __u16 queue) { struct net_local *tp = netdev_priv(dev); __u16 status, err = 0; int cstatus; if(smctr_debug > 10) printk(KERN_DEBUG "%s: smctr_tx_complete\n", dev->name); while((status = tp->tx_fcb_end[queue]->frame_status) != SUCCESS) { if(status & 0x7e00 ) { err = HARDWARE_FAILED; break; } if((err = smctr_update_tx_chain(dev, tp->tx_fcb_end[queue], queue)) != SUCCESS) break; smctr_disable_16bit(dev); if(tp->mode_bits & UMAC) { if(!(status & (FCB_TX_STATUS_AR1 | FCB_TX_STATUS_AR2))) cstatus = NO_SUCH_DESTINATION; else { if(!(status & (FCB_TX_STATUS_CR1 | FCB_TX_STATUS_CR2))) cstatus = DEST_OUT_OF_RESOURCES; else { if(status & FCB_TX_STATUS_E) cstatus = MAX_COLLISIONS; else cstatus = SUCCESS; } } } else cstatus = SUCCESS; if(queue == BUG_QUEUE) err = SUCCESS; smctr_enable_16bit(dev); if(err != SUCCESS) break; } return (err); } static unsigned short smctr_tx_move_frame(struct net_device *dev, struct sk_buff *skb, __u8 *pbuff, unsigned int bytes) { struct net_local *tp = netdev_priv(dev); unsigned int ram_usable; __u32 flen, len, offset = 0; __u8 *frag, *page; if(smctr_debug > 10) printk(KERN_DEBUG "%s: smctr_tx_move_frame\n", dev->name); ram_usable = ((unsigned int)tp->ram_usable) << 10; frag = skb->data; flen = skb->len; while(flen > 0 && bytes > 0) { smctr_set_page(dev, pbuff); offset = SMC_PAGE_OFFSET(pbuff); if(offset + flen > ram_usable) len = ram_usable - offset; else len = flen; if(len > bytes) len = bytes; page = (char *) (offset + tp->ram_access); memcpy(page, frag, len); flen -=len; bytes -= len; frag += len; pbuff += len; } return (0); } /* Update the error statistic counters for this adapter. */ static int smctr_update_err_stats(struct net_device *dev) { struct net_local *tp = netdev_priv(dev); struct tr_statistics *tstat = &tp->MacStat; if(tstat->internal_errors) tstat->internal_errors += *(tp->misc_command_data + 0) & 0x00ff; if(tstat->line_errors) tstat->line_errors += *(tp->misc_command_data + 0) >> 8; if(tstat->A_C_errors) tstat->A_C_errors += *(tp->misc_command_data + 1) & 0x00ff; if(tstat->burst_errors) tstat->burst_errors += *(tp->misc_command_data + 1) >> 8; if(tstat->abort_delimiters) tstat->abort_delimiters += *(tp->misc_command_data + 2) >> 8; if(tstat->recv_congest_count) tstat->recv_congest_count += *(tp->misc_command_data + 3) & 0x00ff; if(tstat->lost_frames) tstat->lost_frames += *(tp->misc_command_data + 3) >> 8; if(tstat->frequency_errors) tstat->frequency_errors += *(tp->misc_command_data + 4) & 0x00ff; if(tstat->frame_copied_errors) tstat->frame_copied_errors += *(tp->misc_command_data + 4) >> 8; if(tstat->token_errors) tstat->token_errors += *(tp->misc_command_data + 5) >> 8; return (0); } static int smctr_update_rx_chain(struct net_device *dev, __u16 queue) { struct net_local *tp = netdev_priv(dev); FCBlock *fcb; BDBlock *bdb; __u16 size, len; fcb = tp->rx_fcb_curr[queue]; len = fcb->frame_length; fcb->frame_status = 0; fcb->info = FCB_CHAIN_END; fcb->back_ptr->info = FCB_WARNING; tp->rx_fcb_curr[queue] = tp->rx_fcb_curr[queue]->next_ptr; /* update RX BDBs */ size = (len >> RX_BDB_SIZE_SHIFT); if(len & RX_DATA_BUFFER_SIZE_MASK) size += sizeof(BDBlock); size &= (~RX_BDB_SIZE_MASK); /* check if wrap around */ bdb = (BDBlock *)((__u32)(tp->rx_bdb_curr[queue]) + (__u32)(size)); if((__u32)bdb >= (__u32)tp->rx_bdb_end[queue]) { bdb = (BDBlock *)((__u32)(tp->rx_bdb_head[queue]) + (__u32)(bdb) - (__u32)(tp->rx_bdb_end[queue])); } bdb->back_ptr->info = BDB_CHAIN_END; tp->rx_bdb_curr[queue]->back_ptr->info = BDB_NOT_CHAIN_END; tp->rx_bdb_curr[queue] = bdb; return (0); } static int smctr_update_tx_chain(struct net_device *dev, FCBlock *fcb, __u16 queue) { struct net_local *tp = netdev_priv(dev); if(smctr_debug > 20) printk(KERN_DEBUG "smctr_update_tx_chain\n"); if(tp->num_tx_fcbs_used[queue] <= 0) return (HARDWARE_FAILED); else { if(tp->tx_buff_used[queue] < fcb->memory_alloc) { tp->tx_buff_used[queue] = 0; return (HARDWARE_FAILED); } tp->tx_buff_used[queue] -= fcb->memory_alloc; /* if all transmit buffer are cleared * need to set the tx_buff_curr[] to tx_buff_head[] * otherwise, tx buffer will be segregate and cannot * accommodate and buffer greater than (curr - head) and * (end - curr) since we do not allow wrap around allocation. */ if(tp->tx_buff_used[queue] == 0) tp->tx_buff_curr[queue] = tp->tx_buff_head[queue]; tp->num_tx_fcbs_used[queue]--; fcb->frame_status = 0; tp->tx_fcb_end[queue] = fcb->next_ptr; netif_wake_queue(dev); return (0); } } static int smctr_wait_cmd(struct net_device *dev) { struct net_local *tp = netdev_priv(dev); unsigned int loop_count = 0x20000; if(smctr_debug > 10) printk(KERN_DEBUG "%s: smctr_wait_cmd\n", dev->name); while(loop_count) { if(tp->acb_head->cmd_done_status & ACB_COMMAND_DONE) break; udelay(1); loop_count--; } if(loop_count == 0) return(HARDWARE_FAILED); if(tp->acb_head->cmd_done_status & 0xff) return(HARDWARE_FAILED); return (0); } static int smctr_wait_while_cbusy(struct net_device *dev) { struct net_local *tp = netdev_priv(dev); unsigned int timeout = 0x20000; int ioaddr = dev->base_addr; __u8 r; if(tp->bic_type == BIC_585_CHIP) { while(timeout) { r = inb(ioaddr + HWR); if((r & HWR_CBUSY) == 0) break; timeout--; } } else { while(timeout) { r = inb(ioaddr + CSR); if((r & CSR_CBUSY) == 0) break; timeout--; } } if(timeout) return (0); else return (HARDWARE_FAILED); } #ifdef MODULE static struct net_device* dev_smctr[SMCTR_MAX_ADAPTERS]; static int io[SMCTR_MAX_ADAPTERS]; static int irq[SMCTR_MAX_ADAPTERS]; MODULE_LICENSE("GPL"); module_param_array(io, int, NULL, 0); module_param_array(irq, int, NULL, 0); module_param(ringspeed, int, 0); static struct net_device *setup_card(int n) { struct net_device *dev = alloc_trdev(sizeof(struct net_local)); int err; if (!dev) return ERR_PTR(-ENOMEM); dev->irq = irq[n]; err = smctr_probe1(dev, io[n]); if (err) goto out; err = register_netdev(dev); if (err) goto out1; return dev; out1: #ifdef CONFIG_MCA_LEGACY { struct net_local *tp = netdev_priv(dev); if (tp->slot_num) mca_mark_as_unused(tp->slot_num); } #endif release_region(dev->base_addr, SMCTR_IO_EXTENT); free_irq(dev->irq, dev); out: free_netdev(dev); return ERR_PTR(err); } int init_module(void) { int i, found = 0; struct net_device *dev; for(i = 0; i < SMCTR_MAX_ADAPTERS; i++) { dev = io[0]? setup_card(i) : smctr_probe(-1); if (!IS_ERR(dev)) { ++found; dev_smctr[i] = dev; } } return found ? 0 : -ENODEV; } void cleanup_module(void) { int i; for(i = 0; i < SMCTR_MAX_ADAPTERS; i++) { struct net_device *dev = dev_smctr[i]; if (dev) { unregister_netdev(dev); #ifdef CONFIG_MCA_LEGACY { struct net_local *tp = netdev_priv(dev); if (tp->slot_num) mca_mark_as_unused(tp->slot_num); } #endif release_region(dev->base_addr, SMCTR_IO_EXTENT); if (dev->irq) free_irq(dev->irq, dev); free_netdev(dev); } } } #endif /* MODULE */